static int random_placement_background_element = EL_SAND;
static boolean random_placement_background_restricted = FALSE;
static boolean stick_element_properties_window = FALSE;
-
-static struct
-{
- boolean indestructible;
- boolean can_fall;
- boolean can_smash;
- boolean pushable;
- boolean slippery;
-} custom_element_properties[NUM_CUSTOM_ELEMENTS];
+static boolean custom_element_properties[NUM_ELEMENT_PROPERTIES];
static struct
{
0, 255,
GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
GADGET_ID_LEVEL_TIMESCORE_TEXT,
- &level.score[SC_ZEITBONUS],
+ &level.score[SC_TIME_BONUS],
"score for each 10 seconds left", NULL
},
{
{
ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(10),
GADGET_ID_CUSTOM_INDESTRUCTIBLE,
- &custom_element_properties[0].indestructible,
+ &custom_element_properties[EP_INDESTRUCTIBLE],
"indestructible", "element cannot be destroyed"
},
{
ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(11),
GADGET_ID_CUSTOM_CAN_FALL,
- &custom_element_properties[0].can_fall,
+ &custom_element_properties[EP_CAN_FALL],
"can fall", "element can fall down"
},
{
ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(12),
GADGET_ID_CUSTOM_CAN_SMASH,
- &custom_element_properties[0].can_smash,
+ &custom_element_properties[EP_CAN_SMASH],
"can smash", "element can smash other elements"
},
{
ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(13),
GADGET_ID_CUSTOM_PUSHABLE,
- &custom_element_properties[0].pushable,
+ &custom_element_properties[EP_PUSHABLE],
"pushable", "element can be pushed"
},
{
ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(14),
GADGET_ID_CUSTOM_SLIPPERY,
- &custom_element_properties[0].slippery,
+ &custom_element_properties[EP_SLIPPERY],
"slippery", "other elements can fall down from it"
}
};
dst[x][y] = src[x][y];
}
-static void CopyCustomElementPropertiesToEditor()
+static void CopyCustomElementPropertiesToEditor(int element)
{
int i;
- for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
- {
- int element = EL_CUSTOM_START + i;
- int properties = Properties1[element];
-
- custom_element_properties[i].indestructible =
- ((properties & EP_BIT_INDESTRUCTIBLE) != 0 ? TRUE : FALSE);
-
- custom_element_properties[i].can_fall =
- ((properties & EP_BIT_CAN_FALL) != 0 ? TRUE : FALSE);
-
- custom_element_properties[i].can_smash =
- ((properties & EP_BIT_CAN_SMASH) != 0 ? TRUE : FALSE);
-
- custom_element_properties[i].pushable =
- ((properties & EP_BIT_PUSHABLE) != 0 ? TRUE : FALSE);
-
- custom_element_properties[i].slippery =
- ((properties & EP_BIT_SLIPPERY) != 0 ? TRUE : FALSE);
- }
+ for (i=0; i < NUM_ELEMENT_PROPERTIES; i++)
+ custom_element_properties[i] = HAS_PROPERTY(element, i);
}
-static void CopyCustomElementPropertiesToGame()
+static void CopyCustomElementPropertiesToGame(int element)
{
int i;
- for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
- {
- int element = EL_CUSTOM_START + i;
-
- Properties1[element] = EP_BITMASK_DEFAULT;
-
- if (custom_element_properties[i].indestructible)
- Properties1[element] |= EP_BIT_INDESTRUCTIBLE;
- else
- Properties1[element] &= ~EP_BIT_INDESTRUCTIBLE;
-
- if (custom_element_properties[i].can_fall)
- Properties1[element] |= EP_BIT_CAN_FALL;
- else
- Properties1[element] &= ~EP_BIT_CAN_FALL;
-
- if (custom_element_properties[i].can_smash)
- Properties1[element] |= EP_BIT_CAN_SMASH;
- else
- Properties1[element] &= ~EP_BIT_CAN_SMASH;
-
- if (custom_element_properties[i].pushable)
- Properties1[element] |= EP_BIT_PUSHABLE;
- else
- Properties1[element] &= ~EP_BIT_PUSHABLE;
-
- if (custom_element_properties[i].slippery)
- Properties1[element] |= EP_BIT_SLIPPERY;
- else
- Properties1[element] &= ~EP_BIT_SLIPPERY;
- }
+ for (i=0; i < NUM_ELEMENT_PROPERTIES; i++)
+ SET_PROPERTY(element, i, custom_element_properties[i]);
}
void DrawLevelEd()
char *text;
} elements_with_counter[] =
{
- { EL_EMERALD, &level.score[SC_EDELSTEIN], TEXT_COLLECTING },
- { EL_BD_DIAMOND, &level.score[SC_EDELSTEIN], TEXT_COLLECTING },
- { EL_EMERALD_YELLOW, &level.score[SC_EDELSTEIN], TEXT_COLLECTING },
- { EL_EMERALD_RED, &level.score[SC_EDELSTEIN], TEXT_COLLECTING },
- { EL_EMERALD_PURPLE, &level.score[SC_EDELSTEIN], TEXT_COLLECTING },
- { EL_DIAMOND, &level.score[SC_DIAMANT], TEXT_COLLECTING },
- { EL_BUG_RIGHT, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BUG_UP, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BUG_LEFT, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BUG_DOWN, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_RIGHT,&level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_UP, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_LEFT, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_BD_BUTTERFLY_DOWN, &level.score[SC_KAEFER], TEXT_SMASHING },
- { EL_SPACESHIP_RIGHT, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_SPACESHIP_UP, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_SPACESHIP_LEFT, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_SPACESHIP_DOWN, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_BD_FIREFLY_RIGHT,&level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_BD_FIREFLY_UP, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_BD_FIREFLY_LEFT, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_BD_FIREFLY_DOWN, &level.score[SC_FLIEGER], TEXT_SMASHING },
- { EL_YAMYAM, &level.score[SC_MAMPFER], TEXT_SMASHING },
- { EL_DARK_YAMYAM, &level.score[SC_MAMPFER], TEXT_SMASHING },
+ { EL_EMERALD, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_BD_DIAMOND, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_EMERALD_YELLOW, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_EMERALD_RED, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_EMERALD_PURPLE, &level.score[SC_EMERALD], TEXT_COLLECTING },
+ { EL_DIAMOND, &level.score[SC_DIAMOND], TEXT_COLLECTING },
+ { EL_BUG_RIGHT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_UP, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_LEFT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BUG_DOWN, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_RIGHT,&level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_UP, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG], TEXT_SMASHING },
+ { EL_SPACESHIP_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_RIGHT,&level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING },
+ { EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
+ { EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING },
{ EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING },
{ EL_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING },
{ EL_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING },
{ EL_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING },
{ EL_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING },
- { EL_NUT, &level.score[SC_KOKOSNUSS], TEXT_CRACKING },
- { EL_DYNAMITE, &level.score[SC_DYNAMIT], TEXT_COLLECTING },
- { EL_KEY_1, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_KEY_2, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_KEY_3, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_KEY_4, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_EM_KEY_1_FILE, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_EM_KEY_2_FILE, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_EM_KEY_3_FILE, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
- { EL_EM_KEY_4_FILE, &level.score[SC_SCHLUESSEL], TEXT_COLLECTING },
+ { EL_NUT, &level.score[SC_NUT], TEXT_CRACKING },
+ { EL_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
+ { EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_1_FILE, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_2_FILE, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_3_FILE, &level.score[SC_KEY], TEXT_COLLECTING },
+ { EL_EM_KEY_4_FILE, &level.score[SC_KEY], TEXT_COLLECTING },
{ EL_AMOEBA_WET, &level.amoeba_speed, TEXT_SPEED },
{ EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_SPEED },
{ EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_SPEED },
if (IS_CUSTOM_ELEMENT(properties_element))
{
- int nr = properties_element - EL_CUSTOM_START;
-
- CopyCustomElementPropertiesToEditor();
-
- /* draw checkbutton gadget */
- i = ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE;
- x = checkbutton_info[i].x + xoffset_right2;
- y = checkbutton_info[i].y + yoffset_right2;
-
- checkbutton_info[i].value = &custom_element_properties[nr].indestructible;
-
- DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[i].text);
- ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
- GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
- MapCheckbuttonGadget(i);
-
- /* draw checkbutton gadget */
- i = ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL;
- x = checkbutton_info[i].x + xoffset_right2;
- y = checkbutton_info[i].y + yoffset_right2;
-
- checkbutton_info[i].value = &custom_element_properties[nr].can_fall;
-
- DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[i].text);
- ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
- GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
- MapCheckbuttonGadget(i);
-
- /* draw checkbutton gadget */
- i = ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH;
- x = checkbutton_info[i].x + xoffset_right2;
- y = checkbutton_info[i].y + yoffset_right2;
-
- checkbutton_info[i].value = &custom_element_properties[nr].can_smash;
-
- DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[i].text);
- ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
- GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
- MapCheckbuttonGadget(i);
-
- /* draw checkbutton gadget */
- i = ED_CHECKBUTTON_ID_CUSTOM_PUSHABLE;
- x = checkbutton_info[i].x + xoffset_right2;
- y = checkbutton_info[i].y + yoffset_right2;
-
- checkbutton_info[i].value = &custom_element_properties[nr].pushable;
+ CopyCustomElementPropertiesToEditor(properties_element);
- DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[i].text);
- ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
- GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
- MapCheckbuttonGadget(i);
-
- /* draw checkbutton gadget */
- i = ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY;
- x = checkbutton_info[i].x + xoffset_right2;
- y = checkbutton_info[i].y + yoffset_right2;
-
- checkbutton_info[i].value = &custom_element_properties[nr].slippery;
-
- DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[i].text);
- ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
- GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
- MapCheckbuttonGadget(i);
+ for (i = ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE;
+ i <= ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY; i++)
+ {
+ /* draw checkbutton gadget */
+ x = checkbutton_info[i].x + xoffset_right2;
+ y = checkbutton_info[i].y + yoffset_right2;
+
+ DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[i].text);
+ ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
+ GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
+ MapCheckbuttonGadget(i);
+ }
/* draw selectbox gadget */
i = ED_SELECTBOX_ID_CUSTOM_CHANGE_CAUSE;
static void DrawPropertiesInfo()
{
+ static struct
+ {
+ int value;
+ char *text;
+ }
+ properties[] =
+ {
+ { EP_AMOEBALIVE, "- living amoeba" },
+ { EP_AMOEBOID, "- amoeboid" },
+ { EP_PFORTE, "- pforte" },
+ { EP_SOLID, "- solid" },
+ { EP_INDESTRUCTIBLE, "- undestructible" },
+ { EP_SLIPPERY, "- slippery" },
+ { EP_ENEMY, "- enemy" },
+ { EP_MAUER, "- mauer" },
+ { EP_CAN_FALL, "- can fall" },
+ { EP_CAN_SMASH, "- can smash" },
+ { EP_CAN_CHANGE, "- can change" },
+ { EP_CAN_MOVE, "- can move" },
+ { EP_COULD_MOVE, "- could move" },
+ { EP_DONT_TOUCH, "- don't touch" },
+ { EP_DONT_GO_TO, "- don't go to" },
+ { EP_FOOD_DARK_YAMYAM, "- food for dark yamyam" },
+ { EP_BD_ELEMENT, "- BD style" },
+ { EP_SB_ELEMENT, "- SB style" },
+ { EP_GEM, "- gem" },
+ { EP_INACTIVE, "- inactive" },
+ { EP_EXPLOSIVE, "- explosive" },
+ { EP_FOOD_PENGUIN, "- food for penguin" },
+ { EP_PUSHABLE, "- pushable" },
+ { EP_PLAYER, "- player" },
+ { EP_HAS_CONTENT, "- has content" },
+ { EP_DIGGABLE, "- diggable" },
+ { EP_SP_ELEMENT, "- SB style" },
+ { EP_WALKABLE_INSIDE, "- walkable inside" },
+ { EP_ACTIVE_BOMB, "- active bomb" },
+ { EP_BELT, "- belt" },
+ { EP_BELT_ACTIVE, "- active belt" },
+ { EP_BELT_SWITCH, "- belt switch" },
+ { EP_WALKABLE_UNDER, "- walkable under" },
+ { EP_EM_SLIPPERY_WALL, "- EM style slippery wall" },
+ { EP_CAN_BE_CRUMBLED, "- can be crumbled" },
+ { -1, NULL }
+ };
char *filename = getElementDescriptionFilename(properties_element);
- int num_elements_in_level;
+ char *percentage_text = "In this level:";
+ char *properties_text = "Standard properties:";
float percentage;
+ int num_elements_in_level;
+ int num_standard_properties = 0;
+ int font1_nr = FONT_TEXT_1;
+ int font2_nr = FONT_TEXT_2;
+ int font1_width = getFontWidth(font1_nr);
+ int font2_height = getFontHeight(font2_nr);
+ int pad_x = ED_SETTINGS_XPOS;
+ int pad_y = 5 * TILEY;
int screen_line = 2;
- int x, y;
+ int i, x, y;
num_elements_in_level = 0;
for (y=0; y<lev_fieldy; y++)
num_elements_in_level++;
percentage = num_elements_in_level * 100.0 / (lev_fieldx * lev_fieldy);
- DrawTextF(ED_SETTINGS_XPOS, 5 * TILEY, FONT_TEXT_1, "In this level:");
- DrawTextF(ED_SETTINGS_XPOS + 15 * getFontWidth(FONT_TEXT_1), 5 * TILEY,
- FONT_TEXT_2, "%d (%.2f%%)", num_elements_in_level, percentage);
+ DrawTextF(pad_x, pad_y, font1_nr, percentage_text);
+ DrawTextF(pad_x + strlen(percentage_text) * font1_width, pad_y,
+ font2_nr, "%d (%.2f%%)", num_elements_in_level, percentage);
+
+ for (i=0; properties[i].value != -1; i++)
+ if (HAS_PROPERTY(properties_element, properties[i].value))
+ num_standard_properties++;
+
+ if (num_standard_properties > 0)
+ {
+ DrawTextF(pad_x, pad_y + screen_line * font2_height, font1_nr,
+ properties_text);
+ screen_line++;
+
+ for (i=0; properties[i].value != -1; i++)
+ {
+ if (!HAS_PROPERTY(properties_element, properties[i].value))
+ continue;
+
+ DrawTextF(pad_x, pad_y + screen_line * font2_height, font2_nr,
+ properties[i].text);
+ screen_line++;
+ }
+
+ screen_line++;
+ }
PrintInfoText("Description:", FONT_TEXT_1, screen_line);
if (PrintElementDescriptionFromFile(filename, screen_line + 1) == 0)
if (type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST &&
type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST)
- CopyCustomElementPropertiesToGame();
+ CopyCustomElementPropertiesToGame(properties_element);
}
static void HandleControlButtons(struct GadgetInfo *gi)