/* $Filename:    WormWars/Source/same.h
 * $VER:         WormWars 6.0
 * $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 SAYLIMIT      ((ENDXPIXEL - STARTXPIXEL) / FONTX)
#define VERSION       "$VER: Worm Wars 6.0 (1.6.100)"

/* samples */

#define FXBORN_DOG        0
#define FXBORN_DRIP       1
#define FXBORN_GOAT       2
#define FXBORN_MISSILE    3
#define FXBORN_ORB        4
#define FXBORN_PENGUIN    5
#define FXBORN_PROTECTOR  6
#define FXDEATH_FRAGMENT  7 // thud
#define FXDEATH_GOAT      8
#define FXDEATH_ORB       9
#define FXDEATH_PENGUIN  10
#define FXDEATH_WORM     11
#define FXDO_BOMB        12 // tick
#define FXDO_ENCLOSE     13
#define FXDO_GOAT        14 // fire
#define FXDO_JUMP        15
#define FXDO_ORB         16 // split
#define FXGET_AMMO       17
#define FXGET_CYCLONE    18
#define FXGET_DRIP       19
#define FXGET_GROWER     20
#define FXGET_OBJECT     21
#define FXGET_NITRO      22
#define FXGET_POWERUP    23
#define FXGET_PULSE      24 // explode
#define FXGET_SKULL      25
#define FXFILENEW        26
#define FXFILEOPEN       27
#define FXFILESAVE       28
#define FXFILESAVEAS     29
#define FXEDITCUT        30
#define FXEDITCOPY       31
#define FXEDITPASTE      32
#define FXEDITDELETE     33
#define FXHELP           34
#define FXUSE_AMMO       35
#define FXUSE_ARMOUR     36
#define FXUSE_BOMB       37
#define FXUSE_TELEPORT   38
#define FXUSE_TONGUE     39
#define FX_C             40
#define FX_O             41
#define FX_M             42
#define FX_P             43
#define FX_L             44
#define FX_E             45
#define FX_T             46
#define FXPAIN           47
#define FXAPPLAUSE       51 // after each new hiscore
#define FXGAMEOVER       52 // if all worms are dead
#define FXCELEBRATE      53 // if game succeeded
#define FXCLICK          54 // rundown, keypresses
#define FXLAUNCH         55 // title screen
#define FXRIFF           56 // after each rundown
#define FXSIREN          57 // out of time
#define SAMPLES          FXSIREN
#define FXCENTRE         FXDEATH_PENGUIN
#define FXDO_CLOUD       FXDO_GOAT
#define FXFX             FXLAUNCH
#define FXRUNDOWN        FXCLICK
#define FXUSE_PROTECTOR  FXBORN_PROTECTOR

/* 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 FREEDOMLIMIT    100
#define STARTLIVES      100
#define LIVESLIMIT      200
#define MODELIMIT       100
#define MULTILIMIT        8 /* don't set >8! */
#define POWERLIMIT        6
#define SCORELIMIT 99999999

/* 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 FREEDOM                          8
        #define GROWER                           9
        #define HEALER                          10
        #define ICE                             11
        #define LIFE                            12
        #define LIGHTNING                       13
        #define MAGNET                          14
        #define MISSILE                         15
        #define MULTIPLIER                      16
        #define NITRO                           17
        #define POWER                           18
        #define PROTECTOR                       19
        #define PULSE                           20
        #define PUSHER                          21
        #define REMNANTS                        22
        #define SIDESHOT                        23
        #define SLAYER                          24
        #define SLOWER                          25
        #define SWITCHER                        26
        #define TONGUE                          27
        #define TREASURE                        28
        #define UMBRELLA                        29
	#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           STONE // should be something that is valid field contents

/* 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 -------------------------------------------------------------

You could put AGLOBAL in front of these if you wanted to.

engine.c */

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

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

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

/* system.c */

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

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

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

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

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 */
};
struct TeleportStruct
{	SBYTE		x, y;
	ABOOL		alive;
};
struct WormStruct
{   SBYTE       x, y, deltax, deltay, position, victor, cause,
                statx, staty, pos, multi, power, mode, last,
                levelreached;
    ABOOL       affixer, remnants, alive, moved, nitro, pusher,
                sideshot, flashed;
	UBYTE		speed, control;
    SWORD       armour, tongue, ammo, bias, ice, lives, freedom;
	SLONG		score, oldscore, hiscore;
	ULONG		causewait;
	TEXT		name[NAMELENGTH + 1];
	COLOUR		colour;
};

/* Must have blank line at EOF. */
