fixed handling of androids in EM engine for old tapes
authorHolger Schemel <info@artsoft.org>
Tue, 25 Aug 2020 07:43:28 +0000 (09:43 +0200)
committerHolger Schemel <info@artsoft.org>
Tue, 25 Aug 2020 07:43:28 +0000 (09:43 +0200)
This change emulates slight differences in android handling between
the old and new EM game engine to prevent old tapes from breaking.

src/game.c
src/game_em/convert.c
src/game_em/export.h
src/game_em/game.c
src/game_em/global.h
src/game_em/logic.c

index 18a45fcf236d7d3a7f043bf286d1deb83bbf59ae..46f173b47f1393185e461bc8ccf105fe378e801b 100644 (file)
@@ -2993,6 +2993,9 @@ static void InitGameEngine(void)
   game_em.use_old_explosions =
     (game.engine_version < VERSION_IDENT(4,1,4,2));
 
+  game_em.use_old_android =
+    (game.engine_version < VERSION_IDENT(4,1,4,2));
+
   game_em.use_wrap_around =
     (game.engine_version > VERSION_IDENT(4,1,4,1));
 
index c311bffa34e76b9291172f44110d6c471d14c254..5c5e79befbbfdb6fba3203b0cd79e8e6b1a5a46e 100644 (file)
@@ -461,6 +461,7 @@ void prepare_em_level(void)
   // - game_em.use_single_button (default: TRUE)
   // - game_em.use_snap_key_bug (default: FALSE)
   // - game_em.use_old_explosions (default: FALSE)
+  // - game_em.use_old_android (default: FALSE)
   // - game_em.use_wrap_around (default: TRUE)
 
   game_em.level_solved = FALSE;
index e1519ea65659b80544f6b421b8d082511e56d8c9..ddd32c9f022c7d9cb1f8fe2e71bedeb27676bd7e 100644 (file)
@@ -46,6 +46,7 @@ struct GameInfo_EM
   boolean use_single_button;
   boolean use_snap_key_bug;
   boolean use_old_explosions;
+  boolean use_old_android;
   boolean use_wrap_around;
 };
 
index 491c290d7a68119a44bdada97268118e798e3b91..3115fb5adf25ea10e3653cd7aca82f2e936e8a9a 100644 (file)
@@ -75,6 +75,8 @@ void InitGameEngine_EM(void)
 {
   prepare_em_level();
 
+  logic_init();
+
   game_initscreen();
 
   RedrawPlayfield_EM(FALSE);
index 7dfbdca965c030c9d25be3f417d78bfb3c66b99a..3efba4477d546646395f69aedce635e70fd1c70b 100644 (file)
@@ -19,6 +19,7 @@ void game_init_cave_buffers(void);
 void play_sound(int, int, int);
 void play_element_sound(int, int, int, int);
 
+void logic_init(void);
 void logic(void);
 
 int  cleanup_em_level(unsigned char *, int, char *);
index 5d00cbf8b78d7b2a49f642daef0e20c7da836786..3c68bfb9f73ea6250de9abf3ef47b29ec65ad8a1 100644 (file)
@@ -82,6 +82,21 @@ static const byte is_amoeba[GAME_TILE_MAX] =
   [Xamoeba_8]          = 1
 };
 
+static byte is_android_blank[GAME_TILE_MAX] =
+{
+  [Xblank]             = 1,
+  [Xsplash_e]          = 1,
+  [Xsplash_w]          = 1,
+  [Xfake_acid_1]       = 1,
+  [Xfake_acid_2]       = 1,
+  [Xfake_acid_3]       = 1,
+  [Xfake_acid_4]       = 1,
+  [Xfake_acid_5]       = 1,
+  [Xfake_acid_6]       = 1,
+  [Xfake_acid_7]       = 1,
+  [Xfake_acid_8]       = 1
+};
+
 static const byte is_android_walkable[GAME_TILE_MAX] =
 {
   [Xblank]             = 1,
@@ -1553,14 +1568,14 @@ static void Landroid(int x, int y)
 
   if (lev.android_clone_cnt == 0)
   {
-    if (!is_blank[cave[x-1][y-1]] &&
-       !is_blank[cave[x][y-1]]   &&
-       !is_blank[cave[x+1][y-1]] &&
-       !is_blank[cave[x-1][y]]   &&
-       !is_blank[cave[x+1][y]]   &&
-       !is_blank[cave[x-1][y+1]] &&
-       !is_blank[cave[x][y+1]]   &&
-       !is_blank[cave[x+1][y+1]])
+    if (!is_android_blank[cave[x-1][y-1]] &&
+       !is_android_blank[cave[x][y-1]]   &&
+       !is_android_blank[cave[x+1][y-1]] &&
+       !is_android_blank[cave[x-1][y]]   &&
+       !is_android_blank[cave[x+1][y]]   &&
+       !is_android_blank[cave[x-1][y+1]] &&
+       !is_android_blank[cave[x][y+1]]   &&
+       !is_android_blank[cave[x+1][y+1]])
       goto android_move;
 
     switch (RANDOM(8))
@@ -1664,91 +1679,91 @@ static void Landroid(int x, int y)
       /* randomly find a direction to move */
 
       case 0: /* S,NE,W,NW,SE,E,SW,N */
-       if (is_blank[cave[x][y+1]])   goto android_s;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x-1][y]])   goto android_w;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
        goto android_move;
 
       case 1: /* NW,SE,N,S,NE,SW,E,W */
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x][y+1]])   goto android_s;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
        goto android_move;
 
       case 2: /* SW,E,S,W,N,NW,SE,NE */
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x][y+1]])   goto android_s;
-       if (is_blank[cave[x-1][y]])   goto android_w;
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
        goto android_move;
 
       case 3: /* N,SE,NE,E,W,S,NW,SW */
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x-1][y]])   goto android_w;
-       if (is_blank[cave[x][y+1]])   goto android_s;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
        goto android_move;
 
       case 4: /* SE,NW,E,NE,SW,W,N,S */
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x-1][y]])   goto android_w;
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
        goto android_move;
 
       case 5: /* NE,W,SE,SW,S,N,E,NW */
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x-1][y]])   goto android_w;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x][y+1]])   goto android_s;
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
        goto android_move;
 
       case 6: /* E,N,SW,S,NW,NE,SE,W */
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x][y+1]])   goto android_s;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
        goto android_move;
 
       case 7: /* W,SW,NW,N,E,SE,NE,S */
-       if (is_blank[cave[x-1][y]])   goto android_w;
-       if (is_blank[cave[x-1][y+1]]) goto android_sw;
-       if (is_blank[cave[x-1][y-1]]) goto android_nw;
-       if (is_blank[cave[x][y-1]])   goto android_n;
-       if (is_blank[cave[x+1][y]])   goto android_e;
-       if (is_blank[cave[x+1][y+1]]) goto android_se;
-       if (is_blank[cave[x+1][y-1]]) goto android_ne;
-       if (is_blank[cave[x][y+1]])   goto android_s;
+       if (is_android_blank[cave[x-1][y]])   goto android_w;
+       if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
+       if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
+       if (is_android_blank[cave[x][y-1]])   goto android_n;
+       if (is_android_blank[cave[x+1][y]])   goto android_e;
+       if (is_android_blank[cave[x+1][y+1]]) goto android_se;
+       if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
+       if (is_android_blank[cave[x][y+1]])   goto android_s;
        goto android_move;
     }
   }
@@ -7452,6 +7467,14 @@ static void logic_globals(void)
       next[x][y] = cave[x][y];
 }
 
+void logic_init(void)
+{
+  int splash_is_blank = !game_em.use_old_android;
+
+  is_android_blank[Xsplash_e] = splash_is_blank;
+  is_android_blank[Xsplash_w] = splash_is_blank;
+}
+
 void logic(void)
 {
   if (frame == 0)