/* $Filename:    WormWars/Source/same.h
 * $VER:         WormWars 6.6
 * $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       50 /* assert (MAXLEVELS >= 1 && MAXLEVELS <= 99); */
#define NAMELENGTH      21 /* 0..20 are TEXT, 21 is NULL */
#define NOMODE           0
#define NUMKEYS         28
#define PATIENCE        20
#define SAYLIMIT      ((ENDXPIXEL - STARTXPIXEL) / FONTX)
#define VERSION       "$VER: Worm Wars 6.6 (21.4.2001)"
#define ARROWX        (FIELDX + 1)
#define LEVELSIZE     ((FIELDX + 1) * (FIELDY + 1))
#define HISCORESIZE   (6 + NAMELENGTH + 1 + DATELENGTH + 1 + TIMELENGTH + 1)

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

/* 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 CONVERTER			 7
    #define CUTTER               8
    #define CYCLONE              9
    #define FREEDOM             10
    #define GROWER              11
    #define HEALER              12
    #define ICE                 13
    #define LIFE                14
    #define LIGHTNING           15
    #define MAGNET              16
    #define MISSILE             17
    #define MULTIPLIER          18
    #define NITRO               19
    #define POWER               20
    #define PROTECTOR           21
    #define PULSE               22
    #define PUSHER              23
    #define REMNANTS            24
    #define SIDESHOT            25
    #define SLAYER              26
    #define SLOWER              27
    #define SWITCHER            28
    #define TONGUE              29
    #define TREASURE            30
    #define UMBRELLA            31
	#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       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 ALL                (HEAD + 45)
        #define FIRSTARROW         (HEAD + 46)
        #define LASTARROW          (HEAD + 49)
        #define DYNAMITE           (HEAD + 50)
        #define OCTOPUS            (HEAD + 51)
        #define ARRAYSIZE          OCTOPUS

        #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)
        #define BANGDYNAMITE     (ARRAYSIZE + 5)
        #define TEMPBANGDYNAMITE (ARRAYSIZE + 6)

/* 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 + 3)
#define CLOCKICON       (FIELDX + 4)

/* control values */

#define NONE            0 /* must be 0
 */
#define AMIGA           1
#define JOYSTICK        2
#define KEYBOARD        3
#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 drawhead(SBYTE player, SBYTE x, SBYTE y);
AGLOBAL void drawsquare(SBYTE x, SBYTE y);
AGLOBAL void icon(SBYTE player, UBYTE image);
AGLOBAL void saylevel(COLOUR colour);
AGLOBAL void train(SCANCODE scancode);
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, UBYTE image);
AGLOBAL void effect(SBYTE index);
AGLOBAL void fileopen(ABOOL revert);
AGLOBAL void filesaveas(ABOOL flag);
AGLOBAL void flash(ULONG where);
AGLOBAL void rundown(SBYTE player);
AGLOBAL void say(STRPTR sentence, COLOUR colour);
AGLOBAL void stat(SBYTE player, SBYTE line);
AGLOBAL void stopfx(void);
AGLOBAL void ReadAdapterJoystick(UBYTE unit);

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);

AGLOBAL void help(UBYTE type);
AGLOBAL void helpabout(void);
AGLOBAL void helploop(UBYTE type);
AGLOBAL void toggle(SBYTE key);
AGLOBAL void filedelete(void);

// fe.c
AGLOBAL void fieldedit(void);
AGLOBAL void setbrush(UBYTE newbrush);

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

/* Must have blank line at EOF. */
