static void HandleDrawingAreaInfo(struct GadgetInfo *);
static void PrintEditorGadgetInfoText(struct GadgetInfo *);
+static int num_editor_gadgets = 0; /* dynamically determined */
+
#if 1
static struct GadgetInfo **level_editor_gadget = NULL;
static int *right_gadget_border = NULL;
static int editor_hl_empty[] = { };
#if 1
-static int *editor_el_empty = NULL;
+static int *editor_el_empty = NULL; /* dynamically allocated */
#else
static int editor_el_empty[ED_NUM_ELEMENTLIST_BUTTONS];
#endif
ed_fieldx = MAX_ED_FIELDX - 1;
ed_fieldy = MAX_ED_FIELDY - 1;
+ num_editor_gadgets = NUM_EDITOR_GADGETS;
+
+ // printf("::: allocating %d gadgets ...\n", num_editor_gadgets);
+
level_editor_gadget =
- checked_calloc(NUM_EDITOR_GADGETS * sizeof(struct GadgetInfo *));
+ checked_calloc(num_editor_gadgets * sizeof(struct GadgetInfo *));
right_gadget_border =
- checked_calloc(NUM_EDITOR_GADGETS * sizeof(int));
+ checked_calloc(num_editor_gadgets * sizeof(int));
editor_el_empty = checked_calloc(ED_NUM_ELEMENTLIST_BUTTONS * sizeof(int));
editor_el_empty_ptr = editor_el_empty;
{
int i;
- for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+ // printf("::: freeing %d gadgets ...\n", num_editor_gadgets);
+
+ for (i = 0; i < num_editor_gadgets; i++)
{
FreeGadget(level_editor_gadget[i]);
int i;
#if 1
- for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+ for (i = 0; i < num_editor_gadgets; i++)
if (IN_GFX_FIELD_FULL(level_editor_gadget[i]->x,
level_editor_gadget[i]->y))
UnmapGadget(level_editor_gadget[i]);
{
int i;
- for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+ for (i = 0; i < num_editor_gadgets; i++)
UnmapGadget(level_editor_gadget[i]);
}
Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i));
}
+static boolean playfield_area_changed = FALSE;
+
void DrawLevelEd()
{
+ int old_sx = SX;
+ int old_sy = SY;
+ int old_sxsize = SXSIZE;
+ int old_sysize = SYSIZE;
+
StopAnimation();
CloseDoor(DOOR_CLOSE_ALL);
#if 1
FadeOut(REDRAW_FIELD);
+ // FadeOut(REDRAW_ALL);
+#endif
+
+#if 1
+ /* needed after playing if editor playfield area has different size */
+ ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
#endif
#if 1
ChangeViewportPropertiesIfNeeded();
#endif
+ if (old_sx != SX ||
+ old_sy != SY ||
+ old_sxsize != SXSIZE ||
+ old_sysize != SYSIZE)
+ {
+ playfield_area_changed = TRUE;
+
+#if 0
+ printf("::: %d, %d, %d, %d != %d, %d, %d, %d\n",
+ old_sx, old_sy, old_sxsize, old_sysize,
+ SX, SY, SXSIZE, SYSIZE);
+#endif
+ }
+ else
+ playfield_area_changed = FALSE;
+
+#if 1
+ OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
+#else
OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
+#endif
#if DEBUG
CheckElementDescriptions();
DrawEditModeWindow();
#if 1
+ FadeIn(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+#else
FadeIn(REDRAW_FIELD);
+ // FadeIn(REDRAW_ALL);
#endif
/* copy actual editor door content to door double buffer for OpenDoor() */
+#if 1
+ BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+#else
BlitBitmap(drawto, bitmap_db_door,
DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+#endif
-#if 1
+#if 0
/* draw new control window (with border) to window */
redraw_mask |= REDRAW_ALL;
BackToFront();
#endif
+#if 0
OpenDoor(DOOR_OPEN_1);
+#endif
}
static void AdjustDrawingAreaGadgets()
int sy = SY + pad_y + start_line * font_height;
int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width;
int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
+ int max_lines_drawable = max_lines_per_screen - start_line;
+
+#if 0
+ printf("::: SYSIZE == %d [%d / %d / %d]\n", SYSIZE,
+ max_chars_per_line, max_lines_per_screen, max_lines_drawable);
+#endif
+
+ if (start_line >= max_lines_per_screen)
+ return FALSE;
+#if 1
+ return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+ max_lines_drawable, 0, -1, TRUE, FALSE, FALSE);
+#else
return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
max_lines_per_screen, 0, -1, TRUE, FALSE, FALSE);
+#endif
}
static void DrawPropertiesInfo()
{ -1, NULL }
};
char *filename = getElementDescriptionFilename(properties_element);
- char *percentage_text = "In this level:";
- char *properties_text = "Standard properties:";
+ char *percentage_text = "In this level: ";
+ char *properties_text = "Standard properties: ";
float percentage;
int num_elements_in_level;
int num_standard_properties = 0;
CloseDoor(DOOR_CLOSE_ALL);
+#if 0
BackToFront(); /* force redraw of undrawn special door */
+#endif
+
+#if 1
+ /* needed before playing if editor playfield area has different size */
+ ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+
+ redraw_mask = REDRAW_ALL;
+#endif
#if 0
DrawCompleteVideoDisplay();
Request("Level has changed! Exit without saving?",
REQ_ASK | REQ_STAY_OPEN))
{
+#if 1
+ // CloseDoor(DOOR_CLOSE_1);
+ SetDoorState(DOOR_CLOSE_2);
+#else
CloseDoor(DOOR_CLOSE_1);
SetDoorState(DOOR_CLOSE_2);
+#endif
#if 1
if (quick_quit)
#endif
game_status = GAME_MODE_MAIN;
+#if 1
+ DrawAndFadeInMainMenu(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+#else
#if 1
DrawAndFadeInMainMenu(REDRAW_FIELD);
#else
DrawMainMenu();
+#endif
#endif
}
else
{
+#if 1
+ // CloseDoor(DOOR_CLOSE_1);
+ OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+#else
CloseDoor(DOOR_CLOSE_1);
OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+#endif
}
}