--- /dev/null
+//#define BETA\r
+#define YEAR 1992\r
+#define MONTH 9\r
+#define DAY 30\r
+\r
+#include "ID_HEADS.H"\r
+#include <MATH.H>\r
+#include <VALUES.H>\r
+\r
+#include "WL_MENU.H"\r
+\r
+#ifdef SPANISH\r
+#include "SPANISH.H"\r
+#else\r
+#include "FOREIGN.H"\r
+#endif\r
+\r
+#ifdef SPEAR\r
+#include "F_SPEAR.H"\r
+#endif\r
+\r
+/*\r
+=============================================================================\r
+\r
+ MACROS\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+#define COLORBORDER(color) asm{mov dx,STATUS_REGISTER_1;in al,dx;\\r
+ mov dx,ATR_INDEX;mov al,ATR_OVERSCAN;out dx,al;mov al,color;out dx,al;\\r
+ mov al,32;out dx,al};\r
+\r
+#define MAPSPOT(x,y,plane) (*(mapsegs[plane]+farmapylookup[y]+x))\r
+\r
+#define SIGN(x) ((x)>0?1:-1)\r
+#define ABS(x) ((int)(x)>0?(x):-(x))\r
+#define LABS(x) ((long)(x)>0?(x):-(x))\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define MAXACTORS 150 // max number of nazis, etc / map\r
+#define MAXSTATS 400 // max number of lamps, bonus, etc\r
+#define MAXDOORS 64 // max number of sliding doors\r
+#define MAXWALLTILES 64 // max number of wall tiles\r
+\r
+//\r
+// tile constants\r
+//\r
+\r
+#define ICONARROWS 90\r
+#define PUSHABLETILE 98\r
+#define EXITTILE 99 // at end of castle\r
+#define AREATILE 107 // first of NUMAREAS floor tiles\r
+#define NUMAREAS 37\r
+#define ELEVATORTILE 21\r
+#define AMBUSHTILE 106\r
+#define ALTELEVATORTILE 107\r
+\r
+#define NUMBERCHARS 9\r
+\r
+\r
+//----------------\r
+\r
+#define EXTRAPOINTS 40000\r
+\r
+#define PLAYERSPEED 3000\r
+#define RUNSPEED 6000\r
+\r
+#define SCREENSEG 0xa000\r
+\r
+#define SCREENBWIDE 80\r
+\r
+#define HEIGHTRATIO 0.50 // also defined in id_mm.c\r
+\r
+#define BORDERCOLOR 3\r
+#define FLASHCOLOR 5\r
+#define FLASHTICS 4\r
+\r
+\r
+#define PLAYERSIZE MINDIST // player radius\r
+#define MINACTORDIST 0x10000l // minimum dist from player center\r
+ // to any actor center\r
+\r
+#define NUMLATCHPICS 100\r
+\r
+\r
+#define PI 3.141592657\r
+\r
+#define GLOBAL1 (1l<<16)\r
+#define TILEGLOBAL GLOBAL1\r
+#define PIXGLOBAL (GLOBAL1/64)\r
+#define TILESHIFT 16l\r
+#define UNSIGNEDSHIFT 8\r
+\r
+#define ANGLES 360 // must be divisable by 4\r
+#define ANGLEQUAD (ANGLES/4)\r
+#define FINEANGLES 3600\r
+#define ANG90 (FINEANGLES/4)\r
+#define ANG180 (ANG90*2)\r
+#define ANG270 (ANG90*3)\r
+#define ANG360 (ANG90*4)\r
+#define VANG90 (ANGLES/4)\r
+#define VANG180 (VANG90*2)\r
+#define VANG270 (VANG90*3)\r
+#define VANG360 (VANG90*4)\r
+\r
+#define MINDIST (0x5800l)\r
+\r
+\r
+#define MAXSCALEHEIGHT 256 // largest scale on largest view\r
+\r
+#define MAXVIEWWIDTH 320\r
+\r
+#define MAPSIZE 64 // maps are 64*64 max\r
+#define NORTH 0\r
+#define EAST 1\r
+#define SOUTH 2\r
+#define WEST 3\r
+\r
+\r
+#define STATUSLINES 40\r
+\r
+#define SCREENSIZE (SCREENBWIDE*208)\r
+#define PAGE1START 0\r
+#define PAGE2START (SCREENSIZE)\r
+#define PAGE3START (SCREENSIZE*2u)\r
+#define FREESTART (SCREENSIZE*3u)\r
+\r
+\r
+#define PIXRADIUS 512\r
+\r
+#define STARTAMMO 8\r
+\r
+\r
+// object flag values\r
+\r
+#define FL_SHOOTABLE 1\r
+#define FL_BONUS 2\r
+#define FL_NEVERMARK 4\r
+#define FL_VISABLE 8\r
+#define FL_ATTACKMODE 16\r
+#define FL_FIRSTATTACK 32\r
+#define FL_AMBUSH 64\r
+#define FL_NONMARK 128\r
+\r
+\r
+//\r
+// sprite constants\r
+//\r
+\r
+enum {\r
+ SPR_DEMO,\r
+ SPR_DEATHCAM,\r
+//\r
+// static sprites\r
+//\r
+ SPR_STAT_0,SPR_STAT_1,SPR_STAT_2,SPR_STAT_3,\r
+ SPR_STAT_4,SPR_STAT_5,SPR_STAT_6,SPR_STAT_7,\r
+\r
+ SPR_STAT_8,SPR_STAT_9,SPR_STAT_10,SPR_STAT_11,\r
+ SPR_STAT_12,SPR_STAT_13,SPR_STAT_14,SPR_STAT_15,\r
+\r
+ SPR_STAT_16,SPR_STAT_17,SPR_STAT_18,SPR_STAT_19,\r
+ SPR_STAT_20,SPR_STAT_21,SPR_STAT_22,SPR_STAT_23,\r
+\r
+ SPR_STAT_24,SPR_STAT_25,SPR_STAT_26,SPR_STAT_27,\r
+ SPR_STAT_28,SPR_STAT_29,SPR_STAT_30,SPR_STAT_31,\r
+\r
+ SPR_STAT_32,SPR_STAT_33,SPR_STAT_34,SPR_STAT_35,\r
+ SPR_STAT_36,SPR_STAT_37,SPR_STAT_38,SPR_STAT_39,\r
+\r
+ SPR_STAT_40,SPR_STAT_41,SPR_STAT_42,SPR_STAT_43,\r
+ SPR_STAT_44,SPR_STAT_45,SPR_STAT_46,SPR_STAT_47,\r
+\r
+#ifdef SPEAR\r
+ SPR_STAT_48,SPR_STAT_49,SPR_STAT_50,SPR_STAT_51,\r
+#endif\r
+\r
+//\r
+// guard\r
+//\r
+ SPR_GRD_S_1,SPR_GRD_S_2,SPR_GRD_S_3,SPR_GRD_S_4,\r
+ SPR_GRD_S_5,SPR_GRD_S_6,SPR_GRD_S_7,SPR_GRD_S_8,\r
+\r
+ SPR_GRD_W1_1,SPR_GRD_W1_2,SPR_GRD_W1_3,SPR_GRD_W1_4,\r
+ SPR_GRD_W1_5,SPR_GRD_W1_6,SPR_GRD_W1_7,SPR_GRD_W1_8,\r
+\r
+ SPR_GRD_W2_1,SPR_GRD_W2_2,SPR_GRD_W2_3,SPR_GRD_W2_4,\r
+ SPR_GRD_W2_5,SPR_GRD_W2_6,SPR_GRD_W2_7,SPR_GRD_W2_8,\r
+\r
+ SPR_GRD_W3_1,SPR_GRD_W3_2,SPR_GRD_W3_3,SPR_GRD_W3_4,\r
+ SPR_GRD_W3_5,SPR_GRD_W3_6,SPR_GRD_W3_7,SPR_GRD_W3_8,\r
+\r
+ SPR_GRD_W4_1,SPR_GRD_W4_2,SPR_GRD_W4_3,SPR_GRD_W4_4,\r
+ SPR_GRD_W4_5,SPR_GRD_W4_6,SPR_GRD_W4_7,SPR_GRD_W4_8,\r
+\r
+ SPR_GRD_PAIN_1,SPR_GRD_DIE_1,SPR_GRD_DIE_2,SPR_GRD_DIE_3,\r
+ SPR_GRD_PAIN_2,SPR_GRD_DEAD,\r
+\r
+ SPR_GRD_SHOOT1,SPR_GRD_SHOOT2,SPR_GRD_SHOOT3,\r
+\r
+//\r
+// dogs\r
+//\r
+ SPR_DOG_W1_1,SPR_DOG_W1_2,SPR_DOG_W1_3,SPR_DOG_W1_4,\r
+ SPR_DOG_W1_5,SPR_DOG_W1_6,SPR_DOG_W1_7,SPR_DOG_W1_8,\r
+\r
+ SPR_DOG_W2_1,SPR_DOG_W2_2,SPR_DOG_W2_3,SPR_DOG_W2_4,\r
+ SPR_DOG_W2_5,SPR_DOG_W2_6,SPR_DOG_W2_7,SPR_DOG_W2_8,\r
+\r
+ SPR_DOG_W3_1,SPR_DOG_W3_2,SPR_DOG_W3_3,SPR_DOG_W3_4,\r
+ SPR_DOG_W3_5,SPR_DOG_W3_6,SPR_DOG_W3_7,SPR_DOG_W3_8,\r
+\r
+ SPR_DOG_W4_1,SPR_DOG_W4_2,SPR_DOG_W4_3,SPR_DOG_W4_4,\r
+ SPR_DOG_W4_5,SPR_DOG_W4_6,SPR_DOG_W4_7,SPR_DOG_W4_8,\r
+\r
+ SPR_DOG_DIE_1,SPR_DOG_DIE_2,SPR_DOG_DIE_3,SPR_DOG_DEAD,\r
+ SPR_DOG_JUMP1,SPR_DOG_JUMP2,SPR_DOG_JUMP3,\r
+\r
+\r
+\r
+//\r
+// ss\r
+//\r
+ SPR_SS_S_1,SPR_SS_S_2,SPR_SS_S_3,SPR_SS_S_4,\r
+ SPR_SS_S_5,SPR_SS_S_6,SPR_SS_S_7,SPR_SS_S_8,\r
+\r
+ SPR_SS_W1_1,SPR_SS_W1_2,SPR_SS_W1_3,SPR_SS_W1_4,\r
+ SPR_SS_W1_5,SPR_SS_W1_6,SPR_SS_W1_7,SPR_SS_W1_8,\r
+\r
+ SPR_SS_W2_1,SPR_SS_W2_2,SPR_SS_W2_3,SPR_SS_W2_4,\r
+ SPR_SS_W2_5,SPR_SS_W2_6,SPR_SS_W2_7,SPR_SS_W2_8,\r
+\r
+ SPR_SS_W3_1,SPR_SS_W3_2,SPR_SS_W3_3,SPR_SS_W3_4,\r
+ SPR_SS_W3_5,SPR_SS_W3_6,SPR_SS_W3_7,SPR_SS_W3_8,\r
+\r
+ SPR_SS_W4_1,SPR_SS_W4_2,SPR_SS_W4_3,SPR_SS_W4_4,\r
+ SPR_SS_W4_5,SPR_SS_W4_6,SPR_SS_W4_7,SPR_SS_W4_8,\r
+\r
+ SPR_SS_PAIN_1,SPR_SS_DIE_1,SPR_SS_DIE_2,SPR_SS_DIE_3,\r
+ SPR_SS_PAIN_2,SPR_SS_DEAD,\r
+\r
+ SPR_SS_SHOOT1,SPR_SS_SHOOT2,SPR_SS_SHOOT3,\r
+\r
+//\r
+// mutant\r
+//\r
+ SPR_MUT_S_1,SPR_MUT_S_2,SPR_MUT_S_3,SPR_MUT_S_4,\r
+ SPR_MUT_S_5,SPR_MUT_S_6,SPR_MUT_S_7,SPR_MUT_S_8,\r
+\r
+ SPR_MUT_W1_1,SPR_MUT_W1_2,SPR_MUT_W1_3,SPR_MUT_W1_4,\r
+ SPR_MUT_W1_5,SPR_MUT_W1_6,SPR_MUT_W1_7,SPR_MUT_W1_8,\r
+\r
+ SPR_MUT_W2_1,SPR_MUT_W2_2,SPR_MUT_W2_3,SPR_MUT_W2_4,\r
+ SPR_MUT_W2_5,SPR_MUT_W2_6,SPR_MUT_W2_7,SPR_MUT_W2_8,\r
+\r
+ SPR_MUT_W3_1,SPR_MUT_W3_2,SPR_MUT_W3_3,SPR_MUT_W3_4,\r
+ SPR_MUT_W3_5,SPR_MUT_W3_6,SPR_MUT_W3_7,SPR_MUT_W3_8,\r
+\r
+ SPR_MUT_W4_1,SPR_MUT_W4_2,SPR_MUT_W4_3,SPR_MUT_W4_4,\r
+ SPR_MUT_W4_5,SPR_MUT_W4_6,SPR_MUT_W4_7,SPR_MUT_W4_8,\r
+\r
+ SPR_MUT_PAIN_1,SPR_MUT_DIE_1,SPR_MUT_DIE_2,SPR_MUT_DIE_3,\r
+ SPR_MUT_PAIN_2,SPR_MUT_DIE_4,SPR_MUT_DEAD,\r
+\r
+ SPR_MUT_SHOOT1,SPR_MUT_SHOOT2,SPR_MUT_SHOOT3,SPR_MUT_SHOOT4,\r
+\r
+//\r
+// officer\r
+//\r
+ SPR_OFC_S_1,SPR_OFC_S_2,SPR_OFC_S_3,SPR_OFC_S_4,\r
+ SPR_OFC_S_5,SPR_OFC_S_6,SPR_OFC_S_7,SPR_OFC_S_8,\r
+\r
+ SPR_OFC_W1_1,SPR_OFC_W1_2,SPR_OFC_W1_3,SPR_OFC_W1_4,\r
+ SPR_OFC_W1_5,SPR_OFC_W1_6,SPR_OFC_W1_7,SPR_OFC_W1_8,\r
+\r
+ SPR_OFC_W2_1,SPR_OFC_W2_2,SPR_OFC_W2_3,SPR_OFC_W2_4,\r
+ SPR_OFC_W2_5,SPR_OFC_W2_6,SPR_OFC_W2_7,SPR_OFC_W2_8,\r
+\r
+ SPR_OFC_W3_1,SPR_OFC_W3_2,SPR_OFC_W3_3,SPR_OFC_W3_4,\r
+ SPR_OFC_W3_5,SPR_OFC_W3_6,SPR_OFC_W3_7,SPR_OFC_W3_8,\r
+\r
+ SPR_OFC_W4_1,SPR_OFC_W4_2,SPR_OFC_W4_3,SPR_OFC_W4_4,\r
+ SPR_OFC_W4_5,SPR_OFC_W4_6,SPR_OFC_W4_7,SPR_OFC_W4_8,\r
+\r
+ SPR_OFC_PAIN_1,SPR_OFC_DIE_1,SPR_OFC_DIE_2,SPR_OFC_DIE_3,\r
+ SPR_OFC_PAIN_2,SPR_OFC_DIE_4,SPR_OFC_DEAD,\r
+\r
+ SPR_OFC_SHOOT1,SPR_OFC_SHOOT2,SPR_OFC_SHOOT3,\r
+\r
+#ifndef SPEAR\r
+//\r
+// ghosts\r
+//\r
+ SPR_BLINKY_W1,SPR_BLINKY_W2,SPR_PINKY_W1,SPR_PINKY_W2,\r
+ SPR_CLYDE_W1,SPR_CLYDE_W2,SPR_INKY_W1,SPR_INKY_W2,\r
+\r
+//\r
+// hans\r
+//\r
+ SPR_BOSS_W1,SPR_BOSS_W2,SPR_BOSS_W3,SPR_BOSS_W4,\r
+ SPR_BOSS_SHOOT1,SPR_BOSS_SHOOT2,SPR_BOSS_SHOOT3,SPR_BOSS_DEAD,\r
+\r
+ SPR_BOSS_DIE1,SPR_BOSS_DIE2,SPR_BOSS_DIE3,\r
+\r
+//\r
+// schabbs\r
+//\r
+ SPR_SCHABB_W1,SPR_SCHABB_W2,SPR_SCHABB_W3,SPR_SCHABB_W4,\r
+ SPR_SCHABB_SHOOT1,SPR_SCHABB_SHOOT2,\r
+\r
+ SPR_SCHABB_DIE1,SPR_SCHABB_DIE2,SPR_SCHABB_DIE3,SPR_SCHABB_DEAD,\r
+ SPR_HYPO1,SPR_HYPO2,SPR_HYPO3,SPR_HYPO4,\r
+\r
+//\r
+// fake\r
+//\r
+ SPR_FAKE_W1,SPR_FAKE_W2,SPR_FAKE_W3,SPR_FAKE_W4,\r
+ SPR_FAKE_SHOOT,SPR_FIRE1,SPR_FIRE2,\r
+\r
+ SPR_FAKE_DIE1,SPR_FAKE_DIE2,SPR_FAKE_DIE3,SPR_FAKE_DIE4,\r
+ SPR_FAKE_DIE5,SPR_FAKE_DEAD,\r
+\r
+//\r
+// hitler\r
+//\r
+ SPR_MECHA_W1,SPR_MECHA_W2,SPR_MECHA_W3,SPR_MECHA_W4,\r
+ SPR_MECHA_SHOOT1,SPR_MECHA_SHOOT2,SPR_MECHA_SHOOT3,SPR_MECHA_DEAD,\r
+\r
+ SPR_MECHA_DIE1,SPR_MECHA_DIE2,SPR_MECHA_DIE3,\r
+\r
+ SPR_HITLER_W1,SPR_HITLER_W2,SPR_HITLER_W3,SPR_HITLER_W4,\r
+ SPR_HITLER_SHOOT1,SPR_HITLER_SHOOT2,SPR_HITLER_SHOOT3,SPR_HITLER_DEAD,\r
+\r
+ SPR_HITLER_DIE1,SPR_HITLER_DIE2,SPR_HITLER_DIE3,SPR_HITLER_DIE4,\r
+ SPR_HITLER_DIE5,SPR_HITLER_DIE6,SPR_HITLER_DIE7,\r
+\r
+//\r
+// giftmacher\r
+//\r
+ SPR_GIFT_W1,SPR_GIFT_W2,SPR_GIFT_W3,SPR_GIFT_W4,\r
+ SPR_GIFT_SHOOT1,SPR_GIFT_SHOOT2,\r
+\r
+ SPR_GIFT_DIE1,SPR_GIFT_DIE2,SPR_GIFT_DIE3,SPR_GIFT_DEAD,\r
+#endif\r
+//\r
+// Rocket, smoke and small explosion\r
+//\r
+ SPR_ROCKET_1,SPR_ROCKET_2,SPR_ROCKET_3,SPR_ROCKET_4,\r
+ SPR_ROCKET_5,SPR_ROCKET_6,SPR_ROCKET_7,SPR_ROCKET_8,\r
+\r
+ SPR_SMOKE_1,SPR_SMOKE_2,SPR_SMOKE_3,SPR_SMOKE_4,\r
+ SPR_BOOM_1,SPR_BOOM_2,SPR_BOOM_3,\r
+\r
+//\r
+// Angel of Death's DeathSparks(tm)\r
+//\r
+#ifdef SPEAR\r
+ SPR_HROCKET_1,SPR_HROCKET_2,SPR_HROCKET_3,SPR_HROCKET_4,\r
+ SPR_HROCKET_5,SPR_HROCKET_6,SPR_HROCKET_7,SPR_HROCKET_8,\r
+\r
+ SPR_HSMOKE_1,SPR_HSMOKE_2,SPR_HSMOKE_3,SPR_HSMOKE_4,\r
+ SPR_HBOOM_1,SPR_HBOOM_2,SPR_HBOOM_3,\r
+\r
+ SPR_SPARK1,SPR_SPARK2,SPR_SPARK3,SPR_SPARK4,\r
+#endif\r
+\r
+#ifndef SPEAR\r
+//\r
+// gretel\r
+//\r
+ SPR_GRETEL_W1,SPR_GRETEL_W2,SPR_GRETEL_W3,SPR_GRETEL_W4,\r
+ SPR_GRETEL_SHOOT1,SPR_GRETEL_SHOOT2,SPR_GRETEL_SHOOT3,SPR_GRETEL_DEAD,\r
+\r
+ SPR_GRETEL_DIE1,SPR_GRETEL_DIE2,SPR_GRETEL_DIE3,\r
+\r
+//\r
+// fat face\r
+//\r
+ SPR_FAT_W1,SPR_FAT_W2,SPR_FAT_W3,SPR_FAT_W4,\r
+ SPR_FAT_SHOOT1,SPR_FAT_SHOOT2,SPR_FAT_SHOOT3,SPR_FAT_SHOOT4,\r
+\r
+ SPR_FAT_DIE1,SPR_FAT_DIE2,SPR_FAT_DIE3,SPR_FAT_DEAD,\r
+\r
+//\r
+// bj\r
+//\r
+ SPR_BJ_W1,SPR_BJ_W2,SPR_BJ_W3,SPR_BJ_W4,\r
+ SPR_BJ_JUMP1,SPR_BJ_JUMP2,SPR_BJ_JUMP3,SPR_BJ_JUMP4,\r
+#else\r
+//\r
+// THESE ARE FOR 'SPEAR OF DESTINY'\r
+//\r
+\r
+//\r
+// Trans Grosse\r
+//\r
+ SPR_TRANS_W1,SPR_TRANS_W2,SPR_TRANS_W3,SPR_TRANS_W4,\r
+ SPR_TRANS_SHOOT1,SPR_TRANS_SHOOT2,SPR_TRANS_SHOOT3,SPR_TRANS_DEAD,\r
+\r
+ SPR_TRANS_DIE1,SPR_TRANS_DIE2,SPR_TRANS_DIE3,\r
+\r
+//\r
+// Wilhelm\r
+//\r
+ SPR_WILL_W1,SPR_WILL_W2,SPR_WILL_W3,SPR_WILL_W4,\r
+ SPR_WILL_SHOOT1,SPR_WILL_SHOOT2,SPR_WILL_SHOOT3,SPR_WILL_SHOOT4,\r
+\r
+ SPR_WILL_DIE1,SPR_WILL_DIE2,SPR_WILL_DIE3,SPR_WILL_DEAD,\r
+\r
+//\r
+// UberMutant\r
+//\r
+ SPR_UBER_W1,SPR_UBER_W2,SPR_UBER_W3,SPR_UBER_W4,\r
+ SPR_UBER_SHOOT1,SPR_UBER_SHOOT2,SPR_UBER_SHOOT3,SPR_UBER_SHOOT4,\r
+\r
+ SPR_UBER_DIE1,SPR_UBER_DIE2,SPR_UBER_DIE3,SPR_UBER_DIE4,\r
+ SPR_UBER_DEAD,\r
+\r
+//\r
+// Death Knight\r
+//\r
+ SPR_DEATH_W1,SPR_DEATH_W2,SPR_DEATH_W3,SPR_DEATH_W4,\r
+ SPR_DEATH_SHOOT1,SPR_DEATH_SHOOT2,SPR_DEATH_SHOOT3,SPR_DEATH_SHOOT4,\r
+\r
+ SPR_DEATH_DIE1,SPR_DEATH_DIE2,SPR_DEATH_DIE3,SPR_DEATH_DIE4,\r
+ SPR_DEATH_DIE5,SPR_DEATH_DIE6,SPR_DEATH_DEAD,\r
+\r
+//\r
+// Ghost\r
+//\r
+ SPR_SPECTRE_W1,SPR_SPECTRE_W2,SPR_SPECTRE_W3,SPR_SPECTRE_W4,\r
+ SPR_SPECTRE_F1,SPR_SPECTRE_F2,SPR_SPECTRE_F3,SPR_SPECTRE_F4,\r
+\r
+//\r
+// Angel of Death\r
+//\r
+ SPR_ANGEL_W1,SPR_ANGEL_W2,SPR_ANGEL_W3,SPR_ANGEL_W4,\r
+ SPR_ANGEL_SHOOT1,SPR_ANGEL_SHOOT2,SPR_ANGEL_TIRED1,SPR_ANGEL_TIRED2,\r
+\r
+ SPR_ANGEL_DIE1,SPR_ANGEL_DIE2,SPR_ANGEL_DIE3,SPR_ANGEL_DIE4,\r
+ SPR_ANGEL_DIE5,SPR_ANGEL_DIE6,SPR_ANGEL_DIE7,SPR_ANGEL_DEAD,\r
+\r
+#endif\r
+\r
+//\r
+// player attack frames\r
+//\r
+ SPR_KNIFEREADY,SPR_KNIFEATK1,SPR_KNIFEATK2,SPR_KNIFEATK3,\r
+ SPR_KNIFEATK4,\r
+\r
+ SPR_PISTOLREADY,SPR_PISTOLATK1,SPR_PISTOLATK2,SPR_PISTOLATK3,\r
+ SPR_PISTOLATK4,\r
+\r
+ SPR_MACHINEGUNREADY,SPR_MACHINEGUNATK1,SPR_MACHINEGUNATK2,MACHINEGUNATK3,\r
+ SPR_MACHINEGUNATK4,\r
+\r
+ SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,\r
+ SPR_CHAINATK4,\r
+\r
+ };\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL TYPES\r
+\r
+=============================================================================\r
+*/\r
+\r
+typedef long fixed;\r
+\r
+typedef enum {\r
+ di_north,\r
+ di_east,\r
+ di_south,\r
+ di_west\r
+} controldir_t;\r
+\r
+typedef enum {\r
+ dr_normal,\r
+ dr_lock1,\r
+ dr_lock2,\r
+ dr_lock3,\r
+ dr_lock4,\r
+ dr_elevator\r
+} door_t;\r
+\r
+typedef enum {\r
+ ac_badobject = -1,\r
+ ac_no,\r
+ ac_yes,\r
+ ac_allways\r
+} activetype;\r
+\r
+typedef enum {\r
+ nothing,\r
+ playerobj,\r
+ inertobj,\r
+ guardobj,\r
+ officerobj,\r
+ ssobj,\r
+ dogobj,\r
+ bossobj,\r
+ schabbobj,\r
+ fakeobj,\r
+ mechahitlerobj,\r
+ mutantobj,\r
+ needleobj,\r
+ fireobj,\r
+ bjobj,\r
+ ghostobj,\r
+ realhitlerobj,\r
+ gretelobj,\r
+ giftobj,\r
+ fatobj,\r
+ rocketobj,\r
+\r
+ spectreobj,\r
+ angelobj,\r
+ transobj,\r
+ uberobj,\r
+ willobj,\r
+ deathobj,\r
+ hrocketobj,\r
+ sparkobj\r
+} classtype;\r
+\r
+typedef enum {\r
+ dressing,\r
+ block,\r
+ bo_gibs,\r
+ bo_alpo,\r
+ bo_firstaid,\r
+ bo_key1,\r
+ bo_key2,\r
+ bo_key3,\r
+ bo_key4,\r
+ bo_cross,\r
+ bo_chalice,\r
+ bo_bible,\r
+ bo_crown,\r
+ bo_clip,\r
+ bo_clip2,\r
+ bo_machinegun,\r
+ bo_chaingun,\r
+ bo_food,\r
+ bo_fullheal,\r
+ bo_25clip,\r
+ bo_spear\r
+} stat_t;\r
+\r
+typedef enum {\r
+ east,\r
+ northeast,\r
+ north,\r
+ northwest,\r
+ west,\r
+ southwest,\r
+ south,\r
+ southeast,\r
+ nodir\r
+} dirtype;\r
+\r
+\r
+#define NUMENEMIES 22\r
+typedef enum {\r
+ en_guard,\r
+ en_officer,\r
+ en_ss,\r
+ en_dog,\r
+ en_boss,\r
+ en_schabbs,\r
+ en_fake,\r
+ en_hitler,\r
+ en_mutant,\r
+ en_blinky,\r
+ en_clyde,\r
+ en_pinky,\r
+ en_inky,\r
+ en_gretel,\r
+ en_gift,\r
+ en_fat,\r
+ en_spectre,\r
+ en_angel,\r
+ en_trans,\r
+ en_uber,\r
+ en_will,\r
+ en_death\r
+} enemy_t;\r
+\r
+\r
+typedef struct statestruct\r
+{\r
+ boolean rotate;\r
+ int shapenum; // a shapenum of -1 means get from ob->temp1\r
+ int tictime;\r
+ void (*think) (),(*action) ();\r
+ struct statestruct *next;\r
+} statetype;\r
+\r
+\r
+//---------------------\r
+//\r
+// trivial actor structure\r
+//\r
+//---------------------\r
+\r
+typedef struct statstruct\r
+{\r
+ byte tilex,tiley;\r
+ byte *visspot;\r
+ int shapenum; // if shapenum == -1 the obj has been removed\r
+ byte flags;\r
+ byte itemnumber;\r
+} statobj_t;\r
+\r
+\r
+//---------------------\r
+//\r
+// door actor structure\r
+//\r
+//---------------------\r
+\r
+typedef struct doorstruct\r
+{\r
+ byte tilex,tiley;\r
+ boolean vertical;\r
+ byte lock;\r
+ enum {dr_open,dr_closed,dr_opening,dr_closing} action;\r
+ int ticcount;\r
+} doorobj_t;\r
+\r
+\r
+//--------------------\r
+//\r
+// thinking actor structure\r
+//\r
+//--------------------\r
+\r
+typedef struct objstruct\r
+{\r
+ activetype active;\r
+ int ticcount;\r
+ classtype obclass;\r
+ statetype *state;\r
+\r
+ byte flags; // FL_SHOOTABLE, etc\r
+\r
+ long distance; // if negative, wait for that door to open\r
+ dirtype dir;\r
+\r
+ fixed x,y;\r
+ unsigned tilex,tiley;\r
+ byte areanumber;\r
+\r
+ int viewx;\r
+ unsigned viewheight;\r
+ fixed transx,transy; // in global coord\r
+\r
+ int angle;\r
+ int hitpoints;\r
+ long speed;\r
+\r
+ int temp1,temp2,temp3;\r
+ struct objstruct *next,*prev;\r
+} objtype;\r
+\r
+\r
+#define NUMBUTTONS 8\r
+enum {\r
+ bt_nobutton=-1,\r
+ bt_attack=0,\r
+ bt_strafe,\r
+ bt_run,\r
+ bt_use,\r
+ bt_readyknife,\r
+ bt_readypistol,\r
+ bt_readymachinegun,\r
+ bt_readychaingun\r
+};\r
+\r
+\r
+#define NUMWEAPONS 5\r
+typedef enum {\r
+ wp_knife,\r
+ wp_pistol,\r
+ wp_machinegun,\r
+ wp_chaingun\r
+} weapontype;\r
+\r
+\r
+typedef enum {\r
+ gd_baby,\r
+ gd_easy,\r
+ gd_medium,\r
+ gd_hard\r
+};\r
+\r
+//---------------\r
+//\r
+// gamestate structure\r
+//\r
+//---------------\r
+\r
+typedef struct\r
+{\r
+ int difficulty;\r
+ int mapon;\r
+ long oldscore,score,nextextra;\r
+ int lives;\r
+ int health;\r
+ int ammo;\r
+ int keys;\r
+ weapontype bestweapon,weapon,chosenweapon;\r
+\r
+ int faceframe;\r
+ int attackframe,attackcount,weaponframe;\r
+\r
+ int episode,secretcount,treasurecount,killcount,\r
+ secrettotal,treasuretotal,killtotal;\r
+ long TimeCount;\r
+ long killx,killy;\r
+ boolean victoryflag; // set during victory animations\r
+} gametype;\r
+\r
+\r
+typedef enum {\r
+ ex_stillplaying,\r
+ ex_completed,\r
+ ex_died,\r
+ ex_warped,\r
+ ex_resetgame,\r
+ ex_loadedgame,\r
+ ex_victorious,\r
+ ex_abort,\r
+ ex_demodone,\r
+ ex_secretlevel\r
+} exit_t;\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_MAIN DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern boolean MS_CheckParm (char far *string);\r
+\r
+extern char str[80],str2[20];\r
+extern int tedlevelnum;\r
+extern boolean tedlevel;\r
+extern boolean nospr;\r
+extern boolean IsA386;\r
+\r
+extern byte far *scalermemory;\r
+\r
+extern fixed focallength;\r
+extern unsigned viewangles;\r
+extern unsigned screenofs;\r
+extern int viewwidth;\r
+extern int viewheight;\r
+extern int centerx;\r
+extern int shootdelta;\r
+\r
+extern int dirangle[9];\r
+\r
+extern boolean startgame,loadedgame,virtualreality;\r
+extern int mouseadjustment;\r
+//\r
+// math tables\r
+//\r
+extern int pixelangle[MAXVIEWWIDTH];\r
+extern long far finetangent[FINEANGLES/4];\r
+extern fixed far sintable[],far *costable;\r
+\r
+//\r
+// derived constants\r
+//\r
+extern fixed scale,maxslope;\r
+extern long heightnumerator;\r
+extern int minheightdiv;\r
+\r
+extern char configname[13];\r
+\r
+\r
+\r
+void HelpScreens (void);\r
+void OrderingInfo (void);\r
+void TEDDeath(void);\r
+void Quit (char *error);\r
+void CalcProjection (long focal);\r
+boolean SetViewSize (unsigned width, unsigned height);\r
+void NewGame (int difficulty,int episode);\r
+void NewViewSize (int width);\r
+boolean LoadTheGame(int file,int x,int y);\r
+boolean SaveTheGame(int file,int x,int y);\r
+void ShowViewSize (int width);\r
+void ShutdownId (void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_GAME DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+extern boolean ingame,fizzlein;\r
+extern unsigned latchpics[NUMLATCHPICS];\r
+extern gametype gamestate;\r
+extern int doornum;\r
+\r
+extern char demoname[13];\r
+\r
+extern long spearx,speary;\r
+extern unsigned spearangle;\r
+extern boolean spearflag;\r
+\r
+\r
+void DrawPlayBorder (void);\r
+void ScanInfoPlane (void);\r
+void SetupGameLevel (void);\r
+void NormalScreen (void);\r
+void DrawPlayScreen (void);\r
+void FizzleOut (void);\r
+void GameLoop (void);\r
+void ClearMemory (void);\r
+void PlayDemo (int demonumber);\r
+void RecordDemo (void);\r
+void DrawAllPlayBorder (void);\r
+void DrawHighScores(void);\r
+void DrawAllPlayBorderSides (void);\r
+\r
+\r
+// JAB\r
+#define PlaySoundLocTile(s,tx,ty) PlaySoundLocGlobal(s,(((long)(tx) << TILESHIFT) + (1L << (TILESHIFT - 1))),(((long)ty << TILESHIFT) + (1L << (TILESHIFT - 1))))\r
+#define PlaySoundLocActor(s,ob) PlaySoundLocGlobal(s,(ob)->x,(ob)->y)\r
+void PlaySoundLocGlobal(word s,fixed gx,fixed gy);\r
+void UpdateSoundLoc(void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_PLAY DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#ifdef SPEAR\r
+extern long funnyticount; // FOR FUNNY BJ FACE\r
+#endif\r
+\r
+extern exit_t playstate;\r
+\r
+extern boolean madenoise;\r
+\r
+extern objtype objlist[MAXACTORS],*new,*obj,*player,*lastobj,\r
+ *objfreelist,*killerobj;\r
+extern statobj_t statobjlist[MAXSTATS],*laststatobj;\r
+extern doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;\r
+\r
+extern unsigned farmapylookup[MAPSIZE];\r
+extern byte *nearmapylookup[MAPSIZE];\r
+\r
+extern byte tilemap[MAPSIZE][MAPSIZE]; // wall values only\r
+extern byte spotvis[MAPSIZE][MAPSIZE];\r
+extern objtype *actorat[MAPSIZE][MAPSIZE];\r
+\r
+#define UPDATESIZE (UPDATEWIDE*UPDATEHIGH)\r
+extern byte update[UPDATESIZE];\r
+\r
+extern boolean singlestep,godmode,noclip;\r
+extern int extravbls;\r
+\r
+//\r
+// control info\r
+//\r
+extern boolean mouseenabled,joystickenabled,joypadenabled,joystickprogressive;\r
+extern int joystickport;\r
+extern int dirscan[4];\r
+extern int buttonscan[NUMBUTTONS];\r
+extern int buttonmouse[4];\r
+extern int buttonjoy[4];\r
+\r
+extern boolean buttonheld[NUMBUTTONS];\r
+\r
+extern int viewsize;\r
+\r
+//\r
+// curent user input\r
+//\r
+extern int controlx,controly; // range from -100 to 100\r
+extern boolean buttonstate[NUMBUTTONS];\r
+\r
+extern boolean demorecord,demoplayback;\r
+extern char far *demoptr, far *lastdemoptr;\r
+extern memptr demobuffer;\r
+\r
+\r
+\r
+void InitRedShifts (void);\r
+void FinishPaletteShifts (void);\r
+\r
+void CenterWindow(word w,word h);\r
+void InitActorList (void);\r
+void GetNewActor (void);\r
+void RemoveObj (objtype *gone);\r
+void PollControls (void);\r
+void StopMusic(void);\r
+void StartMusic(void);\r
+void PlayLoop (void);\r
+void StartDamageFlash (int damage);\r
+void StartBonusFlash (void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_INTER\r
+\r
+=============================================================================\r
+*/\r
+\r
+void IntroScreen (void);\r
+void PreloadGraphics(void);\r
+void LevelCompleted (void);\r
+void CheckHighScore (long score,word other);\r
+void Victory (void);\r
+void ClearSplitVWB (void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_DEBUG\r
+\r
+=============================================================================\r
+*/\r
+\r
+int DebugKeys (void);\r
+void PicturePause (void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_DRAW DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern unsigned screenloc[3];\r
+extern unsigned freelatch;\r
+\r
+extern long lasttimecount;\r
+extern long frameon;\r
+extern boolean fizzlein;\r
+\r
+extern unsigned wallheight[MAXVIEWWIDTH];\r
+\r
+extern fixed tileglobal;\r
+extern fixed focallength;\r
+extern fixed mindist;\r
+\r
+//\r
+// math tables\r
+//\r
+extern int pixelangle[MAXVIEWWIDTH];\r
+extern long far finetangent[FINEANGLES/4];\r
+extern fixed far sintable[],far *costable;\r
+\r
+//\r
+// derived constants\r
+//\r
+extern fixed scale;\r
+extern long heightnumerator,mindist;\r
+\r
+//\r
+// refresh variables\r
+//\r
+extern fixed viewx,viewy; // the focal point\r
+extern int viewangle;\r
+extern fixed viewsin,viewcos;\r
+\r
+extern long postsource;\r
+extern unsigned postx;\r
+extern unsigned postwidth;\r
+\r
+\r
+extern int horizwall[],vertwall[];\r
+\r
+extern unsigned pwallpos;\r
+\r
+\r
+fixed FixedByFrac (fixed a, fixed b);\r
+void TransformActor (objtype *ob);\r
+void BuildTables (void);\r
+void ClearScreen (void);\r
+int CalcRotate (objtype *ob);\r
+void DrawScaleds (void);\r
+void CalcTics (void);\r
+void FixOfs (void);\r
+void ThreeDRefresh (void);\r
+void FarScalePost (void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_STATE DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+#define TURNTICS 10\r
+#define SPDPATROL 512\r
+#define SPDDOG 1500\r
+\r
+\r
+extern dirtype opposite[9];\r
+extern dirtype diagonal[9][9];\r
+\r
+\r
+void InitHitRect (objtype *ob, unsigned radius);\r
+void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);\r
+void NewState (objtype *ob, statetype *state);\r
+\r
+boolean TryWalk (objtype *ob);\r
+void SelectChaseDir (objtype *ob);\r
+void SelectDodgeDir (objtype *ob);\r
+void SelectRunDir (objtype *ob);\r
+void MoveObj (objtype *ob, long move);\r
+boolean SightPlayer (objtype *ob);\r
+\r
+void KillActor (objtype *ob);\r
+void DamageActor (objtype *ob, unsigned damage);\r
+\r
+boolean CheckLine (objtype *ob);\r
+boolean CheckSight (objtype *ob);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_SCALE DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+#define COMPSCALECODESTART (65*4) // offset to start of code in comp scaler\r
+\r
+typedef struct\r
+{\r
+ unsigned codeofs[65];\r
+ unsigned width[65];\r
+ byte code[];\r
+} t_compscale;\r
+\r
+typedef struct\r
+{\r
+ unsigned leftpix,rightpix;\r
+ unsigned dataofs[64];\r
+// table data after dataofs[rightpix-leftpix+1]\r
+} t_compshape;\r
+\r
+\r
+extern t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];\r
+extern long fullscalefarcall[MAXSCALEHEIGHT+1];\r
+\r
+extern byte bitmasks1[8][8];\r
+extern byte bitmasks2[8][8];\r
+extern unsigned wordmasks[8][8];\r
+\r
+extern byte mapmasks1[4][8];\r
+extern byte mapmasks2[4][8];\r
+extern byte mapmasks3[4][8];\r
+\r
+extern int maxscale,maxscaleshl2;\r
+\r
+extern boolean insetupscaling;\r
+\r
+void SetupScaling (int maxscaleheight);\r
+void ScaleShape (int xcenter, int shapenum, unsigned height);\r
+void SimpleScaleShape (int xcenter, int shapenum, unsigned height);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_AGENT DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+//\r
+// player state info\r
+//\r
+extern boolean running;\r
+extern long thrustspeed;\r
+extern unsigned plux,pluy; // player coordinates scaled to unsigned\r
+\r
+extern int anglefrac;\r
+extern int facecount;\r
+\r
+void SpawnPlayer (int tilex, int tiley, int dir);\r
+void DrawFace (void);\r
+void DrawHealth (void);\r
+void TakeDamage (int points,objtype *attacker);\r
+void HealSelf (int points);\r
+void DrawLevel (void);\r
+void DrawLives (void);\r
+void GiveExtraMan (void);\r
+void DrawScore (void);\r
+void GivePoints (long points);\r
+void DrawWeapon (void);\r
+void DrawKeys (void);\r
+void GiveWeapon (int weapon);\r
+void DrawAmmo (void);\r
+void GiveAmmo (int ammo);\r
+void GiveKey (int key);\r
+void GetBonus (statobj_t *check);\r
+\r
+void Thrust (int angle, long speed);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_ACT1 DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;\r
+extern int doornum;\r
+\r
+extern unsigned doorposition[MAXDOORS],pwallstate;\r
+\r
+extern byte far areaconnect[NUMAREAS][NUMAREAS];\r
+\r
+extern boolean areabyplayer[NUMAREAS];\r
+\r
+extern unsigned pwallstate;\r
+extern unsigned pwallpos; // amount a pushable wall has been moved (0-63)\r
+extern unsigned pwallx,pwally;\r
+extern int pwalldir;\r
+\r
+\r
+void InitDoorList (void);\r
+void InitStaticList (void);\r
+void SpawnStatic (int tilex, int tiley, int type);\r
+void SpawnDoor (int tilex, int tiley, boolean vertical, int lock);\r
+void MoveDoors (void);\r
+void MovePWalls (void);\r
+void OpenDoor (int door);\r
+void PlaceItemType (int itemtype, int tilex, int tiley);\r
+void PushWall (int checkx, int checky, int dir);\r
+void OperateDoor (int door);\r
+void InitAreas (void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_ACT2 DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define s_nakedbody s_static10\r
+\r
+extern statetype s_grddie1;\r
+extern statetype s_dogdie1;\r
+extern statetype s_ofcdie1;\r
+extern statetype s_mutdie1;\r
+extern statetype s_ssdie1;\r
+extern statetype s_bossdie1;\r
+extern statetype s_schabbdie1;\r
+extern statetype s_fakedie1;\r
+extern statetype s_mechadie1;\r
+extern statetype s_hitlerdie1;\r
+extern statetype s_greteldie1;\r
+extern statetype s_giftdie1;\r
+extern statetype s_fatdie1;\r
+\r
+extern statetype s_spectredie1;\r
+extern statetype s_angeldie1;\r
+extern statetype s_transdie0;\r
+extern statetype s_uberdie0;\r
+extern statetype s_willdie1;\r
+extern statetype s_deathdie1;\r
+\r
+\r
+extern statetype s_grdchase1;\r
+extern statetype s_dogchase1;\r
+extern statetype s_ofcchase1;\r
+extern statetype s_sschase1;\r
+extern statetype s_mutchase1;\r
+extern statetype s_bosschase1;\r
+extern statetype s_schabbchase1;\r
+extern statetype s_fakechase1;\r
+extern statetype s_mechachase1;\r
+extern statetype s_gretelchase1;\r
+extern statetype s_giftchase1;\r
+extern statetype s_fatchase1;\r
+\r
+extern statetype s_spectrechase1;\r
+extern statetype s_angelchase1;\r
+extern statetype s_transchase1;\r
+extern statetype s_uberchase1;\r
+extern statetype s_willchase1;\r
+extern statetype s_deathchase1;\r
+\r
+extern statetype s_blinkychase1;\r
+extern statetype s_hitlerchase1;\r
+\r
+extern statetype s_grdpain;\r
+extern statetype s_grdpain1;\r
+extern statetype s_ofcpain;\r
+extern statetype s_ofcpain1;\r
+extern statetype s_sspain;\r
+extern statetype s_sspain1;\r
+extern statetype s_mutpain;\r
+extern statetype s_mutpain1;\r
+\r
+extern statetype s_deathcam;\r
+\r
+extern statetype s_schabbdeathcam2;\r
+extern statetype s_hitlerdeathcam2;\r
+extern statetype s_giftdeathcam2;\r
+extern statetype s_fatdeathcam2;\r
+\r
+void SpawnStand (enemy_t which, int tilex, int tiley, int dir);\r
+void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir);\r
+void KillActor (objtype *ob);\r
+\r
+void US_ControlPanel(byte);\r
+\r
+void SpawnDeadGuard (int tilex, int tiley);\r
+void SpawnBoss (int tilex, int tiley);\r
+void SpawnGretel (int tilex, int tiley);\r
+void SpawnTrans (int tilex, int tiley);\r
+void SpawnUber (int tilex, int tiley);\r
+void SpawnWill (int tilex, int tiley);\r
+void SpawnDeath (int tilex, int tiley);\r
+void SpawnAngel (int tilex, int tiley);\r
+void SpawnSpectre (int tilex, int tiley);\r
+void SpawnGhosts (int which, int tilex, int tiley);\r
+void SpawnSchabbs (int tilex, int tiley);\r
+void SpawnGift (int tilex, int tiley);\r
+void SpawnFat (int tilex, int tiley);\r
+void SpawnFakeHitler (int tilex, int tiley);\r
+void SpawnHitler (int tilex, int tiley);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ WL_TEXT DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern char helpfilename[],endfilename[];\r
+\r
+extern void HelpScreens(void);\r
+extern void EndText(void);\r