#define RANDOM_USE_PERCENTAGE 0
#define RANDOM_USE_NUM_OBJECTS 1
+/* values for elements with content */
+#define MAX_ELEMCONT 8
+
/* values for the control window */
#define ED_CTRL_BUTTONS_GFX_YPOS 236
#define ED_CTRL_BUTTONS_ALT_GFX_YPOS 142
#define ED_NUM_CTRL2_BUTTONS (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT)
#define ED_NUM_CTRL_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS)
+/* values for properties window */
+#define ED_PROPERTIES_XPOS (TILEX - MINI_TILEX/2)
/* values for counter gadgets */
#define ED_COUNT_VALUE_XOFFSET 5
#define ED_COUNT_VALUE_YOFFSET 3
-#define ED_COUNT_SCORE_XPOS (TILEX)
+#define ED_COUNT_SCORE_XPOS ED_PROPERTIES_XPOS
#define ED_COUNT_SCORE_YPOS (14 * MINI_TILEY)
-#define ED_COUNT_ELEMCONT_XPOS (TILEX)
+#define ED_COUNT_ELEMCONT_XPOS ED_PROPERTIES_XPOS
#define ED_COUNT_ELEMCONT_YPOS (17 * MINI_TILEY)
/* values for element content drawing areas */
#define ED_CTRL_ID_DRAWING_LEVEL 26
#define ED_CTRL_ID_ELEMCONT_0 27
#define ED_CTRL_ID_ELEMCONT_7 34
+#define ED_CTRL_ID_AMOEBA_CONTENT 35
-#define ED_NUM_GADGETS 35
+#define ED_NUM_GADGETS 36
/* values for counter gadgets */
#define ED_COUNTER_SCORE 0
/* forward declaration for internal use */
static void DrawDrawingWindow();
-static void DrawPropertiesWindow(int);
+static void DrawPropertiesWindow();
static void CopyLevelToUndoBuffer();
static void HandleDrawingAreas(struct GadgetInfo *);
static void HandleCounterButtons(struct GadgetInfo *);
static boolean level_editor_gadgets_created = FALSE;
static int drawing_function = ED_CTRL_ID_SINGLE_ITEMS;
+static int properties_element = 0;
-static short ElementContent[8][3][3];
+static short ElementContent[MAX_ELEMCONT][3][3];
static short OrigBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY];
static int undo_buffer_position = 0;
static int new_element2 = EL_LEERRAUM;
static int new_element3 = EL_ERDREICH;
-int element_shift;
+int element_shift = 0;
+
int editor_element[] =
{
EL_CHAR_A + ('B' - 'A'),
EL_BETON,
EL_FELSBODEN,
- EL_SIEB2_LEER,
+ EL_SIEB2_INAKTIV,
EL_AUSGANG_ZU,
EL_AUSGANG_AUF,
EL_BETON,
EL_MAUERWERK,
EL_FELSBODEN,
- EL_SIEB_LEER,
+ EL_SIEB_INAKTIV,
EL_EDELSTEIN,
EL_DIAMANT,
EL_MAUER_Y,
EL_MAUER_XY,
+ EL_SPEED_PILL,
+ EL_LEERRAUM,
+ EL_LEERRAUM,
+ EL_LEERRAUM,
+
EL_CHAR_A + ('S' - 'A'),
EL_CHAR_A + ('O' - 'A'),
EL_CHAR_A + ('K' - 'A'),
EL_SOKOBAN_FELD_VOLL,
EL_BETON,
+ EL_LEERRAUM,
+ EL_LEERRAUM,
+ EL_LEERRAUM,
+ EL_LEERRAUM,
+
+ EL_CHAR('S'),
+ EL_CHAR('U'),
+ EL_CHAR('P'),
+ EL_CHAR('A'),
+
+ EL_CHAR('P'),
+ EL_CHAR('L'),
+ EL_CHAR('E'),
+ EL_CHAR('X'),
+
+ EL_SP_EMPTY,
+ EL_SP_ZONK,
+ EL_SP_BASE,
+ EL_SP_MURPHY,
+
+ EL_SP_INFOTRON,
+ EL_SP_CHIP_SINGLE,
+ EL_SP_HARD_GRAY,
+ EL_SP_EXIT,
+
+ EL_SP_DISK_ORANGE,
+ EL_SP_PORT1_RIGHT,
+ EL_SP_PORT1_DOWN,
+ EL_SP_PORT1_LEFT,
+
+ EL_SP_PORT1_UP,
+ EL_SP_PORT2_RIGHT,
+ EL_SP_PORT2_DOWN,
+ EL_SP_PORT2_LEFT,
+
+ EL_SP_PORT2_UP,
+ EL_SP_SNIKSNAK,
+ EL_SP_DISK_YELLOW,
+ EL_SP_TERMINAL,
+
+ EL_SP_DISK_RED,
+ EL_SP_PORT_Y,
+ EL_SP_PORT_X,
+ EL_SP_PORT_XY,
+
+ EL_SP_ELECTRON,
+ EL_SP_BUG,
+ EL_SP_CHIP_LEFT,
+ EL_SP_CHIP_RIGHT,
+
+ EL_SP_HARD_BASE1,
+ EL_SP_HARD_GREEN,
+ EL_SP_HARD_BLUE,
+ EL_SP_HARD_RED,
+
+ EL_SP_HARD_YELLOW,
+ EL_SP_HARD_BASE2,
+ EL_SP_HARD_BASE3,
+ EL_SP_HARD_BASE4,
+
+ EL_SP_HARD_BASE5,
+ EL_SP_HARD_BASE6,
+ EL_SP_CHIP_UPPER,
+ EL_SP_CHIP_LOWER,
+
/*
EL_CHAR_A + ('D' - 'A'),
EL_CHAR_A + ('Y' - 'A'),
EL_CHAR_OE,
EL_CHAR_UE,
- EL_CHAR_COPY
+ EL_CHAR_COPY,
+ EL_LEERRAUM
};
int elements_in_list = sizeof(editor_element)/sizeof(int);
{
struct GadgetInfo *gi;
unsigned long event_mask;
- int id = ED_CTRL_ID_DRAWING_LEVEL;
+ int id;
int i;
event_mask =
GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
GD_EVENT_OFF_BORDERS;
+ /* one for the level drawing area ... */
+ id = ED_CTRL_ID_DRAWING_LEVEL;
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_X, SX,
GDI_Y, SY,
level_editor_gadget[id] = gi;
- for (i=0; i<8; i++)
+ /* ... up to eight areas for element content ... */
+ for (i=0; i<MAX_ELEMCONT; i++)
{
- int id = ED_CTRL_ID_ELEMCONT_0 + i;
int gx = SX + ED_AREA_ELEMCONT_XPOS + 5 * (i % 4) * MINI_TILEX;
int gy = SX + ED_AREA_ELEMCONT_YPOS + 6 * (i / 4) * MINI_TILEY;
+ id = ED_CTRL_ID_ELEMCONT_0 + i;
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_X, gx,
GDI_Y, gy,
level_editor_gadget[id] = gi;
}
+
+ /* ... and one for the amoeba content */
+ id = ED_CTRL_ID_AMOEBA_CONTENT;
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, SX + ED_AREA_ELEMCONT_XPOS,
+ GDI_Y, SY + ED_AREA_ELEMCONT_YPOS,
+ GDI_WIDTH, MINI_TILEX,
+ GDI_HEIGHT, MINI_TILEY,
+ GDI_TYPE, GD_TYPE_DRAWING_AREA,
+ GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK, HandleDrawingAreas,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
}
static void CreateLevelEditorGadgets()
level_ypos=-1;
edit_mode = ED_MODE_DRAWING;
name_typing = FALSE;
- element_shift = 0;
CloseDoor(DOOR_CLOSE_ALL);
for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
{
if (i < elements_in_list)
- graphic = el2gfx(editor_element[i]);
+ graphic = el2gfx(editor_element[i + element_shift]);
else
graphic = GFX_LEERRAUM;
el2gfx(new_element3));
redraw_mask |= REDRAW_DOOR_1;
- if (edit_mode == ED_MODE_PROPERTIES)
- DrawPropertiesWindow(new_element);
+ if (!HAS_CONTENT(properties_element))
+ {
+ properties_element = new_element;
+ if (edit_mode == ED_MODE_PROPERTIES)
+ DrawPropertiesWindow();
+ }
}
if (edit_mode == ED_MODE_DRAWING) /********** EDIT-FENSTER **********/
int2str(value, 3), FS_SMALL, FC_YELLOW);
}
-#define TEXT_COLLECTING "Score for collecting"
-#define TEXT_SMASHING "Score for smashing"
-#define TEXT_CRACKING "Score for cracking"
-#define TEXT_SPEED "Speed of growth"
-#define TEXT_DURATION "Duration when activated"
-
static void DrawDrawingWindow()
{
ClearWindow();
static void DrawElementContentAreas()
{
- static int num_areas = 8;
+ int *num_areas = &MampferMax;
+ int area_x = ED_AREA_ELEMCONT_XPOS / MINI_TILEX;
+ int area_y = ED_AREA_ELEMCONT_YPOS / MINI_TILEY;
+ int area_sx = SX + ED_AREA_ELEMCONT_XPOS;
+ int area_sy = SY + ED_AREA_ELEMCONT_YPOS;
int i, x, y;
- for (i=0; i<8; i++)
+ for (i=0; i<MAX_ELEMCONT; i++)
+ for (y=0; y<3; y++)
+ for (x=0; x<3; x++)
+ ElementContent[i][x][y] = level.mampfer_inhalt[i][x][y];
+
+ for (i=0; i<MAX_ELEMCONT; i++)
UnmapDrawingArea(ED_CTRL_ID_ELEMCONT_0 + i);
/* display counter to choose number of element content areas */
- gadget_areas_value = &num_areas;
+ gadget_areas_value = num_areas;
DrawCounterValueField(ED_COUNTER_ELEMCONT, *gadget_areas_value);
x = counter_info[ED_COUNTER_ELEMCONT].x + DXSIZE;
y = counter_info[ED_COUNTER_ELEMCONT].y;
FC_YELLOW, "number of content areas");
MapCounterButtons(ED_COUNTER_ELEMCONT);
+ /* delete content areas in case of reducing number of them */
XFillRectangle(display, backbuffer, gc,
- SX, SY + ED_AREA_ELEMCONT_YPOS - MINI_TILEX,
+ SX, area_sy - MINI_TILEX,
SXSIZE, 12 * MINI_TILEY);
/* draw some decorative border for the objects */
- for (i=0; i<num_areas; i++)
+ for (i=0; i<*num_areas; i++)
{
for (y=0; y<4; y++)
for (x=0; x<4; x++)
- DrawMiniElement(ED_AREA_ELEMCONT_XPOS / MINI_TILEX + 5 * (i % 4) + x,
- ED_AREA_ELEMCONT_YPOS / MINI_TILEY + 6 * (i / 4) + y,
+ DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
EL_ERDREICH);
XFillRectangle(display, drawto, gc,
- SX + ED_AREA_ELEMCONT_XPOS
- + 5 * (i % 4) * MINI_TILEX + MINI_TILEX/2 - 1,
- SY + ED_AREA_ELEMCONT_YPOS
- + 6 * (i / 4) * MINI_TILEY + MINI_TILEY/2 - 1,
+ area_sx + 5 * (i % 4) * MINI_TILEX + MINI_TILEX/2 - 1,
+ area_sy + 6 * (i / 4) * MINI_TILEY + MINI_TILEY/2 - 1,
3 * MINI_TILEX + 2, 3 * MINI_TILEY + 2);
}
/* copy border to the right location */
XCopyArea(display, drawto, drawto, gc,
- SX + ED_AREA_ELEMCONT_XPOS - MINI_TILEX/2,
- SY + ED_AREA_ELEMCONT_YPOS - MINI_TILEY/2,
- (5 * 4 + 1) * MINI_TILEX,
- 12 * MINI_TILEY,
- SX + ED_AREA_ELEMCONT_XPOS - MINI_TILEX,
- SY + ED_AREA_ELEMCONT_YPOS - MINI_TILEY);
-
- for (i=0; i<num_areas; i++)
+ area_sx, area_sy, (5 * 4 + 1) * MINI_TILEX, 12 * MINI_TILEY,
+ area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
+
+ DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 0 * MINI_TILEY + 1,
+ "Content", FS_SMALL, FC_YELLOW);
+ DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 1 * MINI_TILEY + 1,
+ "when", FS_SMALL, FC_YELLOW);
+ DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 2 * MINI_TILEY + 1,
+ "smashed", FS_SMALL, FC_YELLOW);
+
+ for (i=0; i<*num_areas; i++)
{
for (y=0; y<3; y++)
for (x=0; x<3; x++)
- DrawMiniElement(ED_AREA_ELEMCONT_XPOS / MINI_TILEX + 5 * (i % 4) + x,
- ED_AREA_ELEMCONT_YPOS / MINI_TILEY + 6 * (i / 4) + y,
- EL_EDELSTEIN_BD);
-
- DrawTextF(ED_AREA_ELEMCONT_XPOS
- + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
- ED_AREA_ELEMCONT_YPOS
- + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
+ DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
+ ElementContent[i][x][y]);
+
+ DrawTextF(area_sx - SX + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
+ area_sy - SY + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
FC_YELLOW, "%d", i + 1);
}
- for (i=0; i<num_areas; i++)
+ for (i=0; i<*num_areas; i++)
MapDrawingArea(ED_CTRL_ID_ELEMCONT_0 + i);
}
-static void DrawPropertiesWindow(int element)
+static void DrawAmoebaContentArea()
+{
+ int area_x = ED_AREA_ELEMCONT_XPOS / MINI_TILEX;
+ int area_y = ED_AREA_ELEMCONT_YPOS / MINI_TILEY;
+ int area_sx = SX + ED_AREA_ELEMCONT_XPOS;
+ int area_sy = SY + ED_AREA_ELEMCONT_YPOS;
+ int x, y;
+
+ ElementContent[0][0][0] = level.amoebe_inhalt;
+
+ /* draw decorative border for the object */
+ for (y=0; y<2; y++)
+ for (x=0; x<2; x++)
+ DrawMiniElement(area_x + x, area_y + y, EL_ERDREICH);
+
+ XFillRectangle(display, drawto, gc,
+ area_sx + MINI_TILEX/2 - 1, area_sy + MINI_TILEY/2 - 1,
+ MINI_TILEX + 2, MINI_TILEY + 2);
+
+ /* copy border to the right location */
+ XCopyArea(display, drawto, drawto, gc,
+ area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY,
+ area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
+
+ DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba",
+ FS_SMALL, FC_YELLOW);
+
+ DrawMiniElement(area_x, area_y, ElementContent[0][0][0]);
+
+ MapDrawingArea(ED_CTRL_ID_AMOEBA_CONTENT);
+}
+
+#define TEXT_COLLECTING "Score for collecting"
+#define TEXT_SMASHING "Score for smashing"
+#define TEXT_CRACKING "Score for cracking"
+#define TEXT_SPEED "Speed of amoeba growth"
+#define TEXT_DURATION "Duration when activated"
+
+static void DrawPropertiesWindow()
{
int i, x, y;
int num_elements_in_level;
{ EL_AMOEBE_NORM, &level.tempo_amoebe, TEXT_SPEED },
{ EL_AMOEBE_VOLL, &level.tempo_amoebe, TEXT_SPEED },
{ EL_AMOEBE_BD, &level.tempo_amoebe, TEXT_SPEED },
- { EL_SIEB_LEER, &level.dauer_sieb, TEXT_DURATION },
+ { EL_SIEB_INAKTIV, &level.dauer_sieb, TEXT_DURATION },
{ EL_ABLENK_AUS, &level.dauer_ablenk, TEXT_DURATION },
{ -1, NULL, NULL }
};
2 * TILEX, 2 * TILEY,
SX + TILEX - MINI_TILEX/2, SY + TILEY - MINI_TILEY/2);
- DrawGraphic(1, 1, el2gfx(element));
+ DrawGraphic(1, 1, el2gfx(properties_element));
DrawText(SX + 3*TILEX, SY + 5*TILEY/4, "Element Properties",
FS_SMALL, FC_YELLOW);
num_elements_in_level = 0;
for (y=0; y<lev_fieldy; y++)
for (x=0; x<lev_fieldx; x++)
- if (Feld[x][y] == element)
+ if (Feld[x][y] == properties_element)
num_elements_in_level++;
- DrawTextF(TILEX, 5*TILEY, FC_YELLOW, "%d x contained in level",
+ DrawTextF(ED_PROPERTIES_XPOS, 5*TILEY, FC_YELLOW, "%d x contained in level",
num_elements_in_level);
/* check if there are elements where a score can be chosen for */
for (i=0; elements_with_counter[i].element != -1; i++)
{
- if (elements_with_counter[i].element == element)
+ if (elements_with_counter[i].element == properties_element)
{
int x = counter_info[ED_COUNTER_SCORE].x + DXSIZE;
int y = counter_info[ED_COUNTER_SCORE].y;
}
}
- DrawElementContentAreas();
+ if (HAS_CONTENT(properties_element))
+ {
+ if (IS_AMOEBOID(properties_element))
+ DrawAmoebaContentArea();
+ else
+ DrawElementContentAreas();
+ }
}
static void swap_numbers(int *i1, int *i2)
{
static boolean started_inside_drawing_area = FALSE;
static boolean draw_with_brush = FALSE;
+ int id = gi->custom_id;
boolean inside_drawing_area = !gi->event.off_borders;
boolean button_press_event;
boolean button_release_event;
- boolean draw_level = (gi->custom_id == ED_CTRL_ID_DRAWING_LEVEL);
+ boolean draw_level = (id == ED_CTRL_ID_DRAWING_LEVEL);
int new_element;
int button = gi->event.button;
int sx = gi->event.x, sy = gi->event.y;
gi->x + sx * MINI_TILEX,
gi->y + sy * MINI_TILEY,
el2gfx(new_element));
+
+ if (id == ED_CTRL_ID_AMOEBA_CONTENT)
+ level.amoebe_inhalt = new_element;
+ else if (id >= ED_CTRL_ID_ELEMCONT_0 && id <= ED_CTRL_ID_ELEMCONT_7)
+ level.mampfer_inhalt[id - ED_CTRL_ID_ELEMCONT_0][sx][sy] =
+ new_element;
}
break;
*gadget_areas_value += (id == ED_CTRL_ID_ELEMCONT_DOWN ? -step : step);
if (*gadget_areas_value < 1)
*gadget_areas_value = 1;
- else if (*gadget_areas_value > 8)
- *gadget_areas_value = 8;
+ else if (*gadget_areas_value > MAX_ELEMCONT)
+ *gadget_areas_value = MAX_ELEMCONT;
DrawCounterValueField(ED_COUNTER_ELEMCONT, *gadget_areas_value);
DrawElementContentAreas();
break;
case ED_CTRL_ID_PROPERTIES:
- DrawPropertiesWindow(new_element);
+ properties_element = new_element;
+ DrawPropertiesWindow();
edit_mode = ED_MODE_PROPERTIES;
break;
}
else
{
- AdjustLevelScrollPosition();
- DrawMiniLevel(level_xpos, level_ypos);
+ DrawDrawingWindow();
edit_mode = ED_MODE_DRAWING;
}
break;
if (Feld[x][y] != Ur[x][y])
level_changed = TRUE;
- if (!level_changed)
+ if (0 && !level_changed)
{
Request("Level has not changed !", REQ_CONFIRM);
break;