//* main.h - header for main.c (Blitter Boy game) //* Sprite array (sprt[]) static assignments enum { SPRT_BLITBOY, SPRT_TVBEAM, SPRT_BABY1, SPRT_BABY2, SPRT_BABY3, SPRT_BABY4, SPRT_BABY5, SPRT_BABY6, SPRT_POOL_START }; #define TV_MODE (MODE_PAL) #define FRAMES_PER_SEC (50) #define UFO_HOVER_HEIGHT (16) //* .high value UFO's hover at //* Values for 'lifeCount' member of SCTRL struct #define PICKUP_FRAME_LIFE (480) //* 8 seconds (NTSC) #define COIN_FRAME_LIFE (360) //* 6 seconds (NTSC) //* Basic setup #define OT_LENGTH (8) //* Ordering table size (1-14): 8 = 256 planes #define MAXOBJ (400) //* Maximum 24-byte-primitives catered for in packet area //* For money bag sprite management #define MAX_COINS_IN_BAG (100) #define FIX_COINS_PER_SCAN (MAX_COINS_IN_BAG<<8) //* (max*ONE)/16 //* Macros relating to display area #define SCREEN_X (320) //* Display area size(horizontal) #define SCREEN_Y (240) //* Display area size(vertical) #define SCROLLX_MAX (-192) //* Maximum left X coord for background top-left sprite #define SCROLLY_MAX (-272) //* Maximum up Y coord for background top-left sprite //* Settings for 'attribute' member of GsSPRITE object #define A_BRIGHT_ON (0UL) #define A_BRIGHT_OFF (1UL<<6) #define A_4BIT_CLUT (0UL) #define A_8BIT_CLUT (1UL<<24) #define A_15BIT_NOCLUT (1UL<<25) #define A_ROTATE_ON (0UL) #define A_ROTATE_OFF (1UL<<27) #define A_TRATE_1 (0UL) #define A_TRATE_2 (1UL<<28) #define A_TRATE_3 (1UL<<29) #define A_TRATE_4 (3UL<<28) #define A_TRANS_ON (1UL<<30) #define A_TRANS_OFF (0UL) #define A_DISPLAY_ON (0UL) #define A_DISPLAY_OFF (1UL<<31) //* Preset (bit-significant) values for .frameLock/.currLock members of SCTRL //* Note: the MSB of these values is left-shifted out when setting .currLock //* with the functions below. #define LOCK_NOFRAMES (0xffffffffU) #define LOCK_ALTFRAMES (0xaaaaaaaaU) #define LOCK_2FRAMES (0x24924924U) #define LOCK_3FRAMES (0x88888888U) #define LOCK_4FRAMES (0x21084210U) #define LOCK_5FRAMES (0x20820820U) //* Energy/ammo bar constant settings #define ENERGY_BAR_X (10) #define ENERGY_BAR_Y (225) #define AMMO_BAR_X (170) #define AMMO_BAR_Y (225) #define BAR_MAX (140) //* Function for setting .currLock #define RunThisTime(lock) ((lock<<1)+1) //* Set 1st bit #define RunNextTime(lock) (lock<<1) //* Reset 1st bit //* Values for u member of GsSPRITE shadow sprites #define SHAD_32WIDE (0) #define SHAD_16WIDE (32) #define SHAD_8WIDE (48) //* ICSAL command constants #define DATA_END (0x7fffffff) //* End-of-data marker for 'set_data_loop_start' ICSAL command #define INFINITE_LOOP (0) //* Infinite loop counter setting for 'set_loop_start' ICSAL command #define RANGE_LOOP (0x7ffffffe) //* Causes loop counter to tally with bullRange //* Debug macro functions to print various types of expressions/variables #define dprinti(expr) (printf(#expr "=%d\n", (expr))) //* int #define dprintu(expr) (printf(#expr "=%u\n", (expr))) //* u_int #define dprintp(expr) (printf(#expr "=%p\n", (expr))) //* pointer //* Macros to un-clutter code #define SET_MOVE_DOWN sp->u=(scp->currFrame<<5); sp->v=0; scp->accelX=0; scp->accelY=scp->speed; scp->dir=DIR_DOWN; #define SET_MOVE_UP sp->u=128+(scp->currFrame<<5); sp->v=0; scp->accelX=0; scp->accelY=-scp->speed; scp->dir=DIR_UP; #define SET_MOVE_LEFT sp->u=128+(scp->currFrame<<5); sp->v=32; scp->accelX=-scp->speed; scp->accelY=0; scp->dir=DIR_LEFT; #define SET_MOVE_RIGHT sp->u=(scp->currFrame<<5); sp->v=32; scp->accelX=scp->speed; scp->accelY=0; scp->dir=DIR_RIGHT; #define SET_MOVE_UP_LEFT sp->u=128+(scp->currFrame<<5); sp->v=64; scp->accelX=scp->accelY=-scp->speed; scp->dir=DIR_UP_LEFT; #define SET_MOVE_UP_RIGHT sp->u=(scp->currFrame<<5); sp->v=64; scp->accelX=scp->speed; scp->accelY=-scp->speed; scp->dir=DIR_UP_RIGHT; #define SET_MOVE_DOWN_RIGHT sp->u=(scp->currFrame<<5); sp->v=96; scp->accelX=scp->accelY=scp->speed; scp->dir=DIR_DOWN_RIGHT; #define SET_MOVE_DOWN_LEFT sp->u=128+(scp->currFrame<<5); sp->v=96; scp->accelX=-scp->speed; scp->accelY=scp->speed; scp->dir=DIR_DOWN_LEFT; #define BABY_BB_DOWN scp->bbXOff=7; scp->bbYOff=18; scp->bbW=18; scp->bbH=14; scp->topOff=20; #define BABY_BB_DOWN_LEFT scp->bbXOff=6; scp->bbYOff=17; scp->bbW=20; scp->bbH=12; scp->topOff=20; #define BABY_BB_LEFT scp->bbXOff=5; scp->bbYOff=14; scp->bbW=22; scp->bbH=8; scp->topOff=20; #define BABY_BB_UP_LEFT scp->bbXOff=6; scp->bbYOff=17; scp->bbW=20; scp->bbH=12; scp->topOff=20; #define BABY_BB_UP scp->bbXOff=7; scp->bbYOff=19; scp->bbW=18; scp->bbH=14; scp->topOff=20; #define BABY_BB_UP_RIGHT scp->bbXOff=6; scp->bbYOff=17; scp->bbW=20; scp->bbH=12; scp->topOff=20; #define BABY_BB_RIGHT scp->bbXOff=5; scp->bbYOff=14; scp->bbW=22; scp->bbH=8; scp->topOff=20; #define BABY_BB_DOWN_RIGHT scp->bbXOff=6; scp->bbYOff=17; scp->bbW=20; scp->bbH=12; scp->topOff=20; #define BOY_MOVE_DOWN sp->u=(scp->currFrame<<5); sp->v=0; scp->accelX=0; scp->accelY=scp->speed; scp->dir=DIR_DOWN; #define BOY_MOVE_UP sp->u=128+(scp->currFrame<<5); sp->v=0; scp->accelX=0; scp->accelY=-scp->speed; scp->dir=DIR_UP; #define BOY_MOVE_LEFT sp->u=128+(scp->currFrame<<5); sp->v=36; scp->accelX=-scp->speed; scp->accelY=0; scp->dir=DIR_LEFT; #define BOY_MOVE_RIGHT sp->u=(scp->currFrame<<5); sp->v=36; scp->accelX=scp->speed; scp->accelY=0; scp->dir=DIR_RIGHT; #define BOY_MOVE_UP_LEFT sp->u=128+(scp->currFrame<<5); sp->v=72; scp->accelX=scp->accelY=-scp->speed; scp->dir=DIR_UP_LEFT; #define BOY_MOVE_UP_RIGHT sp->u=(scp->currFrame<<5); sp->v=72; scp->accelX=scp->speed; scp->accelY=-scp->speed; scp->dir=DIR_UP_RIGHT; #define BOY_MOVE_DOWN_RIGHT sp->u=(scp->currFrame<<5); sp->v=108; scp->accelX=scp->accelY=scp->speed; scp->dir=DIR_DOWN_RIGHT; #define BOY_MOVE_DOWN_LEFT sp->u=128+(scp->currFrame<<5); sp->v=108; scp->accelX=-scp->speed; scp->accelY=scp->speed; scp->dir=DIR_DOWN_LEFT; #define BOY_BB_DOWN scp->bbXOff=8; scp->bbYOff=8; scp->bbW=15; scp->bbH=7; scp->topOff=27; #define BOY_BB_DOWN_LEFT scp->bbXOff=7; scp->bbYOff=8; scp->bbW=14; scp->bbH=8; scp->topOff=27; #define BOY_BB_LEFT scp->bbXOff=7; scp->bbYOff=7; scp->bbW=15; scp->bbH=7; scp->topOff=27; #define BOY_BB_UP_LEFT scp->bbXOff=7; scp->bbYOff=9; scp->bbW=14; scp->bbH=8; scp->topOff=27; #define BOY_BB_UP scp->bbXOff=8; scp->bbYOff=8; scp->bbW=15; scp->bbH=7; scp->topOff=27; #define BOY_BB_UP_RIGHT scp->bbXOff=10; scp->bbYOff=9; scp->bbW=14; scp->bbH=8; scp->topOff=27; #define BOY_BB_RIGHT scp->bbXOff=9; scp->bbYOff=7; scp->bbW=15; scp->bbH=7; scp->topOff=27; #define BOY_BB_DOWN_RIGHT scp->bbXOff=10; scp->bbYOff=8; scp->bbW=14; scp->bbH=8; scp->topOff=27; //* Structure to manage control of HUD box sprites struct HUDS { RECT src; int destX; int destY; int leftX, tlX, tlY; int charsDone; int u, v; struct HUDS *freeLink; }; //* Structure to manage control of sprite objects struct SCTRL { int wx, wy; //* World coords of sprite (bottom-left corner) int wxMid, wyMid; //* World coords of sprite bounding-box centre int shadHW; //* Half width of associated shadow sprite int accelX, accelY; //* Controls movement of sprite in X and Y directions int speed; //* Sprite speed in pixels-per-update int repsPerFrame; //* Times a frame is repeated before being changed int frameCount; //* Count-down from repsPerFrame for frame change int currFrame; //* Sprites current frame number (0 to (total frames - 1)) int alive; //* Flags if sprite is alive and so in aliveSprites linked list struct SCTRL *aliveLinkF; //* aliveSprites doubly-linked list forward link struct SCTRL *aliveLinkB; //* aliveSprites doubly-linked list backward link int dir; //* Movement direction code (see enum below for values) //* Note: also used in update_ufo_fall as ufoSway[] index int moveCount; //* Count-down (from moveMax) to sprite direction change //* Note: also used to signal when UFO has reached destination when laying a mine int moveMax; //* Used to set moveCount u_int frameLock; //* Bit-significant: true, aligned/unshifted version used to set currLock u_int currLock; //* Current version of frameLock: &'d with frameKey to authorize sprite update int ID; //* General sprite type ID: used to id sprites after collision int subID; //* Specific sprite type ID/current action //* Note: holds controller index for HUD box sprites u_int lifeCount; //* Frame countdown until pickup expires (see ServiceICSALspritesF) int bbXOff; //* X offset of bounding-box from world X base coord int bbYOff; //* Y offset of bounding-box from world Y base coord int bbW; //* Sprite's collision bounding-box width int bbH; //* Sprite's collision bounding-box height int topOff; //* Y offset from base line to 3D top of sprite face NB: base line=1 (not 0) int imHit; //* Collision status flag: 1=has collided 0=not collided int high; //* No. of pixel units a sprite's base line is off the ground int shadBase; //* On-the-ground shadow size: 0=biggest 9=smallest int shadStat; //* Turns sprite's shadow/reflection on(1) and off(0) int isLight; //* Flags whether sprite is a light-source(1), or not(0) int unintICSAL; //* Flags whether ICSAL proc is uninterruptible by collision int *ICSALop; //* Pointer to current ICSAL op-code int *ICSALloopStart; //* Pointer to start op-code of an ICSAL loop int *ICSALdataLoopStart; //* Pointer to start op-code of an ICSAL data loop int *ICSALdataStart; //* Pointer to first item of data int *ICSALdata; //* Pointer to ICSAL data int ICSALloopCount; //* Holds ICSAL loop iteration count struct SCTRL *freeLink; //* Free sprite linked list ring pointer struct SCTRL *sectorLink; //* Collision detection linked list sector link GsSPRITE *spriteLink; //* Pointer to associated GsSPRITE GsSPRITE *shadLink; //* Pointer to associated shadow sprite struct SCTRL *target; //* Pointer to target sprite when chasing, following etc. }; //* Structure to hold a games sprite's preset settings struct SGROUP { struct SCTRL sctrl; GsSPRITE sprite; GsSPRITE shad; }; //* Structure to hold high score entries struct HISCORE { u_int score; //* Score value struct SCTRL *sScp; //* Pointer to 1st linked sprite holding score char name[5]; //* Name (4 characters + NULL) struct SCTRL *nScp; //* Pointer to 1st linked sprite holding name }; //* Object placement grid coord pair (row, column) struct GRID_PAIR { char r; char c; }; //* Movement direction values for .dir member of SCTRL structure enum { DIR_DOWN, DIR_DOWN_LEFT, DIR_LEFT, DIR_UP_LEFT, DIR_UP, DIR_UP_RIGHT, DIR_RIGHT, DIR_DOWN_RIGHT }; //* Index values for timData[] array enum { TIM_BG256, TIM_BLITBOY, TIM_EN_CCLUT, TIM_EN_PCLUT, TIM_EN_OCLUT, TIM_ENEMY1, TIM_SHADZ, TIM_BODYBANG, TIM_XPLODE1, TIM_BULLBANG, TIM_GUNSMOKE, TIM_BULLET, TIM_WNOISE, TIM_BABY, TIM_HEART, TIM_BABY_CLUT2, TIM_BABY_CLUT3, TIM_UFO_CLUT, TIM_SMOKE_CLUT3, TIM_SMOKE_CLUT4, TIM_COIN, TIM_COIN_CLUT2, TIM_COIN_CLUT3, TIM_BB_CHARS, TIM_HELMET, TIM_BB_SET, TIM_VC_LOGO1, TIM_VC_LOGO2, TIM_FRONT1, TIM_FRONT2, TIM_TVBEAM, TIM_DUMMY, TIM_MASKCLUT, TIM_SCORESET, TIM_POLYCART, TIM_EN_WCLUT, TIM_RBOW_FIRE, TIM_FRUIT_SPLAT, TIM_FRUIT_PEAR, TIM_FDROP_FIRE, TIM_FRUIT_APPLE, TIM_FRUIT_CHERRY, TIM_FRUIT_LEMON, TIM_FRUIT_MELON, TIM_FRUIT_ORANGE, TIM_FRUIT_GRAPES, TIM_FRUIT_SBERRY, TIM_FDROP_CLUT2, TIM_FDROP_CLUT3, TIM_FDROP_CLUT4, TIM_FDROP_CLUT5, TIM_FDROP_SPLASH, TIM_MINE, TIM_MILKBOT, TIM_BURGER, TIM_PIGGY, TIM_POWFLASH, TIM_MOONRING, TIM_MOONBALL, TIM_BEANS, TIM_BONUS, TIM_MULTY, TIM_MINECOMP, TIM_MONEYBAG, TIM_HOLOBALL, TIM_MULTYOSD, TIM_RANGEHUD, TIM_BATTERY, TIM_BG_CLUT1, TIM_BG_CLUT2, TIM_BG_CLUT3, TIM_BG_CLUT4, TIM_BG_CLUT5, TIM_MESS_HUD, TIM_MASK256, TIM_HAND, TIM_PSX_OPTS, TIM_BB_ROLL, TIM_FLAG, TIM_HALO, TIM_UFO, TIM_PAUSE, TIM_FR_BONUS, TIM_FR_MULTY }; //* Sprite type constants for .ID member of SCTRL structure enum { ID_SOFT_ICSAL, //* 0 (ignored by collision detection) ID_BLITTER_BOY, //* 1 ID_BULLET, //* 2 ID_ENEMY, //* 3 ID_TELEVATOR, //* 4 ID_BABY, //* 5 ID_PICKUP, //* 6 ID_MINE, //* 7 ID_MOONBALL, //* 8 ID_DECOY //* 9 }; //* Constants for .subID member of SCTRL structure enum { NORMAL, //* Not important! BOY_GAME_OVER=1, //* For ID_BLITTER_BOY BOY_LEVEL_UP, BULLET_NORMAL=1, //* For ID_BULLET BULLET_RAIN_DEATH, BULLET_FRUIT_DROP, TOTAL_ALIVE=0, //* Used for enemyAlive[][] ENEMY_RED_GHOST, //* For ID_ENEMY ENEMY_PINK_GHOST, ENEMY_CYAN_GHOST, ENEMY_ORANGE_GHOST, ENEMY_UFO, ENEMY_TYPE_MAX, //* Used to set enemyAlive[x][2] array size MINE_PRIMED=1, //* For ID_MINE MINE_EXPLODE, BABY_WANDER=1, //* For ID_BABY BABY_FOLLOW, BABY_CRY, BABY_GOTO_TV, PICKUP_GOLD_COIN=1, //* For ID_PICKUP PICKUP_SILVER_COIN, PICKUP_BRONZE_COIN, CART_RAIN_DEATH=0x100, //* 256 is PolyCart ID bit CART_FRUIT_DROP, PICKUP_FRUIT_CHERRY=0x200, //* 512 is fruit ID bit PICKUP_FRUIT_SBERRY, //* Note: in ascending bonus order PICKUP_FRUIT_ORANGE, PICKUP_FRUIT_LEMON, PICKUP_FRUIT_PEAR, PICKUP_FRUIT_APPLE, PICKUP_FRUIT_GRAPES, PICKUP_FRUIT_MELON, PICKUP_MILKBOT=0x400, //* 1024 is pickup ID bit PICKUP_BURGER, PICKUP_PIGGY, PICKUP_MOONRING, PICKUP_BEANS, PICKUP_HOLOBALL, PICKUP_BATTERY, PICKUP_FLAG //* For MODE: SURVIVE only! }; //* Values for tvStat enum { TV_OFF, TV_ON, TV_TURNING_OFF, TV_TURNING_ON }; //* Values for gameStat enum { GAME_END, GAME_ON, GAME_OVER, GAME_QUIT, GAME_LEVEL_UP, GAME_START, GAME_TITLE_SCREEN, GAME_MENU_SCREEN, GAME_LOGO_SCREEN, GAME_MOVE_SCREEN, GAME_CONTROL_SCREEN, GAME_HISCORE_SCREEN, GAME_ENTER_SCORE_SCREEN, GAME_DEBRIEF_SCREEN }; //* Values for gameType enum { MODE_MISSION, MODE_SURVIVE }; //* Values for FX_Splice_Screen() enum { FX_MELT_SPLICE, FX_NORMAL_SPLICE, FX_RIP_SPLICE, FX_RIP2_SPLICE, FX_DIAG_SPLICE }; //* Index values for preset[] array enum { PRESET_POOL_DEFAULT, PRESET_NORMAL_BULLET, PRESET_NORMAL_BULLET_BLUR1, PRESET_NORMAL_BULLET_BLUR2, PRESET_GUNSMOKE, PRESET_RBOW_BULLET, PRESET_RBOW_BULLET_BLUR1, PRESET_RBOW_BULLET_BLUR2, PRESET_FDROP_BULLET, PRESET_FDROP_BULLET_BLUR, PRESET_FDROP_BUILDUP, PRESET_FRUIT_APPLE, PRESET_FRUIT_ORANGE, PRESET_FRUIT_LEMON, PRESET_FRUIT_MELON, PRESET_FRUIT_CHERRY, PRESET_FRUIT_GRAPES, PRESET_FRUIT_PEAR, PRESET_FRUIT_SBERRY, PRESET_FRUIT_SPLASH, PRESET_EXPLODE_FIREBALL, PRESET_EXPLODE_BODY, PRESET_EXPLODE_COIN, PRESET_ENEMY_GHOST, PRESET_ENEMY_UFO, PRESET_SHOT_UFO, PRESET_POLYCART, PRESET_MINE, PRESET_PICKUP_MILKBOT, //* Keep this as 1st pickup preset for add_pickup in levman.c! PRESET_PICKUP_BURGER, PRESET_PICKUP_PIGGY, PRESET_PICKUP_MOONRING, PRESET_PICKUP_BEANS, PRESET_PICKUP_HOLOBALL, PRESET_PICKUP_BATTERY, PRESET_PICKUP_FLAG, PRESET_POWFLASH, PRESET_MOONBALL1, PRESET_MOONBALL2, PRESET_MOONBALL3, PRESET_MOONBALL4, PRESET_MOONBALL5, PRESET_MOONBALL6, PRESET_MOONBALL7, PRESET_MOONBALL8, PRESET_BONUS_SCORE, PRESET_BONUS_MULTY, PRESET_MINE_COMP1, PRESET_MINE_COMP2, PRESET_MINE_COMP3, PRESET_MINE_COMP4, PRESET_MINE_COMP5, PRESET_MINE_COMP6, PRESET_MINE_COMP7, PRESET_MINE_COMP8, PRESET_MINE_COMP9, PRESET_MINE_COMP10, PRESET_MINE_COMP11, PRESET_MINE_COMP12, PRESET_MINE_COMP13, PRESET_MINE_COMP14, PRESET_MINE_COMP15, PRESET_MINE_COMP16, PRESET_RANGE_HUD, PRESET_DECOY_BOYR, PRESET_DECOY_BOYG, PRESET_DECOY_BOYB, PRESET_FRUIT_BONUS, PRESET_FRUIT_MULTY, NUM_PRESETS //* Used to set array size }; //* Sound effects program number constants enum { SFX_GUN_NORMAL, SFX_ENEMY_EXPLODE1, SFX_BUZZER, SFX_WNOISE, SFX_TELEVATOR, SFX_COMPUTER, SFX_DADA, SFX_GUN_RAINBOW, SFX_BONUS, SFX_SAY_OW, SFX_LASER, SFX_EVAP, SFX_FALL, SFX_SPLAT, SFX_PING, SFX_BABY_HOWL, SFX_PIGGY_BUST, SFX_GUN_FDROP, SFX_SPIN_SCREEN, SFX_MELT_SCREEN, SFX_LEV_SCREEN, SFX_PEEL_SCREEN, SFX_CART, SFX_WOOHOO, SFX_BGM, SFX_GHOST }; //* Access declarations for global objects defined in main.c extern GsSPRITE *sprt; //* Points to main game sprites extern struct SCTRL *sCtrl; //* Associated sprite control structures extern GsSPRITE *shads; extern u_long pStat; //* Holds latest pad status read by PadActions() extern u_long lastFireFrame; //* Frame count when last bullet was fired extern int bullRange; extern int bullSpeed; extern int bullLoop; extern int tvStat; extern int followDist; extern struct SCTRL *lastInLine; extern int fireDelay; //* Frame delay (vSyncs) between each fired bullet extern struct SCTRL *aliveSprites; //* Points to 1st alive sprite SCTRL in linked list extern struct SCTRL *freeSprites; //* Points to 1st free sprite in main pool extern GsIMAGE timData[]; //* Holds info on all loaded TIM's extern u_int tvLightLock; extern u_int tvLightCLock; extern int beamSpeed; extern int babiesSaved; extern int currLevel; //* Current game level number extern int enemyAlive[][2]; extern int mineMin; extern int mineCount; extern int mineLaying; extern int emergeDelay; extern int killCount; extern int killsPerPickup; extern int ok2beam; extern int tvVoice; extern RECT plasRect; //* Access for screens.c extern int plasmaX, plasmaY, plasmaBase; extern void (*primSort[]) (GsSPRITE *, GsOT *, u_short); extern int gameStat; //* Game status control flag extern int gameType; extern struct SCTRL *dummyScp; extern struct SCTRL *messHudScp; extern int energyAdd; extern int energyHit; extern int energyLeft; extern int ammoAdd; extern int ammoUse; extern int ammoLeft; extern GsGLINE *ammoBarp; extern int flashCnt; extern int currScore; extern int BBtrueSpeed; extern int strafe; extern int bonusMulty; extern struct SCTRL *bonusMultyScp; extern u_int bonusVal[][6]; extern struct HUDS HUDbox[]; extern GsSPRITE *bg1, *bg2, *bg3, *bg4; extern struct SGROUP preset[]; extern void (*FireFunc) (void); extern struct SCTRL *moneybagScp; extern int coinsInBag; extern struct SCTRL *moonScp[8]; extern struct SCTRL *chaseTarget; extern int stopRange; extern struct SCTRL *rangeScp; extern struct SCTRL *decoyScp; extern int babyStrong; extern int polyStat; extern struct HISCORE hiScore[]; extern u_int surviveFrames; extern int flagGone; extern int flagCnt; extern int lastFruit; //* Pointers to LIBPS globals extern short *psdidx; //* Double buffer index extern u_long *psdcnt; //* Frame switch count extern short *psdofsx; extern short *psdofsy; //* Prototypes for global functions in main.c void AliveLinkIn(struct SCTRL *scp); void AliveLinkOut(struct SCTRL *scp); int SpriteIsVis(struct SCTRL *scp); int ShadowIsVis(struct SCTRL *scp); struct SCTRL *GetSprite(int numSprites); void PutSprite(struct SCTRL *scp); int GetHUDidx(void); void PutHUDidx(int idx); struct SCTRL *CentreText(char *text, int topLine, int spacing); struct SCTRL *LjustText(char *text, int startX, int y, int spacing); void MakeAmmoBarText(char *charp); void PutGrid(int wx, int wy); struct GRID_PAIR *GetRandGrid(void); void GetAbsGrid(int r, int c); void ServiceICSALsprites(void); void EjectPolyCart(void); void PlaceNextFlag(void);