&li.android_clone_time, 10
},
{
- EL_EMC_ANDROID, -1,
+ EL_EMC_ANDROID, SAVE_CONF_NEVER,
TYPE_ELEMENT_LIST, CONF_VALUE_BYTES(1),
&li.android_clone_element[0], EL_EMPTY, NULL,
+ &li.num_android_clone_elements, 1, MAX_ANDROID_ELEMENTS_OLD
+ },
+ {
+ EL_EMC_ANDROID, -1,
+ TYPE_ELEMENT_LIST, CONF_VALUE_BYTES(2),
+ &li.android_clone_element[0], EL_EMPTY, NULL,
&li.num_android_clone_elements, 1, MAX_ANDROID_ELEMENTS
},
{ 2, 2 },
};
struct LevelInfo_EM *level_em = level->native_em_level;
- struct LEVEL *lev = level_em->lev;
- struct PLAYER **ply = level_em->ply;
+ struct CAVE *cav = level_em->cav;
int i, j, x, y;
- lev->width = MIN(level->fieldx, EM_MAX_CAVE_WIDTH);
- lev->height = MIN(level->fieldy, EM_MAX_CAVE_HEIGHT);
+ cav->width = MIN(level->fieldx, MAX_PLAYFIELD_WIDTH);
+ cav->height = MIN(level->fieldy, MAX_PLAYFIELD_HEIGHT);
- lev->time_seconds = level->time;
- lev->required_initial = level->gems_needed;
+ cav->time_seconds = level->time;
+ cav->gems_needed = level->gems_needed;
- lev->emerald_score = level->score[SC_EMERALD];
- lev->diamond_score = level->score[SC_DIAMOND];
- lev->alien_score = level->score[SC_ROBOT];
- lev->tank_score = level->score[SC_SPACESHIP];
- lev->bug_score = level->score[SC_BUG];
- lev->eater_score = level->score[SC_YAMYAM];
- lev->nut_score = level->score[SC_NUT];
- lev->dynamite_score = level->score[SC_DYNAMITE];
- lev->key_score = level->score[SC_KEY];
- lev->exit_score = level->score[SC_TIME_BONUS];
+ cav->emerald_score = level->score[SC_EMERALD];
+ cav->diamond_score = level->score[SC_DIAMOND];
+ cav->alien_score = level->score[SC_ROBOT];
+ cav->tank_score = level->score[SC_SPACESHIP];
+ cav->bug_score = level->score[SC_BUG];
+ cav->eater_score = level->score[SC_YAMYAM];
+ cav->nut_score = level->score[SC_NUT];
+ cav->dynamite_score = level->score[SC_DYNAMITE];
+ cav->key_score = level->score[SC_KEY];
+ cav->exit_score = level->score[SC_TIME_BONUS];
for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
for (y = 0; y < 3; y++)
for (x = 0; x < 3; x++)
- lev->eater_array[i][y * 3 + x] =
- map_element_RND_to_EM(level->yamyam_content[i].e[x][y]);
+ cav->eater_array[i][y * 3 + x] =
+ map_element_RND_to_EM_cave(level->yamyam_content[i].e[x][y]);
- lev->amoeba_time = level->amoeba_speed;
- lev->wonderwall_time_initial = level->time_magic_wall;
- lev->wheel_time = level->time_wheel;
+ cav->amoeba_time = level->amoeba_speed;
+ cav->wonderwall_time = level->time_magic_wall;
+ cav->wheel_time = level->time_wheel;
- lev->android_move_time = level->android_move_time;
- lev->android_clone_time = level->android_clone_time;
- lev->ball_random = level->ball_random;
- lev->ball_state_initial = level->ball_state_initial;
- lev->ball_time = level->ball_time;
- lev->num_ball_arrays = level->num_ball_contents;
+ cav->android_move_time = level->android_move_time;
+ cav->android_clone_time = level->android_clone_time;
+ cav->ball_random = level->ball_random;
+ cav->ball_state = level->ball_state_initial;
+ cav->ball_time = level->ball_time;
+ cav->num_ball_arrays = level->num_ball_contents;
- lev->lenses_score = level->lenses_score;
- lev->magnify_score = level->magnify_score;
- lev->slurp_score = level->slurp_score;
+ cav->lenses_score = level->lenses_score;
+ cav->magnify_score = level->magnify_score;
+ cav->slurp_score = level->slurp_score;
- lev->lenses_time = level->lenses_time;
- lev->magnify_time = level->magnify_time;
+ cav->lenses_time = level->lenses_time;
+ cav->magnify_time = level->magnify_time;
- lev->wind_direction_initial =
+ cav->wind_direction =
map_direction_RND_to_EM(level->wind_direction_initial);
- lev->wind_cnt_initial = (level->wind_direction_initial != MV_NONE ?
- lev->wind_time : 0);
+ cav->wind_cnt = (level->wind_direction_initial != MV_NONE ?
+ cav->wind_time : 0);
for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
for (j = 0; j < 8; j++)
- lev->ball_array[i][j] =
- map_element_RND_to_EM(level->
- ball_content[i].e[ball_xy[j][0]][ball_xy[j][1]]);
+ cav->ball_array[i][j] =
+ map_element_RND_to_EM_cave(level->ball_content[i].
+ e[ball_xy[j][0]][ball_xy[j][1]]);
map_android_clone_elements_RND_to_EM(level);
- // first fill the complete playfield with the default border element
+ // first fill the complete playfield with the empty space element
for (y = 0; y < EM_MAX_CAVE_HEIGHT; y++)
for (x = 0; x < EM_MAX_CAVE_WIDTH; x++)
- level_em->cave[x][y] = ZBORDER;
-
- if (BorderElement == EL_STEELWALL)
- {
- for (y = 0; y < lev->height + 2; y++)
- for (x = 0; x < lev->width + 2; x++)
- level_em->cave[x + 1][y + 1] = map_element_RND_to_EM(EL_STEELWALL);
- }
+ cav->cave[x][y] = Cblank;
// then copy the real level contents from level file into the playfield
- for (y = 0; y < lev->height; y++) for (x = 0; x < lev->width; x++)
+ for (y = 0; y < cav->height; y++) for (x = 0; x < cav->width; x++)
{
- int new_element = map_element_RND_to_EM(level->field[x][y]);
- int offset = (BorderElement == EL_STEELWALL ? 1 : 0);
- int xx = x + 1 + offset;
- int yy = y + 1 + offset;
+ int new_element = map_element_RND_to_EM_cave(level->field[x][y]);
if (level->field[x][y] == EL_AMOEBA_DEAD)
- new_element = map_element_RND_to_EM(EL_AMOEBA_WET);
+ new_element = map_element_RND_to_EM_cave(EL_AMOEBA_WET);
- level_em->cave[xx][yy] = new_element;
+ cav->cave[x][y] = new_element;
}
for (i = 0; i < MAX_PLAYERS; i++)
{
- ply[i]->x_initial = 0;
- ply[i]->y_initial = 0;
+ cav->player_x[i] = -1;
+ cav->player_y[i] = -1;
}
// initialize player positions and delete players from the playfield
- for (y = 0; y < lev->height; y++) for (x = 0; x < lev->width; x++)
+ for (y = 0; y < cav->height; y++) for (x = 0; x < cav->width; x++)
{
if (ELEM_IS_PLAYER(level->field[x][y]))
{
int player_nr = GET_PLAYER_NR(level->field[x][y]);
- int offset = (BorderElement == EL_STEELWALL ? 1 : 0);
- int xx = x + 1 + offset;
- int yy = y + 1 + offset;
- ply[player_nr]->x_initial = xx;
- ply[player_nr]->y_initial = yy;
+ cav->player_x[player_nr] = x;
+ cav->player_y[player_nr] = y;
- level_em->cave[xx][yy] = map_element_RND_to_EM(EL_EMPTY);
+ cav->cave[x][y] = map_element_RND_to_EM_cave(EL_EMPTY);
}
}
-
- if (BorderElement == EL_STEELWALL)
- {
- lev->width += 2;
- lev->height += 2;
- }
}
static void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
{ 2, 2 },
};
struct LevelInfo_EM *level_em = level->native_em_level;
- struct LEVEL *lev = level_em->lev;
- struct PLAYER **ply = level_em->ply;
+ struct CAVE *cav = level_em->cav;
int i, j, x, y;
- level->fieldx = MIN(lev->width, MAX_LEV_FIELDX);
- level->fieldy = MIN(lev->height, MAX_LEV_FIELDY);
+ level->fieldx = MIN(cav->width, MAX_LEV_FIELDX);
+ level->fieldy = MIN(cav->height, MAX_LEV_FIELDY);
- level->time = lev->time_seconds;
- level->gems_needed = lev->required_initial;
+ level->time = cav->time_seconds;
+ level->gems_needed = cav->gems_needed;
sprintf(level->name, "Level %d", level->file_info.nr);
- level->score[SC_EMERALD] = lev->emerald_score;
- level->score[SC_DIAMOND] = lev->diamond_score;
- level->score[SC_ROBOT] = lev->alien_score;
- level->score[SC_SPACESHIP] = lev->tank_score;
- level->score[SC_BUG] = lev->bug_score;
- level->score[SC_YAMYAM] = lev->eater_score;
- level->score[SC_NUT] = lev->nut_score;
- level->score[SC_DYNAMITE] = lev->dynamite_score;
- level->score[SC_KEY] = lev->key_score;
- level->score[SC_TIME_BONUS] = lev->exit_score;
+ level->score[SC_EMERALD] = cav->emerald_score;
+ level->score[SC_DIAMOND] = cav->diamond_score;
+ level->score[SC_ROBOT] = cav->alien_score;
+ level->score[SC_SPACESHIP] = cav->tank_score;
+ level->score[SC_BUG] = cav->bug_score;
+ level->score[SC_YAMYAM] = cav->eater_score;
+ level->score[SC_NUT] = cav->nut_score;
+ level->score[SC_DYNAMITE] = cav->dynamite_score;
+ level->score[SC_KEY] = cav->key_score;
+ level->score[SC_TIME_BONUS] = cav->exit_score;
level->num_yamyam_contents = MAX_ELEMENT_CONTENTS;
for (y = 0; y < 3; y++)
for (x = 0; x < 3; x++)
level->yamyam_content[i].e[x][y] =
- map_element_EM_to_RND(lev->eater_array[i][y * 3 + x]);
+ map_element_EM_to_RND_cave(cav->eater_array[i][y * 3 + x]);
- level->amoeba_speed = lev->amoeba_time;
- level->time_magic_wall = lev->wonderwall_time_initial;
- level->time_wheel = lev->wheel_time;
+ level->amoeba_speed = cav->amoeba_time;
+ level->time_magic_wall = cav->wonderwall_time;
+ level->time_wheel = cav->wheel_time;
- level->android_move_time = lev->android_move_time;
- level->android_clone_time = lev->android_clone_time;
- level->ball_random = lev->ball_random;
- level->ball_state_initial = lev->ball_state_initial;
- level->ball_time = lev->ball_time;
- level->num_ball_contents = lev->num_ball_arrays;
+ level->android_move_time = cav->android_move_time;
+ level->android_clone_time = cav->android_clone_time;
+ level->ball_random = cav->ball_random;
+ level->ball_state_initial = cav->ball_state;
+ level->ball_time = cav->ball_time;
+ level->num_ball_contents = cav->num_ball_arrays;
- level->lenses_score = lev->lenses_score;
- level->magnify_score = lev->magnify_score;
- level->slurp_score = lev->slurp_score;
+ level->lenses_score = cav->lenses_score;
+ level->magnify_score = cav->magnify_score;
+ level->slurp_score = cav->slurp_score;
- level->lenses_time = lev->lenses_time;
- level->magnify_time = lev->magnify_time;
+ level->lenses_time = cav->lenses_time;
+ level->magnify_time = cav->magnify_time;
level->wind_direction_initial =
- map_direction_EM_to_RND(lev->wind_direction_initial);
+ map_direction_EM_to_RND(cav->wind_direction);
for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
for (j = 0; j < 8; j++)
level->ball_content[i].e[ball_xy[j][0]][ball_xy[j][1]] =
- map_element_EM_to_RND(lev->ball_array[i][j]);
+ map_element_EM_to_RND_cave(cav->ball_array[i][j]);
map_android_clone_elements_EM_to_RND(level);
// convert the playfield (some elements need special treatment)
for (y = 0; y < level->fieldy; y++) for (x = 0; x < level->fieldx; x++)
{
- int new_element = map_element_EM_to_RND(level_em->cave[x + 1][y + 1]);
+ int new_element = map_element_EM_to_RND_cave(cav->cave[x][y]);
if (new_element == EL_AMOEBA_WET && level->amoeba_speed == 0)
new_element = EL_AMOEBA_DEAD;
{
// in case of all players set to the same field, use the first player
int nr = MAX_PLAYERS - i - 1;
- int jx = ply[nr]->x_initial - 1;
- int jy = ply[nr]->y_initial - 1;
+ int jx = cav->player_x[nr];
+ int jy = cav->player_y[nr];
if (jx != -1 && jy != -1)
level->field[jx][jy] = EL_PLAYER_1 + nr;
TYPE_SWITCH,
&setup.scroll_delay, "scroll_delay"
},
+ {
+ TYPE_SWITCH,
+ &setup.forced_scroll_delay, "forced_scroll_delay"
+ },
{
TYPE_INTEGER,
&setup.scroll_delay_value, "scroll_delay_value"
TYPE_BOOLEAN,
&setup.internal.show_scaling_in_title, "show_scaling_in_title"
},
+ {
+ TYPE_BOOLEAN,
+ &setup.internal.create_user_levelset, "create_user_levelset"
+ },
{
TYPE_BOOLEAN,
&setup.internal.menu_game, "menu_game"
si->sound_simple = TRUE;
si->toons = TRUE;
si->scroll_delay = TRUE;
+ si->forced_scroll_delay = FALSE;
si->scroll_delay_value = STD_SCROLL_DELAY;
si->engine_snapshot_mode = getStringCopy(STR_SNAPSHOT_MODE_DEFAULT);
si->engine_snapshot_memory = SNAPSHOT_MEMORY_DEFAULT;
si->internal.default_level_series = getStringCopy(UNDEFINED_LEVELSET);
si->internal.choose_from_top_leveldir = FALSE;
si->internal.show_scaling_in_title = TRUE;
+ si->internal.create_user_levelset = TRUE;
si->internal.default_window_width = WIN_XSIZE_DEFAULT;
si->internal.default_window_height = WIN_YSIZE_DEFAULT;
string_has_parameter(s, "self"))
event_value |= ANIM_EVENT_SELF;
+ if (string_has_parameter(s, "unclick:any"))
+ event_value |= ANIM_EVENT_UNCLICK_ANY;
+
// if animation event found, add it to global animation event list
if (event_value != ANIM_EVENT_NONE)
list_pos = AddGlobalAnimEventValue(list_pos, event_value);
{
result = get_anim_parameter_values(value);
}
- else if (strEqual(suffix, ".init_event_action") ||
+ else if (strEqual(suffix, ".init_delay_action") ||
+ strEqual(suffix, ".anim_delay_action") ||
+ strEqual(suffix, ".post_delay_action") ||
+ strEqual(suffix, ".init_event_action") ||
strEqual(suffix, ".anim_event_action"))
{
result = get_anim_action_parameter_value(value_raw);
string_has_parameter(value, "curtain") ? FADE_MODE_CURTAIN :
FADE_MODE_DEFAULT);
}
+ else if (strEqual(suffix, ".auto_delay_unit"))
+ {
+ result = (string_has_parameter(value, "ms") ? AUTO_DELAY_UNIT_MS :
+ string_has_parameter(value, "frames") ? AUTO_DELAY_UNIT_FRAMES :
+ AUTO_DELAY_UNIT_DEFAULT);
+ }
else if (strPrefix(suffix, ".font")) // (may also be ".font_xyz")
{
result = gfx.get_font_from_token_function(value);
title_initial_first_default.post_delay;
titlescreen_initial_first_default.auto_delay =
title_initial_first_default.auto_delay;
+ titlescreen_initial_first_default.auto_delay_unit =
+ title_initial_first_default.auto_delay_unit;
titlescreen_first_default.fade_mode = title_first_default.fade_mode;
titlescreen_first_default.fade_delay = title_first_default.fade_delay;
titlescreen_first_default.post_delay = title_first_default.post_delay;
titlescreen_first_default.auto_delay = title_first_default.auto_delay;
+ titlescreen_first_default.auto_delay_unit =
+ title_first_default.auto_delay_unit;
titlemessage_initial_first_default.fade_mode =
title_initial_first_default.fade_mode;
titlemessage_initial_first_default.fade_delay =
title_initial_first_default.post_delay;
titlemessage_initial_first_default.auto_delay =
title_initial_first_default.auto_delay;
+ titlemessage_initial_first_default.auto_delay_unit =
+ title_initial_first_default.auto_delay_unit;
titlemessage_first_default.fade_mode = title_first_default.fade_mode;
titlemessage_first_default.fade_delay = title_first_default.fade_delay;
titlemessage_first_default.post_delay = title_first_default.post_delay;
titlemessage_first_default.auto_delay = title_first_default.auto_delay;
+ titlemessage_first_default.auto_delay_unit =
+ title_first_default.auto_delay_unit;
titlescreen_initial_default.fade_mode = title_initial_default.fade_mode;
titlescreen_initial_default.fade_delay = title_initial_default.fade_delay;
titlescreen_initial_default.post_delay = title_initial_default.post_delay;
titlescreen_initial_default.auto_delay = title_initial_default.auto_delay;
+ titlescreen_initial_default.auto_delay_unit =
+ title_initial_default.auto_delay_unit;
titlescreen_default.fade_mode = title_default.fade_mode;
titlescreen_default.fade_delay = title_default.fade_delay;
titlescreen_default.post_delay = title_default.post_delay;
titlescreen_default.auto_delay = title_default.auto_delay;
+ titlescreen_default.auto_delay_unit = title_default.auto_delay_unit;
titlemessage_initial_default.fade_mode = title_initial_default.fade_mode;
titlemessage_initial_default.fade_delay = title_initial_default.fade_delay;
titlemessage_initial_default.post_delay = title_initial_default.post_delay;
- titlemessage_initial_default.auto_delay = title_initial_default.auto_delay;
+ titlemessage_initial_default.auto_delay_unit =
+ title_initial_default.auto_delay_unit;
titlemessage_default.fade_mode = title_default.fade_mode;
titlemessage_default.fade_delay = title_default.fade_delay;
titlemessage_default.post_delay = title_default.post_delay;
titlemessage_default.auto_delay = title_default.auto_delay;
+ titlemessage_default.auto_delay_unit = title_default.auto_delay_unit;
// special case: initialize "ARG_DEFAULT" values in static default config
// (e.g., init "titlemessage_1.fade_mode" from "[titlemessage].fade_mode")
{ TYPE_INTEGER, &tfi.fade_delay, ".fade_delay" },
{ TYPE_INTEGER, &tfi.post_delay, ".post_delay" },
{ TYPE_INTEGER, &tfi.auto_delay, ".auto_delay" },
+ { TYPE_INTEGER, &tfi.auto_delay_unit, ".auto_delay_unit" },
{ -1, NULL, NULL }
};
{ TYPE_INTEGER, &tmi.fade_delay, ".fade_delay" },
{ TYPE_INTEGER, &tmi.post_delay, ".post_delay" },
{ TYPE_INTEGER, &tmi.auto_delay, ".auto_delay" },
+ { TYPE_INTEGER, &tmi.auto_delay_unit, ".auto_delay_unit" },
{ -1, NULL, NULL }
};