/* now set all '-1' values to element specific default values */
for (i=0; i<MAX_NUM_ELEMENTS; i++)
{
- int default_action_graphic = element_info[i].graphic[ACTION_DEFAULT];
- int default_action_direction_graphic[NUM_DIRECTIONS];
+ int default_graphic = element_info[i].graphic[ACTION_DEFAULT];
+ int default_direction_graphic[NUM_DIRECTIONS];
- if (default_action_graphic == -1)
- default_action_graphic = IMG_CHAR_QUESTION;
+ if (default_graphic == -1)
+ default_graphic = IMG_CHAR_QUESTION;
for (dir=0; dir<NUM_DIRECTIONS; dir++)
{
- default_action_direction_graphic[dir] =
+ default_direction_graphic[dir] =
element_info[i].direction_graphic[ACTION_DEFAULT][dir];
- if (default_action_direction_graphic[dir] == -1)
- default_action_direction_graphic[dir] = default_action_graphic;
+ if (default_direction_graphic[dir] == -1)
+ default_direction_graphic[dir] = default_graphic;
}
for (act=0; act<NUM_ACTIONS; act++)
act == ACTION_SNAPPING ||
act == ACTION_COLLECTING);
+ /* generic default action graphic (defined by "[default]" directive) */
+ int default_action_graphic = element_info[EL_DEFAULT].graphic[act];
+
+ /* look for special default action graphic (classic game specific) */
+ if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].graphic[act] != -1)
+ default_action_graphic = element_info[EL_BD_DEFAULT].graphic[act];
+ if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].graphic[act] != -1)
+ default_action_graphic = element_info[EL_SP_DEFAULT].graphic[act];
+ if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].graphic[act] != -1)
+ default_action_graphic = element_info[EL_SB_DEFAULT].graphic[act];
+
+ if (default_action_graphic == -1)
+ default_action_graphic = default_graphic;
+
for (dir=0; dir<NUM_DIRECTIONS; dir++)
{
- int default_direction_graphic = element_info[i].graphic[act];
+ int default_action_direction_graphic = element_info[i].graphic[act];
/* no graphic for current action -- use default direction graphic */
- if (default_direction_graphic == -1)
- default_direction_graphic =
- (act_remove ? IMG_EMPTY : default_action_direction_graphic[dir]);
+ if (default_action_direction_graphic == -1)
+ default_action_direction_graphic =
+ (act_remove ? IMG_EMPTY : default_direction_graphic[dir]);
if (element_info[i].direction_graphic[act][dir] == -1)
element_info[i].direction_graphic[act][dir] =
- default_direction_graphic;
+ default_action_direction_graphic;
}
/* no graphic for this specific action -- use default action graphic */
element_info[j].sound[action] = sound;
}
- /* initialize element/sound mapping from dynamic configuration */
+ /* initialize element class/sound mapping from dynamic configuration */
for (i=0; i < num_property_mappings; i++)
{
- int element = property_mapping[i].base_index;
- int action = property_mapping[i].ext1_index;
- int sound = property_mapping[i].artwork_index;
+ int element_class = property_mapping[i].base_index - MAX_NUM_ELEMENTS;
+ int action = property_mapping[i].ext1_index;
+ int sound = property_mapping[i].artwork_index;
- if (element >= MAX_NUM_ELEMENTS)
+ if (element_class < 0 || element_class >= MAX_NUM_ELEMENTS)
continue;
if (action < 0)
action = ACTION_DEFAULT;
- element_info[element].sound[action] = sound;
+ for (j=0; j < MAX_NUM_ELEMENTS; j++)
+ if (strcmp(element_info[j].class_name,
+ element_info[element_class].class_name) == 0)
+ element_info[j].sound[action] = sound;
}
- /* initialize element class/sound mapping from dynamic configuration */
+ /* initialize element/sound mapping from dynamic configuration */
for (i=0; i < num_property_mappings; i++)
{
- int element_class = property_mapping[i].base_index - MAX_NUM_ELEMENTS;
- int action = property_mapping[i].ext1_index;
- int sound = property_mapping[i].artwork_index;
+ int element = property_mapping[i].base_index;
+ int action = property_mapping[i].ext1_index;
+ int sound = property_mapping[i].artwork_index;
- if (element_class < 0 || element_class >= MAX_NUM_ELEMENTS)
+ if (element >= MAX_NUM_ELEMENTS)
continue;
if (action < 0)
action = ACTION_DEFAULT;
- for (j=0; j < MAX_NUM_ELEMENTS; j++)
- if (strcmp(element_info[j].class_name,
- element_info[element_class].class_name) == 0)
- element_info[j].sound[action] = sound;
+ element_info[element].sound[action] = sound;
}
/* now set all '-1' values to element specific default values */
for (i=0; i<MAX_NUM_ELEMENTS; i++)
{
- int default_action_sound = element_info[i].sound[ACTION_DEFAULT];
-
for (act=0; act < NUM_ACTIONS; act++)
{
+ /* generic default action sound (defined by "[default]" directive) */
+ int default_action_sound = element_info[EL_DEFAULT].sound[act];
+
+ /* look for special default action sound (classic game specific) */
+ if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].sound[act] != -1)
+ default_action_sound = element_info[EL_BD_DEFAULT].sound[act];
+ if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].sound[act] != -1)
+ default_action_sound = element_info[EL_SP_DEFAULT].sound[act];
+ if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].sound[act] != -1)
+ default_action_sound = element_info[EL_SB_DEFAULT].sound[act];
+
+ /* look for element specific default sound (independent from action) */
+ if (element_info[i].sound[ACTION_DEFAULT] != -1)
+ default_action_sound = element_info[i].sound[ACTION_DEFAULT];
+
/* no sound for this specific action -- use default action sound */
if (element_info[i].sound[act] == -1)
element_info[i].sound[act] = default_action_sound;
InitSoundInfo(); /* sound properties mapping */
InitElementSoundInfo(); /* element game sound mapping */
-#if 1
- InitElementSoundInfo(); /* element game sound mapping */
-#endif
-
InitPlaySoundLevel(); /* internal game sound settings */
}
EL_SWITCHGATE_OPENING,
EL_SWITCHGATE_CLOSED,
EL_SWITCHGATE_CLOSING,
+#if 0
+ EL_SWITCHGATE_SWITCH_UP,
+ EL_SWITCHGATE_SWITCH_DOWN,
+#endif
EL_TIMEGATE_OPEN,
EL_TIMEGATE_OPENING,
EL_TIMEGATE_CLOSED,
EL_TIMEGATE_CLOSING,
+#if 0
+ EL_TIMEGATE_SWITCH,
+ EL_TIMEGATE_SWITCH_ACTIVE,
+#endif
EL_TUBE_ANY,
EL_TUBE_VERTICAL,
EL_TUBE_HORIZONTAL,
-1
};
- static int ep_can_smash_friends[] =
+ static int ep_can_smash_player[] =
{
EL_ROCK,
EL_BD_ROCK,
-1
};
- static int ep_can_smash_explosives[] =
+ static int ep_can_smash_everything[] =
{
EL_ROCK,
EL_BD_ROCK,
EL_INVISIBLE_WALL,
/* more than one murphy in a level results in an inactive clone */
EL_SP_MURPHY_CLONE,
+ /* runtime elements*/
+ EL_SP_DISK_RED_ACTIVE,
+ EL_SP_TERMINAL_ACTIVE,
+ EL_SP_BUGGY_BASE_ACTIVATING,
+ EL_SP_BUGGY_BASE_ACTIVE,
-1
};
{ ep_can_change, EP_CAN_CHANGE },
{ ep_can_move, EP_CAN_MOVE },
{ ep_can_fall, EP_CAN_FALL },
- { ep_can_smash_friends, EP_CAN_SMASH_FRIENDS },
+ { ep_can_smash_player, EP_CAN_SMASH_PLAYER },
{ ep_can_smash_enemies, EP_CAN_SMASH_ENEMIES },
- { ep_can_smash_explosives, EP_CAN_SMASH_EXPLOSIVES },
+ { ep_can_smash_everything, EP_CAN_SMASH_EVERYTHING },
{ ep_can_explode_by_fire, EP_CAN_EXPLODE_BY_FIRE },
{ ep_can_explode_smashed, EP_CAN_EXPLODE_SMASHED },
{ ep_can_explode_impact, EP_CAN_EXPLODE_IMPACT },
EP_DONT_COLLIDE_WITH,
EP_CAN_MOVE,
EP_CAN_FALL,
- EP_CAN_SMASH_FRIENDS,
+ EP_CAN_SMASH_PLAYER,
EP_CAN_SMASH_ENEMIES,
- EP_CAN_SMASH_EXPLOSIVES,
+ EP_CAN_SMASH_EVERYTHING,
EP_PUSHABLE,
EP_CAN_BE_CRUMBLED,
if (DONT_COLLIDE_WITH(i))
SET_PROPERTY(i, EP_DONT_RUN_INTO, TRUE);
- /* ---------- CAN_SMASH_ENEMIES / CAN_SMASH_FRIENDS ------------------ */
- if (CAN_SMASH_EXPLOSIVES(i))
+ /* ---------- CAN_SMASH_ENEMIES / CAN_SMASH_PLAYER ------------------- */
+ if (CAN_SMASH_EVERYTHING(i))
SET_PROPERTY(i, EP_CAN_SMASH_ENEMIES, TRUE);
if (CAN_SMASH_ENEMIES(i))
- SET_PROPERTY(i, EP_CAN_SMASH_FRIENDS, TRUE);
+ SET_PROPERTY(i, EP_CAN_SMASH_PLAYER, TRUE);
}
/* ---------- CAN_SMASH ------------------------------------------------ */
- SET_PROPERTY(i, EP_CAN_SMASH, (CAN_SMASH_FRIENDS(i) ||
+ SET_PROPERTY(i, EP_CAN_SMASH, (CAN_SMASH_PLAYER(i) ||
CAN_SMASH_ENEMIES(i) ||
- CAN_SMASH_EXPLOSIVES(i)));
+ CAN_SMASH_EVERYTHING(i)));
/* ---------- CAN_EXPLODE ---------------------------------------------- */
SET_PROPERTY(i, EP_CAN_EXPLODE, (CAN_EXPLODE_BY_FIRE(i) ||
engine_version > VERSION_IDENT(2,0,1)));
}
+#if 0
/* dynamically adjust element properties according to game engine version */
#if 0
if (engine_version < RELEASE_IDENT(2,2,0,7))
element_info[element].push_delay_random = 8;
}
}
+#endif
}
static void InitGlobal()
LoadArtworkInfo();
}
+static char *get_string_in_brackets(char *string)
+{
+ char *string_in_brackets = checked_malloc(strlen(string) + 3);
+
+ sprintf(string_in_brackets, "[%s]", string);
+
+ return string_in_brackets;
+}
+
+#if 0
static char *get_element_class_token(int element)
{
char *element_class_name = element_info[element].class_name;
return element_class_token;
}
+static char *get_action_class_token(int action)
+{
+ char *action_class_name = &element_action_info[action].suffix[1];
+ char *action_class_token = checked_malloc(strlen(action_class_name) + 3);
+
+ sprintf(action_class_token, "[%s]", action_class_name);
+
+ return action_class_token;
+}
+#endif
+
static void InitArtworkConfig()
{
static char *image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + 1];
- static char *sound_id_prefix[MAX_NUM_ELEMENTS + MAX_NUM_ELEMENTS + 1];
+ static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS + 1];
static char *action_id_suffix[NUM_ACTIONS + 1];
static char *direction_id_suffix[NUM_DIRECTIONS + 1];
static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1];
for (i=0; i<MAX_NUM_ELEMENTS; i++)
sound_id_prefix[i] = element_info[i].token_name;
for (i=0; i<MAX_NUM_ELEMENTS; i++)
- sound_id_prefix[MAX_NUM_ELEMENTS + i] = get_element_class_token(i);
- sound_id_prefix[MAX_NUM_ELEMENTS + MAX_NUM_ELEMENTS] = NULL;
+ sound_id_prefix[MAX_NUM_ELEMENTS + i] =
+ get_string_in_brackets(element_info[i].class_name);
+ sound_id_prefix[2 * MAX_NUM_ELEMENTS] = NULL;
for (i=0; i<NUM_ACTIONS; i++)
action_id_suffix[i] = element_action_info[i].suffix;