GADGET_ID_BD_DIAGONAL_MOVEMENTS,
GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+ GADGET_ID_BD_MAGIC_WALL_ZERO_INFINITE,
GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING,
GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+ ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE,
ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
"Mega rocks pushable with sweet", "Push mega rocks after eating sweet"
},
{
- ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+ ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE,
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ GADGET_ID_BD_MAGIC_WALL_ZERO_INFINITE, GADGET_ID_NONE,
+ &level.bd_magic_wall_zero_infinite,
+ NULL, NULL,
+ "Run forever if duration is zero", "Run infinitely if timer is zero"
+ },
+ {
+ ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING, GADGET_ID_NONE,
&level.bd_magic_wall_wait_hatching,
NULL, NULL,
},
{
ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA, GADGET_ID_NONE,
&level.bd_magic_wall_stops_amoeba,
NULL, NULL,
{
ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(4),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(5),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO, GADGET_ID_NONE,
&level.bd_magic_wall_diamond_to, 1, 1,
},
{
ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(5),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_ROCK_TO, GADGET_ID_NONE,
&level.bd_magic_wall_rock_to, 1, 1,
},
{
ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(7),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_MEGA_ROCK_TO, GADGET_ID_NONE,
&level.bd_magic_wall_mega_rock_to, 1, 1,
},
{
ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(7),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(8),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_NUT_TO, GADGET_ID_NONE,
&level.bd_magic_wall_nut_to, 1, 1,
},
{
ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(8),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(9),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO, GADGET_ID_NONE,
&level.bd_magic_wall_nitro_pack_to, 1, 1,
},
{
ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(9),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(10),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, GADGET_ID_NONE,
&level.bd_magic_wall_flying_diamond_to, 1, 1,
},
{
ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
- ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(10),
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(11),
ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF,
GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO, GADGET_ID_NONE,
&level.bd_magic_wall_flying_rock_to, 1, 1,
// draw stickybutton gadget
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA);
TYPE_BOOLEAN, CONF_VALUE_8_BIT(2),
&li.bd_magic_wall_stops_amoeba, TRUE
},
+ {
+ EL_BD_MAGIC_WALL, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(3),
+ &li.bd_magic_wall_zero_infinite, TRUE
+ },
{
EL_BD_MAGIC_WALL, -1,
TYPE_ELEMENT, CONF_VALUE_16_BIT(1),
cave->voodoo_disappear_in_explosion = level->bd_voodoo_vanish_by_explosion;
cave->level_penalty_time[0] = level->bd_voodoo_penalty_time;
cave->level_magic_wall_time[0] = level->time_magic_wall;
+ cave->magic_timer_zero_is_infinite = level->bd_magic_wall_zero_infinite;
cave->magic_timer_wait_for_hatching = level->bd_magic_wall_wait_hatching;
cave->magic_wall_stops_amoeba = level->bd_magic_wall_stops_amoeba;
level->bd_voodoo_vanish_by_explosion = cave->voodoo_disappear_in_explosion;
level->bd_voodoo_penalty_time = cave->level_penalty_time[bd_level_nr];
level->time_magic_wall = cave->level_magic_wall_time[bd_level_nr];
+ level->bd_magic_wall_zero_infinite = cave->magic_timer_zero_is_infinite;
level->bd_magic_wall_wait_hatching = cave->magic_timer_wait_for_hatching;
level->bd_magic_wall_stops_amoeba = cave->magic_wall_stops_amoeba;
{CAVE_OFFSET(intermission_instantlife), TRUE},
{CAVE_OFFSET(intermission_rewardlife), FALSE},
{CAVE_OFFSET(magic_wall_stops_amoeba), TRUE},
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), TRUE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), FALSE},
{CAVE_OFFSET(pushing_stone_prob), 250000},
{CAVE_OFFSET(pushing_stone_prob_sweet), 1000000},
{CAVE_OFFSET(intermission_instantlife), TRUE},
{CAVE_OFFSET(intermission_rewardlife), FALSE},
{CAVE_OFFSET(magic_wall_stops_amoeba), FALSE}, // marek roth bd inside faq 3.0
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), TRUE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), FALSE},
{CAVE_OFFSET(pushing_stone_prob), 250000},
{CAVE_OFFSET(pushing_stone_prob_sweet), 1000000},
{CAVE_OFFSET(intermission_instantlife), TRUE},
{CAVE_OFFSET(intermission_rewardlife), FALSE},
{CAVE_OFFSET(magic_wall_stops_amoeba), FALSE},
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), TRUE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), FALSE},
{CAVE_OFFSET(pushing_stone_prob), 250000},
{CAVE_OFFSET(pushing_stone_prob_sweet), 1000000},
{CAVE_OFFSET(level_hatching_delay_time[0]), 2},
{CAVE_OFFSET(intermission_instantlife), FALSE},
{CAVE_OFFSET(intermission_rewardlife), TRUE},
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), TRUE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), TRUE},
{CAVE_OFFSET(pushing_stone_prob), 250000},
{CAVE_OFFSET(pushing_stone_prob_sweet), 1000000},
{CAVE_OFFSET(level_hatching_delay_time[0]), 2},
{CAVE_OFFSET(intermission_instantlife), FALSE},
{CAVE_OFFSET(intermission_rewardlife), TRUE},
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), FALSE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), TRUE},
{CAVE_OFFSET(pushing_stone_prob), 250000},
{CAVE_OFFSET(pushing_stone_prob_sweet), 1000000},
{CAVE_OFFSET(level_hatching_delay_time[0]), 2},
{CAVE_OFFSET(intermission_instantlife), FALSE},
{CAVE_OFFSET(intermission_rewardlife), TRUE},
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), FALSE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), TRUE},
{CAVE_OFFSET(pushing_stone_prob), 250000},
{CAVE_OFFSET(pushing_stone_prob_sweet), 1000000},
int level_magic_wall_time[5]; // magic wall 'on' state for each level (seconds)
boolean magic_wall_stops_amoeba; // Turning on magic wall changes amoeba to diamonds.
// Original BD: yes, constkit: no
+ boolean magic_timer_zero_is_infinite; // magic wall timer 0 is interpreted as infinite
boolean magic_timer_wait_for_hatching;// magic wall timer does not start before player's birth
boolean magic_wall_sound; // magic wall has sound
{"", GD_TAB, 0, N_("Magic Wall")},
{"", GD_LABEL, GD_SHOW_LEVEL_LABEL, N_("Timing")},
{"MagicWallTime", GD_TYPE_INT, 0, N_("Milling time (s)"), CAVE_OFFSET(level_magic_wall_time), 5, N_("Magic wall will stop after this time, and it cannot be activated again."), 0, 999},
+ {"MagicWallProperties.zeroisinfinite", GD_TYPE_BOOLEAN, 0, N_("Milling time 0 is infinite"), CAVE_OFFSET(magic_timer_zero_is_infinite), 1, N_("This determines if the magic wall timer 0 is interpreted as infinite.")},
{"MagicWallProperties.waitforhatching", GD_TYPE_BOOLEAN, 0, N_("Timer waits for hatching"), CAVE_OFFSET(magic_timer_wait_for_hatching), 1, N_("This determines if the magic wall timer starts before the player appearing. Magic can always be activated before that; but if this is set to true, the timer will not start.")},
{"MagicWallProperties.convertamoeba", GD_TYPE_BOOLEAN, 0, N_("Stops amoeba"), CAVE_OFFSET(magic_wall_stops_amoeba), 1, N_("When the magic wall is activated, it can convert amoeba into diamonds.")},
{"", GD_LABEL, 0, N_("Conversions")},
{CAVE_OFFSET(magic_flying_stone_to), O_FLYING_DIAMOND_F},
{CAVE_OFFSET(magic_flying_diamond_to), O_FLYING_STONE_F},
{CAVE_OFFSET(magic_wall_stops_amoeba), TRUE},
+ {CAVE_OFFSET(magic_timer_zero_is_infinite), TRUE},
{CAVE_OFFSET(magic_timer_wait_for_hatching), FALSE},
// amoeba
// magic wall; if active&wait or not wait for hatching
if (cave->magic_wall_state == GD_MW_ACTIVE &&
- (cave->hatched || !cave->magic_timer_wait_for_hatching))
+ (cave->hatched || !cave->magic_timer_wait_for_hatching) &&
+ !(cave->magic_wall_time == 0 && cave->magic_timer_zero_is_infinite))
{
cave->magic_wall_time -= cave->speed;
if (cave->magic_wall_time < 0)
int bd_pushing_prob; // BD player probability to push rocks
int bd_pushing_prob_with_sweet; // BD player probability to push rocks after eating sweet
boolean bd_push_mega_rock_with_sweet; // BD player can push mega rocks after eating sweet
+ boolean bd_magic_wall_zero_infinite; // BD magic wall with timer of zero runs infinitely
boolean bd_magic_wall_wait_hatching; // BD magic wall waits for player's birth
boolean bd_magic_wall_stops_amoeba; // BD magic wall can stop amoeba and turn to diamonds
int bd_magic_wall_diamond_to; // BD magic wall turns diamonds to specified element