/* $Filename:    WormWars/Source/same.h $
 * $VER:         WormWars 5.61 $
 * $Description: Header file for Worm Wars $
 *
 * © Copyright 2000 James R. Jacobs.

SAME ON EACH PLATFORM -------------------------------------------------- */

#define elif         else if
#define AGLOBAL      ;       /* global (project-scope) */
#define MODULE       static  /* external static (file-scope) */
#define PERSIST      static  /* internal static (function-scope) */
#define AUTO         auto    /* automatic (function-scope) */

/* miscellaneous */

#define CAUSEWAIT      100
#define DATELENGTH       8 /* DD/MM/YY */
#define TIMELENGTH       5 /* HH:MM */
#define DEFAULTLEVELS    5
#define ENDXPIXEL     ((STARTXPIXEL + SQUAREX * (FIELDX + 1)) - 1)
#define ENDYPIXEL     ((STARTYPIXEL + SQUAREY * (FIELDY + 1)) - 1)
#define FIELDX          52 /* in squares */
#define FIELDY          38 /* in squares */
#define HISCORES         4
#define LIFEMODULO    1000
#define MAXLEVELS       40 /* assert (MAXLEVELS >= 1 && MAXLEVELS <= 99); */
#define NAMELENGTH      21 /* 0..20 are TEXT, 21 is NULL */
#define NUMKEYS         28
#define PATIENCE        20
#define VERSION       "$VER: Worm Wars 5.61 (26.4.00) $"

/* samples */

#define FXGOATFIRE       0
#define FXPROTECTORBORN	 1
#define FXTIMEBOMBTICK	 2
#define FXGETGROWER      3
#define FXMISSILEACTIVE	 4
#define FXGETPOWERUP	 5
#define FXUSETELEPORT	 6
#define FXWORMDEATH      7
#define FXGETAMMO        8
#define FXEXPLODE        9
#define FXGOATBORN      10
#define FXORBBORN       11
#define FXSHOOT         12
#define FXTITLESCREEN	13
#define FXVICTORY		14
#define FXFILENEW		15
#define FXFILEOPEN		16
#define FXFILESAVE		17
#define FXBOMBBLAST		18
#define FXDEFEAT		19
#define FXENDOFLEVEL	20
#define FXCLICK         21
#define FXUSEARMOUR     22
#define FXGETOBJECT     23
#define FXTIMEALERT     24
#define FXORBSPLIT      25
#define FXORBDEATH      26
#define FXFILESAVEAS	27
#define FXFX			28
#define FXGETNITRO		29
#define FXJUMP			30
#define FX_C			31
#define FX_O			32
#define FX_M			33
#define FX_P			34
#define FX_L			35
#define FX_E			36
#define FX_T			37
#define FXHISCORE		38
#define FXTHUD			39
#define FXGOATDEATH     40
#define FXGETSKULL      41
#define FXUSETONGUE     42
#define FXDRIPBORN      43
#define FXAMIGAN        44
#define FXPAIN          45
#define FXPENGUINBORN	49
#define FXPENGUINDEATH	50
#define FXRUNDOWN       51
#define FXEDITCUT       52
#define FXEDITCOPY      53
#define FXEDITPASTE     54
#define FXLEVELDELETE   55
#define FXCYCLONE       56
#define FXDOGAWAKENS    57
#define FXENCLOSURE     58
#define SAMPLES         FXENCLOSURE

#define FXSTAMPED       FXBOMBBLAST
#define FXUSEPROTECTOR  FXPROTECTORBORN
#define FXDRIP          FXFX

/* key types */

#define MOVE				  0	/* not AMMO, TRAINER, ONEHUMAN */
#define TRAINER				  2	/* not MOVE, AMMO, ONEHUMAN */
#define ONEHUMAN			  3	/* not MOVE, AMMO, TRAINER */

/* speeds */

#define VERYFAST    	         1
#define FAST        	         2
#define NORMAL      	         4
#define SLOW        	         8
#define VERYSLOW                16      /* must be non-0 */

/* The constant NORMAL is used for several purposes:
	a)	as a speed (therefore must not be VERYFAST, FAST, SLOW
			or VERYSLOW);
	b)	as a blitmode (therefore must not be BLACK or WHITE); and
	c)	as a pointer (therefore must not be GOLD, SILVER, EMPTY,
			WOOD or STONE).

stats */

#define AMMOLIMIT	   100
#define BIASLIMIT	   100
#define STARTLIVES	   100
#define LIVESLIMIT	   200
#define MODELIMIT	   100
#define MULTILIMIT       8      /* don't set >8! */
#define POWERLIMIT	     6
#define SCORELIMIT	999999L

/* Field values...
These are objects. */
	#define AFFIXER				 0
	#define AMMO				 1
	#define ARMOUR				 2
	#define BIAS				 3
	#define BOMB				 4
	#define BONUS				 5
	#define CLOCK				 6
        #define CYCLONE                          7
	#define GROWER				 8
	#define HEALER				 9
	#define ICE				10
	#define LIFE				11
	#define LIGHTNING			12
        #define MAGNET                          13
        #define MISSILE                         14
        #define MULTIPLIER                      15
        #define NITRO                           16
        #define POWER                           17
        #define PROTECTOR                       18
        #define PULSE                           19
        #define REMNANTS                        20
        #define SIDESHOT                        21
        #define SLAYER                          22
        #define SLOWER                          23
        #define SWITCHER                        24
        #define TONGUE                          25
        #define TREASURE                        26
        #define UMBRELLA                        27
	#define LASTOBJECT			UMBRELLA
/* These are `empty'. */
        #define EMPTY                   (LASTOBJECT + 1)
        #define SILVER                  (LASTOBJECT + 2)
        #define GOLD                    (LASTOBJECT + 3)
        #define FIRSTEMPTY              EMPTY
        #define LASTEMPTY               GOLD
	#define LASTGOATFIRE		LASTEMPTY
/* Nothing special about the following... */
        #define TELEPORT                (GOLD + 1)
        #define FRAGMENT                (GOLD + 2)
        #define ORB                     (GOLD + 3)
	#define FIRSTPROTECTOR		(GOLD + 4)
	#define LASTPROTECTOR		(GOLD + 7)
/* Margins indicate `ranges' for:
   n: orb bouncing, normal mode.
   t: orb bouncing, tongue mode.
   a: orb bouncing, armour mode.
   g: goats. */
        #define  GREEN_C                        (GOLD +  8)      
        #define    RED_O                        (GOLD +  9)
        #define   BLUE_M                        (GOLD + 10)
        #define YELLOW_P                        (GOLD + 11)
        #define  GREEN_L                        (GOLD + 12)
        #define    RED_E                        (GOLD + 13)
        #define   BLUE_T                        (GOLD + 14)
        #define YELLOW_E                        (GOLD + 15)
        #define SKULL                           (GOLD + 16)             /* n t a g */
        #define SLIME                           (GOLD + 17)             /*     [ [ */
        #define STONE                           (GOLD + 18)             /* [ [ | | */
        #define GOAT                            (GOLD + 19)             /* ] | | | */
        #define WOOD                            (GOLD + 20)             /*   | ] | */
        #define FIRSTTAIL                       (GOLD + 21)             /*   |   | */
        #define LASTTAIL                        (GOLD + 24)             /*   ]   ] */
        #define FIRSTLETTER        GREEN_C
        #define FIRSTNONE          STONE
        #define FIRSTTONGUE        STONE
        #define FIRSTARMOUR        SLIME
        #define FIRSTGOAT          SLIME
        #define LASTLETTER         YELLOW_E
        #define LASTNONE           LASTTAIL
        #define LASTTONGUE         GOAT
        #define LASTARMOUR         GOAT
        #define LASTGOAT           LASTTAIL
        #define LETTERS            (LASTLETTER - FIRSTLETTER)

        #define ORBTONGUE          (LASTTAIL +  1)
        #define ORBARMOUR          (LASTTAIL +  2)
        #define FIRSTFIRE          (LASTTAIL +  3)
        #define LASTFIRE           (LASTTAIL +  6)
        #define FIRSTMISSILE       (LASTTAIL +  7)
        #define LASTMISSILE        (LASTTAIL + 10)
        #define START              (LASTTAIL + 11)
        #define MUSIC              (LASTTAIL + 12)
        #define FX                 (LASTTAIL + 13)
        #define ZERO               (LASTTAIL + 14)
        #define TIMEBOMB            ZERO
        #define ONE                (ZERO + 1)
        #define TWO                (ZERO + 2)
        #define       HEAD         (ZERO + 10)
        #define  GREENHEADUP        HEAD
        #define    REDHEADUP       (HEAD +  1)
        #define   BLUEHEADUP       (HEAD +  2)
        #define YELLOWHEADUP       (HEAD +  3)
        #define  FIRSTHEAD         GREENHEADUP
        #define   LASTHEAD         YELLOWHEADUP
        #define  GREENHEADDOWN     (HEAD +  4)
        #define    REDHEADDOWN     (HEAD +  5)
        #define   BLUEHEADDOWN     (HEAD +  6)
        #define YELLOWHEADDOWN     (HEAD +  7)
        #define  GREENHEADLEFT     (HEAD +  8)
        #define    REDHEADLEFT     (HEAD +  9)
        #define   BLUEHEADLEFT     (HEAD + 10)
        #define YELLOWHEADLEFT     (HEAD + 11)
        #define  GREENHEADRIGHT    (HEAD + 12)
        #define    REDHEADRIGHT    (HEAD + 13)
        #define   BLUEHEADRIGHT    (HEAD + 14)
        #define YELLOWHEADRIGHT    (HEAD + 15)
        #define  GREENMODEUP       (HEAD + 16)
        #define    REDMODEUP       (HEAD + 17)
        #define   BLUEMODEUP       (HEAD + 18)
        #define YELLOWMODEUP       (HEAD + 19)
        #define  GREENMODEDOWN     (HEAD + 20)
        #define    REDMODEDOWN     (HEAD + 21)
        #define   BLUEMODEDOWN     (HEAD + 22)
        #define YELLOWMODEDOWN     (HEAD + 23)
        #define  GREENMODELEFT     (HEAD + 24)
        #define    REDMODELEFT     (HEAD + 25)
        #define   BLUEMODELEFT     (HEAD + 26)
        #define YELLOWMODELEFT     (HEAD + 27)
        #define  GREENMODERIGHT    (HEAD + 28)
        #define    REDMODERIGHT    (HEAD + 29)
        #define   BLUEMODERIGHT    (HEAD + 30)
        #define YELLOWMODERIGHT    (HEAD + 31)
        #define METAL              (HEAD + 32)
        #define FIRSTDRIP          (HEAD + 33)
        #define DRIP               FIRSTDRIP
        #define LASTDRIP           (HEAD + 36)
        #define BLACKENED          (HEAD + 37)
        #define WHITENED           (HEAD + 38)
        #define PENGUIN            (HEAD + 39)
        #define WHIRLWIND          (HEAD + 40)
        #define DOG                (HEAD + 41) /* dog chasing */
        #define DOGAWAKENING       (HEAD + 42)
        #define DOGDORMANT         (HEAD + 43)
        #define CLOUD              (HEAD + 44)
        #define ARRAYSIZE          CLOUD

        #define ANYTHING           FX

/* These have no imagery. */
	#define TEMPTAIL			(ARRAYSIZE + 1)
	#define TEMPWOOD			TEMPTAIL
	#define TEMPSLIME			TEMPTAIL
        #define TEMPLIGHTNING                   TEMPTAIL
	#define TEMPSILVER			(ARRAYSIZE + 2)
	#define TEMPGOLD			(ARRAYSIZE + 3)
	#define NOSQUARE			(ARRAYSIZE + 4)

/* game status */

#define GAMEOVER        0
#define PLAYGAME        1
#define FIELDEDIT		2
#define TITLESCREEN		3

/* indicator locations */

#define CAUSEYDISTANCE	2	/* distance from centre for cause */
#define LETTERYDISTANCE	3	/* distance from centre for letters */
#define ICONY			(FIELDY / 2)
#define MUSICICON		(FIELDX + 2)
#define CLOCKICON		(FIELDX + 3)

/* control values */

#define NONE            0 /* must be 0 */
#define AMIGA           1
#define HUMAN           2
#define IBMPC           AMIGA

/* PROTOTYPES -------------------------------------------------------------

engine.c */

AGLOBAL void clearhiscores(void);
AGLOBAL void enginesetup(void);
AGLOBAL void gameloop(void);
AGLOBAL void levelappend(void);
AGLOBAL void leveldelete(void);
AGLOBAL void levelerase(void);
AGLOBAL void levelinsert(void);
AGLOBAL void matchteleports(void);
AGLOBAL void newfields(void);
AGLOBAL void newgame(void);
AGLOBAL void timeloop(void);

AGLOBAL void align(STRPTR string, SBYTE size, TEXT filler);
AGLOBAL void fillfield(SBYTE which);
AGLOBAL void saylevel(COLOUR colour);
AGLOBAL void setbrush(SBYTE newbrush);
AGLOBAL void train(SCANCODE scancode);
AGLOBAL void updatesquare(SBYTE x, SBYTE y);
AGLOBAL void wormqueue(SBYTE player, SBYTE deltax, SBYTE deltay);
AGLOBAL void wormscore(SBYTE player, LONG score);

AGLOBAL SBYTE loadfields(STRPTR pathname);
AGLOBAL SBYTE partner(SBYTE which);
AGLOBAL ABOOL savefields(STRPTR pathname);
AGLOBAL SBYTE valid(SBYTE x, SBYTE y);
AGLOBAL SBYTE xwrap(SBYTE x);
AGLOBAL SBYTE ywrap(SBYTE y);

/* system.c */

AGLOBAL void celebrate(void);
AGLOBAL void clearjoystick(void);
AGLOBAL void clearkybd(void);
AGLOBAL void clearscreen(void);
AGLOBAL void datestamp(void);
AGLOBAL void gameinput(void);
AGLOBAL void hiscores(void);
AGLOBAL void joy0(void);
AGLOBAL void resettime(void);
AGLOBAL void sendreadrequest(void);
AGLOBAL void systemsetup(void);
AGLOBAL void timing(void);
AGLOBAL void titlescreen(void);
AGLOBAL void turborender(void);
AGLOBAL void waitasec(void);

AGLOBAL void cleanexit(SLONG rc);
AGLOBAL void draw(SBYTE x, SBYTE y, SBYTE image);
AGLOBAL void effect(SBYTE index);
AGLOBAL void fileopen(ABOOL revert);
AGLOBAL void filesaveas(ABOOL flag);
AGLOBAL void rundown(SBYTE player);
AGLOBAL void say(STRPTR sentence, COLOUR colour);
AGLOBAL void stat(SBYTE player, SBYTE line);
AGLOBAL void stopfx(void);

AGLOBAL ABOOL anykey(ABOOL timeout);
AGLOBAL ABOOL verify(void);
AGLOBAL ABOOL ZOpen(STRPTR fieldname, ABOOL write);
AGLOBAL ABOOL ZRead(STRPTR IOBuffer, ULONG length);
AGLOBAL ABOOL ZWrite(STRPTR IOBuffer, ULONG length);
AGLOBAL ABOOL ZClose(void);

/* PUBLIC STRUCTURES ------------------------------------------------------ */

AGLOBAL struct HiScoreStruct
{	SBYTE	player,	level;
	SLONG	score;					/* the score itself */
	TEXT	name[NAMELENGTH + 2];	/* name of the player */
	ABOOL	fresh;					/* is the entry new? */
	TEXT	date[DATELENGTH + 1],	/* date of achievement */
			time[TIMELENGTH + 1];	/* time of achievement */
};
AGLOBAL struct TeleportStruct
{	SBYTE		x, y;
	ABOOL		alive;
};
AGLOBAL struct WormStruct
{       SBYTE           x, y, deltax, deltay, position, victor, cause,
                        statx, staty, pos, multi, power, mode, last, levelreached;
	ABOOL		affixer, remnants, alive, moved, nitro, sideshot;
	UBYTE		speed, control;
	SWORD		armour, tongue, ammo, bias, ice, lives;
	SLONG		score, oldscore, hiscore;
	ULONG		causewait;
	TEXT		name[NAMELENGTH + 1];
	COLOUR		colour;
};

/* Must have blank line at EOF. */
