rockbox/apps/plugins/sdl/progs/wolf3d/wl_def.h
Franklin Wei 152e415b0d wolf3d: fix FM OPL alignment bug in a cleaner way
wl_def.h has a #pragma pack(1), which causes issues when we take the
address of an unaligned struct field. This fixes the issue by
disabling packing in fmopl_gpl.c.

Change-Id: I526880fa73226e8028855896f7efc3a66571b3ec
2019-07-09 17:34:09 -04:00

1480 lines
35 KiB
C

#ifndef WL_DEF_H
#define WL_DEF_H
// Defines which version shall be built and configures supported extra features
#include "version.h"
#define SOUND_ENABLE
#include "fixedpoint.h"
#include <ctype.h>
#include <stdint.h>
#include <stdarg.h>
#include <SDL.h>
#include <SDL_mixer.h>
#define open rb->open
#define read(a, b, c) rb->read((a), (b), (c))
#define write(a, b, c) rb->write((a), (b), (c))
#define close(a) rb->close(a)
#if !defined O_BINARY
# define O_BINARY 0
#endif
// needed by wolf, but is dangerous on ARM
#pragma pack(1)
#if defined(_arch_dreamcast)
#define YESBUTTONNAME "A"
#define NOBUTTONNAME "B"
#elif defined(GP2X)
#define YESBUTTONNAME "Y"
#define NOBUTTONNAME "B"
#else
#define YESBUTTONNAME "Y"
#define NOBUTTONNAME "N"
#endif
#include "foreign.h"
#ifndef SPEAR
#include "audiowl6.h"
#ifdef UPLOAD
#include "gfxv_apo.h"
#else
#ifdef GOODTIMES
#include "gfxv_wl6.h"
#else
#include "gfxv_apo.h"
#endif
#endif
#else
#include "audiosod.h"
#include "gfxv_sod.h"
#include "f_spear.h"
#endif
typedef uint8_t byte;
typedef uint16_t word;
typedef int32_t fixed;
typedef uint32_t longword;
typedef int8_t boolean;
typedef void * memptr;
typedef struct
{
int x,y;
} Point;
typedef struct
{
Point ul,lr;
} Rect;
void Quit(const char *errorStr, ...);
#include "id_pm.h"
#include "id_sd.h"
#include "id_in.h"
#include "id_vl.h"
#include "id_vh.h"
#include "id_us.h"
#include "id_ca.h"
#include "wl_menu.h"
#define MAPSPOT(x,y,plane) (mapsegs[plane][((y)<<mapshift)+(x)])
#define SIGN(x) ((x)>0?1:-1)
#define ABS(x) ((int)(x)>0?(x):-(x))
#define LABS(x) ((int32_t)(x)>0?(x):-(x))
#define abs(x) ABS(x)
/*
=============================================================================
GLOBAL CONSTANTS
=============================================================================
*/
#define MAXTICS 10
#define DEMOTICS 4
#define MAXACTORS 150 // max number of nazis, etc / map
#define MAXSTATS 400 // max number of lamps, bonus, etc
#define MAXDOORS 64 // max number of sliding doors
#define MAXWALLTILES 64 // max number of wall tiles
//
// tile constants
//
#define ICONARROWS 90
#define PUSHABLETILE 98
#define EXITTILE 99 // at end of castle
#define AREATILE 107 // first of NUMAREAS floor tiles
#define NUMAREAS 37
#define ELEVATORTILE 21
#define AMBUSHTILE 106
#define ALTELEVATORTILE 107
#define NUMBERCHARS 9
//----------------
#define EXTRAPOINTS 40000
#define PLAYERSPEED 3000
#define RUNSPEED 6000
#define SCREENSEG 0xa000
#define SCREENBWIDE 80
#define HEIGHTRATIO 0.50 // also defined in id_mm.c
#define BORDERCOLOR 3
#define FLASHCOLOR 5
#define FLASHTICS 4
#ifndef SPEAR
#define LRpack 8 // # of levels to store in endgame
#else
#define LRpack 20
#endif
#define PLAYERSIZE MINDIST // player radius
#define MINACTORDIST 0x10000l // minimum dist from player center
// to any actor center
#define NUMLATCHPICS 100
#undef M_PI
#define PI 3.141592657
#define M_PI PI
#define GLOBAL1 (1l<<16)
#define TILEGLOBAL GLOBAL1
#define PIXGLOBAL (GLOBAL1/64)
#define TILESHIFT 16l
#define UNSIGNEDSHIFT 8
#define ANGLES 360 // must be divisable by 4
#define ANGLEQUAD (ANGLES/4)
#define FINEANGLES 3600
#define ANG90 (FINEANGLES/4)
#define ANG180 (ANG90*2)
#define ANG270 (ANG90*3)
#define ANG360 (ANG90*4)
#define VANG90 (ANGLES/4)
#define VANG180 (VANG90*2)
#define VANG270 (VANG90*3)
#define VANG360 (VANG90*4)
#define MINDIST (0x5800l)
#define mapshift 6
#define MAPSIZE (1<<mapshift)
#define maparea MAPSIZE*MAPSIZE
#define mapheight MAPSIZE
#define mapwidth MAPSIZE
#ifdef USE_HIRES
#define TEXTURESHIFT 7
#define TEXTURESIZE (1<<TEXTURESHIFT)
#define TEXTUREFROMFIXEDSHIFT 2
#define TEXTUREMASK (TEXTURESIZE*(TEXTURESIZE-1))
#define SPRITESCALEFACTOR 1
#else
#define TEXTURESHIFT 6
#define TEXTURESIZE (1<<TEXTURESHIFT)
#define TEXTUREFROMFIXEDSHIFT 4
#define TEXTUREMASK (TEXTURESIZE*(TEXTURESIZE-1))
#define SPRITESCALEFACTOR 2
#endif
#define NORTH 0
#define EAST 1
#define SOUTH 2
#define WEST 3
#define STATUSLINES 40
#define SCREENSIZE (SCREENBWIDE*208)
#define PAGE1START 0
#define PAGE2START (SCREENSIZE)
#define PAGE3START (SCREENSIZE*2u)
#define FREESTART (SCREENSIZE*3u)
#define PIXRADIUS 512
#define STARTAMMO 8
// object flag values
typedef enum
{
FL_SHOOTABLE = 0x00000001,
FL_BONUS = 0x00000002,
FL_NEVERMARK = 0x00000004,
FL_VISABLE = 0x00000008,
FL_ATTACKMODE = 0x00000010,
FL_FIRSTATTACK = 0x00000020,
FL_AMBUSH = 0x00000040,
FL_NONMARK = 0x00000080,
FL_FULLBRIGHT = 0x00000100,
#ifdef USE_DIR3DSPR
// you can choose one of the following values in wl_act1.cpp
// to make a static sprite a directional 3d sprite
// (see example at the end of the statinfo array)
FL_DIR_HORIZ_MID = 0x00000200,
FL_DIR_HORIZ_FW = 0x00000400,
FL_DIR_HORIZ_BW = 0x00000600,
FL_DIR_VERT_MID = 0x00000a00,
FL_DIR_VERT_FW = 0x00000c00,
FL_DIR_VERT_BW = 0x00000e00,
// these values are just used to improve readability of code
FL_DIR_NONE = 0x00000000,
FL_DIR_POS_MID = 0x00000200,
FL_DIR_POS_FW = 0x00000400,
FL_DIR_POS_BW = 0x00000600,
FL_DIR_POS_MASK = 0x00000600,
FL_DIR_VERT_FLAG = 0x00000800,
FL_DIR_MASK = 0x00000e00,
#endif
// next free bit is 0x00001000
} objflag_t;
//
// sprite constants
//
enum
{
SPR_DEMO,
#ifndef APOGEE_1_0
SPR_DEATHCAM,
#endif
//
// static sprites
//
SPR_STAT_0,SPR_STAT_1,SPR_STAT_2,SPR_STAT_3,
SPR_STAT_4,SPR_STAT_5,SPR_STAT_6,SPR_STAT_7,
SPR_STAT_8,SPR_STAT_9,SPR_STAT_10,SPR_STAT_11,
SPR_STAT_12,SPR_STAT_13,SPR_STAT_14,SPR_STAT_15,
SPR_STAT_16,SPR_STAT_17,SPR_STAT_18,SPR_STAT_19,
SPR_STAT_20,SPR_STAT_21,SPR_STAT_22,SPR_STAT_23,
SPR_STAT_24,SPR_STAT_25,SPR_STAT_26,SPR_STAT_27,
SPR_STAT_28,SPR_STAT_29,SPR_STAT_30,SPR_STAT_31,
SPR_STAT_32,SPR_STAT_33,SPR_STAT_34,SPR_STAT_35,
SPR_STAT_36,SPR_STAT_37,SPR_STAT_38,SPR_STAT_39,
SPR_STAT_40,SPR_STAT_41,SPR_STAT_42,SPR_STAT_43,
SPR_STAT_44,SPR_STAT_45,SPR_STAT_46,SPR_STAT_47,
#ifdef SPEAR
SPR_STAT_48,SPR_STAT_49,SPR_STAT_50,SPR_STAT_51,
#endif
//
// guard
//
SPR_GRD_S_1,SPR_GRD_S_2,SPR_GRD_S_3,SPR_GRD_S_4,
SPR_GRD_S_5,SPR_GRD_S_6,SPR_GRD_S_7,SPR_GRD_S_8,
SPR_GRD_W1_1,SPR_GRD_W1_2,SPR_GRD_W1_3,SPR_GRD_W1_4,
SPR_GRD_W1_5,SPR_GRD_W1_6,SPR_GRD_W1_7,SPR_GRD_W1_8,
SPR_GRD_W2_1,SPR_GRD_W2_2,SPR_GRD_W2_3,SPR_GRD_W2_4,
SPR_GRD_W2_5,SPR_GRD_W2_6,SPR_GRD_W2_7,SPR_GRD_W2_8,
SPR_GRD_W3_1,SPR_GRD_W3_2,SPR_GRD_W3_3,SPR_GRD_W3_4,
SPR_GRD_W3_5,SPR_GRD_W3_6,SPR_GRD_W3_7,SPR_GRD_W3_8,
SPR_GRD_W4_1,SPR_GRD_W4_2,SPR_GRD_W4_3,SPR_GRD_W4_4,
SPR_GRD_W4_5,SPR_GRD_W4_6,SPR_GRD_W4_7,SPR_GRD_W4_8,
SPR_GRD_PAIN_1,SPR_GRD_DIE_1,SPR_GRD_DIE_2,SPR_GRD_DIE_3,
SPR_GRD_PAIN_2,SPR_GRD_DEAD,
SPR_GRD_SHOOT1,SPR_GRD_SHOOT2,SPR_GRD_SHOOT3,
//
// dogs
//
SPR_DOG_W1_1,SPR_DOG_W1_2,SPR_DOG_W1_3,SPR_DOG_W1_4,
SPR_DOG_W1_5,SPR_DOG_W1_6,SPR_DOG_W1_7,SPR_DOG_W1_8,
SPR_DOG_W2_1,SPR_DOG_W2_2,SPR_DOG_W2_3,SPR_DOG_W2_4,
SPR_DOG_W2_5,SPR_DOG_W2_6,SPR_DOG_W2_7,SPR_DOG_W2_8,
SPR_DOG_W3_1,SPR_DOG_W3_2,SPR_DOG_W3_3,SPR_DOG_W3_4,
SPR_DOG_W3_5,SPR_DOG_W3_6,SPR_DOG_W3_7,SPR_DOG_W3_8,
SPR_DOG_W4_1,SPR_DOG_W4_2,SPR_DOG_W4_3,SPR_DOG_W4_4,
SPR_DOG_W4_5,SPR_DOG_W4_6,SPR_DOG_W4_7,SPR_DOG_W4_8,
SPR_DOG_DIE_1,SPR_DOG_DIE_2,SPR_DOG_DIE_3,SPR_DOG_DEAD,
SPR_DOG_JUMP1,SPR_DOG_JUMP2,SPR_DOG_JUMP3,
//
// ss
//
SPR_SS_S_1,SPR_SS_S_2,SPR_SS_S_3,SPR_SS_S_4,
SPR_SS_S_5,SPR_SS_S_6,SPR_SS_S_7,SPR_SS_S_8,
SPR_SS_W1_1,SPR_SS_W1_2,SPR_SS_W1_3,SPR_SS_W1_4,
SPR_SS_W1_5,SPR_SS_W1_6,SPR_SS_W1_7,SPR_SS_W1_8,
SPR_SS_W2_1,SPR_SS_W2_2,SPR_SS_W2_3,SPR_SS_W2_4,
SPR_SS_W2_5,SPR_SS_W2_6,SPR_SS_W2_7,SPR_SS_W2_8,
SPR_SS_W3_1,SPR_SS_W3_2,SPR_SS_W3_3,SPR_SS_W3_4,
SPR_SS_W3_5,SPR_SS_W3_6,SPR_SS_W3_7,SPR_SS_W3_8,
SPR_SS_W4_1,SPR_SS_W4_2,SPR_SS_W4_3,SPR_SS_W4_4,
SPR_SS_W4_5,SPR_SS_W4_6,SPR_SS_W4_7,SPR_SS_W4_8,
SPR_SS_PAIN_1,SPR_SS_DIE_1,SPR_SS_DIE_2,SPR_SS_DIE_3,
SPR_SS_PAIN_2,SPR_SS_DEAD,
SPR_SS_SHOOT1,SPR_SS_SHOOT2,SPR_SS_SHOOT3,
//
// mutant
//
SPR_MUT_S_1,SPR_MUT_S_2,SPR_MUT_S_3,SPR_MUT_S_4,
SPR_MUT_S_5,SPR_MUT_S_6,SPR_MUT_S_7,SPR_MUT_S_8,
SPR_MUT_W1_1,SPR_MUT_W1_2,SPR_MUT_W1_3,SPR_MUT_W1_4,
SPR_MUT_W1_5,SPR_MUT_W1_6,SPR_MUT_W1_7,SPR_MUT_W1_8,
SPR_MUT_W2_1,SPR_MUT_W2_2,SPR_MUT_W2_3,SPR_MUT_W2_4,
SPR_MUT_W2_5,SPR_MUT_W2_6,SPR_MUT_W2_7,SPR_MUT_W2_8,
SPR_MUT_W3_1,SPR_MUT_W3_2,SPR_MUT_W3_3,SPR_MUT_W3_4,
SPR_MUT_W3_5,SPR_MUT_W3_6,SPR_MUT_W3_7,SPR_MUT_W3_8,
SPR_MUT_W4_1,SPR_MUT_W4_2,SPR_MUT_W4_3,SPR_MUT_W4_4,
SPR_MUT_W4_5,SPR_MUT_W4_6,SPR_MUT_W4_7,SPR_MUT_W4_8,
SPR_MUT_PAIN_1,SPR_MUT_DIE_1,SPR_MUT_DIE_2,SPR_MUT_DIE_3,
SPR_MUT_PAIN_2,SPR_MUT_DIE_4,SPR_MUT_DEAD,
SPR_MUT_SHOOT1,SPR_MUT_SHOOT2,SPR_MUT_SHOOT3,SPR_MUT_SHOOT4,
//
// officer
//
SPR_OFC_S_1,SPR_OFC_S_2,SPR_OFC_S_3,SPR_OFC_S_4,
SPR_OFC_S_5,SPR_OFC_S_6,SPR_OFC_S_7,SPR_OFC_S_8,
SPR_OFC_W1_1,SPR_OFC_W1_2,SPR_OFC_W1_3,SPR_OFC_W1_4,
SPR_OFC_W1_5,SPR_OFC_W1_6,SPR_OFC_W1_7,SPR_OFC_W1_8,
SPR_OFC_W2_1,SPR_OFC_W2_2,SPR_OFC_W2_3,SPR_OFC_W2_4,
SPR_OFC_W2_5,SPR_OFC_W2_6,SPR_OFC_W2_7,SPR_OFC_W2_8,
SPR_OFC_W3_1,SPR_OFC_W3_2,SPR_OFC_W3_3,SPR_OFC_W3_4,
SPR_OFC_W3_5,SPR_OFC_W3_6,SPR_OFC_W3_7,SPR_OFC_W3_8,
SPR_OFC_W4_1,SPR_OFC_W4_2,SPR_OFC_W4_3,SPR_OFC_W4_4,
SPR_OFC_W4_5,SPR_OFC_W4_6,SPR_OFC_W4_7,SPR_OFC_W4_8,
SPR_OFC_PAIN_1,SPR_OFC_DIE_1,SPR_OFC_DIE_2,SPR_OFC_DIE_3,
SPR_OFC_PAIN_2,SPR_OFC_DIE_4,SPR_OFC_DEAD,
SPR_OFC_SHOOT1,SPR_OFC_SHOOT2,SPR_OFC_SHOOT3,
#ifndef SPEAR
//
// ghosts
//
SPR_BLINKY_W1,SPR_BLINKY_W2,SPR_PINKY_W1,SPR_PINKY_W2,
SPR_CLYDE_W1,SPR_CLYDE_W2,SPR_INKY_W1,SPR_INKY_W2,
//
// hans
//
SPR_BOSS_W1,SPR_BOSS_W2,SPR_BOSS_W3,SPR_BOSS_W4,
SPR_BOSS_SHOOT1,SPR_BOSS_SHOOT2,SPR_BOSS_SHOOT3,SPR_BOSS_DEAD,
SPR_BOSS_DIE1,SPR_BOSS_DIE2,SPR_BOSS_DIE3,
//
// schabbs
//
SPR_SCHABB_W1,SPR_SCHABB_W2,SPR_SCHABB_W3,SPR_SCHABB_W4,
SPR_SCHABB_SHOOT1,SPR_SCHABB_SHOOT2,
SPR_SCHABB_DIE1,SPR_SCHABB_DIE2,SPR_SCHABB_DIE3,SPR_SCHABB_DEAD,
SPR_HYPO1,SPR_HYPO2,SPR_HYPO3,SPR_HYPO4,
//
// fake
//
SPR_FAKE_W1,SPR_FAKE_W2,SPR_FAKE_W3,SPR_FAKE_W4,
SPR_FAKE_SHOOT,SPR_FIRE1,SPR_FIRE2,
SPR_FAKE_DIE1,SPR_FAKE_DIE2,SPR_FAKE_DIE3,SPR_FAKE_DIE4,
SPR_FAKE_DIE5,SPR_FAKE_DEAD,
//
// hitler
//
SPR_MECHA_W1,SPR_MECHA_W2,SPR_MECHA_W3,SPR_MECHA_W4,
SPR_MECHA_SHOOT1,SPR_MECHA_SHOOT2,SPR_MECHA_SHOOT3,SPR_MECHA_DEAD,
SPR_MECHA_DIE1,SPR_MECHA_DIE2,SPR_MECHA_DIE3,
SPR_HITLER_W1,SPR_HITLER_W2,SPR_HITLER_W3,SPR_HITLER_W4,
SPR_HITLER_SHOOT1,SPR_HITLER_SHOOT2,SPR_HITLER_SHOOT3,SPR_HITLER_DEAD,
SPR_HITLER_DIE1,SPR_HITLER_DIE2,SPR_HITLER_DIE3,SPR_HITLER_DIE4,
SPR_HITLER_DIE5,SPR_HITLER_DIE6,SPR_HITLER_DIE7,
//
// giftmacher
//
SPR_GIFT_W1,SPR_GIFT_W2,SPR_GIFT_W3,SPR_GIFT_W4,
SPR_GIFT_SHOOT1,SPR_GIFT_SHOOT2,
SPR_GIFT_DIE1,SPR_GIFT_DIE2,SPR_GIFT_DIE3,SPR_GIFT_DEAD,
#endif
//
// Rocket, smoke and small explosion
//
SPR_ROCKET_1,SPR_ROCKET_2,SPR_ROCKET_3,SPR_ROCKET_4,
SPR_ROCKET_5,SPR_ROCKET_6,SPR_ROCKET_7,SPR_ROCKET_8,
SPR_SMOKE_1,SPR_SMOKE_2,SPR_SMOKE_3,SPR_SMOKE_4,
SPR_BOOM_1,SPR_BOOM_2,SPR_BOOM_3,
//
// Angel of Death's DeathSparks(tm)
//
#ifdef SPEAR
SPR_HROCKET_1,SPR_HROCKET_2,SPR_HROCKET_3,SPR_HROCKET_4,
SPR_HROCKET_5,SPR_HROCKET_6,SPR_HROCKET_7,SPR_HROCKET_8,
SPR_HSMOKE_1,SPR_HSMOKE_2,SPR_HSMOKE_3,SPR_HSMOKE_4,
SPR_HBOOM_1,SPR_HBOOM_2,SPR_HBOOM_3,
SPR_SPARK1,SPR_SPARK2,SPR_SPARK3,SPR_SPARK4,
#endif
#ifndef SPEAR
//
// gretel
//
SPR_GRETEL_W1,SPR_GRETEL_W2,SPR_GRETEL_W3,SPR_GRETEL_W4,
SPR_GRETEL_SHOOT1,SPR_GRETEL_SHOOT2,SPR_GRETEL_SHOOT3,SPR_GRETEL_DEAD,
SPR_GRETEL_DIE1,SPR_GRETEL_DIE2,SPR_GRETEL_DIE3,
//
// fat face
//
SPR_FAT_W1,SPR_FAT_W2,SPR_FAT_W3,SPR_FAT_W4,
SPR_FAT_SHOOT1,SPR_FAT_SHOOT2,SPR_FAT_SHOOT3,SPR_FAT_SHOOT4,
SPR_FAT_DIE1,SPR_FAT_DIE2,SPR_FAT_DIE3,SPR_FAT_DEAD,
//
// bj
//
#ifdef APOGEE_1_0
SPR_BJ_W1=360,
#elif defined(APOGEE_1_1) && defined(UPLOAD)
SPR_BJ_W1=406,
#else
SPR_BJ_W1,
#endif
SPR_BJ_W2,SPR_BJ_W3,SPR_BJ_W4,
SPR_BJ_JUMP1,SPR_BJ_JUMP2,SPR_BJ_JUMP3,SPR_BJ_JUMP4,
#else
//
// THESE ARE FOR 'SPEAR OF DESTINY'
//
//
// Trans Grosse
//
SPR_TRANS_W1,SPR_TRANS_W2,SPR_TRANS_W3,SPR_TRANS_W4,
SPR_TRANS_SHOOT1,SPR_TRANS_SHOOT2,SPR_TRANS_SHOOT3,SPR_TRANS_DEAD,
SPR_TRANS_DIE1,SPR_TRANS_DIE2,SPR_TRANS_DIE3,
//
// Wilhelm
//
SPR_WILL_W1,SPR_WILL_W2,SPR_WILL_W3,SPR_WILL_W4,
SPR_WILL_SHOOT1,SPR_WILL_SHOOT2,SPR_WILL_SHOOT3,SPR_WILL_SHOOT4,
SPR_WILL_DIE1,SPR_WILL_DIE2,SPR_WILL_DIE3,SPR_WILL_DEAD,
//
// UberMutant
//
SPR_UBER_W1,SPR_UBER_W2,SPR_UBER_W3,SPR_UBER_W4,
SPR_UBER_SHOOT1,SPR_UBER_SHOOT2,SPR_UBER_SHOOT3,SPR_UBER_SHOOT4,
SPR_UBER_DIE1,SPR_UBER_DIE2,SPR_UBER_DIE3,SPR_UBER_DIE4,
SPR_UBER_DEAD,
//
// Death Knight
//
SPR_DEATH_W1,SPR_DEATH_W2,SPR_DEATH_W3,SPR_DEATH_W4,
SPR_DEATH_SHOOT1,SPR_DEATH_SHOOT2,SPR_DEATH_SHOOT3,SPR_DEATH_SHOOT4,
SPR_DEATH_DIE1,SPR_DEATH_DIE2,SPR_DEATH_DIE3,SPR_DEATH_DIE4,
SPR_DEATH_DIE5,SPR_DEATH_DIE6,SPR_DEATH_DEAD,
//
// Ghost
//
SPR_SPECTRE_W1,SPR_SPECTRE_W2,SPR_SPECTRE_W3,SPR_SPECTRE_W4,
SPR_SPECTRE_F1,SPR_SPECTRE_F2,SPR_SPECTRE_F3,SPR_SPECTRE_F4,
//
// Angel of Death
//
SPR_ANGEL_W1,SPR_ANGEL_W2,SPR_ANGEL_W3,SPR_ANGEL_W4,
SPR_ANGEL_SHOOT1,SPR_ANGEL_SHOOT2,SPR_ANGEL_TIRED1,SPR_ANGEL_TIRED2,
SPR_ANGEL_DIE1,SPR_ANGEL_DIE2,SPR_ANGEL_DIE3,SPR_ANGEL_DIE4,
SPR_ANGEL_DIE5,SPR_ANGEL_DIE6,SPR_ANGEL_DIE7,SPR_ANGEL_DEAD,
#endif
//
// player attack frames
//
SPR_KNIFEREADY,SPR_KNIFEATK1,SPR_KNIFEATK2,SPR_KNIFEATK3,
SPR_KNIFEATK4,
SPR_PISTOLREADY,SPR_PISTOLATK1,SPR_PISTOLATK2,SPR_PISTOLATK3,
SPR_PISTOLATK4,
SPR_MACHINEGUNREADY,SPR_MACHINEGUNATK1,SPR_MACHINEGUNATK2,MACHINEGUNATK3,
SPR_MACHINEGUNATK4,
SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,
SPR_CHAINATK4,
};
/*
=============================================================================
GLOBAL TYPES
=============================================================================
*/
typedef enum {
di_north,
di_east,
di_south,
di_west
} controldir_t;
typedef enum {
dr_normal,
dr_lock1,
dr_lock2,
dr_lock3,
dr_lock4,
dr_elevator
} door_t;
typedef enum {
ac_badobject = -1,
ac_no,
ac_yes,
ac_allways
} activetype;
typedef enum {
nothing,
playerobj,
inertobj,
guardobj,
officerobj,
ssobj,
dogobj,
bossobj,
schabbobj,
fakeobj,
mechahitlerobj,
mutantobj,
needleobj,
fireobj,
bjobj,
ghostobj,
realhitlerobj,
gretelobj,
giftobj,
fatobj,
rocketobj,
spectreobj,
angelobj,
transobj,
uberobj,
willobj,
deathobj,
hrocketobj,
sparkobj
} classtype;
typedef enum {
none,
block,
bo_gibs,
bo_alpo,
bo_firstaid,
bo_key1,
bo_key2,
bo_key3,
bo_key4,
bo_cross,
bo_chalice,
bo_bible,
bo_crown,
bo_clip,
bo_clip2,
bo_machinegun,
bo_chaingun,
bo_food,
bo_fullheal,
bo_25clip,
bo_spear
} wl_stat_t;
typedef enum {
east,
northeast,
north,
northwest,
west,
southwest,
south,
southeast,
nodir
} dirtype;
#define NUMENEMIES 22
typedef enum {
en_guard,
en_officer,
en_ss,
en_dog,
en_boss,
en_schabbs,
en_fake,
en_hitler,
en_mutant,
en_blinky,
en_clyde,
en_pinky,
en_inky,
en_gretel,
en_gift,
en_fat,
en_spectre,
en_angel,
en_trans,
en_uber,
en_will,
en_death
} enemy_t;
typedef void (* statefunc) (void *);
typedef struct statestruct
{
boolean rotate;
short shapenum; // a shapenum of -1 means get from ob->temp1
short tictime;
void (*think) (void *),(*action) (void *);
struct statestruct *next;
} statetype;
//---------------------
//
// trivial actor structure
//
//---------------------
typedef struct statstruct
{
byte tilex,tiley;
short shapenum; // if shapenum == -1 the obj has been removed
byte *visspot;
uint32_t flags;
byte itemnumber;
} statobj_t;
//---------------------
//
// door actor structure
//
//---------------------
typedef enum
{
dr_open,dr_closed,dr_opening,dr_closing
} doortype;
typedef struct doorstruct
{
byte tilex,tiley;
boolean vertical;
byte lock;
doortype action;
short ticcount;
} doorobj_t;
//--------------------
//
// thinking actor structure
//
//--------------------
typedef struct objstruct
{
activetype active;
short ticcount;
classtype obclass;
statetype *state;
uint32_t flags; // FL_SHOOTABLE, etc
int32_t distance; // if negative, wait for that door to open
dirtype dir;
fixed x,y;
word tilex,tiley;
byte areanumber;
short viewx;
word viewheight;
fixed transx,transy; // in global coord
short angle;
short hitpoints;
int32_t speed;
short temp1,temp2,hidden;
struct objstruct *next,*prev;
} objtype;
enum
{
bt_nobutton=-1,
bt_attack=0,
bt_strafe,
bt_run,
bt_use,
bt_readyknife,
bt_readypistol,
bt_readymachinegun,
bt_readychaingun,
bt_nextweapon,
bt_prevweapon,
bt_esc,
bt_pause,
bt_strafeleft,
bt_straferight,
bt_moveforward,
bt_movebackward,
bt_turnleft,
bt_turnright,
NUMBUTTONS
};
#define NUMWEAPONS 4
typedef enum
{
wp_knife,
wp_pistol,
wp_machinegun,
wp_chaingun
} weapontype;
enum
{
gd_baby,
gd_easy,
gd_medium,
gd_hard
};
//---------------
//
// gamestate structure
//
//---------------
typedef struct
{
short difficulty;
short mapon;
int32_t oldscore,score,nextextra;
short lives;
short health;
short ammo;
short keys;
weapontype bestweapon,weapon,chosenweapon;
short faceframe;
short attackframe,attackcount,weaponframe;
short episode,secretcount,treasurecount,killcount,
secrettotal,treasuretotal,killtotal;
int32_t TimeCount;
int32_t killx,killy;
boolean victoryflag; // set during victory animations
} gametype;
typedef enum
{
ex_stillplaying,
ex_completed,
ex_died,
ex_warped,
ex_resetgame,
ex_loadedgame,
ex_victorious,
ex_abort,
ex_demodone,
ex_secretlevel
} exit_t;
extern word *mapsegs[MAPPLANES];
extern int mapon;
/*
=============================================================================
WL_MAIN DEFINITIONS
=============================================================================
*/
extern boolean loadedgame;
extern fixed focallength;
extern int viewscreenx, viewscreeny;
extern int viewwidth;
extern int viewheight;
extern short centerx;
extern int32_t heightnumerator;
extern fixed scale;
extern int dirangle[9];
extern int mouseadjustment;
extern int shootdelta;
extern unsigned screenofs;
extern boolean startgame;
extern char str[80];
extern char configdir[256];
extern char configname[13];
//
// Command line parameter variables
//
extern boolean param_debugmode;
extern boolean param_nowait;
extern int param_difficulty;
extern int param_tedlevel;
extern int param_joystickindex;
extern int param_joystickhat;
extern int param_samplerate;
extern int param_audiobuffer;
extern int param_mission;
extern boolean param_goodtimes;
extern boolean param_ignorenumchunks;
void NewGame (int difficulty,int episode);
void CalcProjection (int32_t focal);
void NewViewSize (int width);
boolean SetViewSize (unsigned width, unsigned height);
boolean LoadTheGame(FILE *file,int x,int y);
boolean SaveTheGame(FILE *file,int x,int y);
void ShowViewSize (int width);
void ShutdownId (void);
/*
=============================================================================
WL_GAME DEFINITIONS
=============================================================================
*/
extern gametype gamestate;
extern byte bordercol;
extern SDL_Surface *latchpics[NUMLATCHPICS];
extern char demoname[13];
void SetupGameLevel (void);
void GameLoop (void);
void DrawPlayBorder (void);
void DrawStatusBorder (byte color);
void DrawPlayScreen (void);
void DrawPlayBorderSides (void);
void ShowActStatus();
void PlayDemo (int demonumber);
void RecordDemo (void);
#ifdef SPEAR
extern int32_t spearx,speary;
extern unsigned spearangle;
extern boolean spearflag;
#endif
#define ClearMemory SD_StopDigitized
// JAB
#define PlaySoundLocTile(s,tx,ty) PlaySoundLocGlobal(s,(((int32_t)(tx) << TILESHIFT) + (1L << (TILESHIFT - 1))),(((int32_t)ty << TILESHIFT) + (1L << (TILESHIFT - 1))))
#define PlaySoundLocActor(s,ob) PlaySoundLocGlobal(s,(ob)->x,(ob)->y)
void PlaySoundLocGlobal(word s,fixed gx,fixed gy);
void UpdateSoundLoc(void);
/*
=============================================================================
WL_PLAY DEFINITIONS
=============================================================================
*/
#define BASEMOVE 35
#define RUNMOVE 70
#define BASETURN 35
#define RUNTURN 70
#define JOYSCALE 2
extern byte tilemap[MAPSIZE][MAPSIZE]; // wall values only
extern byte spotvis[MAPSIZE][MAPSIZE];
extern objtype *actorat[MAPSIZE][MAPSIZE];
extern objtype *player;
extern unsigned tics;
extern int viewsize;
extern int lastgamemusicoffset;
//
// current user input
//
extern int controlx,controly; // range from -100 to 100
extern boolean buttonstate[NUMBUTTONS];
extern objtype objlist[MAXACTORS];
extern boolean buttonheld[NUMBUTTONS];
extern exit_t playstate;
extern boolean madenoise;
extern statobj_t statobjlist[MAXSTATS];
extern statobj_t *laststatobj;
extern objtype *newobj,*killerobj;
extern doorobj_t doorobjlist[MAXDOORS];
extern doorobj_t *lastdoorobj;
extern int godmode;
extern boolean demorecord,demoplayback;
extern int8_t *demoptr, *lastdemoptr;
extern memptr demobuffer;
//
// control info
//
extern boolean mouseenabled,joystickenabled;
extern int dirscan[4];
extern int buttonscan[NUMBUTTONS];
extern int buttonmouse[4];
extern int buttonjoy[32];
void InitActorList (void);
void GetNewActor (void);
void PlayLoop (void);
void CenterWindow(word w,word h);
void InitRedShifts (void);
void FinishPaletteShifts (void);
void RemoveObj (objtype *gone);
void PollControls (void);
int StopMusic(void);
void StartMusic(void);
void ContinueMusic(int offs);
void StartDamageFlash (int damage);
void StartBonusFlash (void);
#ifdef SPEAR
extern int32_t funnyticount; // FOR FUNNY BJ FACE
#endif
extern objtype *objfreelist; // *obj,*player,*lastobj,
extern boolean noclip,ammocheat;
extern int singlestep, extravbls;
/*
=============================================================================
WL_INTER
=============================================================================
*/
void IntroScreen (void);
void PG13(void);
void DrawHighScores(void);
void CheckHighScore (int32_t score,word other);
void Victory (void);
void LevelCompleted (void);
void ClearSplitVWB (void);
void PreloadGraphics(void);
/*
=============================================================================
WL_DEBUG
=============================================================================
*/
int DebugKeys (void);
/*
=============================================================================
WL_DRAW DEFINITIONS
=============================================================================
*/
//
// math tables
//
extern short *pixelangle;
extern int32_t finetangent[FINEANGLES/4];
extern fixed sintable[];
extern fixed *costable;
extern int *wallheight;
extern word horizwall[],vertwall[];
extern int32_t lasttimecount;
extern int32_t frameon;
extern unsigned screenloc[3];
extern boolean fizzlein, fpscounter;
extern fixed viewx,viewy; // the focal point
extern fixed viewsin,viewcos;
void ThreeDRefresh (void);
void CalcTics (void);
typedef struct
{
word leftpix,rightpix;
word dataofs[64];
// table data after dataofs[rightpix-leftpix+1]
} t_compshape;
/*
=============================================================================
WL_STATE DEFINITIONS
=============================================================================
*/
#define TURNTICS 10
#define SPDPATROL 512
#define SPDDOG 1500
void InitHitRect (objtype *ob, unsigned radius);
void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);
void NewState (objtype *ob, statetype *state);
boolean TryWalk (objtype *ob);
void SelectChaseDir (objtype *ob);
void SelectDodgeDir (objtype *ob);
void SelectRunDir (objtype *ob);
void MoveObj (objtype *ob, int32_t move);
boolean SightPlayer (objtype *ob);
void KillActor (objtype *ob);
void DamageActor (objtype *ob, unsigned damage);
boolean CheckLine (objtype *ob);
boolean CheckSight (objtype *ob);
/*
=============================================================================
WL_AGENT DEFINITIONS
=============================================================================
*/
extern short anglefrac;
extern int facecount, facetimes;
extern word plux,pluy; // player coordinates scaled to unsigned
extern int32_t thrustspeed;
extern objtype *LastAttacker;
void Thrust (int angle, int32_t speed);
void SpawnPlayer (int tilex, int tiley, int dir);
void TakeDamage (int points,objtype *attacker);
void GivePoints (int32_t points);
void GetBonus (statobj_t *check);
void GiveWeapon (int weapon);
void GiveAmmo (int ammo);
void GiveKey (int key);
//
// player state info
//
void StatusDrawFace(unsigned picnum);
void DrawFace (void);
void DrawHealth (void);
void HealSelf (int points);
void DrawLevel (void);
void DrawLives (void);
void GiveExtraMan (void);
void DrawScore (void);
void DrawWeapon (void);
void DrawKeys (void);
void DrawAmmo (void);
/*
=============================================================================
WL_ACT1 DEFINITIONS
=============================================================================
*/
extern doorobj_t doorobjlist[MAXDOORS];
extern doorobj_t *lastdoorobj;
extern short doornum;
extern word doorposition[MAXDOORS];
extern byte areaconnect[NUMAREAS][NUMAREAS];
extern boolean areabyplayer[NUMAREAS];
extern word pwallstate;
extern word pwallpos; // amount a pushable wall has been moved (0-63)
extern word pwallx,pwally;
extern byte pwalldir,pwalltile;
void InitDoorList (void);
void InitStaticList (void);
void SpawnStatic (int tilex, int tiley, int type);
void SpawnDoor (int tilex, int tiley, boolean vertical, int lock);
void MoveDoors (void);
void MovePWalls (void);
void OpenDoor (int door);
void PlaceItemType (int itemtype, int tilex, int tiley);
void PushWall (int checkx, int checky, int dir);
void OperateDoor (int door);
void InitAreas (void);
/*
=============================================================================
WL_ACT2 DEFINITIONS
=============================================================================
*/
#define s_nakedbody s_static10
extern statetype s_grddie1;
extern statetype s_dogdie1;
extern statetype s_ofcdie1;
extern statetype s_mutdie1;
extern statetype s_ssdie1;
extern statetype s_bossdie1;
extern statetype s_schabbdie1;
extern statetype s_fakedie1;
extern statetype s_mechadie1;
extern statetype s_hitlerdie1;
extern statetype s_greteldie1;
extern statetype s_giftdie1;
extern statetype s_fatdie1;
extern statetype s_spectredie1;
extern statetype s_angeldie1;
extern statetype s_transdie0;
extern statetype s_uberdie0;
extern statetype s_willdie1;
extern statetype s_deathdie1;
extern statetype s_grdchase1;
extern statetype s_dogchase1;
extern statetype s_ofcchase1;
extern statetype s_sschase1;
extern statetype s_mutchase1;
extern statetype s_bosschase1;
extern statetype s_schabbchase1;
extern statetype s_fakechase1;
extern statetype s_mechachase1;
extern statetype s_gretelchase1;
extern statetype s_giftchase1;
extern statetype s_fatchase1;
extern statetype s_spectrechase1;
extern statetype s_angelchase1;
extern statetype s_transchase1;
extern statetype s_uberchase1;
extern statetype s_willchase1;
extern statetype s_deathchase1;
extern statetype s_blinkychase1;
extern statetype s_hitlerchase1;
extern statetype s_grdpain;
extern statetype s_grdpain1;
extern statetype s_ofcpain;
extern statetype s_ofcpain1;
extern statetype s_sspain;
extern statetype s_sspain1;
extern statetype s_mutpain;
extern statetype s_mutpain1;
extern statetype s_deathcam;
extern statetype s_schabbdeathcam2;
extern statetype s_hitlerdeathcam2;
extern statetype s_giftdeathcam2;
extern statetype s_fatdeathcam2;
void SpawnStand (enemy_t which, int tilex, int tiley, int dir);
void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir);
void KillActor (objtype *ob);
void SpawnDeadGuard (int tilex, int tiley);
void SpawnBoss (int tilex, int tiley);
void SpawnGretel (int tilex, int tiley);
void SpawnTrans (int tilex, int tiley);
void SpawnUber (int tilex, int tiley);
void SpawnWill (int tilex, int tiley);
void SpawnDeath (int tilex, int tiley);
void SpawnAngel (int tilex, int tiley);
void SpawnSpectre (int tilex, int tiley);
void SpawnGhosts (int which, int tilex, int tiley);
void SpawnSchabbs (int tilex, int tiley);
void SpawnGift (int tilex, int tiley);
void SpawnFat (int tilex, int tiley);
void SpawnFakeHitler (int tilex, int tiley);
void SpawnHitler (int tilex, int tiley);
void A_DeathScream (objtype *ob);
void SpawnBJVictory (void);
/*
=============================================================================
WL_TEXT DEFINITIONS
=============================================================================
*/
extern char helpfilename[],endfilename[];
extern void HelpScreens(void);
extern void EndText(void);
/*
=============================================================================
GP2X DEFINITIONS
=============================================================================
*/
#if defined(GP2X)
#if defined(GP2X_940)
void GP2X_MemoryInit(void);
void GP2X_Shutdown(void);
#endif
void GP2X_ButtonDown(int button);
void GP2X_ButtonUp(int button);
#endif
/*
=============================================================================
MISC DEFINITIONS
=============================================================================
*/
static fixed FixedMul(fixed a, fixed b)
{
return (fixed)(((int64_t)a * b + 0x8000) >> 16);
}
#ifdef PLAYDEMOLIKEORIGINAL
#define DEMOCHOOSE_ORIG_SDL(orig, sdl) ((demorecord || demoplayback) ? (orig) : (sdl))
#define DEMOCOND_ORIG (demorecord || demoplayback)
#define DEMOIF_SDL if(DEMOCOND_SDL)
#else
#define DEMOCHOOSE_ORIG_SDL(orig, sdl) (sdl)
#define DEMOCOND_ORIG false
#define DEMOIF_SDL
#endif
#define DEMOCOND_SDL (!DEMOCOND_ORIG)
#define GetTicks() ((SDL_GetTicks()*7)/100)
#define ISPOINTER(x) ((((uintptr_t)(x)) & ~0xffff) != 0)
#define CHECKMALLOCRESULT(x) if(!(x)) Quit("Out of memory at %s:%i", __FILE__, __LINE__)
#ifdef _WIN32
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define snprintf _snprintf
#else
static char* itoa(int value, char* string, int radix)
{
sprintf(string, "%d", value);
return string;
}
static char* ltoa(long value, char* string, int radix)
{
sprintf(string, "%ld", value);
return string;
}
#endif
#define lengthof(x) (sizeof(x) / sizeof(*(x)))
#define endof(x) ((x) + lengthof(x))
static word READWORD(byte **ptr)
{
word val = (*ptr)[0] | (*ptr)[1] << 8;
*ptr += 2;
return val;
}
static longword READLONGWORD(byte **ptr)
{
longword val = (*ptr)[0] | (*ptr)[1] << 8 | (*ptr)[2] << 16 | (*ptr)[3] << 24;
*ptr += 4;
return val;
}
/*
=============================================================================
FEATURE DEFINITIONS
=============================================================================
*/
#ifdef USE_FEATUREFLAGS
// The currently available feature flags
#define FF_STARSKY 0x0001
#define FF_PARALLAXSKY 0x0002
#define FF_CLOUDSKY 0x0004
#define FF_RAIN 0x0010
#define FF_SNOW 0x0020
// The ffData... variables contain the 16-bit values of the according corners of the current level.
// The corners are overwritten with adjacent tiles after initialization in SetupGameLevel
// to avoid interpretation as e.g. doors.
extern int ffDataTopLeft, ffDataTopRight, ffDataBottomLeft, ffDataBottomRight;
/*************************************************************
* Current usage of ffData... variables:
* ffDataTopLeft: lower 8-bit: ShadeDefID
* ffDataTopRight: FeatureFlags
* ffDataBottomLeft: CloudSkyDefID or ParallaxStartTexture
* ffDataBottomRight: unused
*************************************************************/
// The feature flags are stored as a wall in the upper right corner of each level
static word GetFeatureFlags()
{
return ffDataTopRight;
}
#endif
#ifdef USE_FLOORCEILINGTEX
void DrawFloorAndCeiling(byte *vbuf, unsigned vbufPitch, int min_wallheight);
#endif
#ifdef USE_PARALLAX
void DrawParallax(byte *vbuf, unsigned vbufPitch);
#endif
#ifdef USE_DIR3DSPR
void Scale3DShape(byte *vbuf, unsigned vbufPitch, statobj_t *ob);
#endif
#endif