[Scummvm-git-logs] scummvm master -> 4123a7ef712a68d991b51de24ce66f6263e814cf

dreammaster noreply at scummvm.org
Tue Jun 23 07:06:08 UTC 2026


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
512b2c929c MADS: FOREST: Implementing game dialogs
b33af842da MADS: FOREST: Clicking on door icon opens game menu
4123a7ef71 MADS: FOREST: Fix ADPCM type for digital playback


Commit: 512b2c929cbbb7af22748a85cb123c69dd52ead8
    https://github.com/scummvm/scummvm/commit/512b2c929cbbb7af22748a85cb123c69dd52ead8
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-06-23T16:26:33+10:00

Commit Message:
MADS: FOREST: Implementing game dialogs

Changed paths:
    engines/mads/detection_tables.h
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/forest/mads/quotes.h
    engines/mads/madsv2/forest/menus.cpp
    engines/mads/madsv2/forest/midi.cpp
    engines/mads/madsv2/forest/midi.h


diff --git a/engines/mads/detection_tables.h b/engines/mads/detection_tables.h
index fb4e4d042eb..d81ce0cd201 100644
--- a/engines/mads/detection_tables.h
+++ b/engines/mads/detection_tables.h
@@ -262,7 +262,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::EN_ANY,
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE,
-			GUIO1(GAMEOPTION_EASY_MOUSE)
+			GUIO1(GAMEOPTION_ORIGINAL_SAVELOAD)
 		},
 		GType_Forest,
 		0
diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index 610549274bb..97819ba08b4 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1036,7 +1036,7 @@ int game_parse_keystroke(int mykey) {
 		break;
 
 	case f4_key:
-		// kernel.activate_menu = GAME_SCORE_MENU;
+		kernel.activate_menu = GAME_OPTIONS_MENU;
 		break;
 
 	case f5_key:
diff --git a/engines/mads/madsv2/forest/mads/quotes.h b/engines/mads/madsv2/forest/mads/quotes.h
index 65cadc2ddbf..483cb3d2a0c 100644
--- a/engines/mads/madsv2/forest/mads/quotes.h
+++ b/engines/mads/madsv2/forest/mads/quotes.h
@@ -28,7 +28,33 @@ namespace MADS {
 namespace MADSV2 {
 namespace Forest {
 
-//enum {};
+enum {
+	quote_menu_done          = 1,
+	quote_menu_cancel        = 2,
+	quote_menu_save          = 3,
+	quote_menu_restore       = 4,
+	quote_menu_clear         = 5,
+	quote_menu_ok            = 8,
+	quote_menu_empty         = 9,
+	quote_menu_unnamed       = 10,
+	quote_main_save          = 12,
+	quote_main_restore       = 13,
+	quote_main_resume        = 17,
+	quote_main_exit          = 18,
+	quote_options_music      = 20,
+	quote_options_fade       = 23,
+	quote_options_music_on   = 26,
+	quote_options_music_off  = 27,
+	quote_options_fade_1     = 32,
+	quote_options_fade_2     = 33,
+	quote_options_fade_3     = 34,
+	quote_save_title         = 47,
+	quote_restore_title      = 48,
+	quote_alert_save_ok      = 52,
+	quote_alert_restore_ok   = 53,
+	quote_alert_save_fail    = 54,
+	quote_alert_restore_fail = 55
+};
 
 } // namespace Forest
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/forest/menus.cpp b/engines/mads/madsv2/forest/menus.cpp
index ee9fe1c8bb5..164fc80318d 100644
--- a/engines/mads/madsv2/forest/menus.cpp
+++ b/engines/mads/madsv2/forest/menus.cpp
@@ -27,31 +27,17 @@
 #include "mads/madsv2/core/keys.h"
 #include "mads/madsv2/core/matte.h"
 #include "mads/madsv2/core/mem.h"
-#include "mads/madsv2/core/speech.h"
 #include "mads/madsv2/core/quote.h"
 #include "mads/madsv2/core/text.h"
-#include "mads/madsv2/forest/menus.h"
 #include "mads/madsv2/forest/global.h"
+#include "mads/madsv2/forest/mads/quotes.h"
+#include "mads/madsv2/forest/menus.h"
+#include "mads/madsv2/forest/midi.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace Forest {
 
-#define SAVE_MENU_PIXEL_WIDTH           200
-#define MAX_SAVES_ON_SCREEN             10
-
-#define SPACE_BETWEEN                   -1
-
-#define MAIN_MENU_ITEM_WIDTH            140
-#define MAIN_MENU_FORCE_WIDTH           160
-
-#define DIFFICULTY_MENU_FORCE_WIDTH     140
-
-#define OPTIONS_MENU_ITEM_WIDTH         160
-#define OPTIONS_MENU_FORCE_WIDTH        170
-#define OPTIONS_MENU_OFF_CENTER         10
-
-
 #define SAVE_SUCCESSFUL                 1
 #define RESTORE_SUCCESSFUL              2
 #define SAVE_FAILED                     3
@@ -91,6 +77,9 @@ static int global_restore(int id) {
 }
 
 void global_menu_system_init() {
+	menu_quotes = quote_load(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 14, 16, 19, 20,
+		21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+		41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0);
 }
 
 void global_menu_system_shutdown() {
@@ -111,91 +100,64 @@ void global_emergency_save() {
 }
 
 static void global_alert(int status) {
-}
+	int quote_id;
+	switch (status) {
+	case SAVE_SUCCESSFUL:    quote_id = quote_alert_save_ok;      break;
+	case RESTORE_SUCCESSFUL: quote_id = quote_alert_restore_ok;   break;
+	case SAVE_FAILED:        quote_id = quote_alert_save_fail;    break;
+	case RESTORE_FAILED:     quote_id = quote_alert_restore_fail; break;
+	default: return;
+	}
+
+	popup_dialog_create(game_menu_popup, 0x1000, 20);
+	popup_message(menu_quote(quote_id), 0x8000, -1);
+
+	if (status == SAVE_SUCCESSFUL) {
+		mads_strlwr(save_game_buf);
+		popup_message(save_game_buf, 0x8000, -1);
+	}
 
-static void global_menu_score() {
+	popup_button(menu_quote(quote_menu_ok), 0x8000);
+	popup_execute();
+	popup_dialog_destroy();
 }
 
 static void global_menu_save_restore(int save) {
-#if 0
 	int status = -1;
-	int selection;
-	char *save_game_name;
 	PopupItem *save_list;
 	PopupItem *go_button;
-	PopupItem *clear_button;
 	PopupItem *cancel_button;
 	PopupItem *result;
 
-	popup_dialog_create(game_menu_popup, GAME_DIALOG_HEAP, 20);
+	popup_dialog_create(game_menu_popup, 0x1000, 20);
 
-	if (save) {
-		popup_message(menu_quote(quote_save_title), POPUP_CENTER, POPUP_FILL);
-	} else {
-		popup_message(menu_quote(quote_restore_title), POPUP_CENTER, POPUP_FILL);
-	}
+	popup_message(menu_quote(save ? quote_save_title : quote_restore_title), 0x8000, -1);
 	popup_blank(4);
 
 	save_list = popup_savelist(game_save_directory, menu_quote(quote_menu_empty),
-		GAME_MAX_SAVE_SLOTS,
-		GAME_MAX_SAVE_LENGTH + 1,
-		GAME_MAX_SAVE_LENGTH,
-		SAVE_MENU_PIXEL_WIDTH,
-		MAX_SAVES_ON_SCREEN,
-		save, game.last_save);
+		99, 64, 63, 200, 10, save, game.last_save);
 
 	if (save) {
-		go_button = popup_button(menu_quote(quote_menu_save), POPUP_BUTTON_LEFT);
-		clear_button = popup_button(menu_quote(quote_menu_clear), POPUP_CENTER);
-		game_menu_popup->clear_item = clear_button;
+		go_button = popup_button(menu_quote(quote_menu_save), 0x400);
+		game_menu_popup->clear_item = popup_button(menu_quote(quote_menu_clear), 0x8000);
 	} else {
-		go_button = popup_button(menu_quote(quote_menu_restore), POPUP_BUTTON_LEFT);
+		go_button = popup_button(menu_quote(quote_menu_restore), 0x400);
 	}
 	cancel_button = popup_cancel_button(menu_quote(quote_menu_cancel));
 
 	result = popup_execute();
 
 	if (result == cancel_button) {
-		switch (game_menu_popup->key) {
-		case alt_x_key:
-		case ctrl_x_key:
-		case alt_q_key:
-		case ctrl_q_key:
+		int key = game_menu_popup->key;
+		if (key == 301 || key == 17 || key == 24 || key == 272) {
 			game.going = false;
 			kernel.activate_menu = GAME_NO_MENU;
-			break;
-
-		case f1_key:
-			kernel.activate_menu = GAME_MAIN_MENU;
-			break;
-
-		case f2_key:
-			if (save) {
-				kernel.activate_menu = GAME_MAIN_MENU;
-			} else {
-				kernel.activate_menu = GAME_SAVE_MENU;
-			}
-			break;
-
-		case f3_key:
-			if (!save) {
-				kernel.activate_menu = GAME_MAIN_MENU;
-			} else {
-				kernel.activate_menu = GAME_RESTORE_MENU;
-			}
-			break;
-
-		case f4_key:
-			kernel.activate_menu = GAME_SCORE_MENU;
-			break;
-
-		case f5_key:
-			kernel.activate_menu = GAME_OPTIONS_MENU;
-			break;
-
-		default:
+		} else if (key == 316) {
+			kernel.activate_menu = (section_id != 9 && !save) ? GAME_SAVE_MENU : GAME_MAIN_MENU;
+		} else if (key == 317) {
+			kernel.activate_menu = save ? GAME_RESTORE_MENU : GAME_MAIN_MENU;
+		} else {
 			kernel.activate_menu = GAME_MAIN_MENU;
-			break;
 		}
 	} else {
 		kernel.activate_menu = GAME_NO_MENU;
@@ -204,300 +166,112 @@ static void global_menu_save_restore(int save) {
 	popup_dialog_destroy();
 
 	if (result == go_button) {
-		selection = save_list->list->picked_element;
+		int selection = save_list->list->picked_element;
 		game.last_save = selection;
+
 		if (save) {
-			save_game_name = game_save_directory + ((GAME_MAX_SAVE_LENGTH + 1) * selection);
-			if (!strlen(save_game_name)) {
-				Common::strcpy_s(save_game_name, GAME_MAX_SAVE_LENGTH, menu_quote(quote_menu_unnamed));
-			}
+			char *save_game_name = game_save_directory + selection * 64;
+			if (!strlen(save_game_name))
+				Common::strcpy_s(save_game_name, 64, menu_quote(quote_menu_unnamed));
 			status = global_save(selection, save_game_name);
-
 		} else {
 			status = global_restore(selection);
 		}
-
-		if (status > 0)
-			// Dummy name to signal save/load went ok
-			Common::strcpy_s(save_game_buf, "OK");
 	}
 
-	if (status >= 0) {
+	if (status >= 0)
 		global_alert(status);
-	}
-#endif
 }
 
 static void global_menu_options() {
-#if 0
-	int initial_1, initial_2, initial_3;
-	int initial_4, initial_5, initial_6;
-	int former_music;
-	int former_sound;
 	PopupItem *music_item;
-	PopupItem *sound_item;
-	PopupItem *interface_item;
 	PopupItem *fade_item;
-	PopupItem *panning_item;
-	PopupItem *speech_item;
 	PopupItem *done_button;
 	PopupItem *cancel_button;
 	PopupItem *result;
 
 	global_unload_config_parameters();
+	box_param.menu_text_y_offset = 3;
+	box_param.menu_text_x_bonus = 0;
 
-	popup_dialog_create(game_menu_popup, GAME_DIALOG_HEAP, 20);
+	popup_dialog_create(game_menu_popup, 0x1000, 20);
 
-	popup_sprite(box_param.logo, 1, POPUP_CENTER, POPUP_FILL);
+	popup_blank(1);
 	popup_blank(2);
 
-	former_music = config_file.music_flag;
-	former_sound = config_file.sound_flag;
-
-	initial_1 = config_file.music_flag ? 0 : 1;
-	initial_2 = config_file.sound_flag ? 0 : 1;
-	initial_6 = config_file.speech_flag ? 0 : 1;
-	initial_3 = config_file.interface_hotspots;
-	initial_4 = config_file.screen_fade;
-	initial_5 = config_file.panning_speed;
-
-	music_item = popup_menu(menu_quote(quote_options_item1),
-		POPUP_CENTER, POPUP_FILL, OPTIONS_MENU_ITEM_WIDTH,
-		OPTIONS_MENU_OFF_CENTER,
-		2, 40, initial_1);
-	popup_menu_option(music_item, menu_quote(quote_options_item1a));
-	popup_menu_option(music_item, menu_quote(quote_options_item1b));
-
-	popup_blank(SPACE_BETWEEN);
-
-
-	sound_item = popup_menu(menu_quote(quote_options_item2),
-		POPUP_CENTER, POPUP_FILL, OPTIONS_MENU_ITEM_WIDTH,
-		OPTIONS_MENU_OFF_CENTER,
-		2, 40, initial_2);
-	popup_menu_option(sound_item, menu_quote(quote_options_item2a));
-	popup_menu_option(sound_item, menu_quote(quote_options_item2b));
-
-	popup_blank(SPACE_BETWEEN);
-
+	int initial_music = config_file.music_flag ? 0 : 1;
+	int former_screen_fade = config_file.screen_fade;
 
-	speech_item = popup_menu(menu_quote(quote_options_item6),
-		POPUP_CENTER, POPUP_FILL, OPTIONS_MENU_ITEM_WIDTH,
-		OPTIONS_MENU_OFF_CENTER,
-		2, 40, initial_6);
-	popup_menu_option(speech_item, menu_quote(quote_options_item6a));
-	popup_menu_option(speech_item, menu_quote(quote_options_item6b));
+	music_item = popup_menu(menu_quote(quote_options_music), 0x8000, -1, 160, 10, 2, 40, initial_music);
+	popup_menu_option(music_item, menu_quote(quote_options_music_on));
+	popup_menu_option(music_item, menu_quote(quote_options_music_off));
 
-	popup_blank(SPACE_BETWEEN);
+	popup_blank(1);
 
+	fade_item = popup_menu(menu_quote(quote_options_fade), 0x8000, -1, 160, 10, 3, 40, former_screen_fade);
+	popup_menu_option(fade_item, menu_quote(quote_options_fade_1));
+	popup_menu_option(fade_item, menu_quote(quote_options_fade_2));
+	popup_menu_option(fade_item, menu_quote(quote_options_fade_3));
 
-	interface_item = popup_menu(menu_quote(quote_options_item3),
-		POPUP_CENTER, POPUP_FILL, OPTIONS_MENU_ITEM_WIDTH,
-		OPTIONS_MENU_OFF_CENTER,
-		2, 40, initial_3);
-	popup_menu_option(interface_item, menu_quote(quote_options_item3a));
-	popup_menu_option(interface_item, menu_quote(quote_options_item3b));
-
-	popup_blank(SPACE_BETWEEN);
-
-
-	fade_item = popup_menu(menu_quote(quote_options_item4),
-		POPUP_CENTER, POPUP_FILL, OPTIONS_MENU_ITEM_WIDTH,
-		OPTIONS_MENU_OFF_CENTER,
-		3, 40, initial_4);
-	popup_menu_option(fade_item, menu_quote(quote_options_item4a));
-	popup_menu_option(fade_item, menu_quote(quote_options_item4b));
-	popup_menu_option(fade_item, menu_quote(quote_options_item4c));
-
-	popup_blank(SPACE_BETWEEN);
-
-
-	panning_item = popup_menu(menu_quote(quote_options_item5),
-		POPUP_CENTER, POPUP_FILL, OPTIONS_MENU_ITEM_WIDTH,
-		OPTIONS_MENU_OFF_CENTER,
-		3, 40, initial_5);
-	popup_menu_option(panning_item, menu_quote(quote_options_item5a));
-	popup_menu_option(panning_item, menu_quote(quote_options_item5b));
-	popup_menu_option(panning_item, menu_quote(quote_options_item5c));
-
-
-
-	done_button = popup_button(menu_quote(quote_menu_done), POPUP_LEFT);
+	done_button   = popup_button(menu_quote(quote_menu_done), 5);
 	cancel_button = popup_cancel_button(menu_quote(quote_menu_cancel));
 
-	popup_width_force(OPTIONS_MENU_FORCE_WIDTH);
+	popup_width_force(170);
 
 	result = popup_execute();
 
 	kernel.activate_menu = GAME_MAIN_MENU;
 
 	if (result == cancel_button) {
-		switch (game_menu_popup->key) {
-		case alt_x_key:
-		case ctrl_x_key:
-		case alt_q_key:
-		case ctrl_q_key:
+		int key = game_menu_popup->key;
+		if (key == 17 || key == 24 || key == 272 || key == 301) {
 			game.going = false;
 			kernel.activate_menu = GAME_NO_MENU;
-			break;
-
-		case f1_key:
-			kernel.activate_menu = GAME_MAIN_MENU;
-			break;
-
-		case f2_key:
+		} else if (key == 316) {
 			kernel.activate_menu = GAME_SAVE_MENU;
-			break;
-
-		case f3_key:
+		} else if (key == 317) {
 			kernel.activate_menu = GAME_RESTORE_MENU;
-			break;
-
-		case f4_key:
-			kernel.activate_menu = GAME_SCORE_MENU;
-			break;
-
-		case f5_key:
-			kernel.activate_menu = GAME_MAIN_MENU;
-			break;
-
-		default:
-			kernel.activate_menu = GAME_MAIN_MENU;
-			break;
+		} else if (key == 320) {
+			kernel.activate_menu = 8;
 		}
 	}
 
 	if (result == done_button) {
-		config_file.music_flag = !music_item->list->picked_element;
-		config_file.sound_flag = !sound_item->list->picked_element;
-		config_file.speech_flag = !speech_item->list->picked_element;
-		config_file.interface_hotspots = interface_item->list->picked_element;
-		config_file.screen_fade = fade_item->list->picked_element;
-		config_file.panning_speed = panning_item->list->picked_element;
-
-		global_write_config_file();
+		config_file.music_flag    = (music_item->list->picked_element == 0) ? 1 : 0;
+		config_file.screen_fade   = fade_item->list->picked_element;
+		write_config_file();
 		global_load_config_parameters();
-
 		kernel.activate_menu = GAME_NO_MENU;
 	}
 
-	if ((former_music != config_file.music_flag) ||
-		(former_sound != config_file.sound_flag)) {
-		game_exec_function(section_music_reset_pointer);
-	}
-
-	if (!config_file.speech_flag) {
-		if (speech_system_active)
-			speech_all_off();
-	}
-
 	popup_dialog_destroy();
-#endif
-}
-
-static void global_menu_difficulty() {
-#if 0
-	PopupItem *easy_item;
-	PopupItem *result;
-
-	popup_dialog_create(game_menu_popup, GAME_DIALOG_HEAP, 20);
-
-	popup_message(menu_quote(quote_difficulty_title), POPUP_CENTER, POPUP_FILL);
-	popup_blank(6);
-
-	easy_item = popup_menu(menu_quote(quote_difficulty_item1),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
-
-	popup_blank(SPACE_BETWEEN);
-
-	(void)popup_menu(menu_quote(quote_difficulty_item2),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
-
-
-	popup_width_force(DIFFICULTY_MENU_FORCE_WIDTH);
-
-	game_menu_popup->cancel_item = NULL;
-
-	result = popup_execute();
-
-	kernel.activate_menu = GAME_NO_MENU;
-
-	if (result == easy_item) {
-		game.difficulty = EASY_MODE;
-	} else {
-		game.difficulty = HARD_MODE;
-	}
-
-	if (result == NULL) {
-		game.going = false;
-	}
-
-	switch (game_menu_popup->key) {
-	case alt_x_key:
-	case ctrl_x_key:
-	case alt_q_key:
-	case ctrl_q_key:
-	case esc_key:
-		game.going = false;
-		break;
-	}
-
-	popup_dialog_destroy();
-#endif
 }
 
 static void global_menu_main() {
-#if 0
 	PopupItem *save_item;
 	PopupItem *restore_item;
-	PopupItem *score_item;
-	PopupItem *options_item;
 	PopupItem *resume_item;
-	PopupItem *quit_item;
+	PopupItem *exit_item;
 	PopupItem *result;
+	Buffer scr_live = { video_y, video_x, mcga_video };
 
-	popup_dialog_create(game_menu_popup, GAME_DIALOG_HEAP, 20);
-
-	popup_sprite(box_param.logo, 1, POPUP_CENTER, POPUP_FILL);
-	popup_blank(6);
-
-	save_item = popup_menu(menu_quote(quote_main_item1),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
-
-	popup_blank(SPACE_BETWEEN);
-
-	restore_item = popup_menu(menu_quote(quote_main_item2),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
-
-	popup_blank(SPACE_BETWEEN);
-
-	score_item = popup_menu(menu_quote(quote_main_item6),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
-
-	popup_blank(SPACE_BETWEEN);
-
-	options_item = popup_menu(menu_quote(quote_main_item3),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
-
-	popup_blank(SPACE_BETWEEN);
+	box_param.menu_text_y_offset = 3;
+	box_param.menu_text_x_bonus = 0;
 
-	resume_item = popup_menu(menu_quote(quote_main_item4),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
+	popup_dialog_create(game_menu_popup, 0x1000, 20);
 
-	popup_blank(SPACE_BETWEEN);
+	popup_blank(1);
+	popup_blank(2);
 
-	quit_item = popup_menu(menu_quote(quote_main_item5),
-		POPUP_CENTER, POPUP_FILL, MAIN_MENU_ITEM_WIDTH, 0,
-		0, 0, 0);
+	save_item    = popup_menu(menu_quote(quote_main_save),    0x8000, -1, 140, 0, 0, 0, 0);
+	popup_blank(1);
+	restore_item = popup_menu(menu_quote(quote_main_restore), 0x8000, -1, 140, 0, 0, 0, 0);
+	popup_blank(1);
+	resume_item  = popup_menu(menu_quote(quote_main_resume),  0x8000, -1, 140, 0, 0, 0, 0);
+	popup_blank(1);
+	exit_item    = popup_menu(menu_quote(quote_main_exit),    0x8000, -1, 140, 0, 0, 0, 0);
 
-	popup_width_force(MAIN_MENU_FORCE_WIDTH);
+	popup_width_force(160);
 	game_menu_popup->cancel_item = resume_item;
 
 	result = popup_execute();
@@ -506,49 +280,37 @@ static void global_menu_main() {
 		kernel.activate_menu = GAME_SAVE_MENU;
 	} else if (result == restore_item) {
 		kernel.activate_menu = GAME_RESTORE_MENU;
-	} else if (result == options_item) {
-		kernel.activate_menu = GAME_OPTIONS_MENU;
-	} else if (result == score_item) {
-		kernel.activate_menu = GAME_SCORE_MENU;
 	} else {
 		kernel.activate_menu = GAME_NO_MENU;
 	}
 
-	if (result == quit_item)
-		game.going = false;
+	if (result == exit_item) {
+		g_engine->saveAutosaveIfEnabled();
+		new_room = 904;
+	}
 
-	switch (game_menu_popup->key) {
-	case alt_q_key:
-	case alt_x_key:
-	case ctrl_q_key:
+	int key = game_menu_popup->key;
+	if (key == 301 || key == 17 || key == 24 || key == 272) {
 		game.going = false;
 		kernel.activate_menu = GAME_NO_MENU;
-		break;
-
-	case f5_key:
-		kernel.activate_menu = GAME_SAVE_MENU;
-		break;
-
-	case f7_key:
+	} else if (key == 27 || key == 315) {
+		if (section_id != 9)
+			kernel.activate_menu = GAME_NO_MENU;
+	} else if (key == 316) {
+		if (section_id != 9)
+			kernel.activate_menu = GAME_SAVE_MENU;
+	} else if (key == 317) {
 		kernel.activate_menu = GAME_RESTORE_MENU;
-		break;
-
-	case f8_key:
-		kernel.activate_menu = GAME_SCORE_MENU;
-		break;
-
-	case f10_key:
-		kernel.activate_menu = GAME_OPTIONS_MENU;
-		break;
-
-	default:
-		break;
 	}
-#endif
+
+	popup_dialog_destroy();
+	sprite_draw(series_list[6], 2, &scr_inter, 1, 264);
+	buffer_rect_copy_2(scr_inter, scr_live, 168, 0, 168, 156, 152, 44);
 }
 
 void global_game_menu() {
 	bool loaded = false;
+	bool music = true;
 
 	if (box_param.series == NULL) {
 		Common::strcpy_s(box_param.name, "*BOX");
@@ -584,13 +346,8 @@ void global_game_menu() {
 			}
 			break;
 		case GAME_OPTIONS_MENU:
-			global_menu_options();
-			break;
-		case GAME_DIFFICULTY_MENU:
-			global_menu_difficulty();
-			break;
-		case GAME_SCORE_MENU:
-			global_menu_score();
+			if (section_id != 9)
+				global_menu_options();
 			break;
 		default:
 			kernel.activate_menu = GAME_NO_MENU;
@@ -607,7 +364,12 @@ void global_game_menu() {
 	}
 
 done:
-	;
+	if (!music) {
+		config_file.music_flag = true;
+		midi_stop();
+		config_file.music_flag = false;
+		midi_playing = false;
+	}
 }
 
 } // namespace Forest
diff --git a/engines/mads/madsv2/forest/midi.cpp b/engines/mads/madsv2/forest/midi.cpp
index 2691ca8d5c7..27a15184c8f 100644
--- a/engines/mads/madsv2/forest/midi.cpp
+++ b/engines/mads/madsv2/forest/midi.cpp
@@ -29,6 +29,8 @@ namespace MADS {
 namespace MADSV2 {
 namespace Forest {
 
+bool midi_playing;
+
 void MidiPlayer::send(uint32 b) {
 	//_driver->send(b);
 	Audio::MidiPlayer::send(b);
@@ -65,10 +67,12 @@ void MidiPlayer::play(const char *name) {
 
 void midi_play(const char *name) {
 	g_engine->_midiPlayer.play(name);
+	midi_playing = true;
 }
 
 void midi_stop() {
 	g_engine->_midiPlayer.stop();
+	midi_playing = false;
 }
 
 } // namespace Forest
diff --git a/engines/mads/madsv2/forest/midi.h b/engines/mads/madsv2/forest/midi.h
index 82a5e5d8b40..a85b3a07544 100644
--- a/engines/mads/madsv2/forest/midi.h
+++ b/engines/mads/madsv2/forest/midi.h
@@ -28,6 +28,8 @@ namespace MADS {
 namespace MADSV2 {
 namespace Forest {
 
+extern bool midi_playing;
+
 class MidiPlayer : public Audio::MidiPlayer {
 private:
 	// MidiDriver_BASE interface implementation


Commit: b33af842da58c1ac5893f05b8ffada0fca50b523
    https://github.com/scummvm/scummvm/commit/b33af842da58c1ac5893f05b8ffada0fca50b523
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-06-23T16:46:49+10:00

Commit Message:
MADS: FOREST: Clicking on door icon opens game menu

Changed paths:
    engines/mads/madsv2/forest/extra.cpp
    engines/mads/madsv2/forest/extra.h


diff --git a/engines/mads/madsv2/forest/extra.cpp b/engines/mads/madsv2/forest/extra.cpp
index 25d8a625a6f..c8b475d1123 100644
--- a/engines/mads/madsv2/forest/extra.cpp
+++ b/engines/mads/madsv2/forest/extra.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "common/textconsole.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
@@ -44,24 +45,19 @@ void display_interface() {
 	error("TODO: display_interface");
 }
 
-void fly_on_screen(int flying_object) {
-	error("TODO: fly_on_screen");
-}
-
-void fly_off_screen(int flying_object) {
-	error("TODO: fly_off_screen");
-}
-
 void display_inventory(void) {
 	error("TODO: display_inventory");
 }
 
 void solve_me_selected(void) {
-	error("TODO: solve_me_selected");
+	global[walker_converse_state] = -1;
+	open_journal(3);
+	game_exec_function(room_parser_code_pointer);
 }
 
 void door_selected(void) {
-	error("TODO: door_selected");
+	open_journal(4);
+	kernel.activate_menu = GAME_MAIN_MENU;
 }
 
 void extra_spinning_object(void) {
diff --git a/engines/mads/madsv2/forest/extra.h b/engines/mads/madsv2/forest/extra.h
index 2fa56c6d0ad..e36477d7a23 100644
--- a/engines/mads/madsv2/forest/extra.h
+++ b/engines/mads/madsv2/forest/extra.h
@@ -59,9 +59,6 @@ extern int int_sprite[6];
 
 extern void init_extra();
 
-extern void fly_on_screen(int flying_object);
-extern void fly_off_screen(int flying_object);
-
 extern void display_interface();
 extern void display_inventory(void);
 extern void solve_me_selected(void);


Commit: 4123a7ef712a68d991b51de24ce66f6263e814cf
    https://github.com/scummvm/scummvm/commit/4123a7ef712a68d991b51de24ce66f6263e814cf
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-06-23T17:05:58+10:00

Commit Message:
MADS: FOREST: Fix ADPCM type for digital playback

Changed paths:
    engines/mads/madsv2/forest/digi.cpp


diff --git a/engines/mads/madsv2/forest/digi.cpp b/engines/mads/madsv2/forest/digi.cpp
index 970d2e14ba5..caba27355f2 100644
--- a/engines/mads/madsv2/forest/digi.cpp
+++ b/engines/mads/madsv2/forest/digi.cpp
@@ -61,7 +61,7 @@ void DigiPlayer::play(const char *name, int slot) {
 	src->seek(0x20);
 
 	Audio::AudioStream *audioStream = Audio::makeADPCMStream(src, DisposeAfterUse::YES,
-		src->size() - 0x20, Audio::kADPCMDVI, 11025, 1);
+		src->size() - 0x20, Audio::kADPCMApple, 11025, 1);
 	_mixer->playStream(Audio::Mixer::kSFXSoundType, &c._soundHandle, audioStream);
 	c._isPlaying = true;
 }




More information about the Scummvm-git-logs mailing list