added saving BDCFF files for BD engine
[rocksndiamonds.git] / src / game_bd / bd_caveobject.c
index 01c3caf9b0cd5011624eeefff56d5ac4c00ff694..b9c094251e33952afbf5a4bb4de3b2dcf5f31b3a 100644 (file)
@@ -14,9 +14,6 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <glib.h>
-#include <glib/gi18n.h>
-
 #include "main_bd.h"
 
 
@@ -29,6 +26,91 @@ GdObjectLevels gd_levels_mask[] =
   GD_OBJECT_LEVEL5
 };
 
+/* bdcff text description of object. caller should free string. */
+char *gd_object_get_bdcff(const GdObject *object)
+{
+  char *str = NULL;
+  int j;
+  const char *type;
+
+  switch (object->type)
+  {
+    case GD_POINT:
+      return getStringPrint("Point=%d %d %s", object->x1, object->y1, gd_elements[object->element].filename);
+
+    case GD_LINE:
+      return getStringPrint("Line=%d %d %d %d %s", object->x1, object->y1, object->x2, object->y2, gd_elements[object->element].filename);
+
+    case GD_RECTANGLE:
+      return getStringPrint("Rectangle=%d %d %d %d %s", object->x1, object->y1, object->x2, object->y2, gd_elements[object->element].filename);
+
+    case GD_FILLED_RECTANGLE:
+      /* if elements are not the same */
+      if (object->fill_element!=object->element)
+       return getStringPrint("FillRect=%d %d %d %d %s %s", object->x1, object->y1, object->x2, object->y2, gd_elements[object->element].filename, gd_elements[object->fill_element].filename);
+      /* they are the same */
+      return getStringPrint("FillRect=%d %d %d %d %s", object->x1, object->y1, object->x2, object->y2, gd_elements[object->element].filename);
+
+    case GD_RASTER:
+      return getStringPrint("Raster=%d %d %d %d %d %d %s", object->x1, object->y1, (object->x2-object->x1)/object->dx+1, (object->y2-object->y1)/object->dy+1, object->dx, object->dy, gd_elements[object->element].filename);
+
+    case GD_JOIN:
+      return getStringPrint("Add=%d %d %s %s", object->dx, object->dy, gd_elements[object->element].filename, gd_elements[object->fill_element].filename);
+
+    case GD_FLOODFILL_BORDER:
+      return getStringPrint("BoundaryFill=%d %d %s %s", object->x1, object->y1, gd_elements[object->fill_element].filename, gd_elements[object->element].filename);
+
+    case GD_FLOODFILL_REPLACE:
+      return getStringPrint("FloodFill=%d %d %s %s", object->x1, object->y1, gd_elements[object->fill_element].filename, gd_elements[object->element].filename);
+
+    case GD_MAZE:
+    case GD_MAZE_UNICURSAL:
+    case GD_MAZE_BRAID:
+      switch(object->type)
+      {
+       case GD_MAZE:
+         type = "perfect";
+         break;
+
+       case GD_MAZE_UNICURSAL:
+         type = "unicursal";
+         break;
+
+       case GD_MAZE_BRAID:
+         type = "braid";
+         break;
+
+       default:
+         /* never reached */
+         break;
+      }
+
+      return getStringPrint("Maze=%d %d %d %d %d %d %d %d %d %d %d %d %s %s %s", object->x1, object->y1, object->x2, object->y2, object->dx, object->dy, object->horiz, object->seed[0], object->seed[1], object->seed[2], object->seed[3], object->seed[4], gd_elements[object->element].filename, gd_elements[object->fill_element].filename, type);
+
+    case GD_RANDOM_FILL:
+      appendStringPrint(&str, "%s=%d %d %d %d %d %d %d %d %d %s", object->c64_random?"RandomFillC64":"RandomFill", object->x1, object->y1, object->x2, object->y2, object->seed[0], object->seed[1], object->seed[2], object->seed[3], object->seed[4], gd_elements[object->fill_element].filename);
+
+      /* seed and initial fill */
+      for (j = 0; j < 4; j++)
+       if (object->random_fill_probability[j] != 0)
+         appendStringPrint(&str, " %s %d", gd_elements[object->random_fill[j]].filename, object->random_fill_probability[j]);
+
+      if (object->element != O_NONE)
+       appendStringPrint(&str, " %s", gd_elements[object->element].filename);
+
+      return str;
+
+    case GD_COPY_PASTE:
+      return getStringPrint("CopyPaste=%d %d %d %d %d %d %s %s", object->x1, object->y1, object->x2, object->y2, object->dx, object->dy, object->mirror?"mirror":"nomirror", object->flip?"flip":"noflip");
+
+    case NONE:
+      /* never reached */
+      break;
+  }
+
+  return NULL;
+}
+
 /* create an INDIVIDUAL POINT CAVE OBJECT */
 GdObject *gd_object_new_point(GdObjectLevels levels, int x, int y, GdElement elem)
 {
@@ -163,7 +245,7 @@ GdObject *gd_object_new_floodfill_replace(GdObjectLevels levels, int x1, int y1,
 
 GdObject *gd_object_new_maze(GdObjectLevels levels, int x1, int y1, int x2, int y2,
                             int wall_w, int path_w, GdElement wall_e, GdElement path_e,
-                            int horiz_percent, const gint32 seed[5])
+                            int horiz_percent, const int seed[5])
 {
   int i;
   GdObject *newobj = checked_calloc(sizeof(GdObject));
@@ -188,7 +270,7 @@ GdObject *gd_object_new_maze(GdObjectLevels levels, int x1, int y1, int x2, int
 
 GdObject *gd_object_new_maze_unicursal(GdObjectLevels levels, int x1, int y1, int x2, int y2,
                                       int wall_w, int path_w, GdElement wall_e, GdElement path_e,
-                                      int horiz_percent, const gint32 seed[5])
+                                      int horiz_percent, const int seed[5])
 {
   int i;
   GdObject *newobj = checked_calloc(sizeof(GdObject));
@@ -213,7 +295,7 @@ GdObject *gd_object_new_maze_unicursal(GdObjectLevels levels, int x1, int y1, in
 
 GdObject *gd_object_new_maze_braid(GdObjectLevels levels, int x1, int y1, int x2, int y2,
                                   int wall_w, int path_w, GdElement wall_e, GdElement path_e,
-                                  int horiz_percent, const gint32 seed[5])
+                                  int horiz_percent, const int seed[5])
 {
   int i;
   GdObject *newobj = checked_calloc(sizeof(GdObject));
@@ -237,8 +319,8 @@ GdObject *gd_object_new_maze_braid(GdObjectLevels levels, int x1, int y1, int x2
 }
 
 GdObject *gd_object_new_random_fill(GdObjectLevels levels, int x1, int y1, int x2, int y2,
-                                   const gint32 seed[5], GdElement initial,
-                                   const GdElement random[4], const gint32 prob[4],
+                                   const int seed[5], GdElement initial,
+                                   const GdElement random[4], const int prob[4],
                                    GdElement replace_only, boolean c64)
 {
   int i;
@@ -1139,7 +1221,7 @@ static void draw_random_fill(GdCave *cave, const GdObject *object, int level)
   int y2 = object->y2;
   GdRand *rand;
   GdC64RandomGenerator c64_rand;
-  guint32 seed;
+  unsigned int seed;
 
   /* -1 means that it should be different every time played. */
   if (object->seed[level] == -1)
@@ -1316,7 +1398,7 @@ void gd_cave_draw_object(GdCave *cave, const GdObject *object, int level)
 }
 
 /* load cave to play... also can be called rendering the cave elements */
-GdCave *gd_cave_new_rendered(const GdCave *data, const int level, const guint32 seed)
+GdCave *gd_cave_new_rendered(const GdCave *data, const int level, const unsigned int seed)
 {
   GdCave *cave;
   GdElement element;
@@ -1331,7 +1413,7 @@ GdCave *gd_cave_new_rendered(const GdCave *data, const int level, const guint32
   cave->random = gd_rand_new_with_seed(cave->render_seed);
 
   /* maps needed during drawing and gameplay */
-  cave->objects_order = gd_cave_map_new(cave, gpointer);
+  cave->objects_order = gd_cave_map_new(cave, void *);
 
   cave->time                   = data->level_time[level];
   cave->timevalue              = data->level_timevalue[level];