From f5548497f854106cbd0aec58642649c94d91f6e3 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Wed, 20 Jan 2021 00:35:08 +0100 Subject: [PATCH] added step delay option to custom element movement configuration --- src/editor.c | 56 +++++++++++++++++++++++++++++++++++++--------------- src/files.c | 12 +++++++++++ src/game.c | 32 +++++++++++++++++++++++++++--- src/main.h | 2 ++ 4 files changed, 83 insertions(+), 19 deletions(-) diff --git a/src/editor.c b/src/editor.c index 226fd56d..24590595 100644 --- a/src/editor.c +++ b/src/editor.c @@ -489,6 +489,12 @@ enum GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_TEXT, GADGET_ID_MOVE_DELAY_RND_UP, + GADGET_ID_STEP_DELAY_FIX_DOWN, + GADGET_ID_STEP_DELAY_FIX_TEXT, + GADGET_ID_STEP_DELAY_FIX_UP, + GADGET_ID_STEP_DELAY_RND_DOWN, + GADGET_ID_STEP_DELAY_RND_TEXT, + GADGET_ID_STEP_DELAY_RND_UP, GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_EXPLOSION_DELAY_UP, @@ -752,6 +758,8 @@ enum ED_COUNTER_ID_DROP_DELAY_RND, ED_COUNTER_ID_MOVE_DELAY_FIX, ED_COUNTER_ID_MOVE_DELAY_RND, + ED_COUNTER_ID_STEP_DELAY_FIX, + ED_COUNTER_ID_STEP_DELAY_RND, ED_COUNTER_ID_EXPLOSION_DELAY, ED_COUNTER_ID_IGNITION_DELAY, ED_COUNTER_ID_GROUP_CONTENT, @@ -1608,7 +1616,23 @@ static struct NULL, "+random", NULL }, { - ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12), + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(6), + 0, 999, + GADGET_ID_STEP_DELAY_FIX_DOWN, GADGET_ID_STEP_DELAY_FIX_UP, + GADGET_ID_STEP_DELAY_FIX_TEXT, GADGET_ID_NONE, + &custom_element.step_delay_fixed, + NULL, "step delay", NULL + }, + { + -1, ED_ELEMENT_SETTINGS_YPOS(6), + 0, 999, + GADGET_ID_STEP_DELAY_RND_DOWN, GADGET_ID_STEP_DELAY_RND_UP, + GADGET_ID_STEP_DELAY_RND_TEXT, GADGET_ID_STEP_DELAY_FIX_UP, + &custom_element.step_delay_random, + NULL, "+random", NULL + }, + { + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13), 0, 999, GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP, GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_NONE, @@ -1616,7 +1640,7 @@ static struct NULL, "explosion delay", NULL }, { - ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13), + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14), 0, 999, GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP, GADGET_ID_IGNITION_DELAY_TEXT, GADGET_ID_NONE, @@ -2602,7 +2626,7 @@ static struct NULL, " can", ":", "leave behind or change element" }, { - -1, ED_ELEMENT_SETTINGS_YPOS(7), + -1, ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH, -1, options_smash_targets, @@ -2610,7 +2634,7 @@ static struct NULL, "can smash", NULL, "elements that can be smashed" }, { - ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8), + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE, -1, options_slippery_type, @@ -2618,7 +2642,7 @@ static struct NULL, "slippery", NULL, "where other elements fall down" }, { - ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9), + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE, -1, options_deadliness, @@ -2626,7 +2650,7 @@ static struct NULL, "deadly when", NULL, "deadliness of element" }, { - ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(10), + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_EXPLOSION_TYPE, GADGET_ID_NONE, -1, options_explosion_type, @@ -3368,56 +3392,56 @@ static struct NULL, "element can move with some pattern" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE, &custom_element_properties[EP_CAN_FALL], NULL, NULL, "can fall", "element can fall down" }, { - -1, ED_ELEMENT_SETTINGS_YPOS(7), + -1, ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL, &custom_element_properties[EP_CAN_SMASH], NULL, " ", NULL, "element can smash other elements" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, &custom_element_properties[EP_SLIPPERY], NULL, NULL, NULL, "other elements can fall down from it" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE, &custom_element_properties[EP_DEADLY], NULL, NULL, NULL, "element can kill the player" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE, &custom_element_properties[EP_CAN_EXPLODE], NULL, NULL, NULL, "element can explode" }, { - ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11), + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE, &custom_element_properties[EP_EXPLODES_BY_FIRE], NULL, NULL, "by fire", "element can explode by fire/explosion" }, { - -1, ED_ELEMENT_SETTINGS_YPOS(11), + -1, ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE, &custom_element_properties[EP_EXPLODES_SMASHED], NULL, " ", "smashed", "element can explode when smashed" }, { - -1, ED_ELEMENT_SETTINGS_YPOS(11), + -1, ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH, &custom_element_properties[EP_EXPLODES_IMPACT], NULL, " ", @@ -3708,7 +3732,7 @@ static struct // ---------- custom content (when exploding) ------------------------------- { - -1, ED_AREA_3X3_SETTINGS_YPOS(10), + -1, ED_AREA_3X3_SETTINGS_YPOS(11), 0, ED_AREA_3X3_SETTINGS_YOFF, GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, // align three rows &custom_element.content.e[0][0], 3, 3, @@ -10035,7 +10059,7 @@ static void DrawPropertiesConfig(void) checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].x = ED_ELEMENT_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0); checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y = - ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 : + ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 7 : IS_BALLOON_ELEMENT(properties_element) || HAS_EDITOR_CONTENT(properties_element) ? 1 : 0); diff --git a/src/files.c b/src/files.c index 409ede25..39c0321a 100644 --- a/src/files.c +++ b/src/files.c @@ -1075,6 +1075,18 @@ static struct LevelFileConfigInfo chunk_config_CUSX_base[] = &xx_ei.move_delay_random, 0, &yy_ei.move_delay_random }, + { + -1, -1, + TYPE_INTEGER, CONF_VALUE_16_BIT(16), + &xx_ei.step_delay_fixed, 0, + &yy_ei.step_delay_fixed + }, + { + -1, -1, + TYPE_INTEGER, CONF_VALUE_16_BIT(17), + &xx_ei.step_delay_random, 0, + &yy_ei.step_delay_random + }, { -1, -1, diff --git a/src/game.c b/src/game.c index 4c428875..b1498dc8 100644 --- a/src/game.c +++ b/src/game.c @@ -879,6 +879,10 @@ static struct GamePanelControlInfo game_panel_controls[] = RND(element_info[e].move_delay_random)) #define GET_MAX_MOVE_DELAY(e) ( (element_info[e].move_delay_fixed) + \ (element_info[e].move_delay_random)) +#define GET_NEW_STEP_DELAY(e) ( (element_info[e].step_delay_fixed) + \ + RND(element_info[e].step_delay_random)) +#define GET_MAX_STEP_DELAY(e) ( (element_info[e].step_delay_fixed) + \ + (element_info[e].step_delay_random)) #define GET_NEW_CE_VALUE(e) ( (element_info[e].ce_value_fixed_initial) +\ RND(element_info[e].ce_value_random_initial)) #define GET_CE_SCORE(e) ( (element_info[e].collect_score)) @@ -8505,11 +8509,33 @@ void ContinueMoving(int x, int y) boolean pushed_by_player = (Pushed[x][y] && IS_PLAYER(x, y)); boolean pushed_by_conveyor = (Pushed[x][y] && !IS_PLAYER(x, y)); boolean last_line = (newy == lev_fieldy - 1); + boolean use_step_delay = (GET_MAX_STEP_DELAY(element) != 0); - MovPos[x][y] += getElementMoveStepsize(x, y); - - if (pushed_by_player) // special case: moving object pushed by player + if (pushed_by_player) // special case: moving object pushed by player + { MovPos[x][y] = SIGN(MovPos[x][y]) * (TILEX - ABS(PLAYERINFO(x,y)->MovPos)); + } + else if (use_step_delay) // special case: moving object has step delay + { + if (!MovDelay[x][y]) + MovPos[x][y] += getElementMoveStepsize(x, y); + + if (MovDelay[x][y]) + MovDelay[x][y]--; + else + MovDelay[x][y] = GET_NEW_STEP_DELAY(element); + + if (MovDelay[x][y]) + { + TEST_DrawLevelField(x, y); + + return; // element is still waiting + } + } + else // normal case: generically moving object + { + MovPos[x][y] += getElementMoveStepsize(x, y); + } if (ABS(MovPos[x][y]) < TILEX) { diff --git a/src/main.h b/src/main.h index 3a421454..9c669ca6 100644 --- a/src/main.h +++ b/src/main.h @@ -3397,6 +3397,8 @@ struct ElementInfo int drop_delay_random; // additional random delay after dropping int move_delay_fixed; // constant delay after moving int move_delay_random; // additional random delay after moving + int step_delay_fixed; // constant delay while moving + int step_delay_random; // additional random delay while moving int move_pattern; // direction movable element moves to int move_direction_initial; // initial direction element moves to -- 2.34.1