rnd-20100110-1-src
authorHolger Schemel <info@artsoft.org>
Sun, 10 Jan 2010 20:34:07 +0000 (21:34 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:58:16 +0000 (10:58 +0200)
* added new element "from_level_template" that is replaced by element
  from level template at same playfield position when loaded (currently
  not accessible from level editor, but only used for special Sokoban
  level conversion when using "special_flags: load_xsb_to_ces")

ChangeLog
src/conftime.h
src/editor.c
src/files.c
src/main.c
src/main.h

index 17c8df158fa44910511d888fe915fba09405632b..5eb677f1cd1e6b116a8344584b7863e6c4307431 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-10
+       * added new element "from_level_template" that is replaced by element
+         from level template at same playfield position when loaded (currently
+         not accessible from level editor, but only used for special Sokoban
+         level conversion when using "special_flags: load_xsb_to_ces")
+
 2010-01-07
        * added handling of gravity ports when converting Supaplex style R'n'D
          levels to native Supaplex levels for playing with Supaplex engine
index 587a3c61c2bfd37e010fb6d901d1f7be45559d31..973143a8ce36fbb34c01e8a2a8ff54e8999027d9 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2010-01-07 17:02"
+#define COMPILE_DATE_STRING "2010-01-10 21:27"
index a75d128500553814e1de836731ed2a16af5d4355..739713440de0b57b8f56637bb12469a7a9d25f48 100644 (file)
@@ -10792,12 +10792,21 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
     char *template_filename = getDefaultLevelFilename(-1);
     boolean new_template = !fileExists(template_filename);
 
+    /* backup original "level.field" (needed to track playfield changes) */
+    CopyPlayfield(level.field, FieldBackup);
+
+    /* "SaveLevelTemplate()" uses "level.field", so copy editor playfield */
+    CopyPlayfield(Feld, level.field);
+
     if (new_template ||
        Request("Save this template and kill the old ?", REQ_ASK))
       SaveLevelTemplate();
 
     if (new_template)
       Request("Template saved !", REQ_CONFIRM);
+
+    /* restore original "level.field" (needed to track playfield changes) */
+    CopyPlayfield(FieldBackup, level.field);
   }
   else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE &&
           custom_element.num_change_pages < MAX_CHANGE_PAGES)
index a969861edebc5eca093742203a1ef693fedf7e52..317266f801a331ab41380e5f624a454896917c56 100644 (file)
@@ -1752,9 +1752,26 @@ static void setFileInfoToDefaults(struct LevelFileInfo *level_file_info)
 
 static void ActivateLevelTemplate()
 {
+  int x, y;
+
   /* Currently there is no special action needed to activate the template
      data, because 'element_info' property settings overwrite the original
      level data, while all other variables do not change. */
+
+  /* Exception: 'from_level_template' elements in the original level playfield
+     are overwritten with the corresponding elements at the same position in
+     playfield from the level template. */
+
+  for (x = 0; x < level.fieldx; x++)
+    for (y = 0; y < level.fieldy; y++)
+      if (level.field[x][y] == EL_FROM_LEVEL_TEMPLATE)
+      {
+       level.field[x][y] = level_template.field[x][y];
+
+#if 0
+       printf("::: found EL_FROM_LEVEL_TEMPLATE at %d, %d\n", x, y);
+#endif
+      }
 }
 
 static char *getLevelFilenameFromBasename(char *basename)
@@ -6470,7 +6487,11 @@ int getMappedElement_SB(int element_ascii, boolean use_ces)
     { '.', EL_SOKOBAN_FIELD_EMPTY,  EL_CUSTOM_5 },  /* goal square */
     { '*', EL_SOKOBAN_FIELD_FULL,   EL_CUSTOM_6 },  /* box on goal square */
     { '+', EL_SOKOBAN_FIELD_PLAYER, EL_CUSTOM_7 },  /* player on goal square */
+#if 0
     { '_', EL_INVISIBLE_STEELWALL,  EL_CUSTOM_8 },  /* floor beyond border */
+#else
+    { '_', EL_INVISIBLE_STEELWALL,  EL_FROM_LEVEL_TEMPLATE },  /* floor beyond border */
+#endif
 
     { 0,   -1,                      -1          },
   };
index f1ea104e361ad855d33dc45b9977f49fb2bac73f..d3ecc942c253428a90bc2eea2c3698f416bd07a9 100644 (file)
@@ -4460,6 +4460,11 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
     "quicksand",
     "fast quicksand (with rock)"
   },
+  {
+    "from_level_template",
+    "from_level_template",
+    "element taken from level template"
+  },
 
   /* ----------------------------------------------------------------------- */
   /* "real" (and therefore drawable) runtime elements                        */
index e826e6d8589ae37908b45e41186660cc020a05fa..7b345be7156185460f9c2bfbb32db5d3b8708189 100644 (file)
 #define EL_QUICKSAND_FAST_EMPTY                861
 #define EL_QUICKSAND_FAST_FULL         862
 
-#define NUM_FILE_ELEMENTS              863
+#define EL_FROM_LEVEL_TEMPLATE         863
+
+#define NUM_FILE_ELEMENTS              864
 
 
 /* "real" (and therefore drawable) runtime elements */