From a090db4b7fe71e37e0873111498a7b379b847995 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Thu, 23 Feb 2023 19:06:59 +0100 Subject: [PATCH] added option to explode gray ball instead of melting for MM engine --- src/editor.c | 10 ++++++++++ src/files.c | 7 +++++++ src/game_mm/export.h | 1 + src/game_mm/mm_game.c | 14 +++++++++++--- src/main.h | 1 + 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/editor.c b/src/editor.c index 8d8d9c62..10ff5a7f 100644 --- a/src/editor.c +++ b/src/editor.c @@ -688,6 +688,7 @@ enum GADGET_ID_DF_LASER_GREEN, GADGET_ID_DF_LASER_BLUE, GADGET_ID_ROTATE_MM_BALL_CONTENT, + GADGET_ID_EXPLODE_MM_BALL, GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_CUSTOM_EXPLODE_FIRE, @@ -1002,6 +1003,7 @@ enum ED_CHECKBUTTON_ID_DF_LASER_GREEN, ED_CHECKBUTTON_ID_DF_LASER_BLUE, ED_CHECKBUTTON_ID_ROTATE_MM_BALL_CONTENT, + ED_CHECKBUTTON_ID_EXPLODE_MM_BALL, ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC, ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1, ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE, @@ -3387,6 +3389,13 @@ static struct NULL, NULL, "randomly rotate created content", "randomly rotate newly created content" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), + GADGET_ID_EXPLODE_MM_BALL, GADGET_ID_NONE, + &level.explode_mm_ball, + NULL, NULL, + "explode ball instead of melting", "use explosion to release ball content" + }, // ---------- element settings: configure 1 (custom elements) --------------- @@ -10148,6 +10157,7 @@ static void DrawPropertiesConfig(void) MapCounterButtons(ED_COUNTER_ID_MM_BALL_CONTENT); MapSelectboxGadget(ED_SELECTBOX_ID_MM_BALL_CHOICE_MODE); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_ROTATE_MM_BALL_CONTENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EXPLODE_MM_BALL); DrawMMBallContentArea(); } diff --git a/src/files.c b/src/files.c index bd631a46..6a4c5f62 100644 --- a/src/files.c +++ b/src/files.c @@ -926,6 +926,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_BOOLEAN, CONF_VALUE_8_BIT(1), &li.rotate_mm_ball_content, TRUE }, + { + EL_MM_GRAY_BALL, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(2), + &li.explode_mm_ball, FALSE + }, { EL_MM_STEEL_BLOCK, -1, @@ -4192,6 +4197,7 @@ static void CopyNativeLevel_RND_to_MM(struct LevelInfo *level) level_mm->num_ball_contents = level->num_mm_ball_contents; level_mm->ball_choice_mode = level->mm_ball_choice_mode; level_mm->rotate_ball_content = level->rotate_mm_ball_content; + level_mm->explode_ball = level->explode_mm_ball; for (i = 0; i < level->num_mm_ball_contents; i++) level_mm->ball_content[i] = @@ -4244,6 +4250,7 @@ static void CopyNativeLevel_MM_to_RND(struct LevelInfo *level) level->num_mm_ball_contents = level_mm->num_ball_contents; level->mm_ball_choice_mode = level_mm->ball_choice_mode; level->rotate_mm_ball_content = level_mm->rotate_ball_content; + level->explode_mm_ball = level_mm->explode_ball; for (i = 0; i < level->num_mm_ball_contents; i++) level->mm_ball_content[i] = diff --git a/src/game_mm/export.h b/src/game_mm/export.h index 7f31d68c..1cbf0b6a 100644 --- a/src/game_mm/export.h +++ b/src/game_mm/export.h @@ -180,6 +180,7 @@ struct LevelInfo_MM int ball_choice_mode; int ball_content[MM_MAX_BALL_CONTENTS]; boolean rotate_ball_content; + boolean explode_ball; short field[MAX_PLAYFIELD_WIDTH][MAX_PLAYFIELD_HEIGHT]; }; diff --git a/src/game_mm/mm_game.c b/src/game_mm/mm_game.c index cda5e6ae..78f0f954 100644 --- a/src/game_mm/mm_game.c +++ b/src/game_mm/mm_game.c @@ -2727,12 +2727,14 @@ static void Explode_MM(int x, int y, int phase, int mode) Tile[x][y] = center_element; } - Store[x][y] = EL_EMPTY; + if (center_element != EL_GRAY_BALL_ACTIVE) + Store[x][y] = EL_EMPTY; Store2[x][y] = center_element; Tile[x][y] = EL_EXPLODING_OPAQUE; GfxElement[x][y] = (center_element == EL_BOMB_ACTIVE ? EL_BOMB : + center_element == EL_GRAY_BALL_ACTIVE ? EL_GRAY_BALL : IS_MCDUFFIN(center_element) ? EL_MCDUFFIN : center_element); @@ -2783,6 +2785,9 @@ static void Explode_MM(int x, int y, int phase, int mode) InitField(x, y, FALSE); DrawField_MM(x, y); + + if (center_element == EL_GRAY_BALL_ACTIVE) + ScanLaser_FromLastMirror(); } else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) { @@ -3497,9 +3502,12 @@ static void GameActions_MM_Ext(void) Store2[ELX][ELY] = TRUE; } - Tile[ELX][ELY] = EL_GRAY_BALL_OPENING; + if (native_mm_level.explode_ball) + Bang_MM(ELX, ELY); + else + Tile[ELX][ELY] = EL_GRAY_BALL_OPENING; - laser.dest_element_last = Tile[ELX][ELY]; + laser.dest_element = laser.dest_element_last = Tile[ELX][ELY]; return; } diff --git a/src/main.h b/src/main.h index 26e0570a..bd672e76 100644 --- a/src/main.h +++ b/src/main.h @@ -3312,6 +3312,7 @@ struct LevelInfo int mm_ball_choice_mode; int mm_ball_content[MAX_MM_BALL_CONTENTS]; boolean rotate_mm_ball_content; + boolean explode_mm_ball; // ('int' instead of 'boolean' because used as selectbox value in editor) int use_step_counter; // count steps instead of seconds for level -- 2.34.1