rnd-20021227-2-src
authorHolger Schemel <info@artsoft.org>
Fri, 27 Dec 2002 16:48:03 +0000 (17:48 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:39:19 +0000 (10:39 +0200)
16 files changed:
src/cartoons.c
src/conftime.h
src/editor.c
src/editor.h
src/game.c
src/game.h
src/init.c
src/libgame/gadgets.c
src/libgame/toons.c
src/libgame/toons.h
src/screens.c
src/screens.h
src/tape.c
src/tape.h
src/tools.c
src/tools.h

index 5db44a296a82cd0805a61ad4ff9542aeb3ffea53..0278ed6d946ea366d3916bf2d1f2bc1f29042f43 100644 (file)
@@ -325,12 +325,11 @@ void InitToons()
       toons[i].anim_delay = 1;         /* no delay between frames */
       toons[i].start_frame = 0;                /* always start with first */
     }
-
-    toons[i].move_delay *= GAME_FRAME_DELAY;
   }
 
   InitToonScreen(bitmap_db_door,
                 BackToFront, PrepareBackbuffer, ToonNeedsRedraw,
                 toons, NUM_TOONS,
-                REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+                REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
+                GAME_FRAME_DELAY);
 }
index 919b39ce33e0224d6809bfe197bd6b15ba50aa91..77d9bbf6f636d6cdbc646e9da53c1c2f16272bbb 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2002-12-27 15:33]"
+#define COMPILE_DATE_STRING "[2002-12-27 17:46]"
index 952dbc6866bacbde8eb5b22aa7e37af026779447..7850a4f590f4bf3dcdad8624b70f693b72d95f06 100644 (file)
@@ -2025,6 +2025,14 @@ void CreateLevelEditorGadgets()
   CreateCheckbuttonGadgets();
 }
 
+void FreeLevelEditorGadgets()
+{
+  int i;
+
+  for (i=0; i<NUM_EDITOR_GADGETS; i++)
+    FreeGadget(level_editor_gadget[i]);
+}
+
 static void MapCounterButtons(int id)
 {
   MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]);
index d2338f1532a68ac6c8dd4701fa89f59914b88fea..3213c4528fdbc101e3c8d40dbddf96475683fdfb 100644 (file)
@@ -25,6 +25,7 @@ extern int editor_element[];
 extern int elements_in_list;
 
 void CreateLevelEditorGadgets();
+void FreeLevelEditorGadgets();
 void UnmapLevelEditorGadgets();
 void DrawLevelEd(void);
 void HandleLevelEditorKeyInput(Key);
index 28dde52a06ecf6f8c9035014d546e5f232b2e113..b135360d0d5722578f9c1315a02298caab80fc55 100644 (file)
@@ -7029,6 +7029,14 @@ void CreateGameButtons()
   }
 }
 
+void FreeGameButtons()
+{
+  int i;
+
+  for (i=0; i<NUM_GAME_BUTTONS; i++)
+    FreeGadget(game_gadget[i]);
+}
+
 static void MapGameButtons()
 {
   int i;
index 607e34e2bf97836b7d88d4a42db730b5141d861c..57fd8a81186534c229d40face3f94df9b362469d 100644 (file)
@@ -96,6 +96,7 @@ void RaiseScoreElement(int);
 void RequestQuitGame(boolean);
 
 void CreateGameButtons();
+void FreeGameButtons();
 void UnmapGameButtons();
 
 #endif
index 255cbc63f5863de2b48257d5e4eca50423946bbb..064de4a9efc3ed6f881cae4a50cff5c4fa82d96d 100644 (file)
@@ -124,10 +124,11 @@ void OpenAll(void)
 
   InitImages();                        /* needs to know current level directory */
   InitSound();                 /* needs to know current level directory */
+#if 0
   InitGadgets();               /* needs images + number of level series */
+#endif
 
   InitGfxBackground();
-  InitToons();
 
   if (global.autoplay_leveldir)
   {
@@ -218,6 +219,9 @@ static void ReinitializeGraphics()
               new_graphic_info[IMG_MENU_FONT_MEDIUM].bitmap,
               new_graphic_info[IMG_MENU_FONT_SMALL].bitmap,
               new_graphic_info[IMG_MENU_FONT_EM].bitmap);
+
+  InitGadgets();
+  InitToons();
 }
 
 static void InitImages()
@@ -582,6 +586,10 @@ void ReloadCustomArtwork()
     }
 #endif
 
+#if 0
+    SyncDisplay();
+#endif
+
     ReinitializeGraphics();
 
     FreeTileClipmasks();
@@ -647,13 +655,29 @@ void ReloadCustomArtwork()
 #endif
 }
 
+void FreeGadgets()
+{
+  FreeLevelEditorGadgets();
+  FreeGameButtons();
+  FreeTapeButtons();
+  FreeToolButtons();
+  FreeScreenGadgets();
+}
+
 void InitGadgets()
 {
+  static boolean gadgets_initialized = FALSE;
+
+  if (gadgets_initialized)
+    FreeGadgets();
+
   CreateLevelEditorGadgets();
   CreateGameButtons();
   CreateTapeButtons();
   CreateToolButtons();
   CreateScreenGadgets();
+
+  gadgets_initialized = TRUE;
 }
 
 void InitElementInfo()
index e34c245ba802847743eb2edaf6615625d045f059..b5afaa880cc92fc6bae8bee9cabf2b219e521ec7 100644 (file)
@@ -576,14 +576,14 @@ void RedrawGadget(struct GadgetInfo *gi)
 
 struct GadgetInfo *CreateGadget(int first_tag, ...)
 {
-  struct GadgetInfo *new_gadget = checked_malloc(sizeof(struct GadgetInfo));
+  struct GadgetInfo *new_gadget = checked_calloc(sizeof(struct GadgetInfo));
   va_list ap;
 
   /* always start with reliable default values */
-  memset(new_gadget, 0, sizeof(struct GadgetInfo));    /* zero all fields */
   new_gadget->id = getNewGadgetID();
   new_gadget->callback_info = default_callback_info;
   new_gadget->callback_action = default_callback_action;
+  new_gadget->next = NULL;
 
   va_start(ap, first_tag);
   HandleGadgetTags(new_gadget, first_tag, ap);
@@ -614,7 +614,9 @@ void FreeGadget(struct GadgetInfo *gi)
   if (gi == gadget_list_last_entry)
     gadget_list_last_entry = gi_previous;
 
-  gi_previous->next = gi->next;
+  if (gi_previous)
+    gi_previous->next = gi->next;
+
   free(gi);
 }
 
index 84a21c2569d2ce89cb8ebc537eac39aec2d7d329..c067d2d460ee1e9fd1d55308b671216780114bcb 100644 (file)
@@ -78,7 +78,8 @@ void InitToonScreen(Bitmap *save_buffer,
                    boolean (*redraw_needed_function)(void),
                    struct ToonInfo *toons, int num_toons,
                    int startx, int starty,
-                   int width, int height)
+                   int width, int height,
+                   int frame_delay_value)
 {
   screen_info.save_buffer = save_buffer;
   screen_info.update_function = update_function;
@@ -90,6 +91,7 @@ void InitToonScreen(Bitmap *save_buffer,
   screen_info.starty = starty;
   screen_info.width = width;
   screen_info.height = height;
+  screen_info.frame_delay_value = frame_delay_value;
 }
 
 void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc,
@@ -148,7 +150,7 @@ boolean AnimateToon(int toon_nr, boolean restart)
   {
     horiz_move = (anim->direction & (ANIMDIR_LEFT | ANIMDIR_RIGHT));
     vert_move = (anim->direction & (ANIMDIR_UP | ANIMDIR_DOWN));
-    anim_delay_value = anim->move_delay;
+    anim_delay_value = anim->move_delay * screen_info.frame_delay_value;
 
     frame = getAnimationFrame(anim->anim_frames, anim->anim_delay,
                              anim->anim_mode, anim->start_frame,
index 75f76864e8203ccef076017791a773ea5c98780f..3588d7da46a4a0df1080c7f796780f20f492b15d 100644 (file)
@@ -51,6 +51,8 @@ struct ToonScreenInfo
 
   int startx, starty;
   int width, height;
+
+  int frame_delay_value;
 };
 
 struct ToonInfo
@@ -73,7 +75,10 @@ struct ToonInfo
 
 int getAnimationFrame(int, int, int, int, int);
 
-void InitToonScreen();
+void InitToonScreen(Bitmap *, void (*update_function)(void),
+                   void (*prepare_backbuffer_function)(void),
+                   boolean (*redraw_needed_function)(void),
+                   struct ToonInfo *, int, int, int, int, int, int);
 void InitAnimation(void);
 void StopAnimation(void);
 void DoAnimation(void);
index 0532cdd19e2f054e9d42df7059653fe2c0f40faf..ad93781bee436baf95e965061c84db04b49550f9 100644 (file)
@@ -2897,6 +2897,14 @@ void CreateScreenGadgets()
   CreateScreenScrollbars();
 }
 
+void FreeScreenGadgets()
+{
+  int i;
+
+  for (i=0; i<NUM_SCREEN_GADGETS; i++)
+    FreeGadget(screen_gadget[i]);
+}
+
 void MapChooseTreeGadgets(TreeInfo *ti)
 {
   int num_entries = numTreeInfoInGroup(ti);
index 60f310165c0a8d2c5882ca97d96ca9a137631c4b..c4485691a55cf13c8063c8a3c9796530db7448d2 100644 (file)
@@ -42,6 +42,7 @@ void HandleSetupScreen(int, int, int, int, int);
 void HandleGameActions(void);
 
 void CreateScreenGadgets();
+void FreeScreenGadgets();
 void MapChooseTreeGadgets(TreeInfo *);
 void UnmapChooseTreeGadgets();
 
index 8f5dd57abec2027f052ce663ec5ecb66a167b8fe..e9f3cbbcde34908bfcc3661ba0be3ae6eb32c22e 100644 (file)
@@ -876,6 +876,14 @@ void CreateTapeButtons()
   }
 }
 
+void FreeTapeButtons()
+{
+  int i;
+
+  for (i=0; i<NUM_TAPE_BUTTONS; i++)
+    FreeGadget(tape_gadget[i]);
+}
+
 void MapTapeEjectButton()
 {
   UnmapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]);
index 89c56a637ee48152e5b84f5638e9c217df9ca699..e1482e4768e29ec99fabef8a576ae54c5c328286 100644 (file)
@@ -101,6 +101,7 @@ void TapeQuickLoad(void);
 void AutoPlayTape(void);
 
 void CreateTapeButtons();
+void FreeTapeButtons();
 void MapTapeEjectButton();
 void MapTapeIndexButton();
 void MapTapeButtons();
index 2e627abfb59add5567f933cf395520f9ae63532f..9b972e7df955a0557e9876d2c413142ab35859eb 100644 (file)
@@ -1306,6 +1306,12 @@ inline static int getGfxAction(int x, int y)
   gfx_action = GfxAction[x][y];
 #endif
 
+#if DEBUG
+  if (gfx_action < 0)
+    printf("getGfxAction: THIS SHOULD NEVER HAPPEN: GfxAction[%d][%d] == %d\n",
+          x, y, gfx_action);
+#endif
+
   return gfx_action;
 }
 
@@ -1313,11 +1319,23 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
                          int cut_mode, int mask_mode)
 {
   int ux = LEVELX(x), uy = LEVELY(y);
-  int move_dir = MovDir[ux][uy];
-  int move_pos = getFramePosition(ux, uy);
-  int gfx_action = getGfxAction(ux, uy);
-  int graphic = el_dir_act2img(element, move_dir, gfx_action);
-  int frame = getGraphicAnimationFrame(graphic, move_pos);
+  int graphic;
+  int frame;
+
+  if (IN_LEV_FIELD(ux, uy))
+  {
+    int move_dir = MovDir[ux][uy];
+    int move_pos = getFramePosition(ux, uy);
+    int gfx_action = getGfxAction(ux, uy);
+
+    graphic = el_dir_act2img(element, move_dir, gfx_action);
+    frame = getGraphicAnimationFrame(graphic, move_pos);
+  }
+  else
+  {
+    graphic = el2img(element);
+    frame = getGraphicAnimationFrame(graphic, 0);
+  }
 
   if (element == EL_WALL_GROWING)
   {
@@ -2566,6 +2584,14 @@ void CreateToolButtons()
   }
 }
 
+void FreeToolButtons()
+{
+  int i;
+
+  for (i=0; i<NUM_TOOL_BUTTONS; i++)
+    FreeGadget(tool_gadget[i]);
+}
+
 static void UnmapToolButtons()
 {
   int i;
@@ -2939,6 +2965,24 @@ int el_dir2img(int element, int direction)
 
 int el_dir_act2img(int element, int direction, int action)
 {
+#if DEBUG
+  if (element < 0)
+  {    
+    printf("el_dir_act2img: THIS SHOULD NEVER HAPPEN: element == %d\n",
+          element);
+
+    return IMG_EMPTY;
+  }
+
+  if (action < 0)
+  {    
+    printf("el_dir_act2img: THIS SHOULD NEVER HAPPEN: action == %d\n",
+          action);
+
+    return IMG_EMPTY;
+  }
+#endif
+
   action = graphics_action_mapping[action];
   direction = MV_DIR_BIT(direction);
 
index 2ed87114decea686f130ce2f106dc780e4e49a76..02f2dc24a8fc4d2541bbcacb8c122430aa2122f5 100644 (file)
@@ -119,6 +119,7 @@ void UndrawSpecialEditorDoor();
 int ReadPixel(DrawBuffer *, int, int);
 
 void CreateToolButtons();
+void FreeToolButtons();
 
 int get_next_element(int);
 int el2gfx(int);