added flags for test mode, teamwork mode and infinite levels to EM engine
authorHolger Schemel <info@artsoft.org>
Thu, 20 Feb 2020 14:44:56 +0000 (15:44 +0100)
committerHolger Schemel <info@artsoft.org>
Tue, 19 May 2020 16:20:00 +0000 (18:20 +0200)
src/game_em/cave.c
src/game_em/cave.h
src/game_em/convert.c
src/game_em/emerald.h
src/game_em/reademc.c

index fc872e9c8b994838bf7f7b6a9a7882b9f6b61e21..3519723d54af1f3f601aa47b2807b6c7765a467a 100644 (file)
@@ -68,6 +68,10 @@ void setLevelInfoToDefaults_EM(void)
 
   cav.num_ball_arrays = 8;
 
+  cav.testmode = FALSE;
+  cav.teamwork = FALSE;
+  cav.infinite = FALSE;
+
   for (i = 0; i < 8; i++)
     for (j = 0; j < 9; j++)
       cav.eater_array[i][j] = Cblank;
index 0e3704d94ec75b3d1dd003f4f521edb20c142749..5dd05255a56b11ffb7b586db524e67d5adfefceb 100644 (file)
@@ -260,6 +260,10 @@ struct CAVE
 
   int num_ball_arrays;         /* number of ball data arrays used */
 
+  boolean testmode;            /* test mode */
+  boolean teamwork;            /* two player mode */
+  boolean infinite;            /* cave is infinitely wide */
+
   short eater_array[8][9];             /* eater data */
   short ball_array[8][8];              /* ball data */
   short android_array[GAME_TILE_MAX];  /* android clone data */
index 4a4b9cf444234d8192f10d35ea7910c6be75ba85..e5bc5c6832cf21e08a90622422587a57bf48bc26 100644 (file)
@@ -275,18 +275,21 @@ void prepare_em_level(void)
   lev.right = lev.left + lev.width;
   lev.bottom = lev.top + lev.height;
 
-  /* add linked cave buffer columns for wrap-around movement */
-  for (x = 0; x < lev.left; x++)
+  if (cav.infinite)
   {
-    lev.cavecol[x] = lev.cavecol[lev.width + x];
-    lev.nextcol[x] = lev.nextcol[lev.width + x];
-    lev.drawcol[x] = lev.drawcol[lev.width + x];
-    lev.boomcol[x] = lev.boomcol[lev.width + x];
-
-    lev.cavecol[lev.right + x] = lev.cavecol[lev.left + x];
-    lev.nextcol[lev.right + x] = lev.nextcol[lev.left + x];
-    lev.drawcol[lev.right + x] = lev.drawcol[lev.left + x];
-    lev.boomcol[lev.right + x] = lev.boomcol[lev.left + x];
+    /* add linked cave buffer columns for wrap-around movement */
+    for (x = 0; x < lev.left; x++)
+    {
+      lev.cavecol[x] = lev.cavecol[lev.width + x];
+      lev.nextcol[x] = lev.nextcol[lev.width + x];
+      lev.drawcol[x] = lev.drawcol[lev.width + x];
+      lev.boomcol[x] = lev.boomcol[lev.width + x];
+
+      lev.cavecol[lev.right + x] = lev.cavecol[lev.left + x];
+      lev.nextcol[lev.right + x] = lev.nextcol[lev.left + x];
+      lev.drawcol[lev.right + x] = lev.drawcol[lev.left + x];
+      lev.boomcol[lev.right + x] = lev.boomcol[lev.left + x];
+    }
   }
 
   for (x = 0; x < lev.width; x++)
@@ -301,6 +304,14 @@ void prepare_em_level(void)
   lev.gems_needed = cav.gems_needed;
   lev.score = 0;
 
+  lev.testmode = cav.testmode;
+
+  if (lev.testmode)
+  {
+    lev.time = 0;
+    lev.gems_needed = 0;
+  }
+
   lev.eater_score      = cav.eater_score;
   lev.alien_score      = cav.alien_score;
   lev.bug_score                = cav.bug_score;
index 0bb0993b34e9dc46312a9255c0f6dc77a0845b5f..bceb8473cb5944c4134668fa3cf9ed0448348207 100644 (file)
@@ -678,6 +678,7 @@ struct LOGIC
   int home;                    /* number of players not yet at home */
                                /* 0 == all players at home */
 
+  boolean testmode;            /* test mode */
   boolean killed_out_of_time;  /* kill player due to time out */
 
   int exit_x, exit_y;          /* kludge for playing player exit sound */
index 05fa190fdcfd107fa78b39674cf2e5f49b439d23..b4ddbc2411aa009c6886fa3a522e5bbbbb264bfd 100644 (file)
@@ -273,6 +273,10 @@ void convert_em_level(unsigned char *src, int file_version)
   cav.time_seconds = MIN(GET_BE16(src[2110]), 9999);
   cav.gems_needed = src[2095];
 
+  cav.infinite = TRUE;
+  cav.testmode = FALSE;
+  cav.teamwork = (src[2150] & 128) ? TRUE : FALSE;
+
   /* scores */
 
   cav.emerald_score    = src[2084];