added event actions (by simulating keyboard input) for global animations
[rocksndiamonds.git] / src / libgame / misc.c
index 701d38fb83b3b1c246aa375634f504538b9f0452..6432523e41ce5c5755a6e385c28abd30995b5aee 100644 (file)
@@ -1442,28 +1442,28 @@ int putFileChunk(FILE *file, char *chunk_name, int chunk_size,
 
 int getFileVersion(File *file)
 {
+  int version_super = getByteFromFile(file);
   int version_major = getByteFromFile(file);
   int version_minor = getByteFromFile(file);
   int version_patch = getByteFromFile(file);
-  int version_build = getByteFromFile(file);
 
-  return VERSION_IDENT(version_major, version_minor, version_patch,
-                      version_build);
+  return VERSION_IDENT(version_super, version_major, version_minor,
+                      version_patch);
 }
 
 int putFileVersion(FILE *file, int version)
 {
   if (file != NULL)
   {
+    int version_super = VERSION_SUPER(version);
     int version_major = VERSION_MAJOR(version);
     int version_minor = VERSION_MINOR(version);
     int version_patch = VERSION_PATCH(version);
-    int version_build = VERSION_BUILD(version);
 
+    fputc(version_super, file);
     fputc(version_major, file);
     fputc(version_minor, file);
     fputc(version_patch, file);
-    fputc(version_build, file);
   }
 
   return 4;
@@ -2135,6 +2135,8 @@ void dumpList(ListNode *node_first)
 /* functions for file handling                                               */
 /* ------------------------------------------------------------------------- */
 
+#define MAX_BUFFER_SIZE                        4096
+
 File *openFile(char *filename, char *mode)
 {
   File *file = checked_calloc(sizeof(File));
@@ -2217,6 +2219,11 @@ size_t readFile(File *file, void *buffer, size_t item_size, size_t num_items)
   return fread(buffer, item_size, num_items, file->file);
 }
 
+size_t writeFile(File *file, void *buffer, size_t item_size, size_t num_items)
+{
+  return fwrite(buffer, item_size, num_items, file->file);
+}
+
 int seekFile(File *file, long offset, int whence)
 {
 #if defined(PLATFORM_ANDROID)
@@ -2286,6 +2293,36 @@ char *getStringFromFile(File *file, char *line, int size)
   return fgets(line, size, file->file);
 }
 
+int copyFile(char *filename_from, char *filename_to)
+{
+  File *file_from, *file_to;
+
+  if ((file_from = openFile(filename_from, MODE_READ)) == NULL)
+  {
+    return -1;
+  }
+
+  if ((file_to = openFile(filename_to, MODE_WRITE)) == NULL)
+  {
+    closeFile(file_from);
+
+    return -1;
+  }
+
+  while (!checkEndOfFile(file_from))
+  {
+    byte buffer[MAX_BUFFER_SIZE];
+    size_t bytes_read = readFile(file_from, buffer, 1, MAX_BUFFER_SIZE);
+
+    writeFile(file_to, buffer, 1, bytes_read);
+  }
+
+  closeFile(file_from);
+  closeFile(file_to);
+
+  return 0;
+}
+
 
 /* ------------------------------------------------------------------------- */
 /* functions for directory handling                                          */
@@ -2769,6 +2806,33 @@ int get_anim_parameter_value(char *s)
   return result;
 }
 
+int get_anim_action_parameter_value(char *token)
+{
+  int result = getImageIDFromToken(token);
+
+  if (result == -1)
+  {
+    char *gfx_token = getStringCat2("gfx.", token);
+
+    result = getImageIDFromToken(gfx_token);
+
+    checked_free(gfx_token);
+  }
+
+  if (result == -1)
+  {
+    Key key = getKeyFromX11KeyName(token);
+
+    if (key != KSYM_UNDEFINED)
+      result = -(int)key;
+  }
+
+  if (result == -1)
+    result = ANIM_EVENT_ACTION_NONE;
+
+  return result;
+}
+
 int get_parameter_value(char *value_raw, char *suffix, int type)
 {
   char *value = getStringToLower(value_raw);
@@ -2850,6 +2914,11 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
     // add optional "click:anim_X" or "click:anim_X.part_X" parameter
     result |= get_anim_parameter_value(value);
   }
+  else if (strEqual(suffix, ".init_event_action") ||
+          strEqual(suffix, ".anim_event_action"))
+  {
+    result = get_anim_action_parameter_value(value_raw);
+  }
   else if (strEqual(suffix, ".class"))
   {
     result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE :
@@ -2867,6 +2936,12 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
 
     if (string_has_parameter(value, "reverse"))
       result |= STYLE_REVERSE;
+
+    if (string_has_parameter(value, "passthrough_clicks"))
+      result |= STYLE_PASSTHROUGH;
+
+    if (string_has_parameter(value, "multiple_actions"))
+      result |= STYLE_MULTIPLE_ACTIONS;
   }
   else if (strEqual(suffix, ".fade_mode"))
   {