/* $Filename:    WormWars/Source/same.h
 * $VER:         WormWars 7.0
 * $Description: Header file for Worm Wars
 *
 * © Copyright 2002 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          44 /* in squares */
#define FIELDY          39 /* in squares */
#define CENTREX       (FIELDX / 2)
#define CENTREY       (FIELDY / 2)
#define OLDFIELDX       52
#define OLDFIELDY       38
#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       100
#define SAYLIMIT      ((ENDXPIXEL - STARTXPIXEL) / FONTX)
#define VERSION       "$VER: Worm Wars 7.0 (8.4.2002)" // always d.m.y format
#define ARROWX        (FIELDX + 1)
#define LEVELSIZE     ((FIELDX + 1) * (FIELDY + 1))
#define OLDLEVELSIZE  ((OLDFIELDX + 1) * (OLDFIELDY + 1))
#define HISCORESIZE   (6 + NAMELENGTH + 1 + DATELENGTH + 1 + TIMELENGTH + 1)

#define BONUS_TAIL     1
#define BONUS_TIME    10
#define BONUS_NUMBER  50
#define BONUS_LEVEL  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_WORM      8
#define FXDO_BOMB         9 // tick
#define FXDO_ENCLOSE     10
#define FXDO_GOAT        11 // fire
#define FXDO_JUMP        12
#define FXDO_ORB         13 // split
#define FXGET_AMMO       14
#define FXGET_CYCLONE    15
#define FXGET_DRIP       16
#define FXGET_GROWER     17
#define FXGET_OBJECT     18
#define FXGET_NITRO      19
#define FXGET_POWERUP    20
#define FXGET_PULSE      21 // explode
#define FXGET_SKULL      22
#define FXHELP           23
#define FXUSE_AMMO       24
#define FXUSE_ARMOUR     25
#define FXUSE_BOMB       26
#define FXUSE_TELEPORT   27
#define FXBORN_BIRD      28
#define FXPAIN           29
#define FXAPPLAUSE       33 // after each new hiscore
#define FXGAMEOVER       34 // if all worms are dead
#define FXCELEBRATE      35 // if game succeeded
#define FXCLICK          36 // rundown, keypresses
#define FXLAUNCH         37 // title screen
#define FXRIFF           38 // after each rundown
#define FXSIREN          39 // out of time
#define SAMPLES          FXSIREN
#define FXCENTRE         FXUSE_TELEPORT
#define FXDO_CLOUD       FXDO_GOAT
#define FXFX             FXLAUNCH
#define FXRUNDOWN        FXCLICK
#define FXUSE_PROTECTOR  FXBORN_PROTECTOR

#define PAIN_BIRD         3
#define PAIN_BOMB         3
#define PAIN_CLOUD        3
#define PAIN_DOG          5
#define PAIN_DRIP         5
#define PAIN_FISH         2
#define PAIN_FRAGMENT     3
#define PAIN_GOAT         2
#define PAIN_GLOW         4
#define PAIN_HEAD         5
#define PAIN_LIGHTNING    3
#define PAIN_METAL        3
#define PAIN_MISSILE      5
#define PAIN_OCTOPUS      5
#define PAIN_ORB          5
#define PAIN_OTTER        5
#define PAIN_PENGUIN      3
#define PAIN_PROTECTOR    5
#define PAIN_SLAYER       2
#define PAIN_SLIME        2
#define PAIN_STONE        2
#define PAIN_TELEPORT     5
#define PAIN_WHIRLWIND    5
#define PAIN_WORMFIRE     5
#define PAIN_WOOD         2
#define PAIN_ENEMYTAIL    3
#define PAIN_FRIENDLYTAIL 2

#define SCORE_BIRD          40
#define SCORE_CLOUD         20
#define SCORE_FRAGMENT      10
#define SCORE_DOG           20
#define SCORE_DRIP         100
#define SCORE_FISH          20
#define SCORE_GOAT          50
#define SCORE_MISSILE       50
#define SCORE_OCTOPUS       60
#define SCORE_ORB           40
#define SCORE_OTTER        150
#define SCORE_PENGUIN       20
#define SCORE_TIMEBOMB     100
#define SCORE_WHIRLWIND    100

/* 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 anything that can be
        a brush).

stats */

#define AMMOLIMIT       100
#define ARMOURLIMIT     100
#define BIASLIMIT       100
#define GLOWLIMIT       100
#define STARTLIVES      100
#define LIVESLIMIT      200
#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 ENCLOSER            10
    #define GLOW                11
    #define GROWER              12
    #define HEALER              13
    #define ICE                 14
    #define LIFE                15
    #define LIGHTNING           16
    #define MAGNET              17
    #define MISSILE             18
    #define MULTIPLIER          19
    #define NITRO               20
    #define POWER               21
    #define PROTECTOR           22
    #define PULSE               23
    #define PUSHER              24
    #define REMNANTS            25
    #define SIDESHOT            26
    #define SLAYER              27
    #define SLOWER              28
    #define SWITCHER            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)
        #define NUM_1                           (GOLD +  8)      
        #define NUM_9                           (GOLD + 16)             /* n 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        NUM_1
        #define LASTLETTER         NUM_9
        #define LASTNONE           LASTTAIL
        #define LETTERS            (LASTLETTER - FIRSTLETTER)
        #define FISH               (LASTTAIL +  1)
        #define OTTER              (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  GREENGLOWUP       (HEAD + 16)
        #define    REDGLOWUP       (HEAD + 17)
        #define   BLUEGLOWUP       (HEAD + 18)
        #define YELLOWGLOWUP       (HEAD + 19)
        #define  GREENGLOWDOWN     (HEAD + 20)
        #define    REDGLOWDOWN     (HEAD + 21)
        #define   BLUEGLOWDOWN     (HEAD + 22)
        #define YELLOWGLOWDOWN     (HEAD + 23)
        #define  GREENGLOWLEFT     (HEAD + 24)
        #define    REDGLOWLEFT     (HEAD + 25)
        #define   BLUEGLOWLEFT     (HEAD + 26)
        #define YELLOWGLOWLEFT     (HEAD + 27)
        #define  GREENGLOWRIGHT    (HEAD + 28)
        #define    REDGLOWRIGHT    (HEAD + 29)
        #define   BLUEGLOWRIGHT    (HEAD + 30)
        #define YELLOWGLOWRIGHT    (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 FIRSTMISSILEFRAME  (HEAD + 52)
        #define BIRD               (FIRSTMISSILEFRAME + 20)
        #define FIRSTGLOW          (BIRD +  5)
        #define LASTGLOW           (BIRD +  8)
        #define FIRSTGRAVE         (BIRD +  9)
        #define LASTGRAVE          (BIRD + 12)
        #define FIRSTPAIN          (BIRD + 13)
        #define LASTPAIN           (BIRD + 16)
    #define GREENHEAD_NW           (LASTPAIN +  1)
    #define GREENHEAD_NE           (LASTPAIN +  2)
    #define GREENHEAD_SW           (LASTPAIN +  3)
    #define GREENHEAD_SE           (LASTPAIN +  4)
    #define GREENGLOW_NW           (LASTPAIN +  5)
    #define GREENGLOW_NE           (LASTPAIN +  6)
    #define GREENGLOW_SW           (LASTPAIN +  7)
    #define GREENGLOW_SE           (LASTPAIN +  8)
    #define REDHEAD_NW             (LASTPAIN +  9)
    #define REDHEAD_NE             (LASTPAIN + 10)
    #define REDHEAD_SW             (LASTPAIN + 11)
    #define REDHEAD_SE             (LASTPAIN + 12)
    #define REDGLOW_NW             (LASTPAIN + 13)
    #define REDGLOW_NE             (LASTPAIN + 14)
    #define REDGLOW_SW             (LASTPAIN + 15)
    #define REDGLOW_SE             (LASTPAIN + 16)
    #define BLUEHEAD_NW            (LASTPAIN + 17)
    #define BLUEHEAD_NE            (LASTPAIN + 18)
    #define BLUEHEAD_SW            (LASTPAIN + 19)
    #define BLUEHEAD_SE            (LASTPAIN + 20)
    #define BLUEGLOW_NW            (LASTPAIN + 21)
    #define BLUEGLOW_NE            (LASTPAIN + 22)
    #define BLUEGLOW_SW            (LASTPAIN + 23)
    #define BLUEGLOW_SE            (LASTPAIN + 24)
    #define YELLOWHEAD_NW          (LASTPAIN + 25)
    #define YELLOWHEAD_NE          (LASTPAIN + 26)
    #define YELLOWHEAD_SW          (LASTPAIN + 27)
    #define YELLOWHEAD_SE          (LASTPAIN + 28)
    #define YELLOWGLOW_NW          (LASTPAIN + 29)
    #define YELLOWGLOW_NE          (LASTPAIN + 30)
    #define YELLOWGLOW_SW          (LASTPAIN + 31)
    #define YELLOWGLOW_SE          (LASTPAIN + 32)
        #define ARRAYSIZE          YELLOWGLOW_SE
        #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)
        #define TEMPDYNAMITE     (ARRAYSIZE + 7)

// tails
    #define GN_E_NE  0
    #define GN_NE_E  GN_E_NE
    #define GN_E_S   1
    #define GN_S_E   GN_E_S
    #define GN_E_SE  2
    #define GN_SE_E  GN_E_SE
    #define GN_NE_SE 3
    #define GN_SE_NE GN_NE_SE
    #define GN_NE_SW 4
    #define GN_SW_NE GN_NE_SW
    #define GN_NW_E  5
    #define GN_E_NW  GN_NW_E
    #define GN_NW_NE 6
    #define GN_NE_NW GN_NW_NE
    #define GN_NW_SE 7
    #define GN_SE_NW GN_NW_SE
    #define GN_NW_SW 8
    #define GN_SW_NW GN_NW_SW
    #define GN_N_E   9
    #define GN_E_N   GN_N_E
    #define GN_N_NE  10
    #define GN_NE_N  GN_N_NE
    #define GN_N_NW  11
    #define GN_NW_N  GN_N_NW
    #define GN_N_S   12
    #define GN_S_N   GN_N_S
    #define GN_N_SE  13
    #define GN_SE_N  GN_N_SE
    #define GN_N_SW  14
    #define GN_SW_N  GN_N_SW
    #define GN_N_W   15
    #define GN_W_N   GN_N_W
    #define GN_SW_E  16
    #define GN_E_SW  GN_SW_E
    #define GN_SW_SE 17
    #define GN_SE_SW GN_SW_SE
    #define GN_S_NE  18
    #define GN_NE_S  GN_S_NE
    #define GN_S_NW  19
    #define GN_NW_S  GN_S_NW
    #define GN_S_SE  20
    #define GN_SE_S  GN_S_SE
    #define GN_S_SW  21
    #define GN_SW_S  GN_S_SW
    #define GN_W_E   22
    #define GN_E_W   GN_W_E
    #define GN_W_NE  23
    #define GN_NE_W  GN_W_NE
    #define GN_NW_W  24
    #define GN_W_NW  GN_NW_W
    #define GN_W_S   25
    #define GN_S_W   GN_W_S
    #define GN_W_SE  26
    #define GN_SE_W  GN_W_SE 
    #define GN_W_SW  27
    #define GN_SW_W  GN_W_SW
    #define GG_NE_E  28
    #define GG_E_NE  GG_NE_E
    #define GG_NE_S  29
    #define GG_S_NE  GG_NE_S
    #define GG_NE_W  30
    #define GG_W_NE  GG_NE_W
    #define GG_NW_E  31
    #define GG_E_NW  GG_NW_E
    #define GG_NW_NE 32
    #define GG_NE_NW GG_NW_NE
    #define GG_NW_S  33
    #define GG_S_NW  GG_NW_S
    #define GG_NW_SE 34
    #define GG_SE_NW GG_NW_SE
    #define GG_NW_SW 35
    #define GG_SW_NW GG_NW_SW
    #define GG_NW_W  36
    #define GG_W_NW  GG_NW_W
    #define GG_N_E   37
    #define GG_E_N   GG_N_E
    #define GG_N_NE  38
    #define GG_NE_N  GG_N_NE
    #define GG_N_NW  39
    #define GG_NW_N  GG_N_NW
    #define GG_N_S   40
    #define GG_S_N   GG_N_S
    #define GG_SE_E  41
    #define GG_E_SE  GG_SE_E
    #define GG_SE_N  42
    #define GG_N_SE  GG_SE_N
    #define GG_SE_W  43
    #define GG_W_SE  GG_SE_W
    #define GG_SW_E  44
    #define GG_E_SW  GG_SW_E
    #define GG_SW_N  45
    #define GG_N_SW  GG_SW_N
    #define GG_SW_NE 46
    #define GG_NE_SW GG_SW_NE
    #define GG_SW_SE 47
    #define GG_SE_SW GG_SW_SE
    #define GG_SW_W  48
    #define GG_W_SW  GG_SW_W
    #define GG_S_E   49
    #define GG_E_S   GG_S_E
    #define GG_S_SE  50
    #define GG_SE_S  GG_S_SE
    #define GG_S_SW  51
    #define GG_SW_S  GG_S_SW
    #define GG_W_E   52
    #define GG_E_W   GG_W_E
    #define GG_W_N   53
    #define GG_N_W   GG_W_N
    #define GG_W_S   54
    #define GG_S_W   GG_W_S
    #define GG_NE_SE 55
    #define GG_SE_NE GG_NE_SE
    #define RN_E_NE  56
    #define RN_NE_E  RN_E_NE
    #define RN_E_S   57
    #define RN_S_E   RN_E_S
    #define RN_E_SE  58
    #define RN_SE_E  RN_E_SE
    #define RN_NE_SE 59
    #define RN_SE_NE RN_NE_SE
    #define RN_NW_E  60
    #define RN_E_NW  RN_NW_E
    #define RN_NW_NE 61
    #define RN_NE_NW RN_NW_NE
    #define RN_NW_S  62
    #define RN_S_NW  RN_NW_S
    #define RN_NW_SE 63
    #define RN_SE_NW RN_NW_SE
    #define RN_NW_SW 64
    #define RN_SW_NW RN_NW_SW
    #define RN_N_E   65
    #define RN_E_N   RN_N_E
    #define RN_N_NE  66
    #define RN_NE_N  RN_N_NE
    #define RN_N_NW  67
    #define RN_NW_N  RN_N_NW
    #define RN_N_S   68
    #define RN_S_N   RN_N_S
    #define RN_N_SE  69
    #define RN_SE_N  RN_N_SE
    #define RN_N_W   70
    #define RN_W_N   RN_N_W
    #define RN_S_SE  71
    #define RN_SE_S  RN_S_SE
    #define RN_SW_E  72
    #define RN_E_SW  RN_SW_E
    #define RN_N_SW  73
    #define RN_SW_N  RN_N_SW
    #define RN_S_SW  74
    #define RN_SW_S  RN_S_SW
    #define RN_SW_SE 75
    #define RN_SE_SW RN_SW_SE
    #define RN_S_NE  76
    #define RN_NE_S  RN_S_NE
    #define RN_W_E   77
    #define RN_E_W   RN_W_E
    #define RN_W_NE  78
    #define RN_NE_W  RN_W_NE
    #define RN_NW_W  79
    #define RN_W_NW  RN_NW_W
    #define RN_W_S   80
    #define RN_S_W   RN_W_S
    #define RN_W_SE  81
    #define RN_SE_W  RN_W_SE 
    #define RN_W_SW  82
    #define RN_SW_W  RN_W_SW
    #define RN_NE_SW 83
    #define RN_SW_NE RN_NE_SW
    #define RG_E_S   84
    #define RG_E_SW  85
    #define RG_NE_E  86
    #define RG_NE_N  87
    #define RG_NE_S  88
    #define RG_NE_SE 89
    #define RG_NE_SW 90
    #define RG_NE_W  91
    #define RG_NW_E  92
    #define RG_NW_N  93
    #define RG_NW_NE 94
    #define RG_NW_S  95
    #define RG_NW_SE 96
    #define RG_NW_SW 97
    #define RG_NW_W  98
    #define RG_N_E   99
    #define RG_N_S   100
    #define RG_N_SE  101
    #define RG_N_SW  102
    #define RG_N_W   103
    #define RG_SE_E  104
    #define RG_SE_S  105
    #define RG_SW_S  106
    #define RG_SW_SE 107
    #define RG_SW_W  108
    #define RG_W_E   109
    #define RG_W_S   110
    #define RG_W_SE  111
    #define RG_S_E   84
    #define RG_SW_E  85
    #define RG_E_NE  86
    #define RG_N_NE  87
    #define RG_S_NE  88
    #define RG_SE_NE 89
    #define RG_SW_NE 90
    #define RG_W_NE  91
    #define RG_E_NW  92
    #define RG_N_NW  93
    #define RG_NE_NW 94
    #define RG_S_NW  95
    #define RG_SE_NW 96
    #define RG_SW_NW 97
    #define RG_W_NW  98
    #define RG_E_N   99
    #define RG_S_N   100
    #define RG_SE_N  101
    #define RG_SW_N  102
    #define RG_W_N   103
    #define RG_E_SE  104
    #define RG_S_SE  105
    #define RG_S_SW  106
    #define RG_SE_SW 107
    #define RG_W_SW  108
    #define RG_E_W   109
    #define RG_S_W   110
    #define RG_SE_W  111
    #define BN_E_NE  112
    #define BN_E_S   113
    #define BN_E_SE  114
    #define BN_N_E   115
    #define BN_N_NE  116
    #define BN_N_NW  117
    #define BN_N_S   118
    #define BN_N_SE  119
    #define BN_N_SW  120
    #define BN_N_W   121
    #define BN_NE_S  122
    #define BN_NE_SE 123
    #define BN_NE_SW 124
    #define BN_NW_E  125
    #define BN_NW_NE 126
    #define BN_NW_S  127
    #define BN_NW_SE 128
    #define BN_NW_SW 129
    #define BN_S_SE  130
    #define BN_S_SW  131
    #define BN_SW_E  132
    #define BN_SW_NE 133
    #define BN_SW_SE 134
    #define BN_W_E   135
    #define BN_W_NE  136
    #define BN_W_NW  137
    #define BN_W_S   138
    #define BN_W_SE  139
    #define BN_W_SW  140
    #define BG_E_S   141
    #define BG_E_SE  142
    #define BG_N_E   143
    #define BG_N_NE  144
    #define BG_N_NW  145
    #define BG_N_S   146
    #define BG_N_SE  147
    #define BG_N_SW  148
    #define BG_N_W   149
    #define BG_NE_E  150
    #define BG_NE_S  151
    #define BG_NE_SE 152
    #define BG_NE_SW 153
    #define BG_NE_W  154
    #define BG_NW_E  155
    #define BG_NW_NE 156
    #define BG_NW_S  157
    #define BG_NW_SE 158
    #define BG_NW_SW 159
    #define BG_NW_W  160
    #define BG_S_SE  161
    #define BG_S_SW  162
    #define BG_SW_E  163
    #define BG_SW_SE 164
    #define BG_W_E   165
    #define BG_W_S   166
    #define BG_W_SE  167
    #define BG_W_SW  168
    #define YN_E_SE  169
    #define YN_E_SW  170
    #define YN_N_E   171
    #define YN_N_NE  172
    #define YN_N_NW  173
    #define YN_N_S   174
    #define YN_N_SE  175
    #define YN_N_SW  176
    #define YN_N_W   177
    #define YN_NE_E  178
    #define YN_NE_S  179
    #define YN_NE_SE 180
    #define YN_NE_SW 181
    #define YN_NW_E  182
    #define YN_NW_NE 183
    #define YN_NW_S  184
    #define YN_NW_SE 185
    #define YN_NW_SW 186
    #define YN_NW_W  187
    #define YN_S_E   188
    #define YN_S_SE  189
    #define YN_S_SW  190
    #define YN_SW_SE 191
    #define YN_W_E   192
    #define YN_W_NE  193
    #define YN_W_S   194
    #define YN_W_SE  195
    #define YN_W_SW  196
    #define YG_E_N   197
    #define YG_E_NE  198
    #define YG_E_NW  199
    #define YG_E_S   200
    #define YG_E_SE  201
    #define YG_E_SW  202
    #define YG_N_NE  203
    #define YG_N_NW  204
    #define YG_N_S   205
    #define YG_N_SE  206
    #define YG_N_SW  207
    #define YG_N_W   208
    #define YG_NE_SE 209
    #define YG_NE_SW 210
    #define YG_NW_NE 211
    #define YG_NW_SE 212
    #define YG_NW_SW 213
    #define YG_S_NE  214
    #define YG_S_NW  215
    #define YG_S_SE  216
    #define YG_S_SW  217
    #define YG_SW_SE 218
    #define YG_W_E   219
    #define YG_W_NE  220
    #define YG_W_NW  221
    #define YG_W_S   222 
    #define YG_W_SE  223
    #define YG_W_SW  224
    #define WHATEVER 225
    #define TAILARRAYSIZE WHATEVER

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

/* control values */

#define NONE            0 /* must be 0 */
#define AMIGA           1
#define JOYSTICK        2
#define GAMEPAD         3
#define KEYBOARD        4
#define IBMPC           AMIGA

#define MISSILEFRAMES 5

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

engine.c */

AGLOBAL void clearhiscores(void);
AGLOBAL void enginesetup(void);
AGLOBAL void gameloop(void);
AGLOBAL void matchteleports(void);
AGLOBAL void newfields(void);
AGLOBAL void newgame(void);
AGLOBAL void timeloop(void);
AGLOBAL void newfield(void);

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, ULONG 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);
AGLOBAL void align(STRPTR string, SBYTE size, TEXT filler)

/* system.c */

AGLOBAL void celebrate(void);
AGLOBAL void clearkybd(void);
AGLOBAL void clearscreen(void);
AGLOBAL void datestamp(void);
AGLOBAL void gameinput(void);
AGLOBAL void hiscores(void);
AGLOBAL void resettime(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 void ReadStandardJoystick(ULONG port);
AGLOBAL void ReadGamepads(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);

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

// tails.c
AGLOBAL void drawtail(SBYTE x, SBYTE y, UBYTE image);

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

AGLOBAL struct HiScoreStruct
{   SBYTE player, level;
    ULONG 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,
           statx, staty, pos, levelreached, arrowy, olddeltax, olddeltay,
           numbers;
    ABOOL  affixer, encloser, remnants, alive, moved, nitro, pusher,
           sideshot, flashed, rammed;
    UBYTE  speed, control, cause, last, multi, power;
    SWORD  armour, ammo, bias, cutter, lives, glow;
    ULONG  score, oldscore, hiscore, dynamitescore, causewait, port;
    TEXT   name[NAMELENGTH + 1];
    COLOUR colour, dimcolour;
};
AGLOBAL struct TeleportStruct
{   SBYTE x, y;
    ABOOL alive;
};

/* Must have blank line at EOF. */
