/* $Filename:    WormWars/Source/engine.h $
 * $VER:         WormWars 5.6 $
 * $Description: Constants for game engine $
 *
 * © Copyright 2000 James R. Jacobs.
 */

#define GOATMOVE             5 // assert (GOATMOVE != 0);
#define NOSE                 2 // if (NOSE > PROTECTORS) nose disabled
#define NOSEDISTANCE         4
#define WORMQUEUELIMIT      15
#define DOGQUEUELIMIT      120
#define SECONDSPERLEVEL    120 // assert (SECONDSPERLEVEL <= 599);
#define UNDRIFT              5 // assert (UNDRIFT != 0);

// dog dormancy

#define DORMANT              0
#define AWAKENING            1
#define CHASING             10

// frequencies

#define FREQ_CLOUD           1
#define FREQ_DRIP            1
#define FREQ_MAX            70
#define FREQ_DEC             2
#define FREQ_MIN            10
#define FREQ_TELEPORT      240

#define BONUSCLOUDSPEED      7
#define BONUSDRIPSPEED      11
#define BONUSFRAGSPEED       9
#define BONUSMISSILESPEED    9
#define CLOUDSPEED           9
#define DOGSPEED             8
#define DRIPSPEED           13
#define FRAGSPEED           10
#define GOATSPEED           19
#define MAGNETSPEED          9
#define MISSILESPEED        12
#define ORBSPEED            11
#define PENGUINSPEED        23
#define TIMEBOMBSPEED       60

// population limits

#define CREATURES           60
#define MAGNETS             20
#define PROTECTORS           2 // <=4!

// vampirism

#define GOATBLOOD            1
#define ORBBLOOD             1
#define PENGUINBLOOD         1

// jump distances

#define FASTDISTANCE         5
#define NORMALDISTANCE       4
#define SLOWDISTANCE         3

// skill points

#define EMPTYPOINT           1
#define TAILBONUS            1
#define TURNTOSILVER         5
#define TURNTOGOLD          10
#define SILVERPOINT         10
#define TIMEBONUS           10
#define ENCLOSUREPOINT      10
#define TELPOINT            20
#define GOLDPOINT           20
#define HITSHOT             50
#define KILLGOAT            50
#define KILLPENGUIN         50
#define KILLWORM           100
#define BOMBOVEREDGE       100
#define SKULLPOINT         100
#define LETTERPOINT        100
#define DRIPBONUS          100
#define LEVELBONUS         100

// pain ratings

#define DOGPAIN         5
#define DRIPPAIN        5
#define HEADPAIN        5
#define MISSILEPAIN     5
#define ORBPAIN         5
#define PROTECTORPAIN	5
#define REMNANTPAIN     5
#define TELEPORTPAIN	5
#define WORMFIREPAIN	5
#define WHIRLWINDPAIN   5

#define BOMBPAIN        3
#define CLOUDPAIN       3
#define FRAGMENTPAIN	3
#define LIGHTNINGPAIN	3
#define OTHERTAILPAIN	3
#define PENGUINPAIN     3
#define PENGUINPAIN     3

#define GOATPAIN		2
#define METALPAIN		2
#define SLAYERPAIN		2
#define SLIMEPAIN		2

#define STONEPAIN		1
#define TAILPAIN		1
#define WOODPAIN		1

// objects

#define BOMBADD			 5	// in squares radius
#define BOMBRAND		25
#define CLOCKADD		10	// in seconds
#define CLOCKRAND		20
#define ICEADD			 5	// in VERYSLOWs
#define ICERAND			 5
#define MODEADD			30	// in VERYSLOWs
#define MODERAND		40
#define TREASUREADD		 5	// in seconds
#define TREASURERAND	 5

MODULE  void changefield(void);
MODULE  void clearletters(void);
MODULE  void death(void);
MODULE  void fastloop(void);
MODULE  void killall(void);
MODULE  void magnetloop(void);
MODULE  void newfield(void);
MODULE  void newhiscores(void);
MODULE  void orientworms(void);
MODULE  void slowloop(void);

MODULE  void bombblast(SBYTE triggerer, SBYTE player, SBYTE centrex, SBYTE centrey);
MODULE  void bouncegoat(SBYTE which, SBYTE x, SBYTE y);
MODULE  void __inline change(SBYTE x, SBYTE y, UBYTE image);
MODULE  void cloudbullet(UBYTE which, SBYTE x, SBYTE y, SBYTE deltay);
MODULE  void copyfield(SBYTE source, SBYTE destination);
MODULE  void createmissile(UBYTE player);
MODULE  void creatureloop(SBYTE which);
MODULE  void dogqueue(SBYTE which, SBYTE deltax, SBYTE deltay);
MODULE  void drawcause(SBYTE player, SBYTE state);
MODULE  void drawletter(SBYTE player, SBYTE letter, SBYTE state);
MODULE  void explosion(SBYTE x, SBYTE y, SBYTE exceptionx, SBYTE exceptiony);
MODULE  void newlevel(SBYTE player);
MODULE  void orbscore(SBYTE which, ULONG score);
MODULE  void orbsplit(SBYTE which);
MODULE  void putletter(SBYTE player);
MODULE  void ramming(SBYTE player);
MODULE  void reflect(UBYTE which);
MODULE  void turnworm(SBYTE player, SBYTE deltax, SBYTE deltay);
MODULE  void wormbullet(SBYTE player);
MODULE  void wormletter(SBYTE player, SBYTE thissy);
MODULE  void wormloop(SBYTE player);

MODULE void dogdog(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dogdrip(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dogfrag(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dogmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dogorb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dogpenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dogwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dripfrag(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dripmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void driporb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void drippenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void dripwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void fragfrag(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void fragorb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void fragmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void fragpenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void fragwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void missilemissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void missilepenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void missilewhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void orborb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void orbmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void orbpenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void orbwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void penguinwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void whirlwindwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormdog(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormdrip(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormfrag(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormorb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormpenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void wormworm(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protdog(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protdrip(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protfrag(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protorb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protpenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protworm(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void protprot(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void clouddog(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void clouddrip(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudfrag(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudmissile(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudorb(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudpenguin(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudwhirlwind(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudworm(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudprot(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);
MODULE void cloudcloud(SBYTE x, SBYTE y, UBYTE which1, UBYTE which2);

MODULE SWORD atleast(SWORD value, SWORD minimum);
MODULE ABOOL blocked(SBYTE which, SBYTE deltax, SBYTE deltay);
MODULE ABOOL bounceorb(SBYTE which, SBYTE x, SBYTE y);
MODULE SBYTE bsign(SBYTE value);
MODULE ABOOL findempty(SBYTE* x, SBYTE* y, SBYTE first, SBYTE last);
MODULE SBYTE onlyworm(ABOOL alive);
MODULE SBYTE slowdown(SBYTE speed);
MODULE SBYTE speedup(SBYTE speed, ABOOL nitro);
MODULE ULONG squareblast(SBYTE type, SBYTE player, SBYTE thissy, SBYTE x, SBYTE y);
MODULE UBYTE whichcreature(SBYTE x, SBYTE y, UBYTE species, UBYTE exception);
MODULE SBYTE whichteleport(SBYTE x, SBYTE y);
MODULE ULONG wormobject(UBYTE player, SBYTE x, SBYTE y);
MODULE SWORD wsign(SWORD value);

// Must have blank line at EOF.
