#define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
#define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
-#define EP_BIT_AMOEBALIVE (1<<0)
-#define EP_BIT_AMOEBOID (1<<1)
-#define EP_BIT_SCHLUESSEL (1<<2)
-#define EP_BIT_PFORTE (1<<3)
-#define EP_BIT_SOLID (1<<4)
-#define EP_BIT_MASSIV (1<<5)
-#define EP_BIT_SLIPPERY (1<<6)
-#define EP_BIT_ENEMY (1<<7)
-#define EP_BIT_MAUER (1<<8)
-#define EP_BIT_CAN_FALL (1<<9)
-#define EP_BIT_CAN_SMASH (1<<10)
-#define EP_BIT_CAN_CHANGE (1<<11)
-#define EP_BIT_CAN_MOVE (1<<12)
-#define EP_BIT_COULD_MOVE (1<<13)
-#define EP_BIT_DONT_TOUCH (1<<14)
-#define EP_BIT_DONT_GO_TO (1<<15)
-#define EP_BIT_MAMPF2 (1<<16)
-#define EP_BIT_CHAR (1<<17)
-#define EP_BIT_BD_ELEMENT (1<<18)
-#define EP_BIT_SB_ELEMENT (1<<19)
-#define EP_BIT_GEM (1<<20)
-#define EP_BIT_INACTIVE (1<<21)
-#define EP_BIT_EXPLOSIVE (1<<22)
-#define EP_BIT_MAMPF3 (1<<23)
-#define EP_BIT_PUSHABLE (1<<24)
-#define EP_BIT_PLAYER (1<<25)
+#define EP_BIT_AMOEBALIVE (1 << 0)
+#define EP_BIT_AMOEBOID (1 << 1)
+#define EP_BIT_SCHLUESSEL (1 << 2)
+#define EP_BIT_PFORTE (1 << 3)
+#define EP_BIT_SOLID (1 << 4)
+#define EP_BIT_MASSIV (1 << 5)
+#define EP_BIT_SLIPPERY (1 << 6)
+#define EP_BIT_ENEMY (1 << 7)
+#define EP_BIT_MAUER (1 << 8)
+#define EP_BIT_CAN_FALL (1 << 9)
+#define EP_BIT_CAN_SMASH (1 << 10)
+#define EP_BIT_CAN_CHANGE (1 << 11)
+#define EP_BIT_CAN_MOVE (1 << 12)
+#define EP_BIT_COULD_MOVE (1 << 13)
+#define EP_BIT_DONT_TOUCH (1 << 14)
+#define EP_BIT_DONT_GO_TO (1 << 15)
+#define EP_BIT_MAMPF2 (1 << 16)
+#define EP_BIT_CHAR (1 << 17)
+#define EP_BIT_BD_ELEMENT (1 << 18)
+#define EP_BIT_SB_ELEMENT (1 << 19)
+#define EP_BIT_GEM (1 << 20)
+#define EP_BIT_INACTIVE (1 << 21)
+#define EP_BIT_EXPLOSIVE (1 << 22)
+#define EP_BIT_MAMPF3 (1 << 23)
+#define EP_BIT_PUSHABLE (1 << 24)
+#define EP_BIT_PLAYER (1 << 25)
+#define EP_BIT_HAS_CONTENT (1 << 26)
+#define EP_BIT_EATABLE (1 << 27)
+#define EP_BIT_SP_ELEMENT (1 << 28)
#define IS_AMOEBALIVE(e) (Elementeigenschaften[e] & EP_BIT_AMOEBALIVE)
#define IS_AMOEBOID(e) (Elementeigenschaften[e] & EP_BIT_AMOEBOID)
#define IS_MAMPF3(e) (Elementeigenschaften[e] & EP_BIT_MAMPF3)
#define IS_PUSHABLE(e) (Elementeigenschaften[e] & EP_BIT_PUSHABLE)
#define ELEM_IS_PLAYER(e) (Elementeigenschaften[e] & EP_BIT_PLAYER)
+#define HAS_CONTENT(e) (Elementeigenschaften[e] & EP_BIT_HAS_CONTENT)
+#define IS_EATABLE(e) (Elementeigenschaften[e] & EP_BIT_EATABLE)
+#define IS_SP_ELEMENT(e) (Elementeigenschaften[e] & EP_BIT_SP_ELEMENT)
#define IS_PLAYER(x,y) (ELEM_IS_PLAYER(StorePlayer[x][y]))
#define PIX_DOOR 1
#define PIX_HEROES 2
#define PIX_TOONS 3
-#define PIX_BIGFONT 4
-#define PIX_SMALLFONT 5
+#define PIX_MORE 4
+#define PIX_BIGFONT 5
+#define PIX_SMALLFONT 6
/* Pixmaps without them */
-#define PIX_DB_BACK 6
-#define PIX_DB_DOOR 7
-#define PIX_DB_FIELD 8
+#define PIX_DB_BACK 7
+#define PIX_DB_DOOR 8
+#define PIX_DB_FIELD 9
-#define NUM_PICTURES 6
-#define NUM_PIXMAPS 9
+#define NUM_PICTURES 7
+#define NUM_PIXMAPS 10
/* boundaries of arrays etc. */
#define MAX_NAMELEN (10+1)
#define GAME_FRAME_DELAY 20 /* frame delay in milliseconds */
#define FFWD_FRAME_DELAY 10 /* 200% speed for fast forward */
#define FRAMES_PER_SECOND (1000 / GAME_FRAME_DELAY)
+#define GADGET_FRAME_DELAY 150 /* delay between gadget actions */
struct HiScore
{
int edelsteine;
char name[MAX_LEVNAMLEN];
int score[LEVEL_SCORE_ELEMENTS];
- int mampfer_inhalt[4][3][3];
+ int mampfer_inhalt[8][3][3];
int tempo_amoebe;
int dauer_sieb;
int dauer_ablenk;
int amoebe_inhalt;
+ boolean high_speed;
};
struct LevelDirInfo
extern int ZX,ZY, ExitX,ExitY;
extern int AllPlayersGone;
extern int FrameCounter, TimeFrames, TimeLeft;
-extern int MampferNr, SiebAktiv;
+extern int MampferMax, MampferNr;
+extern boolean SiebAktiv;
+extern int SiebCount;
extern boolean network_player_action_received;
#define MINI_GFX_PER_LINE 32
#define MICRO_GFX_PER_LINE 128
#define HEROES_PER_LINE 16
+#define MINI_MORE_STARTX 0
+#define MINI_MORE_STARTY 160
+#define MICRO_MORE_STARTX 0
+#define MICRO_MORE_STARTY 208
+#define MORE_PER_LINE 16
+#define MINI_MORE_PER_LINE 16
+#define MICRO_MORE_PER_LINE 16
#define FONT_CHARS_PER_LINE 16
#define FONT_LINES_PER_FONT 4
#define EL_MORAST_VOLL 17
#define EL_TROPFEN 18
#define EL_BOMBE 19
-#define EL_SIEB_LEER 20
-#define EL_SIEB_VOLL 21
+#define EL_SIEB_INAKTIV 20
+#define EL_SPEED_PILL 21
#define EL_SALZSAEURE 22
#define EL_AMOEBE_NASS 23
#define EL_AMOEBE_NORM 24
#define EL_ERZ_EDEL_BD 58
#define EL_ERZ_EDEL_GELB 59
#define EL_MAMPFER2 60
-#define EL_SIEB2_LEER 61
-#define EL_SIEB2_VOLL 62
+#define EL_SIEB2_INAKTIV 61
+
+#define EL_UNUSED_62 62
+
#define EL_DYNABOMB 63
#define EL_DYNABOMB_NR 64
#define EL_DYNABOMB_SZ 65
#define EL_BADEWANNE3 102
#define EL_BADEWANNE4 103
#define EL_BADEWANNE5 104
-#define EL_SIEB_TOT 105
-#define EL_AUSGANG_ACT 106
+
+#define EL_UNUSED_105 105
+#define EL_UNUSED_106 106
+
#define EL_AUSGANG_AUF 107
-#define EL_SIEB2_TOT 108
+
+#define EL_UNUSED_108 108
+
#define EL_AMOEBA2DIAM 109
#define EL_MAULWURF 110
#define EL_PINGUIN 111
#define EL_CHAR_COPY (EL_CHAR_ASCII0+94)
#define EL_CHAR_END (EL_CHAR_START+79)
+#define EL_CHAR(x) (EL_CHAR_A + x - 'A')
+
#define EL_MAUER_X 200
#define EL_MAUER_Y 201
#define EL_MAUER_XY 202
-#define EL_UNUSED_200 203
-/* ... */
+#define EL_UNUSED_203 203
+#define EL_UNUSED_204 204
+#define EL_UNUSED_205 205
+#define EL_UNUSED_206 206
+#define EL_UNUSED_207 207
+#define EL_UNUSED_208 208
+#define EL_UNUSED_209 209
+
+#define EL_SP_START 210
+#define EL_SP_EMPTY (EL_SP_START + 0)
+#define EL_SP_ZONK (EL_SP_START + 1)
+#define EL_SP_BASE (EL_SP_START + 2)
+#define EL_SP_MURPHY (EL_SP_START + 3)
+#define EL_SP_INFOTRON (EL_SP_START + 4)
+#define EL_SP_CHIP_SINGLE (EL_SP_START + 5)
+#define EL_SP_HARD_GRAY (EL_SP_START + 6)
+#define EL_SP_EXIT (EL_SP_START + 7)
+#define EL_SP_DISK_ORANGE (EL_SP_START + 8)
+#define EL_SP_PORT1_RIGHT (EL_SP_START + 9)
+#define EL_SP_PORT1_DOWN (EL_SP_START + 10)
+#define EL_SP_PORT1_LEFT (EL_SP_START + 11)
+#define EL_SP_PORT1_UP (EL_SP_START + 12)
+#define EL_SP_PORT2_RIGHT (EL_SP_START + 13)
+#define EL_SP_PORT2_DOWN (EL_SP_START + 14)
+#define EL_SP_PORT2_LEFT (EL_SP_START + 15)
+#define EL_SP_PORT2_UP (EL_SP_START + 16)
+#define EL_SP_SNIKSNAK (EL_SP_START + 17)
+#define EL_SP_DISK_YELLOW (EL_SP_START + 18)
+#define EL_SP_TERMINAL (EL_SP_START + 19)
+#define EL_SP_DISK_RED (EL_SP_START + 20)
+#define EL_SP_PORT_Y (EL_SP_START + 21)
+#define EL_SP_PORT_X (EL_SP_START + 22)
+#define EL_SP_PORT_XY (EL_SP_START + 23)
+#define EL_SP_ELECTRON (EL_SP_START + 24)
+#define EL_SP_BUG (EL_SP_START + 25)
+#define EL_SP_CHIP_LEFT (EL_SP_START + 26)
+#define EL_SP_CHIP_RIGHT (EL_SP_START + 27)
+#define EL_SP_HARD_BASE1 (EL_SP_START + 28)
+#define EL_SP_HARD_GREEN (EL_SP_START + 29)
+#define EL_SP_HARD_BLUE (EL_SP_START + 30)
+#define EL_SP_HARD_RED (EL_SP_START + 31)
+#define EL_SP_HARD_YELLOW (EL_SP_START + 32)
+#define EL_SP_HARD_BASE2 (EL_SP_START + 33)
+#define EL_SP_HARD_BASE3 (EL_SP_START + 34)
+#define EL_SP_HARD_BASE4 (EL_SP_START + 35)
+#define EL_SP_HARD_BASE5 (EL_SP_START + 36)
+#define EL_SP_HARD_BASE6 (EL_SP_START + 37)
+#define EL_SP_CHIP_UPPER (EL_SP_START + 38)
+#define EL_SP_CHIP_LOWER (EL_SP_START + 39)
+#define EL_SP_END (EL_SP_START + 39)
+
+#define EL_UNUSED_250 250
+#define EL_UNUSED_251 251
+#define EL_UNUSED_252 252
+#define EL_UNUSED_253 253
+#define EL_UNUSED_254 254
#define EL_UNUSED_255 255
-/* "unreal" runtime elements */
-#define EL_BLOCKED 300
-#define EL_EXPLODING 301
-#define EL_CRACKINGNUT 302
-#define EL_BLURB_LEFT 303
-#define EL_BLURB_RIGHT 304
-#define EL_AMOEBING 305
-#define EL_MAUERND 306
-#define EL_BURNING 307
-#define EL_PLAYER_IS_LEAVING 308
+/* "real" (and therefore drawable) runtime elements */
+#define EL_SIEB_LEER 300
+#define EL_SIEB2_LEER 301
+#define EL_SIEB_VOLL 302
+#define EL_SIEB2_VOLL 303
+#define EL_SIEB_TOT 304
+#define EL_SIEB2_TOT 305
+#define EL_AUSGANG_ACT 306
+#define EL_SP_TERMINAL_ACTIVE 307
+
+/* "unreal" (and therefore not drawable) runtime elements */
+#define EL_BLOCKED 400
+#define EL_EXPLODING 401
+#define EL_CRACKINGNUT 402
+#define EL_BLURB_LEFT 403
+#define EL_BLURB_RIGHT 404
+#define EL_AMOEBING 405
+#define EL_MAUERND 406
+#define EL_BURNING 407
+#define EL_PLAYER_IS_LEAVING 408
/* game graphics:
-** 0 - 255: graphics from "RocksScreen"
-** 256 - 511: graphics from "RocksFont"
-** 512 - 767: graphics from "RocksHeroes"
+** 0 - 255: graphics from "RocksScreen"
+** 256 - 511: graphics from "RocksMore"
+** 512 - 767: graphics from "RocksFont"
+** 768 - 1023: graphics from "RocksHeroes"
*/
#define GFX_START_ROCKSSCREEN 0
#define GFX_END_ROCKSSCREEN 255
-#define GFX_START_ROCKSFONT 256
-#define GFX_END_ROCKSFONT 511
-#define GFX_START_ROCKSHEROES 512
-#define GFX_END_ROCKSHEROES 767
+#define GFX_START_ROCKSMORE 256
+#define GFX_END_ROCKSMORE 511
+#define GFX_START_ROCKSFONT 512
+#define GFX_END_ROCKSFONT 767
+#define GFX_START_ROCKSHEROES 768
+#define GFX_END_ROCKSHEROES 1023
-#define NUM_TILES 768
+#define NUM_TILES 1024
/* graphics from "RocksScreen" */
/* Zeile 0 (0) */
#define GFX_SOKOBAN_FELD_VOLL 123
#define GFX_GEBLUBBER 124
/* Zeile 8 (128) */
-#define GFX_SIEB_LEER 128
-#define GFX_SIEB_VOLL GFX_SIEB_LEER
-#define GFX_SIEB_TOT GFX_SIEB_LEER
+#define GFX_SIEB_INAKTIV 128
+#define GFX_SIEB_LEER GFX_SIEB_INAKTIV
+#define GFX_SIEB_VOLL GFX_SIEB_INAKTIV
+#define GFX_SIEB_TOT GFX_SIEB_INAKTIV
#define GFX_ERZ_EDEL 132
#define GFX_ERZ_DIAM 133
#define GFX_ERZ_EDEL_ROT 134
#define GFX_EDELSTEIN_ROT 152
#define GFX_EDELSTEIN_LILA 154
#define GFX_DYNABOMB_XL 156
+#define GFX_SPEED_PILL 158
#define GFX_SONDE 159
/* Zeile 10 (160) */
#define GFX_EDELSTEIN_BD 163
#define GFX_MAUER_L1 GFX_MAUER_LEFT
#define GFX_MAUER_L 170
#define GFX_MAUER_LEBT 171
-#define GFX_SIEB2_LEER 172
-#define GFX_SIEB2_VOLL GFX_SIEB2_LEER
-#define GFX_SIEB2_TOT GFX_SIEB2_LEER
+#define GFX_SIEB2_INAKTIV 172
+#define GFX_SIEB2_LEER GFX_SIEB2_INAKTIV
+#define GFX_SIEB2_VOLL GFX_SIEB2_INAKTIV
+#define GFX_SIEB2_TOT GFX_SIEB2_INAKTIV
/* Zeile 11 (176) */
#define GFX_AUSGANG_ZU 176
#define GFX_AUSGANG_ACT 177
#define GFX_SCHLUESSEL GFX_SCHLUESSEL1
#define GFX_SPIELFIGUR GFX_SPIELER1
-
/* graphics from "RocksHeroes" */
-
#define GFX_SPIELER1_DOWN (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 0)
#define GFX_SPIELER1_UP (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 4)
#define GFX_SPIELER1_LEFT (GFX_START_ROCKSHEROES + 1*HEROES_PER_LINE + 0)
#define GFX_FLAMMEN_UP (GFX_START_ROCKSHEROES +14*HEROES_PER_LINE + 8)
#define GFX_FLAMMEN_DOWN (GFX_START_ROCKSHEROES +15*HEROES_PER_LINE + 8)
+/* graphics from "RocksMore" */
+#define GFX_SP_EMPTY (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 0)
+#define GFX_SP_ZONK (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 1)
+#define GFX_SP_BASE (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 2)
+#define GFX_SP_MURPHY (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 3)
+#define GFX_SP_INFOTRON (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 4)
+#define GFX_SP_CHIP_SINGLE (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 5)
+#define GFX_SP_HARD_GRAY (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 6)
+#define GFX_SP_EXIT (GFX_START_ROCKSMORE + 0 * MORE_PER_LINE + 7)
+#define GFX_SP_DISK_ORANGE (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 0)
+#define GFX_SP_PORT1_RIGHT (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 1)
+#define GFX_SP_PORT1_DOWN (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 2)
+#define GFX_SP_PORT1_LEFT (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 3)
+#define GFX_SP_PORT1_UP (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 4)
+#define GFX_SP_PORT2_RIGHT (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 5)
+#define GFX_SP_PORT2_DOWN (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 6)
+#define GFX_SP_PORT2_LEFT (GFX_START_ROCKSMORE + 1 * MORE_PER_LINE + 7)
+#define GFX_SP_PORT2_UP (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 0)
+#define GFX_SP_SNIKSNAK (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 1)
+#define GFX_SP_DISK_YELLOW (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 2)
+#define GFX_SP_TERMINAL (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 3)
+#define GFX_SP_DISK_RED (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 4)
+#define GFX_SP_PORT_Y (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 5)
+#define GFX_SP_PORT_X (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 6)
+#define GFX_SP_PORT_XY (GFX_START_ROCKSMORE + 2 * MORE_PER_LINE + 7)
+#define GFX_SP_ELECTRON (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 0)
+#define GFX_SP_BUG (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 1)
+#define GFX_SP_CHIP_LEFT (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 2)
+#define GFX_SP_CHIP_RIGHT (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 3)
+#define GFX_SP_HARD_BASE1 (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 4)
+#define GFX_SP_HARD_GREEN (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 5)
+#define GFX_SP_HARD_BLUE (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 6)
+#define GFX_SP_HARD_RED (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 7)
+#define GFX_SP_HARD_YELLOW (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 0)
+#define GFX_SP_HARD_BASE2 (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 1)
+#define GFX_SP_HARD_BASE3 (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 2)
+#define GFX_SP_HARD_BASE4 (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 3)
+#define GFX_SP_HARD_BASE5 (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 4)
+#define GFX_SP_HARD_BASE6 (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 5)
+#define GFX_SP_CHIP_UPPER (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 6)
+#define GFX_SP_CHIP_LOWER (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 7)
+
+#define GFX_SP_EXPLODE_EMPTY (GFX_START_ROCKSMORE + 3 * MORE_PER_LINE + 8)
+#define GFX_SP_EXPLODE_INFOTRON (GFX_START_ROCKSMORE + 4 * MORE_PER_LINE + 8)
+#define GFX_SP_SNIKSNAK_LEFT (GFX_START_ROCKSMORE + 8 * MORE_PER_LINE + 8)
+#define GFX_SP_SNIKSNAK_RIGHT (GFX_START_ROCKSMORE + 8 * MORE_PER_LINE +12)
+#define GFX_SP_SNIKSNAK_UP (GFX_START_ROCKSMORE + 9 * MORE_PER_LINE + 8)
+#define GFX_SP_SNIKSNAK_DOWN (GFX_START_ROCKSMORE + 9 * MORE_PER_LINE +12)
+
+#define GFX2_SP_ELECTRON (GFX_START_ROCKSMORE + 10 * MORE_PER_LINE + 8)
+#define GFX2_SP_TERMINAL (GFX_START_ROCKSMORE + 11 * MORE_PER_LINE + 8)
+#define GFX2_SP_TERMINAL_ACTIVE (GFX_START_ROCKSMORE + 12 * MORE_PER_LINE + 8)
+
/* graphics from "RocksFont" */
#define GFX_CHAR_START (GFX_START_ROCKSFONT)
#define GFX_CHAR_ASCII0 (GFX_CHAR_START-32)
/* directions for moving */
#define MV_NO_MOVING 0
-#define MV_LEFT (1<<0)
-#define MV_RIGHT (1<<1)
-#define MV_UP (1<<2)
-#define MV_DOWN (1<<3)
+#define MV_LEFT (1 << 0)
+#define MV_RIGHT (1 << 1)
+#define MV_UP (1 << 2)
+#define MV_DOWN (1 << 3)
/* font types */
#define FS_SMALL 0