[Scummvm-git-logs] scummvm master -> e83695a12b1d6fb8e7b44cc539a32744be7b887e

dreammaster noreply at scummvm.org
Tue Jul 21 11:09:04 UTC 2026


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

Summary:
85cb08ba56 MADS: NEBULAR: Moving room logic into new madsv2 sub-namespace
56b2af1215 MADS: NEBULAR: Converted room 102
19b553667f MADS: NEBULAR: Re-add bugfix #16849 Game semi-stuck while using binoculars
1732fc02b5 MADS: NEBULAR: Converted room 103
3220c851ac MADS: NEBULAR: Implemented room 104
6429b1545d MADS: NEBULAR: Implemented room 105
32550de5b2 MADS: PHANTOM: Impelmented rooms 106 to 110
b51a93fd80 MADS: NEBULAR: Implemented rooms 111 and 112
12e8b67cf5 MADS: NEBULAR: Implementing section 2 rooms
8ce6f229a9 MADS: NEBULAR: Further section 2 rooms implementation
ceb05cac18 MADS: NEBULAR: Remaining section 2 rooms implementation
ddbe239b23 MADS: NEBULAR: Implemented section 4 rooms
62e5603902 MADS: NEBULAR: Implemented section 5 rooms
e3daee8f82 MADS: NEBULAR: Fixed room 213
b1037e830f MADS: NEBULAR: Added missing room 357
05a8f9d303 MADS: NEBULAR: Fix clash on function parameter
2fcd9f461d MADS: NEBULAR: Implement section 6 rooms
81859f70eb MADS: NEBULAR: Implemented section 7 rooms
61b88a0c27 MADS: NEBULAR: Implemented section 8 rooms
d1cb360624 MADS: NEBULAR: Remove deprecated scene declarations
955d768469 MADS: NEBULAR: Clarify Conversation class as Dialog
9a866c3c89 MADS: NEBULAR: Hooked Rex sound manager back in again
746824c8ae MADS: NEBULAR: Adding main function
99ed64c155 MADS: NEBULAR: Hooking up room creation
3118d2f050 MADS: NEBULAR: Adding more Rex specific global code
c78550201d MADS: NEBULAR: Adding original Rex dialogs
444203c48b MADS: NEBULAR: Font loading differences
e36437d82d MADS: NEBULAR: Temporarily hardcode game to start, popup load isn't used
f5e1e37000 MADS: NEBULAR: Rex room loading code
d353b30032 MADS: NEBULAR: Fix LoaderReadStream class
3736606d86 MADS: NEBULAR: room_load_rex loading fixes
13a3bd0ce3 MADS: NEBULAR: Different hotspot size in room loading
decfba815c MADS: NEBULAR: Fix thunk for getting anim current frame
6e42fe596f MADS: NEBULAR: Fix for on-screen text corruption
a3c738b30d MADS: NEBULAR: Hooking up original dialogs
3bebb13325 MADS: NEBULAR: Implement missing menu setup/shutdown
d42a77d399 MADS: NEBULAR: Fixes for showing difficulty dialog
7a4caf91db MADS: NEBULAR: scr_depth expected to be packed 2 pixels per byte
ca792b1807 MADS: NEBULAR: Fix interface text font color
018c4a3431 MADS: NEBULAR: Starting to implement Rex-specific version of popup code
add1bf9b32 MADS: NEBULAR: Remove madsv2/core/copy.cpp
196d0b182e MADS: NEBULAR: Text dialogs partially showing
83a3100dc5 MADS: NEBULAR: Further work on text dialog display
bfe96bdc9d MADS: NEBULAR: Properly implement screen shaking
ae2d2ccede MADS: NEBULAR: Fix displaying alert popups
ccdc1b2a6a MADS: NEBULAR: Fix pal flags in room background loading
36353130e6 MADS: NEBULAR: Fix pal_allocate conduct_search flag
6459d5ef9a MADS: NEBULAR: Fix moving between room 101 and 102
77c58095a2 MADS: NEBULAR: Fix looking at view screen in room 101
b088f2b0b4 MADS: NEBULAR: Properly implement popup_ask_string
43f9c142e1 MADS: NEBULAR: In progress main menu
03b2773229 MADS: NEBULAR: In progress main menu
9770d5cef3 MADS: NEBULAR: Add main menu arrow cursor
9db95c9712 MADS: NEBULAR: Fix selecting Start Game option in main menu
432150b063 MADS: NEBULAR: Exit on copy protection dialog failure
37dc2a251a MADS: NEBULAR: Properly pre-process walk/depth data
0b90a4367e MADS: NEBULAR: Added walkable console command
70b5287bc1 MADS: NEBULAR: Added depth console command
9a5292dce0 MADS: NEBULAR: Properly clear command_ready in global_parser_code
37a2d2d297 MADS: NEBULAR: Fix resetting master_shadow pointer
373b16dc4a MADS: NEBULAR: Fix Rex version of room_picture_load
ca2c4eba65 MADS: NEBULAR: Fix character shadow palette
d3397d85db MADS: NEBULAR: In progress adding console load command
c37757c607 MADS: NEBULAR: Fix depth calculation for sequences
efe0796fd1 MADS: NEBULAR: Properly hide Quotes main menu option
1a686ff43d MADS: NEBULAR: Fix fade calls in main menu
88def5e624 MADS: NEBULAR: Cleanup gui options / config loading
066813a4c1 MADS: NEBULAR: Fix probe beach cutscene animation
c10604a42c MADS: NEBULAR: Fix room_id field usage in room_load_depth
f4f17c5f09 MADS: NEBULAR: Fix room_load_depth when loading variants
9a88cd1f85 MADS: NEBULAR: Fix size of SegmentInter struct
1649535b0d MADS: NEBULAR: Implement dynamic hotspot cursor function
ed70e70e33 MADS: NEBULAR: Replace dynmicHotspots.add calls with proper word constants
f78c0ddc08 MADS: NEBULAR: Janitorial for function return statements
91f72ae65b MADS: NEBULAR: Fix highlighting of dynamic hotspots
68e06af64b MADS: NEBULAR: Display inventory item image in examine_object
b57f9cb614 MADS: NEBULAR: Fix quote when entering room 110
1d073673d4 MADS: NEBULAR: Fix sprite unload order error in room 209
39ce646896 MADS: NEBULAR: Fix native woman animation disappearing in room 210
698ffdb801 MADS: NEBULAR: Further animation thunks fixes
6a2c55328a MADS: NEBULAR: Fix conv quotes loading and room 210 long line splitting
b302ddc734 MADS: NEBULAR: Fix placement of conv text
811df6db53 MADS: NEBULAR: Implementation of Rex version of special walk areas
8ac7e591f0 MADS: NEBULAR: Remove redundant assignment of null to current animation
ec0f8a7c64 MADS: NEBULAR: Fix partially transparent text in room 216 cutscene
bb65b50310 MADS: NEBULAR: Change words.h constants to standard 'words_' constants
b139bdb0a2 MADS: NEBULAR: Change parse/isAction calls to use proper player_said_* defines
592ba3058a MADS: NEBULAR: Fix using binoculars in room 202
3ceef48fa5 MADS: NEBULAR: Fix loading room series names
a25b7001e1 MADS: NEBULAR: Fixes for calling section_2_music
2491f5838b MADS: NEBULAR: Fix crash entering teleporter room 213
ba8d9fbdfa MADS: NEBULAR: Fix incorrect removal of burder and fish when merged
8c38984105 MADS: NEBULAR: Fixing unknown Animation thunk fields
4358a9bfc4 MADS: NEBULAR: Fix animation crashes during underground capture
df61fbb926 MADS: NEBULAR: Fix room 318/319 duplicate quote
b2e9684b41 MADS: NEBULAR: Display 2nd conv lines when Rex is on gurney
a6b5eb38cc MADS: NEBULAR: Fix to updateTimeout calls, room 311 daemon cleanup
ff85379ae1 MADS: NEBULAR: Fix security scanner ohh oh text
3833b814e0 MADS: NEBULAR: Fix Animation _resetFlag to actually be the repeat flag
c5c980d3b4 MADS: NEBULAR: Fix room 354 not being in section 3 room constructor list
925c200138 MADS: NEBULAR: Fix buffer_legal out of bounds call in room 354
102c857e44 MADS: NEBULAR: Fix room 401 sex scanner
4c8f23a6d7 MADS: NEBULAR: Fix out of bounds array access in room 402
82ef76eeb3 MADS: NEBULAR: Fix object_examine calls destroying scr_walk buffer
7411dd5718 MADS: NEBULAR: Fix room 406 daemon setup
a7da3a9e07 MADS: NEBULAR: Fix loading teleporter room 409 background
92a02ef97f MADS: NEBULAR: Fix hotspots for Macho Prose and Labotatory doorways
03c472eaf8 MADS: NEBULAR: Fix calling secton_8_music in room 807
e309028226 MADS: NEBULAR: Room 512 missing from section 5 constructor
046a6af228 MADS: NEBULAR: Fix entering Buckluster Video alley
9efd75b78d MADS: NEBULAR: Hermit conv fixes
7c7ab7ce6b MADS: NEBULAR: Fix getting batteries multiple times
6dee328929 MADS: NEBULAR: Add missing code for putting batteries in handset
0e29ebd023 MADS: NEBULAR: Fix getting fishing line to tie to boat
8448fc7d49 MADS: NEBULAR: Add missing putting bomb in chicken
c882068448 MADS: NEBULAR: Hookup room 808 parser in preload
723efd2390 MADS: NEBULAR: Fix sound crash looking at ship panel
00faa082f2 MADS: NEBULAR: Cleanup & fixes for ASound8 sound driver
e83695a12b MADS: NEBULAR: Mark Rex Nebular as unstable again


Commit: 85cb08ba56a82420be7d334cea9db3f6b7248c73
    https://github.com/scummvm/scummvm/commit/85cb08ba56a82420be7d334cea9db3f6b7248c73
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:40+10:00

Commit Message:
MADS: NEBULAR: Moving room logic into new madsv2 sub-namespace

Changed paths:
  A engines/mads/madsv2/nebular/global.cpp
  A engines/mads/madsv2/nebular/global.h
  A engines/mads/madsv2/nebular/mads/inventory.h
  A engines/mads/madsv2/nebular/mads/mads.cpp
  A engines/mads/madsv2/nebular/mads/words.h
  A engines/mads/madsv2/nebular/nebular.cpp
  A engines/mads/madsv2/nebular/nebular.h
  A engines/mads/madsv2/nebular/rooms/room101.cpp
  A engines/mads/madsv2/nebular/rooms/room102.cpp
  A engines/mads/madsv2/nebular/rooms/room103.cpp
  A engines/mads/madsv2/nebular/rooms/room104.cpp
  A engines/mads/madsv2/nebular/rooms/room105.cpp
  A engines/mads/madsv2/nebular/rooms/room106.cpp
  A engines/mads/madsv2/nebular/rooms/room107.cpp
  A engines/mads/madsv2/nebular/rooms/room108.cpp
  A engines/mads/madsv2/nebular/rooms/room109.cpp
  A engines/mads/madsv2/nebular/rooms/room110.cpp
  A engines/mads/madsv2/nebular/rooms/room111.cpp
  A engines/mads/madsv2/nebular/rooms/room112.cpp
  A engines/mads/madsv2/nebular/rooms/room201.cpp
  A engines/mads/madsv2/nebular/rooms/room202.cpp
  A engines/mads/madsv2/nebular/rooms/room203.cpp
  A engines/mads/madsv2/nebular/rooms/room205.cpp
  A engines/mads/madsv2/nebular/rooms/room207.cpp
  A engines/mads/madsv2/nebular/rooms/room208.cpp
  A engines/mads/madsv2/nebular/rooms/room209.cpp
  A engines/mads/madsv2/nebular/rooms/room210.cpp
  A engines/mads/madsv2/nebular/rooms/room211.cpp
  A engines/mads/madsv2/nebular/rooms/room212.cpp
  A engines/mads/madsv2/nebular/rooms/room213.cpp
  A engines/mads/madsv2/nebular/rooms/room214.cpp
  A engines/mads/madsv2/nebular/rooms/room215.cpp
  A engines/mads/madsv2/nebular/rooms/room216.cpp
  A engines/mads/madsv2/nebular/rooms/room301.cpp
  A engines/mads/madsv2/nebular/rooms/room302.cpp
  A engines/mads/madsv2/nebular/rooms/room303.cpp
  A engines/mads/madsv2/nebular/rooms/room304.cpp
  A engines/mads/madsv2/nebular/rooms/room307.cpp
  A engines/mads/madsv2/nebular/rooms/room308.cpp
  A engines/mads/madsv2/nebular/rooms/room309.cpp
  A engines/mads/madsv2/nebular/rooms/room310.cpp
  A engines/mads/madsv2/nebular/rooms/room311.cpp
  A engines/mads/madsv2/nebular/rooms/room313.cpp
  A engines/mads/madsv2/nebular/rooms/room316.cpp
  A engines/mads/madsv2/nebular/rooms/room318.cpp
  A engines/mads/madsv2/nebular/rooms/room319.cpp
  A engines/mads/madsv2/nebular/rooms/room320.cpp
  A engines/mads/madsv2/nebular/rooms/room321.cpp
  A engines/mads/madsv2/nebular/rooms/room322.cpp
  A engines/mads/madsv2/nebular/rooms/room351.cpp
  A engines/mads/madsv2/nebular/rooms/room352.cpp
  A engines/mads/madsv2/nebular/rooms/room353.cpp
  A engines/mads/madsv2/nebular/rooms/room354.cpp
  A engines/mads/madsv2/nebular/rooms/room357.cpp
  A engines/mads/madsv2/nebular/rooms/room358.cpp
  A engines/mads/madsv2/nebular/rooms/room359.cpp
  A engines/mads/madsv2/nebular/rooms/room360.cpp
  A engines/mads/madsv2/nebular/rooms/room361.cpp
  A engines/mads/madsv2/nebular/rooms/room366.cpp
  A engines/mads/madsv2/nebular/rooms/room387.cpp
  A engines/mads/madsv2/nebular/rooms/room388.cpp
  A engines/mads/madsv2/nebular/rooms/room389.cpp
  A engines/mads/madsv2/nebular/rooms/room390.cpp
  A engines/mads/madsv2/nebular/rooms/room391.cpp
  A engines/mads/madsv2/nebular/rooms/room399.cpp
  A engines/mads/madsv2/nebular/rooms/room401.cpp
  A engines/mads/madsv2/nebular/rooms/room402.cpp
  A engines/mads/madsv2/nebular/rooms/room405.cpp
  A engines/mads/madsv2/nebular/rooms/room406.cpp
  A engines/mads/madsv2/nebular/rooms/room407.cpp
  A engines/mads/madsv2/nebular/rooms/room408.cpp
  A engines/mads/madsv2/nebular/rooms/room409.cpp
  A engines/mads/madsv2/nebular/rooms/room410.cpp
  A engines/mads/madsv2/nebular/rooms/room411.cpp
  A engines/mads/madsv2/nebular/rooms/room413.cpp
  A engines/mads/madsv2/nebular/rooms/room501.cpp
  A engines/mads/madsv2/nebular/rooms/room502.cpp
  A engines/mads/madsv2/nebular/rooms/room503.cpp
  A engines/mads/madsv2/nebular/rooms/room504.cpp
  A engines/mads/madsv2/nebular/rooms/room505.cpp
  A engines/mads/madsv2/nebular/rooms/room506.cpp
  A engines/mads/madsv2/nebular/rooms/room507.cpp
  A engines/mads/madsv2/nebular/rooms/room508.cpp
  A engines/mads/madsv2/nebular/rooms/room511.cpp
  A engines/mads/madsv2/nebular/rooms/room512.cpp
  A engines/mads/madsv2/nebular/rooms/room513.cpp
  A engines/mads/madsv2/nebular/rooms/room515.cpp
  A engines/mads/madsv2/nebular/rooms/room551.cpp
  A engines/mads/madsv2/nebular/rooms/room601.cpp
  A engines/mads/madsv2/nebular/rooms/room602.cpp
  A engines/mads/madsv2/nebular/rooms/room603.cpp
  A engines/mads/madsv2/nebular/rooms/room604.cpp
  A engines/mads/madsv2/nebular/rooms/room605.cpp
  A engines/mads/madsv2/nebular/rooms/room607.cpp
  A engines/mads/madsv2/nebular/rooms/room608.cpp
  A engines/mads/madsv2/nebular/rooms/room609.cpp
  A engines/mads/madsv2/nebular/rooms/room610.cpp
  A engines/mads/madsv2/nebular/rooms/room611.cpp
  A engines/mads/madsv2/nebular/rooms/room612.cpp
  A engines/mads/madsv2/nebular/rooms/room620.cpp
  A engines/mads/madsv2/nebular/rooms/room701.cpp
  A engines/mads/madsv2/nebular/rooms/room702.cpp
  A engines/mads/madsv2/nebular/rooms/room703.cpp
  A engines/mads/madsv2/nebular/rooms/room704.cpp
  A engines/mads/madsv2/nebular/rooms/room705.cpp
  A engines/mads/madsv2/nebular/rooms/room706.cpp
  A engines/mads/madsv2/nebular/rooms/room707.cpp
  A engines/mads/madsv2/nebular/rooms/room710.cpp
  A engines/mads/madsv2/nebular/rooms/room711.cpp
  A engines/mads/madsv2/nebular/rooms/room751.cpp
  A engines/mads/madsv2/nebular/rooms/room752.cpp
  A engines/mads/madsv2/nebular/rooms/room801.cpp
  A engines/mads/madsv2/nebular/rooms/room802.cpp
  A engines/mads/madsv2/nebular/rooms/room803.cpp
  A engines/mads/madsv2/nebular/rooms/room804.cpp
  A engines/mads/madsv2/nebular/rooms/room805.cpp
  A engines/mads/madsv2/nebular/rooms/room807.cpp
  A engines/mads/madsv2/nebular/rooms/room808.cpp
  A engines/mads/madsv2/nebular/rooms/room810.cpp
  A engines/mads/madsv2/nebular/rooms/section1.cpp
  A engines/mads/madsv2/nebular/rooms/section1.h
  A engines/mads/madsv2/nebular/rooms/section2.cpp
  A engines/mads/madsv2/nebular/rooms/section2.h
  A engines/mads/madsv2/nebular/rooms/section3.cpp
  A engines/mads/madsv2/nebular/rooms/section3.h
  A engines/mads/madsv2/nebular/rooms/section4.cpp
  A engines/mads/madsv2/nebular/rooms/section4.h
  A engines/mads/madsv2/nebular/rooms/section5.cpp
  A engines/mads/madsv2/nebular/rooms/section5.h
  A engines/mads/madsv2/nebular/rooms/section6.cpp
  A engines/mads/madsv2/nebular/rooms/section6.h
  A engines/mads/madsv2/nebular/rooms/section7.cpp
  A engines/mads/madsv2/nebular/rooms/section7.h
  A engines/mads/madsv2/nebular/rooms/section8.cpp
  A engines/mads/madsv2/nebular/rooms/section8.h
  A engines/mads/madsv2/nebular/rooms/thunks.cpp
  A engines/mads/madsv2/nebular/rooms/thunks.h
  R engines/mads/nebular/nebular_scenes1.cpp
  R engines/mads/nebular/nebular_scenes1.h
  R engines/mads/nebular/nebular_scenes2.cpp
  R engines/mads/nebular/nebular_scenes2.h
  R engines/mads/nebular/nebular_scenes3.cpp
  R engines/mads/nebular/nebular_scenes3.h
  R engines/mads/nebular/nebular_scenes4.cpp
  R engines/mads/nebular/nebular_scenes4.h
  R engines/mads/nebular/nebular_scenes5.cpp
  R engines/mads/nebular/nebular_scenes5.h
  R engines/mads/nebular/nebular_scenes6.cpp
  R engines/mads/nebular/nebular_scenes6.h
  R engines/mads/nebular/nebular_scenes7.cpp
  R engines/mads/nebular/nebular_scenes7.h
  R engines/mads/nebular/nebular_scenes8.cpp
  R engines/mads/nebular/nebular_scenes8.h
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/kernel.h
    engines/mads/metaengine.cpp
    engines/mads/module.mk
    engines/mads/nebular/core/action.h
    engines/mads/nebular/core/animation.h
    engines/mads/nebular/core/asound.h
    engines/mads/nebular/core/assets.h
    engines/mads/nebular/core/audio.h
    engines/mads/nebular/core/camera.h
    engines/mads/nebular/core/compression.h
    engines/mads/nebular/core/conversations.h
    engines/mads/nebular/core/dialogs.h
    engines/mads/nebular/core/events.h
    engines/mads/nebular/core/font.h
    engines/mads/nebular/core/game.h
    engines/mads/nebular/core/game_data.h
    engines/mads/nebular/core/globals.h
    engines/mads/nebular/core/hag.h
    engines/mads/nebular/core/hotspots.h
    engines/mads/nebular/core/inventory.h
    engines/mads/nebular/core/menu_views.h
    engines/mads/nebular/core/messages.h
    engines/mads/nebular/core/msurface.h
    engines/mads/nebular/core/palette.h
    engines/mads/nebular/core/player.h
    engines/mads/nebular/core/rails.h
    engines/mads/nebular/core/resources.h
    engines/mads/nebular/core/scene.h
    engines/mads/nebular/core/scene_data.h
    engines/mads/nebular/core/screen.h
    engines/mads/nebular/core/sequence.h
    engines/mads/nebular/core/sprites.h
    engines/mads/nebular/core/staticres.h
    engines/mads/nebular/core/user_interface.h
    engines/mads/nebular/debugger.h
    engines/mads/nebular/dialogs_nebular.h
    engines/mads/nebular/game_nebular.h
    engines/mads/nebular/globals_nebular.h
    engines/mads/nebular/menu_nebular.h
    engines/mads/nebular/nebular.h
    engines/mads/nebular/nebular_scenes.h
    engines/mads/nebular/sound_nebular.h


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 93a73bb3935..bb331cf2a47 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2423,7 +2423,7 @@ void kernel_refresh_dynamic() {
 	kernel_dynamic_changed = false;
 }
 
-char *kernel_full_name(int my_room, char type, int num, char *text, int ext) {
+char *kernel_full_name(int my_room, char type, int num, const char *text, int ext) {
 	char temp[2];
 
 	if (my_room > 0) {
diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index b9caf46d1fc..7e09e0e4ca0 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -567,7 +567,7 @@ extern void kernel_purge_dynamic();
 extern void kernel_init_dynamic();
 extern int kernel_dynamic_consecutive(int id);
 extern void kernel_refresh_dynamic();
-extern char *kernel_full_name(int my_room, char type, int num, char *text, int ext);
+extern char *kernel_full_name(int my_room, char type, int num, const char *text, int ext);
 extern char *kernel_name(char type, int num);
 extern char *kernel_interface_name(int num);
 extern void kernel_unload_sound_driver();
diff --git a/engines/mads/madsv2/nebular/global.cpp b/engines/mads/madsv2/nebular/global.cpp
new file mode 100644
index 00000000000..402d6aa4bab
--- /dev/null
+++ b/engines/mads/madsv2/nebular/global.cpp
@@ -0,0 +1,98 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/nebular/global.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/error.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
+
+// Section preloads
+extern void section_1_preload();
+extern void section_2_preload();
+extern void section_3_preload();
+extern void section_4_preload();
+extern void section_5_preload();
+extern void section_6_preload();
+extern void section_7_preload();
+extern void section_8_preload();
+
+extern void room_101_synchronize(Common::Serializer &s);
+
+} // namespace Rooms
+
+void global_section_constructor() {
+	section_preload_code_pointer = NULL;
+	section_room_constructor = NULL;
+	section_init_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+	section_daemon_code_pointer = NULL;
+
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_section) {
+	case 1:
+		section_preload_code_pointer = Rooms::section_1_preload;
+		break;
+	case 2:
+		section_preload_code_pointer = Rooms::section_2_preload;
+		break;
+	case 3:
+		section_preload_code_pointer = Rooms::section_3_preload;
+		break;
+	case 4:
+		section_preload_code_pointer = Rooms::section_4_preload;
+		break;
+	case 5:
+		section_preload_code_pointer = Rooms::section_5_preload;
+		break;
+	case 6:
+		section_preload_code_pointer = Rooms::section_6_preload;
+		break;
+	case 7:
+		section_preload_code_pointer = Rooms::section_7_preload;
+		break;
+	case 8:
+		section_preload_code_pointer = Rooms::section_8_preload;
+		break;
+	}
+}
+
+void sync_room(Common::Serializer &s) {
+	switch (new_room) {
+	case 101: Rooms::room_101_synchronize(s); break;
+	default: break;
+	}
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
new file mode 100644
index 00000000000..fecba94c80e
--- /dev/null
+++ b/engines/mads/madsv2/nebular/global.h
@@ -0,0 +1,217 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_GLOBAL_H
+#define MADS_NEBULAR_GLOBAL_H
+
+#include "common/serializer.h"
+#include "mads/madsv2/core/vocabh.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+enum GlobalId {
+	kSexOfRex				= 0,
+	kOldSexOfRex			= 1,
+	kWalkerTiming           = 2,
+//	kWalkerTiming0			= 3,
+	kTalkInanimateCount		= 4,
+	kCopyProtectFailed		= 5,
+
+	/* Section #1 variables */
+	kNeedToStandUp			= 10,
+	kTurkeyExploded			= 11,
+	kMedicineCabinetOpen	= 12,
+	kMedicineCabinetVirgin	= 13,
+	kWatchedViewScreen		= 14,
+	kHoovicAlive            = 15,
+	kHoovicSated            = 16,
+	kHoovicFishEaten        = 17,
+	kWaterInAPuddle			= 18,
+	kFishIn105				= 19,
+	kFishIn107				= 20,
+	kFishIn108				= 21,
+	kRandomNumber           = 29,
+
+	/* Section #2 variables */
+	kCurtainOpen            = 30,
+	kLadderBroken           = 31,
+	kBone202Status			= 32,
+	kMeteorologistStatus    = 33,
+	kRhotundaStatus         = 34,
+	kLeavesStatus           = 35,
+	kMonkeyStatus           = 36,
+	kMeteorologistEverSeen  = 37,
+	kMeteorologistWatch     = 38,
+	kTeleporterCommand      = 39,
+
+	kTeleporterDestination  = 40,
+	kTeleporterUnderstood   = 41,
+	kConv205                = 42,
+	kChickenPermitted      = 43,
+	kTwinklesStatus         = 44,
+	kTwinklesApproached     = 45,
+	kConvTwinkles1          = 46,
+	kConvTwinkles2          = 47,
+	kConvTwinkles3          = 48,
+	kConvTwinkles5			= 49,
+
+	kConvTwinkles6          = 50,
+	kConvTwinkles7          = 51,
+	kConvTwinkles8          = 52,
+	kBlowgunStatus          = 53,
+
+	/* Section #3 Variables */
+	kAfterHavoc             = 60,
+	kHaveYourStuff          = 61,
+	kRightView320			= 62,
+	kConvBuddy1				= 63,
+	kConvBuddy2				= 64,
+	kMetBuddyBeast          = 65,
+	kKnowsBuddyBeast        = 66,
+	kConvSlache1			= 67,
+	kConvSlache2			= 68,
+	kConvSlache3			= 69,
+
+	kRexHasMetSlache		= 70,
+	kConvIntern             = 71,
+	kHasSeenProfPyro		= 72,
+	kKickedIn391Grate		= 73,
+
+	/* Section #4 Variables */
+	kArmoryDoorOpen			= 80,
+	kStorageDoorOpen		= 81,
+	kNextIngredient         = 82,
+	kIngredientList         = 83,
+	kIngredientList1		= 84,
+	kIngredientList2		= 85,
+	kIngredientList3		= 86,
+	kIngredientQuantity     = 87,
+	kIngredientQuantity1	= 88,
+	kIngredientQuantity2	= 89,
+
+	kIngredientQuantity3	= 90,
+	kconvPyro_1             = 91,
+	kconvPyro_2             = 92,
+	kconvPyro_3             = 93,
+	kconvPyro_4             = 94,
+	kBadFirstIngredient     = 95,
+	kConvBartender1         = 96,
+	kConvBartender2			= 97,
+	kConvBartender3			= 98,
+	kConvBartender4			= 99,
+
+	kHasPurchased			= 100,
+	kBeenThruHelgaScene		= 101,
+	kHasSaidBinocs			= 102,
+	kHasSaidTimer			= 103,
+	kBottleDisplayed		= 104,
+	kHasBeenScanned			= 105,
+	kSomeoneHasExploded		= 106,
+
+	/* Section #5 Variables */
+	kBoatRaised				= 110,
+	kCarStatus				= 111,
+	kCityFlooded			= 112,
+	kLaserOn				= 113,
+	kLaserHoleIsThere		= 114,
+	kCarIsGone				= 115,
+	kRegisterOpen			= 116,
+	kSafeStatus				= 117,
+	kDogStatus              = 118,
+	kLineStatus             = 119,
+
+	kHoverCarLocation		= 120,
+	kHoverCarDestination	= 121,
+
+	/* Section #6 Variables */
+	kConvHermit1			= 130,
+	kConvHermit2			= 131,
+	kHasTalkedToHermit		= 132,
+	kHermitWantsBatteries	= 133,
+	kHandsetCellStatus		= 134,
+	kBeenInVideoStore		= 135,
+	kDurafailRecharged		= 136,
+	kPenlightCellStatus		= 137,
+	kTimebombStatus			= 138,
+	kCheckDaemonTimebomb	= 140,
+
+	kResurrectRoom			= 141,
+
+	/* Section #6 Time-Bomb Variables */
+	kTimebombClock			= 142,
+//	kTimebombClock0			= 143,
+	kTimebombTimer			= 144,
+//	kTimebombTimer0			= 145,
+	kWarnedFloodCity		= 146,
+
+	/* Section #7 Variables */
+	kBottleStatus			= 150,
+	kMonsterAlive			= 151,
+	kConvBottleFillNode		= 152,
+	kBoatStatus				= 153,
+
+	/* Section #8 Variables */
+	kAntigravClock			= 160,
+//	kAntigravClock0			= 161,
+	kAntigravTiming			= 162,
+//	kAntigravTiming0		= 163,
+	kWindowFixed			= 164,
+	kInSpace                = 165,
+	kReturnFromCut			= 166,
+	kBeamIsUp               = 167,
+	kForceBeamDown          = 168,
+	kCameFromCut            = 169,
+
+	kCutX                   = 170,
+	kCutY                   = 171,
+	kCutFacing				= 172,
+	kDontRepeat             = 173,
+	kHoppyDead              = 174,
+	kHasWatchedAntigrav		= 175,
+	kRemoteSequenceRan		= 176,
+	kRemoteOnGround			= 177,
+	kFromCockpit            = 178,
+	kExitShip               = 179,
+
+	kBetweenRooms           = 180,
+	kTopButtonPushed		= 181,
+	kTargetModInstalled		= 182,
+	kShieldModInstalled		= 183,
+	kUpBecauseOfRemote		= 184,
+
+	kTeleporterRoom         = 190,
+	kTeleporterCode         = 200
+};
+
+enum {
+	SEX_MALE = 0, SEX_UNKNOWN = 1, SEX_FEMALE = 2
+};
+
+extern void global_section_constructor();
+extern void sync_room(Common::Serializer &s);
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/mads/inventory.h b/engines/mads/madsv2/nebular/mads/inventory.h
new file mode 100644
index 00000000000..88a2abe530d
--- /dev/null
+++ b/engines/mads/madsv2/nebular/mads/inventory.h
@@ -0,0 +1,93 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MADS_INVENTORY_H
+#define MADS_NEBULAR_MADS_INVENTORY_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+enum {
+	OBJ_NONE = -1,
+	OBJ_BINOCULARS = 0,
+	OBJ_BURGER = 1,
+	OBJ_DEAD_FISH = 2,
+	OBJ_STUFFED_FISH = 3,
+	OBJ_REBREATHER = 4,
+	OBJ_TIMER_MODULE = 5,
+	OBJ_BIG_LEAVES = 6,
+	OBJ_POISON_DARTS = 7,
+	OBJ_PLANT_STALK = 8,
+	OBJ_BLOWGUN = 9,
+	OBJ_TWINKIFRUIT = 10,
+	OBJ_BONE = 11,
+	OBJ_CHICKEN = 12,
+	OBJ_SCALPEL = 13,
+	OBJ_AUDIO_TAPE = 14,
+	OBJ_CREDIT_CHIP = 15,
+	OBJ_SECURITY_CARD = 16,
+	OBJ_CHARGE_CASES = 17,
+	OBJ_ESTROTOXIN = 18,
+	OBJ_BOMB = 19,
+	OBJ_TIMEBOMB = 20,
+	OBJ_REPAIR_LIST = 21,
+	OBJ_ALIEN_LIQUOR = 22,
+	OBJ_TARGET_MODULE = 23,
+	OBJ_SHIELD_MODULATOR = 24,
+	OBJ_TAPE_PLAYER = 25,
+	OBJ_PHONE_CELLS = 26,
+	OBJ_PENLIGHT = 27,
+	OBJ_DURAFAIL_CELLS = 28,
+	OBJ_FAKE_ID = 29,
+	OBJ_ID_CARD = 30,
+	OBJ_POLYCEMENT = 31,
+	OBJ_FISHING_ROD = 32,
+	OBJ_FISHING_LINE = 33,
+	OBJ_PADLOCK_KEY = 34,
+	OBJ_DOOR_KEY = 35,
+	OBJ_REARVIEW_MIRROR = 36,
+	OBJ_COMPACT_CASE = 37,
+	OBJ_DETONATORS = 39,
+	OBJ_BOTTLE = 40,
+	OBJ_CHICKEN_BOMB = 41,
+	OBJ_VASE = 42,
+	OBJ_REMOTE = 43,
+	OBJ_COMPUTER_GAME = 44,
+	OBJ_PHONE_HANDSET = 45,
+	OBJ_BONES = 46,
+	OBJ_GUARDS_ARM = 47,
+	OBJ_LOG = 48,
+	OBJ_BOMBS = 49,
+	OBJ_NOTE = 50,
+	OBJ_COMBINATION = 51,
+	OBJ_FORMALDEHYDE = 52,
+	OBJ_PETROX = 53,
+	OBJ_LECITHIN = 54
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/mads/mads.cpp b/engines/mads/madsv2/nebular/mads/mads.cpp
new file mode 100644
index 00000000000..ed792a696d9
--- /dev/null
+++ b/engines/mads/madsv2/nebular/mads/mads.cpp
@@ -0,0 +1,23 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
diff --git a/engines/mads/madsv2/nebular/mads/words.h b/engines/mads/madsv2/nebular/mads/words.h
new file mode 100644
index 00000000000..dcb2aade962
--- /dev/null
+++ b/engines/mads/madsv2/nebular/mads/words.h
@@ -0,0 +1,1347 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MADS_WORDS_H
+#define MADS_NEBULAR_MADS_WORDS_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+enum {
+	VERB_NONE = 0,
+	VERB_LOOK = 3,
+	VERB_TAKE = 4,
+	VERB_PUSH = 5,
+	VERB_OPEN = 6,
+	VERB_PUT = 7,
+	VERB_TALKTO = 8,
+	VERB_GIVE = 9,
+	VERB_PULL = 10,
+	VERB_CLOSE = 11,
+	VERB_THROW = 12,
+	VERB_WALKTO = 13,
+	VERB_ACTIVATE = 0x00E,
+	VERB_ATTACH = 0x019,
+	VERB_BREAK = 0x032,
+	VERB_BREATHE_AIR = 0x033,
+	VERB_CAST = 0x03D,
+	VERB_CLIMB_DOWN = 0x04E,
+	VERB_CLIMB_THROUGH = 0x04F,
+	VERB_CLIMB_UP = 0x050,
+	VERB_CUT = 0x061,
+	VERB_DAMPEN = 0x064,
+	VERB_DISASSEMBLE = 0x06C,
+	VERB_DIVE_INTO = 0x06D,
+	VERB_DRINK = 0x072,
+	VERB_EAT = 0x075,
+	VERB_EJECT = 0x076,
+	VERB_EMPTY = 0x077,
+	VERB_EXAMINE = 0x07D,
+	VERB_FILL = 0x085,
+	VERB_FONDLE = 0x08C,
+	VERB_HOSE_DOWN = 0x0A6,
+	VERB_IGNITE = 0x0B4,
+	VERB_INFLATE = 0x0B5,
+	VERB_INSERT = 0x0B6,
+	VERB_INSPECT = 0x0B7,
+	VERB_GNAW_ON = 0x098,
+	VERB_GORGE_ON = 0x099,
+	VERB_HURL = 0x0A9,
+	VERB_LICK = 0x0CB,
+	VERB_LOOK_AT = 0x0D1,
+	VERB_LOOK_IN = 0x0D2,
+	VERB_LOOK_THROUGH = 0x0D3,
+	VERB_PEER_THROUGH = 0x103,
+	VERB_PLAY = 0x112,
+	VERB_PRESS = 0x11A,
+	VERB_PRY = 0x11C,
+	VERB_READ = 0x11F,
+	VERB_SET = 0x132,
+	VERB_SHAKE_HANDS = 0x133,
+	VERB_SHARPEN = 0x134,
+	VERB_SHOOT = 0x13A,
+	VERB_SIT_IN = 0x13F,
+	VERB_SMELL = 0x147,
+	VERB_SNIFF = 0x149,
+	VERB_STARE_AT = 0x155,
+	VERB_SWIM_ACROSS = 0x159,
+	VERB_SWIM_INTO = 0x15A,
+	VERB_SWIM_THROUGH = 0x15B,
+	VERB_SWIM_TO = 0x15C,
+	VERB_SWIM_TOWARDS = 0x15D,
+	VERB_SWIM_UNDER = 0x15E,
+	VERB_TIE = 0x170,
+	VERB_UNLOCK = 0x17B,
+	VERB_WALK_ACROSS = 0x187,
+	VERB_WALK_INSIDE = 0x188,
+	VERB_WALK_OUTSIDE = 0x18A,
+	VERB_WALK_THROUGH = 0x18B,
+	VERB_WALK_TOWARDS = 0x18C,
+	VERB_WEAR = 0x191,
+	VERB_WALK_DOWN = 0x1AD,
+	VERB_LEAVE = 0x1CD,
+	VERB_EXIT_FROM = 0x1CE,
+	VERB_USE = 0x20C,
+	VERB_GAZE_INTO = 0x212,
+	VERB_SIT_AT = 0x21F,
+	VERB_WALK_UP = 0x227,
+	VERB_WALK_INTO = 0x242,
+	VERB_EXIT = 0x298,
+	VERB_WALK_BEHIND = 0x2A2,
+	VERB_WALK_ONTO = 0x2B5,
+	VERB_RETURN_TO = 0x2D5,
+	VERB_CLIMB_INTO = 0x2F7,
+	VERB_STEP_INTO = 0x2F9,
+	VERB_CRAWL_TO = 0x2FB,
+	VERB_CRAWL_DOWN = 0x301,
+	VERB_SIT_ON = 0x30B,
+	VERB_WALK_ALONG = 0x312,
+	VERB_GET_INSIDE = 0x325,
+	VERB_WALK = 0x32F,
+	VERB_REFLECT = 0x365,
+	VERB_GET_INTO = 0x36A,
+	VERB_LOOK_OUT = 0x397,
+	VERB_APPLY = 0x3A6,
+	VERB_STEER_TOWARDS = 0x3B1,
+	VERB_NIBBLE_ON = 0x3B7,
+	VERB_ENTER = 0x3B8,
+	VERB_PUT_DOWN = 0x46F,
+	VERB_INSTALL = 0x474,
+	VERB_REMOVE = 0x476,
+	VERB_DEFACE = 0x489,
+	VERB_MASSAGE = 0x4A3,
+	VERB_MANGLE = 0x4A4,
+	VERB_RUB = 0x4A5,
+	VERB_JUGGLE = 0x4A6,
+	VERB_SMASH = 0x4A7,
+	VERB_GUZZLE = 0x4A8,
+	VERB_FOLD = 0x4AB,
+	VERB_SPINDLE = 0x4AC,
+	VERB_MUTILATE = 0x4AD
+};
+
+enum Noun {
+	//NOUN_GAME = 0x1,
+	//NOUN_QSAVE = 0x2,
+	//NOUN_LOOK = 0x3,
+	//NOUN_TAKE = 0x4,
+	//NOUN_PUSH = 0x5,
+	//NOUN_OPEN = 0x6,
+	//NOUN_PUT = 0x7,
+	//NOUN_TALK_TO = 0x8,
+	//NOUN_GIVE = 0x9,
+	//NOUN_PULL = 0xA,
+	//NOUN_CLOSE = 0xB,
+	//NOUN_THROW = 0xC,
+	//NOUN_WALK_TO = 0xD,
+	//NOUN_ACTIVATE = 0xE,
+	//NOUN_ADMIRE = 0xF,
+	NOUN_ADSM = 0x10,
+	NOUN_AIR_VENT = 0x11,
+	NOUN_ALOE_PLANT = 0x12,
+	NOUN_ANEMONE = 0x13,
+	NOUN_ANOMOMETER = 0x14,
+	NOUN_AREA_AROUND_HUT = 0x15,
+	NOUN_AREA_TO_SOUTH = 0x16,
+	NOUN_AREA_TO_WEST = 0x17,
+	NOUN_AROMATIC_MEAT = 0x18,
+	//NOUN_ATTACH = 0x19,
+	NOUN_AUDIO_TAPE = 0x1A,
+	NOUN_AUXILIARY_POWER = 0x1B,
+	NOUN_BADMITTON_BRAT = 0x1C,
+	NOUN_BAG = 0x1D,
+	NOUN_BAMBOO_TREE = 0x1E,
+	NOUN_BATS = 0x1F,
+	NOUN_BAWLEMER_ORIOLE_HUN = 0x20,
+	NOUN_BEAR_RUG = 0x21,
+	NOUN_BEASTLY_TROPHY = 0x22,
+	NOUN_BIG_LEAVES = 0x23,
+	NOUN_BIG_PIPES = 0x24,
+	NOUN_BIG_SKY = 0x25,
+	NOUN_BIG_STONE = 0x26,
+	NOUN_BINOCULARS = 0x27,
+	NOUN_BIRDIES = 0x28,
+	NOUN_BLOWGUN = 0x29,
+	NOUN_BOMB = 0x2A,
+	NOUN_BOMBS = 0x2B,
+	NOUN_BONE = 0x2C,
+	NOUN_BONES = 0x2D,
+	NOUN_BOTTLE = 0x2E,
+	NOUN_BOULDER = 0x2F,
+	NOUN_BOULDERS = 0x30,
+	NOUN_BRA = 0x31,
+	//NOUN_BREAK = 0x32,
+	//NOUN_BREATHE_AIR = 0x33,
+	NOUN_BULKHEAD = 0x34,
+	NOUN_BURGER = 0x35,
+	NOUN_BURN = 0x36,
+	NOUN_BURNT_OUT_WARP_COIL = 0x37,
+	NOUN_BUSH_LIKE_FORMATION = 0x38,
+	NOUN_BUSHES = 0x39,
+	NOUN_BUSHY_FERN = 0x3A,
+	NOUN_CACTUS = 0x3B,
+	NOUN_CARD = 0x3C,
+	//NOUN_CAST = 0x3D,
+	NOUN_CAULDRON = 0x3E,
+	NOUN_CAVE = 0x3F,
+	NOUN_CAVE_CEILING = 0x40,
+	NOUN_CAVE_ENTRANCE = 0x41,
+	NOUN_CAVE_EXIT = 0x42,
+	NOUN_CAVE_FLOOR = 0x43,
+	NOUN_CAVE_TO_EAST = 0x44,
+	NOUN_CAVE_WALL = 0x45,
+	NOUN_CEILING = 0x46,
+	NOUN_CHAIR = 0x47,
+	NOUN_CHARGE_CASES = 0x48,
+	NOUN_CHICKEN = 0x49,
+	NOUN_CHICKEN_BOMB = 0x4A,
+	NOUN_CLEARING_TO_EAST = 0x4B,
+	NOUN_CLEARING_TO_SOUTH = 0x4C,
+	NOUN_CLIFF_FACE = 0x4D,
+	//NOUN_CLIMB_DOWN = 0x4E,
+	//NOUN_CLIMB_THROUGH = 0x4F,
+	//NOUN_CLIMB_UP = 0x50,
+	NOUN_CLOCK = 0x51,
+	NOUN_CLOSET = 0x52,
+	NOUN_CLOTHESLINE = 0x53,
+	NOUN_CLUMP_OF_TREES = 0x54,
+	NOUN_COAL = 0x55,
+	NOUN_COCOANUT = 0x56,
+	NOUN_COMPACT_CASE = 0x57,
+	NOUN_COMPUTER_GAME = 0x58,
+	NOUN_CONTROL_PANEL = 0x59,
+	NOUN_CORAL = 0x5A,
+	NOUN_CRAB = 0x5B,
+	NOUN_CREDIT_CHIP = 0x5C,
+	NOUN_CUMULOUS_CLOUD = 0x5D,
+	NOUN_CURIOUS_WEED_PATCH = 0x5E,
+	NOUN_CURTAIN = 0x5F,
+	NOUN_CURTAINS = 0x60,
+	//NOUN_CUT = 0x61,
+	NOUN_DAMAGE_CONTROL = 0x62,
+	NOUN_DAMAGE_CONTROL_PANEL = 0x63,
+	//NOUN_DAMPEN = 0x64,
+	NOUN_DEAD_FISH = 0x65,
+	NOUN_DEAD_PURPLE_MONSTER = 0x66,
+	NOUN_DECLIVITOUS_CHASM = 0x67,
+	NOUN_DEEP_DARK_FOREST = 0x68,
+	NOUN_DENSE_FOREST = 0x69,
+	NOUN_DETONATORS = 0x6A,
+	NOUN_DINO_MITE = 0x6B,
+	//NOUN_DISASSEMBLE = 0x6C,
+	//NOUN_DIVE_INTO = 0x6D,
+	NOUN_DOOR = 0x6E,
+	NOUN_DOOR_KEY = 0x6F,
+	NOUN_DOORWAY = 0x70,
+	NOUN_DRAWER = 0x71,
+	//NOUN_DRINK = 0x72,
+	NOUN_DURAFAIL_CELLS = 0x73,
+	NOUN_EASTERN_CLIFF_FACE = 0x74,
+	//NOUN_EAT = 0x75,
+	//NOUN_EJECT = 0x76,
+	//NOUN_EMPTY = 0x77,
+	NOUN_ENGINEERING_CONTROLS = 0x78,
+	NOUN_ENGINEERING_SECTION = 0x79,
+	NOUN_ENTER_KEY = 0x7A,
+	NOUN_ESCAPE_HATCH = 0x7B,
+	NOUN_ESTROTOXIN = 0x7C,
+	//NOUN_EXAMINE = 0x7D,
+	NOUN_EXPERIMENT_CAGE = 0x7E,
+	NOUN_EXTINGUISH = 0x7F,
+	NOUN_FACE_ID = 0x80,
+	NOUN_FERN = 0x81,
+	NOUN_FIELD_TO_NORTH = 0x82,
+	NOUN_FIELD_TO_SOUTH = 0x83,
+	NOUN_FIELD_TO_WEST = 0x84,
+	//NOUN_FILL = 0x85,
+	NOUN_FIRE_PIT = 0x86,
+	NOUN_FISHING_LINE = 0x87,
+	NOUN_FISHING_ROD = 0x88,
+	NOUN_FLOOR = 0x89,
+	NOUN_FLOOR_OF_HUT = 0x8A,
+	NOUN_FLOOR_TILE = 0x8B,
+	//NOUN_FONDLE = 0x8C,
+	NOUN_FOREST_TO_EAST = 0x8D,
+	NOUN_FRONT_WINDOW = 0x8E,
+	NOUN_FUNGOIDS = 0x8F,
+	NOUN_FURNACE = 0x90,
+	NOUN_FUZZY_DICE = 0x91,
+	//NOUN_GAZE = 0x92,
+	//NOUN_GAZE_AT = 0x93,
+	//NOUN_GAZE_IN = 0x94,
+	//NOUN_GLANCE_AT = 0x95,
+	NOUN_GLOVE = 0x96,
+	NOUN_GNARLY_SHRUB = 0x97,
+	//NOUN_GNAW_ON = 0x98,
+	//NOUN_GORGE_ON = 0x99,
+	NOUN_GRAIN_ALCHOHOL = 0x9A,
+	NOUN_GRASSLAND_TO_EAST = 0x9B,
+	NOUN_GRASSLAND_TO_SOUTH = 0x9C,
+	NOUN_GRASSY_AREA = 0x9D,
+	NOUN_GRASSY_AREA_TO_NORTH = 0x9E,
+	NOUN_GRASSY_KNOLL = 0x9F,
+	//NOUN_GRIND = 0xA0,
+	NOUN_GROOVILACTIC_TREE = 0xA1,
+	NOUN_GUARDS_ARM = 0xA2,
+	NOUN_HATCHWAY = 0xA3,
+	//NOUN_HOOK_UP = 0xA4,
+	NOUN_HORIZON = 0xA5,
+	//NOUN_HOSE_DOWN = 0xA6,
+	NOUN_HOTPANTS = 0xA7,
+	NOUN_HULL = 0xA8,
+	//NOUN_HURL = 0xA9,
+	NOUN_HUT = 0xAA,
+	NOUN_HUT_AREA = 0xAB,
+	NOUN_HUT_TO_EAST = 0xAC,
+	NOUN_HUT_TO_SOUTH = 0xAD,
+	NOUN_HUT_TO_THE_SOUTH = 0xAE,
+	NOUN_HUT_TO_WEST = 0xAF,
+	NOUN_HUTS_TO_NORTH = 0xB0,
+	NOUN_HYDROSPANNER = 0xB1,
+	NOUN_HYPERDRIVE_JUMP_UNIT = 0xB2,
+	NOUN_ID_CARD = 0xB3,
+	//NOUN_IGNITE = 0xB4,
+	//NOUN_INFLATE = 0xB5,
+	//NOUN_INSERT = 0xB6,
+	//NOUN_INSPECT = 0xB7,
+	NOUN_JUNGLE = 0xB8,
+	NOUN_JUNGLE_TO_EAST = 0xB9,
+	NOUN_JUNGLE_TO_WEST = 0xBA,
+	NOUN_KEY_1 = 0xBB,
+	NOUN_KEY_2 = 0xBC,
+	NOUN_KEY_3 = 0xBD,
+	NOUN_KEY_4 = 0xBE,
+	NOUN_KEY_5 = 0xBF,
+	NOUN_KEY_6 = 0xC0,
+	NOUN_KEY_7 = 0xC1,
+	NOUN_KEY_8 = 0xC2,
+	NOUN_KEY_9 = 0xC3,
+	NOUN_KEYPAD = 0xC4,
+	NOUN_KNEELING_WOMAN = 0xC5,
+	NOUN_KNIFE = 0xC6,
+	NOUN_LADDER = 0xC7,
+	NOUN_LARGE_STALAGMITE = 0xC8,
+	//NOUN_LEER_AT = 0xC9,
+	NOUN_LIBRARY_COMPUTER = 0xCA,
+	//NOUN_LICK = 0xCB,
+	NOUN_LIFE_SUPPORT_SECTION = 0xCC,
+	NOUN_LIGHT = 0xCD,
+	//NOUN_LOAD = 0xCE,
+	//NOUN_LOCK = 0xCF,
+	NOUN_LOG = 0xD0,
+	//NOUN_LOOK_AT = 0xD1,
+	//NOUN_LOOK_IN = 0xD2,
+	//NOUN_LOOK_THROUGH = 0xD3,
+	NOUN_LOUNGE_AREA = 0xD4,
+	NOUN_LOVE_ALTAR = 0xD5,
+	NOUN_LOWLANDS = 0xD6,
+	NOUN_MACHINE = 0xD7,
+	NOUN_MAGNET = 0xD8,
+	NOUN_MAIN_AIRLOCK = 0xD9,
+	NOUN_MANTA_RAY = 0xDA,
+	NOUN_MARSHY_WETLANDS = 0xDB,
+	NOUN_MATCH = 0xDC,
+	NOUN_MEDICAL_WASTE = 0xDD,
+	NOUN_MEDICINE_CABINET = 0xDE,
+	NOUN_MEN_WHO_CAME_BEFORE = 0xDF,
+	NOUN_MINE = 0xE0,
+	NOUN_MIRROR = 0xE1,
+	NOUN_MONITOR = 0xE2,
+	NOUN_MONKEY = 0xE3,
+	NOUN_MONKEY_LIVER_JUICE = 0xE4,
+	NOUN_MONSTER_SLUDGE = 0xE5,
+	NOUN_MOUNTAIN = 0xE6,
+	NOUN_MOUNTAIN_RANGE = 0xE7,
+	NOUN_MOUNTAINS = 0xE8,
+	NOUN_MTAM = 0xE9,
+	NOUN_MUSHROOMS = 0xEA,
+	NOUN_NAVIGATION_CONTROLS = 0xEB,
+	NOUN_NORTH_PATH = 0xEC,
+	NOUN_NORTHERN_EXPOSURE = 0xED,
+	NOUN_NORTHERN_SEA_CLIFF = 0xEE,
+	NOUN_OBSTACLE = 0xEF,
+	NOUN_OCEAN_FLOOR = 0xF0,
+	NOUN_ODD_ROCK_FORMATION = 0xF1,
+	NOUN_OOGLY_BOOGLY_JUICE = 0xF2,
+	NOUN_OPEN_AREA_TO_EAST = 0xF3,
+	NOUN_OPEN_AREA_TO_NORTH = 0xF4,
+	NOUN_OPEN_AREA_TO_SOUTH = 0xF5,
+	NOUN_OPEN_AREA_TO_WEST = 0xF6,
+	NOUN_OPEN_FIELD = 0xF7,
+	NOUN_OUTER_HULL = 0xF8,
+	NOUN_OUTSIDE = 0xF9,
+	NOUN_OVEN = 0xFA,
+	NOUN_OVERHANG_TO_EAST = 0xFB,
+	NOUN_OVERHANG_TO_WEST = 0xFC,
+	NOUN_OVERHEAD_LAMP = 0xFD,
+	NOUN_PAD_OF_PAPER = 0xFE,
+	NOUN_PADLOCK_KEY = 0xFF,
+	NOUN_PALM_TREE = 0x100,
+	NOUN_PASSAGE_WAY_TO_SOUTH = 0x101,
+	NOUN_PASSION_PUSS = 0x102,
+	//NOUN_PEER_THROUGH = 0x103,
+	NOUN_PENCIL = 0x104,
+	NOUN_PENDULOUS_CRAG = 0x105,
+	NOUN_PENLIGHT = 0x106,
+	NOUN_PHONE_CELLS = 0x107,
+	NOUN_PHONE_HANDSET = 0x108,
+	NOUN_PILE_OF_ROCKS = 0x109,
+	NOUN_PILLOW = 0x10A,
+	NOUN_PILOTS_CHAIR = 0x10B,
+	NOUN_PIPE = 0x10C,
+	NOUN_PIRANHA = 0x10D,
+	NOUN_PLANT = 0x10E,
+	NOUN_PLANT_STALK = 0x10F,
+	NOUN_PLANTS = 0x110,
+	NOUN_PLASTIC_JESUS = 0x111,
+	//NOUN_PLAY = 0x112,
+	NOUN_PLUNGER = 0x113,
+	NOUN_POISON_DARTS = 0x114,
+	NOUN_POLYCEMENT = 0x115,
+	NOUN_POOL = 0x116,
+	NOUN_POSTER = 0x117,
+	NOUN_POWER_STATUS_PANEL = 0x118,
+	NOUN_PRECIPICE = 0x119,
+	//NOUN_PRESS = 0x11A,
+	NOUN_PRESSURE_GAUGE = 0x11B,
+	//NOUN_PRY = 0x11C,
+	NOUN_RAGING_RIVER = 0x11D,
+	NOUN_RAMOLYAN_RUGBY_RATS = 0x11E,
+	//NOUN_READ = 0x11F,
+	NOUN_REARVIEW_MIRROR = 0x120,
+	NOUN_REBREATHER = 0x121,
+	NOUN_REFRIGERATOR = 0x122,
+	NOUN_REMOTE = 0x123,
+	NOUN_REPAIR_LIST = 0x124,
+	NOUN_RIVER = 0x125,
+	NOUN_RIVER_TO_WEST = 0x126,
+	NOUN_ROBO_KITCHEN = 0x127,
+	NOUN_ROCK = 0x128,
+	NOUN_ROCKS = 0x129,
+	NOUN_ROCKY_AREA = 0x12A,
+	NOUN_ROLLING_HILL = 0x12B,
+	NOUN_SCALPEL = 0x12C,
+	NOUN_SCENIC_MOUNTAINS = 0x12D,
+	NOUN_SEA_CLIFF = 0x12E,
+	NOUN_SEAWEED = 0x12F,
+	NOUN_SEAWEED_BANK = 0x130,
+	NOUN_SECURITY_CARD = 0x131,
+	//NOUN_SET = 0x132,
+	//NOUN_SHAKE_HANDS = 0x133,
+	//NOUN_SHARPEN = 0x134,
+	NOUN_SHIELD_ACCESS_PANEL = 0x135,
+	NOUN_SHIELD_GENERATOR = 0x136,
+	NOUN_SHIELD_MODULATOR = 0x137,
+	NOUN_SHIELD_STATUS_PANEL = 0x138,
+	NOUN_SHIP = 0x139,
+	//NOUN_SHOOT = 0x13A,
+	NOUN_SHOVEL = 0x13B,
+	//NOUN_SHRED = 0x13C,
+	NOUN_SHRUNKEN_HEADS = 0x13D,
+	NOUN_SINGED_MEAT = 0x13E,
+	//NOUN_SIT_IN = 0x13F,
+	NOUN_SKULL = 0x140,
+	NOUN_SKULL_AND_CROSSBONES = 0x141,
+	NOUN_SKY = 0x142,
+	//NOUN_SLEEP_ON = 0x143,
+	NOUN_SLITHERING_SNAKE = 0x144,
+	NOUN_SLUG_SECRETION = 0x145,
+	NOUN_SMALL_HOLE = 0x146,
+	//NOUN_SMELL = 0x147,
+	NOUN_SNAKE = 0x148,
+	//NOUN_SNIFF = 0x149,
+	//NOUN_SOAK = 0x14A,
+	NOUN_SPECIAL_KEY_1 = 0x14B,
+	NOUN_SPECIAL_KEY_2 = 0x14C,
+	NOUN_SPIDER = 0x14D,
+	NOUN_SPILT_MILK = 0x14E,
+	NOUN_SPIT_FIRE = 0x14F,
+	//NOUN_SPRAY = 0x150,
+	//NOUN_STAB = 0x151,
+	NOUN_STAIRS = 0x152,
+	NOUN_STALAGMITES = 0x153,
+	//NOUN_STAND_INSIDE = 0x154,
+	//NOUN_STARE_AT = 0x155,
+	NOUN_STEPS = 0x156,
+	NOUN_STUFFED_FISH = 0x157,
+	NOUN_SURFACE = 0x158,
+	//NOUN_SWIM_ACROSS = 0x159,
+	//NOUN_SWIM_INTO = 0x15A,
+	//NOUN_SWIM_THROUGH = 0x15B,
+	//NOUN_SWIM_TO = 0x15C,
+	//NOUN_SWIM_TOWARDS = 0x15D,
+	//NOUN_SWIM_UNDER = 0x15E,
+	NOUN_SWOOPING_CREATURE = 0x15F,
+	NOUN_TABLE = 0x160,
+	//NOUN_TAKE_LIVER = 0x161,
+	//NOUN_TAKE_OFF = 0x162,
+	//NOUN_TAKE_PAGE = 0x163,
+	NOUN_TALL_GRASS = 0x164,
+	NOUN_TAPE_PLAYER = 0x165,
+	NOUN_TARGET_COMPUTER = 0x166,
+	NOUN_TARGET_MODULE = 0x167,
+	NOUN_TARGETTING_COMPUTER = 0x168,
+	NOUN_TASMANIAN_DEVIL = 0x169,
+	NOUN_TASTY_TURKEY = 0x16A,
+	NOUN_TELEPORT_DEVICE = 0x16B,
+	NOUN_TELEPORTER = 0x16C,
+	NOUN_THATCHED_ROOF = 0x16D,
+	NOUN_THORNS = 0x16E,
+	NOUN_THORNY_BUSH = 0x16F,
+	//NOUN_TIE = 0x170,
+	NOUN_TIMEBOMB = 0x171,
+	NOUN_TIMER = 0x172,
+	NOUN_TIMER_MODULE = 0x173,
+	NOUN_TREE = 0x174,
+	NOUN_TREES = 0x175,
+	NOUN_TRODDEN_PATH = 0x176,
+	NOUN_TUBE = 0x177,
+	NOUN_TUNNEL = 0x178,
+	NOUN_TWINKIE_BUSH = 0x179,
+	NOUN_TWINKIFRUIT = 0x17A,
+	//NOUN_UNLOCK = 0x17B,
+	NOUN_UZI = 0x17C,
+	NOUN_VASE = 0x17D,
+	NOUN_VIDEO_GAME = 0x17E,
+	//NOUN_VIEW = 0x17F,
+	NOUN_VIEW_SCREEN = 0x180,
+	NOUN_VIEWPORT = 0x181,
+	NOUN_VILLAGE_AREA = 0x182,
+	NOUN_VILLAGE_TO_WEST = 0x183,
+	NOUN_VOLCANO = 0x184,
+	NOUN_VULTURE = 0x185,
+	NOUN_WAD_OF_CATTLE_PARTS = 0x186,
+	//NOUN_WALK_ACROSS = 0x187,
+	//NOUN_WALK_INSIDE = 0x188,
+	//NOUN_WALK_ON = 0x189,
+	//NOUN_WALK_OUTSIDE = 0x18A,
+	//NOUN_WALK_THROUGH = 0x18B,
+	//NOUN_WALK_TOWARDS = 0x18C,
+	NOUN_WALL = 0x18D,
+	NOUN_WATCH_TOWER = 0x18E,
+	NOUN_WATER = 0x18F,
+	NOUN_WEAPONS_DISPLAY = 0x190,
+	//NOUN_WEAR = 0x191,
+	NOUN_WEATHER_STATION = 0x192,
+	NOUN_WEATHER_VANE = 0x193,
+	NOUN_WEIGHT_MACHINE = 0x194,
+	NOUN_WESTERN_CLIFF_FACE = 0x195,
+	NOUN_WHEEL = 0x196,
+	NOUN_WINDOW = 0x197,
+	NOUN_WITCHDOCTOR_HUT = 0x198,
+	NOUN_WORKBENCH = 0x199,
+	//NOUN_WRITE_ON = 0x19A,
+	NOUN_YELLOW_BIRDY = 0x19B,
+	NOUN_GRASS = 0x19C,
+	NOUN_BOUNCING_REPTILE = 0x19D,
+	NOUN_DEEP_PIT = 0x19E,
+	NOUN_LOWLANDS_TO_NORTH = 0x19F,
+	NOUN_SMALL_BUSH = 0x1A0,
+	NOUN_SMALL_CACTUS = 0x1A1,
+	NOUN_ROCKY_AREA_TO_NORTH = 0x1A2,
+	NOUN_BAMBOO_LIKE_PLANT = 0x1A3,
+	NOUN_MOUNTAINSIDE = 0x1A4,
+	NOUN_FIELD = 0x1A5,
+	NOUN_GRASSY_FIELD = 0x1A6,
+	NOUN_CRAG = 0x1A7,
+	NOUN_HUGE_LEGS = 0x1A8,
+	NOUN_LEAF_COVERED_PIT = 0x1A9,
+	NOUN_PILE_OF_LEAVES = 0x1AA,
+	NOUN_OPEN_FIELD_TO_EAST = 0x1AB,
+	NOUN_LAWN = 0x1AC,
+	//NOUN_WALK_DOWN = 0x1AD,
+	NOUN_PATH_TO_WEST = 0x1AE,
+	NOUN_HEDGE = 0x1AF,
+	NOUN_VILLAGE_PATH = 0x1B0,
+	NOUN_PATH_TO_NORTHEAST = 0x1B1,
+	NOUN_JUNGLE_PATH = 0x1B2,
+	NOUN_THICK_UNDERGROWTH = 0x1B3,
+	NOUN_OCEAN = 0x1B4,
+	NOUN_OCEAN_IN_DISTANCE = 0x1B5,
+	NOUN_STRANGE_DEVICE = 0x1B6,
+	NOUN_BUSH = 0x1B7,
+	NOUN_ANEMOMETER = 0x1B8,
+	NOUN_ISLAND_IN_DISTANCE = 0x1B9,
+	NOUN_PATH = 0x1BA,
+	NOUN_TROPHY = 0x1BB,
+	NOUN_SPECIMEN_JARS = 0x1BC,
+	NOUN_BOWL = 0x1BD,
+	NOUN_LARGE_BOWL = 0x1BE,
+	NOUN_PATH_TO_NORTH = 0x1BF,
+	NOUN_HUT_TO_NORTH = 0x1C0,
+	NOUN_PATH_TO_EAST = 0x1C1,
+	NOUN_CHICKEN_ON_SPIT = 0x1C2,
+	NOUN_CAPTIVE_CREATURE = 0x1C3,
+	NOUN_TWINKIFRUIT_BUSH = 0x1C4,
+	NOUN_STREAM = 0x1C5,
+	NOUN_OPPOSITE_SHORE = 0x1C6,
+	NOUN_PATH_TO_SOUTH = 0x1C7,
+	NOUN_OPPOSITE_BANK = 0x1C8,
+	NOUN_BROKEN_LADDER = 0x1C9,
+	NOUN_BAG_OF_TWINKIFRUITS = 0x1CA,
+	NOUN_BED = 0x1CB,
+	NOUN_DISPLAY = 0x1CC,
+	//NOUN_LEAVE = 0x1CD,
+	//NOUN_EXIT_FROM = 0x1CE,
+	NOUN_DEVICE = 0x1CF,
+	NOUN_0_KEY = 0x1D0,
+	NOUN_1_KEY = 0x1D1,
+	NOUN_2_KEY = 0x1D2,
+	NOUN_3_KEY = 0x1D3,
+	NOUN_4_KEY = 0x1D4,
+	NOUN_5_KEY = 0x1D5,
+	NOUN_6_KEY = 0x1D6,
+	NOUN_7_KEY = 0x1D7,
+	NOUN_8_KEY = 0x1D8,
+	NOUN_9_KEY = 0x1D9,
+	NOUN_FROWN_KEY = 0x1DA,
+	NOUN_SMILE_KEY = 0x1DB,
+	NOUN_NATIVE_WOMAN = 0x1DC,
+	NOUN_YELLOW_BIRD = 0x1DD,
+	NOUN_BLEEPER = 0x1DE,
+	NOUN_SIZEMOMETER = 0x1DF,
+	NOUN_PANEL = 0x1E0,
+	NOUN_PRINTER = 0x1E1,
+	NOUN_HARD_DRIVE = 0x1E2,
+	NOUN_BATHROOM = 0x1E3,
+	NOUN_DESK = 0x1E4,
+	NOUN_PASSAGEWAY = 0x1E5,
+	NOUN_FIRE_HYDRANT = 0x1E6,
+	NOUN_FREEZER = 0x1E7,
+	NOUN_EQUIDIGITIZER = 0x1E8,
+	NOUN_VISION_VIEW = 0x1E9,
+	NOUN_TELEDETECTOR = 0x1EA,
+	NOUN_POLE = 0x1EB,
+	NOUN_TRANSPOSITION_DEVICE = 0x1EC,
+	NOUN_STATUESQUE = 0x1ED,
+	NOUN_TEMPERATURE_GAUGE = 0x1EE,
+	NOUN_CHECK = 0x1EF,
+	NOUN_WATCH = 0x1F0,
+	NOUN_ELECTRO_SCANNER = 0x1F1,
+	NOUN_HALL = 0x1F2,
+	NOUN_SCANNER = 0x1F3,
+	//NOUN_PLACE_HAND_ON = 0x1F4,
+	NOUN_SECURITY_MONITOR = 0x1F5,
+	NOUN_DIGITORAMA = 0x1F6,
+	NOUN_RAIL_BEAM = 0x1F7,
+	NOUN_VAULT = 0x1F8,
+	NOUN_HALLWAY = 0x1F9,
+	NOUN_PIPES = 0x1FA,
+	NOUN_AIR_VENT_GRATE = 0x1FB,
+	NOUN_SECURITY_OFFICE = 0x1FC,
+	NOUN_SIGNAL = 0x1FD,
+	NOUN_BLEEP = 0x1FE,
+	NOUN_BLIP = 0x1FF,
+	NOUN_LOFT = 0x200,
+	NOUN_ELECTRONIC_ANT_FARM = 0x201,
+	NOUN_ELECTRIC_WIRING = 0x202,
+	NOUN_SECURITY_PANEL = 0x203,
+	NOUN_CORRIDOR = 0x204,
+	NOUN_CIRCUIT_CONTROLS = 0x205,
+	NOUN_AIR_DUCT = 0x206,
+	NOUN_CELL_WALL = 0x207,
+	NOUN_LIGHTS = 0x208,
+	//NOUN_STARE_INTO = 0x209,
+	NOUN_CELL_CONTROLS = 0x20A,
+	NOUN_COMMODE = 0x20B,
+	//NOUN_USE = 0x20C,
+	NOUN_BASIN = 0x20D,
+	//NOUN_JUMP_INSIDE = 0x20E,
+	NOUN_PREVIOUS_CELL = 0x20F,
+	NOUN_NEXT_ROOM = 0x210,
+	NOUN_ZINK = 0x211,
+	//NOUN_GAZE_INTO = 0x212,
+	NOUN_THRONE = 0x213,
+	NOUN_SACK = 0x214,
+	NOUN_LIMB = 0x215,
+	NOUN_SINK = 0x216,
+	NOUN_JOHNNY_ON_THE_SPOT = 0x217,
+	NOUN_DEBRIS = 0x218,
+	NOUN_BUNK = 0x219,
+	NOUN_NEXT_CELL = 0x21A,
+	NOUN_TOILET = 0x21B,
+	NOUN_MONITOR_AREA = 0x21C,
+	NOUN_SIDEWALL = 0x21D,
+	NOUN_COFFEE_MUG = 0x21E,
+	//NOUN_SIT_AT = 0x21F,
+	NOUN_LIGHTING_FIXTURE = 0x220,
+	NOUN_MONITORS = 0x221,
+	NOUN_GENDER_CONTROLS = 0x222,
+	NOUN_NEURO_ANALYZER = 0x223,
+	NOUN_MOLECULAR_RECORDER = 0x224,
+	NOUN_MAINTENANCE_PANEL = 0x225,
+	NOUN_RAMP = 0x226,
+	//NOUN_WALK_UP = 0x227,
+	NOUN_SUBSONIC_ATOMIZER = 0x228,
+	NOUN_EIGHT_BALL = 0x229,
+	NOUN_DNA_INVERTER = 0x22A,
+	NOUN_DNA_CONVERTER = 0x22B,
+	NOUN_PLATFORM = 0x22C,
+	NOUN_GUINEA_PIG_TEST_BOX = 0x22D,
+	NOUN_GASEOUS_PROBE_WARPER = 0x22E,
+	NOUN_TOOL_CABINET = 0x22F,
+	NOUN_SURGICAL_BOXES = 0x230,
+	NOUN_FETAL_HEART_MONITOR = 0x231,
+	NOUN_XRAY_CABINET = 0x232,
+	NOUN_STERILIZATION_SINK = 0x233,
+	NOUN_DRIPOLATOR = 0x234,
+	NOUN_SHOCK_MACHINE = 0x235,
+	NOUN_INTERROGATION_TABLE = 0x236,
+	NOUN_LIE_DOWN_ON = 0x237,
+	//NOUN_DECIPHER = 0x238,
+	NOUN_GUARD = 0x239,
+	NOUN_RIP_IN_FLOOR = 0x23A,
+	NOUN_TELEPORT_AREA = 0x23B,
+	NOUN_BROKEN_BEAM = 0x23C,
+	NOUN_ROCK_CHUNK = 0x23D,
+	NOUN_BLOODY_CELL_WALL = 0x23E,
+	NOUN_WALL_BOARD = 0x23F,
+	NOUN_GENDER_SCANNER = 0x240,
+	NOUN_BAR = 0x241,
+	//NOUN_WALK_INTO = 0x242,
+	NOUN_HALLWAY_TO_SOUTH = 0x243,
+	NOUN_SIGN = 0x244,
+	NOUN_HALLWAY_TO_NORTH = 0x245,
+	NOUN_BOTTLES = 0x246,
+	NOUN_UPPER_DANCE_FLOOR = 0x247,
+	NOUN_DANCE_FLOOR = 0x248,
+	NOUN_RAILING = 0x249,
+	NOUN_BAR_STOOL = 0x24A,
+	NOUN_LADY = 0x24B,
+	NOUN_UPPER_LEVEL = 0x24C,
+	NOUN_ALCOVE = 0x24D,
+	NOUN_DISCO_BALL = 0x24E,
+	NOUN_LADIES = 0x24F,
+	NOUN_COACH_LAMP = 0x250,
+	NOUN_CARD_SLOT = 0x251,
+	NOUN_HOOP = 0x252,
+	NOUN_CANNONBALLS = 0x253,
+	NOUN_WATER_FOUNTAIN = 0x254,
+	NOUN_HALLWAY_TO_EAST = 0x255,
+	NOUN_HALLWAY_TO_WEST = 0x256,
+	NOUN_SUPPORT = 0x257,
+	NOUN_BACKBOARD = 0x258,
+	NOUN_WIDE_DOOR = 0x259,
+	NOUN_SIGN_POST = 0x25A,
+	NOUN_FIRE_EXTINGUISHER = 0x25B,
+	NOUN_TRASH = 0x25C,
+	NOUN_MISSILES = 0x25D,
+	NOUN_TANK = 0x25E,
+	NOUN_TWO_TON_WEIGHT = 0x25F,
+	NOUN_ONE_TON_TOMATO = 0x260,
+	NOUN_ANVIL = 0x261,
+	NOUN_MINUTEMAN_IV_ICBM = 0x262,
+	NOUN_CHEST = 0x263,
+	NOUN_ARMOR = 0x264,
+	NOUN_CARTON = 0x265,
+	NOUN_POWDER = 0x266,
+	NOUN_RAFT = 0x267,
+	NOUN_WHATZIT = 0x268,
+	NOUN_CATAPULT = 0x269,
+	NOUN_HAND_GRENADE = 0x26A,
+	NOUN_BARRELS = 0x26B,
+	NOUN_LOADING_RAMP = 0x26C,
+	NOUN_BLIMP = 0x26D,
+	NOUN_FLOUR = 0x26E,
+	NOUN_FLY_PAPER = 0x26F,
+	NOUN_RUG = 0x270,
+	NOUN_CARPET = 0x271,
+	NOUN_CAN = 0x272,
+	NOUN_RUBBER_DUCKIE = 0x273,
+	NOUN_GOLF_CLUBS = 0x274,
+	NOUN_RAT = 0x275,
+	NOUN_BARREL = 0x276,
+	NOUN_BUCKET_OF_TAR = 0x277,
+	NOUN_SACKS = 0x278,
+	NOUN_STORAGE = 0x279,
+	NOUN_120V_3_PHASE_400HZ = 0x27A,
+	NOUN_LAB_EQUIPMENT = 0x27B,
+	NOUN_AIR_HORN = 0x27C,
+	NOUN_JAR = 0x27D,
+	NOUN_SEVERED_CABLE = 0x27E,
+	NOUN_PROBE_ASSEMBLY = 0x27F,
+	NOUN_KNIFE_SWITCH = 0x280,
+	NOUN_WORK_BENCH = 0x281,
+	NOUN_HEATER = 0x282,
+	NOUN_TOXIC_WASTE = 0x283,
+	NOUN_EXPERIMENT = 0x284,
+	NOUN_DRAWING_BOARD = 0x285,
+	NOUN_MISHAP = 0x286,
+	NOUN_AIR_PURIFIER = 0x287,
+	NOUN_DUMMY = 0x288,
+	NOUN_PICTURE = 0x289,
+	NOUN_BAGGAGE_CHECK = 0x28A,
+	NOUN_DEPARTURE_SCHEDULE = 0x28B,
+	NOUN_SHADE_OF_PALE = 0x28C,
+	NOUN_ITINERARY = 0x28D,
+	NOUN_BARGAIN_VAT = 0x28E,
+	NOUN_PENCILS = 0x28F,
+	NOUN_PAD_IF_PAPER = 0x290,
+	NOUN_DEEPEST_DEPTHS = 0x291,
+	NOUN_ROLODEX = 0x292,
+	NOUN_MONA_TISA = 0x293,
+	NOUN_ABSTRACT_ART = 0x294,
+	NOUN_SPACE_QUESTING_VIII = 0x295,
+	NOUN_THEATRICAL_ART = 0x296,
+	NOUN_METAL_POLE = 0x297,
+	NOUN_EXIT = 0x298,
+	NOUN_SWIRLING_LIGHT = 0x299,
+	NOUN_REGISTER = 0x29A,
+	NOUN_PEACHY_BUNS = 0x29B,
+	NOUN_OUR_TOWN = 0x29C,
+	NOUN_EMBROIDERED_ART = 0x29D,
+	NOUN_GEORGE_BUSH_ALIKE = 0x29E,
+	NOUN_COUNTER = 0x29F,
+	NOUN_SENSOR = 0x2A0,
+	NOUN_SOFTWARE_INFORMATION = 0x2A1,
+	//NOUN_WALK_BEHIND = 0x2A2,
+	NOUN_BARGAINS = 0x2A3,
+	NOUN_SCAN_LIGHT = 0x2A4,
+	NOUN_OLD_SOFTWARE_STAND = 0x2A5,
+	NOUN_SOFTWARE_SHELF = 0x2A6,
+	NOUN_HOTTEST_SOFTWARE = 0x2A7,
+	NOUN_GREAT_PAINTBALL_ART = 0x2A8,
+	NOUN_SCENIC_VISTA = 0x2A9,
+	NOUN_LASER = 0x2AA,
+	NOUN_LASER_JET = 0x2AB,
+	NOUN_LEVER = 0x2AC,
+	NOUN_BULLSEYE = 0x2AD,
+	NOUN_STAND = 0x2AE,
+	NOUN_CONTROL_STATION = 0x2AF,
+	NOUN_STRANGE_MONSTER = 0x2B0,
+	NOUN_GHASTLY_BEAST = 0x2B1,
+	//NOUN_GAWK_AT = 0x2B2,
+	NOUN_CORRIDOR_TO_SOUTH = 0x2B3,
+	NOUN_CORRIDOR_TO_NORTH = 0x2B4,
+	//NOUN_WALK_ONTO = 0x2B5,
+	NOUN_ROCK_WALL = 0x2B6,
+	NOUN_WOMAN = 0x2B7,
+	NOUN_WOMEN = 0x2B8,
+	NOUN_CORRIDOR_TO_EAST = 0x2B9,
+	NOUN_CORRIDOR_TO_WEST = 0x2BA,
+	NOUN_AMMUNITION = 0x2BB,
+	NOUN_ARMORED_VEHICLE = 0x2BC,
+	NOUN_TOMATO = 0x2BD,
+	NOUN_MISSILE = 0x2BE,
+	NOUN_SUIT_OF_ARMOR = 0x2BF,
+	NOUN_POWDER_CONTAINER = 0x2C0,
+	NOUN_INFLATABLE_RAFT = 0x2C1,
+	NOUN_GRENADE = 0x2C2,
+	NOUN_FENCE = 0x2C3,
+	NOUN_WOODEN_STATUE = 0x2C4,
+	NOUN_CONVEYER_BELT = 0x2C5,
+	NOUN_CONTROLS = 0x2C6,
+	NOUN_EQUIPMENT = 0x2C7,
+	NOUN_SHELF = 0x2C8,
+	NOUN_CABINETS = 0x2C9,
+	NOUN_CONTROL_CONSOLE = 0x2CA,
+	NOUN_FAUCET = 0x2CB,
+	NOUN_PANEL_BOX = 0x2CC,
+	NOUN_STATUE = 0x2CD,
+	NOUN_GAUGE = 0x2CE,
+	NOUN_CIRCUIT_PANEL = 0x2CF,
+	NOUN_CATWALK = 0x2D0,
+	NOUN_CIRCUITS = 0x2D1,
+	NOUN_BLOOD_STAIN = 0x2D2,
+	NOUN_GRATE = 0x2D3,
+	NOUN_AIR_SHAFT = 0x2D4,
+	//NOUN_RETURN_TO = 0x2D5,
+	NOUN_FORMALDEHYDE = 0x2D6,
+	NOUN_PETROX = 0x2D7,
+	NOUN_SODIUM_BENZOATE = 0x2D8,
+	NOUN_GURNEY = 0x2D9,
+	NOUN_IRONING_BOARD = 0x2DA,
+	NOUN_LEFT_MONITOR = 0x2DB,
+	NOUN_RIGHT_MONITOR = 0x2DC,
+	NOUN_RED_BUTTON = 0x2DD,
+	NOUN_GREEN_BUTTON = 0x2DE,
+	NOUN_RIGHT_ONE_KEY = 0x2DF,
+	NOUN_RIGHT_1_KEY = 0x2E0,
+	NOUN_RIGHT_2_KEY = 0x2E1,
+	NOUN_RIGHT_3_KEY = 0x2E2,
+	NOUN_RIGHT_4_KEY = 0x2E3,
+	NOUN_RIGHT_5_KEY = 0x2E4,
+	NOUN_RIGHT_6_KEY = 0x2E5,
+	NOUN_RIGHT_7_KEY = 0x2E6,
+	NOUN_RIGHT_8_KEY = 0x2E7,
+	NOUN_LEFT_1_KEY = 0x2E8,
+	NOUN_LEFT_2_KEY = 0x2E9,
+	NOUN_LEFT_3_KEY = 0x2EA,
+	NOUN_LEFT_4_KEY = 0x2EB,
+	NOUN_CORRIDOR_WALL = 0x2EC,
+	NOUN_MUG = 0x2ED,
+	NOUN_DOUGHNUT = 0x2EE,
+	NOUN_SECURITY_STATION = 0x2EF,
+	NOUN_NEWSPAPER = 0x2F0,
+	NOUN_MAGAZINE = 0x2F1,
+	NOUN_CLIPBOARD = 0x2F2,
+	NOUN_PAPER_FOOTBALL = 0x2F3,
+	NOUN_YOUR_STUFF = 0x2F4,
+	NOUN_OTHER_STUFF = 0x2F5,
+	NOUN_LAMP = 0x2F6,
+	//NOUN_CLIMB_INTO = 0x2F7,
+	NOUN_LIGHT_BULB = 0x2F8,
+	//NOUN_STEP_INTO = 0x2F9,
+	NOUN_ROOM = 0x2FA,
+	//NOUN_CRAWL_TO = 0x2FB,
+	NOUN_FOURTH_CELL = 0x2FC,
+	NOUN_THIRD_CELL = 0x2FD,
+	NOUN_SECOND_CELL = 0x2FE,
+	NOUN_FIRST_CELL = 0x2FF,
+	NOUN_EQUIPMENT_ROOM = 0x300,
+	//NOUN_CRAWL_DOWN = 0x301,
+	NOUN_DESCENDING_SHAFT = 0x302,
+	NOUN_SAUROPOD = 0x303,
+	NOUN_MONSTER = 0x304,
+	NOUN_FAKE_ID = 0x305,
+	NOUN_ALIEN_LIQUOR = 0x306,
+	NOUN_INTERN = 0x307,
+	NOUN_INSTRUMENT_TABLE = 0x308,
+	NOUN_WOMAN_ON_BALCONY = 0x309,
+	NOUN_WOMAN_IN_CHAIR = 0x30A,
+	//NOUN_SIT_ON = 0x30B,
+	NOUN_WOMAN_IN_ALCOVE = 0x30C,
+	NOUN_KETTLE = 0x30D,
+	NOUN_BARTENDER = 0x30E,
+	NOUN_WHISKEY = 0x30F,
+	NOUN_ALCOHOL = 0x310,
+	NOUN_RIM = 0x311,
+	NOUN_SUBMERGED_CITY = 0x313,
+	NOUN_GOVERNORS_HOUSE = 0x314,
+	NOUN_RIM_TOWARDS_EAST = 0x315,
+	NOUN_CEMENT_PYLON = 0x316,
+	NOUN_ELEVATOR = 0x317,
+	NOUN_ELEVATOR_SHAFT = 0x318,
+	NOUN_CONVEYOR_BELT = 0x319,
+	NOUN_CANNON_BALLS = 0x31A,
+	NOUN_ELECTRICAL_OVERHANG = 0x31B,
+	NOUN_GUTTER_PIPE = 0x31C,
+	NOUN_SIDEWALK = 0x31D,
+	NOUN_STREET = 0x31E,
+	NOUN_BARRICADE = 0x31F,
+	NOUN_DOOR_CONTROL_SLOT = 0x320,
+	NOUN_STREET_TO_EAST = 0x321,
+	NOUN_SIDEWALK_TO_EAST = 0x322,
+	NOUN_BUILDING = 0x323,
+	NOUN_CAR = 0x324,
+	//NOUN_GET_INSIDE = 0x325,
+	NOUN_MARQUEE = 0x326,
+	NOUN_BUILDING_ENTRANCE = 0x327,
+	NOUN_GUARD_STATION = 0x328,
+	NOUN_TECHNICAL_EQUIPMENT = 0x329,
+	NOUN_GUARD_TURRET = 0x32A,
+	NOUN_PILLAR = 0x32B,
+	NOUN_PAPERS = 0x32C,
+	NOUN_FILE_CABINET = 0x32D,
+	NOUN_WINDOWS = 0x32E,
+	//NOUN_WALK = 0x32F,
+	NOUN_STORAGE_BOX = 0x330,
+	NOUN_WATER_COOLER = 0x331,
+	NOUN_BOX = 0x332,
+	NOUN_RIFLES = 0x333,
+	NOUN_SLINGSHOT = 0x334,
+	NOUN_MAUSOLEUM = 0x335,
+	NOUN_SOFTWARE_STORE = 0x336,
+	NOUN_CONCRETE_BUILDING = 0x337,
+	NOUN_HUMONGOUS_MONITOR = 0x338,
+	NOUN_SPACE_BIKE = 0x339,
+	NOUN_BILLBOARD = 0x33A,
+	NOUN_LACK_OF_NOOKIE_MOTEL = 0x33B,
+	NOUN_BIDETS_XCREETZA_HUT = 0x33C,
+	NOUN_BUILDINGS = 0x33D,
+	NOUN_SKYSCRAPER = 0x33E,
+	NOUN_SOFTWARE_LOGO = 0x33F,
+	NOUN_GIANT_TELESCOPE = 0x340,
+	NOUN_HANDLE = 0x341,
+	NOUN_HOLE = 0x342,
+	NOUN_LASER_BEAM = 0x343,
+	NOUN_PEDESTAL = 0x344,
+	NOUN_BOAT = 0x345,
+	NOUN_GIANT_MONUMENT = 0x346,
+	NOUN_ROPE = 0x347,
+	NOUN_SAND_BAR_RESTAURANT = 0x348,
+	NOUN_PORTHOLE = 0x349,
+	NOUN_TICKET_BOOTH = 0x34A,
+	NOUN_POLLYS_ENTRANCE = 0x34B,
+	NOUN_RESTAURANT_ENTRANCE = 0x34C,
+	NOUN_THE_PLEASURE_DOME = 0x34D,
+	NOUN_STARFISH = 0x34E,
+	NOUN_FLIPPER = 0x34F,
+	NOUN_SAND_DOLLAR = 0x350,
+	NOUN_SHELL = 0x351,
+	NOUN_GUEST_LIST = 0x352,
+	NOUN_WEIRD_ANIMAL_HEAD = 0x353,
+	NOUN_SHIPS_WHEEL = 0x354,
+	NOUN_HANDICAP_SIGN = 0x355,
+	NOUN_ELEVATOR_CONTROLS = 0x356,
+	NOUN_BRICK_WALL = 0x357,
+	NOUN_BIKE_RACK = 0x358,
+	NOUN_ODONALDS_SIGN = 0x359,
+	NOUN_ELEVATOR_ENTRANCE = 0x35A,
+	NOUN_SPECIAL_SALE_SIGN = 0x35B,
+	NOUN_ATTORNEYS_AT_LAW = 0x35C,
+	NOUN_SLEDGE_MALL = 0x35D,
+	NOUN_SKELETON = 0x35E,
+	NOUN_STRANGE_EQUIPMENT = 0x35F,
+	NOUN_STREET_TO_WEST = 0x360,
+	NOUN_SIDEWALK_TO_WEST = 0x361,
+	NOUN_TELEPORTER_ENTRANCE = 0x362,
+	NOUN_SOFTWARE_DOOR = 0x363,
+	NOUN_SPINACH_PATCH_DOLL = 0x364,
+	//NOUN_REFLECT = 0x365,
+	NOUN_REGISTER_DRAWER = 0x366,
+	NOUN_ELEVATOR_DOOR = 0x367,
+	NOUN_HYDRAULIC_SUPPORT = 0x368,
+	NOUN_EQUIPMENT_OVERHEAD = 0x369,
+	//NOUN_GET_INTO = 0x36A,
+	NOUN_WARNING_LABEL = 0x36B,
+	NOUN_NUCLEAR_SLINGSHOT = 0x36C,
+	NOUN_DISPLAY_CASE = 0x36D,
+	NOUN_PHOTON_RIFLES = 0x36E,
+	NOUN_MONITORING_EQUIPMENT = 0x36F,
+	NOUN_TELESCOPE = 0x370,
+	NOUN_MOTEL = 0x371,
+	NOUN_RESTAURANT = 0x372,
+	NOUN_SOFTWARE_STORE_SIGN = 0x373,
+	NOUN_ADVERTISING_POSTER = 0x374,
+	NOUN_ADVERTISEMENT = 0x375,
+	NOUN_OLD_SOFTWARE = 0x376,
+	NOUN_CASH_REGISTER = 0x377,
+	NOUN_ENTRANCE = 0x378,
+	NOUN_LASER_CANNON = 0x379,
+	NOUN_SAND_BAGS = 0x37A,
+	NOUN_PLEASURE_DOME = 0x37B,
+	NOUN_DOME_ENTRANCE = 0x37C,
+	NOUN_LABORATORY = 0x37D,
+	NOUN_STREET_TO_SOUTH = 0x37E,
+	NOUN_ELEVATOR_ACCESS_SLOT = 0x37F,
+	NOUN_CAR_CONTROLS = 0x380,
+	NOUN_SCENT_PACKET = 0x381,
+	NOUN_KITTY = 0x382,
+	NOUN_GLOVE_COMPARTMENT = 0x383,
+	NOUN_MOLDY_SOCK = 0x384,
+	NOUN_SODA_CANS = 0x385,
+	NOUN_WINDSHIELD = 0x386,
+	NOUN_DASHBOARD = 0x387,
+	NOUN_INTERIOR_OF_CAR = 0x388,
+	NOUN_VIEW_RIGHT_BUTTON = 0x389,
+	NOUN_BLACK_BUTTON = 0x38A,
+	NOUN_WHITE_BUTTON = 0x38B,
+	NOUN_INSIDE_OF_CAR = 0x38C,
+	NOUN_RIM_TOWARDS_WEST = 0x38D,
+	NOUN_CEMENT_BLOCK = 0x38E,
+	NOUN_CITY = 0x38F,
+	NOUN_SPEAKER = 0x390,
+	NOUN_EYE_CHART = 0x391,
+	NOUN_LAUNCH_PAD = 0x392,
+	NOUN_BUILDING_TO_WEST = 0x393,
+	NOUN_PAD_TO_EAST = 0x394,
+	NOUN_PAD_TO_WEST = 0x395,
+	NOUN_TOWER = 0x396,
+	//NOUN_LOOK_OUT = 0x397,
+	NOUN_SERVICE_PANEL = 0x398,
+	NOUN_CRACK = 0x399,
+	NOUN_THROTTLE = 0x39A,
+	NOUN_GRAB = 0x39B,
+	NOUN_INSTRUMENTATION = 0x39C,
+	NOUN_TP = 0x39D,
+	NOUN_SEAT = 0x39E,
+	NOUN_STATUS_PANEL = 0x39F,
+	NOUN_SHIPS_CONTROLS = 0x3A0,
+	NOUN_PROFESSOR = 0x3A1,
+	NOUN_PROFESSORS_GURNEY = 0x3A2,
+	NOUN_WELCOME_MAT = 0x3A3,
+	NOUN_MELON_MUSH = 0x3A4,
+	NOUN_BADMINTON_BRAT = 0x3A5,
+	//NOUN_APPLY = 0x3A6,
+	NOUN_COMBINATION = 0x3A7,
+	NOUN_NOTE = 0x3A8,
+	NOUN_LECITHIN = 0x3A9,
+	NOUN_REPAIR_WOMAN = 0x3AA,
+	NOUN_EXPLOSIVES = 0x3AB,
+	NOUN_DOLLOP = 0x3AC,
+	NOUN_DROP = 0x3AD,
+	NOUN_DASH = 0x3AE,
+	NOUN_SPLASH = 0x3AF,
+	NOUN_DOCK_TO_SOUTH = 0x3B0,
+	//NOUN_STEER_TOWARDS = 0x3B1,
+	NOUN_BUILDING_TO_NORTH = 0x3B2,
+	NOUN_VOLCANO_RIM = 0x3B3,
+	NOUN_OPEN_WATER_TO_SOUTH = 0x3B4,
+	NOUN_PROJECTOR = 0x3B5,
+	NOUN_GUARDS_ARM2 = 0x3B6,
+	//NOUN_NIBBLE_ON = 0x3B7,
+	//NOUN_ENTER = 0x3B8,
+	NOUN_ = 0x3B9,
+	NOUN_TIMER_BUTTON_1 = 0x3BA,
+	NOUN_REMOTE_BUTTON_1 = 0x3BB,
+	NOUN_START_BUTTON_2 = 0x3BC,
+	NOUN_REMOTE_BUTTON_2 = 0x3BD,
+	NOUN_TIMER_BUTTON_2 = 0x3BE,
+	NOUN_START_BUTTON_1 = 0x3BF,
+	NOUN_ANTIGRAV_CONTROLS = 0x3C0,
+	NOUN_BRUCES_TREE = 0x3C1,
+	NOUN_COLISEUM = 0x3C2,
+	NOUN_BRUCES_GARDEN_ROOM = 0x3C3,
+	NOUN_FOUNTAIN = 0x3C4,
+	NOUN_HOUSE_OF_BRUCE = 0x3C5,
+	NOUN_CITY_BACKDROP = 0x3C6,
+	NOUN_BRUCES_BALCONY = 0x3C7,
+	NOUN_BRUCES_ENTRANCE = 0x3C8,
+	NOUN_BRUCES_LOGO = 0x3C9,
+	NOUN_LOUNGE_CHAIR = 0x3CA,
+	NOUN_LIVING_ROOM_FLOOR = 0x3CB,
+	NOUN_LIVINGROOM_FLOOR = 0x3CC,
+	NOUN_PERFUME_BOTTLE = 0x3CD,
+	NOUN_COOL_NEON_LIGHT = 0x3CE,
+	NOUN_FLOWER_POT = 0x3CF,
+	NOUN_COFFEE_TABLE = 0x3D0,
+	NOUN_FLOWERS = 0x3D1,
+	NOUN_ART_DECO_CHAIR = 0x3D2,
+	NOUN_SAFE = 0x3D3,
+	NOUN_SPLASHY_DECOR = 0x3D4,
+	NOUN_THEATRICAL_FACES = 0x3D5,
+	NOUN_ART_DECO_PIECE = 0x3D6,
+	NOUN_END_OF_ROOM = 0x3D7,
+	NOUN_FIREPLACE = 0x3D8,
+	NOUN_ARTWORK = 0x3D9,
+	NOUN_COOL_NEON_LIGHTS = 0x3DA,
+	NOUN_GLASS_PLATED_WINDOW = 0x3DB,
+	NOUN_BEDROOM_FLOOR = 0x3DC,
+	NOUN_BAUBLE = 0x3DD,
+	NOUN_SNAPSHOT = 0x3DE,
+	NOUN_PERFUME = 0x3DF,
+	NOUN_CLAPBOARD = 0x3E0,
+	NOUN_BERET = 0x3E1,
+	NOUN_HORSE_WHIP = 0x3E2,
+	NOUN_CORNER_TABLE = 0x3E3,
+	NOUN_BOA = 0x3E4,
+	NOUN_WIG_STAND = 0x3E5,
+	NOUN_PARTITION = 0x3E6,
+	NOUN_MEGAPHONE = 0x3E7,
+	NOUN_SLIP = 0x3E8,
+	NOUN_SCONCE = 0x3E9,
+	NOUN_VANITY = 0x3EA,
+	NOUN_BEDBOARD = 0x3EB,
+	NOUN_LOVE_SEAT = 0x3EC,
+	NOUN_SOUVENIR_TICKETS = 0x3ED,
+	NOUN_REVIEW = 0x3EE,
+	NOUN_BRUCE_AT_THE_GALA = 0x3EF,
+	NOUN_ART_DECO_RUG = 0x3F0,
+	NOUN_LIVINGROOM = 0x3F1,
+	NOUN_SCULPTURE = 0x3F2,
+	NOUN_SPECIMEN_EPITHET = 0x3F3,
+	NOUN_VENT = 0x3F4,
+	NOUN_FLOWER_BOX = 0x3F5,
+	NOUN_LEDGE = 0x3F6,
+	NOUN_BOLT = 0x3F7,
+	NOUN_OBSERVATION_WINDOW = 0x3F8,
+	NOUN_AIR_HOSE = 0x3F9,
+	NOUN_AUTO_SHOP = 0x3FA,
+	NOUN_MANHOLE = 0x3FB,
+	NOUN_AUTO_SHOP_ENTRANCE = 0x3FC,
+	NOUN_BROKEN_WINDOW = 0x3FD,
+	NOUN_WOMANHOLE = 0x3FE,
+	NOUN_GARAGE_DOOR = 0x3FF,
+	NOUN_SCRATCH_PAD = 0x400,
+	NOUN_GAS_PRICES = 0x401,
+	NOUN_UP_BUTTON = 0x402,
+	NOUN_DOWN_BUTTON = 0x403,
+	NOUN_SPARE_PARTS_LIST = 0x404,
+	NOUN_SKYLIGHT = 0x405,
+	NOUN_TOOL_BOX = 0x406,
+	NOUN_CAR_LIFT = 0x407,
+	NOUN_CAR_SEAT = 0x408,
+	NOUN_GARAGE_FLOOR = 0x409,
+	NOUN_GARAGE_DOOR_CONTROLS = 0x40A,
+	NOUN_AMISH_HAT = 0x40B,
+	NOUN_JACK = 0x40C,
+	NOUN_COILS = 0x40D,
+	NOUN_OIL_CAN = 0x40E,
+	NOUN_FAN_BELTS = 0x40F,
+	NOUN_REAR_OF_GARAGE = 0x410,
+	NOUN_FRONT_OF_GARAGE = 0x411,
+	NOUN_MUFFLER = 0x412,
+	NOUN_SPARE_PART = 0x413,
+	NOUN_HUBCAP = 0x414,
+	NOUN_CANDLE = 0x415,
+	NOUN_RATES = 0x416,
+	NOUN_GREASE_CAN = 0x417,
+	NOUN_CALENDAR = 0x418,
+	NOUN_FORK_LIFT = 0x419,
+	NOUN_TRASH_CAN = 0x41A,
+	NOUN_SHAKER_CHAIR = 0x41B,
+	NOUN_QUARTER_PANEL = 0x41C,
+	NOUN_AREA_BEHIND_CAR = 0x41D,
+	NOUN_DANGER_ZONE = 0x41E,
+	NOUN_NEWSSTAND = 0x41F,
+	NOUN_LADY_GODIVA_MONUMENT = 0x420,
+	NOUN_SPOT_A_POT = 0x421,
+	NOUN_GUARD_RAIL = 0x422,
+	NOUN_ALLEY = 0x423,
+	NOUN_DITCH = 0x424,
+	NOUN_VIDEO_STORE_DOOR = 0x425,
+	NOUN_BUCKLUSTER_MARQUEE = 0x426,
+	NOUN_VIDEO_STORE = 0x427,
+	NOUN_HORMONE_BILLBOARD = 0x428,
+	NOUN_PHONE_ANTENNA = 0x429,
+	NOUN_RETURN_SLOT = 0x42A,
+	NOUN_NOOSE = 0x42B,
+	NOUN_COMEDY_VIDEOS = 0x42C,
+	NOUN_SMELLY_SNEAKER = 0x42D,
+	NOUN_PIPPYS_STOCKING = 0x42E,
+	NOUN_PHONE_CRADLE = 0x42F,
+	NOUN_DRAMA_VIDEOS = 0x430,
+	NOUN_SPOTLIGHT = 0x431,
+	NOUN_STOREROOM_FLOOR = 0x432,
+	NOUN_ALL_SALES_FINAL = 0x433,
+	NOUN_MACHOPROSE_TEE_SHIRT = 0x434,
+	NOUN_UNKNOWN_COMIC_HANDS = 0x435,
+	NOUN_WET_CEMENT = 0x436,
+	NOUN_PIPPYS_TINY_IMPRINT = 0x437,
+	NOUN_OBNOXIOUS_DOG_PAWS = 0x438,
+	NOUN_LEG_AND_A_LEG_JEANS = 0x439,
+	NOUN_VIDEO_STORE_EXIT = 0x43A,
+	NOUN_AISLE = 0x43B,
+	NOUN_VIDEO_MONITOR = 0x43C,
+	NOUN_POLLY_PIGS_IMPRINT = 0x43D,
+	NOUN_JOHN_WYNNS_IMPRINT = 0x43E,
+	NOUN_MR_NEDS_IMPRINT = 0x43F,
+	NOUN_PEG_LEG_PETE_IMPRINT = 0x440,
+	NOUN_MARX_BROS_POSTER = 0x441,
+	NOUN_PIPPY_BILLBOARD = 0x442,
+	NOUN_VIDEOS_NOONE_WANTS = 0x443,
+	NOUN_MORE_CLASSIC_VIDEOS = 0x444,
+	NOUN_JOIN_OUR_PRICE_CLUB = 0x445,
+	NOUN_EDUCATIONAL_VIDEOS = 0x446,
+	NOUN_DEEP_DISCOUNT_TITLES = 0x447,
+	NOUN_WORLD_CHAMPS_POSTER = 0x448,
+	NOUN_WORKOUT_VIDEOS = 0x449,
+	NOUN_20_PERCENT_OFF_SIGN = 0x44A,
+	NOUN_CIVILIZATION_AD = 0x44B,
+	NOUN_NEW_RELEASE_VIDEOS = 0x44C,
+	NOUN_PORNO_VIDEOS = 0x44D,
+	NOUN_FOREIGN_VIDEOS = 0x44E,
+	NOUN_CLASSIC_VIDEOS = 0x44F,
+	NOUN_ADVENTURE_VIDEOS = 0x450,
+	NOUN_BUCKLUSTER_LOGO = 0x451,
+	NOUN_WINE_BOTTLE = 0x452,
+	NOUN_DIRT_PILE = 0x453,
+	NOUN_MAMMOTH_PENCIL_HEAD = 0x454,
+	NOUN_WREAKY_PUMPKIN = 0x455,
+	NOUN_MILK_CARTON = 0x456,
+	NOUN_BUCKET = 0x457,
+	NOUN_EMPTY_BOX = 0x458,
+	NOUN_DIAPER_BOX = 0x459,
+	NOUN_HERMIT = 0x45A,
+	NOUN_METAL_PIPE = 0x45B,
+	NOUN_CONCRETE_SUPPORT = 0x45C,
+	NOUN_VARIOUS_TRASH = 0x45D,
+	NOUN_ARMATURE = 0x45E,
+	NOUN_CONTROL_BOX = 0x45F,
+	NOUN_TOP_OF_DOME = 0x460,
+	NOUN_EXPRESSWAY_TO_EAST = 0x461,
+	NOUN_GO_TOWARDS = 0x462,
+	NOUN_EXPRESSWAY_TO_WEST = 0x463,
+	NOUN_DOME = 0x464,
+	NOUN_VIEW_OF_CITY = 0x465,
+	NOUN_EXPRESSWAY = 0x466,
+	NOUN_HOOK = 0x467,
+	NOUN_SEA_MONSTER = 0x468,
+	NOUN_EDGE_OF_VOLCANO = 0x469,
+	NOUN_JUMP_THROUGH = 0x46A,
+	NOUN_OLD_TEA_CUP = 0x46B,
+	NOUN_NAME_PLATE = 0x46C,
+	NOUN_OLD_VASE = 0x46D,
+	NOUN_PORTRAIT = 0x46E,
+	//NOUN_PUT_DOWN = 0x46F,
+	NOUN_TALL_BUILDING = 0x470,
+	NOUN_OBNOXIOUS_DOG = 0x471,
+	NOUN_GUTS = 0x472,
+	NOUN_BIG_HEADS = 0x473,
+	NOUN_INSTALL = 0x474,
+	NOUN_LIFE_SUPPORT_MODULE = 0x475,
+	//NOUN_REMOVE = 0x476,
+	NOUN_LARGE_BLADE = 0x477,
+	NOUN_SIDE_ENTRANCE = 0x478,
+	NOUN_INDICATOR = 0x479,
+	NOUN_SIGNPOST = 0x47A,
+	NOUN_PIN = 0x47B,
+	NOUN_POWDER_PUFF = 0x47C,
+	NOUN_SHELVES = 0x47D,
+	NOUN_ELECTRODES = 0x47E,
+	NOUN_MISHAP2 = 0x47F,
+	NOUN_ISLD_SUPERSTRUCTURE = 0x480,
+	NOUN_FILE_CABINETS = 0x481,
+	NOUN_CYCLE_SHOP = 0x482,
+	NOUN_AIR_BIKE = 0x483,
+	NOUN_EMERGENCY_LIGHT = 0x484,
+	NOUN_TARGET_AREA = 0x485,
+	NOUN_ICE_CHESTS = 0x486,
+	NOUN_BIRDS = 0x487,
+	NOUN_DOCTORS_OFFICE = 0x488,
+	//NOUN_DEFACE = 0x489,
+	NOUN_LARGE_HEADS = 0x48A,
+	NOUN_SMALL_TABLE = 0x48B,
+	NOUN_COLLOSSEUM = 0x48C,
+	NOUN_HOUSE = 0x48D,
+	NOUN_BALCONY = 0x48E,
+	NOUN_GARDEN_ROOM = 0x48F,
+	NOUN_COVE_LIGHTS = 0x490,
+	NOUN_MASKS = 0x491,
+	NOUN_NEON_LIGHTS = 0x492,
+	NOUN_GLASS_BLOCK_WALL = 0x493,
+	NOUN_SCREEN = 0x494,
+	NOUN_SPARE_RIBS = 0x495,
+	NOUN_BANNER = 0x496,
+	NOUN_INSTRUCTIONAL_VIDEOS = 0x497,
+	NOUN_CEMENT = 0x498,
+	NOUN_STORE = 0x499,
+	NOUN_CARDBOARD_BOX = 0x49A,
+	NOUN_GRAFFITTI = 0x49B,
+	NOUN_GRAFFITI = 0x49C,
+	NOUN_PHOTOGRAPH = 0x49D,
+	NOUN_DIRECTORS_SLATE = 0x49E,
+	NOUN_CROP = 0x49F,
+	NOUN_HAT = 0x4A0,
+	NOUN_LOGO = 0x4A1,
+	NOUN_MAINTENANCE_BUILDING = 0x4A2,
+	//NOUN_MASSAGE = 0x4A3,
+	//NOUN_MANGLE = 0x4A4,
+	//NOUN_RUB = 0x4A5,
+	//NOUN_JUGGLE = 0x4A6,
+	//NOUN_SMASH = 0x4A7,
+	//NOUN_GUZZLE = 0x4A8,
+	NOUN_WEST_END_OF_PLATFORM = 0x4A9,
+	NOUN_EAST_END_OF_PLATFORM = 0x4AA
+	//NOUN_FOLD = 0x4AB,
+	//NOUN_SPINDLE = 0x4AC,
+	//NOUN_MUTILATE = 0x4AD
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
new file mode 100644
index 00000000000..6881f43775c
--- /dev/null
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -0,0 +1,123 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "engines/util.h"
+#include "mads/core/mps_installer.h"
+#include "mads/madsv2/console.h"
+#include "mads/madsv2/core/attr.h"
+#include "mads/madsv2/core/conv.h"
+#include "mads/madsv2/core/env.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/imath.h"
+#include "mads/madsv2/core/inter.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/object.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/rail.h"
+#include "mads/madsv2/core/screen.h"
+#include "mads/madsv2/core/sound.h"
+#include "mads/madsv2/core/text.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Common::Error RexNebularEngine::run() {
+	initGraphics(320, 200);
+	_screen = new Graphics::Screen();
+	scr_live.data = (byte *)_screen->getPixels();
+
+	// Create a debugger console
+	setDebugger(new Console());
+
+	// Set up to read mpslabs installer archive if needed
+	if (_gameDescription->desc.flags & GF_INSTALLER) {
+		Common::Archive *arch = MpsInstaller::open("MPSLABS");
+		if (arch)
+			SearchMan.add("mpslabs", arch);
+	}
+
+	// Set up sound manager
+	//_soundManager = new DragonSoundManager(_mixer, _soundFlag);
+	//_soundManager->validate();
+
+	// Run the game
+//	RexNebular::dragonsphere_main();
+
+	return Common::kNoError;
+}
+
+void RexNebularEngine::global_init_code() {
+	int count;
+
+	for (count = 0; count < GLOBAL_LIST_SIZE; count++)
+		global[count] = 0;
+}
+
+void RexNebularEngine::section_music(int section_num) {
+	
+}
+
+void RexNebularEngine::global_section_constructor() {
+	
+}
+
+void RexNebularEngine::syncRoom(Common::Serializer &s) {
+	
+}
+
+void RexNebularEngine::global_daemon_code() {
+}
+
+void RexNebularEngine::global_pre_parser_code() {
+
+}
+
+void RexNebularEngine::global_parser_code() {
+}
+
+void RexNebularEngine::global_error_code() {
+}
+
+void RexNebularEngine::global_room_init() {
+}
+
+void RexNebularEngine::global_sound_driver() {
+	Common::strcpy_s(kernel.sound_driver, "/");
+	env_catint(kernel.sound_driver, new_section, 1);
+}
+
+void RexNebularEngine::player_keep_walking() {
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/nebular.h b/engines/mads/madsv2/nebular/nebular.h
new file mode 100644
index 00000000000..23ef2226bbf
--- /dev/null
+++ b/engines/mads/madsv2/nebular/nebular.h
@@ -0,0 +1,68 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_H
+#define MADS_NEBULAR_H
+
+#include "mads/madsv2/engine.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+struct MADSSavegameHeader {
+	uint8 _version;
+	Common::String _saveName;
+	Graphics::Surface *_thumbnail;
+	int _year, _month, _day;
+	int _hour, _minute;
+	int _totalFrames;
+
+	void readSavegameHeader(Common::SeekableReadStream *src);
+	void writeSavegameHeader(Common::WriteStream *dest);
+};
+
+class RexNebularEngine : public MADSV2Engine {
+public:
+	RexNebularEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
+		MADSV2Engine(syst, gameDesc) {}
+	~RexNebularEngine() override {}
+
+	Common::Error run() override;
+	void syncRoom(Common::Serializer &s) override;
+
+	void global_init_code() override;
+	void section_music(int section_num) override;
+	void global_section_constructor() override;
+	void global_daemon_code() override;
+	void global_pre_parser_code() override;
+	void global_parser_code() override;
+	void global_error_code() override;
+	void global_room_init() override;
+	void global_sound_driver() override;
+	void player_keep_walking() override;
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/rooms/room101.cpp b/engines/mads/madsv2/nebular/rooms/room101.cpp
new file mode 100644
index 00000000000..890872115d9
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room101.cpp
@@ -0,0 +1,588 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
+
+struct Scratch {
+	int16 _sittingFl;
+	int16 _panelOpened;
+	int16 _messageNum;
+	int16 _posY;
+	int16 _shieldSpriteIdx;
+	int16 _chairHotspotId;
+	int16 _oldSpecial;
+};
+
+static Scratch local;
+
+static void room_101_say_dang() {
+	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+	_game._player._stepEnabled = false;
+
+	switch (_game._trigger) {
+	case 0:
+		_scene->_sequences.remove(_globals._sequenceIndexes[11]);
+		_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 3, 6, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 21);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+		_vm->_sound->command(17);
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 3, 2, 0, 0);
+		break;
+
+	case 72:
+		_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+		_scene->_kernelMessages.add(Common::Point(143, 61), 0x1110, 0, 0, 60, _game.getQuote(57));
+		_scene->_sequences.addTimer(120, 73);
+		break;
+
+	case 73:
+		_vm->_dialogs->show(10117);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void room_101_init() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 6));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 7));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', -1));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('b', 1));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('b', 2));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 8));
+	_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('x', 0));
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 0, 25);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 0, 1, 0);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 2, 0);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 7, 70);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 10, 0, 0, 60);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 0, 1, 0);
+	_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 2, 0);
+	_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 0, 0, 0);
+	_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 0, 10, 4);
+	_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 0, 32, 47);
+
+	_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+	local._panelOpened = false;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING)
+		_globals[kNeedToStandUp] = false;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(100, 152);
+
+	if ((_scene->_priorSceneId == 112) || ((_scene->_priorSceneId == RETURNING_FROM_DIALOG) && local._sittingFl)) {
+		_game._player._visible = false;
+		local._sittingFl = true;
+		_game._player._playerPos = Common::Point(161, 123);
+		_game._player._facing = FACING_NORTHEAST;
+		_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+		_scene->_hotspots.activate(NOUN_CHAIR, false);
+		local._chairHotspotId = _scene->_dynamicHotspots.add(NOUN_CHAIR, VERB_SIT_IN, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
+		if (_scene->_priorSceneId == 112)
+			room_101_say_dang();
+	} else {
+		_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 0, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 4);
+	}
+
+	_game.loadQuoteSet(0x31, 0x32, 0x39, 0x36, 0x37, 0x38, 0);
+
+	if (_globals[kNeedToStandUp]) {
+		_scene->loadAnimation(Resources::formatName(101, 'S', -1, EXT_AA, ""), 71);
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_game._player._playerPos = Common::Point(68, 140);
+		_game._player._facing = FACING_WEST;
+
+		local._messageNum = 0;
+		local._posY = 30;
+	}
+
+	local._oldSpecial = false;
+
+	section_1_music();
+}
+
+void room_101_daemon() {
+	if (local._oldSpecial != _game._player._special) {
+		local._oldSpecial = _game._player._special;
+		if (local._oldSpecial)
+			_vm->_sound->command(39);
+		else
+			_vm->_sound->command(11);
+	}
+
+	switch (_game._trigger) {
+	case 70:
+		_vm->_sound->command(9);
+		break;
+
+	case 71:
+		_globals[kNeedToStandUp] = false;
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+		break;
+
+	case 72:
+	case 73:
+		room_101_say_dang();
+		break;
+
+	default:
+		break;
+	}
+
+	if (_scene->_animation[0] != nullptr) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 6) && (local._messageNum == 0)) {
+			local._messageNum++;
+			_scene->_kernelMessages.add(Common::Point(63, local._posY), 0x1110, 0, 0, 240, _game.getQuote(49));
+			local._posY += 14;
+		}
+
+		if ((_scene->_animation[0]->getCurrentFrame() >= 7) && (local._messageNum == 1)) {
+			local._messageNum++;
+			_scene->_kernelMessages.add(Common::Point(63, local._posY), 0x1110, 0, 0, 240, _game.getQuote(54));
+			local._posY += 14;
+		}
+
+		if ((_scene->_animation[0]->getCurrentFrame() >= 10) && (local._messageNum == 2)) {
+			local._messageNum++;
+			_scene->_kernelMessages.add(Common::Point(63, local._posY), 0x1110, 0, 0, 240, _game.getQuote(55));
+			local._posY += 14;
+		}
+
+		if ((_scene->_animation[0]->getCurrentFrame() >= 17) && (local._messageNum == 3)) {
+			local._messageNum++;
+			_scene->_kernelMessages.add(Common::Point(63, local._posY), 0x1110, 0, 0, 240, _game.getQuote(56));
+			local._posY += 14;
+		}
+
+		if ((_scene->_animation[0]->getCurrentFrame() >= 20) && (local._messageNum == 4)) {
+			local._messageNum++;
+			_scene->_kernelMessages.add(Common::Point(63, local._posY), 0x1110, 0, 0, 240, _game.getQuote(50));
+			local._posY += 14;
+		}
+	}
+}
+
+static void room_101_pre_parser() {
+	if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+		_game._player._needToWalk = true;
+
+	if (local._sittingFl) {
+		if (_action.isAction(VERB_LOOK) || _action.isAction(NOUN_CHAIR) || _action.isAction(VERB_TALKTO) || _action.isAction(VERB_PEER_THROUGH) || _action.isAction(VERB_EXAMINE))
+			_game._player._needToWalk = false;
+
+		if (_game._player._needToWalk) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._readyToWalk = false;
+				_game._player._stepEnabled = false;
+				_scene->_sequences.remove(_globals._sequenceIndexes[11]);
+				_globals._sequenceIndexes[11] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 1, 17);
+				_vm->_sound->command(16);
+				break;
+
+			case 1:
+				local._sittingFl = false;
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				_game._player._readyToWalk = true;
+				_scene->_hotspots.activate(71, true);
+				_scene->_dynamicHotspots.remove(local._chairHotspotId);
+				_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 0, 0, 0);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 4);
+				break;
+
+			default:
+				break;
+			}
+		}
+	}
+
+	if (local._panelOpened && !(_action.isObject(NOUN_SHIELD_ACCESS_PANEL) || _action.isObject(NOUN_SHIELD_MODULATOR))) {
+		switch (_game._trigger) {
+		case 0:
+			if (_game._player._needToWalk) {
+				_scene->_sequences.remove(_globals._sequenceIndexes[13]);
+				local._shieldSpriteIdx = _game._objects.isInRoom(OBJ_SHIELD_MODULATOR) ? 13 : 14;
+				_globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[local._shieldSpriteIdx], false, 6, 1, 0, 0);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				_game._player._stepEnabled = false;
+				_vm->_sound->command(20);
+			}
+			break;
+
+		case 1:
+			_game._player._stepEnabled = true;
+			local._panelOpened = false;
+			_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+static void room_101_parser() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10125);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALKTO, NOUN_LIFE_SUPPORT_SECTION)) {
+		_scene->_nextSceneId = 102;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) || (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN) && !local._sittingFl)) {
+		if (!local._sittingFl) {
+			switch (_game._trigger) {
+			case 0:
+				_scene->_sequences.remove(_globals._sequenceIndexes[12]);
+				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 1, 17);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 10, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_action._inProgress = false;
+				return;
+
+			case 1:
+				_vm->_sound->command(16);
+				break;
+
+			case 2:
+				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+				_game._player._stepEnabled = true;
+				local._sittingFl = true;
+				_scene->_hotspots.activate(71, false);
+				local._chairHotspotId = _scene->_dynamicHotspots.add(NOUN_CHAIR, VERB_SIT_IN, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
+				if (!_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN)) {
+					_action._inProgress = false;
+					return;
+				}
+				_game._trigger = 0;
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			_vm->_dialogs->show(10131);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isAction(VERB_WALKTO, NOUN_SHIELD_ACCESS_PANEL) || _action.isAction(VERB_OPEN, NOUN_SHIELD_ACCESS_PANEL)) && !local._panelOpened) {
+		switch (_game._trigger) {
+		case 0:
+			local._shieldSpriteIdx = _game._objects.isInRoom(OBJ_SHIELD_MODULATOR) ? 13 : 14;
+			_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[local._shieldSpriteIdx], false, 6, 1, 0, 0);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_game._player._stepEnabled = false;
+			_vm->_sound->command(20);
+			break;
+
+		case 1:
+			_scene->_sequences.remove(_globals._sequenceIndexes[13]);
+			_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[local._shieldSpriteIdx], false, 6, 0, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+			_game._player._stepEnabled = true;
+			local._panelOpened = true;
+			if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
+				_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, true);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_TAKE, NOUN_SHIELD_MODULATOR) || _action.isAction(VERB_PULL, NOUN_SHIELD_MODULATOR)) && _game._objects.isInRoom(OBJ_SHIELD_MODULATOR)) {
+		_game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
+		_scene->_sequences.remove(_globals._sequenceIndexes[13]);
+		_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[14], false, 6, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+		_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+		_vm->_dialogs->showItem(OBJ_SHIELD_MODULATOR, 10120);
+		_vm->_sound->command(22);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_SHIELD_ACCESS_PANEL) || (_action.isAction(VERB_LOOK, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))) {
+		if (local._panelOpened) {
+			if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
+				_vm->_dialogs->show(10128);
+			else
+				_vm->_dialogs->show(10129);
+		} else
+			_vm->_dialogs->show(10127);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_SHIELD_ACCESS_PANEL) && local._panelOpened) {
+		_vm->_dialogs->show(10130);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN) && local._sittingFl) {
+		if (_globals[kWatchedViewScreen])
+			room_101_say_dang();
+		else {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_scene->_sequences.remove(_globals._sequenceIndexes[11]);
+				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 21);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				_vm->_sound->command(17);
+				break;
+
+			case 1:
+				_globals._sequenceIndexes[11] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 21);
+				break;
+
+			case 2:
+				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+				_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 3, 1, 0, 0);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+				break;
+
+			case 3:
+				_game._player._stepEnabled = true;
+				_globals[kWatchedViewScreen] = true;
+				local._sittingFl = true;
+				_scene->_nextSceneId = 112;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_CHAIR)) {
+		_vm->_dialogs->show(10101);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_PEER_THROUGH)) && (_action.isObject(NOUN_FRONT_WINDOW) || _action.isObject(NOUN_OUTSIDE))) {
+		_vm->_dialogs->show(10102);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_HULL) || _action.isAction(VERB_LOOK, NOUN_OUTER_HULL) || _action.isAction(VERB_EXAMINE, NOUN_HULL) || _action.isAction(VERB_EXAMINE, NOUN_OUTER_HULL)) {
+		_vm->_dialogs->show(10103);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_FUZZY_DICE)) {
+		_vm->_dialogs->show(10104);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_MIRROR) || _action.isAction(VERB_LOOK_IN, NOUN_MIRROR)) {
+		_vm->_dialogs->show(10105);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_CURTAINS)) {
+		_vm->_dialogs->show(10106);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_PLASTIC_JESUS)) {
+		_vm->_dialogs->show(10107);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_ESCAPE_HATCH) || (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH) && !_game._objects.isInInventory(OBJ_REBREATHER))) {
+		_vm->_dialogs->show(10109);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH)) {
+		_vm->_dialogs->show(10110);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_TARGET_COMPUTER)) {
+		_vm->_dialogs->show(10111);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_LIBRARY_COMPUTER)) {
+		_vm->_dialogs->show(10126);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_DAMAGE_CONTROL_PANEL)) {
+		_vm->_dialogs->show(10112);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_NAVIGATION_CONTROLS)) {
+		_vm->_dialogs->show(10113);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_ENGINEERING_CONTROLS)) {
+		_vm->_dialogs->show(10114);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_WEAPONS_DISPLAY)) {
+		_vm->_dialogs->show(10115);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_SHIELD_STATUS_PANEL)) {
+		_vm->_dialogs->show(10116);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_PLASTIC_JESUS)) {
+		_vm->_dialogs->show(10118);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_FUZZY_DICE)) {
+		_vm->_dialogs->show(10119);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_DAMAGE_CONTROL_PANEL)) {
+		_vm->_dialogs->show(10121);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CURTAINS)) {
+		_vm->_dialogs->show(10122);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_CURTAINS)) {
+		_vm->_dialogs->show(10123);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_PLAY)) && _action.isObject(NOUN_VIDEO_GAME)) {
+		_vm->_dialogs->show(10124);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void room_101_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._sittingFl);
+	s.syncAsByte(local._panelOpened);
+	s.syncAsSint16LE(local._messageNum);
+	s.syncAsSint16LE(local._posY);
+	s.syncAsSint16LE(local._shieldSpriteIdx);
+	s.syncAsSint16LE(local._chairHotspotId);
+	s.syncAsSint16LE(local._oldSpecial);
+}
+
+void room_101_preload() {
+	room_init_code_pointer = room_101_init;
+	room_pre_parser_code_pointer = room_101_pre_parser;
+	room_parser_code_pointer = room_101_parser;
+	room_daemon_code_pointer = room_101_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room102.cpp b/engines/mads/madsv2/nebular/rooms/room102.cpp
new file mode 100644
index 00000000000..f3dfdfccb87
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room102.cpp
@@ -0,0 +1,666 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room102::Room102(RexNebularEngine *vm) : Room1xx(vm) {
+	_fridgeOpenedFl = false;
+	_fridgeOpenedDescr = false;
+	_fridgeFirstOpenFl = false;
+	_chairDescrFl = false;
+	_drawerDescrFl = false;
+	_activeMsgFl = false;
+	_fridgeCommentCount = 0;
+}
+
+void Room102::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_fridgeOpenedFl);
+	s.syncAsByte(_fridgeOpenedDescr);
+	s.syncAsByte(_fridgeFirstOpenFl);
+	s.syncAsByte(_chairDescrFl);
+	s.syncAsByte(_drawerDescrFl);
+	s.syncAsByte(_activeMsgFl);
+
+	s.syncAsSint16LE(_fridgeCommentCount);
+}
+
+void Room102::setup() {
+	_scene->_animationData->preLoad(formAnimName('A', -1), 3);
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room102::addRandomMessage() {
+	_scene->_kernelMessages.reset();
+	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+	int quoteId = _vm->getRandomNumber(65, 69);
+	_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 73, 120, _game.getQuote(quoteId));
+	_activeMsgFl = true;
+}
+
+void Room102::enter() {
+	sceneEntrySound();
+
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', -1));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', -1));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('e', -1));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('n', -1));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('g', -1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMRC_8");
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 0));
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 0);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 170, 0, 1, 6);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 11, 0, 2, 3);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 0, 1, 0);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 3, 0, 0, 5);
+
+	if (_game._objects.isInRoom(OBJ_BINOCULARS))
+		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 24, 0, 0, 24);
+	else
+		_scene->_hotspots.activate(NOUN_BINOCULARS, false);
+
+	_scene->_hotspots.activate(NOUN_BURGER, false);
+
+	if (_globals[kMedicineCabinetOpen]) {
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2);
+	}
+
+	if (_scene->_priorSceneId == 101) {
+		_game._player._playerPos = Common::Point(229, 109);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+	} else if (_scene->_priorSceneId == 103)
+		_game._player._playerPos = Common::Point(47, 152);
+	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._facing = FACING_NORTHWEST;
+		_game._player._playerPos = Common::Point(32, 129);
+	}
+
+	if (_scene->_priorSceneId != 106) {
+		if (_globals[kWaterInAPuddle]) {
+			_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 0, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 5);
+		}
+	} else {
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 1, 0, 0);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 5);
+		_vm->_sound->command(24);
+		_vm->_sound->command(28);
+	}
+
+	_fridgeOpenedFl = false;
+	_fridgeOpenedDescr = false;
+	_fridgeCommentCount = 0;
+	_fridgeFirstOpenFl = true;
+	_chairDescrFl = false;
+	_activeMsgFl = false;
+
+	_game.loadQuoteSet(0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x45, 0x43, 0);
+
+	if (_scene->_priorSceneId == 101)
+		_vm->_sound->command(20);
+}
+
+void Room102::step() {
+	if (_game._trigger == 70)
+		_game._player._stepEnabled = true;
+
+	if (_game._trigger == 72) {
+		_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 5);
+		_scene->_sequences.addTimer(48, 90);
+	}
+
+	if (_game._trigger >= 90) {
+		if (_game._trigger >= 94) {
+			_scene->loadAnimation(formAnimName('B', -1), 71);
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+
+			_globals[kWaterInAPuddle] = true;
+			_vm->_sound->command(24);
+		} else {
+			_vm->_sound->command(23);
+			_scene->_sequences.addTimer(48, _game._trigger + 1);
+		}
+	}
+
+	if (_game._trigger == 71) {
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+	}
+
+	if (_fridgeOpenedFl && !_fridgeOpenedDescr) {
+		_fridgeCommentCount++;
+		if (_fridgeCommentCount > 16384) {
+			_fridgeOpenedDescr = true;
+			_vm->_dialogs->show(10213);
+		}
+	}
+
+	if (!_activeMsgFl && (_game._player._playerPos == Common::Point(177, 114)) && (_game._player._facing == FACING_NORTH)
+		&& (_vm->getRandomNumber(1, 5000) == 1)) {
+		_scene->_kernelMessages.reset();
+		_activeMsgFl = false;
+		addRandomMessage();
+	}
+
+	if (_game._trigger == 73)
+		_activeMsgFl = false;
+}
+
+void Room102::preActions() {
+	if (_action.isObject(NOUN_REFRIGERATOR) || _action.isObject(NOUN_POSTER))
+		_game._player._needToWalk = _game._player._readyToWalk;
+
+	if (_fridgeOpenedFl && !_action.isObject(NOUN_REFRIGERATOR)) {
+		switch (_game._trigger) {
+		case 0:
+			if (_game._player._needToWalk) {
+				_scene->_sequences.remove(_globals._sequenceIndexes[7]);
+				_globals._sequenceIndexes[7] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+				_game._player._stepEnabled = false;
+				_vm->_sound->command(20);
+			}
+			break;
+
+		case 1:
+			if (_game._objects.isInRoom(OBJ_BURGER)) {
+				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+				_scene->_hotspots.activate(NOUN_BURGER, false);
+			}
+			_fridgeOpenedFl = false;
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._player._needToWalk)
+		_scene->_kernelMessages.reset();
+}
+
+void Room102::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10234);
+		_action._inProgress = false;
+		return;
+	}
+
+	bool justOpenedFl = false;
+	if (_action.isObject(NOUN_REFRIGERATOR) && !_fridgeOpenedFl) {
+		switch (_game._trigger) {
+		case 0:
+			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			if (_game._objects.isInRoom(OBJ_BURGER)) {
+				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 0, 0, 0);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+			}
+			_game._player._stepEnabled = false;
+			_vm->_sound->command(20);
+			_action._inProgress = false;
+			return;
+
+		case 1:
+			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 0, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+			int delay;
+			if (_action.isAction(VERB_WALKTO) && !_fridgeFirstOpenFl)
+				delay = 0;
+			else
+				delay = 48;
+			_scene->_sequences.addTimer(delay, 2);
+			_action._inProgress = false;
+			return;
+
+		case 2:
+			_fridgeOpenedFl = true;
+			_fridgeOpenedDescr = false;
+			_fridgeCommentCount = 0;
+			_game._player._stepEnabled = true;
+			justOpenedFl = true;
+			if (_game._objects.isInRoom(OBJ_BURGER))
+				_scene->_hotspots.activate(NOUN_BURGER, true);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_REFRIGERATOR) || _action.isAction(VERB_OPEN, NOUN_REFRIGERATOR)) {
+		if (_game._objects.isInRoom(OBJ_BURGER))
+			_vm->_dialogs->show(10230);
+		else
+			_vm->_dialogs->show(10229);
+
+		_fridgeFirstOpenFl = false;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALKTO, NOUN_REFRIGERATOR) && justOpenedFl) {
+		_fridgeFirstOpenFl = false;
+		int quoteId = _vm->getRandomNumber(59, 63);
+		Common::String curQuote = _game.getQuote(quoteId);
+		int width = _scene->_kernelMessages._talkFont->getWidth(curQuote, -1);
+		_scene->_kernelMessages.reset();
+		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+		_scene->_kernelMessages.add(Common::Point(210, 60), 0x1110, 0, 73, 120, curQuote);
+		_scene->_kernelMessages.add(Common::Point(214 + width, 60), 0x1110, 0, 73, 120, _game.getQuote(64));
+		_activeMsgFl = true;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_REFRIGERATOR)) {
+		_vm->_dialogs->show(10213);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_REFRIGERATOR)) {
+		_vm->_dialogs->show(8);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case 0:
+			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_game._player._stepEnabled = false;
+			_vm->_sound->command(20);
+			break;
+
+		case 1:
+			_scene->_nextSceneId = 101;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALKTO, NOUN_ENGINEERING_SECTION)) {
+		_scene->_nextSceneId = 103;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALKTO, NOUN_POSTER) || _action.isAction(VERB_LOOK, NOUN_POSTER) || _action.isAction(VERB_WALKTO, NOUN_BINOCULARS)) {
+		addRandomMessage();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_WEIGHT_MACHINE)) {
+		_vm->_dialogs->show(10212);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_ENGINEERING_SECTION)) {
+		_vm->_dialogs->show(10205);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_DOOR)) {
+		_vm->_dialogs->show(10204);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_STARE_AT, NOUN_CEILING) || _action.isAction(VERB_LOOK, NOUN_CEILING)) {
+		_vm->_dialogs->show(10203);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_STARE_AT, NOUN_OVERHEAD_LAMP) || _action.isAction(VERB_LOOK, NOUN_OVERHEAD_LAMP)) {
+		_vm->_dialogs->show(10202);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_ROBO_KITCHEN)) {
+		_vm->_dialogs->show(10215);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(OBJ_BURGER)) {
+		_vm->_dialogs->show(10216);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PUT, NOUN_REFRIGERATOR) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+		_vm->_dialogs->show(10217);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_ROBO_KITCHEN) || _action.isAction(VERB_PUT, NOUN_STUFFED_FISH, NOUN_ROBO_KITCHEN)) {
+		_vm->_dialogs->show(10230);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_ROBO_KITCHEN)) {
+		_vm->_dialogs->show(10218);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_CLOSET)) {
+		_vm->_dialogs->show(10219);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isObject(NOUN_LADDER) || _action.isObject(NOUN_HATCHWAY)) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_CLIMB_UP) || _action.isAction(VERB_CLIMB_THROUGH))) {
+		if (_game._objects.isInInventory(OBJ_REBREATHER)) {
+			if (!_action.isAction(VERB_CLIMB_UP) && !_action.isAction(VERB_CLIMB_THROUGH)) {
+				_vm->_dialogs->show(10231);
+				_action._inProgress = false;
+				return;
+			}
+		} else if (_action.isAction(VERB_LOOK) || (_game._difficulty != DIFFICULTY_HARD)) {
+			_vm->_dialogs->show(10222);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isObject(NOUN_LADDER) || _action.isObject(NOUN_HATCHWAY)) && (_action.isAction(VERB_CLIMB_UP) || _action.isAction(VERB_CLIMB_THROUGH))) {
+		switch (_game._trigger) {
+		case 0:
+			_scene->loadAnimation(formAnimName('A', -1), 1);
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			break;
+
+		case 1:
+			_vm->_sound->command(24);
+			_scene->_sequences.addTimer(48, 2);
+			break;
+
+		case 2:
+		case 3:
+		case 4:
+			_vm->_sound->command(23);
+			_scene->_sequences.addTimer(48, _game._trigger + 1);
+			break;
+
+		case 5:
+			_vm->_sound->command(24);
+			_scene->_sequences.addTimer(48, _game._trigger + 1);
+			break;
+
+		case 6:
+			if (_game._objects.isInInventory(OBJ_REBREATHER) && !_game._visitedScenes.exists(106))
+				_vm->_dialogs->show(10237);
+			_scene->_nextSceneId = 106;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_POWER_STATUS_PANEL)) {
+		_vm->_dialogs->show(10226);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_WINDOW) || _action.isAction(VERB_LOOK_THROUGH, NOUN_WINDOW)) {
+		_vm->_dialogs->show(10227);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_DOORWAY) || _action.isAction(VERB_WALKTO, NOUN_DOORWAY)) {
+		_vm->_dialogs->show(10228);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_DRAWER) || ((_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) && !_drawerDescrFl)) {
+		_vm->_dialogs->show(10220);
+		_drawerDescrFl = true;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) {
+		_vm->_dialogs->show(10221);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_DRAWER)) {
+		_vm->_dialogs->show(10236);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) && !_chairDescrFl)) {
+		_chairDescrFl = true;
+		_vm->_dialogs->show(10210);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_SIT_IN, NOUN_CHAIR)) {
+		_vm->_dialogs->show(10211);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_MEDICINE_CABINET)) {
+		if (_globals[kMedicineCabinetOpen])
+			_vm->_dialogs->show(10207);
+		else
+			_vm->_dialogs->show(10206);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_MEDICINE_CABINET) && _globals[kMedicineCabinetOpen]) {
+		switch (_game._trigger) {
+		case 0:
+			_scene->_sequences.remove(_globals._sequenceIndexes[8]);
+			_globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_game._player._stepEnabled = false;
+			_vm->_sound->command(21);
+			break;
+
+		case 1:
+			_scene->_sequences.addTimer(48, 2);
+			break;
+
+		case 2:
+			_game._player._stepEnabled = true;
+			_globals[kMedicineCabinetOpen] = false;
+			_vm->_dialogs->show(10209);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_MEDICINE_CABINET) && !_globals[kMedicineCabinetOpen]) {
+		switch (_game._trigger) {
+		case 0:
+			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_game._player._stepEnabled = false;
+			_vm->_sound->command(21);
+			break;
+
+		case 1:
+			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2);
+			_scene->_sequences.addTimer(48, 2);
+			break;
+
+		case 2:
+			_game._player._stepEnabled = true;
+			_globals[kMedicineCabinetOpen] = true;
+			if (_globals[kMedicineCabinetVirgin]) {
+				_vm->_dialogs->show(10208);
+			} else {
+				_vm->_dialogs->show(10207);
+			}
+			_globals[kMedicineCabinetVirgin] = false;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && _game._objects.isInRoom(OBJ_BINOCULARS)) {
+		switch (_game._trigger) {
+		case 0:
+			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[11]);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			break;
+
+		case 1:
+			_game._objects.addToInventory(OBJ_BINOCULARS);
+			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
+			_scene->_hotspots.activate(NOUN_BINOCULARS, false);
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			_vm->_sound->command(22);
+			_vm->_dialogs->showItem(OBJ_BINOCULARS, 10201);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BURGER) && _game._objects.isInRoom(OBJ_BURGER)) {
+		if (_game._trigger == 0) {
+			_vm->_dialogs->showItem(OBJ_BURGER, 10235);
+			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+			_game._objects.addToInventory(OBJ_BURGER);
+			_scene->_hotspots.activate(NOUN_BURGER, false);
+			_vm->_sound->command(22);
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_POSTER)) {
+		_vm->_dialogs->show(10224);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_WEIGHT_MACHINE)) {
+		_vm->_dialogs->show(10225);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_FLOOR)) {
+		_vm->_dialogs->show(10232);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && !_game._objects.isInInventory(OBJ_BINOCULARS)) {
+		_vm->_dialogs->show(10233);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+		_vm->_dialogs->show(801);
+		_action._inProgress = false;
+	}
+}
+
+void Room102::postActions() {
+	if (_action.isAction(VERB_PUT, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+		_vm->_dialogs->show(10217);
+		_action._inProgress = false;
+	}
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room103.cpp b/engines/mads/madsv2/nebular/rooms/room103.cpp
new file mode 100644
index 00000000000..a32fba42596
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room103.cpp
@@ -0,0 +1,357 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room103.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+
+Room103::Room103(RexNebularEngine *vm) : Room1xx(vm) {
+	_updateClock = 0;
+}
+
+void Room103::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	byte dummy = 0;
+	s.syncAsByte(dummy); // In order to avoid to break savegame compatibility
+	s.syncAsUint32LE(_updateClock);
+}
+
+void Room103::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room103::enter() {
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', -1));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('h', -1));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', -1));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('t', -1));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('r', -1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('c', -1));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_2");
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites("*RXMRD_3");
+	_globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 7, 0, 1, 0);
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 2, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 0);
+
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 25);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 72);
+
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 1, 37);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 2, 73);
+
+	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8);
+	_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6);
+
+	if (_game._objects.isInRoom(OBJ_TIMER_MODULE))
+		_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6);
+	else
+		_vm->_game->_scene._hotspots.activate(371, false);
+
+	if (_game._objects.isInRoom(OBJ_REBREATHER))
+		_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6);
+	else
+		_vm->_game->_scene._hotspots.activate(289, false);
+
+	if (_globals[kTurkeyExploded]) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -2, -2);
+		_scene->_hotspots.activate(362, false);
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(237, 74);
+
+	if (_scene->_priorSceneId == 102) {
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+	}
+
+	sceneEntrySound();
+	_vm->_game->loadQuoteSet(70, 51, 71, 7, 73, 0);
+
+	if (!_game._visitedScenes._sceneRevisited) {
+		int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(70));
+		_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+	}
+
+	if (_scene->_priorSceneId == 102)
+		_vm->_sound->command(20);
+
+	_vm->_palette->setEntry(252, 63, 63, 10);
+	_vm->_palette->setEntry(253, 45, 45, 10);
+	_updateClock = _scene->_frameStartTime;
+}
+
+void Room103::step() {
+	switch (_vm->_game->_trigger) {
+	case 70:
+		_vm->_game->_player._stepEnabled = true;
+		break;
+
+	case 72:
+	{
+		Common::Point pt = _vm->_game->_player._playerPos;
+		int dist = Math::hypotenuse(pt.x - 58, pt.y - 93);
+		_vm->_sound->command(27, (dist * -128 / 378) + 127);
+	}
+	break;
+
+	case 73:
+	{
+		Common::Point pt = _vm->_game->_player._playerPos;
+		int dist = Math::hypotenuse(pt.x - 266, pt.y - 81);
+		_vm->_sound->command(27, (dist * -127 / 378) + 127);
+	}
+	break;
+
+	default:
+		break;
+	}
+
+	if (_scene->_frameStartTime >= _updateClock) {
+		Common::Point pt = _vm->_game->_player._playerPos;
+		int dist = Math::hypotenuse(pt.x - 79, pt.y - 137);
+		_vm->_sound->command(29, (dist * -127 / 378) + 127);
+
+		pt = _vm->_game->_player._playerPos;
+		dist = Math::hypotenuse(pt.x - 69, pt.y - 80);
+		_vm->_sound->command(30, (dist * -127 / 378) + 127);
+
+		pt = _vm->_game->_player._playerPos;
+		dist = Math::hypotenuse(pt.x - 266, pt.y - 138);
+		_vm->_sound->command(32, (dist * -127 / 378) + 127);
+
+		_updateClock = _scene->_frameStartTime + _vm->_game->_player._ticksAmount;
+	}
+}
+
+void Room103::actions() {
+	if (_action._savedFields._lookFlag)
+		_vm->_dialogs->show(10322);
+	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+		switch (_vm->_game->_trigger) {
+		case 0:
+			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_game._player._stepEnabled = false;
+			_vm->_sound->command(20);
+			break;
+
+		case 1:
+			_vm->_sound->command(1);
+			_scene->_nextSceneId = 102;
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+	} else if (_action.isAction(VERB_TAKE, NOUN_TIMER_MODULE) && _game._objects.isInRoom(OBJ_TIMER_MODULE)) {
+		switch (_vm->_game->_trigger) {
+		case 0:
+			_scene->changeVariant(1);
+			_globals._sequenceIndexes[13] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[13], false, 3, 2);
+			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[13]);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_SPRITE, 7, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			_vm->_game->_player._visible = false;
+			_vm->_game->_player._stepEnabled = false;
+			break;
+
+		case 1:
+			_scene->_sequences.remove(_globals._sequenceIndexes[11]);
+			break;
+
+		case 2:
+			_vm->_sound->command(22);
+			_game._objects.addToInventory(OBJ_TIMER_MODULE);
+			_scene->changeVariant(0);
+			_scene->drawElements(kTransitionNone, false);
+			_scene->_hotspots.activate(371, false);
+			_vm->_game->_player._visible = true;
+			_vm->_game->_player._stepEnabled = true;
+			_vm->_dialogs->showItem(OBJ_TIMER_MODULE, 805);
+			break;
+
+		default:
+			break;
+		}
+	} else if (_action.isAction(VERB_TAKE, NOUN_REBREATHER, 0) && _game._objects.isInRoom(OBJ_REBREATHER)) {
+		switch (_vm->_game->_trigger) {
+		case 0:
+			_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 3, 2);
+			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			_vm->_game->_player._visible = false;
+			_vm->_game->_player._stepEnabled = false;
+			break;
+
+		case 1:
+			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+			break;
+
+		case 2:
+			_vm->_sound->command(22);
+			_game._objects.addToInventory(OBJ_REBREATHER);
+			_scene->_hotspots.activate(289, false);
+			_vm->_game->_player._visible = true;
+			_vm->_game->_player._stepEnabled = true;
+			_vm->_dialogs->showItem(OBJ_REBREATHER, 804);
+			break;
+
+		default:
+			break;
+		}
+	} else if (_action.isAction(VERB_LOOK, 362))
+		_vm->_dialogs->show(10301);
+	else if (_action.isAction(VERB_TAKE, 362)) {
+		// Take Turkey
+		if (!_vm->_game->_trigger)
+			_vm->_sound->command(31);
+
+		if (_vm->_game->_trigger < 2) {
+			_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, _vm->_game->_trigger < 1 ? 1 : 0);
+			if (_vm->_game->_trigger) {
+				// Lock the turkey into a permanent "exploded" frame
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -2, -2);
+
+				// Rex says "Gads.."
+				Common::String msg = _game.getQuote(51);
+				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 0, 60, msg);
+				_scene->_sequences.addTimer(120, _vm->_game->_trigger + 1);
+			} else {
+				// Initial turky explosion
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			}
+		}
+
+		// Re-enable player if sequence is ended, and set global flag
+		_game._player._stepEnabled = _game._trigger == 2;
+		_globals[kTurkeyExploded] = -1;
+
+		if (_game._trigger == 2) {
+			// Show exposition dialog at end of sequence
+			_vm->_dialogs->show(10302);
+			_scene->_hotspots.activate(362, false);
+		}
+	} else if (_action.isAction(VERB_LOOK, 250))
+		_vm->_dialogs->show(!_globals[kTurkeyExploded] ? 10323 : 10303);
+	else if (_action.isAction(VERB_TALKTO, 27)) {
+		switch (_vm->_game->_trigger) {
+		case 0:
+		{
+			_game._player._stepEnabled = false;
+			Common::String msg = _game.getQuote(71);
+			_scene->_kernelMessages.add(Common::Point(), 0x1110, 18, 1, 120, msg);
+			break;
+		}
+
+		case 1:
+		{
+			Common::String msg = _game.getQuote(72);
+			_scene->_kernelMessages.add(Common::Point(310, 132), 0xFDFC, 16, 2, 120, msg);
+			break;
+		}
+
+		case 2:
+			_scene->_kernelMessages.reset();
+			_scene->_sequences.addTimer(1, 3);
+			break;
+
+		case 3:
+			_game._player._stepEnabled = true;
+			_vm->_dialogs->show(10306);
+			break;
+
+		default:
+			break;
+		}
+	} else if (_action.isAction(VERB_LOOK, 27))
+		_vm->_dialogs->show(10304);
+	else if (_action.isAction(VERB_LOOK, 36))
+		_vm->_dialogs->show(10307);
+	else if (_action.isAction(VERB_LOOK, 55))
+		_vm->_dialogs->show(10308);
+	else if (_action.isAction(VERB_TAKE, 315))
+		_vm->_dialogs->show(10309);
+	else if (_action.isAction(VERB_TAKE, 85))
+		_vm->_dialogs->show(10310);
+	else if (_action.isAction(VERB_LOOK, 144))
+		_vm->_dialogs->show(10312);
+	else if (_action.isAction(VERB_OPEN, 144))
+		_vm->_dialogs->show(10313);
+	else if (_action.isAction(VERB_CLOSE, 27))
+		_vm->_dialogs->show(10314);
+	else if (_action.isAction(VERB_LOOK, 310))
+		_vm->_dialogs->show(10315);
+	else if (_action.isAction(VERB_LOOK, 178))
+		_vm->_dialogs->show(10316);
+	else if (_action.isAction(VERB_LOOK, 283))
+		_vm->_dialogs->show(10317);
+	else if (_action.isAction(VERB_LOOK, 120))
+		_vm->_dialogs->show(10318);
+	else if (_action.isAction(VERB_LOOK, 289) && _game._objects.isInInventory(OBJ_REBREATHER))
+		_vm->_dialogs->show(10319);
+	else if (_action.isAction(VERB_LOOK, 371) && _game._objects.isInInventory(OBJ_TIMER_MODULE))
+		_vm->_dialogs->show(10320);
+	else if (_action.isAction(VERB_LOOK, 137))
+		_vm->_dialogs->show(10321);
+	else if (_action.isAction(VERB_LOOK, 409))
+		_vm->_dialogs->show(_game._objects.isInInventory(OBJ_TIMER_MODULE) ? 10324 : 10325);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+void Room103::postActions() {
+	if (_action.isObject(NOUN_AUXILIARY_POWER) && !_action.isAction(VERB_WALKTO)) {
+		_vm->_dialogs->show(10305);
+		_action._inProgress = false;
+	} else if (_action.isAction(VERB_PUT, NOUN_COAL, NOUN_FURNACE)) {
+		Common::String msg = _game.getQuote(73);
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, msg);
+		_action._inProgress = false;
+	}
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room104.cpp b/engines/mads/madsv2/nebular/rooms/room104.cpp
new file mode 100644
index 00000000000..f67e75a7ce2
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room104.cpp
@@ -0,0 +1,247 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room104::Room104(RexNebularEngine *vm) : Room1xx(vm) {
+	_kargShootingFl = false;
+	_loseFl = false;
+}
+
+void Room104::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_kargShootingFl);
+	s.syncAsByte(_loseFl);
+}
+
+void Room104::setup() {
+	// Preloading has been skipped
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room104::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -1));
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 0, 0, 1);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+
+	if (_scene->_priorSceneId == 105)
+		_game._player._playerPos = Common::Point(302, 107);
+	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(160, 134);
+
+	_loseFl = false;
+	_game.loadQuoteSet(0x35, 0x34, 0);
+	_kargShootingFl = false;
+
+	if (_vm->getRandomNumber(1, 3) == 1) {
+		_scene->loadAnimation(Resources::formatName(104, 'B', -1, EXT_AA, ""), 0);
+		_kargShootingFl = true;
+	}
+
+	sceneEntrySound();
+}
+
+void Room104::step() {
+	if ((_game._player._playerPos == Common::Point(189, 70)) && (_game._trigger || !_loseFl)) {
+		if (_game._player._facing == FACING_SOUTHWEST || _game._player._facing == FACING_SOUTHEAST)
+			_game._player._facing = FACING_SOUTH;
+
+		if (_game._player._facing == FACING_NORTHWEST || _game._player._facing == FACING_NORTHEAST)
+			_game._player._facing = FACING_NORTH;
+
+		bool mirrorFl = false;
+		if (_game._player._facing == FACING_WEST) {
+			_game._player._facing = FACING_EAST;
+			mirrorFl = true;
+		}
+
+		_loseFl = true;
+
+		switch (_game._player._facing) {
+		case FACING_EAST:
+			switch (_game._trigger) {
+			case 0:
+				_scene->_kernelMessages.reset();
+				_scene->freeAnimation();
+				_scene->resetScene();
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
+				_vm->_palette->refreshSceneColors();
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], mirrorFl, 7, 1, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(198, 143));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				break;
+
+			case 1:
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], mirrorFl, 7, 0, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(198, 143));
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -2, -2);
+				_scene->_sequences.addTimer(90, 2);
+				break;
+
+			case 2:
+				_vm->_dialogs->show(10406);
+				_scene->_reloadSceneFlag = true;
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case FACING_SOUTH:
+			switch (_game._trigger) {
+			case 0:
+				_scene->_kernelMessages.reset();
+				_scene->freeAnimation();
+				_scene->resetScene();
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
+				_vm->_palette->refreshSceneColors();
+				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(198, 143));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 14);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				break;
+
+			case 1:
+				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(198, 143));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 15, 32);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				break;
+
+			case 2:
+				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 3, 0, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(198, 143));
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
+				_scene->_sequences.addTimer(90, 3);
+				break;
+
+			case 3:
+				_vm->_dialogs->show(10406);
+				_scene->_reloadSceneFlag = true;
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case FACING_NORTH:
+			switch (_game._trigger) {
+			case 0:
+				_scene->_kernelMessages.reset();
+				_scene->freeAnimation();
+				_scene->resetScene();
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2));
+				_vm->_palette->refreshSceneColors();
+				_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 8, 1, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(198, 143));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				if (_game._storyMode >= STORYMODE_NICE)
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 15, 2);
+				break;
+
+			case 1:
+				_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 8, 0, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(198, 143));
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -2, -2);
+				_scene->_sequences.addTimer(90, 2);
+				break;
+
+			case 2:
+				_vm->_dialogs->show(10406);
+				_scene->_reloadSceneFlag = true;
+				break;
+
+			default:
+				break;
+			}
+			break;
+		default:
+			break;
+		}
+
+		if (!_game._trigger)
+			_vm->_sound->command(34);
+	}
+
+	if (_game._player._moving && (_scene->_rails.getNext() > 0)) {
+		_game._player.cancelCommand();
+		_game._player.startWalking(Common::Point(189, 70), FACING_NONE);
+		_scene->_rails.resetNext();
+	}
+
+	if ((_game._player._special > 0) && _game._player._stepEnabled)
+		_game._player._stepEnabled = false;
+
+	if (_kargShootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
+		_kargShootingFl = false;
+	}
+}
+
+void Room104::preActions() {
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_EASTERN_CLIFF_FACE))
+		_game._player._walkOffScreenSceneId = 105;
+
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+		_game._player._walkOffScreenSceneId = 106;
+}
+
+void Room104::actions() {
+	if (_action._lookFlag)
+		_vm->_dialogs->show(10405);
+	else if (_action.isAction(VERB_LOOK, NOUN_CURIOUS_WEED_PATCH))
+		_vm->_dialogs->show(10404);
+	else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+		_vm->_dialogs->show(10403);
+	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+		_vm->_dialogs->show(10401);
+	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+		_vm->_dialogs->show(10402);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room105.cpp b/engines/mads/madsv2/nebular/rooms/room105.cpp
new file mode 100644
index 00000000000..c6a3444163b
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room105.cpp
@@ -0,0 +1,191 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room105::Room105(RexNebularEngine *vm) : Room1xx(vm) {
+	_explosionFl = false;
+}
+
+void Room105::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_explosionFl);
+}
+
+void Room105::setup() {
+	// Preloading has been skipped
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room105::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('m', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 4));
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 0);
+
+	if (_globals[kFishIn105]) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(48, 144));
+
+		int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(56, 141), FACING_NORTHWEST);
+	}
+
+	if (_scene->_priorSceneId == 104)
+		_game._player._playerPos = Common::Point(13, 97);
+	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(116, 147);
+
+	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
+	_explosionFl = false;
+
+	sceneEntrySound();
+}
+
+void Room105::step() {
+	if ((_game._player._playerPos == Common::Point(170, 87)) && (_game._trigger || !_explosionFl)) {
+		_explosionFl = true;
+		switch (_game._trigger) {
+		case 0:
+			_scene->_kernelMessages.reset();
+			_scene->resetScene();
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('m', 0));
+			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 2));
+			_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', 3));
+			_vm->_sound->command(33);
+			_scene->clearSequenceList();
+			_vm->_palette->refreshSceneColors();
+
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1, 0, 0);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 8);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+
+			if (_game._storyMode >= STORYMODE_NICE)
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 8, 3);
+			break;
+
+		case 1:
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 9, 1, 0, 0);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], _globals._sequenceIndexes[0]);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 5, 7);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			break;
+
+		case 2:
+		{
+			int oldIdx = _globals._sequenceIndexes[2];
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 9, 0, 0, 0);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+			_scene->_sequences.addTimer(90, 3);
+		}
+		break;
+
+		case 3:
+			_vm->_dialogs->show(10507);
+			_scene->_reloadSceneFlag = true;
+			_scene->_sequences.addTimer(90, 4);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._player._moving && (_scene->_rails.getNext() > 0)) {
+		_game._player.cancelCommand();
+		_game._player.startWalking(Common::Point(170, 87), FACING_NONE);
+		_scene->_rails.resetNext();
+	}
+
+	if ((_game._player._special > 0) && _game._player._stepEnabled)
+		_game._player._stepEnabled = false;
+}
+
+void Room105::preActions() {
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_WESTERN_CLIFF_FACE))
+		_game._player._walkOffScreenSceneId = 104;
+
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+		_game._player._walkOffScreenSceneId = 107;
+
+	if (_action.isObject(NOUN_MINE) && (_action.isAction(VERB_TALKTO) || _action.isAction(VERB_LOOK)))
+		_game._player._needToWalk = false;
+}
+
+void Room105::actions() {
+	if (_action._lookFlag)
+		_vm->_dialogs->show(10512);
+	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn105]) {
+		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
+			int randVal = _vm->getRandomNumber(74, 76);
+			_scene->_kernelMessages.reset();
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+		} else {
+			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+			_game._objects.addToInventory(OBJ_DEAD_FISH);
+			_globals[kFishIn105] = false;
+			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 802, 0);
+		}
+	} else if (_action.isAction(VERB_LOOK, NOUN_WESTERN_CLIFF_FACE))
+		_vm->_dialogs->show(10501);
+	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+		_vm->_dialogs->show(10502);
+	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+		_vm->_dialogs->show(10503);
+	else if (_action.isAction(VERB_LOOK, NOUN_MEDICAL_WASTE))
+		_vm->_dialogs->show(10504);
+	else if (_action.isAction(VERB_TAKE, NOUN_MEDICAL_WASTE))
+		_vm->_dialogs->show(10505);
+	else if (_action.isAction(VERB_LOOK, NOUN_MINE))
+		_vm->_dialogs->show(10506);
+	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH))
+		_vm->_dialogs->show(10508);
+	else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+		_vm->_dialogs->show(10509);
+	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_SOUTH))
+		_vm->_dialogs->show(10510);
+	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+		_vm->_dialogs->show(10511);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room106.cpp b/engines/mads/madsv2/nebular/rooms/room106.cpp
new file mode 100644
index 00000000000..7154c0d6f99
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room106.cpp
@@ -0,0 +1,254 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room106::Room106(RexNebularEngine *vm) : Room1xx(vm) {
+	_backToShipFl = false;
+	_shadowFl = false;
+	_firstEmergingFl = false;
+	_positionY = 0;
+}
+
+void Room106::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_backToShipFl);
+	s.syncAsByte(_shadowFl);
+	s.syncAsByte(_firstEmergingFl);
+	s.syncAsSint32LE(_positionY);
+}
+
+void Room106::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if ((_scene->_priorSceneId == 102) && !_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged)
+		_game._player._spritesPrefix = "";
+
+	_vm->_dialogs->_defaultPosition.y = 100;
+}
+
+void Room106::enter() {
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('H', -1));
+
+	if (_game._objects.isInInventory(OBJ_REBREATHER) || (_scene->_priorSceneId != 102) || _scene->_roomChanged) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('A', 0));
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('A', 1));
+	}
+
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('G', -1));
+	_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 21, 0, 0, 0);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('I', -1));
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 32, 47);
+
+	if (_scene->_priorSceneId == 102) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1, 4, 0);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_game._player._facing = FACING_EAST;
+		_game._player._playerPos = Common::Point(106, 69);
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		if (_scene->_priorSceneId == 107) {
+			_game._player._playerPos = Common::Point(319, 84);
+			_game._player._facing = _game._player._prepareWalkFacing = FACING_WEST;
+		} else {
+			_game._player._playerPos = Common::Point(319, 44);
+			_game._player._facing = _game._player._prepareWalkFacing = FACING_SOUTHWEST;
+			_scene->_sprites[_game._player._spritesStart + 3]->_charInfo->_velocity = 24;
+		}
+
+		_game._player._prepareWalkPos = Common::Point(246, 69);
+		_game._player._needToWalk = true;
+		_game._player._readyToWalk = true;
+	}
+
+	if (_scene->_priorSceneId != 102) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -2, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	}
+
+	_backToShipFl = false;
+	_shadowFl = false;
+	_firstEmergingFl = false;
+
+	_game.loadQuoteSet(0x31, 0x32, 0x34, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0);
+	sceneEntrySound();
+}
+
+void Room106::step() {
+	if (_game._trigger == 70) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -2, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+		if (!_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged) {
+			_scene->loadAnimation(Resources::formatName(106, 'A', -1, EXT_AA, ""), 75);
+		} else {
+			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1, 0, 0);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 28, 71);
+		}
+	}
+
+	if (_game._trigger == 71) {
+		_game._player._prepareWalkPos = Common::Point(246, 69);
+		_game._player._prepareWalkFacing = FACING_EAST;
+		_game._player._needToWalk = true;
+		_game._player._readyToWalk = true;
+		_game._player._visible = true;
+
+		if (_game._visitedScenes._sceneRevisited) {
+			_game._player._stepEnabled = true;
+		} else {
+			_game._player._prepareWalkFacing = FACING_SOUTHWEST;
+			_firstEmergingFl = true;
+			_scene->loadAnimation(Resources::formatName(106, 'B', -1, EXT_AA, ""), 80);
+		}
+	}
+
+	if (_firstEmergingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
+		_firstEmergingFl = false;
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
+	}
+
+	if ((_game._trigger >= 80) && (_game._trigger <= 87)) {
+		int tmpVal = _game._trigger - 80;
+		int msgId = -1;
+		switch (tmpVal) {
+		case 0:
+			_positionY = 26;
+			msgId = 49;
+			break;
+
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+		case 5:
+			msgId = 76 + tmpVal;
+			break;
+
+		case 6:
+			msgId = 50;
+			break;
+
+		default:
+			msgId = -1;
+			_game._player._stepEnabled = true;
+			break;
+		}
+
+		if (msgId >= 0) {
+			int nextTrigger = _game._trigger + 1;
+			_scene->_kernelMessages.add(Common::Point(15, _positionY), 0x1110, 0, 0, 360, _game.getQuote(msgId));
+			_scene->_sequences.addTimer(150, nextTrigger);
+			_positionY += 14;
+		}
+	}
+
+	if (_backToShipFl) {
+		if (!_shadowFl) {
+			if (_game._player._playerPos.x < 204) {
+				_shadowFl = true;
+				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 4, 1, 0, 0);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 44, 73);
+			}
+		} else if (_game._trigger == 73)
+			_game._player._visible = false;
+		else if (_game._trigger == 72)
+			_scene->_sequences.addTimer(24, 74);
+		else if (_game._trigger == 74)
+			_scene->_nextSceneId = 102;
+	}
+
+	if (_game._trigger == 75) {
+		_game._visitedScenes.pop_back();
+		_scene->_nextSceneId = 102;
+	}
+}
+
+void Room106::preActions() {
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_SEA_CLIFF) || _action.isAction(VERB_SWIM_TOWARDS, NOUN_SEAWEED_BANK)) {
+		_game._player._stepEnabled = false;
+		_scene->_sprites[_game._player._spritesStart + 1]->_charInfo->_velocity = 24;
+		_game._player._walkOffScreenSceneId = 104;
+	}
+
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_EAST))
+		_game._player._walkOffScreenSceneId = 107;
+}
+
+void Room106::actions() {
+	if (_action._lookFlag)
+		_vm->_dialogs->show(10614);
+	else if (_action.isAction(VERB_SWIM_TO, NOUN_MAIN_AIRLOCK)) {
+		_game._player._stepEnabled = false;
+		_game._player._prepareWalkPos = Common::Point(95, 72);
+		_game._player._prepareWalkFacing = FACING_WEST;
+		_game._player._needToWalk = true;
+		_game._player._readyToWalk = true;
+		_game._player._frameNumber = 9;
+		_backToShipFl = true;
+	} else if (_action.isAction(VERB_LOOK, NOUN_ANEMONE) || _action.isAction(VERB_LOOK_AT, NOUN_ANEMONE))
+		_vm->_dialogs->show(10601);
+	else if (_action.isAction(VERB_TAKE, NOUN_ANEMONE))
+		_vm->_dialogs->show(10602);
+	else if (_action.isAction(VERB_LOOK, NOUN_SEAWEED) || _action.isAction(VERB_LOOK, NOUN_SEAWEED_BANK))
+		_vm->_dialogs->show(10603);
+	else if (_action.isAction(VERB_TAKE, NOUN_SEAWEED) || _action.isAction(VERB_TAKE, NOUN_SEAWEED_BANK))
+		_vm->_dialogs->show(10604);
+	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_EAST))
+		_vm->_dialogs->show(10605);
+	else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_ROCKS) || _action.isAction(VERB_LOOK_AT, NOUN_PILE_OF_ROCKS))
+		_vm->_dialogs->show(10606);
+	else if (_action.isObject(NOUN_PILE_OF_ROCKS) && (_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE)))
+		_vm->_dialogs->show(10607);
+	else if (_action.isAction(VERB_LOOK, NOUN_SHIP) || _action.isAction(VERB_LOOK_AT, NOUN_SHIP))
+		_vm->_dialogs->show(10608);
+	else if (_action.isAction(VERB_LOOK, NOUN_MAIN_AIRLOCK))
+		_vm->_dialogs->show(10609);
+	else if (_action.isAction(VERB_OPEN, NOUN_MAIN_AIRLOCK))
+		_vm->_dialogs->show(10610);
+	else if (_action.isAction(VERB_CLOSE, NOUN_MAIN_AIRLOCK))
+		_vm->_dialogs->show(10611);
+	else if (_action.isAction(VERB_LOOK, NOUN_SEA_CLIFF))
+		_vm->_dialogs->show(10612);
+	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+		_vm->_dialogs->show(10613);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room107.cpp b/engines/mads/madsv2/nebular/rooms/room107.cpp
new file mode 100644
index 00000000000..abf74f09a0e
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room107.cpp
@@ -0,0 +1,153 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room107::Room107(RexNebularEngine *vm) : Room1xx(vm) {
+	_shootingFl = false;
+}
+
+void Room107::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_shootingFl);
+}
+
+void Room107::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_MANTA_RAY);
+}
+
+void Room107::enter() {
+	for (int i = 0; i < 3; i++)
+		_globals._spriteIndexes[i + 1] = _scene->_sprites.addSprites(formAnimName('G', i));
+
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(105, 'f', 4, EXT_SS, ""));
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 0, 0, 7);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 0, 0, 13);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 19, 0, 0, 9);
+
+	for (int i = 1; i < 4; i++)
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[i], 0);
+
+	if (_globals[kFishIn107]) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(68, 151));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+		int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(78, 135), FACING_SOUTHWEST);
+	}
+
+	if (_scene->_priorSceneId == 105)
+		_game._player._playerPos = Common::Point(132, 47);
+	else if (_scene->_priorSceneId == 106)
+		_game._player._playerPos = Common::Point(20, 91);
+	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(223, 151);
+
+	if (((_scene->_priorSceneId == 105) || (_scene->_priorSceneId == 106)) && (_vm->getRandomNumber(1, 3) == 1)) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(Resources::formatName(105, 'R', 1, EXT_SS, ""));
+		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], true, 4, 0, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(270, 150));
+		_scene->_sequences.setMotion(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, -200, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+		_scene->_dynamicHotspots.add(218, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+	}
+
+	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
+	_shootingFl = false;
+
+	if (_vm->getRandomNumber(1, 3) == 1) {
+		_scene->loadAnimation(Resources::formatName(107, 'B', -1, EXT_AA, ""), 0);
+		_shootingFl = true;
+	}
+
+	sceneEntrySound();
+}
+
+void Room107::step() {
+	if (_shootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
+		_shootingFl = false;
+	}
+}
+
+void Room107::preActions() {
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
+		_game._player._walkOffScreenSceneId = 106;
+
+	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+		_game._player._walkOffScreenSceneId = 108;
+}
+
+void Room107::actions() {
+	if (_action._lookFlag)
+		_vm->_dialogs->show(10708);
+	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn107]) {
+		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
+			int randVal = _vm->getRandomNumber(74, 76);
+			_scene->_kernelMessages.reset();
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+		} else {
+			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+			_game._objects.addToInventory(OBJ_DEAD_FISH);
+			_globals[kFishIn107] = false;
+			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 802);
+		}
+	} else if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_NORTHERN_SEA_CLIFF))
+		_scene->_nextSceneId = 105;
+	else if (_action.isAction(VERB_LOOK, NOUN_NORTHERN_SEA_CLIFF))
+		_vm->_dialogs->show(10701);
+	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == CAT_HOTSPOT))
+		_vm->_dialogs->show(10702);
+	else if (_action.isAction(VERB_LOOK, NOUN_BUSH_LIKE_FORMATION))
+		_vm->_dialogs->show(10703);
+	else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+		_vm->_dialogs->show(10704);
+	else if (_action.isAction(VERB_LOOK, NOUN_SEAWEED))
+		_vm->_dialogs->show(10705);
+	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_SOUTH))
+		_vm->_dialogs->show(10706);
+	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+		_vm->_dialogs->show(10707);
+	else if (_action.isAction(VERB_LOOK, NOUN_MANTA_RAY))
+		_vm->_dialogs->show(10709);
+	else if (_action.isAction(VERB_TAKE, NOUN_MANTA_RAY))
+		_vm->_dialogs->show(10710);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room108.cpp b/engines/mads/madsv2/nebular/rooms/room108.cpp
new file mode 100644
index 00000000000..746a5c94d80
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room108.cpp
@@ -0,0 +1,119 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+void Room108::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room108::enter() {
+	if (_globals[kHoovicSated] == 2)
+		_globals[kHoovicSated] = 0;
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 3));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(105, 'f', 4, EXT_SS, ""));
+
+	_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 13, 0, 0, 7);
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 16, 0, 0, 9);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 0, 0, 3);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 14, 0, 0, 13);
+
+	for (int i = 0; i <= 3; i++)
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[i], 0);
+
+	if (_globals[kFishIn108]) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(41, 109));
+		int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(41, 109), FACING_NORTHWEST);
+	}
+
+	if (_scene->_priorSceneId == 107)
+		_game._player._playerPos = Common::Point(138, 58);
+	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(305, 98);
+
+	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
+	sceneEntrySound();
+}
+
+void Room108::preActions() {
+	if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_EAST))
+		_game._player._walkOffScreenSceneId = 109;
+}
+
+void Room108::actions() {
+	if (_action._lookFlag)
+		_vm->_dialogs->show(10812);
+	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn108]) {
+		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
+			int randVal = _vm->getRandomNumber(74, 76);
+			_scene->_kernelMessages.reset();
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+		} else {
+			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+			_game._objects.addToInventory(OBJ_DEAD_FISH);
+			_globals[kFishIn108] = false;
+			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 10808);
+		}
+	} else if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_NORTH))
+		_scene->_nextSceneId = 107;
+	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+		_vm->_dialogs->show(10801);
+	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+		_vm->_dialogs->show(10802);
+	else if (_action.isAction(VERB_LOOK, NOUN_ODD_ROCK_FORMATION))
+		_vm->_dialogs->show(10803);
+	else if (_action.isAction(VERB_TAKE, NOUN_ODD_ROCK_FORMATION))
+		_vm->_dialogs->show(10804);
+	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+		_vm->_dialogs->show(10805);
+	else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+		_vm->_dialogs->show(10806);
+	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH))
+		_vm->_dialogs->show(10807);
+	else if (_action.isAction(VERB_LOOK, NOUN_OVERHANG_TO_EAST))
+		_vm->_dialogs->show(10809);
+	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_NORTH))
+		_vm->_dialogs->show(10810);
+	else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+		_vm->_dialogs->show(10811);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room109.cpp b/engines/mads/madsv2/nebular/rooms/room109.cpp
new file mode 100644
index 00000000000..c46b248d9ee
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room109.cpp
@@ -0,0 +1,459 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room109::Room109(RexNebularEngine *vm) : Room1xx(vm) {
+	_rexThrowingObject = false;
+	_hoovicDifficultFl = false;
+	_beforeEatingRex = false;
+	_eatingRex = false;
+	_hungryFl = false;
+	_eatingFirstFish = false;
+
+	_throwingObjectId = -1;
+	_hoovicTrigger = 0;
+}
+
+void Room109::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_rexThrowingObject);
+	s.syncAsByte(_hoovicDifficultFl);
+	s.syncAsByte(_beforeEatingRex);
+	s.syncAsByte(_eatingRex);
+	s.syncAsByte(_hungryFl);
+	s.syncAsByte(_eatingFirstFish);
+	s.syncAsSint32LE(_throwingObjectId);
+	s.syncAsSint32LE(_hoovicTrigger);
+}
+
+void Room109::setup() {
+	_scene->addActiveVocab(NOUN_DEAD_PURPLE_MONSTER);
+	_scene->addActiveVocab(NOUN_MONSTER_SLUDGE);
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room109::enter() {
+	_globals[kFishIn105] = true;
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RXSWRC_6");
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('O', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('O', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('O', 0));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('H', 4));
+
+	_rexThrowingObject = false;
+	_throwingObjectId = 0;
+	_beforeEatingRex = false;
+	_eatingRex = false;
+	_hungryFl = false;
+
+	if (_scene->_priorSceneId == 110) {
+		_game._player._playerPos = Common::Point(248, 38);
+		_globals[kHoovicSated] = 2;
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(20, 68);
+		_game._player._facing = FACING_EAST;
+	}
+
+	if (!_globals[kHoovicAlive]) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
+
+		int idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(256, 57, 267, 87));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+		idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(242, 79, 265, 90));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+		idx = _scene->_dynamicHotspots.add(229, 348, -1, Common::Rect(231, 88, 253, 94));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+	}
+
+	if (!_globals[kHoovicAlive] || _globals[kHoovicSated])
+		_scene->changeVariant(1);
+
+	if (_game._objects.isInRoom(OBJ_BURGER)) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
+		int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+	} else if (_scene->_roomChanged)
+		_game._objects.addToInventory(OBJ_BURGER);
+
+	if (_scene->_roomChanged) {
+		_game._objects.addToInventory(OBJ_DEAD_FISH);
+		_game._objects.addToInventory(OBJ_STUFFED_FISH);
+	}
+
+	_vm->_palette->setEntry(252, 50, 50, 63);
+	_vm->_palette->setEntry(253, 30, 30, 50);
+
+	_game.loadQuoteSet(0x53, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0);
+	_eatingFirstFish = (!_game._visitedScenes._sceneRevisited) && (_scene->_priorSceneId < 110);
+
+	if (_eatingFirstFish) {
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(Resources::formatName(105, 'F', 1, EXT_SS, ""));
+		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('H', 1));
+
+		_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], true, 4, 0, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 5);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(126, 39));
+		_scene->_sequences.setMotion(_globals._sequenceIndexes[10], 0, 200, 0);
+		_scene->_sequences.setScale(_globals._sequenceIndexes[10], 80);
+		_game._player._stepEnabled = false;
+	}
+
+	sceneEntrySound();
+}
+
+void Room109::step() {
+	if (_beforeEatingRex) {
+		if (!_eatingRex) {
+			if (_game._player._playerPos.x > 205) {
+				_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 6, 70);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+
+				_eatingRex = true;
+				_vm->_sound->command(34);
+			}
+		} else {
+			switch (_game._trigger) {
+			case 70:
+				_game._player._visible = false;
+				break;
+
+			case 71:
+				_scene->_reloadSceneFlag = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+	}
+
+	if (_hungryFl && (_game._player._playerPos == Common::Point(160, 32)) && (_game._player._facing == FACING_EAST)) {
+		_game._player.walk(Common::Point(226, 24), FACING_EAST);
+		_game._player._stepEnabled = false;
+		_hungryFl = false;
+		_beforeEatingRex = true;
+		_scene->_sprites.remove(_globals._spriteIndexes[6]);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('H', 0));
+		_vm->_palette->refreshSceneColors();
+	}
+
+	if (_game._player._moving && (_scene->_rails.getNext() > 0) && _globals[kHoovicAlive] && !_globals[kHoovicSated] && !_hungryFl && !_beforeEatingRex) {
+		_game._player.cancelCommand();
+		_game._player.startWalking(Common::Point(160, 32), FACING_EAST);
+		_scene->_rails.resetNext();
+		_hungryFl = true;
+	}
+
+	if (_eatingFirstFish && (_scene->_sequences[_globals._sequenceIndexes[10]]._position.x >= 178)) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 4, 1, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 4);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 29, 72);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 29, 73);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[10], _globals._sequenceIndexes[9]);
+		_eatingFirstFish = false;
+		_game._player._stepEnabled = true;
+		_vm->_sound->command(34);
+	}
+
+	if (_game._trigger == 72)
+		_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+
+	if (_game._trigger == 73) {
+		_scene->_sequences.remove(_globals._sequenceIndexes[9]);
+		_scene->_sprites.remove(_globals._spriteIndexes[9]);
+		_scene->_sprites.remove(_globals._spriteIndexes[10]);
+
+		_scene->_spriteSlots.clear();
+		_scene->_spriteSlots.fullRefresh();
+
+		int randVal = _vm->getRandomNumber(85, 88);
+		int idx = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+		_scene->_kernelMessages.setQuoted(idx, 4, true);
+		_scene->_kernelMessages._entries[idx]._frameTimer = _scene->_frameStartTime + 4;
+	}
+}
+
+void Room109::preActions() {
+	if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_WEST))
+		_game._player._walkOffScreenSceneId = 108;
+
+	if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE) || _action.isAction(VERB_PUT))
+		&& (_action.isTarget(NOUN_SMALL_HOLE) || _action.isTarget(NOUN_TUNNEL))
+		&& (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER))) {
+		int idx = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+		if ((idx >= 0) && _game._objects.isInInventory(idx)) {
+			_game._player._prepareWalkPos = Common::Point(106, 38);
+			_game._player._prepareWalkFacing = FACING_EAST;
+			_game._player._needToWalk = true;
+			_game._player._readyToWalk = true;
+		}
+	}
+
+	if ((_action.isAction(VERB_SWIM_INTO, NOUN_TUNNEL) || _action.isAction(VERB_SWIM_TO, NOUN_SMALL_HOLE))
+		&& (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (_action.isObject(NOUN_TUNNEL)))
+		_game._player._walkOffScreenSceneId = 110;
+
+	_hungryFl = false;
+}
+
+void Room109::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10912);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE)) && (_action.isTarget(NOUN_SMALL_HOLE) || _action.isTarget(NOUN_TUNNEL))) {
+		if (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER)) {
+			_throwingObjectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+			if (_throwingObjectId >= 0) {
+				if ((_game._objects.isInInventory(_throwingObjectId) && _globals[kHoovicAlive]) || _rexThrowingObject) {
+					switch (_game._trigger) {
+					case 0:
+						_rexThrowingObject = true;
+						_hoovicDifficultFl = false;
+						_game._objects.setRoom(_throwingObjectId, NOWHERE);
+						_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1, 0, 0);
+						_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[0]);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+						_game._player._visible = false;
+						_game._player._stepEnabled = false;
+
+						switch (_throwingObjectId) {
+						case OBJ_DEAD_FISH:
+						case OBJ_STUFFED_FISH:
+							_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', 1));
+							break;
+
+						case OBJ_BURGER:
+							_hoovicDifficultFl = (_game._difficulty == DIFFICULTY_HARD);
+							_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', (_hoovicDifficultFl ? 3 : 1)));
+							break;
+
+						default:
+							break;
+						}
+
+						_vm->_palette->refreshSceneColors();
+						break;
+
+					case 1:
+						_game._player._visible = true;
+						_hoovicTrigger = 4;
+						switch (_throwingObjectId) {
+						case OBJ_BURGER:
+							_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, (_hoovicDifficultFl ? 4 : 6), 1, 0, 0);
+							_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 2, 2);
+							if (_hoovicDifficultFl) {
+								_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 30);
+								_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+							} else {
+								_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+								_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+								_hoovicTrigger = 3;
+							}
+							break;
+						case OBJ_DEAD_FISH:
+							_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1, 0, 0);
+							_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 2);
+							break;
+						case OBJ_STUFFED_FISH:
+							_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
+							_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 2);
+							_hoovicTrigger = 3;
+							break;
+						default:
+							break;
+						}
+						break;
+
+					case 2:
+						if (_hoovicDifficultFl)
+							_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 4, 2, 0, 0);
+						else
+							_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 4, 1, 0, 0);
+
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 4);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, _hoovicTrigger);
+						_vm->_sound->command(34);
+						break;
+
+					case 3:
+						_scene->loadAnimation(Resources::formatName(109, 'H', 2, EXT_AA, ""), 4);
+						_vm->_sound->command(35);
+						_globals[kHoovicAlive] = false;
+						break;
+
+					case 4:
+						if (!_globals[kHoovicAlive]) {
+							_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+							_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
+							_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
+							int idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(256, 57, 256 + 12, 57 + 31));
+							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+							idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(242, 79, 242 + 24, 79 + 12));
+							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+							idx = _scene->_dynamicHotspots.add(229, 348, -1, Common::Rect(231, 88, 231 + 23, 88 + 7));
+							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+							_scene->changeVariant(1);
+						} else {
+							if (_throwingObjectId == OBJ_DEAD_FISH) {
+								++_globals[kHoovicFishEaten];
+								int threshold;
+								switch (_game._difficulty) {
+								case DIFFICULTY_HARD:
+									threshold = 1;
+									break;
+								case DIFFICULTY_MEDIUM:
+									threshold = 3;
+									break;
+								default:
+									threshold = 50;
+									break;
+								}
+
+								if (_globals[kHoovicFishEaten] >= threshold) {
+									int randVal = _vm->getRandomNumber(83, 84);
+									_scene->_kernelMessages.add(Common::Point(230, 24), 0xFDFC, 0, 0, 120, _game.getQuote(randVal));
+									_globals[kHoovicFishEaten] = 0;
+									_globals[kHoovicSated] = 1;
+									_scene->changeVariant(1);
+								}
+							}
+						}
+						_scene->freeAnimation();
+						_scene->_sequences.remove(_globals._sequenceIndexes[8]);
+						_scene->_sprites.remove(_globals._spriteIndexes[8]);
+						_scene->_spriteSlots.clear();
+						_scene->_spriteSlots.fullRefresh();
+						_scene->_sequences.scan();
+						if (_game._player._visible) {
+							_game._player._forceRefresh = true;
+							_game._player.update();
+						}
+
+						_game._player._stepEnabled = true;
+						_rexThrowingObject = false;
+						break;
+
+					case 5:
+					{
+						_game._objects.setRoom(OBJ_BURGER, _scene->_currentSceneId);
+						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 30, 30);
+						int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+						_scene->_sequences.addTimer(65, 6);
+					}
+					break;
+
+					case 6:
+					{
+						_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 46);
+						int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 7);
+					}
+					break;
+
+					case 7:
+					{
+						_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+						_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+						int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+						_vm->_dialogs->show(10915);
+					}
+					break;
+
+					case 8:
+						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 16);
+						break;
+
+					default:
+						break;
+					}
+					_action._inProgress = false;
+					return;
+				} else if (_game._objects.isInInventory(_throwingObjectId)) {
+					// Nothing.
+				}
+			}
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BURGER) && _game._objects.isInRoom(OBJ_BURGER)) {
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_game._objects.addToInventory(OBJ_BURGER);
+	} else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+		_vm->_dialogs->show(10901);
+	else if (_action.isAction(VERB_LOOK, NOUN_CORAL))
+		_vm->_dialogs->show(10902);
+	else if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_CORAL))
+		_vm->_dialogs->show(10903);
+	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+		_vm->_dialogs->show(10904);
+	else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+		_vm->_dialogs->show(10905);
+	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_WALL))
+		_vm->_dialogs->show(10906);
+	else if (_action.isAction(VERB_LOOK, NOUN_TUNNEL)) {
+		if (_globals[kHoovicAlive])
+			_vm->_dialogs->show(10907);
+		else
+			_vm->_dialogs->show(10913);
+	} else if (_action.isAction(VERB_LOOK, NOUN_SMALL_HOLE))
+		_vm->_dialogs->show(10908);
+	else if (_action.isAction(VERB_LOOK, NOUN_OVERHANG_TO_WEST))
+		_vm->_dialogs->show(10911);
+	else if (_action.isAction(VERB_PUT, NOUN_SMALL_HOLE))
+		_vm->_dialogs->show(10910);
+	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_PURPLE_MONSTER))
+		_vm->_dialogs->show(10914);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room110.cpp b/engines/mads/madsv2/nebular/rooms/room110.cpp
new file mode 100644
index 00000000000..354d31c05e2
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room110.cpp
@@ -0,0 +1,165 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room110::Room110(RexNebularEngine *vm) : Room1xx(vm) {
+	_crabsFl = false;
+}
+
+void Room110::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_crabsFl);
+}
+
+void Room110::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_CRAB);
+}
+
+void Room110::enter() {
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 3));
+
+	_crabsFl = false;
+
+	if (_scene->_priorSceneId == 109) {
+		_game._player._playerPos = Common::Point(59, 71);
+
+		_globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+
+		_crabsFl = true;
+
+		int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(194, 23);
+		_game._player._facing = FACING_SOUTH;
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_scene->loadAnimation(Resources::formatName(110, 'T', 1, EXT_AA, ""), 70);
+	}
+
+	sceneEntrySound();
+	_game.loadQuoteSet(0x59, 0);
+
+	if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId == 109))
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(109));
+}
+
+void Room110::step() {
+	if (_game._trigger == 70) {
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+	}
+}
+
+void Room110::preActions() {
+	if (_action.isAction(VERB_SWIM_THROUGH, NOUN_CAVE_ENTRANCE))
+		_game._player._walkOffScreenSceneId = 109;
+
+	if (_crabsFl) {
+		_crabsFl = false;
+
+		_scene->_sequences.remove(_globals._sequenceIndexes[0]);
+		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+		_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+
+		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 16, 1, 0, 0);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 16, 1, 0, 0);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 16, 1, 0, 0);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 16, 1, 0, 0);
+
+		int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+	}
+}
+
+void Room110::actions() {
+	if (_action.isAction(VERB_SWIM_THROUGH, NOUN_TUNNEL)) {
+		switch (_game._trigger) {
+		case 0:
+			_scene->loadAnimation(Resources::formatName(110, 'T', 0, EXT_AA, ""), 1);
+			_scene->_animation[0]->setNextFrameTimer(_game._player._ticksAmount + _game._player._priorTimer);
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			break;
+		case 1:
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			_scene->_nextSceneId = 111;
+			break;
+		default:
+			break;
+		}
+	} else if ((_action._lookFlag) || _action.isAction(VERB_LOOK, NOUN_CAVE))
+		_vm->_dialogs->show(11001);
+	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_CEILING) || _action.isAction(VERB_LOOK_AT, NOUN_CAVE_CEILING))
+		_vm->_dialogs->show(11002);
+	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+		_vm->_dialogs->show(11003);
+	else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+		_vm->_dialogs->show(11004);
+	else if (_action.isAction(VERB_LOOK, NOUN_TUNNEL))
+		_vm->_dialogs->show(11005);
+	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+		_vm->_dialogs->show(11006);
+	else if (_action.isAction(VERB_LOOK, NOUN_FUNGOIDS))
+		_vm->_dialogs->show(11007);
+	else if (_action.isAction(VERB_TAKE, NOUN_FUNGOIDS))
+		_vm->_dialogs->show(11008);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room111.cpp b/engines/mads/madsv2/nebular/rooms/room111.cpp
new file mode 100644
index 00000000000..13b1fe0a36e
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room111.cpp
@@ -0,0 +1,192 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Room111::Room111(RexNebularEngine *vm) : Room1xx(vm) {
+	_stampedFl = false;
+	_launch1Fl = false;
+	_launched2Fl = false;
+	_rexDivingFl = false;
+}
+
+void Room111::synchronize(Common::Serializer &s) {
+	Room1xx::synchronize(s);
+
+	s.syncAsByte(_stampedFl);
+	s.syncAsByte(_launch1Fl);
+	s.syncAsByte(_launched2Fl);
+	s.syncAsByte(_rexDivingFl);
+}
+
+void Room111::setup() {
+	_scene->addActiveVocab(NOUN_BATS);
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room111::enter() {
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('B', 0));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('B', 1));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('B', 2));
+
+	_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 0, 0, 0);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 9, 73);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 13, 73);
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 0, 0);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 71, 71);
+
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 0, 0, 0);
+	_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+	_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+
+	int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+	idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+	idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+
+	_launch1Fl = false;
+	_launched2Fl = false;
+	_stampedFl = false;
+
+	if ((_scene->_priorSceneId < 201) && (_scene->_priorSceneId != RETURNING_FROM_DIALOG)) {
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_scene->loadAnimation(Resources::formatName(111, 'A', 0, EXT_AA, ""), 70);
+		_game._player._playerPos = Common::Point(234, 116);
+		_game._player._facing = FACING_EAST;
+
+		_launch1Fl = true;
+		_launched2Fl = true;
+
+		_vm->_sound->command(36);
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(300, 130);
+		_game._player._facing = FACING_WEST;
+	}
+
+	_rexDivingFl = false;
+
+	sceneEntrySound();
+}
+
+void Room111::step() {
+	if (_game._trigger == 70) {
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_launch1Fl = false;
+		_launched2Fl = false;
+	}
+
+	if ((_game._trigger == 71) && !_stampedFl) {
+		_stampedFl = true;
+		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 18, 1, 0, 0);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+	}
+
+	if (_game._trigger == 72) {
+		_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 20);
+	}
+
+	if (!_launch1Fl && (_vm->getRandomNumber(1, 5000) == 1)) {
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
+		_launch1Fl = true;
+		int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+	}
+
+	if (!_launched2Fl && (_vm->getRandomNumber(1, 30000) == 1)) {
+		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 0, 0);
+		int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+		_launched2Fl = true;
+	}
+
+	if (_game._trigger == 73)
+		_vm->_sound->command(37);
+
+	if (_rexDivingFl && (_scene->_animation[0]->getCurrentFrame() >= 9)) {
+		_vm->_sound->command(36);
+		_rexDivingFl = false;
+	}
+}
+
+void Room111::preActions() {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
+		_game._player._walkOffScreenSceneId = 212;
+}
+
+void Room111::actions() {
+	if (_action.isAction(VERB_DIVE_INTO, NOUN_POOL) && _game._objects.isInInventory(OBJ_REBREATHER)) {
+		switch (_game._trigger) {
+		case 0:
+			_scene->loadAnimation(Resources::formatName(111, 'A', 1, EXT_AA, ""), 1);
+			_rexDivingFl = true;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			break;
+
+		case 1:
+			_scene->_nextSceneId = 110;
+			break;
+
+		default:
+			break;
+		}
+	} else if (_action.isAction(VERB_LOOK, NOUN_CAVE_FLOOR))
+		_vm->_dialogs->show(11101);
+	else if (_action.isAction(VERB_LOOK, NOUN_POOL))
+		_vm->_dialogs->show(11102);
+	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+		_vm->_dialogs->show(11103);
+	else if (_action.isAction(VERB_LOOK, NOUN_STALAGMITES))
+		_vm->_dialogs->show(11104);
+	else if (_action.isAction(VERB_LOOK, NOUN_LARGE_STALAGMITE))
+		_vm->_dialogs->show(11105);
+	else if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE)) && (_action.isObject(NOUN_STALAGMITES) || _action.isObject(NOUN_LARGE_STALAGMITE)))
+		_vm->_dialogs->show(11106);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room112.cpp b/engines/mads/madsv2/nebular/rooms/room112.cpp
new file mode 100644
index 00000000000..358c475467f
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room112.cpp
@@ -0,0 +1,80 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room102.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+void Room112::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Room112::enter() {
+	sceneEntrySound();
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 5));
+
+	_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 10, 0, 17, 20);
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 0, 0, 0);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 3, 0);
+
+	_game._player._stepEnabled = false;
+	_game._player._visible = false;
+
+	_scene->_userInterface.emptyConversationList();
+	_scene->_userInterface.setup(kInputConversation);
+
+	_scene->loadAnimation(Resources::formatName(112, 'X', -1, EXT_AA, ""), 70);
+}
+
+void Room112::step() {
+	if ((_scene->_animation[0] != nullptr) && (_game._storyMode == STORYMODE_NICE)) {
+		if (_scene->_animation[0]->getCurrentFrame() >= 54) {
+			_scene->freeAnimation();
+			_game._trigger = 70;
+		}
+	}
+
+	if (_game._trigger == 70) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 3, 0, 11);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+	}
+
+	if (_game._trigger == 71) {
+		_scene->_nextSceneId = 101;
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+	}
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room201.cpp b/engines/mads/madsv2/nebular/rooms/room201.cpp
new file mode 100644
index 00000000000..df91f04f7f2
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room201.cpp
@@ -0,0 +1,252 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene201::Scene201(RexNebularEngine *vm) : Scene2xx(vm) {
+	_pterodactylFlag = false;
+}
+
+void Scene201::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_pterodactylFlag);
+}
+
+void Scene201::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_SWOOPING_CREATURE);
+	_scene->addActiveVocab(NOUN_BIRDS);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene201::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', -1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*SC002Z1");
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 1, 0);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 50);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 4, 0, 0, 0);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
+	_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(185, 46));
+
+	int idx = _scene->_dynamicHotspots.add(NOUN_BIRDS, 209, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 81), FACING_NORTH);
+
+	if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId == RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(165, 152);
+	} else {
+		_game._player._playerPos = Common::Point(223, 149);
+		_game._player._facing = FACING_SOUTH;
+	}
+
+	if (_globals[kTeleporterCommand]) {
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		int sepChar = (_globals[kSexOfRex] == SEX_MALE) ? 't' : 'u';
+		// Guess values. What is the default value used by the compiler?
+		int suffixNum = -1;
+		int endTrigger = -1;
+		switch (_globals[kTeleporterCommand]) {
+		case 1:
+			suffixNum = 3;
+			endTrigger = 76;
+			_globals[kTeleporterUnderstood] = true;
+			break;
+		case 2:
+			suffixNum = 1;
+			endTrigger = 77;
+			break;
+		case 3:
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			suffixNum = -1;
+			break;
+		case 4:
+			suffixNum = 2;
+			endTrigger = 78;
+			break;
+		default:
+			break;
+		}
+		_globals[kTeleporterCommand] = 0;
+		if (suffixNum >= 0)
+			_scene->loadAnimation(formAnimName(sepChar, suffixNum), endTrigger);
+	}
+
+	if ((_scene->_priorSceneId == 202) && (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT) && !_scene->_roomChanged) {
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0));
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1));
+		_game.loadQuoteSet(90, 91, 0);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, 12);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 12, 70);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+		_pterodactylFlag = false;
+		_game._player.walk(Common::Point(157, 143), FACING_NORTH);
+		_vm->_palette->setEntry(252, 45, 63, 45);
+		_vm->_palette->setEntry(253, 20, 45, 20);
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 2, 0, 120, _game.getQuote(90));
+	} else
+		_pterodactylFlag = true;
+
+	if (_globals[kTeleporterUnderstood])
+		_scene->_hotspots.activate(NOUN_STRANGE_DEVICE, false);
+
+	sceneEntrySound();
+}
+
+void Scene201::step() {
+	if (_pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 6, 0);
+		int idx = _scene->_dynamicHotspots.add(351, 13, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(270, 80), FACING_EAST);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
+		_vm->_sound->command(14);
+		_pterodactylFlag = false;
+	}
+
+	if (_game._trigger == 70) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0);
+		_game._player._visible = false;
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 12, 16);
+		_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 1, 0, 0);
+		_vm->_sound->command(42);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 3, 81);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+	}
+
+	if (_game._trigger == 81) {
+		_scene->_kernelMessages.reset();
+	}
+
+	if (_game._trigger == 71) {
+		_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+	}
+
+	if (_game._trigger == 73) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 17, -2);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+	}
+
+	if (_game._trigger == 74) {
+		_vm->_sound->command(40);
+
+		_scene->_kernelMessages.add(Common::Point(125, 56), 0xFDFC, 32, 82, 180, _game.getQuote(91));
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 0, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
+		_scene->_sequences.addTimer(180, 75);
+	}
+
+	if (_game._trigger == 75) {
+		_globals[kMeteorologistEverSeen] = 0;
+		_scene->_nextSceneId = 202;
+	}
+
+	if (_game._trigger == 76) {
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+	}
+
+	if (_game._trigger == 77) {
+		_globals[kTeleporterCommand] = 1;
+		_scene->_nextSceneId = _globals[kTeleporterDestination];
+		_scene->_reloadSceneFlag = true;
+	}
+
+	if (_game._trigger == 78) {
+		_vm->_sound->command(40);
+		_vm->_dialogs->show(20114);
+		_scene->_reloadSceneFlag = true;
+	}
+}
+
+void Scene201::actions() {
+	if (_action._lookFlag == false) {
+		if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
+			_scene->_nextSceneId = 202;
+		else if (_action.isAction(VERB_CLIMB_UP, NOUN_STEPS) || (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) || (_action.isAction(VERB_WALK_INSIDE, NOUN_STRANGE_DEVICE))) {
+			if (_game._trigger == 0) {
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				int sepChar = (_globals[kSexOfRex] == SEX_MALE) ? 't' : 'u';
+				_scene->loadAnimation(formAnimName(sepChar, 0), 1);
+			} else if (_game._trigger == 1) {
+				_scene->_nextSceneId = 213;
+			}
+		} else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+			_vm->_dialogs->show(20101);
+		} else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) {
+			_vm->_dialogs->show(20102);
+		} else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH)) {
+			_vm->_dialogs->show(20103);
+		} else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+			_vm->_dialogs->show(20104);
+		} else if (_action.isAction(VERB_LOOK, NOUN_WATER)) {
+			_vm->_dialogs->show(20105);
+		} else if (_action.isAction(VERB_LOOK, NOUN_ISLAND_IN_DISTANCE)) {
+			_vm->_dialogs->show(20106);
+		} else if (_action.isAction(VERB_LOOK, NOUN_WEATHER_STATION)) {
+			_vm->_dialogs->show(20107);
+		} else if (_action.isAction(VERB_LOOK, NOUN_PATH)) {
+			_vm->_dialogs->show(20108);
+		} else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_SOUTH)) {
+			_vm->_dialogs->show(20110);
+		} else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+			if (_globals[kMeteorologistEverSeen])
+				_vm->_dialogs->show(20112);
+			else
+				_vm->_dialogs->show(20109);
+		} else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) {
+			_vm->_dialogs->show(20113);
+		} else
+			return;
+	} else {
+		_vm->_dialogs->show(20111);
+	}
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
new file mode 100644
index 00000000000..2eb5d668a2b
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -0,0 +1,719 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene202::Scene202(RexNebularEngine *vm) : Scene2xx(vm) {
+	_activeMsgFl = false;
+	_ladderTopFl = false;
+	_waitingMeteoFl = false;
+	_ladderHotspotId = -1;
+	_meteoClock1 = 0;
+	_meteoClock2 = 0;
+	_toStationFl = false;
+	_toTeleportFl = false;
+	_lastRoute = 0;
+	_stationCounter = 0;
+	_meteoFrame = 0;
+	_startTime = 0;
+	_meteorologistSpecial = false;
+}
+
+void Scene202::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_activeMsgFl);
+	s.syncAsByte(_ladderTopFl);
+	s.syncAsByte(_waitingMeteoFl);
+	s.syncAsByte(_toStationFl);
+	s.syncAsByte(_toTeleportFl);
+
+	s.syncAsSint32LE(_ladderHotspotId);
+	s.syncAsSint32LE(_lastRoute);
+	s.syncAsSint32LE(_stationCounter);
+	s.syncAsSint32LE(_meteoFrame);
+
+	s.syncAsUint32LE(_meteoClock1);
+	s.syncAsUint32LE(_meteoClock2);
+	s.syncAsUint32LE(_startTime);
+
+	s.syncAsByte(_meteorologistSpecial);
+}
+
+void Scene202::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_LADDER);
+	_scene->addActiveVocab(VERB_CLIMB_DOWN);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_BONE);
+	_scene->addActiveVocab(NOUN_SKULL);
+	_scene->addActiveVocab(NOUN_BROKEN_LADDER);
+}
+
+void Scene202::enter() {
+	_game._player._beenVisible = true;
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('l', -1));
+	if (_globals[kSexOfRex] != SEX_MALE) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*ROXBD_2");
+	} else {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*RXMBD_2");
+	}
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2));
+
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
+	_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(149, 113));
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+	int idx = _scene->_dynamicHotspots.add(NOUN_SKULL, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(153, 97), FACING_SOUTH);
+
+	if (!(_globals[kBone202Status] & 1)) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(130, 108));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+		idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(132, 97), FACING_SOUTH);
+	}
+
+	if (!(_globals[kBone202Status] & 2)) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 0, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(166, 110));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
+		idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(165, 99), FACING_SOUTH);
+	}
+
+	if (_globals[kBone202Status])
+		_scene->changeVariant(_globals[kBone202Status]);
+
+	if (_scene->_priorSceneId == 201) {
+		_game._player._playerPos = Common::Point(190, 91);
+		_game._player._facing = FACING_SOUTH;
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(178, 152);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	if (_globals[kLadderBroken]) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
+		_scene->_hotspots.activate(NOUN_LADDER, false);
+		idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH);
+	}
+
+	_game.loadQuoteSet(0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x61, 0);
+	_activeMsgFl = false;
+
+	if (_scene->_priorSceneId == RETURNING_FROM_DIALOG) {
+		if (_waitingMeteoFl) {
+			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+			_game._player._visible = false;
+		}
+	} else {
+		_waitingMeteoFl = false;
+		_ladderTopFl = false;
+	}
+
+	_meteoClock1 = _meteoClock2 = _scene->_frameStartTime;
+
+	if (_scene->_roomChanged)
+		_game._objects.addToInventory(OBJ_BINOCULARS);
+
+	if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) {
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_ladderTopFl = (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER);
+
+		if (_ladderTopFl) {
+			_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 8);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82));
+			_game._player._playerPos = Common::Point(246, 124);
+			_game._player._facing = FACING_NORTH;
+			_globals[kTeleporterUnderstood] = true;
+		} else {
+			_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+			_game._player._playerPos = Common::Point(171, 122);
+			_game._player._facing = FACING_NORTH;
+		}
+
+		_scene->loadAnimation(formAnimName('M', -1), 71);
+		_scene->_animation[0]->setCurrentFrame(200);
+	} else {
+		if (_ladderTopFl) {
+			_game._player._visible = false;
+			_scene->_sequences.startCycle(_globals._sequenceIndexes[9], true, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+			_game._player._playerPos = Common::Point(246, 124);
+			_game._player._facing = FACING_NORTH;
+		}
+	}
+
+	_meteorologistSpecial = false;
+}
+
+void Scene202::setRandomKernelMessage() {
+	int vocabId = _vm->getRandomNumber(92, 96);
+	_scene->_kernelMessages.reset();
+	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+	_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 70, 120, _game.getQuote(vocabId));
+	_activeMsgFl = true;
+}
+
+void Scene202::step() {
+	if (!_activeMsgFl && (_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH) && (_vm->getRandomNumber(999) == 0)) {
+		_scene->_kernelMessages.reset();
+		_activeMsgFl = false;
+		if (_vm->getRandomNumber(4) == 0)
+			setRandomKernelMessage();
+	}
+
+	if (_game._trigger == 70)
+		_activeMsgFl = false;
+
+	if (_game._trigger == 71) {
+		_vm->_sound->command(3);
+		_vm->_sound->command(9);
+
+		_meteoClock1 = _scene->_frameStartTime + 15 * 60;
+
+		if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) {
+			Common::Point msgPos;
+			int msgFlag;
+			if (!_ladderTopFl) {
+				msgPos = Common::Point(0, 0);
+				msgFlag = 2;
+			} else {
+				msgPos = Common::Point(248, 15);
+				msgFlag = 0;
+			}
+			int msgIndex = _scene->_kernelMessages.add(msgPos, 0x1110, msgFlag | 32, 0, 120, _game.getQuote(102));
+			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+
+			if (_globals[kMeteorologistWatch] == METEOROLOGIST_GROUND) {
+				_action._activeAction._verbId = VERB_LOOK;
+				_action._activeAction._objectNameId = NOUN_BINOCULARS;
+				_action._activeAction._indirectObjectId = NOUN_STRANGE_DEVICE;
+				_game._triggerSetupMode = SEQUENCE_TRIGGER_PARSER;
+				_scene->_sequences.addTimer(2 * 60, 2);
+				_meteorologistSpecial = true;
+			} else if (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) {
+				_scene->_sequences.addTimer(2 * 60, 90);
+			}
+		}
+
+		_globals[kMeteorologistWatch] = METEOROLOGIST_NORMAL;
+	}
+
+	switch (_game._trigger) {
+	case 90:
+		_vm->_sound->command(41);
+		_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
+		break;
+	case 91:
+		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+		_scene->_sequences.addTimer(60, 92);
+		break;
+	case 92:
+	{
+		_scene->_sequences.remove(_globals._sequenceIndexes[9]);
+		_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 1);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 93);
+		_scene->_kernelMessages.reset();
+		int msgIndex = _scene->_kernelMessages.add(Common::Point(0, -65), 0x1110, 32, 0, 60, _game.getQuote(98));
+		_scene->_kernelMessages.setSeqIndex(msgIndex, _globals._sequenceIndexes[11]);
+	}
+	break;
+	case 93:
+	{
+		_globals[kLadderBroken] = false;
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
+		_scene->_hotspots.activate(NOUN_LADDER, false);
+		int idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[11], _globals._sequenceIndexes[5]);
+		_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[11]);
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_ladderTopFl = false;
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(99));
+	}
+	break;
+	default:
+		break;
+	}
+
+	if (!_scene->_animation[0] && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) {
+		int randVal = _vm->getRandomNumber(1, 500);
+		int threshold = 1;
+		if (_ladderTopFl)
+			threshold += 25;
+		if (!_globals[kMeteorologistEverSeen])
+			threshold += 25;
+		if (threshold >= randVal) {
+			_vm->_sound->command(17);
+			_scene->loadAnimation(formAnimName('M', -1), 71);
+			_toStationFl = true;
+			_toTeleportFl = false;
+			_globals[kMeteorologistEverSeen] = true;
+			_lastRoute = 0;
+			_stationCounter = 0;
+			_meteoClock2 = _scene->_frameStartTime + 2;
+		}
+	}
+
+	if (!_scene->_animation[0])
+		return;
+
+	if (_waitingMeteoFl) {
+		if (_scene->_animation[0]->getCurrentFrame() >= 200) {
+			if ((_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) || _globals[kLadderBroken]) {
+				_scene->_nextSceneId = 213;
+			} else {
+				_vm->_dialogs->show(20201);
+				_scene->_reloadSceneFlag = true;
+			}
+		}
+
+		if ((_scene->_animation[0]->getCurrentFrame() == 160) && (_meteoFrame != _scene->_animation[0]->getCurrentFrame())) {
+			Common::Point msgPos;
+			int msgFlag;
+			if (!_ladderTopFl) {
+				msgPos = Common::Point(0, 0);
+				msgFlag = 2;
+			} else {
+				msgPos = Common::Point(248, 15);
+				msgFlag = 0;
+			}
+			int msgIndex = _scene->_kernelMessages.add(msgPos, 0x1110, msgFlag | 32, 0, 120, _game.getQuote(101));
+			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+		}
+	}
+
+	if (_meteoClock2 + 120 * 60 <= _scene->_frameStartTime) {
+		_toTeleportFl = true;
+	}
+
+	if (_scene->_animation[0]->getCurrentFrame() == _meteoFrame) {
+		return;
+	}
+
+	_meteoFrame = _scene->_animation[0]->getCurrentFrame();
+	int randVal = _vm->getRandomNumber(1, 1000);
+	int frameStep = -1;
+
+	switch (_scene->_animation[0]->getCurrentFrame()) {
+	case 42:
+	case 77:
+	case 96:
+		_stationCounter = 0;
+		frameStep = subStep1(randVal);
+		break;
+	case 51:
+	case 74:
+		_toStationFl = false;
+		frameStep = subStep2(randVal);
+		break;
+	case 27:
+	case 119:
+	case 159:
+		frameStep = subStep3(randVal);
+		break;
+	case 176:
+		frameStep = subStep4(randVal);
+		break;
+	case 59:
+		_lastRoute = 3;
+		++_stationCounter;
+		if (randVal <= 800)
+			frameStep = 55;
+		break;
+	case 89:
+		_lastRoute = 1;
+		if (randVal <= 700)
+			frameStep = 83;
+		break;
+	case 137:
+		_lastRoute = 2;
+		if (randVal <= 700)
+			frameStep = 126;
+		break;
+	default:
+		break;
+	}
+
+	if (frameStep >= 0 && frameStep != _scene->_animation[0]->getCurrentFrame() + 1) {
+		_scene->_animation[0]->setCurrentFrame(frameStep);
+		_meteoFrame = frameStep;
+	}
+}
+
+int Scene202::subStep1(int randVal) {
+	if ((randVal <= 100) || _toStationFl)
+		return 42;
+
+	if ((randVal <= 200) || _toTeleportFl)
+		return 96;
+
+	if ((randVal <= 300) && (_lastRoute != 1))
+		return 77;
+
+	return 76;
+}
+
+int Scene202::subStep2(int randVal) {
+	if ((randVal <= 150) && (_stationCounter < 5))
+		return 51;
+
+	if ((randVal <= 300) || _toTeleportFl)
+		return 74;
+
+	if (randVal <= 400)
+		return 64;
+
+	return 44;
+}
+
+int Scene202::subStep3(int randVal) {
+	if ((randVal <= 100) || _toStationFl)
+		return 27;
+
+	if ((randVal <= 200) || _toTeleportFl)
+		return 159;
+
+	if ((randVal <= 300) && (_lastRoute != 2))
+		return 119;
+
+	return 110;
+}
+
+int Scene202::subStep4(int randVal) {
+	if ((randVal <= 100) || _toTeleportFl)
+		return 176;
+
+	if (randVal <= 200)
+		return 19;
+
+	return 166;
+}
+
+void Scene202::preActions() {
+	Player &player = _vm->_game->_player;
+
+	if (player._needToWalk)
+		_scene->_kernelMessages.reset();
+
+	if (_ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || player._needToWalk)) {
+		if (_game._trigger == 0) {
+			_vm->_sound->command(29);
+			player._readyToWalk = false;
+			player._stepEnabled = false;
+			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
+			_globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+		} else if (_game._trigger == 1) {
+			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]);
+			_scene->_dynamicHotspots.remove(_ladderHotspotId);
+			player._visible = true;
+			player._readyToWalk = true;
+			player._stepEnabled = true;
+			_ladderTopFl = false;
+		}
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && (_action._activeAction._indirectObjectId > 0)) {
+		if (!player._readyToWalk || _ladderTopFl)
+			player._needToWalk = false;
+		else
+			player._needToWalk = true;
+
+		if (!_ladderTopFl)
+			player.walk(Common::Point(171, 122), FACING_NORTH);
+	}
+}
+
+void Scene202::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20219);
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER)) {
+		_action._inProgress = false;
+		return;
+	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+		_scene->_nextSceneId = 203;
+	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
+		if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) {
+			if (_scene->_animation[0])
+				_globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT;
+			else
+				_globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT;
+		}
+		_scene->_nextSceneId = 201;
+	} else if (_action.isAction(VERB_TAKE, NOUN_BONE) && (_action._savedFields._mainObjectSource == 4)) {
+		switch (_game._trigger) {
+		case 0:
+			if (_game._objects.isInInventory(OBJ_BONES)) {
+				_vm->_dialogs->show(20221);
+			} else {
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 3, 2, 0, 0);
+				_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[7]);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			}
+			break;
+		case 1:
+			if (_game._player._playerPos == Common::Point(132, 97)) {
+				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+				_globals[kBone202Status] |= BONE_202_LEFT_GONE;
+			} else {
+				_scene->_sequences.remove(_globals._sequenceIndexes[6]);
+				_globals[kBone202Status] |= BONE_202_RIGHT_GONE;
+			}
+			break;
+		case 2:
+			if (_game._objects.isInInventory(OBJ_BONE)) {
+				_game._objects.removeFromInventory(OBJ_BONE, NOWHERE);
+				_game._objects.addToInventory(OBJ_BONES);
+				_vm->_dialogs->showItem(OBJ_BONES, 20218);
+			} else {
+				_game._objects.addToInventory(OBJ_BONE);
+				_vm->_dialogs->showItem(OBJ_BONE, 20218);
+			}
+			_scene->changeVariant(_globals[kBone202Status]);
+			_game._player._stepEnabled = true;
+			_game._player._visible = true;
+			break;
+		default:
+			break;
+		}
+
+		_action._inProgress = false;
+	} else if (_action.isAction(VERB_CLIMB_UP, NOUN_LADDER) && !_globals[kLadderBroken]) {
+		switch (_game._trigger) {
+		case 0:
+			_vm->_sound->command(29);
+			_meteoClock1 = _scene->_frameStartTime;
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+
+			_ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, 78, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
+			_scene->_dynamicHotspots.setPosition(_ladderHotspotId, Common::Point(246, 124), FACING_NORTH);
+			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			break;
+		case 1:
+		{
+			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], _globals._sequenceIndexes[9]);
+			_ladderTopFl = true;
+			_game._player._stepEnabled = true;
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(97));
+			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+		}
+		break;
+		default:
+			_action._inProgress = false;
+			return;
+		}
+	} else if ((_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_FIELD_TO_NORTH) || (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_STRANGE_DEVICE))) && (_globals[kSexOfRex] == SEX_MALE)) {
+		if (!_ladderTopFl) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+				_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[10]);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				break;
+			case 1:
+				_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+				if (_scene->_animation[0]) {
+					_waitingMeteoFl = true;
+					_globals[kMeteorologistWatch] = METEOROLOGIST_GROUND;
+				} else {
+					_scene->_sequences.addTimer(120, 2);
+				}
+				break;
+			case 2:
+				if (!_scene->_animation[0] && !_meteorologistSpecial) {
+					_vm->_dialogs->show(20222);
+				}
+				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+				_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+				break;
+			case 3:
+				_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[10]);
+				_game._player._stepEnabled = true;
+				_game._player._visible = true;
+				break;
+			default:
+				_action._inProgress = false;
+				return;
+			}
+		} else {
+			switch (_game._trigger) {
+			case 0:
+				_toTeleportFl = true;
+				_game._player._stepEnabled = false;
+				_scene->_sequences.remove(_globals._sequenceIndexes[9]);
+				_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				break;
+			case 1:
+				_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, -2);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+				if (_scene->_animation[0]) {
+					if (_scene->_animation[0]->getCurrentFrame() > 200) {
+						_scene->_sequences.addTimer(120, 2);
+					} else {
+						_waitingMeteoFl = true;
+						_globals[kMeteorologistWatch] = METEOROLOGIST_GONE;
+						if ((_scene->_animation[0]->getCurrentFrame() >= 44) && (_scene->_animation[0]->getCurrentFrame() <= 75)) {
+							_scene->_kernelMessages.reset();
+							int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(100));
+							_scene->_kernelMessages.setQuoted(msgIndex, 4, false);
+						} else {
+							_action._inProgress = false;
+							return;
+						}
+					}
+				} else {
+					_scene->_sequences.addTimer(120, 2);
+				}
+				break;
+			case 2:
+				if (!_scene->_animation[0])
+					_vm->_dialogs->show(20222);
+				_meteorologistSpecial = false;
+				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
+				_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+				break;
+			case 3:
+				_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+				_game._player._stepEnabled = true;
+				break;
+			default:
+				_action._inProgress = false;
+				return;
+			}
+		}
+	} else if (_action.isAction(VERB_WALK_INSIDE, NOUN_HUT)) {
+		setRandomKernelMessage();
+	} else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) {
+		_vm->_dialogs->show(20202);
+	} else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT)) {
+		_vm->_dialogs->show(20203);
+	} else if (_action.isAction(VERB_LOOK, NOUN_GRASS)) {
+		_vm->_dialogs->show(20204);
+	} else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) {
+		if ((_globals[kMeteorologistStatus] == METEOROLOGIST_ABSENT) || (_globals[kMeteorologistStatus] == METEOROLOGIST_GONE))
+			_vm->_dialogs->show(20205);
+		else if (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT)
+			_vm->_dialogs->show(20220);
+	} else if (_action.isAction(VERB_LOOK, NOUN_WATCH_TOWER)) {
+		_vm->_dialogs->show(20206);
+	} else if (_action.isAction(VERB_LOOK, NOUN_TALL_GRASS)) {
+		_vm->_dialogs->show(20207);
+	} else if (_action.isAction(VERB_LOOK, NOUN_TREES)) {
+		_vm->_dialogs->show(20208);
+	} else if (_action.isAction(VERB_LOOK, NOUN_TREE)) {
+		_vm->_dialogs->show(20209);
+	} else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+		_vm->_dialogs->show(20210);
+	} else if (_action.isAction(VERB_LOOK, NOUN_HUT)) {
+		if ((_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH))
+			_vm->_dialogs->show(20212);
+		else
+			_vm->_dialogs->show(20211);
+	} else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+		_vm->_dialogs->show(20213);
+	} else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_IN_DISTANCE)) {
+		_vm->_dialogs->show(20214);
+	} else if (_action.isAction(VERB_LOOK, NOUN_SKULL)) {
+		_vm->_dialogs->show(20215);
+	} else if (_action.isAction(VERB_TAKE, NOUN_SKULL)) {
+		_vm->_dialogs->show(20216);
+	} else if (_action.isAction(VERB_LOOK, NOUN_BONES) && _action._commandSource == 4) {
+		_vm->_dialogs->show(20217);
+	} else {
+		return;
+	}
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room203.cpp b/engines/mads/madsv2/nebular/rooms/room203.cpp
new file mode 100644
index 00000000000..dc70a070234
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room203.cpp
@@ -0,0 +1,155 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene203::Scene203(RexNebularEngine *vm) : Scene2xx(vm) {
+	_rhotundaEat2Fl = false;
+	_rhotundaEatFl = false;
+}
+
+void Scene203::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_rhotundaEat2Fl);
+	s.syncAsByte(_rhotundaEatFl);
+}
+
+void Scene203::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	_scene->addActiveVocab(477);
+}
+
+void Scene203::enter() {
+	if (_scene->_priorSceneId == 202) {
+		_game._player._playerPos = Common::Point(187, 99);
+		_game._player._facing = FACING_SOUTH;
+	} else if (_scene->_priorSceneId == 209) {
+		_game._player._playerPos = Common::Point(308, 117);
+		_game._player._facing = FACING_WEST;
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(155, 152);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	_rhotundaEatFl = false;
+	_rhotundaEat2Fl = false;
+
+	if ((_globals[kRhotundaStatus] == 0) && (!_scene->_roomChanged)) {
+		_rhotundaEatFl = true;
+		_game._player.walk(Common::Point(158, 135), FACING_SOUTH);
+		int idx = _scene->_dynamicHotspots.add(131, 396, 0, Common::Rect(0, 0, 320, 156));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(155, 152), FACING_SOUTH);
+		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
+	}
+
+	if (!_rhotundaEatFl) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', -1));
+		if (_vm->getRandomNumber(1, 3) == 2) {
+			_globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 9, 1, 0, 0);
+			int idx = _scene->_dynamicHotspots.add(477, 209, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+			_vm->_sound->command(14);
+		}
+	}
+
+	_game.loadQuoteSet(0x67, 0x68, 0x69, 0x6A, 0x5A, 0);
+
+	if (_rhotundaEatFl) {
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(_vm->getRandomNumber(103, 106)));
+	}
+
+	sceneEntrySound();
+}
+
+void Scene203::step() {
+	if (!_rhotundaEatFl)
+		return;
+
+	if ((_game._trigger == 0) && _rhotundaEat2Fl)
+		return;
+
+	if ((_game._player._playerPos != Common::Point(158, 136)) || (_game._player._facing != FACING_SOUTH))
+		return;
+
+	_rhotundaEat2Fl = true;
+
+	if (_game._trigger == 0) {
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_vm->_palette->lock();
+		_scene->_kernelMessages.reset();
+		_scene->resetScene();
+		_vm->_events->setCursor2(CURSOR_WAIT);
+		_scene->loadAnimation(Resources::formatName(203, 'a', -1, EXT_AA, ""), 81);
+	} else if (_game._trigger == 81) {
+		_scene->_nextSceneId = 208;
+		_scene->_reloadSceneFlag = true;
+	}
+}
+
+void Scene203::preActions() {
+	if (_rhotundaEatFl && !_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+		_game._player.walk(Common::Point(158, 136), FACING_SOUTH);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALKTO, NOUN_OPEN_AREA_TO_EAST))
+		_game._player._walkOffScreenSceneId = 209;
+}
+
+void Scene203::actions() {
+	if (_action._savedFields._lookFlag) {
+		_vm->_dialogs->show(20307);
+	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+		_scene->_nextSceneId = 208;
+	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
+		_scene->_nextSceneId = 202;
+	} else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+		_vm->_dialogs->show(20301);
+	} else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE)) {
+		_vm->_dialogs->show(20302);
+	} else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+		_vm->_dialogs->show(20303);
+	} else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) {
+		_vm->_dialogs->show(20304);
+	} else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+		_vm->_dialogs->show(20305);
+	} else if (_action.isAction(VERB_LOOK, NOUN_BOULDERS)) {
+		_vm->_dialogs->show(20305);
+	} else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
new file mode 100644
index 00000000000..be408a5eb3e
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -0,0 +1,328 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+void Scene205::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_CHICKEN);
+	_scene->addActiveVocab(NOUN_PIRANHA);
+}
+
+Scene205::Scene205(RexNebularEngine *vm) : Scene2xx(vm) {
+	_lastFishTime = _scene->_frameStartTime;
+	_chickenTime = _scene->_frameStartTime;
+
+	_beingKicked = false;
+	_kernelMessage = -1;
+}
+
+void Scene205::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_beingKicked);
+	s.syncAsSint16LE(_kernelMessage);
+}
+
+void Scene205::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', -1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', -1));
+
+	if (_globals[kSexOfRex] == SEX_MALE)
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 0, 0, 3);
+	int idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
+
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
+	idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
+
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 0, 0, 0);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 11);
+
+	if (!_game._visitedScenes._sceneRevisited) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
+		idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
+	}
+
+	if (_game._objects[12]._roomNumber == 205) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
+	} else {
+		_scene->_hotspots.activate(450, false);
+	}
+
+	_beingKicked = false;
+	_game.loadQuoteSet(0x6B, 0x70, 0x71, 0x72, 0x5A, 0x74, 0x75, 0x76, 0x77, 0x78, 0x73, 0x79, 0x7A, 0x7B, 0x7C,
+		0x7D, 0x7E, 0x7F, 0x80, 0xAC, 0xAD, 0xAE, 0x6C, 0x6D, 0x6E, 0x6F, 0x2, 0);
+	_dialog1.setup(0x2A, 0x5A, 0x78, 0x74, 0x75, 0x76, 0x77, 0);
+
+	if (!_game._visitedScenes._sceneRevisited)
+		_dialog1.set(0x5A, 0x74, 0x75, 0x77, 0);
+
+	_vm->_palette->setEntry(250, 63, 50, 20);
+	_vm->_palette->setEntry(251, 50, 40, 15);
+	_vm->_palette->setEntry(252, 63, 63, 40);
+	_vm->_palette->setEntry(253, 50, 50, 30);
+
+	_chickenTime = _vm->_game->_scene._frameStartTime;
+
+	if (_globals[kSexOfRex] == SEX_FEMALE)
+		_scene->_kernelMessages.initRandomMessages(3,
+			Common::Rect(195, 99, 264, 134), 13, 2, 0xFDFC, 60,
+			108, 108, 109, 109, 110, 110, 111, 108, 0);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(99, 152);
+
+	if (_globals[kSexOfRex] != SEX_MALE) {
+		_scene->loadAnimation(formAnimName('a', -1));
+		_scene->_animation[0]->_resetFlag = true;
+	} else {
+		_beingKicked = true;
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 2);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 6, 73);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 11, 74);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+	}
+	sceneEntrySound();
+}
+
+void Scene205::step() {
+	if (_globals[kSexOfRex] == SEX_FEMALE) {
+		_scene->_kernelMessages.randomServer();
+
+		if (_vm->_game->_scene._frameStartTime >= _chickenTime) {
+			int chanceMinor = _scene->_kernelMessages.checkRandom() + 1;
+			if (_scene->_kernelMessages.generateRandom(100, chanceMinor))
+				_vm->_sound->command(28);
+
+			_chickenTime = _vm->_game->_scene._frameStartTime + 2;
+		}
+	}
+
+	if (_vm->_game->_scene._frameStartTime - _lastFishTime > 1300) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(
+			_globals._spriteIndexes[6], false, 5, 1, 0, 0);
+		int idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6],
+			Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
+		_lastFishTime = _vm->_game->_scene._frameStartTime;
+	}
+
+	if (_game._trigger == 73)
+		_scene->_kernelMessages.add(Common::Point(160, 68), 0xFBFA, 32, 0, 60, _game.getQuote(112));
+
+	if (_game._trigger == 74) {
+		_vm->_sound->command(26);
+		_scene->_kernelMessages.add(Common::Point(106, 90), 0x1110, 32, 0, 60, _game.getQuote(113));
+	}
+
+	if (_game._trigger == 71) {
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 2);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2);
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(160, 68), 0xFBFA, 32, 72, 180, _game.getQuote(114));
+	}
+
+	if (_game._trigger == 72)
+		_scene->_nextSceneId = 211;
+}
+
+void Scene205::handleWomanSpeech(int quote) {
+	_kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quote));
+}
+
+void Scene205::actions() {
+	if (_game._screenObjects._inputMode == kInputConversation) {
+		if (_kernelMessage >= 0)
+			_scene->_kernelMessages.remove(_kernelMessage);
+		_kernelMessage = -1;
+
+		if (_game._trigger == 0) {
+			_game._player._stepEnabled = false;
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(_action._activeAction._verbId));
+		} else {
+			if ((_game._trigger > 1) || (_action._activeAction._verbId != 0x76))
+				_game._player._stepEnabled = true;
+
+			switch (_action._activeAction._verbId) {
+			case 0x5A:
+				handleWomanSpeech(0x7A);
+				_dialog1.write(0x78, true);
+				_dialog1.write(0x5A, false);
+				break;
+
+			case 0x74:
+				handleWomanSpeech(0x7C);
+				_dialog1.write(0x74, false);
+				_dialog1.write(0x76, true);
+				break;
+
+			case 0x75:
+			case 0x78:
+				handleWomanSpeech(0x7B);
+				_dialog1.write(_action._activeAction._verbId, false);
+				_vm->_dialogs->show(20501);
+				break;
+
+			case 0x76:
+				if (_game._trigger == 1) {
+					handleWomanSpeech(0x7D);
+					_scene->_sequences.addTimer(120, 2);
+				} else if (_game._trigger == 2) {
+					handleWomanSpeech(0x7E);
+					_dialog1.write(0x76, false);
+					_globals[kChickenPermitted] = true;
+				}
+				break;
+
+			case 0x77:
+				_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, 120, _game.getQuote(0x7F));
+				_scene->_userInterface.setup(kInputBuildingSentences);
+				break;
+
+			default:
+				break;
+			}
+
+			if (_action._activeAction._verbId != 0x77)
+				_dialog1.start();
+		}
+	} else if (_action._lookFlag)
+		_vm->_dialogs->show(20502);
+	else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_OPPOSITE_BANK))
+		_vm->_dialogs->show(20518);
+	else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN)) {
+		if (_game._trigger == 0) {
+			_game._player._stepEnabled = false;
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(0x73));
+		} else if (_game._trigger == 1) {
+			_game._player._stepEnabled = true;
+			handleWomanSpeech(0x79);
+			_dialog1.write(0x5A, true);
+			_dialog1.write(0x75, true);
+			_dialog1.start();
+		}
+	} else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+		if (_game._trigger == 0) {
+			_game._player._stepEnabled = false;
+			int rndVal = _vm->getRandomNumber(0xAC, 0xAE);
+			_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 1, 120, _game.getQuote(rndVal));
+		} else if (_game._trigger == 1)
+			_game._player._stepEnabled = true;
+	} else if (_action.isAction(VERB_WALKTO, NOUN_OPPOSITE_BANK)) {
+		if (_game._trigger == 0) {
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_vm->_palette->lock();
+			_scene->_kernelMessages.reset();
+			_game._player.removePlayerSprites();
+			_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0));
+			_vm->_palette->refreshSceneColors();
+			_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1);
+			_vm->_sound->command(27);
+		} else if (_game._trigger == 1) {
+			if (_scene->_animation[0] != nullptr)
+				_scene->_animation[0]->resetSpriteSetsCount();
+
+			_vm->_dialogs->show(20516);
+			_scene->_reloadSceneFlag = true;
+		}
+	} else {
+		if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_SOUTH))
+			_scene->_nextSceneId = 210;
+
+		if (_action.isAction(VERB_WALKTO, NOUN_FIRE_PIT) || _action.isAction(VERB_WALKTO, NOUN_CHICKEN_ON_SPIT)) {
+			if (_game._objects.isInRoom(OBJ_CHICKEN)) {
+				_scene->_kernelMessages.reset();
+				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x6B));
+			}
+		} else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) {
+			_game._objects.addToInventory(OBJ_CHICKEN);
+			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+			_scene->_hotspots.activate(NOUN_CHICKEN_ON_SPIT, false);
+			_vm->_dialogs->showItem(OBJ_CHICKEN, 812);
+		} else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && (!_globals[kChickenPermitted]))
+			_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 0, 120, _game.getQuote(0x80));
+		else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN))
+			_vm->_dialogs->show(20503);
+		else if (_action.isAction(VERB_LOOK, NOUN_HUT))
+			_vm->_dialogs->show(20504);
+		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT))
+			_vm->_dialogs->show(20505);
+		else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT))
+			_vm->_dialogs->show(20506);
+		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN_ON_SPIT))
+			_vm->_dialogs->show(20507);
+		else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT))
+			_vm->_dialogs->show(20508);
+		else if (_action.isAction(VERB_TAKE, NOUN_FIRE_PIT))
+			_vm->_dialogs->show(20509);
+		else if (_action.isAction(VERB_LOOK, NOUN_STREAM))
+			_vm->_dialogs->show(20510);
+		else if (_action.isAction(VERB_LOOK, NOUN_OPPOSITE_BANK))
+			_vm->_dialogs->show(20511);
+		else if (_game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))
+			&& (_action.isAction(VERB_GIVE, NOUN_STREAM) || _action.isAction(VERB_THROW, NOUN_STREAM)
+				|| _action.isAction(VERB_GIVE, NOUN_PIRANHA) || _action.isAction(VERB_THROW, NOUN_PIRANHA)))
+			_vm->_dialogs->show(20512);
+		else if (_action.isAction(VERB_LOOK, NOUN_PIRANHA))
+			_vm->_dialogs->show(20513);
+		else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT_BUSH))
+			_vm->_dialogs->show(20514);
+		else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT_BUSH))
+			_vm->_dialogs->show(20515);
+		else if (_action.isAction(VERB_TAKE, NOUN_NATIVE_WOMAN))
+			_vm->_dialogs->show(20517);
+		else
+			return;
+	}
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
new file mode 100644
index 00000000000..58e7fecb17b
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -0,0 +1,243 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene207::Scene207(RexNebularEngine *vm) : Scene2xx(vm) {
+	_vultureFl = false;
+	_spiderFl = false;
+	_eyeFl = false;
+	_spiderHotspotId = -1;
+	_vultureHotspotId = -1;
+
+	_spiderTime = _game._player._priorTimer;
+	_vultureTime = _game._player._priorTimer;
+}
+
+void Scene207::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_vultureFl);
+	s.syncAsByte(_spiderFl);
+	s.syncAsByte(_eyeFl);
+
+	s.syncAsSint32LE(_spiderHotspotId);
+	s.syncAsSint32LE(_vultureHotspotId);
+}
+
+void Scene207::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	_scene->addActiveVocab(NOUN_VULTURE);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_SPIDER);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene207::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('h', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('e', 0));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('e', 1));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('g', 1));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('g', 0));
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 7);
+
+	int var2;
+	if (!_game._visitedScenes._sceneRevisited) {
+		var2 = 1;
+	} else {
+		var2 = _vm->getRandomNumber(4) + 1;
+	}
+
+	if (var2 > 2)
+		_vultureFl = false;
+	else
+		_vultureFl = true;
+
+	_spiderFl = (var2 & 1);
+
+	if (_vultureFl) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 30, 0, 0, 400);
+		_vultureHotspotId = _scene->_dynamicHotspots.add(389, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(_vultureHotspotId, Common::Point(254, 94), FACING_WEST);
+	}
+
+	if (_spiderFl) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -1);
+		_spiderHotspotId = _scene->_dynamicHotspots.add(333, 13, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(_spiderHotspotId, Common::Point(59, 132), FACING_SOUTH);
+	}
+
+	_eyeFl = false;
+	if (_scene->_priorSceneId == 211) {
+		_game._player._playerPos = Common::Point(13, 105);
+		_game._player._facing = FACING_EAST;
+	} else if (_scene->_priorSceneId == 214) {
+		_game._player._playerPos = Common::Point(164, 117);
+		_game._player._facing = FACING_SOUTH;
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(305, 131);
+	}
+
+	_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 1, 0, 0);
+	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 22);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+}
+
+void Scene207::moveVulture() {
+	_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+	_vm->_sound->command(43);
+	_vultureFl = false;
+	_vultureTime = _game._player._priorTimer;
+	_scene->_dynamicHotspots.remove(_vultureHotspotId);
+}
+
+void Scene207::moveSpider() {
+	_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
+	_spiderFl = false;
+	_spiderTime = _game._player._priorTimer;
+	_scene->_dynamicHotspots.remove(_spiderHotspotId);
+}
+
+void Scene207::step() {
+	Player &player = _game._player;
+
+	if (_vultureFl) {
+		if (((int32)player._priorTimer - _vultureTime) > 1700)
+			moveVulture();
+	}
+
+	if (_spiderFl) {
+		if (((int32)player._priorTimer - _spiderTime) > 800)
+			moveSpider();
+	}
+
+	if (_game._trigger == 70) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 23, 34);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+	}
+
+	if (_game._trigger == 71)
+		_eyeFl = false;
+
+	if (_eyeFl)
+		return;
+
+	if ((_game._player._playerPos.x >= 124) && (_game._player._playerPos.x <= 201)) {
+		_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0);
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+		_eyeFl = true;
+	}
+}
+
+void Scene207::preActions() {
+	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
+		_game._player._walkOffScreenSceneId = 211;
+
+	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_FIELD_TO_EAST))
+		_game._player._walkOffScreenSceneId = 208;
+
+	if (_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) {
+		if (_action.isObject(NOUN_VULTURE)) {
+			_vultureTime = -9999;
+		} else if (_action.isObject(NOUN_SPIDER)) {
+			_spiderTime = -9999;
+		}
+	}
+}
+
+void Scene207::actions() {
+	if (_action._savedFields._lookFlag)
+		_vm->_dialogs->show(20711);
+	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+		_scene->_nextSceneId = 214;
+	else {
+		if ((_game._player._playerPos.x > 150) && (_game._player._playerPos.x < 189) &&
+			(_game._player._playerPos.y > 111) && (_game._player._playerPos.y < 130)) {
+			if ((_game._player._playerPos.x <= 162) || (_game._player._playerPos.x >= 181) ||
+				(_game._player._playerPos.y <= 115) || (_game._player._playerPos.y >= 126)) {
+				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 2, 0, 0);
+				_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 2, 0, 0);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+			}
+		} else if (_eyeFl) {
+			_scene->_sequences.remove(_globals._sequenceIndexes[7]);
+			_scene->_sequences.remove(_globals._sequenceIndexes[8]);
+			_eyeFl = false;
+		}
+
+		if (_action.isAction(VERB_LOOK, NOUN_DENSE_FOREST))
+			_vm->_dialogs->show(20701);
+		else if (_action.isAction(VERB_LOOK, NOUN_HEDGE))
+			_vm->_dialogs->show(20702);
+		else if (_action.isAction(VERB_LOOK, NOUN_SKULL_AND_CROSSBONES))
+			_vm->_dialogs->show(20703);
+		else if (_action.isAction(VERB_LOOK, NOUN_CAULDRON))
+			_vm->_dialogs->show(20704);
+		else if (_action.isAction(VERB_LOOK, NOUN_WITCHDOCTOR_HUT))
+			_vm->_dialogs->show(20705);
+		else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST))
+			_vm->_dialogs->show(20706);
+		else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS))
+			_vm->_dialogs->show(20707);
+		else if (_action.isAction(VERB_LOOK, NOUN_ALOE_PLANT))
+			_vm->_dialogs->show(20708);
+		else if (_action.isAction(VERB_LOOK, NOUN_LAWN))
+			_vm->_dialogs->show(20709);
+		else if (_action.isAction(VERB_LOOK, NOUN_VULTURE))
+			_vm->_dialogs->show(20710);
+		else if (_action.isAction(VERB_TAKE, NOUN_SKULL_AND_CROSSBONES))
+			_vm->_dialogs->show(20712);
+		else if (_action.isAction(VERB_TAKE, NOUN_ALOE_PLANT))
+			_vm->_dialogs->show(20713);
+		else if (_action.isAction(VERB_LOOK, NOUN_SPIDER))
+			_vm->_dialogs->show(20714);
+		else if (_action.isAction(VERB_TAKE, NOUN_SPIDER))
+			_vm->_dialogs->show(20715);
+		else
+			return;
+	}
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
new file mode 100644
index 00000000000..b689046d97c
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -0,0 +1,343 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene208::Scene208(RexNebularEngine *vm) : Scene2xx(vm) {
+	_rhotundaTurnFl = false;
+	_boundingFl = false;
+	_rhotundaTime = 0;
+}
+
+void Scene208::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_rhotundaTurnFl);
+	s.syncAsByte(_boundingFl);
+	s.syncAsSint32LE(_rhotundaTime);
+}
+
+void Scene208::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	_scene->addActiveVocab(NOUN_HUGE_LEGS);
+	_scene->addActiveVocab(NOUN_LEAF_COVERED_PIT);
+	_scene->addActiveVocab(NOUN_PILE_OF_LEAVES);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene208::updateTrap() {
+	if (_globals[kRhotundaStatus] == 1) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 24);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+		int idx = _scene->_dynamicHotspots.add(NOUN_HUGE_LEGS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH);
+		_scene->_hotspots.activate(414, false);
+		return;
+	}
+
+	switch (_globals[kLeavesStatus]) {
+	case LEAVES_ON_GROUND:
+	{
+		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 15);
+		int idx = _scene->_dynamicHotspots.add(NOUN_PILE_OF_LEAVES, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(60, 152), FACING_NORTH);
+	}
+	break;
+	case LEAVES_ON_TRAP:
+	{
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_hotspots.activate(NOUN_DEEP_PIT, false);
+		int idx = _scene->_dynamicHotspots.add(NOUN_LEAF_COVERED_PIT, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH);
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+	}
+	break;
+	default:
+		break;
+	}
+}
+
+void Scene208::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMBD_8");
+
+	updateTrap();
+
+	_rhotundaTurnFl = false;
+	_boundingFl = false;
+	_scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_INTERFACE);
+	_scene->_textSpacing = 0;
+
+	if (_scene->_priorSceneId == 207) {
+		_game._player._playerPos = Common::Point(8, 122);
+		_game._player._facing = FACING_EAST;
+	} else if (_scene->_priorSceneId == 203) {
+		_game._player._playerPos = Common::Point(142, 108);
+		_game._player._facing = FACING_SOUTH;
+	} else if (_scene->_priorSceneId == 209) {
+		_game._player._playerPos = Common::Point(307, 123);
+		_game._player._facing = FACING_WEST;
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(162, 149);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	_game.loadQuoteSet(0x81, 0x46, 0);
+
+	if ((_scene->_priorSceneId == 207) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) {
+		int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(129));
+		_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+	}
+
+	_vm->_palette->setEntry(16, 0, 0, 63);
+	_vm->_palette->setEntry(17, 0, 0, 45);
+	sceneEntrySound();
+}
+
+void Scene208::step() {
+	if (_boundingFl && _scene->_animation[0] &&
+		(_rhotundaTime <= _scene->_animation[0]->getCurrentFrame())) {
+		_rhotundaTime = _scene->_animation[0]->getCurrentFrame();
+
+		if (_rhotundaTime == 125)
+			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+	}
+
+	if (!_rhotundaTurnFl)
+		return;
+
+	if ((_game._player._playerPos != Common::Point(20, 148)) || (_game._player._facing != FACING_EAST))
+		return;
+
+	if ((_game._trigger == 0) && _boundingFl)
+		return;
+
+	_boundingFl = true;
+
+	switch (_game._trigger) {
+	case 0:
+		_scene->loadAnimation(formAnimName('A', -1), 81);
+		_rhotundaTime = 0;
+		break;
+	case 81:
+		_scene->_sequences.remove(_globals._spriteIndexes[15]);
+		_globals[kRhotundaStatus] = 1;
+		updateTrap();
+		_scene->_sequences.addTimer(90, 82);
+		break;
+	case 82:
+		_game._player._stepEnabled = true;
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene208::preActions() {
+	Player &player = _vm->_game->_player;
+
+	if (_action.isAction(VERB_LOOK) && player._readyToWalk)
+		player._needToWalk = true;
+
+	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_GRASSLAND_TO_EAST))
+		player._walkOffScreenSceneId = 209;
+
+	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
+		player._walkOffScreenSceneId = 207;
+}
+
+void Scene208::subAction(int mode) {
+	switch (_game._trigger) {
+	case 0:
+	{
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+
+		int endTrigger;
+		if ((mode == 1) || (mode == 2))
+			endTrigger = 1;
+		else
+			endTrigger = 2;
+
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, endTrigger);
+	}
+	break;
+	case 1:
+	{
+		int oldSeq = _globals._sequenceIndexes[5];
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 3, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 3, 4);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldSeq);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+		_vm->_sound->command(20);
+	}
+	break;
+
+	case 2:
+	{
+		switch (mode) {
+		case 1:
+			_game._objects.addToInventory(OBJ_BIG_LEAVES);
+			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+			_globals[kLeavesStatus] = 1;
+			break;
+
+		case 2:
+			_game._objects.setRoom(OBJ_BIG_LEAVES, 1);
+			_globals[kLeavesStatus] = 2;
+			updateTrap();
+			break;
+
+		case 3:
+			_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+			_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+			_game._objects.removeFromInventory(OBJ_TWINKIFRUIT, 1);
+			_vm->_sound->command(34);
+			break;
+
+		case 4:
+			_game._objects.removeFromInventory(OBJ_BURGER, 1);
+			_vm->_sound->command(33);
+			break;
+
+		case 5:
+			_game._objects.removeFromInventory(OBJ_DEAD_FISH, 1);
+			_vm->_sound->command(33);
+			break;
+
+		default:
+			break;
+		}
+
+		int oldVal = _globals._sequenceIndexes[5];
+		_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldVal);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+	}
+	break;
+
+	case 3:
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene208::actions() {
+	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LOWLANDS_TO_NORTH)) {
+		if (_globals[kRhotundaStatus])
+			_scene->_nextSceneId = 203;
+		else if (_game._trigger == 0) {
+			_game._player._stepEnabled = false;
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, _game.getQuote(70));
+			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+		} else if (_game._trigger == 1)
+			_scene->_nextSceneId = 203;
+	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
+		_scene->_nextSceneId = 212;
+	else if (_action.isAction(VERB_TAKE, NOUN_PILE_OF_LEAVES) && (!_globals[kLeavesStatus] || _game._trigger)) {
+		subAction(1);
+		if (_game._player._stepEnabled)
+			_vm->_dialogs->showItem(OBJ_BIG_LEAVES, 0x326, 0);
+	} else if (_action.isAction(VERB_PUT, NOUN_BIG_LEAVES, NOUN_DEEP_PIT) && (_globals[kLeavesStatus] == 1 || _game._trigger))
+		subAction(2);
+	else if (_action.isAction(VERB_PUT, NOUN_TWINKIFRUIT, NOUN_LEAF_COVERED_PIT)) {
+		subAction(3);
+		if (_game._player._stepEnabled) {
+			_game._player._stepEnabled = false;
+			_rhotundaTurnFl = true;
+			_game._player.walk(Common::Point(20, 148), FACING_EAST);
+		}
+	} else if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_LEAF_COVERED_PIT)) {
+		subAction(4);
+		if (_game._player._stepEnabled)
+			_vm->_dialogs->show(20812);
+	} else if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_LEAF_COVERED_PIT)) {
+		subAction(5);
+		if (_game._player._stepEnabled)
+			_vm->_dialogs->show(20812);
+	} else if (_action.isAction(VERB_LOOK, NOUN_CUMULOUS_CLOUD))
+		_vm->_dialogs->show(20801);
+	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_WEST))
+		_vm->_dialogs->show(20802);
+	else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH))
+		_vm->_dialogs->show(20803);
+	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+		_vm->_dialogs->show(20804);
+	else if (_action.isAction(VERB_LOOK, NOUN_SMALL_CACTUS))
+		_vm->_dialogs->show(20805);
+	else if (_action.isAction(VERB_TAKE, NOUN_SMALL_CACTUS))
+		_vm->_dialogs->show(20806);
+	else if (_action.isAction(VERB_LOOK, NOUN_GRASSLAND_TO_EAST))
+		_vm->_dialogs->show(20807);
+	else if (_action.isAction(VERB_LOOK, NOUN_DEEP_PIT))
+		_vm->_dialogs->show(20808);
+	else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_LEAVES))
+		_vm->_dialogs->show(20809);
+	else if (_action.isAction(VERB_LOOK, NOUN_LEAF_COVERED_PIT)) {
+		if (_game._difficulty == DIFFICULTY_EASY)
+			_vm->_dialogs->show(20810);
+		else
+			_vm->_dialogs->show(20811);
+	} else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
+		_vm->_dialogs->show(20813);
+	else if (_action.isAction(VERB_TAKE, NOUN_LEAF_COVERED_PIT))
+		_vm->_dialogs->show(20814);
+	else if (_action.isAction(VERB_LOOK, NOUN_HUGE_LEGS))
+		_vm->_dialogs->show(20815);
+	else if (_action.isAction(VERB_TAKE, NOUN_HUGE_LEGS) || _action.isAction(VERB_PULL, NOUN_HUGE_LEGS))
+		_vm->_dialogs->show(20816);
+	else if (_action._savedFields._lookFlag && (_globals[kRhotundaStatus] == 1))
+		_vm->_dialogs->show(20819);
+	else if (_action._savedFields._lookFlag && (_globals[kLeavesStatus] == 2))
+		_vm->_dialogs->show(20818);
+	else if (_action._savedFields._lookFlag)
+		_vm->_dialogs->show(20817);
+	else
+		return;
+
+	_action._inProgress = false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
new file mode 100644
index 00000000000..b4f3f4053da
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -0,0 +1,1787 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene209::Scene209(RexNebularEngine *vm) : Scene2xx(vm) {
+	_dodgeFl = false;
+	_forceDodgeFl = false;
+	_pitchFl = false;
+	_fallFl = false;
+	_forceFallFl = false;
+	_playingAnimFl = false;
+	_shouldFallFl = false;
+	_shouldDodgeFl = false;
+	_monkeyPosition = 0;
+	_counter = 0;
+	_pauseMode = 0;
+	_binocularsDroppedFl = false;
+	_startShootingInTimerFl = false;
+	_dialogAbortVal = 0;
+	_playingDialogFl = false;
+	_shootMissedLastFl = false;
+	_removeMonkeyFl = false;
+	_shootReadyFl = false;
+	_pauseCounterThreshold = 0;
+	_pauseCounter = 0;
+}
+
+void Scene209::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_dodgeFl);
+	s.syncAsByte(_forceDodgeFl);
+	s.syncAsByte(_shouldDodgeFl);
+	s.syncAsByte(_pitchFl);
+	s.syncAsByte(_fallFl);
+	s.syncAsByte(_forceFallFl);
+	s.syncAsByte(_shouldFallFl);
+	s.syncAsByte(_playingAnimFl);
+	s.syncAsByte(_playingDialogFl);
+
+	s.syncAsSint32LE(_pauseMode);
+	s.syncAsSint32LE(_pauseCounterThreshold);
+	s.syncAsSint32LE(_pauseCounter);
+
+	s.syncAsByte(_removeMonkeyFl);
+
+	s.syncAsSint32LE(_monkeyPosition);
+
+	s.syncAsByte(_shootReadyFl);
+	s.syncAsByte(_startShootingInTimerFl);
+	s.syncAsByte(_shootMissedLastFl);
+	s.syncAsByte(_binocularsDroppedFl);
+
+	s.syncAsSint32LE(_dialogAbortVal);
+	s.syncAsSint32LE(_counter);
+}
+
+void Scene209::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	_scene->addActiveVocab(NOUN_PLANT_STALK);
+}
+
+void Scene209::handlePause() {
+	switch (_game._trigger) {
+	case 124:
+		if (++_pauseCounter <= _pauseCounterThreshold)
+			_scene->_sequences.addTimer(60, 124);
+		else
+			_pauseMode = 0;
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene209::initPauseCounterThreshold() {
+	switch (_game._trigger) {
+	case 226:
+		_scene->_sequences.addTimer(1, 124);
+		_pauseCounterThreshold = _vm->getRandomNumber(7, 12);
+		_pauseMode = 2;
+		_pauseCounter = 0;
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene209::handlePeek() {
+	switch (_game._trigger) {
+	case 133:
+		_vm->_sound->command(18);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 134);
+		break;
+
+	case 134:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(60, 135);
+	}
+	break;
+
+	case 135:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+		_scene->_sequences.addTimer(10, 136);
+		break;
+
+	case 136:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.addTimer(50, 137);
+		break;
+
+	case 137:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 138);
+		break;
+
+	case 138:
+		_pauseMode = 1;
+		_scene->_hotspots.activate(227, false);
+		_playingAnimFl = false;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleVerticalMove() {
+	switch (_game._trigger) {
+	case 140:
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 8, 0, 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 141);
+		break;
+
+	case 141:
+	{
+		_vm->_sound->command(18);
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(60, 142);
+	}
+	break;
+
+	case 142:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 143);
+		break;
+
+	case 143:
+		_pauseMode = 1;
+		_playingAnimFl = false;
+		_scene->_hotspots.activate(227, false);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleLookStay() {
+	switch (_game._trigger) {
+	case 145:
+		_vm->_sound->command(18);
+		_monkeyPosition = 2;
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 146);
+		break;
+
+	case 146:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(15, 147);
+	}
+	break;
+
+	case 147:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+		_scene->_sequences.addTimer(8, 148);
+		break;
+
+	case 148:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+
+		if (!_dodgeFl) {
+			_scene->_sequences.addTimer(90, 149);
+		} else {
+			_scene->_sequences.addTimer(1, 149);
+			_shouldDodgeFl = true;
+		}
+		break;
+
+	case 149:
+		_playingAnimFl = false;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleLookRight() {
+	switch (_game._trigger) {
+	case 151:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 2, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 14);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 152);
+		break;
+
+	case 152:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(60, 153);
+	}
+	break;
+
+	case 153:
+		_playingAnimFl = false;
+		if (_dodgeFl)
+			_shouldDodgeFl = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleBlink() {
+	switch (_game._trigger) {
+	case 155:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.addTimer(50, 156);
+		break;
+
+	case 156:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+		_scene->_sequences.addTimer(10, 157);
+		break;
+
+	case 157:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.addTimer(50, 158);
+		break;
+
+	case 158:
+		_playingAnimFl = false;
+		if (_dodgeFl)
+			_shouldDodgeFl = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleGetBinoculars() {
+	switch (_game._trigger) {
+	case 161:
+		_vm->_sound->command(18);
+		_monkeyPosition = 3;
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 24);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 20, 165);
+		if (!_fallFl && !_dodgeFl) {
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 162);
+		} else {
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
+		}
+		break;
+
+	case 162:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 6, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
+	}
+	break;
+
+	case 163:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(8, 164);
+	}
+	break;
+
+	case 164:
+		_playingAnimFl = false;
+		if (_fallFl)
+			_shouldFallFl = true;
+		break;
+
+	case 165:
+		_vm->_sound->command(18);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleBinocularBlink() {
+	switch (_game._trigger) {
+	case 167:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 2, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 168);
+	}
+	break;
+
+	case 168:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(30, 169);
+	}
+	break;
+
+	case 169:
+		_playingAnimFl = false;
+		if (_fallFl)
+			_shouldFallFl = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleBinocularScan() {
+	switch (_game._trigger) {
+	case 171:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 43, 45);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 172);
+	}
+	break;
+
+	case 172:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		int randAction = _vm->getRandomNumber(1, 2);
+		switch (randAction) {
+		case 1:
+			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+			break;
+		case 2:
+			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 4, 0, 0);
+			break;
+		default:
+			break;
+		}
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 173);
+	}
+	break;
+
+	case 173:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 30);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 174);
+	}
+	break;
+
+	case 174:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 0, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(60, 175);
+	}
+	break;
+
+	case 175:
+		_playingAnimFl = false;
+		if (_fallFl)
+			_shouldFallFl = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleJumpInTree() {
+	switch (_game._trigger) {
+	case 178:
+	{
+		int oldIdx = 0;
+		_monkeyPosition = 1;
+		if (_removeMonkeyFl)
+			_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		else
+			oldIdx = _globals._sequenceIndexes[3];
+
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 46, 49);
+		if (!_removeMonkeyFl)
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 179);
+	}
+	break;
+
+	case 179:
+	{
+		_vm->_sound->command(18);
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 53, 61);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 180);
+	}
+	break;
+
+	case 180:
+		_removeMonkeyFl = true;
+		_pauseMode = 1;
+		_playingAnimFl = false;
+		_scene->_hotspots.activate(227, false);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleTongue() {
+	switch (_game._trigger) {
+	case 182:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 30);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 183);
+	}
+	break;
+
+	case 183:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 33);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 184);
+	}
+	break;
+
+	case 184:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 36, 37);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 185);
+	}
+	break;
+
+	case 185:
+	{
+		_vm->_sound->command(18);
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 6, 20, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 38, 39);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 186);
+	}
+	break;
+
+	case 186:
+	{
+		int oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 40, 41);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 178);
+		_removeMonkeyFl = false;
+	}
+	break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleStandFromPeek() {
+	switch (_game._trigger) {
+	case 189:
+		_monkeyPosition = 4;
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 50);
+		_scene->_sequences.addTimer(8, 190);
+		break;
+
+	case 190:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.addTimer(8, 191);
+		break;
+
+	case 191:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 5);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 192);
+		break;
+
+	case 192:
+	{
+		_vm->_sound->command(18);
+		int oldIdx = _globals._sequenceIndexes[6];
+		_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldIdx);
+		_scene->_sequences.addTimer(8, 193);
+	}
+	break;
+
+	case 193:
+		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+		_scene->_sequences.addTimer(5, 194);
+		break;
+
+	case 194:
+		_playingAnimFl = false;
+		_counter = 0;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleStandBlink() {
+	switch (_game._trigger) {
+	case 246:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+		_scene->_sequences.addTimer(10, 247);
+		break;
+
+	case 247:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 23);
+		_scene->_sequences.addTimer(8, 248);
+		break;
+
+	case 248:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+		_scene->_sequences.addTimer(10, 249);
+		break;
+
+	case 249:
+		_playingAnimFl = false;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleJumpAndHide() {
+	switch (_game._trigger) {
+	case 196:
+		_vm->_sound->command(18);
+		_monkeyPosition = 1;
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 16);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 197);
+		break;
+
+	case 197:
+		_pauseMode = 1;
+		_scene->_hotspots.activate(227, false);
+		_playingAnimFl = false;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleMonkeyEating() {
+	switch (_game._trigger) {
+	case 199:
+		_vm->_sound->command(18);
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 14);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 200);
+		break;
+
+	case 200:
+	{
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 10, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 15, 16);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 201);
+	}
+	break;
+
+	case 201:
+	{
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 12);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addTimer(20, 202);
+	}
+	break;
+
+	case 202:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 19);
+		_scene->_sequences.addTimer(20, 203);
+		break;
+
+	case 203:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 17);
+		_scene->_sequences.addTimer(20, 204);
+		break;
+
+	case 204:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 8, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 18, 19);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 205);
+		break;
+
+	case 205:
+	{
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 8, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 20, 21);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 206);
+	}
+	break;
+
+	case 206:
+	{
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 22, 25);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		if (!_dodgeFl && !_fallFl)
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 207);
+		else
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209);
+	}
+	break;
+
+	case 207:
+	{
+		_vm->_sound->command(18);
+		int msgIndex = _scene->_kernelMessages.add(Common::Point(180, 25), 0xFDFC, 0, 0, 90, _game.getQuote(130));
+		_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 15, 4, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 26, 27);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 208);
+	}
+	break;
+
+	case 208:
+	{
+		_scene->_kernelMessages.add(Common::Point(180, 39), 0xFDFC, 0, 0, 90, _game.getQuote(131));
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 4, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 28, 29);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209);
+	}
+	break;
+
+	case 209:
+	{
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addTimer(1, 210);
+	}
+	break;
+
+	case 210:
+		_playingAnimFl = false;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleMonkeyFall() {
+	switch (_game._trigger) {
+	case 219:
+	{
+		_vm->_sound->command(25);
+		_scene->_sprites.remove(_globals._spriteIndexes[7]);
+		_scene->_sprites.remove(_globals._spriteIndexes[6]);
+		_scene->_sprites.remove(_globals._spriteIndexes[5]);
+		_scene->_sprites.remove(_globals._spriteIndexes[4]);
+
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', 4));
+		_scene->_kernelMessages.add(Common::Point(180, 26), 0xFDFC, 0, 0, 90, _game.getQuote(151));
+		_scene->_sequences.addTimer(40, 100);
+		_scene->_hotspots.activate(227, false);
+		int oldIdx = _globals._sequenceIndexes[3];
+		_monkeyPosition = 1;
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 35);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 220);
+	}
+	break;
+
+	case 220:
+	{
+		_vm->_sound->command(18);
+		_scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 90, _game.getQuote(159));
+		_scene->_hotspots.activate(227, false);
+		int oldIdx = _globals._sequenceIndexes[3];
+		_monkeyPosition = 1;
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 36, 42);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 221);
+	}
+	break;
+
+	case 221:
+	{
+		_game._objects.setRoom(OBJ_BINOCULARS, 209);
+		_binocularsDroppedFl = true;
+		int oldIdx = _globals._sequenceIndexes[8];
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], oldIdx);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 43, 72);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 222);
+		int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
+	}
+	break;
+
+	case 222:
+	{
+		_scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 70, _game.getQuote(160));
+		int oldIdx = _globals._sequenceIndexes[8];
+		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 73, 78);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 223);
+	}
+	break;
+
+	case 223:
+		_scene->loadAnimation(Resources::formatName(209, 'e', -1, EXT_AA, ""), 224);
+		_vm->_sound->command(38);
+		break;
+
+	case 224:
+		_playingAnimFl = false;
+		_fallFl = false;
+		_counter = 0;
+		_pauseMode = 0;
+		_vm->_dialogs->show(20910);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleMonkey1() {
+	switch (_game._trigger) {
+	case 212:
+		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 9, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 13);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 213);
+		break;
+
+	case 213:
+	{
+		int oldIdx = _globals._sequenceIndexes[4];
+		_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 1, 22);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 214);
+	}
+	break;
+
+	case 214:
+	{
+		int oldIdx = _globals._sequenceIndexes[7];
+		_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 23, 26);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 215);
+		int msgIndex = _scene->_kernelMessages.add(Common::Point(170, 21), 0xFDFC, 0, 0, 90, _game.getQuote(156));
+		_scene->_kernelMessages.setQuoted(msgIndex, 3, true);
+	}
+	break;
+
+	case 215:
+	{
+		_vm->_sound->command(18);
+		_scene->loadAnimation(Resources::formatName(209, 'a', -1, EXT_AA, ""), 251);
+		int oldIdx = _globals._sequenceIndexes[7];
+		_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 27, 35);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 216);
+	}
+	break;
+
+	case 216:
+	{
+		int oldIdx = _globals._sequenceIndexes[7];
+		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+		_scene->_sequences.addTimer(25, 217);
+	}
+	break;
+
+	case 217:
+		_pitchFl = false;
+		_counter = 0;
+		_pauseMode = 0;
+		_scene->_sequences.addTimer(1, 196);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleMonkey2() {
+	switch (_game._trigger) {
+	case 251:
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(137));
+		_vm->_sound->command(22);
+		_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 11, 1, 0, 0);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[12], Common::Point(111, 133));
+		_scene->_sequences.setScale(_globals._sequenceIndexes[12], 79);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 1, 6);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 252);
+		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+		_game._player._visible = false;
+		break;
+
+	case 252:
+	{
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(132));
+		int oldIdx = _globals._sequenceIndexes[12];
+		_globals._sequenceIndexes[12] = _scene->_sequences.startCycle(_globals._spriteIndexes[12], false, 7);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[12], Common::Point(111, 133));
+		_scene->_sequences.setScale(_globals._sequenceIndexes[12], 79);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[12], oldIdx);
+		_scene->_sequences.addTimer(120, 253);
+	}
+	break;
+
+	case 253:
+		_scene->_sequences.remove(_globals._sequenceIndexes[12]);
+		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::handleDodge() {
+	switch (_game._trigger) {
+	case 241:
+		_scene->_hotspots.activate(227, true);
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+		_scene->_sequences.addTimer(6, 242);
+		break;
+
+	case 242:
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5);
+		_scene->_sequences.addTimer(25, 243);
+		_vm->_sound->command(24);
+		break;
+
+	case 243:
+		_vm->_sound->command(18);
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_playingAnimFl = false;
+		_pauseMode = 0;
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 90, _game.getQuote(155));
+		if (!_shootMissedLastFl) {
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(135));
+			_shootMissedLastFl = true;
+		} else {
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(136));
+		}
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene209::enter() {
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', -1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('b', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', 0));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('m', 1));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('m', 3));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('m', 6));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('m', 8));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMBD_2");
+
+	_game.loadQuoteSet(0x82, 0x83, 0x84, 0x9C, 0x97, 0x95, 0x99, 0x9E, 0x98, 0x9B, 0xA0, 0x96, 0x9F,
+		0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x91, 0x92, 0x93, 0x94, 0x89, 0x85, 0x8A, 0x86, 0x87, 0x88, 0);
+
+	_vm->_palette->setEntry(252, 63, 44, 30);
+	_vm->_palette->setEntry(253, 63, 20, 22);
+
+	if (_game._objects.isInRoom(OBJ_PLANT_STALK)) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+		int idx = _scene->_dynamicHotspots.add(271, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(263, 129), FACING_SOUTH);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
+	}
+
+	if (_scene->_priorSceneId == 208) {
+		_game._player._playerPos = Common::Point(11, 121);
+		_game._player._facing = FACING_EAST;
+	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_game._player._playerPos = Common::Point(28, 121);
+		_game._player._facing = FACING_SOUTH;
+	}
+
+	if (_game._objects.isInRoom(OBJ_BINOCULARS)) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+		int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
+	}
+
+	if (_scene->_roomChanged) {
+		_game._objects.addToInventory(OBJ_POISON_DARTS);
+		_game._objects.addToInventory(OBJ_BLOWGUN);
+		_globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS;
+	}
+
+	_pitchFl = false;
+	_fallFl = false;
+	_dodgeFl = false;
+	_playingAnimFl = false;
+	_monkeyPosition = 1;
+	_counter = 0;
+	_pauseMode = 0;
+	_forceFallFl = false;
+	_shouldFallFl = false;
+	_forceDodgeFl = false;
+	_binocularsDroppedFl = false;
+	_shouldDodgeFl = false;
+	_startShootingInTimerFl = false;
+	_dialogAbortVal = 5;
+	_playingDialogFl = false;
+	_shootMissedLastFl = false;
+	_removeMonkeyFl = true;
+	_shootReadyFl = false;
+
+	_scene->_hotspots.activate(227, false);
+
+	sceneEntrySound();
+}
+
+void Scene209::step() {
+	if (!_playingAnimFl && !_pitchFl && !_fallFl && !_dodgeFl && (_pauseMode == 0) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) {
+		int randAction = _vm->getRandomNumber(1, 50);
+		switch (randAction) {
+		case 1:
+			if ((_monkeyPosition == 1) && (_counter < 2)) {
+				_scene->_sequences.addTimer(1, 133);
+				_playingAnimFl = true;
+				_scene->_hotspots.activate(227, true);
+				++_counter;
+			}
+			break;
+
+		case 2:
+			if ((_monkeyPosition == 1) && (_counter < 2)) {
+				_scene->_sequences.addTimer(1, 140);
+				_scene->_hotspots.activate(227, true);
+				_playingAnimFl = true;
+				++_counter;
+			}
+			break;
+
+		case 3:
+			if (_monkeyPosition == 1) {
+				_scene->_sequences.addTimer(1, 145);
+				_scene->_hotspots.activate(227, true);
+				_playingAnimFl = true;
+				_counter = 0;
+			}
+			break;
+
+		case 4:
+			if ((_monkeyPosition == 2) && (_counter < 2)) {
+				_scene->_sequences.addTimer(1, 151);
+				_scene->_hotspots.activate(227, true);
+				++_counter;
+				_playingAnimFl = true;
+			}
+			break;
+
+		case 5:
+			if (_monkeyPosition == 2) {
+				_scene->_sequences.addTimer(1, 161);
+				_scene->_hotspots.activate(227, true);
+				_counter = 0;
+				_playingAnimFl = true;
+			}
+			break;
+
+		case 6:
+			if (_monkeyPosition == 2) {
+				_scene->_sequences.addTimer(1, 189);
+				_scene->_hotspots.activate(227, true);
+				_counter = 0;
+				_playingAnimFl = true;
+			}
+			break;
+		case 7:
+			if (_monkeyPosition == 3) {
+				_scene->_hotspots.activate(227, true);
+				_scene->_sequences.addTimer(1, 167);
+				_playingAnimFl = true;
+			}
+			break;
+
+		case 8:
+			if (_monkeyPosition == 3) {
+				_scene->_sequences.addTimer(1, 178);
+				_playingAnimFl = true;
+				_scene->_hotspots.activate(227, true);
+				_counter = 0;
+			}
+			break;
+
+		case 9:
+			if ((_monkeyPosition == 3) && (_game._player._playerPos.x < 120)) {
+				_scene->_sequences.addTimer(1, 182);
+				_scene->_hotspots.activate(227, true);
+				_counter = 0;
+				_playingAnimFl = true;
+			}
+			break;
+
+		case 10:
+			if (_monkeyPosition == 4) {
+				_scene->_sequences.addTimer(1, 196);
+				_scene->_hotspots.activate(227, true);
+				_playingAnimFl = true;
+				_counter = 0;
+			}
+			break;
+
+		case 11:
+			if ((_monkeyPosition == 4) && (_counter < 3)) {
+				_scene->_sequences.addTimer(1, 199);
+				_scene->_hotspots.activate(227, true);
+				++_counter;
+				_playingAnimFl = true;
+			}
+			break;
+
+		case 30:
+			if (_monkeyPosition == 4) {
+				_scene->_sequences.addTimer(1, 246);
+				_scene->_hotspots.activate(227, true);
+				_counter = 0;
+				_playingAnimFl = true;
+			}
+			break;
+
+		default:
+			if ((randAction >= 12) && (randAction <= 20) && (_monkeyPosition == 2) && (_counter < 5)) {
+				_scene->_sequences.addTimer(1, 155);
+				++_counter;
+				_playingAnimFl = true;
+			}
+
+			if ((randAction >= 21) && (randAction <= 29) && (_monkeyPosition == 3) && (_counter < 3)) {
+				_scene->_sequences.addTimer(1, 171);
+				_playingAnimFl = true;
+				++_counter;
+			}
+			break;
+		}
+	}
+
+	if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1))
+		_scene->_sequences.addTimer(1, 226);
+
+	if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 2))
+		handlePause();
+
+	if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1))
+		initPauseCounterThreshold();
+
+	handlePeek();
+	handleVerticalMove();
+	handleLookStay();
+	handleLookRight();
+	handleBlink();
+	handleGetBinoculars();
+	handleStandFromPeek();
+	handleDodge();
+	handleBinocularBlink();
+	handleBinocularScan();
+	handleJumpInTree();
+	handleTongue();
+	handleMonkeyFall();
+	handleJumpAndHide();
+	handleMonkeyEating();
+	handleMonkey1();
+	handleStandBlink();
+	handleMonkey2();
+
+	if ((_monkeyPosition == 1) && !_playingAnimFl && _fallFl) {
+		_scene->_sequences.addTimer(1, 145);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 2) && !_playingAnimFl && _fallFl) {
+		_scene->_sequences.addTimer(1, 161);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 4) && !_playingAnimFl && _fallFl) {
+		_scene->_sequences.addTimer(1, 196);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 3) && !_playingAnimFl && _fallFl && _forceFallFl) {
+		_scene->_sequences.addTimer(1, 219);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 1) && !_playingAnimFl && _pitchFl) {
+		_scene->_sequences.addTimer(1, 145);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 2) && !_playingAnimFl && _pitchFl) {
+		_scene->_sequences.addTimer(1, 189);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 4) && !_playingAnimFl && _pitchFl) {
+		_scene->_sequences.addTimer(1, 212);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 3) && !_playingAnimFl && _pitchFl) {
+		_scene->_sequences.addTimer(1, 178);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 1) && !_playingAnimFl && _dodgeFl) {
+		_scene->_sequences.addTimer(1, 145);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 4) && !_playingAnimFl && _dodgeFl) {
+		_scene->_sequences.addTimer(1, 196);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 3) && !_playingAnimFl && _dodgeFl) {
+		_scene->_sequences.addTimer(1, 178);
+		_playingAnimFl = true;
+	}
+
+	if ((_monkeyPosition == 2) && !_playingAnimFl && _dodgeFl && _forceDodgeFl) {
+		_scene->_sequences.addTimer(1, 241);
+		_playingAnimFl = true;
+	}
+
+	if (_dodgeFl || _fallFl) { /* if want to dodge or fall */
+		if (!_playingAnimFl && (_monkeyPosition == 2))
+			_shouldDodgeFl = true;
+
+		if (!_playingAnimFl && (_monkeyPosition == 3))
+			_shouldFallFl = true;
+
+		switch (_game._trigger) {
+		case 228:
+			_game._player._visible = false;
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 7);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 229);
+			break;
+
+		case 229:
+		{
+			int oldIdx = _globals._sequenceIndexes[2];
+			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+			_scene->_sequences.addTimer(35, 230);
+		}
+		break;
+
+		case 230:
+			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 7);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 231);
+			break;
+
+		case 231:
+		{
+			int oldIdx = _globals._sequenceIndexes[2];
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 8, 10);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 232);
+			_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], -1);
+			_game._player._visible = false;
+		}
+		break;
+
+		case 232:
+		{
+			int oldIdx = _globals._sequenceIndexes[2];
+			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 10);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+			_scene->_sequences.addTimer(2, 233);
+			_scene->_kernelMessages.reset();
+			if (_dodgeFl && (_monkeyPosition != 1) && (_monkeyPosition != 2))
+				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138));
+			if (_fallFl && (_monkeyPosition != 3))
+				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138));
+		}
+		break;
+
+		case 233:
+			_shootReadyFl = true;
+			break;
+
+		case 234:
+			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+			_scene->_kernelMessages.reset();
+			if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY)) {
+				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 16, 0, 0);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 12, 239);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235);
+			} else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY)) {
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235);
+				_vm->_sound->command(23);
+			}
+			break;
+
+		case 235:
+		{
+			int oldIdx = _globals._sequenceIndexes[2];
+			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 13);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+			_scene->_sequences.addTimer(12, 236);
+			_forceFallFl = true;
+			_forceDodgeFl = true;
+		}
+		break;
+
+		case 236:
+			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 14, 16);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 237);
+			break;
+
+		case 237:
+			_game._player._visible = true;
+			_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+			_scene->_sequences.addTimer(1, 238);
+			break;
+
+		case 238:
+			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
+			if (_dodgeFl)
+				_game._player._stepEnabled = true;
+
+			_startShootingInTimerFl = false;
+
+			if (_fallFl) {
+				_globals[kMonkeyStatus] = MONKEY_IS_GONE;
+				_game._objects.setRoom(OBJ_POISON_DARTS, NOWHERE);
+			}
+			_dodgeFl = false;
+			_fallFl = false;
+			_forceFallFl = false;
+			_forceDodgeFl = false;
+			_shouldFallFl = false;
+			_shouldDodgeFl = false;
+			break;
+
+		case 239:
+			_vm->_sound->command(23);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._trigger == 100)
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(134));
+
+	if (_shootReadyFl && (_shouldFallFl || _shouldDodgeFl)) {
+		_scene->_sequences.addTimer(4, 234);
+		_shootReadyFl = false;
+	}
+}
+
+void Scene209::preActions() {
+	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_WEST))
+		_game._player._walkOffScreenSceneId = 208;
+
+	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
+		if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
+			&& _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+			_game._player._prepareWalkPos = Common::Point(111, 129);
+			_game._player._prepareWalkFacing = FACING_NORTHEAST;
+			_game._player._needToWalk = true;
+			_game._player._readyToWalk = true;
+		}
+
+		if (_action.isAction(VERB_LOOK, NOUN_MONKEY) || _action.isAction(VERB_TALKTO, NOUN_MONKEY)) {
+			_game._player._prepareWalkPos = Common::Point(111, 129);
+			_game._player._prepareWalkFacing = FACING_NORTHEAST;
+			_game._player._needToWalk = true;
+			_game._player._readyToWalk = true;
+		}
+	}
+}
+
+void Scene209::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20912);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ROCKY_AREA_TO_NORTH)) {
+		_scene->_nextSceneId = 203;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALKTO, NOUN_MONKEY) && !_pitchFl && !_playingDialogFl) {
+		_scene->_sequences.addTimer(1, _dialogAbortVal);
+		_playingDialogFl = true;
+		_game._player._stepEnabled = false;
+		_action._inProgress = false;
+		return;
+	}
+
+	switch (_game._trigger) {
+	case 130:
+		_game._player._stepEnabled = true;
+		_playingDialogFl = false;
+		_action._inProgress = false;
+		return;
+
+	case 5:
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 6, 180, _game.getQuote(139));
+		_action._inProgress = false;
+		return;
+
+	case 6:
+		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151));
+		_scene->_sequences.addTimer(60, 130);
+		_dialogAbortVal = 7;
+		_action._inProgress = false;
+		return;
+
+	case 7:
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 8, 180, _game.getQuote(140));
+		_action._inProgress = false;
+		return;
+
+	case 8:
+		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(149));
+		_scene->_sequences.addTimer(60, 130);
+		_dialogAbortVal = 9;
+		_action._inProgress = false;
+		return;
+
+	case 9:
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(141));
+		_scene->_sequences.addTimer(200, 10);
+		_action._inProgress = false;
+		return;
+
+	case 10:
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 11, 180, _game.getQuote(142));
+		_action._inProgress = false;
+		return;
+
+	case 11:
+		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(152));
+		_scene->_sequences.addTimer(60, 130);
+		_dialogAbortVal = 12;
+		_action._inProgress = false;
+		return;
+
+	case 12:
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 130, _game.getQuote(143));
+		_scene->_sequences.addTimer(150, 13);
+		_action._inProgress = false;
+		return;
+
+	case 13:
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 14, 180, _game.getQuote(145));
+		_action._inProgress = false;
+		return;
+
+	case 14:
+		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151));
+		_scene->_sequences.addTimer(60, 130);
+		_dialogAbortVal = 15;
+		_action._inProgress = false;
+		return;
+
+	case 15:
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 16, 180, _game.getQuote(146));
+		_action._inProgress = false;
+		return;
+
+	case 16:
+		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 17, 60, _game.getQuote(154));
+		_action._inProgress = false;
+		return;
+
+	case 17:
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 130, 60, _game.getQuote(147));
+		_dialogAbortVal = 18;
+		_action._inProgress = false;
+		return;
+
+	case 18:
+		_scene->_kernelMessages.reset();
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(148));
+		_pitchFl = true;
+		_playingDialogFl = false;
+		_dialogAbortVal = 5;
+		_action._inProgress = false;
+		return;
+
+	default:
+		break;
+	}
+
+	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
+		if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
+			&& _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+			if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) {
+				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+				_scene->_sequences.addTimer(1, 231);
+				_startShootingInTimerFl = true;
+				_game._player._stepEnabled = false;
+				_dodgeFl = true;
+				_action._inProgress = false;
+				return;
+			}
+
+			if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) {
+				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+				_scene->_sequences.addTimer(1, 228);
+				_game._player._stepEnabled = false;
+				_fallFl = true;
+				_startShootingInTimerFl = true;
+				_action._inProgress = false;
+				return;
+			}
+		}
+
+		if (_action.isAction(VERB_LOOK, NOUN_MONKEY)) {
+			_pitchFl = true;
+			_game._player._stepEnabled = false;
+			_vm->_dialogs->show(20914);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_PLANT_STALK) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 3, 2, 0, 0);
+			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[11]);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			break;
+
+		case 1:
+			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+			_game._objects.addToInventory(OBJ_PLANT_STALK);
+			break;
+
+		case 2:
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			_scene->_sequences.addTimer(4, 3);
+			_vm->_dialogs->showItem(OBJ_PLANT_STALK, 0x328);
+			break;
+
+		case 3:
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) {
+		switch (_game._trigger) {
+		case 0:
+			_globals._spriteIndexes[10] = _scene->_sprites.addSprites("*RXMBD_8");
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 3, 2, 0, 0);
+			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[10]);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			break;
+
+		case 1:
+			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
+			_game._objects.addToInventory(OBJ_BINOCULARS);
+			break;
+
+		case 2:
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			_binocularsDroppedFl = false;
+			_scene->_sequences.addTimer(4, 3);
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_BINOCULARS, 0x51AF);
+			_scene->_sprites.remove(_globals._spriteIndexes[10]);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+		_vm->_dialogs->show(20901);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_BAMBOO_LIKE_PLANT)) {
+		_vm->_dialogs->show(20902);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINSIDE)) {
+		_vm->_dialogs->show(20903);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+		_vm->_dialogs->show(20904);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_WEST)) {
+		_vm->_dialogs->show(20905);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_ROCKY_AREA_TO_NORTH)) {
+		_vm->_dialogs->show(20906);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_PLANT_STALK) && (_action._savedFields._mainObjectSource == 4)) {
+		_vm->_dialogs->show(20907);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_MONKEY) || _action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_MONKEY)) {
+		_vm->_dialogs->show(20909);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_TREES)) {
+		_vm->_dialogs->show(20913);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_THROW, NOUN_MONKEY) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+		if (!_action.isObject(NOUN_POISON_DARTS)) {
+			_vm->_dialogs->show(20915);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_THROW, NOUN_POISON_DARTS, NOUN_MONKEY)) {
+		_vm->_dialogs->show(20916);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+		if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
+			if (_monkeyPosition == 1)
+				_vm->_dialogs->show(20917);
+			else
+				_vm->_dialogs->show(20918);
+		} else {
+			if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
+				_vm->_dialogs->show(20917);
+			else
+				_vm->_dialogs->show(20919);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_MELON_MUSH)) {
+		_vm->_dialogs->show(20920);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_MELON_MUSH)) {
+		_vm->_dialogs->show(20921);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
new file mode 100644
index 00000000000..38369d43f6a
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -0,0 +1,1091 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "math/utils.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/rooms/room201.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Scene210::Scene210(RexNebularEngine *vm) : Scene2xx(vm) {
+	_curDialogNode = -1;
+	_nextHandsPlace = 0;
+	_twinkleAnimationType = 0;
+	_twinklesCurrentFrame = 0;
+	_shouldTalk = false;
+	_shouldFaceRex = false;
+	_shouldMoveHead = false;
+	_stopWalking = false;
+	_twinklesTalking = false;
+	_twinklesTalk2 = false;
+	_doorway = 0;
+	_subQuote2 = "";
+}
+
+void Scene210::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsSint32LE(_curDialogNode);
+	s.syncAsSint32LE(_nextHandsPlace);
+	s.syncAsSint32LE(_twinkleAnimationType);
+	s.syncAsSint32LE(_twinklesCurrentFrame);
+
+	s.syncAsByte(_shouldTalk);
+	s.syncAsByte(_shouldFaceRex);
+	s.syncAsByte(_shouldMoveHead);
+	s.syncAsByte(_stopWalking);
+	s.syncAsByte(_twinklesTalking);
+	s.syncAsByte(_twinklesTalk2);
+
+	s.syncAsSint32LE(_doorway);
+
+	s.syncString(_subQuote2);
+}
+
+void Scene210::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	_scene->addActiveVocab(NOUN_DOORWAY);
+	_scene->addActiveVocab(VERB_WALK_THROUGH);
+}
+
+void Scene210::handleConversations() {
+	if (_game._trigger == 0) {
+		_scene->_kernelMessages.reset();
+		_game._player._stepEnabled = false;
+		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+		if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
+			Common::String subQuote1;
+			_game.splitQuote(curQuote, subQuote1, _subQuote2);
+			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
+			_scene->_sequences.addTimer(60, 50);
+		} else {
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
+		}
+	} else if (_game._trigger == 50) {
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, _subQuote2);
+		_scene->_sequences.addTimer(180, 1);
+	} else {
+		if (_game._trigger == 1)
+			_scene->_kernelMessages.reset();
+
+		switch (_curDialogNode) {
+		case 1:
+			handleConversation1();
+			break;
+
+		case 2:
+			handleConversation2();
+			break;
+
+		case 3:
+			handleConversation3();
+			break;
+
+		case 5:
+			handleConversation5();
+			break;
+
+		case 6:
+			handleConversation6();
+			break;
+
+		case 7:
+			handleConversation7();
+			break;
+
+		case 8:
+			handleConversation8();
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+void Scene210::handleConversation1() {
+	switch (_action._activeAction._verbId) {
+	case 180:
+		setDialogNode(2);
+		break;
+
+	case 181:
+		setDialogNode(6);
+		break;
+
+	case 182:
+		setDialogNode(4);
+		break;
+
+	case 183:
+		setDialogNode(9);
+		break;
+
+	case 184:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::handleConversation2() {
+	switch (_action._activeAction._verbId) {
+	case 187:
+		setDialogNode(3);
+		break;
+
+	case 188:
+		setDialogNode(4);
+		break;
+
+	case 189:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::handleConversation3() {
+	switch (_action._activeAction._verbId) {
+	case 193:
+		setDialogNode(6);
+		break;
+
+	case 194:
+		setDialogNode(5);
+		break;
+
+	case 195:
+		setDialogNode(4);
+		break;
+
+	case 196:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::handleConversation5() {
+	switch (_action._activeAction._verbId) {
+	case 204:
+		setDialogNode(6);
+		break;
+
+	case 205:
+	case 206:
+		setDialogNode(4);
+		break;
+
+	case 207:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::handleConversation6() {
+	switch (_action._activeAction._verbId) {
+	case 211:
+		setDialogNode(7);
+		break;
+
+	case 212:
+		setDialogNode(4);
+		break;
+
+	case 213:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::handleConversation7() {
+	switch (_action._activeAction._verbId) {
+	case 216:
+	case 217:
+	case 219:
+		setDialogNode(4);
+		break;
+
+	case 218:
+		setDialogNode(8);
+		break;
+
+	case 220:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::handleConversation8() {
+	switch (_action._activeAction._verbId) {
+	case 223:
+	case 224:
+		setDialogNode(4);
+		break;
+
+	case 225:
+	case 226:
+		setDialogNode(9);
+		break;
+
+	case 227:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene210::setDialogNode(int node) {
+	switch (node) {
+	case 0:
+		_scene->_userInterface.setup(kInputBuildingSentences);
+		_shouldFaceRex = false;
+		_shouldTalk = false;
+		_game._player._stepEnabled = true;
+		_curDialogNode = 0;
+		break;
+
+	case 2:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 1;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(0xB9, -1, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+
+		case 2:
+			_nextHandsPlace = 0;
+			handleTwinklesSpeech(186, 0, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+
+		default:
+			_nextHandsPlace = 0;
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+			newNode(2);
+			break;
+		}
+		break;
+
+	case 3:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 0;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(0xBE, -2, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+		case 2:
+			_nextHandsPlace = 2;
+			handleTwinklesSpeech(191, -1, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+		case 3:
+			_nextHandsPlace = 0;
+			handleTwinklesSpeech(192, 0, 0);
+			_scene->_sequences.addTimer(180, 4);
+			break;
+		default:
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+			newNode(3);
+			break;
+		}
+		break;
+
+	case 4:
+		if (_game._trigger == 1) {
+			_nextHandsPlace = 1;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+
+			int quote;
+			if (_game._storyMode == STORYMODE_NAUGHTY)
+				quote = _vm->getRandomNumber(199, 201);
+			else
+				quote = _vm->getRandomNumber(197, 198);
+
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(quote, 0, 360);
+				_scene->_sequences.addTimer(120, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+		} else {
+			_scene->_userInterface.setup(kInputBuildingSentences);
+			_shouldFaceRex = false;
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+		}
+		break;
+
+	case 5:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 2;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(0xCA, -1, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+
+		case 2:
+			_nextHandsPlace = 1;
+			handleTwinklesSpeech(0xCB, 0, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+
+		default:
+			_nextHandsPlace = 2;
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+			newNode(5);
+			break;
+		}
+		break;
+
+	case 6:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 1;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(0xD0, -2, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+
+		case 2:
+			handleTwinklesSpeech(0xD1, -1, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+
+		case 3:
+			_nextHandsPlace = 1;
+			handleTwinklesSpeech(0xD2, 0, 0);
+			_scene->_sequences.addTimer(180, 4);
+			break;
+
+		default:
+			_nextHandsPlace = 0;
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+			newNode(6);
+			break;
+		}
+		break;
+
+	case 7:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 2;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(0xD6, -1, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+
+		case 2:
+			handleTwinklesSpeech(0xD7, 0, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+
+		default:
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+			newNode(7);
+			break;
+		}
+		break;
+
+	case 8:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 2;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				handleTwinklesSpeech(0xDD, -1, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+
+		case 2:
+			handleTwinklesSpeech(0xDE, 0, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+
+		default:
+			_shouldTalk = false;
+			_game._player._stepEnabled = true;
+			newNode(8);
+			break;
+		}
+		break;
+
+
+	case 9:
+		switch (_game._trigger) {
+		case 1:
+			_nextHandsPlace = 0;
+			_shouldTalk = true;
+			_game._player._stepEnabled = false;
+			if (_twinklesTalking) {
+				_scene->_userInterface.emptyConversationList();
+				_scene->_userInterface.setup(kInputConversation);
+				handleTwinklesSpeech(0xE4, -1, 0);
+				_scene->_sequences.addTimer(180, 2);
+			} else {
+				_scene->_sequences.addTimer(6, 1);
+			}
+			break;
+
+		case 2:
+			handleTwinklesSpeech(0xE5, 0, 0);
+			_scene->_sequences.addTimer(180, 3);
+			break;
+
+		case 3:
+			_twinkleAnimationType = 2;
+			_globals[kCurtainOpen] = true;
+			_game._player._visible = false;
+			_vm->_palette->lock();
+			_scene->_kernelMessages.reset();
+			_scene->freeAnimation();
+			_scene->_animation[0] = nullptr;
+			_scene->resetScene();
+
+			_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+			_game.loadQuoteSet(0xE6, 0xE9, 0xEA, 0xE7, 0xE8, 0);
+			_scene->loadAnimation(formAnimName('B', -1), 4);
+			break;
+
+		case 4:
+		{
+			_globals._spriteIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5);
+			_scene->_sequences.setDepth(_globals._spriteIndexes[8], 1);
+
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 20), 0x1110, 32, 5, 180, _game.getQuote(231));
+			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+		}
+		break;
+
+		case 5:
+		{
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 40), 0xFDFC, 32, 6, 180, _game.getQuote(233));
+			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+		}
+		break;
+
+		case 6:


Commit: 56b2af121550139ec0ab8c86e9d376460d6a1dbf
    https://github.com/scummvm/scummvm/commit/56b2af121550139ec0ab8c86e9d376460d6a1dbf
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:40+10:00

Commit Message:
MADS: NEBULAR: Converted room 102

Changed paths:
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/rooms/room101.cpp
    engines/mads/madsv2/nebular/rooms/room102.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk
    engines/mads/nebular/core/action.h
    engines/mads/nebular/game_nebular.h


diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index fecba94c80e..01dc834274c 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -203,10 +203,30 @@ enum GlobalId {
 	kTeleporterCode         = 200
 };
 
+enum StoryMode {
+	STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2
+};
+
+enum Difficulty {
+	DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3
+};
+
 enum {
 	SEX_MALE = 0, SEX_UNKNOWN = 1, SEX_FEMALE = 2
 };
 
+enum ScrCategory {
+	CAT_NONE = 0,
+	CAT_COMMAND = 1,
+	CAT_INV_LIST = 2,
+	CAT_INV_VOCAB = 3,
+	CAT_HOTSPOT = 4,
+	CAT_INV_ANIM = 5,
+	CAT_TALK_ENTRY = 6,
+	CAT_INV_SCROLLER = 7,
+	CAT_12 = 12
+};
+
 extern void global_section_constructor();
 extern void sync_room(Common::Serializer &s);
 
diff --git a/engines/mads/madsv2/nebular/rooms/room101.cpp b/engines/mads/madsv2/nebular/rooms/room101.cpp
index 890872115d9..5d3e1244dbd 100644
--- a/engines/mads/madsv2/nebular/rooms/room101.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room101.cpp
@@ -19,8 +19,6 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
@@ -46,6 +44,7 @@ struct Scratch {
 
 static Scratch local;
 
+
 static void room_101_say_dang() {
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 	_game._player._stepEnabled = false;
@@ -77,7 +76,7 @@ static void room_101_say_dang() {
 	}
 }
 
-void room_101_init() {
+static void room_101_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
@@ -147,7 +146,7 @@ void room_101_init() {
 	section_1_music();
 }
 
-void room_101_daemon() {
+static void room_101_daemon() {
 	if (local._oldSpecial != _game._player._special) {
 		local._oldSpecial = _game._player._special;
 		if (local._oldSpecial)
diff --git a/engines/mads/madsv2/nebular/rooms/room102.cpp b/engines/mads/madsv2/nebular/rooms/room102.cpp
index f3dfdfccb87..a06c6cf4cb3 100644
--- a/engines/mads/madsv2/nebular/rooms/room102.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room102.cpp
@@ -19,54 +19,42 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room102::Room102(RexNebularEngine *vm) : Room1xx(vm) {
-	_fridgeOpenedFl = false;
-	_fridgeOpenedDescr = false;
-	_fridgeFirstOpenFl = false;
-	_chairDescrFl = false;
-	_drawerDescrFl = false;
-	_activeMsgFl = false;
-	_fridgeCommentCount = 0;
-}
-
-void Room102::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
-
-	s.syncAsByte(_fridgeOpenedFl);
-	s.syncAsByte(_fridgeOpenedDescr);
-	s.syncAsByte(_fridgeFirstOpenFl);
-	s.syncAsByte(_chairDescrFl);
-	s.syncAsByte(_drawerDescrFl);
-	s.syncAsByte(_activeMsgFl);
+struct Scratch {
+	byte _fridgeOpenedFl;
+	byte _fridgeOpenedDescr;
+	byte _fridgeFirstOpenFl;
+	byte _chairDescrFl;
+	byte _drawerDescrFl;
+	byte _activeMsgFl;
 
-	s.syncAsSint16LE(_fridgeCommentCount);
-}
+	int16 _fridgeCommentCount;
+};
 
-void Room102::setup() {
-	_scene->_animationData->preLoad(formAnimName('A', -1), 3);
-	setPlayerSpritesPrefix();
-	setAAName();
-}
+static Scratch local;
 
-void Room102::addRandomMessage() {
+static void addRandomMessage() {
 	_scene->_kernelMessages.reset();
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 	int quoteId = _vm->getRandomNumber(65, 69);
 	_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 73, 120, _game.getQuote(quoteId));
-	_activeMsgFl = true;
+	local._activeMsgFl = true;
 }
 
-void Room102::enter() {
-	sceneEntrySound();
+static void room_102_init() {
+	section_1_music();
 
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
@@ -127,12 +115,12 @@ void Room102::enter() {
 		_vm->_sound->command(28);
 	}
 
-	_fridgeOpenedFl = false;
-	_fridgeOpenedDescr = false;
-	_fridgeCommentCount = 0;
-	_fridgeFirstOpenFl = true;
-	_chairDescrFl = false;
-	_activeMsgFl = false;
+	local._fridgeOpenedFl = false;
+	local._fridgeOpenedDescr = false;
+	local._fridgeCommentCount = 0;
+	local._fridgeFirstOpenFl = true;
+	local._chairDescrFl = false;
+	local._activeMsgFl = false;
 
 	_game.loadQuoteSet(0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x45, 0x43, 0);
 
@@ -140,7 +128,7 @@ void Room102::enter() {
 		_vm->_sound->command(20);
 }
 
-void Room102::step() {
+static void room_102_daemon() {
 	if (_game._trigger == 70)
 		_game._player._stepEnabled = true;
 
@@ -171,30 +159,30 @@ void Room102::step() {
 		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
 	}
 
-	if (_fridgeOpenedFl && !_fridgeOpenedDescr) {
-		_fridgeCommentCount++;
-		if (_fridgeCommentCount > 16384) {
-			_fridgeOpenedDescr = true;
+	if (local._fridgeOpenedFl && !local._fridgeOpenedDescr) {
+		local._fridgeCommentCount++;
+		if (local._fridgeCommentCount > 16384) {
+			local._fridgeOpenedDescr = true;
 			_vm->_dialogs->show(10213);
 		}
 	}
 
-	if (!_activeMsgFl && (_game._player._playerPos == Common::Point(177, 114)) && (_game._player._facing == FACING_NORTH)
+	if (!local._activeMsgFl && (_game._player._playerPos == Common::Point(177, 114)) && (_game._player._facing == FACING_NORTH)
 		&& (_vm->getRandomNumber(1, 5000) == 1)) {
 		_scene->_kernelMessages.reset();
-		_activeMsgFl = false;
+		local._activeMsgFl = false;
 		addRandomMessage();
 	}
 
 	if (_game._trigger == 73)
-		_activeMsgFl = false;
+		local._activeMsgFl = false;
 }
 
-void Room102::preActions() {
+static void room_102_pre_parser() {
 	if (_action.isObject(NOUN_REFRIGERATOR) || _action.isObject(NOUN_POSTER))
 		_game._player._needToWalk = _game._player._readyToWalk;
 
-	if (_fridgeOpenedFl && !_action.isObject(NOUN_REFRIGERATOR)) {
+	if (local._fridgeOpenedFl && !_action.isObject(NOUN_REFRIGERATOR)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._player._needToWalk) {
@@ -212,7 +200,7 @@ void Room102::preActions() {
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 				_scene->_hotspots.activate(NOUN_BURGER, false);
 			}
-			_fridgeOpenedFl = false;
+			local._fridgeOpenedFl = false;
 			_game._player._stepEnabled = true;
 			break;
 
@@ -225,7 +213,7 @@ void Room102::preActions() {
 		_scene->_kernelMessages.reset();
 }
 
-void Room102::actions() {
+static void room_102_parser() {
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(10234);
 		_action._inProgress = false;
@@ -233,7 +221,7 @@ void Room102::actions() {
 	}
 
 	bool justOpenedFl = false;
-	if (_action.isObject(NOUN_REFRIGERATOR) && !_fridgeOpenedFl) {
+	if (_action.isObject(NOUN_REFRIGERATOR) && !local._fridgeOpenedFl) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
@@ -253,7 +241,7 @@ void Room102::actions() {
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
 			int delay;
-			if (_action.isAction(VERB_WALKTO) && !_fridgeFirstOpenFl)
+			if (_action.isAction(VERB_WALKTO) && !local._fridgeFirstOpenFl)
 				delay = 0;
 			else
 				delay = 48;
@@ -262,9 +250,9 @@ void Room102::actions() {
 			return;
 
 		case 2:
-			_fridgeOpenedFl = true;
-			_fridgeOpenedDescr = false;
-			_fridgeCommentCount = 0;
+			local._fridgeOpenedFl = true;
+			local._fridgeOpenedDescr = false;
+			local._fridgeCommentCount = 0;
 			_game._player._stepEnabled = true;
 			justOpenedFl = true;
 			if (_game._objects.isInRoom(OBJ_BURGER))
@@ -282,13 +270,13 @@ void Room102::actions() {
 		else
 			_vm->_dialogs->show(10229);
 
-		_fridgeFirstOpenFl = false;
+		local._fridgeFirstOpenFl = false;
 		_action._inProgress = false;
 		return;
 	}
 
 	if (_action.isAction(VERB_WALKTO, NOUN_REFRIGERATOR) && justOpenedFl) {
-		_fridgeFirstOpenFl = false;
+		local._fridgeFirstOpenFl = false;
 		int quoteId = _vm->getRandomNumber(59, 63);
 		Common::String curQuote = _game.getQuote(quoteId);
 		int width = _scene->_kernelMessages._talkFont->getWidth(curQuote, -1);
@@ -296,7 +284,7 @@ void Room102::actions() {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_kernelMessages.add(Common::Point(210, 60), 0x1110, 0, 73, 120, curQuote);
 		_scene->_kernelMessages.add(Common::Point(214 + width, 60), 0x1110, 0, 73, 120, _game.getQuote(64));
-		_activeMsgFl = true;
+		local._activeMsgFl = true;
 		_action._inProgress = false;
 		return;
 	}
@@ -481,9 +469,9 @@ void Room102::actions() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_DRAWER) || ((_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) && !_drawerDescrFl)) {
+	if (_action.isAction(VERB_LOOK, NOUN_DRAWER) || ((_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) && !local._drawerDescrFl)) {
 		_vm->_dialogs->show(10220);
-		_drawerDescrFl = true;
+		local._drawerDescrFl = true;
 		_action._inProgress = false;
 		return;
 	}
@@ -500,8 +488,8 @@ void Room102::actions() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) && !_chairDescrFl)) {
-		_chairDescrFl = true;
+	if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) && !local._chairDescrFl)) {
+		local._chairDescrFl = true;
 		_vm->_dialogs->show(10210);
 		_action._inProgress = false;
 		return;
@@ -654,13 +642,38 @@ void Room102::actions() {
 	}
 }
 
-void Room102::postActions() {
+static void room_102_error() {
 	if (_action.isAction(VERB_PUT, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		_vm->_dialogs->show(10217);
 		_action._inProgress = false;
 	}
 }
 
+void room_102_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._fridgeOpenedFl);
+	s.syncAsByte(local._fridgeOpenedDescr);
+	s.syncAsByte(local._fridgeFirstOpenFl);
+	s.syncAsByte(local._chairDescrFl);
+	s.syncAsByte(local._drawerDescrFl);
+	s.syncAsByte(local._activeMsgFl);
+
+	s.syncAsSint16LE(local._fridgeCommentCount);
+}
+
+void room_102_preload() {
+	room_init_code_pointer = room_102_init;
+	room_pre_parser_code_pointer = room_102_pre_parser;
+	room_parser_code_pointer = room_102_parser;
+	room_daemon_code_pointer = room_102_daemon;
+	room_error_code_pointer = room_102_error;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index dcf40d996d4..daaeb5726c4 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -62,7 +62,15 @@ bool Game::Objects::isInRoom(int object_id) const {
 }
 
 bool Game::Objects::isInInventory(int object_id) const {
-	return !object_is_here(object_id);
+	return player_has(object_id);
+}
+
+int Game::Objects::getIdFromDesc(int desc_id) const {
+	return object_named(desc_id);
+}
+
+bool Game::VisitedScenes::exists(int roomNum) const {
+	return player_has_been_in_room(roomNum);
 }
 
 void Game::loadQuoteSet(int quote1, ...) {
@@ -111,11 +119,19 @@ void Scene::Hotspots::activate(int hotspot, int active) {
 	kernel_flip_hotspot(hotspot, active);
 }
 
+int Scene::KernelMessages::TalkFont::getWidth(const Common::String &message, int spacing) const {
+	return font_string_width(kernel_message_font, message.c_str(), spacing);
+}
+
 int Scene::KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 		uint32 timeout, const Common::String &msg) {
 	return kernel_message_add(const_cast<char *>(msg.c_str()), pt.x, pt.y, fontColor, timeout, endTrigger, 0);
 }
 
+void Scene::KernelMessages::reset() {
+	kernel_message_purge();
+}
+
 int16 Scene::Sprites::addSprites(const char *name, int load_flags) {
 	return kernel_load_series(name, load_flags);
 }
@@ -159,6 +175,10 @@ int16 Scene::Sequences::addSubEntry(int sequence_id, int trigger_type, int trigg
 	return kernel_seq_trigger(sequence_id, trigger_type, trigger_sprite, trigger_code);
 }
 
+void Scene::Sequences::setMsgLayout(int sequence_id) {
+	kernel_seq_player(sequence_id, false);
+}
+
 int Scene::loadAnimation(const char *name, int trigger_code) {
 	return kernel_run_animation(name, trigger_code);
 }
@@ -179,6 +199,10 @@ void VM::Sound::command(int num) {
 	g_engine->_soundManager->command(num);
 }
 
+int VM::getRandomNumber(int min, int max) {
+	return g_engine->getRandomNumber(min, max);
+}
+
 char *formAnimName(char type, int num) {
 	return kernel_name(type, num);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index d91cad3102d..b9de4424fe8 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -58,6 +58,14 @@ enum SpriteAnimType {
 };
 
 struct Action {
+	struct ActiveAction {
+		int &_verbId = player2.words[0];
+		int &_objectNameId = player2.words[1];
+		int &_indirectObjectId = player2.words[2];
+	};
+	ActiveAction _activeAction;
+	int &_mainObjectSource = player.main_object_source;
+
 	bool isAction(int word1) const;
 	bool isAction(int word1, int word2) const;
 	bool isAction(int word1, int word2, int word3) const;
@@ -83,6 +91,7 @@ struct Game {
 		void addToInventory(int object_id);
 		bool isInRoom(int object_id) const;
 		bool isInInventory(int object_id) const;
+		int getIdFromDesc(int desc_id) const;
 	};
 	Objects _objects;
 
@@ -96,6 +105,10 @@ struct Game {
 				y = pt.y;
 				return *this;
 			}
+
+			bool operator==(const Common::Point &rhs) const {
+				return x == rhs.x && y == rhs.y;
+			}
 		};
 		PlayerPoint _playerPos;
 		int &_facing = player.facing;
@@ -113,9 +126,15 @@ struct Game {
 	};
 	Player _player;
 
+	struct VisitedScenes {
+		bool exists(int roomNum) const;
+	};
+	VisitedScenes _visitedScenes;
+
 	int &_trigger = kernel.trigger;
 	int &_triggerSetupMode = kernel.trigger_setup_mode;
 	char *const _aaName = kernel.interface;
+	int8 &_difficulty = game.difficulty;
 
 	void loadQuoteSet(int quote1, ...);
 	char *getQuote(int quote_id);
@@ -158,8 +177,20 @@ struct Scene {
 	Hotspots _hotspots;
 
 	struct KernelMessages {
+		struct TalkFont {
+			TalkFont *operator->() {
+				return this;
+			}
+			const TalkFont *operator->() const {
+				return this;
+			}
+			int getWidth(const Common::String &message, int spacing) const;
+		};
+		TalkFont _talkFont;
+
 		int add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 			uint32 timeout, const Common::String &msg);
+		void reset();
 	};
 	KernelMessages _kernelMessages;
 
@@ -177,6 +208,7 @@ struct Scene {
 		void setScale(int sequence_id, int scale);
 		void setAnimRange(int sequence_id, int first, int last);
 		void addTimer(int ticks, int trigger_code);
+		void setMsgLayout(int sequence_id);
 	};
 	Sequences _sequences;
 
@@ -230,6 +262,8 @@ struct VM {
 		void command(int num);
 	};
 	Sound _sound;
+
+	int getRandomNumber(int min, int max);
 };
 
 extern Game _game;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 2bb71f97198..6a2269b1641 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -75,6 +75,7 @@ MODULE_OBJS += \
 	madsv2/nebular/mads/mads.o \
 	madsv2/nebular/rooms/thunks.o \
 	madsv2/nebular/rooms/room101.o \
+	madsv2/nebular/rooms/room102.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \
diff --git a/engines/mads/nebular/core/action.h b/engines/mads/nebular/core/action.h
index 33824d6615b..b617cdb6bc3 100644
--- a/engines/mads/nebular/core/action.h
+++ b/engines/mads/nebular/core/action.h
@@ -52,12 +52,6 @@ enum PrepType {
 	PREP_UNDER, PREP_BEHIND, PREP_RELATIONAL = 0xff
 };
 
-enum ScrCategory {
-	CAT_NONE = 0, CAT_COMMAND = 1, CAT_INV_LIST = 2, CAT_INV_VOCAB = 3,
-	CAT_HOTSPOT = 4, CAT_INV_ANIM = 5, CAT_TALK_ENTRY = 6, CAT_INV_SCROLLER = 7,
-	CAT_12 = 12
-};
-
 class RexNebularEngine;
 
 struct ActionDetails {
diff --git a/engines/mads/nebular/game_nebular.h b/engines/mads/nebular/game_nebular.h
index ac998e57e0c..2a4b198d4b1 100644
--- a/engines/mads/nebular/game_nebular.h
+++ b/engines/mads/nebular/game_nebular.h
@@ -30,12 +30,6 @@
 namespace MADS {
 namespace Nebular {
 
-enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 };
-
-enum Difficulty {
-	DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3
-};
-
 
 enum ProtectionResult {
 	PROTECTION_SUCCEED = 0, PROTECTION_FAIL = 1, PROTECTION_ESCAPE = 2


Commit: 19b553667f941606f1a34931373a7b6d3657de2d
    https://github.com/scummvm/scummvm/commit/19b553667f941606f1a34931373a7b6d3657de2d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:41+10:00

Commit Message:
MADS: NEBULAR: Re-add bugfix #16849 Game semi-stuck while using binoculars

Changed paths:
    engines/mads/madsv2/nebular/rooms/room202.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index 2eb5d668a2b..ff5c26caf47 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -574,6 +574,7 @@ void Scene202::actions() {
 		if (!_ladderTopFl) {
 			switch (_game._trigger) {
 			case 0:
+				_toTeleportFl = true;
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);


Commit: 1732fc02b5c9f378238f86887caf869171b3771c
    https://github.com/scummvm/scummvm/commit/1732fc02b5c9f378238f86887caf869171b3771c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:41+10:00

Commit Message:
MADS: NEBULAR: Converted room 103

Changed paths:
    engines/mads/madsv2/nebular/rooms/room103.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk
    engines/mads/nebular/core/screen.h


diff --git a/engines/mads/madsv2/nebular/rooms/room103.cpp b/engines/mads/madsv2/nebular/rooms/room103.cpp
index a32fba42596..350d590f692 100644
--- a/engines/mads/madsv2/nebular/rooms/room103.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room103.cpp
@@ -19,34 +19,28 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room103.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
+struct Scratch {
+	long _updateClock;
+};
 
-Room103::Room103(RexNebularEngine *vm) : Room1xx(vm) {
-	_updateClock = 0;
-}
-
-void Room103::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
+static Scratch local;
 
-	byte dummy = 0;
-	s.syncAsByte(dummy); // In order to avoid to break savegame compatibility
-	s.syncAsUint32LE(_updateClock);
-}
 
-void Room103::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Room103::enter() {
+static void room_103_init() {
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
@@ -102,7 +96,8 @@ void Room103::enter() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 	}
 
-	sceneEntrySound();
+	section_1_music();
+
 	_vm->_game->loadQuoteSet(70, 51, 71, 7, 73, 0);
 
 	if (!_game._visitedScenes._sceneRevisited) {
@@ -115,10 +110,10 @@ void Room103::enter() {
 
 	_vm->_palette->setEntry(252, 63, 63, 10);
 	_vm->_palette->setEntry(253, 45, 45, 10);
-	_updateClock = _scene->_frameStartTime;
+	local._updateClock = _scene->_frameStartTime;
 }
 
-void Room103::step() {
+static void room_103_daemon() {
 	switch (_vm->_game->_trigger) {
 	case 70:
 		_vm->_game->_player._stepEnabled = true;
@@ -144,7 +139,7 @@ void Room103::step() {
 		break;
 	}
 
-	if (_scene->_frameStartTime >= _updateClock) {
+	if (_scene->_frameStartTime >= local._updateClock) {
 		Common::Point pt = _vm->_game->_player._playerPos;
 		int dist = Math::hypotenuse(pt.x - 79, pt.y - 137);
 		_vm->_sound->command(29, (dist * -127 / 378) + 127);
@@ -157,11 +152,15 @@ void Room103::step() {
 		dist = Math::hypotenuse(pt.x - 266, pt.y - 138);
 		_vm->_sound->command(32, (dist * -127 / 378) + 127);
 
-		_updateClock = _scene->_frameStartTime + _vm->_game->_player._ticksAmount;
+		local._updateClock = _scene->_frameStartTime + _vm->_game->_player._ticksAmount;
 	}
 }
 
-void Room103::actions() {
+static void room_103_pre_parser() {
+	// No implementation
+}
+
+static void room_103_parser() {
 	if (_action._savedFields._lookFlag)
 		_vm->_dialogs->show(10322);
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
@@ -341,7 +340,7 @@ void Room103::actions() {
 	_action._inProgress = false;
 }
 
-void Room103::postActions() {
+void room_103_error() {
 	if (_action.isObject(NOUN_AUXILIARY_POWER) && !_action.isAction(VERB_WALKTO)) {
 		_vm->_dialogs->show(10305);
 		_action._inProgress = false;
@@ -352,6 +351,26 @@ void Room103::postActions() {
 	}
 }
 
+void room_103_synchronize(Common::Serializer &s) {
+	byte dummy = 0;
+	s.syncAsByte(dummy); // In order to avoid to break savegame compatibility
+	s.syncAsUint32LE(local._updateClock);
+}
+
+void room_103_preload() {
+	room_init_code_pointer = room_103_init;
+	room_pre_parser_code_pointer = room_103_pre_parser;
+	room_parser_code_pointer = room_103_parser;
+	room_daemon_code_pointer = room_103_daemon;
+	room_error_code_pointer = room_103_error;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index daaeb5726c4..818c24ad6a9 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -22,6 +22,7 @@
 #include "common/textconsole.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/matte.h"
 #include "mads/madsv2/core/pal.h"
 #include "mads/madsv2/core/object.h"
 #include "mads/madsv2/core/player.h"
@@ -36,8 +37,7 @@ namespace RexNebular {
 namespace Rooms {
 
 Action _action;
-static Scene scene;
-Scene *const _scene = &scene;
+Scene _scene;
 Globals _globals;
 VM _vm;
 
@@ -69,6 +69,10 @@ int Game::Objects::getIdFromDesc(int desc_id) const {
 	return object_named(desc_id);
 }
 
+void Game::VisitedScenes::add(int roomNum) {
+	player_discover_room(roomNum);
+}
+
 bool Game::VisitedScenes::exists(int roomNum) const {
 	return player_has_been_in_room(roomNum);
 }
@@ -132,6 +136,10 @@ void Scene::KernelMessages::reset() {
 	kernel_message_purge();
 }
 
+void Scene::KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) {
+	kernel_message_teletype(msgIndex, numTicks, quoted);
+}
+
 int16 Scene::Sprites::addSprites(const char *name, int load_flags) {
 	return kernel_load_series(name, load_flags);
 }
@@ -183,6 +191,14 @@ int Scene::loadAnimation(const char *name, int trigger_code) {
 	return kernel_run_animation(name, trigger_code);
 }
 
+void Scene::changeVariant(int num) {
+	kernel_load_variant(num);
+}
+
+void Scene::drawElements(int transitionType, bool surfaceFlag) {
+	matte_frame(transitionType, surfaceFlag);
+}
+
 void VM::Dialogs::show(int id) {
 	text_show(id);
 }
@@ -195,8 +211,8 @@ void VM::Palette::setEntry(int color, int r, int g, int b) {
 	pal_change_color(color, r, g, b);
 }
 
-void VM::Sound::command(int num) {
-	g_engine->_soundManager->command(num);
+void VM::Sound::command(int num, int distance) {
+	g_engine->_soundManager->command(num, distance);
 }
 
 int VM::getRandomNumber(int min, int max) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index b9de4424fe8..9f6546533ad 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -57,6 +57,31 @@ enum SpriteAnimType {
 	ANIMTYPE_STAMP = AA_STAMP
 };
 
+
+enum ScreenTransition {
+	kTransitionNone = 0,
+	kTransitionFadeIn,
+	kTransitionFadeOutIn,
+	kTransitionBoxInBottomLeft,
+	kTransitionBoxInBottomRight,
+	kTransitionBoxInTopLeft,
+	kTransitionBoxInTopRight,
+	kTransitionPanLeftToRight,
+	kTransitionPanRightToLeft,
+	kTransitionCircleIn1,
+	kTransitionCircleIn2,
+	kTransitionCircleIn3,
+	kTransitionCircleIn4,
+	kVertTransition1,
+	kVertTransition2,
+	kVertTransition3,
+	kVertTransition4,
+	kVertTransition5,
+	kVertTransition6,
+	kVertTransition7,
+	kNullPaletteCopy
+};
+
 struct Action {
 	struct ActiveAction {
 		int &_verbId = player2.words[0];
@@ -64,6 +89,12 @@ struct Action {
 		int &_indirectObjectId = player2.words[2];
 	};
 	ActiveAction _activeAction;
+
+	struct SavedFields {
+		int &_lookFlag = player.look_around;
+	};
+	SavedFields _savedFields;
+
 	int &_mainObjectSource = player.main_object_source;
 
 	bool isAction(int word1) const;
@@ -86,66 +117,14 @@ struct Globals {
 };
 extern Globals _globals;
 
-struct Game {
-	struct Objects {
-		void addToInventory(int object_id);
-		bool isInRoom(int object_id) const;
-		bool isInInventory(int object_id) const;
-		int getIdFromDesc(int desc_id) const;
-	};
-	Objects _objects;
-
-	struct Player {
-		struct PlayerPoint {
-			int &x = player.x;
-			int &y = player.y;
-
-			PlayerPoint &operator=(const Common::Point &pt) {
-				x = pt.x;
-				y = pt.y;
-				return *this;
-			}
-
-			bool operator==(const Common::Point &rhs) const {
-				return x == rhs.x && y == rhs.y;
-			}
-		};
-		PlayerPoint _playerPos;
-		int &_facing = player.facing;
-		int &_visible = player.walker_visible;
-		int &_stepEnabled = player.commands_allowed;
-		char *const q = &player.series_name[0];
-		byte &_spritesChanged = player.walker_must_reload;
-		byte &_loadsFirst = player.walker_loads_first;
-		int &_needToWalk = player.need_to_walk;
-		int &_readyToWalk = player.ready_to_walk;
-		int &_special = player.special_code;
-		long &_priorTimer = player.clock;
-		int &_ticksAmount = player.frame_delay;
-		char *const _spritesPrefix = &player.series_name[0];
-	};
-	Player _player;
-
-	struct VisitedScenes {
-		bool exists(int roomNum) const;
-	};
-	VisitedScenes _visitedScenes;
-
-	int &_trigger = kernel.trigger;
-	int &_triggerSetupMode = kernel.trigger_setup_mode;
-	char *const _aaName = kernel.interface;
-	int8 &_difficulty = game.difficulty;
-
-	void loadQuoteSet(int quote1, ...);
-	char *getQuote(int quote_id);
-};
-
-struct Resources {
-	static char *formatName(int my_room, char type, int num, int ext, const char *text);
-	static char *formatAAName(int num);
-};
-
 struct Scene {
+	Scene *operator->() {
+		return this;
+	}
+	const Scene *operator->() const {
+		return this;
+	}
+
 	struct Animation {
 		int16 _id = -1;
 		bool operator!=(std::nullptr_t) const {
@@ -191,15 +170,16 @@ struct Scene {
 		int add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 			uint32 timeout, const Common::String &msg);
 		void reset();
+		void setQuoted(int msgIndex, int numTicks, bool quoted);
 	};
 	KernelMessages _kernelMessages;
 
 	struct Sequences {
-		int16 addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
+		int16 addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
+			word start_ticks = 0, int expire = 0);
+		int16 addReverseSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
 			word start_ticks = 0, int expire = 0);
-		int16 addReverseSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
-			word start_ticks, int expire);
-		int startPingPongCycle(int series_id, int mirror, word ticks, word interval_ticks,
+		int startPingPongCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
 			word start_ticks = 0, int expire = 0);
 		void remove(int sequence_id);
 
@@ -222,6 +202,84 @@ struct Scene {
 	long &_frameStartTime = kernel.clock;
 
 	int loadAnimation(const char *name, int trigger_code);
+	void changeVariant(int num);
+	void drawElements(int transitionType, bool surfaceFlag);
+};
+extern Scene _scene;
+
+struct Game {
+	Game *operator->() {
+		return this;
+	}
+	const Game *operator->() const {
+		return this;
+	}
+
+	struct Objects {
+		void addToInventory(int object_id);
+		bool isInRoom(int object_id) const;
+		bool isInInventory(int object_id) const;
+		int getIdFromDesc(int desc_id) const;
+	};
+	Objects _objects;
+
+	struct Player {
+		struct PlayerPoint {
+			int &x = player.x;
+			int &y = player.y;
+
+			PlayerPoint &operator=(const Common::Point &pt) {
+				x = pt.x;
+				y = pt.y;
+				return *this;
+			}
+			operator Common::Point() {
+				return Common::Point(x, y);
+			}
+
+			bool operator==(const Common::Point &rhs) const {
+				return x == rhs.x && y == rhs.y;
+			}
+		};
+		PlayerPoint _playerPos;
+		int &_facing = player.facing;
+		bool &_visible = player.walker_visible;
+		bool &_stepEnabled = player.commands_allowed;
+		char *const q = &player.series_name[0];
+		byte &_spritesChanged = player.walker_must_reload;
+		byte &_loadsFirst = player.walker_loads_first;
+		int &_needToWalk = player.need_to_walk;
+		int &_readyToWalk = player.ready_to_walk;
+		int &_special = player.special_code;
+		long &_priorTimer = player.clock;
+		int &_ticksAmount = player.frame_delay;
+		char *const _spritesPrefix = &player.series_name[0];
+	};
+	Player _player;
+
+	Scene &_scene = Rooms::_scene;
+
+	struct VisitedScenes {
+		byte &_sceneRevisited = player.been_here_before;
+
+		void add(int roomNum);
+		bool exists(int roomNum) const;
+	};
+	VisitedScenes _visitedScenes;
+
+	int &_trigger = kernel.trigger;
+	int &_triggerSetupMode = kernel.trigger_setup_mode;
+	char *const _aaName = kernel.interface;
+	int8 &_difficulty = game.difficulty;
+
+	void loadQuoteSet(int quote1, ...);
+	char *getQuote(int quote_id);
+};
+extern Game _game;
+
+struct Resources {
+	static char *formatName(int my_room, char type, int num, int ext, const char *text);
+	static char *formatAAName(int num);
 };
 
 struct VM {
@@ -245,6 +303,8 @@ struct VM {
 	};
 	Dialogs _dialogs;
 
+	Game &_game = Rooms::_game;
+
 	struct Palette {
 		void setEntry(int color, int r, int g, int b);
 	};
@@ -259,15 +319,12 @@ struct VM {
 			return this;
 		}
 
-		void command(int num);
+		void command(int num, int distance = 0);
 	};
 	Sound _sound;
 
 	int getRandomNumber(int min, int max);
 };
-
-extern Game _game;
-extern Scene *const _scene;
 extern VM _vm;
 
 extern char *formAnimName(char type, int num);
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 6a2269b1641..6f91c1400d5 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -76,6 +76,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/thunks.o \
 	madsv2/nebular/rooms/room101.o \
 	madsv2/nebular/rooms/room102.o \
+	madsv2/nebular/rooms/room103.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \
diff --git a/engines/mads/nebular/core/screen.h b/engines/mads/nebular/core/screen.h
index 7075da38911..408ea360132 100644
--- a/engines/mads/nebular/core/screen.h
+++ b/engines/mads/nebular/core/screen.h
@@ -37,18 +37,6 @@ enum ScreenMode {
 	SCREENMODE_VGA = 19
 };
 
-enum ScreenTransition {
-	kTransitionNone = 0,
-	kTransitionFadeIn, kTransitionFadeOutIn,
-	kTransitionBoxInBottomLeft, kTransitionBoxInBottomRight,
-	kTransitionBoxInTopLeft, kTransitionBoxInTopRight,
-	kTransitionPanLeftToRight, kTransitionPanRightToLeft,
-	kTransitionCircleIn1, kTransitionCircleIn2,
-	kTransitionCircleIn3, kTransitionCircleIn4,
-	kVertTransition1, kVertTransition2, kVertTransition3,
-	kVertTransition4, kVertTransition5, kVertTransition6,
-	kVertTransition7, kNullPaletteCopy
-};
 
 enum InputMode {
 	kInputBuildingSentences = 0,		// Normal sentence building


Commit: 3220c851ac43b6271df84f563dea4e4c129275fd
    https://github.com/scummvm/scummvm/commit/3220c851ac43b6271df84f563dea4e4c129275fd
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:41+10:00

Commit Message:
MADS: NEBULAR: Implemented room 104

Changed paths:
    engines/mads/madsv2/nebular/rooms/room104.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room104.cpp b/engines/mads/madsv2/nebular/rooms/room104.cpp
index f67e75a7ce2..493885bba69 100644
--- a/engines/mads/madsv2/nebular/rooms/room104.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room104.cpp
@@ -19,34 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room104::Room104(RexNebularEngine *vm) : Room1xx(vm) {
-	_kargShootingFl = false;
-	_loseFl = false;
-}
-
-void Room104::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
-
-	s.syncAsByte(_kargShootingFl);
-	s.syncAsByte(_loseFl);
-}
+struct Scratch {
+	bool _kargShootingFl;
+	bool _loseFl;
+};
 
-void Room104::setup() {
-	// Preloading has been skipped
-	setPlayerSpritesPrefix();
-	setAAName();
-}
+static Scratch local;
 
-void Room104::enter() {
+static void room_104_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -1));
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 0, 0, 1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
@@ -56,20 +49,20 @@ void Room104::enter() {
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(160, 134);
 
-	_loseFl = false;
+	local._loseFl = false;
 	_game.loadQuoteSet(0x35, 0x34, 0);
-	_kargShootingFl = false;
+	local._kargShootingFl = false;
 
 	if (_vm->getRandomNumber(1, 3) == 1) {
 		_scene->loadAnimation(Resources::formatName(104, 'B', -1, EXT_AA, ""), 0);
-		_kargShootingFl = true;
+		local._kargShootingFl = true;
 	}
 
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room104::step() {
-	if ((_game._player._playerPos == Common::Point(189, 70)) && (_game._trigger || !_loseFl)) {
+static void room_104_daemon() {
+	if ((_game._player._playerPos == Common::Point(189, 70)) && (_game._trigger || !local._loseFl)) {
 		if (_game._player._facing == FACING_SOUTHWEST || _game._player._facing == FACING_SOUTHEAST)
 			_game._player._facing = FACING_SOUTH;
 
@@ -82,7 +75,7 @@ void Room104::step() {
 			mirrorFl = true;
 		}
 
-		_loseFl = true;
+		local._loseFl = true;
 
 		switch (_game._player._facing) {
 		case FACING_EAST:
@@ -211,13 +204,13 @@ void Room104::step() {
 	if ((_game._player._special > 0) && _game._player._stepEnabled)
 		_game._player._stepEnabled = false;
 
-	if (_kargShootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
+	if (local._kargShootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
-		_kargShootingFl = false;
+		local._kargShootingFl = false;
 	}
 }
 
-void Room104::preActions() {
+static void room_104_pre_parser() {
 	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_EASTERN_CLIFF_FACE))
 		_game._player._walkOffScreenSceneId = 105;
 
@@ -225,7 +218,7 @@ void Room104::preActions() {
 		_game._player._walkOffScreenSceneId = 106;
 }
 
-void Room104::actions() {
+static void room_104_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10405);
 	else if (_action.isAction(VERB_LOOK, NOUN_CURIOUS_WEED_PATCH))
@@ -242,6 +235,24 @@ void Room104::actions() {
 	_action._inProgress = false;
 }
 
+void room_104_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._kargShootingFl);
+	s.syncAsByte(local._loseFl);
+}
+
+void room_104_preload() {
+	room_init_code_pointer = room_104_init;
+	room_pre_parser_code_pointer = room_104_pre_parser;
+	room_parser_code_pointer = room_104_parser;
+	room_daemon_code_pointer = room_104_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 818c24ad6a9..f4d9aa7230a 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -98,6 +98,14 @@ int16 &Globals::operator[](int idx) {
 	return global[idx];
 }
 
+void Game::Player::startWalking(const Common::Point &pt, int facing) {
+	player_start_walking(pt.x, pt.y, facing);
+}
+
+void Game::Player::cancelCommand() {
+	player_cancel_command();
+}
+
 char *Resources::formatName(int my_room, char type, int num, int ext, const char *text) {
 	return kernel_full_name(my_room, type, num, text, ext);
 }
@@ -140,6 +148,14 @@ void Scene::KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) {
 	kernel_message_teletype(msgIndex, numTicks, quoted);
 }
 
+int Scene::Rails::getNext() const {
+	return player.next_special_code;
+}
+
+void Scene::Rails::resetNext() {
+	player.next_special_code = 0;
+}
+
 int16 Scene::Sprites::addSprites(const char *name, int load_flags) {
 	return kernel_load_series(name, load_flags);
 }
@@ -187,10 +203,18 @@ void Scene::Sequences::setMsgLayout(int sequence_id) {
 	kernel_seq_player(sequence_id, false);
 }
 
+void Scene::Sequences::setPosition(int sequence_id, const Common::Point &pt) {
+	kernel_seq_loc(sequence_id, pt.x, pt.y);
+}
+
 int Scene::loadAnimation(const char *name, int trigger_code) {
 	return kernel_run_animation(name, trigger_code);
 }
 
+void Scene::freeAnimation() {
+	error("TODO: freeAnimation");
+}
+
 void Scene::changeVariant(int num) {
 	kernel_load_variant(num);
 }
@@ -199,6 +223,10 @@ void Scene::drawElements(int transitionType, bool surfaceFlag) {
 	matte_frame(transitionType, surfaceFlag);
 }
 
+void Scene::resetScene() {
+	kernel_dump_all();
+}
+
 void VM::Dialogs::show(int id) {
 	text_show(id);
 }
@@ -211,6 +239,10 @@ void VM::Palette::setEntry(int color, int r, int g, int b) {
 	pal_change_color(color, r, g, b);
 }
 
+void VM::Palette::refreshSceneColors() {
+	kernel_new_palette();
+}
+
 void VM::Sound::command(int num, int distance) {
 	g_engine->_soundManager->command(num, distance);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 9f6546533ad..bf02fdf049b 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -174,6 +174,12 @@ struct Scene {
 	};
 	KernelMessages _kernelMessages;
 
+	struct Rails {
+		int getNext() const;
+		void resetNext();
+	};
+	Rails _rails;
+
 	struct Sequences {
 		int16 addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
 			word start_ticks = 0, int expire = 0);
@@ -189,6 +195,7 @@ struct Scene {
 		void setAnimRange(int sequence_id, int first, int last);
 		void addTimer(int ticks, int trigger_code);
 		void setMsgLayout(int sequence_id);
+		void setPosition(int sequence_id, const Common::Point &pt);
 	};
 	Sequences _sequences;
 
@@ -200,10 +207,13 @@ struct Scene {
 	int16 &_priorSceneId = previous_room;
 	int16 &_nextSceneId = new_room;
 	long &_frameStartTime = kernel.clock;
+	byte &_reloadSceneFlag = kernel.force_restart;
 
 	int loadAnimation(const char *name, int trigger_code);
+	void freeAnimation();
 	void changeVariant(int num);
 	void drawElements(int transitionType, bool surfaceFlag);
+	void resetScene();
 };
 extern Scene _scene;
 
@@ -254,6 +264,11 @@ struct Game {
 		long &_priorTimer = player.clock;
 		int &_ticksAmount = player.frame_delay;
 		char *const _spritesPrefix = &player.series_name[0];
+		int &_moving = player.walking;
+		int &_walkOffScreenSceneId = player.walk_off_edge_to_room;
+
+		void startWalking(const Common::Point &pt, int facing);
+		void cancelCommand();
 	};
 	Player _player;
 
@@ -271,6 +286,7 @@ struct Game {
 	int &_triggerSetupMode = kernel.trigger_setup_mode;
 	char *const _aaName = kernel.interface;
 	int8 &_difficulty = game.difficulty;
+	int8 _storyMode = 0;
 
 	void loadQuoteSet(int quote1, ...);
 	char *getQuote(int quote_id);
@@ -307,6 +323,7 @@ struct VM {
 
 	struct Palette {
 		void setEntry(int color, int r, int g, int b);
+		void refreshSceneColors();
 	};
 	Palette _paletteInstance;
 	Palette *const _palette = &_paletteInstance;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 6f91c1400d5..aa7c455a2ea 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -77,6 +77,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room101.o \
 	madsv2/nebular/rooms/room102.o \
 	madsv2/nebular/rooms/room103.o \
+	madsv2/nebular/rooms/room104.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \


Commit: 6429b1545db31fc6d160f12f9efbdf6625bbca8b
    https://github.com/scummvm/scummvm/commit/6429b1545db31fc6d160f12f9efbdf6625bbca8b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:42+10:00

Commit Message:
MADS: NEBULAR: Implemented room 105

Changed paths:
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/nebular/rooms/room105.cpp
    engines/mads/madsv2/nebular/rooms/room106.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index bb331cf2a47..8d921553871 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -1135,6 +1135,15 @@ void kernel_seq_correction(long old_clock, long new_clock) {
 	}
 }
 
+void kernel_seq_timeout(int old_sequence_id, int new_sequence_id) {
+	long time = (old_sequence_id >= 0) ? sequence_list[old_sequence_id].base_time : player.clock + player.frame_delay;
+
+	if (new_sequence_id >= 0)
+		sequence_list[new_sequence_id].base_time = time;
+	else
+		player.clock = time - player.frame_delay;
+}
+
 void kernel_draw_to_background(int series_id, int sprite_id,
 	int x, int y,
 	int depth, int scale) {
diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index 7e09e0e4ca0..5b574b76ba3 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -481,6 +481,7 @@ extern void kernel_flip_hotspot_loc(int vocab_code, int active, int x, int y);
 extern Sequence sequence_list[KERNEL_MAX_SEQUENCES];
 extern void kernel_seq_init();
 extern void kernel_seq_correction(long old_clock, long new_clock);
+extern void kernel_seq_copy_timeout(int old_sequence_id, int new_sequence_id);
 extern int kernel_seq_add(int series_id, int mirror, int initial_sprite,
 	int low_sprite, int high_sprite, int loop_mode, int loop_direction,
 	int depth, int scale, int auto_locating, int x, int y,
diff --git a/engines/mads/madsv2/nebular/rooms/room105.cpp b/engines/mads/madsv2/nebular/rooms/room105.cpp
index c6a3444163b..5ff34ad992d 100644
--- a/engines/mads/madsv2/nebular/rooms/room105.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room105.cpp
@@ -19,32 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room105::Room105(RexNebularEngine *vm) : Room1xx(vm) {
-	_explosionFl = false;
-}
+struct Scratch {
+	bool _explosionFl;
+};
 
-void Room105::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsByte(_explosionFl);
-}
 
-void Room105::setup() {
-	// Preloading has been skipped
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Room105::enter() {
+static void room_105_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('m', 1));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 4));
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 0);
@@ -63,14 +58,14 @@ void Room105::enter() {
 		_game._player._playerPos = Common::Point(116, 147);
 
 	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
-	_explosionFl = false;
+	local._explosionFl = false;
 
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room105::step() {
-	if ((_game._player._playerPos == Common::Point(170, 87)) && (_game._trigger || !_explosionFl)) {
-		_explosionFl = true;
+static void room_105_daemon() {
+	if ((_game._player._playerPos == Common::Point(170, 87)) && (_game._trigger || !local._explosionFl)) {
+		local._explosionFl = true;
 		switch (_game._trigger) {
 		case 0:
 			_scene->_kernelMessages.reset();
@@ -135,7 +130,7 @@ void Room105::step() {
 		_game._player._stepEnabled = false;
 }
 
-void Room105::preActions() {
+static void room_105_pre_parser() {
 	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_WESTERN_CLIFF_FACE))
 		_game._player._walkOffScreenSceneId = 104;
 
@@ -146,7 +141,7 @@ void Room105::preActions() {
 		_game._player._needToWalk = false;
 }
 
-void Room105::actions() {
+static void room_105_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10512);
 	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn105]) {
@@ -186,6 +181,23 @@ void Room105::actions() {
 	_action._inProgress = false;
 }
 
+void room_105_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._explosionFl);
+}
+
+void room_105_preload() {
+	room_init_code_pointer = room_105_init;
+	room_pre_parser_code_pointer = room_105_pre_parser;
+	room_parser_code_pointer = room_105_parser;
+	room_daemon_code_pointer = room_105_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room106.cpp b/engines/mads/madsv2/nebular/rooms/room106.cpp
index 7154c0d6f99..834413caa23 100644
--- a/engines/mads/madsv2/nebular/rooms/room106.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room106.cpp
@@ -19,42 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room106::Room106(RexNebularEngine *vm) : Room1xx(vm) {
-	_backToShipFl = false;
-	_shadowFl = false;
-	_firstEmergingFl = false;
-	_positionY = 0;
-}
-
-void Room106::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
-
-	s.syncAsByte(_backToShipFl);
-	s.syncAsByte(_shadowFl);
-	s.syncAsByte(_firstEmergingFl);
-	s.syncAsSint32LE(_positionY);
-}
-
-void Room106::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
+struct Scratch {
+	bool _backToShipFl = false;
+	bool _shadowFl = false;
+	bool _firstEmergingFl = false;
+	long _positionY = 0;
+};
 
-	if ((_scene->_priorSceneId == 102) && !_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged)
-		_game._player._spritesPrefix = "";
+static Scratch local;
 
-	_vm->_dialogs->_defaultPosition.y = 100;
-}
 
-void Room106::enter() {
+static void room_106_init() {
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('H', -1));
 
 	if (_game._objects.isInInventory(OBJ_REBREATHER) || (_scene->_priorSceneId != 102) || _scene->_roomChanged) {
@@ -95,9 +83,9 @@ void Room106::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 	}
 
-	_backToShipFl = false;
-	_shadowFl = false;
-	_firstEmergingFl = false;
+	local._backToShipFl = false;
+	local._shadowFl = false;
+	local._firstEmergingFl = false;
 
 	_game.loadQuoteSet(0x31, 0x32, 0x34, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0);
 	sceneEntrySound();
@@ -128,13 +116,13 @@ void Room106::step() {
 			_game._player._stepEnabled = true;
 		} else {
 			_game._player._prepareWalkFacing = FACING_SOUTHWEST;
-			_firstEmergingFl = true;
+			local._firstEmergingFl = true;
 			_scene->loadAnimation(Resources::formatName(106, 'B', -1, EXT_AA, ""), 80);
 		}
 	}
 
-	if (_firstEmergingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
-		_firstEmergingFl = false;
+	if (local._firstEmergingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
+		local._firstEmergingFl = false;
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
 	}
 
@@ -143,7 +131,7 @@ void Room106::step() {
 		int msgId = -1;
 		switch (tmpVal) {
 		case 0:
-			_positionY = 26;
+			local._positionY = 26;
 			msgId = 49;
 			break;
 
@@ -167,16 +155,16 @@ void Room106::step() {
 
 		if (msgId >= 0) {
 			int nextTrigger = _game._trigger + 1;
-			_scene->_kernelMessages.add(Common::Point(15, _positionY), 0x1110, 0, 0, 360, _game.getQuote(msgId));
+			_scene->_kernelMessages.add(Common::Point(15, local._positionY), 0x1110, 0, 0, 360, _game.getQuote(msgId));
 			_scene->_sequences.addTimer(150, nextTrigger);
-			_positionY += 14;
+			local._positionY += 14;
 		}
 	}
 
-	if (_backToShipFl) {
-		if (!_shadowFl) {
+	if (local._backToShipFl) {
+		if (!local._shadowFl) {
 			if (_game._player._playerPos.x < 204) {
-				_shadowFl = true;
+				local._shadowFl = true;
 				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 4, 1, 0, 0);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 44, 73);
@@ -216,7 +204,7 @@ void Room106::actions() {
 		_game._player._needToWalk = true;
 		_game._player._readyToWalk = true;
 		_game._player._frameNumber = 9;
-		_backToShipFl = true;
+		local._backToShipFl = true;
 	} else if (_action.isAction(VERB_LOOK, NOUN_ANEMONE) || _action.isAction(VERB_LOOK_AT, NOUN_ANEMONE))
 		_vm->_dialogs->show(10601);
 	else if (_action.isAction(VERB_TAKE, NOUN_ANEMONE))
@@ -249,6 +237,30 @@ void Room106::actions() {
 	_action._inProgress = false;
 }
 
+void room_106_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._backToShipFl);
+	s.syncAsByte(local._shadowFl);
+	s.syncAsByte(local._firstEmergingFl);
+	s.syncAsSint32LE(local._positionY);
+}
+
+void room_106_preload() {
+	room_init_code_pointer = room_106_init;
+	room_pre_parser_code_pointer = room_106_pre_parser;
+	room_parser_code_pointer = room_106_parser;
+	room_daemon_code_pointer = room_106_daemon;
+
+	section_1_walker();
+	section_1_interface();
+
+	if ((_scene->_priorSceneId == 102) && !_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged)
+		_game._player._spritesPrefix = "";
+
+	_vm->_dialogs->_defaultPosition.y = 100;
+
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index f4d9aa7230a..91af3bd0002 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -127,6 +127,10 @@ void Scene::DynamicHotspots::remove(int dyn_id) {
 	kernel_delete_dynamic(dyn_id);
 }
 
+void Scene::DynamicHotspots::setPosition(int id, const Common::Point &pt, int facing) {
+	kernel_dynamic_walk(id, pt.x, pt.y, facing);
+}
+
 void Scene::Hotspots::activate(int hotspot, int active) {
 	kernel_flip_hotspot(hotspot, active);
 }
@@ -160,6 +164,16 @@ int16 Scene::Sprites::addSprites(const char *name, int load_flags) {
 	return kernel_load_series(name, load_flags);
 }
 
+Scene::Sprite &Scene::Sprites::operator[](int idx) {
+	_sprites[idx].setIndex(idx);
+	return _sprites[idx];
+}
+
+void Scene::Sprite::setIndex(int index) {
+	_index = index;
+	_charInfo._info = series_list[index]->walker;
+}
+
 int16 Scene::Sequences::addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
 	word start_ticks, int expire) {
 	return kernel_seq_forward(series_id, mirror, ticks, interval_ticks, start_ticks, expire);
@@ -207,6 +221,10 @@ void Scene::Sequences::setPosition(int sequence_id, const Common::Point &pt) {
 	kernel_seq_loc(sequence_id, pt.x, pt.y);
 }
 
+void Scene::Sequences::updateTimeout(int old_sequence_id, int new_sequence_id) {
+	kernel_seq_copy_timeout(old_sequence_id, new_sequence_id);
+}
+
 int Scene::loadAnimation(const char *name, int trigger_code) {
 	return kernel_run_animation(name, trigger_code);
 }
@@ -227,12 +245,16 @@ void Scene::resetScene() {
 	kernel_dump_all();
 }
 
+void Scene::clearSequenceList() {
+	kernel_seq_init();
+}
+
 void VM::Dialogs::show(int id) {
 	text_show(id);
 }
 
-void VM::Dialogs::showItem(int object_id, int message) {
-	object_examine(object_id, message, 0);
+void VM::Dialogs::showItem(int object_id, int message, int speech) {
+	object_examine(object_id, message, speech);
 }
 
 void VM::Palette::setEntry(int color, int r, int g, int b) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index bf02fdf049b..a69e69a365e 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -25,6 +25,7 @@
 #include "common/rect.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/player.h"
+#include "mads/madsv2/core/sprite.h"
 #include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
@@ -147,6 +148,7 @@ struct Scene {
 	struct DynamicHotspots {
 		int add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r);
 		void remove(int dyn_id);
+		void setPosition(int id, const Common::Point &pt, int facing);
 	};
 	DynamicHotspots _dynamicHotspots;
 
@@ -196,11 +198,38 @@ struct Scene {
 		void addTimer(int ticks, int trigger_code);
 		void setMsgLayout(int sequence_id);
 		void setPosition(int sequence_id, const Common::Point &pt);
+		void updateTimeout(int old_sequence_id, int new_sequence_id);
 	};
 	Sequences _sequences;
 
+	struct Sprite {
+		struct CharInfo {
+			CharInfo *operator->() {
+				return this;
+			}
+			const CharInfo *operator->() const {
+				return this;
+			}
+			WalkerInfoPtr _info;
+		};
+		CharInfo _charInfo;
+
+		Sprite *operator->() {
+			return this;
+		}
+		const Sprite *operator->() const {
+			return this;
+		}
+		int _index;
+
+		void setIndex(int index);
+	};
+
 	struct Sprites {
+		Sprite _sprites[51];
+
 		int16 addSprites(const char *name, int load_flags = 0);
+		Sprite &operator[](int idx);
 	};
 	Sprites _sprites;
 
@@ -208,12 +237,14 @@ struct Scene {
 	int16 &_nextSceneId = new_room;
 	long &_frameStartTime = kernel.clock;
 	byte &_reloadSceneFlag = kernel.force_restart;
+	byte &_roomChanged = kernel.teleported_in;
 
 	int loadAnimation(const char *name, int trigger_code);
 	void freeAnimation();
 	void changeVariant(int num);
 	void drawElements(int transitionType, bool surfaceFlag);
 	void resetScene();
+	void clearSequenceList();
 };
 extern Scene _scene;
 
@@ -252,7 +283,28 @@ struct Game {
 			}
 		};
 		PlayerPoint _playerPos;
+
+		struct PlayerPrepare {
+			int &x = player.prepare_walk_x;
+			int &y = player.prepare_walk_y;
+
+			PlayerPrepare &operator=(const Common::Point &pt) {
+				x = pt.x;
+				y = pt.y;
+				return *this;
+			}
+			operator Common::Point() {
+				return Common::Point(x, y);
+			}
+
+			bool operator==(const Common::Point &rhs) const {
+				return x == rhs.x && y == rhs.y;
+			}
+		};
+		PlayerPrepare _prepareWalkPos;
+
 		int &_facing = player.facing;
+		int &_prepareFacing = player.prepare_walk_facing;
 		bool &_visible = player.walker_visible;
 		bool &_stepEnabled = player.commands_allowed;
 		char *const q = &player.series_name[0];
@@ -266,6 +318,8 @@ struct Game {
 		char *const _spritesPrefix = &player.series_name[0];
 		int &_moving = player.walking;
 		int &_walkOffScreenSceneId = player.walk_off_edge_to_room;
+		int &_prepareWalkFacing = player.prepare_walk_facing;
+		int &_spritesStart = player.series_base;
 
 		void startWalking(const Common::Point &pt, int facing);
 		void cancelCommand();
@@ -315,7 +369,7 @@ struct VM {
 		}
 
 		void show(int id);
-		void showItem(int object_id, int message);
+		void showItem(int object_id, int message, int speech = 0);
 	};
 	Dialogs _dialogs;
 
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index aa7c455a2ea..31dbbcfcc06 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -78,6 +78,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room102.o \
 	madsv2/nebular/rooms/room103.o \
 	madsv2/nebular/rooms/room104.o \
+	madsv2/nebular/rooms/room105.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \


Commit: 32550de5b2fa488c5e3cb8f136266829d00fa668
    https://github.com/scummvm/scummvm/commit/32550de5b2fa488c5e3cb8f136266829d00fa668
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:42+10:00

Commit Message:
MADS: PHANTOM: Impelmented rooms 106 to 110

Changed paths:
    engines/mads/madsv2/core/player.cpp
    engines/mads/madsv2/core/player.h
    engines/mads/madsv2/nebular/rooms/room106.cpp
    engines/mads/madsv2/nebular/rooms/room107.cpp
    engines/mads/madsv2/nebular/rooms/room108.cpp
    engines/mads/madsv2/nebular/rooms/room109.cpp
    engines/mads/madsv2/nebular/rooms/room110.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/player.cpp b/engines/mads/madsv2/core/player.cpp
index 8c4a7e7d6d8..c88277a49b3 100644
--- a/engines/mads/madsv2/core/player.cpp
+++ b/engines/mads/madsv2/core/player.cpp
@@ -868,6 +868,10 @@ void player_discover_room(int id) {
 	}
 }
 
+void player_undiscover_room() {
+	player.num_rooms_been_in--;
+}
+
 int player_has(int object_id) {
 	int has_flag = false;
 
diff --git a/engines/mads/madsv2/core/player.h b/engines/mads/madsv2/core/player.h
index 4d61070219d..ed15cf4e1ad 100644
--- a/engines/mads/madsv2/core/player.h
+++ b/engines/mads/madsv2/core/player.h
@@ -273,6 +273,12 @@ extern int player_has_been_in_room(int id);
  */
 extern void player_discover_room(int id);
 
+
+/**
+ * Removes the most recently visited room from the list of rooms that have been visted.
+ */
+extern void player_undiscover_room();
+
 /**
  * Returns true if the player is carrying the specified object number.
  * Negative(invalid) object numbers are permitted (they return false),
diff --git a/engines/mads/madsv2/nebular/rooms/room106.cpp b/engines/mads/madsv2/nebular/rooms/room106.cpp
index 834413caa23..63bf1234c73 100644
--- a/engines/mads/madsv2/nebular/rooms/room106.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room106.cpp
@@ -88,10 +88,10 @@ static void room_106_init() {
 	local._firstEmergingFl = false;
 
 	_game.loadQuoteSet(0x31, 0x32, 0x34, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0);
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room106::step() {
+static void room_106_daemon() {
 	if (_game._trigger == 70) {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -2, -2);
@@ -183,7 +183,7 @@ void Room106::step() {
 	}
 }
 
-void Room106::preActions() {
+static void room_106_pre_parser() {
 	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_SEA_CLIFF) || _action.isAction(VERB_SWIM_TOWARDS, NOUN_SEAWEED_BANK)) {
 		_game._player._stepEnabled = false;
 		_scene->_sprites[_game._player._spritesStart + 1]->_charInfo->_velocity = 24;
@@ -194,7 +194,7 @@ void Room106::preActions() {
 		_game._player._walkOffScreenSceneId = 107;
 }
 
-void Room106::actions() {
+static void room_106_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10614);
 	else if (_action.isAction(VERB_SWIM_TO, NOUN_MAIN_AIRLOCK)) {
@@ -254,7 +254,7 @@ void room_106_preload() {
 	section_1_interface();
 
 	if ((_scene->_priorSceneId == 102) && !_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged)
-		_game._player._spritesPrefix = "";
+		*player.series_name = '\0';
 
 	_vm->_dialogs->_defaultPosition.y = 100;
 
diff --git a/engines/mads/madsv2/nebular/rooms/room107.cpp b/engines/mads/madsv2/nebular/rooms/room107.cpp
index abf74f09a0e..26ea3e62c4d 100644
--- a/engines/mads/madsv2/nebular/rooms/room107.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room107.cpp
@@ -19,33 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room107::Room107(RexNebularEngine *vm) : Room1xx(vm) {
-	_shootingFl = false;
-}
-
-void Room107::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
+struct Scratch {
+	bool _shootingFl;
+};
 
-	s.syncAsByte(_shootingFl);
-}
+static Scratch local;
 
-void Room107::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-
-	_scene->addActiveVocab(NOUN_MANTA_RAY);
-}
 
-void Room107::enter() {
+static void room_107_init() {
 	for (int i = 0; i < 3; i++)
 		_globals._spriteIndexes[i + 1] = _scene->_sprites.addSprites(formAnimName('G', i));
 
@@ -83,24 +77,24 @@ void Room107::enter() {
 	}
 
 	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
-	_shootingFl = false;
+	local._shootingFl = false;
 
 	if (_vm->getRandomNumber(1, 3) == 1) {
 		_scene->loadAnimation(Resources::formatName(107, 'B', -1, EXT_AA, ""), 0);
-		_shootingFl = true;
+		local._shootingFl = true;
 	}
 
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room107::step() {
-	if (_shootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
+static void room_107_daemon() {
+	if (local._shootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
-		_shootingFl = false;
+		local._shootingFl = false;
 	}
 }
 
-void Room107::preActions() {
+static void room_107_pre_parser() {
 	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
 		_game._player._walkOffScreenSceneId = 106;
 
@@ -108,7 +102,7 @@ void Room107::preActions() {
 		_game._player._walkOffScreenSceneId = 108;
 }
 
-void Room107::actions() {
+static void room_107_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10708);
 	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn107]) {
@@ -148,6 +142,22 @@ void Room107::actions() {
 	_action._inProgress = false;
 }
 
+void room_107_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._shootingFl);
+}
+
+void room_107_preload() {
+	room_init_code_pointer = room_107_init;
+	room_pre_parser_code_pointer = room_107_pre_parser;
+	room_parser_code_pointer = room_107_parser;
+	room_daemon_code_pointer = room_107_daemon;
+
+	section_1_walker();
+	section_1_interface();
+	vocab_make_active(NOUN_MANTA_RAY);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room108.cpp b/engines/mads/madsv2/nebular/rooms/room108.cpp
index 746a5c94d80..fa711962b1a 100644
--- a/engines/mads/madsv2/nebular/rooms/room108.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room108.cpp
@@ -19,21 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Room108::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Room108::enter() {
+static void room_108_init() {
 	if (_globals[kHoovicSated] == 2)
 		_globals[kHoovicSated] = 0;
 
@@ -64,15 +63,19 @@ void Room108::enter() {
 		_game._player._playerPos = Common::Point(305, 98);
 
 	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room108::preActions() {
+static void room_108_daemon() {
+	// No implementation
+}
+
+static void room_108_pre_parser() {
 	if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_EAST))
 		_game._player._walkOffScreenSceneId = 109;
 }
 
-void Room108::actions() {
+static void room_108_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10812);
 	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn108]) {
@@ -114,6 +117,21 @@ void Room108::actions() {
 	_action._inProgress = false;
 }
 
+void room_108_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_108_preload() {
+	room_init_code_pointer = room_108_init;
+	room_pre_parser_code_pointer = room_108_pre_parser;
+	room_parser_code_pointer = room_108_parser;
+	room_daemon_code_pointer = room_108_daemon;
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room109.cpp b/engines/mads/madsv2/nebular/rooms/room109.cpp
index c46b248d9ee..85cd6b550c0 100644
--- a/engines/mads/madsv2/nebular/rooms/room109.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room109.cpp
@@ -19,49 +19,36 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/himem.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room109::Room109(RexNebularEngine *vm) : Room1xx(vm) {
-	_rexThrowingObject = false;
-	_hoovicDifficultFl = false;
-	_beforeEatingRex = false;
-	_eatingRex = false;
-	_hungryFl = false;
-	_eatingFirstFish = false;
+struct Scratch {
+	byte _rexThrowingObject;
+	byte _hoovicDifficultFl;
+	byte _beforeEatingRex;
+	byte _eatingRex;
+	byte _hungryFl;
+	byte _eatingFirstFish;
 
-	_throwingObjectId = -1;
-	_hoovicTrigger = 0;
-}
-
-void Room109::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
-
-	s.syncAsByte(_rexThrowingObject);
-	s.syncAsByte(_hoovicDifficultFl);
-	s.syncAsByte(_beforeEatingRex);
-	s.syncAsByte(_eatingRex);
-	s.syncAsByte(_hungryFl);
-	s.syncAsByte(_eatingFirstFish);
-	s.syncAsSint32LE(_throwingObjectId);
-	s.syncAsSint32LE(_hoovicTrigger);
-}
+	int16 _throwingObjectId;
+	int16 _hoovicTrigger;
+};
 
-void Room109::setup() {
-	_scene->addActiveVocab(NOUN_DEAD_PURPLE_MONSTER);
-	_scene->addActiveVocab(NOUN_MONSTER_SLUDGE);
+static Scratch local;
 
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Room109::enter() {
+static void room_109_init() {
 	_globals[kFishIn105] = true;
 
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RXSWRC_6");
@@ -70,11 +57,11 @@ void Room109::enter() {
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('O', 0));
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('H', 4));
 
-	_rexThrowingObject = false;
-	_throwingObjectId = 0;
-	_beforeEatingRex = false;
-	_eatingRex = false;
-	_hungryFl = false;
+	local._rexThrowingObject = false;
+	local._throwingObjectId = 0;
+	local._beforeEatingRex = false;
+	local._eatingRex = false;
+	local._hungryFl = false;
 
 	if (_scene->_priorSceneId == 110) {
 		_game._player._playerPos = Common::Point(248, 38);
@@ -117,9 +104,9 @@ void Room109::enter() {
 	_vm->_palette->setEntry(253, 30, 30, 50);
 
 	_game.loadQuoteSet(0x53, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0);
-	_eatingFirstFish = (!_game._visitedScenes._sceneRevisited) && (_scene->_priorSceneId < 110);
+	local._eatingFirstFish = (!_game._visitedScenes._sceneRevisited) && (_scene->_priorSceneId < 110);
 
-	if (_eatingFirstFish) {
+	if (local._eatingFirstFish) {
 		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(Resources::formatName(105, 'F', 1, EXT_SS, ""));
 		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('H', 1));
 
@@ -131,19 +118,19 @@ void Room109::enter() {
 		_game._player._stepEnabled = false;
 	}
 
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room109::step() {
-	if (_beforeEatingRex) {
-		if (!_eatingRex) {
+static void room_109_daemon() {
+	if (local._beforeEatingRex) {
+		if (!local._eatingRex) {
 			if (_game._player._playerPos.x > 205) {
 				_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 6, 70);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 
-				_eatingRex = true;
+				local._eatingRex = true;
 				_vm->_sound->command(34);
 			}
 		} else {
@@ -162,30 +149,30 @@ void Room109::step() {
 		}
 	}
 
-	if (_hungryFl && (_game._player._playerPos == Common::Point(160, 32)) && (_game._player._facing == FACING_EAST)) {
+	if (local._hungryFl && (_game._player._playerPos == Common::Point(160, 32)) && (_game._player._facing == FACING_EAST)) {
 		_game._player.walk(Common::Point(226, 24), FACING_EAST);
 		_game._player._stepEnabled = false;
-		_hungryFl = false;
-		_beforeEatingRex = true;
+		local._hungryFl = false;
+		local._beforeEatingRex = true;
 		_scene->_sprites.remove(_globals._spriteIndexes[6]);
 		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('H', 0));
 		_vm->_palette->refreshSceneColors();
 	}
 
-	if (_game._player._moving && (_scene->_rails.getNext() > 0) && _globals[kHoovicAlive] && !_globals[kHoovicSated] && !_hungryFl && !_beforeEatingRex) {
+	if (_game._player._moving && (_scene->_rails.getNext() > 0) && _globals[kHoovicAlive] && !_globals[kHoovicSated] && !local._hungryFl && !local._beforeEatingRex) {
 		_game._player.cancelCommand();
 		_game._player.startWalking(Common::Point(160, 32), FACING_EAST);
 		_scene->_rails.resetNext();
-		_hungryFl = true;
+		local._hungryFl = true;
 	}
 
-	if (_eatingFirstFish && (_scene->_sequences[_globals._sequenceIndexes[10]]._position.x >= 178)) {
+	if (local._eatingFirstFish && (_scene->_sequences[_globals._sequenceIndexes[10]]._position.x >= 178)) {
 		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 4, 1, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 4);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 29, 72);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 29, 73);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[10], _globals._sequenceIndexes[9]);
-		_eatingFirstFish = false;
+		local._eatingFirstFish = false;
 		_game._player._stepEnabled = true;
 		_vm->_sound->command(34);
 	}
@@ -208,7 +195,7 @@ void Room109::step() {
 	}
 }
 
-void Room109::preActions() {
+static void room_109_pre_parser() {
 	if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_WEST))
 		_game._player._walkOffScreenSceneId = 108;
 
@@ -228,10 +215,10 @@ void Room109::preActions() {
 		&& (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (_action.isObject(NOUN_TUNNEL)))
 		_game._player._walkOffScreenSceneId = 110;
 
-	_hungryFl = false;
+	local._hungryFl = false;
 }
 
-void Room109::actions() {
+static void room_109_parser() {
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(10912);
 		_action._inProgress = false;
@@ -240,29 +227,29 @@ void Room109::actions() {
 
 	if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE)) && (_action.isTarget(NOUN_SMALL_HOLE) || _action.isTarget(NOUN_TUNNEL))) {
 		if (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER)) {
-			_throwingObjectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
-			if (_throwingObjectId >= 0) {
-				if ((_game._objects.isInInventory(_throwingObjectId) && _globals[kHoovicAlive]) || _rexThrowingObject) {
+			local._throwingObjectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+			if (local._throwingObjectId >= 0) {
+				if ((_game._objects.isInInventory(local._throwingObjectId) && _globals[kHoovicAlive]) || local._rexThrowingObject) {
 					switch (_game._trigger) {
 					case 0:
-						_rexThrowingObject = true;
-						_hoovicDifficultFl = false;
-						_game._objects.setRoom(_throwingObjectId, NOWHERE);
+						local._rexThrowingObject = true;
+						local._hoovicDifficultFl = false;
+						_game._objects.setRoom(local._throwingObjectId, NOWHERE);
 						_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1, 0, 0);
 						_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[0]);
 						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 						_game._player._visible = false;
 						_game._player._stepEnabled = false;
 
-						switch (_throwingObjectId) {
+						switch (local._throwingObjectId) {
 						case OBJ_DEAD_FISH:
 						case OBJ_STUFFED_FISH:
 							_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', 1));
 							break;
 
 						case OBJ_BURGER:
-							_hoovicDifficultFl = (_game._difficulty == DIFFICULTY_HARD);
-							_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', (_hoovicDifficultFl ? 3 : 1)));
+							local._hoovicDifficultFl = (_game._difficulty == DIFFICULTY_HARD);
+							_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', (local._hoovicDifficultFl ? 3 : 1)));
 							break;
 
 						default:
@@ -274,18 +261,18 @@ void Room109::actions() {
 
 					case 1:
 						_game._player._visible = true;
-						_hoovicTrigger = 4;
-						switch (_throwingObjectId) {
+						local._hoovicTrigger = 4;
+						switch (local._throwingObjectId) {
 						case OBJ_BURGER:
-							_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, (_hoovicDifficultFl ? 4 : 6), 1, 0, 0);
+							_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, (local._hoovicDifficultFl ? 4 : 6), 1, 0, 0);
 							_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 2, 2);
-							if (_hoovicDifficultFl) {
+							if (local._hoovicDifficultFl) {
 								_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 30);
 								_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
 							} else {
 								_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 								_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
-								_hoovicTrigger = 3;
+								local._hoovicTrigger = 3;
 							}
 							break;
 						case OBJ_DEAD_FISH:
@@ -295,7 +282,7 @@ void Room109::actions() {
 						case OBJ_STUFFED_FISH:
 							_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
 							_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 2);
-							_hoovicTrigger = 3;
+							local._hoovicTrigger = 3;
 							break;
 						default:
 							break;
@@ -303,13 +290,13 @@ void Room109::actions() {
 						break;
 
 					case 2:
-						if (_hoovicDifficultFl)
+						if (local._hoovicDifficultFl)
 							_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 4, 2, 0, 0);
 						else
 							_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 4, 1, 0, 0);
 
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 4);
-						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, _hoovicTrigger);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, local._hoovicTrigger);
 						_vm->_sound->command(34);
 						break;
 
@@ -332,7 +319,7 @@ void Room109::actions() {
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
 							_scene->changeVariant(1);
 						} else {
-							if (_throwingObjectId == OBJ_DEAD_FISH) {
+							if (local._throwingObjectId == OBJ_DEAD_FISH) {
 								++_globals[kHoovicFishEaten];
 								int threshold;
 								switch (_game._difficulty) {
@@ -368,7 +355,7 @@ void Room109::actions() {
 						}
 
 						_game._player._stepEnabled = true;
-						_rexThrowingObject = false;
+						local._rexThrowingObject = false;
 						break;
 
 					case 5:
@@ -413,7 +400,7 @@ void Room109::actions() {
 					}
 					_action._inProgress = false;
 					return;
-				} else if (_game._objects.isInInventory(_throwingObjectId)) {
+				} else if (_game._objects.isInInventory(local._throwingObjectId)) {
 					// Nothing.
 				}
 			}
@@ -454,6 +441,35 @@ void Room109::actions() {
 	_action._inProgress = false;
 }
 
+void room_109_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._rexThrowingObject);
+	s.syncAsByte(local._hoovicDifficultFl);
+	s.syncAsByte(local._beforeEatingRex);
+	s.syncAsByte(local._eatingRex);
+	s.syncAsByte(local._hungryFl);
+	s.syncAsByte(local._eatingFirstFish);
+	s.syncAsSint32LE(local._throwingObjectId);
+	s.syncAsSint32LE(local._hoovicTrigger);
+}
+
+void room_109_preload() {
+	room_init_code_pointer = room_109_init;
+	room_pre_parser_code_pointer = room_109_pre_parser;
+	room_parser_code_pointer = room_109_parser;
+	room_daemon_code_pointer = room_109_daemon;
+
+	for (int count = 0; count < 4; ++count) {
+		himem_preload_series(kernel_full_name(109, 'H', count, nullptr, 0), 3);
+	}
+
+	_scene->addActiveVocab(NOUN_DEAD_PURPLE_MONSTER);
+	_scene->addActiveVocab(NOUN_MONSTER_SLUDGE);
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room110.cpp b/engines/mads/madsv2/nebular/rooms/room110.cpp
index 354d31c05e2..4fc31470b28 100644
--- a/engines/mads/madsv2/nebular/rooms/room110.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room110.cpp
@@ -19,39 +19,33 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room110::Room110(RexNebularEngine *vm) : Room1xx(vm) {
-	_crabsFl = false;
-}
-
-void Room110::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
-
-	s.syncAsByte(_crabsFl);
-}
+struct Scratch {
+	bool _crabsFl;
+};
 
-void Room110::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
+static Scratch local;
 
-	_scene->addActiveVocab(NOUN_CRAB);
-}
 
-void Room110::enter() {
+static void room_110_init() {
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 3));
 
-	_crabsFl = false;
+	local._crabsFl = false;
 
 	if (_scene->_priorSceneId == 109) {
 		_game._player._playerPos = Common::Point(59, 71);
@@ -61,7 +55,7 @@ void Room110::enter() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
 
-		_crabsFl = true;
+		local._crabsFl = true;
 
 		int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
@@ -79,26 +73,26 @@ void Room110::enter() {
 		_scene->loadAnimation(Resources::formatName(110, 'T', 1, EXT_AA, ""), 70);
 	}
 
-	sceneEntrySound();
+	section_1_music();
 	_game.loadQuoteSet(0x59, 0);
 
 	if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId == 109))
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(109));
 }
 
-void Room110::step() {
+static void room_110_daemon() {
 	if (_game._trigger == 70) {
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
 	}
 }
 
-void Room110::preActions() {
+static void room_110_pre_parser() {
 	if (_action.isAction(VERB_SWIM_THROUGH, NOUN_CAVE_ENTRANCE))
 		_game._player._walkOffScreenSceneId = 109;
 
-	if (_crabsFl) {
-		_crabsFl = false;
+	if (local._crabsFl) {
+		local._crabsFl = false;
 
 		_scene->_sequences.remove(_globals._sequenceIndexes[0]);
 		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
@@ -121,7 +115,7 @@ void Room110::preActions() {
 	}
 }
 
-void Room110::actions() {
+static void room_110_parser() {
 	if (_action.isAction(VERB_SWIM_THROUGH, NOUN_TUNNEL)) {
 		switch (_game._trigger) {
 		case 0:
@@ -160,6 +154,22 @@ void Room110::actions() {
 	_action._inProgress = false;
 }
 
+void room_110_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._crabsFl);
+}
+
+void room_110_preload() {
+	room_init_code_pointer = room_110_init;
+	room_pre_parser_code_pointer = room_110_pre_parser;
+	room_parser_code_pointer = room_110_parser;
+	room_daemon_code_pointer = room_110_daemon;
+
+	section_1_walker();
+	section_1_interface();
+	_scene->addActiveVocab(NOUN_CRAB);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 91af3bd0002..238d9ffd428 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -69,6 +69,10 @@ int Game::Objects::getIdFromDesc(int desc_id) const {
 	return object_named(desc_id);
 }
 
+void Game::Objects::setRoom(int object_id, int roomNum) {
+	inter_move_object(object_id, roomNum);
+}
+
 void Game::VisitedScenes::add(int roomNum) {
 	player_discover_room(roomNum);
 }
@@ -77,6 +81,10 @@ bool Game::VisitedScenes::exists(int roomNum) const {
 	return player_has_been_in_room(roomNum);
 }
 
+void Game::VisitedScenes::pop_back() {
+	player_undiscover_room();
+}
+
 void Game::loadQuoteSet(int quote1, ...) {
 	va_list va;
 	int id = quote1;
@@ -102,10 +110,18 @@ void Game::Player::startWalking(const Common::Point &pt, int facing) {
 	player_start_walking(pt.x, pt.y, facing);
 }
 
+void Game::Player::walk(const Common::Point &pt, int facing) {
+	player_walk(pt.x, pt.y, facing);
+}
+
 void Game::Player::cancelCommand() {
 	player_cancel_command();
 }
 
+void Game::Player::update() {
+	player_set_image();
+}
+
 char *Resources::formatName(int my_room, char type, int num, int ext, const char *text) {
 	return kernel_full_name(my_room, type, num, text, ext);
 }
@@ -118,6 +134,10 @@ int Scene::Animation::getCurrentFrame() const {
 	error("TODO: Animation::getCurrentFrame");
 }
 
+void Scene::Animation::setNextFrameTimer(long time) {
+	kernel_anim[_id].next_clock = time;
+}
+
 int Scene::DynamicHotspots::add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r) {
 	return kernel_add_dynamic(vocab_id, verb_id, 0, auto_sequence,
 		r.left, r.top, r.width(), r.height());
@@ -152,6 +172,10 @@ void Scene::KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) {
 	kernel_message_teletype(msgIndex, numTicks, quoted);
 }
 
+Scene::KernelMessages::KernelMessageProxy Scene::KernelMessages::Entries::operator[](uint handle) {
+	return KernelMessageProxy(&kernel_message[handle]);
+}
+
 int Scene::Rails::getNext() const {
 	return player.next_special_code;
 }
@@ -164,14 +188,20 @@ int16 Scene::Sprites::addSprites(const char *name, int load_flags) {
 	return kernel_load_series(name, load_flags);
 }
 
-Scene::Sprite &Scene::Sprites::operator[](int idx) {
-	_sprites[idx].setIndex(idx);
-	return _sprites[idx];
+void Scene::Sprites::remove(int sprite_id) {
+	matte_deallocate_series(sprite_id, true);
+}
+
+Scene::Sprite Scene::Sprites::operator[](int idx) {
+	return Scene::Sprite(series_list[idx]);
+}
+
+void Scene::SpriteSlots::clear() {
+	image_marker = 0;
 }
 
-void Scene::Sprite::setIndex(int index) {
-	_index = index;
-	_charInfo._info = series_list[index]->walker;
+void Scene::SpriteSlots::fullRefresh() {
+	matte_refresh_work();
 }
 
 int16 Scene::Sequences::addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
@@ -193,6 +223,10 @@ void Scene::Sequences::remove(int sequence_id) {
 	kernel_seq_delete(sequence_id);
 }
 
+Scene::SequenceProxy Scene::Sequences::operator[](uint sequence_id) {
+	return SequenceProxy(&sequence_list[sequence_id]);
+}
+
 void Scene::Sequences::setDepth(int sequence_id, int depth) {
 	kernel_seq_depth(sequence_id, depth);
 }
@@ -221,10 +255,23 @@ void Scene::Sequences::setPosition(int sequence_id, const Common::Point &pt) {
 	kernel_seq_loc(sequence_id, pt.x, pt.y);
 }
 
+void Scene::Sequences::setMotion(int sequence_id, int flags,
+		int delta_x_times_100, int delta_y_times_100) {
+	kernel_seq_motion(sequence_id, flags, delta_x_times_100, delta_y_times_100);
+}
+
 void Scene::Sequences::updateTimeout(int old_sequence_id, int new_sequence_id) {
 	kernel_seq_copy_timeout(old_sequence_id, new_sequence_id);
 }
 
+void Scene::Sequences::scan() {
+	kernel_seq_full_update();
+}
+
+int Scene::Sequences::startCycle(int srcSpriteIdx, bool flipped, int cycleIndex) {
+	return kernel_seq_stamp(srcSpriteIdx, flipped, cycleIndex);
+}
+
 int Scene::loadAnimation(const char *name, int trigger_code) {
 	return kernel_run_animation(name, trigger_code);
 }
@@ -249,6 +296,10 @@ void Scene::clearSequenceList() {
 	kernel_seq_init();
 }
 
+void Scene::addActiveVocab(int vocab_id) {
+	vocab_make_active(vocab_id);
+}
+
 void VM::Dialogs::show(int id) {
 	text_show(id);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index a69e69a365e..500b53d9ea4 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -26,6 +26,7 @@
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/sprite.h"
+#include "mads/madsv2/core/text.h"
 #include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
@@ -104,6 +105,9 @@ struct Action {
 	bool isObject(int word) const {
 		return isAction(word);
 	}
+	bool isTarget(int word) const {
+		return isAction(word);
+	}
 
 	int &_lookFlag = player.look_around;
 	int &_inProgress = player.command_ready;
@@ -142,6 +146,7 @@ struct Scene {
 		}
 
 		int getCurrentFrame() const;
+		void setNextFrameTimer(long time);
 	};
 	Animation _animation[10];
 
@@ -169,6 +174,17 @@ struct Scene {
 		};
 		TalkFont _talkFont;
 
+		struct KernelMessageProxy {
+			long &_frameTimer;
+
+			KernelMessageProxy(KernelMessagePtr kmsg) : _frameTimer(kmsg->update_time) {
+			}
+		};
+		struct Entries {
+			KernelMessageProxy operator[](uint handle);
+		};
+		Entries _entries;
+
 		int add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 			uint32 timeout, const Common::String &msg);
 		void reset();
@@ -182,6 +198,18 @@ struct Scene {
 	};
 	Rails _rails;
 
+	struct SequenceProxy {
+		struct SequencePosition {
+			int &x;
+			int &y;
+			SequencePosition(int &sx, int &sy) : x(sx), y(sy) {}
+		};
+		SequencePosition _position;
+
+		SequenceProxy(SequencePtr seqPtr) : _position(seqPtr->x, seqPtr->y) {
+		}
+	};
+
 	struct Sequences {
 		int16 addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
 			word start_ticks = 0, int expire = 0);
@@ -190,6 +218,7 @@ struct Scene {
 		int startPingPongCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
 			word start_ticks = 0, int expire = 0);
 		void remove(int sequence_id);
+		SequenceProxy operator[](uint sequence_id);
 
 		int16 addSubEntry(int sequence_id, int trigger_type, int trigger_sprite, int trigger_code);
 		void setDepth(int sequence_id, int depth);
@@ -198,7 +227,10 @@ struct Scene {
 		void addTimer(int ticks, int trigger_code);
 		void setMsgLayout(int sequence_id);
 		void setPosition(int sequence_id, const Common::Point &pt);
+		void setMotion(int sequence_id, int flags, int delta_x_times_100, int delta_y_times_100);
 		void updateTimeout(int old_sequence_id, int new_sequence_id);
+		void scan();
+		int startCycle(int srcSpriteIdx, bool flipped, int cycleIndex);
 	};
 	Sequences _sequences;
 
@@ -210,34 +242,43 @@ struct Scene {
 			const CharInfo *operator->() const {
 				return this;
 			}
-			WalkerInfoPtr _info;
+
+			int16 &_velocity;
+
+			CharInfo(WalkerInfoPtr info) : _velocity(info->velocity) {
+			}
 		};
 		CharInfo _charInfo;
 
+		Sprite(SeriesPtr series) : _charInfo(series->walker) {
+		}
 		Sprite *operator->() {
 			return this;
 		}
 		const Sprite *operator->() const {
 			return this;
 		}
-		int _index;
-
-		void setIndex(int index);
 	};
 
 	struct Sprites {
-		Sprite _sprites[51];
-
 		int16 addSprites(const char *name, int load_flags = 0);
-		Sprite &operator[](int idx);
+		void remove(int sprite_id);
+		Sprite operator[](int idx);
 	};
 	Sprites _sprites;
 
+	struct SpriteSlots {
+		void clear();
+		void fullRefresh();
+	};
+	SpriteSlots _spriteSlots;
+
 	int16 &_priorSceneId = previous_room;
 	int16 &_nextSceneId = new_room;
 	long &_frameStartTime = kernel.clock;
 	byte &_reloadSceneFlag = kernel.force_restart;
 	byte &_roomChanged = kernel.teleported_in;
+	int &_currentSceneId = room_id;
 
 	int loadAnimation(const char *name, int trigger_code);
 	void freeAnimation();
@@ -245,6 +286,7 @@ struct Scene {
 	void drawElements(int transitionType, bool surfaceFlag);
 	void resetScene();
 	void clearSequenceList();
+	void addActiveVocab(int vocab_id);
 };
 extern Scene _scene;
 
@@ -261,6 +303,7 @@ struct Game {
 		bool isInRoom(int object_id) const;
 		bool isInInventory(int object_id) const;
 		int getIdFromDesc(int desc_id) const;
+		void setRoom(int object_id, int roomNum);
 	};
 	Objects _objects;
 
@@ -320,9 +363,13 @@ struct Game {
 		int &_walkOffScreenSceneId = player.walk_off_edge_to_room;
 		int &_prepareWalkFacing = player.prepare_walk_facing;
 		int &_spritesStart = player.series_base;
+		int &_frameNumber = player.sprite;
+		int &_forceRefresh = player.sprite_changed;
 
 		void startWalking(const Common::Point &pt, int facing);
+		void walk(const Common::Point &pt, int facing);
 		void cancelCommand();
+		void update();
 	};
 	Player _player;
 
@@ -333,6 +380,7 @@ struct Game {
 
 		void add(int roomNum);
 		bool exists(int roomNum) const;
+		void pop_back();
 	};
 	VisitedScenes _visitedScenes;
 
@@ -361,6 +409,25 @@ struct VM {
 	}
 
 	struct Dialogs {
+		struct DefaultPosition {
+			int &x = text_default_x;
+			int &y = text_default_y;
+
+			DefaultPosition &operator=(const Common::Point &pt) {
+				x = pt.x;
+				y = pt.y;
+				return *this;
+			}
+			operator Common::Point() {
+				return Common::Point(x, y);
+			}
+
+			bool operator==(const Common::Point &rhs) const {
+				return x == rhs.x && y == rhs.y;
+			}
+		};
+		DefaultPosition _defaultPosition;
+
 		Dialogs *operator->() {
 			return this;
 		}
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 31dbbcfcc06..8e2e1dd9816 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -79,6 +79,11 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room103.o \
 	madsv2/nebular/rooms/room104.o \
 	madsv2/nebular/rooms/room105.o \
+	madsv2/nebular/rooms/room106.o \
+	madsv2/nebular/rooms/room107.o \
+	madsv2/nebular/rooms/room108.o \
+	madsv2/nebular/rooms/room109.o \
+	madsv2/nebular/rooms/room110.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \


Commit: b51a93fd801bdbf30c4af71816b5041e383b02a3
    https://github.com/scummvm/scummvm/commit/b51a93fd801bdbf30c4af71816b5041e383b02a3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:42+10:00

Commit Message:
MADS: NEBULAR: Implemented rooms 111 and 112

Changed paths:
    engines/mads/madsv2/nebular/rooms/room111.cpp
    engines/mads/madsv2/nebular/rooms/room112.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room111.cpp b/engines/mads/madsv2/nebular/rooms/room111.cpp
index 13b1fe0a36e..651919fd710 100644
--- a/engines/mads/madsv2/nebular/rooms/room111.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room111.cpp
@@ -19,39 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Room111::Room111(RexNebularEngine *vm) : Room1xx(vm) {
-	_stampedFl = false;
-	_launch1Fl = false;
-	_launched2Fl = false;
-	_rexDivingFl = false;
-}
-
-void Room111::synchronize(Common::Serializer &s) {
-	Room1xx::synchronize(s);
-
-	s.syncAsByte(_stampedFl);
-	s.syncAsByte(_launch1Fl);
-	s.syncAsByte(_launched2Fl);
-	s.syncAsByte(_rexDivingFl);
-}
+struct Scratch {
+	bool _stampedFl;
+	bool _launch1Fl;
+	bool _launched2Fl;
+	bool _rexDivingFl;
+};
 
-void Room111::setup() {
-	_scene->addActiveVocab(NOUN_BATS);
+static Scratch local;
 
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Room111::enter() {
+static void room_111_init() {
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
@@ -78,9 +69,9 @@ void Room111::enter() {
 	idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 
-	_launch1Fl = false;
-	_launched2Fl = false;
-	_stampedFl = false;
+	local._launch1Fl = false;
+	local._launched2Fl = false;
+	local._stampedFl = false;
 
 	if ((_scene->_priorSceneId < 201) && (_scene->_priorSceneId != RETURNING_FROM_DIALOG)) {
 		_game._player._stepEnabled = false;
@@ -89,8 +80,8 @@ void Room111::enter() {
 		_game._player._playerPos = Common::Point(234, 116);
 		_game._player._facing = FACING_EAST;
 
-		_launch1Fl = true;
-		_launched2Fl = true;
+		local._launch1Fl = true;
+		local._launched2Fl = true;
 
 		_vm->_sound->command(36);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
@@ -98,21 +89,21 @@ void Room111::enter() {
 		_game._player._facing = FACING_WEST;
 	}
 
-	_rexDivingFl = false;
+	local._rexDivingFl = false;
 
-	sceneEntrySound();
+	section_1_music();
 }
 
-void Room111::step() {
+static void room_111_daemon() {
 	if (_game._trigger == 70) {
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
-		_launch1Fl = false;
-		_launched2Fl = false;
+		local._launch1Fl = false;
+		local._launched2Fl = false;
 	}
 
-	if ((_game._trigger == 71) && !_stampedFl) {
-		_stampedFl = true;
+	if ((_game._trigger == 71) && !local._stampedFl) {
+		local._stampedFl = true;
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 18, 1, 0, 0);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
 	}
@@ -122,42 +113,42 @@ void Room111::step() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 20);
 	}
 
-	if (!_launch1Fl && (_vm->getRandomNumber(1, 5000) == 1)) {
+	if (!local._launch1Fl && (_vm->getRandomNumber(1, 5000) == 1)) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
-		_launch1Fl = true;
+		local._launch1Fl = true;
 		int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 	}
 
-	if (!_launched2Fl && (_vm->getRandomNumber(1, 30000) == 1)) {
+	if (!local._launched2Fl && (_vm->getRandomNumber(1, 30000) == 1)) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 0, 0);
 		int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
-		_launched2Fl = true;
+		local._launched2Fl = true;
 	}
 
 	if (_game._trigger == 73)
 		_vm->_sound->command(37);
 
-	if (_rexDivingFl && (_scene->_animation[0]->getCurrentFrame() >= 9)) {
+	if (local._rexDivingFl && (_scene->_animation[0]->getCurrentFrame() >= 9)) {
 		_vm->_sound->command(36);
-		_rexDivingFl = false;
+		local._rexDivingFl = false;
 	}
 }
 
-void Room111::preActions() {
+static void room_111_pre_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
 		_game._player._walkOffScreenSceneId = 212;
 }
 
-void Room111::actions() {
+static void room_111_parser() {
 	if (_action.isAction(VERB_DIVE_INTO, NOUN_POOL) && _game._objects.isInInventory(OBJ_REBREATHER)) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(Resources::formatName(111, 'A', 1, EXT_AA, ""), 1);
-			_rexDivingFl = true;
+			local._rexDivingFl = true;
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			break;
@@ -187,6 +178,25 @@ void Room111::actions() {
 	_action._inProgress = false;
 }
 
+void room_111_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._stampedFl);
+	s.syncAsByte(local._launch1Fl);
+	s.syncAsByte(local._launched2Fl);
+	s.syncAsByte(local._rexDivingFl);
+}
+
+void room_111_preload() {
+	room_init_code_pointer = room_111_init;
+	room_pre_parser_code_pointer = room_111_pre_parser;
+	room_parser_code_pointer = room_111_parser;
+	room_daemon_code_pointer = room_111_daemon;
+
+	_scene->addActiveVocab(NOUN_BATS);
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room112.cpp b/engines/mads/madsv2/nebular/rooms/room112.cpp
index 358c475467f..05e08cb94af 100644
--- a/engines/mads/madsv2/nebular/rooms/room112.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room112.cpp
@@ -19,22 +19,21 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room102.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Room112::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Room112::enter() {
-	sceneEntrySound();
+static void room_112_init() {
+	section_1_music();
 
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
@@ -54,7 +53,7 @@ void Room112::enter() {
 	_scene->loadAnimation(Resources::formatName(112, 'X', -1, EXT_AA, ""), 70);
 }
 
-void Room112::step() {
+static void room_112_daemon() {
 	if ((_scene->_animation[0] != nullptr) && (_game._storyMode == STORYMODE_NICE)) {
 		if (_scene->_animation[0]->getCurrentFrame() >= 54) {
 			_scene->freeAnimation();
@@ -75,6 +74,25 @@ void Room112::step() {
 	}
 }
 
+static void room_112_pre_parser() {
+	// No implementation
+}
+
+static void room_112_parser() {
+	// No implementation
+}
+
+void room_112_preload() {
+	room_init_code_pointer = room_112_init;
+	room_pre_parser_code_pointer = room_112_pre_parser;
+	room_parser_code_pointer = room_112_parser;
+	room_daemon_code_pointer = room_112_daemon;
+
+	section_1_walker();
+	section_1_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 238d9ffd428..7691677ddf0 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -204,6 +204,14 @@ void Scene::SpriteSlots::fullRefresh() {
 	matte_refresh_work();
 }
 
+void Scene::UserInterface::emptyConversationList() {
+	inter_reset_dialog();
+}
+
+void Scene::UserInterface::setup(int inputMode) {
+	kernel_set_interface_mode(inputMode);
+}
+
 int16 Scene::Sequences::addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
 	word start_ticks, int expire) {
 	return kernel_seq_forward(series_id, mirror, ticks, interval_ticks, start_ticks, expire);
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 500b53d9ea4..cc32935da97 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -23,6 +23,7 @@
 #define MADS_NEBULAR_ROOMS_THUNKS_H
 
 #include "common/rect.h"
+#include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/sprite.h"
@@ -39,6 +40,12 @@ enum EXTTYPE {
 	EXT_ART = 5, EXT_INT = 6
 };
 
+enum InputMode {
+	kInputBuildingSentences = INTER_BUILDING_SENTENCES,
+	kInputConversation = INTER_CONVERSATION,
+	kInputLimitedSentences = INTER_LIMITED_SENTENCES
+};
+
 enum SequenceTrigger {
 	SEQUENCE_TRIGGER_EXPIRE = KERNEL_TRIGGER_EXPIRE,	// Trigger when the sequence finishes
 	SEQUENCE_TRIGGER_LOOP = KERNEL_TRIGGER_LOOP,		// Trigger when the sequence loops
@@ -273,6 +280,12 @@ struct Scene {
 	};
 	SpriteSlots _spriteSlots;
 
+	struct UserInterface {
+		void emptyConversationList();
+		void setup(int inputMode);
+	};
+	UserInterface _userInterface;
+
 	int16 &_priorSceneId = previous_room;
 	int16 &_nextSceneId = new_room;
 	long &_frameStartTime = kernel.clock;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 8e2e1dd9816..ee39a9f77a3 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -84,6 +84,8 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room108.o \
 	madsv2/nebular/rooms/room109.o \
 	madsv2/nebular/rooms/room110.o \
+	madsv2/nebular/rooms/room111.o \
+	madsv2/nebular/rooms/room112.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \


Commit: 12e8b67cf56b220d1643e338936030187bd9e392
    https://github.com/scummvm/scummvm/commit/12e8b67cf56b220d1643e338936030187bd9e392
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:42+10:00

Commit Message:
MADS: NEBULAR: Implementing section 2 rooms

Changed paths:
  A engines/mads/madsv2/nebular/conversation.cpp
  A engines/mads/madsv2/nebular/conversation.h
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/core/quote.cpp
    engines/mads/madsv2/core/quote.h
    engines/mads/madsv2/nebular/global.cpp
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/rooms/room201.cpp
    engines/mads/madsv2/nebular/rooms/room202.cpp
    engines/mads/madsv2/nebular/rooms/room203.cpp
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room208.cpp
    engines/mads/madsv2/nebular/rooms/room209.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room211.cpp
    engines/mads/madsv2/nebular/rooms/room212.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp
    engines/mads/madsv2/nebular/rooms/room214.cpp
    engines/mads/madsv2/nebular/rooms/room215.cpp
    engines/mads/madsv2/nebular/rooms/room216.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk
    engines/mads/nebular/core/events.h
    engines/mads/nebular/core/user_interface.cpp
    engines/mads/nebular/core/user_interface.h


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 8d921553871..db813594fed 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2599,10 +2599,9 @@ void kernel_random_purge() {
 	}
 }
 
-void kernel_random_messages_init(int max_messages_at_once,
+void kernel_random_messages_vinit(int max_messages_at_once,
 		int min_x, int max_x, int min_y, int max_y, int min_y_spacing,
-		int teletype_rate, int color, int duration, int quote_id, ...) {
-	va_list marker;
+		int teletype_rate, int color, int duration, int quote_id, va_list marker) {
 	int my_quote = quote_id;
 
 	random_max_messages = max_messages_at_once;
@@ -2617,7 +2616,6 @@ void kernel_random_messages_init(int max_messages_at_once,
 
 	random_quote_list_size = 0;
 
-	va_start(marker, quote_id);
 	while (my_quote > 0) {
 		if (random_quote_list_size < KERNEL_MAX_RANDOM_QUOTES) {
 			random_quote_list[random_quote_list_size++] = my_quote;
@@ -2630,6 +2628,16 @@ void kernel_random_messages_init(int max_messages_at_once,
 	kernel_random_purge();
 }
 
+void kernel_random_messages_init(int max_messages_at_once,
+	int min_x, int max_x, int min_y, int max_y, int min_y_spacing,
+	int teletype_rate, int color, int duration, int quote_id, ...) {
+	va_list marker;
+	va_start(marker, quote_id);
+	kernel_random_messages_vinit(max_messages_at_once, min_x, max_x, min_y, max_y,
+		min_y_spacing, teletype_rate, color, duration, quote_id, marker);
+	va_end(marker);
+}
+
 int kernel_check_random() {
 	int count;
 	int sum = 0;
diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index 5b574b76ba3..fae3c5e7c0f 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -589,6 +589,9 @@ extern void kernel_random_messages_init(int max_messages_at_once,
 	int min_x, int max_x, int min_y, int max_y,
 	int min_y_spacing, int teletype_rate, int color,
 	int duration, int quote_id, ...);
+extern void kernel_random_messages_vinit(int max_messages_at_once,
+	int min_x, int max_x, int min_y, int max_y, int min_y_spacing,
+	int teletype_rate, int color, int duration, int quote_id, va_list marker);
 
 /**
  * Returns the number of idle chatter messages currently being displayed.
diff --git a/engines/mads/madsv2/core/quote.cpp b/engines/mads/madsv2/core/quote.cpp
index 781ca344106..1e1c6953be4 100644
--- a/engines/mads/madsv2/core/quote.cpp
+++ b/engines/mads/madsv2/core/quote.cpp
@@ -34,6 +34,14 @@ int quote_emergency = false;
 
 char *quote_load(int quote_id, ...) {
 	va_list marker;
+	va_start(marker, quote_id);
+	char *result = quote_vload(quote_id, marker);
+	va_end(marker);
+
+	return result;
+}
+
+char *quote_load(int quote_id, va_list marker) {
 	int quote_error = 0;
 	int id;
 	int mark;
diff --git a/engines/mads/madsv2/core/quote.h b/engines/mads/madsv2/core/quote.h
index fda524410e8..7ef8d50eb06 100644
--- a/engines/mads/madsv2/core/quote.h
+++ b/engines/mads/madsv2/core/quote.h
@@ -32,6 +32,7 @@ namespace MADSV2 {
 extern int quote_emergency;
 
 extern char *quote_load(int quote_id, ...);
+extern char *quote_vload(int quote_id, va_list args);
 extern char *quote_string(char *quote_list, int quote_id);
 extern void quote_split_string(const char *source, char *target1, char *target2);
 
diff --git a/engines/mads/madsv2/nebular/conversation.cpp b/engines/mads/madsv2/nebular/conversation.cpp
new file mode 100644
index 00000000000..9693399705b
--- /dev/null
+++ b/engines/mads/madsv2/nebular/conversation.cpp
@@ -0,0 +1,126 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/inter.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/nebular/conversation.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+void Conversation::setup(int globalId, ...) {
+	va_list va;
+	va_start(va, globalId);
+
+	// Load the list of conversation quotes
+	_count = 0;
+
+	int quoteId = va_arg(va, int);
+	while (quoteId > 0) {
+		_quotes[++_count] = quoteId;
+		quoteId = va_arg(va, int);
+	}
+	va_end(va);
+
+	if (quoteId < 0) {
+		// For an ending value of -1, also initial the bitflags for the global
+		// associated with the conversation entry, which enables all the quote Ids
+		global[globalId] = -1;
+	}
+
+	_globalId = globalId;
+}
+
+void Conversation::set(int quoteId, ...) {
+	global[_globalId] = 0;
+
+	va_list va;
+	va_start(va, quoteId);
+
+	// Loop through handling each quote
+	while (quoteId > 0) {
+		for (uint idx = 0; idx < _count; ++idx) {
+			if (_quotes[idx] == quoteId) {
+				// Found index, so set that bit in the global keeping track of conversation state
+				global[_globalId] |= 1 << idx;
+				break;
+			}
+		}
+
+		quoteId = va_arg(va, int);
+	}
+
+	va_end(va);
+}
+
+int Conversation::read(int quoteId) {
+	uint16 flags = global[_globalId];
+	int count = 0;
+
+	for (uint idx = 0; idx < _count; ++idx) {
+		if (flags & (1 << idx))
+			++count;
+
+		if (_quotes[idx] == quoteId)
+			return flags & (1 << idx);
+	}
+
+	// Could not find it, simply return number of active quotes
+	return count;
+}
+
+void Conversation::write(int quoteId, bool flag) {
+	for (uint idx = 0; idx < _count; ++idx) {
+		if (_quotes[idx] == quoteId) {
+			// Found index, so set or clear the flag
+			if (flag) {
+				// Set bit
+				global[_globalId] |= 1 << idx;
+			} else {
+				// Clear bit
+				global[_globalId] &= ~(1 << idx);
+			}
+			return;
+		}
+	}
+}
+
+void Conversation::start() {
+	inter_reset_dialog();
+
+	// Loop through each of the quotes loaded into the conversation
+	for (uint idx = 0; idx < _count; ++idx) {
+		// Check whether the given quote is enabled or not
+		if (global[_globalId] & (1 << idx)) {
+			// Quote enabled, so add it to the list of talk selections
+			inter_add_dialog(quote_string(kernel.quotes, _quotes[idx]), _quotes[idx]);
+		}
+	}
+
+	kernel_set_interface_mode(INTER_CONVERSATION);
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/conversation.h b/engines/mads/madsv2/nebular/conversation.h
new file mode 100644
index 00000000000..516069bc8d5
--- /dev/null
+++ b/engines/mads/madsv2/nebular/conversation.h
@@ -0,0 +1,71 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_CONVERATION_H
+#define MADS_NEBULAR_CONVERATION_H
+
+#include "mads/madsv2/engine.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+#define MAX_CONV_MESSAGE 10
+#define INDEFINITE_TIMEOUT 9999999
+
+class Conversation {
+public:
+	int _globalId;
+	int _count;
+	int16 _quotes[MAX_CONV_MESSAGE];
+
+	/**
+	 * Set up a conversation sequence
+	 */
+	void setup(int globalId, ...);
+
+	/**
+	 * Activates the passed set of quotes in the given conversation node
+	 */
+	void set(int quoteId, ...);
+
+	/**
+	 * Returns the bit for a given quote to indicate whether it's active or not or,
+	 * if 0 is passed, returns the number of currently active quotes
+	 */
+	int read(int quoteId);
+
+	/**
+	 * Activates or deactivates the specified quote in the given conversation node
+	 */
+	void write(int quoteId, bool flag);
+
+	/**
+	 * Starts the conversation
+	 */
+	void start();
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/global.cpp b/engines/mads/madsv2/nebular/global.cpp
index 402d6aa4bab..c9981cf535d 100644
--- a/engines/mads/madsv2/nebular/global.cpp
+++ b/engines/mads/madsv2/nebular/global.cpp
@@ -29,6 +29,8 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
+Conversation _dialog1;
+
 // Section preloads
 extern void section_1_preload();
 extern void section_2_preload();
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index 01dc834274c..ebf506afd9b 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -24,6 +24,7 @@
 
 #include "common/serializer.h"
 #include "mads/madsv2/core/vocabh.h"
+#include "mads/madsv2/nebular/conversation.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -215,18 +216,117 @@ enum {
 	SEX_MALE = 0, SEX_UNKNOWN = 1, SEX_FEMALE = 2
 };
 
-enum ScrCategory {
-	CAT_NONE = 0,
-	CAT_COMMAND = 1,
-	CAT_INV_LIST = 2,
-	CAT_INV_VOCAB = 3,
-	CAT_HOTSPOT = 4,
-	CAT_INV_ANIM = 5,
-	CAT_TALK_ENTRY = 6,
-	CAT_INV_SCROLLER = 7,
-	CAT_12 = 12
+
+// Enums used for specific individual globals
+// Section #1
+// Rex's sex/swimming state
+enum {
+	REX_MALE = 0, REX_MALE_SWIMMER = 1, REX_FEMALE = 2
+};
+
+// Section #2
+// State of Meteorologist in the outpost
+enum {
+	METEOROLOGIST_ABSENT = 0, METEOROLOGIST_PRESENT = 1, METEOROLOGIST_GONE = 2
+};
+
+// State of watching the Meteorologist
+enum {
+	METEOROLOGIST_NORMAL = 0, METEOROLOGIST_GROUND = 1, METEOROLOGIST_TOWER = 2
+};
+
+// The fat bouncy lady that can squish you on the plains
+enum {
+	RHOTUNDA_HUNGRY = 0, RHOTUNDA_STUCK = 1, RHOTUNDA_GONE = 2
+};
+
+// Flags for the bones you can take
+enum {
+	BONE_202_LEFT_GONE = 1, BONE_202_RIGHT_GONE = 2
 };
 
+// Leaves used to cover the trap
+enum {
+	LEAVES_ON_GROUND = 0, LEAVES_WITH_PLAYER = 1, LEAVES_ON_TRAP = 2
+};
+
+// Monkey ambush state
+enum {
+	MONKEY_AMBUSH_READY = 0, MONKEY_HAS_BINOCULARS = 1, MONKEY_IS_GONE = 2
+};
+
+// Teleporter status flags
+enum {
+	TELEPORTER_NONE = 0, TELEPORTER_BEAM_IN = 1, TELEPORTER_BEAM_OUT = 2,
+	TELEPORTER_STEP_OUT = 3, TELEPORTER_WRONG = 4
+};
+
+// Twinkles status
+enum {
+	TWINKLES_AT_HOME = 0, TWINKLES_GONE = 1
+};
+
+// Section #4
+// Status of the explosives
+enum {
+	EXPLOSIVES_INSIDE = 3
+};
+
+// Section #5
+// Dog status (room 602, outside Abdul's garage)
+enum {
+	DOG_PRESENT = 1, DOG_LEFT = 2, DOG_GONE = 3, DOG_DEAD = 4
+};
+
+// Dog status (room 608, inside Abdul's garage)
+enum {
+	CAR_UP = 0, CAR_SQUASHES_DOG = 1, CAR_SQUASHES_DOG_AGAIN = 2, CAR_DOWN = 3, CAR_DOWN_ON_SQUASHED_DOG = 4
+};
+
+enum {
+	SAFE_CLOSED = 0, SAFE_OPENED = 1, SAFE_CLOSED_WITH_HOLE = 2, SAFE_OPENED_WITH_HOLE = 3
+};
+
+enum {
+	LINE_NOT_DROPPED = 1, LINE_DROPPED = 2, LINE_TIED = 3, LINE_NOW_UNTIED = 4
+};
+
+// Section #6
+enum {
+	NO_CELLS = 0,				// Handset doesn't contain any cells
+	CHARGED_DURAFAIL = 1,		// Handset has charged durafail cells
+	UNCHARGED_DURAFAIL = 2,		// Handset has uncharged durafail cells */
+	PHONE_CELLS = 3,			// Handset has already charged phone cells
+	FIRST_TIME_PHONE_CELLS = 4,	// First time phone cells are in the handset
+	FIRST_TIME_UNCHARGED_DURAFAIL = 5,	// First time uncharged cells are in penlight
+	FIRST_TIME_CHARGED_DURAFAIL = 6		// First time charged cells are in penlight
+};
+
+// Time bomb status
+enum {
+	TIMEBOMB_DEACTIVATED = 0, TIMEBOMB_ACTIVATED = 1,
+	TIMEBOMB_BLOW_UP = 2, TIMEBOMB_DEAD = 3
+};
+
+/* Section #7 */
+// Status of the bottle
+enum {
+	BOTTLE_EMPTY = 0, BOTTLE_ONE_QUARTER_FULL = 1, BOTTLE_HALF_FULL = 2,
+	BOTTLE_THREE_QUARTERS_FULL = 3, BOTTLE_FULL = 4
+};
+
+// Status of the boat
+enum {
+	BOAT_UNFLOODED = 0, BOAT_ADRIFT = 1, BOAT_TIED_FLOATING = 2,
+	BOAT_TIED = 3, BOAT_GONE = 4
+};
+
+/* Miscellaneous defines */
+#define TELEPORTER_COUNT 10      // Total number of teleporters
+#define TELEPORTER_WORK_COUNT 6  // Total number that actually work
+
+extern Conversation _dialog1;
+
 extern void global_section_constructor();
 extern void sync_room(Common::Serializer &s);
 
diff --git a/engines/mads/madsv2/nebular/rooms/room201.cpp b/engines/mads/madsv2/nebular/rooms/room201.cpp
index df91f04f7f2..4d060adb027 100644
--- a/engines/mads/madsv2/nebular/rooms/room201.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room201.cpp
@@ -19,35 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"	q	
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene201::Scene201(RexNebularEngine *vm) : Scene2xx(vm) {
-	_pterodactylFlag = false;
-}
-
-void Scene201::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
+struct Scratch {
+	bool _pterodactylFlag;
+};
 
-	s.syncAsByte(_pterodactylFlag);
-}
+static Scratch local;
 
-void Scene201::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
 
-	_scene->addActiveVocab(NOUN_SWOOPING_CREATURE);
-	_scene->addActiveVocab(NOUN_BIRDS);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
-
-void Scene201::enter() {
+static void room_201_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', -1));
@@ -113,28 +105,28 @@ void Scene201::enter() {
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, 12);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 12, 70);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
-		_pterodactylFlag = false;
+		local._pterodactylFlag = false;
 		_game._player.walk(Common::Point(157, 143), FACING_NORTH);
 		_vm->_palette->setEntry(252, 45, 63, 45);
 		_vm->_palette->setEntry(253, 20, 45, 20);
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 2, 0, 120, _game.getQuote(90));
 	} else
-		_pterodactylFlag = true;
+		local._pterodactylFlag = true;
 
 	if (_globals[kTeleporterUnderstood])
 		_scene->_hotspots.activate(NOUN_STRANGE_DEVICE, false);
 
-	sceneEntrySound();
+	section_2_music();
 }
 
-void Scene201::step() {
-	if (_pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) {
+static void room_201_daemon() {
+	if (local._pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 6, 0);
 		int idx = _scene->_dynamicHotspots.add(351, 13, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(270, 80), FACING_EAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
 		_vm->_sound->command(14);
-		_pterodactylFlag = false;
+		local._pterodactylFlag = false;
 	}
 
 	if (_game._trigger == 70) {
@@ -201,7 +193,7 @@ void Scene201::step() {
 	}
 }
 
-void Scene201::actions() {
+static void room_201_parser() {
 	if (_action._lookFlag == false) {
 		if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
 			_scene->_nextSceneId = 202;
@@ -247,6 +239,24 @@ void Scene201::actions() {
 	_action._inProgress = false;
 }
 
+void room_201_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._pterodactylFlag);
+}
+
+void room_201_preload() {
+	room_init_code_pointer = room_201_init;
+	room_parser_code_pointer = room_201_parser;
+	room_daemon_code_pointer = room_201_daemon;
+
+	section_2_walker();
+	section_2_interface();
+
+	_scene->addActiveVocab(NOUN_SWOOPING_CREATURE);
+	_scene->addActiveVocab(NOUN_BIRDS);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index ff5c26caf47..394c62575de 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -19,65 +19,39 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene202::Scene202(RexNebularEngine *vm) : Scene2xx(vm) {
-	_activeMsgFl = false;
-	_ladderTopFl = false;
-	_waitingMeteoFl = false;
-	_ladderHotspotId = -1;
-	_meteoClock1 = 0;
-	_meteoClock2 = 0;
-	_toStationFl = false;
-	_toTeleportFl = false;
-	_lastRoute = 0;
-	_stationCounter = 0;
-	_meteoFrame = 0;
-	_startTime = 0;
-	_meteorologistSpecial = false;
-}
-
-void Scene202::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
-
-	s.syncAsByte(_activeMsgFl);
-	s.syncAsByte(_ladderTopFl);
-	s.syncAsByte(_waitingMeteoFl);
-	s.syncAsByte(_toStationFl);
-	s.syncAsByte(_toTeleportFl);
-
-	s.syncAsSint32LE(_ladderHotspotId);
-	s.syncAsSint32LE(_lastRoute);
-	s.syncAsSint32LE(_stationCounter);
-	s.syncAsSint32LE(_meteoFrame);
-
-	s.syncAsUint32LE(_meteoClock1);
-	s.syncAsUint32LE(_meteoClock2);
-	s.syncAsUint32LE(_startTime);
-
-	s.syncAsByte(_meteorologistSpecial);
-}
-
-void Scene202::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-
-	_scene->addActiveVocab(NOUN_LADDER);
-	_scene->addActiveVocab(VERB_CLIMB_DOWN);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_BONE);
-	_scene->addActiveVocab(NOUN_SKULL);
-	_scene->addActiveVocab(NOUN_BROKEN_LADDER);
-}
-
-void Scene202::enter() {
+namespace Rooms {
+
+struct Scratch {
+	bool _activeMsgFl;
+	bool _ladderTopFl;
+	bool _waitingMeteoFl;
+	bool _toStationFl;
+	bool _toTeleportFl;
+	long _ladderHotspotId;
+	long _lastRoute;
+	long _stationCounter;
+	long _meteoFrame;
+	long _meteoClock1;
+	long _meteoClock2;
+	long _startTime;
+	byte _meteorologistSpecial;
+};
+
+static Scratch local;
+
+
+static void room_202_init() {
 	_game._player._beenVisible = true;
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
@@ -136,19 +110,19 @@ void Scene202::enter() {
 	}
 
 	_game.loadQuoteSet(0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x61, 0);
-	_activeMsgFl = false;
+	local._activeMsgFl = false;
 
 	if (_scene->_priorSceneId == RETURNING_FROM_DIALOG) {
-		if (_waitingMeteoFl) {
+		if (local._waitingMeteoFl) {
 			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 			_game._player._visible = false;
 		}
 	} else {
-		_waitingMeteoFl = false;
-		_ladderTopFl = false;
+		local._waitingMeteoFl = false;
+		local._ladderTopFl = false;
 	}
 
-	_meteoClock1 = _meteoClock2 = _scene->_frameStartTime;
+	local._meteoClock1 = local._meteoClock2 = _scene->_frameStartTime;
 
 	if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_BINOCULARS);
@@ -156,9 +130,9 @@ void Scene202::enter() {
 	if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) {
 		_game._player._visible = false;
 		_game._player._stepEnabled = false;
-		_ladderTopFl = (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER);
+		local._ladderTopFl = (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER);
 
-		if (_ladderTopFl) {
+		if (local._ladderTopFl) {
 			_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 8);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 
@@ -178,7 +152,7 @@ void Scene202::enter() {
 		_scene->loadAnimation(formAnimName('M', -1), 71);
 		_scene->_animation[0]->setCurrentFrame(200);
 	} else {
-		if (_ladderTopFl) {
+		if (local._ladderTopFl) {
 			_game._player._visible = false;
 			_scene->_sequences.startCycle(_globals._sequenceIndexes[9], true, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
@@ -188,38 +162,38 @@ void Scene202::enter() {
 		}
 	}
 
-	_meteorologistSpecial = false;
+	local._meteorologistSpecial = false;
 }
 
-void Scene202::setRandomKernelMessage() {
+static void setRandomKernelMessage() {
 	int vocabId = _vm->getRandomNumber(92, 96);
 	_scene->_kernelMessages.reset();
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 	_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 70, 120, _game.getQuote(vocabId));
-	_activeMsgFl = true;
+	local._activeMsgFl = true;
 }
 
-void Scene202::step() {
-	if (!_activeMsgFl && (_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH) && (_vm->getRandomNumber(999) == 0)) {
+static void room_202_daemon() {
+	if (!local._activeMsgFl && (_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH) && (_vm->getRandomNumber(999) == 0)) {
 		_scene->_kernelMessages.reset();
-		_activeMsgFl = false;
+		local._activeMsgFl = false;
 		if (_vm->getRandomNumber(4) == 0)
 			setRandomKernelMessage();
 	}
 
 	if (_game._trigger == 70)
-		_activeMsgFl = false;
+		local._activeMsgFl = false;
 
 	if (_game._trigger == 71) {
 		_vm->_sound->command(3);
 		_vm->_sound->command(9);
 
-		_meteoClock1 = _scene->_frameStartTime + 15 * 60;
+		local._meteoClock1 = _scene->_frameStartTime + 15 * 60;
 
 		if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) {
 			Common::Point msgPos;
 			int msgFlag;
-			if (!_ladderTopFl) {
+			if (!local._ladderTopFl) {
 				msgPos = Common::Point(0, 0);
 				msgFlag = 2;
 			} else {
@@ -235,7 +209,7 @@ void Scene202::step() {
 				_action._activeAction._indirectObjectId = NOUN_STRANGE_DEVICE;
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_PARSER;
 				_scene->_sequences.addTimer(2 * 60, 2);
-				_meteorologistSpecial = true;
+				local._meteorologistSpecial = true;
 			} else if (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) {
 				_scene->_sequences.addTimer(2 * 60, 90);
 			}
@@ -281,7 +255,7 @@ void Scene202::step() {
 		_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[11]);
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
-		_ladderTopFl = false;
+		local._ladderTopFl = false;
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(99));
 	}
@@ -290,29 +264,29 @@ void Scene202::step() {
 		break;
 	}
 
-	if (!_scene->_animation[0] && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) {
+	if (!_scene->_animation[0] && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (local._meteoClock2 <= _scene->_frameStartTime) && (local._meteoClock1 <= _scene->_frameStartTime)) {
 		int randVal = _vm->getRandomNumber(1, 500);
 		int threshold = 1;
-		if (_ladderTopFl)
+		if (local._ladderTopFl)
 			threshold += 25;
 		if (!_globals[kMeteorologistEverSeen])
 			threshold += 25;
 		if (threshold >= randVal) {
 			_vm->_sound->command(17);
 			_scene->loadAnimation(formAnimName('M', -1), 71);
-			_toStationFl = true;
-			_toTeleportFl = false;
+			local._toStationFl = true;
+			local._toTeleportFl = false;
 			_globals[kMeteorologistEverSeen] = true;
-			_lastRoute = 0;
-			_stationCounter = 0;
-			_meteoClock2 = _scene->_frameStartTime + 2;
+			local._lastRoute = 0;
+			local._stationCounter = 0;
+			local._meteoClock2 = _scene->_frameStartTime + 2;
 		}
 	}
 
 	if (!_scene->_animation[0])
 		return;
 
-	if (_waitingMeteoFl) {
+	if (local._waitingMeteoFl) {
 		if (_scene->_animation[0]->getCurrentFrame() >= 200) {
 			if ((_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) || _globals[kLadderBroken]) {
 				_scene->_nextSceneId = 213;
@@ -322,10 +296,10 @@ void Scene202::step() {
 			}
 		}
 
-		if ((_scene->_animation[0]->getCurrentFrame() == 160) && (_meteoFrame != _scene->_animation[0]->getCurrentFrame())) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 160) && (local._meteoFrame != _scene->_animation[0]->getCurrentFrame())) {
 			Common::Point msgPos;
 			int msgFlag;
-			if (!_ladderTopFl) {
+			if (!local._ladderTopFl) {
 				msgPos = Common::Point(0, 0);
 				msgFlag = 2;
 			} else {
@@ -337,15 +311,15 @@ void Scene202::step() {
 		}
 	}
 
-	if (_meteoClock2 + 120 * 60 <= _scene->_frameStartTime) {
-		_toTeleportFl = true;
+	if (local._meteoClock2 + 120 * 60 <= _scene->_frameStartTime) {
+		local._toTeleportFl = true;
 	}
 
-	if (_scene->_animation[0]->getCurrentFrame() == _meteoFrame) {
+	if (_scene->_animation[0]->getCurrentFrame() == local._meteoFrame) {
 		return;
 	}
 
-	_meteoFrame = _scene->_animation[0]->getCurrentFrame();
+	local._meteoFrame = _scene->_animation[0]->getCurrentFrame();
 	int randVal = _vm->getRandomNumber(1, 1000);
 	int frameStep = -1;
 
@@ -353,12 +327,12 @@ void Scene202::step() {
 	case 42:
 	case 77:
 	case 96:
-		_stationCounter = 0;
+		local._stationCounter = 0;
 		frameStep = subStep1(randVal);
 		break;
 	case 51:
 	case 74:
-		_toStationFl = false;
+		local._toStationFl = false;
 		frameStep = subStep2(randVal);
 		break;
 	case 27:
@@ -370,18 +344,18 @@ void Scene202::step() {
 		frameStep = subStep4(randVal);
 		break;
 	case 59:
-		_lastRoute = 3;
-		++_stationCounter;
+		local._lastRoute = 3;
+		++local._stationCounter;
 		if (randVal <= 800)
 			frameStep = 55;
 		break;
 	case 89:
-		_lastRoute = 1;
+		local._lastRoute = 1;
 		if (randVal <= 700)
 			frameStep = 83;
 		break;
 	case 137:
-		_lastRoute = 2;
+		local._lastRoute = 2;
 		if (randVal <= 700)
 			frameStep = 126;
 		break;
@@ -391,28 +365,28 @@ void Scene202::step() {
 
 	if (frameStep >= 0 && frameStep != _scene->_animation[0]->getCurrentFrame() + 1) {
 		_scene->_animation[0]->setCurrentFrame(frameStep);
-		_meteoFrame = frameStep;
+		local._meteoFrame = frameStep;
 	}
 }
 
-int Scene202::subStep1(int randVal) {
-	if ((randVal <= 100) || _toStationFl)
+static int subStep1(int randVal) {
+	if ((randVal <= 100) || local._toStationFl)
 		return 42;
 
-	if ((randVal <= 200) || _toTeleportFl)
+	if ((randVal <= 200) || local._toTeleportFl)
 		return 96;
 
-	if ((randVal <= 300) && (_lastRoute != 1))
+	if ((randVal <= 300) && (local._lastRoute != 1))
 		return 77;
 
 	return 76;
 }
 
-int Scene202::subStep2(int randVal) {
-	if ((randVal <= 150) && (_stationCounter < 5))
+static int subStep2(int randVal) {
+	if ((randVal <= 150) && (local._stationCounter < 5))
 		return 51;
 
-	if ((randVal <= 300) || _toTeleportFl)
+	if ((randVal <= 300) || local._toTeleportFl)
 		return 74;
 
 	if (randVal <= 400)
@@ -421,21 +395,21 @@ int Scene202::subStep2(int randVal) {
 	return 44;
 }
 
-int Scene202::subStep3(int randVal) {
-	if ((randVal <= 100) || _toStationFl)
+static int subStep3(int randVal) {
+	if ((randVal <= 100) || local._toStationFl)
 		return 27;
 
-	if ((randVal <= 200) || _toTeleportFl)
+	if ((randVal <= 200) || local._toTeleportFl)
 		return 159;
 
-	if ((randVal <= 300) && (_lastRoute != 2))
+	if ((randVal <= 300) && (local._lastRoute != 2))
 		return 119;
 
 	return 110;
 }
 
-int Scene202::subStep4(int randVal) {
-	if ((randVal <= 100) || _toTeleportFl)
+static int subStep4(int randVal) {
+	if ((randVal <= 100) || local._toTeleportFl)
 		return 176;
 
 	if (randVal <= 200)
@@ -444,13 +418,13 @@ int Scene202::subStep4(int randVal) {
 	return 166;
 }
 
-void Scene202::preActions() {
-	Player &player = _vm->_game->_player;
+static void room_202_pre_parser() {
+	auto &player = _vm->_game->_player;
 
 	if (player._needToWalk)
 		_scene->_kernelMessages.reset();
 
-	if (_ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || player._needToWalk)) {
+	if (local._ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || player._needToWalk)) {
 		if (_game._trigger == 0) {
 			_vm->_sound->command(29);
 			player._readyToWalk = false;
@@ -461,26 +435,26 @@ void Scene202::preActions() {
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 		} else if (_game._trigger == 1) {
 			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]);
-			_scene->_dynamicHotspots.remove(_ladderHotspotId);
+			_scene->_dynamicHotspots.remove(local._ladderHotspotId);
 			player._visible = true;
 			player._readyToWalk = true;
 			player._stepEnabled = true;
-			_ladderTopFl = false;
+			local._ladderTopFl = false;
 		}
 	}
 
 	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && (_action._activeAction._indirectObjectId > 0)) {
-		if (!player._readyToWalk || _ladderTopFl)
+		if (!player._readyToWalk || local._ladderTopFl)
 			player._needToWalk = false;
 		else
 			player._needToWalk = true;
 
-		if (!_ladderTopFl)
+		if (!local._ladderTopFl)
 			player.walk(Common::Point(171, 122), FACING_NORTH);
 	}
 }
 
-void Scene202::actions() {
+static void room_202_parser() {
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(20219);
 		return;
@@ -544,12 +518,12 @@ void Scene202::actions() {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(29);
-			_meteoClock1 = _scene->_frameStartTime;
+			local._meteoClock1 = _scene->_frameStartTime;
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
 
-			_ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, 78, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
-			_scene->_dynamicHotspots.setPosition(_ladderHotspotId, Common::Point(246, 124), FACING_NORTH);
+			local._ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, 78, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
+			_scene->_dynamicHotspots.setPosition(local._ladderHotspotId, Common::Point(246, 124), FACING_NORTH);
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
@@ -560,7 +534,7 @@ void Scene202::actions() {
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], _globals._sequenceIndexes[9]);
-			_ladderTopFl = true;
+			local._ladderTopFl = true;
 			_game._player._stepEnabled = true;
 			int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(97));
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
@@ -571,10 +545,10 @@ void Scene202::actions() {
 			return;
 		}
 	} else if ((_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_FIELD_TO_NORTH) || (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_STRANGE_DEVICE))) && (_globals[kSexOfRex] == SEX_MALE)) {
-		if (!_ladderTopFl) {
+		if (!local._ladderTopFl) {
 			switch (_game._trigger) {
 			case 0:
-				_toTeleportFl = true;
+				local._toTeleportFl = true;
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
@@ -589,14 +563,14 @@ void Scene202::actions() {
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
 				if (_scene->_animation[0]) {
-					_waitingMeteoFl = true;
+					local._waitingMeteoFl = true;
 					_globals[kMeteorologistWatch] = METEOROLOGIST_GROUND;
 				} else {
 					_scene->_sequences.addTimer(120, 2);
 				}
 				break;
 			case 2:
-				if (!_scene->_animation[0] && !_meteorologistSpecial) {
+				if (!_scene->_animation[0] && !local._meteorologistSpecial) {
 					_vm->_dialogs->show(20222);
 				}
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
@@ -618,7 +592,7 @@ void Scene202::actions() {
 		} else {
 			switch (_game._trigger) {
 			case 0:
-				_toTeleportFl = true;
+				local._toTeleportFl = true;
 				_game._player._stepEnabled = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[9]);
 				_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
@@ -634,7 +608,7 @@ void Scene202::actions() {
 					if (_scene->_animation[0]->getCurrentFrame() > 200) {
 						_scene->_sequences.addTimer(120, 2);
 					} else {
-						_waitingMeteoFl = true;
+						local._waitingMeteoFl = true;
 						_globals[kMeteorologistWatch] = METEOROLOGIST_GONE;
 						if ((_scene->_animation[0]->getCurrentFrame() >= 44) && (_scene->_animation[0]->getCurrentFrame() <= 75)) {
 							_scene->_kernelMessages.reset();
@@ -652,7 +626,7 @@ void Scene202::actions() {
 			case 2:
 				if (!_scene->_animation[0])
 					_vm->_dialogs->show(20222);
-				_meteorologistSpecial = false;
+				local._meteorologistSpecial = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 				_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
@@ -715,6 +689,43 @@ void Scene202::actions() {
 	_action._inProgress = false;
 }
 
+void room_202_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._activeMsgFl);
+	s.syncAsByte(local._ladderTopFl);
+	s.syncAsByte(local._waitingMeteoFl);
+	s.syncAsByte(local._toStationFl);
+	s.syncAsByte(local._toTeleportFl);
+
+	s.syncAsSint32LE(local._ladderHotspotId);
+	s.syncAsSint32LE(local._lastRoute);
+	s.syncAsSint32LE(local._stationCounter);
+	s.syncAsSint32LE(local._meteoFrame);
+
+	s.syncAsUint32LE(local._meteoClock1);
+	s.syncAsUint32LE(local._meteoClock2);
+	s.syncAsUint32LE(local._startTime);
+
+	s.syncAsByte(local._meteorologistSpecial);
+}
+
+void room_202_preload() {
+	room_init_code_pointer = room_202_init;
+	room_pre_parser_code_pointer = room_202_pre_parser;
+	room_parser_code_pointer = room_202_parser;
+	room_daemon_code_pointer = room_202_daemon;
+
+	section_2_walker();
+	section_2_interface();
+
+	_scene->addActiveVocab(NOUN_LADDER);
+	_scene->addActiveVocab(VERB_CLIMB_DOWN);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_BONE);
+	_scene->addActiveVocab(NOUN_SKULL);
+	_scene->addActiveVocab(NOUN_BROKEN_LADDER);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room203.cpp b/engines/mads/madsv2/nebular/rooms/room203.cpp
index dc70a070234..259871bda38 100644
--- a/engines/mads/madsv2/nebular/rooms/room203.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room203.cpp
@@ -19,34 +19,28 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene203::Scene203(RexNebularEngine *vm) : Scene2xx(vm) {
-	_rhotundaEat2Fl = false;
-	_rhotundaEatFl = false;
-}
-
-void Scene203::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
+struct Scratch {
+	bool _rhotundaEat2Fl;
+	bool _rhotundaEatFl;
+};
 
-	s.syncAsByte(_rhotundaEat2Fl);
-	s.syncAsByte(_rhotundaEatFl);
-}
+static Scratch local;
 
-void Scene203::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(477);
-}
 
-void Scene203::enter() {
+static void room_203_init() {
 	if (_scene->_priorSceneId == 202) {
 		_game._player._playerPos = Common::Point(187, 99);
 		_game._player._facing = FACING_SOUTH;
@@ -58,18 +52,18 @@ void Scene203::enter() {
 		_game._player._facing = FACING_NORTH;
 	}
 
-	_rhotundaEatFl = false;
-	_rhotundaEat2Fl = false;
+	local._rhotundaEatFl = false;
+	local._rhotundaEat2Fl = false;
 
 	if ((_globals[kRhotundaStatus] == 0) && (!_scene->_roomChanged)) {
-		_rhotundaEatFl = true;
+		local._rhotundaEatFl = true;
 		_game._player.walk(Common::Point(158, 135), FACING_SOUTH);
 		int idx = _scene->_dynamicHotspots.add(131, 396, 0, Common::Rect(0, 0, 320, 156));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(155, 152), FACING_SOUTH);
 		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
 	}
 
-	if (!_rhotundaEatFl) {
+	if (!local._rhotundaEatFl) {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', -1));
 		if (_vm->getRandomNumber(1, 3) == 2) {
 			_globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 9, 1, 0, 0);
@@ -81,24 +75,24 @@ void Scene203::enter() {
 
 	_game.loadQuoteSet(0x67, 0x68, 0x69, 0x6A, 0x5A, 0);
 
-	if (_rhotundaEatFl) {
+	if (local._rhotundaEatFl) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(_vm->getRandomNumber(103, 106)));
 	}
 
-	sceneEntrySound();
+	section_2_music();
 }
 
-void Scene203::step() {
-	if (!_rhotundaEatFl)
+static void room_203_daemon() {
+	if (!local._rhotundaEatFl)
 		return;
 
-	if ((_game._trigger == 0) && _rhotundaEat2Fl)
+	if ((_game._trigger == 0) && local._rhotundaEat2Fl)
 		return;
 
 	if ((_game._player._playerPos != Common::Point(158, 136)) || (_game._player._facing != FACING_SOUTH))
 		return;
 
-	_rhotundaEat2Fl = true;
+	local._rhotundaEat2Fl = true;
 
 	if (_game._trigger == 0) {
 		_game._player._visible = false;
@@ -114,8 +108,8 @@ void Scene203::step() {
 	}
 }
 
-void Scene203::preActions() {
-	if (_rhotundaEatFl && !_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+static void room_203_pre_parser() {
+	if (local._rhotundaEatFl && !_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
 		_game._player.walk(Common::Point(158, 136), FACING_SOUTH);
 		_action._inProgress = false;
 		return;
@@ -125,7 +119,7 @@ void Scene203::preActions() {
 		_game._player._walkOffScreenSceneId = 209;
 }
 
-void Scene203::actions() {
+static void room_203_parser() {
 	if (_action._savedFields._lookFlag) {
 		_vm->_dialogs->show(20307);
 	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
@@ -150,6 +144,23 @@ void Scene203::actions() {
 	_action._inProgress = false;
 }
 
+void room_203_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._rhotundaEat2Fl);
+	s.syncAsByte(local._rhotundaEatFl);
+}
+
+void room_203_preload() {
+	room_init_code_pointer = room_203_init;
+	room_pre_parser_code_pointer = room_203_pre_parser;
+	room_parser_code_pointer = room_203_parser;
+	room_daemon_code_pointer = room_203_daemon;
+
+	section_2_walker();
+	section_2_interface();
+	_scene->addActiveVocab(477);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index be408a5eb3e..fdc0e2dbb02 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -19,39 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene205::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_CHICKEN);
-	_scene->addActiveVocab(NOUN_PIRANHA);
-}
+struct Scratch {
+	long _lastFishTime;
+	long _chickenTime;
+	bool _beingKicked;
+	int16 _kernelMessage;
+};
 
-Scene205::Scene205(RexNebularEngine *vm) : Scene2xx(vm) {
-	_lastFishTime = _scene->_frameStartTime;
-	_chickenTime = _scene->_frameStartTime;
+static Scratch local;
 
-	_beingKicked = false;
-	_kernelMessage = -1;
-}
 
-void Scene205::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
-
-	s.syncAsByte(_beingKicked);
-	s.syncAsSint16LE(_kernelMessage);
-}
-
-void Scene205::enter() {
+static void room_205_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
@@ -87,7 +78,7 @@ void Scene205::enter() {
 		_scene->_hotspots.activate(450, false);
 	}
 
-	_beingKicked = false;
+	local._beingKicked = false;
 	_game.loadQuoteSet(0x6B, 0x70, 0x71, 0x72, 0x5A, 0x74, 0x75, 0x76, 0x77, 0x78, 0x73, 0x79, 0x7A, 0x7B, 0x7C,
 		0x7D, 0x7E, 0x7F, 0x80, 0xAC, 0xAD, 0xAE, 0x6C, 0x6D, 0x6E, 0x6F, 0x2, 0);
 	_dialog1.setup(0x2A, 0x5A, 0x78, 0x74, 0x75, 0x76, 0x77, 0);
@@ -100,7 +91,7 @@ void Scene205::enter() {
 	_vm->_palette->setEntry(252, 63, 63, 40);
 	_vm->_palette->setEntry(253, 50, 50, 30);
 
-	_chickenTime = _vm->_game->_scene._frameStartTime;
+	local._chickenTime = _vm->_game->_scene._frameStartTime;
 
 	if (_globals[kSexOfRex] == SEX_FEMALE)
 		_scene->_kernelMessages.initRandomMessages(3,
@@ -114,7 +105,7 @@ void Scene205::enter() {
 		_scene->loadAnimation(formAnimName('a', -1));
 		_scene->_animation[0]->_resetFlag = true;
 	} else {
-		_beingKicked = true;
+		local._beingKicked = true;
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
 		_game._player._visible = false;
 		_game._player._stepEnabled = false;
@@ -123,29 +114,29 @@ void Scene205::enter() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 11, 74);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 	}
-	sceneEntrySound();
+	section_2_music();
 }
 
-void Scene205::step() {
+static void room_205_daemon() {
 	if (_globals[kSexOfRex] == SEX_FEMALE) {
 		_scene->_kernelMessages.randomServer();
 
-		if (_vm->_game->_scene._frameStartTime >= _chickenTime) {
+		if (_vm->_game->_scene._frameStartTime >= local._chickenTime) {
 			int chanceMinor = _scene->_kernelMessages.checkRandom() + 1;
 			if (_scene->_kernelMessages.generateRandom(100, chanceMinor))
 				_vm->_sound->command(28);
 
-			_chickenTime = _vm->_game->_scene._frameStartTime + 2;
+			local._chickenTime = _vm->_game->_scene._frameStartTime + 2;
 		}
 	}
 
-	if (_vm->_game->_scene._frameStartTime - _lastFishTime > 1300) {
+	if (_vm->_game->_scene._frameStartTime - local._lastFishTime > 1300) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(
 			_globals._spriteIndexes[6], false, 5, 1, 0, 0);
 		int idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6],
 			Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
-		_lastFishTime = _vm->_game->_scene._frameStartTime;
+		local._lastFishTime = _vm->_game->_scene._frameStartTime;
 	}
 
 	if (_game._trigger == 73)
@@ -168,15 +159,15 @@ void Scene205::step() {
 		_scene->_nextSceneId = 211;
 }
 
-void Scene205::handleWomanSpeech(int quote) {
-	_kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quote));
+static void handleWomanSpeech(int quote) {
+	local._kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quote));
 }
 
-void Scene205::actions() {
+static void room_205_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation) {
-		if (_kernelMessage >= 0)
-			_scene->_kernelMessages.remove(_kernelMessage);
-		_kernelMessage = -1;
+		if (local._kernelMessage >= 0)
+			_scene->_kernelMessages.remove(local._kernelMessage);
+		local._kernelMessage = -1;
 
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
@@ -323,6 +314,29 @@ void Scene205::actions() {
 	_action._inProgress = false;
 }
 
+void room_205_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._beingKicked);
+	s.syncAsSint16LE(local._kernelMessage);
+}
+
+void room_205_preload() {
+	local._lastFishTime = _scene->_frameStartTime;
+	local._chickenTime = _scene->_frameStartTime;
+	local._beingKicked = false;
+	local._kernelMessage = -1;
+
+	room_init_code_pointer = room_205_init;
+	room_parser_code_pointer = room_205_parser;
+	room_daemon_code_pointer = room_205_daemon;
+
+	section_2_walker();
+	section_2_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_CHICKEN);
+	_scene->addActiveVocab(NOUN_PIRANHA);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index 58e7fecb17b..35ae2f30de3 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 Scene207::Scene207(RexNebularEngine *vm) : Scene2xx(vm) {
 	_vultureFl = false;
@@ -238,6 +242,19 @@ void Scene207::actions() {
 	_action._inProgress = false;
 }
 
+void room_207_preload() {
+	room_init_code_pointer = room_207_init;
+	room_pre_parser_code_pointer = room_207_pre_parser;
+	room_parser_code_pointer = room_207_parser;
+	room_daemon_code_pointer = room_207_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
index b689046d97c..c0fbfb67708 100644
--- a/engines/mads/madsv2/nebular/rooms/room208.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 Scene208::Scene208(RexNebularEngine *vm) : Scene2xx(vm) {
 	_rhotundaTurnFl = false;
@@ -122,7 +126,7 @@ void Scene208::enter() {
 
 	_vm->_palette->setEntry(16, 0, 0, 63);
 	_vm->_palette->setEntry(17, 0, 0, 45);
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene208::step() {
@@ -338,6 +342,19 @@ void Scene208::actions() {
 	_action._inProgress = false;
 }
 
+void room_208_preload() {
+	room_init_code_pointer = room_208_init;
+	room_pre_parser_code_pointer = room_208_pre_parser;
+	room_parser_code_pointer = room_208_parser;
+	room_daemon_code_pointer = room_208_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index b4f3f4053da..0d788a23ac0 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 Scene209::Scene209(RexNebularEngine *vm) : Scene2xx(vm) {
 	_dodgeFl = false;
@@ -1065,7 +1069,7 @@ void Scene209::enter() {
 
 	_scene->_hotspots.activate(227, false);
 
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene209::step() {
@@ -1782,6 +1786,19 @@ void Scene209::actions() {
 	}
 }
 
+void room_209_preload() {
+	room_init_code_pointer = room_209_init;
+	room_pre_parser_code_pointer = room_209_pre_parser;
+	room_parser_code_pointer = room_209_parser;
+	room_daemon_code_pointer = room_209_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index 38369d43f6a..f6a1b3382e4 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 Scene210::Scene210(RexNebularEngine *vm) : Scene2xx(vm) {
 	_curDialogNode = -1;
@@ -735,7 +739,7 @@ void Scene210::enter() {
 	_vm->_palette->setEntry(252, 63, 63, 10);
 	_vm->_palette->setEntry(253, 45, 45, 5);
 
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene210::step() {
@@ -1086,6 +1090,19 @@ void Scene210::actions() {
 	_action._inProgress = false;
 }
 
+void room_210_preload() {
+	room_init_code_pointer = room_210_init;
+	room_pre_parser_code_pointer = room_210_pre_parser;
+	room_parser_code_pointer = room_210_parser;
+	room_daemon_code_pointer = room_210_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room211.cpp b/engines/mads/madsv2/nebular/rooms/room211.cpp
index 662100ea700..09fc0ed166b 100644
--- a/engines/mads/madsv2/nebular/rooms/room211.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room211.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 Scene211::Scene211(RexNebularEngine *vm) : Scene2xx(vm) {
 	_ambushFl = false;
@@ -99,7 +103,7 @@ void Scene211::enter() {
 	_ambushFl = false;
 	_monkeyFrame = 0;
 
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene211::step() {
@@ -332,6 +336,19 @@ void Scene211::actions() {
 	_action._inProgress = false;
 }
 
+void room_211_preload() {
+	room_init_code_pointer = room_211_init;
+	room_pre_parser_code_pointer = room_211_pre_parser;
+	room_parser_code_pointer = room_211_parser;
+	room_daemon_code_pointer = room_211_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room212.cpp b/engines/mads/madsv2/nebular/rooms/room212.cpp
index 2baf95e4f66..45de1abe3ff 100644
--- a/engines/mads/madsv2/nebular/rooms/room212.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room212.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 void Scene212::setup() {
 	setPlayerSpritesPrefix();
@@ -46,7 +50,7 @@ void Scene212::enter() {
 		_game._player._facing = FACING_NORTHEAST;
 	}
 
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene212::step() {
@@ -87,6 +91,19 @@ void Scene212::actions() {
 	_action._inProgress = false;
 }
 
+void room_212_preload() {
+	room_init_code_pointer = room_212_init;
+	room_pre_parser_code_pointer = room_212_pre_parser;
+	room_parser_code_pointer = room_212_parser;
+	room_daemon_code_pointer = room_212_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index 69e02b0cafd..24b19a827da 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 void Scene213::setup() {
 	_game._player._spritesPrefix = "";
@@ -45,7 +49,7 @@ void Scene213::enter() {
 
 	teleporterEnter();
 
-	// The original is calling Scene2xx::sceneEntrySound()
+	// The original is calling Scene2xx::section_2_music()
 	if (_vm->_musicFlag) {
 		if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
 			_vm->_sound->command(1);
@@ -90,6 +94,19 @@ void Scene213::actions() {
 	_action._inProgress = false;
 }
 
+void room_213_preload() {
+	room_init_code_pointer = room_213_init;
+	room_pre_parser_code_pointer = room_213_pre_parser;
+	room_parser_code_pointer = room_213_parser;
+	room_daemon_code_pointer = room_213_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room214.cpp b/engines/mads/madsv2/nebular/rooms/room214.cpp
index 615e881ca37..618236a9eaa 100644
--- a/engines/mads/madsv2/nebular/rooms/room214.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room214.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 Scene214::Scene214(RexNebularEngine *vm) : Scene2xx(vm) {
 	_devilTime = 0;
@@ -75,7 +79,7 @@ void Scene214::enter() {
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(191, 152);
 
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene214::step() {
@@ -252,6 +256,19 @@ void Scene214::actions() {
 	_action._inProgress = false;
 }
 
+void room_214_preload() {
+	room_init_code_pointer = room_214_init;
+	room_pre_parser_code_pointer = room_214_pre_parser;
+	room_parser_code_pointer = room_214_parser;
+	room_daemon_code_pointer = room_214_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room215.cpp b/engines/mads/madsv2/nebular/rooms/room215.cpp
index 22bcbd0ce58..39a35719857 100644
--- a/engines/mads/madsv2/nebular/rooms/room215.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room215.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 void Scene215::setup() {
 	setPlayerSpritesPrefix();
@@ -59,7 +63,7 @@ void Scene215::enter() {
 	}
 
 	_game.loadQuoteSet(0xA9, 0xAA, 0);
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene215::step() {
@@ -150,6 +154,19 @@ void Scene215::actions() {
 	_action._inProgress = false;
 }
 
+void room_215_preload() {
+	room_init_code_pointer = room_215_init;
+	room_pre_parser_code_pointer = room_215_pre_parser;
+	room_parser_code_pointer = room_215_parser;
+	room_daemon_code_pointer = room_215_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room216.cpp b/engines/mads/madsv2/nebular/rooms/room216.cpp
index cb912143200..5039130fbb5 100644
--- a/engines/mads/madsv2/nebular/rooms/room216.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room216.cpp
@@ -19,14 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/room201.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 void Scene216::setup() {
 	setPlayerSpritesPrefix();
@@ -41,7 +45,7 @@ void Scene216::enter() {
 	_scene->_userInterface.setup(kInputConversation);
 	_scene->loadAnimation(formAnimName('A', -1), 60);
 
-	sceneEntrySound();
+	section_2_music();
 }
 
 void Scene216::step() {
@@ -49,6 +53,19 @@ void Scene216::step() {
 		_scene->_nextSceneId = 215;
 }
 
+void room_216_preload() {
+	room_init_code_pointer = room_216_init;
+	room_pre_parser_code_pointer = room_216_pre_parser;
+	room_parser_code_pointer = room_216_parser;
+	room_daemon_code_pointer = room_216_daemon;
+
+	anim_himem_preload(formAnimName('A', -1), 3);
+
+	section_2_walker();
+	section_2_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 7691677ddf0..0b84ca1aeac 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -23,6 +23,7 @@
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mouse.h"
 #include "mads/madsv2/core/pal.h"
 #include "mads/madsv2/core/object.h"
 #include "mads/madsv2/core/player.h"
@@ -73,6 +74,17 @@ void Game::Objects::setRoom(int object_id, int roomNum) {
 	inter_move_object(object_id, roomNum);
 }
 
+void Game::Objects::removeFromInventory(int objectId, int newScene) {
+
+}
+
+Game::Object Game::Objects::operator[](int idx) {
+	return Game::Object(idx);
+}
+
+Game::Object::Object(int idx) : _roomNumber(object[idx].location) {
+}
+
 void Game::VisitedScenes::add(int roomNum) {
 	player_discover_room(roomNum);
 }
@@ -87,13 +99,9 @@ void Game::VisitedScenes::pop_back() {
 
 void Game::loadQuoteSet(int quote1, ...) {
 	va_list va;
-	int id = quote1;
 	va_start(va, quote1);
 
-	while (id) {
-		quote_load(id, 0);
-		id = va_arg(va, int);
-	}
+	kernel.quotes = quote_vload(quote1, va);
 
 	va_end(va);
 }
@@ -122,6 +130,10 @@ void Game::Player::update() {
 	player_set_image();
 }
 
+void Game::Player::removePlayerSprites() {
+	kernel_dump_walker_only();
+}
+
 char *Resources::formatName(int my_room, char type, int num, int ext, const char *text) {
 	return kernel_full_name(my_room, type, num, text, ext);
 }
@@ -138,6 +150,14 @@ void Scene::Animation::setNextFrameTimer(long time) {
 	kernel_anim[_id].next_clock = time;
 }
 
+void Scene::Animation::setCurrentFrame(int frameNum) {
+	kernel_anim[_id].frame = frameNum;
+}
+
+void Scene::Animation::resetSpriteSetsCount() {
+	error("TODO: resetSpriteSetsCount");
+}
+
 int Scene::DynamicHotspots::add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r) {
 	return kernel_add_dynamic(vocab_id, verb_id, 0, auto_sequence,
 		r.left, r.top, r.width(), r.height());
@@ -151,6 +171,10 @@ void Scene::DynamicHotspots::setPosition(int id, const Common::Point &pt, int fa
 	kernel_dynamic_walk(id, pt.x, pt.y, facing);
 }
 
+int Scene::DynamicHotspots::setCursor(int index, int cursor) {
+
+}
+
 void Scene::Hotspots::activate(int hotspot, int active) {
 	kernel_flip_hotspot(hotspot, active);
 }
@@ -164,6 +188,10 @@ int Scene::KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 fl
 	return kernel_message_add(const_cast<char *>(msg.c_str()), pt.x, pt.y, fontColor, timeout, endTrigger, 0);
 }
 
+void Scene::KernelMessages::remove(int msgIndex) {
+	kernel_message_delete(msgIndex);
+}
+
 void Scene::KernelMessages::reset() {
 	kernel_message_purge();
 }
@@ -172,6 +200,32 @@ void Scene::KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) {
 	kernel_message_teletype(msgIndex, numTicks, quoted);
 }
 
+void Scene::KernelMessages::setSeqIndex(int msgIndex, int seqIndex) {
+	kernel_message_attach(msgIndex, seqIndex);
+}
+
+void Scene::KernelMessages::initRandomMessages(int maxSimultaneousMessages,
+		const Common::Rect &bounds, int minYSpacing, int scrollRate,
+		int color, int duration, int quoteId, ...) {
+	va_list marker;
+	va_start(marker, quoteId);
+	kernel_random_messages_vinit(maxSimultaneousMessages, bounds.left, bounds.right,
+		bounds.top, bounds.bottom, minYSpacing, scrollRate, color, duration, quoteId, marker);
+	va_end(marker);
+}
+
+void Scene::KernelMessages::randomServer() {
+	kernel_random_message_server();
+}
+
+int Scene::KernelMessages::checkRandom() {
+	return kernel_check_random();
+}
+
+bool Scene::KernelMessages::generateRandom(int major, int minor) {
+	return kernel_generate_random_message(major, minor);
+}
+
 Scene::KernelMessages::KernelMessageProxy Scene::KernelMessages::Entries::operator[](uint handle) {
 	return KernelMessageProxy(&kernel_message[handle]);
 }
@@ -316,6 +370,11 @@ void VM::Dialogs::showItem(int object_id, int message, int speech) {
 	object_examine(object_id, message, speech);
 }
 
+void VM::Events::setCursor2(int cursorNum) {
+	cursor_id = cursorNum;
+	mouse_cursor_sprite(cursor, cursorNum);
+}
+
 void VM::Palette::setEntry(int color, int r, int g, int b) {
 	pal_change_color(color, r, g, b);
 }
@@ -324,6 +383,10 @@ void VM::Palette::refreshSceneColors() {
 	kernel_new_palette();
 }
 
+void VM::Palette::lock() {
+	pal_lock();
+}
+
 void VM::Sound::command(int num, int distance) {
 	g_engine->_soundManager->command(num, distance);
 }
@@ -332,6 +395,10 @@ int VM::getRandomNumber(int min, int max) {
 	return g_engine->getRandomNumber(min, max);
 }
 
+int VM::getRandomNumber(int max) {
+	return g_engine->getRandomNumber(max);
+}
+
 char *formAnimName(char type, int num) {
 	return kernel_name(type, num);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index cc32935da97..0e1edd15879 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -35,6 +35,12 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
+#define CURSOR_ARROW CURSOR_NORMAL
+#define CURSOR_GO_DOWN CURSOR_DOWN
+#define CURSOR_GO_UP CURSOR_UP
+#define CURSOR_GO_LEFT CURSOR_LEFT
+#define CURSOR_GO_RIGHT CURSOR_RIGHT
+
 enum EXTTYPE {
 	EXT_NONE = -1, EXT_SS = 1, EXT_AA = 2, EXT_DAT = 3, EXT_HH = 4,
 	EXT_ART = 5, EXT_INT = 6
@@ -66,6 +72,11 @@ enum SpriteAnimType {
 	ANIMTYPE_STAMP = AA_STAMP
 };
 
+enum ScrCategory {
+	CAT_NONE = 0, CAT_COMMAND = 1, CAT_INV_LIST = 2, CAT_INV_VOCAB = 3,
+	CAT_HOTSPOT = 4, CAT_INV_ANIM = 5, CAT_TALK_ENTRY = 6, CAT_INV_SCROLLER = 7,
+	CAT_12 = 12
+};
 
 enum ScreenTransition {
 	kTransitionNone = 0,
@@ -101,6 +112,7 @@ struct Action {
 
 	struct SavedFields {
 		int &_lookFlag = player.look_around;
+		int &_mainObjectSource = player.main_object_source;
 	};
 	SavedFields _savedFields;
 
@@ -118,6 +130,7 @@ struct Action {
 
 	int &_lookFlag = player.look_around;
 	int &_inProgress = player.command_ready;
+	int &_commandSource = player.command_source;
 };
 extern Action _action;
 
@@ -138,22 +151,34 @@ struct Scene {
 	}
 
 	struct Animation {
+		Animation *operator->() {
+			return this;
+		}
+		const Animation *operator->() const {
+			return this;
+		}
+
 		int16 _id = -1;
+		bool operator!() const {
+			return _id == -1;
+		}
 		bool operator!=(std::nullptr_t) const {
 			return _id != -1;
 		}
 		bool operator==(std::nullptr_t) const {
 			return _id == -1;
 		}
-		Animation *operator->() {
-			return this;
-		}
-		const Animation *operator->() const {
-			return this;
+		explicit operator bool() const {
+			return _id != -1;
 		}
 
+		// TODO: Not sure what to map this to
+		bool _resetFlag;
+
 		int getCurrentFrame() const;
 		void setNextFrameTimer(long time);
+		void setCurrentFrame(int frameNum);
+		void resetSpriteSetsCount();
 	};
 	Animation _animation[10];
 
@@ -161,6 +186,7 @@ struct Scene {
 		int add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r);
 		void remove(int dyn_id);
 		void setPosition(int id, const Common::Point &pt, int facing);
+		int setCursor(int index, int cursor);
 	};
 	DynamicHotspots _dynamicHotspots;
 
@@ -194,8 +220,17 @@ struct Scene {
 
 		int add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 			uint32 timeout, const Common::String &msg);
+		void remove(int msgIndex);
 		void reset();
 		void setQuoted(int msgIndex, int numTicks, bool quoted);
+		void setSeqIndex(int msgIndex, int seqIndex);
+
+		void initRandomMessages(int maxSimultaneousMessages,
+			const Common::Rect &bounds, int minYSpacing, int scrollRate,
+			int color, int duration, int quoteId, ...);
+		void randomServer();
+		int checkRandom();
+		bool generateRandom(int major, int minor);
 	};
 	KernelMessages _kernelMessages;
 
@@ -293,7 +328,7 @@ struct Scene {
 	byte &_roomChanged = kernel.teleported_in;
 	int &_currentSceneId = room_id;
 
-	int loadAnimation(const char *name, int trigger_code);
+	int loadAnimation(const char *name, int trigger_code = 0);
 	void freeAnimation();
 	void changeVariant(int num);
 	void drawElements(int transitionType, bool surfaceFlag);
@@ -311,12 +346,21 @@ struct Game {
 		return this;
 	}
 
+	struct Object {
+		int16 &_roomNumber;
+
+		Object(int objectNum);
+	};
+
 	struct Objects {
 		void addToInventory(int object_id);
 		bool isInRoom(int object_id) const;
 		bool isInInventory(int object_id) const;
 		int getIdFromDesc(int desc_id) const;
 		void setRoom(int object_id, int roomNum);
+		void removeFromInventory(int objectId, int newScene);
+
+		Object operator[](int idx);
 	};
 	Objects _objects;
 
@@ -337,6 +381,9 @@ struct Game {
 			bool operator==(const Common::Point &rhs) const {
 				return x == rhs.x && y == rhs.y;
 			}
+			bool operator!=(const Common::Point &rhs) const {
+				return x != rhs.x || y != rhs.y;
+			}
 		};
 		PlayerPoint _playerPos;
 
@@ -365,6 +412,7 @@ struct Game {
 		bool &_stepEnabled = player.commands_allowed;
 		char *const q = &player.series_name[0];
 		byte &_spritesChanged = player.walker_must_reload;
+		int &_beenVisible = player.walker_been_visible;
 		byte &_loadsFirst = player.walker_loads_first;
 		int &_needToWalk = player.need_to_walk;
 		int &_readyToWalk = player.ready_to_walk;
@@ -383,11 +431,17 @@ struct Game {
 		void walk(const Common::Point &pt, int facing);
 		void cancelCommand();
 		void update();
+		void removePlayerSprites();
 	};
 	Player _player;
 
 	Scene &_scene = Rooms::_scene;
 
+	struct ScreenObjects {
+		int &_inputMode = inter_input_mode;
+	};
+	ScreenObjects _screenObjects;
+
 	struct VisitedScenes {
 		byte &_sceneRevisited = player.been_here_before;
 
@@ -453,11 +507,24 @@ struct VM {
 	};
 	Dialogs _dialogs;
 
+	struct Events {
+		Events *operator->() {
+			return this;
+		}
+		const Events *operator->() const {
+			return this;
+		}
+
+		void setCursor2(int cursorNum);
+	};
+	Events _events;
+
 	Game &_game = Rooms::_game;
 
 	struct Palette {
 		void setEntry(int color, int r, int g, int b);
 		void refreshSceneColors();
+		void lock();
 	};
 	Palette _paletteInstance;
 	Palette *const _palette = &_paletteInstance;
@@ -475,6 +542,7 @@ struct VM {
 	Sound _sound;
 
 	int getRandomNumber(int min, int max);
+	int getRandomNumber(int max);
 };
 extern VM _vm;
 
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index ee39a9f77a3..2f3cc984096 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -71,6 +71,7 @@ MODULE_OBJS += \
 	madsv2/core/window.o \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
+	madsv2/nebular/conversation.o \
 	madsv2/nebular/global.o \
 	madsv2/nebular/mads/mads.o \
 	madsv2/nebular/rooms/thunks.o \
@@ -86,6 +87,20 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room110.o \
 	madsv2/nebular/rooms/room111.o \
 	madsv2/nebular/rooms/room112.o \
+	madsv2/nebular/rooms/room201.o \
+	madsv2/nebular/rooms/room202.o \
+	madsv2/nebular/rooms/room203.o \
+	madsv2/nebular/rooms/room205.o \
+	madsv2/nebular/rooms/room207.o \
+	madsv2/nebular/rooms/room208.o \
+	madsv2/nebular/rooms/room209.o \
+	madsv2/nebular/rooms/room210.o \
+	madsv2/nebular/rooms/room211.o \
+	madsv2/nebular/rooms/room212.o \
+	madsv2/nebular/rooms/room213.o \
+	madsv2/nebular/rooms/room214.o \
+	madsv2/nebular/rooms/room215.o \
+	madsv2/nebular/rooms/room216.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \
diff --git a/engines/mads/nebular/core/events.h b/engines/mads/nebular/core/events.h
index a5afe076bfd..ab93a4db981 100644
--- a/engines/mads/nebular/core/events.h
+++ b/engines/mads/nebular/core/events.h
@@ -31,10 +31,6 @@
 namespace MADS {
 namespace Nebular {
 
-enum CursorType {
-	CURSOR_NONE = 0, CURSOR_ARROW = 1, CURSOR_WAIT = 2, CURSOR_GO_DOWN = 3,
-	CURSOR_GO_UP = 4, CURSOR_GO_LEFT = 5, CURSOR_GO_RIGHT = 6
-};
 
 #define GAME_FRAME_RATE 50
 #define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE)
diff --git a/engines/mads/nebular/core/user_interface.cpp b/engines/mads/nebular/core/user_interface.cpp
index 7b28df920d1..312d44ac6d2 100644
--- a/engines/mads/nebular/core/user_interface.cpp
+++ b/engines/mads/nebular/core/user_interface.cpp
@@ -210,106 +210,6 @@ void UISlots::draw(bool updateFlag, bool delFlag) {
 
 /*------------------------------------------------------------------------*/
 
-RexNebularEngine *Conversation::_vm;
-
-void Conversation::init(RexNebularEngine *vm) {
-	_vm = vm;
-}
-
-void Conversation::setup(int globalId, ...) {
-	va_list va;
-	va_start(va, globalId);
-
-	// Load the list of conversation quotes
-	_quotes.clear();
-	int quoteId = va_arg(va, int);
-	while (quoteId > 0) {
-		_quotes.push_back(quoteId);
-		quoteId = va_arg(va, int);
-	}
-	va_end(va);
-
-	if (quoteId < 0) {
-		// For an ending value of -1, also initial the bitflags for the global
-		// associated with the conversation entry, which enables all the quote Ids
-		_vm->_game->globals()[globalId] = (int16)0xffff;
-	}
-
-	_globalId = globalId;
-}
-
-void Conversation::set(int quoteId, ...) {
-	_vm->_game->globals()[_globalId] = 0;
-
-	va_list va;
-	va_start(va, quoteId);
-
-	// Loop through handling each quote
-	while (quoteId > 0) {
-		for (uint idx = 0; idx < _quotes.size(); ++idx) {
-			if (_quotes[idx] == quoteId) {
-				// Found index, so set that bit in the global keeping track of conversation state
-				_vm->_game->globals()[_globalId] |= 1 << idx;
-				break;
-			}
-		}
-
-		quoteId = va_arg(va, int);
-	}
-	va_end(va);
-}
-
-int Conversation::read(int quoteId) {
-	uint16 flags = _vm->_game->globals()[_globalId];
-	int count = 0;
-
-	for (uint idx = 0; idx < _quotes.size(); ++idx) {
-		if (flags & (1 << idx))
-			++count;
-
-		if (_quotes[idx] == quoteId)
-			return flags & (1 << idx);
-	}
-
-	// Could not find it, simply return number of active quotes
-	return count;
-}
-
-void Conversation::write(int quoteId, bool flag) {
-	for (uint idx = 0; idx < _quotes.size(); ++idx) {
-		if (_quotes[idx] == quoteId) {
-			// Found index, so set or clear the flag
-			if (flag) {
-				// Set bit
-				_vm->_game->globals()[_globalId] |= 1 << idx;
-			} else {
-				// Clear bit
-				_vm->_game->globals()[_globalId] &= ~(1 << idx);
-			}
-			return;
-		}
-	}
-}
-
-void Conversation::start() {
-	UserInterface &userInterface = _vm->_game->_scene._userInterface;
-	userInterface.emptyConversationList();
-
-	// Loop through each of the quotes loaded into the conversation
-	for (uint idx = 0; idx < _quotes.size(); ++idx) {
-		// Check whether the given quote is enabled or not
-		if (_vm->_game->globals()[_globalId] & (1 << idx)) {
-			// Quote enabled, so add it to the list of talk selections
-			Common::String msg = _vm->_game->getQuote(_quotes[idx]);
-			userInterface.addConversationMessage(_quotes[idx], msg);
-		}
-	}
-
-	userInterface.setup(kInputConversation);
-}
-
-/*------------------------------------------------------------------------*/
-
 UserInterface::UserInterface(RexNebularEngine *vm) : _vm(vm), _dirtyAreas(vm),
 		_uiSlots(vm) {
 	_invSpritesIndex = -1;
diff --git a/engines/mads/nebular/core/user_interface.h b/engines/mads/nebular/core/user_interface.h
index d8ded64cd8c..10c9eeb67ba 100644
--- a/engines/mads/nebular/core/user_interface.h
+++ b/engines/mads/nebular/core/user_interface.h
@@ -97,42 +97,6 @@ public:
 	void draw(bool updateFlag, bool delFlag);
 };
 
-class Conversation {
-private:
-	static RexNebularEngine *_vm;
-public:
-	static void init(RexNebularEngine *vm);
-public:
-	int _globalId;
-	Common::Array<int> _quotes;
-
-	/**
-	 * Set up a conversation sequence
-	 */
-	void setup(int globalId, ...);
-
-	/**
-	 * Activates the passed set of quotes in the given conversation node
-	 */
-	void set(int quoteId, ...);
-
-	/**
-	 * Returns the bit for a given quote to indicate whether it's active or not or,
-	 * if 0 is passed, returns the number of currently active quotes
-	 */
-	int read(int quoteId);
-
-	/**
-	 * Activates or deactivates the specified quote in the given conversation node
-	 */
-	void write(int quoteId, bool flag);
-
-	/**
-	 * Starts the conversation
-	 */
-	void start();
-};
-
 class UserInterface : public MSurface {
 	friend class UISlots;
 private:


Commit: 8ce6f229a9642f42dcf628331ef1cc60d0ec006c
    https://github.com/scummvm/scummvm/commit/8ce6f229a9642f42dcf628331ef1cc60d0ec006c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:43+10:00

Commit Message:
MADS: NEBULAR: Further section 2 rooms implementation

Changed paths:
  A engines/mads/madsv2/nebular/rooms/teleporter_room.cpp
  A engines/mads/madsv2/nebular/rooms/teleporter_room.h
    engines/mads/madsv2/core/mcga.cpp
    engines/mads/madsv2/core/mcga.h
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room208.cpp
    engines/mads/madsv2/nebular/rooms/room209.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room211.cpp
    engines/mads/madsv2/nebular/rooms/room212.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/mcga.cpp b/engines/mads/madsv2/core/mcga.cpp
index 5090d193f8d..5d910c077e3 100644
--- a/engines/mads/madsv2/core/mcga.cpp
+++ b/engines/mads/madsv2/core/mcga.cpp
@@ -38,6 +38,7 @@ int  mcga_retrace_max_bytes = 768;
 
 word mcga_palette_update = false;
 int  mcga_palette_fast = true;
+word mcga_shakes = 0;
 
 
 void mcga_put_pixel(word x, word y, byte c) {
diff --git a/engines/mads/madsv2/core/mcga.h b/engines/mads/madsv2/core/mcga.h
index 9a4e1620864..6feae4fae7c 100644
--- a/engines/mads/madsv2/core/mcga.h
+++ b/engines/mads/madsv2/core/mcga.h
@@ -35,6 +35,7 @@ extern int  mcga_retrace_max_bytes;
 
 extern word mcga_palette_update;
 extern int  mcga_palette_fast;
+extern word mcga_shakes;
 
 /**
  * Given X and Y, sets pixel to color C
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index ebf506afd9b..5663525aef7 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -24,7 +24,6 @@
 
 #include "common/serializer.h"
 #include "mads/madsv2/core/vocabh.h"
-#include "mads/madsv2/nebular/conversation.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -325,7 +324,9 @@ enum {
 #define TELEPORTER_COUNT 10      // Total number of teleporters
 #define TELEPORTER_WORK_COUNT 6  // Total number that actually work
 
-extern Conversation _dialog1;
+#define FONT_CONVERSATION "*FONTCONV.FF"
+#define FONT_INTERFACE "*FONTINTR.FF"
+
 
 extern void global_section_constructor();
 extern void sync_room(Common::Serializer &s);
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index fdc0e2dbb02..b0b2f347793 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -22,6 +22,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/conversation.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
@@ -37,6 +38,7 @@ struct Scratch {
 	long _chickenTime;
 	bool _beingKicked;
 	int16 _kernelMessage;
+	Conversation _dialog1;
 };
 
 static Scratch local;
@@ -81,10 +83,10 @@ static void room_205_init() {
 	local._beingKicked = false;
 	_game.loadQuoteSet(0x6B, 0x70, 0x71, 0x72, 0x5A, 0x74, 0x75, 0x76, 0x77, 0x78, 0x73, 0x79, 0x7A, 0x7B, 0x7C,
 		0x7D, 0x7E, 0x7F, 0x80, 0xAC, 0xAD, 0xAE, 0x6C, 0x6D, 0x6E, 0x6F, 0x2, 0);
-	_dialog1.setup(0x2A, 0x5A, 0x78, 0x74, 0x75, 0x76, 0x77, 0);
+	local._dialog1.setup(0x2A, 0x5A, 0x78, 0x74, 0x75, 0x76, 0x77, 0);
 
 	if (!_game._visitedScenes._sceneRevisited)
-		_dialog1.set(0x5A, 0x74, 0x75, 0x77, 0);
+		local._dialog1.set(0x5A, 0x74, 0x75, 0x77, 0);
 
 	_vm->_palette->setEntry(250, 63, 50, 20);
 	_vm->_palette->setEntry(251, 50, 40, 15);
@@ -179,20 +181,20 @@ static void room_205_parser() {
 			switch (_action._activeAction._verbId) {
 			case 0x5A:
 				handleWomanSpeech(0x7A);
-				_dialog1.write(0x78, true);
-				_dialog1.write(0x5A, false);
+				local._dialog1.write(0x78, true);
+				local._dialog1.write(0x5A, false);
 				break;
 
 			case 0x74:
 				handleWomanSpeech(0x7C);
-				_dialog1.write(0x74, false);
-				_dialog1.write(0x76, true);
+				local._dialog1.write(0x74, false);
+				local._dialog1.write(0x76, true);
 				break;
 
 			case 0x75:
 			case 0x78:
 				handleWomanSpeech(0x7B);
-				_dialog1.write(_action._activeAction._verbId, false);
+				local._dialog1.write(_action._activeAction._verbId, false);
 				_vm->_dialogs->show(20501);
 				break;
 
@@ -202,7 +204,7 @@ static void room_205_parser() {
 					_scene->_sequences.addTimer(120, 2);
 				} else if (_game._trigger == 2) {
 					handleWomanSpeech(0x7E);
-					_dialog1.write(0x76, false);
+					local._dialog1.write(0x76, false);
 					_globals[kChickenPermitted] = true;
 				}
 				break;
@@ -217,7 +219,7 @@ static void room_205_parser() {
 			}
 
 			if (_action._activeAction._verbId != 0x77)
-				_dialog1.start();
+				local._dialog1.start();
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(20502);
@@ -230,9 +232,9 @@ static void room_205_parser() {
 		} else if (_game._trigger == 1) {
 			_game._player._stepEnabled = true;
 			handleWomanSpeech(0x79);
-			_dialog1.write(0x5A, true);
-			_dialog1.write(0x75, true);
-			_dialog1.start();
+			local._dialog1.write(0x5A, true);
+			local._dialog1.write(0x75, true);
+			local._dialog1.start();
 		}
 	} else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		if (_game._trigger == 0) {
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index 35ae2f30de3..a72f41bddda 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -32,38 +32,20 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Scene207::Scene207(RexNebularEngine *vm) : Scene2xx(vm) {
-	_vultureFl = false;
-	_spiderFl = false;
-	_eyeFl = false;
-	_spiderHotspotId = -1;
-	_vultureHotspotId = -1;
-
-	_spiderTime = _game._player._priorTimer;
-	_vultureTime = _game._player._priorTimer;
-}
-
-void Scene207::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
+struct Scratch {
+	bool _vultureFl;
+	bool _spiderFl;
+	bool _eyeFl;
+	int16 _spiderHotspotId;
+	int16 _vultureHotspotId;
+	long _spiderTime;
+	long _vultureTime;
+};
 
-	s.syncAsByte(_vultureFl);
-	s.syncAsByte(_spiderFl);
-	s.syncAsByte(_eyeFl);
+static Scratch local;
 
-	s.syncAsSint32LE(_spiderHotspotId);
-	s.syncAsSint32LE(_vultureHotspotId);
-}
-
-void Scene207::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_VULTURE);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_SPIDER);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
-void Scene207::enter() {
+static void room_207_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('h', 1));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1));
@@ -82,26 +64,26 @@ void Scene207::enter() {
 	}
 
 	if (var2 > 2)
-		_vultureFl = false;
+		local._vultureFl = false;
 	else
-		_vultureFl = true;
+		local._vultureFl = true;
 
-	_spiderFl = (var2 & 1);
+	local._spiderFl = (var2 & 1);
 
-	if (_vultureFl) {
+	if (local._vultureFl) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 30, 0, 0, 400);
-		_vultureHotspotId = _scene->_dynamicHotspots.add(389, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_vultureHotspotId, Common::Point(254, 94), FACING_WEST);
+		local._vultureHotspotId = _scene->_dynamicHotspots.add(389, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._vultureHotspotId, Common::Point(254, 94), FACING_WEST);
 	}
 
-	if (_spiderFl) {
+	if (local._spiderFl) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -1);
-		_spiderHotspotId = _scene->_dynamicHotspots.add(333, 13, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_spiderHotspotId, Common::Point(59, 132), FACING_SOUTH);
+		local._spiderHotspotId = _scene->_dynamicHotspots.add(333, 13, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._spiderHotspotId, Common::Point(59, 132), FACING_SOUTH);
 	}
 
-	_eyeFl = false;
+	local._eyeFl = false;
 	if (_scene->_priorSceneId == 211) {
 		_game._player._playerPos = Common::Point(13, 105);
 		_game._player._facing = FACING_EAST;
@@ -118,33 +100,33 @@ void Scene207::enter() {
 	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 }
 
-void Scene207::moveVulture() {
+static void moveVulture() {
 	_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
 	_vm->_sound->command(43);
-	_vultureFl = false;
-	_vultureTime = _game._player._priorTimer;
-	_scene->_dynamicHotspots.remove(_vultureHotspotId);
+	local._vultureFl = false;
+	local._vultureTime = _game._player._priorTimer;
+	_scene->_dynamicHotspots.remove(local._vultureHotspotId);
 }
 
-void Scene207::moveSpider() {
+static void moveSpider() {
 	_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
-	_spiderFl = false;
-	_spiderTime = _game._player._priorTimer;
-	_scene->_dynamicHotspots.remove(_spiderHotspotId);
+	local._spiderFl = false;
+	local._spiderTime = _game._player._priorTimer;
+	_scene->_dynamicHotspots.remove(local._spiderHotspotId);
 }
 
-void Scene207::step() {
-	Player &player = _game._player;
+static void room_207_daemon() {
+	auto &player = _game._player;
 
-	if (_vultureFl) {
-		if (((int32)player._priorTimer - _vultureTime) > 1700)
+	if (local._vultureFl) {
+		if (((int32)player._priorTimer - local._vultureTime) > 1700)
 			moveVulture();
 	}
 
-	if (_spiderFl) {
-		if (((int32)player._priorTimer - _spiderTime) > 800)
+	if (local._spiderFl) {
+		if (((int32)player._priorTimer - local._spiderTime) > 800)
 			moveSpider();
 	}
 
@@ -155,9 +137,9 @@ void Scene207::step() {
 	}
 
 	if (_game._trigger == 71)
-		_eyeFl = false;
+		local._eyeFl = false;
 
-	if (_eyeFl)
+	if (local._eyeFl)
 		return;
 
 	if ((_game._player._playerPos.x >= 124) && (_game._player._playerPos.x <= 201)) {
@@ -166,11 +148,11 @@ void Scene207::step() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
-		_eyeFl = true;
+		local._eyeFl = true;
 	}
 }
 
-void Scene207::preActions() {
+static void room_207_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
 		_game._player._walkOffScreenSceneId = 211;
 
@@ -179,14 +161,14 @@ void Scene207::preActions() {
 
 	if (_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) {
 		if (_action.isObject(NOUN_VULTURE)) {
-			_vultureTime = -9999;
+			local._vultureTime = -9999;
 		} else if (_action.isObject(NOUN_SPIDER)) {
-			_spiderTime = -9999;
+			local._spiderTime = -9999;
 		}
 	}
 }
 
-void Scene207::actions() {
+static void room_207_parser() {
 	if (_action._savedFields._lookFlag)
 		_vm->_dialogs->show(20711);
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
@@ -201,10 +183,10 @@ void Scene207::actions() {
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
 			}
-		} else if (_eyeFl) {
+		} else if (local._eyeFl) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[7]);
 			_scene->_sequences.remove(_globals._sequenceIndexes[8]);
-			_eyeFl = false;
+			local._eyeFl = false;
 		}
 
 		if (_action.isAction(VERB_LOOK, NOUN_DENSE_FOREST))
@@ -242,16 +224,30 @@ void Scene207::actions() {
 	_action._inProgress = false;
 }
 
+void room_207_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._vultureFl);
+	s.syncAsByte(local._spiderFl);
+	s.syncAsByte(local._eyeFl);
+
+	s.syncAsSint32LE(local._spiderHotspotId);
+	s.syncAsSint32LE(local._vultureHotspotId);
+}
+
 void room_207_preload() {
+	local._spiderTime = _game._player._priorTimer;
+	local._vultureTime = _game._player._priorTimer;
+
 	room_init_code_pointer = room_207_init;
 	room_pre_parser_code_pointer = room_207_pre_parser;
 	room_parser_code_pointer = room_207_parser;
 	room_daemon_code_pointer = room_207_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_VULTURE);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_SPIDER);
+	_scene->addActiveVocab(VERB_WALKTO);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
index c0fbfb67708..a2fc2f9daef 100644
--- a/engines/mads/madsv2/nebular/rooms/room208.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -32,30 +32,16 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Scene208::Scene208(RexNebularEngine *vm) : Scene2xx(vm) {
-	_rhotundaTurnFl = false;
-	_boundingFl = false;
-	_rhotundaTime = 0;
-}
-
-void Scene208::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
+struct Scratch {
+	bool _rhotundaTurnFl;
+	bool _boundingFl;
+	long _rhotundaTime;
+};
 
-	s.syncAsByte(_rhotundaTurnFl);
-	s.syncAsByte(_boundingFl);
-	s.syncAsSint32LE(_rhotundaTime);
-}
+static Scratch local;
 
-void Scene208::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_HUGE_LEGS);
-	_scene->addActiveVocab(NOUN_LEAF_COVERED_PIT);
-	_scene->addActiveVocab(NOUN_PILE_OF_LEAVES);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
-void Scene208::updateTrap() {
+static void updateTrap() {
 	if (_globals[kRhotundaStatus] == 1) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 24);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
@@ -89,7 +75,7 @@ void Scene208::updateTrap() {
 	}
 }
 
-void Scene208::enter() {
+static void room_208_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
@@ -98,9 +84,9 @@ void Scene208::enter() {
 
 	updateTrap();
 
-	_rhotundaTurnFl = false;
-	_boundingFl = false;
-	_scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_INTERFACE);
+	local._rhotundaTurnFl = false;
+	local._boundingFl = false;
+	_scene->_kernelMessages._talkFont = font_inter;
 	_scene->_textSpacing = 0;
 
 	if (_scene->_priorSceneId == 207) {
@@ -129,30 +115,30 @@ void Scene208::enter() {
 	section_2_music();
 }
 
-void Scene208::step() {
-	if (_boundingFl && _scene->_animation[0] &&
-		(_rhotundaTime <= _scene->_animation[0]->getCurrentFrame())) {
-		_rhotundaTime = _scene->_animation[0]->getCurrentFrame();
+static void room_208_daemon() {
+	if (local._boundingFl && _scene->_animation[0] &&
+		(local._rhotundaTime <= _scene->_animation[0]->getCurrentFrame())) {
+		local._rhotundaTime = _scene->_animation[0]->getCurrentFrame();
 
-		if (_rhotundaTime == 125)
+		if (local._rhotundaTime == 125)
 			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 	}
 
-	if (!_rhotundaTurnFl)
+	if (!local._rhotundaTurnFl)
 		return;
 
 	if ((_game._player._playerPos != Common::Point(20, 148)) || (_game._player._facing != FACING_EAST))
 		return;
 
-	if ((_game._trigger == 0) && _boundingFl)
+	if ((_game._trigger == 0) && local._boundingFl)
 		return;
 
-	_boundingFl = true;
+	local._boundingFl = true;
 
 	switch (_game._trigger) {
 	case 0:
 		_scene->loadAnimation(formAnimName('A', -1), 81);
-		_rhotundaTime = 0;
+		local._rhotundaTime = 0;
 		break;
 	case 81:
 		_scene->_sequences.remove(_globals._spriteIndexes[15]);
@@ -168,8 +154,8 @@ void Scene208::step() {
 	}
 }
 
-void Scene208::preActions() {
-	Player &player = _vm->_game->_player;
+static void room_208_pre_parser() {
+	auto &player = _vm->_game->_player;
 
 	if (_action.isAction(VERB_LOOK) && player._readyToWalk)
 		player._needToWalk = true;
@@ -181,7 +167,7 @@ void Scene208::preActions() {
 		player._walkOffScreenSceneId = 207;
 }
 
-void Scene208::subAction(int mode) {
+static void subAction(int mode) {
 	switch (_game._trigger) {
 	case 0:
 	{
@@ -266,7 +252,7 @@ void Scene208::subAction(int mode) {
 	}
 }
 
-void Scene208::actions() {
+static void room_208_parser() {
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LOWLANDS_TO_NORTH)) {
 		if (_globals[kRhotundaStatus])
 			_scene->_nextSceneId = 203;
@@ -288,7 +274,7 @@ void Scene208::actions() {
 		subAction(3);
 		if (_game._player._stepEnabled) {
 			_game._player._stepEnabled = false;
-			_rhotundaTurnFl = true;
+			local._rhotundaTurnFl = true;
 			_game._player.walk(Common::Point(20, 148), FACING_EAST);
 		}
 	} else if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_LEAF_COVERED_PIT)) {
@@ -342,16 +328,24 @@ void Scene208::actions() {
 	_action._inProgress = false;
 }
 
+void room_208_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._rhotundaTurnFl);
+	s.syncAsByte(local._boundingFl);
+	s.syncAsSint32LE(local._rhotundaTime);
+}
+
 void room_208_preload() {
 	room_init_code_pointer = room_208_init;
 	room_pre_parser_code_pointer = room_208_pre_parser;
 	room_parser_code_pointer = room_208_parser;
 	room_daemon_code_pointer = room_208_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_HUGE_LEGS);
+	_scene->addActiveVocab(NOUN_LEAF_COVERED_PIT);
+	_scene->addActiveVocab(NOUN_PILE_OF_LEAVES);
+	_scene->addActiveVocab(VERB_WALKTO);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index 0d788a23ac0..a049bbbe38d 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -32,92 +32,59 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Scene209::Scene209(RexNebularEngine *vm) : Scene2xx(vm) {
-	_dodgeFl = false;
-	_forceDodgeFl = false;
-	_pitchFl = false;
-	_fallFl = false;
-	_forceFallFl = false;
-	_playingAnimFl = false;
-	_shouldFallFl = false;
-	_shouldDodgeFl = false;
-	_monkeyPosition = 0;
-	_counter = 0;
-	_pauseMode = 0;
-	_binocularsDroppedFl = false;
-	_startShootingInTimerFl = false;
-	_dialogAbortVal = 0;
-	_playingDialogFl = false;
-	_shootMissedLastFl = false;
-	_removeMonkeyFl = false;
-	_shootReadyFl = false;
-	_pauseCounterThreshold = 0;
-	_pauseCounter = 0;
-}
-
-void Scene209::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
-
-	s.syncAsByte(_dodgeFl);
-	s.syncAsByte(_forceDodgeFl);
-	s.syncAsByte(_shouldDodgeFl);
-	s.syncAsByte(_pitchFl);
-	s.syncAsByte(_fallFl);
-	s.syncAsByte(_forceFallFl);
-	s.syncAsByte(_shouldFallFl);
-	s.syncAsByte(_playingAnimFl);
-	s.syncAsByte(_playingDialogFl);
-
-	s.syncAsSint32LE(_pauseMode);
-	s.syncAsSint32LE(_pauseCounterThreshold);
-	s.syncAsSint32LE(_pauseCounter);
-
-	s.syncAsByte(_removeMonkeyFl);
-
-	s.syncAsSint32LE(_monkeyPosition);
-
-	s.syncAsByte(_shootReadyFl);
-	s.syncAsByte(_startShootingInTimerFl);
-	s.syncAsByte(_shootMissedLastFl);
-	s.syncAsByte(_binocularsDroppedFl);
-
-	s.syncAsSint32LE(_dialogAbortVal);
-	s.syncAsSint32LE(_counter);
-}
-
-void Scene209::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_PLANT_STALK);
-}
-
-void Scene209::handlePause() {
+struct Scratch {
+	bool _dodgeFl;
+	bool _forceDodgeFl;
+	bool _pitchFl;
+	bool _fallFl;
+	bool _forceFallFl;
+	bool _playingAnimFl;
+	bool _shouldFallFl;
+	bool _shouldDodgeFl;
+	int32 _monkeyPosition;
+	int32 _counter;
+	int32 _pauseMode;
+	bool _binocularsDroppedFl;
+	bool _startShootingInTimerFl;
+	bool _dialogAbortVal;
+	bool _playingDialogFl;
+	bool _shootMissedLastFl;
+	bool _removeMonkeyFl;
+	bool _shootReadyFl;
+	int32 _pauseCounterThreshold;
+	int32 _pauseCounter;
+};
+
+static Scratch local;
+
+
+static void handlePause() {
 	switch (_game._trigger) {
 	case 124:
-		if (++_pauseCounter <= _pauseCounterThreshold)
+		if (++local._pauseCounter <= local._pauseCounterThreshold)
 			_scene->_sequences.addTimer(60, 124);
 		else
-			_pauseMode = 0;
+			local._pauseMode = 0;
 		break;
 	default:
 		break;
 	}
 }
 
-void Scene209::initPauseCounterThreshold() {
+static void initPauseCounterThreshold() {
 	switch (_game._trigger) {
 	case 226:
 		_scene->_sequences.addTimer(1, 124);
-		_pauseCounterThreshold = _vm->getRandomNumber(7, 12);
-		_pauseMode = 2;
-		_pauseCounter = 0;
+		local._pauseCounterThreshold = _vm->getRandomNumber(7, 12);
+		local._pauseMode = 2;
+		local._pauseCounter = 0;
 		break;
 	default:
 		break;
 	}
 }
 
-void Scene209::handlePeek() {
+static void handlePeek() {
 	switch (_game._trigger) {
 	case 133:
 		_vm->_sound->command(18);
@@ -155,9 +122,9 @@ void Scene209::handlePeek() {
 		break;
 
 	case 138:
-		_pauseMode = 1;
+		local._pauseMode = 1;
 		_scene->_hotspots.activate(227, false);
-		_playingAnimFl = false;
+		local._playingAnimFl = false;
 		break;
 
 	default:
@@ -165,7 +132,7 @@ void Scene209::handlePeek() {
 	}
 }
 
-void Scene209::handleVerticalMove() {
+static void handleVerticalMove() {
 	switch (_game._trigger) {
 	case 140:
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 8, 0, 1);
@@ -191,8 +158,8 @@ void Scene209::handleVerticalMove() {
 		break;
 
 	case 143:
-		_pauseMode = 1;
-		_playingAnimFl = false;
+		local._pauseMode = 1;
+		local._playingAnimFl = false;
 		_scene->_hotspots.activate(227, false);
 		break;
 
@@ -201,11 +168,11 @@ void Scene209::handleVerticalMove() {
 	}
 }
 
-void Scene209::handleLookStay() {
+static void handleLookStay() {
 	switch (_game._trigger) {
 	case 145:
 		_vm->_sound->command(18);
-		_monkeyPosition = 2;
+		local._monkeyPosition = 2;
 		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 146);
@@ -230,16 +197,16 @@ void Scene209::handleLookStay() {
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
 
-		if (!_dodgeFl) {
+		if (!local._dodgeFl) {
 			_scene->_sequences.addTimer(90, 149);
 		} else {
 			_scene->_sequences.addTimer(1, 149);
-			_shouldDodgeFl = true;
+			local._shouldDodgeFl = true;
 		}
 		break;
 
 	case 149:
-		_playingAnimFl = false;
+		local._playingAnimFl = false;
 		break;
 
 	default:
@@ -247,7 +214,7 @@ void Scene209::handleLookStay() {
 	}
 }
 
-void Scene209::handleLookRight() {
+static void handleLookRight() {
 	switch (_game._trigger) {
 	case 151:
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
@@ -266,9 +233,9 @@ void Scene209::handleLookRight() {
 	break;
 
 	case 153:
-		_playingAnimFl = false;
-		if (_dodgeFl)
-			_shouldDodgeFl = true;
+		local._playingAnimFl = false;
+		if (local._dodgeFl)
+			local._shouldDodgeFl = true;
 		break;
 
 	default:
@@ -276,7 +243,7 @@ void Scene209::handleLookRight() {
 	}
 }
 
-void Scene209::handleBlink() {
+static void handleBlink() {
 	switch (_game._trigger) {
 	case 155:
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
@@ -297,9 +264,9 @@ void Scene209::handleBlink() {
 		break;
 
 	case 158:
-		_playingAnimFl = false;
-		if (_dodgeFl)
-			_shouldDodgeFl = true;
+		local._playingAnimFl = false;
+		if (local._dodgeFl)
+			local._shouldDodgeFl = true;
 		break;
 
 	default:
@@ -307,16 +274,16 @@ void Scene209::handleBlink() {
 	}
 }
 
-void Scene209::handleGetBinoculars() {
+static void handleGetBinoculars() {
 	switch (_game._trigger) {
 	case 161:
 		_vm->_sound->command(18);
-		_monkeyPosition = 3;
+		local._monkeyPosition = 3;
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 24);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 20, 165);
-		if (!_fallFl && !_dodgeFl) {
+		if (!local._fallFl && !local._dodgeFl) {
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 162);
 		} else {
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
@@ -344,9 +311,9 @@ void Scene209::handleGetBinoculars() {
 	break;
 
 	case 164:
-		_playingAnimFl = false;
-		if (_fallFl)
-			_shouldFallFl = true;
+		local._playingAnimFl = false;
+		if (local._fallFl)
+			local._shouldFallFl = true;
 		break;
 
 	case 165:
@@ -358,7 +325,7 @@ void Scene209::handleGetBinoculars() {
 	}
 }
 
-void Scene209::handleBinocularBlink() {
+static void handleBinocularBlink() {
 	switch (_game._trigger) {
 	case 167:
 	{
@@ -382,9 +349,9 @@ void Scene209::handleBinocularBlink() {
 	break;
 
 	case 169:
-		_playingAnimFl = false;
-		if (_fallFl)
-			_shouldFallFl = true;
+		local._playingAnimFl = false;
+		if (local._fallFl)
+			local._shouldFallFl = true;
 		break;
 
 	default:
@@ -392,7 +359,7 @@ void Scene209::handleBinocularBlink() {
 	}
 }
 
-void Scene209::handleBinocularScan() {
+static void handleBinocularScan() {
 	switch (_game._trigger) {
 	case 171:
 	{
@@ -446,9 +413,9 @@ void Scene209::handleBinocularScan() {
 	break;
 
 	case 175:
-		_playingAnimFl = false;
-		if (_fallFl)
-			_shouldFallFl = true;
+		local._playingAnimFl = false;
+		if (local._fallFl)
+			local._shouldFallFl = true;
 		break;
 
 	default:
@@ -456,20 +423,20 @@ void Scene209::handleBinocularScan() {
 	}
 }
 
-void Scene209::handleJumpInTree() {
+static void handleJumpInTree() {
 	switch (_game._trigger) {
 	case 178:
 	{
 		int oldIdx = 0;
-		_monkeyPosition = 1;
-		if (_removeMonkeyFl)
+		local._monkeyPosition = 1;
+		if (local._removeMonkeyFl)
 			_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		else
 			oldIdx = _globals._sequenceIndexes[3];
 
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 46, 49);
-		if (!_removeMonkeyFl)
+		if (!local._removeMonkeyFl)
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
 
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 179);
@@ -488,9 +455,9 @@ void Scene209::handleJumpInTree() {
 	break;
 
 	case 180:
-		_removeMonkeyFl = true;
-		_pauseMode = 1;
-		_playingAnimFl = false;
+		local._removeMonkeyFl = true;
+		local._pauseMode = 1;
+		local._playingAnimFl = false;
 		_scene->_hotspots.activate(227, false);
 		break;
 
@@ -499,7 +466,7 @@ void Scene209::handleJumpInTree() {
 	}
 }
 
-void Scene209::handleTongue() {
+static void handleTongue() {
 	switch (_game._trigger) {
 	case 182:
 	{
@@ -550,7 +517,7 @@ void Scene209::handleTongue() {
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 40, 41);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 178);
-		_removeMonkeyFl = false;
+		local._removeMonkeyFl = false;
 	}
 	break;
 
@@ -559,10 +526,10 @@ void Scene209::handleTongue() {
 	}
 }
 
-void Scene209::handleStandFromPeek() {
+static void handleStandFromPeek() {
 	switch (_game._trigger) {
 	case 189:
-		_monkeyPosition = 4;
+		local._monkeyPosition = 4;
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 50);
 		_scene->_sequences.addTimer(8, 190);
@@ -598,8 +565,8 @@ void Scene209::handleStandFromPeek() {
 		break;
 
 	case 194:
-		_playingAnimFl = false;
-		_counter = 0;
+		local._playingAnimFl = false;
+		local._counter = 0;
 		break;
 
 	default:
@@ -607,7 +574,7 @@ void Scene209::handleStandFromPeek() {
 	}
 }
 
-void Scene209::handleStandBlink() {
+static void handleStandBlink() {
 	switch (_game._trigger) {
 	case 246:
 		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
@@ -628,7 +595,7 @@ void Scene209::handleStandBlink() {
 		break;
 
 	case 249:
-		_playingAnimFl = false;
+		local._playingAnimFl = false;
 		break;
 
 	default:
@@ -636,11 +603,11 @@ void Scene209::handleStandBlink() {
 	}
 }
 
-void Scene209::handleJumpAndHide() {
+static void handleJumpAndHide() {
 	switch (_game._trigger) {
 	case 196:
 		_vm->_sound->command(18);
-		_monkeyPosition = 1;
+		local._monkeyPosition = 1;
 		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 16);
@@ -648,9 +615,9 @@ void Scene209::handleJumpAndHide() {
 		break;
 
 	case 197:
-		_pauseMode = 1;
+		local._pauseMode = 1;
 		_scene->_hotspots.activate(227, false);
-		_playingAnimFl = false;
+		local._playingAnimFl = false;
 		break;
 
 	default:
@@ -658,7 +625,7 @@ void Scene209::handleJumpAndHide() {
 	}
 }
 
-void Scene209::handleMonkeyEating() {
+static void handleMonkeyEating() {
 	switch (_game._trigger) {
 	case 199:
 		_vm->_sound->command(18);
@@ -722,7 +689,7 @@ void Scene209::handleMonkeyEating() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 22, 25);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
-		if (!_dodgeFl && !_fallFl)
+		if (!local._dodgeFl && !local._fallFl)
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 207);
 		else
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209);
@@ -764,7 +731,7 @@ void Scene209::handleMonkeyEating() {
 	break;
 
 	case 210:
-		_playingAnimFl = false;
+		local._playingAnimFl = false;
 		break;
 
 	default:
@@ -772,7 +739,7 @@ void Scene209::handleMonkeyEating() {
 	}
 }
 
-void Scene209::handleMonkeyFall() {
+static void handleMonkeyFall() {
 	switch (_game._trigger) {
 	case 219:
 	{
@@ -787,7 +754,7 @@ void Scene209::handleMonkeyFall() {
 		_scene->_sequences.addTimer(40, 100);
 		_scene->_hotspots.activate(227, false);
 		int oldIdx = _globals._sequenceIndexes[3];
-		_monkeyPosition = 1;
+		local._monkeyPosition = 1;
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 35);
@@ -803,7 +770,7 @@ void Scene209::handleMonkeyFall() {
 		_scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 90, _game.getQuote(159));
 		_scene->_hotspots.activate(227, false);
 		int oldIdx = _globals._sequenceIndexes[3];
-		_monkeyPosition = 1;
+		local._monkeyPosition = 1;
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 36, 42);
@@ -816,7 +783,7 @@ void Scene209::handleMonkeyFall() {
 	case 221:
 	{
 		_game._objects.setRoom(OBJ_BINOCULARS, 209);
-		_binocularsDroppedFl = true;
+		local._binocularsDroppedFl = true;
 		int oldIdx = _globals._sequenceIndexes[8];
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
@@ -848,10 +815,10 @@ void Scene209::handleMonkeyFall() {
 		break;
 
 	case 224:
-		_playingAnimFl = false;
-		_fallFl = false;
-		_counter = 0;
-		_pauseMode = 0;
+		local._playingAnimFl = false;
+		local._fallFl = false;
+		local._counter = 0;
+		local._pauseMode = 0;
 		_vm->_dialogs->show(20910);
 		_game._player._stepEnabled = true;
 		break;
@@ -861,7 +828,7 @@ void Scene209::handleMonkeyFall() {
 	}
 }
 
-void Scene209::handleMonkey1() {
+static void handleMonkey1() {
 	switch (_game._trigger) {
 	case 212:
 		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
@@ -914,9 +881,9 @@ void Scene209::handleMonkey1() {
 	break;
 
 	case 217:
-		_pitchFl = false;
-		_counter = 0;
-		_pauseMode = 0;
+		local._pitchFl = false;
+		local._counter = 0;
+		local._pauseMode = 0;
 		_scene->_sequences.addTimer(1, 196);
 		break;
 
@@ -925,7 +892,7 @@ void Scene209::handleMonkey1() {
 	}
 }
 
-void Scene209::handleMonkey2() {
+static void handleMonkey2() {
 	switch (_game._trigger) {
 	case 251:
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(137));
@@ -964,7 +931,7 @@ void Scene209::handleMonkey2() {
 	}
 }
 
-void Scene209::handleDodge() {
+static void handleDodge() {
 	switch (_game._trigger) {
 	case 241:
 		_scene->_hotspots.activate(227, true);
@@ -984,13 +951,13 @@ void Scene209::handleDodge() {
 		_vm->_sound->command(18);
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
-		_playingAnimFl = false;
-		_pauseMode = 0;
+		local._playingAnimFl = false;
+		local._pauseMode = 0;
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 90, _game.getQuote(155));
-		if (!_shootMissedLastFl) {
+		if (!local._shootMissedLastFl) {
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(135));
-			_shootMissedLastFl = true;
+			local._shootMissedLastFl = true;
 		} else {
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(136));
 		}
@@ -1001,7 +968,7 @@ void Scene209::handleDodge() {
 	}
 }
 
-void Scene209::enter() {
+static void room_209_init() {
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
@@ -1048,163 +1015,163 @@ void Scene209::enter() {
 		_globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS;
 	}
 
-	_pitchFl = false;
-	_fallFl = false;
-	_dodgeFl = false;
-	_playingAnimFl = false;
-	_monkeyPosition = 1;
-	_counter = 0;
-	_pauseMode = 0;
-	_forceFallFl = false;
-	_shouldFallFl = false;
-	_forceDodgeFl = false;
-	_binocularsDroppedFl = false;
-	_shouldDodgeFl = false;
-	_startShootingInTimerFl = false;
-	_dialogAbortVal = 5;
-	_playingDialogFl = false;
-	_shootMissedLastFl = false;
-	_removeMonkeyFl = true;
-	_shootReadyFl = false;
+	local._pitchFl = false;
+	local._fallFl = false;
+	local._dodgeFl = false;
+	local._playingAnimFl = false;
+	local._monkeyPosition = 1;
+	local._counter = 0;
+	local._pauseMode = 0;
+	local._forceFallFl = false;
+	local._shouldFallFl = false;
+	local._forceDodgeFl = false;
+	local._binocularsDroppedFl = false;
+	local._shouldDodgeFl = false;
+	local._startShootingInTimerFl = false;
+	local._dialogAbortVal = 5;
+	local._playingDialogFl = false;
+	local._shootMissedLastFl = false;
+	local._removeMonkeyFl = true;
+	local._shootReadyFl = false;
 
 	_scene->_hotspots.activate(227, false);
 
 	section_2_music();
 }
 
-void Scene209::step() {
-	if (!_playingAnimFl && !_pitchFl && !_fallFl && !_dodgeFl && (_pauseMode == 0) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) {
+static void room_209_daemon() {
+	if (!local._playingAnimFl && !local._pitchFl && !local._fallFl && !local._dodgeFl && (local._pauseMode == 0) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) {
 		int randAction = _vm->getRandomNumber(1, 50);
 		switch (randAction) {
 		case 1:
-			if ((_monkeyPosition == 1) && (_counter < 2)) {
+			if ((local._monkeyPosition == 1) && (local._counter < 2)) {
 				_scene->_sequences.addTimer(1, 133);
-				_playingAnimFl = true;
+				local._playingAnimFl = true;
 				_scene->_hotspots.activate(227, true);
-				++_counter;
+				++local._counter;
 			}
 			break;
 
 		case 2:
-			if ((_monkeyPosition == 1) && (_counter < 2)) {
+			if ((local._monkeyPosition == 1) && (local._counter < 2)) {
 				_scene->_sequences.addTimer(1, 140);
 				_scene->_hotspots.activate(227, true);
-				_playingAnimFl = true;
-				++_counter;
+				local._playingAnimFl = true;
+				++local._counter;
 			}
 			break;
 
 		case 3:
-			if (_monkeyPosition == 1) {
+			if (local._monkeyPosition == 1) {
 				_scene->_sequences.addTimer(1, 145);
 				_scene->_hotspots.activate(227, true);
-				_playingAnimFl = true;
-				_counter = 0;
+				local._playingAnimFl = true;
+				local._counter = 0;
 			}
 			break;
 
 		case 4:
-			if ((_monkeyPosition == 2) && (_counter < 2)) {
+			if ((local._monkeyPosition == 2) && (local._counter < 2)) {
 				_scene->_sequences.addTimer(1, 151);
 				_scene->_hotspots.activate(227, true);
-				++_counter;
-				_playingAnimFl = true;
+				++local._counter;
+				local._playingAnimFl = true;
 			}
 			break;
 
 		case 5:
-			if (_monkeyPosition == 2) {
+			if (local._monkeyPosition == 2) {
 				_scene->_sequences.addTimer(1, 161);
 				_scene->_hotspots.activate(227, true);
-				_counter = 0;
-				_playingAnimFl = true;
+				local._counter = 0;
+				local._playingAnimFl = true;
 			}
 			break;
 
 		case 6:
-			if (_monkeyPosition == 2) {
+			if (local._monkeyPosition == 2) {
 				_scene->_sequences.addTimer(1, 189);
 				_scene->_hotspots.activate(227, true);
-				_counter = 0;
-				_playingAnimFl = true;
+				local._counter = 0;
+				local._playingAnimFl = true;
 			}
 			break;
 		case 7:
-			if (_monkeyPosition == 3) {
+			if (local._monkeyPosition == 3) {
 				_scene->_hotspots.activate(227, true);
 				_scene->_sequences.addTimer(1, 167);
-				_playingAnimFl = true;
+				local._playingAnimFl = true;
 			}
 			break;
 
 		case 8:
-			if (_monkeyPosition == 3) {
+			if (local._monkeyPosition == 3) {
 				_scene->_sequences.addTimer(1, 178);
-				_playingAnimFl = true;
+				local._playingAnimFl = true;
 				_scene->_hotspots.activate(227, true);
-				_counter = 0;
+				local._counter = 0;
 			}
 			break;
 
 		case 9:
-			if ((_monkeyPosition == 3) && (_game._player._playerPos.x < 120)) {
+			if ((local._monkeyPosition == 3) && (_game._player._playerPos.x < 120)) {
 				_scene->_sequences.addTimer(1, 182);
 				_scene->_hotspots.activate(227, true);
-				_counter = 0;
-				_playingAnimFl = true;
+				local._counter = 0;
+				local._playingAnimFl = true;
 			}
 			break;
 
 		case 10:
-			if (_monkeyPosition == 4) {
+			if (local._monkeyPosition == 4) {
 				_scene->_sequences.addTimer(1, 196);
 				_scene->_hotspots.activate(227, true);
-				_playingAnimFl = true;
-				_counter = 0;
+				local._playingAnimFl = true;
+				local._counter = 0;
 			}
 			break;
 
 		case 11:
-			if ((_monkeyPosition == 4) && (_counter < 3)) {
+			if ((local._monkeyPosition == 4) && (local._counter < 3)) {
 				_scene->_sequences.addTimer(1, 199);
 				_scene->_hotspots.activate(227, true);
-				++_counter;
-				_playingAnimFl = true;
+				++local._counter;
+				local._playingAnimFl = true;
 			}
 			break;
 
 		case 30:
-			if (_monkeyPosition == 4) {
+			if (local._monkeyPosition == 4) {
 				_scene->_sequences.addTimer(1, 246);
 				_scene->_hotspots.activate(227, true);
-				_counter = 0;
-				_playingAnimFl = true;
+				local._counter = 0;
+				local._playingAnimFl = true;
 			}
 			break;
 
 		default:
-			if ((randAction >= 12) && (randAction <= 20) && (_monkeyPosition == 2) && (_counter < 5)) {
+			if ((randAction >= 12) && (randAction <= 20) && (local._monkeyPosition == 2) && (local._counter < 5)) {
 				_scene->_sequences.addTimer(1, 155);
-				++_counter;
-				_playingAnimFl = true;
+				++local._counter;
+				local._playingAnimFl = true;
 			}
 
-			if ((randAction >= 21) && (randAction <= 29) && (_monkeyPosition == 3) && (_counter < 3)) {
+			if ((randAction >= 21) && (randAction <= 29) && (local._monkeyPosition == 3) && (local._counter < 3)) {
 				_scene->_sequences.addTimer(1, 171);
-				_playingAnimFl = true;
-				++_counter;
+				local._playingAnimFl = true;
+				++local._counter;
 			}
 			break;
 		}
 	}
 
-	if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1))
+	if (!local._dodgeFl && !local._pitchFl && !local._fallFl && (local._pauseMode == 1))
 		_scene->_sequences.addTimer(1, 226);
 
-	if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 2))
+	if (!local._dodgeFl && !local._pitchFl && !local._fallFl && (local._pauseMode == 2))
 		handlePause();
 
-	if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1))
+	if (!local._dodgeFl && !local._pitchFl && !local._fallFl && (local._pauseMode == 1))
 		initPauseCounterThreshold();
 
 	handlePeek();
@@ -1226,72 +1193,72 @@ void Scene209::step() {
 	handleStandBlink();
 	handleMonkey2();
 
-	if ((_monkeyPosition == 1) && !_playingAnimFl && _fallFl) {
+	if ((local._monkeyPosition == 1) && !local._playingAnimFl && local._fallFl) {
 		_scene->_sequences.addTimer(1, 145);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 2) && !_playingAnimFl && _fallFl) {
+	if ((local._monkeyPosition == 2) && !local._playingAnimFl && local._fallFl) {
 		_scene->_sequences.addTimer(1, 161);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 4) && !_playingAnimFl && _fallFl) {
+	if ((local._monkeyPosition == 4) && !local._playingAnimFl && local._fallFl) {
 		_scene->_sequences.addTimer(1, 196);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 3) && !_playingAnimFl && _fallFl && _forceFallFl) {
+	if ((local._monkeyPosition == 3) && !local._playingAnimFl && local._fallFl && local._forceFallFl) {
 		_scene->_sequences.addTimer(1, 219);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 1) && !_playingAnimFl && _pitchFl) {
+	if ((local._monkeyPosition == 1) && !local._playingAnimFl && local._pitchFl) {
 		_scene->_sequences.addTimer(1, 145);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 2) && !_playingAnimFl && _pitchFl) {
+	if ((local._monkeyPosition == 2) && !local._playingAnimFl && local._pitchFl) {
 		_scene->_sequences.addTimer(1, 189);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 4) && !_playingAnimFl && _pitchFl) {
+	if ((local._monkeyPosition == 4) && !local._playingAnimFl && local._pitchFl) {
 		_scene->_sequences.addTimer(1, 212);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 3) && !_playingAnimFl && _pitchFl) {
+	if ((local._monkeyPosition == 3) && !local._playingAnimFl && local._pitchFl) {
 		_scene->_sequences.addTimer(1, 178);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 1) && !_playingAnimFl && _dodgeFl) {
+	if ((local._monkeyPosition == 1) && !local._playingAnimFl && local._dodgeFl) {
 		_scene->_sequences.addTimer(1, 145);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 4) && !_playingAnimFl && _dodgeFl) {
+	if ((local._monkeyPosition == 4) && !local._playingAnimFl && local._dodgeFl) {
 		_scene->_sequences.addTimer(1, 196);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 3) && !_playingAnimFl && _dodgeFl) {
+	if ((local._monkeyPosition == 3) && !local._playingAnimFl && local._dodgeFl) {
 		_scene->_sequences.addTimer(1, 178);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if ((_monkeyPosition == 2) && !_playingAnimFl && _dodgeFl && _forceDodgeFl) {
+	if ((local._monkeyPosition == 2) && !local._playingAnimFl && local._dodgeFl && local._forceDodgeFl) {
 		_scene->_sequences.addTimer(1, 241);
-		_playingAnimFl = true;
+		local._playingAnimFl = true;
 	}
 
-	if (_dodgeFl || _fallFl) { /* if want to dodge or fall */
-		if (!_playingAnimFl && (_monkeyPosition == 2))
-			_shouldDodgeFl = true;
+	if (local._dodgeFl || local._fallFl) { /* if want to dodge or fall */
+		if (!local._playingAnimFl && (local._monkeyPosition == 2))
+			local._shouldDodgeFl = true;
 
-		if (!_playingAnimFl && (_monkeyPosition == 3))
-			_shouldFallFl = true;
+		if (!local._playingAnimFl && (local._monkeyPosition == 3))
+			local._shouldFallFl = true;
 
 		switch (_game._trigger) {
 		case 228:
@@ -1347,15 +1314,15 @@ void Scene209::step() {
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
 			_scene->_sequences.addTimer(2, 233);
 			_scene->_kernelMessages.reset();
-			if (_dodgeFl && (_monkeyPosition != 1) && (_monkeyPosition != 2))
+			if (local._dodgeFl && (local._monkeyPosition != 1) && (local._monkeyPosition != 2))
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138));
-			if (_fallFl && (_monkeyPosition != 3))
+			if (local._fallFl && (local._monkeyPosition != 3))
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138));
 		}
 		break;
 
 		case 233:
-			_shootReadyFl = true;
+			local._shootReadyFl = true;
 			break;
 
 		case 234:
@@ -1386,8 +1353,8 @@ void Scene209::step() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
 			_scene->_sequences.addTimer(12, 236);
-			_forceFallFl = true;
-			_forceDodgeFl = true;
+			local._forceFallFl = true;
+			local._forceDodgeFl = true;
 		}
 		break;
 
@@ -1408,21 +1375,21 @@ void Scene209::step() {
 
 		case 238:
 			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
-			if (_dodgeFl)
+			if (local._dodgeFl)
 				_game._player._stepEnabled = true;
 
-			_startShootingInTimerFl = false;
+			local._startShootingInTimerFl = false;
 
-			if (_fallFl) {
+			if (local._fallFl) {
 				_globals[kMonkeyStatus] = MONKEY_IS_GONE;
 				_game._objects.setRoom(OBJ_POISON_DARTS, NOWHERE);
 			}
-			_dodgeFl = false;
-			_fallFl = false;
-			_forceFallFl = false;
-			_forceDodgeFl = false;
-			_shouldFallFl = false;
-			_shouldDodgeFl = false;
+			local._dodgeFl = false;
+			local._fallFl = false;
+			local._forceFallFl = false;
+			local._forceDodgeFl = false;
+			local._shouldFallFl = false;
+			local._shouldDodgeFl = false;
 			break;
 
 		case 239:
@@ -1437,13 +1404,13 @@ void Scene209::step() {
 	if (_game._trigger == 100)
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(134));
 
-	if (_shootReadyFl && (_shouldFallFl || _shouldDodgeFl)) {
+	if (local._shootReadyFl && (local._shouldFallFl || local._shouldDodgeFl)) {
 		_scene->_sequences.addTimer(4, 234);
-		_shootReadyFl = false;
+		local._shootReadyFl = false;
 	}
 }
 
-void Scene209::preActions() {
+static void room_209_pre_parser() {
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_WEST))
 		_game._player._walkOffScreenSceneId = 208;
 
@@ -1465,7 +1432,7 @@ void Scene209::preActions() {
 	}
 }
 
-void Scene209::actions() {
+static void room_209_parser() {
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(20912);
 		_action._inProgress = false;
@@ -1478,9 +1445,9 @@ void Scene209::actions() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TALKTO, NOUN_MONKEY) && !_pitchFl && !_playingDialogFl) {
-		_scene->_sequences.addTimer(1, _dialogAbortVal);
-		_playingDialogFl = true;
+	if (_action.isAction(VERB_TALKTO, NOUN_MONKEY) && !local._pitchFl && !local._playingDialogFl) {
+		_scene->_sequences.addTimer(1, local._dialogAbortVal);
+		local._playingDialogFl = true;
 		_game._player._stepEnabled = false;
 		_action._inProgress = false;
 		return;
@@ -1489,7 +1456,7 @@ void Scene209::actions() {
 	switch (_game._trigger) {
 	case 130:
 		_game._player._stepEnabled = true;
-		_playingDialogFl = false;
+		local._playingDialogFl = false;
 		_action._inProgress = false;
 		return;
 
@@ -1502,7 +1469,7 @@ void Scene209::actions() {
 	case 6:
 		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151));
 		_scene->_sequences.addTimer(60, 130);
-		_dialogAbortVal = 7;
+		local._dialogAbortVal = 7;
 		_action._inProgress = false;
 		return;
 
@@ -1515,7 +1482,7 @@ void Scene209::actions() {
 	case 8:
 		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(149));
 		_scene->_sequences.addTimer(60, 130);
-		_dialogAbortVal = 9;
+		local._dialogAbortVal = 9;
 		_action._inProgress = false;
 		return;
 
@@ -1534,7 +1501,7 @@ void Scene209::actions() {
 	case 11:
 		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(152));
 		_scene->_sequences.addTimer(60, 130);
-		_dialogAbortVal = 12;
+		local._dialogAbortVal = 12;
 		_action._inProgress = false;
 		return;
 
@@ -1553,7 +1520,7 @@ void Scene209::actions() {
 	case 14:
 		_scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151));
 		_scene->_sequences.addTimer(60, 130);
-		_dialogAbortVal = 15;
+		local._dialogAbortVal = 15;
 		_action._inProgress = false;
 		return;
 
@@ -1570,16 +1537,16 @@ void Scene209::actions() {
 
 	case 17:
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 130, 60, _game.getQuote(147));
-		_dialogAbortVal = 18;
+		local._dialogAbortVal = 18;
 		_action._inProgress = false;
 		return;
 
 	case 18:
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(148));
-		_pitchFl = true;
-		_playingDialogFl = false;
-		_dialogAbortVal = 5;
+		local._pitchFl = true;
+		local._playingDialogFl = false;
+		local._dialogAbortVal = 5;
 		_action._inProgress = false;
 		return;
 
@@ -1590,29 +1557,29 @@ void Scene209::actions() {
 	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
 		if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
 			&& _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
-			if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) {
+			if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY) && !local._startShootingInTimerFl) {
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(1, 231);
-				_startShootingInTimerFl = true;
+				local._startShootingInTimerFl = true;
 				_game._player._stepEnabled = false;
-				_dodgeFl = true;
+				local._dodgeFl = true;
 				_action._inProgress = false;
 				return;
 			}
 
-			if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) {
+			if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY) && !local._startShootingInTimerFl) {
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(1, 228);
 				_game._player._stepEnabled = false;
-				_fallFl = true;
-				_startShootingInTimerFl = true;
+				local._fallFl = true;
+				local._startShootingInTimerFl = true;
 				_action._inProgress = false;
 				return;
 			}
 		}
 
 		if (_action.isAction(VERB_LOOK, NOUN_MONKEY)) {
-			_pitchFl = true;
+			local._pitchFl = true;
 			_game._player._stepEnabled = false;
 			_vm->_dialogs->show(20914);
 			_action._inProgress = false;
@@ -1673,7 +1640,7 @@ void Scene209::actions() {
 		case 2:
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
-			_binocularsDroppedFl = false;
+			local._binocularsDroppedFl = false;
 			_scene->_sequences.addTimer(4, 3);
 			break;
 
@@ -1759,7 +1726,7 @@ void Scene209::actions() {
 
 	if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
 		if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
-			if (_monkeyPosition == 1)
+			if (local._monkeyPosition == 1)
 				_vm->_dialogs->show(20917);
 			else
 				_vm->_dialogs->show(20918);
@@ -1786,16 +1753,43 @@ void Scene209::actions() {
 	}
 }
 
+void room_209_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._dodgeFl);
+	s.syncAsByte(local._forceDodgeFl);
+	s.syncAsByte(local._shouldDodgeFl);
+	s.syncAsByte(local._pitchFl);
+	s.syncAsByte(local._fallFl);
+	s.syncAsByte(local._forceFallFl);
+	s.syncAsByte(local._shouldFallFl);
+	s.syncAsByte(local._playingAnimFl);
+	s.syncAsByte(local._playingDialogFl);
+
+	s.syncAsSint32LE(local._pauseMode);
+	s.syncAsSint32LE(local._pauseCounterThreshold);
+	s.syncAsSint32LE(local._pauseCounter);
+
+	s.syncAsByte(local._removeMonkeyFl);
+
+	s.syncAsSint32LE(local._monkeyPosition);
+
+	s.syncAsByte(local._shootReadyFl);
+	s.syncAsByte(local._startShootingInTimerFl);
+	s.syncAsByte(local._shootMissedLastFl);
+	s.syncAsByte(local._binocularsDroppedFl);
+
+	s.syncAsSint32LE(local._dialogAbortVal);
+	s.syncAsSint32LE(local._counter);
+}
+
 void room_209_preload() {
 	room_init_code_pointer = room_209_init;
 	room_pre_parser_code_pointer = room_209_pre_parser;
 	room_parser_code_pointer = room_209_parser;
 	room_daemon_code_pointer = room_209_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_PLANT_STALK);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index f6a1b3382e4..53ccef5f52f 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -22,6 +22,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/conversation.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
@@ -32,69 +33,53 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Scene210::Scene210(RexNebularEngine *vm) : Scene2xx(vm) {
-	_curDialogNode = -1;
-	_nextHandsPlace = 0;
-	_twinkleAnimationType = 0;
-	_twinklesCurrentFrame = 0;
-	_shouldTalk = false;
-	_shouldFaceRex = false;
-	_shouldMoveHead = false;
-	_stopWalking = false;
-	_twinklesTalking = false;
-	_twinklesTalk2 = false;
-	_doorway = 0;
-	_subQuote2 = "";
-}
-
-void Scene210::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
-
-	s.syncAsSint32LE(_curDialogNode);
-	s.syncAsSint32LE(_nextHandsPlace);
-	s.syncAsSint32LE(_twinkleAnimationType);
-	s.syncAsSint32LE(_twinklesCurrentFrame);
-
-	s.syncAsByte(_shouldTalk);
-	s.syncAsByte(_shouldFaceRex);
-	s.syncAsByte(_shouldMoveHead);
-	s.syncAsByte(_stopWalking);
-	s.syncAsByte(_twinklesTalking);
-	s.syncAsByte(_twinklesTalk2);
-
-	s.syncAsSint32LE(_doorway);
-
-	s.syncString(_subQuote2);
-}
-
-void Scene210::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_DOORWAY);
-	_scene->addActiveVocab(VERB_WALK_THROUGH);
-}
-
-void Scene210::handleConversations() {
+struct Scratch {
+	int32 _curDialogNode;
+	int32 _nextHandsPlace;
+	int32 _twinkleAnimationType;
+	int32 _twinklesCurrentFrame;
+	bool _shouldTalk;
+	bool _shouldFaceRex;
+	bool _shouldMoveHead;
+	bool _stopWalking;
+	bool _twinklesTalking;
+	bool _twinklesTalk2;
+	int32 _doorway;
+	char _subQuote2[256];
+	Conversation _conv1;
+	Conversation _conv2;
+	Conversation _conv3;
+	Conversation _conv5;
+	Conversation _conv6;
+	Conversation _conv7;
+	Conversation _conv8;
+};
+
+static Scratch local;
+
+
+static void handleConversations() {
 	if (_game._trigger == 0) {
 		_scene->_kernelMessages.reset();
 		_game._player._stepEnabled = false;
 		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
 		if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
-			Common::String subQuote1;
-			_game.splitQuote(curQuote, subQuote1, _subQuote2);
+			Common::String subQuote1, subQuote2;
+			_game.splitQuote(curQuote, subQuote1, subQuote2);
+			Common::strcpy_s(local._subQuote2, subQuote2.c_str());
 			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
 			_scene->_sequences.addTimer(60, 50);
 		} else {
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
 		}
 	} else if (_game._trigger == 50) {
-		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, _subQuote2);
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, local._subQuote2);
 		_scene->_sequences.addTimer(180, 1);
 	} else {
 		if (_game._trigger == 1)
 			_scene->_kernelMessages.reset();
 
-		switch (_curDialogNode) {
+		switch (local._curDialogNode) {
 		case 1:
 			handleConversation1();
 			break;
@@ -129,7 +114,7 @@ void Scene210::handleConversations() {
 	}
 }
 
-void Scene210::handleConversation1() {
+static void handleConversation1() {
 	switch (_action._activeAction._verbId) {
 	case 180:
 		setDialogNode(2);
@@ -156,7 +141,7 @@ void Scene210::handleConversation1() {
 	}
 }
 
-void Scene210::handleConversation2() {
+static void handleConversation2() {
 	switch (_action._activeAction._verbId) {
 	case 187:
 		setDialogNode(3);
@@ -175,7 +160,7 @@ void Scene210::handleConversation2() {
 	}
 }
 
-void Scene210::handleConversation3() {
+static void handleConversation3() {
 	switch (_action._activeAction._verbId) {
 	case 193:
 		setDialogNode(6);
@@ -198,7 +183,7 @@ void Scene210::handleConversation3() {
 	}
 }
 
-void Scene210::handleConversation5() {
+static void handleConversation5() {
 	switch (_action._activeAction._verbId) {
 	case 204:
 		setDialogNode(6);
@@ -218,7 +203,7 @@ void Scene210::handleConversation5() {
 	}
 }
 
-void Scene210::handleConversation6() {
+static void handleConversation6() {
 	switch (_action._activeAction._verbId) {
 	case 211:
 		setDialogNode(7);
@@ -237,7 +222,7 @@ void Scene210::handleConversation6() {
 	}
 }
 
-void Scene210::handleConversation7() {
+static void handleConversation7() {
 	switch (_action._activeAction._verbId) {
 	case 216:
 	case 217:
@@ -258,7 +243,7 @@ void Scene210::handleConversation7() {
 	}
 }
 
-void Scene210::handleConversation8() {
+static void handleConversation8() {
 	switch (_action._activeAction._verbId) {
 	case 223:
 	case 224:
@@ -279,23 +264,23 @@ void Scene210::handleConversation8() {
 	}
 }
 
-void Scene210::setDialogNode(int node) {
+static void setDialogNode(int node) {
 	switch (node) {
 	case 0:
 		_scene->_userInterface.setup(kInputBuildingSentences);
-		_shouldFaceRex = false;
-		_shouldTalk = false;
+		local._shouldFaceRex = false;
+		local._shouldTalk = false;
 		_game._player._stepEnabled = true;
-		_curDialogNode = 0;
+		local._curDialogNode = 0;
 		break;
 
 	case 2:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 1;
-			_shouldTalk = true;
+			local._nextHandsPlace = 1;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(0xB9, -1, 0);
 				_scene->_sequences.addTimer(180, 2);
 			} else {
@@ -304,14 +289,14 @@ void Scene210::setDialogNode(int node) {
 			break;
 
 		case 2:
-			_nextHandsPlace = 0;
+			local._nextHandsPlace = 0;
 			handleTwinklesSpeech(186, 0, 0);
 			_scene->_sequences.addTimer(180, 3);
 			break;
 
 		default:
-			_nextHandsPlace = 0;
-			_shouldTalk = false;
+			local._nextHandsPlace = 0;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 			newNode(2);
 			break;
@@ -321,10 +306,10 @@ void Scene210::setDialogNode(int node) {
 	case 3:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 0;
-			_shouldTalk = true;
+			local._nextHandsPlace = 0;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(0xBE, -2, 0);
 				_scene->_sequences.addTimer(180, 2);
 			} else {
@@ -332,17 +317,17 @@ void Scene210::setDialogNode(int node) {
 			}
 			break;
 		case 2:
-			_nextHandsPlace = 2;
+			local._nextHandsPlace = 2;
 			handleTwinklesSpeech(191, -1, 0);
 			_scene->_sequences.addTimer(180, 3);
 			break;
 		case 3:
-			_nextHandsPlace = 0;
+			local._nextHandsPlace = 0;
 			handleTwinklesSpeech(192, 0, 0);
 			_scene->_sequences.addTimer(180, 4);
 			break;
 		default:
-			_shouldTalk = false;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 			newNode(3);
 			break;
@@ -351,8 +336,8 @@ void Scene210::setDialogNode(int node) {
 
 	case 4:
 		if (_game._trigger == 1) {
-			_nextHandsPlace = 1;
-			_shouldTalk = true;
+			local._nextHandsPlace = 1;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
 
 			int quote;
@@ -361,7 +346,7 @@ void Scene210::setDialogNode(int node) {
 			else
 				quote = _vm->getRandomNumber(197, 198);
 
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(quote, 0, 360);
 				_scene->_sequences.addTimer(120, 2);
 			} else {
@@ -369,8 +354,8 @@ void Scene210::setDialogNode(int node) {
 			}
 		} else {
 			_scene->_userInterface.setup(kInputBuildingSentences);
-			_shouldFaceRex = false;
-			_shouldTalk = false;
+			local._shouldFaceRex = false;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 		}
 		break;
@@ -378,10 +363,10 @@ void Scene210::setDialogNode(int node) {
 	case 5:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 2;
-			_shouldTalk = true;
+			local._nextHandsPlace = 2;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(0xCA, -1, 0);
 				_scene->_sequences.addTimer(180, 2);
 			} else {
@@ -390,14 +375,14 @@ void Scene210::setDialogNode(int node) {
 			break;
 
 		case 2:
-			_nextHandsPlace = 1;
+			local._nextHandsPlace = 1;
 			handleTwinklesSpeech(0xCB, 0, 0);
 			_scene->_sequences.addTimer(180, 3);
 			break;
 
 		default:
-			_nextHandsPlace = 2;
-			_shouldTalk = false;
+			local._nextHandsPlace = 2;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 			newNode(5);
 			break;
@@ -407,10 +392,10 @@ void Scene210::setDialogNode(int node) {
 	case 6:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 1;
-			_shouldTalk = true;
+			local._nextHandsPlace = 1;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(0xD0, -2, 0);
 				_scene->_sequences.addTimer(180, 2);
 			} else {
@@ -424,14 +409,14 @@ void Scene210::setDialogNode(int node) {
 			break;
 
 		case 3:
-			_nextHandsPlace = 1;
+			local._nextHandsPlace = 1;
 			handleTwinklesSpeech(0xD2, 0, 0);
 			_scene->_sequences.addTimer(180, 4);
 			break;
 
 		default:
-			_nextHandsPlace = 0;
-			_shouldTalk = false;
+			local._nextHandsPlace = 0;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 			newNode(6);
 			break;
@@ -441,10 +426,10 @@ void Scene210::setDialogNode(int node) {
 	case 7:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 2;
-			_shouldTalk = true;
+			local._nextHandsPlace = 2;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(0xD6, -1, 0);
 				_scene->_sequences.addTimer(180, 2);
 			} else {
@@ -458,7 +443,7 @@ void Scene210::setDialogNode(int node) {
 			break;
 
 		default:
-			_shouldTalk = false;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 			newNode(7);
 			break;
@@ -468,10 +453,10 @@ void Scene210::setDialogNode(int node) {
 	case 8:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 2;
-			_shouldTalk = true;
+			local._nextHandsPlace = 2;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				handleTwinklesSpeech(0xDD, -1, 0);
 				_scene->_sequences.addTimer(180, 2);
 			} else {
@@ -485,7 +470,7 @@ void Scene210::setDialogNode(int node) {
 			break;
 
 		default:
-			_shouldTalk = false;
+			local._shouldTalk = false;
 			_game._player._stepEnabled = true;
 			newNode(8);
 			break;
@@ -496,10 +481,10 @@ void Scene210::setDialogNode(int node) {
 	case 9:
 		switch (_game._trigger) {
 		case 1:
-			_nextHandsPlace = 0;
-			_shouldTalk = true;
+			local._nextHandsPlace = 0;
+			local._shouldTalk = true;
 			_game._player._stepEnabled = false;
-			if (_twinklesTalking) {
+			if (local._twinklesTalking) {
 				_scene->_userInterface.emptyConversationList();
 				_scene->_userInterface.setup(kInputConversation);
 				handleTwinklesSpeech(0xE4, -1, 0);
@@ -515,7 +500,7 @@ void Scene210::setDialogNode(int node) {
 			break;
 
 		case 3:
-			_twinkleAnimationType = 2;
+			local._twinkleAnimationType = 2;
 			_globals[kCurtainOpen] = true;
 			_game._player._visible = false;
 			_vm->_palette->lock();
@@ -575,40 +560,40 @@ void Scene210::setDialogNode(int node) {
 	}
 }
 
-void Scene210::handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) {
+static void handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) {
 	_scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? INDEFINITE_TIMEOUT : delay, _game.getQuote(quoteId));
 }
 
-void Scene210::newNode(int node) {
-	_curDialogNode = node;
+static void newNode(int node) {
+	local._curDialogNode = node;
 
-	switch (_curDialogNode) {
+	switch (local._curDialogNode) {
 	case 1:
-		_conv1.start();
+		local._conv1.start();
 		break;
 
 	case 2:
-		_conv2.start();
+		local._conv2.start();
 		break;
 
 	case 3:
-		_conv3.start();
+		local._conv3.start();
 		break;
 
 	case 5:
-		_conv5.start();
+		local._conv5.start();
 		break;
 
 	case 6:
-		_conv6.start();
+		local._conv6.start();
 		break;
 
 	case 7:
-		_conv7.start();
+		local._conv7.start();
 		break;
 
 	case 8:
-		_conv8.start();
+		local._conv8.start();
 		break;
 
 	default:
@@ -616,7 +601,7 @@ void Scene210::newNode(int node) {
 	}
 }
 
-void Scene210::restoreDialogNode(int node, int msgId, int posY) {
+static void restoreDialogNode(int node, int msgId, int posY) {
 	int curQuoteId = msgId;
 	int curY = 1 - posY;
 	for (int count = 0; count < posY; count++) {
@@ -628,7 +613,7 @@ void Scene210::restoreDialogNode(int node, int msgId, int posY) {
 	newNode(node);
 }
 
-void Scene210::enter() {
+static void room_210_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
 
 	if (!_game._visitedScenes._sceneRevisited)
@@ -648,8 +633,8 @@ void Scene210::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
 	} else {
 		int idx = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
-		_doorway = _scene->_dynamicHotspots.setPosition(idx, Common::Point(168, 127), FACING_NORTH);
-		_scene->_dynamicHotspots.setCursor(_doorway, CURSOR_GO_UP);
+		local._doorway = _scene->_dynamicHotspots.setPosition(idx, Common::Point(168, 127), FACING_NORTH);
+		_scene->_dynamicHotspots.setCursor(local._doorway, CURSOR_GO_UP);
 	}
 
 	_game.loadQuoteSet(0x5A, 0x73, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB8, 0xB7,
@@ -657,48 +642,48 @@ void Scene210::enter() {
 		0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC,
 		0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0);
 
-	_conv1.setup(0x2E, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0);
+	local._conv1.setup(0x2E, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0);
 
 	if (!_game._visitedScenes._sceneRevisited) {
-		_conv1.set(0x2E, 0xB4, 0xB5, 0xB6, 0xB8, 0);
+		local._conv1.set(0x2E, 0xB4, 0xB5, 0xB6, 0xB8, 0);
 
 		if (_game._widepipeCtr >= 2)
-			_conv1.write(0xB7, true);
+			local._conv1.write(0xB7, true);
 	}
 
 	bool sceneRevisited = _game._visitedScenes._sceneRevisited;
-	_conv2.setup(0x2F, 0xBC, 0xBB, 0xBD, sceneRevisited ? 0 : -1);
-	_conv3.setup(0x30, 0xC3, 0xC2, 0xC1, 0xC4, sceneRevisited ? 0 : -1);
-	_conv5.setup(0x31, 0xCD, 0xCC, 0xCE, 0xCF, sceneRevisited ? 0 : -1);
-	_conv6.setup(0x32, 0xD3, 0xD4, 0xD5, sceneRevisited ? 0 : -1);
-	_conv7.setup(0x33, 0xD8, 0xDA, 0xD9, 0xDB, 0xDC, sceneRevisited ? 0 : -1);
-	_conv8.setup(0x34, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, sceneRevisited ? 0 : -1);
+	local._conv2.setup(0x2F, 0xBC, 0xBB, 0xBD, sceneRevisited ? 0 : -1);
+	local._conv3.setup(0x30, 0xC3, 0xC2, 0xC1, 0xC4, sceneRevisited ? 0 : -1);
+	local._conv5.setup(0x31, 0xCD, 0xCC, 0xCE, 0xCF, sceneRevisited ? 0 : -1);
+	local._conv6.setup(0x32, 0xD3, 0xD4, 0xD5, sceneRevisited ? 0 : -1);
+	local._conv7.setup(0x33, 0xD8, 0xDA, 0xD9, 0xDB, 0xDC, sceneRevisited ? 0 : -1);
+	local._conv8.setup(0x34, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, sceneRevisited ? 0 : -1);
 
-	_twinkleAnimationType = 0;
-	_twinklesCurrentFrame = 0;
+	local._twinkleAnimationType = 0;
+	local._twinklesCurrentFrame = 0;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_shouldMoveHead = false;
-		_shouldFaceRex = false;
-		_shouldTalk = false;
-		_nextHandsPlace = 0;
-		_twinklesTalking = false;
-		_curDialogNode = 0;
-		_stopWalking = false;
-		_twinklesTalk2 = (_globals[kTwinklesApproached] > 0);
+		local._shouldMoveHead = false;
+		local._shouldFaceRex = false;
+		local._shouldTalk = false;
+		local._nextHandsPlace = 0;
+		local._twinklesTalking = false;
+		local._curDialogNode = 0;
+		local._stopWalking = false;
+		local._twinklesTalk2 = (_globals[kTwinklesApproached] > 0);
 	}
 
 	if (_globals[kTwinklesStatus] == 0) {
 		_scene->loadAnimation(formAnimName('A', -1));
-		_twinkleAnimationType = 1;
+		local._twinkleAnimationType = 1;
 	} else
 		_scene->_hotspots.activate(476, false);
 
-	if (_curDialogNode) {
+	if (local._curDialogNode) {
 		int quote = 0;
 		int number = 0;
 
-		switch (_curDialogNode) {
+		switch (local._curDialogNode) {
 		case 1:
 			quote = 0xB3;
 			number = 1;
@@ -731,7 +716,7 @@ void Scene210::enter() {
 			break;
 		}
 
-		restoreDialogNode(_curDialogNode, quote, number);
+		restoreDialogNode(local._curDialogNode, quote, number);
 		if (_scene->_animation[0])
 			_scene->_animation[0]->setCurrentFrame(131);
 	}
@@ -742,22 +727,22 @@ void Scene210::enter() {
 	section_2_music();
 }
 
-void Scene210::step() {
-	if ((_twinkleAnimationType == 1) && _scene->_animation[0]) {
-		if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame();
+static void room_210_daemon() {
+	if ((local._twinkleAnimationType == 1) && _scene->_animation[0]) {
+		if (local._twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame();
 			int reset_frame = -1;
 			int random = _vm->getRandomNumber(1, 1000);
 
-			switch (_twinklesCurrentFrame) {
+			switch (local._twinklesCurrentFrame) {
 			case 31:
 			case 58:
 			case 74:
 			case 108:
 			case 190:
-				if (_shouldFaceRex)
+				if (local._shouldFaceRex)
 					reset_frame = 108;
-				else if ((random <= 100) || _shouldMoveHead)
+				else if ((random <= 100) || local._shouldMoveHead)
 					reset_frame = 74;
 				else if (random <= 300)
 					reset_frame = 58;
@@ -769,11 +754,11 @@ void Scene210::step() {
 
 			case 80:
 			case 90:
-				_twinklesTalking = false;
-				if (_shouldMoveHead) {
+				local._twinklesTalking = false;
+				if (local._shouldMoveHead) {
 					reset_frame = 90;
-				} else if (_twinklesCurrentFrame == 90) {
-					if ((random <= 400) || _shouldFaceRex)
+				} else if (local._twinklesCurrentFrame == 90) {
+					if ((random <= 400) || local._shouldFaceRex)
 						reset_frame = 99;
 					else
 						reset_frame = 79;
@@ -781,12 +766,12 @@ void Scene210::step() {
 				break;
 
 			case 98:
-				if (_shouldMoveHead)
+				if (local._shouldMoveHead)
 					reset_frame = 91;
 				break;
 
 			case 99:
-				if ((random <= 400) && !_shouldFaceRex)
+				if ((random <= 400) && !local._shouldFaceRex)
 					reset_frame = 79;
 				break;
 
@@ -795,23 +780,23 @@ void Scene210::step() {
 			case 174:
 			case 143:
 			case 152:
-				if (_nextHandsPlace == 3)
+				if (local._nextHandsPlace == 3)
 					reset_frame = 174;
-				else if (!_shouldFaceRex)
+				else if (!local._shouldFaceRex)
 					reset_frame = 174;
-				else if (_nextHandsPlace == 1)
+				else if (local._nextHandsPlace == 1)
 					reset_frame = 136;
-				else if (_nextHandsPlace == 2)
+				else if (local._nextHandsPlace == 2)
 					reset_frame = 152;
-				else if (_shouldTalk)
+				else if (local._shouldTalk)
 					reset_frame = 124;
 				else
 					reset_frame = (random <= 200) ? 131 : 143;
 				break;
 
 			case 131:
-				if (_shouldTalk) {
-					switch (_nextHandsPlace) {
+				if (local._shouldTalk) {
+					switch (local._nextHandsPlace) {
 					case 1:
 						reset_frame = 136;
 						break;
@@ -827,29 +812,29 @@ void Scene210::step() {
 
 			case 138:
 			case 141:
-				if ((_nextHandsPlace == 0) || !_shouldFaceRex)
+				if ((local._nextHandsPlace == 0) || !local._shouldFaceRex)
 					reset_frame = 141;
-				else if (_nextHandsPlace == 2)
+				else if (local._nextHandsPlace == 2)
 					reset_frame = 152;
-				else if (!_shouldTalk || (_twinklesCurrentFrame == 141))
+				else if (!local._shouldTalk || (local._twinklesCurrentFrame == 141))
 					reset_frame = 137;
 				break;
 
 			case 153:
 			case 169:
-				if ((_nextHandsPlace == 0) || !_shouldFaceRex)
+				if ((local._nextHandsPlace == 0) || !local._shouldFaceRex)
 					reset_frame = 169;
-				else if (_nextHandsPlace == 1)
+				else if (local._nextHandsPlace == 1)
 					reset_frame = 136;
-				else if (_shouldTalk)
+				else if (local._shouldTalk)
 					reset_frame = 153;
 				else
 					reset_frame = 162;
 				break;
 
 			case 162:
-				if (_shouldTalk) {
-					switch (_nextHandsPlace) {
+				if (local._shouldTalk) {
+					switch (local._nextHandsPlace) {
 					case 0:
 						reset_frame = 124;
 						break;
@@ -870,61 +855,61 @@ void Scene210::step() {
 			if (reset_frame >= 0) {
 				if (reset_frame != _scene->_animation[0]->getCurrentFrame()) {
 					_scene->_animation[0]->setCurrentFrame(reset_frame);
-					_twinklesCurrentFrame = reset_frame;
+					local._twinklesCurrentFrame = reset_frame;
 				}
 
 				if ((reset_frame == 90) || (reset_frame == 91) || (reset_frame == 124) || (reset_frame == 153)
-					|| ((reset_frame == 137) && _shouldTalk)) {
-					_twinklesTalking = true;
+					|| ((reset_frame == 137) && local._shouldTalk)) {
+					local._twinklesTalking = true;
 				} else {
-					_twinklesTalking = false;
+					local._twinklesTalking = false;
 				}
 			}
 		}
 	}
 
-	if ((_twinkleAnimationType == 2) && _scene->_animation[0]) {
-		if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._twinkleAnimationType == 2) && _scene->_animation[0]) {
+		if (local._twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame();
 			int reset_frame = -1;
 
-			if (_twinklesCurrentFrame == 53) {
+			if (local._twinklesCurrentFrame == 53) {
 				_scene->_kernelMessages.add(Common::Point(151, 61), 0xFDFC, 32, 70, 180, _game.getQuote(230));
-				_shouldTalk = true;
-			} else if ((_twinklesCurrentFrame == 75) && _shouldTalk)
+				local._shouldTalk = true;
+			} else if ((local._twinklesCurrentFrame == 75) && local._shouldTalk)
 				reset_frame = 60;
 
 			if ((reset_frame >= 0) && (reset_frame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(reset_frame);
-				_twinklesCurrentFrame = reset_frame;
+				local._twinklesCurrentFrame = reset_frame;
 			}
 		}
 
 		if (_game._trigger == 70)
-			_shouldTalk = false;
+			local._shouldTalk = false;
 	}
 
-	if ((_twinkleAnimationType == 1) && (_scene->_rails.getNext() > 0)) {
+	if ((local._twinkleAnimationType == 1) && (_scene->_rails.getNext() > 0)) {
 		_game._player.walk(Common::Point(214, 150), FACING_NORTHWEST);
 		_scene->_rails.resetNext();
-		_stopWalking = true;
+		local._stopWalking = true;
 	}
 }
 
-void Scene210::preActions() {
-	_stopWalking = false;
+static void room_210_pre_parser() {
+	local._stopWalking = false;
 
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_EAST))
 		_game._player._walkOffScreenSceneId = 211;
 }
 
-void Scene210::actions() {
+static void room_210_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_HUT_TO_NORTH)) {
 		_vm->_dialogs->show(21017);
 	} else if (_game._screenObjects._inputMode == kInputConversation) {
 		handleConversations();
 	} else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN) ||
-		((_game._player._playerPos == Common::Point(214, 150)) && (_game._player._facing == FACING_NORTHWEST) && (_twinkleAnimationType == 1) && _stopWalking)) {
+		((_game._player._playerPos == Common::Point(214, 150)) && (_game._player._facing == FACING_NORTHWEST) && (local._twinkleAnimationType == 1) && local._stopWalking)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -937,16 +922,16 @@ void Scene210::actions() {
 			else
 				quote = 171;
 
-			_shouldFaceRex = true;
-			_nextHandsPlace = 0;
+			local._shouldFaceRex = true;
+			local._nextHandsPlace = 0;
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.addQuote(quote, 1, 120);
 		}
 		break;
 
 		case 1:
-			_shouldTalk = true;
-			if (!_twinklesTalking) {
+			local._shouldTalk = true;
+			if (!local._twinklesTalking) {
 				_scene->_sequences.addTimer(6, 1);
 			} else {
 				if (_globals[kTwinklesApproached] == 0) {
@@ -955,8 +940,8 @@ void Scene210::actions() {
 				} else if (_globals[kTwinklesApproached] == 1) {
 					handleTwinklesSpeech(0xB1, 0, 0);
 				} else {
-					int quote = _twinklesTalk2 ? 0xB3 : 0xB2;
-					_twinklesTalk2 = true;
+					int quote = local._twinklesTalk2 ? 0xB3 : 0xB2;
+					local._twinklesTalk2 = true;
 					handleTwinklesSpeech(quote, 0, 0);
 				}
 				_scene->_sequences.addTimer(60, 3);
@@ -965,14 +950,14 @@ void Scene210::actions() {
 
 		case 3:
 			_game._player._stepEnabled = true;
-			_shouldMoveHead = false;
-			_shouldTalk = false;
+			local._shouldMoveHead = false;
+			local._shouldTalk = false;
 
 			if (_globals[kTwinklesApproached] < 2)
 				_globals[kTwinklesApproached]++;
 
-			_conv1.start();
-			_curDialogNode = 1;
+			local._conv1.start();
+			local._curDialogNode = 1;
 			break;
 
 		default:
@@ -983,7 +968,7 @@ void Scene210::actions() {
 		case 0:
 		{
 			int quote = _vm->getRandomNumber(172, 174);
-			_shouldMoveHead = true;
+			local._shouldMoveHead = true;
 			_game._player._stepEnabled = false;
 			handleTwinklesSpeech(quote, 0, 120);
 			_scene->_sequences.addTimer(120, 1);
@@ -992,7 +977,7 @@ void Scene210::actions() {
 
 		case 1:
 			_game._player._stepEnabled = true;
-			_shouldMoveHead = false;
+			local._shouldMoveHead = false;
 			break;
 
 		default:
@@ -1015,9 +1000,9 @@ void Scene210::actions() {
 		case 1:
 			_game._player._stepEnabled = true;
 			_globals[kCurtainOpen] = true;
-			_doorway = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
-			_scene->_dynamicHotspots.setPosition(_doorway, Common::Point(168, 127), FACING_NORTH);
-			_scene->_dynamicHotspots.setCursor(_doorway, CURSOR_GO_UP);
+			local._doorway = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+			_scene->_dynamicHotspots.setPosition(local._doorway, Common::Point(168, 127), FACING_NORTH);
+			_scene->_dynamicHotspots.setCursor(local._doorway, CURSOR_GO_UP);
 			break;
 
 		default:
@@ -1040,7 +1025,7 @@ void Scene210::actions() {
 			_scene->_sequences.addTimer(48, 2);
 			break;
 		case 2:
-			_scene->_dynamicHotspots.remove(_doorway);
+			_scene->_dynamicHotspots.remove(local._doorway);
 			_game._player._stepEnabled = true;
 			_globals[kCurtainOpen] = false;
 			break;
@@ -1090,16 +1075,37 @@ void Scene210::actions() {
 	_action._inProgress = false;
 }
 
+void room_210_synchronize(Common::Serializer &s) {
+	s.syncAsSint32LE(local._curDialogNode);
+	s.syncAsSint32LE(local._nextHandsPlace);
+	s.syncAsSint32LE(local._twinkleAnimationType);
+	s.syncAsSint32LE(local._twinklesCurrentFrame);
+
+	s.syncAsByte(local._shouldTalk);
+	s.syncAsByte(local._shouldFaceRex);
+	s.syncAsByte(local._shouldMoveHead);
+	s.syncAsByte(local._stopWalking);
+	s.syncAsByte(local._twinklesTalking);
+	s.syncAsByte(local._twinklesTalk2);
+
+	s.syncAsSint32LE(local._doorway);
+
+	Common::String subQuote2 = local._subQuote2;
+	s.syncString(subQuote2);
+	if (s.isLoading())
+		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+}
+
 void room_210_preload() {
 	room_init_code_pointer = room_210_init;
 	room_pre_parser_code_pointer = room_210_pre_parser;
 	room_parser_code_pointer = room_210_parser;
 	room_daemon_code_pointer = room_210_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_DOORWAY);
+	_scene->addActiveVocab(VERB_WALK_THROUGH);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room211.cpp b/engines/mads/madsv2/nebular/rooms/room211.cpp
index 09fc0ed166b..bb285698968 100644
--- a/engines/mads/madsv2/nebular/rooms/room211.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room211.cpp
@@ -32,42 +32,27 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Scene211::Scene211(RexNebularEngine *vm) : Scene2xx(vm) {
-	_ambushFl = false;
-	_wakeFl = false;
-	_monkeyFrame = 0;
-	_scrollY = 0;
-	_monkeyTime = 0;
-}
-
-void Scene211::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
-
-	s.syncAsByte(_ambushFl);
-	s.syncAsByte(_wakeFl);
+struct Scratch {
+	bool _ambushFl;
+	bool _wakeFl;
+	int32 _monkeyFrame;
+	int32 _scrollY;
+	int32 _monkeyTime;
+};
 
-	s.syncAsSint32LE(_monkeyFrame);
-	s.syncAsSint32LE(_scrollY);
-	s.syncAsUint32LE(_monkeyTime);
-}
-
-void Scene211::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
+static Scratch local;
 
-	_scene->addActiveVocab(NOUN_SLITHERING_SNAKE);
-}
 
-void Scene211::enter() {
+static void room_211_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC002Z2");
-	_wakeFl = false;
+	local._wakeFl = false;
 
 	if (_scene->_priorSceneId == 210)
 		_game._player._playerPos = Common::Point(25, 148);
 	else if (_scene->_priorSceneId == 205) {
 		_game._player._playerPos = Common::Point(49, 133);
 		_game._player._facing = FACING_WEST;
-		_wakeFl = true;
+		local._wakeFl = true;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->loadAnimation(formAnimName('A', -1), 100);
@@ -97,34 +82,34 @@ void Scene211::enter() {
 			Common::Rect(0, 0, 54, 30), 13, 2, 0xFDFC, 60,
 			151, 152, 153, 154, 0);
 
-	_monkeyTime = _vm->_game->_scene._frameStartTime;
-	_scrollY = 30;
+	local._monkeyTime = _vm->_game->_scene._frameStartTime;
+	local._scrollY = 30;
 
-	_ambushFl = false;
-	_monkeyFrame = 0;
+	local._ambushFl = false;
+	local._monkeyFrame = 0;
 
 	section_2_music();
 }
 
-void Scene211::step() {
+static void room_211_daemon() {
 	if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) {
 		_scene->_kernelMessages.randomServer();
 
-		if (!_ambushFl && !_wakeFl && (_vm->_game->_scene._frameStartTime >= _monkeyTime)) {
+		if (!local._ambushFl && !local._wakeFl && (_vm->_game->_scene._frameStartTime >= local._monkeyTime)) {
 			int chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1;
 			if (_scene->_kernelMessages.generateRandom(80, chanceMinor))
 				_vm->_sound->command(18);
 
-			_monkeyTime = _vm->_game->_scene._frameStartTime + 2;
+			local._monkeyTime = _vm->_game->_scene._frameStartTime + 2;
 		}
 
 		if ((_game._player._playerPos == Common::Point(52, 132)) && (_game._player._facing == FACING_WEST) && !_game._player._moving &&
-			(_game._trigger || !_ambushFl)) {
+			(_game._trigger || !local._ambushFl)) {
 			switch (_game._trigger) {
 			case 0:
 				if (_game._objects.isInInventory(OBJ_BINOCULARS)) {
-					_ambushFl = true;
-					_monkeyFrame = 0;
+					local._ambushFl = true;
+					local._monkeyFrame = 0;
 					_game._player._stepEnabled = false;
 					_game._player._visible = false;
 					_scene->_kernelMessages.reset();
@@ -143,7 +128,7 @@ void Scene211::step() {
 				_game._player._stepEnabled = true;
 				_game._player._visible = true;
 				_game._player._playerPos = Common::Point(49, 133);
-				_ambushFl = false;
+				local._ambushFl = false;
 				_globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS;
 				break;
 
@@ -153,9 +138,9 @@ void Scene211::step() {
 		}
 	}
 
-	if (_ambushFl && (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame)) {
-		_monkeyFrame = _scene->_animation[0]->getCurrentFrame();
-		switch (_monkeyFrame) {
+	if (local._ambushFl && (_scene->_animation[0]->getCurrentFrame() > local._monkeyFrame)) {
+		local._monkeyFrame = _scene->_animation[0]->getCurrentFrame();
+		switch (local._monkeyFrame) {
 		case 2:
 		{
 			int msgIndex = _scene->_kernelMessages.add(Common::Point(12, 4), 0xFDFC, 0, 0, 60, _game.getQuote(157));
@@ -195,33 +180,33 @@ void Scene211::step() {
 
 		case 177:
 		{
-			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(161));
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(161));
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-			_scrollY += 14;
+			local._scrollY += 14;
 		}
 		break;
 
 		case 181:
 		{
-			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(162));
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(162));
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-			_scrollY += 14;
+			local._scrollY += 14;
 		}
 		break;
 
 		case 188:
 		{
-			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(163));
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(163));
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-			_scrollY += 14;
+			local._scrollY += 14;
 		}
 		break;
 
 		case 200:
 		{
-			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(164));
+			int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(164));
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-			_scrollY += 14;
+			local._scrollY += 14;
 		}
 		break;
 
@@ -230,45 +215,45 @@ void Scene211::step() {
 		}
 	}
 
-	if (_wakeFl) {
+	if (local._wakeFl) {
 		if (_game._trigger == 100) {
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
-			_wakeFl = false;
+			local._wakeFl = false;
 		}
 
-		if (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame) {
-			_monkeyFrame = _scene->_animation[0]->getCurrentFrame();
+		if (_scene->_animation[0]->getCurrentFrame() > local._monkeyFrame) {
+			local._monkeyFrame = _scene->_animation[0]->getCurrentFrame();
 			switch (_scene->_animation[0]->getCurrentFrame()) {
 			case 177:
 			{
-				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(165));
+				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(165));
 				_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-				_scrollY += 14;
+				local._scrollY += 14;
 			}
 			break;
 
 			case 181:
 			{
-				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(166));
+				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(166));
 				_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-				_scrollY += 14;
+				local._scrollY += 14;
 			}
 			break;
 
 			case 188:
 			{
-				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(167));
+				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(167));
 				_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-				_scrollY += 14;
+				local._scrollY += 14;
 			}
 			break;
 
 			case 200:
 			{
-				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(168));
+				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, local._scrollY), 0x1110, 0, 0, 180, _game.getQuote(168));
 				_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
-				_scrollY += 14;
+				local._scrollY += 14;
 			}
 			break;
 
@@ -279,7 +264,7 @@ void Scene211::step() {
 	}
 }
 
-void Scene211::preActions() {
+static void room_211_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_JUNGLE_PATH) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
 		&& (_scene->_customDest.x <= 52) && (_scene->_customDest.y >= 132))
 		_game._player.walk(Common::Point(52, 132), FACING_WEST);
@@ -295,7 +280,7 @@ void Scene211::preActions() {
 		_game._player._walkOffScreenSceneId = 207;
 }
 
-void Scene211::actions() {
+static void room_211_parser() {
 	if (_action._lookFlag && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
 		_vm->_dialogs->show(21111);
 	else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_PALM_TREE))
@@ -336,16 +321,24 @@ void Scene211::actions() {
 	_action._inProgress = false;
 }
 
+void room_211_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._ambushFl);
+	s.syncAsByte(local._wakeFl);
+
+	s.syncAsSint32LE(local._monkeyFrame);
+	s.syncAsSint32LE(local._scrollY);
+	s.syncAsUint32LE(local._monkeyTime);
+}
+
 void room_211_preload() {
 	room_init_code_pointer = room_211_init;
 	room_pre_parser_code_pointer = room_211_pre_parser;
 	room_parser_code_pointer = room_211_parser;
 	room_daemon_code_pointer = room_211_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_SLITHERING_SNAKE);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room212.cpp b/engines/mads/madsv2/nebular/rooms/room212.cpp
index 45de1abe3ff..6c3477dc53b 100644
--- a/engines/mads/madsv2/nebular/rooms/room212.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room212.cpp
@@ -32,16 +32,7 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void Scene212::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-
-	_scene->addActiveVocab(NOUN_BOUNCING_REPTILE);
-}
-
-void Scene212::enter() {
-	// CHECKME: Some useless variables have been remove here
-
+static void room_212_init() {
 	if (_scene->_priorSceneId == 208) {
 		_game._player._playerPos = Common::Point(195, 85);
 		_game._player._facing = FACING_SOUTH;
@@ -53,16 +44,16 @@ void Scene212::enter() {
 	section_2_music();
 }
 
-void Scene212::step() {
-	// CHECKME: Could we move the dino?
+static void room_212_daemon() {
+	// No implementation
 }
 
-void Scene212::preActions() {
+static void room_212_pre_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
 		_game._player._walkOffScreenSceneId = 111;
 }
 
-void Scene212::actions() {
+static void room_212_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21209);
 	else if (_action.isAction(VERB_WALK_TOWARDS) && (_action.isObject(NOUN_FIELD_TO_NORTH) || _action.isObject(NOUN_MOUNTAINS)))
@@ -91,16 +82,19 @@ void Scene212::actions() {
 	_action._inProgress = false;
 }
 
+void room_212_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
 void room_212_preload() {
 	room_init_code_pointer = room_212_init;
 	room_pre_parser_code_pointer = room_212_pre_parser;
 	room_parser_code_pointer = room_212_parser;
 	room_daemon_code_pointer = room_212_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_BOUNCING_REPTILE);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index 24b19a827da..f761d8d8c13 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -32,20 +32,20 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void Scene213::setup() {
-	_game._player._spritesPrefix = "";
+struct Scratch {
+	int16 _handSpriteId;
+};
+
+static Scratch local;
 
-	// The original is calling Scene2xx::setAAName()
-	_game._aaName = Resources::formatAAName(2);
-}
 
-void Scene213::enter() {
+static void room_213_init() {
 	if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
-		_handSpriteId = _scene->_sprites.addSprites("*METHAND");
+		local._handSpriteId = _scene->_sprites.addSprites("*METHAND");
 	else if (_globals[kSexOfRex] == REX_MALE)
-		_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+		local._handSpriteId = _scene->_sprites.addSprites("*REXHAND");
 	else
-		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+		local._handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
 
 	teleporterEnter();
 
@@ -60,11 +60,11 @@ void Scene213::enter() {
 	}
 }
 
-void Scene213::step() {
+static void room_213_daemon() {
 	teleporterStep();
 }
 
-void Scene213::actions() {
+static void room_213_parser() {
 	if (teleporterActions()) {
 		_action._inProgress = false;
 		return;
@@ -96,13 +96,10 @@ void Scene213::actions() {
 
 void room_213_preload() {
 	room_init_code_pointer = room_213_init;
-	room_pre_parser_code_pointer = room_213_pre_parser;
 	room_parser_code_pointer = room_213_parser;
 	room_daemon_code_pointer = room_213_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
-	section_2_walker();
+	Common::strcpy_s(player.series_name, "");
 	section_2_interface();
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter_room.cpp b/engines/mads/madsv2/nebular/rooms/teleporter_room.cpp
new file mode 100644
index 00000000000..f314d711ddf
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/teleporter_room.cpp
@@ -0,0 +1,327 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/nebular/rooms/teleporter_room.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
+
+static int _buttonTyped;
+static int _curCode;
+static int _digitCount;
+static int _curMessageId;
+static int _handSpriteId;
+static int _handSequenceId;
+static int _finishedCodeCounter;
+static int _meteorologistNextPlace;
+static int _meteorologistCurPlace;
+static int _teleporterSceneId;
+static char _msgText[256];
+
+
+void teleporter_init() {
+	_buttonTyped = -1;
+	_curCode = -1;
+	_digitCount = -1;
+	_curMessageId = -1;
+	_handSpriteId = -1;
+	_handSequenceId = -1;
+	_finishedCodeCounter = -1;
+	_meteorologistNextPlace = -1;
+	_meteorologistCurPlace = -1;
+	_teleporterSceneId = -1;
+
+	_game._player._visible = false;
+	_game._player._stepEnabled = (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL);
+	_scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_TELE);
+	_scene->_textSpacing = 0;
+	_curCode = 0;
+	_digitCount = 0;
+	_finishedCodeCounter = 0;
+	_curMessageId = -1;
+	_msgText = "_";
+
+	if (_scene->_priorSceneId == RETURNING_FROM_DIALOG)
+		_scene->_priorSceneId = _globals[kTeleporterDestination];
+
+	if (_scene->_priorSceneId < 101)
+		_scene->_priorSceneId = 201;
+
+	_globals[kTeleporterDestination] = _scene->_priorSceneId;
+	_vm->_palette->setEntry(252, 63, 63, 0);
+	_vm->_palette->setEntry(253, 0, 0, 0);
+	_teleporterSceneId = _scene->_priorSceneId;
+	if (_teleporterSceneId == 202)
+		_teleporterSceneId = 201;
+
+	int codeVal = 0;
+	for (int i = 0; i < 10; i++) {
+		if (_teleporterSceneId == _globals[kTeleporterRoom + i])
+			codeVal = _globals[kTeleporterCode + i];
+
+		if (_globals[kTeleporterRoom + i] == 301)
+			_meteorologistNextPlace = _globals[kTeleporterCode + i];
+	}
+
+	Common::String msgText2 = Common::String::format("#%.4d", codeVal);
+
+	if (_scene->_currentSceneId != 711) {
+		_scene->_kernelMessages.add(Common::Point(133, 34), 0, 32, 0, INDEFINITE_TIMEOUT, msgText2);
+		_scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText);
+	}
+
+	_meteorologistCurPlace = 0;
+
+	if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+		_scene->_sequences.addTimer(30, 230);
+
+	_vm->_sound->command(36);
+}
+
+int teleporter_address(int code, bool working) {
+	int limit = working ? 6 : 10;
+
+	for (int i = 0; i < limit; i++) {
+		if (code == _globals[kTeleporterCode + i])
+			return _globals[kTeleporterRoom + i];
+	}
+
+	return -1;
+}
+
+Common::Point teleporter_compute_location() {
+	Common::Point result;
+
+	switch (_buttonTyped) {
+	case 0:
+		result = Common::Point(179, 200);
+		break;
+
+	case 1:
+		result = Common::Point(166, 170);
+		break;
+
+	case 2:
+		result = Common::Point(179, 170);
+		break;
+
+	case 3:
+		result = Common::Point(192, 170);
+		break;
+
+	case 4:
+		result = Common::Point(166, 180);
+		break;
+
+	case 5:
+		result = Common::Point(179, 180);
+		break;
+
+	case 6:
+		result = Common::Point(192, 180);
+		break;
+
+	case 7:
+		result = Common::Point(166, 190);
+		break;
+
+	case 8:
+		result = Common::Point(179, 190);
+		break;
+
+	case 9:
+		result = Common::Point(192, 190);
+		break;
+
+	case 10:
+		result = Common::Point(194, 200);
+		break;
+
+	case 11:
+		result = Common::Point(164, 200);
+		break;
+
+	default:
+		error("teleporterComputeLocation() - Unexpected button pressed");
+	}
+
+	return result;
+}
+
+void teleporter_handle_key() {
+	switch (_game._trigger) {
+	case 0:
+	{
+		_game._player._stepEnabled = false;
+		Common::Point msgPos = teleporterComputeLocation();
+		_handSequenceId = _scene->_sequences.startPingPongCycle(_handSpriteId, false, 4, 2, 0, 0);
+		_scene->_sequences.setPosition(_handSequenceId, msgPos);
+		_scene->_sequences.setDepth(_handSequenceId, 2);
+		_scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_LOOP, 0, 1);
+		_scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+
+		if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
+			_vm->_events->hideCursor();
+
+	}
+	break;
+
+	case 1:
+		_scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_SPRITE, 3, 3);
+		if (_buttonTyped <= 9) {
+			if (_digitCount < 4) {
+				_curCode *= 10;
+				_curCode += _buttonTyped;
+				_digitCount++;
+
+				Common::String format = "%01d";
+				format.setChar('0' + _digitCount, 2);
+				_msgText = Common::String::format(format.c_str(), _curCode);
+				if (_digitCount < 4)
+					_msgText += "_";
+
+				if (_scene->_currentSceneId != 711)
+					_vm->_sound->command(32);
+			}
+		} else if (_buttonTyped == 11) {
+			_digitCount = 0;
+			_curCode = 0;
+			_msgText = "_";
+			if (_scene->_currentSceneId != 711)
+				_vm->_sound->command(33);
+		} else if (_digitCount == 4) {
+			if (_scene->_currentSceneId != 711)
+				_finishedCodeCounter = 1;
+
+			if (teleporterAddress(_curCode, true) > 0) {
+				_vm->_palette->setEntry(252, 0, 63, 0);
+				if (_scene->_currentSceneId != 711)
+					_vm->_sound->command(34);
+			} else {
+				_vm->_palette->setEntry(252, 63, 0, 0);
+				if (_scene->_currentSceneId != 711)
+					_vm->_sound->command(35);
+			}
+		}
+
+		if (_scene->_currentSceneId != 711) {
+			if (_curMessageId >= 0)
+				_scene->_kernelMessages.remove(_curMessageId);
+			_curMessageId = _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText);
+		}
+		break;
+
+	case 2:
+		if (_finishedCodeCounter == 1) {
+			_finishedCodeCounter++;
+
+			if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+				_scene->_nextSceneId = 202;
+			else {
+				_vm->_events->showCursor();
+				int destination = teleporterAddress(_curCode, true);
+
+				if (destination > 0) {
+					_globals[kTeleporterCommand] = 2;
+					_scene->_nextSceneId = _teleporterSceneId;
+					_globals[kTeleporterDestination] = destination;
+				} else {
+					_globals[kTeleporterCommand] = 4;
+					_scene->_nextSceneId = _teleporterSceneId;
+				}
+			}
+		} else if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+			_scene->_sequences.addTimer(30, 230 + _meteorologistCurPlace);
+
+		break;
+
+	case 3:
+		if (!_finishedCodeCounter) {
+			if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL) {
+				_game._player._stepEnabled = true;
+				_vm->_events->showCursor();
+			}
+		}
+		break;
+
+	default:
+		break;
+	}
+}
+
+bool teleeporter_parser() {
+	bool retVal = false;
+
+	if (_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) {
+		static int _buttonList[12] = { NOUN_0_KEY, NOUN_1_KEY, NOUN_2_KEY, NOUN_3_KEY, NOUN_4_KEY, NOUN_5_KEY, NOUN_6_KEY, NOUN_7_KEY, NOUN_8_KEY, NOUN_9_KEY, NOUN_SMILE_KEY, NOUN_FROWN_KEY };
+		for (int i = 0; i < 12; i++) {
+			if (_action._activeAction._objectNameId == _buttonList[i])
+				_buttonTyped = i;
+		}
+		teleporterHandleKey();
+		retVal = true;
+	}
+
+	if (_action.isAction(VERB_EXIT_FROM, NOUN_DEVICE)) {
+		_globals[kTeleporterCommand] = 3;
+		_scene->_nextSceneId = _teleporterSceneId;
+		retVal = true;
+	}
+
+	return (retVal);
+}
+
+void teleporter_daemon() {
+	if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
+		return;
+
+	if (_game._trigger >= 230) {
+		int place = _game._trigger - 230;
+		int digit;
+
+		if (place < 4) {
+			digit = _meteorologistNextPlace;
+			for (int i = 0; i < (3 - place); i++)
+				digit = digit / 10;
+
+			digit = digit % 10;
+		} else {
+			digit = 10;
+		}
+		_buttonTyped = digit;
+		_meteorologistCurPlace = place + 1;
+		_game._trigger = -1;
+	}
+
+	if (_game._trigger) {
+		if (_game._trigger == -1)
+			_game._trigger = 0;
+		teleporter_handle_key();
+	}
+}
+
+
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter_room.h b/engines/mads/madsv2/nebular/rooms/teleporter_room.h
new file mode 100644
index 00000000000..f2ed7993bc3
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/teleporter_room.h
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_ROOMS_TELEPORTER_ROOM_H
+#define MADS_NEBULAR_ROOMS_TELEPORTER_ROOM_H
+
+#include "common/point.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
+
+extern void teleporter_init();
+extern int teleporter_address(int code, bool working);
+extern void teleporter_handleKey();
+extern Common::Point teleporter_compute_location();
+extern bool teleporter_parser();
+extern void teleporter_daemon();
+
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 0b84ca1aeac..352de7ee31b 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -110,6 +110,18 @@ char *Game::getQuote(int quote_id) {
 	return quote_string(kernel.quotes, quote_id);
 }
 
+void Game::splitQuote(const Common::String &source, Common::String &line1, Common::String &line2) {
+	// Make the first line up the end of the word at the half-way point
+	const char *strP = source.c_str() + source.size() / 2;
+	while (*strP != ' ') ++strP;
+
+	line1 = Common::String(source.c_str(), strP);
+
+	// The rest of the string goes in the second line
+	while (*strP == ' ') ++strP;
+	line2 = Common::String(strP);
+}
+
 int16 &Globals::operator[](int idx) {
 	return global[idx];
 }
@@ -172,7 +184,14 @@ void Scene::DynamicHotspots::setPosition(int id, const Common::Point &pt, int fa
 }
 
 int Scene::DynamicHotspots::setCursor(int index, int cursor) {
+	error("TODO: DynamicHotspots::setCursor");
+}
 
+Scene::DynamicHotspot Scene::DynamicHotspots::operator[](int idx) {
+	return Scene::DynamicHotspot(idx);
+}
+
+Scene::DynamicHotspot::DynamicHotspot(int index) : _articleNumber(kernel_dynamic_hot[index].prep) {
 }
 
 void Scene::Hotspots::activate(int hotspot, int active) {
@@ -188,6 +207,10 @@ int Scene::KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 fl
 	return kernel_message_add(const_cast<char *>(msg.c_str()), pt.x, pt.y, fontColor, timeout, endTrigger, 0);
 }
 
+int Scene::KernelMessages::addQuote(int quoteId, int endTrigger, uint32 timeout) {
+	return kernel_message_player(quoteId, timeout, endTrigger);
+}
+
 void Scene::KernelMessages::remove(int msgIndex) {
 	kernel_message_delete(msgIndex);
 }
@@ -262,6 +285,10 @@ void Scene::UserInterface::emptyConversationList() {
 	inter_reset_dialog();
 }
 
+void Scene::UserInterface::selectObject(int item_id) {
+	inter_set_active_inven(item_id);
+}
+
 void Scene::UserInterface::setup(int inputMode) {
 	kernel_set_interface_mode(inputMode);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 0e1edd15879..590efc1ef8a 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -23,6 +23,7 @@
 #define MADS_NEBULAR_ROOMS_THUNKS_H
 
 #include "common/rect.h"
+#include "mads/madsv2/core/config.h"
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/player.h"
@@ -182,11 +183,25 @@ struct Scene {
 	};
 	Animation _animation[10];
 
+	struct CustomDest {
+		int &x = inter_point_x;
+		int &y = inter_point.y;
+	};
+	CustomDest _customDest;
+
+	struct DynamicHotspot {
+		byte &_articleNumber;
+
+		DynamicHotspot(int index);
+	};
+
 	struct DynamicHotspots {
 		int add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r);
 		void remove(int dyn_id);
 		void setPosition(int id, const Common::Point &pt, int facing);
 		int setCursor(int index, int cursor);
+
+		DynamicHotspot operator[](int idx);
 	};
 	DynamicHotspots _dynamicHotspots;
 
@@ -220,6 +235,7 @@ struct Scene {
 
 		int add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 			uint32 timeout, const Common::String &msg);
+		int addQuote(int quoteId, int endTrigger, uint32 timeout);
 		void remove(int msgIndex);
 		void reset();
 		void setQuoted(int msgIndex, int numTicks, bool quoted);
@@ -316,8 +332,11 @@ struct Scene {
 	SpriteSlots _spriteSlots;
 
 	struct UserInterface {
+		int &_selectedInvIndex = active_inv;
+
 		void emptyConversationList();
 		void setup(int inputMode);
+		void selectObject(int item_id);
 	};
 	UserInterface _userInterface;
 
@@ -327,6 +346,7 @@ struct Scene {
 	byte &_reloadSceneFlag = kernel.force_restart;
 	byte &_roomChanged = kernel.teleported_in;
 	int &_currentSceneId = room_id;
+	int &_textSpacing = kernel_message_spacing;
 
 	int loadAnimation(const char *name, int trigger_code = 0);
 	void freeAnimation();
@@ -353,6 +373,16 @@ struct Game {
 	};
 
 	struct Objects {
+		struct InventoryList {
+			int size() const {
+				return inven_num_objects;
+			}
+			int &operator[](int index) {
+				return inven[index];
+			}
+		};
+		InventoryList _inventoryList;
+
 		void addToInventory(int object_id);
 		bool isInRoom(int object_id) const;
 		bool isInInventory(int object_id) const;
@@ -455,10 +485,12 @@ struct Game {
 	int &_triggerSetupMode = kernel.trigger_setup_mode;
 	char *const _aaName = kernel.interface;
 	int8 &_difficulty = game.difficulty;
+	byte &_widepipeCtr = kernel.cheating;
 	int8 _storyMode = 0;
 
 	void loadQuoteSet(int quote1, ...);
 	char *getQuote(int quote_id);
+	void splitQuote(const Common::String &source, Common::String &line1, Common::String &line2);
 };
 extern Game _game;
 
@@ -541,6 +573,8 @@ struct VM {
 	};
 	Sound _sound;
 
+	bool &_musicFlag = config_file.music_flag;
+
 	int getRandomNumber(int min, int max);
 	int getRandomNumber(int max);
 };
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 2f3cc984096..5d3d6eec665 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -102,6 +102,8 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room215.o \
 	madsv2/nebular/rooms/room216.o \
 	madsv2/nebular/rooms/section1.o \
+	madsv2/nebular/rooms/section2.o \
+	madsv2/nebular/rooms/teleporter_room.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \
 	madsv2/phantom/rooms/room101.o \


Commit: ceb05cac184cfbb6404762062e605ae9425fd5de
    https://github.com/scummvm/scummvm/commit/ceb05cac184cfbb6404762062e605ae9425fd5de
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:43+10:00

Commit Message:
MADS: NEBULAR: Remaining section 2 rooms implementation

Changed paths:
  A engines/mads/madsv2/nebular/rooms/conversation.cpp
  A engines/mads/madsv2/nebular/rooms/conversation.h
  A engines/mads/madsv2/nebular/rooms/forcefield.cpp
  A engines/mads/madsv2/nebular/rooms/forcefield.h
  A engines/mads/madsv2/nebular/rooms/teleporter.cpp
  A engines/mads/madsv2/nebular/rooms/teleporter.h
  R engines/mads/madsv2/nebular/conversation.cpp
  R engines/mads/madsv2/nebular/conversation.h
  R engines/mads/madsv2/nebular/rooms/teleporter_room.cpp
  R engines/mads/madsv2/nebular/rooms/teleporter_room.h
    engines/mads/madsv2/core/font.cpp
    engines/mads/madsv2/core/font.h
    engines/mads/madsv2/core/inter.h
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/core/quote.cpp
    engines/mads/madsv2/nebular/global.cpp
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/rooms/room201.cpp
    engines/mads/madsv2/nebular/rooms/room202.cpp
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room208.cpp
    engines/mads/madsv2/nebular/rooms/room209.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp
    engines/mads/madsv2/nebular/rooms/room214.cpp
    engines/mads/madsv2/nebular/rooms/room215.cpp
    engines/mads/madsv2/nebular/rooms/room216.cpp
    engines/mads/madsv2/nebular/rooms/room301.cpp
    engines/mads/madsv2/nebular/rooms/room302.cpp
    engines/mads/madsv2/nebular/rooms/room303.cpp
    engines/mads/madsv2/nebular/rooms/room304.cpp
    engines/mads/madsv2/nebular/rooms/room307.cpp
    engines/mads/madsv2/nebular/rooms/room308.cpp
    engines/mads/madsv2/nebular/rooms/room309.cpp
    engines/mads/madsv2/nebular/rooms/room310.cpp
    engines/mads/madsv2/nebular/rooms/room311.cpp
    engines/mads/madsv2/nebular/rooms/room313.cpp
    engines/mads/madsv2/nebular/rooms/room316.cpp
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room319.cpp
    engines/mads/madsv2/nebular/rooms/room320.cpp
    engines/mads/madsv2/nebular/rooms/room321.cpp
    engines/mads/madsv2/nebular/rooms/room322.cpp
    engines/mads/madsv2/nebular/rooms/room351.cpp
    engines/mads/madsv2/nebular/rooms/room352.cpp
    engines/mads/madsv2/nebular/rooms/room353.cpp
    engines/mads/madsv2/nebular/rooms/room354.cpp
    engines/mads/madsv2/nebular/rooms/room357.cpp
    engines/mads/madsv2/nebular/rooms/room358.cpp
    engines/mads/madsv2/nebular/rooms/room359.cpp
    engines/mads/madsv2/nebular/rooms/room360.cpp
    engines/mads/madsv2/nebular/rooms/room361.cpp
    engines/mads/madsv2/nebular/rooms/room366.cpp
    engines/mads/madsv2/nebular/rooms/room387.cpp
    engines/mads/madsv2/nebular/rooms/room388.cpp
    engines/mads/madsv2/nebular/rooms/room389.cpp
    engines/mads/madsv2/nebular/rooms/room390.cpp
    engines/mads/madsv2/nebular/rooms/room391.cpp
    engines/mads/madsv2/nebular/rooms/room399.cpp
    engines/mads/madsv2/nebular/rooms/section2.cpp
    engines/mads/madsv2/nebular/rooms/section3.cpp
    engines/mads/madsv2/nebular/rooms/section3.h
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/font.cpp b/engines/mads/madsv2/core/font.cpp
index 06fb93abbda..3bbefaf63f1 100644
--- a/engines/mads/madsv2/core/font.cpp
+++ b/engines/mads/madsv2/core/font.cpp
@@ -39,6 +39,7 @@ FontPtr font_main = NULL;              /* Interface & main font handles */
 FontPtr font_conv = NULL;
 FontPtr font_menu = NULL;
 FontPtr font_misc = NULL;
+FontPtr font_tele = NULL;
 
 byte font_colors[4] = { COLOR_TRANSPARENT, 15, 7, 8 };
 
diff --git a/engines/mads/madsv2/core/font.h b/engines/mads/madsv2/core/font.h
index f7a5ebf9bdc..a3c278d8b70 100644
--- a/engines/mads/madsv2/core/font.h
+++ b/engines/mads/madsv2/core/font.h
@@ -49,7 +49,7 @@ extern FontPtr font_main;               /* Font handle for main sentence   */
 extern FontPtr font_conv;               /* Font handle for conversations   */
 extern FontPtr font_menu;               /* Font handle for menu stuff      */
 extern FontPtr font_misc;               /* Font handle for symbols & icons */
-
+extern FontPtr font_tele;               /* Font handle for Rex teleporter  */
 
 extern FontPtr font_load(const char *name);
 extern int font_write(FontPtr font, Buffer *target, const char *out_string,
diff --git a/engines/mads/madsv2/core/inter.h b/engines/mads/madsv2/core/inter.h
index 2db03c3d1bd..085047469d8 100644
--- a/engines/mads/madsv2/core/inter.h
+++ b/engines/mads/madsv2/core/inter.h
@@ -298,6 +298,9 @@ extern void inter_set_active_inven(int inven_id);
  * @param this_	
  */
 extern void inter_give_to_player(int this_);
+
+extern void inter_take_from_player(int this_, int where_to);
+
 /*
  * inter_move_object()
  * Moves an object to a new location, taking into account any
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index db813594fed..72d6f3849ab 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -386,10 +386,12 @@ int kernel_game_startup(int game_video_mode, int load_flag,
 		font_conv = font_load("*FONTCONV.FF");
 		font_menu = font_load("*FONTMENU.FF");
 		font_misc = font_load("*FONTMISC.FF");
+		font_tele = (g_engine->getGameID() != GType_RexNebular) ? nullptr :
+			font_load("*FONTTELE.FF");
 
-		if ((font_main == NULL) || (font_inter == NULL) ||
-			(font_conv == NULL) || (font_menu == NULL) ||
-			(font_misc == NULL)) {
+		if ((font_main == NULL) || (font_inter == NULL) || (font_conv == NULL) ||
+			(font_menu == NULL) || (font_misc == NULL) ||
+			(g_engine->getGameID() == GType_RexNebular && font_tele == NULL)) {
 #ifndef disable_error_check
 			error_code = ERROR_KERNEL_NO_FONTS;
 #endif
@@ -1104,6 +1106,21 @@ int kernel_seq_purge(int sequence_id) {
 	return purged_any;
 }
 
+int kernel_seq_find_by_trigger(int trigger) {
+	for (int idx = 0; idx < KERNEL_MAX_SEQUENCES; ++idx) {
+		const auto &seq = sequence_list[idx];
+
+		if (seq.active_flag) {
+			for (int subIdx = 0; subIdx < seq.num_triggers; ++subIdx) {
+				if (trigger == seq.trigger_code[subIdx])
+					return idx;
+			}
+		}
+	}
+
+	return -1;
+}
+
 void kernel_seq_full_update() {
 	int count, id;
 
diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index fae3c5e7c0f..3bec5e720da 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -513,6 +513,7 @@ extern int kernel_seq_trigger(int sequence_id, int trigger_type,
 	int trigger_sprite, int trigger_code);
 extern int kernel_timing_trigger(int ticks, int trigger_code);
 extern int kernel_seq_purge(int sequence_id);
+extern int kernel_seq_find_by_trigger(int trigger);
 extern void kernel_seq_full_update();
 extern void kernel_draw_to_background(int series_id, int sprite_id,
 	int x, int y, int depth, int scale);
diff --git a/engines/mads/madsv2/core/quote.cpp b/engines/mads/madsv2/core/quote.cpp
index 1e1c6953be4..ac0a6559f78 100644
--- a/engines/mads/madsv2/core/quote.cpp
+++ b/engines/mads/madsv2/core/quote.cpp
@@ -41,7 +41,7 @@ char *quote_load(int quote_id, ...) {
 	return result;
 }
 
-char *quote_load(int quote_id, va_list marker) {
+char *quote_vload(int quote_id, va_list marker) {
 	int quote_error = 0;
 	int id;
 	int mark;
diff --git a/engines/mads/madsv2/nebular/global.cpp b/engines/mads/madsv2/nebular/global.cpp
index c9981cf535d..402d6aa4bab 100644
--- a/engines/mads/madsv2/nebular/global.cpp
+++ b/engines/mads/madsv2/nebular/global.cpp
@@ -29,8 +29,6 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Conversation _dialog1;
-
 // Section preloads
 extern void section_1_preload();
 extern void section_2_preload();
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index 5663525aef7..f8270426745 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -327,6 +327,7 @@ enum {
 #define FONT_CONVERSATION "*FONTCONV.FF"
 #define FONT_INTERFACE "*FONTINTR.FF"
 
+#define INDEFINITE_TIMEOUT 9999999
 
 extern void global_section_constructor();
 extern void sync_room(Common::Serializer &s);
diff --git a/engines/mads/madsv2/nebular/conversation.cpp b/engines/mads/madsv2/nebular/rooms/conversation.cpp
similarity index 92%
rename from engines/mads/madsv2/nebular/conversation.cpp
rename to engines/mads/madsv2/nebular/rooms/conversation.cpp
index 9693399705b..3731194a188 100644
--- a/engines/mads/madsv2/nebular/conversation.cpp
+++ b/engines/mads/madsv2/nebular/rooms/conversation.cpp
@@ -23,11 +23,12 @@
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/quote.h"
-#include "mads/madsv2/nebular/conversation.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 void Conversation::setup(int globalId, ...) {
 	va_list va;
@@ -60,7 +61,7 @@ void Conversation::set(int quoteId, ...) {
 
 	// Loop through handling each quote
 	while (quoteId > 0) {
-		for (uint idx = 0; idx < _count; ++idx) {
+		for (int idx = 0; idx < _count; ++idx) {
 			if (_quotes[idx] == quoteId) {
 				// Found index, so set that bit in the global keeping track of conversation state
 				global[_globalId] |= 1 << idx;
@@ -78,7 +79,7 @@ int Conversation::read(int quoteId) {
 	uint16 flags = global[_globalId];
 	int count = 0;
 
-	for (uint idx = 0; idx < _count; ++idx) {
+	for (int idx = 0; idx < _count; ++idx) {
 		if (flags & (1 << idx))
 			++count;
 
@@ -91,7 +92,7 @@ int Conversation::read(int quoteId) {
 }
 
 void Conversation::write(int quoteId, bool flag) {
-	for (uint idx = 0; idx < _count; ++idx) {
+	for (int idx = 0; idx < _count; ++idx) {
 		if (_quotes[idx] == quoteId) {
 			// Found index, so set or clear the flag
 			if (flag) {
@@ -110,7 +111,7 @@ void Conversation::start() {
 	inter_reset_dialog();
 
 	// Loop through each of the quotes loaded into the conversation
-	for (uint idx = 0; idx < _count; ++idx) {
+	for (int idx = 0; idx < _count; ++idx) {
 		// Check whether the given quote is enabled or not
 		if (global[_globalId] & (1 << idx)) {
 			// Quote enabled, so add it to the list of talk selections
@@ -121,6 +122,7 @@ void Conversation::start() {
 	kernel_set_interface_mode(INTER_CONVERSATION);
 }
 
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/conversation.h b/engines/mads/madsv2/nebular/rooms/conversation.h
similarity index 93%
rename from engines/mads/madsv2/nebular/conversation.h
rename to engines/mads/madsv2/nebular/rooms/conversation.h
index 516069bc8d5..3b6338a694a 100644
--- a/engines/mads/madsv2/nebular/conversation.h
+++ b/engines/mads/madsv2/nebular/rooms/conversation.h
@@ -19,17 +19,17 @@
  *
  */
 
-#ifndef MADS_NEBULAR_CONVERATION_H
-#define MADS_NEBULAR_CONVERATION_H
+#ifndef MADS_NEBULAR_ROOMS_CONVERATION_H
+#define MADS_NEBULAR_ROOMS_CONVERATION_H
 
 #include "mads/madsv2/engine.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
 #define MAX_CONV_MESSAGE 10
-#define INDEFINITE_TIMEOUT 9999999
 
 class Conversation {
 public:
@@ -64,6 +64,7 @@ public:
 	void start();
 };
 
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/forcefield.cpp b/engines/mads/madsv2/nebular/rooms/forcefield.cpp
new file mode 100644
index 00000000000..412cb13cc50
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/forcefield.cpp
@@ -0,0 +1,136 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/nebular/rooms/forcefield.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
+#include "mads/madsv2/engine.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
+
+static int compute_scale(int low, int high, int id) {
+	int diff = high - (low + 2);
+	int quotient = diff / 20;
+	int remainder = diff % 20;
+	int value = low + 2 + (quotient * id) + (remainder / (id + 1));
+
+	return value;
+}
+void init_forcefield(Forcefield *force, bool flag) {
+	force->_flag = flag;
+	force->_vertical = 0;
+	force->_horizontal = 0;
+	force->_timer = 0;
+
+	for (int count = 0; count < 40; count++)
+		force->_seqId[count] = -1;
+
+	if (force->_flag)
+		g_engine->_soundManager->command(24);
+}
+
+void handle_forcefield(Forcefield *force, int16 *sprites) {
+	if (_game._trigger >= 150) {
+		int id = _game._trigger - 150;
+		if (id < 40) {
+			if (id < 20)
+				force->_vertical--;
+			else
+				force->_horizontal--;
+
+			force->_seqId[id] = -1;
+		}
+		return;
+	}
+
+	if (!force->_flag || (_scene->_frameStartTime < force->_timer) || (force->_vertical + force->_horizontal >= 5))
+		return;
+
+	if (_vm->getRandomNumber(1, 1000) <= (200 + ((40 - (force->_vertical + force->_horizontal)) << 5))) {
+		int id = -1;
+		for (int i = 0; i < 100; i++) {
+			int randIdx = _vm->getRandomNumber(0, 39);
+			if (force->_seqId[randIdx] < 0) {
+				id = randIdx;
+				break;
+			}
+		}
+
+		if (id < 0) {
+			for (int i = 0; i < 40; i++) {
+				if (force->_seqId[i] < 0) {
+					id = i;
+					break;
+				}
+			}
+		}
+
+		int speedX, speedY;
+		int posX, posY;
+		int randVal = _vm->getRandomNumber(1, 100);
+		int spriteId;
+		bool mirror;
+
+		if (id >= 20) {
+			spriteId = 2;
+			mirror = (randVal <= 50);
+			posX = mirror ? 315 : 5;
+			posY = compute_scale(15, 119, id - 20);
+			speedX = 1000 * (mirror ? -1 : 1);
+			speedY = 0;
+		} else if (randVal <= 50) {
+			spriteId = 1;
+			mirror = false;
+			posX = compute_scale(21, 258, id);
+			posY = 0;
+			speedX = 0;
+			speedY = 600;
+		} else {
+			spriteId = 0;
+			mirror = false;
+			posX = compute_scale(21, 258, id);
+			posY = 155;
+			speedX = 0;
+			speedY = -600;
+		}
+
+		if (id >= 0) {
+			force->_seqId[id] = _scene->_sequences.addSpriteCycle(sprites[spriteId], mirror, 2, 0, 0, 0);
+			_scene->_sequences.setDepth(force->_seqId[id], 8);
+			_scene->_sequences.setPosition(force->_seqId[id], Common::Point(posX, posY));
+			_scene->_sequences.setMotion(force->_seqId[id], 2, speedX, speedY);
+			_scene->_sequences.addSubEntry(force->_seqId[id], SEQUENCE_TRIGGER_EXPIRE, 0, 150 + id);
+			if (spriteId == 2)
+				force->_horizontal++;
+			else
+				force->_vertical++;
+		}
+	}
+
+	force->_timer = _scene->_frameStartTime + 4;
+}
+
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/forcefield.h b/engines/mads/madsv2/nebular/rooms/forcefield.h
new file mode 100644
index 00000000000..4d9a1e7e880
--- /dev/null
+++ b/engines/mads/madsv2/nebular/rooms/forcefield.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_ROOMS_TELEPORTER_H
+#define MADS_NEBULAR_ROOMS_TELEPORTER_H
+
+#include "common/serializer.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
+
+struct Forcefield {
+	bool _flag;
+	int _vertical;
+	int _horizontal;
+	int _seqId[40];
+	long _timer;
+
+	void init() {
+		_flag = false;
+		_vertical = _horizontal = -1;
+		_timer = 0;
+		for (int i = 0; i < 40; ++i)
+			_seqId[i] = -1;
+	}
+
+	void synchronize(Common::Serializer &s) {
+		s.syncAsByte(_flag);
+		s.syncAsSint32LE(_vertical);
+		s.syncAsSint32LE(_horizontal);
+		for (int i = 0; i < 40; ++i)
+			s.syncAsSint32LE(_seqId[i]);
+		s.syncAsUint32LE(_timer);
+	};
+};
+
+extern void init_forcefield(Forcefield *force, bool flag);
+extern void handle_forcefield(Forcefield *force, int16 *sprites);
+
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/rooms/room201.cpp b/engines/mads/madsv2/nebular/rooms/room201.cpp
index 4d060adb027..e41f9335179 100644
--- a/engines/mads/madsv2/nebular/rooms/room201.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room201.cpp
@@ -23,7 +23,7 @@
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
-#include "mads/madsv2/nebular/mads/words.h"	q	
+#include "mads/madsv2/nebular/mads/words.h"	
 #include "mads/madsv2/nebular/rooms/section2.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index 394c62575de..b13d2621087 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -173,6 +173,55 @@ static void setRandomKernelMessage() {
 	local._activeMsgFl = true;
 }
 
+static int subStep1(int randVal) {
+	if ((randVal <= 100) || local._toStationFl)
+		return 42;
+
+	if ((randVal <= 200) || local._toTeleportFl)
+		return 96;
+
+	if ((randVal <= 300) && (local._lastRoute != 1))
+		return 77;
+
+	return 76;
+}
+
+static int subStep2(int randVal) {
+	if ((randVal <= 150) && (local._stationCounter < 5))
+		return 51;
+
+	if ((randVal <= 300) || local._toTeleportFl)
+		return 74;
+
+	if (randVal <= 400)
+		return 64;
+
+	return 44;
+}
+
+static int subStep3(int randVal) {
+	if ((randVal <= 100) || local._toStationFl)
+		return 27;
+
+	if ((randVal <= 200) || local._toTeleportFl)
+		return 159;
+
+	if ((randVal <= 300) && (local._lastRoute != 2))
+		return 119;
+
+	return 110;
+}
+
+static int subStep4(int randVal) {
+	if ((randVal <= 100) || local._toTeleportFl)
+		return 176;
+
+	if (randVal <= 200)
+		return 19;
+
+	return 166;
+}
+
 static void room_202_daemon() {
 	if (!local._activeMsgFl && (_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH) && (_vm->getRandomNumber(999) == 0)) {
 		_scene->_kernelMessages.reset();
@@ -369,66 +418,17 @@ static void room_202_daemon() {
 	}
 }
 
-static int subStep1(int randVal) {
-	if ((randVal <= 100) || local._toStationFl)
-		return 42;
-
-	if ((randVal <= 200) || local._toTeleportFl)
-		return 96;
-
-	if ((randVal <= 300) && (local._lastRoute != 1))
-		return 77;
-
-	return 76;
-}
-
-static int subStep2(int randVal) {
-	if ((randVal <= 150) && (local._stationCounter < 5))
-		return 51;
-
-	if ((randVal <= 300) || local._toTeleportFl)
-		return 74;
-
-	if (randVal <= 400)
-		return 64;
-
-	return 44;
-}
-
-static int subStep3(int randVal) {
-	if ((randVal <= 100) || local._toStationFl)
-		return 27;
-
-	if ((randVal <= 200) || local._toTeleportFl)
-		return 159;
-
-	if ((randVal <= 300) && (local._lastRoute != 2))
-		return 119;
-
-	return 110;
-}
-
-static int subStep4(int randVal) {
-	if ((randVal <= 100) || local._toTeleportFl)
-		return 176;
-
-	if (randVal <= 200)
-		return 19;
-
-	return 166;
-}
-
 static void room_202_pre_parser() {
-	auto &player = _vm->_game->_player;
+	auto &gplayer = _vm->_game->_player;
 
-	if (player._needToWalk)
+	if (gplayer._needToWalk)
 		_scene->_kernelMessages.reset();
 
-	if (local._ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || player._needToWalk)) {
+	if (local._ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || gplayer._needToWalk)) {
 		if (_game._trigger == 0) {
 			_vm->_sound->command(29);
-			player._readyToWalk = false;
-			player._stepEnabled = false;
+			gplayer._readyToWalk = false;
+			gplayer._stepEnabled = false;
 			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
 			_globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
@@ -436,21 +436,21 @@ static void room_202_pre_parser() {
 		} else if (_game._trigger == 1) {
 			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]);
 			_scene->_dynamicHotspots.remove(local._ladderHotspotId);
-			player._visible = true;
-			player._readyToWalk = true;
-			player._stepEnabled = true;
+			gplayer._visible = true;
+			gplayer._readyToWalk = true;
+			gplayer._stepEnabled = true;
 			local._ladderTopFl = false;
 		}
 	}
 
 	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && (_action._activeAction._indirectObjectId > 0)) {
-		if (!player._readyToWalk || local._ladderTopFl)
-			player._needToWalk = false;
+		if (!gplayer._readyToWalk || local._ladderTopFl)
+			gplayer._needToWalk = false;
 		else
-			player._needToWalk = true;
+			gplayer._needToWalk = true;
 
 		if (!local._ladderTopFl)
-			player.walk(Common::Point(171, 122), FACING_NORTH);
+			gplayer.walk(Common::Point(171, 122), FACING_NORTH);
 	}
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index b0b2f347793..776ecdb7311 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -22,7 +22,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/conversation.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index a72f41bddda..67e01cff4bc 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -118,15 +118,15 @@ static void moveSpider() {
 }
 
 static void room_207_daemon() {
-	auto &player = _game._player;
+	auto &gplayer = _game._player;
 
 	if (local._vultureFl) {
-		if (((int32)player._priorTimer - local._vultureTime) > 1700)
+		if (((int32)gplayer._priorTimer - local._vultureTime) > 1700)
 			moveVulture();
 	}
 
 	if (local._spiderFl) {
-		if (((int32)player._priorTimer - local._spiderTime) > 800)
+		if (((int32)gplayer._priorTimer - local._spiderTime) > 800)
 			moveSpider();
 	}
 
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
index a2fc2f9daef..de4fc79f136 100644
--- a/engines/mads/madsv2/nebular/rooms/room208.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -155,16 +155,16 @@ static void room_208_daemon() {
 }
 
 static void room_208_pre_parser() {
-	auto &player = _vm->_game->_player;
+	auto &gplayer = _vm->_game->_player;
 
-	if (_action.isAction(VERB_LOOK) && player._readyToWalk)
-		player._needToWalk = true;
+	if (_action.isAction(VERB_LOOK) && gplayer._readyToWalk)
+		gplayer._needToWalk = true;
 
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_GRASSLAND_TO_EAST))
-		player._walkOffScreenSceneId = 209;
+		gplayer._walkOffScreenSceneId = 209;
 
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
-		player._walkOffScreenSceneId = 207;
+		gplayer._walkOffScreenSceneId = 207;
 }
 
 static void subAction(int mode) {
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index a049bbbe38d..dc5886e5c86 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -46,7 +46,7 @@ struct Scratch {
 	int32 _pauseMode;
 	bool _binocularsDroppedFl;
 	bool _startShootingInTimerFl;
-	bool _dialogAbortVal;
+	int32 _dialogAbortVal;
 	bool _playingDialogFl;
 	bool _shootMissedLastFl;
 	bool _removeMonkeyFl;
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index 53ccef5f52f..cfce88548dd 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -22,7 +22,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/conversation.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
@@ -58,205 +58,40 @@ struct Scratch {
 static Scratch local;
 
 
-static void handleConversations() {
-	if (_game._trigger == 0) {
-		_scene->_kernelMessages.reset();
-		_game._player._stepEnabled = false;
-		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
-		if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
-			Common::String subQuote1, subQuote2;
-			_game.splitQuote(curQuote, subQuote1, subQuote2);
-			Common::strcpy_s(local._subQuote2, subQuote2.c_str());
-			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
-			_scene->_sequences.addTimer(60, 50);
-		} else {
-			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
-		}
-	} else if (_game._trigger == 50) {
-		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, local._subQuote2);
-		_scene->_sequences.addTimer(180, 1);
-	} else {
-		if (_game._trigger == 1)
-			_scene->_kernelMessages.reset();
-
-		switch (local._curDialogNode) {
-		case 1:
-			handleConversation1();
-			break;
-
-		case 2:
-			handleConversation2();
-			break;
-
-		case 3:
-			handleConversation3();
-			break;
-
-		case 5:
-			handleConversation5();
-			break;
-
-		case 6:
-			handleConversation6();
-			break;
-
-		case 7:
-			handleConversation7();
-			break;
-
-		case 8:
-			handleConversation8();
-			break;
-
-		default:
-			break;
-		}
-	}
-}
-
-static void handleConversation1() {
-	switch (_action._activeAction._verbId) {
-	case 180:
-		setDialogNode(2);
-		break;
-
-	case 181:
-		setDialogNode(6);
-		break;
-
-	case 182:
-		setDialogNode(4);
-		break;
-
-	case 183:
-		setDialogNode(9);
-		break;
-
-	case 184:
-		setDialogNode(0);
-		break;
-
-	default:
-		break;
-	}
-}
-
-static void handleConversation2() {
-	switch (_action._activeAction._verbId) {
-	case 187:
-		setDialogNode(3);
-		break;
-
-	case 188:
-		setDialogNode(4);
-		break;
-
-	case 189:
-		setDialogNode(0);
-		break;
-
-	default:
-		break;
-	}
-}
-
-static void handleConversation3() {
-	switch (_action._activeAction._verbId) {
-	case 193:
-		setDialogNode(6);
-		break;
-
-	case 194:
-		setDialogNode(5);
-		break;
-
-	case 195:
-		setDialogNode(4);
-		break;
-
-	case 196:
-		setDialogNode(0);
-		break;
-
-	default:
-		break;
-	}
-}
-
-static void handleConversation5() {
-	switch (_action._activeAction._verbId) {
-	case 204:
-		setDialogNode(6);
-		break;
-
-	case 205:
-	case 206:
-		setDialogNode(4);
-		break;
-
-	case 207:
-		setDialogNode(0);
-		break;
-
-	default:
-		break;
-	}
+static void handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) {
+	_scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? INDEFINITE_TIMEOUT : delay, _game.getQuote(quoteId));
 }
 
-static void handleConversation6() {
-	switch (_action._activeAction._verbId) {
-	case 211:
-		setDialogNode(7);
-		break;
-
-	case 212:
-		setDialogNode(4);
-		break;
-
-	case 213:
-		setDialogNode(0);
-		break;
-
-	default:
-		break;
-	}
-}
+static void newNode(int node) {
+	local._curDialogNode = node;
 
-static void handleConversation7() {
-	switch (_action._activeAction._verbId) {
-	case 216:
-	case 217:
-	case 219:
-		setDialogNode(4);
+	switch (local._curDialogNode) {
+	case 1:
+		local._conv1.start();
 		break;
 
-	case 218:
-		setDialogNode(8);
+	case 2:
+		local._conv2.start();
 		break;
 
-	case 220:
-		setDialogNode(0);
+	case 3:
+		local._conv3.start();
 		break;
 
-	default:
+	case 5:
+		local._conv5.start();
 		break;
-	}
-}
 
-static void handleConversation8() {
-	switch (_action._activeAction._verbId) {
-	case 223:
-	case 224:
-		setDialogNode(4);
+	case 6:
+		local._conv6.start();
 		break;
 
-	case 225:
-	case 226:
-		setDialogNode(9);
+	case 7:
+		local._conv7.start();
 		break;
 
-	case 227:
-		setDialogNode(0);
+	case 8:
+		local._conv8.start();
 		break;
 
 	default:
@@ -560,40 +395,68 @@ static void setDialogNode(int node) {
 	}
 }
 
-static void handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) {
-	_scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? INDEFINITE_TIMEOUT : delay, _game.getQuote(quoteId));
+static void handleConversation1() {
+	switch (_action._activeAction._verbId) {
+	case 180:
+		setDialogNode(2);
+		break;
+
+	case 181:
+		setDialogNode(6);
+		break;
+
+	case 182:
+		setDialogNode(4);
+		break;
+
+	case 183:
+		setDialogNode(9);
+		break;
+
+	case 184:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
 }
 
-static void newNode(int node) {
-	local._curDialogNode = node;
+static void handleConversation2() {
+	switch (_action._activeAction._verbId) {
+	case 187:
+		setDialogNode(3);
+		break;
 
-	switch (local._curDialogNode) {
-	case 1:
-		local._conv1.start();
+	case 188:
+		setDialogNode(4);
 		break;
 
-	case 2:
-		local._conv2.start();
+	case 189:
+		setDialogNode(0);
 		break;
 
-	case 3:
-		local._conv3.start();
+	default:
 		break;
+	}
+}
 
-	case 5:
-		local._conv5.start();
+static void handleConversation3() {
+	switch (_action._activeAction._verbId) {
+	case 193:
+		setDialogNode(6);
 		break;
 
-	case 6:
-		local._conv6.start();
+	case 194:
+		setDialogNode(5);
 		break;
 
-	case 7:
-		local._conv7.start();
+	case 195:
+		setDialogNode(4);
 		break;
 
-	case 8:
-		local._conv8.start();
+	case 196:
+		setDialogNode(0);
 		break;
 
 	default:
@@ -601,6 +464,143 @@ static void newNode(int node) {
 	}
 }
 
+static void handleConversation5() {
+	switch (_action._activeAction._verbId) {
+	case 204:
+		setDialogNode(6);
+		break;
+
+	case 205:
+	case 206:
+		setDialogNode(4);
+		break;
+
+	case 207:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+static void handleConversation6() {
+	switch (_action._activeAction._verbId) {
+	case 211:
+		setDialogNode(7);
+		break;
+
+	case 212:
+		setDialogNode(4);
+		break;
+
+	case 213:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+static void handleConversation7() {
+	switch (_action._activeAction._verbId) {
+	case 216:
+	case 217:
+	case 219:
+		setDialogNode(4);
+		break;
+
+	case 218:
+		setDialogNode(8);
+		break;
+
+	case 220:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+static void handleConversation8() {
+	switch (_action._activeAction._verbId) {
+	case 223:
+	case 224:
+		setDialogNode(4);
+		break;
+
+	case 225:
+	case 226:
+		setDialogNode(9);
+		break;
+
+	case 227:
+		setDialogNode(0);
+		break;
+
+	default:
+		break;
+	}
+}
+
+static void handleConversations() {
+	if (_game._trigger == 0) {
+		_scene->_kernelMessages.reset();
+		_game._player._stepEnabled = false;
+		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+		if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
+			Common::String subQuote1, subQuote2;
+			_game.splitQuote(curQuote, subQuote1, subQuote2);
+			Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
+			_scene->_sequences.addTimer(60, 50);
+		} else {
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
+		}
+	} else if (_game._trigger == 50) {
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, local._subQuote2);
+		_scene->_sequences.addTimer(180, 1);
+	} else {
+		if (_game._trigger == 1)
+			_scene->_kernelMessages.reset();
+
+		switch (local._curDialogNode) {
+		case 1:
+			handleConversation1();
+			break;
+
+		case 2:
+			handleConversation2();
+			break;
+
+		case 3:
+			handleConversation3();
+			break;
+
+		case 5:
+			handleConversation5();
+			break;
+
+		case 6:
+			handleConversation6();
+			break;
+
+		case 7:
+			handleConversation7();
+			break;
+
+		case 8:
+			handleConversation8();
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
 static void restoreDialogNode(int node, int msgId, int posY) {
 	int curQuoteId = msgId;
 	int curY = 1 - posY;
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index f761d8d8c13..56296b774fa 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -25,6 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -47,7 +48,7 @@ static void room_213_init() {
 	else
 		local._handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
 
-	teleporterEnter();
+	teleporter_init();
 
 	// The original is calling Scene2xx::section_2_music()
 	if (_vm->_musicFlag) {
@@ -61,11 +62,11 @@ static void room_213_init() {
 }
 
 static void room_213_daemon() {
-	teleporterStep();
+	teleporter_daemon();
 }
 
 static void room_213_parser() {
-	if (teleporterActions()) {
+	if (teleporter_parser()) {
 		_action._inProgress = false;
 		return;
 	}
diff --git a/engines/mads/madsv2/nebular/rooms/room214.cpp b/engines/mads/madsv2/nebular/rooms/room214.cpp
index 618236a9eaa..818119d0881 100644
--- a/engines/mads/madsv2/nebular/rooms/room214.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room214.cpp
@@ -32,33 +32,22 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-Scene214::Scene214(RexNebularEngine *vm) : Scene2xx(vm) {
-	_devilTime = 0;
-	_devilRunningFl = false;
-}
-
-void Scene214::synchronize(Common::Serializer &s) {
-	Scene2xx::synchronize(s);
+struct Scratch {
+	int32 _devilTime;
+	bool _devilRunningFl;
+};
 
-	s.syncAsUint32LE(_devilTime);
-	s.syncAsByte(_devilRunningFl);
-}
+static Scratch local;
 
-void Scene214::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_CAPTIVE_CREATURE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
-void Scene214::enter() {
+static void room_214_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('e', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('t', -1));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRD_7");
 
-	_devilTime = _game._player._priorTimer;
-	_devilRunningFl = false;
+	local._devilTime = _game._player._priorTimer;
+	local._devilRunningFl = false;
 
 	if (_game._objects.isInRoom(OBJ_POISON_DARTS)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
@@ -82,9 +71,9 @@ void Scene214::enter() {
 	section_2_music();
 }
 
-void Scene214::step() {
-	if ((_game._player._priorTimer - _devilTime > 800) && !_devilRunningFl) {
-		_devilRunningFl = true;
+static void room_214_daemon() {
+	if ((_game._player._priorTimer - local._devilTime > 800) && !local._devilRunningFl) {
+		local._devilRunningFl = true;
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 6, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
@@ -92,7 +81,7 @@ void Scene214::step() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 	}
 
-	if (_devilRunningFl) {
+	if (local._devilRunningFl) {
 		switch (_game._trigger) {
 		case 71:
 		{
@@ -114,8 +103,8 @@ void Scene214::step() {
 			_scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 9, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
-			_devilTime = _game._player._priorTimer;
-			_devilRunningFl = false;
+			local._devilTime = _game._player._priorTimer;
+			local._devilRunningFl = false;
 		}
 		break;
 
@@ -125,7 +114,7 @@ void Scene214::step() {
 	}
 }
 
-void Scene214::actions() {
+static void room_214_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21427);
 	else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT))
@@ -256,16 +245,20 @@ void Scene214::actions() {
 	_action._inProgress = false;
 }
 
+void room_214_synchronize(Common::Serializer &s) {
+	s.syncAsUint32LE(local._devilTime);
+	s.syncAsByte(local._devilRunningFl);
+}
+
 void room_214_preload() {
 	room_init_code_pointer = room_214_init;
-	room_pre_parser_code_pointer = room_214_pre_parser;
 	room_parser_code_pointer = room_214_parser;
 	room_daemon_code_pointer = room_214_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
+	_scene->addActiveVocab(NOUN_CAPTIVE_CREATURE);
+	_scene->addActiveVocab(VERB_WALKTO);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room215.cpp b/engines/mads/madsv2/nebular/rooms/room215.cpp
index 39a35719857..e1b93f66999 100644
--- a/engines/mads/madsv2/nebular/rooms/room215.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room215.cpp
@@ -32,12 +32,7 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void Scene215::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene215::enter() {
+static void room_215_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
 
@@ -66,7 +61,7 @@ void Scene215::enter() {
 	section_2_music();
 }
 
-void Scene215::step() {
+static void room_215_daemon() {
 	if (_game._trigger == 70) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
@@ -80,7 +75,7 @@ void Scene215::step() {
 	}
 }
 
-void Scene215::actions() {
+static void room_215_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21509);
 	else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT)) {
@@ -156,12 +151,9 @@ void Scene215::actions() {
 
 void room_215_preload() {
 	room_init_code_pointer = room_215_init;
-	room_pre_parser_code_pointer = room_215_pre_parser;
 	room_parser_code_pointer = room_215_parser;
 	room_daemon_code_pointer = room_215_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
 }
diff --git a/engines/mads/madsv2/nebular/rooms/room216.cpp b/engines/mads/madsv2/nebular/rooms/room216.cpp
index 5039130fbb5..fad7ade4042 100644
--- a/engines/mads/madsv2/nebular/rooms/room216.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room216.cpp
@@ -32,12 +32,7 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void Scene216::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene216::enter() {
+void room_216_init() {
 	_game._player._stepEnabled = false;
 	_game._player._visible = false;
 
@@ -48,19 +43,19 @@ void Scene216::enter() {
 	section_2_music();
 }
 
-void Scene216::step() {
+void room_216_daemon() {
 	if (_game._trigger == 60)
 		_scene->_nextSceneId = 215;
 }
 
+void room_216_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
 void room_216_preload() {
 	room_init_code_pointer = room_216_init;
-	room_pre_parser_code_pointer = room_216_pre_parser;
-	room_parser_code_pointer = room_216_parser;
 	room_daemon_code_pointer = room_216_daemon;
 
-	anim_himem_preload(formAnimName('A', -1), 3);
-
 	section_2_walker();
 	section_2_interface();
 }
diff --git a/engines/mads/madsv2/nebular/rooms/room301.cpp b/engines/mads/madsv2/nebular/rooms/room301.cpp
index 873b9a65867..65d70fb94c8 100644
--- a/engines/mads/madsv2/nebular/rooms/room301.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room301.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene301::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene301::enter() {
+static void room_301_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
 
@@ -43,14 +43,27 @@ void Scene301::enter() {
 	_game._player._visible = false;
 	_scene->loadAnimation(formAnimName('a', -1), 60);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene301::step() {
+static void room_301_daemon() {
 	if (_game._trigger == 60)
 		_scene->_nextSceneId = 302;
 }
 
+void room_301_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_301_preload() {
+	room_init_code_pointer = room_301_init;
+	room_daemon_code_pointer = room_301_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room302.cpp b/engines/mads/madsv2/nebular/rooms/room302.cpp
index fb2396c6739..ad9d38bdb3b 100644
--- a/engines/mads/madsv2/nebular/rooms/room302.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room302.cpp
@@ -19,44 +19,41 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene302::Scene302(RexNebularEngine *vm) : Scene3xx(vm) {
-	_oldFrame = 0;
-}
+struct Scratch {
+	int32 _oldFrame;
+};
 
-void Scene302::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsSint32LE(_oldFrame);
-}
 
-void Scene302::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene302::enter() {
+static void room_302_init() {
 	_game._player._stepEnabled = false;
 	_game._player._visible = false;
 
 	_scene->loadAnimation(formAnimName('a', -1), 71);
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene302::step() {
+static void room_302_daemon() {
 	if (_game._trigger == 71)
 		_scene->_nextSceneId = 303;
 
-	if ((_scene->_animation[0] != nullptr) && (_scene->_animation[0]->getCurrentFrame() != _oldFrame)) {
-		_oldFrame = _scene->_animation[0]->getCurrentFrame();
-		if (_oldFrame == 147) {
+	if ((_scene->_animation[0] != nullptr) && (_scene->_animation[0]->getCurrentFrame() != local._oldFrame)) {
+		local._oldFrame = _scene->_animation[0]->getCurrentFrame();
+		if (local._oldFrame == 147) {
 			_game._objects.setRoom(OBJ_POISON_DARTS, 1);
 			_game._objects.setRoom(OBJ_BLOWGUN, 1);
 			_game._objects.setRoom(OBJ_REBREATHER, 1);
@@ -73,6 +70,19 @@ void Scene302::step() {
 	}
 }
 
+void room_302_synchronize(Common::Serializer &s) {
+	s.syncAsSint32LE(local._oldFrame);
+}
+
+void room_302_preload() {
+	room_init_code_pointer = room_302_init;
+	room_daemon_code_pointer = room_302_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room303.cpp b/engines/mads/madsv2/nebular/rooms/room303.cpp
index afa4f79c992..b55faa9eb31 100644
--- a/engines/mads/madsv2/nebular/rooms/room303.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room303.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene303::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene303::enter() {
+static void room_303_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
 
@@ -44,14 +44,27 @@ void Scene303::enter() {
 	_game._player._stepEnabled = false;
 	_scene->loadAnimation(formAnimName('a', -1), 60);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene303::step() {
+static void room_303_daemon() {
 	if (_game._trigger == 60)
 		_scene->_nextSceneId = 304;
 }
 
+void room_303_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_303_preload() {
+	room_init_code_pointer = room_303_init;
+	room_daemon_code_pointer = room_303_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room304.cpp b/engines/mads/madsv2/nebular/rooms/room304.cpp
index 38ca829d695..d2e10bf3b58 100644
--- a/engines/mads/madsv2/nebular/rooms/room304.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room304.cpp
@@ -19,30 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene304::Scene304(RexNebularEngine *vm) : Scene3xx(vm) {
-	_explosionSpriteId = -1;
-}
-
-void Scene304::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+struct Scratch {
+	int32 _explosionSpriteId;
+};
 
-	s.syncAsSint32LE(_explosionSpriteId);
-}
-
-void Scene304::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
+static Scratch local;
 
-void Scene304::enter() {
+static void room_304_init() {
 	if (_scene->_priorSceneId == 303) {
 		_game._player._visible = false;
 		_game._player._stepEnabled = false;
@@ -71,11 +67,11 @@ void Scene304::enter() {
 		_scene->_sequences.addTimer(48, 70);
 	}
 
-	sceneEntrySound();
+	section_3_music();
 	_game.loadQuoteSet(0xEB, 0xEC, 0);
 }
 
-void Scene304::step() {
+static void room_304_daemon() {
 	if (_game._trigger == 60)
 		_scene->_nextSceneId = 311;
 
@@ -89,11 +85,11 @@ void Scene304::step() {
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, 4);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 			if (_globals[kSexOfRex] == REX_MALE)
-				_explosionSpriteId = _globals._spriteIndexes[1];
+				local._explosionSpriteId = _globals._spriteIndexes[1];
 			else
-				_explosionSpriteId = _globals._spriteIndexes[4];
+				local._explosionSpriteId = _globals._spriteIndexes[4];
 
-			int sprIdx = _scene->_sequences.addSpriteCycle(_explosionSpriteId, false, 8, 1, 0, 0);
+			int sprIdx = _scene->_sequences.addSpriteCycle(local._explosionSpriteId, false, 8, 1, 0, 0);
 			_scene->_sequences.setAnimRange(sprIdx, -1, 4);
 			_scene->_sequences.setDepth(sprIdx, 1);
 			_scene->_sequences.addSubEntry(sprIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 71);
@@ -110,7 +106,7 @@ void Scene304::step() {
 		case 72:
 		{
 			_vm->_sound->command(43);
-			int sprIdx = _scene->_sequences.addSpriteCycle(_explosionSpriteId, false, 8, 1, 0, 0);
+			int sprIdx = _scene->_sequences.addSpriteCycle(local._explosionSpriteId, false, 8, 1, 0, 0);
 			_scene->_sequences.setAnimRange(sprIdx, 5, -2);
 			_scene->_sequences.setDepth(sprIdx, 1);
 			_scene->_sequences.addSubEntry(sprIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 73);
@@ -121,7 +117,7 @@ void Scene304::step() {
 
 		case 73:
 		{
-			int sprIdx = _scene->_sequences.addSpriteCycle(_explosionSpriteId, false, 8, 0, 0, 0);
+			int sprIdx = _scene->_sequences.addSpriteCycle(local._explosionSpriteId, false, 8, 0, 0, 0);
 			_scene->_sequences.setAnimRange(sprIdx, -2, -2);
 			_scene->_sequences.setDepth(sprIdx, 1);
 		}
@@ -164,6 +160,19 @@ void Scene304::step() {
 	}
 }
 
+void room_304_synchronize(Common::Serializer &s) {
+	s.syncAsSint32LE(local._explosionSpriteId);
+}
+
+void room_304_preload() {
+	room_init_code_pointer = room_304_init;
+	room_daemon_code_pointer = room_304_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room307.cpp b/engines/mads/madsv2/nebular/rooms/room307.cpp
index 65ea57d466b..d533940dd20 100644
--- a/engines/mads/madsv2/nebular/rooms/room307.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room307.cpp
@@ -19,92 +19,56 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/forcefield.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene307::Scene307(RexNebularEngine *vm) : Scene3xx(vm) {
-	_afterPeeingFl = false;
-	_duringPeeingFl = false;
-	_grateOpenedFl = false;
-	_activePrisonerFl = false;
-
-	_animationMode = -1;
-	_prisonerMessageId = -1;
-	_fieldCollisionCounter = -1;
-
-	_lastFrameTime = 0;
-	_guardTime = 0;
-	_prisonerTimer = 0;
-
-	_subQuote2 = "";
-
-	_forceField.init();
-}
-
-void Scene307::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
-
-	_forceField.synchronize(s);
-
-	s.syncAsByte(_afterPeeingFl);
-	s.syncAsByte(_duringPeeingFl);
-	s.syncAsByte(_grateOpenedFl);
-	s.syncAsByte(_activePrisonerFl);
-
-	s.syncAsSint32LE(_animationMode);
-	s.syncAsSint32LE(_prisonerMessageId);
-	s.syncAsSint32LE(_fieldCollisionCounter);
-
-	s.syncAsUint32LE(_lastFrameTime);
-	s.syncAsUint32LE(_guardTime);
-	s.syncAsUint32LE(_prisonerTimer);
-
-	s.syncString(_subQuote2);
-}
-
-void Scene307::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_AIR_VENT);
-	_scene->addActiveVocab(VERB_CLIMB_INTO);
-}
-
-void Scene307::handleRexDialog(int quote) {
+namespace Rooms {
+
+struct Scratch {
+	bool _afterPeeingFl;
+	bool _duringPeeingFl;
+	bool _grateOpenedFl;
+	bool _activePrisonerFl;
+ 	int32 _animationMode;
+	int32 _prisonerMessageId;
+	int32 _fieldCollisionCounter;
+	int32 _lastFrameTime;
+	int32 _guardTime;
+	int32 _prisonerTimer;
+	char _subQuote2[256];
+
+	Conversation _dialog1;
+	Conversation _dialog2;
+	Forcefield _forcefield;
+};
+
+static Scratch local;
+
+
+static void handleRexDialog(int quote) {
 	Common::String curQuote = _game.getQuote(quote);
 	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-		Common::String subQuote1;
-		_game.splitQuote(curQuote, subQuote1, _subQuote2);
+		Common::String subQuote1, subQuote2;
+		_game.splitQuote(curQuote, subQuote1, subQuote2);
+		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+
 		_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
-		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 180, _subQuote2);
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 180, local._subQuote2);
 	} else
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
 }
 
-void Scene307::handlePrisonerEncounter() {
-	switch (_action._activeAction._verbId) {
-	case 275:
-		setDialogNode(5);
-		break;
-
-	case 277:
-		setDialogNode(4);
-		break;
-
-	case 276:
-		setDialogNode(6);
-		break;
-
-	default:
-		break;
-	}
-}
-
-void Scene307::handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout) {
+static void handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout) {
 	int height = number * 14;
 	int posY;
 
@@ -114,7 +78,7 @@ void Scene307::handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout
 		posY = 78 - (height / 2);
 
 	_scene->_kernelMessages.reset();
-	_activePrisonerFl = true;
+	local._activePrisonerFl = true;
 
 	int quoteId = firstQuoteId;
 	for (int count = 0; count < number; count++) {
@@ -125,7 +89,7 @@ void Scene307::handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout
 	}
 }
 
-void Scene307::setDialogNode(int node) {
+static void setDialogNode(int node) {
 	switch (node) {
 	case 0:
 		handlePrisonerSpeech(0x153, 2, 120);
@@ -135,13 +99,13 @@ void Scene307::setDialogNode(int node) {
 	case 1:
 		_globals[kMetBuddyBeast] = true;
 		handlePrisonerSpeech(0x10F, 2, INDEFINITE_TIMEOUT);
-		_dialog1.start();
+		local._dialog1.start();
 		break;
 
 	case 2:
 		_globals[kMetBuddyBeast] = true;
 		handlePrisonerSpeech(0x111, 2, INDEFINITE_TIMEOUT);
-		_dialog1.start();
+		local._dialog1.start();
 		break;
 
 	case 4:
@@ -152,7 +116,7 @@ void Scene307::setDialogNode(int node) {
 	case 5:
 		_globals[kKnowsBuddyBeast] = true;
 		handlePrisonerSpeech(0x117, 2, INDEFINITE_TIMEOUT);
-		_dialog2.start();
+		local._dialog2.start();
 		break;
 
 	case 6:
@@ -163,57 +127,57 @@ void Scene307::setDialogNode(int node) {
 	case 7:
 		_globals[kKnowsBuddyBeast] = true;
 		handlePrisonerSpeech(0x124, 10, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x11A, false);
-		_dialog2.write(0x11B, true);
-		_dialog2.write(0x120, true);
-		_dialog2.start();
+		local._dialog2.write(0x11A, false);
+		local._dialog2.write(0x11B, true);
+		local._dialog2.write(0x120, true);
+		local._dialog2.start();
 		break;
 
 	case 8:
 		handlePrisonerSpeech(0x12E, 6, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x11A, false);
-		_dialog2.write(0x11B, false);
-		_dialog2.write(0x11C, true);
-		_dialog2.write(0x11D, true);
-		_dialog2.write(0x11F, true);
-		_dialog2.start();
+		local._dialog2.write(0x11A, false);
+		local._dialog2.write(0x11B, false);
+		local._dialog2.write(0x11C, true);
+		local._dialog2.write(0x11D, true);
+		local._dialog2.write(0x11F, true);
+		local._dialog2.start();
 		break;
 
 	case 9:
 		handlePrisonerSpeech(0x134, 4, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x11D, false);
-		_dialog2.start();
+		local._dialog2.write(0x11D, false);
+		local._dialog2.start();
 		break;
 
 	case 10:
 		handlePrisonerSpeech(0x138, 6, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x11E, false);
-		_dialog2.start();
+		local._dialog2.write(0x11E, false);
+		local._dialog2.start();
 		break;
 
 	case 11:
 		handlePrisonerSpeech(0x13E, 6, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x11F, false);
-		_dialog2.write(0x121, true);
-		_dialog2.start();
+		local._dialog2.write(0x11F, false);
+		local._dialog2.write(0x121, true);
+		local._dialog2.start();
 		break;
 
 	case 12:
 		handlePrisonerSpeech(0x144, 4, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x11C, false);
-		_dialog2.start();
+		local._dialog2.write(0x11C, false);
+		local._dialog2.start();
 		break;
 
 	case 13:
 		handlePrisonerSpeech(0x148, 7, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x120, false);
-		_dialog2.start();
+		local._dialog2.write(0x120, false);
+		local._dialog2.start();
 		break;
 
 	case 14:
 		handlePrisonerSpeech(0x14F, 3, INDEFINITE_TIMEOUT);
-		_dialog2.write(0x121, false);
-		_dialog2.start();
+		local._dialog2.write(0x121, false);
+		local._dialog2.start();
 		break;
 
 	case 15:
@@ -224,7 +188,7 @@ void Scene307::setDialogNode(int node) {
 	case 16:
 		_globals[kKnowsBuddyBeast] = true;
 		handlePrisonerSpeech(0x10C, 1, INDEFINITE_TIMEOUT);
-		_dialog2.start();
+		local._dialog2.start();
 		break;
 
 	default:
@@ -232,7 +196,26 @@ void Scene307::setDialogNode(int node) {
 	}
 }
 
-void Scene307::handlePrisonerDialog() {
+static void handlePrisonerEncounter() {
+	switch (_action._activeAction._verbId) {
+	case 275:
+		setDialogNode(5);
+		break;
+
+	case 277:
+		setDialogNode(4);
+		break;
+
+	case 276:
+		setDialogNode(6);
+		break;
+
+	default:
+		break;
+	}
+}
+
+static void handlePrisonerDialog() {
 	switch (_action._activeAction._verbId) {
 	case 0x11A:
 		setDialogNode(7);
@@ -275,7 +258,7 @@ void Scene307::handlePrisonerDialog() {
 	}
 }
 
-void Scene307::handleDialog() {
+static void handleDialog() {
 	if (_game._trigger == 0) {
 		_scene->_kernelMessages.reset();
 		_game._player._stepEnabled = false;
@@ -291,20 +274,20 @@ void Scene307::handleDialog() {
 	}
 }
 
-void Scene307::enter() {
+static void room_307_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 0));
 
-	initForceField(&_forceField, true);
+	init_forcefield(&local._forcefield, true);
 
 	_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
 
-	_animationMode = 0;
-	_fieldCollisionCounter = 0;
+	local._animationMode = 0;
+	local._fieldCollisionCounter = 0;
 
 	_scene->changeVariant(1);
 
@@ -316,42 +299,42 @@ void Scene307::enter() {
 		0x142, 0x143, 0x144, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, 0x14C, 0x14D, 0x14E, 0x14F,
 		0x150, 0x151, 0x152, 0x153, 0);
 
-	_dialog1.setup(0x3F, 0x113, 0x114, 0x115, -1);
-	_dialog2.setup(0x40, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0);
+	local._dialog1.setup(0x3F, 0x113, 0x114, 0x115, -1);
+	local._dialog2.setup(0x40, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0);
 
 	if (!_game._visitedScenes._sceneRevisited)
-		_dialog2.set(0x11A, 0x122, 0);
+		local._dialog2.set(0x11A, 0x122, 0);
 	else if (_scene->_priorSceneId == 318)
-		_dialog2.write(0x11E, true);
+		local._dialog2.write(0x11E, true);
 
 
 	if (_scene->_priorSceneId == RETURNING_FROM_DIALOG) {
-		if (_grateOpenedFl)
+		if (local._grateOpenedFl)
 			_vm->_sound->command(10);
 		else
 			_vm->_sound->command(3);
 	} else {
-		_afterPeeingFl = false;
-		_duringPeeingFl = false;
-		_guardTime = 0;
-		_grateOpenedFl = false;
-		_activePrisonerFl = false;
-		_prisonerTimer = 0;
-		_prisonerMessageId = 0x104;
+		local._afterPeeingFl = false;
+		local._duringPeeingFl = false;
+		local._guardTime = 0;
+		local._grateOpenedFl = false;
+		local._activePrisonerFl = false;
+		local._prisonerTimer = 0;
+		local._prisonerMessageId = 0x104;
 
 		if (_scene->_priorSceneId == 308) {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
 			_game._player._playerPos = Common::Point(156, 113);
 			_game._player._facing = FACING_NORTH;
-			_animationMode = 1;
+			local._animationMode = 1;
 			_vm->_sound->command(11);
 			_scene->loadAnimation(formAnimName('a', -1), 60);
 		} else if (_scene->_priorSceneId == 387) {
 			_game._player._playerPos = Common::Point(129, 108);
 			_game._player._facing = FACING_NORTH;
 			_vm->_sound->command(3);
-			_grateOpenedFl = true;
+			local._grateOpenedFl = true;
 		} else {
 			_game._player._playerPos = Common::Point(159, 109);
 			_game._player._facing = FACING_SOUTH;
@@ -359,7 +342,7 @@ void Scene307::enter() {
 		}
 	}
 
-	if (_grateOpenedFl) {
+	if (local._grateOpenedFl) {
 		_scene->_hotspots.activate(17, false);
 
 		int idx = _scene->_dynamicHotspots.add(17, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
@@ -375,30 +358,30 @@ void Scene307::enter() {
 	_vm->_palette->setEntry(252, 63, 30, 20);
 	_vm->_palette->setEntry(253, 45, 15, 12);
 
-	sceneEntrySound();
+	section_3_music();
 
 	if ((_scene->_priorSceneId == 318) || (_scene->_priorSceneId == 387))
 		_scene->_kernelMessages.addQuote(0xF3, 0, 120);
 }
 
-void Scene307::step() {
-	handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+static void room_307_daemon() {
+	handle_forcefield(&local._forcefield, &_globals._spriteIndexes[0]);
 
-	if ((_animationMode == 1) && (_scene->_animation[0] != nullptr)) {
+	if ((local._animationMode == 1) && (_scene->_animation[0] != nullptr)) {
 		if (_scene->_animation[0]->getCurrentFrame() == 126) {
-			_forceField._flag = false;
+			local._forcefield._flag = false;
 			_vm->_sound->command(5);
 		}
 
 		if (_scene->_animation[0]->getCurrentFrame() == 194) {
-			_forceField._flag = true;
+			local._forcefield._flag = true;
 			_vm->_sound->command(24);
 		}
 	}
 
-	if ((_animationMode == 2) && (_scene->_animation[0] != nullptr)) {
+	if ((local._animationMode == 2) && (_scene->_animation[0] != nullptr)) {
 		if (_scene->_animation[0]->getCurrentFrame() == 54)
-			_forceField._flag = false;
+			local._forcefield._flag = false;
 
 		if (_scene->_animation[0]->getCurrentFrame() == 150) {
 			_game._player._visible = false;
@@ -410,46 +393,46 @@ void Scene307::step() {
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
 		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
-		_animationMode = 0;
+		local._animationMode = 0;
 		_vm->_sound->command(9);
 	}
 
-	if ((_lastFrameTime != _scene->_frameStartTime) && !_duringPeeingFl) {
-		int32 elapsedTime = _lastFrameTime - _scene->_frameStartTime;
+	if ((local._lastFrameTime != _scene->_frameStartTime) && !local._duringPeeingFl) {
+		int32 elapsedTime = local._lastFrameTime - _scene->_frameStartTime;
 		if ((elapsedTime > 0) && (elapsedTime <= 4)) {
-			_guardTime += elapsedTime;
-			_prisonerTimer += elapsedTime;
+			local._guardTime += elapsedTime;
+			local._prisonerTimer += elapsedTime;
 		} else {
-			_guardTime++;
-			_prisonerTimer++;
+			local._guardTime++;
+			local._prisonerTimer++;
 		}
-		_lastFrameTime = _scene->_frameStartTime;
+		local._lastFrameTime = _scene->_frameStartTime;
 
-		if ((_guardTime > 3000) && !_duringPeeingFl && (_scene->_animation[0] == nullptr)
-			&& (_game._screenObjects._inputMode != kInputConversation) && _globals[kMetBuddyBeast] && !_activePrisonerFl) {
-			if (!_game._objects.isInInventory(OBJ_SCALPEL) && !_grateOpenedFl) {
+		if ((local._guardTime > 3000) && !local._duringPeeingFl && (_scene->_animation[0] == nullptr)
+			&& (_game._screenObjects._inputMode != kInputConversation) && _globals[kMetBuddyBeast] && !local._activePrisonerFl) {
+			if (!_game._objects.isInInventory(OBJ_SCALPEL) && !local._grateOpenedFl) {
 				_game._player._stepEnabled = false;
 				_game._player.walk(Common::Point(151, 119), FACING_SOUTHEAST);
-				_animationMode = 2;
+				local._animationMode = 2;
 				_vm->_sound->command(11);
 				_scene->loadAnimation(formAnimName('b', -1), 70);
 			}
-			_guardTime = 0;
-		} else if ((_prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_animation[0] == nullptr) && !_activePrisonerFl) {
+			local._guardTime = 0;
+		} else if ((local._prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_animation[0] == nullptr) && !local._activePrisonerFl) {
 			if (!_globals[kMetBuddyBeast]) {
-				if (_prisonerMessageId == -1)
-					_prisonerMessageId = 0x104;
+				if (local._prisonerMessageId == -1)
+					local._prisonerMessageId = 0x104;
 
-				int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(_prisonerMessageId));
+				int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(local._prisonerMessageId));
 				_scene->_kernelMessages.setQuoted(idx, 4, true);
-				_prisonerMessageId++;
-				if (_prisonerMessageId > 0x10A)
-					_prisonerMessageId = 0x104;
-			} else if (_globals[kKnowsBuddyBeast] && (_dialog2.read(0) > 1) && (_vm->getRandomNumber(1, 3) == 1)) {
+				local._prisonerMessageId++;
+				if (local._prisonerMessageId > 0x10A)
+					local._prisonerMessageId = 0x104;
+			} else if (_globals[kKnowsBuddyBeast] && (local._dialog2.read(0) > 1) && (_vm->getRandomNumber(1, 3) == 1)) {
 				int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(267));
 				_scene->_kernelMessages.setQuoted(idx, 4, true);
 			}
-			_prisonerTimer = 0;
+			local._prisonerTimer = 0;
 		}
 	}
 
@@ -457,15 +440,15 @@ void Scene307::step() {
 		_scene->_nextSceneId = 318;
 
 	if (_game._trigger == 81) {
-		_prisonerTimer = 0;
-		if (_activePrisonerFl && (_guardTime > 2600))
-			_guardTime = 3000 - _vm->getRandomNumber(1, 800);
+		local._prisonerTimer = 0;
+		if (local._activePrisonerFl && (local._guardTime > 2600))
+			local._guardTime = 3000 - _vm->getRandomNumber(1, 800);
 
-		_activePrisonerFl = false;
+		local._activePrisonerFl = false;
 	}
 }
 
-void Scene307::actions() {
+static void room_307_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(30715);
 	else if (_game._screenObjects._inputMode == kInputConversation)
@@ -555,7 +538,7 @@ void Scene307::actions() {
 			_game._player._visible = true;
 			_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
 			_scene->_sequences.remove(_globals._sequenceIndexes[5]);
-			_grateOpenedFl = true;
+			local._grateOpenedFl = true;
 			_scene->_hotspots.activate(17, false);
 			int idx = _scene->_dynamicHotspots.add(17, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
 			int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
@@ -574,7 +557,7 @@ void Scene307::actions() {
 			break;
 		}
 	} else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
-		if (_grateOpenedFl) {
+		if (local._grateOpenedFl) {
 			switch (_game._trigger) {
 			case 0:
 				_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXCL_8");
@@ -660,12 +643,12 @@ void Scene307::actions() {
 	} else if (_action.isAction(VERB_USE, NOUN_TOILET) && (_game._storyMode != STORYMODE_NAUGHTY))
 		_vm->_dialogs->show(30723);
 	else if (_action.isAction(VERB_USE, NOUN_TOILET)) {
-		if (!_afterPeeingFl) {
+		if (!local._afterPeeingFl) {
 			switch (_game._trigger) {
 			case 0:
 				_vm->_sound->command(25);
 				_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
-				_duringPeeingFl = true;
+				local._duringPeeingFl = true;
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
@@ -698,8 +681,8 @@ void Scene307::actions() {
 
 			case 4:
 				_game._player._stepEnabled = true;
-				_duringPeeingFl = false;
-				_afterPeeingFl = true;
+				local._duringPeeingFl = false;
+				local._afterPeeingFl = true;
 				break;
 
 			default:
@@ -711,7 +694,7 @@ void Scene307::actions() {
 			_scene->_kernelMessages.setQuoted(idx, 4, true);
 		}
 	} else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT)) {
-		if (!_grateOpenedFl)
+		if (!local._grateOpenedFl)
 			_vm->_dialogs->show(30710);
 		else
 			_vm->_dialogs->show(30711);
@@ -728,20 +711,20 @@ void Scene307::actions() {
 	else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
 		_vm->_dialogs->show(30718);
 	else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR)) {
-		switch (_fieldCollisionCounter) {
+		switch (local._fieldCollisionCounter) {
 		case 0:
 			_vm->_dialogs->show(30719);
-			_fieldCollisionCounter = 1;
+			local._fieldCollisionCounter = 1;
 			break;
 
 		case 1:
 			_vm->_dialogs->show(30720);
-			_fieldCollisionCounter = 2;
+			local._fieldCollisionCounter = 2;
 			break;
 
 		case 2:
 			_vm->_dialogs->show(30721);
-			_fieldCollisionCounter = 3;
+			local._fieldCollisionCounter = 3;
 			break;
 
 		case 3:
@@ -757,6 +740,42 @@ void Scene307::actions() {
 	_action._inProgress = false;
 }
 
+void room_307_synchronize(Common::Serializer &s) {
+	local._forcefield.synchronize(s);
+
+	s.syncAsByte(local._afterPeeingFl);
+	s.syncAsByte(local._duringPeeingFl);
+	s.syncAsByte(local._grateOpenedFl);
+	s.syncAsByte(local._activePrisonerFl);
+
+	s.syncAsSint32LE(local._animationMode);
+	s.syncAsSint32LE(local._prisonerMessageId);
+	s.syncAsSint32LE(local._fieldCollisionCounter);
+
+	s.syncAsUint32LE(local._lastFrameTime);
+	s.syncAsUint32LE(local._guardTime);
+	s.syncAsUint32LE(local._prisonerTimer);
+
+	Common::String subQuote2 = local._subQuote2;
+	s.syncString(subQuote2);
+	if (s.isLoading())
+		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+}
+
+void room_307_preload() {
+	local._forcefield.init();
+
+	room_init_code_pointer = room_307_init;
+	room_parser_code_pointer = room_307_parser;
+	room_daemon_code_pointer = room_307_daemon;
+
+	section_3_walker();
+	section_3_interface();
+	_scene->addActiveVocab(NOUN_AIR_VENT);
+	_scene->addActiveVocab(VERB_CLIMB_INTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room308.cpp b/engines/mads/madsv2/nebular/rooms/room308.cpp
index 1fab978b306..e644fe21920 100644
--- a/engines/mads/madsv2/nebular/rooms/room308.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room308.cpp
@@ -19,36 +19,33 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/forcefield.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene308::Scene308(RexNebularEngine *vm) : Scene3xx(vm) {
-	_forceField.init();
-}
-
-void Scene308::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
-
-	_forceField.synchronize(s);
-}
+struct Scratch {
+	Forcefield _forcefield;
+};
 
+static Scratch local;
 
-void Scene308::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Scene308::enter() {
+static void room_308_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
 
-	initForceField(&_forceField, true);
+	init_forcefield(&local._forcefield, true);
 
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 0));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
@@ -67,12 +64,12 @@ void Scene308::enter() {
 	_game._player._stepEnabled = false;
 	_scene->loadAnimation(formAnimName('a', -1), 60);
 
-	sceneEntrySound();
+	section_3_music();
 	_game.loadQuoteSet(0xF4, 0xF5, 0xF6, 0);
 }
 
-void Scene308::step() {
-	handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+static void room_308_daemon() {
+	handle_forcefield(&local._forcefield, &_globals._spriteIndexes[0]);
 
 	if (_game._trigger == 60)
 		_scene->_nextSceneId = 307;
@@ -165,6 +162,21 @@ void Scene308::step() {
 	}
 }
 
+void room_308_synchronize(Common::Serializer &s) {
+	local._forcefield.synchronize(s);
+}
+
+void room_308_preload() {
+	local._forcefield.init();
+
+	room_init_code_pointer = room_308_init;
+	room_daemon_code_pointer = room_308_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room309.cpp b/engines/mads/madsv2/nebular/rooms/room309.cpp
index 3a09b8e6191..768678c32d2 100644
--- a/engines/mads/madsv2/nebular/rooms/room309.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room309.cpp
@@ -19,47 +19,36 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/forcefield.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene309::Scene309(RexNebularEngine *vm) : Scene3xx(vm) {
-	for (int i = 0; i < 3; i++) {
-		_characterSpriteIndexes[i] = -1;
-		_messagesIndexes[i] = -1;
-	}
-
-	_lastFrame = -1;
-	_forceField.init();
-}
+struct Scratch {
+	int16 _characterSpriteIndexes[3];
+	int16 _messagesIndexes[3];
+	int32 _lastFrame;
+	Forcefield _forcefield;
+};
 
-void Scene309::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+static Scratch local;
 
-	_forceField.synchronize(s);
-
-	for (int i = 0; i < 3; ++i)
-		s.syncAsSint32LE(_characterSpriteIndexes[i]);
-	for (int i = 0; i < 3; ++i)
-		s.syncAsSint32LE(_messagesIndexes[i]);
-	s.syncAsSint32LE(_lastFrame);
-}
-
-void Scene309::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Scene309::enter() {
+static void room_309_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
 
-	initForceField(&_forceField, true);
+	init_forcefield(&local._forcefield, true);
 
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
@@ -84,47 +73,50 @@ void Scene309::enter() {
 	_game._player._stepEnabled = false;
 	_scene->loadAnimation(formAnimName('a', -1), 60);
 
-	_characterSpriteIndexes[0] = _scene->_animation[0]->_spriteListIndexes[2];
-	_characterSpriteIndexes[1] = _scene->_animation[0]->_spriteListIndexes[2];
-	_characterSpriteIndexes[2] = _scene->_animation[0]->_spriteListIndexes[1];
+	local._characterSpriteIndexes[0] = _scene->_animation[0]->_spriteListIndexes[2];
+	local._characterSpriteIndexes[1] = _scene->_animation[0]->_spriteListIndexes[2];
+	local._characterSpriteIndexes[2] = _scene->_animation[0]->_spriteListIndexes[1];
 
-	_messagesIndexes[0] = -1;
-	_messagesIndexes[1] = -1;
-	_messagesIndexes[2] = -1;
+	local._messagesIndexes[0] = -1;
+	local._messagesIndexes[1] = -1;
+	local._messagesIndexes[2] = -1;
 
-	sceneEntrySound();
+	section_3_music();
 
 	_game.loadQuoteSet(0xF7, 0xF8, 0xF9, 0x15C, 0x15D, 0x15E, 0);
 }
 
-void Scene309::step() {
-	handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+static void room_309_daemon() {
+	handle_forcefield(&local._forcefield, &_globals._spriteIndexes[0]);
 
 	if (_game._trigger == 61) {
-		_messagesIndexes[0] = -1;
-		_messagesIndexes[1] = -1;
+		local._messagesIndexes[0] = -1;
+		local._messagesIndexes[1] = -1;
 	}
 
 	if (_game._trigger == 62)
-		_messagesIndexes[2] = -1;
+		local._messagesIndexes[2] = -1;
 
 	if (_scene->_animation[0] != nullptr) {
-		if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_lastFrame = _scene->_animation[0]->getCurrentFrame();
-			if (_lastFrame == 39) {
-				_messagesIndexes[0] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 61, 210, _game.getQuote(348));
-				_messagesIndexes[1] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 0, 210, _game.getQuote(349));
+		if (local._lastFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._lastFrame = _scene->_animation[0]->getCurrentFrame();
+			if (local._lastFrame == 39) {
+				local._messagesIndexes[0] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 61, 210, _game.getQuote(348));
+				local._messagesIndexes[1] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 0, 210, _game.getQuote(349));
 			}
 
-			if (_lastFrame == 97)
-				_messagesIndexes[2] = _scene->_kernelMessages.add(Common::Point(0, 0), 0xFBFA, 32, 62, 180, _game.getQuote(350));
+			if (local._lastFrame == 97)
+				local._messagesIndexes[2] = _scene->_kernelMessages.add(Common::Point(0, 0), 0xFBFA, 32, 62, 180, _game.getQuote(350));
 
+#if 1
+			error("TODO: animation frame updates");
+#else
 			for (int charIdx = 0; charIdx < 3; charIdx++) {
-				if (_messagesIndexes[charIdx] >= 0) {
+				if (local._messagesIndexes[charIdx] >= 0) {
 					bool match = false;
 					int j = -1;
 					for (j = _scene->_animation[0]->_oldFrameEntry; j < _scene->_animation[0]->_header._frameEntriesCount; j++) {
-						if (_scene->_animation[0]->_frameEntries[j]._spriteSlot._spritesIndex == _characterSpriteIndexes[charIdx]) {
+						if (_scene->_animation[0]->_frameEntries[j]._spriteSlot._spritesIndex == local._characterSpriteIndexes[charIdx]) {
 							match = true;
 							break;
 						}
@@ -132,11 +124,12 @@ void Scene309::step() {
 
 					if (match) {
 						SpriteSlotSubset *curSpriteSlot = &_scene->_animation[0]->_frameEntries[j]._spriteSlot;
-						_scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.x = curSpriteSlot->_position.x;
-						_scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.y = curSpriteSlot->_position.y - (50 + (14 * ((charIdx == 0) ? 2 : 1)));
+						_scene->_kernelMessages._entries[local._messagesIndexes[charIdx]]._position.x = curSpriteSlot->_position.x;
+						_scene->_kernelMessages._entries[local._messagesIndexes[charIdx]]._position.y = curSpriteSlot->_position.y - (50 + (14 * ((charIdx == 0) ? 2 : 1)));
 					}
 				}
 			}
+#endif
 		}
 	}
 
@@ -243,6 +236,27 @@ void Scene309::step() {
 		_scene->_nextSceneId = 308;
 }
 
+void room_309_synchronize(Common::Serializer &s) {
+	local._forcefield.synchronize(s);
+
+	for (int i = 0; i < 3; ++i)
+		s.syncAsSint32LE(local._characterSpriteIndexes[i]);
+	for (int i = 0; i < 3; ++i)
+		s.syncAsSint32LE(local._messagesIndexes[i]);
+	s.syncAsSint32LE(local._lastFrame);
+}
+
+void room_309_preload() {
+	local._lastFrame = -1;
+	local._forcefield.init();
+
+	room_init_code_pointer = room_309_init;
+	room_daemon_code_pointer = room_309_daemon;
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room310.cpp b/engines/mads/madsv2/nebular/rooms/room310.cpp
index c5579582012..fc8aca3cf2c 100644
--- a/engines/mads/madsv2/nebular/rooms/room310.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room310.cpp
@@ -19,35 +19,33 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/forcefield.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene310::Scene310(RexNebularEngine *vm) : Scene3xx(vm) {
-	_forceField.init();
-}
+struct Scratch {
+	Forcefield _forcefield;
+};
 
-void Scene310::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+static Scratch local;
 
-	_forceField.synchronize(s);
-}
 
-void Scene310::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene310::enter() {
+static void room_310_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
 
-	initForceField(&_forceField, true);
+	init_forcefield(&local._forcefield, true);
 
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 	_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
@@ -58,16 +56,30 @@ void Scene310::enter() {
 	_game._player._stepEnabled = false;
 	_scene->loadAnimation(formAnimName('a', -1), 70);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene310::step() {
-	handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+static void room_310_daemon() {
+	handle_forcefield(&local._forcefield, &_globals._spriteIndexes[0]);
 
 	if (_game._trigger == 70)
 		_scene->_nextSceneId = 309;
 }
 
+void room_310_synchronize(Common::Serializer &s) {
+	local._forcefield.synchronize(s);
+}
+
+void room_310_preload() {
+	local._forcefield.init();
+
+	room_init_code_pointer = room_310_init;
+	room_daemon_code_pointer = room_310_daemon;
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room311.cpp b/engines/mads/madsv2/nebular/rooms/room311.cpp
index e097b890f1f..05675e6e2b0 100644
--- a/engines/mads/madsv2/nebular/rooms/room311.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room311.cpp
@@ -19,36 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene311::Scene311(RexNebularEngine *vm) : Scene3xx(vm) {
-	_checkGuardFl = false;
-}
-
-void Scene311::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+struct Scratch {
+	bool _checkGuardFl;
+};
 
-	s.syncAsByte(_checkGuardFl);
-}
+static Scratch local;
 
-void Scene311::setup() {
-	if (_scene->_currentSceneId == 391)
-		_globals[kSexOfRex] = REX_MALE;
-
-	setPlayerSpritesPrefix();
-	setAAName();
-
-	if (_scene->_currentSceneId == 304)
-		_game._player._spritesPrefix = "";
-}
 
-void Scene311::enter() {
+static void room_311_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXCL_8");
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCL_2");
@@ -57,7 +48,7 @@ void Scene311::enter() {
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
 
-	_checkGuardFl = false;
+	local._checkGuardFl = false;
 	_game.loadQuoteSet(0xFA, 0);
 
 	if (_scene->_priorSceneId == 391) {
@@ -78,10 +69,10 @@ void Scene311::enter() {
 		_scene->loadAnimation(formAnimName('a', -1), 70);
 	}
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene311::step() {
+static void room_311_daemon() {
 	if (_game._trigger == 70)
 		_scene->_nextSceneId = 310;
 
@@ -192,17 +183,17 @@ void Scene311::step() {
 		if (x > 207)
 			x = 207;
 
-		_checkGuardFl = true;
+		local._checkGuardFl = true;
 		_game._player.startWalking(Common::Point(x, 122), FACING_SOUTH);
 		_scene->_rails.resetNext();
 	}
 }
 
-void Scene311::actions() {
+static void room_311_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(31119);
-	else if (_checkGuardFl) {
-		_checkGuardFl = false;
+	else if (local._checkGuardFl) {
+		local._checkGuardFl = false;
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.addQuote(250, 0, 240);
 	} else if (_action.isAction(VERB_SIT_AT, NOUN_DESK))
@@ -329,6 +320,26 @@ void Scene311::actions() {
 	_action._inProgress = false;
 }
 
+void room_311_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._checkGuardFl);
+}
+
+void room_311_preload() {
+	room_init_code_pointer = room_311_init;
+	room_parser_code_pointer = room_311_parser;
+	room_daemon_code_pointer = room_311_daemon;
+
+	if (room_id == 391)
+		global[kSexOfRex] = REX_MALE;
+
+	section_3_walker();
+	section_3_interface();
+
+	if (room_id == 304)
+		*player.series_name = '\0';
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room313.cpp b/engines/mads/madsv2/nebular/rooms/room313.cpp
index 35444e29bf4..b6f9d65dda8 100644
--- a/engines/mads/madsv2/nebular/rooms/room313.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room313.cpp
@@ -19,21 +19,22 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/cycle.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene313::setup() {
-	setPlayerSpritesPrefix();
-	_game._player._spritesPrefix = "RM313A";
-	setAAName();
-}
-
-void Scene313::enter() {
+static void room_313_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 
 	if ((_scene->_priorSceneId == 366) || (_scene->_priorSceneId == 316)) {
@@ -57,18 +58,18 @@ void Scene313::enter() {
 	}
 
 	if (_globals[kAfterHavoc]) {
-		for (uint16 i = 0; i < _scene->_paletteCycles.size(); i++) {
-			int palIdx = _scene->_paletteCycles[i]._firstColorIndex;
-			int size = _scene->_paletteCycles[i]._colorCount * 3;
-			memset(&_vm->_palette->_cyclingPalette[palIdx], 0, size);
-			memset(&_vm->_palette->_mainPalette[palIdx], 0, size);
+		for (uint16 i = 0; i < cycle_list.num_cycles; i++) {
+			int palIdx = cycle_list.table[i].first_list_color;
+			int size = cycle_list.table[i].num_colors * 3;
+			memset(&cycling_palette[palIdx], 0, size);
+			memset(&master_palette[palIdx], 0, size);
 		}
 	}
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene313::actions() {
+static void room_313_parser() {
 	if (_action.isAction(VERB_CRAWL_TO, NOUN_FOURTH_CELL))
 		_scene->_nextSceneId = 387;
 	else if (_action.isAction(VERB_CRAWL_TO, NOUN_THIRD_CELL))
@@ -98,6 +99,19 @@ void Scene313::actions() {
 	_action._inProgress = false;
 }
 
+void room_313_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_313_preload() {
+	room_init_code_pointer = room_313_init;
+	room_pre_parser_code_pointer = room_313_parser;
+	section_3_walker();
+	Common::strcpy_s(player.series_name, "RM313A");
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room316.cpp b/engines/mads/madsv2/nebular/rooms/room316.cpp
index a2906b1f1f4..935b79a2c36 100644
--- a/engines/mads/madsv2/nebular/rooms/room316.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room316.cpp
@@ -19,23 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene316::setup() {
-	if (_scene->_currentSceneId == 366)
-		_globals[kSexOfRex] = REX_MALE;
-
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene316::handleRexInGrate() {
+static void handleRexInGrate() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -157,7 +154,7 @@ void Scene316::handleRexInGrate() {
 	}
 }
 
-void Scene316::handleRoxInGrate() {
+static void handleRoxInGrate() {
 	int temp;
 	int temp1;
 
@@ -272,7 +269,7 @@ void Scene316::handleRoxInGrate() {
 	}
 }
 
-void Scene316::enter() {
+static void room_316_init() {
 	if (_globals[kSexOfRex] == REX_MALE) {
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1));
 		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCL_8");
@@ -305,11 +302,11 @@ void Scene316::enter() {
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(291, 126);
 
-	sceneEntrySound();
+	section_3_music();
 	_game.loadQuoteSet(0xFD, 0);
 }
 
-void Scene316::step() {
+static void room_316_daemon() {
 	if (_game._trigger == 60) {
 		_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[1]);
 		_game._player._visible = true;
@@ -386,7 +383,7 @@ void Scene316::step() {
 	}
 }
 
-void Scene316::preActions() {
+static void room_316_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST)) {
 		if (_globals[kAfterHavoc])
 			_game._player._walkOffScreenSceneId = 354;
@@ -395,7 +392,7 @@ void Scene316::preActions() {
 	}
 }
 
-void Scene316::actions() {
+static void room_316_parser() {
 	if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
 		if (_globals[kSexOfRex] == REX_FEMALE)
 			handleRoxInGrate();
@@ -491,6 +488,24 @@ void Scene316::actions() {
 	_action._inProgress = false;
 }
 
+void room_316_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_316_preload() {
+	room_init_code_pointer = room_316_init;
+	room_pre_parser_code_pointer = room_316_pre_parser;
+	room_parser_code_pointer = room_316_parser;
+	room_daemon_code_pointer = room_316_daemon;
+
+	if (room_id == 366)
+		global[kSexOfRex] = REX_MALE;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index 6defb143a02..e30fe247a61 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -19,60 +19,92 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
+
+struct Scratch {
+	int32 _dropTimer;
+	int32 _lastFrame;
+	int32 _animMode;
+	int32 _internCounter;
+	int32 _counter;
+	bool _dialogFl;
+	bool _internTalkingFl;
+	bool _internWalkingFl;
+	bool _internVisibleFl;
+	bool _explosionFl;
+	int32 _lastFrameCounter = 0;
+	char _subQuote2[256];
+	Conversation _dialog1;
+};
+
+static Scratch local;
+
+
+static void handleRexDialogs(int quote) {
+	_scene->_kernelMessages.reset();
 
-Scene318::Scene318(RexNebularEngine *vm) : Scene3xx(vm) {
-	_dropTimer = 0;
-
-	_lastFrame = -1;
-	_animMode = -1;
-	_internCounter = -1;
-	_counter = -1;
-
-	_dialogFl = false;
-	_internTalkingFl = false;
-	_internWalkingFl = false;
-	_internVisibleFl = false;
-	_explosionFl = false;
+	Common::String curQuote = _game.getQuote(quote);
+	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
+		Common::String subQuote1, subQuote2;
+		_game.splitQuote(curQuote, subQuote1, subQuote2);
 
-	_lastFrameCounter = 0;
 
-	_subQuote2 = "";
+		_scene->_kernelMessages.add(Common::Point(138, 59), 0x1110, 32, 0, 240, subQuote1);
+		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 180, local._subQuote2);
+	} else
+		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 120, curQuote);
 }
 
-void Scene318::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+static void handleInternDialog(int quoteId, int quoteNum, uint32 timeout) {
+	int height = quoteNum * 14;
+	int posY;
+	if (height < 85)
+		posY = 87 - height;
+	else
+		posY = 2;
 
-	s.syncAsUint32LE(_dropTimer);
+	int curQuoteId = quoteId;
 
-	s.syncAsSint32LE(_lastFrame);
-	s.syncAsSint32LE(_animMode);
-	s.syncAsSint32LE(_internCounter);
-	s.syncAsSint32LE(_counter);
+	int maxWidth = 0;
+	for (int i = 0; i < quoteNum; i++) {
+		maxWidth = MAX(maxWidth, _vm->_font->getWidth(_game.getQuote(curQuoteId), -1));
+		curQuoteId++;
+	}
 
-	s.syncAsByte(_dialogFl);
-	s.syncAsByte(_internTalkingFl);
-	s.syncAsByte(_internWalkingFl);
-	s.syncAsByte(_internVisibleFl);
-	s.syncAsByte(_explosionFl);
+	int posX = MIN(319 - maxWidth, 178 - (maxWidth >> 1));
+	curQuoteId = quoteId;
 
-	s.syncAsUint32LE(_lastFrameCounter);
+	_scene->_kernelMessages.reset();
+	local._internTalkingFl = true;
 
-	s.syncString(_subQuote2);
-}
+	// WORKAROUND: In case the player launches multiple talk selections with the
+	// intern before previous ones have finished, take care of removing any
+	int seqIndex;
+	while ((seqIndex = _scene->_sequences.findByTrigger(63)) != -1)
+		_scene->_sequences.remove(seqIndex);
 
-void Scene318::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
+	for (int i = 0; i < quoteNum; i++) {
+		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+		_scene->_sequences.addTimer(180, 63);
+		_scene->_kernelMessages.add(Common::Point(posX, posY), 0xFDFC, 0, 0, timeout, _game.getQuote(curQuoteId));
+		posY += 14;
+		curQuoteId++;
+	}
 }
 
-void Scene318::handleDialog() {
+static void handleDialog() {
 	if (!_game._trigger) {
 		_game._player._stepEnabled = false;
 		handleRexDialogs(_action._activeAction._verbId);
@@ -87,41 +119,41 @@ void Scene318::handleDialog() {
 		_game._player._stepEnabled = true;
 	} else {
 		if (_action._activeAction._verbId < 0x19C)
-			_dialog1.write(_action._activeAction._verbId, false);
+			local._dialog1.write(_action._activeAction._verbId, false);
 
 		switch (_action._activeAction._verbId) {
 		case 0x191:
 			handleInternDialog(0x19E, 2, INDEFINITE_TIMEOUT);
-			_dialog1.write(0x192, true);
+			local._dialog1.write(0x192, true);
 			break;
 
 		case 0x192:
 			handleInternDialog(0x1A0, 5, INDEFINITE_TIMEOUT);
-			_dialog1.write(0x193, true);
+			local._dialog1.write(0x193, true);
 			break;
 
 		case 0x193:
 			handleInternDialog(0x1A5, 4, INDEFINITE_TIMEOUT);
-			_dialog1.write(0x194, true);
+			local._dialog1.write(0x194, true);
 			break;
 
 		case 0x194:
 			handleInternDialog(0x1A9, 6, INDEFINITE_TIMEOUT);
-			_dialog1.write(0x195, true);
-			_dialog1.write(0x196, true);
-			_dialog1.write(0x19D, false);
+			local._dialog1.write(0x195, true);
+			local._dialog1.write(0x196, true);
+			local._dialog1.write(0x19D, false);
 			break;
 
 		case 0x195:
 			handleInternDialog(0x1AF, 7, INDEFINITE_TIMEOUT);
-			if (!_dialog1.read(0x196))
-				_dialog1.write(0x197, true);
+			if (!local._dialog1.read(0x196))
+				local._dialog1.write(0x197, true);
 			break;
 
 		case 0x196:
 			handleInternDialog(0x1B6, 5, INDEFINITE_TIMEOUT);
-			if (!_dialog1.read(0x195))
-				_dialog1.write(0x197, true);
+			if (!local._dialog1.read(0x195))
+				local._dialog1.write(0x197, true);
 			break;
 
 		case 0x197:
@@ -130,7 +162,7 @@ void Scene318::handleDialog() {
 
 		case 0x198:
 			handleInternDialog(0x1C0, 5, INDEFINITE_TIMEOUT);
-			_dialog1.write(0x19A, true);
+			local._dialog1.write(0x19A, true);
 			break;
 
 		case 0x199:
@@ -139,7 +171,7 @@ void Scene318::handleDialog() {
 
 		case 0x19A:
 			handleInternDialog(0x1C8, 5, INDEFINITE_TIMEOUT);
-			_dialog1.write(0x19B, true);
+			local._dialog1.write(0x19B, true);
 			break;
 
 		case 0x19B:
@@ -155,11 +187,11 @@ void Scene318::handleDialog() {
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 
-			_dialogFl = false;
+			local._dialogFl = false;
 			handleInternDialog(0x1D0, 1, 120);
-			if (_dialog1.read(0) || (_action._activeAction._verbId == 0x19D)) {
-				_explosionFl = true;
-				_internCounter = 3420;
+			if (local._dialog1.read(0) || (_action._activeAction._verbId == 0x19D)) {
+				local._explosionFl = true;
+				local._internCounter = 3420;
 			}
 			break;
 
@@ -168,64 +200,14 @@ void Scene318::handleDialog() {
 		}
 
 		if (_action._activeAction._verbId < 0x19C) {
-			_dialog1.start();
+			local._dialog1.start();
 			_game._player._stepEnabled = true;
 		}
 
 	}
 }
 
-void Scene318::handleRexDialogs(int quote) {
-	_scene->_kernelMessages.reset();
-
-	Common::String curQuote = _game.getQuote(quote);
-	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-		Common::String subQuote1;
-		_game.splitQuote(curQuote, subQuote1, _subQuote2);
-		_scene->_kernelMessages.add(Common::Point(138, 59), 0x1110, 32, 0, 240, subQuote1);
-		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 180, _subQuote2);
-	} else
-		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 120, curQuote);
-}
-
-void Scene318::handleInternDialog(int quoteId, int quoteNum, uint32 timeout) {
-	int height = quoteNum * 14;
-	int posY;
-	if (height < 85)
-		posY = 87 - height;
-	else
-		posY = 2;
-
-	int curQuoteId = quoteId;
-
-	int maxWidth = 0;
-	for (int i = 0; i < quoteNum; i++) {
-		maxWidth = MAX(maxWidth, _vm->_font->getWidth(_game.getQuote(curQuoteId), -1));
-		curQuoteId++;
-	}
-
-	int posX = MIN(319 - maxWidth, 178 - (maxWidth >> 1));
-	curQuoteId = quoteId;
-
-	_scene->_kernelMessages.reset();
-	_internTalkingFl = true;
-
-	// WORKAROUND: In case the player launches multiple talk selections with the
-	// intern before previous ones have finished, take care of removing any
-	int seqIndex;
-	while ((seqIndex = _scene->_sequences.findByTrigger(63)) != -1)
-		_scene->_sequences.remove(seqIndex);
-
-	for (int i = 0; i < quoteNum; i++) {
-		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
-		_scene->_sequences.addTimer(180, 63);
-		_scene->_kernelMessages.add(Common::Point(posX, posY), 0xFDFC, 0, 0, timeout, _game.getQuote(curQuoteId));
-		posY += 14;
-		curQuoteId++;
-	}
-}
-
-void Scene318::enter() {
+static void room_318_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('k', -1));
 
@@ -249,31 +231,31 @@ void Scene318::enter() {
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(214, 152);
 
-	_dialog1.setup(0x47, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19D, 0);
+	local._dialog1.setup(0x47, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19D, 0);
 
 	if (!_game._visitedScenes._sceneRevisited) {
-		_dialog1.set(0x191, 0x198, 0x199, 0x19C, 0);
+		local._dialog1.set(0x191, 0x198, 0x199, 0x19C, 0);
 		if (_game._widepipeCtr >= 2)
-			_dialog1.write(0x19D, true);
+			local._dialog1.write(0x19D, true);
 	}
 
 	if (_scene->_priorSceneId == 307) {
 		_game._player._visible = false;
 		_game._player._stepEnabled = false;
 		_scene->loadAnimation(formAnimName('a', -1), 60);
-		_animMode = 1;
+		local._animMode = 1;
 	}
 
-	_lastFrame = 0;
+	local._lastFrame = 0;
 	_scene->_hotspots.activate(NOUN_INTERN, false);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_dialogFl = false;
-		_internWalkingFl = false;
-		_counter = 0;
-		_internCounter = 0;
-		_internVisibleFl = true;
-		_explosionFl = false;
+		local._dialogFl = false;
+		local._internWalkingFl = false;
+		local._counter = 0;
+		local._internCounter = 0;
+		local._internVisibleFl = true;
+		local._explosionFl = false;
 	}
 
 	_game.loadQuoteSet(0x18C, 0x18D, 0x18E, 0x18F, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196,
@@ -289,18 +271,18 @@ void Scene318::enter() {
 		if (!_globals[kAfterHavoc]) {
 			_game._player._visible = false;
 			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('g', -1));
-			_animMode = 2;
+			local._animMode = 2;
 
-			if (_game._visitedScenes.exists(319) || !_internVisibleFl) {
-				_internVisibleFl = false;
-				_dialogFl = false;
+			if (_game._visitedScenes.exists(319) || !local._internVisibleFl) {
+				local._internVisibleFl = false;
+				local._dialogFl = false;
 			} else {
 				_scene->loadAnimation(formAnimName('b', -1), 61);
 				_scene->_hotspots.activate(NOUN_INTERN, true);
 			}
 
-			if (_dialogFl) {
-				_dialog1.start();
+			if (local._dialogFl) {
+				local._dialog1.start();
 				_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 8);
 			} else
 				_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
@@ -313,7 +295,7 @@ void Scene318::enter() {
 	if (_scene->_priorSceneId == 319) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
-		_animMode = 4;
+		local._animMode = 4;
 		if (!_globals[kHasSeenProfPyro]) {
 			_scene->loadAnimation(formAnimName('d', -1), 64);
 			_globals[kHasSeenProfPyro] = true;
@@ -322,24 +304,24 @@ void Scene318::enter() {
 		}
 	}
 
-	_internTalkingFl = false;
+	local._internTalkingFl = false;
 	_vm->_palette->setEntry(252, 63, 63, 10);
 	_vm->_palette->setEntry(253, 45, 45, 05);
 
-	_dropTimer = _vm->_game->_scene._frameStartTime;
-	sceneEntrySound();
+	local._dropTimer = _vm->_game->_scene._frameStartTime;
+	section_3_music();
 
-	if (_dialogFl)
+	if (local._dialogFl)
 		_vm->_sound->command(15);
 }
 
-void Scene318::step() {
-	if ((_scene->_animation[0] != nullptr) && (_animMode == 2)) {
-		if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_lastFrame = _scene->_animation[0]->getCurrentFrame();
+static void room_318_daemon() {
+	if ((_scene->_animation[0] != nullptr) && (local._animMode == 2)) {
+		if (local._lastFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._lastFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
-			switch (_lastFrame) {
+			switch (local._lastFrame) {
 			case 20:
 			case 30:
 			case 40:
@@ -354,25 +336,25 @@ void Scene318::step() {
 			case 130:
 			case 140:
 			case 149:
-				if (_internWalkingFl) {
+				if (local._internWalkingFl) {
 					nextFrame = 149;
-				} else if (_internTalkingFl) {
+				} else if (local._internTalkingFl) {
 					nextFrame = 149;
-				} else if (_lastFrame == 149) {
+				} else if (local._lastFrame == 149) {
 					nextFrame = 4;
 				}
 				break;
 
 			case 151:
-				if (_internWalkingFl)
+				if (local._internWalkingFl)
 					nextFrame = 183;
 				break;
 
 			case 167:
 			case 184:
-				if (_internWalkingFl) {
+				if (local._internWalkingFl) {
 					nextFrame = 184;
-				} else if (!_internTalkingFl) {
+				} else if (!local._internTalkingFl) {
 					nextFrame = 0;
 				} else if (_vm->getRandomNumber(1, 100) <= 50) {
 					nextFrame = 151;
@@ -383,7 +365,7 @@ void Scene318::step() {
 				if (nextFrame == 184) {
 					handleInternDialog(0x1D1, 3, 240);
 					_scene->_hotspots.activate(NOUN_INTERN, false);
-					_internVisibleFl = false;
+					local._internVisibleFl = false;
 				}
 				break;
 
@@ -393,7 +375,7 @@ void Scene318::step() {
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_lastFrame = nextFrame;
+				local._lastFrame = nextFrame;
 			}
 		}
 	}
@@ -401,12 +383,12 @@ void Scene318::step() {
 	switch (_game._trigger) {
 	case 60:
 		_vm->_sound->command(3);
-		_animMode = 2;
+		local._animMode = 2;
 		_scene->_reloadSceneFlag = true;
 		break;
 
 	case 61:
-		_counter = 0;
+		local._counter = 0;
 		break;
 
 	case 62:
@@ -414,7 +396,7 @@ void Scene318::step() {
 		break;
 
 	case 63:
-		_internTalkingFl = false;
+		local._internTalkingFl = false;
 		break;
 
 	case 64:
@@ -427,46 +409,46 @@ void Scene318::step() {
 	}
 
 	uint32 tmpFrame = _vm->_events->getFrameCounter();
-	long diffFrame = tmpFrame - _lastFrameCounter;
-	_lastFrameCounter = tmpFrame;
+	long diffFrame = tmpFrame - local._lastFrameCounter;
+	local._lastFrameCounter = tmpFrame;
 
-	if ((_animMode == 2) && !_internVisibleFl && _game._player._stepEnabled) {
+	if ((local._animMode == 2) && !local._internVisibleFl && _game._player._stepEnabled) {
 		if ((diffFrame >= 0) && (diffFrame <= 4))
-			_counter += diffFrame;
+			local._counter += diffFrame;
 		else
-			_counter++;
+			local._counter++;
 
 		int extraCounter = _game._objects.isInInventory(OBJ_SCALPEL) ? 900 : 0;
 
-		if (_counter + extraCounter >= 1800) {
+		if (local._counter + extraCounter >= 1800) {
 			_scene->freeAnimation();
 			_game._player._stepEnabled = false;
 			_scene->loadAnimation(formAnimName('c', -1), 62);
-			_animMode = 3;
+			local._animMode = 3;
 		}
-	} else if ((_animMode == 2) && _explosionFl && _internVisibleFl && !_dialogFl
-		&& !_internWalkingFl && (_game._screenObjects._inputMode != kInputConversation)) {
+	} else if ((local._animMode == 2) && local._explosionFl && local._internVisibleFl && !local._dialogFl
+		&& !local._internWalkingFl && (_game._screenObjects._inputMode != kInputConversation)) {
 		if ((diffFrame >= 0) && (diffFrame <= 4))
-			_internCounter += diffFrame;
+			local._internCounter += diffFrame;
 		else
-			_internCounter++;
+			local._internCounter++;
 
-		if (_internCounter >= 3600) {
+		if (local._internCounter >= 3600) {
 			_vm->_sound->command(59);
 			_vm->_screen->_shakeCountdown = 20;
-			_internWalkingFl = true;
+			local._internWalkingFl = true;
 		}
 	}
 
-	if ((_vm->_game->_scene._frameStartTime - _dropTimer) > 600) {
+	if ((_vm->_game->_scene._frameStartTime - local._dropTimer) > 600) {
 		_vm->_sound->command(51);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 1, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
-		_dropTimer = _vm->_game->_scene._frameStartTime;
+		local._dropTimer = _vm->_game->_scene._frameStartTime;
 	}
 }
 
-void Scene318::preActions() {
+static void room_318_pre_parser() {
 	if (_game._player._needToWalk)
 		_game._player._needToWalk = _game._player._visible;
 
@@ -474,7 +456,7 @@ void Scene318::preActions() {
 		_game._player._walkOffScreenSceneId = 357;
 }
 
-void Scene318::actions() {
+static void room_318_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation) {
 		handleDialog();
 		_action._inProgress = false;
@@ -485,7 +467,7 @@ void Scene318::actions() {
 		switch (_game._trigger) {
 		case 0:
 		{
-			_dialogFl = true;
+			local._dialogFl = true;
 			_vm->_sound->command(15);
 			_game._player._stepEnabled = false;
 			handleRexDialogs(_vm->getRandomNumber(0x18C, 0x18E));
@@ -502,7 +484,7 @@ void Scene318::actions() {
 		case 1:
 			_game._player._stepEnabled = true;
 			handleInternDialog(0x18F, 1, INDEFINITE_TIMEOUT);
-			_dialog1.start();
+			local._dialog1.start();
 			break;
 
 		case 2:
@@ -536,7 +518,7 @@ void Scene318::actions() {
 			break;
 
 		case 1:
-			if (_internVisibleFl)
+			if (local._internVisibleFl)
 				handleInternDialog(0x190, 1, 120);
 			else {
 				_game._objects.addToInventory(OBJ_SCALPEL);
@@ -661,7 +643,7 @@ void Scene318::actions() {
 	else if (_action._lookFlag) {
 		if (_game._player._visible || _game._objects.isInInventory(OBJ_SCALPEL))
 			_vm->_dialogs->show(31828);
-		else if (_internVisibleFl)
+		else if (local._internVisibleFl)
 			_vm->_dialogs->show(31826);
 		else
 			_vm->_dialogs->show(31827);
@@ -671,6 +653,37 @@ void Scene318::actions() {
 	_action._inProgress = false;
 }
 
+void room_318_synchronize(Common::Serializer &s) {
+	s.syncAsUint32LE(local._dropTimer);
+	s.syncAsSint32LE(local._lastFrame);
+	s.syncAsSint32LE(local._animMode);
+	s.syncAsSint32LE(local._internCounter);
+	s.syncAsSint32LE(local._counter);
+
+	s.syncAsByte(local._dialogFl);
+	s.syncAsByte(local._internTalkingFl);
+	s.syncAsByte(local._internWalkingFl);
+	s.syncAsByte(local._internVisibleFl);
+	s.syncAsByte(local._explosionFl);
+	s.syncAsUint32LE(local._lastFrameCounter);
+
+	Common::String subQuote2 = local._subQuote2;
+	s.syncString(subQuote2);
+	if (s.isLoading())
+		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+}
+
+void room_318_preload() {
+	room_init_code_pointer = room_318_init;
+	room_pre_parser_code_pointer = room_318_pre_parser;
+	room_parser_code_pointer = room_318_parser;
+	room_daemon_code_pointer = room_318_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room319.cpp b/engines/mads/madsv2/nebular/rooms/room319.cpp
index 0da621beb78..eb481c63541 100644
--- a/engines/mads/madsv2/nebular/rooms/room319.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room319.cpp
@@ -19,69 +19,60 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/mcga.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene319::Scene319(RexNebularEngine *vm) : Scene3xx(vm) {
-	_animMode = -1;
-	_animFrame = -1;
-	_nextAction1 = -1;
-	_nextAction2 = -1;
-	_slacheMode = -1;
-	_slacheTopic = -1;
-	_slachePosY = -1;
-
-	_slacheTalkingFl = false;
-	_slacheReady = false;
-	_slacheInitFl = false;
-
-	_subQuote2 = "";
-}
-
-void Scene319::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
-
-	s.syncAsUint32LE(_animMode);
-	s.syncAsUint32LE(_animFrame);
-	s.syncAsUint32LE(_nextAction1);
-	s.syncAsUint32LE(_nextAction2);
-	s.syncAsUint32LE(_slacheMode);
-	s.syncAsUint32LE(_slacheTopic);
-	s.syncAsUint32LE(_slachePosY);
-
-	s.syncAsByte(_slacheTalkingFl);
-	s.syncAsByte(_slacheReady);
-	s.syncAsByte(_slacheInitFl);
-
-	s.syncString(_subQuote2);
-}
-
-void Scene319::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene319::handleRexDialogues(int quote) {
+namespace Rooms {
+
+struct Scratch {
+	int32 _animMode;
+	int32 _animFrame;
+	int32 _nextAction1;
+	int32 _nextAction2;
+	int32 _slacheMode;
+	int32 _slacheTopic;
+	int32 _slachePosY;
+	bool _slacheTalkingFl;
+	bool _slacheReady;
+	bool _slacheInitFl;
+	char _subQuote2[256];
+	Conversation _dialog1;
+	Conversation _dialog2;
+	Conversation _dialog3;
+};
+
+static Scratch local;
+
+
+static void handleRexDialogues(int quote) {
 	_scene->_kernelMessages.reset();
 
 	Common::String curQuote = _game.getQuote(quote);
 	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-		Common::String subQuote1;
-		_game.splitQuote(curQuote, subQuote1, _subQuote2);
+		Common::String subQuote1, subQuote2;
+		_game.splitQuote(curQuote, subQuote1, subQuote2);
+		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+
 		_scene->_kernelMessages.add(Common::Point(160, 106), 0x1110, 32, 0, 120, subQuote1);
-		_scene->_kernelMessages.add(Common::Point(160, 120), 0x1110, 32, 1, 120, _subQuote2);
+		_scene->_kernelMessages.add(Common::Point(160, 120), 0x1110, 32, 1, 120, local._subQuote2);
 	} else
 		_scene->_kernelMessages.add(Common::Point(160, 120), 0x1110, 32, 1, 120, curQuote);
 }
 
-void Scene319::handleSlacheDialogs(int quoteId, int counter, uint32 timer) {
+static void handleSlacheDialogs(int quoteId, int counter, uint32 timer) {
 	int curQuote = quoteId;
-	int posY = 5 + (_slachePosY * 14);
+	int posY = 5 + (local._slachePosY * 14);
 
 	for (int count = 0; count < counter; count++, curQuote++) {
 		_scene->_kernelMessages.add(Common::Point(8, posY), 0xFDFC, 0, 0, timer, _game.getQuote(curQuote));
@@ -89,7 +80,7 @@ void Scene319::handleSlacheDialogs(int quoteId, int counter, uint32 timer) {
 	}
 }
 
-void Scene319::enter() {
+static void room_319_init() {
 	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('e', 0));
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
@@ -111,14 +102,14 @@ void Scene319::enter() {
 	_globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 
-	_dialog1.setup(0x43, 0x165, 0x166, 0x167, 0x168, 0x169, 0x16A, 0);
-	_dialog2.setup(0x44, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0);
-	_dialog3.setup(0x45, 0x17D, 0x17E, 0x17F, 0x180, 0x181, 0x182, 0x183, 0);
+	local._dialog1.setup(0x43, 0x165, 0x166, 0x167, 0x168, 0x169, 0x16A, 0);
+	local._dialog2.setup(0x44, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0);
+	local._dialog3.setup(0x45, 0x17D, 0x17E, 0x17F, 0x180, 0x181, 0x182, 0x183, 0);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_dialog1.set(0x165, 0x166, 0x167, 0x168, 0);
-		_dialog2.set(0x171, 0x172, 0x173, 0x174, 0);
-		_dialog3.set(0x17D, 0x17E, 0x17F, 0x180, 0);
+		local._dialog1.set(0x165, 0x166, 0x167, 0x168, 0);
+		local._dialog2.set(0x171, 0x172, 0x173, 0x174, 0);
+		local._dialog3.set(0x17D, 0x17E, 0x17F, 0x180, 0);
 	}
 
 	_game.loadQuoteSet(0x15F, 0x160, 0x161, 0x162, 0x163, 0x164, 0x16B, 0x16C, 0x16D,
@@ -130,106 +121,106 @@ void Scene319::enter() {
 	_vm->_palette->setEntry(252, 63, 30, 2);
 	_vm->_palette->setEntry(253, 45, 15, 1);
 
-	_slachePosY = 0;
-	_slacheInitFl = false;
-	_slacheTalkingFl = false;
-	_slacheReady = false;
-	_animFrame = 0;
+	local._slachePosY = 0;
+	local._slacheInitFl = false;
+	local._slacheTalkingFl = false;
+	local._slacheReady = false;
+	local._animFrame = 0;
 
 	_scene->loadAnimation(formAnimName('b', 0));
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_animMode = 1;
-		_nextAction1 = 2;
-		_nextAction2 = 2;
-		_slacheMode = 1;
-		_slacheTopic = 1;
-		_slacheInitFl = true;
+		local._animMode = 1;
+		local._nextAction1 = 2;
+		local._nextAction2 = 2;
+		local._slacheMode = 1;
+		local._slacheTopic = 1;
+		local._slacheInitFl = true;
 
 		if (_globals[kRexHasMetSlache]) {
 			handleSlacheDialogs(VERB_WALK_OUTSIDE, 2, INDEFINITE_TIMEOUT);
-			_slachePosY = 3;
+			local._slachePosY = 3;
 		} else {
 			handleSlacheDialogs(0x186, 4, INDEFINITE_TIMEOUT);
-			_slachePosY = 5;
+			local._slachePosY = 5;
 		}
 	}
 
-	switch (_slacheTopic) {
+	switch (local._slacheTopic) {
 	case 1:
 		handleSlacheDialogs(0x15F, 2, INDEFINITE_TIMEOUT);
-		_dialog1.start();
+		local._dialog1.start();
 		break;
 
 	case 2:
 		handleSlacheDialogs(0x16B, 2, INDEFINITE_TIMEOUT);
-		_dialog2.start();
+		local._dialog2.start();
 		break;
 
 	case 3:
 		handleSlacheDialogs(0x177, 2, INDEFINITE_TIMEOUT);
-		_dialog3.start();
+		local._dialog3.start();
 		break;
 
 	default:
 		break;
 	}
 
-	_slachePosY = 0;
-	sceneEntrySound();
+	local._slachePosY = 0;
+	section_3_music();
 }
 
-void Scene319::step() {
+static void room_319_daemon() {
 	if (_scene->_animation[0] == nullptr)
 		return;
 
-	if (_animFrame != _scene->_animation[0]->getCurrentFrame()) {
-		_animFrame = _scene->_animation[0]->getCurrentFrame();
+	if (local._animFrame != _scene->_animation[0]->getCurrentFrame()) {
+		local._animFrame = _scene->_animation[0]->getCurrentFrame();
 		int nextFrame = -1;
-		if (_animMode == 1) {
-			switch (_animFrame) {
+		if (local._animMode == 1) {
+			switch (local._animFrame) {
 			case 6:
-				_slacheTalkingFl = true;
+				local._slacheTalkingFl = true;
 				break;
 
 			case 29:
-				_slacheReady = true;
+				local._slacheReady = true;
 				break;
 
 			case 39:
-				if (_slacheInitFl) {
-					_slacheInitFl = false;
-					if (_nextAction1 == 2)
+				if (local._slacheInitFl) {
+					local._slacheInitFl = false;
+					if (local._nextAction1 == 2)
 						nextFrame = 0;
-				} else if (_nextAction1 == 2)
-					_nextAction1 = 1;
+				} else if (local._nextAction1 == 2)
+					local._nextAction1 = 1;
 				break;
 
 			case 50:
 			case 60:
 			case 70:
 			case 85:
-				if (_nextAction1 == 2)
+				if (local._nextAction1 == 2)
 					nextFrame = 0;
-				else if (_nextAction1 == 3) {
+				else if (local._nextAction1 == 3) {
 					nextFrame = 85;
-					_slacheTalkingFl = true;
-				} else if (_animFrame == 85) {
+					local._slacheTalkingFl = true;
+				} else if (local._animFrame == 85) {
 					if (!_game._player._stepEnabled)
-						_slacheTalkingFl = true;
+						local._slacheTalkingFl = true;
 					nextFrame = 40;
 				}
 				break;
 
 			case 115:
-				_slacheReady = true;
+				local._slacheReady = true;
 				break;
 
 			case 129:
-				if (_nextAction1 == 3) {
+				if (local._nextAction1 == 3) {
 					nextFrame = 115;
 					if (!_game._player._stepEnabled)
-						_slacheTalkingFl = true;
+						local._slacheTalkingFl = true;
 				}
 				break;
 
@@ -241,26 +232,26 @@ void Scene319::step() {
 				break;
 			}
 
-			if ((_animFrame > 40) && (_animFrame < 85) && (nextFrame < 0)) {
-				switch (_nextAction1) {
+			if ((local._animFrame > 40) && (local._animFrame < 85) && (nextFrame < 0)) {
+				switch (local._nextAction1) {
 				case 4:
-					_animFrame = 0;
+					local._animFrame = 0;
 					_scene->freeAnimation();
-					_animMode = 2;
+					local._animMode = 2;
 					_scene->loadAnimation(formAnimName('b', 3), 70);
 					break;
 
 				case 5:
-					_animFrame = 0;
+					local._animFrame = 0;
 					_scene->freeAnimation();
-					_animMode = 3;
+					local._animMode = 3;
 					_scene->loadAnimation(formAnimName('b', 4), 71);
 					break;
 
 				case 6:
-					_animFrame = 0;
+					local._animFrame = 0;
 					_scene->freeAnimation();
-					_animMode = 4;
+					local._animMode = 4;
 					_scene->loadAnimation(formAnimName('b', 5), 72);
 					break;
 
@@ -268,7 +259,7 @@ void Scene319::step() {
 					break;
 				}
 
-				if (!_animFrame) {
+				if (!local._animFrame) {
 					_scene->_sequences.remove(_globals._sequenceIndexes[0]);
 					_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 
@@ -281,28 +272,28 @@ void Scene319::step() {
 			}
 		}
 
-		if (_animMode == 2) {
-			if (_animFrame == 13)
+		if (local._animMode == 2) {
+			if (local._animFrame == 13)
 				_vm->_screen->_shakeCountdown = 40;
 
-			if (_animFrame == 16)
+			if (local._animFrame == 16)
 				_vm->_screen->_shakeCountdown = 1;
 		}
 
-		if (_animMode == 3) {
-			if (_animFrame == 11)
+		if (local._animMode == 3) {
+			if (local._animFrame == 11)
 				_vm->_screen->_shakeCountdown = 60;
 
-			if (_animFrame == 18)
+			if (local._animFrame == 18)
 				_vm->_screen->_shakeCountdown = 1;
 		}
 
-		if ((_animMode == 4) && (_animFrame == 16))
+		if ((local._animMode == 4) && (local._animFrame == 16))
 			_vm->_screen->_shakeCountdown = 80;
 
 		if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 			_scene->_animation[0]->setCurrentFrame(nextFrame);
-			_animFrame = nextFrame;
+			local._animFrame = nextFrame;
 		}
 	}
 
@@ -310,18 +301,18 @@ void Scene319::step() {
 	case 70:
 	case 71:
 	{
-		_animMode = 1;
-		_nextAction1 = _nextAction2;
-		_animFrame = 0;
+		local._animMode = 1;
+		local._nextAction1 = local._nextAction2;
+		local._animFrame = 0;
 		_scene->freeAnimation();
 		_scene->loadAnimation(formAnimName('b', 0));
-		if (_nextAction1 == 3)
+		if (local._nextAction1 == 3)
 			_scene->_animation[0]->setCurrentFrame(85);
-		else if (_nextAction1 == 1)
+		else if (local._nextAction1 == 1)
 			_scene->_animation[0]->setCurrentFrame(40);
 
-		_animFrame = _scene->_animation[0]->getCurrentFrame();
-		_slacheTalkingFl = true;
+		local._animFrame = _scene->_animation[0]->getCurrentFrame();
+		local._slacheTalkingFl = true;
 		_vm->_screen->_shakeCountdown = 1;
 
 		for (int i = 0; i <= 1; i++) {
@@ -344,7 +335,7 @@ void Scene319::step() {
 	case 72:
 		_vm->_palette->setColorFlags(0xFF, 0, 0);
 		_vm->_palette->setColorValues(0, 0, 0);
-		_vm->_palette->fadeOut(_vm->_palette->_mainPalette, nullptr, 18, 228,
+		_vm->_palette->fadeOut(master_palette, nullptr, 18, 228,
 			248, 0, 1, 16);
 		_vm->_screen->_shakeCountdown = 1;
 		_scene->_reloadSceneFlag = true;
@@ -374,61 +365,61 @@ void Scene319::step() {
 	}
 }
 
-void Scene319::actions() {
+static void room_319_parser() {
 	if (_game._trigger == 0) {
 		_game._player._stepEnabled = false;
 		handleRexDialogues(_action._activeAction._verbId);
 	} else {
 		if ((_action._activeAction._verbId == 0x165) || (_action._activeAction._verbId == 0x166)) {
 			if (_game._trigger == 1) {
-				_nextAction1 = 3;
-				_slacheTalkingFl = false;
-				_slacheMode = 1;
-				_slacheTopic = 2;
+				local._nextAction1 = 3;
+				local._slacheTalkingFl = false;
+				local._slacheMode = 1;
+				local._slacheTopic = 2;
 			}
 
-			if (!_slacheTalkingFl) {
+			if (!local._slacheTalkingFl) {
 				_scene->_sequences.addTimer(4, 2);
 			} else {
 				handleSlacheDialogs(0x16B, 2, INDEFINITE_TIMEOUT);
-				_dialog2.start();
+				local._dialog2.start();
 				_game._player._stepEnabled = true;
 			}
 		}
 
 		if ((_action._activeAction._verbId == 0x171) || (_action._activeAction._verbId == 0x172)) {
 			if (_game._trigger == 1) {
-				_nextAction1 = 2;
-				_slacheTalkingFl = false;
-				_slacheMode = 1;
-				_slacheTopic = 3;
+				local._nextAction1 = 2;
+				local._slacheTalkingFl = false;
+				local._slacheMode = 1;
+				local._slacheTopic = 3;
 			}
 
-			if (!_slacheTalkingFl) {
+			if (!local._slacheTalkingFl) {
 				_scene->_sequences.addTimer(4, 2);
 			} else {
 				handleSlacheDialogs(0x177, 2, INDEFINITE_TIMEOUT);
-				_dialog3.start();
+				local._dialog3.start();
 				_game._player._stepEnabled = true;
 			}
 		}
 
 		if ((_action._activeAction._verbId == 0x17D) || (_action._activeAction._verbId == 0x17E)) {
 			if (_game._trigger == 1) {
-				_nextAction1 = 3;
-				_slacheTalkingFl = false;
-				_slacheReady = false;
-				_slacheMode = 1;
-				_slacheTopic = 1;
+				local._nextAction1 = 3;
+				local._slacheTalkingFl = false;
+				local._slacheReady = false;
+				local._slacheMode = 1;
+				local._slacheTopic = 1;
 			}
 
-			if (!_slacheTalkingFl) {
+			if (!local._slacheTalkingFl) {
 				_scene->_sequences.addTimer(4, 2);
 			} else {
 				if (_game._trigger == 2)
 					handleSlacheDialogs(0x184, 2, 180);
 
-				if (!_slacheReady) {
+				if (!local._slacheReady) {
 					_scene->_sequences.addTimer(120, 3);
 				} else {
 					_globals[kRexHasMetSlache] = true;
@@ -454,26 +445,26 @@ void Scene319::actions() {
 			if ((addVerbId == 0x182) && (_game._storyMode != STORYMODE_NAUGHTY))
 				addVerbId = 0x183;
 
-			if (_slacheMode == 1) {
+			if (local._slacheMode == 1) {
 				if (_game._trigger == 1) {
-					_nextAction2 = _nextAction1;
-					_nextAction1 = 4;
+					local._nextAction2 = local._nextAction1;
+					local._nextAction1 = 4;
 				}
 
-				if (_nextAction1 != _nextAction2) {
+				if (local._nextAction1 != local._nextAction2) {
 					_scene->_sequences.addTimer(4, 2);
 				} else {
 					Conversation *curDialog;
 					int nextDocQuote;
 					if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x167)) {
-						curDialog = &_dialog1;
+						curDialog = &local._dialog1;
 						nextDocQuote = 0x161;
 					} else if ((_action._activeAction._verbId == 0x174) || (_action._activeAction._verbId == 0x1753)) {
 						nextDocQuote = 0x16D;
-						curDialog = &_dialog2;
+						curDialog = &local._dialog2;
 					} else {
 						nextDocQuote = 0x179;
-						curDialog = &_dialog3;
+						curDialog = &local._dialog3;
 					}
 
 					handleSlacheDialogs(nextDocQuote, 2, INDEFINITE_TIMEOUT);
@@ -484,28 +475,28 @@ void Scene319::actions() {
 
 					curDialog->start();
 					_game._player._stepEnabled = true;
-					_slacheMode = 2;
+					local._slacheMode = 2;
 				}
-			} else if (_slacheMode == 2) {
+			} else if (local._slacheMode == 2) {
 				if (_game._trigger == 1) {
-					_nextAction2 = _nextAction1;
-					_nextAction1 = 5;
+					local._nextAction2 = local._nextAction1;
+					local._nextAction1 = 5;
 				}
 
-				if (_nextAction1 != _nextAction2) {
+				if (local._nextAction1 != local._nextAction2) {
 					_scene->_sequences.addTimer(4, 2);
 				} else {
 					Conversation *curDialog;
 					int nextDocQuote;
 					if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x169) || (_action._activeAction._verbId == 0x167)) {
-						curDialog = &_dialog1;
+						curDialog = &local._dialog1;
 						nextDocQuote = 0x163;
 					} else if ((_action._activeAction._verbId == 0x174) || (_action._activeAction._verbId == 0x175) || (_action._activeAction._verbId == 0x173)) {
 						nextDocQuote = 0x16F;
-						curDialog = &_dialog2;
+						curDialog = &local._dialog2;
 					} else {
 						nextDocQuote = 0x17B;
-						curDialog = &_dialog3;
+						curDialog = &local._dialog3;
 					}
 
 					handleSlacheDialogs(nextDocQuote, 2, INDEFINITE_TIMEOUT);
@@ -516,11 +507,11 @@ void Scene319::actions() {
 
 					curDialog->start();
 					_game._player._stepEnabled = true;
-					_slacheMode = 3;
+					local._slacheMode = 3;
 				}
 			} else {
-				_nextAction2 = _nextAction1;
-				_nextAction1 = 6;
+				local._nextAction2 = local._nextAction1;
+				local._nextAction1 = 6;
 			}
 		}
 	}
@@ -528,6 +519,36 @@ void Scene319::actions() {
 	_action._inProgress = false;
 }
 
+void room_319_synchronize(Common::Serializer &s) {
+	s.syncAsUint32LE(local._animMode);
+	s.syncAsUint32LE(local._animFrame);
+	s.syncAsUint32LE(local._nextAction1);
+	s.syncAsUint32LE(local._nextAction2);
+	s.syncAsUint32LE(local._slacheMode);
+	s.syncAsUint32LE(local._slacheTopic);
+	s.syncAsUint32LE(local._slachePosY);
+
+	s.syncAsByte(local._slacheTalkingFl);
+	s.syncAsByte(local._slacheReady);
+	s.syncAsByte(local._slacheInitFl);
+
+	Common::String subQuote2 = local._subQuote2;
+	s.syncString(subQuote2);
+	if (s.isLoading())
+		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+}
+
+
+void room_319_preload() {
+	room_init_code_pointer = room_319_init;
+	room_parser_code_pointer = room_319_parser;
+	room_daemon_code_pointer = room_319_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room320.cpp b/engines/mads/madsv2/nebular/rooms/room320.cpp
index c4e9d4fd741..2400759ca71 100644
--- a/engines/mads/madsv2/nebular/rooms/room320.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room320.cpp
@@ -19,45 +19,34 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene320::Scene320(RexNebularEngine *vm) : Scene300s(vm) {
-	_blinkFl = false;
-	_flippedFl = false;
+struct Scratch {
+	bool _blinkFl;
+	bool _flippedFl;
+	int32 _buttonId;
+	int32 _lastFrame;
+	int32 _leftItemId;
+	int32 _posX;
+	int32 _rightItemId;
+};
 
-	_buttonId = -1;
-	_lastFrame = -1;
-	_leftItemId = -1;
-	_posX = -1;
-	_rightItemId = -1;
-}
-
-void Scene320::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
-
-	s.syncAsByte(_blinkFl);
-	s.syncAsByte(_flippedFl);
+static Scratch local;
 
-	s.syncAsSint32LE(_buttonId);
-	s.syncAsSint32LE(_lastFrame);
-	s.syncAsSint32LE(_leftItemId);
-	s.syncAsSint32LE(_posX);
-	s.syncAsSint32LE(_rightItemId);
-}
-
-void Scene320::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Scene320::setRightView(int view) {
-	if (_rightItemId < 8) _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+static void setRightView(int view) {
+	if (local._rightItemId < 8) _scene->_sequences.remove(_globals._sequenceIndexes[10]);
 
 	int spriteNum;
 	switch (view) {
@@ -87,102 +76,102 @@ void Scene320::setRightView(int view) {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 0);
 	}
 
-	_globals[kRightView320] = _rightItemId = view;
+	_globals[kRightView320] = local._rightItemId = view;
 }
 
-void Scene320::setLeftView(int view) {
-	if (_leftItemId < 10)
+static void setLeftView(int view) {
+	if (local._leftItemId < 10)
 		_scene->_sequences.remove(_globals._sequenceIndexes[0]);
 
 	if (view != 10) {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[view], false, 6, 0, 0, 18);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 0);
-		if (!_blinkFl)
+		if (!local._blinkFl)
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 2, 2);
 	}
 
-	_leftItemId = view;
+	local._leftItemId = view;
 }
 
-void Scene320::handleButtons() {
+static void handleButtons() {
 	switch (_action._activeAction._objectNameId) {
 	case 0x2DD:
-		_buttonId = 5;
+		local._buttonId = 5;
 		break;
 
 	case 0x2DE:
-		_buttonId = 4;
+		local._buttonId = 4;
 		break;
 
 	case 0x2E0:
-		_buttonId = 6;
+		local._buttonId = 6;
 		break;
 
 	case 0x2E1:
-		_buttonId = 7;
+		local._buttonId = 7;
 		break;
 
 	case 0x2E2:
-		_buttonId = 8;
+		local._buttonId = 8;
 		break;
 
 	case 0x2E3:
-		_buttonId = 9;
+		local._buttonId = 9;
 		break;
 
 	case 0x2E4:
-		_buttonId = 10;
+		local._buttonId = 10;
 		break;
 
 	case 0x2E5:
-		_buttonId = 11;
+		local._buttonId = 11;
 		break;
 
 	case 0x2E6:
-		_buttonId = 12;
+		local._buttonId = 12;
 		break;
 
 	case 0x2E7:
-		_buttonId = 13;
+		local._buttonId = 13;
 		break;
 
 	case 0x2E8:
-		_buttonId = 0;
+		local._buttonId = 0;
 		break;
 
 	case 0x2E9:
-		_buttonId = 1;
+		local._buttonId = 1;
 		break;
 
 	case 0x2EA:
-		_buttonId = 2;
+		local._buttonId = 2;
 		break;
 
 	case 0x2EB:
-		_buttonId = 3;
+		local._buttonId = 3;
 		break;
 
 	default:
 		break;
 	}
 
-	if (_buttonId <= 3) {
-		_posX = (8 * _buttonId) - 2;
-		_flippedFl = true;
-	} else if (_buttonId <= 5) {
-		_posX = (13 * _buttonId) - 14;
-		_flippedFl = true;
+	if (local._buttonId <= 3) {
+		local._posX = (8 * local._buttonId) - 2;
+		local._flippedFl = true;
+	} else if (local._buttonId <= 5) {
+		local._posX = (13 * local._buttonId) - 14;
+		local._flippedFl = true;
 	} else {
-		_posX = (8 * _buttonId) + 98;
-		_flippedFl = false;
+		local._posX = (8 * local._buttonId) + 98;
+		local._flippedFl = false;
 	}
 }
 
-void Scene320::enter() {
-	_blinkFl = true;
-	_rightItemId = 8;
-	_leftItemId = 10;
-	_lastFrame = 0;
+static void room_320_init() {
+	local._blinkFl = true;
+	local._rightItemId = 8;
+	local._leftItemId = 10;
+	local._lastFrame = 0;
 
 	for (int i = 0; i < 10; i++)
 		_globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('M', i));
@@ -199,22 +188,22 @@ void Scene320::enter() {
 	_vm->_palette->setEntry(252, 63, 30, 20);
 	_vm->_palette->setEntry(253, 45, 15, 10);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene320::step() {
+static void room_320_daemon() {
 	if (_scene->_animation[0] != nullptr) {
-		if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_lastFrame = _scene->_animation[0]->getCurrentFrame();
-			switch (_lastFrame) {
+		if (local._lastFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._lastFrame = _scene->_animation[0]->getCurrentFrame();
+			switch (local._lastFrame) {
 			case 95:
-				_blinkFl = true;
+				local._blinkFl = true;
 				setLeftView(9);
 				_vm->_sound->command(41);
 				break;
 
 			case 139:
-				_blinkFl = false;
+				local._blinkFl = false;
 				setLeftView(9);
 				break;
 
@@ -229,7 +218,7 @@ void Scene320::step() {
 				break;
 
 			case 430:
-				_blinkFl = true;
+				local._blinkFl = true;
 				setLeftView(4);
 				break;
 
@@ -246,7 +235,7 @@ void Scene320::step() {
 	}
 }
 
-void Scene320::actions() {
+static void room_320_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(32011);
 	else if ((_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) &&
@@ -259,43 +248,43 @@ void Scene320::actions() {
 		case 0:
 			_game._player._stepEnabled = false;
 			handleButtons();
-			_globals._sequenceIndexes[18] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[18], _flippedFl, 4, 2, 0, 0);
+			_globals._sequenceIndexes[18] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[18], local._flippedFl, 4, 2, 0, 0);
 			_scene->_sequences.setScale(_globals._sequenceIndexes[18], 60);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[18], Common::Point(_posX, 170));
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[18], Common::Point(local._posX, 170));
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[18], 0);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[18], SEQUENCE_TRIGGER_LOOP, 0, 1);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[18], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
-			if (_buttonId >= 6) {
+			if (local._buttonId >= 6) {
 				_vm->_sound->command(60);
-				setRightView(_buttonId - 6);
+				setRightView(local._buttonId - 6);
 			}
-			if (_buttonId == 4) {
+			if (local._buttonId == 4) {
 				_vm->_sound->command(38);
-				if (_leftItemId == 3)
+				if (local._leftItemId == 3)
 					setLeftView(0);
 				else
 					setLeftView(3);
 			}
-			if (_buttonId == 5) {
+			if (local._buttonId == 5) {
 				_vm->_sound->command(38);
-				if (_leftItemId == 1)
+				if (local._leftItemId == 1)
 					setLeftView(2);
 				else
 					setLeftView(1);
 			}
-			if (_buttonId <= 3) {
+			if (local._buttonId <= 3) {
 				_vm->_sound->command(60);
-				setLeftView(_buttonId + 5);
+				setLeftView(local._buttonId + 5);
 			}
 			break;
 
 		case 2:
 			_game._player._stepEnabled = true;
-			if (_buttonId == 5) {
-				if (_leftItemId == 2) {
+			if (local._buttonId == 5) {
+				if (local._leftItemId == 2) {
 					_game._player._stepEnabled = false;
 					setRightView(8);
 					setLeftView(10);
@@ -304,7 +293,7 @@ void Scene320::actions() {
 					_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 2));
 					_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('m', 4));
 					_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('m', 9));
-					_blinkFl = false;
+					local._blinkFl = false;
 					setLeftView(2);
 					_game.loadQuoteSet(0xFE, 0);
 					_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -357,6 +346,28 @@ void Scene320::actions() {
 	_action._inProgress = false;
 }
 
+void room_320_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._blinkFl);
+	s.syncAsByte(local._flippedFl);
+
+	s.syncAsSint32LE(local._buttonId);
+	s.syncAsSint32LE(local._lastFrame);
+	s.syncAsSint32LE(local._leftItemId);
+	s.syncAsSint32LE(local._posX);
+	s.syncAsSint32LE(local._rightItemId);
+}
+
+void room_320_preload() {
+	room_init_code_pointer = room_320_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_320_parser;
+	room_daemon_code_pointer = room_320_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room321.cpp b/engines/mads/madsv2/nebular/rooms/room321.cpp
index 7d18f03a8b6..9aa2c03edc6 100644
--- a/engines/mads/madsv2/nebular/rooms/room321.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room321.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene321::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene321::enter() {
+static void room_321_init() {
 	_game._player._visible = false;
 	_game._player._stepEnabled = false;
 
@@ -49,10 +49,10 @@ void Scene321::enter() {
 	}
 
 	_scene->loadAnimation(formAnimName('g', suffixNum), 60);
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene321::step() {
+static void room_321_daemon() {
 	if (_scene->_animation[0] != nullptr) {
 		if ((_scene->_animation[0]->getCurrentFrame() >= 260) && (_globals[kSexOfRex] == REX_MALE) && (_game._storyMode >= STORYMODE_NICE))
 			_scene->_nextSceneId = 316;
@@ -62,6 +62,19 @@ void Scene321::step() {
 		_scene->_nextSceneId = 316;
 }
 
+void room_321_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_321_preload() {
+	room_init_code_pointer = room_321_init;
+	room_daemon_code_pointer = room_321_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room322.cpp b/engines/mads/madsv2/nebular/rooms/room322.cpp
index 01d03d32d5b..a30345c4d80 100644
--- a/engines/mads/madsv2/nebular/rooms/room322.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room322.cpp
@@ -19,47 +19,47 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene322::setup() {
-	_game._player._spritesPrefix = "";
-	// The original is calling scene3xx_setAAName()
-	_game._aaName = Resources::formatAAName(4);
-}
-
-void Scene322::enter() {
+static void room_322_init() {
 	if (_globals[kSexOfRex] == REX_MALE)
-		_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
 	else
-		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
 
-	teleporterEnter();
+	teleporter_init();
 
-	// The original is using scene3xx_sceneEntrySound()
+	// The original is using scene3xx_section_3_music()
 	if (!_vm->_musicFlag)
 		_vm->_sound->command(2);
 	else
 		_vm->_sound->command(10);
 }
 
-void Scene322::step() {
-	teleporterStep();
+static void room_322_daemon() {
+	teleporter_daemon();
 }
 
-void Scene322::actions() {
+static void room_322_parser() {
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(32214);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (teleporterActions()) {
+	if (teleporter_parser()) {
 		_action._inProgress = false;
 		return;
 	}
@@ -86,6 +86,20 @@ void Scene322::actions() {
 	_action._inProgress = false;
 }
 
+void room_322_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_322_preload() {
+	room_init_code_pointer = room_322_init;
+	room_parser_code_pointer = room_322_parser;
+	room_daemon_code_pointer = room_322_daemon;
+
+	*player.series_name = '\0';
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room351.cpp b/engines/mads/madsv2/nebular/rooms/room351.cpp
index 0fbabe2bca0..37493cb1fd5 100644
--- a/engines/mads/madsv2/nebular/rooms/room351.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room351.cpp
@@ -19,24 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene351::setup() {
-	if (_scene->_currentSceneId == 391)
-		_globals[kSexOfRex] = REX_MALE;
-
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-}
-
-void Scene351::enter() {
+static void room_351_init() {
 	_globals[kAfterHavoc] = -1;
 	_globals[kTeleporterRoom + 1] = 351;
 
@@ -98,10 +94,10 @@ void Scene351::enter() {
 			_scene->loadAnimation(formAnimName(sepChar, suffixNum), trigger);
 	}
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene351::step() {
+static void room_351_daemon() {
 	if (_game._trigger == 60) {
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
@@ -116,7 +112,7 @@ void Scene351::step() {
 	}
 }
 
-void Scene351::actions() {
+static void room_351_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35121);
 	else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER))
@@ -189,6 +185,24 @@ void Scene351::actions() {
 	_action._inProgress = false;
 }
 
+void room_351_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_351_preload() {
+	room_init_code_pointer = room_351_init;
+	room_parser_code_pointer = room_351_parser;
+	room_daemon_code_pointer = room_351_daemon;
+
+	if (_scene->_currentSceneId == 391)
+		_globals[kSexOfRex] = REX_MALE;
+
+	section_3_walker();
+	section_3_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room352.cpp b/engines/mads/madsv2/nebular/rooms/room352.cpp
index a4824c285de..00bce2de5c7 100644
--- a/engines/mads/madsv2/nebular/rooms/room352.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room352.cpp
@@ -19,53 +19,35 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene352::Scene352(RexNebularEngine *vm) : Scene3xx(vm) {
-	_vaultOpenFl = false;
-	_mustPutArmDownFl = false;
-	_leaveRoomFl = false;
-
-	_tapePlayerHotspotIdx = -1;
-	_hotspot1Idx = -1;
-	_hotspot2Idx = -1;
-	_lampHostpotIdx = -1;
-	_commonSequenceIdx = -1;
-	_commonSpriteIndex = -1;
-}
-
-void Scene352::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
-
-	s.syncAsByte(_vaultOpenFl);
-	s.syncAsByte(_mustPutArmDownFl);
-	s.syncAsByte(_leaveRoomFl);
-
-	s.syncAsSint32LE(_tapePlayerHotspotIdx);
-	s.syncAsSint32LE(_hotspot1Idx);
-	s.syncAsSint32LE(_hotspot2Idx);
-	s.syncAsSint32LE(_lampHostpotIdx);
-	s.syncAsSint32LE(_commonSequenceIdx);
-	s.syncAsSint32LE(_commonSpriteIndex);
-}
+struct Scratch {
+	bool _vaultOpenFl;
+	bool _mustPutArmDownFl;
+	bool _leaveRoomFl;
+	int32 _tapePlayerHotspotIdx;
+	int32 _hotspot1Idx;
+	int32 _hotspot2Idx;
+	int32 _lampHostpotIdx;
+	int32 _commonSequenceIdx;
+	int32 _commonSpriteIndex;
+};
 
-void Scene352::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
+static Scratch local;
 
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_YOUR_STUFF);
-	_scene->addActiveVocab(NOUN_OTHER_STUFF);
-	_scene->addActiveVocab(NOUN_LAMP);
-}
 
-void Scene352::putArmDown(bool corridorExit, bool doorwayExit) {
+static void putArmDown(bool corridorExit, bool doorwayExit) {
 	switch (_game._trigger) {
 	case 0:
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0xFF));
@@ -107,20 +89,20 @@ void Scene352::putArmDown(bool corridorExit, bool doorwayExit) {
 		else if (doorwayExit)
 			_scene->_sequences.addTimer(48, 4);
 		else {
-			_mustPutArmDownFl = false;
+			local._mustPutArmDownFl = false;
 			_game._player._stepEnabled = true;
 		}
 		break;
 
 	case 4:
 		_game._player.walk(Common::Point(116, 107), FACING_NORTH);
-		_mustPutArmDownFl = false;
+		local._mustPutArmDownFl = false;
 		_scene->_sequences.addTimer(180, 5);
-		_leaveRoomFl = true;
+		local._leaveRoomFl = true;
 		break;
 
 	case 5:
-		if (_leaveRoomFl)
+		if (local._leaveRoomFl)
 			_scene->_nextSceneId = 351;
 
 		break;
@@ -128,13 +110,13 @@ void Scene352::putArmDown(bool corridorExit, bool doorwayExit) {
 	case 6:
 		_game._player.walk(Common::Point(171, 152), FACING_SOUTH);
 		_game._player._stepEnabled = true;
-		_mustPutArmDownFl = false;
+		local._mustPutArmDownFl = false;
 		_scene->_sequences.addTimer(180, 7);
-		_leaveRoomFl = true;
+		local._leaveRoomFl = true;
 		break;
 
 	case 7:
-		if (_leaveRoomFl)
+		if (local._leaveRoomFl)
 			_scene->_nextSceneId = 353;
 
 		break;
@@ -144,7 +126,7 @@ void Scene352::putArmDown(bool corridorExit, bool doorwayExit) {
 	}
 }
 
-void Scene352::enter() {
+static void room_352_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RM302x0");
 	_globals._spriteIndexes[13] = _scene->_sprites.addSprites("*RM302x2");
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RM302x3");
@@ -166,19 +148,19 @@ void Scene352::enter() {
 		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	}
 
-	_leaveRoomFl = false;
+	local._leaveRoomFl = false;
 
 	if (_game._objects.isInRoom(OBJ_TAPE_PLAYER)) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 0, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 5);
 		int idx = _scene->_dynamicHotspots.add(NOUN_TAPE_PLAYER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
-		_tapePlayerHotspotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(84, 145), FACING_WEST);
+		local._tapePlayerHotspotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(84, 145), FACING_WEST);
 	}
 
-	_vaultOpenFl = false;
+	local._vaultOpenFl = false;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_mustPutArmDownFl = false;
+		local._mustPutArmDownFl = false;
 		if (!_game._visitedScenes._sceneRevisited)
 			_globals[kHaveYourStuff] = false;
 	}
@@ -188,52 +170,52 @@ void Scene352::enter() {
 		int idx = _scene->_dynamicHotspots.add(NOUN_GUARDS_ARM2, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(230, 117), FACING_NORTHWEST);
 	} else
-		_mustPutArmDownFl = true;
+		local._mustPutArmDownFl = true;
 
 	if (_scene->_priorSceneId == 353)
 		_game._player._playerPos = Common::Point(171, 155);
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(116, 107);
 
-	sceneEntrySound();
+	section_3_music();
 
 	_game.loadQuoteSet(0xFF, 0x100, 0x101, 0x102, 0x103, 0);
 }
 
-void Scene352::preActions() {
-	_leaveRoomFl = false;
+static void room_352_pre_parser() {
+	local._leaveRoomFl = false;
 
 	if (_action.isAction(VERB_OPEN, NOUN_VAULT))
 		_game._player.walk(Common::Point(266, 111), FACING_NORTHEAST);
 
-	if (_vaultOpenFl && !_action.isObject(NOUN_VAULT) && !_action.isObject(NOUN_LAMP) && !_action.isObject(NOUN_OTHER_STUFF) && !_action.isObject(NOUN_YOUR_STUFF)) {
+	if (local._vaultOpenFl && !_action.isObject(NOUN_VAULT) && !_action.isObject(NOUN_LAMP) && !_action.isObject(NOUN_OTHER_STUFF) && !_action.isObject(NOUN_YOUR_STUFF)) {
 		if (_globals[kHaveYourStuff]) {
-			_commonSpriteIndex = _globals._spriteIndexes[13];
-			_commonSequenceIdx = _globals._sequenceIndexes[13];
+			local._commonSpriteIndex = _globals._spriteIndexes[13];
+			local._commonSequenceIdx = _globals._sequenceIndexes[13];
 		} else {
-			_commonSpriteIndex = _globals._spriteIndexes[1];
-			_commonSequenceIdx = _globals._sequenceIndexes[1];
+			local._commonSpriteIndex = _globals._spriteIndexes[1];
+			local._commonSequenceIdx = _globals._sequenceIndexes[1];
 		}
 
 		switch (_game._trigger) {
 		case 0:
 			if (_game._player._needToWalk) {
 				_game._player._stepEnabled = false;
-				_scene->_sequences.remove(_commonSequenceIdx);
+				_scene->_sequences.remove(local._commonSequenceIdx);
 				_vm->_sound->command(20);
-				_commonSequenceIdx = _scene->_sequences.addReverseSpriteCycle(_commonSpriteIndex, false, 6, 1, 0, 0);
-				_scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
-				_scene->_sequences.setDepth(_commonSequenceIdx, 15);
+				local._commonSequenceIdx = _scene->_sequences.addReverseSpriteCycle(local._commonSpriteIndex, false, 6, 1, 0, 0);
+				_scene->_sequences.addSubEntry(local._commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				_scene->_sequences.setDepth(local._commonSequenceIdx, 15);
 			}
 			break;
 
 		case 1:
 			if (!_globals[kHaveYourStuff])
-				_scene->_dynamicHotspots.remove(_hotspot2Idx);
+				_scene->_dynamicHotspots.remove(local._hotspot2Idx);
 
-			_scene->_dynamicHotspots.remove(_hotspot1Idx);
-			_scene->_dynamicHotspots.remove(_lampHostpotIdx);
-			_vaultOpenFl = false;
+			_scene->_dynamicHotspots.remove(local._hotspot1Idx);
+			_scene->_dynamicHotspots.remove(local._lampHostpotIdx);
+			local._vaultOpenFl = false;
 			_game._player._stepEnabled = true;
 			break;
 
@@ -255,7 +237,7 @@ void Scene352::preActions() {
 	}
 }
 
-void Scene352::actions() {
+static void room_352_parser() {
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(35225);
 		_action._inProgress = false;
@@ -263,19 +245,19 @@ void Scene352::actions() {
 	}
 
 	if (_action.isAction(VERB_OPEN, NOUN_VAULT)) {
-		if (!_vaultOpenFl) {
+		if (!local._vaultOpenFl) {
 			switch (_game._trigger) {
 			case 0:
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				if (_globals[kSexOfRex] == REX_FEMALE)
-					_commonSpriteIndex = _globals._spriteIndexes[9];
+					local._commonSpriteIndex = _globals._spriteIndexes[9];
 				else
-					_commonSpriteIndex = _globals._spriteIndexes[8];
+					local._commonSpriteIndex = _globals._spriteIndexes[8];
 
-				_commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
-				_scene->_sequences.updateTimeout(_commonSequenceIdx, -1);
-				_scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				local._commonSequenceIdx = _scene->_sequences.addSpriteCycle(local._commonSpriteIndex, false, 8, 1, 0, 0);
+				_scene->_sequences.updateTimeout(local._commonSequenceIdx, -1);
+				_scene->_sequences.addSubEntry(local._commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1:
@@ -283,23 +265,23 @@ void Scene352::actions() {
 				_vm->_sound->command(21);
 				_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 7, 2, 20, 0);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], FACING_NORTH);
-				int oldIdx = _commonSequenceIdx;
-				_commonSequenceIdx = _scene->_sequences.startCycle(_commonSpriteIndex, false, -2);
-				_scene->_sequences.updateTimeout(_commonSequenceIdx, oldIdx);
+				int oldIdx = local._commonSequenceIdx;
+				local._commonSequenceIdx = _scene->_sequences.startCycle(local._commonSpriteIndex, false, -2);
+				_scene->_sequences.updateTimeout(local._commonSequenceIdx, oldIdx);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			}
 			break;
 
 			case 2:
 				_vm->_sound->command(22);
-				_scene->_sequences.remove(_commonSequenceIdx);
-				_commonSequenceIdx = _scene->_sequences.startPingPongCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
-				_scene->_sequences.setAnimRange(_commonSequenceIdx, 1, 3);
-				_scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+				_scene->_sequences.remove(local._commonSequenceIdx);
+				local._commonSequenceIdx = _scene->_sequences.startPingPongCycle(local._commonSpriteIndex, false, 8, 1, 0, 0);
+				_scene->_sequences.setAnimRange(local._commonSequenceIdx, 1, 3);
+				_scene->_sequences.addSubEntry(local._commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 3:
-				_scene->_sequences.updateTimeout(-1, _commonSequenceIdx);
+				_scene->_sequences.updateTimeout(-1, local._commonSequenceIdx);
 				_game._player._visible = true;
 				_scene->_sequences.addTimer(60, 4);
 				break;
@@ -318,7 +300,7 @@ void Scene352::actions() {
 	}
 
 	if (_game._objects.isInInventory(OBJ_GUARDS_ARM)) {
-		_mustPutArmDownFl = true;
+		local._mustPutArmDownFl = true;
 	}
 
 	bool exit_corridor = false;
@@ -333,7 +315,7 @@ void Scene352::actions() {
 	}
 
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_FLOOR)) {
-		if (_mustPutArmDownFl)
+		if (local._mustPutArmDownFl)
 			putArmDown(exit_corridor, exit_doorway);
 		else if (exit_corridor)
 			_scene->_nextSceneId = 353;
@@ -384,19 +366,19 @@ void Scene352::actions() {
 	}
 
 	if (_action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_SCANNER)) {
-		if (!_vaultOpenFl) {
+		if (!local._vaultOpenFl) {
 			switch (_game._trigger) {
 			case 0:
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				if (_globals[kSexOfRex] == REX_FEMALE)
-					_commonSpriteIndex = _globals._spriteIndexes[11];
+					local._commonSpriteIndex = _globals._spriteIndexes[11];
 				else
-					_commonSpriteIndex = _globals._spriteIndexes[10];
+					local._commonSpriteIndex = _globals._spriteIndexes[10];
 
-				_commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
-				_scene->_sequences.updateTimeout(_commonSequenceIdx, -1);
-				_scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+				local._commonSequenceIdx = _scene->_sequences.addSpriteCycle(local._commonSpriteIndex, false, 8, 1, 0, 0);
+				_scene->_sequences.updateTimeout(local._commonSequenceIdx, -1);
+				_scene->_sequences.addSubEntry(local._commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1:
@@ -404,61 +386,61 @@ void Scene352::actions() {
 				_vm->_sound->command(21);
 				_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 7, 2, 20, 0);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
-				int oldIdx = _commonSequenceIdx;
-				_commonSequenceIdx = _scene->_sequences.startCycle(_commonSpriteIndex, false, -2);
-				_scene->_sequences.updateTimeout(_commonSequenceIdx, oldIdx);
+				int oldIdx = local._commonSequenceIdx;
+				local._commonSequenceIdx = _scene->_sequences.startCycle(local._commonSpriteIndex, false, -2);
+				_scene->_sequences.updateTimeout(local._commonSequenceIdx, oldIdx);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			}
 			break;
 
 			case 2:
 				_vm->_sound->command(23);
-				_scene->_sequences.remove(_commonSequenceIdx);
-				_commonSequenceIdx = _scene->_sequences.addReverseSpriteCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
-				_scene->_sequences.setAnimRange(_commonSequenceIdx, 1, 4);
-				_scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+				_scene->_sequences.remove(local._commonSequenceIdx);
+				local._commonSequenceIdx = _scene->_sequences.addReverseSpriteCycle(local._commonSpriteIndex, false, 8, 1, 0, 0);
+				_scene->_sequences.setAnimRange(local._commonSequenceIdx, 1, 4);
+				_scene->_sequences.addSubEntry(local._commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 
 			case 3:
-				_scene->_sequences.updateTimeout(-1, _commonSequenceIdx);
+				_scene->_sequences.updateTimeout(-1, local._commonSequenceIdx);
 				_game._player._visible = true;
 				if (_globals[kHaveYourStuff])
-					_commonSpriteIndex = _globals._spriteIndexes[13];
+					local._commonSpriteIndex = _globals._spriteIndexes[13];
 				else
-					_commonSpriteIndex = _globals._spriteIndexes[1];
+					local._commonSpriteIndex = _globals._spriteIndexes[1];
 
 				_vm->_sound->command(20);
-				_commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 6, 1, 0, 0);
-				_scene->_sequences.setDepth(_commonSequenceIdx, 15);
-				_scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+				local._commonSequenceIdx = _scene->_sequences.addSpriteCycle(local._commonSpriteIndex, false, 6, 1, 0, 0);
+				_scene->_sequences.setDepth(local._commonSequenceIdx, 15);
+				_scene->_sequences.addSubEntry(local._commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 				break;
 
 			case 4:
-				_commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 6, 0, 0, 0);
-				_scene->_sequences.setAnimRange(_commonSequenceIdx, -2, -2);
-				_scene->_sequences.setDepth(_commonSequenceIdx, 15);
+				local._commonSequenceIdx = _scene->_sequences.addSpriteCycle(local._commonSpriteIndex, false, 6, 0, 0, 0);
+				_scene->_sequences.setAnimRange(local._commonSequenceIdx, -2, -2);
+				_scene->_sequences.setDepth(local._commonSequenceIdx, 15);
 				_scene->_sequences.addTimer(60, 5);
 				break;
 
 			case 5:
 			{
-				_vaultOpenFl = true;
+				local._vaultOpenFl = true;
 				int idx;
 				if (!_globals[kHaveYourStuff]) {
 					idx = _scene->_dynamicHotspots.add(NOUN_YOUR_STUFF, VERB_WALKTO, -1, Common::Rect(282, 87, 282 + 13, 87 + 7));
-					_hotspot2Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(280, 111), FACING_NORTHEAST);
-					_globals._sequenceIndexes[1] = _commonSequenceIdx;
+					local._hotspot2Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(280, 111), FACING_NORTHEAST);
+					_globals._sequenceIndexes[1] = local._commonSequenceIdx;
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x102));
 				} else {
-					_globals._sequenceIndexes[13] = _commonSequenceIdx;
+					_globals._sequenceIndexes[13] = local._commonSequenceIdx;
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x103));
 				}
 
 				idx = _scene->_dynamicHotspots.add(NOUN_OTHER_STUFF, VERB_WALKTO, -1, Common::Rect(282, 48, 282 + 36, 48 + 27));
-				_hotspot1Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
+				local._hotspot1Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
 				idx = _scene->_dynamicHotspots.add(NOUN_LAMP, VERB_WALKTO, -1, Common::Rect(296, 76, 296 + 11, 76 + 17));
-				_lampHostpotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
+				local._lampHostpotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
 				_game._player._stepEnabled = true;
 			}
 			break;
@@ -488,7 +470,7 @@ void Scene352::actions() {
 			break;
 
 		case 1:
-			_scene->_dynamicHotspots.remove(_hotspot2Idx);
+			_scene->_dynamicHotspots.remove(local._hotspot2Idx);
 			_globals[kHaveYourStuff] = true;
 
 			for (uint16 i = 0; i < _game._objects.size(); i++) {
@@ -534,7 +516,7 @@ void Scene352::actions() {
 
 		case 1:
 			_scene->_sequences.remove(_globals._sequenceIndexes[5]);
-			_scene->_dynamicHotspots.remove(_tapePlayerHotspotIdx);
+			_scene->_dynamicHotspots.remove(local._tapePlayerHotspotIdx);
 			break;
 
 		case 2:
@@ -576,7 +558,7 @@ void Scene352::actions() {
 	else if (_action.isAction(VERB_LOOK, NOUN_GAUGE))
 		_vm->_dialogs->show(35220);
 	else if (_action.isAction(VERB_LOOK, NOUN_VAULT)) {
-		if (!_vaultOpenFl)
+		if (!local._vaultOpenFl)
 			_vm->_dialogs->show(35221);
 	} else if (_action.isAction(VERB_LOOK, NOUN_YOUR_STUFF))
 		_vm->_dialogs->show(35222);
@@ -606,6 +588,33 @@ void Scene352::actions() {
 	_action._inProgress = false;
 }
 
+void room_352_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._vaultOpenFl);
+	s.syncAsByte(local._mustPutArmDownFl);
+	s.syncAsByte(local._leaveRoomFl);
+
+	s.syncAsSint32LE(local._tapePlayerHotspotIdx);
+	s.syncAsSint32LE(local._hotspot1Idx);
+	s.syncAsSint32LE(local._hotspot2Idx);
+	s.syncAsSint32LE(local._lampHostpotIdx);
+	s.syncAsSint32LE(local._commonSequenceIdx);
+	s.syncAsSint32LE(local._commonSpriteIndex);
+}
+
+void room_352_preload() {
+	room_init_code_pointer = room_352_init;
+	room_pre_parser_code_pointer = room_352_pre_parser;
+	room_parser_code_pointer = room_352_parser;
+
+	section_3_walker();
+	section_3_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_YOUR_STUFF);
+	_scene->addActiveVocab(NOUN_OTHER_STUFF);
+	_scene->addActiveVocab(NOUN_LAMP);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room353.cpp b/engines/mads/madsv2/nebular/rooms/room353.cpp
index 2d845c8fea3..a6bf5b49c77 100644
--- a/engines/mads/madsv2/nebular/rooms/room353.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room353.cpp
@@ -19,20 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene353::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
+struct Scratch {
+
+};
+
+static Scratch local;
 
-void Scene353::enter() {
+
+static void room_353_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(303, 'B', 0, EXT_SS, ""));
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 5, 0);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
@@ -42,10 +49,10 @@ void Scene353::enter() {
 	else
 		_game._player._playerPos = Common::Point(139, 155);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene353::actions() {
+static void room_353_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35315);
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
@@ -74,6 +81,19 @@ void Scene353::actions() {
 	_action._inProgress = false;
 }
 
+void room_353_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_353_preload() {
+	room_init_code_pointer = room_353_init;
+	room_parser_code_pointer = room_353_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room354.cpp b/engines/mads/madsv2/nebular/rooms/room354.cpp
index d2488d0d58e..06c85d58c6d 100644
--- a/engines/mads/madsv2/nebular/rooms/room354.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room354.cpp
@@ -19,16 +19,41 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
+struct Scratch {
 
+};
 
+static Scratch local;
+
+
+void room_354_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_354_preload() {
+	room_init_code_pointer = room_354_init;
+	room_pre_parser_code_pointer = room_354_pre_parser;
+	room_parser_code_pointer = room_354_parser;
+	room_daemon_code_pointer = room_354_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room357.cpp b/engines/mads/madsv2/nebular/rooms/room357.cpp
index 24103daa945..8ad756ea6d7 100644
--- a/engines/mads/madsv2/nebular/rooms/room357.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room357.cpp
@@ -19,20 +19,32 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
+
+struct Scratch {
+
+};
+
+static Scratch local;
+
 
 void Scene357::setup() {
 	setPlayerSpritesPrefix();
 	setAAName();
 }
 
-void Scene357::enter() {
+static void room_357_init() {
 	_globals[kAfterHavoc] = true;
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
@@ -46,10 +58,10 @@ void Scene357::enter() {
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(15, 148);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene357::preActions() {
+static void room_357_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
 		_game._player._walkOffScreenSceneId = 318;
 
@@ -57,7 +69,7 @@ void Scene357::preActions() {
 		_game._player._walkOffScreenSceneId = 358;
 }
 
-void Scene357::actions() {
+static void room_357_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35715);
 	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
@@ -92,6 +104,21 @@ void Scene357::actions() {
 	_action._inProgress = false;
 }
 
+void room_357_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_357_preload() {
+	room_init_code_pointer = room_357_init;
+	room_pre_parser_code_pointer = room_357_pre_parser;
+	room_parser_code_pointer = room_357_parser;
+	room_daemon_code_pointer = room_357_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room358.cpp b/engines/mads/madsv2/nebular/rooms/room358.cpp
index 612c53568e2..91aed3445b9 100644
--- a/engines/mads/madsv2/nebular/rooms/room358.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room358.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene358::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene358::enter() {
+static void room_358_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(127, 78));
@@ -43,10 +43,10 @@ void Scene358::enter() {
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(12, 141);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene358::preActions() {
+static void room_358_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
 		_game._player._walkOffScreenSceneId = 357;
 
@@ -54,7 +54,7 @@ void Scene358::preActions() {
 		_game._player._walkOffScreenSceneId = 359;
 }
 
-void Scene358::actions() {
+static void room_358_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35815);
 	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
@@ -77,6 +77,20 @@ void Scene358::actions() {
 	_action._inProgress = false;
 }
 
+void room_358_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_358_preload() {
+	room_init_code_pointer = room_358_init;
+	room_pre_parser_code_pointer = room_358_pre_parser;
+	room_parser_code_pointer = room_358_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room359.cpp b/engines/mads/madsv2/nebular/rooms/room359.cpp
index 9b9abb94115..0d702690544 100644
--- a/engines/mads/madsv2/nebular/rooms/room359.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room359.cpp
@@ -19,31 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene359::Scene359(RexNebularEngine *vm) : Scene3xx(vm) {
-	_cardHotspotId = -1;
-}
-
-void Scene359::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+struct Scratch {
+	int32 _cardHotspotId;
+};
 
-	s.syncAsSint32LE(_cardHotspotId);
-}
+static Scratch local;
 
-void Scene359::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
-void Scene359::enter() {
+static void room_359_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', -1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 
@@ -58,8 +54,8 @@ void Scene359::enter() {
 
 	if (_game._objects.isInRoom(OBJ_SECURITY_CARD)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		_cardHotspotId = _scene->_dynamicHotspots.add(NOUN_SECURITY_CARD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_cardHotspotId, Common::Point(107, 107), FACING_SOUTH);
+		local._cardHotspotId = _scene->_dynamicHotspots.add(NOUN_SECURITY_CARD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._cardHotspotId, Common::Point(107, 107), FACING_SOUTH);
 	}
 
 	if (_scene->_priorSceneId == 358)
@@ -67,10 +63,10 @@ void Scene359::enter() {
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(15, 148);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene359::preActions() {
+static void room_359_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
 		_game._player._walkOffScreenSceneId = 358;
 
@@ -78,7 +74,7 @@ void Scene359::preActions() {
 		_game._player._walkOffScreenSceneId = 360;
 }
 
-void Scene359::actions() {
+static void room_359_parser() {
 	if (_action._lookFlag) {
 		if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 			_vm->_dialogs->show(35914);
@@ -107,7 +103,7 @@ void Scene359::actions() {
 
 			case 1:
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-				_scene->_dynamicHotspots.remove(_cardHotspotId);
+				_scene->_dynamicHotspots.remove(local._cardHotspotId);
 				_vm->_sound->command(57);
 				_game._objects.addToInventory(OBJ_SECURITY_CARD);
 				_vm->_dialogs->showItem(OBJ_SECURITY_CARD, 0x330);
@@ -172,6 +168,21 @@ void Scene359::actions() {
 	_action._inProgress = false;
 }
 
+void room_359_synchronize(Common::Serializer &s) {
+	s.syncAsSint32LE(local._cardHotspotId);
+}
+
+void room_359_preload() {
+	room_init_code_pointer = room_359_init;
+	room_pre_parser_code_pointer = room_359_pre_parser;
+	room_parser_code_pointer = room_359_parser;
+
+	section_3_walker();
+	section_3_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room360.cpp b/engines/mads/madsv2/nebular/rooms/room360.cpp
index a7d642f9940..9487fb1a638 100644
--- a/engines/mads/madsv2/nebular/rooms/room360.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room360.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene360::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene360::enter() {
+static void room_360_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(127, 78));
@@ -43,10 +43,10 @@ void Scene360::enter() {
 	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(13, 141);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene360::preActions() {
+static void room_360_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
 		_game._player._walkOffScreenSceneId = 359;
 
@@ -54,7 +54,7 @@ void Scene360::preActions() {
 		_game._player._walkOffScreenSceneId = 361;
 }
 
-void Scene360::actions() {
+static void room_360_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(36015);
 	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
@@ -79,6 +79,20 @@ void Scene360::actions() {
 	_action._inProgress = false;
 }
 
+void room_360_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_360_preload() {
+	room_init_code_pointer = room_360_init;
+	room_pre_parser_code_pointer = room_360_pre_parser;
+	room_parser_code_pointer = room_360_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room361.cpp b/engines/mads/madsv2/nebular/rooms/room361.cpp
index a3fbce0f02d..4e577600b08 100644
--- a/engines/mads/madsv2/nebular/rooms/room361.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room361.cpp
@@ -19,23 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene361::setup() {
-	if (_scene->_currentSceneId == 391)
-		_globals[kSexOfRex] = REX_MALE;
-
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene361::handleRexAction() {
+static void handleRexAction() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -133,7 +130,7 @@ void Scene361::handleRexAction() {
 	}
 }
 
-void Scene361::handleRoxAction() {
+static void handleRoxAction() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -236,7 +233,7 @@ void Scene361::handleRoxAction() {
 	}
 }
 
-void Scene361::enter() {
+static void room_361_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
 
 	if (_globals[kSexOfRex] == REX_MALE) {
@@ -269,10 +266,10 @@ void Scene361::enter() {
 	if (_scene->_priorSceneId == 320)
 		_scene->_kernelMessages.setQuoted(_scene->_kernelMessages.addQuote(0xFB, 0, 0x78), 4, true);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene361::step() {
+static void room_361_daemon() {
 	if (_game._trigger >= 70) {
 		switch (_game._trigger) {
 		case 70:
@@ -374,7 +371,7 @@ void Scene361::step() {
 	}
 }
 
-void Scene361::preActions() {
+static void room_361_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
 		_game._player._walkOffScreenSceneId = 360;
 
@@ -382,7 +379,7 @@ void Scene361::preActions() {
 		_game._player._walkOffScreenSceneId = 354;
 }
 
-void Scene361::actions() {
+static void room_361_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(36119);
 	else if (_action.isAction(VERB_SIT_AT, NOUN_DESK)) {
@@ -419,6 +416,24 @@ void Scene361::actions() {
 	_action._inProgress = false;
 }
 
+void room_361_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_361_preload() {
+	room_init_code_pointer = room_361_init;
+	room_pre_parser_code_pointer = room_361_pre_parser;
+	room_parser_code_pointer = room_361_parser;
+	room_daemon_code_pointer = room_361_daemon;
+
+	if (_scene->_currentSceneId == 391)
+		_globals[kSexOfRex] = REX_MALE;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room366.cpp b/engines/mads/madsv2/nebular/rooms/room366.cpp
index fb54dbd302b..18a059c1f42 100644
--- a/engines/mads/madsv2/nebular/rooms/room366.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room366.cpp
@@ -19,26 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene366::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene366::enter() {
+static void room_366_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene366::actions() {
+static void room_366_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 302;
 	else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
@@ -59,6 +59,20 @@ void Scene366::actions() {
 	_action._inProgress = false;
 }
 
+void room_366_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_366_preload() {
+	room_init_code_pointer = room_366_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_366_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room387.cpp b/engines/mads/madsv2/nebular/rooms/room387.cpp
index ca2eb3284d9..a61168a46ee 100644
--- a/engines/mads/madsv2/nebular/rooms/room387.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room387.cpp
@@ -19,27 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene387::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene387::enter() {
+static void room_387_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene387::actions() {
+static void room_387_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 313;
 	else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE))
@@ -52,6 +52,20 @@ void Scene387::actions() {
 	_action._inProgress = false;
 }
 
+void room_387_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_387_preload() {
+	room_init_code_pointer = room_387_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_387_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room388.cpp b/engines/mads/madsv2/nebular/rooms/room388.cpp
index f8b2de4873b..8fccc6ca4eb 100644
--- a/engines/mads/madsv2/nebular/rooms/room388.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room388.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene388::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene388::enter() {
+static void room_388_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 
 	if (_globals[kAfterHavoc])
@@ -47,10 +47,10 @@ void Scene388::enter() {
 	_vm->_palette->setEntry(253, 45, 15, 12);
 	_game.loadQuoteSet(0x154, 0x155, 0x156, 0x157, 0x158, 0);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene388::actions() {
+static void room_388_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 313;
 	else if (_action.isAction(VERB_TALKTO, NOUN_SAUROPOD)) {
@@ -88,6 +88,20 @@ void Scene388::actions() {
 	_action._inProgress = false;
 }
 
+void room_388_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_388_preload() {
+	room_init_code_pointer = room_388_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_388_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room389.cpp b/engines/mads/madsv2/nebular/rooms/room389.cpp
index 24bb98f32fd..f206c0a71ec 100644
--- a/engines/mads/madsv2/nebular/rooms/room389.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room389.cpp
@@ -19,35 +19,32 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene389::Scene389(RexNebularEngine *vm) : Scene300s(vm) {
-	_monsterTime = 0;
-	_circularQuoteId = -1;
-}
+struct Scratch {
+	int32 _monsterTime;
+	int32 _circularQuoteId;
 
-void Scene389::synchronize(Common::Serializer &s) {
-	Scene3xx::synchronize(s);
+};
 
-	s.syncAsUint32LE(_monsterTime);
-	s.syncAsSint32LE(_circularQuoteId);
-}
+static Scratch local;
 
-void Scene389::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Scene389::enter() {
+static void room_389_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
-	_monsterTime = 0;
-	_circularQuoteId = 0x159;
+	local._monsterTime = 0;
+	local._circularQuoteId = 0x159;
 
 	if (_globals[kAfterHavoc])
 		_scene->_hotspots.activate(NOUN_MONSTER, false);
@@ -64,29 +61,29 @@ void Scene389::enter() {
 	_game._player._visible = false;
 	_game.loadQuoteSet(0xF7, 0xF8, 0xF9, 0x159, 0x15A, 0x15B, 0);
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene389::step() {
+static void room_389_daemon() {
 	_scene->_kernelMessages.randomServer();
-	if (_scene->_frameStartTime >= _monsterTime) {
+	if (_scene->_frameStartTime >= local._monsterTime) {
 		int chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1;
 		_scene->_kernelMessages.generateRandom(20, chanceMinor);
-		_monsterTime = _scene->_frameStartTime + 2;
+		local._monsterTime = _scene->_frameStartTime + 2;
 	}
 }
 
-void Scene389::actions() {
+static void room_389_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 313;
 	else if (_action.isAction(VERB_TALKTO, NOUN_MONSTER)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
-			_scene->_kernelMessages.add(Common::Point(160, 136), 0x1110, 32, 1, 120, _game.getQuote(_circularQuoteId));
-			_circularQuoteId++;
-			if (_circularQuoteId > 0x15B)
-				_circularQuoteId = 0x159;
+			_scene->_kernelMessages.add(Common::Point(160, 136), 0x1110, 32, 1, 120, _game.getQuote(local._circularQuoteId));
+			local._circularQuoteId++;
+			if (local._circularQuoteId > 0x15B)
+				local._circularQuoteId = 0x159;
 
 			break;
 
@@ -116,6 +113,22 @@ void Scene389::actions() {
 	_action._inProgress = false;
 }
 
+void room_389_synchronize(Common::Serializer &s) {
+	s.syncAsUint32LE(local._monsterTime);
+	s.syncAsSint32LE(local._circularQuoteId);
+}
+
+void room_389_preload() {
+	room_init_code_pointer = room_389_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_389_parser;
+	room_daemon_code_pointer = room_389_daemon;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room390.cpp b/engines/mads/madsv2/nebular/rooms/room390.cpp
index 033c87bb4b0..a3821aa916b 100644
--- a/engines/mads/madsv2/nebular/rooms/room390.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room390.cpp
@@ -19,27 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene390::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene390::enter() {
+static void room_390_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
 
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene390::actions() {
+static void room_390_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 313;
 	else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE))
@@ -52,6 +52,20 @@ void Scene390::actions() {
 	_action._inProgress = false;
 }
 
+void room_390_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_390_preload() {
+	room_init_code_pointer = room_390_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_390_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room391.cpp b/engines/mads/madsv2/nebular/rooms/room391.cpp
index d776a6ee28b..4b486447e9c 100644
--- a/engines/mads/madsv2/nebular/rooms/room391.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room391.cpp
@@ -19,26 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene391::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene391::enter() {
+static void room_391_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene391::actions() {
+static void room_391_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 313;
 	else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
@@ -64,6 +64,20 @@ void Scene391::actions() {
 	_action._inProgress = false;
 }
 
+void room_391_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_391_preload() {
+	room_init_code_pointer = room_391_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_391_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room399.cpp b/engines/mads/madsv2/nebular/rooms/room399.cpp
index 810da38a0e1..f82ace85467 100644
--- a/engines/mads/madsv2/nebular/rooms/room399.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room399.cpp
@@ -19,26 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene399::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene399::enter() {
+static void room_399_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
-	sceneEntrySound();
+	section_3_music();
 }
 
-void Scene399::actions() {
+static void room_399_parser() {
 	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
 		_scene->_nextSceneId = 313;
 	else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
@@ -60,6 +60,20 @@ void Scene399::actions() {
 	_action._inProgress = false;
 }
 
+void room_399_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_399_preload() {
+	room_init_code_pointer = room_399_init;
+	room_pre_parser_code_pointer = section_3_pre_parser;
+	room_parser_code_pointer = room_399_parser;
+
+	section_3_walker();
+	section_3_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section2.cpp b/engines/mads/madsv2/nebular/rooms/section2.cpp
index 9f958c05171..2fd7acf4926 100644
--- a/engines/mads/madsv2/nebular/rooms/section2.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section2.cpp
@@ -23,50 +23,52 @@
 #include "mads/nebular/nebular.h"
 #include "mads/nebular/core/scene.h"
 #include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes2.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
-
-void Scene2xx::setAAName() {
-	int idx = (_scene->_nextSceneId == 216) ? 4 : 2;
-	_game._aaName = Resources::formatAAName(idx);
+void section_2_interface() {
+	int idx = (new_room == 216) ? 4 : 2;
+	Common::strcpy_s(kernel.interface, kernel_interface_name(idx));
 }
 
-void Scene2xx::setPlayerSpritesPrefix() {
+void section_2_walker() {
 	_vm->_sound->command(5);
 	Common::String oldName = _game._player._spritesPrefix;
 
-	switch(_scene->_nextSceneId) {
+	switch (new_room) {
 	case 213:
 	case 216:
-		_game._player._spritesPrefix = "";
+		Common::strcpy_s(player.series_name, "");
 		break;
 	default:
 		if (_globals[kSexOfRex] != SEX_MALE) {
-			_game._player._spritesPrefix = "ROX";
+			Common::strcpy_s(player.series_name, "ROX");
 		} else {
-			_game._player._spritesPrefix = "RXM";
+			Common::strcpy_s(player.series_name, "RXM");
 		}
 		break;
 	}
 
-	_game._player._scalingVelocity = (_scene->_nextSceneId <= 212);
+	player.scaling_velocity = (new_room <= 212);
 
 	if (oldName != _game._player._spritesPrefix)
 		_game._player._spritesChanged = true;
 
-	if ((_scene->_nextSceneId == 203 || _scene->_nextSceneId == 204) && _globals[kRhotundaStatus])
+	if ((new_room == 203 || new_room == 204) && _globals[kRhotundaStatus])
 		_game._player._loadsFirst = false;
 
 	_vm->_palette->setEntry(16, 10, 63, 63);
 	_vm->_palette->setEntry(17, 10, 45, 45);
 }
 
-void Scene2xx::sceneEntrySound() {
+void section_2_music() {
 	if (_vm->_musicFlag) {
-		switch (_scene->_nextSceneId) {
+		switch (new_room) {
 		case 201:
 			if ((_globals[kTeleporterCommand] == 2) || (_globals[kTeleporterCommand] == 4) || (_globals[kMeteorologistStatus] != 1))
 				_vm->_sound->command(9);
@@ -114,5 +116,7 @@ void Scene2xx::sceneEntrySound() {
 		_vm->_sound->command(2);
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section3.cpp b/engines/mads/madsv2/nebular/rooms/section3.cpp
index a71f0b5105d..5583a2116f1 100644
--- a/engines/mads/madsv2/nebular/rooms/section3.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section3.cpp
@@ -20,55 +20,56 @@
  */
 
 #include "common/scummsys.h"
-#include "mads/nebular/nebular.h"
-#include "mads/nebular/core/scene.h"
-#include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes3.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/global.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/engine.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
-
-void Scene3xx::setAAName() {
-	_game._aaName = Resources::formatAAName(4);
+void section_3_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(4));
 }
 
-void Scene3xx::setPlayerSpritesPrefix() {
-	_vm->_sound->command(5);
-
-	Common::String oldName = _game._player._spritesPrefix;
-
-	if (_globals[kSexOfRex] == REX_MALE)
-		_game._player._spritesPrefix = "RXM";
-	else
-		_game._player._spritesPrefix = "ROX";
-
-	if ((_scene->_nextSceneId == 313) || (_scene->_nextSceneId == 366)
-	|| ((_scene->_nextSceneId >= 301) && (_scene->_nextSceneId <= 303))
-	|| ((_scene->_nextSceneId == 304) && (_scene->_currentSceneId == 303))
-	|| ((_scene->_nextSceneId == 311) && (_scene->_currentSceneId == 304))
-	|| ((_scene->_nextSceneId >= 308) && (_scene->_nextSceneId <= 310))
-	|| ((_scene->_nextSceneId >= 319) && (_scene->_nextSceneId <= 322))
-	|| ((_scene->_nextSceneId >= 387) && (_scene->_nextSceneId <= 391))) {
-		_game._player._spritesPrefix = "";
-		_game._player._spritesChanged = true;
+void section_3_walker() {
+	g_engine->_soundManager->command(5);
+
+	Common::String oldName = player.series_name;
+	Common::strcpy_s(player.series_name, (global[kSexOfRex] == REX_MALE) ? "RXM" : "ROX");
+
+	if ((new_room == 313) || (new_room == 366)
+			|| ((new_room >= 301) && (new_room <= 303))
+			|| ((new_room == 304) && (room_id == 303))
+			|| ((new_room == 311) && (room_id == 304))
+			|| ((new_room >= 308) && (new_room <= 310))
+			|| ((new_room >= 319) && (new_room <= 322))
+			|| ((new_room >= 387) && (new_room <= 391))) {
+		*player.series_name = '\0';
+		player.walker_must_reload = true;
 	}
 
-	_game._player._scalingVelocity = true;
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
+	player.scaling_velocity = true;
+	if (oldName != Common::String(player.series_name))
+		player.walker_must_reload = true;
 
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
+	pal_change_color(16, 10, 63, 63);
+	pal_change_color(17, 10, 45, 45);
 }
 
-void Scene3xx::sceneEntrySound() {
-	if (!_vm->_musicFlag) {
-		_vm->_sound->command(2);
+void section_3_music() {
+	if (!config_file.music_flag) {
+		g_engine->_soundManager->command(2);
 		return;
 	}
 
-	switch (_scene->_nextSceneId) {
+	switch (new_room) {
 	case 301:
 	case 302:
 	case 303:
@@ -76,14 +77,14 @@ void Scene3xx::sceneEntrySound() {
 	case 308:
 	case 309:
 	case 310:
-		_vm->_sound->command(11);
+		g_engine->_soundManager->command(11);
 		break;
 
 	case 311:
-		if (_scene->_priorSceneId == 304)
-			_vm->_sound->command(11);
+		if (previous_room == 304)
+			g_engine->_soundManager->command(11);
 		else
-			_vm->_sound->command(10);
+			g_engine->_soundManager->command(10);
 		break;
 
 	case 313:
@@ -101,26 +102,26 @@ void Scene3xx::sceneEntrySound() {
 	case 390:
 	case 391:
 	case 399:
-		_vm->_sound->command(10);
+		g_engine->_soundManager->command(10);
 		break;
 
 	case 318:
-		if ((_scene->_priorSceneId == 357) || (_scene->_priorSceneId == 407))
-			_vm->_sound->command(10);
-		else if (_scene->_priorSceneId == 319)
-			_vm->_sound->command(16);
+		if ((previous_room == 357) || (previous_room == 407))
+			g_engine->_soundManager->command(10);
+		else if (previous_room == 319)
+			g_engine->_soundManager->command(16);
 		else
-			_vm->_sound->command(3);
+			g_engine->_soundManager->command(3);
 
-		_vm->_sound->command(50);
+		g_engine->_soundManager->command(50);
 		break;
 
 	case 319:
-		_vm->_sound->command(16);
+		g_engine->_soundManager->command(16);
 		break;
 
 	case 321:
-		_vm->_sound->command(18);
+		g_engine->_soundManager->command(18);
 		break;
 
 	default:
@@ -128,114 +129,11 @@ void Scene3xx::sceneEntrySound() {
 	}
 }
 
-void Scene3xx::initForceField(ForceField *force, bool flag) {
-	force->_flag = flag;
-	force->_vertical = 0;
-	force->_horizontal = 0;
-	force->_timer = 0;
-
-	for (int count = 0; count < 40; count++)
-		force->_seqId[count] = -1;
-
-	if (force->_flag)
-		_vm->_sound->command(24);
-}
-
-int Scene3xx::computeScale(int low, int high, int id) {
-	int diff = high - (low + 2);
-	int quotient = diff / 20;
-	int remainder = diff % 20;
-	int value = low + 2 + (quotient * id) + (remainder / (id + 1));
-
-	return (value);
-}
-
-void Scene3xx::handleForceField(ForceField *force, int *sprites) {
-	if (_game._trigger >= 150) {
-		int id = _game._trigger - 150;
-		if (id < 40) {
-			if (id < 20)
-				force->_vertical--;
-			else
-				force->_horizontal--;
-
-			force->_seqId[id] = -1;
-		}
-		return;
-	}
-
-	if (!force->_flag || (_scene->_frameStartTime < force->_timer) || (force->_vertical + force->_horizontal >= 5))
-		return;
-
-	if (_vm->getRandomNumber(1, 1000) <= (200 + ((40 - (force->_vertical + force->_horizontal)) << 5))) {
-		int id = -1;
-		for (int i = 0; i < 100; i++) {
-			int randIdx = _vm->getRandomNumber(0, 39);
-			if (force->_seqId[randIdx] < 0) {
-				id = randIdx;
-				break;
-			}
-		}
-
-		if (id < 0) {
-			for (int i = 0; i < 40; i++) {
-				if (force->_seqId[i] < 0) {
-					id = i;
-					break;
-				}
-			}
-		}
-
-		int speedX, speedY;
-		int posX, posY;
-		int randVal = _vm->getRandomNumber(1, 100);
-		int spriteId;
-		bool mirror;
-
-		if (id >= 20) {
-			spriteId = 2;
-			mirror = (randVal <= 50);
-			posX = mirror ? 315 : 5;
-			posY = computeScale(15, 119, id - 20);
-			speedX = 1000 * (mirror ? -1 : 1);
-			speedY = 0;
-		} else if (randVal <= 50) {
-			spriteId = 1;
-			mirror = false;
-			posX = computeScale(21, 258, id);
-			posY = 0;
-			speedX = 0;
-			speedY = 600;
-		} else {
-			spriteId = 0;
-			mirror = false;
-			posX = computeScale(21, 258, id);
-			posY = 155;
-			speedX = 0;
-			speedY = -600;
-		}
-
-		if (id >= 0) {
-			force->_seqId[id] = _scene->_sequences.addSpriteCycle(sprites[spriteId], mirror, 2, 0, 0, 0);
-			_scene->_sequences.setDepth(force->_seqId[id], 8);
-			_scene->_sequences.setPosition(force->_seqId[id], Common::Point(posX, posY));
-			_scene->_sequences.setMotion(force->_seqId[id], 2, speedX, speedY);
-			_scene->_sequences.addSubEntry(force->_seqId[id], SEQUENCE_TRIGGER_EXPIRE, 0, 150 + id);
-			if (spriteId == 2)
-				force->_horizontal++;
-			else
-				force->_vertical++;
-		}
-	}
-
-	force->_timer = _scene->_frameStartTime + 4;
-}
-
-/*------------------------------------------------------------------------*/
-
-void Scene300s::preActions() {
-	_game._player._needToWalk = false;
+void section_3_pre_parser() {
+	player.need_to_walk = false;
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section3.h b/engines/mads/madsv2/nebular/rooms/section3.h
index 6bbe232f48f..1fa7fca07bf 100644
--- a/engines/mads/madsv2/nebular/rooms/section3.h
+++ b/engines/mads/madsv2/nebular/rooms/section3.h
@@ -32,34 +32,10 @@ namespace Rooms {
 extern void section_3_walker();
 extern void section_3_interface();
 extern void section_3_music();
+extern void section_3_pre_parser();
 
 #if 0
 
-struct ForceField {
-	bool _flag;
-	int _vertical;
-	int _horizontal;
-	int _seqId[40];
-	uint32 _timer;
-
-	void init() {
-		_flag = false;
-		_vertical = _horizontal = -1;
-		_timer = 0;
-		for (int i = 0; i < 40; ++i)
-			_seqId[i] = -1;
-	}
-
-	void synchronize(Common::Serializer &s) {
-		s.syncAsByte(_flag);
-		s.syncAsSint32LE(_vertical);
-		s.syncAsSint32LE(_horizontal);
-		for (int i = 0; i < 40; ++i)
-			s.syncAsSint32LE(_seqId[i]);
-		s.syncAsUint32LE(_timer);
-	};
-};
-
 class Scene3xx : public NebularScene {
 protected:
 	/**
@@ -74,9 +50,6 @@ protected:
 
 	void sceneEntrySound();
 
-	void initForceField(ForceField *force, bool flag);
-	void handleForceField(ForceField *force, int *sprites);
-	int computeScale(int low, int high, int id);
 
 public:
 	Scene3xx(RexNebularEngine *vm) : NebularScene(vm) {
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter_room.cpp b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
similarity index 91%
rename from engines/mads/madsv2/nebular/rooms/teleporter_room.cpp
rename to engines/mads/madsv2/nebular/rooms/teleporter.cpp
index f314d711ddf..4d161172504 100644
--- a/engines/mads/madsv2/nebular/rooms/teleporter_room.cpp
+++ b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
@@ -19,7 +19,10 @@
  *
  */
 
-#include "mads/madsv2/nebular/rooms/teleporter_room.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -53,13 +56,13 @@ void teleporter_init() {
 
 	_game._player._visible = false;
 	_game._player._stepEnabled = (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL);
-	_scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_TELE);
+	_scene->_kernelMessages._talkFont = font_tele;
 	_scene->_textSpacing = 0;
 	_curCode = 0;
 	_digitCount = 0;
 	_finishedCodeCounter = 0;
 	_curMessageId = -1;
-	_msgText = "_";
+	Common::strcpy_s(_msgText, "_");
 
 	if (_scene->_priorSceneId == RETURNING_FROM_DIALOG)
 		_scene->_priorSceneId = _globals[kTeleporterDestination];
@@ -170,10 +173,9 @@ Common::Point teleporter_compute_location() {
 
 void teleporter_handle_key() {
 	switch (_game._trigger) {
-	case 0:
-	{
+	case 0: {
 		_game._player._stepEnabled = false;
-		Common::Point msgPos = teleporterComputeLocation();
+		Common::Point msgPos = teleporter_compute_location();
 		_handSequenceId = _scene->_sequences.startPingPongCycle(_handSpriteId, false, 4, 2, 0, 0);
 		_scene->_sequences.setPosition(_handSequenceId, msgPos);
 		_scene->_sequences.setDepth(_handSequenceId, 2);
@@ -182,9 +184,8 @@ void teleporter_handle_key() {
 
 		if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
 			_vm->_events->hideCursor();
-
+		break;
 	}
-	break;
 
 	case 1:
 		_scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_SPRITE, 3, 3);
@@ -196,9 +197,9 @@ void teleporter_handle_key() {
 
 				Common::String format = "%01d";
 				format.setChar('0' + _digitCount, 2);
-				_msgText = Common::String::format(format.c_str(), _curCode);
+				Common::strcpy_s(_msgText, Common::String::format(format.c_str(), _curCode).c_str());
 				if (_digitCount < 4)
-					_msgText += "_";
+					Common::strcat_s(_msgText, "_");
 
 				if (_scene->_currentSceneId != 711)
 					_vm->_sound->command(32);
@@ -206,14 +207,14 @@ void teleporter_handle_key() {
 		} else if (_buttonTyped == 11) {
 			_digitCount = 0;
 			_curCode = 0;
-			_msgText = "_";
+			Common::strcpy_s(_msgText, "_");
 			if (_scene->_currentSceneId != 711)
 				_vm->_sound->command(33);
 		} else if (_digitCount == 4) {
 			if (_scene->_currentSceneId != 711)
 				_finishedCodeCounter = 1;
 
-			if (teleporterAddress(_curCode, true) > 0) {
+			if (teleporter_address(_curCode, true) > 0) {
 				_vm->_palette->setEntry(252, 0, 63, 0);
 				if (_scene->_currentSceneId != 711)
 					_vm->_sound->command(34);
@@ -239,7 +240,7 @@ void teleporter_handle_key() {
 				_scene->_nextSceneId = 202;
 			else {
 				_vm->_events->showCursor();
-				int destination = teleporterAddress(_curCode, true);
+				int destination = teleporter_address(_curCode, true);
 
 				if (destination > 0) {
 					_globals[kTeleporterCommand] = 2;
@@ -269,7 +270,7 @@ void teleporter_handle_key() {
 	}
 }
 
-bool teleeporter_parser() {
+bool teleporter_parser() {
 	bool retVal = false;
 
 	if (_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) {
@@ -278,7 +279,7 @@ bool teleeporter_parser() {
 			if (_action._activeAction._objectNameId == _buttonList[i])
 				_buttonTyped = i;
 		}
-		teleporterHandleKey();
+		teleporter_handle_key();
 		retVal = true;
 	}
 
@@ -288,7 +289,7 @@ bool teleeporter_parser() {
 		retVal = true;
 	}
 
-	return (retVal);
+	return retVal;
 }
 
 void teleporter_daemon() {
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter_room.h b/engines/mads/madsv2/nebular/rooms/teleporter.h
similarity index 89%
rename from engines/mads/madsv2/nebular/rooms/teleporter_room.h
rename to engines/mads/madsv2/nebular/rooms/teleporter.h
index f2ed7993bc3..88c1a5bc17e 100644
--- a/engines/mads/madsv2/nebular/rooms/teleporter_room.h
+++ b/engines/mads/madsv2/nebular/rooms/teleporter.h
@@ -19,10 +19,10 @@
  *
  */
 
-#ifndef MADS_NEBULAR_ROOMS_TELEPORTER_ROOM_H
-#define MADS_NEBULAR_ROOMS_TELEPORTER_ROOM_H
+#ifndef MADS_NEBULAR_ROOMS_TELEPORTER_H
+#define MADS_NEBULAR_ROOMS_TELEPORTER_H
 
-#include "common/point.h"
+#include "common/rect.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -31,7 +31,7 @@ namespace Rooms {
 
 extern void teleporter_init();
 extern int teleporter_address(int code, bool working);
-extern void teleporter_handleKey();
+extern void teleporter_handle_key();
 extern Common::Point teleporter_compute_location();
 extern bool teleporter_parser();
 extern void teleporter_daemon();
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 352de7ee31b..e8ab2345624 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -22,6 +22,7 @@
 #include "common/textconsole.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/magic.h"
 #include "mads/madsv2/core/matte.h"
 #include "mads/madsv2/core/mouse.h"
 #include "mads/madsv2/core/pal.h"
@@ -29,6 +30,7 @@
 #include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/quote.h"
 #include "mads/madsv2/core/text.h"
+#include "mads/madsv2/core/timer.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 #include "mads/madsv2/nebular/nebular.h"
 
@@ -75,7 +77,11 @@ void Game::Objects::setRoom(int object_id, int roomNum) {
 }
 
 void Game::Objects::removeFromInventory(int objectId, int newScene) {
+	inter_take_from_player(objectId, newScene);
+}
 
+int Game::Objects::size() const {
+	return num_objects;
 }
 
 Game::Object Game::Objects::operator[](int idx) {
@@ -154,6 +160,10 @@ char *Resources::formatAAName(int num) {
 	return kernel_interface_name(num);
 }
 
+Scene::Animation &Scene::Animation::operator=(std::nullptr_t) {
+	error("TODO: Animation operator=");
+}
+
 int Scene::Animation::getCurrentFrame() const {
 	error("TODO: Animation::getCurrentFrame");
 }
@@ -179,11 +189,12 @@ void Scene::DynamicHotspots::remove(int dyn_id) {
 	kernel_delete_dynamic(dyn_id);
 }
 
-void Scene::DynamicHotspots::setPosition(int id, const Common::Point &pt, int facing) {
+int Scene::DynamicHotspots::setPosition(int id, const Common::Point &pt, int facing) {
 	kernel_dynamic_walk(id, pt.x, pt.y, facing);
+	return id;
 }
 
-int Scene::DynamicHotspots::setCursor(int index, int cursor) {
+int Scene::DynamicHotspots::setCursor(int index, int cursorNum) {
 	error("TODO: DynamicHotspots::setCursor");
 }
 
@@ -198,6 +209,11 @@ void Scene::Hotspots::activate(int hotspot, int active) {
 	kernel_flip_hotspot(hotspot, active);
 }
 
+Scene::KernelMessages::TalkFont &Scene::KernelMessages::TalkFont::operator=(FontPtr font) {
+	kernel_message_font = font;
+	return *this;
+}
+
 int Scene::KernelMessages::TalkFont::getWidth(const Common::String &message, int spacing) const {
 	return font_string_width(kernel_message_font, message.c_str(), spacing);
 }
@@ -361,6 +377,14 @@ int Scene::Sequences::startCycle(int srcSpriteIdx, bool flipped, int cycleIndex)
 	return kernel_seq_stamp(srcSpriteIdx, flipped, cycleIndex);
 }
 
+void Scene::Sequences::setDone(int sequence_id) {
+	kernel_player_expire(sequence_id);
+}
+
+int Scene::Sequences::findByTrigger(int trigger) {
+	return kernel_seq_find_by_trigger(trigger);
+}
+
 int Scene::loadAnimation(const char *name, int trigger_code) {
 	return kernel_run_animation(name, trigger_code);
 }
@@ -402,18 +426,44 @@ void VM::Events::setCursor2(int cursorNum) {
 	mouse_cursor_sprite(cursor, cursorNum);
 }
 
-void VM::Palette::setEntry(int color, int r, int g, int b) {
+void VM::Events::showCursor() {
+	mouse_show();
+}
+
+void VM::Events::hideCursor() {
+	mouse_hide();
+}
+
+int32 VM::Events::getFrameCounter() {
+	return timer_read();
+}
+
+void VM::PaletteProxy::setEntry(int color, int r, int g, int b) {
 	pal_change_color(color, r, g, b);
 }
 
-void VM::Palette::refreshSceneColors() {
+void VM::PaletteProxy::refreshSceneColors() {
 	kernel_new_palette();
 }
 
-void VM::Palette::lock() {
+void VM::PaletteProxy::lock() {
 	pal_lock();
 }
 
+void VM::PaletteProxy::setColorFlags(byte r, byte g, byte b) {
+	magic_set_color_flags(r, g, b);
+}
+
+void VM::PaletteProxy::setColorValues(byte r, byte g, byte b) {
+	magic_set_color_values(r, g, b);
+}
+
+void VM::PaletteProxy::fadeOut(Palette palette, byte *paletteMap,
+		int baseColor, int numColors, int baseGrey, int numGreys,
+		int tickDelay, int steps) {
+	magic_fade_to_grey(palette, paletteMap, baseColor, numColors, baseGrey, numGreys, tickDelay, steps);
+}
+
 void VM::Sound::command(int num, int distance) {
 	g_engine->_soundManager->command(num, distance);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 590efc1ef8a..83c2e56cd64 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -26,6 +26,7 @@
 #include "mads/madsv2/core/config.h"
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/mcga.h"
 #include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/sprite.h"
 #include "mads/madsv2/core/text.h"
@@ -172,9 +173,11 @@ struct Scene {
 		explicit operator bool() const {
 			return _id != -1;
 		}
+		Animation &operator=(std::nullptr_t);
 
 		// TODO: Not sure what to map this to
 		bool _resetFlag;
+		int16 _spriteListIndexes[16];
 
 		int getCurrentFrame() const;
 		void setNextFrameTimer(long time);
@@ -185,7 +188,7 @@ struct Scene {
 
 	struct CustomDest {
 		int &x = inter_point_x;
-		int &y = inter_point.y;
+		int &y = inter_point_y;
 	};
 	CustomDest _customDest;
 
@@ -198,7 +201,7 @@ struct Scene {
 	struct DynamicHotspots {
 		int add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r);
 		void remove(int dyn_id);
-		void setPosition(int id, const Common::Point &pt, int facing);
+		int setPosition(int id, const Common::Point &pt, int facing);
 		int setCursor(int index, int cursor);
 
 		DynamicHotspot operator[](int idx);
@@ -218,6 +221,7 @@ struct Scene {
 			const TalkFont *operator->() const {
 				return this;
 			}
+			TalkFont &operator=(FontPtr font);
 			int getWidth(const Common::String &message, int spacing) const;
 		};
 		TalkFont _talkFont;
@@ -250,6 +254,12 @@ struct Scene {
 	};
 	KernelMessages _kernelMessages;
 
+	struct PaletteCycles {
+		int size() const;
+
+	};
+	PaletteCycles _paletteCycles;
+
 	struct Rails {
 		int getNext() const;
 		void resetNext();
@@ -263,8 +273,9 @@ struct Scene {
 			SequencePosition(int &sx, int &sy) : x(sx), y(sy) {}
 		};
 		SequencePosition _position;
+		byte &_doneFlag;
 
-		SequenceProxy(SequencePtr seqPtr) : _position(seqPtr->x, seqPtr->y) {
+		SequenceProxy(SequencePtr seqPtr) : _position(seqPtr->x, seqPtr->y), _doneFlag(seqPtr->expired) {
 		}
 	};
 
@@ -289,6 +300,8 @@ struct Scene {
 		void updateTimeout(int old_sequence_id, int new_sequence_id);
 		void scan();
 		int startCycle(int srcSpriteIdx, bool flipped, int cycleIndex);
+		void setDone(int sequence_id);
+		int findByTrigger(int trigger);
 	};
 	Sequences _sequences;
 
@@ -332,8 +345,7 @@ struct Scene {
 	SpriteSlots _spriteSlots;
 
 	struct UserInterface {
-		int &_selectedInvIndex = active_inv;
-
+		int &_selectedInvIndex = active_inven;
 		void emptyConversationList();
 		void setup(int inputMode);
 		void selectObject(int item_id);
@@ -389,6 +401,7 @@ struct Game {
 		int getIdFromDesc(int desc_id) const;
 		void setRoom(int object_id, int roomNum);
 		void removeFromInventory(int objectId, int newScene);
+		int size() const;
 
 		Object operator[](int idx);
 	};
@@ -440,9 +453,10 @@ struct Game {
 		int &_prepareFacing = player.prepare_walk_facing;
 		bool &_visible = player.walker_visible;
 		bool &_stepEnabled = player.commands_allowed;
+		int &_turnToFacing = player.turn_to_facing;
 		char *const q = &player.series_name[0];
 		byte &_spritesChanged = player.walker_must_reload;
-		int &_beenVisible = player.walker_been_visible;
+		bool &_beenVisible = player.walker_been_visible;
 		byte &_loadsFirst = player.walker_loads_first;
 		int &_needToWalk = player.need_to_walk;
 		int &_readyToWalk = player.ready_to_walk;
@@ -548,18 +562,44 @@ struct VM {
 		}
 
 		void setCursor2(int cursorNum);
+		void showCursor();
+		void hideCursor();
+		int32 getFrameCounter();
 	};
 	Events _events;
 
+	Scene::KernelMessages::TalkFont &_font = _scene._kernelMessages._talkFont;
 	Game &_game = Rooms::_game;
 
-	struct Palette {
+	struct PaletteProxy {
+		PaletteProxy *operator->() {
+			return this;
+		}
+		const PaletteProxy *operator->() const {
+			return this;
+		}
+
 		void setEntry(int color, int r, int g, int b);
 		void refreshSceneColors();
 		void lock();
+		void setColorFlags(byte r, byte g, byte b);
+		void setColorValues(byte r, byte g, byte b);
+		void fadeOut(Palette palette, byte *paletteMap, int baseColor, int numColors,
+			int baseGrey, int numGreys, int tickDelay, int steps);
+	};
+	PaletteProxy _palette;
+
+	struct Screen {
+		Screen *operator->() {
+			return this;
+		}
+		const Screen *operator->() const {
+			return this;
+		}
+
+		word &_shakeCountdown = mcga_shakes;
 	};
-	Palette _paletteInstance;
-	Palette *const _palette = &_paletteInstance;
+	Screen _screen;
 
 	struct Sound {
 		Sound *operator->() {
@@ -573,7 +613,7 @@ struct VM {
 	};
 	Sound _sound;
 
-	bool &_musicFlag = config_file.music_flag;
+	int &_musicFlag = config_file.music_flag;
 
 	int getRandomNumber(int min, int max);
 	int getRandomNumber(int max);
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 5d3d6eec665..bbec7f50624 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -71,7 +71,6 @@ MODULE_OBJS += \
 	madsv2/core/window.o \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
-	madsv2/nebular/conversation.o \
 	madsv2/nebular/global.o \
 	madsv2/nebular/mads/mads.o \
 	madsv2/nebular/rooms/thunks.o \
@@ -101,9 +100,42 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room214.o \
 	madsv2/nebular/rooms/room215.o \
 	madsv2/nebular/rooms/room216.o \
+	madsv2/nebular/rooms/room301.o \
+	madsv2/nebular/rooms/room302.o \
+	madsv2/nebular/rooms/room303.o \
+	madsv2/nebular/rooms/room304.o \
+	madsv2/nebular/rooms/room307.o \
+	madsv2/nebular/rooms/room308.o \
+	madsv2/nebular/rooms/room309.o \
+	madsv2/nebular/rooms/room310.o \
+	madsv2/nebular/rooms/room311.o \
+	madsv2/nebular/rooms/room313.o \
+	madsv2/nebular/rooms/room316.o \
+	madsv2/nebular/rooms/room318.o \
+	madsv2/nebular/rooms/room319.o \
+	madsv2/nebular/rooms/room320.o \
+	madsv2/nebular/rooms/room321.o \
+	madsv2/nebular/rooms/room322.o \
+	madsv2/nebular/rooms/room351.o \
+	madsv2/nebular/rooms/room352.o \
+	madsv2/nebular/rooms/room353.o \
+	madsv2/nebular/rooms/room358.o \
+	madsv2/nebular/rooms/room359.o \
+	madsv2/nebular/rooms/room360.o \
+	madsv2/nebular/rooms/room361.o \
+	madsv2/nebular/rooms/room366.o \
+	madsv2/nebular/rooms/room387.o \
+	madsv2/nebular/rooms/room388.o \
+	madsv2/nebular/rooms/room389.o \
+	madsv2/nebular/rooms/room390.o \
+	madsv2/nebular/rooms/room391.o \
+	madsv2/nebular/rooms/room399.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/nebular/rooms/section2.o \
-	madsv2/nebular/rooms/teleporter_room.o \
+	madsv2/nebular/rooms/section3.o \
+	madsv2/nebular/rooms/conversation.o \
+	madsv2/nebular/rooms/forcefield.o \
+	madsv2/nebular/rooms/teleporter.o \
 	madsv2/phantom/mads/mads.o \
 	madsv2/phantom/rooms/section1.o \
 	madsv2/phantom/rooms/room101.o \


Commit: ddbe239b23cca5ffa290fef90fac93a2d9488c6a
    https://github.com/scummvm/scummvm/commit/ddbe239b23cca5ffa290fef90fac93a2d9488c6a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:44+10:00

Commit Message:
MADS: NEBULAR: Implemented section 4 rooms

Changed paths:
    engines/mads/madsv2/nebular/rooms/room401.cpp
    engines/mads/madsv2/nebular/rooms/room402.cpp
    engines/mads/madsv2/nebular/rooms/room405.cpp
    engines/mads/madsv2/nebular/rooms/room406.cpp
    engines/mads/madsv2/nebular/rooms/room407.cpp
    engines/mads/madsv2/nebular/rooms/room408.cpp
    engines/mads/madsv2/nebular/rooms/room409.cpp
    engines/mads/madsv2/nebular/rooms/room410.cpp
    engines/mads/madsv2/nebular/rooms/room411.cpp
    engines/mads/madsv2/nebular/rooms/room413.cpp
    engines/mads/madsv2/nebular/rooms/room501.cpp
    engines/mads/madsv2/nebular/rooms/room502.cpp
    engines/mads/madsv2/nebular/rooms/room503.cpp
    engines/mads/madsv2/nebular/rooms/room504.cpp
    engines/mads/madsv2/nebular/rooms/room505.cpp
    engines/mads/madsv2/nebular/rooms/room506.cpp
    engines/mads/madsv2/nebular/rooms/room507.cpp
    engines/mads/madsv2/nebular/rooms/room508.cpp
    engines/mads/madsv2/nebular/rooms/room511.cpp
    engines/mads/madsv2/nebular/rooms/room512.cpp
    engines/mads/madsv2/nebular/rooms/room513.cpp
    engines/mads/madsv2/nebular/rooms/room515.cpp
    engines/mads/madsv2/nebular/rooms/room551.cpp
    engines/mads/madsv2/nebular/rooms/room601.cpp
    engines/mads/madsv2/nebular/rooms/room602.cpp
    engines/mads/madsv2/nebular/rooms/room603.cpp
    engines/mads/madsv2/nebular/rooms/room604.cpp
    engines/mads/madsv2/nebular/rooms/room605.cpp
    engines/mads/madsv2/nebular/rooms/room607.cpp
    engines/mads/madsv2/nebular/rooms/room608.cpp
    engines/mads/madsv2/nebular/rooms/room609.cpp
    engines/mads/madsv2/nebular/rooms/room610.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp
    engines/mads/madsv2/nebular/rooms/room612.cpp
    engines/mads/madsv2/nebular/rooms/room620.cpp
    engines/mads/madsv2/nebular/rooms/room701.cpp
    engines/mads/madsv2/nebular/rooms/room702.cpp
    engines/mads/madsv2/nebular/rooms/room703.cpp
    engines/mads/madsv2/nebular/rooms/room704.cpp
    engines/mads/madsv2/nebular/rooms/room705.cpp
    engines/mads/madsv2/nebular/rooms/room706.cpp
    engines/mads/madsv2/nebular/rooms/room707.cpp
    engines/mads/madsv2/nebular/rooms/room710.cpp
    engines/mads/madsv2/nebular/rooms/room711.cpp
    engines/mads/madsv2/nebular/rooms/room751.cpp
    engines/mads/madsv2/nebular/rooms/room752.cpp
    engines/mads/madsv2/nebular/rooms/room801.cpp
    engines/mads/madsv2/nebular/rooms/room802.cpp
    engines/mads/madsv2/nebular/rooms/room803.cpp
    engines/mads/madsv2/nebular/rooms/room804.cpp
    engines/mads/madsv2/nebular/rooms/room805.cpp
    engines/mads/madsv2/nebular/rooms/room807.cpp
    engines/mads/madsv2/nebular/rooms/room808.cpp
    engines/mads/madsv2/nebular/rooms/room810.cpp
    engines/mads/madsv2/nebular/rooms/section4.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room401.cpp b/engines/mads/madsv2/nebular/rooms/room401.cpp
index 3c14a558096..9ba2c8ee62e 100644
--- a/engines/mads/madsv2/nebular/rooms/room401.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room401.cpp
@@ -19,38 +19,35 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene401::Scene401(RexNebularEngine *vm) : Scene4xx(vm), _destPos(0, 0) {
-	_northFl = false;
-	_timer = 0;
-}
-
-void Scene401::synchronize(Common::Serializer &s) {
-	Scene4xx::synchronize(s);
+struct Scratch {
+	bool _northFl;
+	int16 _dest_x;
+	int16 _dest_y;
+	int32 _timer;
+};
 
-	s.syncAsByte(_northFl);
-	s.syncAsSint16LE(_destPos.x);
-	s.syncAsSint16LE(_destPos.y);
-	s.syncAsUint32LE(_timer);
-}
+static Scratch local;
 
-void Scene401::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Scene401::enter() {
+static void room_401_init() {
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
-		_northFl = false;
+		local._northFl = false;
 
-	_timer = 0;
+	local._timer = 0;
 
 	if (_scene->_priorSceneId == 402) {
 		_game._player._playerPos = Common::Point(203, 115);
@@ -58,17 +55,17 @@ void Scene401::enter() {
 	} else if (_scene->_priorSceneId == 354) {
 		_game._player._playerPos = Common::Point(149, 90);
 		_game._player._facing = FACING_SOUTH;
-		_northFl = true;
+		local._northFl = true;
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(142, 131);
 		_game._player._facing = FACING_NORTH;
 	}
 
 	_game.loadQuoteSet(0x1D4, 0);
-	sceneEntrySound();
+	section_4_music();
 }
 
-void Scene401::step() {
+static void room_401_daemon() {
 	if (_game._trigger == 70) {
 		_scene->_nextSceneId = 354;
 		_scene->_reloadSceneFlag = true;
@@ -78,11 +75,11 @@ void Scene401::step() {
 		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
-		_northFl = false;
+		local._northFl = false;
 		_game._player.walk(Common::Point(149, 110), FACING_SOUTH);
 	}
 
-	if (_scene->_frameStartTime >= _timer) {
+	if (_scene->_frameStartTime >= local._timer) {
 		int dist = 64 - ((Math::hypotenuse(_game._player._playerPos.x - 219, _game._player._playerPos.y - 115) * 64) / 120);
 
 		if (dist > 64)
@@ -91,35 +88,38 @@ void Scene401::step() {
 			dist = 1;
 
 		_vm->_sound->command(12, dist);
-		_timer = _scene->_frameStartTime + _game._player._ticksAmount;
+		local._timer = _scene->_frameStartTime + _game._player._ticksAmount;
 	}
 
 }
 
-void Scene401::preActions() {
+static void room_401_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
 		_game._player.walk(Common::Point(149, 89), FACING_NORTH);
-		_northFl = false;
+		local._northFl = false;
 	}
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !_northFl)
+	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !local._northFl)
 		_game._player._walkOffScreenSceneId = 405;
 
 	if (_action.isAction(VERB_TAKE))
 		_game._player._needToWalk = false;
 
-	if (_game._player._needToWalk && _northFl) {
-		if (_globals[kSexOfRex] == REX_MALE)
-			_destPos = Common::Point(148, 94);
-		else
-			_destPos = Common::Point(149, 99);
+	if (_game._player._needToWalk && local._northFl) {
+		if (_globals[kSexOfRex] == REX_MALE) {
+			local._dest_x = 148;
+			local._dest_y = 94;
+		} else {
+			local._dest_x = 149;
+			local._dest_y = 99;
+		}
 
-		_game._player.walk(_destPos, FACING_SOUTH);
+		_game._player.walk(Common::Point(local._dest_x, local._dest_y), FACING_SOUTH);
 	}
 }
 
-void Scene401::actions() {
-	if ((_game._player._playerPos == _destPos) && _northFl) {
+static void room_401_parser() {
+	if (_game._player._playerPos.x == local._dest_x && _game._player._playerPos.y && local._northFl) {
 		if (_globals[kSexOfRex] == REX_MALE) {
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_game._player._stepEnabled = false;
@@ -144,7 +144,7 @@ void Scene401::actions() {
 	}
 
 	if (_action.isAction(VERB_WALK_INTO, NOUN_BAR)) {
-		if (!_northFl)
+		if (!local._northFl)
 			_scene->_nextSceneId = 402;
 	} else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH))
 		_scene->_nextSceneId = 354;
@@ -169,6 +169,23 @@ void Scene401::actions() {
 	_action._inProgress = false;
 }
 
+void room_401_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._northFl);
+	s.syncAsSint16LE(local._dest_x);
+	s.syncAsSint16LE(local._dest_y);
+	s.syncAsUint32LE(local._timer);
+}
+
+void room_401_preload() {
+	room_init_code_pointer = room_401_init;
+	room_pre_parser_code_pointer = room_401_pre_parser;
+	room_parser_code_pointer = room_401_parser;
+
+	section_4_walker();
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room402.cpp b/engines/mads/madsv2/nebular/rooms/room402.cpp
index 1c8ff13c1de..dae185da86c 100644
--- a/engines/mads/madsv2/nebular/rooms/room402.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room402.cpp
@@ -19,138 +19,97 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene402::Scene402(RexNebularEngine *vm) : Scene4xx(vm) {
-	_lightOn = false;
-	_blowingSmoke = false;
-	_leftWomanMoving = false;
-	_rightWomanMoving = false;
-	_firstTalkToGirlInChair = false;
-	_waitingGinnyMove = false;
-	_ginnyLooking = false;
-	_bigBeatFl = false;
-	_roxOnStool = false;
-	_bartenderSteady = false;
-	_bartenderHandsHips = false;
-	_bartenderLooksLeft = false;
-	_bartenderReady = false;
-	_bartenderTalking = false;
-	_bartenderCalled = false;
-	_conversationFl = false;
-	_activeTeleporter = false;
-	_activeArrows = false;
-	_activeArrow1 = false;
-	_activeArrow2 = false;
-	_activeArrow3 = false;
-	_cutSceneReady = false;
-	_cutSceneNeeded = false;
-	_helgaReady = false;
-	_refuseAlienLiquor = false;
-
-	_drinkTimer = -1;
-	_beatCounter = -1;
-	_bartenderMode = -1;
-	_bartenderDialogNode = -1;
-	_bartenderCurrentQuestion = -1;
-	_helgaTalkMode = -1;
-	_roxMode = -1;
-	_rexMode = -1;
-	_talkTimer = -1;
-}
-
-void Scene402::synchronize(Common::Serializer &s) {
-	Scene4xx::synchronize(s);
-
-	s.syncAsByte(_lightOn);
-	s.syncAsByte(_blowingSmoke);
-	s.syncAsByte(_leftWomanMoving);
-	s.syncAsByte(_rightWomanMoving);
-	s.syncAsByte(_firstTalkToGirlInChair);
-	s.syncAsByte(_waitingGinnyMove);
-	s.syncAsByte(_ginnyLooking);
-	s.syncAsByte(_bigBeatFl);
-	s.syncAsByte(_roxOnStool);
-	s.syncAsByte(_bartenderSteady);
-	s.syncAsByte(_bartenderHandsHips);
-	s.syncAsByte(_bartenderLooksLeft);
-	s.syncAsByte(_bartenderReady);
-	s.syncAsByte(_bartenderTalking);
-	s.syncAsByte(_bartenderCalled);
-	s.syncAsByte(_conversationFl);
-	s.syncAsByte(_activeTeleporter);
-	s.syncAsByte(_activeArrows);
-	s.syncAsByte(_activeArrow1);
-	s.syncAsByte(_activeArrow2);
-	s.syncAsByte(_activeArrow3);
-	s.syncAsByte(_cutSceneReady);
-	s.syncAsByte(_cutSceneNeeded);
-	s.syncAsByte(_helgaReady);
-	s.syncAsByte(_refuseAlienLiquor);
-
-	s.syncAsSint16LE(_drinkTimer);
-	s.syncAsSint16LE(_beatCounter);
-	s.syncAsSint16LE(_bartenderMode);
-	s.syncAsSint16LE(_bartenderDialogNode);
-	s.syncAsSint16LE(_bartenderCurrentQuestion);
-	s.syncAsSint16LE(_helgaTalkMode);
-	s.syncAsSint16LE(_roxMode);
-	s.syncAsSint16LE(_rexMode);
-	s.syncAsSint16LE(_talkTimer);
-}
-
-void Scene402::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-
-	_scene->addActiveVocab(NOUN_BARTENDER);
-	_scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
-	_scene->addActiveVocab(VERB_DRINK);
-	_scene->addActiveVocab(NOUN_BINOCULARS);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_CREDIT_CHIP);
-	_scene->addActiveVocab(VERB_TAKE);
-	_scene->addActiveVocab(NOUN_REPAIR_LIST);
-	_scene->addActiveVocab(VERB_LOOK_AT);
-}
-
-void Scene402::setDialogNode(int node) {
+namespace Rooms {
+
+struct Scratch {
+	bool _lightOn;
+	bool _blowingSmoke;
+	bool _leftWomanMoving;
+	bool _rightWomanMoving;
+	bool _firstTalkToGirlInChair;
+	bool _waitingGinnyMove;
+	bool _ginnyLooking;
+	bool _bigBeatFl;
+	bool _roxOnStool;
+	bool _bartenderSteady;
+	bool _bartenderHandsHips;
+	bool _bartenderLooksLeft;
+	bool _bartenderReady;
+	bool _bartenderTalking;
+	bool _bartenderCalled;
+	bool _conversationFl;
+	bool _activeTeleporter;
+	bool _activeArrows;
+	bool _activeArrow1;
+	bool _activeArrow2;
+	bool _activeArrow3;
+	bool _cutSceneReady;
+	bool _cutSceneNeeded;
+	bool _helgaReady;
+	bool _refuseAlienLiquor;
+
+	int32 _drinkTimer;
+	int32 _beatCounter;
+	int32 _bartenderMode;
+	int32 _bartenderDialogNode;
+	int32 _bartenderCurrentQuestion;
+	int32 _helgaTalkMode;
+	int32 _roxMode;
+	int32 _rexMode;
+	int32 _talkTimer;
+
+	Conversation _dialog1;
+	Conversation _dialog2;
+	Conversation _dialog3;
+	Conversation _dialog4;
+};
+
+static Scratch local;
+
+
+static void setDialogNode(int node) {
 	if (node > 0)
-		_bartenderDialogNode = node;
+		local._bartenderDialogNode = node;
 
 	_game._player._stepEnabled = true;
 
 	switch (node) {
 	case 0:
 		_scene->_userInterface.setup(kInputBuildingSentences);
-		_conversationFl = false;
-		_bartenderDialogNode = 0;
+		local._conversationFl = false;
+		local._bartenderDialogNode = 0;
 		break;
 
 	case 1:
-		_dialog1.start();
-		_bartenderDialogNode = 1;
+		local._dialog1.start();
+		local._bartenderDialogNode = 1;
 		break;
 
 	case 2:
-		_dialog2.start();
-		_bartenderDialogNode = 2;
+		local._dialog2.start();
+		local._bartenderDialogNode = 2;
 		break;
 
 	case 3:
-		_dialog3.start();
-		_bartenderDialogNode = 3;
+		local._dialog3.start();
+		local._bartenderDialogNode = 3;
 		break;
 
 	case 4:
-		_dialog4.start();
-		_bartenderDialogNode = 4;
+		local._dialog4.start();
+		local._bartenderDialogNode = 4;
 		break;
 
 	default:
@@ -158,7 +117,7 @@ void Scene402::setDialogNode(int node) {
 	}
 }
 
-void Scene402::handleConversation1() {
+static void handleConversation1() {
 	switch (_action._activeAction._verbId) {
 	case 0x214:
 	{
@@ -167,19 +126,19 @@ void Scene402::handleConversation1() {
 		switch (_vm->getRandomNumber(1, 3)) {
 		case 1:
 			quoteId = 0x1E4;
-			_bartenderCurrentQuestion = 4;
+			local._bartenderCurrentQuestion = 4;
 			quotePosX = 205;
 			break;
 
 		case 2:
 			quoteId = 0x1E5;
-			_bartenderCurrentQuestion = 5;
+			local._bartenderCurrentQuestion = 5;
 			quotePosX = 203;
 			break;
 
 		case 3:
 			quoteId = 0x1E6;
-			_bartenderCurrentQuestion = 6;
+			local._bartenderCurrentQuestion = 6;
 			quotePosX = 260;
 			break;
 
@@ -190,7 +149,7 @@ void Scene402::handleConversation1() {
 		_scene->_kernelMessages.add(Common::Point(quotePosX, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quoteId));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 120;
+		local._talkTimer = 120;
 		setDialogNode(2);
 	}
 	break;
@@ -200,8 +159,8 @@ void Scene402::handleConversation1() {
 		_scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EC));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 120;
-		_bartenderCurrentQuestion = 1;
+		local._talkTimer = 120;
+		local._bartenderCurrentQuestion = 1;
 		setDialogNode(3);
 		break;
 
@@ -211,7 +170,7 @@ void Scene402::handleConversation1() {
 		setDialogNode(0);
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1120;
+		local._talkTimer = 1120;
 		break;
 
 	default:
@@ -219,62 +178,62 @@ void Scene402::handleConversation1() {
 	}
 }
 
-void Scene402::handleConversation2() {
+static void handleConversation2() {
 	switch (_action._activeAction._verbId) {
 	case 0x216:
-		_dialog2.write(0x216, false);
-		_dialog2.write(0x21D, true);
+		local._dialog2.write(0x216, false);
+		local._dialog2.write(0x21D, true);
 		break;
 
 	case 0x219:
-		_dialog2.write(0x219, false);
-		_dialog2.write(0x220, true);
+		local._dialog2.write(0x219, false);
+		local._dialog2.write(0x220, true);
 		break;
 
 	case 0x21A:
-		_dialog2.write(0x21A, false);
-		_dialog2.write(0x223, true);
+		local._dialog2.write(0x21A, false);
+		local._dialog2.write(0x223, true);
 		break;
 
 	case 0x21B:
-		_dialog2.write(0x21B, false);
-		_dialog2.write(0x224, true);
+		local._dialog2.write(0x21B, false);
+		local._dialog2.write(0x224, true);
 		break;
 
 	case 0x21D:
-		_dialog2.write(0x21D, false);
-		_dialog2.write(0x227, true);
+		local._dialog2.write(0x21D, false);
+		local._dialog2.write(0x227, true);
 		break;
 
 	case 0x220:
-		_dialog2.write(0x220, false);
-		_dialog2.write(0x22A, true);
+		local._dialog2.write(0x220, false);
+		local._dialog2.write(0x22A, true);
 		break;
 
 	case 0x223:
-		_dialog2.write(0x223, false);
-		_dialog2.write(0x22D, true);
+		local._dialog2.write(0x223, false);
+		local._dialog2.write(0x22D, true);
 		break;
 
 	case 0x224:
-		_dialog2.write(0x224, false);
-		_dialog2.write(0x230, true);
+		local._dialog2.write(0x224, false);
+		local._dialog2.write(0x230, true);
 		break;
 
 	case 0x227:
-		_dialog2.write(0x227, false);
+		local._dialog2.write(0x227, false);
 		break;
 
 	case 0x22A:
-		_dialog2.write(0x22A, false);
+		local._dialog2.write(0x22A, false);
 		break;
 
 	case 0x22D:
-		_dialog2.write(0x22D, false);
+		local._dialog2.write(0x22D, false);
 		break;
 
 	case 0x230:
-		_dialog2.write(0x230, false);
+		local._dialog2.write(0x230, false);
 		break;
 
 	case 0x21C:
@@ -291,46 +250,46 @@ void Scene402::handleConversation2() {
 		case 1:
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_scene->_sequences.addTimer(1, 100);
-			_talkTimer = 180;
+			local._talkTimer = 180;
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E7));
 			_scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E8));
-			_bartenderCurrentQuestion = 7;
+			local._bartenderCurrentQuestion = 7;
 			break;
 
 		case 2:
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_scene->_sequences.addTimer(1, 100);
-			_talkTimer = 180;
+			local._talkTimer = 180;
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E9));
 			_scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EA));
-			_bartenderCurrentQuestion = 8;
+			local._bartenderCurrentQuestion = 8;
 			break;
 
 		case 3:
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_scene->_sequences.addTimer(1, 100);
-			_talkTimer = 150;
+			local._talkTimer = 150;
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EB));
-			_bartenderCurrentQuestion = 9;
+			local._bartenderCurrentQuestion = 9;
 			break;
 
 		default:
 			break;
 		}
-		_dialog2.start();
+		local._dialog2.start();
 	} else {
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.add(Common::Point(208, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1FD));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1120;
+		local._talkTimer = 1120;
 	}
 }
 
-void Scene402::handleConversation3() {
+static void handleConversation3() {
 	switch (_action._activeAction._verbId) {
 	case 0x233:
 	case 0x234:
@@ -342,7 +301,7 @@ void Scene402::handleConversation3() {
 		_scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1ED));
 		_scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EE));
 		setDialogNode(4);
-		_bartenderCurrentQuestion = 2;
+		local._bartenderCurrentQuestion = 2;
 		break;
 
 	case 0x237:
@@ -350,7 +309,7 @@ void Scene402::handleConversation3() {
 		_scene->_kernelMessages.add(Common::Point(208, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1FD));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1120;
+		local._talkTimer = 1120;
 		setDialogNode(0);
 		break;
 
@@ -359,7 +318,7 @@ void Scene402::handleConversation3() {
 	}
 }
 
-void Scene402::handleConversation4() {
+static void handleConversation4() {
 	switch (_action._activeAction._verbId) {
 	case 0x238:
 		_scene->_kernelMessages.reset();
@@ -370,21 +329,21 @@ void Scene402::handleConversation4() {
 		_scene->_kernelMessages.add(Common::Point(200, 41), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F2));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1100;
-		_dialog4.write(0x238, false);
-		_bartenderMode = 22;
+		local._talkTimer = 1100;
+		local._dialog4.write(0x238, false);
+		local._bartenderMode = 22;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(100, 95);
-		_refuseAlienLiquor = true;
+		local._refuseAlienLiquor = true;
 		break;
 
 	case 0x239:
 		_game._player._stepEnabled = false;
-		_roxMode = 21;
+		local._roxMode = 21;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 92);
 		_scene->_userInterface.setup(kInputBuildingSentences);
-		_conversationFl = false;
+		local._conversationFl = false;
 		break;
 
 	case 0x23A:
@@ -392,15 +351,15 @@ void Scene402::handleConversation4() {
 		_game._player._stepEnabled = false;
 		_scene->_kernelMessages.add(Common::Point(193, 27), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F4));
 		_scene->_kernelMessages.add(Common::Point(230, 41), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F5));
-		_dialog4.write(0x23A, false);
+		local._dialog4.write(0x23A, false);
 		_globals[kHasSaidTimer] = true;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1100;
-		_bartenderMode = 22;
+		local._talkTimer = 1100;
+		local._bartenderMode = 22;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(100, 95);
-		_refuseAlienLiquor = true;
+		local._refuseAlienLiquor = true;
 		break;
 
 	case 0x23D:
@@ -408,15 +367,15 @@ void Scene402::handleConversation4() {
 		_game._player._stepEnabled = false;
 		_scene->_kernelMessages.add(Common::Point(153, 27), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F6));
 		_scene->_kernelMessages.add(Common::Point(230, 41), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F7));
-		_dialog4.write(0x23D, false);
+		local._dialog4.write(0x23D, false);
 		_globals[kHasSaidBinocs] = true;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1100;
-		_bartenderMode = 22;
+		local._talkTimer = 1100;
+		local._bartenderMode = 22;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(100, 95);
-		_refuseAlienLiquor = true;
+		local._refuseAlienLiquor = true;
 		break;
 
 	case 0x23E:
@@ -424,13 +383,13 @@ void Scene402::handleConversation4() {
 		setDialogNode(0);
 		_game._player._stepEnabled = false;
 		_scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1F8));
-		_bartenderMode = 22;
+		local._bartenderMode = 22;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1050;
+		local._talkTimer = 1050;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(50, 95);
-		_refuseAlienLiquor = true;
+		local._refuseAlienLiquor = true;
 		break;
 
 	default:
@@ -438,7 +397,7 @@ void Scene402::handleConversation4() {
 	}
 }
 
-void Scene402::handleDialogs() {
+static void handleDialogs() {
 	if (_game._trigger == 0) {
 		_scene->_kernelMessages.reset();
 		_game._player._stepEnabled = false;
@@ -455,7 +414,7 @@ void Scene402::handleDialogs() {
 		}
 	} else if (_game._trigger == 120) {
 		_game._player._stepEnabled = true;
-		switch (_bartenderDialogNode) {
+		switch (local._bartenderDialogNode) {
 		case 1:
 			handleConversation1();
 			break;
@@ -478,7 +437,7 @@ void Scene402::handleDialogs() {
 	}
 }
 
-void Scene402::enter() {
+static void room_402_init() {
 	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('n', -1));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 2));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
@@ -506,18 +465,18 @@ void Scene402::enter() {
 	if (_scene->_priorSceneId == 401) {
 		_game._player._playerPos = Common::Point(160, 150);
 		_game._player._facing = FACING_NORTH;
-		_roxOnStool = false;
-		_bartenderDialogNode = 1;
-		_conversationFl = false;
+		local._roxOnStool = false;
+		local._bartenderDialogNode = 1;
+		local._conversationFl = false;
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(160, 150);
 		_game._player._facing = FACING_NORTH;
 		_game._objects.addToInventory(OBJ_CREDIT_CHIP);
 		_game._objects.addToInventory(OBJ_BINOCULARS);
 		_game._objects.addToInventory(OBJ_TIMER_MODULE);
-		_roxOnStool = false;
-		_bartenderDialogNode = 1;
-		_conversationFl = false;
+		local._roxOnStool = false;
+		local._bartenderDialogNode = 1;
+		local._conversationFl = false;
 	}
 
 	_game.loadQuoteSet(0x1D7, 0x1D8, 0x1D9, 0x1DA, 0x1DB, 0x1DC, 0x1DD, 0x1DE, 0x1DF, 0x1E2, 0x1E3, 0x1E6, 0x1E5, 0x1E7,
@@ -532,63 +491,63 @@ void Scene402::enter() {
 	_vm->_palette->setEntry(252, 38, 34, 25);
 	_vm->_palette->setEntry(253, 45, 41, 35);
 
-	_dialog1.setup(0x60, 0x214, 0x215, 0x237, 0);
-	_dialog2.setup(0x61, 0x216, 0x219, 0x21A, 0x21B, 0x21D, 0x220, 0x223, 0x224, 0x227, 0x22A, 0x22D, 0x230, 0x21C, 0);
-	_dialog3.setup(0x62, 0x233, 0x234, 0x235, 0x236, 0x237, -1);
-	_dialog4.setup(0x63, 0x238, 0x239, 0x23A, 0x23D, 0x23E, 0);
+	local._dialog1.setup(0x60, 0x214, 0x215, 0x237, 0);
+	local._dialog2.setup(0x61, 0x216, 0x219, 0x21A, 0x21B, 0x21D, 0x220, 0x223, 0x224, 0x227, 0x22A, 0x22D, 0x230, 0x21C, 0);
+	local._dialog3.setup(0x62, 0x233, 0x234, 0x235, 0x236, 0x237, -1);
+	local._dialog4.setup(0x63, 0x238, 0x239, 0x23A, 0x23D, 0x23E, 0);
 
 	if (!_game._visitedScenes._sceneRevisited) {
-		_dialog2.set(0x61, 0x216, 0x219, 0x21A, 0x21B, 0x21C, 0);
-		_dialog4.set(0x63, 0x238, 0x23E, 0);
-		_dialog1.set(0x60, 0x214, 0x215, 0x237, 0);
+		local._dialog2.set(0x61, 0x216, 0x219, 0x21A, 0x21B, 0x21C, 0);
+		local._dialog4.set(0x63, 0x238, 0x23E, 0);
+		local._dialog1.set(0x60, 0x214, 0x215, 0x237, 0);
 	}
 
 	if (_game._objects.isInInventory(OBJ_CREDIT_CHIP))
-		_dialog4.write(0x239, true);
+		local._dialog4.write(0x239, true);
 	else
-		_dialog4.write(0x239, false);
+		local._dialog4.write(0x239, false);
 
 	if (_game._objects.isInInventory(OBJ_BINOCULARS) && !_globals[kHasSaidBinocs])
-		_dialog4.write(0x23D, true);
+		local._dialog4.write(0x23D, true);
 	else
-		_dialog4.write(0x23D, false);
+		local._dialog4.write(0x23D, false);
 
 	if (_game._objects.isInInventory(OBJ_TIMER_MODULE) && !_globals[kHasSaidTimer])
-		_dialog4.write(0x23A, true);
+		local._dialog4.write(0x23A, true);
 	else
-		_dialog4.write(0x23A, false);
+		local._dialog4.write(0x23A, false);
 
-	if (_dialog2.read(0) <= 1)
-		_dialog1.write(0x214, false);
+	if (local._dialog2.read(0) <= 1)
+		local._dialog1.write(0x214, false);
 
-	if (_conversationFl) {
-		switch (_bartenderDialogNode) {
+	if (local._conversationFl) {
+		switch (local._bartenderDialogNode) {
 		case 0:
 			_scene->_userInterface.setup(kInputBuildingSentences);
-			_bartenderDialogNode = 1;
+			local._bartenderDialogNode = 1;
 			break;
 
 		case 1:
-			_dialog1.start();
+			local._dialog1.start();
 			break;
 
 		case 2:
-			_dialog2.start();
+			local._dialog2.start();
 			break;
 
 		case 3:
-			_dialog3.start();
+			local._dialog3.start();
 			break;
 
 		case 4:
-			_dialog4.start();
+			local._dialog4.start();
 			break;
 
 		default:
 			break;
 		}
 
-		switch (_bartenderCurrentQuestion) {
+		switch (local._bartenderCurrentQuestion) {
 		case 1:
 			_scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EC));
 			break;
@@ -638,33 +597,33 @@ void Scene402::enter() {
 		}
 	}
 
-	_firstTalkToGirlInChair = false;
-	_lightOn = false;
-	_blowingSmoke = false;
-	_leftWomanMoving = false;
-	_rightWomanMoving = false;
-	_ginnyLooking = false;
-	_beatCounter = 0;
-	_waitingGinnyMove = false;
-	_bigBeatFl = true;
-	_bartenderHandsHips = false;
-	_bartenderSteady = true;
-	_bartenderLooksLeft = false;
-	_activeTeleporter = false;
-	_activeArrows = false;
-	_activeArrow1 = false;
-	_activeArrow2 = false;
-	_activeArrow3 = false;
-	_cutSceneReady = false;
-	_cutSceneNeeded = false;
-	_helgaReady = true;
-	_bartenderReady = true;
-	_drinkTimer = 0;
-	_bartenderTalking = false;
-	_bartenderCalled = false;
-	_helgaTalkMode = 0;
-	_rexMode = 0;
-	_refuseAlienLiquor = false;
+	local._firstTalkToGirlInChair = false;
+	local._lightOn = false;
+	local._blowingSmoke = false;
+	local._leftWomanMoving = false;
+	local._rightWomanMoving = false;
+	local._ginnyLooking = false;
+	local._beatCounter = 0;
+	local._waitingGinnyMove = false;
+	local._bigBeatFl = true;
+	local._bartenderHandsHips = false;
+	local._bartenderSteady = true;
+	local._bartenderLooksLeft = false;
+	local._activeTeleporter = false;
+	local._activeArrows = false;
+	local._activeArrow1 = false;
+	local._activeArrow2 = false;
+	local._activeArrow3 = false;
+	local._cutSceneReady = false;
+	local._cutSceneNeeded = false;
+	local._helgaReady = true;
+	local._bartenderReady = true;
+	local._drinkTimer = 0;
+	local._bartenderTalking = false;
+	local._bartenderCalled = false;
+	local._helgaTalkMode = 0;
+	local._rexMode = 0;
+	local._refuseAlienLiquor = false;
 
 	_scene->loadAnimation(Resources::formatName(402, 'd', 1, EXT_AA, ""));
 	_scene->_animation[0]->_resetFlag = true;
@@ -707,16 +666,16 @@ void Scene402::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 7);
 	}
 
-	if (_roxOnStool) {
+	if (local._roxOnStool) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 11);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 		_game._player._visible = false;
 	}
 
-	sceneEntrySound();
+	section_4_music();
 }
 
-void Scene402::step() {
+static void room_402_daemon() {
 	if (_game._trigger == 104) {
 		_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
 		_game._player._visible = true;
@@ -726,56 +685,56 @@ void Scene402::step() {
 		_game._player._stepEnabled = true;
 	}
 
-	if ((_vm->getRandomNumber(1, 1500) == 1) && (!_activeTeleporter) && (_game._player._playerPos.x < 150)) {
+	if ((_vm->getRandomNumber(1, 1500) == 1) && (!local._activeTeleporter) && (_game._player._playerPos.x < 150)) {
 		_vm->_sound->command(30);
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 13, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 11);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 48);
-		_activeTeleporter = true;
+		local._activeTeleporter = true;
 		_globals[kSomeoneHasExploded] = true;
 	}
 
 	if (_game._trigger == 48)
-		_activeTeleporter = false;
+		local._activeTeleporter = false;
 
 	if (_game._trigger == 100) {
-		_bartenderReady = false;
-		if (_bartenderHandsHips) {
+		local._bartenderReady = false;
+		if (local._bartenderHandsHips) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-			_bartenderHandsHips = false;
-		} else if (_bartenderLooksLeft) {
+			local._bartenderHandsHips = false;
+		} else if (local._bartenderLooksLeft) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[11]);
-			_bartenderLooksLeft = false;
-		} else if (_bartenderSteady) {
+			local._bartenderLooksLeft = false;
+		} else if (local._bartenderSteady) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
-			_bartenderSteady = false;
+			local._bartenderSteady = false;
 		}
 
-		if (!_bartenderTalking) {
+		if (!local._bartenderTalking) {
 			_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 0, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 3, 4);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
 			int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
-			_bartenderTalking = true;
-			if (_talkTimer > 1000)
-				_scene->_sequences.addTimer(_talkTimer - 1000, 101);
+			local._bartenderTalking = true;
+			if (local._talkTimer > 1000)
+				_scene->_sequences.addTimer(local._talkTimer - 1000, 101);
 			else
-				_scene->_sequences.addTimer(_talkTimer, 101);
+				_scene->_sequences.addTimer(local._talkTimer, 101);
 		}
 	}
 
-	if ((_game._trigger == 101) && _bartenderTalking) {
+	if ((_game._trigger == 101) && local._bartenderTalking) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		_bartenderSteady = true;
-		_bartenderTalking = false;
-		if (_talkTimer < 1000)
-			_bartenderReady = true;
+		local._bartenderSteady = true;
+		local._bartenderTalking = false;
+		if (local._talkTimer < 1000)
+			local._bartenderReady = true;
 	}
 
 	if (_game._trigger == 28)
@@ -794,7 +753,7 @@ void Scene402::step() {
 	case 93:
 	{
 		int seqIdx = _globals._sequenceIndexes[7];
-		switch (_roxMode) {
+		switch (local._roxMode) {
 		case 20:
 			_vm->_sound->command(57);
 			_scene->_sequences.remove(_globals._sequenceIndexes[15]);
@@ -825,11 +784,11 @@ void Scene402::step() {
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], seqIdx);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 94);
 
-		if (_roxMode == 21) {
+		if (local._roxMode == 21) {
 			if (_game._objects.isInInventory(OBJ_CREDIT_CHIP))
 				_game._objects.setRoom(OBJ_CREDIT_CHIP, NOWHERE);
 
-			_bartenderMode = 20;
+			local._bartenderMode = 20;
 			_scene->_sequences.addTimer(60, 95);
 		}
 	}
@@ -841,13 +800,13 @@ void Scene402::step() {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 11);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[6], seqIdx);
-		if (_roxMode == 22) {
+		if (local._roxMode == 22) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(230, 56), 0x1110, 32, 0, 120, _game.getQuote(0x23F));
-			_bartenderMode = 21;
+			local._bartenderMode = 21;
 			_globals[kHasPurchased] = true;
 			_scene->_sequences.addTimer(140, 95);
-		} else if (_roxMode == 20)
+		} else if (local._roxMode == 20)
 			_game._player._stepEnabled = true;
 
 	}
@@ -859,22 +818,22 @@ void Scene402::step() {
 
 	switch (_game._trigger) {
 	case 95:
-		_bartenderReady = false;
+		local._bartenderReady = false;
 		_game._player._stepEnabled = false;
-		if (_bartenderHandsHips || _bartenderTalking) {
+		if (local._bartenderHandsHips || local._bartenderTalking) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-			_bartenderHandsHips = false;
-			_bartenderTalking = false;
+			local._bartenderHandsHips = false;
+			local._bartenderTalking = false;
 		}
 
-		if (_bartenderLooksLeft) {
+		if (local._bartenderLooksLeft) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[11]);
-			_bartenderLooksLeft = false;
+			local._bartenderLooksLeft = false;
 		}
 
-		if (_bartenderSteady) {
+		if (local._bartenderSteady) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
-			_bartenderSteady = false;
+			local._bartenderSteady = false;
 		}
 		_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 10, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 1, 4);
@@ -896,7 +855,7 @@ void Scene402::step() {
 	case 97:
 	{
 		int seqIdx = _globals._sequenceIndexes[12];
-		switch (_bartenderMode) {
+		switch (local._bartenderMode) {
 		case 20:
 			_scene->_sequences.remove(_globals._sequenceIndexes[15]);
 			break;
@@ -939,21 +898,21 @@ void Scene402::step() {
 	{
 		int seqIdx = _globals._sequenceIndexes[12];
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
-		_bartenderSteady = true;
+		local._bartenderSteady = true;
 		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], seqIdx);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		if (_bartenderMode == 20) {
+		if (local._bartenderMode == 20) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(210, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1F3));
 			_scene->_sequences.addTimer(5, 100);
-			_talkTimer = 180;
-			_roxMode = 22;
+			local._talkTimer = 180;
+			local._roxMode = 22;
 			_scene->_sequences.addTimer(65, 92);
-		} else if ((_bartenderMode == 21) || (_bartenderMode == 22)) {
+		} else if ((local._bartenderMode == 21) || (local._bartenderMode == 22)) {
 			_game._player._stepEnabled = true;
-			_bartenderReady = true;
+			local._bartenderReady = true;
 		}
 
 	}
@@ -965,18 +924,18 @@ void Scene402::step() {
 
 	switch (_game._trigger) {
 	case 86:
-		_bartenderReady = false;
+		local._bartenderReady = false;
 		_game._player._stepEnabled = false;
-		if ((_bartenderHandsHips) || (_bartenderTalking)) {
+		if ((local._bartenderHandsHips) || (local._bartenderTalking)) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-			_bartenderHandsHips = false;
-			_bartenderTalking = false;
-		} else if (_bartenderLooksLeft) {
+			local._bartenderHandsHips = false;
+			local._bartenderTalking = false;
+		} else if (local._bartenderLooksLeft) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[11]);
-			_bartenderLooksLeft = false;
-		} else if (_bartenderSteady) {
+			local._bartenderLooksLeft = false;
+		} else if (local._bartenderSteady) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
-			_bartenderSteady = false;
+			local._bartenderSteady = false;
 		}
 		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 9);
@@ -1026,9 +985,9 @@ void Scene402::step() {
 		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		_bartenderSteady = true;
+		local._bartenderSteady = true;
 		_game._player._stepEnabled = true;
-		_bartenderReady = true;
+		local._bartenderReady = true;
 	}
 	break;
 
@@ -1036,12 +995,12 @@ void Scene402::step() {
 		break;
 	}
 
-	if (!_waitingGinnyMove && !_ginnyLooking) {
-		_waitingGinnyMove = true;
-		++_beatCounter;
-		if (_beatCounter >= 20) {
-			_ginnyLooking = true;
-			_beatCounter = 0;
+	if (!local._waitingGinnyMove && !local._ginnyLooking) {
+		local._waitingGinnyMove = true;
+		++local._beatCounter;
+		if (local._beatCounter >= 20) {
+			local._ginnyLooking = true;
+			local._beatCounter = 0;
 			_scene->_sequences.addTimer(60, 54);
 		} else {
 			_scene->_sequences.addTimer(30, 75);
@@ -1051,9 +1010,9 @@ void Scene402::step() {
 	switch (_game._trigger) {
 	case 75:
 		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
-		_bigBeatFl = !_bigBeatFl;
+		local._bigBeatFl = !local._bigBeatFl;
 
-		if (_bigBeatFl) {
+		if (local._bigBeatFl) {
 			_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 5);
 			_scene->_sequences.addTimer(8, 130);
 		} else {
@@ -1082,20 +1041,20 @@ void Scene402::step() {
 		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 		_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
-		_waitingGinnyMove = false;
+		local._waitingGinnyMove = false;
 		break;
 
 	default:
 		break;
 	}
 
-	if ((_game._trigger == 54) && _ginnyLooking) {
-		++_beatCounter;
-		if (_beatCounter >= 10) {
-			_ginnyLooking = false;
-			_waitingGinnyMove = false;
-			_beatCounter = 0;
-			_bigBeatFl = true;
+	if ((_game._trigger == 54) && local._ginnyLooking) {
+		++local._beatCounter;
+		if (local._beatCounter >= 10) {
+			local._ginnyLooking = false;
+			local._waitingGinnyMove = false;
+			local._beatCounter = 0;
+			local._bigBeatFl = true;
 		} else {
 			_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 			_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, _vm->getRandomNumber(1, 4));
@@ -1104,17 +1063,17 @@ void Scene402::step() {
 		}
 	}
 
-	if (_bartenderReady) {
+	if (local._bartenderReady) {
 		if (_vm->getRandomNumber(1, 250) == 1) {
-			if (_bartenderLooksLeft) {
+			if (local._bartenderLooksLeft) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[11]);
-				_bartenderLooksLeft = false;
-			} else if (_bartenderHandsHips) {
+				local._bartenderLooksLeft = false;
+			} else if (local._bartenderHandsHips) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-				_bartenderHandsHips = false;
-			} else if (_bartenderSteady) {
+				local._bartenderHandsHips = false;
+			} else if (local._bartenderSteady) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[9]);
-				_bartenderSteady = false;
+				local._bartenderSteady = false;
 			}
 
 			switch (_vm->getRandomNumber(1, 3)) {
@@ -1124,7 +1083,7 @@ void Scene402::step() {
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
 				int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
-				_bartenderHandsHips = true;
+				local._bartenderHandsHips = true;
 			}
 			break;
 
@@ -1134,7 +1093,7 @@ void Scene402::step() {
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 8);
 				int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[11], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
-				_bartenderLooksLeft = true;
+				local._bartenderLooksLeft = true;
 			}
 			break;
 
@@ -1144,7 +1103,7 @@ void Scene402::step() {
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
 				int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
-				_bartenderSteady = true;
+				local._bartenderSteady = true;
 			}
 			break;
 
@@ -1161,11 +1120,11 @@ void Scene402::step() {
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[6], seqIdx);
 		if (!_globals[kBeenThruHelgaScene]) {
 			_game._player._stepEnabled = false;
-			_cutSceneNeeded = true;
+			local._cutSceneNeeded = true;
 		} else {
 			_game._player._stepEnabled = true;
 		}
-		_roxOnStool = true;
+		local._roxOnStool = true;
 	}
 
 	switch (_game._trigger) {
@@ -1211,29 +1170,29 @@ void Scene402::step() {
 		break;
 	}
 
-	if (_cutSceneNeeded && _cutSceneReady) {
-		_cutSceneNeeded = false;
+	if (local._cutSceneNeeded && local._cutSceneReady) {
+		local._cutSceneNeeded = false;
 		_scene->_sequences.addTimer(20, 55);
-		_helgaReady = false;
-		_bartenderReady = false;
+		local._helgaReady = false;
+		local._bartenderReady = false;
 	}
 
 	if (_vm->getRandomNumber(1, 25) == 1) {
-		if (_lightOn) {
+		if (local._lightOn) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[0]);
-			_lightOn = false;
+			local._lightOn = false;
 		} else {
 			_globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
-			_lightOn = true;
+			local._lightOn = true;
 		}
 	}
 
-	if (!_blowingSmoke && (_vm->getRandomNumber(1, 300) == 1)) {
+	if (!local._blowingSmoke && (_vm->getRandomNumber(1, 300) == 1)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 14);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 30);
-		_blowingSmoke = true;
+		local._blowingSmoke = true;
 	}
 
 	switch (_game._trigger) {
@@ -1245,27 +1204,27 @@ void Scene402::step() {
 		break;
 
 	case 31:
-		_blowingSmoke = false;
+		local._blowingSmoke = false;
 		break;
 
 	default:
 		break;
 	}
 
-	if (!_leftWomanMoving) {
+	if (!local._leftWomanMoving) {
 		if (_vm->getRandomNumber(1, 1000) == 1) {
 			switch (_vm->getRandomNumber(1, 2)) {
 			case 1:
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 33);
-				_leftWomanMoving = true;
+				local._leftWomanMoving = true;
 				break;
 
 			case 2:
 				_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 				_scene->_sequences.addTimer(12, 35);
-				_leftWomanMoving = true;
+				local._leftWomanMoving = true;
 				break;
 
 			default:
@@ -1305,46 +1264,46 @@ void Scene402::step() {
 
 	case 37:
 		_scene->_sequences.remove(_globals._sequenceIndexes[2]);
-		_leftWomanMoving = false;
+		local._leftWomanMoving = false;
 		break;
 
 	case 38:
-		_leftWomanMoving = false;
+		local._leftWomanMoving = false;
 		break;
 
 	default:
 		break;
 	}
 
-	if (!_rightWomanMoving) {
+	if (!local._rightWomanMoving) {
 		if (_vm->getRandomNumber(1, 300) == 1) {
 			switch (_vm->getRandomNumber(1, 4)) {
 			case 1:
 				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
-				_rightWomanMoving = true;
+				local._rightWomanMoving = true;
 				break;
 
 			case 2:
 				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
-				_rightWomanMoving = true;
+				local._rightWomanMoving = true;
 				break;
 
 			case 3:
 				_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
-				_rightWomanMoving = true;
+				local._rightWomanMoving = true;
 				break;
 
 			case 4:
 				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 3, 4);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
-				_rightWomanMoving = true;
+				local._rightWomanMoving = true;
 				break;
 
 			default:
@@ -1354,7 +1313,7 @@ void Scene402::step() {
 	}
 
 	if (_game._trigger == 32)
-		_rightWomanMoving = false;
+		local._rightWomanMoving = false;
 
 	if (_scene->_animation[0]->getCurrentFrame() == 1) {
 		switch (_vm->getRandomNumber(1, 50)) {
@@ -1376,13 +1335,13 @@ void Scene402::step() {
 		}
 	}
 
-	if ((_scene->_animation[0]->getCurrentFrame() == 4) && (_drinkTimer < 10)) {
-		++_drinkTimer;
+	if ((_scene->_animation[0]->getCurrentFrame() == 4) && (local._drinkTimer < 10)) {
+		++local._drinkTimer;
 		_scene->_animation[0]->setCurrentFrame(3);
 	}
 
-	if (_drinkTimer == 10) {
-		_drinkTimer = 0;
+	if (local._drinkTimer == 10) {
+		local._drinkTimer = 0;
 		_scene->_animation[0]->setCurrentFrame(4);
 		_scene->_animation[0]->_currentFrame = 5;
 	}
@@ -1437,21 +1396,21 @@ void Scene402::step() {
 
 	switch (_game._trigger) {
 	case 55:
-		if (_bartenderHandsHips) {
+		if (local._bartenderHandsHips) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-			_bartenderHandsHips = false;
+			local._bartenderHandsHips = false;
 			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 			int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
-			_bartenderSteady = true;
+			local._bartenderSteady = true;
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		} else if (_bartenderLooksLeft) {
+		} else if (local._bartenderLooksLeft) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[11]);
-			_bartenderLooksLeft = false;
+			local._bartenderLooksLeft = false;
 			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 			int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
-			_bartenderSteady = true;
+			local._bartenderSteady = true;
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
 		}
 		_game._player._stepEnabled = false;
@@ -1549,7 +1508,7 @@ void Scene402::step() {
 		_scene->_kernelMessages.add(Common::Point(198, 41), 0xFDFC, 0, 0, 130, _game.getQuote(0x1E1));
 		_scene->_sequences.addTimer(150, 65);
 		_scene->_sequences.addTimer(1, 100);
-		_talkTimer = 1130;
+		local._talkTimer = 1130;
 		break;
 
 	case 65:
@@ -1623,7 +1582,7 @@ void Scene402::step() {
 		_scene->_kernelMessages.add(Common::Point(168, 33), 0xFBFA, 0, 0, 180, _game.getQuote(0x205));
 		_scene->_kernelMessages.add(Common::Point(151, 47), 0xFBFA, 0, 0, 180, _game.getQuote(0x206));
 		if (!_game._objects.isInInventory(OBJ_REPAIR_LIST))
-			_activeArrows = true;
+			local._activeArrows = true;
 		break;
 
 	case 72:
@@ -1639,25 +1598,25 @@ void Scene402::step() {
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.add(Common::Point(177, 33), 0xFBFA, 0, 0, 150, _game.getQuote(0x207));
 		_scene->_kernelMessages.add(Common::Point(172, 47), 0xFBFA, 0, 0, 150, _game.getQuote(0x208));
-		_bartenderSteady = true;
+		local._bartenderSteady = true;
 		_game._player._stepEnabled = true;
-		_helgaReady = true;
-		_bartenderReady = true;
+		local._helgaReady = true;
+		local._bartenderReady = true;
 		_globals[kBeenThruHelgaScene] = true;
-		_activeArrows = false;
+		local._activeArrows = false;
 		break;
 
 	default:
 		break;
 	}
 
-	if (_helgaReady) {
+	if (local._helgaReady) {
 		int rndVal = _vm->getRandomNumber(1, 1000);
 		if (rndVal < 6)
 			switch (rndVal) {
 			case 1:
-				_cutSceneReady = false;
-				_helgaReady = false;
+				local._cutSceneReady = false;
+				local._helgaReady = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 				_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 2, 5);
@@ -1666,8 +1625,8 @@ void Scene402::step() {
 				break;
 
 			case 2:
-				_cutSceneReady = false;
-				_helgaReady = false;
+				local._cutSceneReady = false;
+				local._helgaReady = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 				_globals._sequenceIndexes[13] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[13], false, 15, 2, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 11, 13);
@@ -1676,8 +1635,8 @@ void Scene402::step() {
 				break;
 
 			case 3:
-				_cutSceneReady = false;
-				_helgaReady = false;
+				local._cutSceneReady = false;
+				local._helgaReady = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 				_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 10, 11);
@@ -1686,8 +1645,8 @@ void Scene402::step() {
 				break;
 
 			case 4:
-				_cutSceneReady = false;
-				_helgaReady = false;
+				local._cutSceneReady = false;
+				local._helgaReady = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 				_globals._sequenceIndexes[13] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[13], false, 15, 2, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 14, 15);
@@ -1696,8 +1655,8 @@ void Scene402::step() {
 				break;
 
 			case 5:
-				_cutSceneReady = false;
-				_helgaReady = false;
+				local._cutSceneReady = false;
+				local._helgaReady = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 				_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 16, 19);
@@ -1731,10 +1690,10 @@ void Scene402::step() {
 		_globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
-		_cutSceneReady = true;
+		local._cutSceneReady = true;
 
-		if (!_cutSceneNeeded)
-			_helgaReady = true;
+		if (!local._cutSceneNeeded)
+			local._helgaReady = true;
 	}
 
 	if (_game._trigger == 82) {
@@ -1774,9 +1733,9 @@ void Scene402::step() {
 		_globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
-		_cutSceneReady = true;
-		if (!_cutSceneNeeded)
-			_helgaReady = true;
+		local._cutSceneReady = true;
+		if (!local._cutSceneNeeded)
+			local._helgaReady = true;
 	}
 
 	if (_game._trigger == 102) {
@@ -1788,7 +1747,7 @@ void Scene402::step() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 103);
 	} else if (_game._trigger == 103) {
 		_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
-		_roxOnStool = false;
+		local._roxOnStool = false;
 		_game._player._facing = FACING_SOUTH;
 		_game._player.selectSeries();
 		_game._player._visible = true;
@@ -1796,26 +1755,26 @@ void Scene402::step() {
 		_game._player._readyToWalk = true;
 	}
 
-	if (_activeArrows) {
-		if (!_activeArrow1) {
+	if (local._activeArrows) {
+		if (!local._activeArrow1) {
 			_globals._sequenceIndexes[17] = _scene->_sequences.startCycle(_globals._spriteIndexes[17], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[17], 1);
 			_scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 49);
-			_activeArrow1 = true;
+			local._activeArrow1 = true;
 		}
 
-		if (!_activeArrow2) {
+		if (!local._activeArrow2) {
 			_globals._sequenceIndexes[18] = _scene->_sequences.startCycle(_globals._spriteIndexes[18], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[18], 1);
 			_scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 50);
-			_activeArrow2 = true;
+			local._activeArrow2 = true;
 		}
 
-		if (!_activeArrow3) {
+		if (!local._activeArrow3) {
 			_globals._sequenceIndexes[19] = _scene->_sequences.startCycle(_globals._spriteIndexes[19], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[19], 1);
 			_scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 51);
-			_activeArrow3 = true;
+			local._activeArrow3 = true;
 		}
 	}
 
@@ -1825,7 +1784,7 @@ void Scene402::step() {
 	}
 
 	if (_game._trigger == 45)
-		_activeArrow1 = false;
+		local._activeArrow1 = false;
 
 	if (_game._trigger == 50) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[18]);
@@ -1833,7 +1792,7 @@ void Scene402::step() {
 	}
 
 	if (_game._trigger == 46)
-		_activeArrow2 = false;
+		local._activeArrow2 = false;
 
 	if (_game._trigger == 51) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[19]);
@@ -1841,26 +1800,26 @@ void Scene402::step() {
 	}
 
 	if (_game._trigger == 47)
-		_activeArrow3 = false;
+		local._activeArrow3 = false;
 }
 
-void Scene402::preActions() {
+static void room_402_pre_parser() {
 	if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && (_game._player._prepareWalkPos.x != 248))
 		_game._player.walk(Common::Point(232, 112), FACING_EAST);
 
 	if (_action.isAction(VERB_WALKTO, NOUN_WOMAN_ON_BALCONY))
 		_game._player._needToWalk = _game._player._readyToWalk;
 
-	if (!_roxOnStool && _action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
+	if (!local._roxOnStool && _action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
 		_game._player.walk(Common::Point(246, 108), FACING_NORTH);
 
 	if (_action.isAction(VERB_TAKE))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_roxOnStool)
+	if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !local._roxOnStool)
 		_game._player._needToWalk = true;
 
-	if (_roxOnStool) {
+	if (local._roxOnStool) {
 		if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_BAR_STOOL) || _action.isAction(VERB_TALKTO))
 			_game._player._needToWalk = false;
 
@@ -1879,22 +1838,22 @@ void Scene402::preActions() {
 		}
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && !_roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
+	if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && !local._roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
 		_game._player.walk(Common::Point(191, 99), FACING_NORTHEAST);
 
-	if (_action.isAction(VERB_TALKTO, NOUN_BARTENDER) && !_roxOnStool)
+	if (_action.isAction(VERB_TALKTO, NOUN_BARTENDER) && !local._roxOnStool)
 		_game._player.walk(Common::Point(228, 83), FACING_SOUTH);
 
-	if (_action.isAction(VERB_TALKTO, NOUN_REPAIR_WOMAN) && !_roxOnStool)
+	if (_action.isAction(VERB_TALKTO, NOUN_REPAIR_WOMAN) && !local._roxOnStool)
 		_game._player.walk(Common::Point(208, 102), FACING_NORTHEAST);
 }
 
-void Scene402::actions() {
-	if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && _roxOnStool) {
+static void room_402_parser() {
+	if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && local._roxOnStool) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 77);
 		_game._player._needToWalk = false;
-	} else if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !_roxOnStool) {
+	} else if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !local._roxOnStool) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
@@ -1926,12 +1885,12 @@ void Scene402::actions() {
 		{
 			_game._player._stepEnabled = false;
 			int random = _vm->getRandomNumber(1, 3);
-			if (_helgaTalkMode == 0)
+			if (local._helgaTalkMode == 0)
 				random = 1;
 
 			int centerFlag;
 			Common::Point centerPos;
-			if (_roxOnStool) {
+			if (local._roxOnStool) {
 				centerFlag = 0;
 				centerPos = Common::Point(230, 56);
 			} else {
@@ -1962,10 +1921,10 @@ void Scene402::actions() {
 		break;
 
 		case 25:
-			switch (_helgaTalkMode) {
+			switch (local._helgaTalkMode) {
 			case 0:
 				_game._player._stepEnabled = false;
-				_helgaTalkMode = 1;
+				local._helgaTalkMode = 1;
 				_scene->_kernelMessages.add(Common::Point(177, 33), 0xFBFA, 0, 0, 130, _game.getQuote(0x209));
 				_scene->_kernelMessages.add(Common::Point(182, 47), 0xFBFA, 0, 0, 130, _game.getQuote(0x20A));
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -1974,7 +1933,7 @@ void Scene402::actions() {
 
 			case 1:
 				_game._player._stepEnabled = false;
-				_helgaTalkMode = 2;
+				local._helgaTalkMode = 2;
 				_scene->_kernelMessages.add(Common::Point(157, 47), 0xFBFA, 0, 0, 100, _game.getQuote(0x20B));
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(100, 28);
@@ -1982,7 +1941,7 @@ void Scene402::actions() {
 
 			case 2:
 				_game._player._stepEnabled = false;
-				_helgaTalkMode = 3;
+				local._helgaTalkMode = 3;
 				_scene->_kernelMessages.add(Common::Point(172, 47), 0xFBFA, 0, 0, 100, _game.getQuote(0x20C));
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(100, 28);
@@ -2000,13 +1959,13 @@ void Scene402::actions() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && !_firstTalkToGirlInChair) {
+	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && !local._firstTalkToGirlInChair) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1D7));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(150, 39);
 		_game._player._stepEnabled = false;
-		_firstTalkToGirlInChair = true;
-	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && _firstTalkToGirlInChair) {
+		local._firstTalkToGirlInChair = true;
+	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && local._firstTalkToGirlInChair) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1DB));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(150, 42);
@@ -2019,7 +1978,7 @@ void Scene402::actions() {
 	} else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && (_game._player._targetPos.x == 248)) {
 		_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 120, _game.getQuote(0x20D));
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x20E));
-	} else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && !_roxOnStool && (_game._player._targetPos.x != 248)) {
+	} else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && !local._roxOnStool && (_game._player._targetPos.x != 248)) {
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
@@ -2027,11 +1986,11 @@ void Scene402::actions() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && _roxOnStool) {
-		_roxMode = 20;
+	} else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && local._roxOnStool) {
+		local._roxMode = 20;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 92);
-	} else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !_roxOnStool) {
+	} else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !local._roxOnStool) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -2048,7 +2007,7 @@ void Scene402::actions() {
 		{
 			int centerFlag;
 			Common::Point centerPos;
-			if (_roxOnStool) {
+			if (local._roxOnStool) {
 				centerFlag = 0;
 				centerPos = Common::Point(230, 56);
 			} else {
@@ -2058,11 +2017,11 @@ void Scene402::actions() {
 
 			_game._player._stepEnabled = false;
 			int quoteId;
-			if (_bartenderCalled) {
+			if (local._bartenderCalled) {
 				quoteId = 0x210;
 			} else {
 				quoteId = 0x20F;
-				_bartenderCalled = true;
+				local._bartenderCalled = true;
 			}
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(centerPos, 0x1110, 32 | centerFlag, 0, 90, _game.getQuote(quoteId));
@@ -2074,76 +2033,76 @@ void Scene402::actions() {
 
 		case 29:
 			_scene->_kernelMessages.reset();
-			if (!_roxOnStool) {
+			if (!local._roxOnStool) {
 				if (_game._objects.isInRoom(OBJ_ALIEN_LIQUOR)) {
 					_scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, 120, _game.getQuote(0x1DF));
 					_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 					_scene->_sequences.addTimer(1, 100);
-					_talkTimer = 120;
-				} else if (_rexMode == 0) {
+					local._talkTimer = 120;
+				} else if (local._rexMode == 0) {
 					_scene->_kernelMessages.add(Common::Point(175, 13), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F9));
 					_scene->_kernelMessages.add(Common::Point(184, 27), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FA));
 					_scene->_kernelMessages.add(Common::Point(200, 41), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FB));
 					_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 					_scene->_sequences.addTimer(1, 100);
-					_talkTimer = 180;
-					_rexMode = 1;
-				} else if (_rexMode == 1) {
+					local._talkTimer = 180;
+					local._rexMode = 1;
+				} else if (local._rexMode == 1) {
 					_scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 120, _game.getQuote(0x1FC));
 					_game._player._stepEnabled = true;
 					_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 					_scene->_sequences.addTimer(1, 100);
-					_talkTimer = 120;
-					_rexMode = 3;
+					local._talkTimer = 120;
+					local._rexMode = 3;
 				} else {
 					_game._player._stepEnabled = true;
 				}
 			} else {
 				if (_game._objects.isInRoom(OBJ_ALIEN_LIQUOR)) {
-					if (!_refuseAlienLiquor) {
+					if (!local._refuseAlienLiquor) {
 						_scene->_kernelMessages.reset();
 						_scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E2));
 						_scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E3));
-						_bartenderCurrentQuestion = 10;
+						local._bartenderCurrentQuestion = 10;
 						_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 						_scene->_sequences.addTimer(1, 100);
-						_talkTimer = 120;
-						_conversationFl = true;
-						_bartenderDialogNode = 1;
-						if (_dialog2.read(0) <= 1)
-							_dialog1.write(0x214, false);
+						local._talkTimer = 120;
+						local._conversationFl = true;
+						local._bartenderDialogNode = 1;
+						if (local._dialog2.read(0) <= 1)
+							local._dialog1.write(0x214, false);
 
-						_dialog1.start();
+						local._dialog1.start();
 					} else {
 						_scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EF));
 						_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 						_scene->_sequences.addTimer(1, 100);
-						_talkTimer = 120;
-						_bartenderCurrentQuestion = 3;
-						_conversationFl = true;
-						_bartenderDialogNode = 1;
-						if (_dialog2.read(0) <= 1)
-							_dialog1.write(0x214, false);
-
-						_dialog1.start();
+						local._talkTimer = 120;
+						local._bartenderCurrentQuestion = 3;
+						local._conversationFl = true;
+						local._bartenderDialogNode = 1;
+						if (local._dialog2.read(0) <= 1)
+							local._dialog1.write(0x214, false);
+
+						local._dialog1.start();
 						_game._player._stepEnabled = true;
 					}
 				} else {
-					if (_rexMode == 0) {
+					if (local._rexMode == 0) {
 						_scene->_kernelMessages.add(Common::Point(175, 13), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F9));
 						_scene->_kernelMessages.add(Common::Point(184, 27), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FA));
 						_scene->_kernelMessages.add(Common::Point(200, 41), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FB));
 						_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 						_scene->_sequences.addTimer(1, 100);
-						_talkTimer = 180;
-						_rexMode = 1;
-					} else if (_rexMode == 1) {
+						local._talkTimer = 180;
+						local._rexMode = 1;
+					} else if (local._rexMode == 1) {
 						_scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 120, _game.getQuote(0x1FC));
 						_game._player._stepEnabled = true;
 						_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 						_scene->_sequences.addTimer(1, 100);
-						_talkTimer = 120;
-						_rexMode = 3;
+						local._talkTimer = 120;
+						local._rexMode = 3;
 					} else {
 						_game._player._stepEnabled = true;
 					}
@@ -2221,6 +2180,65 @@ void Scene402::actions() {
 	_action._inProgress = false;
 }
 
+void room_402_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._lightOn);
+	s.syncAsByte(local._blowingSmoke);
+	s.syncAsByte(local._leftWomanMoving);
+	s.syncAsByte(local._rightWomanMoving);
+	s.syncAsByte(local._firstTalkToGirlInChair);
+	s.syncAsByte(local._waitingGinnyMove);
+	s.syncAsByte(local._ginnyLooking);
+	s.syncAsByte(local._bigBeatFl);
+	s.syncAsByte(local._roxOnStool);
+	s.syncAsByte(local._bartenderSteady);
+	s.syncAsByte(local._bartenderHandsHips);
+	s.syncAsByte(local._bartenderLooksLeft);
+	s.syncAsByte(local._bartenderReady);
+	s.syncAsByte(local._bartenderTalking);
+	s.syncAsByte(local._bartenderCalled);
+	s.syncAsByte(local._conversationFl);
+	s.syncAsByte(local._activeTeleporter);
+	s.syncAsByte(local._activeArrows);
+	s.syncAsByte(local._activeArrow1);
+	s.syncAsByte(local._activeArrow2);
+	s.syncAsByte(local._activeArrow3);
+	s.syncAsByte(local._cutSceneReady);
+	s.syncAsByte(local._cutSceneNeeded);
+	s.syncAsByte(local._helgaReady);
+	s.syncAsByte(local._refuseAlienLiquor);
+
+	s.syncAsSint16LE(local._drinkTimer);
+	s.syncAsSint16LE(local._beatCounter);
+	s.syncAsSint16LE(local._bartenderMode);
+	s.syncAsSint16LE(local._bartenderDialogNode);
+	s.syncAsSint16LE(local._bartenderCurrentQuestion);
+	s.syncAsSint16LE(local._helgaTalkMode);
+	s.syncAsSint16LE(local._roxMode);
+	s.syncAsSint16LE(local._rexMode);
+	s.syncAsSint16LE(local._talkTimer);
+}
+
+void room_402_preload() {
+	room_init_code_pointer = room_402_init;
+	room_pre_parser_code_pointer = room_402_pre_parser;
+	room_parser_code_pointer = room_402_parser;
+	room_daemon_code_pointer = room_402_daemon;
+
+	section_4_walker();
+	section_4_interface();
+
+	_scene->addActiveVocab(NOUN_BARTENDER);
+	_scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
+	_scene->addActiveVocab(VERB_DRINK);
+	_scene->addActiveVocab(NOUN_BINOCULARS);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_CREDIT_CHIP);
+	_scene->addActiveVocab(VERB_TAKE);
+	_scene->addActiveVocab(NOUN_REPAIR_LIST);
+	_scene->addActiveVocab(VERB_LOOK_AT);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room405.cpp b/engines/mads/madsv2/nebular/rooms/room405.cpp
index 51188d3aa5f..f0fec555e5f 100644
--- a/engines/mads/madsv2/nebular/rooms/room405.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room405.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene405::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene405::enter() {
+static void room_405_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*ROXCL_8");
@@ -65,10 +65,10 @@ void Scene405::enter() {
 	}
 
 	_game.loadQuoteSet(0x24F, 0);
-	sceneEntrySound();
+	section_4_music();
 }
 
-void Scene405::step() {
+static void room_405_daemon() {
 	if (_game._trigger == 80) {
 		_scene->_sequences.addTimer(20, 81);
 		_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
@@ -108,7 +108,7 @@ void Scene405::step() {
 	}
 }
 
-void Scene405::preActions() {
+static void room_405_pre_parser() {
 	if (_action.isAction(VERB_TAKE))
 		_game._player._needToWalk = false;
 
@@ -122,7 +122,7 @@ void Scene405::preActions() {
 		_game._player.walk(Common::Point(212, 113), FACING_NORTH);
 }
 
-void Scene405::actions() {
+static void room_405_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR))
 		_scene->_nextSceneId = 413;
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_WIDE_DOOR) && _globals[kArmoryDoorOpen])
@@ -194,6 +194,21 @@ void Scene405::actions() {
 	_action._inProgress = false;
 }
 
+void room_405_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_405_preload() {
+	room_init_code_pointer = room_405_init;
+	room_pre_parser_code_pointer = room_405_pre_parser;
+	room_parser_code_pointer = room_405_parser;
+	room_daemon_code_pointer = room_405_daemon;
+
+	section_4_walker();
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room406.cpp b/engines/mads/madsv2/nebular/rooms/room406.cpp
index da921f47deb..0d869d74a7f 100644
--- a/engines/mads/madsv2/nebular/rooms/room406.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room406.cpp
@@ -19,30 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene406::Scene406(RexNebularEngine *vm) : Scene4xx(vm) {
-	_hitStorageDoor = false;
-}
+struct Scratch {
+	bool _hitStorageDoor;
+};
 
-void Scene406::synchronize(Common::Serializer &s) {
-	Scene4xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsByte(_hitStorageDoor);
-}
 
-void Scene406::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene406::enter() {
+static void room_406_init() {
 	_game._player._visible = true;
 	if (_scene->_priorSceneId == 405) {
 		_game._player._playerPos = Common::Point(15, 129);
@@ -84,11 +81,11 @@ void Scene406::enter() {
 	}
 
 	_game.loadQuoteSet(0x24F, 0);
-	_hitStorageDoor = false;
-	sceneEntrySound();
+	local._hitStorageDoor = false;
+	section_4_music();
 }
 
-void Scene406::step() {
+static void room_406_daemon() {
 	if (_game._trigger == 90) {
 		_game._player._stepEnabled = true;
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
@@ -99,7 +96,7 @@ void Scene406::step() {
 
 	if (_game._trigger == 100) {
 		_vm->_dialogs->show(40622);
-		_hitStorageDoor = true;
+		local._hitStorageDoor = true;
 	}
 
 	if (_game._trigger == 110) {
@@ -138,7 +135,7 @@ void Scene406::step() {
 	}
 }
 
-void Scene406::preActions() {
+static void room_406_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
 		_game._player._walkOffScreenSceneId = 405;
 
@@ -152,7 +149,7 @@ void Scene406::preActions() {
 		_game._player._needToWalk = true;
 }
 
-void Scene406::actions() {
+static void room_406_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && (_game._player._targetPos.x > 100)) {
 		_game._player._stepEnabled = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -164,7 +161,7 @@ void Scene406::actions() {
 		_scene->_nextSceneId = 410;
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && !_globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
-		if (!_hitStorageDoor) {
+		if (!local._hitStorageDoor) {
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_scene->_sequences.addTimer(80, 100);
 		}
@@ -240,6 +237,21 @@ void Scene406::actions() {
 	_action._inProgress = false;
 }
 
+void room_406_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._hitStorageDoor);
+}
+
+void room_406_preload() {
+	room_init_code_pointer = room_406_init;
+	room_pre_parser_code_pointer = room_406_pre_parser;
+	room_parser_code_pointer = room_406_parser;
+	room_daemon_code_pointer = room_406_parser;
+
+	section_4_walker();
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room407.cpp b/engines/mads/madsv2/nebular/rooms/room407.cpp
index a3d7d65e621..92f9166aefc 100644
--- a/engines/mads/madsv2/nebular/rooms/room407.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room407.cpp
@@ -19,49 +19,46 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene407::Scene407(RexNebularEngine *vm) : Scene4xx(vm), _destPos(0, 0) {
-	_fromNorth = false;
-}
-
-void Scene407::synchronize(Common::Serializer &s) {
-	Scene4xx::synchronize(s);
+struct Scratch {
+	bool _fromNorth;
+	int16 _dest_x;
+	int16 _dest_y;
+};
 
-	s.syncAsByte(_fromNorth);
-	s.syncAsSint16LE(_destPos.x);
-	s.syncAsSint16LE(_destPos.y);
-}
+static Scratch local;
 
-void Scene407::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
-void Scene407::enter() {
+static void room_407_init() {
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
-		_fromNorth = false;
+		local._fromNorth = false;
 
 	if (_scene->_priorSceneId == 318) {
 		_game._player._playerPos = Common::Point(172, 92);
 		_game._player._facing = FACING_SOUTH;
-		_fromNorth = true;
+		local._fromNorth = true;
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(172, 132);
 		_game._player._facing = FACING_NORTH;
 	}
 
 	_game.loadQuoteSet(0x250, 0);
-	sceneEntrySound();
+	section_4_music();
 }
 
-void Scene407::step() {
+static void room_407_daemon() {
 	if (_game._trigger == 70) {
 		_scene->_nextSceneId = 318;
 		_scene->_reloadSceneFlag = true;
@@ -71,12 +68,12 @@ void Scene407::step() {
 		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
-		_fromNorth = false;
+		local._fromNorth = false;
 		_game._player.walk(Common::Point(173, 104), FACING_SOUTH);
 	}
 }
 
-void Scene407::preActions() {
+static void room_407_pre_parser() {
 	if (_action.isAction(VERB_TAKE))
 		_game._player._needToWalk = false;
 
@@ -85,21 +82,23 @@ void Scene407::preActions() {
 
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
 		_game._player.walk(Common::Point(172, 91), FACING_NORTH);
-		_fromNorth = false;
+		local._fromNorth = false;
 	}
 
-	if (_game._player._needToWalk && _fromNorth) {
-		if (_globals[kSexOfRex] == REX_MALE)
-			_destPos = Common::Point(171, 95);
-		else
-			_destPos = Common::Point(173, 96);
-
-		_game._player.walk(_destPos, FACING_SOUTH);
+	if (_game._player._needToWalk && local._fromNorth) {
+		if (_globals[kSexOfRex] == REX_MALE) {
+			local._dest_x = 171;
+			local._dest_y = 95;
+		} else {
+			local._dest_x = 173;
+			local._dest_y = 96;
+		}
+		_game._player.walk(Common::Point(local._dest_x, local._dest_y), FACING_SOUTH);
 	}
 }
 
-void Scene407::actions() {
-	if ((_game._player._playerPos == _destPos) && _fromNorth) {
+static void room_407_parser() {
+	if (_game._player._playerPos.x == local._dest_x && _game._player._playerPos.y == local._dest_y && local._fromNorth) {
 		if (_globals[kSexOfRex] == REX_MALE) {
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_game._player._stepEnabled = false;
@@ -122,7 +121,7 @@ void Scene407::actions() {
 		}
 	}
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !_fromNorth)
+	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !local._fromNorth)
 		_scene->_nextSceneId = 406;
 	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH))
 		_scene->_nextSceneId = 318;
@@ -145,6 +144,23 @@ void Scene407::actions() {
 	_action._inProgress = false;
 }
 
+void room_407_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._fromNorth);
+	s.syncAsSint16LE(local._dest_x);
+	s.syncAsSint16LE(local._dest_y);
+}
+
+void room_407_preload() {
+	room_init_code_pointer = room_407_init;
+	room_pre_parser_code_pointer = room_407_pre_parser;
+	room_parser_code_pointer = room_407_parser;
+	room_daemon_code_pointer = room_407_daemon;
+
+	section_4_walker();
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room408.cpp b/engines/mads/madsv2/nebular/rooms/room408.cpp
index 7d3c1c7bb66..d00153235e3 100644
--- a/engines/mads/madsv2/nebular/rooms/room408.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room408.cpp
@@ -19,22 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene408::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_TARGET_MODULE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
-
-void Scene408::enter() {
+static void room_408_init() {
 	_game._player._playerPos = Common::Point(137, 150);
 	_game._player._facing = FACING_NORTH;
 
@@ -47,10 +45,10 @@ void Scene408::enter() {
 		int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(283, 128), FACING_NORTHEAST);
 	}
-	sceneEntrySound();
+	section_4_music();
 }
 
-void Scene408::preActions() {
+static void room_408_pre_parser() {
 	if ((_action.isAction(VERB_TAKE) && !_action.isObject(NOUN_TARGET_MODULE)) || _action.isAction(VERB_PULL, NOUN_PIN) || _action.isAction(VERB_OPEN, NOUN_CARTON))
 		_game._player._needToWalk = false;
 
@@ -58,7 +56,7 @@ void Scene408::preActions() {
 		_game._player._needToWalk = true;
 }
 
-void Scene408::actions() {
+static void room_408_parser() {
 	if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH)) {
 		_scene->_nextSceneId = 405;
 		_vm->_sound->command(58);
@@ -179,6 +177,22 @@ void Scene408::actions() {
 	_action._inProgress = false;
 }
 
+void room_408_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_408_preload() {
+	room_init_code_pointer = room_408_init;
+	room_pre_parser_code_pointer = room_408_pre_parser;
+	room_parser_code_pointer = room_408_parser;
+
+	section_4_walker();
+	section_4_interface();
+	_scene->addActiveVocab(NOUN_TARGET_MODULE);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room409.cpp b/engines/mads/madsv2/nebular/rooms/room409.cpp
index 0f7e3a12bbe..09b36ec9bfa 100644
--- a/engines/mads/madsv2/nebular/rooms/room409.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room409.cpp
@@ -19,38 +19,37 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene409::setup() {
-	_game._player._spritesPrefix = "";
+static void room_409_init() {
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
+	teleporter_init();
 
-	// The original is calling Scene4xx::setAAName()
-	_game._aaName = Resources::formatAAName(4);
-}
-
-void Scene409::enter() {
-	_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
-	teleporterEnter();
-
-	// The original is calling Scene4xx::sceneEntrySound()
+	// The original is calling Scene4xx::section_4_music()
 	if (!_vm->_musicFlag)
 		_vm->_sound->command(2);
 	else
 		_vm->_sound->command(10);
 }
 
-void Scene409::step() {
-	teleporterStep();
+static void room_409_daemon() {
+	teleporter_daemon();
 }
 
-void Scene409::actions() {
-	if (teleporterActions()) {
+static void room_409_parser() {
+	if (teleporter_parser()) {
 		_action._inProgress = false;
 		return;
 	}
@@ -82,6 +81,20 @@ void Scene409::actions() {
 	_action._inProgress = false;
 }
 
+void room_409_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_409_preload() {
+	room_init_code_pointer = room_409_init;
+	room_parser_code_pointer = room_409_parser;
+	room_daemon_code_pointer = room_409_daemon;
+
+	*player.series_name = '\0';
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room410.cpp b/engines/mads/madsv2/nebular/rooms/room410.cpp
index 7637f29fd98..81aab8673e7 100644
--- a/engines/mads/madsv2/nebular/rooms/room410.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room410.cpp
@@ -19,20 +19,20 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene410::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene410::enter() {
+static void room_410_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*ROXRC_7");
 
@@ -46,13 +46,13 @@ void Scene410::enter() {
 		_game._player._facing = FACING_NORTH;
 	}
 
-	sceneEntrySound();
+	section_4_music();
 
 	_scene->loadAnimation(Resources::formatName(410, 'r', -1, EXT_AA, ""));
 	_scene->_animation[0]->_resetFlag = true;
 }
 
-void Scene410::step() {
+static void room_410_daemon() {
 	if (_scene->_animation[0]->getCurrentFrame() == 1) {
 		if (_vm->getRandomNumber(1, 30) == 1)
 			_scene->_animation[0]->setCurrentFrame(2);
@@ -82,7 +82,7 @@ void Scene410::step() {
 	}
 }
 
-void Scene410::preActions() {
+static void room_410_pre_parser() {
 	if (_action.isAction(VERB_TAKE) && !_action.isObject(NOUN_CHARGE_CASES))
 		_game._player._needToWalk = false;
 
@@ -96,7 +96,7 @@ void Scene410::preActions() {
 		_game._player._needToWalk = true;
 }
 
-void Scene410::actions() {
+static void room_410_parser() {
 	if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
 		_scene->_nextSceneId = 406;
 	else if (_action.isAction(VERB_TAKE, NOUN_CHARGE_CASES) && (_game._objects.isInRoom(OBJ_CHARGE_CASES) || _game._trigger)) {
@@ -187,6 +187,21 @@ void Scene410::actions() {
 	_action._inProgress = false;
 }
 
+void room_410_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_410_preload() {
+	room_init_code_pointer = room_410_init;
+	room_pre_parser_code_pointer = room_410_pre_parser;
+	room_parser_code_pointer = room_410_parser;
+	room_daemon_code_pointer = room_410_daemon;
+
+	section_4_walker();
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room411.cpp b/engines/mads/madsv2/nebular/rooms/room411.cpp
index 5f4d47455ea..5e042b155ea 100644
--- a/engines/mads/madsv2/nebular/rooms/room411.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room411.cpp
@@ -19,68 +19,69 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene411::Scene411(RexNebularEngine *vm) : Scene4xx(vm) {
-	_curAnimationFrame = -1;
-	_newIngredient = -1;
-	_newQuantity = -1;
-	_resetFrame = -1;
-	_badThreshold = -1;
+struct Scratch {
+	int32 _curAnimationFrame;
+	int32 _newIngredient;
+	int32 _newQuantity;
+	int32 _resetFrame;
+	int32 _badThreshold;
 
-	_killRox = false;
-	_makeMushroomCloud = false;
-}
+	bool _killRox;
+	bool _makeMushroomCloud;
 
-void Scene411::synchronize(Common::Serializer &s) {
-	Scene4xx::synchronize(s);
+	Conversation _dialog1;
+	Conversation _dialog2;
+	Conversation _dialog3;
+	Conversation _dialog4;
+};
 
-	s.syncAsSint32LE(_curAnimationFrame);
-	s.syncAsSint32LE(_newIngredient);
-	s.syncAsSint32LE(_newQuantity);
-	s.syncAsSint32LE(_resetFrame);
-	s.syncAsSint32LE(_badThreshold);
+static Scratch local;
 
-	s.syncAsByte(_killRox);
-	s.syncAsByte(_makeMushroomCloud);
-}
 
-bool Scene411::addIngredient() {
+static bool addIngredient() {
 	bool retVal = false;
 
-	switch (_newIngredient) {
+	switch (local._newIngredient) {
 	case OBJ_LECITHIN:
 		if (_globals[kIngredientList + _globals[kNextIngredient]] == 1)
 			retVal = true;
 
-		_badThreshold = 1;
+		local._badThreshold = 1;
 		break;
 
 	case OBJ_ALIEN_LIQUOR:
 		if (_globals[kIngredientList + _globals[kNextIngredient]] == 0)
 			retVal = true;
 
-		_badThreshold = 0;
+		local._badThreshold = 0;
 		break;
 
 	case OBJ_FORMALDEHYDE:
 		if (_globals[kIngredientList + _globals[kNextIngredient]] == 3)
 			retVal = true;
 
-		_badThreshold = 3;
+		local._badThreshold = 3;
 		break;
 
 	case OBJ_PETROX:
 		if (_globals[kIngredientList + _globals[kNextIngredient]] == 2)
 			retVal = true;
 
-		_badThreshold = 2;
+		local._badThreshold = 2;
 		break;
 
 	default:
@@ -88,7 +89,7 @@ bool Scene411::addIngredient() {
 	}
 
 	if (!retVal && (_globals[kNextIngredient] == 0))
-		_globals[kBadFirstIngredient] = _badThreshold;
+		_globals[kBadFirstIngredient] = local._badThreshold;
 
 	if (_globals[kNextIngredient] == 0)
 		retVal = true;
@@ -96,14 +97,14 @@ bool Scene411::addIngredient() {
 	return(retVal);
 }
 
-bool Scene411::addQuantity() {
+static bool addQuantity() {
 	bool retVal = false;
 
-	if (_globals[kIngredientQuantity + _globals[kNextIngredient]] == _newQuantity)
+	if (_globals[kIngredientQuantity + _globals[kNextIngredient]] == local._newQuantity)
 		retVal = true;
 
 	if (!retVal && (_globals[kNextIngredient] == 0))
-		_globals[kBadFirstIngredient] = _badThreshold;
+		_globals[kBadFirstIngredient] = local._badThreshold;
 
 	if (_globals[kNextIngredient] == 0)
 		retVal = true;
@@ -111,7 +112,7 @@ bool Scene411::addQuantity() {
 	return(retVal);
 }
 
-int Scene411::computeQuoteAndQuantity() {
+static int computeQuoteAndQuantity() {
 	int quoteId;
 	int quantity;
 
@@ -206,7 +207,7 @@ int Scene411::computeQuoteAndQuantity() {
 	return quantity;
 }
 
-void Scene411::handleKettleAction() {
+static void handleKettleAction() {
 	switch (_globals[kNextIngredient]) {
 	case 1:
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4],
@@ -220,7 +221,7 @@ void Scene411::handleKettleAction() {
 		break;
 
 	case 3:
-		_makeMushroomCloud = true;
+		local._makeMushroomCloud = true;
 		break;
 
 	default:
@@ -228,49 +229,49 @@ void Scene411::handleKettleAction() {
 	}
 }
 
-void Scene411::handleDialog() {
+static void handleDialog() {
 	if ((_action._activeAction._verbId != 0x262) && (_game._trigger == 0)) {
-		if (_game._objects.isInInventory(_newIngredient)) {
-			switch (_newIngredient) {
+		if (_game._objects.isInInventory(local._newIngredient)) {
+			switch (local._newIngredient) {
 			case OBJ_FORMALDEHYDE:
-				_resetFrame = 17;
+				local._resetFrame = 17;
 				break;
 
 			case OBJ_PETROX:
-				_resetFrame = 55;
+				local._resetFrame = 55;
 				break;
 
 			case OBJ_LECITHIN:
-				_resetFrame = 36;
+				local._resetFrame = 36;
 				break;
 
 			default:
-				_resetFrame = 112;
+				local._resetFrame = 112;
 				break;
 			}
 
 			_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
-			_scene->_animation[0]->setCurrentFrame(_resetFrame);
+			_scene->_animation[0]->setCurrentFrame(local._resetFrame);
 		}
 		_scene->_kernelMessages.reset();
-		_newQuantity = computeQuoteAndQuantity();
+		local._newQuantity = computeQuoteAndQuantity();
 
 		if ((_globals[kNextIngredient] == 1) && (_globals[kBadFirstIngredient] > -1))
-			_killRox = true;
+			local._killRox = true;
 		else if (addIngredient() && addQuantity()) {
 			handleKettleAction();
 			_globals[kNextIngredient]++;
 		} else
-			_killRox = true;
+			local._killRox = true;
 
 		_scene->_userInterface.setup(kInputBuildingSentences);
 	} else if (_action._activeAction._verbId == 0x262)
 		_scene->_userInterface.setup(kInputBuildingSentences);
 }
 
-void Scene411::giveToRex(int object) {
+static void giveToRex(int object) {
 	switch (object) {
 	case 0:
 		_game._objects.addToInventory(OBJ_ALIEN_LIQUOR);
@@ -293,17 +294,7 @@ void Scene411::giveToRex(int object) {
 	}
 }
 
-void Scene411::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
-	_scene->addActiveVocab(NOUN_FORMALDEHYDE);
-	_scene->addActiveVocab(NOUN_PETROX);
-	_scene->addActiveVocab(NOUN_LECITHIN);
-}
-
-void Scene411::enter() {
+static void room_411_init() {
 	if (_scene->_priorSceneId == 411) {
 		if ((_globals[kNextIngredient] == 1) && (_globals[kBadFirstIngredient] > -1))
 			giveToRex(_globals[kBadFirstIngredient]);
@@ -333,10 +324,10 @@ void Scene411::enter() {
 		0x261, 0x25D, 0x259, 0x262, 0x267, 0x263, 0x26B, 0x26F, 0x268, 0x264, 0x26C, 0x270, 0x26A, 0x266, 0x26E,
 		0x272, 0x269, 0x265, 0x26D, 0x271, 0);
 
-	_dialog1.setup(0x5B, 0x252, 0x25E, 0x25A, 0x256, 0x262, -1);
-	_dialog2.setup(0x5C, 0x253, 0x25F, 0x25B, 0x257, 0x262, -1);
-	_dialog3.setup(0x5D, 0x254, 0x260, 0x25C, 0x258, 0x262, -1);
-	_dialog4.setup(0x5E, 0x255, 0x261, 0x25D, 0x259, 0x262, -1);
+	local._dialog1.setup(0x5B, 0x252, 0x25E, 0x25A, 0x256, 0x262, -1);
+	local._dialog2.setup(0x5C, 0x253, 0x25F, 0x25B, 0x257, 0x262, -1);
+	local._dialog3.setup(0x5D, 0x254, 0x260, 0x25C, 0x258, 0x262, -1);
+	local._dialog4.setup(0x5E, 0x255, 0x261, 0x25D, 0x259, 0x262, -1);
 
 	if (_globals[kNextIngredient] >= 4 && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
 		_scene->_hotspots.activate(NOUN_KETTLE, false);
@@ -412,7 +403,7 @@ void Scene411::enter() {
 		_game._player._facing = FACING_NORTHEAST;
 	}
 
-	sceneEntrySound();
+	section_4_music();
 
 	if (_scene->_roomChanged) {
 		_game._objects.addToInventory(OBJ_ALIEN_LIQUOR);
@@ -424,33 +415,33 @@ void Scene411::enter() {
 	_scene->loadAnimation(formAnimName('a', -1));
 	_scene->_animation[0]->setCurrentFrame(128);
 
-	_makeMushroomCloud = false;
-	_killRox = false;
+	local._makeMushroomCloud = false;
+	local._killRox = false;
 }
 
-void Scene411::step() {
+static void room_411_daemon() {
 	if (_scene->_animation[0] != nullptr) {
-		if (_curAnimationFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_curAnimationFrame = _scene->_animation[0]->getCurrentFrame();
-			_resetFrame = -1;
+		if (local._curAnimationFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._curAnimationFrame = _scene->_animation[0]->getCurrentFrame();
+			local._resetFrame = -1;
 
-			switch (_curAnimationFrame) {
+			switch (local._curAnimationFrame) {
 			case 16:
 				_game._player._stepEnabled = true;
 				_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
 				_game._player._visible = true;
-				_resetFrame = 128;
+				local._resetFrame = 128;
 				break;
 
 			case 35:
 			case 54:
 			case 71:
 			case 127:
-				if (_killRox) {
-					_resetFrame = 72;
+				if (local._killRox) {
+					local._resetFrame = 72;
 				} else {
-					_resetFrame = 0;
-					_game._objects.removeFromInventory(_newIngredient, NOWHERE);
+					local._resetFrame = 0;
+					_game._objects.removeFromInventory(local._newIngredient, NOWHERE);
 					switch (_globals[kNextIngredient]) {
 					case 1:
 						_vm->_sound->command(53);
@@ -478,30 +469,30 @@ void Scene411::step() {
 			case 41:
 			case 59:
 			case 115:
-				if (_makeMushroomCloud) {
+				if (local._makeMushroomCloud) {
 					_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 5, 1, 0, 0);
-					_makeMushroomCloud = false;
+					local._makeMushroomCloud = false;
 					_scene->_hotspots.activate(NOUN_KETTLE, false);
 					_scene->_hotspots.activate(NOUN_EXPLOSIVES, true);
 				}
 				break;
 
 			case 111:
-				_resetFrame = 111;
+				local._resetFrame = 111;
 				_scene->_reloadSceneFlag = true;
 				break;
 
 			case 129:
-				_resetFrame = 128;
+				local._resetFrame = 128;
 				break;
 
 			default:
 				break;
 			}
 
-			if ((_resetFrame >= 0) && (_resetFrame != _scene->_animation[0]->getCurrentFrame())) {
-				_scene->_animation[0]->setCurrentFrame(_resetFrame);
-				_curAnimationFrame = _resetFrame;
+			if ((local._resetFrame >= 0) && (local._resetFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(local._resetFrame);
+				local._curAnimationFrame = local._resetFrame;
 			}
 		}
 	}
@@ -510,7 +501,7 @@ void Scene411::step() {
 		_vm->_sound->command(59);
 }
 
-void Scene411::preActions() {
+static void room_411_pre_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_PETROX) && (_game._objects.isInRoom(OBJ_PETROX)))
 		_game._player._needToWalk = true;
 
@@ -529,7 +520,7 @@ void Scene411::preActions() {
 		_game._player._needToWalk = false;
 }
 
-void Scene411::actions() {
+static void room_411_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation) {
 		handleDialog();
 		_action._inProgress = false;
@@ -703,22 +694,22 @@ void Scene411::actions() {
 			_action.isObject(NOUN_FORMALDEHYDE) ||
 			_action.isObject(NOUN_LECITHIN) ||
 			_action.isObject(NOUN_ALIEN_LIQUOR)) {
-			_newIngredient = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
-			switch (_newIngredient) {
+			local._newIngredient = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+			switch (local._newIngredient) {
 			case OBJ_ALIEN_LIQUOR:
-				_dialog1.start();
+				local._dialog1.start();
 				break;
 
 			case OBJ_FORMALDEHYDE:
-				_dialog3.start();
+				local._dialog3.start();
 				break;
 
 			case OBJ_PETROX:
-				_dialog4.start();
+				local._dialog4.start();
 				break;
 
 			case OBJ_LECITHIN:
-				_dialog2.start();
+				local._dialog2.start();
 				break;
 
 			default:
@@ -796,6 +787,33 @@ void Scene411::actions() {
 	_action._inProgress = false;
 }
 
+void room_411_synchronize(Common::Serializer &s) {
+	s.syncAsSint32LE(local._curAnimationFrame);
+	s.syncAsSint32LE(local._newIngredient);
+	s.syncAsSint32LE(local._newQuantity);
+	s.syncAsSint32LE(local._resetFrame);
+	s.syncAsSint32LE(local._badThreshold);
+
+	s.syncAsByte(local._killRox);
+	s.syncAsByte(local._makeMushroomCloud);
+}
+
+void room_411_preload() {
+	room_init_code_pointer = room_411_init;
+	room_pre_parser_code_pointer = room_411_pre_parser;
+	room_parser_code_pointer = room_411_parser;
+	room_daemon_code_pointer = room_411_daemon;
+
+	section_4_walker();
+	section_4_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
+	_scene->addActiveVocab(NOUN_FORMALDEHYDE);
+	_scene->addActiveVocab(NOUN_PETROX);
+	_scene->addActiveVocab(NOUN_LECITHIN);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room413.cpp b/engines/mads/madsv2/nebular/rooms/room413.cpp
index 42435aa0df7..301553a530d 100644
--- a/engines/mads/madsv2/nebular/rooms/room413.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room413.cpp
@@ -19,34 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene413::Scene413(RexNebularEngine *vm) : Scene4xx(vm) {
-	_rexDeath = -1;
-	_canMove = -1;
-}
+struct Scratch {
+	int32 _rexDeath = -1;
+	int32 _canMove = -1;
+};
 
-void Scene413::synchronize(Common::Serializer &s) {
-	Scene4xx::synchronize(s);
+static Scratch  local;
 
-	s.syncAsSint32LE(_rexDeath);
-	s.syncAsSint32LE(_canMove);
-}
 
-void Scene413::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
-void Scene413::enter() {
+static void room_413_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 2));
-	_rexDeath = false;
+	local._rexDeath = false;
 
 	if (_scene->_priorSceneId == 405) {
 		_game._player._playerPos = Common::Point(142, 146);
@@ -58,7 +54,7 @@ void Scene413::enter() {
 			_vm->_sound->command(30);
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
-			_rexDeath = true;
+			local._rexDeath = true;
 		} else if (!_globals[kTeleporterCommand]) {
 			_game._player._playerPos = Common::Point(136, 117);
 			_game._player.walk(Common::Point(141, 130), FACING_SOUTH);
@@ -67,7 +63,7 @@ void Scene413::enter() {
 		}
 	}
 
-	if ((_globals[kTeleporterCommand]) && (!_rexDeath)) {
+	if ((_globals[kTeleporterCommand]) && (!local._rexDeath)) {
 		switch (_globals[kTeleporterCommand]) {
 		case 1:
 			_vm->_sound->command(30);
@@ -102,17 +98,17 @@ void Scene413::enter() {
 		_globals[kTeleporterCommand] = 0;
 	}
 
-	_canMove = true;
-	sceneEntrySound();
+	local._canMove = true;
+	section_4_music();
 }
 
-void Scene413::step() {
+static void room_413_daemon() {
 	if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 38)
 		_scene->_animation[0]->setCurrentFrame(37);
 
-	if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 21 && _canMove) {
+	if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 21 && local._canMove) {
 		_vm->_sound->command(27);
-		_canMove = false;
+		local._canMove = false;
 	}
 
 	if (_game._trigger == 76) {
@@ -137,7 +133,7 @@ void Scene413::step() {
 	}
 }
 
-void Scene413::preActions() {
+static void room_413_pre_parser() {
 	if (_action.isAction(VERB_TAKE) || _action.isAction(VERB_PUT, NOUN_CONVEYOR_BELT))
 		_game._player._needToWalk = false;
 
@@ -147,7 +143,7 @@ void Scene413::preActions() {
 	}
 }
 
-void Scene413::actions() {
+static void room_413_parser() {
 	if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -182,6 +178,22 @@ void Scene413::actions() {
 	_action._inProgress = false;
 }
 
+void room_413_synchronize(Common::Serializer &s) {
+	s.syncAsSint32LE(local._rexDeath);
+	s.syncAsSint32LE(local._canMove);
+}
+
+void room_413_preload() {
+	room_init_code_pointer = room_413_init;
+	room_pre_parser_code_pointer = room_413_pre_parser;
+	room_parser_code_pointer = room_413_parser;
+	room_daemon_code_pointer = room_413_daemon;
+
+	section_4_walker();
+	section_4_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room501.cpp b/engines/mads/madsv2/nebular/rooms/room501.cpp
index fedc3e2bc01..5000f78eacf 100644
--- a/engines/mads/madsv2/nebular/rooms/room501.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room501.cpp
@@ -35,7 +35,7 @@ Scene501::Scene501(RexNebularEngine *vm) : Scene5xx(vm) {
 	_rexPunched = false;
 }
 
-void Scene501::synchronize(Common::Serializer &s) {
+void room_501_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_mainSequenceId);
@@ -95,7 +95,7 @@ void Scene501::handleSlotActions() {
 	}
 }
 
-void Scene501::enter() {
+static void room_501_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
@@ -225,12 +225,12 @@ void Scene501::step() {
 	}
 }
 
-void Scene501::preActions() {
+static void room_501_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_EAST) || _action.isObject(NOUN_SIDEWALK_TO_EAST)))
 		_game._player._walkOffScreenSceneId = 551;
 }
 
-void Scene501::actions() {
+static void room_501_parser() {
 	if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room502.cpp b/engines/mads/madsv2/nebular/rooms/room502.cpp
index 7e4538118e6..85524c8f763 100644
--- a/engines/mads/madsv2/nebular/rooms/room502.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room502.cpp
@@ -33,7 +33,7 @@ void Scene502::setup() {
 	_game._aaName = Resources::formatAAName(5);
 }
 
-void Scene502::enter() {
+static void room_502_init() {
 	if (_globals[kSexOfRex] == REX_MALE)
 		_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
 	else
@@ -54,7 +54,7 @@ void Scene502::step() {
 	teleporterStep();
 }
 
-void Scene502::actions() {
+static void room_502_parser() {
 	if (teleporterActions()) {
 		_action._inProgress = false;
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room503.cpp b/engines/mads/madsv2/nebular/rooms/room503.cpp
index 4a42cf9cdd1..f31aa206b73 100644
--- a/engines/mads/madsv2/nebular/rooms/room503.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room503.cpp
@@ -31,7 +31,7 @@ Scene503::Scene503(RexNebularEngine *vm) : Scene5xx(vm) {
 	_detonatorHotspotId = -1;
 }
 
-void Scene503::synchronize(Common::Serializer &s) {
+void room_503_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_detonatorHotspotId);
@@ -44,7 +44,7 @@ void Scene503::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene503::enter() {
+static void room_503_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
 
 	if (_globals[kSexOfRex] == REX_MALE)
@@ -66,7 +66,7 @@ void Scene503::enter() {
 	sceneEntrySound();
 }
 
-void Scene503::actions() {
+static void room_503_parser() {
 	if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
 		_scene->_nextSceneId = 501;
 	else if (_action.isAction(VERB_TAKE, NOUN_DETONATORS)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room504.cpp b/engines/mads/madsv2/nebular/rooms/room504.cpp
index 53e9b09d965..4f75fdd3553 100644
--- a/engines/mads/madsv2/nebular/rooms/room504.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room504.cpp
@@ -32,7 +32,7 @@ Scene504::Scene504(RexNebularEngine *vm) : Scene5xx(vm) {
 	_carFrame = -1;
 }
 
-void Scene504::synchronize(Common::Serializer &s) {
+void room_504_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_carAnimationMode);
@@ -44,7 +44,7 @@ void Scene504::setup() {
 	setAAName();
 }
 
-void Scene504::enter() {
+static void room_504_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
 
 	for (int i = 0; i < 4; i++)
@@ -140,11 +140,11 @@ void Scene504::step() {
 	}
 }
 
-void Scene504::preActions() {
+static void room_504_pre_parser() {
 	_game._player._needToWalk = false;
 }
 
-void Scene504::actions() {
+static void room_504_parser() {
 	if (_action.isAction(VERB_EXIT_FROM, NOUN_CAR)) {
 		_vm->_sound->command(15);
 		_scene->_nextSceneId = _globals[kHoverCarLocation];
diff --git a/engines/mads/madsv2/nebular/rooms/room505.cpp b/engines/mads/madsv2/nebular/rooms/room505.cpp
index 131a56ccf20..f213ed18e57 100644
--- a/engines/mads/madsv2/nebular/rooms/room505.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room505.cpp
@@ -38,7 +38,7 @@ Scene505::Scene505(RexNebularEngine *vm) : Scene5xx(vm) {
 		_carLocations[i] = -1;
 }
 
-void Scene505::synchronize(Common::Serializer &s) {
+void room_505_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_frame);
@@ -56,7 +56,7 @@ void Scene505::setup() {
 	setAAName();
 }
 
-void Scene505::enter() {
+static void room_505_init() {
 	for (int i = 0; i < 9; i++)
 		_globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('a', i + 1));
 
@@ -290,7 +290,7 @@ void Scene505::step() {
 	}
 }
 
-void Scene505::actions() {
+static void room_505_parser() {
 	if (_action.isAction(VERB_PRESS))
 		_nextButtonId = _action._activeAction._objectNameId;
 	else if (_action.isAction(VERB_RETURN_TO, NOUN_INSIDE_OF_CAR))
diff --git a/engines/mads/madsv2/nebular/rooms/room506.cpp b/engines/mads/madsv2/nebular/rooms/room506.cpp
index ce458f2c1c1..5e70cf72f3f 100644
--- a/engines/mads/madsv2/nebular/rooms/room506.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room506.cpp
@@ -40,7 +40,7 @@ Scene506::Scene506(RexNebularEngine *vm) : Scene5xx(vm), _doorPos(0, 0) {
 	_actionFl = false;
 }
 
-void Scene506::synchronize(Common::Serializer &s) {
+void room_506_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_doorPos.x);
@@ -66,7 +66,7 @@ void Scene506::setup() {
 	_scene->addActiveVocab(NOUN_LABORATORY);
 }
 
-void Scene506::enter() {
+static void room_506_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('q', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('q', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', -1));
@@ -237,7 +237,7 @@ void Scene506::handleDoorSequences() {
 	}
 }
 
-void Scene506::actions() {
+static void room_506_parser() {
 	if (_action.isAction(VERB_WALK_INTO, NOUN_LABORATORY)) {
 		if (_firstDoorFl) {
 			_heroFacing = FACING_NORTHWEST;
diff --git a/engines/mads/madsv2/nebular/rooms/room507.cpp b/engines/mads/madsv2/nebular/rooms/room507.cpp
index db2afa381a8..ca22739f8b8 100644
--- a/engines/mads/madsv2/nebular/rooms/room507.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room507.cpp
@@ -31,7 +31,7 @@ Scene507::Scene507(RexNebularEngine *vm) : Scene5xx(vm) {
 	_penlightHotspotId = -1;
 }
 
-void Scene507::synchronize(Common::Serializer &s) {
+void room_507_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_penlightHotspotId);
@@ -44,7 +44,7 @@ void Scene507::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene507::enter() {
+static void room_507_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRD_3");
 
@@ -61,7 +61,7 @@ void Scene507::enter() {
 
 	sceneEntrySound();
 }
-void Scene507::actions() {
+static void room_507_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
 		_scene->_nextSceneId = 506;
 	else if (_action.isAction(VERB_TAKE, NOUN_PENLIGHT)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room508.cpp b/engines/mads/madsv2/nebular/rooms/room508.cpp
index 2e0d48f5e89..128e007c4f1 100644
--- a/engines/mads/madsv2/nebular/rooms/room508.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room508.cpp
@@ -31,7 +31,7 @@ Scene508::Scene508(RexNebularEngine *vm) : Scene5xx(vm) {
 	_chosenObject = -1;
 }
 
-void Scene508::synchronize(Common::Serializer &s) {
+void room_508_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_chosenObject);
@@ -45,7 +45,7 @@ void Scene508::setup() {
 	_scene->addActiveVocab(NOUN_LASER_BEAM);
 }
 
-void Scene508::enter() {
+static void room_508_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0));
@@ -104,7 +104,7 @@ void Scene508::enter() {
 	}
 }
 
-void Scene508::preActions() {
+static void room_508_pre_parser() {
 	if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
 		_game._player._walkOffScreenSceneId = 506;
 }
@@ -162,7 +162,7 @@ void Scene508::handlePedestral() {
 	}
 }
 
-void Scene508::actions() {
+static void room_508_parser() {
 	if (_action.isAction(VERB_PULL, NOUN_LEVER)) {
 		if (!_globals[kLaserOn]) {
 			switch (_game._trigger) {
diff --git a/engines/mads/madsv2/nebular/rooms/room511.cpp b/engines/mads/madsv2/nebular/rooms/room511.cpp
index fc0bac2741c..277c9703a45 100644
--- a/engines/mads/madsv2/nebular/rooms/room511.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room511.cpp
@@ -36,7 +36,7 @@ Scene511::Scene511(RexNebularEngine *vm) : Scene5xx(vm) {
 	_lineAnimationPosition = -1;
 }
 
-void Scene511::synchronize(Common::Serializer &s) {
+void room_511_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsByte(_handingLine);
@@ -55,7 +55,7 @@ void Scene511::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene511::enter() {
+static void room_511_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_6");
 
@@ -184,7 +184,7 @@ void Scene511::step() {
 	}
 }
 
-void Scene511::preActions() {
+static void room_511_pre_parser() {
 	if (!_handingLine)
 		return;
 
@@ -209,7 +209,7 @@ void Scene511::preActions() {
 	}
 }
 
-void Scene511::actions() {
+static void room_511_parser() {
 	if (_action.isAction(VERB_WALK_INTO, NOUN_RESTAURANT))
 		_scene->_nextSceneId = 512;
 	else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room512.cpp b/engines/mads/madsv2/nebular/rooms/room512.cpp
index 2dbcd112186..bad4439a058 100644
--- a/engines/mads/madsv2/nebular/rooms/room512.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room512.cpp
@@ -32,7 +32,7 @@ Scene512::Scene512(RexNebularEngine *vm) : Scene5xx(vm) {
 	_keyHotspotId = -1;
 }
 
-void Scene512::synchronize(Common::Serializer &s) {
+void room_512_synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
 	s.syncAsSint16LE(_fishingRodHotspotId);
@@ -48,7 +48,7 @@ void Scene512::setup() {
 	_scene->addActiveVocab(NOUN_REGISTER_DRAWER);
 }
 
-void Scene512::enter() {
+static void room_512_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9");
 	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RXMRC_8");
@@ -100,7 +100,7 @@ void Scene512::enter() {
 	sceneEntrySound();
 }
 
-void Scene512::actions() {
+static void room_512_parser() {
 	if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
 		_scene->_nextSceneId = 511;
 	else if (_action.isAction(VERB_TAKE, NOUN_FISHING_ROD)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room513.cpp b/engines/mads/madsv2/nebular/rooms/room513.cpp
index 6a2972f7d6f..cd63e8715d1 100644
--- a/engines/mads/madsv2/nebular/rooms/room513.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room513.cpp
@@ -34,7 +34,7 @@ void Scene513::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene513::enter() {
+static void room_513_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_9");
@@ -128,7 +128,7 @@ void Scene513::step() {
 	}
 }
 
-void Scene513::actions() {
+static void room_513_parser() {
 	if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room515.cpp b/engines/mads/madsv2/nebular/rooms/room515.cpp
index c7c4c7f8b4d..ec41425256b 100644
--- a/engines/mads/madsv2/nebular/rooms/room515.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room515.cpp
@@ -32,7 +32,7 @@ void Scene515::setup() {
 	setAAName();
 }
 
-void Scene515::enter() {
+static void room_515_init() {
 	_game._player._visible = false;
 	_game._player._stepEnabled = false;
 	_scene->_sequences.addTimer(30, 70);
diff --git a/engines/mads/madsv2/nebular/rooms/room551.cpp b/engines/mads/madsv2/nebular/rooms/room551.cpp
index 1e05b2b8713..cb61b0912a6 100644
--- a/engines/mads/madsv2/nebular/rooms/room551.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room551.cpp
@@ -32,7 +32,7 @@ void Scene551::setup() {
 	setAAName();
 }
 
-void Scene551::enter() {
+static void room_551_init() {
 	if (_globals[kSexOfRex] == REX_MALE)
 		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	else
@@ -128,12 +128,12 @@ void Scene551::step() {
 	}
 }
 
-void Scene551::preActions() {
+static void room_551_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_WEST) || _action.isObject(NOUN_SIDEWALK_TO_WEST)))
 		_game._player._walkOffScreenSceneId = 501;
 }
 
-void Scene551::actions() {
+static void room_551_parser() {
 	if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER))
 		_scene->_nextSceneId = 502;
 	else if ((_action._lookFlag))
diff --git a/engines/mads/madsv2/nebular/rooms/room601.cpp b/engines/mads/madsv2/nebular/rooms/room601.cpp
index b49c5483f0c..c9e4786c66e 100644
--- a/engines/mads/madsv2/nebular/rooms/room601.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room601.cpp
@@ -34,7 +34,7 @@ void Scene601::setup() {
 	_scene->addActiveVocab(VERB_LOOK_AT);
 }
 
-void Scene601::enter() {
+static void room_601_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_4");
@@ -90,7 +90,7 @@ void Scene601::step() {
 	}
 }
 
-void Scene601::actions() {
+static void room_601_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
 		_scene->_nextSceneId = 602;
 	else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room602.cpp b/engines/mads/madsv2/nebular/rooms/room602.cpp
index 6d0f99f0bb0..611e2804b55 100644
--- a/engines/mads/madsv2/nebular/rooms/room602.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room602.cpp
@@ -34,7 +34,7 @@ Scene602::Scene602(RexNebularEngine *vm) : Scene6xx(vm) {
 	_safeMode = -1;
 }
 
-void Scene602::synchronize(Common::Serializer &s) {
+void room_602_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_lastSpriteIdx);
@@ -51,7 +51,7 @@ void Scene602::setup() {
 	_scene->addActiveVocab(NOUN_LASER_BEAM);
 }
 
-void Scene602::enter() {
+static void room_602_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
@@ -209,7 +209,7 @@ void Scene602::handleSafeActions() {
 	}
 }
 
-void Scene602::actions() {
+static void room_602_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_HALLWAY))
 		_scene->_nextSceneId = 601;
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
diff --git a/engines/mads/madsv2/nebular/rooms/room603.cpp b/engines/mads/madsv2/nebular/rooms/room603.cpp
index dbb4a0f9e88..b27cfc9e450 100644
--- a/engines/mads/madsv2/nebular/rooms/room603.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room603.cpp
@@ -32,7 +32,7 @@ Scene603::Scene603(RexNebularEngine *vm) : Scene6xx(vm) {
 	_noteHotspotId = -1;
 }
 
-void Scene603::synchronize(Common::Serializer &s) {
+void room_603_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_compactCaseHotspotId);
@@ -47,7 +47,7 @@ void Scene603::setup() {
 	_scene->addActiveVocab(NOUN_NOTE);
 }
 
-void Scene603::enter() {
+static void room_603_init() {
 	if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId) {
 		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRD_3");
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
@@ -72,7 +72,7 @@ void Scene603::enter() {
 	sceneEntrySound();
 }
 
-void Scene603::actions() {
+static void room_603_parser() {
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LIVINGROOM))
 		_scene->_nextSceneId = 602;
 	else if (_action.isAction(VERB_TAKE, NOUN_COMPACT_CASE)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room604.cpp b/engines/mads/madsv2/nebular/rooms/room604.cpp
index 666c8707428..19ab6c0cb08 100644
--- a/engines/mads/madsv2/nebular/rooms/room604.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room604.cpp
@@ -38,7 +38,7 @@ Scene604::Scene604(RexNebularEngine *vm) : Scene6xx(vm) {
 	_animationActiveFl = false;
 }
 
-void Scene604::synchronize(Common::Serializer &s) {
+void room_604_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_timebombHotspotId);
@@ -59,7 +59,7 @@ void Scene604::setup() {
 	_scene->addActiveVocab(NOUN_TIMEBOMB);
 }
 
-void Scene604::enter() {
+static void room_604_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_9");
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(Resources::formatName(620, 'b', 0, EXT_SS, ""));
@@ -231,7 +231,7 @@ void Scene604::handleBombActions() {
 	}
 }
 
-void Scene604::actions() {
+static void room_604_parser() {
 	if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room605.cpp b/engines/mads/madsv2/nebular/rooms/room605.cpp
index a29ba2ece3d..9b9fd35e522 100644
--- a/engines/mads/madsv2/nebular/rooms/room605.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room605.cpp
@@ -32,7 +32,7 @@ void Scene605::setup() {
 	setAAName();
 }
 
-void Scene605::enter() {
+static void room_605_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', -1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('l', -1));
@@ -67,7 +67,7 @@ void Scene605::step() {
 	}
 }
 
-void Scene605::actions() {
+static void room_605_parser() {
 	return;
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/room607.cpp b/engines/mads/madsv2/nebular/rooms/room607.cpp
index 499cfc8de31..62ee2438abe 100644
--- a/engines/mads/madsv2/nebular/rooms/room607.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room607.cpp
@@ -41,7 +41,7 @@ Scene607::Scene607(RexNebularEngine *vm) : Scene6xx(vm) {
 	_counter = -1;
 }
 
-void Scene607::synchronize(Common::Serializer &s) {
+void room_607_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsUint32LE(_dogTimer);
@@ -64,7 +64,7 @@ void Scene607::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene607::enter() {
+static void room_607_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3");
 
@@ -368,7 +368,7 @@ void Scene607::handleThrowingBone() {
 	}
 }
 
-void Scene607::preActions() {
+static void room_607_pre_parser() {
 	if (_action.isAction(VERB_TALKTO, NOUN_OBNOXIOUS_DOG))
 		_game._player._needToWalk = false;
 
@@ -384,7 +384,7 @@ void Scene607::preActions() {
 		_game._player.walk(Common::Point(201, 107), FACING_SOUTHEAST);
 }
 
-void Scene607::actions() {
+static void room_607_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_SIDE_ENTRANCE))
 		_scene->_nextSceneId = 608;
 	else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room608.cpp b/engines/mads/madsv2/nebular/rooms/room608.cpp
index b2c60672561..aba1e7303ae 100644
--- a/engines/mads/madsv2/nebular/rooms/room608.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room608.cpp
@@ -59,7 +59,7 @@ Scene608::Scene608(RexNebularEngine *vm) : Scene6xx(vm) {
 	_dogTimer2 = 0;
 }
 
-void Scene608::synchronize(Common::Serializer &s) {
+void room_608_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_carMode);
@@ -207,7 +207,7 @@ void Scene608::handleThrowingBone() {
 	}
 }
 
-void Scene608::enter() {
+static void room_608_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRD_7");
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9");
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 2));
@@ -717,7 +717,7 @@ void Scene608::step() {
 	}
 }
 
-void Scene608::preActions() {
+static void room_608_pre_parser() {
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 
 	if ((_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE)
@@ -740,7 +740,7 @@ void Scene608::preActions() {
 		_buttonPressedonTimeFl = false;
 }
 
-void Scene608::actions() {
+static void room_608_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
 		_scene->_nextSceneId = 607;
 	else if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room609.cpp b/engines/mads/madsv2/nebular/rooms/room609.cpp
index 9e8b7bdf521..ca3e3b92c31 100644
--- a/engines/mads/madsv2/nebular/rooms/room609.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room609.cpp
@@ -31,7 +31,7 @@ Scene609::Scene609(RexNebularEngine *vm) : Scene6xx(vm) {
 	_videoDoorMode = -1;
 }
 
-void Scene609::synchronize(Common::Serializer &s) {
+void room_609_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_videoDoorMode);
@@ -42,7 +42,7 @@ void Scene609::setup() {
 	setAAName();
 }
 
-void Scene609::enter() {
+static void room_609_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0));
@@ -157,7 +157,7 @@ void Scene609::step() {
 	}
 }
 
-void Scene609::enterStore() {
+static void room_609_initStore() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -239,12 +239,12 @@ void Scene609::enterStore() {
 	}
 }
 
-void Scene609::preActions() {
+static void room_609_pre_parser() {
 	if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_VIDEO_STORE_DOOR))
 		_game._player.walk(Common::Point(78, 99), FACING_NORTHWEST);
 }
 
-void Scene609::actions() {
+static void room_609_parser() {
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ALLEY))
 		_scene->_nextSceneId = 611;
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_VIDEO_STORE_DOOR)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room610.cpp b/engines/mads/madsv2/nebular/rooms/room610.cpp
index fb2410b7f80..faa8fda67b5 100644
--- a/engines/mads/madsv2/nebular/rooms/room610.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room610.cpp
@@ -37,7 +37,7 @@ Scene610::Scene610(RexNebularEngine *vm) : Scene6xx(vm) {
 	_lastFrameTimer = 0;
 }
 
-void Scene610::synchronize(Common::Serializer &s) {
+void room_610_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_handsetHotspotId);
@@ -56,7 +56,7 @@ void Scene610::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene610::enter() {
+static void room_610_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9");
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
@@ -110,7 +110,7 @@ void Scene610::step() {
 	}
 }
 
-void Scene610::actions() {
+static void room_610_parser() {
 	if (_action.isAction(VERB_EXIT_FROM, NOUN_VIDEO_STORE))
 		_scene->_nextSceneId = 609;
 	else if (_action.isAction(VERB_TAKE, NOUN_PHONE_HANDSET)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room611.cpp b/engines/mads/madsv2/nebular/rooms/room611.cpp
index eb46d54a0b0..c8045dd9ede 100644
--- a/engines/mads/madsv2/nebular/rooms/room611.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room611.cpp
@@ -52,7 +52,7 @@ Scene611::Scene611(RexNebularEngine *vm) : Scene6xx(vm), _defaultDialogPos(0, 0)
 	_ratTimer = 0;
 }
 
-void Scene611::synchronize(Common::Serializer &s) {
+void room_611_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsByte(_seenRatFl);
@@ -928,7 +928,7 @@ void Scene611::displayHermitQuestions(int question) {
 	}
 }
 
-void Scene611::enter() {
+static void room_611_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9");
@@ -1355,7 +1355,7 @@ void Scene611::step() {
 	}
 }
 
-void Scene611::preActions() {
+static void room_611_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_ALLEY))
 		_game._player._walkOffScreenSceneId = 609;
 
@@ -1363,7 +1363,7 @@ void Scene611::preActions() {
 		_scene->_kernelMessages.reset();
 }
 
-void Scene611::actions() {
+static void room_611_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleDialog();
 	else if ((_action.isAction(VERB_GIVE, NOUN_PHONE_CELLS, NOUN_HERMIT)) || (_action.isAction(VERB_GIVE, NOUN_DURAFAIL_CELLS, NOUN_HERMIT))) {
diff --git a/engines/mads/madsv2/nebular/rooms/room612.cpp b/engines/mads/madsv2/nebular/rooms/room612.cpp
index 173320cf659..5f4d3143798 100644
--- a/engines/mads/madsv2/nebular/rooms/room612.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room612.cpp
@@ -32,7 +32,7 @@ Scene612::Scene612(RexNebularEngine *vm) : Scene6xx(vm) {
 	_cycleIndex = -1;
 }
 
-void Scene612::synchronize(Common::Serializer &s) {
+void room_612_synchronize(Common::Serializer &s) {
 	Scene6xx::synchronize(s);
 
 	s.syncAsSint16LE(_actionMode);
@@ -100,7 +100,7 @@ void Scene612::handleWinchMovement() {
 	}
 }
 
-void Scene612::enter() {
+static void room_612_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', -1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3");
@@ -166,7 +166,7 @@ void Scene612::step() {
 	}
 }
 
-void Scene612::actions() {
+static void room_612_parser() {
 	if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room620.cpp b/engines/mads/madsv2/nebular/rooms/room620.cpp
index 4e4512600d1..7c1d0e96a24 100644
--- a/engines/mads/madsv2/nebular/rooms/room620.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room620.cpp
@@ -32,7 +32,7 @@ void Scene620::setup() {
 	setAAName();
 }
 
-void Scene620::enter() {
+static void room_620_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
 	_game._player._stepEnabled = false;
diff --git a/engines/mads/madsv2/nebular/rooms/room701.cpp b/engines/mads/madsv2/nebular/rooms/room701.cpp
index 62138ba4613..8a84eecec9d 100644
--- a/engines/mads/madsv2/nebular/rooms/room701.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room701.cpp
@@ -31,7 +31,7 @@ Scene701::Scene701(RexNebularEngine *vm) : Scene7xx(vm) {
 	_fishingLineId = -1;
 }
 
-void Scene701::synchronize(Common::Serializer &s) {
+void room_701_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 
 	s.syncAsSint16LE(_fishingLineId);
@@ -47,7 +47,7 @@ void Scene701::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene701::enter() {
+static void room_701_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 5));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', 0));
@@ -207,7 +207,7 @@ void Scene701::step() {
 	}
 }
 
-void Scene701::preActions() {
+static void room_701_pre_parser() {
 	if (_action.isAction(VERB_WALKTO, NOUN_EAST_END_OF_PLATFORM))
 		_game._player._walkOffScreenSceneId = 702;
 
@@ -218,7 +218,7 @@ void Scene701::preActions() {
 		_game._player.walk(Common::Point(154, 129), FACING_NORTH);
 }
 
-void Scene701::actions() {
+static void room_701_parser() {
 	if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM)) {
 	} else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_BUILDING) && _game._objects[OBJ_VASE]._roomNumber == 706) {
 		switch (_game._trigger) {
diff --git a/engines/mads/madsv2/nebular/rooms/room702.cpp b/engines/mads/madsv2/nebular/rooms/room702.cpp
index da6ea6aa0a1..9621f537811 100644
--- a/engines/mads/madsv2/nebular/rooms/room702.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room702.cpp
@@ -32,7 +32,7 @@ void Scene702::setup() {
 	setAAName();
 }
 
-void Scene702::enter() {
+static void room_702_init() {
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
 
 	if (_scene->_priorSceneId == 701) {
@@ -63,12 +63,12 @@ void Scene702::enter() {
 	sceneEntrySound();
 }
 
-void Scene702::preActions() {
+static void room_702_pre_parser() {
 	if (_action.isAction(VERB_WALKTO, NOUN_WEST_END_OF_PLATFORM))
 		_game._player._walkOffScreenSceneId = 701;
 }
 
-void Scene702::actions() {
+static void room_702_parser() {
 	if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
 		; // Only set the action as finished
 	else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room703.cpp b/engines/mads/madsv2/nebular/rooms/room703.cpp
index 355550a73b7..d474dd7d6d5 100644
--- a/engines/mads/madsv2/nebular/rooms/room703.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room703.cpp
@@ -42,7 +42,7 @@ Scene703::Scene703(RexNebularEngine *vm) : Scene7xx(vm) {
 	_monsterTime = 0;
 }
 
-void Scene703::synchronize(Common::Serializer &s) {
+void room_703_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 
 	s.syncAsSint16LE(_monsterMode);
@@ -143,7 +143,7 @@ void Scene703::handleFillBottle(int quote) {
 	}
 }
 
-void Scene703::enter() {
+static void room_703_init() {
 	_game._player._visible = false;
 
 	if (!_game._visitedScenes._sceneRevisited) {
@@ -501,7 +501,7 @@ void Scene703::step() {
 	}
 }
 
-void Scene703::actions() {
+static void room_703_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleFillBottle(_action._activeAction._verbId);
 	else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_DOCK_TO_SOUTH)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room704.cpp b/engines/mads/madsv2/nebular/rooms/room704.cpp
index b8e06147311..eab84019ef3 100644
--- a/engines/mads/madsv2/nebular/rooms/room704.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room704.cpp
@@ -36,7 +36,7 @@ Scene704::Scene704(RexNebularEngine *vm) : Scene7xx(vm) {
 	_takeBottleFl = false;
 }
 
-void Scene704::synchronize(Common::Serializer &s) {
+void room_704_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 
 	s.syncAsSint16LE(_bottleHotspotId);
@@ -133,7 +133,7 @@ void Scene704::handleFillBottle(int quote) {
 	}
 }
 
-void Scene704::enter() {
+static void room_704_init() {
 	if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
 		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
@@ -329,7 +329,7 @@ void Scene704::step() {
 	}
 }
 
-void Scene704::actions() {
+static void room_704_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleFillBottle(_action._activeAction._verbId);
 	else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room705.cpp b/engines/mads/madsv2/nebular/rooms/room705.cpp
index bcb6f51c8b3..1d1402aec38 100644
--- a/engines/mads/madsv2/nebular/rooms/room705.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room705.cpp
@@ -32,7 +32,7 @@ void Scene705::setup() {
 	setAAName();
 }
 
-void Scene705::synchronize(Common::Serializer &s) {
+void room_705_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 }
 
@@ -114,7 +114,7 @@ void Scene705::handleFillBottle(int quote) {
 	}
 }
 
-void Scene705::enter() {
+static void room_705_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
@@ -222,7 +222,7 @@ void Scene705::step() {
 	}
 }
 
-void Scene705::actions() {
+static void room_705_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleFillBottle(_action._activeAction._verbId);
 	else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room706.cpp b/engines/mads/madsv2/nebular/rooms/room706.cpp
index 123b31cbae5..ced35bfad70 100644
--- a/engines/mads/madsv2/nebular/rooms/room706.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room706.cpp
@@ -36,7 +36,7 @@ Scene706::Scene706(RexNebularEngine *vm) : Scene7xx(vm) {
 	_emptyPedestral = false;
 }
 
-void Scene706::synchronize(Common::Serializer &s) {
+void room_706_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 
 	s.syncAsSint16LE(_vaseHotspotId);
@@ -122,7 +122,7 @@ void Scene706::handleTakeVase() {
 	}
 }
 
-void Scene706::enter() {
+static void room_706_init() {
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_3");
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1));
 
@@ -221,12 +221,12 @@ void Scene706::step() {
 	}
 }
 
-void Scene706::preActions() {
+static void room_706_pre_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_PORTRAIT))
 		_game._player._needToWalk = true;
 }
 
-void Scene706::actions() {
+static void room_706_parser() {
 	if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
diff --git a/engines/mads/madsv2/nebular/rooms/room707.cpp b/engines/mads/madsv2/nebular/rooms/room707.cpp
index b9ff3a7c49b..ceaf1eb3249 100644
--- a/engines/mads/madsv2/nebular/rooms/room707.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room707.cpp
@@ -33,7 +33,7 @@ void Scene707::setup() {
 	_game._aaName = Resources::formatAAName(5);
 }
 
-void Scene707::enter() {
+static void room_707_init() {
 	_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
 	teleporterEnter();
 
@@ -48,7 +48,7 @@ void Scene707::step() {
 	teleporterStep();
 }
 
-void Scene707::actions() {
+static void room_707_parser() {
 	if (teleporterActions()) {
 		_action._inProgress = false;
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room710.cpp b/engines/mads/madsv2/nebular/rooms/room710.cpp
index 151cc8e57f3..d39756b2753 100644
--- a/engines/mads/madsv2/nebular/rooms/room710.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room710.cpp
@@ -32,7 +32,7 @@ void Scene710::setup() {
 	setAAName();
 }
 
-void Scene710::enter() {
+static void room_710_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 
 	if (_game._objects[OBJ_VASE]._roomNumber == 706) {
@@ -55,7 +55,7 @@ void Scene710::step() {
 	}
 }
 
-void Scene710::actions() {
+static void room_710_parser() {
 	if (_action.isAction(VERB_PUT_DOWN, NOUN_BINOCULARS)) {
 		_game._player._stepEnabled = false;
 
diff --git a/engines/mads/madsv2/nebular/rooms/room711.cpp b/engines/mads/madsv2/nebular/rooms/room711.cpp
index b57d3ccf3af..defada6b257 100644
--- a/engines/mads/madsv2/nebular/rooms/room711.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room711.cpp
@@ -46,7 +46,7 @@ void Scene711::setup() {
 	_game._player._spritesPrefix = "";
 }
 
-void Scene711::enter() {
+static void room_711_init() {
 	if (_globals[kSexOfRex] == REX_FEMALE)
 		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
 	else
@@ -65,7 +65,7 @@ void Scene711::step() {
 	teleporterStep();
 }
 
-void Scene711::actions() {
+static void room_711_parser() {
 	if (teleporterActions())
 		_action._inProgress = false;
 }
diff --git a/engines/mads/madsv2/nebular/rooms/room751.cpp b/engines/mads/madsv2/nebular/rooms/room751.cpp
index 140e7e4db32..699dcf5db75 100644
--- a/engines/mads/madsv2/nebular/rooms/room751.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room751.cpp
@@ -31,7 +31,7 @@ Scene751::Scene751(RexNebularEngine *vm) : Scene7xx(vm) {
 	_rexHandingLine = false;
 }
 
-void Scene751::synchronize(Common::Serializer &s) {
+void room_751_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 
 	s.syncAsByte(_rexHandingLine);
@@ -44,7 +44,7 @@ void Scene751::setup() {
 	_scene->addActiveVocab(VERB_WALKTO);
 }
 
-void Scene751::enter() {
+static void room_751_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RM701X0");
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
@@ -168,7 +168,7 @@ void Scene751::step() {
 	}
 }
 
-void Scene751::preActions() {
+static void room_751_pre_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_TALL_BUILDING))
 		_game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
 
@@ -210,7 +210,7 @@ void Scene751::preActions() {
 	}
 }
 
-void Scene751::actions() {
+static void room_751_parser() {
 	if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
 		; // Nothing
 	else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_TALL_BUILDING)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room752.cpp b/engines/mads/madsv2/nebular/rooms/room752.cpp
index 8b2117d1814..1c8d9fb6e51 100644
--- a/engines/mads/madsv2/nebular/rooms/room752.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room752.cpp
@@ -31,7 +31,7 @@ Scene752::Scene752(RexNebularEngine *vm) : Scene7xx(vm) {
 	_cardId = -1;
 }
 
-void Scene752::synchronize(Common::Serializer &s) {
+void room_752_synchronize(Common::Serializer &s) {
 	Scene7xx::synchronize(s);
 
 	s.syncAsSint16LE(_cardId);
@@ -47,7 +47,7 @@ void Scene752::setup() {
 	_scene->addActiveVocab(NOUN_LASER_BEAM);
 }
 
-void Scene752::enter() {
+static void room_752_init() {
 	_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('l', -1));
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
 
@@ -106,13 +106,13 @@ void Scene752::step() {
 	}
 }
 
-void Scene752::preActions() {
+static void room_752_pre_parser() {
 	if (_action.isAction(VERB_WALKTO, NOUN_WEST_END_OF_PLATFORM)) {
 		_game._player._walkOffScreenSceneId = 751;
 	}
 }
 
-void Scene752::actions() {
+static void room_752_parser() {
 	if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
 		;
 	else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room801.cpp b/engines/mads/madsv2/nebular/rooms/room801.cpp
index 2d932c4a7db..baad8183a80 100644
--- a/engines/mads/madsv2/nebular/rooms/room801.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room801.cpp
@@ -31,7 +31,7 @@ Scene801::Scene801(RexNebularEngine *vm) : Scene8xx(vm) {
 	_walkThroughDoor = false;
 }
 
-void Scene801::synchronize(Common::Serializer &s) {
+void room_801_synchronize(Common::Serializer &s) {
 	Scene8xx::synchronize(s);
 
 	s.syncAsByte(_walkThroughDoor);
@@ -42,7 +42,7 @@ void Scene801::setup() {
 	setAAName();
 }
 
-void Scene801::enter() {
+static void room_801_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
@@ -201,7 +201,7 @@ void Scene801::step() {
 	}
 }
 
-void Scene801::preActions() {
+static void room_801_pre_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL)) {
 		_game._player.walk(Common::Point(148, 110), FACING_NORTH);
 		_game._player._needToWalk = true;
@@ -218,7 +218,7 @@ void Scene801::preActions() {
 	}
 }
 
-void Scene801::actions() {
+static void room_801_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
 		_scene->_nextSceneId = 808;
 	else if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room802.cpp b/engines/mads/madsv2/nebular/rooms/room802.cpp
index eeff99e1b9d..5037efdbc33 100644
--- a/engines/mads/madsv2/nebular/rooms/room802.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room802.cpp
@@ -35,7 +35,7 @@ void Scene802::setup() {
 	_scene->addActiveVocab(NOUN_REMOTE);
 }
 
-void Scene802::enter() {
+static void room_802_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_8");
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 2));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
@@ -115,7 +115,7 @@ void Scene802::step() {
 		_vm->_sound->command(13);
 }
 
-void Scene802::preActions() {
+static void room_802_pre_parser() {
 	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_BUILDING_TO_WEST))
 		_game._player._walkOffScreenSceneId = 801;
 
@@ -128,7 +128,7 @@ void Scene802::preActions() {
 		_game._player._needToWalk = false;
 }
 
-void Scene802::actions() {
+static void room_802_parser() {
 	if (_action.isAction(VERB_TAKE, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room803.cpp b/engines/mads/madsv2/nebular/rooms/room803.cpp
index 5f514dbe97c..b9124ceb537 100644
--- a/engines/mads/madsv2/nebular/rooms/room803.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room803.cpp
@@ -40,7 +40,7 @@ void Scene803::setup() {
 	}
 }
 
-void Scene803::enter() {
+static void room_803_init() {
 	_globals[kBetweenRooms] = false;
 	_game._player._visible = false;
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
@@ -247,7 +247,7 @@ void Scene803::step() {
 	}
 }
 
-void Scene803::preActions() {
+static void room_803_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
 		_game._player._walkOffScreenSceneId = 802;
 
@@ -255,7 +255,7 @@ void Scene803::preActions() {
 		_game._player._needToWalk = false;
 }
 
-void Scene803::actions() {
+static void room_803_parser() {
 	if (_action.isAction(VERB_TAKE, NOUN_GUTS)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room804.cpp b/engines/mads/madsv2/nebular/rooms/room804.cpp
index cba41e87276..8dfe7c1e841 100644
--- a/engines/mads/madsv2/nebular/rooms/room804.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room804.cpp
@@ -40,7 +40,7 @@ Scene804::Scene804(RexNebularEngine *vm) : Scene8xx(vm) {
 	_resetFrame = -1;
 }
 
-void Scene804::synchronize(Common::Serializer &s) {
+void room_804_synchronize(Common::Serializer &s) {
 	Scene8xx::synchronize(s);
 
 	s.syncAsByte(_messWithThrottle);
@@ -60,7 +60,7 @@ void Scene804::setup() {
 	Scene8xx::setAAName();
 }
 
-void Scene804::enter() {
+static void room_804_init() {
 	_messWithThrottle = false;
 	_throttleCounter = 0;
 	_movingThrottle = false;
@@ -294,7 +294,7 @@ void Scene804::step() {
 	}
 }
 
-void Scene804::actions() {
+static void room_804_parser() {
 	if (_action.isAction(VERB_LOOK, NOUN_SERVICE_PANEL) ||
 		_action.isAction(VERB_OPEN, NOUN_SERVICE_PANEL)) {
 		_scene->_nextSceneId = 805;
diff --git a/engines/mads/madsv2/nebular/rooms/room805.cpp b/engines/mads/madsv2/nebular/rooms/room805.cpp
index 9b49d34ed1d..cc615326658 100644
--- a/engines/mads/madsv2/nebular/rooms/room805.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room805.cpp
@@ -35,7 +35,7 @@ void Scene805::setup() {
 	_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
 }
 
-void Scene805::enter() {
+static void room_805_init() {
 	_game._player._visible = false;
 	_scene->_userInterface.setup(kInputLimitedSentences);
 
@@ -101,11 +101,11 @@ void Scene805::step() {
 	}
 }
 
-void Scene805::preActions() {
+static void room_805_pre_parser() {
 	_game._player._needToWalk = false;
 }
 
-void Scene805::actions() {
+static void room_805_parser() {
 	if (_action.isAction(VERB_EXIT, NOUN_SERVICE_PANEL))
 		_scene->_nextSceneId = 804;
 	else if (_action.isAction(VERB_INSTALL, NOUN_SHIELD_MODULATOR) && _game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room807.cpp b/engines/mads/madsv2/nebular/rooms/room807.cpp
index 6dd541377ad..58090c51bff 100644
--- a/engines/mads/madsv2/nebular/rooms/room807.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room807.cpp
@@ -33,7 +33,7 @@ void Scene807::setup() {
 	_game._aaName = Resources::formatAAName(5);
 }
 
-void Scene807::enter() {
+static void room_807_init() {
 	if (_globals[kSexOfRex] == REX_FEMALE)
 		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
 	else
@@ -52,7 +52,7 @@ void Scene807::step() {
 	teleporterStep();
 }
 
-void Scene807::actions() {
+static void room_807_parser() {
 	if (teleporterActions()) {
 		_action._inProgress = false;
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room808.cpp b/engines/mads/madsv2/nebular/rooms/room808.cpp
index e2e621896ec..4afa439572d 100644
--- a/engines/mads/madsv2/nebular/rooms/room808.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room808.cpp
@@ -31,7 +31,7 @@ Scene808::Scene808(RexNebularEngine *vm) : Scene8xx(vm) {
 	_goingTo803 = false;
 }
 
-void Scene808::synchronize(Common::Serializer &s) {
+void room_808_synchronize(Common::Serializer &s) {
 	Scene8xx::synchronize(s);
 
 	s.syncAsByte(_goingTo803);
@@ -42,7 +42,7 @@ void Scene808::setup() {
 	setAAName();
 }
 
-void Scene808::enter() {
+static void room_808_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
@@ -83,7 +83,7 @@ void Scene808::enter() {
 	sceneEntrySound();
 }
 
-void Scene808::actions() {
+static void room_808_parser() {
 	if (_action.isAction(VERB_PRESS, NOUN_START_BUTTON_2)) {
 		switch (_game._trigger) {
 		case 0:
diff --git a/engines/mads/madsv2/nebular/rooms/room810.cpp b/engines/mads/madsv2/nebular/rooms/room810.cpp
index 87726621c45..11a43580d2e 100644
--- a/engines/mads/madsv2/nebular/rooms/room810.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room810.cpp
@@ -31,7 +31,7 @@ Scene810::Scene810(RexNebularEngine *vm) : Scene8xx(vm) {
 	_moveAllowed = false;
 }
 
-void Scene810::synchronize(Common::Serializer &s) {
+void room_810_synchronize(Common::Serializer &s) {
 	Scene8xx::synchronize(s);
 
 	s.syncAsByte(_moveAllowed);
@@ -42,7 +42,7 @@ void Scene810::setup() {
 	setAAName();
 }
 
-void Scene810::enter() {
+static void room_810_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
 	_game._player._stepEnabled = false;
diff --git a/engines/mads/madsv2/nebular/rooms/section4.cpp b/engines/mads/madsv2/nebular/rooms/section4.cpp
index ffed0ec784c..ddf74271533 100644
--- a/engines/mads/madsv2/nebular/rooms/section4.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section4.cpp
@@ -19,59 +19,62 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
-#include "mads/nebular/nebular.h"
-#include "mads/nebular/core/scene.h"
-#include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes4.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
-
-void Scene4xx::setAAName() {
-	_game._aaName = Resources::formatAAName(4);
+void section_4_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(4));
 }
 
-void Scene4xx::setPlayerSpritesPrefix() {
-	_vm->_sound->command(5);
-	Common::String oldName = _game._player._spritesPrefix;
+void section_4_walker() {
+	g_engine->_soundManager->command(5);
+	Common::String oldName = player.series_name;
 
-	if ((_scene->_nextSceneId == 403) || (_scene->_nextSceneId == 409))
-		_game._player._spritesPrefix = "";
-	else if (_globals[kSexOfRex] == REX_FEMALE)
-		_game._player._spritesPrefix = "ROX";
+	if ((new_room == 403) || (new_room == 409))
+		*player.series_name = '\0';
+	else if (global[kSexOfRex] == REX_FEMALE)
+		Common::strcpy_s(player.series_name, "ROX");
 	else
-		_game._player._spritesPrefix = "RXM";
+		Common::strcpy_s(player.series_name, "RXM");
 
-	_game._player._scalingVelocity = true;
+	player.scaling_velocity = true;
 
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
+	if (oldName != Common::String(player.series_name))
+		player.walker_must_reload = true;
 
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
+	pal_change_color(16, 10, 63, 63);
+	pal_change_color(17, 10, 45, 45);
 }
 
-void Scene4xx::sceneEntrySound() {
-	if (!_vm->_musicFlag) {
-		_vm->_sound->command(2);
+void section_4_music() {
+	if (!config_file.music_flag) {
+		g_engine->_soundManager->command(2);
 		return;
 	}
 
-	switch (_scene->_nextSceneId) {
+	switch (new_room) {
 	case 401:
-		_vm->_sound->startQueuedCommands();
-		if (_scene->_priorSceneId == 402)
-			_vm->_sound->command(12, 64);
+		g_engine->_soundManager->startQueuedCommands();
+		if (previous_room == 402)
+			g_engine->_soundManager->command(12, 64);
 		else
-			_vm->_sound->command(12, 1);
+			g_engine->_soundManager->command(12, 1);
 		break;
 
 	case 402:
-		_vm->_sound->startQueuedCommands();
-		_vm->_sound->command(12, 127);
+		g_engine->_soundManager->startQueuedCommands();
+		g_engine->_soundManager->command(12, 127);
 		break;
 
 	case 405:
@@ -79,11 +82,11 @@ void Scene4xx::sceneEntrySound() {
 	case 409:
 	case 410:
 	case 413:
-		_vm->_sound->command(10);
+		g_engine->_soundManager->command(10);
 		break;
 
 	case 408:
-		_vm->_sound->command(52);
+		g_engine->_soundManager->command(52);
 		break;
 
 	default:
@@ -91,5 +94,7 @@ void Scene4xx::sceneEntrySound() {
 	}
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index e8ab2345624..529b2175615 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -88,7 +88,15 @@ Game::Object Game::Objects::operator[](int idx) {
 	return Game::Object(idx);
 }
 
-Game::Object::Object(int idx) : _roomNumber(object[idx].location) {
+Game::Object::Object(int idx) : _object_id(idx), _roomNumber(object[idx].location) {
+}
+
+int Game::Object::getQuality(int quality_id) {
+	return object_check_quality(_object_id, quality_id);
+}
+
+void Game::Object::setQuality(int quality_id, long quality_value) {
+	object_set_quality(_object_id, quality_id, quality_value);
 }
 
 void Game::VisitedScenes::add(int roomNum) {
@@ -152,6 +160,10 @@ void Game::Player::removePlayerSprites() {
 	kernel_dump_walker_only();
 }
 
+void Game::Player::selectSeries() {
+	player_select_series();
+}
+
 char *Resources::formatName(int my_room, char type, int num, int ext, const char *text) {
 	return kernel_full_name(my_room, type, num, text, ext);
 }
@@ -160,6 +172,9 @@ char *Resources::formatAAName(int num) {
 	return kernel_interface_name(num);
 }
 
+Scene::Animation::Animation(int anim_id) : _id(anim_id), _currentFrame(kernel_anim[anim_id].frame) {
+}
+
 Scene::Animation &Scene::Animation::operator=(std::nullptr_t) {
 	error("TODO: Animation operator=");
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 83c2e56cd64..a5a75f3047b 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -27,6 +27,7 @@
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/mcga.h"
+#include "mads/madsv2/core/object.h"
 #include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/sprite.h"
 #include "mads/madsv2/core/text.h"
@@ -153,6 +154,15 @@ struct Scene {
 	}
 
 	struct Animation {
+		int16 _id;
+		int &_currentFrame;
+
+		// TODO: Not sure what to map this to
+		bool _resetFlag = false;
+		int16 _spriteListIndexes[16] = {};
+
+		Animation(int anim_id);
+
 		Animation *operator->() {
 			return this;
 		}
@@ -160,7 +170,6 @@ struct Scene {
 			return this;
 		}
 
-		int16 _id = -1;
 		bool operator!() const {
 			return _id == -1;
 		}
@@ -175,16 +184,18 @@ struct Scene {
 		}
 		Animation &operator=(std::nullptr_t);
 
-		// TODO: Not sure what to map this to
-		bool _resetFlag;
-		int16 _spriteListIndexes[16];
 
 		int getCurrentFrame() const;
 		void setNextFrameTimer(long time);
 		void setCurrentFrame(int frameNum);
 		void resetSpriteSetsCount();
 	};
-	Animation _animation[10];
+	struct Animations {
+		Animation operator[](int anim_id) {
+			return Animation(anim_id);
+		}
+	};
+	Animations _animation;
 
 	struct CustomDest {
 		int &x = inter_point_x;
@@ -379,9 +390,12 @@ struct Game {
 	}
 
 	struct Object {
+		int _object_id;
 		int16 &_roomNumber;
 
 		Object(int objectNum);
+		int getQuality(int quality_id);
+		void setQuality(int quality_id, long quality_value);
 	};
 
 	struct Objects {
@@ -449,6 +463,25 @@ struct Game {
 		};
 		PlayerPrepare _prepareWalkPos;
 
+		struct TargetPos {
+			int &x = player.target_x;
+			int &y = player.target_y;
+
+			TargetPos &operator=(const Common::Point &pt) {
+				x = pt.x;
+				y = pt.y;
+				return *this;
+			}
+			operator Common::Point() {
+				return Common::Point(x, y);
+			}
+
+			bool operator==(const Common::Point &rhs) const {
+				return x == rhs.x && y == rhs.y;
+			}
+		};
+		TargetPos _targetPos;
+
 		int &_facing = player.facing;
 		int &_prepareFacing = player.prepare_walk_facing;
 		bool &_visible = player.walker_visible;
@@ -476,6 +509,7 @@ struct Game {
 		void cancelCommand();
 		void update();
 		void removePlayerSprites();
+		void selectSeries();
 	};
 	Player _player;
 
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index bbec7f50624..8c713c32fc8 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -130,9 +130,20 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room390.o \
 	madsv2/nebular/rooms/room391.o \
 	madsv2/nebular/rooms/room399.o \
+	madsv2/nebular/rooms/room401.o \
+	madsv2/nebular/rooms/room402.o \
+	madsv2/nebular/rooms/room405.o \
+	madsv2/nebular/rooms/room406.o \
+	madsv2/nebular/rooms/room407.o \
+	madsv2/nebular/rooms/room408.o \
+	madsv2/nebular/rooms/room409.o \
+	madsv2/nebular/rooms/room410.o \
+	madsv2/nebular/rooms/room411.o \
+	madsv2/nebular/rooms/room413.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/nebular/rooms/section2.o \
 	madsv2/nebular/rooms/section3.o \
+	madsv2/nebular/rooms/section4.o \
 	madsv2/nebular/rooms/conversation.o \
 	madsv2/nebular/rooms/forcefield.o \
 	madsv2/nebular/rooms/teleporter.o \


Commit: 62e560390283905f81d1ddaf248024bf06b82de5
    https://github.com/scummvm/scummvm/commit/62e560390283905f81d1ddaf248024bf06b82de5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:44+10:00

Commit Message:
MADS: NEBULAR: Implemented section 5 rooms

Changed paths:
    engines/mads/madsv2/nebular/rooms/room501.cpp
    engines/mads/madsv2/nebular/rooms/room502.cpp
    engines/mads/madsv2/nebular/rooms/room503.cpp
    engines/mads/madsv2/nebular/rooms/room504.cpp
    engines/mads/madsv2/nebular/rooms/room505.cpp
    engines/mads/madsv2/nebular/rooms/room506.cpp
    engines/mads/madsv2/nebular/rooms/room507.cpp
    engines/mads/madsv2/nebular/rooms/room508.cpp
    engines/mads/madsv2/nebular/rooms/room511.cpp
    engines/mads/madsv2/nebular/rooms/room512.cpp
    engines/mads/madsv2/nebular/rooms/room513.cpp
    engines/mads/madsv2/nebular/rooms/room515.cpp
    engines/mads/madsv2/nebular/rooms/room551.cpp
    engines/mads/madsv2/nebular/rooms/section5.cpp
    engines/mads/madsv2/nebular/rooms/section5.h
    engines/mads/madsv2/nebular/rooms/teleporter.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room501.cpp b/engines/mads/madsv2/nebular/rooms/room501.cpp
index 5000f78eacf..373f7e969d8 100644
--- a/engines/mads/madsv2/nebular/rooms/room501.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room501.cpp
@@ -19,60 +19,51 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene501::Scene501(RexNebularEngine *vm) : Scene5xx(vm) {
-	_mainSequenceId = -1;
-	_mainSpriteId = -1;
-	_doorHotspotid = -1;
+struct Scratch {
+	int32 _mainSequenceId;
+	int32 _mainSpriteId;
+	int32 _doorHotspotid;
+	bool _rexPunched;
+};
 
-	_rexPunched = false;
-}
-
-void room_501_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
-
-	s.syncAsSint16LE(_mainSequenceId);
-	s.syncAsSint16LE(_mainSpriteId);
-	s.syncAsSint16LE(_doorHotspotid);
-	s.syncAsByte(_rexPunched);
-}
-
-void Scene501::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_DOOR);
-	_scene->addActiveVocab(VERB_WALK_THROUGH);
-}
+static Scratch local;
 
-void Scene501::handleSlotActions() {
+static void handleSlotActions() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		int numTicks, frameIndex;
 		if (_globals[kSexOfRex] == REX_MALE) {
-			_mainSpriteId = _globals._spriteIndexes[4];
+			local._mainSpriteId = _globals._spriteIndexes[4];
 			numTicks = 8;
 			frameIndex = 3;
 		} else {
-			_mainSpriteId = _globals._spriteIndexes[5];
+			local._mainSpriteId = _globals._spriteIndexes[5];
 			numTicks = 10;
 			frameIndex = 2;
 		}
 
-		_mainSequenceId = _scene->_sequences.startPingPongCycle(_mainSpriteId, false, numTicks, 1, 0, 0);
-		_scene->_sequences.setAnimRange(_mainSequenceId, 1, frameIndex);
-		_scene->_sequences.setMsgLayout(_mainSequenceId);
+		local._mainSequenceId = _scene->_sequences.startPingPongCycle(local._mainSpriteId, false, numTicks, 1, 0, 0);
+		_scene->_sequences.setAnimRange(local._mainSequenceId, 1, frameIndex);
+		_scene->_sequences.setMsgLayout(local._mainSequenceId);
 		_vm->_sound->command(10);
-		_scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_SPRITE, frameIndex, 1);
-		_scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+		_scene->_sequences.addSubEntry(local._mainSequenceId, SEQUENCE_TRIGGER_SPRITE, frameIndex, 1);
+		_scene->_sequences.addSubEntry(local._mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 		break;
 
 	case 1:
@@ -80,7 +71,7 @@ void Scene501::handleSlotActions() {
 		break;
 
 	case 2:
-		_scene->_sequences.updateTimeout(-1, _mainSequenceId);
+		_scene->_sequences.updateTimeout(-1, local._mainSequenceId);
 		_game._player._visible = true;
 		_scene->_sequences.addTimer(15, 3);
 		break;
@@ -110,12 +101,12 @@ static void room_501_init() {
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
 	int idx = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
-	_doorHotspotid = _scene->_dynamicHotspots.setPosition(idx, Common::Point(282, 110), FACING_NORTH);
-	_scene->_dynamicHotspots.setCursor(_doorHotspotid, CURSOR_GO_UP);
+	local._doorHotspotid = _scene->_dynamicHotspots.setPosition(idx, Common::Point(282, 110), FACING_NORTH);
+	_scene->_dynamicHotspots.setCursor(local._doorHotspotid, CURSOR_GO_UP);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
 	_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
-	_rexPunched = true;
+	local._rexPunched = true;
 
 	if (_scene->_priorSceneId == 504) {
 		_game._player._stepEnabled = false;
@@ -143,14 +134,14 @@ static void room_501_init() {
 		_game._objects.addToInventory(OBJ_ID_CARD);
 	}
 
-	sceneEntrySound();
+	section_5_music();
 	_game.loadQuoteSet(0x275, 0x276, 0x277, 0);
 
 	if (!_game._visitedScenes._sceneRevisited)
 		_scene->_sequences.addTimer(2, 90);
 }
 
-void Scene501::step() {
+static void room_501_daemon() {
 	if (_game._trigger == 90)
 		_vm->_dialogs->show(50127);
 
@@ -167,7 +158,7 @@ void Scene501::step() {
 			break;
 
 		case 81:
-			_scene->_dynamicHotspots.remove(_doorHotspotid);
+			_scene->_dynamicHotspots.remove(local._doorHotspotid);
 			_game._player.walk(Common::Point(276, 110), FACING_SOUTHWEST);
 			_scene->_sequences.addTimer(120, 82);
 			break;
@@ -176,9 +167,9 @@ void Scene501::step() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
 			_vm->_sound->command(12);
-			_doorHotspotid = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			local._doorHotspotid = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(_globals._sequenceIndexes[3], Common::Point(282, 110), FACING_NORTH);
-			_scene->_dynamicHotspots.setCursor(_doorHotspotid, CURSOR_GO_UP);
+			_scene->_dynamicHotspots.setCursor(local._doorHotspotid, CURSOR_GO_UP);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
 			break;
 
@@ -254,21 +245,21 @@ static void room_501_parser() {
 		case 2:
 			_game._player._visible = false;
 			if (_globals[kSexOfRex] == REX_MALE)
-				_mainSpriteId = _globals._spriteIndexes[6];
+				local._mainSpriteId = _globals._spriteIndexes[6];
 			else
-				_mainSpriteId = _globals._spriteIndexes[7];
+				local._mainSpriteId = _globals._spriteIndexes[7];
 
-			_mainSequenceId = _scene->_sequences.addSpriteCycle(_mainSpriteId, false, 8, 1, 0, 0);
-			_scene->_sequences.setMsgLayout(_mainSequenceId);
-			_scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+			local._mainSequenceId = _scene->_sequences.addSpriteCycle(local._mainSpriteId, false, 8, 1, 0, 0);
+			_scene->_sequences.setMsgLayout(local._mainSequenceId);
+			_scene->_sequences.addSubEntry(local._mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			break;
 
 		case 3:
 		{
-			int syncIdx = _mainSequenceId;
-			_mainSequenceId = _scene->_sequences.startCycle(_mainSpriteId, false, -2);
-			_scene->_sequences.setMsgLayout(_mainSequenceId);
-			_scene->_sequences.updateTimeout(_mainSequenceId, syncIdx);
+			int syncIdx = local._mainSequenceId;
+			local._mainSequenceId = _scene->_sequences.startCycle(local._mainSpriteId, false, -2);
+			_scene->_sequences.setMsgLayout(local._mainSequenceId);
+			_scene->_sequences.updateTimeout(local._mainSequenceId, syncIdx);
 			_scene->_sequences.addTimer(30, 4);
 		}
 		break;
@@ -297,7 +288,7 @@ static void room_501_parser() {
 				_vm->_sound->command(13);
 				_scene->loadAnimation(formAnimName('G', 1), 5);
 			} else {
-				_rexPunched = false;
+				local._rexPunched = false;
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 6, 120, _game.getQuote(0x277));
 			}
@@ -311,10 +302,10 @@ static void room_501_parser() {
 
 		case 6:
 			if (_globals[kSexOfRex] == REX_MALE) {
-				if (_rexPunched) {
+				if (local._rexPunched) {
 					_scene->_kernelMessages.reset();
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x275));
-					_rexPunched = false;
+					local._rexPunched = false;
 				} else {
 					_scene->_kernelMessages.reset();
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x276));
@@ -337,7 +328,7 @@ static void room_501_parser() {
 
 		case 4:
 			_scene->_sequences.remove(_globals._sequenceIndexes[3]);
-			_scene->_dynamicHotspots.remove(_doorHotspotid);
+			_scene->_dynamicHotspots.remove(local._doorHotspotid);
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
 			_vm->_sound->command(11);
@@ -412,6 +403,26 @@ static void room_501_parser() {
 	_action._inProgress = false;
 }
 
+void room_501_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._mainSequenceId);
+	s.syncAsSint16LE(local._mainSpriteId);
+	s.syncAsSint16LE(local._doorHotspotid);
+	s.syncAsByte(local._rexPunched);
+}
+
+void room_501_preload() {
+	room_init_code_pointer = room_501_init;
+	room_daemon_code_pointer = room_501_daemon;
+	room_pre_parser_code_pointer = room_501_pre_parser;
+	room_parser_code_pointer = room_501_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_DOOR);
+	_scene->addActiveVocab(VERB_WALK_THROUGH);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room502.cpp b/engines/mads/madsv2/nebular/rooms/room502.cpp
index 85524c8f763..044e49c43d4 100644
--- a/engines/mads/madsv2/nebular/rooms/room502.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room502.cpp
@@ -19,29 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene502::setup() {
-	_game._player._spritesPrefix = "";
-	// The original is using Scene5xx_setAAName()
-	_game._aaName = Resources::formatAAName(5);
-}
+namespace Rooms {
 
 static void room_502_init() {
 	if (_globals[kSexOfRex] == REX_MALE)
-		_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
 	else
-		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
 
-	teleporterEnter();
+	teleporter_init();
 
-	// The original uses scene5xx_sceneEntrySound
+	// The original uses scene5xx_section_5_music
 	if (!_vm->_musicFlag)
 		_vm->_sound->command(2);
 	else if (_scene->_priorSceneId == 503)
@@ -50,12 +51,12 @@ static void room_502_init() {
 		_vm->_sound->command(29);
 }
 
-void Scene502::step() {
-	teleporterStep();
+static void room_502_daemon() {
+	teleporter_daemon();
 }
 
 static void room_502_parser() {
-	if (teleporterActions()) {
+	if (teleporter_parser()) {
 		_action._inProgress = false;
 		return;
 	}
@@ -82,6 +83,20 @@ static void room_502_parser() {
 	_action._inProgress = false;
 }
 
+void room_502_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_502_preload() {
+	room_init_code_pointer = room_502_init;
+	room_daemon_code_pointer = room_502_daemon;
+	room_parser_code_pointer = room_502_parser;
+
+	*player.series_name = '\0';
+	section_5_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room503.cpp b/engines/mads/madsv2/nebular/rooms/room503.cpp
index f31aa206b73..76547658e13 100644
--- a/engines/mads/madsv2/nebular/rooms/room503.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room503.cpp
@@ -19,30 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene503::Scene503(RexNebularEngine *vm) : Scene5xx(vm) {
-	_detonatorHotspotId = -1;
-}
-
-void room_503_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
+struct Scratch {
+	int16 _detonatorHotspotId;
+};
 
-	s.syncAsSint16LE(_detonatorHotspotId);
-}
+static Scratch local;
 
-void Scene503::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_DETONATORS);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_503_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
@@ -54,8 +50,8 @@ static void room_503_init() {
 
 	if (_game._objects[OBJ_DETONATORS]._roomNumber == _scene->_currentSceneId) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		_detonatorHotspotId = _scene->_dynamicHotspots.add(NOUN_DETONATORS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_detonatorHotspotId, Common::Point(254, 135), FACING_SOUTH);
+		local._detonatorHotspotId = _scene->_dynamicHotspots.add(NOUN_DETONATORS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._detonatorHotspotId, Common::Point(254, 135), FACING_SOUTH);
 	}
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
@@ -63,7 +59,7 @@ static void room_503_init() {
 		_game._player._facing = FACING_NORTHWEST;
 	}
 
-	sceneEntrySound();
+	section_5_music();
 }
 
 static void room_503_parser() {
@@ -93,7 +89,7 @@ static void room_503_parser() {
 			case 1:
 				_vm->_sound->command(9);
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-				_scene->_dynamicHotspots.remove(_detonatorHotspotId);
+				_scene->_dynamicHotspots.remove(local._detonatorHotspotId);
 				_game._objects.addToInventory(OBJ_DETONATORS);
 				_vm->_dialogs->showItem(OBJ_DETONATORS, 50326);
 				break;
@@ -157,6 +153,21 @@ static void room_503_parser() {
 	_action._inProgress = false;
 }
 
+void room_503_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._detonatorHotspotId);
+}
+
+void room_503_preload() {
+	room_init_code_pointer = room_503_init;
+	room_parser_code_pointer = room_503_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_DETONATORS);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room504.cpp b/engines/mads/madsv2/nebular/rooms/room504.cpp
index 4f75fdd3553..1d1c826323c 100644
--- a/engines/mads/madsv2/nebular/rooms/room504.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room504.cpp
@@ -19,30 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene504::Scene504(RexNebularEngine *vm) : Scene5xx(vm) {
-	_carAnimationMode = -1;
-	_carFrame = -1;
-}
-
-void room_504_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
+struct Scratch {
+	int32 _carAnimationMode;
+	int32 _carFrame;
+};
 
-	s.syncAsSint16LE(_carAnimationMode);
-	s.syncAsSint16LE(_carFrame);
-}
+static Scratch local;
 
-void Scene504::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
 
 static void room_504_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
@@ -60,17 +57,17 @@ static void room_504_init() {
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 0);
 	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
-	_carFrame = -1;
+	local._carFrame = -1;
 
 	if ((_scene->_priorSceneId == 505) && (_globals[kHoverCarDestination] != _globals[kHoverCarLocation])) {
-		_carAnimationMode = 1;
+		local._carAnimationMode = 1;
 		_scene->loadAnimation(formAnimName('A', -1));
 		_vm->_sound->command(14);
 		_scene->_sequences.addTimer(1, 70);
 		_game._player._stepEnabled = false;
 	} else {
 		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 3));
-		_carAnimationMode = 1;
+		local._carAnimationMode = 1;
 		_scene->loadAnimation(formAnimName('A', -1));
 		if ((_scene->_priorSceneId != RETURNING_FROM_DIALOG) && (_scene->_priorSceneId != 505))
 			_globals[kHoverCarLocation] = _scene->_priorSceneId;
@@ -81,23 +78,23 @@ static void room_504_init() {
 	if (_globals[kTimebombTimer] > 10500)
 		_globals[kTimebombTimer] = 10500;
 
-	sceneEntrySound();
+	section_5_music();
 }
 
-void Scene504::step() {
-	if ((_carAnimationMode == 1) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+static void room_504_daemon() {
+	if ((local._carAnimationMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame;
 
-			if (_carFrame == 1)
+			if (local._carFrame == 1)
 				nextFrame = 0;
 			else
 				nextFrame = -1;
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_carFrame = nextFrame;
+				local._carFrame = nextFrame;
 			}
 		}
 	}
@@ -109,7 +106,7 @@ void Scene504::step() {
 			if (_globals[kHoverCarDestination] != -1) {
 				_game._player._stepEnabled = false;
 				_scene->freeAnimation();
-				_carAnimationMode = 2;
+				local._carAnimationMode = 2;
 				if (((_globals[kHoverCarLocation] >= 500 && _globals[kHoverCarLocation] <= 599) &&
 					(_globals[kHoverCarDestination] >= 500 && _globals[kHoverCarDestination] <= 599)) ||
 					((_globals[kHoverCarLocation] >= 600 && _globals[kHoverCarLocation] <= 699) &&
@@ -235,6 +232,22 @@ static void room_504_parser() {
 	_action._inProgress = false;
 }
 
+void room_504_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._carAnimationMode);
+	s.syncAsSint16LE(local._carFrame);
+}
+
+void room_504_preload() {
+	room_init_code_pointer = room_504_init;
+	room_daemon_code_pointer = room_504_daemon;
+	room_pre_parser_code_pointer = room_504_pre_parser;
+	room_parser_code_pointer = room_504_parser;
+
+	*player.series_name = '\0';
+	section_5_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room505.cpp b/engines/mads/madsv2/nebular/rooms/room505.cpp
index f213ed18e57..03e84b636ad 100644
--- a/engines/mads/madsv2/nebular/rooms/room505.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room505.cpp
@@ -19,42 +19,31 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene505::Scene505(RexNebularEngine *vm) : Scene5xx(vm) {
-	_frame = -1;
-	_nextButtonId = -1;
-	_homeSelectedId = -1;
-	_selectedId = -1;
-	_activeCars = -1;
+struct Scratch {
+	int16 _frame;
+	int16 _nextButtonId;
+	int16 _homeSelectedId;
+	int16 _selectedId;
+	int16 _activeCars;
+	int16 _carLocations[9];
+};
 
-	for (int i = 0; i < 9; i++)
-		_carLocations[i] = -1;
-}
-
-void room_505_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
-
-	s.syncAsSint16LE(_frame);
-	s.syncAsSint16LE(_nextButtonId);
-	s.syncAsSint16LE(_homeSelectedId);
-	s.syncAsSint16LE(_selectedId);
-	s.syncAsSint16LE(_activeCars);
+static Scratch local;
 
-	for (int i = 0; i < 9; i++)
-		s.syncAsSint16LE(_carLocations[i]);
-}
-
-void Scene505::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
 
 static void room_505_init() {
 	for (int i = 0; i < 9; i++)
@@ -73,53 +62,53 @@ static void room_505_init() {
 	_scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
 	_scene->_sequences.addTimer(30, 62);
 
-	_carLocations[0] = 501;
-	_carLocations[1] = 506;
-	_carLocations[2] = 511;
-	_carLocations[3] = 513;
-	_carLocations[4] = 601;
-	_carLocations[5] = 604;
-	_carLocations[6] = 607;
-	_carLocations[7] = 609;
-	_carLocations[8] = 612;
+	local._carLocations[0] = 501;
+	local._carLocations[1] = 506;
+	local._carLocations[2] = 511;
+	local._carLocations[3] = 513;
+	local._carLocations[4] = 601;
+	local._carLocations[5] = 604;
+	local._carLocations[6] = 607;
+	local._carLocations[7] = 609;
+	local._carLocations[8] = 612;
 
-	_activeCars = false;
+	local._activeCars = false;
 
 	for (int i = 0; i < 9; i++) {
-		if (_globals[kHoverCarLocation] == _carLocations[i]) {
-			_homeSelectedId = i;
+		if (_globals[kHoverCarLocation] == local._carLocations[i]) {
+			local._homeSelectedId = i;
 			if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
-				_selectedId = i;
+				local._selectedId = i;
 		}
 	}
 
 	_game._player._visible = false;
 	_game._player._stepEnabled = false;
-	_frame = -1;
+	local._frame = -1;
 	_scene->loadAnimation(formAnimName('a', -1));
 	_scene->_animation[0]->setCurrentFrame(86);
 
-	sceneEntrySound();
+	section_5_music();
 	_vm->_sound->command(16);
 }
 
-void Scene505::step() {
-	if (_frame != _scene->_animation[0]->getCurrentFrame()) {
-		_frame = _scene->_animation[0]->getCurrentFrame();
+static void room_505_daemon() {
+	if (local._frame != _scene->_animation[0]->getCurrentFrame()) {
+		local._frame = _scene->_animation[0]->getCurrentFrame();
 		int resetFrame = -1;
 
-		switch (_frame) {
+		switch (local._frame) {
 		case 4:
 		case 24:
 		case 33:
 		case 53:
 		case 62:
 		case 82:
-			if (_nextButtonId == 0x38A)
+			if (local._nextButtonId == 0x38A)
 				resetFrame = 4;
-			else if (_nextButtonId == 0x38B)
+			else if (local._nextButtonId == 0x38B)
 				resetFrame = 33;
-			else if (_nextButtonId == 0x2DE)
+			else if (local._nextButtonId == 0x2DE)
 				resetFrame = 62;
 
 			break;
@@ -131,22 +120,22 @@ void Scene505::step() {
 			int this_button;
 			int old_select;
 			_vm->_sound->command(17);
-			old_select = _selectedId;
-			if (_frame == 15) {
+			old_select = local._selectedId;
+			if (local._frame == 15) {
 				this_button = 0x38A;
-				_selectedId = (_selectedId + 1) % 9;
-			} else if (_frame == 44) {
+				local._selectedId = (local._selectedId + 1) % 9;
+			} else if (local._frame == 44) {
 				this_button = 0x38B;
-				_selectedId--;
-				if (_selectedId < 0)
-					_selectedId = 8;
+				local._selectedId--;
+				if (local._selectedId < 0)
+					local._selectedId = 8;
 			} else {
 				this_button = 0x2DE;
-				if ((_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) && (_carLocations[_selectedId] == 501))
+				if ((_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) && (local._carLocations[local._selectedId] == 501))
 					_vm->_dialogs->show(431);
-				else if (_selectedId != _homeSelectedId) {
-					_nextButtonId = 0;
-					_activeCars = true;
+				else if (local._selectedId != local._homeSelectedId) {
+					local._nextButtonId = 0;
+					local._activeCars = true;
 					_game._player._stepEnabled = false;
 					_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 					_scene->_sequences.remove(_globals._sequenceIndexes[0]);
@@ -157,17 +146,17 @@ void Scene505::step() {
 				}
 			}
 
-			if (_nextButtonId == this_button)
-				_nextButtonId = 0;
+			if (local._nextButtonId == this_button)
+				local._nextButtonId = 0;
 
-			if (old_select != _selectedId) {
+			if (old_select != local._selectedId) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[11]);
-				_globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, _selectedId + 1);
-				if (old_select != _homeSelectedId)
+				_globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, local._selectedId + 1);
+				if (old_select != local._homeSelectedId)
 					_scene->_sequences.remove(_globals._sequenceIndexes[0]);
 
-				if (_selectedId != _homeSelectedId) {
-					_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + _selectedId], false, 24, 0, 0, 0);
+				if (local._selectedId != local._homeSelectedId) {
+					_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + local._selectedId], false, 24, 0, 0, 0);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
 				}
 			}
@@ -180,15 +169,15 @@ void Scene505::step() {
 		case 21:
 		case 22:
 		case 23:
-			if (_nextButtonId == 0x38A)
-				resetFrame = 29 - _frame;
+			if (local._nextButtonId == 0x38A)
+				resetFrame = 29 - local._frame;
 
 			break;
 
 		case 26:
 		case 55:
 		case 84:
-			if (_nextButtonId != 0)
+			if (local._nextButtonId != 0)
 				resetFrame = 3;
 
 			break;
@@ -196,7 +185,7 @@ void Scene505::step() {
 		case 27:
 		case 56:
 		case 85:
-			if (_nextButtonId != 0)
+			if (local._nextButtonId != 0)
 				resetFrame = 2;
 
 			break;
@@ -204,14 +193,14 @@ void Scene505::step() {
 		case 29:
 		case 58:
 		case 87:
-			if (_activeCars)
-				_globals[kHoverCarDestination] = _carLocations[_selectedId];
+			if (local._activeCars)
+				_globals[kHoverCarDestination] = local._carLocations[local._selectedId];
 
-			if (_nextButtonId == 0x38A)
+			if (local._nextButtonId == 0x38A)
 				resetFrame = 0;
-			else if (_nextButtonId == 0x38B)
+			else if (local._nextButtonId == 0x38B)
 				resetFrame = 29;
-			else if (_nextButtonId == 0x2DE)
+			else if (local._nextButtonId == 0x2DE)
 				resetFrame = 58;
 			else
 				resetFrame = 86;
@@ -223,8 +212,8 @@ void Scene505::step() {
 		case 50:
 		case 51:
 		case 52:
-			if (_nextButtonId == 0x38B)
-				resetFrame = 87 - _frame;
+			if (local._nextButtonId == 0x38B)
+				resetFrame = 87 - local._frame;
 
 			break;
 
@@ -234,8 +223,8 @@ void Scene505::step() {
 		case 79:
 		case 80:
 		case 81:
-			if (_nextButtonId == 0x2DE)
-				resetFrame = 145 - _frame;
+			if (local._nextButtonId == 0x2DE)
+				resetFrame = 145 - local._frame;
 
 			break;
 
@@ -245,7 +234,7 @@ void Scene505::step() {
 
 		if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) {
 			_scene->_animation[0]->setCurrentFrame(resetFrame);
-			_frame = resetFrame;
+			local._frame = resetFrame;
 		}
 	}
 
@@ -257,12 +246,12 @@ void Scene505::step() {
 		_globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], syncIdx);
-		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[_homeSelectedId], false, 1);
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[local._homeSelectedId], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
-		_globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, _selectedId + 1);
+		_globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, local._selectedId + 1);
 
-		if (_selectedId != _homeSelectedId) {
-			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + _selectedId], false, 24, 0, 0, 0);
+		if (local._selectedId != local._homeSelectedId) {
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + local._selectedId], false, 24, 0, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
 		}
 		break;
@@ -281,7 +270,7 @@ void Scene505::step() {
 		break;
 
 	case 63:
-		_globals[kHoverCarDestination] = _carLocations[_selectedId];
+		_globals[kHoverCarDestination] = local._carLocations[local._selectedId];
 		_scene->_nextSceneId = 504;
 		break;
 
@@ -292,7 +281,7 @@ void Scene505::step() {
 
 static void room_505_parser() {
 	if (_action.isAction(VERB_PRESS))
-		_nextButtonId = _action._activeAction._objectNameId;
+		local._nextButtonId = _action._activeAction._objectNameId;
 	else if (_action.isAction(VERB_RETURN_TO, NOUN_INSIDE_OF_CAR))
 		_scene->_nextSceneId = 504;
 	else if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
@@ -305,6 +294,28 @@ static void room_505_parser() {
 	_action._inProgress = false;
 }
 
+void room_505_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._frame);
+	s.syncAsSint16LE(local._nextButtonId);
+	s.syncAsSint16LE(local._homeSelectedId);
+	s.syncAsSint16LE(local._selectedId);
+	s.syncAsSint16LE(local._activeCars);
+
+	for (int i = 0; i < 9; i++)
+		s.syncAsSint16LE(local._carLocations[i]);
+}
+
+
+void room_505_preload() {
+	room_init_code_pointer = room_505_init;
+	room_daemon_code_pointer = room_505_daemon;
+	room_parser_code_pointer = room_505_parser;
+
+	*player.series_name = '\0';
+	section_5_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room506.cpp b/engines/mads/madsv2/nebular/rooms/room506.cpp
index 5e70cf72f3f..cba39a305b0 100644
--- a/engines/mads/madsv2/nebular/rooms/room506.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room506.cpp
@@ -19,51 +19,118 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene506::Scene506(RexNebularEngine *vm) : Scene5xx(vm), _doorPos(0, 0) {
-	_heroFacing = FACING_DUMMY;
+struct Scratch {
+	bool _labDoorFl;
+	bool _firstDoorFl;
+	bool _actionFl;
+	byte _heroFacing;
+	int16 _doorDepth;
+	int16 _doorSpriteIdx;
+	int16 _doorSequenceIdx;
+	int16 _doorWord;
+	int16 _doorPos_x;
+	int16 _doorPos_y;
+};
 
-	_doorDepth = -1;
-	_doorSpriteIdx = -1;
-	_doorSequenceIdx = -1;
-	_doorWord = -1;
+static Scratch local;
 
-	_labDoorFl = false;
-	_firstDoorFl = false;
-	_actionFl = false;
-}
 
-void room_506_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
+static void handleDoorSequences() {
+	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 
-	s.syncAsSint16LE(_doorPos.x);
-	s.syncAsSint16LE(_doorPos.y);
+	if (local._firstDoorFl) {
+		if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE) || ((_scene->_priorSceneId == 507) && !local._actionFl)) {
+			local._doorDepth = 13;
+			local._doorSpriteIdx = _globals._spriteIndexes[2];
+			local._doorSequenceIdx = _globals._sequenceIndexes[2];
+			local._labDoorFl = false;
+		} else {
+			local._doorDepth = 10;
+			local._doorSpriteIdx = _globals._spriteIndexes[1];
+			local._doorSequenceIdx = _globals._sequenceIndexes[1];
+			local._labDoorFl = true;
+		}
+		local._firstDoorFl = false;
+	}
 
-	s.syncAsByte(_heroFacing);
+	switch (_game._trigger) {
+	case 0:
+	case 80:
+		_game._player._stepEnabled = false;
+		_scene->_sequences.remove(local._doorSequenceIdx);
+		local._doorSequenceIdx = _scene->_sequences.addSpriteCycle(local._doorSpriteIdx, false, 7, 1, 0, 0);
+		_scene->_sequences.setDepth(local._doorSequenceIdx, local._doorDepth);
+		_scene->changeVariant(1);
+		_scene->_sequences.addSubEntry(local._doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+		break;
 
-	s.syncAsSint16LE(_doorDepth);
-	s.syncAsSint16LE(_doorSpriteIdx);
-	s.syncAsSint16LE(_doorSequenceIdx);
-	s.syncAsSint16LE(_doorWord);
 
-	s.syncAsByte(_labDoorFl);
-	s.syncAsByte(_firstDoorFl);
-	s.syncAsByte(_actionFl);
-}
+	case 81:
+		local._doorSequenceIdx = _scene->_sequences.startCycle(local._doorSpriteIdx, false, -2);
+		_scene->_sequences.setDepth(local._doorSequenceIdx, local._doorDepth);
+		_game._player._walkAnywhere = true;
+		_game._player.walk(Common::Point(local._doorPos_x, local._doorPos_y), local._heroFacing);
+		_scene->_sequences.addTimer(120, 82);
+		break;
 
-void Scene506::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALK_INTO);
-	_scene->addActiveVocab(NOUN_SOFTWARE_STORE);
-	_scene->addActiveVocab(NOUN_LABORATORY);
+	case 82:
+		_scene->_sequences.remove(local._doorSequenceIdx);
+		local._doorSequenceIdx = _scene->_sequences.addReverseSpriteCycle(local._doorSpriteIdx, false, 7, 1, 0, 0);
+		_scene->_sequences.setDepth(local._doorSequenceIdx, local._doorDepth);
+		if (local._actionFl)
+			_scene->_sequences.addSubEntry(local._doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 84);
+		else
+			_scene->_sequences.addSubEntry(local._doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 83);
+
+		break;
+
+	case 83:
+	{
+		local._doorSequenceIdx = _scene->_sequences.startCycle(local._doorSpriteIdx, false, 1);
+		int idx = _scene->_dynamicHotspots.add(local._doorWord, VERB_WALK_INTO, local._doorSequenceIdx, Common::Rect(0, 0, 0, 0));
+		int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(local._doorPos_x, local._doorPos_y), FACING_NORTHWEST);
+		_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
+		_scene->_sequences.setDepth(local._doorSequenceIdx, local._doorDepth);
+		local._firstDoorFl = true;
+		if (local._labDoorFl) {
+			_globals._spriteIndexes[1] = local._doorSpriteIdx;
+			_globals._sequenceIndexes[1] = local._doorSequenceIdx;
+		} else {
+			_globals._spriteIndexes[2] = local._doorSpriteIdx;
+			_globals._sequenceIndexes[2] = local._doorSequenceIdx;
+		}
+		_game._player._stepEnabled = true;
+
+	}
+	break;
+
+	case 84:
+		local._actionFl = false;
+		_game._player._stepEnabled = true;
+		if (local._labDoorFl)
+			_scene->_nextSceneId = 508;
+		else
+			_scene->_nextSceneId = 507;
+
+		break;
+
+	default:
+		break;
+	}
 }
 
 static void room_506_init() {
@@ -85,8 +152,8 @@ static void room_506_init() {
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
-	_firstDoorFl = true;
-	_actionFl = false;
+	local._firstDoorFl = true;
+	local._actionFl = false;
 
 	if (_scene->_priorSceneId == 508) {
 		_game._player._playerPos = Common::Point(16, 111);
@@ -108,21 +175,24 @@ static void room_506_init() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
 		_scene->loadAnimation(formAnimName('R', 1), 70);
 	}
-	sceneEntrySound();
+	section_5_music();
 }
 
-void Scene506::step() {
+static void room_506_daemon() {
 	if (_game._trigger >= 80) {
-		if (_firstDoorFl) {
-			_heroFacing = FACING_SOUTHEAST;
+		if (local._firstDoorFl) {
+			local._heroFacing = FACING_SOUTHEAST;
 			if (_scene->_priorSceneId == 507) {
-				_doorPos = Common::Point(112, 102);
-				_doorWord = 0x336;
+				local._doorPos_x = 112;
+				local._doorPos_y = 102;
+				local._doorWord = 0x336;
 			} else {
-				_doorPos = Common::Point(65, 125);
-				_doorWord = 0x37D;
+				local._doorPos_x = 65;
+				local._doorPos_y = 125;
+				local._doorWord = 0x37D;
 			}
 		}
+
 		handleDoorSequences();
 	}
 
@@ -153,104 +223,22 @@ void Scene506::step() {
 	}
 }
 
-void Scene506::handleDoorSequences() {
-	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
-
-	if (_firstDoorFl) {
-		if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE) || ((_scene->_priorSceneId == 507) && !_actionFl)) {
-			_doorDepth = 13;
-			_doorSpriteIdx = _globals._spriteIndexes[2];
-			_doorSequenceIdx = _globals._sequenceIndexes[2];
-			_labDoorFl = false;
-		} else {
-			_doorDepth = 10;
-			_doorSpriteIdx = _globals._spriteIndexes[1];
-			_doorSequenceIdx = _globals._sequenceIndexes[1];
-			_labDoorFl = true;
-		}
-		_firstDoorFl = false;
-	}
-
-	switch (_game._trigger) {
-	case 0:
-	case 80:
-		_game._player._stepEnabled = false;
-		_scene->_sequences.remove(_doorSequenceIdx);
-		_doorSequenceIdx = _scene->_sequences.addSpriteCycle(_doorSpriteIdx, false, 7, 1, 0, 0);
-		_scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
-		_scene->changeVariant(1);
-		_scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 81);
-		break;
-
-
-	case 81:
-		_doorSequenceIdx = _scene->_sequences.startCycle(_doorSpriteIdx, false, -2);
-		_scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
-		_game._player._walkAnywhere = true;
-		_game._player.walk(_doorPos, _heroFacing);
-		_scene->_sequences.addTimer(120, 82);
-		break;
-
-	case 82:
-		_scene->_sequences.remove(_doorSequenceIdx);
-		_doorSequenceIdx = _scene->_sequences.addReverseSpriteCycle(_doorSpriteIdx, false, 7, 1, 0, 0);
-		_scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
-		if (_actionFl)
-			_scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 84);
-		else
-			_scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 83);
-
-		break;
-
-	case 83:
-	{
-		_doorSequenceIdx = _scene->_sequences.startCycle(_doorSpriteIdx, false, 1);
-		int idx = _scene->_dynamicHotspots.add(_doorWord, VERB_WALK_INTO, _doorSequenceIdx, Common::Rect(0, 0, 0, 0));
-		int hotspotId = _scene->_dynamicHotspots.setPosition(idx, _doorPos, FACING_NORTHWEST);
-		_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
-		_scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
-		_firstDoorFl = true;
-		if (_labDoorFl) {
-			_globals._spriteIndexes[1] = _doorSpriteIdx;
-			_globals._sequenceIndexes[1] = _doorSequenceIdx;
-		} else {
-			_globals._spriteIndexes[2] = _doorSpriteIdx;
-			_globals._sequenceIndexes[2] = _doorSequenceIdx;
-		}
-		_game._player._stepEnabled = true;
-
-	}
-	break;
-
-	case 84:
-		_actionFl = false;
-		_game._player._stepEnabled = true;
-		if (_labDoorFl)
-			_scene->_nextSceneId = 508;
-		else
-			_scene->_nextSceneId = 507;
-
-		break;
-
-	default:
-		break;
-	}
-}
-
 static void room_506_parser() {
 	if (_action.isAction(VERB_WALK_INTO, NOUN_LABORATORY)) {
-		if (_firstDoorFl) {
-			_heroFacing = FACING_NORTHWEST;
-			_doorPos = Common::Point(16, 111);
+		if (local._firstDoorFl) {
+			local._heroFacing = FACING_NORTHWEST;
+			local._doorPos_x = 16;
+			local._doorPos_y = 111;
 		}
-		_actionFl = true;
+		local._actionFl = true;
 		handleDoorSequences();
 	} else if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE)) {
-		if (_firstDoorFl) {
-			_heroFacing = FACING_NORTHWEST;
-			_doorPos = Common::Point(80, 102);
+		if (local._firstDoorFl) {
+			local._heroFacing = FACING_NORTHWEST;
+			local._doorPos_x = 80;
+			local._doorPos_y = 102;
 		}
-		_actionFl = true;
+		local._actionFl = true;
 		handleDoorSequences();
 	} else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
 		switch (_game._trigger) {
@@ -321,6 +309,35 @@ static void room_506_parser() {
 	_action._inProgress = false;
 }
 
+void room_506_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._doorPos_x);
+	s.syncAsSint16LE(local._doorPos_y);
+
+	s.syncAsByte(local._heroFacing);
+
+	s.syncAsSint16LE(local._doorDepth);
+	s.syncAsSint16LE(local._doorSpriteIdx);
+	s.syncAsSint16LE(local._doorSequenceIdx);
+	s.syncAsSint16LE(local._doorWord);
+
+	s.syncAsByte(local._labDoorFl);
+	s.syncAsByte(local._firstDoorFl);
+	s.syncAsByte(local._actionFl);
+}
+
+void room_506_preload() {
+	room_init_code_pointer = room_506_init;
+	room_daemon_code_pointer = room_506_daemon;
+	room_parser_code_pointer = room_506_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(VERB_WALK_INTO);
+	_scene->addActiveVocab(NOUN_SOFTWARE_STORE);
+	_scene->addActiveVocab(NOUN_LABORATORY);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room507.cpp b/engines/mads/madsv2/nebular/rooms/room507.cpp
index ca22739f8b8..dfdac14250b 100644
--- a/engines/mads/madsv2/nebular/rooms/room507.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room507.cpp
@@ -19,30 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene507::Scene507(RexNebularEngine *vm) : Scene5xx(vm) {
-	_penlightHotspotId = -1;
-}
-
-void room_507_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
+struct Scratch {
+	int16 _penlightHotspotId;
+};
 
-	s.syncAsSint16LE(_penlightHotspotId);
-}
+static Scratch local;
 
-void Scene507::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_PENLIGHT);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_507_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
@@ -50,8 +46,8 @@ static void room_507_init() {
 
 	if ((_game._difficulty != DIFFICULTY_EASY) && (_game._objects[OBJ_PENLIGHT]._roomNumber == _scene->_currentSceneId)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		_penlightHotspotId = _scene->_dynamicHotspots.add(NOUN_PENLIGHT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_penlightHotspotId, Common::Point(233, 152), FACING_SOUTHEAST);
+		local._penlightHotspotId = _scene->_dynamicHotspots.add(NOUN_PENLIGHT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._penlightHotspotId, Common::Point(233, 152), FACING_SOUTHEAST);
 	}
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
@@ -59,8 +55,9 @@ static void room_507_init() {
 		_game._player._facing = FACING_NORTH;
 	}
 
-	sceneEntrySound();
+	section_5_music();
 }
+
 static void room_507_parser() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
 		_scene->_nextSceneId = 506;
@@ -79,7 +76,7 @@ static void room_507_parser() {
 
 			case 1:
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-				_scene->_dynamicHotspots.remove(_penlightHotspotId);
+				_scene->_dynamicHotspots.remove(local._penlightHotspotId);
 				_vm->_sound->command(27);
 				_game._objects.addToInventory(OBJ_PENLIGHT);
 				_vm->_dialogs->showItem(OBJ_PENLIGHT, 50730);
@@ -148,6 +145,21 @@ static void room_507_parser() {
 	_action._inProgress = false;
 }
 
+void room_507_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._penlightHotspotId);
+}
+
+void room_507_preload() {
+	room_init_code_pointer = room_507_init;
+	room_parser_code_pointer = room_507_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_PENLIGHT);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room508.cpp b/engines/mads/madsv2/nebular/rooms/room508.cpp
index 128e007c4f1..00b2d3bbeed 100644
--- a/engines/mads/madsv2/nebular/rooms/room508.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room508.cpp
@@ -19,31 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene508::Scene508(RexNebularEngine *vm) : Scene5xx(vm) {
-	_chosenObject = -1;
-}
+struct Scratch {
+	int16 _chosenObject;
+};
 
-void room_508_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsSint16LE(_chosenObject);
-}
-
-void Scene508::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_SPINACH_PATCH_DOLL);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_LASER_BEAM);
-}
 
 static void room_508_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
@@ -56,7 +51,7 @@ static void room_508_init() {
 
 	if (!_game._visitedScenes._sceneRevisited) {
 		_globals[kLaserOn] = false;
-		_chosenObject = 0;
+		local._chosenObject = 0;
 	}
 
 	if (!_globals[kLaserOn]) {
@@ -95,7 +90,7 @@ static void room_508_init() {
 		_game._player._facing = FACING_WEST;
 	}
 
-	sceneEntrySound();
+	section_5_music();
 	_game.loadQuoteSet(0x273, 0);
 
 	if (_scene->_roomChanged) {
@@ -109,7 +104,7 @@ static void room_508_pre_parser() {
 		_game._player._walkOffScreenSceneId = 506;
 }
 
-void Scene508::handlePedestral() {
+static void handlePedestral() {
 	if (!_globals[kLaserOn])
 		_vm->_dialogs->show(50835);
 
@@ -129,7 +124,7 @@ void Scene508::handlePedestral() {
 			break;
 
 		case 1:
-			if (_chosenObject == 2)
+			if (local._chosenObject == 2)
 				_game._objects.removeFromInventory(OBJ_COMPACT_CASE, 1);
 			else
 				_game._objects.removeFromInventory(OBJ_REARVIEW_MIRROR, 1);
@@ -230,10 +225,10 @@ static void room_508_parser() {
 			_vm->_dialogs->show(50837);
 		}
 	} else if (_action.isAction(VERB_REFLECT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM)) {
-		_chosenObject = 1;
+		local._chosenObject = 1;
 		handlePedestral();
 	} else if (_action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM)) {
-		_chosenObject = 2;
+		local._chosenObject = 2;
 		handlePedestral();
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50822);
@@ -295,6 +290,23 @@ static void room_508_parser() {
 	_action._inProgress = false;
 }
 
+void room_508_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._chosenObject);
+}
+
+void room_508_preload() {
+	room_init_code_pointer = room_508_init;
+	room_pre_parser_code_pointer = room_508_pre_parser;
+	room_parser_code_pointer = room_508_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_SPINACH_PATCH_DOLL);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_LASER_BEAM);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room511.cpp b/engines/mads/madsv2/nebular/rooms/room511.cpp
index 277c9703a45..fdf21457e8f 100644
--- a/engines/mads/madsv2/nebular/rooms/room511.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room511.cpp
@@ -19,48 +19,37 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene511::Scene511(RexNebularEngine *vm) : Scene5xx(vm) {
-	_handingLine = false;
-	_lineMoving = false;
+struct Scratch {
+	bool _handingLine;
+	bool _lineMoving;
+	int16 _lineAnimationMode;
+	int16 _lineFrame;
+	int16 _lineAnimationPosition;
+};
 
-	_lineAnimationMode = -1;
-	_lineFrame = -1;
-	_lineAnimationPosition = -1;
-}
-
-void room_511_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
-
-	s.syncAsByte(_handingLine);
-	s.syncAsByte(_lineMoving);
-
-	s.syncAsSint16LE(_lineAnimationMode);
-	s.syncAsSint16LE(_lineFrame);
-	s.syncAsSint16LE(_lineAnimationPosition);
-}
+static Scratch local;
 
-void Scene511::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_BOAT);
-	_scene->addActiveVocab(NOUN_FISHING_LINE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_511_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_6");
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
-		_handingLine = false;
+		local._handingLine = false;
 
 	if (_globals[kBoatRaised]) {
 		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 0));
@@ -105,8 +94,8 @@ static void room_511_init() {
 			_scene->changeVariant(2);
 	}
 
-	_lineFrame = -1;
-	_lineMoving = false;
+	local._lineFrame = -1;
+	local._lineMoving = false;
 
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
@@ -123,38 +112,38 @@ static void room_511_init() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 		_scene->loadAnimation(formAnimName('R', 1), 70);
-	} else if (_handingLine) {
+	} else if (local._handingLine) {
 		_game._player._visible = false;
-		_lineAnimationMode = 1;
-		_lineAnimationPosition = 1;
+		local._lineAnimationMode = 1;
+		local._lineAnimationPosition = 1;
 		_scene->loadAnimation(formAnimName('R', -1));
-		_lineFrame = 2;
+		local._lineFrame = 2;
 	}
-	sceneEntrySound();
+	section_5_music();
 }
 
-void Scene511::step() {
-	if ((_lineAnimationMode == 1) && _scene->_animation[0]) {
-		if (_lineFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_lineFrame = _scene->_animation[0]->getCurrentFrame();
+static void room_511_daemon() {
+	if ((local._lineAnimationMode == 1) && _scene->_animation[0]) {
+		if (local._lineFrame != _scene->_animation[0]->getCurrentFrame()) {
+			local._lineFrame = _scene->_animation[0]->getCurrentFrame();
 			int resetFrame = -1;
 
-			if ((_lineAnimationPosition == 2) && (_lineFrame == 14))
-				_lineMoving = false;
+			if ((local._lineAnimationPosition == 2) && (local._lineFrame == 14))
+				local._lineMoving = false;
 
-			if (_lineAnimationPosition == 1) {
-				if (_lineFrame == 3) {
-					_lineMoving = false;
+			if (local._lineAnimationPosition == 1) {
+				if (local._lineFrame == 3) {
+					local._lineMoving = false;
 					resetFrame = 2;
 				}
 
-				if (_handingLine)
+				if (local._handingLine)
 					resetFrame = 2;
 			}
 
 			if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(resetFrame);
-				_lineFrame = resetFrame;
+				local._lineFrame = resetFrame;
 			}
 		}
 	}
@@ -185,7 +174,7 @@ void Scene511::step() {
 }
 
 static void room_511_pre_parser() {
-	if (!_handingLine)
+	if (!local._handingLine)
 		return;
 
 	if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
@@ -196,13 +185,13 @@ static void room_511_pre_parser() {
 			_game._player._readyToWalk = false;
 			_game._player._stepEnabled = false;
 			_scene->freeAnimation();
-			_lineAnimationMode = 2;
+			local._lineAnimationMode = 2;
 			_scene->loadAnimation(formAnimName('R', 2), 1);
 		} else if (_game._trigger == 1) {
 			_game._player._visible = true;
 			_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			_game._objects.setRoom(OBJ_FISHING_LINE, 1);
-			_handingLine = false;
+			local._handingLine = false;
 			_game._player._stepEnabled = true;
 			_game._player._readyToWalk = true;
 		}
@@ -260,18 +249,18 @@ static void room_511_parser() {
 						_game._player._stepEnabled = false;
 						_game._player._visible = false;
 						_game._player.update();
-						_lineAnimationMode = 1;
-						_lineAnimationPosition = 1;
-						_lineMoving = true;
+						local._lineAnimationMode = 1;
+						local._lineAnimationPosition = 1;
+						local._lineMoving = true;
 						_scene->loadAnimation(formAnimName('R', -1));
 						_scene->_sequences.addTimer(1, 1);
 					} else if (_game._trigger == 1) {
-						if (_lineMoving) {
+						if (local._lineMoving) {
 							_scene->_sequences.addTimer(1, 1);
 						} else {
 							_game._objects.addToInventory(OBJ_FISHING_LINE);
-							_lineMoving = true;
-							_handingLine = true;
+							local._lineMoving = true;
+							local._handingLine = true;
 							_game._player._stepEnabled = true;
 						}
 					}
@@ -288,16 +277,16 @@ static void room_511_parser() {
 			_vm->_dialogs->show(51131);
 		else if (_globals[kLineStatus] == 1)
 			_vm->_dialogs->show(51130);
-		else if (!_globals[kBoatRaised] && _handingLine) {
+		else if (!_globals[kBoatRaised] && local._handingLine) {
 			if (_globals[kLineStatus] != 3) {
 				if (_game._trigger == 0) {
 					_game._player._stepEnabled = false;
 					_scene->_sequences.remove(_globals._sequenceIndexes[7]);
-					_lineMoving = true;
-					_lineAnimationPosition = 2;
+					local._lineMoving = true;
+					local._lineAnimationPosition = 2;
 					_scene->_sequences.addTimer(1, 1);
 				} else if (_game._trigger == 1) {
-					if (_lineMoving)
+					if (local._lineMoving)
 						_scene->_sequences.addTimer(1, 1);
 					else {
 						_game._player._visible = true;
@@ -306,8 +295,8 @@ static void room_511_parser() {
 						int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
 						_game._objects.removeFromInventory(OBJ_FISHING_LINE, 1);
-						_handingLine = false;
-						_lineMoving = true;
+						local._handingLine = false;
+						local._lineMoving = true;
 						_globals[kLineStatus] = 3;
 						_game._player._stepEnabled = true;
 
@@ -373,6 +362,29 @@ static void room_511_parser() {
 	_action._inProgress = false;
 }
 
+void room_511_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._handingLine);
+	s.syncAsByte(local._lineMoving);
+
+	s.syncAsSint16LE(local._lineAnimationMode);
+	s.syncAsSint16LE(local._lineFrame);
+	s.syncAsSint16LE(local._lineAnimationPosition);
+}
+
+void room_511_preload() {
+	room_init_code_pointer = room_511_init;
+	room_daemon_code_pointer = room_511_daemon;
+	room_pre_parser_code_pointer = room_511_pre_parser;
+	room_parser_code_pointer = room_511_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_BOAT);
+	_scene->addActiveVocab(NOUN_FISHING_LINE);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room512.cpp b/engines/mads/madsv2/nebular/rooms/room512.cpp
index bad4439a058..f85f423fde0 100644
--- a/engines/mads/madsv2/nebular/rooms/room512.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room512.cpp
@@ -19,34 +19,27 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene512::Scene512(RexNebularEngine *vm) : Scene5xx(vm) {
-	_fishingRodHotspotId = -1;
-	_keyHotspotId = -1;
-}
+struct Scratch {
+	int16 _fishingRodHotspotId;
+	int16 _keyHotspotId;
+};
 
-void room_512_synchronize(Common::Serializer &s) {
-	Scene5xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsSint16LE(_fishingRodHotspotId);
-	s.syncAsSint16LE(_keyHotspotId);
-}
-
-void Scene512::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_FISHING_ROD);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_PADLOCK_KEY);
-	_scene->addActiveVocab(NOUN_REGISTER_DRAWER);
-}
 
 static void room_512_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
@@ -59,8 +52,8 @@ static void room_512_init() {
 
 	if (_game._objects[OBJ_FISHING_ROD]._roomNumber == _scene->_currentSceneId) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		_fishingRodHotspotId = _scene->_dynamicHotspots.add(NOUN_FISHING_ROD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_fishingRodHotspotId, Common::Point(199, 101), FACING_NORTHEAST);
+		local._fishingRodHotspotId = _scene->_dynamicHotspots.add(NOUN_FISHING_ROD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._fishingRodHotspotId, Common::Point(199, 101), FACING_NORTHEAST);
 	}
 
 	if (!_game._visitedScenes._sceneRevisited)
@@ -71,8 +64,8 @@ static void room_512_init() {
 		if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 3);
-			_keyHotspotId = _scene->_dynamicHotspots.add(NOUN_PADLOCK_KEY, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
-			_scene->_dynamicHotspots.setPosition(_keyHotspotId, Common::Point(218, 152), FACING_NORTHEAST);
+			local._keyHotspotId = _scene->_dynamicHotspots.add(NOUN_PADLOCK_KEY, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.setPosition(local._keyHotspotId, Common::Point(218, 152), FACING_NORTHEAST);
 		}
 		if (_globals[kRegisterOpen]) {
 			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
@@ -97,7 +90,7 @@ static void room_512_init() {
 		_game._player._facing = FACING_NORTHEAST;
 	}
 
-	sceneEntrySound();
+	section_5_music();
 }
 
 static void room_512_parser() {
@@ -118,7 +111,7 @@ static void room_512_parser() {
 			case 1:
 				_vm->_sound->command(9);
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-				_scene->_dynamicHotspots.remove(_fishingRodHotspotId);
+				_scene->_dynamicHotspots.remove(local._fishingRodHotspotId);
 				_game._objects.addToInventory(OBJ_FISHING_ROD);
 				_vm->_dialogs->showItem(OBJ_FISHING_ROD, 51217);
 				break;
@@ -253,7 +246,7 @@ static void room_512_parser() {
 			case 1:
 				if (_game._player._playerPos == Common::Point(218, 152)) {
 					_scene->_sequences.remove(_globals._sequenceIndexes[6]);
-					_scene->_dynamicHotspots.remove(_keyHotspotId);
+					_scene->_dynamicHotspots.remove(local._keyHotspotId);
 				} else {
 					_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 					_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
@@ -334,6 +327,24 @@ static void room_512_parser() {
 	_action._inProgress = false;
 }
 
+void room_512_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._fishingRodHotspotId);
+	s.syncAsSint16LE(local._keyHotspotId);
+}
+
+void room_512_preload() {
+	room_init_code_pointer = room_512_init;
+	room_parser_code_pointer = room_512_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_FISHING_ROD);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_PADLOCK_KEY);
+	_scene->addActiveVocab(NOUN_REGISTER_DRAWER);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room513.cpp b/engines/mads/madsv2/nebular/rooms/room513.cpp
index cd63e8715d1..2647e53662f 100644
--- a/engines/mads/madsv2/nebular/rooms/room513.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room513.cpp
@@ -19,20 +19,19 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene513::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_ELEVATOR_DOOR);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
+namespace Rooms {
 
 static void room_513_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
@@ -62,7 +61,7 @@ static void room_513_init() {
 		_scene->loadAnimation(formAnimName('R', 1), 70);
 	}
 
-	sceneEntrySound();
+	section_5_music();
 
 	if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_SECURITY_CARD);
@@ -70,7 +69,7 @@ static void room_513_init() {
 	_game.loadQuoteSet(0x278, 0);
 }
 
-void Scene513::step() {
+static void room_513_daemon() {
 	switch (_game._trigger) {
 	case 80:
 		_game._player._stepEnabled = false;
@@ -250,6 +249,22 @@ static void room_513_parser() {
 	_action._inProgress = false;
 }
 
+void room_513_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_513_preload() {
+	room_init_code_pointer = room_513_init;
+	room_daemon_code_pointer = room_513_daemon;
+	room_parser_code_pointer = room_513_parser;
+
+	section_5_walker();
+	section_5_interface();
+	_scene->addActiveVocab(NOUN_ELEVATOR_DOOR);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room515.cpp b/engines/mads/madsv2/nebular/rooms/room515.cpp
index ec41425256b..4616d946094 100644
--- a/engines/mads/madsv2/nebular/rooms/room515.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room515.cpp
@@ -19,34 +19,48 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene515::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
+namespace Rooms {
 
 static void room_515_init() {
 	_game._player._visible = false;
 	_game._player._stepEnabled = false;
 	_scene->_sequences.addTimer(30, 70);
 
-	sceneEntrySound();
+	section_5_music();
 }
 
-void Scene515::step() {
+static void room_515_daemon() {
 	if (_game._trigger == 70)
 		_scene->loadAnimation(formAnimName('A', -1), 71);
 	else if (_game._trigger == 71)
 		_scene->_nextSceneId = 508;
 }
 
+void room_515_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_515_preload() {
+	room_init_code_pointer = room_515_init;
+	room_daemon_code_pointer = room_515_daemon;
+
+	*player.series_name = '\0';
+	section_5_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room551.cpp b/engines/mads/madsv2/nebular/rooms/room551.cpp
index cb61b0912a6..24ef308f85a 100644
--- a/engines/mads/madsv2/nebular/rooms/room551.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room551.cpp
@@ -19,18 +19,19 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene551::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
+namespace Rooms {
 
 static void room_551_init() {
 	if (_globals[kSexOfRex] == REX_MALE)
@@ -90,10 +91,10 @@ static void room_551_init() {
 		}
 	}
 
-	sceneEntrySound();
+	section_5_music();
 }
 
-void Scene551::step() {
+static void room_551_daemon() {
 	switch (_game._trigger) {
 	case 75:
 		_game._player._stepEnabled = true;
@@ -165,6 +166,21 @@ static void room_551_parser() {
 	_action._inProgress = false;
 }
 
+void room_551_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_551_preload() {
+	room_init_code_pointer = room_551_init;
+	room_daemon_code_pointer = room_551_daemon;
+	room_pre_parser_code_pointer = room_551_pre_parser;
+	room_parser_code_pointer = room_551_parser;
+
+	section_5_walker();
+	section_5_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section5.cpp b/engines/mads/madsv2/nebular/rooms/section5.cpp
index 7488011aaea..82a4dc8e0e5 100644
--- a/engines/mads/madsv2/nebular/rooms/section5.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section5.cpp
@@ -19,51 +19,52 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "mads/nebular/nebular.h"
-#include "mads/nebular/core/scene.h"
-#include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes5.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
 
-void Scene5xx::setAAName() {
-	_game._aaName = Resources::formatAAName(5);
+void section_5_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
 }
 
-void Scene5xx::setPlayerSpritesPrefix() {
-	_vm->_sound->command(5);
+void section_5_walker() {
+	g_engine->_soundManager->command(5);
+	Common::String oldName = player.series_name;
 
-	Common::String oldName = _game._player._spritesPrefix;
+	if ((new_room == 502) || (new_room == 504) || (new_room == 505) || (new_room == 515))
+		*player.series_name = '\0';
+	else if (global[kSexOfRex] == REX_FEMALE)
+		Common::strcpy_s(player.series_name, "ROX");
+	else
+		Common::strcpy_s(player.series_name, "RXM");
 
-	if ((_scene->_nextSceneId == 502) || (_scene->_nextSceneId == 504) || (_scene->_nextSceneId == 505) || (_scene->_nextSceneId == 515))
-		_game._player._spritesPrefix = "";
-	else if (_globals[kSexOfRex] == REX_MALE)
-		_game._player._spritesPrefix = "RXM";
-	else if ((_scene->_nextSceneId == 501) || (_scene->_nextSceneId == 503) || (_scene->_nextSceneId == 551))
-		_game._player._spritesPrefix = "ROX";
+	player.scaling_velocity = new_room != 512 && new_room != 507;
 
-	_game._player._scalingVelocity = true;
+	if (oldName != Common::String(player.series_name))
+		player.walker_must_reload = true;
 
-	if ((_scene->_nextSceneId == 512) || (_scene->_nextSceneId == 507))
-		_game._player._scalingVelocity = false;
-
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
-
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
+	pal_change_color(16, 10, 63, 63);
+	pal_change_color(17, 10, 45, 45);
 }
 
-void Scene5xx::sceneEntrySound() {
-	if (!_vm->_musicFlag) {
-		_vm->_sound->command(2);
+void section_5_music() {
+	if (!config_file.music_flag) {
+		g_engine->_soundManager->command(2);
 		return;
 	}
 
-	switch (_scene->_nextSceneId) {
+	switch (new_room) {
 	case 501:
 	case 502:
 	case 504:
@@ -76,18 +77,20 @@ void Scene5xx::sceneEntrySound() {
 	case 513:
 	case 515:
 	case 551:
-		if (_scene->_priorSceneId == 503)
-			_vm->_sound->command(38);
+		if (previous_room == 503)
+			g_engine->_soundManager->command(38);
 		else
-			_vm->_sound->command(29);
+			g_engine->_soundManager->command(29);
 		break;
 	case 503:
-		_vm->_sound->command(41);
+		g_engine->_soundManager->command(41);
 		break;
 	default:
 		break;
 	}
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section5.h b/engines/mads/madsv2/nebular/rooms/section5.h
index 32c419f8abc..eb6355e1ebf 100644
--- a/engines/mads/madsv2/nebular/rooms/section5.h
+++ b/engines/mads/madsv2/nebular/rooms/section5.h
@@ -29,6 +29,10 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
+extern void section_5_walker();
+extern void section_5_interface();
+extern void section_5_music();
+
 #if 0
 class Scene5xx : public NebularScene {
 protected:
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter.cpp b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
index 4d161172504..fb8d94bc260 100644
--- a/engines/mads/madsv2/nebular/rooms/teleporter.cpp
+++ b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
@@ -33,7 +33,6 @@ static int _buttonTyped;
 static int _curCode;
 static int _digitCount;
 static int _curMessageId;
-static int _handSpriteId;
 static int _handSequenceId;
 static int _finishedCodeCounter;
 static int _meteorologistNextPlace;
@@ -47,7 +46,6 @@ void teleporter_init() {
 	_curCode = -1;
 	_digitCount = -1;
 	_curMessageId = -1;
-	_handSpriteId = -1;
 	_handSequenceId = -1;
 	_finishedCodeCounter = -1;
 	_meteorologistNextPlace = -1;
@@ -176,7 +174,7 @@ void teleporter_handle_key() {
 	case 0: {
 		_game._player._stepEnabled = false;
 		Common::Point msgPos = teleporter_compute_location();
-		_handSequenceId = _scene->_sequences.startPingPongCycle(_handSpriteId, false, 4, 2, 0, 0);
+		_handSequenceId = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
 		_scene->_sequences.setPosition(_handSequenceId, msgPos);
 		_scene->_sequences.setDepth(_handSequenceId, 2);
 		_scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_LOOP, 0, 1);
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 529b2175615..1fab1f6901c 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -187,6 +187,10 @@ void Scene::Animation::setNextFrameTimer(long time) {
 	kernel_anim[_id].next_clock = time;
 }
 
+long Scene::Animation::getNextFrameTimer() {
+	return 	kernel_anim[_id].next_clock;
+}
+
 void Scene::Animation::setCurrentFrame(int frameNum) {
 	kernel_anim[_id].frame = frameNum;
 }
@@ -195,6 +199,10 @@ void Scene::Animation::resetSpriteSetsCount() {
 	error("TODO: resetSpriteSetsCount");
 }
 
+void Scene::Animation::eraseSprites() {
+	error("TODO: eraseSprites");
+}
+
 int Scene::DynamicHotspots::add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r) {
 	return kernel_add_dynamic(vocab_id, verb_id, 0, auto_sequence,
 		r.left, r.top, r.width(), r.height());
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index a5a75f3047b..e1b9544774e 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -187,8 +187,10 @@ struct Scene {
 
 		int getCurrentFrame() const;
 		void setNextFrameTimer(long time);
+		long getNextFrameTimer();
 		void setCurrentFrame(int frameNum);
 		void resetSpriteSetsCount();
+		void eraseSprites();
 	};
 	struct Animations {
 		Animation operator[](int anim_id) {
@@ -503,6 +505,7 @@ struct Game {
 		int &_spritesStart = player.series_base;
 		int &_frameNumber = player.sprite;
 		int &_forceRefresh = player.sprite_changed;
+		int &_walkAnywhere = player.walk_anywhere;
 
 		void startWalking(const Common::Point &pt, int facing);
 		void walk(const Common::Point &pt, int facing);
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 8c713c32fc8..0ce26a5e583 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -140,10 +140,24 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room410.o \
 	madsv2/nebular/rooms/room411.o \
 	madsv2/nebular/rooms/room413.o \
+	madsv2/nebular/rooms/room501.o \
+	madsv2/nebular/rooms/room502.o \
+	madsv2/nebular/rooms/room503.o \
+	madsv2/nebular/rooms/room504.o \
+	madsv2/nebular/rooms/room505.o \
+	madsv2/nebular/rooms/room506.o \
+	madsv2/nebular/rooms/room507.o \
+	madsv2/nebular/rooms/room508.o \
+	madsv2/nebular/rooms/room511.o \
+	madsv2/nebular/rooms/room512.o \
+	madsv2/nebular/rooms/room513.o \
+	madsv2/nebular/rooms/room515.o \
+	madsv2/nebular/rooms/room551.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/nebular/rooms/section2.o \
 	madsv2/nebular/rooms/section3.o \
 	madsv2/nebular/rooms/section4.o \
+	madsv2/nebular/rooms/section5.o \
 	madsv2/nebular/rooms/conversation.o \
 	madsv2/nebular/rooms/forcefield.o \
 	madsv2/nebular/rooms/teleporter.o \


Commit: e3daee8f82de837965be3a5032415af2780ab5f1
    https://github.com/scummvm/scummvm/commit/e3daee8f82de837965be3a5032415af2780ab5f1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:44+10:00

Commit Message:
MADS: NEBULAR: Fixed room 213

Changed paths:
    engines/mads/madsv2/nebular/rooms/room213.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index 56296b774fa..a592066467c 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -33,20 +33,13 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-struct Scratch {
-	int16 _handSpriteId;
-};
-
-static Scratch local;
-
-
 static void room_213_init() {
 	if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
-		local._handSpriteId = _scene->_sprites.addSprites("*METHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*METHAND");
 	else if (_globals[kSexOfRex] == REX_MALE)
-		local._handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
 	else
-		local._handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
 
 	teleporter_init();
 


Commit: b1037e830fa98fdc1738f5d98a1c928caf4cc277
    https://github.com/scummvm/scummvm/commit/b1037e830fa98fdc1738f5d98a1c928caf4cc277
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:45+10:00

Commit Message:
MADS: NEBULAR: Added missing room 357

Changed paths:
    engines/mads/madsv2/nebular/rooms/room357.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room357.cpp b/engines/mads/madsv2/nebular/rooms/room357.cpp
index 8ad756ea6d7..da68f11a165 100644
--- a/engines/mads/madsv2/nebular/rooms/room357.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room357.cpp
@@ -32,18 +32,6 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-struct Scratch {
-
-};
-
-static Scratch local;
-
-
-void Scene357::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
-
 static void room_357_init() {
 	_globals[kAfterHavoc] = true;
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
@@ -112,7 +100,6 @@ void room_357_preload() {
 	room_init_code_pointer = room_357_init;
 	room_pre_parser_code_pointer = room_357_pre_parser;
 	room_parser_code_pointer = room_357_parser;
-	room_daemon_code_pointer = room_357_daemon;
 
 	section_3_walker();
 	section_3_interface();
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 0ce26a5e583..f1bcbc2a9a4 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -119,6 +119,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room351.o \
 	madsv2/nebular/rooms/room352.o \
 	madsv2/nebular/rooms/room353.o \
+	madsv2/nebular/rooms/room357.o \
 	madsv2/nebular/rooms/room358.o \
 	madsv2/nebular/rooms/room359.o \
 	madsv2/nebular/rooms/room360.o \


Commit: 05a8f9d303041d305ac6c369bc5b43bc0cf6369a
    https://github.com/scummvm/scummvm/commit/05a8f9d303041d305ac6c369bc5b43bc0cf6369a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:45+10:00

Commit Message:
MADS: NEBULAR: Fix clash on function parameter

Changed paths:
    engines/mads/madsv2/nebular/rooms/room411.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room411.cpp b/engines/mads/madsv2/nebular/rooms/room411.cpp
index 5e042b155ea..f7c9de461a3 100644
--- a/engines/mads/madsv2/nebular/rooms/room411.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room411.cpp
@@ -271,8 +271,8 @@ static void handleDialog() {
 		_scene->_userInterface.setup(kInputBuildingSentences);
 }
 
-static void giveToRex(int object) {
-	switch (object) {
+static void giveToRex(int object_id) {
+	switch (object_id) {
 	case 0:
 		_game._objects.addToInventory(OBJ_ALIEN_LIQUOR);
 		break;


Commit: 2fcd9f461d6f0d74d7c1f9dcfcd9ea99b7ce91a7
    https://github.com/scummvm/scummvm/commit/2fcd9f461d6f0d74d7c1f9dcfcd9ea99b7ce91a7
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:45+10:00

Commit Message:
MADS: NEBULAR: Implement section 6 rooms

Changed paths:
    engines/mads/madsv2/nebular/rooms/room601.cpp
    engines/mads/madsv2/nebular/rooms/room602.cpp
    engines/mads/madsv2/nebular/rooms/room603.cpp
    engines/mads/madsv2/nebular/rooms/room604.cpp
    engines/mads/madsv2/nebular/rooms/room605.cpp
    engines/mads/madsv2/nebular/rooms/room607.cpp
    engines/mads/madsv2/nebular/rooms/room608.cpp
    engines/mads/madsv2/nebular/rooms/room609.cpp
    engines/mads/madsv2/nebular/rooms/room610.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp
    engines/mads/madsv2/nebular/rooms/room612.cpp
    engines/mads/madsv2/nebular/rooms/room620.cpp
    engines/mads/madsv2/nebular/rooms/section6.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room601.cpp b/engines/mads/madsv2/nebular/rooms/room601.cpp
index c9e4786c66e..6aa6e7debed 100644
--- a/engines/mads/madsv2/nebular/rooms/room601.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room601.cpp
@@ -19,20 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene601::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_LASER_BEAM);
-	_scene->addActiveVocab(VERB_LOOK_AT);
-}
+namespace Rooms {
 
 static void room_601_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
@@ -61,10 +59,10 @@ static void room_601_init() {
 		_game._player._facing = FACING_SOUTHWEST;
 	}
 
-	sceneEntrySound();
+	section_6_music();
 }
 
-void Scene601::step() {
+static void room_601_daemon() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
@@ -161,6 +159,22 @@ static void room_601_parser() {
 	_action._inProgress = false;
 }
 
+void room_601_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_601_preload() {
+	room_init_code_pointer = room_601_init;
+	room_daemon_code_pointer = room_601_daemon;
+	room_parser_code_pointer = room_601_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(NOUN_LASER_BEAM);
+	_scene->addActiveVocab(VERB_LOOK_AT);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room602.cpp b/engines/mads/madsv2/nebular/rooms/room602.cpp
index 611e2804b55..34a7e2727b5 100644
--- a/engines/mads/madsv2/nebular/rooms/room602.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room602.cpp
@@ -19,37 +19,28 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene602::Scene602(RexNebularEngine *vm) : Scene6xx(vm) {
-	_lastSpriteIdx = -1;
-	_lastSequenceIdx = -1;
-	_cycleIndex = -1;
-	_safeMode = -1;
-}
+struct Scratch {
+	int16 _lastSpriteIdx;
+	int16 _lastSequenceIdx;
+	int16 _cycleIndex;
+	int16 _safeMode;
+};
 
-void room_602_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsSint16LE(_lastSpriteIdx);
-	s.syncAsSint16LE(_lastSequenceIdx);
-	s.syncAsSint16LE(_cycleIndex);
-	s.syncAsSint16LE(_safeMode);
-}
-
-void Scene602::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_SAFE);
-	_scene->addActiveVocab(NOUN_LASER_BEAM);
-}
 
 static void room_602_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -1));
@@ -73,22 +64,22 @@ static void room_602_init() {
 		_scene->_hotspots.activate(NOUN_HOLE, false);
 
 	if (_globals[kSafeStatus] == 0) {
-		_lastSpriteIdx = _globals._spriteIndexes[2];
-		_cycleIndex = -1;
+		local._lastSpriteIdx = _globals._spriteIndexes[2];
+		local._cycleIndex = -1;
 	} else if (_globals[kSafeStatus] == 1) {
-		_lastSpriteIdx = _globals._spriteIndexes[2];
-		_cycleIndex = -2;
+		local._lastSpriteIdx = _globals._spriteIndexes[2];
+		local._cycleIndex = -2;
 	} else if (_globals[kSafeStatus] == 3) {
-		_lastSpriteIdx = _globals._spriteIndexes[3];
-		_cycleIndex = -2;
+		local._lastSpriteIdx = _globals._spriteIndexes[3];
+		local._cycleIndex = -2;
 	} else {
-		_lastSpriteIdx = _globals._spriteIndexes[3];
-		_cycleIndex = -1;
+		local._lastSpriteIdx = _globals._spriteIndexes[3];
+		local._cycleIndex = -1;
 	}
 
-	_lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, _cycleIndex);
-	_scene->_sequences.setDepth(_lastSequenceIdx, 14);
-	int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0));
+	local._lastSequenceIdx = _scene->_sequences.startCycle(local._lastSpriteIdx, false, local._cycleIndex);
+	_scene->_sequences.setDepth(local._lastSequenceIdx, 14);
+	int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, local._lastSequenceIdx, Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST);
 
 	if (_game._objects.isInRoom(OBJ_DOOR_KEY)) {
@@ -108,7 +99,7 @@ static void room_602_init() {
 		_game._player._facing = FACING_EAST;
 	}
 
-	sceneEntrySound();
+	section_6_music();
 	_game.loadQuoteSet(0x2F1, 0x2F2, 0x2F3, 0);
 
 	if (_scene->_roomChanged) {
@@ -118,7 +109,7 @@ static void room_602_init() {
 	}
 }
 
-void Scene602::handleSafeActions() {
+static void handleSafeActions() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -131,51 +122,51 @@ void Scene602::handleSafeActions() {
 		break;
 
 	case 1:
-		if (_safeMode == 1 || _safeMode == 3) {
-			if (_globals[kSafeStatus] == 0 && _safeMode == 1) {
+		if (local._safeMode == 1 || local._safeMode == 3) {
+			if (_globals[kSafeStatus] == 0 && local._safeMode == 1) {
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F1));
 				_scene->_sequences.addTimer(120, 4);
 			} else {
-				_scene->_sequences.remove(_lastSequenceIdx);
-				if (_safeMode == 3)
-					_lastSpriteIdx = _globals._spriteIndexes[2];
+				_scene->_sequences.remove(local._lastSequenceIdx);
+				if (local._safeMode == 3)
+					local._lastSpriteIdx = _globals._spriteIndexes[2];
 				else
-					_lastSpriteIdx = _globals._spriteIndexes[3];
+					local._lastSpriteIdx = _globals._spriteIndexes[3];
 
-				_lastSequenceIdx = _scene->_sequences.addSpriteCycle(_lastSpriteIdx, false, 12, 1, 0, 0);
-				_scene->_sequences.setDepth(_lastSequenceIdx, 14);
+				local._lastSequenceIdx = _scene->_sequences.addSpriteCycle(local._lastSpriteIdx, false, 12, 1, 0, 0);
+				_scene->_sequences.setDepth(local._lastSequenceIdx, 14);
 				if (_game._objects[OBJ_DOOR_KEY]._roomNumber == _scene->_currentSceneId)
 					_scene->_hotspots.activate(NOUN_DOOR_KEY, true);
 
-				_scene->_sequences.addSubEntry(_lastSequenceIdx,
+				_scene->_sequences.addSubEntry(local._lastSequenceIdx,
 					SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			}
 		} else {
-			_scene->_sequences.remove(_lastSequenceIdx);
+			_scene->_sequences.remove(local._lastSequenceIdx);
 			if (_globals[kSafeStatus] == 1)
-				_lastSpriteIdx = _globals._spriteIndexes[2];
+				local._lastSpriteIdx = _globals._spriteIndexes[2];
 			else
-				_lastSpriteIdx = _globals._spriteIndexes[3];
+				local._lastSpriteIdx = _globals._spriteIndexes[3];
 
-			_lastSequenceIdx = _scene->_sequences.startPingPongCycle(_lastSpriteIdx, false, 12, 1, 0, 0);
-			_scene->_sequences.setDepth(_lastSequenceIdx, 14);
+			local._lastSequenceIdx = _scene->_sequences.startPingPongCycle(local._lastSpriteIdx, false, 12, 1, 0, 0);
+			_scene->_sequences.setDepth(local._lastSequenceIdx, 14);
 			if (_game._objects[OBJ_DOOR_KEY]._roomNumber == _scene->_currentSceneId)
 				_scene->_hotspots.activate(NOUN_DOOR_KEY, false);
 
-			_scene->_sequences.addSubEntry(_lastSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			_scene->_sequences.addSubEntry(local._lastSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 		}
 		break;
 
 	case 2:
 	{
-		int synxIdx = _lastSequenceIdx;
-		_lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, _cycleIndex);
-		_scene->_sequences.setDepth(_lastSequenceIdx, 14);
-		_scene->_sequences.updateTimeout(_lastSequenceIdx, synxIdx);
-		int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0));
+		int synxIdx = local._lastSequenceIdx;
+		local._lastSequenceIdx = _scene->_sequences.startCycle(local._lastSpriteIdx, false, local._cycleIndex);
+		_scene->_sequences.setDepth(local._lastSequenceIdx, 14);
+		_scene->_sequences.updateTimeout(local._lastSequenceIdx, synxIdx);
+		int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, local._lastSequenceIdx, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST);
-		if (_safeMode == 3) {
+		if (local._safeMode == 3) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F3));
 			_scene->_sequences.addTimer(120, 4);
@@ -190,10 +181,10 @@ void Scene602::handleSafeActions() {
 		break;
 
 	case 4:
-		if (_safeMode == 1) {
+		if (local._safeMode == 1) {
 			if (_globals[kSafeStatus] == 2)
 				_globals[kSafeStatus] = 3;
-		} else if (_safeMode == 2) {
+		} else if (local._safeMode == 2) {
 			if (_globals[kSafeStatus] == 3)
 				_globals[kSafeStatus] = 2;
 			else
@@ -215,17 +206,17 @@ static void room_602_parser() {
 	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
 		_scene->_nextSceneId = 603;
 	else if (_action.isAction(VERB_OPEN, NOUN_SAFE) && ((_globals[kSafeStatus] == 0) || (_globals[kSafeStatus] == 2))) {
-		_safeMode = 1;
-		_cycleIndex = -2;
+		local._safeMode = 1;
+		local._cycleIndex = -2;
 		handleSafeActions();
 	} else if (_action.isAction(VERB_CLOSE, NOUN_SAFE) && ((_globals[kSafeStatus] == 1) || (_globals[kSafeStatus] == 3))) {
-		_safeMode = 2;
-		_cycleIndex = -1;
+		local._safeMode = 2;
+		local._cycleIndex = -1;
 		handleSafeActions();
 	} else if (_action.isAction(VERB_UNLOCK, NOUN_COMBINATION, NOUN_SAFE)) {
 		if ((_globals[kSafeStatus] == 0) && (_game._difficulty != DIFFICULTY_HARD)) {
-			_safeMode = 3;
-			_cycleIndex = -2;
+			local._safeMode = 3;
+			local._cycleIndex = -2;
 			handleSafeActions();
 		}
 	} else if ((_action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM)
@@ -236,7 +227,7 @@ static void room_602_parser() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
-			_scene->_sequences.remove(_lastSequenceIdx);
+			_scene->_sequences.remove(local._lastSequenceIdx);
 			_scene->loadAnimation(formAnimName('L', 1), 1);
 			break;
 
@@ -244,10 +235,10 @@ static void room_602_parser() {
 		{
 			_game._player._visible = true;
 			_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
-			_lastSpriteIdx = _globals._spriteIndexes[3];
-			_lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, -1);
-			_scene->_sequences.setDepth(_lastSequenceIdx, 14);
-			int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0));
+			local._lastSpriteIdx = _globals._spriteIndexes[3];
+			local._lastSequenceIdx = _scene->_sequences.startCycle(local._lastSpriteIdx, false, -1);
+			_scene->_sequences.setDepth(local._lastSequenceIdx, 14);
+			int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, local._lastSequenceIdx, Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST);
 			_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 9);
@@ -356,6 +347,25 @@ static void room_602_parser() {
 	_action._inProgress = false;
 }
 
+void room_602_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._lastSpriteIdx);
+	s.syncAsSint16LE(local._lastSequenceIdx);
+	s.syncAsSint16LE(local._cycleIndex);
+	s.syncAsSint16LE(local._safeMode);
+}
+
+void room_602_preload() {
+	room_init_code_pointer = room_602_init;
+	room_parser_code_pointer = room_602_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_SAFE);
+	_scene->addActiveVocab(NOUN_LASER_BEAM);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room603.cpp b/engines/mads/madsv2/nebular/rooms/room603.cpp
index b27cfc9e450..62dca5057f1 100644
--- a/engines/mads/madsv2/nebular/rooms/room603.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room603.cpp
@@ -19,33 +19,26 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene603::Scene603(RexNebularEngine *vm) : Scene6xx(vm) {
-	_compactCaseHotspotId = -1;
-	_noteHotspotId = -1;
-}
+struct Scratch {
+	int16 _compactCaseHotspotId;
+	int16 _noteHotspotId;
+};
 
-void room_603_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsSint16LE(_compactCaseHotspotId);
-	s.syncAsSint16LE(_noteHotspotId);
-}
-
-void Scene603::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_COMPACT_CASE);
-	_scene->addActiveVocab(NOUN_NOTE);
-}
 
 static void room_603_init() {
 	if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId) {
@@ -53,8 +46,8 @@ static void room_603_init() {
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
-		_compactCaseHotspotId = _scene->_dynamicHotspots.add(NOUN_COMPACT_CASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_compactCaseHotspotId, Common::Point(250, 152), FACING_SOUTHEAST);
+		local._compactCaseHotspotId = _scene->_dynamicHotspots.add(NOUN_COMPACT_CASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._compactCaseHotspotId, Common::Point(250, 152), FACING_SOUTHEAST);
 	}
 
 	if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)) {
@@ -62,14 +55,14 @@ static void room_603_init() {
 		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', -1));
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
-		_noteHotspotId = _scene->_dynamicHotspots.add(NOUN_NOTE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_noteHotspotId, Common::Point(242, 118), FACING_NORTHEAST);
+		local._noteHotspotId = _scene->_dynamicHotspots.add(NOUN_NOTE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._noteHotspotId, Common::Point(242, 118), FACING_NORTHEAST);
 	}
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		_game._player._playerPos = Common::Point(113, 134);
 
-	sceneEntrySound();
+	section_6_music();
 }
 
 static void room_603_parser() {
@@ -91,7 +84,7 @@ static void room_603_parser() {
 			case 1:
 				_vm->_sound->command(9);
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-				_scene->_dynamicHotspots.remove(_compactCaseHotspotId);
+				_scene->_dynamicHotspots.remove(local._compactCaseHotspotId);
 				_game._objects.addToInventory(OBJ_COMPACT_CASE);
 				_vm->_dialogs->showItem(OBJ_COMPACT_CASE, 60330);
 				break;
@@ -117,7 +110,7 @@ static void room_603_parser() {
 			} else if (_game._trigger == 1) {
 				_vm->_sound->command(9);
 				_scene->_sequences.remove(_globals._sequenceIndexes[2]);
-				_scene->_dynamicHotspots.remove(_noteHotspotId);
+				_scene->_dynamicHotspots.remove(local._noteHotspotId);
 				_game._objects.addToInventory(OBJ_NOTE);
 				_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 				_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
@@ -178,6 +171,23 @@ static void room_603_parser() {
 	_action._inProgress = false;
 }
 
+void room_603_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._compactCaseHotspotId);
+	s.syncAsSint16LE(local._noteHotspotId);
+}
+
+void room_603_preload() {
+	room_init_code_pointer = room_603_init;
+	room_parser_code_pointer = room_603_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_COMPACT_CASE);
+	_scene->addActiveVocab(NOUN_NOTE);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room604.cpp b/engines/mads/madsv2/nebular/rooms/room604.cpp
index 19ab6c0cb08..122522eeae8 100644
--- a/engines/mads/madsv2/nebular/rooms/room604.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room604.cpp
@@ -19,45 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene604::Scene604(RexNebularEngine *vm) : Scene6xx(vm) {
-	_timebombHotspotId = -1;
-	_bombMode = -1;
-	_monsterFrame = -1;
+struct Scratch {
+	bool _monsterActive;
+	bool _animationActiveFl;
+	int16 _timebombHotspotId;
+	int16 _bombMode;
+	int16 _monsterFrame;
+	int32 _monsterTimer;
+};
 
-	_monsterTimer = 0;
+static Scratch local;
 
-	_monsterActive = false;
-	_animationActiveFl = false;
-}
-
-void room_604_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
-
-	s.syncAsSint16LE(_timebombHotspotId);
-	s.syncAsSint16LE(_bombMode);
-	s.syncAsSint16LE(_monsterFrame);
-
-	s.syncAsUint32LE(_monsterTimer);
-
-	s.syncAsByte(_monsterActive);
-	s.syncAsByte(_animationActiveFl);
-}
-
-void Scene604::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_SEA_MONSTER);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_TIMEBOMB);
-}
 
 static void room_604_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
@@ -67,8 +52,8 @@ static void room_604_init() {
 
 	if (_globals[kTimebombStatus] == 1) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1);
-		_timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
+		local._timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
 	}
 
 	if (_scene->_roomChanged)
@@ -76,7 +61,7 @@ static void room_604_init() {
 
 	_vm->_palette->setEntry(252, 63, 37, 26);
 	_vm->_palette->setEntry(253, 45, 24, 17);
-	_animationActiveFl = false;
+	local._animationActiveFl = false;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(72, 149);
@@ -86,20 +71,20 @@ static void room_604_init() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 		_scene->loadAnimation(formAnimName('R', 1), 70);
-		_animationActiveFl = true;
+		local._animationActiveFl = true;
 	} else {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 	}
 
-	_monsterTimer = _scene->_frameStartTime;
-	_monsterActive = false;
+	local._monsterTimer = _scene->_frameStartTime;
+	local._monsterActive = false;
 
-	sceneEntrySound();
+	section_6_music();
 	_game.loadQuoteSet(0x2E7, 0x2E8, 0x2E9, 0x2EA, 0x2EB, 0x2EC, 0x2ED, 0x2EE, 0x2EF, 0x2F0, 0);
 }
 
-void Scene604::step() {
+static void room_604_daemon() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
@@ -118,19 +103,19 @@ void Scene604::step() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 		_game._player._stepEnabled = true;
-		_animationActiveFl = false;
+		local._animationActiveFl = false;
 		break;
 
 	default:
 		break;
 	}
 
-	if (_monsterActive && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _monsterFrame) {
-			_monsterFrame = _scene->_animation[0]->getCurrentFrame();
+	if (local._monsterActive && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._monsterFrame) {
+			local._monsterFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextMonsterFrame = -1;
 
-			switch (_monsterFrame) {
+			switch (local._monsterFrame) {
 			case 50:
 			case 137:
 			case 174:
@@ -165,24 +150,24 @@ void Scene604::step() {
 				break;
 			}
 
-			if ((nextMonsterFrame >= 0) && (nextMonsterFrame != _monsterFrame)) {
+			if ((nextMonsterFrame >= 0) && (nextMonsterFrame != local._monsterFrame)) {
 				_scene->_animation[0]->setCurrentFrame(nextMonsterFrame);
-				_monsterFrame = nextMonsterFrame;
+				local._monsterFrame = nextMonsterFrame;
 			}
 		}
 	}
 
-	if ((!_monsterActive && !_animationActiveFl) && (_scene->_frameStartTime > (_monsterTimer + 4))) {
-		_monsterTimer = _scene->_frameStartTime;
+	if ((!local._monsterActive && !local._animationActiveFl) && (_scene->_frameStartTime > (local._monsterTimer + 4))) {
+		local._monsterTimer = _scene->_frameStartTime;
 		if ((_vm->getRandomNumber(1, 1000) < 25) || !_game._visitedScenes._sceneRevisited) {
-			_monsterActive = true;
+			local._monsterActive = true;
 			_scene->freeAnimation();
 			_scene->loadAnimation(formAnimName('m', -1));
 		}
 	}
 }
 
-void Scene604::handleBombActions() {
+static void handleBombActions() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -190,7 +175,7 @@ void Scene604::handleBombActions() {
 		_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 9, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
 		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
-		if (_bombMode == 1)
+		if (local._bombMode == 1)
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1);
 		else
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 2);
@@ -200,14 +185,14 @@ void Scene604::handleBombActions() {
 
 	case 1:
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1);
-		_timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
+		local._timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
 		_game._objects.setRoom(OBJ_TIMEBOMB, _scene->_currentSceneId);
 		break;
 
 	case 2:
 		_scene->_sequences.remove(_globals._sequenceIndexes[6]);
-		_scene->_dynamicHotspots.remove(_timebombHotspotId);
+		_scene->_dynamicHotspots.remove(local._timebombHotspotId);
 		_game._objects.addToInventory(OBJ_TIMEBOMB);
 		break;
 
@@ -215,7 +200,7 @@ void Scene604::handleBombActions() {
 		_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
-		if (_bombMode == 1) {
+		if (local._bombMode == 1) {
 			_vm->_dialogs->show(60421);
 			_globals[kTimebombStatus] = TIMEBOMB_ACTIVATED;
 			_globals[kTimebombTimer] = 0;
@@ -276,7 +261,7 @@ static void room_604_parser() {
 		&& (_action.isObject(NOUN_BOMB) || _action.isObject(NOUN_BOMBS)))
 		_vm->_dialogs->show(60420);
 	else if (_action.isAction(VERB_PUT, NOUN_TIMEBOMB, NOUN_LEDGE) || _action.isAction(VERB_PUT, NOUN_TIMEBOMB, NOUN_VIEWPORT)) {
-		_bombMode = 1;
+		local._bombMode = 1;
 		if ((_game._difficulty == DIFFICULTY_HARD) || _globals[kWarnedFloodCity])
 			handleBombActions();
 		else if (
@@ -296,13 +281,13 @@ static void room_604_parser() {
 		}
 	} else if (_action.isAction(VERB_TAKE, NOUN_TIMEBOMB)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_TIMEBOMB)) {
-			_bombMode = 2;
+			local._bombMode = 2;
 			handleBombActions();
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(60411);
 	else if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT)) {
-		if (_monsterActive) {
+		if (local._monsterActive) {
 			_vm->_dialogs->show(60413);
 		} else {
 			_vm->_dialogs->show(60412);
@@ -325,6 +310,29 @@ static void room_604_parser() {
 	_action._inProgress = false;
 }
 
+void room_604_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._timebombHotspotId);
+	s.syncAsSint16LE(local._bombMode);
+	s.syncAsSint16LE(local._monsterFrame);
+	s.syncAsUint32LE(local._monsterTimer);
+	s.syncAsByte(local._monsterActive);
+	s.syncAsByte(local._animationActiveFl);
+}
+
+
+void room_604_preload() {
+	room_init_code_pointer = room_604_init;
+	room_daemon_code_pointer = room_604_daemon;
+	room_parser_code_pointer = room_604_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(NOUN_SEA_MONSTER);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_TIMEBOMB);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room605.cpp b/engines/mads/madsv2/nebular/rooms/room605.cpp
index 9b9fd35e522..9fbc8afe4ab 100644
--- a/engines/mads/madsv2/nebular/rooms/room605.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room605.cpp
@@ -19,18 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene605::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
+namespace Rooms {
 
 static void room_605_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
@@ -51,11 +51,11 @@ static void room_605_init() {
 	_game._player._stepEnabled = false;
 	_scene->_sequences.addTimer(600, 70);
 	_scene->_userInterface.setup(kInputLimitedSentences);
-	sceneEntrySound();
+	section_6_music();
 	_vm->_sound->command(22);
 }
 
-void Scene605::step() {
+static void room_605_daemon() {
 	if (_game._trigger == 70) {
 		_vm->_sound->command(23);
 		if (_globals[kResurrectRoom] >= 700)
@@ -67,10 +67,19 @@ void Scene605::step() {
 	}
 }
 
-static void room_605_parser() {
-	return;
+void room_605_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_605_preload() {
+	room_init_code_pointer = room_605_init;
+	room_daemon_code_pointer = room_605_daemon;
+
+	*player.series_name = '\0';
+	section_6_interface();
 }
 
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room607.cpp b/engines/mads/madsv2/nebular/rooms/room607.cpp
index 62ee2438abe..fb36c70a0d5 100644
--- a/engines/mads/madsv2/nebular/rooms/room607.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room607.cpp
@@ -19,50 +19,33 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene607::Scene607(RexNebularEngine *vm) : Scene6xx(vm) {
-	_dogTimer = 0;
-	_lastFrameTime = 0;
+struct Scratch {
+	int32 _dogTimer;
+	int32 _lastFrameTime;
+	bool _dogLoop;
+	bool _dogEatsRex;
+	bool _dogBarking;
+	bool _shopAvailable;
+	int16 _animationMode;
+	int16 _animationActive;
+	int16 _counter;
+};
 
-	_dogLoop = false;
-	_dogEatsRex = false;
-	_dogBarking = false;
-	_shopAvailable = false;
+static Scratch local;
 
-	_animationMode = -1;
-	_animationActive = -1;
-	_counter = -1;
-}
-
-void room_607_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
-
-	s.syncAsUint32LE(_dogTimer);
-	s.syncAsUint32LE(_lastFrameTime);
-
-	s.syncAsByte(_dogLoop);
-	s.syncAsByte(_dogEatsRex);
-	s.syncAsByte(_dogBarking);
-	s.syncAsByte(_shopAvailable);
-
-	s.syncAsSint16LE(_animationMode);
-	s.syncAsSint16LE(_animationActive);
-	s.syncAsSint16LE(_counter);
-}
-
-void Scene607::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_OBNOXIOUS_DOG);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_607_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
@@ -74,7 +57,7 @@ static void room_607_init() {
 	if ((_scene->_priorSceneId == 608) && (_globals[kDogStatus] < DOG_GONE))
 		_globals[kDogStatus] = DOG_GONE;
 
-	_animationActive = 0;
+	local._animationActive = 0;
 
 	if ((_globals[kDogStatus] == DOG_PRESENT) && (_game._difficulty != DIFFICULTY_EASY)) {
 		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3));
@@ -83,11 +66,11 @@ static void room_607_init() {
 
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
-		_dogBarking = false;
-		_dogLoop = false;
-		_shopAvailable = false;
-		_dogEatsRex = false;
-		_dogTimer = 0;
+		local._dogBarking = false;
+		local._dogLoop = false;
+		local._shopAvailable = false;
+		local._dogEatsRex = false;
+		local._dogTimer = 0;
 	} else
 		_scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false);
 
@@ -112,7 +95,7 @@ static void room_607_init() {
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0));
 	}
 
-	sceneEntrySound();
+	section_6_music();
 
 	if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_BONES);
@@ -122,63 +105,63 @@ static void room_607_init() {
 	_game.loadQuoteSet(0x2F8, 0x2F7, 0x2F6, 0x2F9, 0x2FA, 0);
 }
 
-void Scene607::step() {
+static void room_607_daemon() {
 	if (_globals[kDogStatus] == DOG_LEFT) {
-		int32 diff = _scene->_frameStartTime - _lastFrameTime;
+		int32 diff = _scene->_frameStartTime - local._lastFrameTime;
 		if ((diff >= 0) && (diff <= 4))
-			_dogTimer += diff;
+			local._dogTimer += diff;
 		else
-			_dogTimer++;
+			local._dogTimer++;
 
-		_lastFrameTime = _scene->_frameStartTime;
+		local._lastFrameTime = _scene->_frameStartTime;
 	}
 
-	if ((_dogTimer >= 480) && !_dogLoop && !_shopAvailable && (_globals[kDogStatus] == DOG_LEFT) && !_game._player._special) {
+	if ((local._dogTimer >= 480) && !local._dogLoop && !local._shopAvailable && (_globals[kDogStatus] == DOG_LEFT) && !_game._player._special) {
 		_vm->_sound->command(14);
-		_dogLoop = true;
+		local._dogLoop = true;
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
-		_dogLoop = false;
-		_dogTimer = 0;
+		local._dogLoop = false;
+		local._dogTimer = 0;
 	}
 
 	if (_game._trigger == 91) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
-		_dogBarking = false;
+		local._dogBarking = false;
 		_globals[kDogStatus] = DOG_PRESENT;
 		_scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, true);
 	}
 
-	if (!_dogEatsRex && (_game._difficulty != DIFFICULTY_EASY) && !_animationActive && (_globals[kDogStatus] == DOG_PRESENT)
-		&& !_dogBarking && (_vm->getRandomNumber(1, 50) == 10)) {
-		_dogBarking = true;
+	if (!local._dogEatsRex && (_game._difficulty != DIFFICULTY_EASY) && !local._animationActive && (_globals[kDogStatus] == DOG_PRESENT)
+		&& !local._dogBarking && (_vm->getRandomNumber(1, 50) == 10)) {
+		local._dogBarking = true;
 		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 8, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
 		_scene->_kernelMessages.reset();
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 100);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
-		_counter = 0;
+		local._counter = 0;
 	}
 
-	if ((_game._trigger == 70) && !_dogEatsRex && (_globals[kDogStatus] == DOG_PRESENT) && !_animationActive) {
+	if ((_game._trigger == 70) && !local._dogEatsRex && (_globals[kDogStatus] == DOG_PRESENT) && !local._animationActive) {
 		int syncIdx = _globals._sequenceIndexes[1];
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
 		_scene->_kernelMessages.reset();
-		_dogBarking = false;
+		local._dogBarking = false;
 	}
 
 	if (_game._trigger == 100) {
-		_counter++;
+		local._counter++;
 		_vm->_sound->command(12);
 
-		if ((_counter >= 1) && (_counter <= 4)) {
+		if ((local._counter >= 1) && (local._counter <= 4)) {
 			Common::Point pos(0, 0);
-			switch (_counter) {
+			switch (local._counter) {
 			case 1:
 				pos = Common::Point(237, 5);
 				break;
@@ -202,7 +185,7 @@ void Scene607::step() {
 		}
 	}
 
-	if (_game._player._moving && (_game._difficulty != DIFFICULTY_EASY) && !_shopAvailable && (_globals[kDogStatus] == DOG_PRESENT) && (_scene->_rails.getNext() > 0)) {
+	if (_game._player._moving && (_game._difficulty != DIFFICULTY_EASY) && !local._shopAvailable && (_globals[kDogStatus] == DOG_PRESENT) && (_scene->_rails.getNext() > 0)) {
 		_game._player.cancelCommand();
 		_game._player.startWalking(Common::Point(268, 72), FACING_NORTHEAST);
 		_scene->_rails.resetNext();
@@ -212,12 +195,12 @@ void Scene607::step() {
 		_game._player._stepEnabled = false;
 
 	if ((_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == DOG_PRESENT) && (_game._player._playerPos == Common::Point(268, 72))
-		&& (_game._trigger || !_dogEatsRex)) {
-		_dogEatsRex = true;
+		&& (_game._trigger || !local._dogEatsRex)) {
+		local._dogEatsRex = true;
 		switch (_game._trigger) {
 		case 91:
 		case 0:
-			_animationActive = 1;
+			local._animationActive = 1;
 			_game._player._visible = false;
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 			_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
@@ -254,7 +237,7 @@ void Scene607::step() {
 		case 62:
 		{
 			int syncIdx = _globals._sequenceIndexes[4];
-			_animationActive = 2;
+			local._animationActive = 2;
 			_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
@@ -264,14 +247,14 @@ void Scene607::step() {
 
 		case 63:
 			_vm->_dialogs->show(60729);
-			_animationActive = 0;
-			_dogEatsRex = false;
+			local._animationActive = 0;
+			local._dogEatsRex = false;
 			_scene->_reloadSceneFlag = true;
 			_game._player._stepEnabled = true;
 			break;
 
 		case 64:
-			if (_dogEatsRex && (_animationActive == 1)) {
+			if (local._dogEatsRex && (local._animationActive == 1)) {
 				_vm->_sound->command(12);
 				_scene->_sequences.addTimer(10, 64);
 			}
@@ -307,31 +290,31 @@ void Scene607::step() {
 	}
 }
 
-void Scene607::handleThrowingBone() {
-	_animationActive = -1;
+static void handleThrowingBone() {
+	local._animationActive = -1;
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
 		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 		_game._player._visible = false;
-		_scene->loadAnimation(formAnimName('D', _animationMode), 1);
+		_scene->loadAnimation(formAnimName('D', local._animationMode), 1);
 		break;
 
 	case 1:
 		_game._player._visible = true;
 		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 
-		if (_animationMode != 1)
+		if (local._animationMode != 1)
 			_scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false);
 		else {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
 		}
 
-		_dogBarking = false;
+		local._dogBarking = false;
 		if (_game._objects.isInInventory(OBJ_BONE)) {
 			_game._objects.setRoom(OBJ_BONE, 1);
-			if (_animationMode == 1)
+			if (local._animationMode == 1)
 				_globals[kBone202Status] = 0;
 		} else {
 			_game._objects.setRoom(OBJ_BONES, 1);
@@ -344,12 +327,12 @@ void Scene607::handleThrowingBone() {
 	case 2:
 	{
 		int quoteId = 0x2F8;
-		if (_animationMode == 1)
+		if (local._animationMode == 1)
 			quoteId = 0x2F7;
 
-		if (_animationMode == 2) {
+		if (local._animationMode == 2) {
 			_globals[kDogStatus] = DOG_LEFT;
-			_dogTimer = 0;
+			local._dogTimer = 0;
 		}
 
 		_scene->_kernelMessages.reset();
@@ -360,7 +343,7 @@ void Scene607::handleThrowingBone() {
 
 	case 3:
 		_game._player._stepEnabled = true;
-		_animationActive = 0;
+		local._animationActive = 0;
 		break;
 
 	default:
@@ -373,8 +356,8 @@ static void room_607_pre_parser() {
 		_game._player._needToWalk = false;
 
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_SIDE_ENTRANCE) && (_globals[kDogStatus] == DOG_LEFT) && (_game._difficulty != DIFFICULTY_EASY)) {
-		_shopAvailable = true;
-		_dogTimer = 0;
+		local._shopAvailable = true;
+		local._dogTimer = 0;
 	}
 
 	if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG))
@@ -428,7 +411,7 @@ static void room_607_parser() {
 		}
 	} else if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) {
 		if (_game._difficulty != DIFFICULTY_EASY) {
-			_animationMode = 1;
+			local._animationMode = 1;
 			_scene->_kernelMessages.reset();
 			if (_game._trigger == 0)
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
@@ -437,7 +420,7 @@ static void room_607_parser() {
 		}
 	} else if ((_action.isAction(VERB_THROW, NOUN_BONES, NOUN_FENCE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FENCE)) && (_game._difficulty != DIFFICULTY_EASY)
 		&& ((_globals[kDogStatus] == DOG_PRESENT) || _game._trigger)) {
-		_animationMode = 2;
+		local._animationMode = 2;
 		if (_game._trigger == 0) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
@@ -494,6 +477,33 @@ static void room_607_parser() {
 	_action._inProgress = false;
 }
 
+void room_607_synchronize(Common::Serializer &s) {
+	s.syncAsUint32LE(local._dogTimer);
+	s.syncAsUint32LE(local._lastFrameTime);
+
+	s.syncAsByte(local._dogLoop);
+	s.syncAsByte(local._dogEatsRex);
+	s.syncAsByte(local._dogBarking);
+	s.syncAsByte(local._shopAvailable);
+
+	s.syncAsSint16LE(local._animationMode);
+	s.syncAsSint16LE(local._animationActive);
+	s.syncAsSint16LE(local._counter);
+}
+
+void room_607_preload() {
+	room_init_code_pointer = room_607_init;
+	room_daemon_code_pointer = room_607_daemon;
+	room_pre_parser_code_pointer = room_607_pre_parser;
+	room_parser_code_pointer = room_607_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(NOUN_OBNOXIOUS_DOG);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room608.cpp b/engines/mads/madsv2/nebular/rooms/room608.cpp
index aba1e7303ae..ede5f8174c6 100644
--- a/engines/mads/madsv2/nebular/rooms/room608.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room608.cpp
@@ -19,104 +19,68 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene608::Scene608(RexNebularEngine *vm) : Scene6xx(vm) {
-	_carMode = -1;
-	_carFrame = -1;
-	_carMoveMode = -1;
-	_dogDeathMode = -1;
-	_carHotspotId = -1;
-	_barkCount = -1;
-	_polycementHotspotId = -1;
-	_animationMode = -1;
-	_nextTrigger = -1;
-	_throwMode = -1;
-
-	_resetPositionsFl = false;
-	_dogActiveFl = false;
-	_dogBarkingFl = false;
-	_dogFirstEncounter = false;
-	_rexBeingEaten = false;
-	_dogHitWindow = false;
-	_checkFl = false;
-	_dogSquashFl = false;
-	_dogSafeFl = false;
-	_buttonPressedonTimeFl = false;
-	_dogUnderCar = false;
-	_dogYelping = false;
-
-	_dogWindowTimer = -1;
-	_dogRunTimer = -1;
-
-	_dogTimer1 = 0;
-	_dogTimer2 = 0;
-}
-
-void room_608_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
-
-	s.syncAsSint16LE(_carMode);
-	s.syncAsSint16LE(_carFrame);
-	s.syncAsSint16LE(_carMoveMode);
-	s.syncAsSint16LE(_dogDeathMode);
-	s.syncAsSint16LE(_carHotspotId);
-	s.syncAsSint16LE(_barkCount);
-	s.syncAsSint16LE(_polycementHotspotId);
-	s.syncAsSint16LE(_animationMode);
-	s.syncAsSint16LE(_nextTrigger);
-	s.syncAsSint16LE(_throwMode);
-
-	s.syncAsByte(_resetPositionsFl);
-	s.syncAsByte(_dogActiveFl);
-	s.syncAsByte(_dogBarkingFl);
-	s.syncAsByte(_dogFirstEncounter);
-	s.syncAsByte(_rexBeingEaten);
-	s.syncAsByte(_dogHitWindow);
-	s.syncAsByte(_checkFl);
-	s.syncAsByte(_dogSquashFl);
-	s.syncAsByte(_dogSafeFl);
-	s.syncAsByte(_buttonPressedonTimeFl);
-	s.syncAsByte(_dogUnderCar);
-	s.syncAsByte(_dogYelping);
-
-	s.syncAsSint32LE(_dogWindowTimer);
-	s.syncAsSint32LE(_dogRunTimer);
-
-	s.syncAsUint32LE(_dogTimer1);
-	s.syncAsUint32LE(_dogTimer2);
-}
-
-void Scene608::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_POLYCEMENT);
-	_scene->addActiveVocab(NOUN_CAR);
-	_scene->addActiveVocab(NOUN_OBNOXIOUS_DOG);
-}
-
-void Scene608::resetDogVariables() {
+namespace Rooms {
+
+struct Scratch {
+	int16 _carMode;
+	int16 _carFrame;
+	int16 _carMoveMode;
+	int16 _dogDeathMode;
+	int16 _carHotspotId;
+	int16 _barkCount;
+	int16 _polycementHotspotId;
+	int16 _animationMode;
+	int16 _nextTrigger;
+	int16 _throwMode;
+
+	bool _resetPositionsFl;
+	bool _dogActiveFl;
+	bool _dogBarkingFl;
+	bool _dogFirstEncounter;
+	bool _rexBeingEaten;
+	bool _dogHitWindow;
+	bool _checkFl;
+	bool _dogSquashFl;
+	bool _dogSafeFl;
+	bool _buttonPressedonTimeFl;
+	bool _dogUnderCar;
+	bool _dogYelping;
+
+	int32 _dogWindowTimer;
+	int32 _dogRunTimer;
+	int32 _dogTimer1;
+	int32 _dogTimer2;
+};
+
+static Scratch local;
+
+
+static void resetDogVariables() {
 	_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
 	int idx = _scene->_dynamicHotspots.add(NOUN_OBNOXIOUS_DOG, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 142), FACING_EAST);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
-	_dogBarkingFl = false;
-	_dogFirstEncounter = false;
+	local._dogBarkingFl = false;
+	local._dogFirstEncounter = false;
 }
 
-void Scene608::restoreAnimations() {
+static void restoreAnimations() {
 	_scene->freeAnimation();
-	_carMode = 0;
+	local._carMode = 0;
 	_game._player._stepEnabled = true;
-	if (_throwMode == 6)
-		_dogSquashFl = true;
+	if (local._throwMode == 6)
+		local._dogSquashFl = true;
 
 	if (_globals[kCarStatus] == CAR_UP) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[6]);
@@ -131,7 +95,7 @@ void Scene608::restoreAnimations() {
 	}
 }
 
-void Scene608::setCarAnimations() {
+static void setCarAnimations() {
 	_scene->freeAnimation();
 	if (_globals[kCarStatus] == CAR_UP) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
@@ -153,30 +117,30 @@ void Scene608::setCarAnimations() {
 	}
 }
 
-void Scene608::handleThrowingBone() {
+static void handleThrowingBone() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
 		setCarAnimations();
 		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
-		_animationMode = -1;
+		local._animationMode = -1;
 		_game._player._visible = false;
-		_carMode = _throwMode;
-		if (_throwMode == 4)
+		local._carMode = local._throwMode;
+		if (local._throwMode == 4)
 			_scene->loadAnimation(formAnimName('X', 2), 1);
-		else if (_throwMode == 5)
+		else if (local._throwMode == 5)
 			_scene->loadAnimation(formAnimName('X', 1), 1);
 		else
 			_scene->loadAnimation(formAnimName('X', 3), 1);
 		break;
 
 	case 1:
-		_nextTrigger = 1;
+		local._nextTrigger = 1;
 		_scene->_sequences.addTimer(1, 2);
 		break;
 
 	case 2:
-		if (_nextTrigger != 2)
+		if (local._nextTrigger != 2)
 			_scene->_sequences.addTimer(1, 2);
 		else {
 			if (_game._objects.isInInventory(OBJ_BONE))
@@ -190,7 +154,7 @@ void Scene608::handleThrowingBone() {
 		break;
 
 	case 3:
-		if (_throwMode != 6) {
+		if (local._throwMode != 6) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x304));
 			_scene->_sequences.addTimer(120, 4);
@@ -218,7 +182,7 @@ static void room_608_init() {
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1));
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 		int idx = _scene->_dynamicHotspots.add(NOUN_POLYCEMENT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_polycementHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(249, 129), FACING_NORTHEAST);
+		local._polycementHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(249, 129), FACING_NORTHEAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
 	}
 
@@ -236,70 +200,70 @@ static void room_608_init() {
 		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 2));
 		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('h', 2));
 		_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('h', 3));
-		_rexBeingEaten = false;
+		local._rexBeingEaten = false;
 
 		if (!_game._visitedScenes._sceneRevisited) {
 			_globals[kDogStatus] = DOG_GONE;
-			_dogActiveFl = true;
+			local._dogActiveFl = true;
 		} else
-			_dogActiveFl = (_globals[kDogStatus] != DOG_DEAD);
+			local._dogActiveFl = (_globals[kDogStatus] != DOG_DEAD);
 	} else {
 		_globals[kDogStatus] = DOG_DEAD;
-		_dogActiveFl = false;
+		local._dogActiveFl = false;
 	}
 
-	_dogSquashFl = false;
-	_buttonPressedonTimeFl = false;
-	_dogWindowTimer = 0;
-	_dogRunTimer = 0;
-	_dogHitWindow = false;
-	_checkFl = false;
-	_dogUnderCar = false;
-	_dogYelping = false;
+	local._dogSquashFl = false;
+	local._buttonPressedonTimeFl = false;
+	local._dogWindowTimer = 0;
+	local._dogRunTimer = 0;
+	local._dogHitWindow = false;
+	local._checkFl = false;
+	local._dogUnderCar = false;
+	local._dogYelping = false;
 
 
 	if (!_game._visitedScenes._sceneRevisited)
 		_globals[kCarStatus] = CAR_UP;
 
-	_animationMode = 0;
-	_carMoveMode = 0;
-	_carFrame = -1;
+	local._animationMode = 0;
+	local._carMoveMode = 0;
+	local._carFrame = -1;
 
 	if (_globals[kCarStatus] == CAR_UP) {
-		_carMode = 0;
-		_dogDeathMode = 0;
-		_resetPositionsFl = false;
+		local._carMode = 0;
+		local._dogDeathMode = 0;
+		local._resetPositionsFl = false;
 		int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
-		_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+		local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 		_scene->loadAnimation(formAnimName('A', -1));
 	} else if (_globals[kCarStatus] == CAR_DOWN) {
-		_carMode = 0;
-		_dogDeathMode = 0;
-		_resetPositionsFl = false;
+		local._carMode = 0;
+		local._dogDeathMode = 0;
+		local._resetPositionsFl = false;
 		int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
-		_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+		local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 		_scene->loadAnimation(formAnimName('A', -1));
 		_scene->_animation[0]->setCurrentFrame(6);
 	} else if (_globals[kCarStatus] == CAR_SQUASHES_DOG) {
-		_carMode = 2;
-		_dogDeathMode = 0;
-		_resetPositionsFl = false;
+		local._carMode = 2;
+		local._dogDeathMode = 0;
+		local._resetPositionsFl = false;
 		int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
-		_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+		local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 		_scene->loadAnimation(formAnimName('C', -1));
 	} else if (_globals[kCarStatus] == CAR_SQUASHES_DOG_AGAIN) {
-		_carMode = 1;
-		_dogDeathMode = 2;
-		_resetPositionsFl = true;
+		local._carMode = 1;
+		local._dogDeathMode = 2;
+		local._resetPositionsFl = true;
 		int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
-		_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+		local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 		_scene->loadAnimation(formAnimName('B', -1));
 	} else {
-		_carMode = 3;
-		_dogDeathMode = 2;
-		_resetPositionsFl = true;
+		local._carMode = 3;
+		local._dogDeathMode = 2;
+		local._resetPositionsFl = true;
 		int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
-		_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+		local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 		_scene->loadAnimation(formAnimName('D', -1));
 	}
 
@@ -311,12 +275,12 @@ static void room_608_init() {
 		_game._player._facing = FACING_EAST;
 		if (_game._difficulty == DIFFICULTY_HARD) {
 			if (!_game._visitedScenes._sceneRevisited)
-				_dogFirstEncounter = true;
-			else if (_dogActiveFl)
+				local._dogFirstEncounter = true;
+			else if (local._dogActiveFl)
 				resetDogVariables();
 		}
-	} else if ((_game._difficulty == DIFFICULTY_HARD) && !_dogFirstEncounter && _dogActiveFl) {
-		if (!_dogUnderCar)
+	} else if ((_game._difficulty == DIFFICULTY_HARD) && !local._dogFirstEncounter && local._dogActiveFl) {
+		if (!local._dogUnderCar)
 			resetDogVariables();
 		else {
 			_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0);
@@ -325,7 +289,7 @@ static void room_608_init() {
 		}
 	}
 
-	sceneEntrySound();
+	section_6_music();
 
 	if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_BONES);
@@ -333,39 +297,39 @@ static void room_608_init() {
 	_game.loadQuoteSet(0x2FB, 0x2FC, 0x2FE, 0x2FD, 0x2FF, 0x300, 0x301, 0x302, 0x303, 0x304, 0);
 }
 
-void Scene608::step() {
-	if (_dogFirstEncounter) {
-		long diff = _scene->_frameStartTime - _dogTimer1;
+static void room_608_daemon() {
+	if (local._dogFirstEncounter) {
+		long diff = _scene->_frameStartTime - local._dogTimer1;
 		if ((diff >= 0) && (diff <= 1))
-			_dogWindowTimer += diff;
+			local._dogWindowTimer += diff;
 		else
-			_dogWindowTimer++;
+			local._dogWindowTimer++;
 
-		_dogTimer1 = _scene->_frameStartTime;
+		local._dogTimer1 = _scene->_frameStartTime;
 	}
 
-	if (_dogActiveFl && (_dogWindowTimer >= 2) && !_dogHitWindow) {
-		_dogHitWindow = true;
+	if (local._dogActiveFl && (local._dogWindowTimer >= 2) && !local._dogHitWindow) {
+		local._dogHitWindow = true;
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 11, 1, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
 		_vm->_sound->command(14);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
-		_dogWindowTimer = 0;
+		local._dogWindowTimer = 0;
 	}
 
 	if (_game._trigger == 70)
 		resetDogVariables();
 
-	if ((_game._difficulty == DIFFICULTY_HARD) && !_animationMode && _dogActiveFl && !_dogFirstEncounter && !_dogUnderCar) {
-		if (!_dogBarkingFl) {
+	if ((_game._difficulty == DIFFICULTY_HARD) && !local._animationMode && local._dogActiveFl && !local._dogFirstEncounter && !local._dogUnderCar) {
+		if (!local._dogBarkingFl) {
 			if (_vm->getRandomNumber(1, 50) == 10) {
-				_dogBarkingFl = true;
+				local._dogBarkingFl = true;
 				_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 8, 0, 0);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
 				int idx = _scene->_dynamicHotspots.add(NOUN_OBNOXIOUS_DOG, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 142), FACING_EAST);
-				_barkCount = 0;
+				local._barkCount = 0;
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 2, 100);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
 			}
@@ -375,17 +339,17 @@ void Scene608::step() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], syncIdx);
 			_scene->_kernelMessages.reset();
-			_dogBarkingFl = false;
+			local._dogBarkingFl = false;
 		}
 	}
 
-	if ((_game._trigger == 100) && _dogBarkingFl) {
+	if ((_game._trigger == 100) && local._dogBarkingFl) {
 		_vm->_sound->command(12);
-		_barkCount++;
+		local._barkCount++;
 
-		if ((_barkCount >= 1) && (_barkCount <= 4)) {
+		if ((local._barkCount >= 1) && (local._barkCount <= 4)) {
 			Common::Point _barkPos(0, 0);
-			switch (_barkCount) {
+			switch (local._barkCount) {
 			case 1:
 				_barkPos = Common::Point(197, 66);
 				break;
@@ -409,35 +373,35 @@ void Scene608::step() {
 		}
 	}
 
-	if (_dogSquashFl && !_dogFirstEncounter && _dogUnderCar && _dogActiveFl) {
-		long diff = _scene->_frameStartTime - _dogTimer2;
+	if (local._dogSquashFl && !local._dogFirstEncounter && local._dogUnderCar && local._dogActiveFl) {
+		long diff = _scene->_frameStartTime - local._dogTimer2;
 		if ((diff >= 0) && (diff <= 4))
-			_dogRunTimer += diff;
+			local._dogRunTimer += diff;
 		else
-			_dogRunTimer++;
+			local._dogRunTimer++;
 
-		_dogTimer2 = _scene->_frameStartTime;
+		local._dogTimer2 = _scene->_frameStartTime;
 	}
 
-	if (_dogRunTimer >= 480 && !_checkFl && !_buttonPressedonTimeFl && !_dogFirstEncounter && _dogUnderCar && _dogActiveFl) {
-		_checkFl = true;
-		_dogSquashFl = false;
-		_dogSafeFl = true;
-		_checkFl = false;
-		_dogRunTimer = 0;
+	if (local._dogRunTimer >= 480 && !local._checkFl && !local._buttonPressedonTimeFl && !local._dogFirstEncounter && local._dogUnderCar && local._dogActiveFl) {
+		local._checkFl = true;
+		local._dogSquashFl = false;
+		local._dogSafeFl = true;
+		local._checkFl = false;
+		local._dogRunTimer = 0;
 	} else {
-		_dogSafeFl = false;
-		if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_scene->_rails.getNext() > 0) && _dogUnderCar)
-			_dogSafeFl = true;
+		local._dogSafeFl = false;
+		if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && local._dogActiveFl && (_scene->_rails.getNext() > 0) && local._dogUnderCar)
+			local._dogSafeFl = true;
 	}
 
-	if (_dogActiveFl && _dogSafeFl && !_buttonPressedonTimeFl) {
-		_dogDeathMode = 0;
+	if (local._dogActiveFl && local._dogSafeFl && !local._buttonPressedonTimeFl) {
+		local._dogDeathMode = 0;
 		_globals[kCarStatus] = CAR_UP;
-		_carMode = 0;
+		local._carMode = 0;
 		_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-		_dogUnderCar = false;
-		_dogYelping = false;
+		local._dogUnderCar = false;
+		local._dogYelping = false;
 		_scene->_kernelMessages.reset();
 		_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1, 0, 0);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 92);
@@ -446,60 +410,60 @@ void Scene608::step() {
 
 	if (_game._trigger == 92) {
 		resetDogVariables();
-		_animationMode = 0;
+		local._animationMode = 0;
 	}
 
-	if ((_carMode == 4) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._carMode == 4) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 
-			if (_carFrame == 10) {
+			if (local._carFrame == 10) {
 				_game._player._visible = true;
 				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
-			} else if (_carFrame == 56) {
+			} else if (local._carFrame == 56) {
 				resetDogVariables();
-				_animationMode = 0;
-				_nextTrigger = 2;
+				local._animationMode = 0;
+				local._nextTrigger = 2;
 			}
 		}
 	}
 
-	if ((_carMode == 5) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
-			if (_carFrame == 10) {
+	if ((local._carMode == 5) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
+			if (local._carFrame == 10) {
 				_game._player._visible = true;
 				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
-			} else if (_carFrame == 52) {
+			} else if (local._carFrame == 52) {
 				resetDogVariables();
-				_animationMode = 0;
-				_nextTrigger = 2;
+				local._animationMode = 0;
+				local._nextTrigger = 2;
 			}
 		}
 	}
 
-	if ((_carMode == 6) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._carMode == 6) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 
-			if (_carFrame == 11) {
+			if (local._carFrame == 11) {
 				_game._player._visible = true;
 				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
-			} else if (_carFrame == 41) {
+			} else if (local._carFrame == 41) {
 				_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
-				_dogUnderCar = true;
-				_nextTrigger = 2;
+				local._dogUnderCar = true;
+				local._nextTrigger = 2;
 			}
 		}
 	}
 
-	if (_dogUnderCar) {
-		if (!_dogYelping) {
+	if (local._dogUnderCar) {
+		if (!local._dogYelping) {
 			if (_vm->getRandomNumber(1, 50) == 10) {
-				_dogYelping = true;
-				_barkCount = 0;
+				local._dogYelping = true;
+				local._barkCount = 0;
 				_scene->_sequences.addTimer(12, 110);
 				_scene->_sequences.addTimer(22, 111);
 				_scene->_sequences.addTimer(120, 112);
@@ -507,7 +471,7 @@ void Scene608::step() {
 			_scene->_kernelMessages.reset();
 		}
 	} else
-		_dogYelping = false;
+		local._dogYelping = false;
 
 	if (_game._trigger == 110) {
 		_vm->_sound->command(12);
@@ -520,15 +484,15 @@ void Scene608::step() {
 	}
 
 	if (_game._trigger == 112)
-		_dogYelping = false;
+		local._dogYelping = false;
 
-	if ((_carMode == 0) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._carMode == 0) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_DOWN)) {
-				switch (_carMoveMode) {
+				switch (local._carMoveMode) {
 				case 0:
 					if (_globals[kCarStatus] == CAR_UP)
 						nextFrame = 0;
@@ -539,7 +503,7 @@ void Scene608::step() {
 				case 1:
 					if (_scene->_animation[0]->getCurrentFrame() >= 12) {
 						nextFrame = 0;
-						_carMoveMode = 0;
+						local._carMoveMode = 0;
 						_globals[kCarStatus] = CAR_UP;
 					}
 					break;
@@ -547,7 +511,7 @@ void Scene608::step() {
 				case 2:
 					if (_scene->_animation[0]->getCurrentFrame() >= 6) {
 						nextFrame = 6;
-						_carMoveMode = 0;
+						local._carMoveMode = 0;
 						_globals[kCarStatus] = CAR_DOWN;
 					}
 					break;
@@ -559,93 +523,93 @@ void Scene608::step() {
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_carFrame = nextFrame;
+				local._carFrame = nextFrame;
 			}
 		}
 	}
 
-	if ((_carMode == 2) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._carMode == 2) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
-			if (_carMoveMode == 0)
+			if (local._carMoveMode == 0)
 				nextFrame = 28;
 			else if (_scene->_animation[0]->getCurrentFrame() >= 28) {
 				nextFrame = 28;
-				_carMoveMode = 0;
+				local._carMoveMode = 0;
 			}
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_carFrame = nextFrame;
+				local._carFrame = nextFrame;
 			}
 		}
 	}
 
-	if ((_carMode == 3) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._carMode == 3) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
-			if (_resetPositionsFl) {
+			if (local._resetPositionsFl) {
 				nextFrame = 0;
-				_carMoveMode = 0;
-			} else if (_carMoveMode == 0)
+				local._carMoveMode = 0;
+			} else if (local._carMoveMode == 0)
 				nextFrame = 6;
 			else if (_scene->_animation[0]->getCurrentFrame() >= 6) {
 				nextFrame = 6;
-				_carMoveMode = 0;
+				local._carMoveMode = 0;
 			}
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_carFrame = nextFrame;
+				local._carFrame = nextFrame;
 			}
 		}
 	}
 
 
-	if ((_carMode == 1) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._carMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._carFrame) {
+			local._carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
-			if (_resetPositionsFl) {
+			if (local._resetPositionsFl) {
 				nextFrame = 0;
-				_carMoveMode = 0;
-			} else if (_carMoveMode == 0)
+				local._carMoveMode = 0;
+			} else if (local._carMoveMode == 0)
 				nextFrame = 6;
 			else if (_scene->_animation[0]->getCurrentFrame() >= 6) {
 				nextFrame = 6;
-				_carMoveMode = 0;
+				local._carMoveMode = 0;
 			}
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_carFrame = nextFrame;
+				local._carFrame = nextFrame;
 			}
 		}
 	}
 
-	if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_scene->_rails.getNext() > 0)) {
+	if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && local._dogActiveFl && (_scene->_rails.getNext() > 0)) {
 		_game._player.cancelCommand();
 		_game._player.startWalking(Common::Point(194, 142), FACING_EAST);
 		_scene->_rails.resetNext();
-		if (_dogUnderCar)
-			_dogSafeFl = true;
+		if (local._dogUnderCar)
+			local._dogSafeFl = true;
 	}
 
-	if (_game._player._special > 0 && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && _game._player._stepEnabled)
+	if (_game._player._special > 0 && (_game._difficulty == DIFFICULTY_HARD) && local._dogActiveFl && _game._player._stepEnabled)
 		_game._player._stepEnabled = false;
 
-	if ((_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_game._player._playerPos == Common::Point(194, 142))
-		&& (_game._trigger || !_rexBeingEaten)) {
-		_rexBeingEaten = true;
+	if ((_game._difficulty == DIFFICULTY_HARD) && local._dogActiveFl && (_game._player._playerPos == Common::Point(194, 142))
+		&& (_game._trigger || !local._rexBeingEaten)) {
+		local._rexBeingEaten = true;
 		switch (_game._trigger) {
 		case 0:
 			_scene->_sequences.remove(_globals._sequenceIndexes[5]);
-			_animationMode = 1;
+			local._animationMode = 1;
 			_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
@@ -688,7 +652,7 @@ void Scene608::step() {
 
 		case 83:
 		{
-			_animationMode = 2;
+			local._animationMode = 2;
 			int syncIdx = _globals._sequenceIndexes[9];
 			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
@@ -698,14 +662,14 @@ void Scene608::step() {
 		break;
 
 		case 84:
-			_rexBeingEaten = false;
-			_animationMode = 0;
+			local._rexBeingEaten = false;
+			local._animationMode = 0;
 			_scene->_reloadSceneFlag = true;
 			_game._player._stepEnabled = true;
 			break;
 
 		case 85:
-			if (_rexBeingEaten && (_animationMode == 1)) {
+			if (local._rexBeingEaten && (local._animationMode == 1)) {
 				_vm->_sound->command(12);
 				_scene->_sequences.addTimer(10, 85);
 			}
@@ -722,22 +686,22 @@ static void room_608_pre_parser() {
 
 	if ((_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE)
 		|| _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_FRONT_OF_GARAGE)
-		|| _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) && _dogActiveFl) {
+		|| _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) && local._dogActiveFl) {
 		_game._player._stepEnabled = false;
 		_game._player.walk(Common::Point(56, 146), FACING_EAST);
 	}
 
 	if ((_action.isAction(VERB_THROW, NOUN_BONES, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_AREA_BEHIND_CAR)
-		|| _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) && _dogActiveFl) {
+		|| _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) && local._dogActiveFl) {
 		_game._player._stepEnabled = false;
 		_game._player.walk(Common::Point(75, 136), FACING_EAST);
 	}
 
-	if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON) && _dogUnderCar) {
-		_buttonPressedonTimeFl = true;
-		_dogDeathMode = 1;
+	if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON) && local._dogUnderCar) {
+		local._buttonPressedonTimeFl = true;
+		local._dogDeathMode = 1;
 	} else
-		_buttonPressedonTimeFl = false;
+		local._buttonPressedonTimeFl = false;
 }
 
 static void room_608_parser() {
@@ -761,46 +725,46 @@ static void room_608_parser() {
 		case 1:
 			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
 			_game._player._visible = true;
-			if (_dogDeathMode == 0)
-				_carMode = 0;
-			else if (_dogDeathMode == 1) {
+			if (local._dogDeathMode == 0)
+				local._carMode = 0;
+			else if (local._dogDeathMode == 1) {
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x300));
 				_globals[kCarStatus] = CAR_SQUASHES_DOG;
-				_carMode = 2;
+				local._carMode = 2;
 				_globals[kDogStatus] = DOG_DEAD;
-				_dogActiveFl = false;
-				_dogUnderCar = false;
+				local._dogActiveFl = false;
+				local._dogUnderCar = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 				_scene->freeAnimation();
 				_scene->loadAnimation(formAnimName('C', -1));
 			} else {
-				_resetPositionsFl = false;
-				_carMode = 1;
+				local._resetPositionsFl = false;
+				local._carMode = 1;
 				_scene->freeAnimation();
 				_scene->loadAnimation(formAnimName('B', -1));
 			}
 
-			_carMoveMode = 2;
+			local._carMoveMode = 2;
 			_scene->_sequences.addTimer(1, 2);
 			break;
 
 		case 2:
-			if (_carMoveMode != 0)
+			if (local._carMoveMode != 0)
 				_scene->_sequences.addTimer(1, 2);
 			else {
-				_scene->_dynamicHotspots.remove(_carHotspotId);
+				_scene->_dynamicHotspots.remove(local._carHotspotId);
 				int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
-				_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+				local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 				if (_globals[kCarStatus] == CAR_SQUASHES_DOG)
 					_scene->_sequences.addTimer(120, 3);
 				else {
-					if (_dogDeathMode == 0)
+					if (local._dogDeathMode == 0)
 						_globals[kCarStatus] = CAR_DOWN;
 					else {
 						_globals[kCarStatus] = CAR_DOWN_ON_SQUASHED_DOG;
-						_carMode = 3;
-						_dogDeathMode = 2;
+						local._carMode = 3;
+						local._dogDeathMode = 2;
 					}
 					_game._player._stepEnabled = true;
 				}
@@ -810,8 +774,8 @@ static void room_608_parser() {
 		case 3:
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x302));
 			_globals[kCarStatus] = CAR_DOWN_ON_SQUASHED_DOG;
-			_carMode = 3;
-			_dogDeathMode = 2;
+			local._carMode = 3;
+			local._dogDeathMode = 2;
 			_game._player._stepEnabled = true;
 			break;
 
@@ -835,32 +799,32 @@ static void room_608_parser() {
 		case 1:
 			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
 			_game._player._visible = true;
-			if (_dogDeathMode == 0)
-				_carMode = 0;
+			if (local._dogDeathMode == 0)
+				local._carMode = 0;
 			else {
-				_carMode = 3;
-				_resetPositionsFl = false;
+				local._carMode = 3;
+				local._resetPositionsFl = false;
 				_scene->freeAnimation();
 				_scene->loadAnimation(formAnimName('D', -1));
 			}
-			_carMoveMode = 1;
+			local._carMoveMode = 1;
 			_scene->_sequences.addTimer(1, 2);
 			break;
 
 		case 2:
 		{
-			if (_carMoveMode != 0)
+			if (local._carMoveMode != 0)
 				_scene->_sequences.addTimer(1, 2);
-			else if (_dogDeathMode == 0)
+			else if (local._dogDeathMode == 0)
 				_globals[kCarStatus] = CAR_UP;
-			else if (_dogDeathMode == 2) {
+			else if (local._dogDeathMode == 2) {
 				_globals[kCarStatus] = CAR_SQUASHES_DOG_AGAIN;
-				_carMode = 3;
-				_dogDeathMode = 2;
+				local._carMode = 3;
+				local._dogDeathMode = 2;
 			}
-			_scene->_dynamicHotspots.remove(_carHotspotId);
+			_scene->_dynamicHotspots.remove(local._carHotspotId);
 			int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
-			_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+			local._carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 			_game._player._stepEnabled = true;
 		}
 		break;
@@ -871,36 +835,36 @@ static void room_608_parser() {
 	} else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE)
 		|| _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) {
 		_game._player._stepEnabled = true;
-		if (_dogActiveFl) {
+		if (local._dogActiveFl) {
 			if (_game._trigger == 0) {
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FE));
 			}
-			_throwMode = 4;
+			local._throwMode = 4;
 			handleThrowingBone();
 		} else
 			_vm->_dialogs->show(60841);
 	} else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_FRONT_OF_GARAGE)) {
 		_game._player._stepEnabled = true;
-		if (_dogActiveFl) {
+		if (local._dogActiveFl) {
 			if (_game._trigger == 0) {
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FD));
 			}
-			_throwMode = 5;
+			local._throwMode = 5;
 			handleThrowingBone();
 		} else
 			_vm->_dialogs->show(60841);
 	} else if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_AREA_BEHIND_CAR)
 		|| _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) {
 		_game._player._stepEnabled = true;
-		if ((_globals[kCarStatus] == CAR_UP) && _dogActiveFl) {
-			if (_dogActiveFl) {
+		if ((_globals[kCarStatus] == CAR_UP) && local._dogActiveFl) {
+			if (local._dogActiveFl) {
 				if (_game._trigger == 0) {
 					_scene->_kernelMessages.reset();
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x301));
 				}
-				_throwMode = 6;
+				local._throwMode = 6;
 				handleThrowingBone();
 			} else
 				_vm->_dialogs->show(60841);
@@ -920,7 +884,7 @@ static void room_608_parser() {
 		case 1:
 			_vm->_sound->command(9);
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_scene->_dynamicHotspots.remove(_polycementHotspotId);
+			_scene->_dynamicHotspots.remove(local._polycementHotspotId);
 			break;
 
 		case 2:
@@ -976,7 +940,7 @@ static void room_608_parser() {
 		|| _action.isObject(NOUN_COILS) || _action.isObject(NOUN_QUARTER_PANEL)))
 		_vm->_dialogs->show(60814);
 	else if (_action.isAction(VERB_LOOK, NOUN_GARAGE_FLOOR) || _action.isAction(VERB_LOOK, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_LOOK, NOUN_REAR_OF_GARAGE)) {
-		if (_dogActiveFl)
+		if (local._dogActiveFl)
 			_vm->_dialogs->show(60815);
 		else
 			_vm->_dialogs->show(60816);
@@ -1027,6 +991,53 @@ static void room_608_parser() {
 	_action._inProgress = false;
 }
 
+void room_608_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._carMode);
+	s.syncAsSint16LE(local._carFrame);
+	s.syncAsSint16LE(local._carMoveMode);
+	s.syncAsSint16LE(local._dogDeathMode);
+	s.syncAsSint16LE(local._carHotspotId);
+	s.syncAsSint16LE(local._barkCount);
+	s.syncAsSint16LE(local._polycementHotspotId);
+	s.syncAsSint16LE(local._animationMode);
+	s.syncAsSint16LE(local._nextTrigger);
+	s.syncAsSint16LE(local._throwMode);
+
+	s.syncAsByte(local._resetPositionsFl);
+	s.syncAsByte(local._dogActiveFl);
+	s.syncAsByte(local._dogBarkingFl);
+	s.syncAsByte(local._dogFirstEncounter);
+	s.syncAsByte(local._rexBeingEaten);
+	s.syncAsByte(local._dogHitWindow);
+	s.syncAsByte(local._checkFl);
+	s.syncAsByte(local._dogSquashFl);
+	s.syncAsByte(local._dogSafeFl);
+	s.syncAsByte(local._buttonPressedonTimeFl);
+	s.syncAsByte(local._dogUnderCar);
+	s.syncAsByte(local._dogYelping);
+
+	s.syncAsSint32LE(local._dogWindowTimer);
+	s.syncAsSint32LE(local._dogRunTimer);
+
+	s.syncAsUint32LE(local._dogTimer1);
+	s.syncAsUint32LE(local._dogTimer2);
+}
+
+void room_608_preload() {
+	room_init_code_pointer = room_608_init;
+	room_daemon_code_pointer = room_608_daemon;
+	room_pre_parser_code_pointer = room_608_pre_parser;
+	room_parser_code_pointer = room_608_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_POLYCEMENT);
+	_scene->addActiveVocab(NOUN_CAR);
+	_scene->addActiveVocab(NOUN_OBNOXIOUS_DOG);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room609.cpp b/engines/mads/madsv2/nebular/rooms/room609.cpp
index ca3e3b92c31..bdce5897f48 100644
--- a/engines/mads/madsv2/nebular/rooms/room609.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room609.cpp
@@ -19,28 +19,25 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene609::Scene609(RexNebularEngine *vm) : Scene6xx(vm) {
-	_videoDoorMode = -1;
-}
-
-void room_609_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
+struct Scratch {
+	int16 _videoDoorMode;
+};
 
-	s.syncAsSint16LE(_videoDoorMode);
-}
+static Scratch local;
 
-void Scene609::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
 static void room_609_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
@@ -82,11 +79,11 @@ static void room_609_init() {
 			_game._objects.addToInventory(OBJ_PENLIGHT);
 	}
 
-	sceneEntrySound();
+	section_6_music();
 	_game.loadQuoteSet(0x305, 0x306, 0x307, 0x308, 0x309, 0);
 }
 
-void Scene609::step() {
+static void room_609_daemon() {
 	switch (_game._trigger) {
 	case 60:
 		_game._player._stepEnabled = false;
@@ -157,11 +154,11 @@ void Scene609::step() {
 	}
 }
 
-static void room_609_initStore() {
+static void enterStore() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
-		if (_videoDoorMode == 2)
+		if (local._videoDoorMode == 2)
 			_scene->_sequences.addTimer(1, 4);
 		else {
 			_scene->_kernelMessages.reset();
@@ -210,7 +207,7 @@ static void room_609_initStore() {
 
 	case 6:
 		_scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, false);
-		if (_videoDoorMode == 1) {
+		if (local._videoDoorMode == 1) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(0x307));
 		}
@@ -285,11 +282,11 @@ static void room_609_parser() {
 				break;
 			}
 		} else {
-			_videoDoorMode = 2;
+			local._videoDoorMode = 2;
 			enterStore();
 		}
 	} else if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_VIDEO_STORE_DOOR)) {
-		_videoDoorMode = 1;
+		local._videoDoorMode = 1;
 		enterStore();
 	} else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
 		switch (_game._trigger) {
@@ -360,6 +357,21 @@ static void room_609_parser() {
 	_action._inProgress = false;
 }
 
+void room_609_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._videoDoorMode);
+}
+
+void room_609_preload() {
+	room_init_code_pointer = room_609_init;
+	room_daemon_code_pointer = room_609_daemon;
+	room_pre_parser_code_pointer = room_609_pre_parser;
+	room_parser_code_pointer = room_609_parser;
+
+	section_6_walker();
+	section_6_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room610.cpp b/engines/mads/madsv2/nebular/rooms/room610.cpp
index faa8fda67b5..f5e88c61b58 100644
--- a/engines/mads/madsv2/nebular/rooms/room610.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room610.cpp
@@ -19,42 +19,29 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene610::Scene610(RexNebularEngine *vm) : Scene6xx(vm) {
-	_handsetHotspotId = -1;
-	_checkVal = -1;
+struct Scratch {
+	int16 _handsetHotspotId;
+	int16 _checkVal;
+	bool _cellCharging;
+	int32 _cellChargingTimer;
+	int32 _lastFrameTimer;
+};
 
-	_cellCharging = false;
+static Scratch local;
 
-	_cellChargingTimer = -1;
-	_lastFrameTimer = 0;
-}
-
-void room_610_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
-
-	s.syncAsSint16LE(_handsetHotspotId);
-	s.syncAsSint16LE(_checkVal);
-
-	s.syncAsByte(_cellCharging);
-
-	s.syncAsSint32LE(_cellChargingTimer);
-	s.syncAsUint32LE(_lastFrameTimer);
-}
-
-void Scene610::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_PHONE_HANDSET);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_610_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
@@ -68,12 +55,12 @@ static void room_610_init() {
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
 
 	if (!_game._visitedScenes._sceneRevisited)
-		_cellCharging = false;
+		local._cellCharging = false;
 
 	if (_game._objects[OBJ_PHONE_HANDSET]._roomNumber == _scene->_currentSceneId) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		_handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(_handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST);
+		local._handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(local._handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST);
 		if ((_globals[kHandsetCellStatus] == 2) && (_game._difficulty == DIFFICULTY_HARD) && !_globals[kDurafailRecharged])
 			_globals[kHandsetCellStatus] = 1;
 	}
@@ -86,27 +73,27 @@ static void room_610_init() {
 		_game._player._facing = FACING_NORTHWEST;
 	}
 
-	sceneEntrySound();
+	section_6_music();
 }
 
-void Scene610::step() {
-	if (_cellCharging) {
-		long diff = _scene->_frameStartTime - _lastFrameTimer;
+static void room_610_daemon() {
+	if (local._cellCharging) {
+		long diff = _scene->_frameStartTime - local._lastFrameTimer;
 		if ((diff >= 0) && (diff <= 60))
-			_cellChargingTimer += diff;
+			local._cellChargingTimer += diff;
 		else
-			_cellChargingTimer++;
+			local._cellChargingTimer++;
 
-		_lastFrameTimer = _scene->_frameStartTime;
+		local._lastFrameTimer = _scene->_frameStartTime;
 	}
 
-	// CHECKME: _checkVal is always false, could be removed
-	if ((_cellChargingTimer >= 60) && !_checkVal) {
-		_checkVal = true;
+	// CHECKME: local._checkVal is always false, could be removed
+	if ((local._cellChargingTimer >= 60) && !local._checkVal) {
+		local._checkVal = true;
 		_globals[kHandsetCellStatus] = 1;
-		_cellCharging = false;
-		_checkVal = false;
-		_cellChargingTimer = 0;
+		local._cellCharging = false;
+		local._checkVal = false;
+		local._cellChargingTimer = 0;
 	}
 }
 
@@ -129,7 +116,7 @@ static void room_610_parser() {
 			case 1:
 				_vm->_sound->command(9);
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-				_scene->_dynamicHotspots.remove(_handsetHotspotId);
+				_scene->_dynamicHotspots.remove(local._handsetHotspotId);
 				_game._objects.addToInventory(OBJ_PHONE_HANDSET);
 				_vm->_dialogs->showItem(OBJ_PHONE_HANDSET, 61017);
 				break;
@@ -158,8 +145,8 @@ static void room_610_parser() {
 
 		case 1:
 			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-			_handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-			_scene->_dynamicHotspots.setPosition(_handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST);
+			local._handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.setPosition(local._handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST);
 			_game._objects.setRoom(OBJ_PHONE_HANDSET, _scene->_currentSceneId);
 			break;
 
@@ -168,7 +155,7 @@ static void room_610_parser() {
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
 			if ((_globals[kHandsetCellStatus] == 2) && (_game._difficulty == DIFFICULTY_HARD) && !_globals[kDurafailRecharged])
-				_cellCharging = true;
+				local._cellCharging = true;
 
 			_vm->_dialogs->show(61032);
 			break;
@@ -230,6 +217,28 @@ static void room_610_parser() {
 	_action._inProgress = false;
 }
 
+void room_610_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._handsetHotspotId);
+	s.syncAsSint16LE(local._checkVal);
+
+	s.syncAsByte(local._cellCharging);
+
+	s.syncAsSint32LE(local._cellChargingTimer);
+	s.syncAsUint32LE(local._lastFrameTimer);
+}
+
+void room_610_preload() {
+	room_init_code_pointer = room_610_init;
+	room_daemon_code_pointer = room_610_daemon;
+	room_parser_code_pointer = room_610_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(NOUN_PHONE_HANDSET);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room611.cpp b/engines/mads/madsv2/nebular/rooms/room611.cpp
index c8045dd9ede..5186d7ba54c 100644
--- a/engines/mads/madsv2/nebular/rooms/room611.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room611.cpp
@@ -19,86 +19,60 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene611::Scene611(RexNebularEngine *vm) : Scene6xx(vm), _defaultDialogPos(0, 0) {
-	_seenRatFl = false;
-	_eyesRunningFl = false;
-	_shouldRemoveEyes = false;
-	_ratPresentFl = false;
-	_duringDialogFl = false;
-	_resetBatterieText = false;
-	_hermitTalkingFl = false;
-	_hermitMovingFl = false;
-	_alreadyTalkingFl = false;
-	_giveBatteriesFl = false;
-	_startTradingFl = false;
-	_check1Fl = false;
-	_stickFingerFl = false;
-
-	_randVal = -1;
-	_ratHotspotId = -1;
-	_hermitDialogNode = -1;
-	_hermitDisplayedQuestion = -1;
-	_nextFrame = -1;
-	_hermitMode = -1;
-
-	_ratTimer = 0;
-}
-
-void room_611_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
-
-	s.syncAsByte(_seenRatFl);
-	s.syncAsByte(_eyesRunningFl);
-	s.syncAsByte(_shouldRemoveEyes);
-	s.syncAsByte(_ratPresentFl);
-	s.syncAsByte(_duringDialogFl);
-	s.syncAsByte(_resetBatterieText);
-	s.syncAsByte(_hermitTalkingFl);
-	s.syncAsByte(_hermitMovingFl);
-	s.syncAsByte(_alreadyTalkingFl);
-	s.syncAsByte(_giveBatteriesFl);
-	s.syncAsByte(_startTradingFl);
-	s.syncAsByte(_check1Fl);
-	s.syncAsByte(_stickFingerFl);
-
-	s.syncAsSint16LE(_randVal);
-	s.syncAsSint16LE(_ratHotspotId);
-	s.syncAsSint16LE(_hermitDialogNode);
-	s.syncAsSint16LE(_hermitDisplayedQuestion);
-	s.syncAsSint16LE(_nextFrame);
-	s.syncAsSint16LE(_hermitMode);
-
-	s.syncAsUint32LE(_ratTimer);
-
-	s.syncAsSint16LE(_defaultDialogPos.x);
-	s.syncAsSint16LE(_defaultDialogPos.y);
-}
-
-void Scene611::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_RAT);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
-
-void Scene611::handleRatMoves() {
-	_ratPresentFl = false;
+namespace Rooms {
+
+struct Scratch {
+	bool _seenRatFl;
+	bool _eyesRunningFl;
+	bool _shouldRemoveEyes;
+	bool _ratPresentFl;
+	bool _duringDialogFl;
+	bool _resetBatterieText;
+	bool _hermitTalkingFl;
+	bool _hermitMovingFl;
+	bool _alreadyTalkingFl;
+	bool _giveBatteriesFl;
+	bool _startTradingFl;
+	bool _check1Fl;
+	bool _stickFingerFl;
+	int16 _randVal;
+	int16 _ratHotspotId;
+	int16 _hermitDialogNode;
+	int16 _hermitDisplayedQuestion;
+	int16 _nextFrame;
+	int16 _hermitMode;
+	int16 _defaultDialogPos_x;
+	int16 _defaultDialogPos_y;
+	int32 _ratTimer;
+	Conversation _dialog1;
+	Conversation _dialog2;
+};
+
+static Scratch local;
+
+
+static void handleRatMoves() {
+	local._ratPresentFl = false;
 	_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0);
 	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 11, -2);
-	_ratTimer = _game._player._priorTimer;
-	_scene->_dynamicHotspots.remove(_ratHotspotId);
+	local._ratTimer = _game._player._priorTimer;
+	_scene->_dynamicHotspots.remove(local._ratHotspotId);
 }
 
-void Scene611::handleTrading() {
+static void handleTrading() {
 	if (_game._objects.isInInventory(OBJ_DURAFAIL_CELLS))
 		_game._objects.setRoom(OBJ_DURAFAIL_CELLS, 1);
 
@@ -108,29 +82,29 @@ void Scene611::handleTrading() {
 	_game._objects.addToInventory(OBJ_FAKE_ID);
 }
 
-void Scene611::setDialogNode(int node) {
+static void setDialogNode(int node) {
 	if (node > 0)
-		_hermitDialogNode = node;
+		local._hermitDialogNode = node;
 
 	_game._player._stepEnabled = true;
 
 	switch (node) {
 	case 0:
 		_scene->_userInterface.setup(kInputBuildingSentences);
-		_duringDialogFl = false;
-		_hermitDialogNode = 0;
+		local._duringDialogFl = false;
+		local._hermitDialogNode = 0;
 		break;
 
 	case 1:
-		_dialog1.start();
-		_duringDialogFl = true;
-		_hermitDialogNode = 1;
+		local._dialog1.start();
+		local._duringDialogFl = true;
+		local._hermitDialogNode = 1;
 		break;
 
 	case 2:
-		_dialog2.start();
-		_duringDialogFl = true;
-		_hermitDialogNode = 2;
+		local._dialog2.start();
+		local._duringDialogFl = true;
+		local._hermitDialogNode = 2;
 		break;
 
 	default:
@@ -138,7 +112,7 @@ void Scene611::setDialogNode(int node) {
 	}
 }
 
-bool Scene611::check2ChargedBatteries() {
+static bool check2ChargedBatteries() {
 	if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && !_game._objects.isInInventory(OBJ_PHONE_CELLS))
 		|| (!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS)))
 		return true;
@@ -146,7 +120,7 @@ bool Scene611::check2ChargedBatteries() {
 	return false;
 }
 
-bool Scene611::check4ChargedBatteries() {
+static bool check4ChargedBatteries() {
 	if (_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS)
 		&& _globals[kDurafailRecharged])
 		return true;
@@ -154,315 +128,31 @@ bool Scene611::check4ChargedBatteries() {
 	return false;
 }
 
-void Scene611::handleTalking(int delay) {
-	if (_hermitTalkingFl)
-		_alreadyTalkingFl = true;
+static void handleTalking(int delay) {
+	if (local._hermitTalkingFl)
+		local._alreadyTalkingFl = true;
 
-	_hermitTalkingFl = true;
+	local._hermitTalkingFl = true;
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 	_scene->_sequences.addTimer(delay, 100);
 }
 
-void Scene611::handleSubDialog1() {
-	switch (_action._activeAction._verbId) {
-	case 0x287:
-		_stickFingerFl = true;
-		_nextFrame = 34;
-		_hermitMovingFl = false;
-		_hermitMode = 5;
-		displayHermitQuestions(5);
-		_dialog1.write(0x287, false);
-		if (!_dialog1.read(0x288))
-			_dialog1.write(0x28E, true);
-
-		_dialog2.write(0x29C, true);
-		_dialog2.write(0x29D, true);
-		_dialog2.write(0x29E, true);
-		setDialogNode(2);
-		break;
-
-	case 0x288:
-		handleTalking(500);
-		displayHermitQuestions(6);
-		_dialog1.write(0x288, false);
-		_dialog1.write(0x289, true);
-		if (!_dialog1.read(0x287))
-			_dialog1.write(0x28E, true);
-
-		setDialogNode(1);
-		break;
-
-	case 0x289:
-		handleTalking(500);
-		displayHermitQuestions(10);
-		_dialog1.write(0x289, false);
-		_dialog1.write(0x28A, true);
-		_dialog1.write(0x28B, true);
-		setDialogNode(1);
-		break;
-
-	case 0x28A:
-		handleTalking(500);
-		displayHermitQuestions(11);
-		_dialog1.write(0x28A, false);
-		setDialogNode(1);
-		break;
-
-	case 0x28B:
-		handleTalking(500);
-		displayHermitQuestions(12);
-		_dialog1.write(0x28C, true);
-		_dialog1.write(0x28D, true);
-		_dialog1.write(0x28B, false);
-		setDialogNode(1);
-		break;
-
-	case 0x28C:
-		handleTalking(500);
-		displayHermitQuestions(13);
-		_dialog1.write(0x28C, false);
-		setDialogNode(1);
-		break;
-
-	case 0x28D:
-		handleTalking(500);
-		displayHermitQuestions(14);
-		_dialog1.write(0x290, true);
-		_dialog1.write(0x28D, false);
-		_dialog1.write(0x28F, true);
-		setDialogNode(1);
-		break;
-
-	case 0x28E:
-		handleTalking(500);
-		displayHermitQuestions(15);
-		_dialog1.write(0x295, true);
-		_dialog1.write(0x28E, false);
-		setDialogNode(1);
-		break;
-
-	case 0x290:
-		handleTalking(500);
-		displayHermitQuestions(17);
-		_dialog1.write(0x290, false);
-		_dialog1.write(0x28e, false);
-
-		if (!_dialog1.read(0x28F))
-			_dialog1.write(0x291, true);
-
-		setDialogNode(1);
-		break;
-
-	case 0x291:
-		handleTalking(500);
-		displayHermitQuestions(18);
-		_dialog1.write(0x291, false);
-		if ((!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) && (!_game._objects.isInInventory(OBJ_PHONE_CELLS))) {
-			_dialog1.write(0x292, true);
-			_dialog1.write(0x293, true);
-		}
-
-		if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) || (_game._objects.isInInventory(OBJ_PHONE_CELLS)))
-			_dialog1.write(0x294, true);
-
-		// WORKAROUND: Fix bug in the original where the option to give Hermit batteries
-		// would be given before the player even has any batteries
-		_globals[kHermitWantsBatteries] = true;
-
-		setDialogNode(1);
-		break;
-
-	case 0x28F:
-		handleTalking(500);
-		displayHermitQuestions(16);
-		_dialog1.write(0x28F, false);
-		if (!_dialog1.read(0x290))
-			_dialog1.write(0x291, true);
-
-		setDialogNode(1);
-		break;
-
-	case 0x295:
-		handleTalking(500);
-		displayHermitQuestions(20);
-		_dialog1.write(0x295, false);
-		setDialogNode(1);
-		break;
-
-	case 0x292:
-		handleTalking(500);
-		displayHermitQuestions(19);
-		_dialog1.write(0x292, false);
-		_dialog1.write(0x293, false);
-		setDialogNode(1);
-		break;
-
-	case 0x293:
-	{
-		handleTalking(200);
-		_scene->_kernelMessages.reset();
-
-		Common::String curQuote = _game.getQuote(0x2D1);
-		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 120, curQuote);
-
-		curQuote = _game.getQuote(0x2D2);
-		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
-
-		_dialog1.write(0x293, false);
-		setDialogNode(0);
-	}
-	break;
-
-	case 0x294:
-	{
-		bool hermitPleasedFl = false;
-
-		switch (_game._difficulty) {
-		case DIFFICULTY_EASY:
-			hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) || _game._objects.isInInventory(OBJ_PHONE_CELLS);
-			break;
-
-		case DIFFICULTY_MEDIUM:
-			hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS);
-			break;
-
-		default: // HARD
-			hermitPleasedFl = check4ChargedBatteries();
-			break;
-		}
-
-		if (hermitPleasedFl) {
-			_hermitDisplayedQuestion = 21;
-			if (!_giveBatteriesFl)
-				setDialogNode(0);
-			else
-				_giveBatteriesFl = false;
-		} else if (((_game._difficulty == DIFFICULTY_MEDIUM) || (_game._difficulty == DIFFICULTY_HARD)) && check2ChargedBatteries()) {
-			_hermitDisplayedQuestion = 22;
-			if (!_giveBatteriesFl)
-				setDialogNode(0);
-			else
-				_giveBatteriesFl = false;
-		} else {
-			_hermitDisplayedQuestion = 23;
-			if (!_giveBatteriesFl)
-				setDialogNode(0);
-			else
-				_giveBatteriesFl = false;
-		}
-		_startTradingFl = true;
-	}
-	break;
-
-	case 0x296:
-	{
-		_scene->_kernelMessages.reset();
-
-		Common::String curQuote = _game.getQuote(0x2E6);
-		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
-
-		setDialogNode(0);
-		handleTalking(200);
-	}
-	break;
-
-	default:
-		break;
-	}
-}
-
-void Scene611::handleSubDialog2() {
-	switch (_action._activeAction._verbId) {
-	case 0x29C:
-		displayHermitQuestions(7);
-		setDialogNode(1);
-		handleTalking(500);
-		break;
-
-	case 0x29D:
-		displayHermitQuestions(8);
-		setDialogNode(1);
-		handleTalking(500);
-		break;
-
-	case 0x29E:
-		displayHermitQuestions(9);
-		setDialogNode(1);
-		handleTalking(500);
-		break;
-
-	case 0x29F:
-	{
-		_scene->_kernelMessages.reset();
-		Common::String curQuote = _game.getQuote(0x2A7);
-		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
-		setDialogNode(0);
-		_dialog2.write(0x29F, false);
-	}
-	break;
-
-	default:
-		break;
-	}
-}
-
-void Scene611::handleDialog() {
-	if (_game._trigger == 0) {
-		_scene->_kernelMessages.reset();
-		_game._player._stepEnabled = false;
-
-		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
-		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-
-		if (width > 200) {
-			Common::String subQuote1, subQuote2;
-			_game.splitQuote(curQuote, subQuote1, subQuote2);
-			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 150, subQuote1);
-
-			if (_action._activeAction._verbId == 0x29D)
-				_scene->_kernelMessages.add(Common::Point(-18, 0), 0x1110, 34, 1, 150, subQuote2);
-			else if (_action._activeAction._verbId == 0x28A)
-				_scene->_kernelMessages.add(Common::Point(-10, 0), 0x1110, 34, 1, 150, subQuote2);
-			else
-				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 150, subQuote2);
-
-			_scene->_sequences.addTimer(170, 50);
-		} else {
-			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
-			_scene->_sequences.addTimer(140, 50);
-		}
-	} else if (_game._trigger == 50) {
-		if (_hermitDialogNode == 1)
-			handleSubDialog1();
-		else if (_hermitDialogNode == 2)
-			handleSubDialog2();
-	}
-}
-
-void Scene611::displayHermitQuestions(int question) {
+static void displayHermitQuestions(int question) {
 	_scene->_kernelMessages.reset();
-	_hermitDisplayedQuestion = question;
+	local._hermitDisplayedQuestion = question;
 
 	switch (question) {
 	case 1:
 	{
 		Common::String curQuote = _game.getQuote(0x281);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x282);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -470,13 +160,13 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x283);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x284);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -484,8 +174,8 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x285);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -493,8 +183,8 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x286);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -502,18 +192,18 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x297);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y - 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y - 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x298);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x299);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -521,13 +211,13 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x29A);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x29B);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -535,13 +225,13 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2A0);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2A1);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -549,18 +239,18 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2A2);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2A3);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2A4);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -568,13 +258,13 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2A5);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2A6);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -582,18 +272,18 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2A8);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2A9);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2AA);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -601,23 +291,23 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2AB);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2AC);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2AD);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2AE);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -625,23 +315,23 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2AF);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2B0);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2B1);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2B2);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -649,27 +339,27 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2B3);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2B4);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2B5);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2B6);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
-		_scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B7));
-		_scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 73), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B8));
-		_scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 87), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B9));
+		_scene->_kernelMessages.add(Common::Point(11, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B7));
+		_scene->_kernelMessages.add(Common::Point(11, local._defaultDialogPos_y + 73), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B8));
+		_scene->_kernelMessages.add(Common::Point(11, local._defaultDialogPos_y + 87), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B9));
 	}
 	break;
 
@@ -677,23 +367,23 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2BA);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2BB);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2BC);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2BD);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -701,23 +391,23 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2BE);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2BF);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C0);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C1);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -725,28 +415,28 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2C2);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C3);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C4);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C5);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C6);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -754,23 +444,23 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2C7);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C8);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2C0);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2CA);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -778,18 +468,18 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2CB);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2CC);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2CD);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -797,18 +487,18 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2CE);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2CF);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2D0);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -816,28 +506,28 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2E1);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2E2);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2E3);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2E4);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
 		curQuote = _game.getQuote(0x2E5);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 	}
 	break;
 
@@ -845,28 +535,28 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2D3);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 800, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, 800, curQuote);
 
 		curQuote = _game.getQuote(0x2D4);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 800, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, 800, curQuote);
 
 		curQuote = _game.getQuote(0x2D5);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 800, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, 800, curQuote);
 
 		curQuote = _game.getQuote(0x2D6);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 800, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, 800, curQuote);
 
 		curQuote = _game.getQuote(0x2D7);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 800, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, 800, curQuote);
 	}
 	break;
 
@@ -874,23 +564,23 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2D8);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 700, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2D9);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2DA);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2DB);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, 700, curQuote);
 	}
 	break;
 
@@ -898,28 +588,28 @@ void Scene611::displayHermitQuestions(int question) {
 	{
 		Common::String curQuote = _game.getQuote(0x2DC);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 700, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2DD);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2DE);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2DF);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, 700, curQuote);
 
 		curQuote = _game.getQuote(0x2E0);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 700, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 59), 0xFDFC, 0, 0, 700, curQuote);
 	}
 	break;
 
@@ -928,6 +618,290 @@ void Scene611::displayHermitQuestions(int question) {
 	}
 }
 
+static void handleSubDialog1() {
+	switch (_action._activeAction._verbId) {
+	case 0x287:
+		local._stickFingerFl = true;
+		local._nextFrame = 34;
+		local._hermitMovingFl = false;
+		local._hermitMode = 5;
+		displayHermitQuestions(5);
+		local._dialog1.write(0x287, false);
+		if (!local._dialog1.read(0x288))
+			local._dialog1.write(0x28E, true);
+
+		local._dialog2.write(0x29C, true);
+		local._dialog2.write(0x29D, true);
+		local._dialog2.write(0x29E, true);
+		setDialogNode(2);
+		break;
+
+	case 0x288:
+		handleTalking(500);
+		displayHermitQuestions(6);
+		local._dialog1.write(0x288, false);
+		local._dialog1.write(0x289, true);
+		if (!local._dialog1.read(0x287))
+			local._dialog1.write(0x28E, true);
+
+		setDialogNode(1);
+		break;
+
+	case 0x289:
+		handleTalking(500);
+		displayHermitQuestions(10);
+		local._dialog1.write(0x289, false);
+		local._dialog1.write(0x28A, true);
+		local._dialog1.write(0x28B, true);
+		setDialogNode(1);
+		break;
+
+	case 0x28A:
+		handleTalking(500);
+		displayHermitQuestions(11);
+		local._dialog1.write(0x28A, false);
+		setDialogNode(1);
+		break;
+
+	case 0x28B:
+		handleTalking(500);
+		displayHermitQuestions(12);
+		local._dialog1.write(0x28C, true);
+		local._dialog1.write(0x28D, true);
+		local._dialog1.write(0x28B, false);
+		setDialogNode(1);
+		break;
+
+	case 0x28C:
+		handleTalking(500);
+		displayHermitQuestions(13);
+		local._dialog1.write(0x28C, false);
+		setDialogNode(1);
+		break;
+
+	case 0x28D:
+		handleTalking(500);
+		displayHermitQuestions(14);
+		local._dialog1.write(0x290, true);
+		local._dialog1.write(0x28D, false);
+		local._dialog1.write(0x28F, true);
+		setDialogNode(1);
+		break;
+
+	case 0x28E:
+		handleTalking(500);
+		displayHermitQuestions(15);
+		local._dialog1.write(0x295, true);
+		local._dialog1.write(0x28E, false);
+		setDialogNode(1);
+		break;
+
+	case 0x290:
+		handleTalking(500);
+		displayHermitQuestions(17);
+		local._dialog1.write(0x290, false);
+		local._dialog1.write(0x28e, false);
+
+		if (!local._dialog1.read(0x28F))
+			local._dialog1.write(0x291, true);
+
+		setDialogNode(1);
+		break;
+
+	case 0x291:
+		handleTalking(500);
+		displayHermitQuestions(18);
+		local._dialog1.write(0x291, false);
+		if ((!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) && (!_game._objects.isInInventory(OBJ_PHONE_CELLS))) {
+			local._dialog1.write(0x292, true);
+			local._dialog1.write(0x293, true);
+		}
+
+		if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) || (_game._objects.isInInventory(OBJ_PHONE_CELLS)))
+			local._dialog1.write(0x294, true);
+
+		// WORKAROUND: Fix bug in the original where the option to give Hermit batteries
+		// would be given before the player even has any batteries
+		_globals[kHermitWantsBatteries] = true;
+
+		setDialogNode(1);
+		break;
+
+	case 0x28F:
+		handleTalking(500);
+		displayHermitQuestions(16);
+		local._dialog1.write(0x28F, false);
+		if (!local._dialog1.read(0x290))
+			local._dialog1.write(0x291, true);
+
+		setDialogNode(1);
+		break;
+
+	case 0x295:
+		handleTalking(500);
+		displayHermitQuestions(20);
+		local._dialog1.write(0x295, false);
+		setDialogNode(1);
+		break;
+
+	case 0x292:
+		handleTalking(500);
+		displayHermitQuestions(19);
+		local._dialog1.write(0x292, false);
+		local._dialog1.write(0x293, false);
+		setDialogNode(1);
+		break;
+
+	case 0x293:
+	{
+		handleTalking(200);
+		_scene->_kernelMessages.reset();
+
+		Common::String curQuote = _game.getQuote(0x2D1);
+		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, 120, curQuote);
+
+		curQuote = _game.getQuote(0x2D2);
+		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, 120, curQuote);
+
+		local._dialog1.write(0x293, false);
+		setDialogNode(0);
+	}
+	break;
+
+	case 0x294:
+	{
+		bool hermitPleasedFl = false;
+
+		switch (_game._difficulty) {
+		case DIFFICULTY_EASY:
+			hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) || _game._objects.isInInventory(OBJ_PHONE_CELLS);
+			break;
+
+		case DIFFICULTY_MEDIUM:
+			hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS);
+			break;
+
+		default: // HARD
+			hermitPleasedFl = check4ChargedBatteries();
+			break;
+		}
+
+		if (hermitPleasedFl) {
+			local._hermitDisplayedQuestion = 21;
+			if (!local._giveBatteriesFl)
+				setDialogNode(0);
+			else
+				local._giveBatteriesFl = false;
+		} else if (((_game._difficulty == DIFFICULTY_MEDIUM) || (_game._difficulty == DIFFICULTY_HARD)) && check2ChargedBatteries()) {
+			local._hermitDisplayedQuestion = 22;
+			if (!local._giveBatteriesFl)
+				setDialogNode(0);
+			else
+				local._giveBatteriesFl = false;
+		} else {
+			local._hermitDisplayedQuestion = 23;
+			if (!local._giveBatteriesFl)
+				setDialogNode(0);
+			else
+				local._giveBatteriesFl = false;
+		}
+		local._startTradingFl = true;
+	}
+	break;
+
+	case 0x296:
+	{
+		_scene->_kernelMessages.reset();
+
+		Common::String curQuote = _game.getQuote(0x2E6);
+		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, 120, curQuote);
+
+		setDialogNode(0);
+		handleTalking(200);
+	}
+	break;
+
+	default:
+		break;
+	}
+}
+
+static void handleSubDialog2() {
+	switch (_action._activeAction._verbId) {
+	case 0x29C:
+		displayHermitQuestions(7);
+		setDialogNode(1);
+		handleTalking(500);
+		break;
+
+	case 0x29D:
+		displayHermitQuestions(8);
+		setDialogNode(1);
+		handleTalking(500);
+		break;
+
+	case 0x29E:
+		displayHermitQuestions(9);
+		setDialogNode(1);
+		handleTalking(500);
+		break;
+
+	case 0x29F:
+	{
+		_scene->_kernelMessages.reset();
+		Common::String curQuote = _game.getQuote(0x2A7);
+		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, 120, curQuote);
+		setDialogNode(0);
+		local._dialog2.write(0x29F, false);
+	}
+	break;
+
+	default:
+		break;
+	}
+}
+
+static void handleDialog() {
+	if (_game._trigger == 0) {
+		_scene->_kernelMessages.reset();
+		_game._player._stepEnabled = false;
+
+		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+
+		if (width > 200) {
+			Common::String subQuote1, subQuote2;
+			_game.splitQuote(curQuote, subQuote1, subQuote2);
+			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 150, subQuote1);
+
+			if (_action._activeAction._verbId == 0x29D)
+				_scene->_kernelMessages.add(Common::Point(-18, 0), 0x1110, 34, 1, 150, subQuote2);
+			else if (_action._activeAction._verbId == 0x28A)
+				_scene->_kernelMessages.add(Common::Point(-10, 0), 0x1110, 34, 1, 150, subQuote2);
+			else
+				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 150, subQuote2);
+
+			_scene->_sequences.addTimer(170, 50);
+		} else {
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
+			_scene->_sequences.addTimer(140, 50);
+		}
+	} else if (_game._trigger == 50) {
+		if (local._hermitDialogNode == 1)
+			handleSubDialog1();
+		else if (local._hermitDialogNode == 2)
+			handleSubDialog2();
+	}
+}
+
 static void room_611_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
@@ -943,85 +917,86 @@ static void room_611_init() {
 		0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6,
 		0x323, 0x324, 0);
 
-	_dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290,
+	local._dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290,
 		0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0);
 
-	_dialog2.setup(kConvHermit2, 0x29C, 0x29D, 0x29E, 0x29F, 0);
+	local._dialog2.setup(kConvHermit2, 0x29C, 0x29D, 0x29E, 0x29F, 0);
 
 	if (!_game._visitedScenes._sceneRevisited) {
-		_dialog1.set(kConvHermit1, 0x287, 0x288, 0x296, 0);
-		_dialog2.set(kConvHermit2, 0x29F, 0);
+		local._dialog1.set(kConvHermit1, 0x287, 0x288, 0x296, 0);
+		local._dialog2.set(kConvHermit2, 0x29F, 0);
 	}
 
 	_vm->_palette->setEntry(252, 51, 51, 47);
 	_vm->_palette->setEntry(253, 37, 37, 37);
 
-	_ratPresentFl = false;
-	_seenRatFl = true;
-	_eyesRunningFl = false;
-	_shouldRemoveEyes = false;
-	_randVal = 0;
-	_defaultDialogPos = Common::Point(264, 43);
-	_giveBatteriesFl = false;
-	_resetBatterieText = false;
-	_alreadyTalkingFl = false;
-	_startTradingFl = false;
+	local._ratPresentFl = false;
+	local._seenRatFl = true;
+	local._eyesRunningFl = false;
+	local._shouldRemoveEyes = false;
+	local._randVal = 0;
+	local._defaultDialogPos_x = 264;
+	local._defaultDialogPos_y = 43;
+	local._giveBatteriesFl = false;
+	local._resetBatterieText = false;
+	local._alreadyTalkingFl = false;
+	local._startTradingFl = false;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(22, 132);
 		_game._player._facing = FACING_EAST;
-		_duringDialogFl = false;
+		local._duringDialogFl = false;
 	}
 
 	if (!_globals[kHasTalkedToHermit]) {
 		_scene->loadAnimation(Resources::formatName(611, 'h', -1, EXT_AA, ""), 0);
-		_nextFrame = 47;
-		_hermitMode = 1;
-		_hermitTalkingFl = false;
-		_hermitMovingFl = true;
-		_check1Fl = true;
-		_stickFingerFl = false;
+		local._nextFrame = 47;
+		local._hermitMode = 1;
+		local._hermitTalkingFl = false;
+		local._hermitMovingFl = true;
+		local._check1Fl = true;
+		local._stickFingerFl = false;
 	} else {
-		_hermitMode = 0;
+		local._hermitMode = 0;
 		_scene->_hotspots.activate(NOUN_HERMIT, false);
 	}
 
 	// WORKAROUND: Fix original adding 'give batteries' option even if you don't have them
 	if (_globals[kHermitWantsBatteries]) {
 		if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) || (_game._objects.isInInventory(OBJ_PHONE_CELLS)))
-			_dialog1.write(0x294, true);
+			local._dialog1.write(0x294, true);
 	}
 
-	if (_duringDialogFl) {
+	if (local._duringDialogFl) {
 		_game._player._playerPos = Common::Point(237, 129);
 		_game._player._facing = FACING_NORTHEAST;
 
-		switch (_hermitDialogNode) {
+		switch (local._hermitDialogNode) {
 		case 0:
 			_scene->_userInterface.setup(kInputBuildingSentences);
-			_hermitDialogNode = 1;
+			local._hermitDialogNode = 1;
 			break;
 
 		case 1:
-			_dialog1.start();
+			local._dialog1.start();
 			break;
 
 		case 2:
-			_dialog2.start();
+			local._dialog2.start();
 			break;
 
 		default:
 			break;
 		}
-		displayHermitQuestions(_hermitDisplayedQuestion);
+		displayHermitQuestions(local._hermitDisplayedQuestion);
 	}
 
-	sceneEntrySound();
+	section_6_music();
 }
 
-void Scene611::step() {
-	if (_seenRatFl && (_vm->getRandomNumber(1, 100) == 10)) {
-		_seenRatFl = false;
+static void room_611_daemon() {
+	if (local._seenRatFl && (_vm->getRandomNumber(1, 100) == 10)) {
+		local._seenRatFl = false;
 		_scene->_sequences.addTimer(1, 80);
 	}
 
@@ -1029,34 +1004,34 @@ void Scene611::step() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 8);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
-		_ratPresentFl = true;
+		local._ratPresentFl = true;
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
 	} else if (_game._trigger == 81) {
 		int syncId = _globals._sequenceIndexes[1];
 		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 20, 0, 0, 0);
 		int idx = _scene->_dynamicHotspots.add(NOUN_RAT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_ratHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(272, 154), FACING_SOUTHEAST);
+		local._ratHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(272, 154), FACING_SOUTHEAST);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 9, 10);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncId);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
-		_ratTimer = _game._player._priorTimer;
+		local._ratTimer = _game._player._priorTimer;
 	}
 
-	if (_ratPresentFl && ((_game._player._priorTimer - _ratTimer) > 1200))
+	if (local._ratPresentFl && ((_game._player._priorTimer - local._ratTimer) > 1200))
 		handleRatMoves();
 
-	if (!_eyesRunningFl) {
-		_randVal = _vm->getRandomNumber(1, 30);
-		_eyesRunningFl = true;
+	if (!local._eyesRunningFl) {
+		local._randVal = _vm->getRandomNumber(1, 30);
+		local._eyesRunningFl = true;
 		_scene->_sequences.addTimer(1, 70);
 	}
 
 	if (_game._trigger == 70) {
-		switch (_randVal) {
+		switch (local._randVal) {
 		case 2:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
@@ -1070,28 +1045,28 @@ void Scene611::step() {
 		case 7:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
 		case 9:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 6);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
 		case 13:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
 		case 14:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 8);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
@@ -1112,21 +1087,21 @@ void Scene611::step() {
 		case 21:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 9);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
 		case 25:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 10);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
 		case 27:
 			_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 11);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_shouldRemoveEyes = true;
+			local._shouldRemoveEyes = true;
 			_scene->_sequences.addTimer(60, 71);
 			break;
 
@@ -1143,29 +1118,29 @@ void Scene611::step() {
 	}
 
 	if (_game._trigger == 71) {
-		if (_shouldRemoveEyes) {
+		if (local._shouldRemoveEyes) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
-			_shouldRemoveEyes = false;
+			local._shouldRemoveEyes = false;
 		}
-		_eyesRunningFl = false;
-		_randVal = 0;
+		local._eyesRunningFl = false;
+		local._randVal = 0;
 	}
 
 	if (_game._trigger == 100) {
-		if (_alreadyTalkingFl)
-			_alreadyTalkingFl = false;
+		if (local._alreadyTalkingFl)
+			local._alreadyTalkingFl = false;
 		else
-			_hermitMovingFl = true;
+			local._hermitMovingFl = true;
 	}
 
-	if (_stickFingerFl && (_scene->_animation[0]->getCurrentFrame() == 47)) {
-		_stickFingerFl = false;
-		_hermitMovingFl = true;
-		_hermitMode = 1;
+	if (local._stickFingerFl && (_scene->_animation[0]->getCurrentFrame() == 47)) {
+		local._stickFingerFl = false;
+		local._hermitMovingFl = true;
+		local._hermitMode = 1;
 	}
 
-	if (_scene->_animation[0] != nullptr && (_scene->_animation[0]->getCurrentFrame() == 240) && _check1Fl) {
-		_check1Fl = false;
+	if (_scene->_animation[0] != nullptr && (_scene->_animation[0]->getCurrentFrame() == 240) && local._check1Fl) {
+		local._check1Fl = false;
 		_scene->_kernelMessages.add(Common::Point(33, 88), 0xFDFC, 0, 0, 90, _game.getQuote(0x27E));
 		_scene->_sequences.addTimer(120, 120);
 	}
@@ -1181,36 +1156,36 @@ void Scene611::step() {
 		_scene->_kernelMessages.setQuoted(msgIdx, 4, true);
 	}
 
-	if (_hermitMode == 1) {
-		if (_startTradingFl) {
-			_hermitMode = 6;
-			_hermitMovingFl = false;
-			_hermitTalkingFl = false;
+	if (local._hermitMode == 1) {
+		if (local._startTradingFl) {
+			local._hermitMode = 6;
+			local._hermitMovingFl = false;
+			local._hermitTalkingFl = false;
 			_scene->_sequences.addTimer(1, 110);
-		} else if (_hermitTalkingFl) {
-			_hermitMode = 2;
-			_nextFrame = 18;
-			_hermitMovingFl = false;
+		} else if (local._hermitTalkingFl) {
+			local._hermitMode = 2;
+			local._nextFrame = 18;
+			local._hermitMovingFl = false;
 		} else {
 			switch (_vm->getRandomNumber(1, 5)) {
 			case 1:
-				_nextFrame = 46;
+				local._nextFrame = 46;
 				break;
 
 			case 2:
-				_nextFrame = 47;
+				local._nextFrame = 47;
 				break;
 
 			case 3:
-				_nextFrame = 48;
+				local._nextFrame = 48;
 				break;
 
 			case 4:
-				_nextFrame = 49;
+				local._nextFrame = 49;
 				break;
 
 			case 5:
-				_nextFrame = 50;
+				local._nextFrame = 50;
 				break;
 
 			default:
@@ -1219,32 +1194,32 @@ void Scene611::step() {
 		}
 	}
 
-	if (_hermitMode == 2) {
-		if (_startTradingFl) {
-			_hermitMode = 6;
-			_hermitMovingFl = false;
-			_hermitTalkingFl = false;
+	if (local._hermitMode == 2) {
+		if (local._startTradingFl) {
+			local._hermitMode = 6;
+			local._hermitMovingFl = false;
+			local._hermitTalkingFl = false;
 			_scene->_sequences.addTimer(1, 110);
-		} else if (_hermitMovingFl) {
-			_hermitMode = 1;
-			_nextFrame = 47;
-			_hermitTalkingFl = false;
+		} else if (local._hermitMovingFl) {
+			local._hermitMode = 1;
+			local._nextFrame = 47;
+			local._hermitTalkingFl = false;
 		} else {
 			switch (_vm->getRandomNumber(1, 4)) {
 			case 1:
-				_nextFrame = 18;
+				local._nextFrame = 18;
 				break;
 
 			case 2:
-				_nextFrame = 20;
+				local._nextFrame = 20;
 				break;
 
 			case 3:
-				_nextFrame = 22;
+				local._nextFrame = 22;
 				break;
 
 			case 4:
-				_nextFrame = 24;
+				local._nextFrame = 24;
 				break;
 
 			default:
@@ -1270,7 +1245,7 @@ void Scene611::step() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
 		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
-		_nextFrame = 1;
+		local._nextFrame = 1;
 	}
 
 	if (_game._trigger == 112) {
@@ -1278,34 +1253,34 @@ void Scene611::step() {
 		_game._player._visible = true;
 	}
 
-	if (_hermitMode == 6) {
-		if ((_scene->_animation[0]->getCurrentFrame() == 9) && _check1Fl) {
+	if (local._hermitMode == 6) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 9) && local._check1Fl) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
 			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 112);
-			_check1Fl = false;
+			local._check1Fl = false;
 		}
 
-		if ((_scene->_animation[0]->getCurrentFrame() == 17) && !_check1Fl) {
-			_nextFrame = 26;
-			_hermitMode = 4;
-			_check1Fl = true;
+		if ((_scene->_animation[0]->getCurrentFrame() == 17) && !local._check1Fl) {
+			local._nextFrame = 26;
+			local._hermitMode = 4;
+			local._check1Fl = true;
 		}
 	}
 
-	if (_hermitMode == 4) {
-		if ((_scene->_animation[0]->getCurrentFrame() == 33) && _check1Fl) {
-			displayHermitQuestions(_hermitDisplayedQuestion);
-			_nextFrame = 1;
-			_check1Fl = false;
+	if (local._hermitMode == 4) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 33) && local._check1Fl) {
+			displayHermitQuestions(local._hermitDisplayedQuestion);
+			local._nextFrame = 1;
+			local._check1Fl = false;
 		}
 
-		if ((_scene->_animation[0]->getCurrentFrame() == 9) && !_check1Fl) {
-			_nextFrame = 8;
+		if ((_scene->_animation[0]->getCurrentFrame() == 9) && !local._check1Fl) {
+			local._nextFrame = 8;
 			_scene->_sequences.addTimer(1, 113);
-			_check1Fl = true;
+			local._check1Fl = true;
 		}
 	}
 
@@ -1318,9 +1293,9 @@ void Scene611::step() {
 	}
 
 	if (_game._trigger == 114) {
-		_resetBatterieText = true;
+		local._resetBatterieText = true;
 		int syncIdx = _globals._sequenceIndexes[3];
-		_nextFrame = 10;
+		local._nextFrame = 10;
 		_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
@@ -1328,29 +1303,29 @@ void Scene611::step() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 115);
 	}
 
-	if ((_nextFrame >= 0) && (_nextFrame != _scene->_animation[0]->getCurrentFrame())) {
-		_scene->_animation[0]->setCurrentFrame(_nextFrame);
-		_nextFrame = -1;
+	if ((local._nextFrame >= 0) && (local._nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+		_scene->_animation[0]->setCurrentFrame(local._nextFrame);
+		local._nextFrame = -1;
 	}
 
 	if (_game._trigger == 115) {
 		_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
 		_game._player._visible = true;
-		if (_hermitDisplayedQuestion == 21) {
+		if (local._hermitDisplayedQuestion == 21) {
 			_game._player._stepEnabled = false;
 			handleTrading();
-			_hermitMode = 0;
-			_startTradingFl = false;
-			_nextFrame = 52;
+			local._hermitMode = 0;
+			local._startTradingFl = false;
+			local._nextFrame = 52;
 			_globals[kHasTalkedToHermit] = true;
 			_scene->_hotspots.activate(NOUN_HERMIT, false);
 		} else {
 			_game._player._stepEnabled = true;
-			_hermitMode = 1;
-			_nextFrame = 47;
-			_hermitTalkingFl = false;
-			_startTradingFl = false;
-			_check1Fl = true;
+			local._hermitMode = 1;
+			local._nextFrame = 47;
+			local._hermitTalkingFl = false;
+			local._startTradingFl = false;
+			local._check1Fl = true;
 		}
 	}
 }
@@ -1359,7 +1334,7 @@ static void room_611_pre_parser() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_ALLEY))
 		_game._player._walkOffScreenSceneId = 609;
 
-	if (_resetBatterieText)
+	if (local._resetBatterieText)
 		_scene->_kernelMessages.reset();
 }
 
@@ -1368,22 +1343,22 @@ static void room_611_parser() {
 		handleDialog();
 	else if ((_action.isAction(VERB_GIVE, NOUN_PHONE_CELLS, NOUN_HERMIT)) || (_action.isAction(VERB_GIVE, NOUN_DURAFAIL_CELLS, NOUN_HERMIT))) {
 		_action._activeAction._verbId = 0x294;
-		_giveBatteriesFl = true;
+		local._giveBatteriesFl = true;
 		handleSubDialog1();
 	} else if (_action.isAction(VERB_GIVE, NOUN_HERMIT)) {
 		_scene->_kernelMessages.reset();
 
 		Common::String curQuote = _game.getQuote(0x323);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		int quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 120, curQuote);
+		int quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, 120, curQuote);
 
 		curQuote = _game.getQuote(0x324);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
-		quotePosX = _defaultDialogPos.x - (width / 2);
-		_scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
+		quotePosX = local._defaultDialogPos_x - (width / 2);
+		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, 120, curQuote);
 	} else if (_game._trigger == 90) {
-		if (_dialog2.read(0x29C) && _dialog2.read(0x29D) && _dialog2.read(0x29E)) {
+		if (local._dialog2.read(0x29C) && local._dialog2.read(0x29D) && local._dialog2.read(0x29E)) {
 			handleTalking(180);
 			if (_vm->getRandomNumber(1, 2) == 1)
 				displayHermitQuestions(1);
@@ -1397,19 +1372,19 @@ static void room_611_parser() {
 				displayHermitQuestions(4);
 		}
 
-		_duringDialogFl = true;
-		if (_dialog2.read(0x29F)) {
-			_hermitDialogNode = 1;
-			_dialog1.start();
-			_duringDialogFl = true;
+		local._duringDialogFl = true;
+		if (local._dialog2.read(0x29F)) {
+			local._hermitDialogNode = 1;
+			local._dialog1.start();
+			local._duringDialogFl = true;
 		} else {
-			_hermitDialogNode = 2;
-			_dialog2.write(0x29F, true);
-			_dialog2.start();
-			_duringDialogFl = true;
+			local._hermitDialogNode = 2;
+			local._dialog2.write(0x29F, true);
+			local._dialog2.start();
+			local._duringDialogFl = true;
 		}
 	} else if (_action.isAction(VERB_TALKTO, NOUN_HERMIT)) {
-		if (!_dialog1.read(0x287)) {
+		if (!local._dialog1.read(0x287)) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x27A));
 			_scene->_sequences.addTimer(120, 90);
@@ -1486,6 +1461,46 @@ static void room_611_parser() {
 	_action._inProgress = false;
 }
 
+void room_611_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._seenRatFl);
+	s.syncAsByte(local._eyesRunningFl);
+	s.syncAsByte(local._shouldRemoveEyes);
+	s.syncAsByte(local._ratPresentFl);
+	s.syncAsByte(local._duringDialogFl);
+	s.syncAsByte(local._resetBatterieText);
+	s.syncAsByte(local._hermitTalkingFl);
+	s.syncAsByte(local._hermitMovingFl);
+	s.syncAsByte(local._alreadyTalkingFl);
+	s.syncAsByte(local._giveBatteriesFl);
+	s.syncAsByte(local._startTradingFl);
+	s.syncAsByte(local._check1Fl);
+	s.syncAsByte(local._stickFingerFl);
+
+	s.syncAsSint16LE(local._randVal);
+	s.syncAsSint16LE(local._ratHotspotId);
+	s.syncAsSint16LE(local._hermitDialogNode);
+	s.syncAsSint16LE(local._hermitDisplayedQuestion);
+	s.syncAsSint16LE(local._nextFrame);
+	s.syncAsSint16LE(local._hermitMode);
+	s.syncAsSint16LE(local._defaultDialogPos_x);
+	s.syncAsSint16LE(local._defaultDialogPos_y);
+
+	s.syncAsUint32LE(local._ratTimer);
+}
+
+void room_611_preload() {
+	room_init_code_pointer = room_611_init;
+	room_daemon_code_pointer = room_611_daemon;
+	room_pre_parser_code_pointer = room_611_pre_parser;
+	room_parser_code_pointer = room_611_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(NOUN_RAT);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room612.cpp b/engines/mads/madsv2/nebular/rooms/room612.cpp
index 5f4d3143798..e3775eca842 100644
--- a/engines/mads/madsv2/nebular/rooms/room612.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room612.cpp
@@ -19,34 +19,28 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene612::Scene612(RexNebularEngine *vm) : Scene6xx(vm) {
-	_actionMode = -1;
-	_cycleIndex = -1;
-}
-
-void room_612_synchronize(Common::Serializer &s) {
-	Scene6xx::synchronize(s);
+struct Scratch {
+	int16 _actionMode;
+	int16 _cycleIndex;
+};
 
-	s.syncAsSint16LE(_actionMode);
-	s.syncAsSint16LE(_cycleIndex);
-}
+static Scratch local;
 
-void Scene612::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_FISHING_LINE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
-void Scene612::handleWinchMovement() {
+static void handleWinchMovement() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -61,7 +55,7 @@ void Scene612::handleWinchMovement() {
 	case 1:
 		// CHECKME: Is the "else" block useful as action is always equal to 1 at this point?
 		// Or is it a missing bit of code we could fix?
-		if (_actionMode == 1) {
+		if (local._actionMode == 1) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
 			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 7, 0, 0);
 			_vm->_sound->command(19);
@@ -84,7 +78,7 @@ void Scene612::handleWinchMovement() {
 	case 3:
 	{
 		int syncIdx = _globals._sequenceIndexes[2];
-		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, _cycleIndex);
+		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, local._cycleIndex);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
 		_scene->_kernelMessages.reset();
@@ -115,11 +109,11 @@ static void room_612_init() {
 	}
 
 	if (_globals[kBoatRaised])
-		_cycleIndex = -2;
+		local._cycleIndex = -2;
 	else
-		_cycleIndex = -1;
+		local._cycleIndex = -1;
 
-	_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, _cycleIndex);
+	_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, local._cycleIndex);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
@@ -132,7 +126,7 @@ static void room_612_init() {
 		_scene->loadAnimation(formAnimName('R', 1), 70);
 	}
 
-	sceneEntrySound();
+	section_6_music();
 
 	if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_PADLOCK_KEY);
@@ -140,7 +134,7 @@ static void room_612_init() {
 	_game.loadQuoteSet(0x2F5, 0x2F4, 0);
 }
 
-void Scene612::step() {
+static void room_612_daemon() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
@@ -208,8 +202,8 @@ static void room_612_parser() {
 			break;
 		}
 	} else if (_action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_CONTROL_BOX)) {
-		_cycleIndex = -2;
-		_actionMode = 1;
+		local._cycleIndex = -2;
+		local._actionMode = 1;
 		handleWinchMovement();
 	} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_EXPRESSWAY))
 		_vm->_dialogs->show(61210);
@@ -249,6 +243,23 @@ static void room_612_parser() {
 	_action._inProgress = false;
 }
 
+void room_612_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._actionMode);
+	s.syncAsSint16LE(local._cycleIndex);
+}
+
+void room_612_preload() {
+	room_init_code_pointer = room_612_init;
+	room_daemon_code_pointer = room_612_daemon;
+	room_parser_code_pointer = room_612_parser;
+
+	section_6_walker();
+	section_6_interface();
+	_scene->addActiveVocab(NOUN_FISHING_LINE);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room620.cpp b/engines/mads/madsv2/nebular/rooms/room620.cpp
index 7c1d0e96a24..b3d0daf4d93 100644
--- a/engines/mads/madsv2/nebular/rooms/room620.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room620.cpp
@@ -19,18 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene620::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
+namespace Rooms {
 
 static void room_620_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
@@ -39,10 +39,10 @@ static void room_620_init() {
 	_game._player._visible = false;
 	_scene->_sequences.addTimer(30, 70);
 	_scene->_userInterface.setup(kInputLimitedSentences);
-	sceneEntrySound();
+	section_6_music();
 }
 
-void Scene620::step() {
+static void room_620_daemon() {
 	switch (_game._trigger) {
 	case 70:
 		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
@@ -77,6 +77,19 @@ void Scene620::step() {
 	}
 }
 
+void room_620_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_620_preload() {
+	room_init_code_pointer = room_620_init;
+	room_daemon_code_pointer = room_620_daemon;
+
+	*player.series_name = '\0';
+	section_6_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section6.cpp b/engines/mads/madsv2/nebular/rooms/section6.cpp
index aef5ad47e7d..7db9cfdd8ec 100644
--- a/engines/mads/madsv2/nebular/rooms/section6.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section6.cpp
@@ -19,46 +19,50 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "mads/nebular/nebular.h"
-#include "mads/nebular/core/scene.h"
-#include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes6.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
-
-void Scene6xx::setAAName() {
-	_game._aaName = Resources::formatAAName(5);
+void section_6_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
 }
 
-void Scene6xx::setPlayerSpritesPrefix() {
-	_vm->_sound->command(5);
-	Common::String oldName = _game._player._spritesPrefix;
+void section_6_walker() {
+	g_engine->_soundManager->command(5);
+	Common::String oldName = player.series_name;
 
-	if ((_scene->_nextSceneId == 605) || (_scene->_nextSceneId == 620))
-		_game._player._spritesPrefix = "";
-	else if (_globals[kSexOfRex] == REX_MALE)
-		_game._player._spritesPrefix = "RXM";
+	if (global[kSexOfRex] == REX_FEMALE)
+		Common::strcpy_s(player.series_name, "ROX");
 	else
-		_game._player._spritesPrefix = "ROX";
+		Common::strcpy_s(player.series_name, "RXM");
+
+	if (new_room == 605 || new_room == 620)
+		*player.series_name = '\0';
 
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
+	if (oldName != Common::String(player.series_name))
+		player.walker_must_reload = true;
 
-	_game._player._scalingVelocity = true;
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
+	pal_change_color(16, 10, 63, 63);
+	pal_change_color(17, 10, 45, 45);
 }
 
-void Scene6xx::sceneEntrySound() {
-	if (!_vm->_musicFlag) {
-		_vm->_sound->command(2);
+void section_6_music() {
+	if (!config_file.music_flag) {
+		g_engine->_soundManager->command(2);
 		return;
 	}
 
-	switch (_scene->_nextSceneId) {
+	switch (new_room) {
 	case 601:
 	case 602:
 	case 603:
@@ -70,15 +74,17 @@ void Scene6xx::sceneEntrySound() {
 	case 610:
 	case 612:
 	case 620:
-		_vm->_sound->command(29);
+		g_engine->_soundManager->command(29);
 		break;
 	case 611:
-		_vm->_sound->command(24);
+		g_engine->_soundManager->command(24);
 		break;
 	default:
 		break;
 	}
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index f1bcbc2a9a4..f40c7c2e29f 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -154,11 +154,24 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room513.o \
 	madsv2/nebular/rooms/room515.o \
 	madsv2/nebular/rooms/room551.o \
+	madsv2/nebular/rooms/room601.o \
+	madsv2/nebular/rooms/room602.o \
+	madsv2/nebular/rooms/room603.o \
+	madsv2/nebular/rooms/room604.o \
+	madsv2/nebular/rooms/room605.o \
+	madsv2/nebular/rooms/room607.o \
+	madsv2/nebular/rooms/room608.o \
+	madsv2/nebular/rooms/room609.o \
+	madsv2/nebular/rooms/room610.o \
+	madsv2/nebular/rooms/room611.o \
+	madsv2/nebular/rooms/room612.o \
+	madsv2/nebular/rooms/room620.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/nebular/rooms/section2.o \
 	madsv2/nebular/rooms/section3.o \
 	madsv2/nebular/rooms/section4.o \
 	madsv2/nebular/rooms/section5.o \
+	madsv2/nebular/rooms/section6.o \
 	madsv2/nebular/rooms/conversation.o \
 	madsv2/nebular/rooms/forcefield.o \
 	madsv2/nebular/rooms/teleporter.o \


Commit: 81859f70ebfe92258f08ee567e7729a410080e9d
    https://github.com/scummvm/scummvm/commit/81859f70ebfe92258f08ee567e7729a410080e9d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:46+10:00

Commit Message:
MADS: NEBULAR: Implemented section 7 rooms

Changed paths:
    engines/mads/madsv2/nebular/rooms/room701.cpp
    engines/mads/madsv2/nebular/rooms/room702.cpp
    engines/mads/madsv2/nebular/rooms/room703.cpp
    engines/mads/madsv2/nebular/rooms/room704.cpp
    engines/mads/madsv2/nebular/rooms/room705.cpp
    engines/mads/madsv2/nebular/rooms/room706.cpp
    engines/mads/madsv2/nebular/rooms/room707.cpp
    engines/mads/madsv2/nebular/rooms/room710.cpp
    engines/mads/madsv2/nebular/rooms/room711.cpp
    engines/mads/madsv2/nebular/rooms/room751.cpp
    engines/mads/madsv2/nebular/rooms/room752.cpp
    engines/mads/madsv2/nebular/rooms/section7.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room701.cpp b/engines/mads/madsv2/nebular/rooms/room701.cpp
index 8a84eecec9d..73bb63235c0 100644
--- a/engines/mads/madsv2/nebular/rooms/room701.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room701.cpp
@@ -19,33 +19,25 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene701::Scene701(RexNebularEngine *vm) : Scene7xx(vm) {
-	_fishingLineId = -1;
-}
-
-void room_701_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
-
-	s.syncAsSint16LE(_fishingLineId);
-}
+struct Scratch {
+	int16 _fishingLineId;
+};
 
-void Scene701::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
+static Scratch local;
 
-	_scene->addActiveVocab(NOUN_BOAT);
-	_scene->addActiveVocab(VERB_CLIMB_INTO);
-	_scene->addActiveVocab(NOUN_FISHING_LINE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_701_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
@@ -112,7 +104,7 @@ static void room_701_init() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
 		int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
-		_fishingLineId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 129), FACING_NORTHEAST);
+		local._fishingLineId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 129), FACING_NORTHEAST);
 	}
 
 	if (_scene->_priorSceneId == 702) {
@@ -141,10 +133,10 @@ static void room_701_init() {
 	}
 
 	_game.loadQuoteSet(0x310, 0x30F, 0);
-	sceneEntrySound();
+	section_7_music();
 }
 
-void Scene701::step() {
+static void room_701_daemon() {
 	switch (_game._trigger) {
 	case 60:
 		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
@@ -294,7 +286,7 @@ static void room_701_parser() {
 				_game._player._stepEnabled = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 				_scene->_sequences.remove(_globals._sequenceIndexes[3]);
-				_scene->_dynamicHotspots.remove(_fishingLineId);
+				_scene->_dynamicHotspots.remove(local._fishingLineId);
 				_scene->_hotspots.activate(NOUN_BOAT, false);
 				_game._player._visible = false;
 				_scene->loadAnimation(formAnimName('E', -1), 1);
@@ -390,6 +382,25 @@ static void room_701_parser() {
 	_action._inProgress = false;
 }
 
+void room_701_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._fishingLineId);
+}
+
+void room_701_preload() {
+	room_init_code_pointer = room_701_init;
+	room_daemon_code_pointer = room_701_daemon;
+	room_pre_parser_code_pointer = room_701_pre_parser;
+	room_parser_code_pointer = room_701_parser;
+
+	section_7_walker();
+	section_7_interface();
+	_scene->addActiveVocab(NOUN_BOAT);
+	_scene->addActiveVocab(VERB_CLIMB_INTO);
+	_scene->addActiveVocab(NOUN_FISHING_LINE);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room702.cpp b/engines/mads/madsv2/nebular/rooms/room702.cpp
index 9621f537811..10729815123 100644
--- a/engines/mads/madsv2/nebular/rooms/room702.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room702.cpp
@@ -19,18 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene702::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
+namespace Rooms {
 
 static void room_702_init() {
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
@@ -60,7 +60,7 @@ static void room_702_init() {
 		_game._globals[kTeleporterCommand] = TELEPORTER_NONE;
 	}
 
-	sceneEntrySound();
+	section_7_music();
 }
 
 static void room_702_pre_parser() {
@@ -127,6 +127,20 @@ static void room_702_parser() {
 	_action._inProgress = false;
 }
 
+void room_702_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_702_preload() {
+	room_init_code_pointer = room_702_init;
+	room_pre_parser_code_pointer = room_702_pre_parser;
+	room_parser_code_pointer = room_702_parser;
+
+	section_7_walker();
+	section_7_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room703.cpp b/engines/mads/madsv2/nebular/rooms/room703.cpp
index d474dd7d6d5..5eafcf45a66 100644
--- a/engines/mads/madsv2/nebular/rooms/room703.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room703.cpp
@@ -19,83 +19,72 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene703::Scene703(RexNebularEngine *vm) : Scene7xx(vm) {
-	_monsterMode = -1;
-	_boatFrame = -1;
-	_curSequence = -1;
-	_boatDir = -1;
+struct Scratch {
+	int16 _monsterMode;
+	int16 _boatFrame;
+	int16 _curSequence;
+	int16 _boatDir;
 
-	_useBomb = false;
-	_startMonsterTimer = false;
-	_rexDeathFl = false;
-	_restartTrigger70Fl = false;
+	bool _useBomb;
+	bool _startMonsterTimer;
+	bool _rexDeathFl;
+	bool _restartTrigger70Fl;
 
-	_lastFrameTime = 0;
-	_monsterTime = 0;
-}
-
-void room_703_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
+	int32 _lastFrameTime;
+	int32 _monsterTime;
 
-	s.syncAsSint16LE(_monsterMode);
-	s.syncAsSint16LE(_boatFrame);
-	s.syncAsSint16LE(_curSequence);
-	s.syncAsSint16LE(_boatDir);
+	Conversation _dialog1;
+};
 
-	s.syncAsByte(_useBomb);
-	s.syncAsByte(_startMonsterTimer);
-	s.syncAsByte(_rexDeathFl);
-	s.syncAsByte(_restartTrigger70Fl);
+static Scratch local;
 
-	s.syncAsUint32LE(_lastFrameTime);
-	s.syncAsUint32LE(_monsterTime);
-}
-
-void Scene703::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
 
-void Scene703::handleBottleInterface() {
+static void handleBottleInterface() {
 	switch (_globals[kBottleStatus]) {
 	case 0:
-		_dialog1.write(0x311, true);
-		_dialog1.write(0x312, true);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, true);
+		local._dialog1.write(0x312, true);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 1:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, true);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, true);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 2:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, false);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, false);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 3:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, false);
-		_dialog1.write(0x313, false);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, false);
+		local._dialog1.write(0x313, false);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	default:
@@ -103,16 +92,16 @@ void Scene703::handleBottleInterface() {
 	}
 }
 
-void Scene703::setBottleSequence() {
+static void setBottleSequence() {
 	_scene->_userInterface.setup(kInputBuildingSentences);
 	_game._player._stepEnabled = false;
-	if (_boatDir == 2)
-		_curSequence = 6;
+	if (local._boatDir == 2)
+		local._curSequence = 6;
 	else
-		_curSequence = 7;
+		local._curSequence = 7;
 }
 
-void Scene703::handleFillBottle(int quote) {
+static void handleFillBottle(int quote) {
 	switch (quote) {
 	case 0x311:
 		_globals[kBottleStatus] = 1;
@@ -153,49 +142,49 @@ static void room_703_init() {
 			_globals[kMonsterAlive] = true;
 	}
 
-	_startMonsterTimer = true;
-	_rexDeathFl = true;
-	_monsterTime = 0;
-	_restartTrigger70Fl = true;
-	_useBomb = false;
-	_boatFrame = -1;
+	local._startMonsterTimer = true;
+	local._rexDeathFl = true;
+	local._monsterTime = 0;
+	local._restartTrigger70Fl = true;
+	local._useBomb = false;
+	local._boatFrame = -1;
 
 	if (!_globals[kMonsterAlive])
 		_scene->_hotspots.activate(NOUN_SEA_MONSTER, false);
 
 	if (_scene->_priorSceneId == 704) {
 		_game._player._stepEnabled = false;
-		_curSequence = 2;
-		_boatDir = 2;
-		_monsterMode = 0;
+		local._curSequence = 2;
+		local._boatDir = 2;
+		local._monsterMode = 0;
 		_scene->loadAnimation(formAnimName('A', -1));
 		_scene->_animation[0]->setCurrentFrame(34);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._stepEnabled = false;
-		_boatDir = 1;
+		local._boatDir = 1;
 		if (_globals[kMonsterAlive]) {
-			_monsterMode = 1;
-			_curSequence = 0;
+			local._monsterMode = 1;
+			local._curSequence = 0;
 			_scene->loadAnimation(formAnimName('B', -1));
 		} else {
-			_curSequence = 0;
-			_monsterMode = 0;
+			local._curSequence = 0;
+			local._monsterMode = 0;
 			_scene->loadAnimation(formAnimName('A', -1));
 		}
 	} else if (_globals[kMonsterAlive]) {
-		_curSequence = 0;
-		_boatDir = 1;
-		_monsterMode = 1;
+		local._curSequence = 0;
+		local._boatDir = 1;
+		local._monsterMode = 1;
 		_scene->loadAnimation(formAnimName('B', -1));
 		_scene->_animation[0]->setCurrentFrame(39);
-	} else if (_boatDir == 1) {
-		_curSequence = 0;
-		_monsterMode = 0;
+	} else if (local._boatDir == 1) {
+		local._curSequence = 0;
+		local._monsterMode = 0;
 		_scene->loadAnimation(formAnimName('A', -1));
 		_scene->_animation[0]->setCurrentFrame(9);
-	} else if (_boatDir == 2) {
-		_curSequence = 0;
-		_monsterMode = 0;
+	} else if (local._boatDir == 2) {
+		local._curSequence = 0;
+		local._monsterMode = 0;
 		_scene->loadAnimation(formAnimName('A', -1));
 		_scene->_animation[0]->setCurrentFrame(56);
 	}
@@ -208,53 +197,53 @@ static void room_703_init() {
 	}
 
 	_game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
-	_dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
-	sceneEntrySound();
+	local._dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
+	section_7_music();
 	_vm->_sound->command(28);
 }
 
-void Scene703::step() {
-	if (_startMonsterTimer) {
-		long diff = _scene->_frameStartTime - _lastFrameTime;
+static void room_703_daemon() {
+	if (local._startMonsterTimer) {
+		long diff = _scene->_frameStartTime - local._lastFrameTime;
 		if ((diff >= 0) && (diff <= 12))
-			_monsterTime += diff;
+			local._monsterTime += diff;
 		else
-			_monsterTime++;
+			local._monsterTime++;
 
-		_lastFrameTime = _scene->_frameStartTime;
+		local._lastFrameTime = _scene->_frameStartTime;
 	}
 
-	if ((_monsterTime >= 2400) && !_rexDeathFl && !_useBomb) {
-		_startMonsterTimer = false;
-		_rexDeathFl = true;
+	if ((local._monsterTime >= 2400) && !local._rexDeathFl && !local._useBomb) {
+		local._startMonsterTimer = false;
+		local._rexDeathFl = true;
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
-		_monsterMode = 3;
+		local._monsterMode = 3;
 		_scene->loadAnimation(formAnimName('D', -1));
-		_rexDeathFl = false;
-		_monsterTime = 0;
+		local._rexDeathFl = false;
+		local._monsterTime = 0;
 	}
 
 
 	if (_game._trigger == 70)
 		_scene->_reloadSceneFlag = true;
 
-	if ((_monsterMode == 3) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._monsterMode == 3) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._boatFrame) {
+			local._boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
-			if (_boatFrame == 62) {
+			if (local._boatFrame == 62) {
 				nextBoatFrame = 61;
-				if (_restartTrigger70Fl) {
-					_restartTrigger70Fl = false;
+				if (local._restartTrigger70Fl) {
+					local._restartTrigger70Fl = false;
 					_scene->_sequences.addTimer(15, 70);
 				}
 			}
 
 			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
-				_boatFrame = nextBoatFrame;
+				local._boatFrame = nextBoatFrame;
 			}
 		}
 	}
@@ -262,19 +251,19 @@ void Scene703::step() {
 	if (_game._trigger == 70)
 		_scene->_reloadSceneFlag = true;
 
-	if ((_monsterMode == 0) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._monsterMode == 0) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._boatFrame) {
+			local._boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
-			switch (_boatFrame) {
+			switch (local._boatFrame) {
 			case 11:
-				if (_curSequence == 7) {
-					_curSequence = 0;
+				if (local._curSequence == 7) {
+					local._curSequence = 0;
 					nextBoatFrame = 100;
-				} else if (_curSequence == 5)
+				} else if (local._curSequence == 5)
 					nextBoatFrame = 82;
-				else if (_curSequence == 1)
+				else if (local._curSequence == 1)
 					nextBoatFrame = 11;
 				else {
 					nextBoatFrame = 9;
@@ -284,17 +273,17 @@ void Scene703::step() {
 				break;
 
 			case 34:
-				if (_curSequence != 2)
+				if (local._curSequence != 2)
 					_scene->_nextSceneId = 704;
 				break;
 
 			case 57:
-				if (_curSequence == 6) {
-					_curSequence = 0;
+				if (local._curSequence == 6) {
+					local._curSequence = 0;
 					nextBoatFrame = 91;
-				} else if (_curSequence == 4)
+				} else if (local._curSequence == 4)
 					nextBoatFrame = 73;
-				else if (_curSequence == 3)
+				else if (local._curSequence == 3)
 					nextBoatFrame = 57;
 				else {
 					nextBoatFrame = 56;
@@ -337,7 +326,7 @@ void Scene703::step() {
 
 			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
-				_boatFrame = nextBoatFrame;
+				local._boatFrame = nextBoatFrame;
 			}
 		}
 	}
@@ -370,16 +359,16 @@ void Scene703::step() {
 	}
 
 
-	if ((_monsterMode == 1) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._monsterMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._boatFrame) {
+			local._boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
-			switch (_boatFrame) {
+			switch (local._boatFrame) {
 			case 39:
 				_game._player._stepEnabled = true;
-				_startMonsterTimer = true;
-				_rexDeathFl = false;
+				local._startMonsterTimer = true;
+				local._rexDeathFl = false;
 				break;
 
 			case 40:
@@ -392,7 +381,7 @@ void Scene703::step() {
 			case 105:
 			case 114:
 			case 123:
-				if (_curSequence == 8)
+				if (local._curSequence == 8)
 					nextBoatFrame = 129;
 
 				break;
@@ -411,19 +400,19 @@ void Scene703::step() {
 
 			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
-				_boatFrame = nextBoatFrame;
+				local._boatFrame = nextBoatFrame;
 			}
 		}
 	}
 
-	if ((_monsterMode == 2) && (_scene->_animation[0] != nullptr)) {
-		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_animation[0]->getCurrentFrame();
+	if ((local._monsterMode == 2) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != local._boatFrame) {
+			local._boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
-			switch (_boatFrame) {
+			switch (local._boatFrame) {
 			case 14:
-				if (!_useBomb) {
+				if (!local._useBomb) {
 					if (_game._difficulty == DIFFICULTY_HARD)
 						_game._objects.setRoom(OBJ_CHICKEN, 1);
 					else
@@ -445,7 +434,7 @@ void Scene703::step() {
 			case 53:
 				_game._objects.setRoom(OBJ_TWINKIFRUIT, 1);
 				nextBoatFrame = 80;
-				_curSequence = 9;
+				local._curSequence = 9;
 				break;
 
 			case 80:
@@ -456,16 +445,16 @@ void Scene703::step() {
 					_vm->_dialogs->show(70317);
 
 				_scene->freeAnimation();
-				_monsterMode = 1;
+				local._monsterMode = 1;
 				_scene->loadAnimation(formAnimName('B', -1));
 				_scene->_animation[0]->setCurrentFrame(39);
 				_game._player._stepEnabled = true;
 				break;
 
 			case 91:
-				if (!_useBomb) {
+				if (!local._useBomb) {
 					_scene->freeAnimation();
-					_monsterMode = 1;
+					local._monsterMode = 1;
 					_scene->loadAnimation(formAnimName('B', -1));
 					_scene->_animation[0]->setCurrentFrame(39);
 					_game._player._stepEnabled = true;
@@ -478,7 +467,7 @@ void Scene703::step() {
 				_scene->_hotspots.activate(NOUN_SEA_MONSTER, false);
 				_globals[kMonsterAlive] = false;
 				_scene->freeAnimation();
-				_monsterMode = 0;
+				local._monsterMode = 0;
 				_scene->loadAnimation(formAnimName('A', -1));
 				_scene->_animation[0]->setCurrentFrame(9);
 				_game._player._stepEnabled = true;
@@ -495,7 +484,7 @@ void Scene703::step() {
 
 			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
-				_boatFrame = nextBoatFrame;
+				local._boatFrame = nextBoatFrame;
 			}
 		}
 	}
@@ -507,57 +496,57 @@ static void room_703_parser() {
 	else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_DOCK_TO_SOUTH)) {
 		_game._player._stepEnabled = false;
 		if (_globals[kMonsterAlive])
-			_curSequence = 8;
-		else if (_boatDir == 1)
-			_curSequence = 5;
+			local._curSequence = 8;
+		else if (local._boatDir == 1)
+			local._curSequence = 5;
 		else
-			_curSequence = 3;
+			local._curSequence = 3;
 	} else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_BUILDING_TO_NORTH)) {
 		_game._player._stepEnabled = false;
 		if (_globals[kMonsterAlive]) {
-			_startMonsterTimer = false;
-			_rexDeathFl = true;
-			_monsterTime = 0;
+			local._startMonsterTimer = false;
+			local._rexDeathFl = true;
+			local._monsterTime = 0;
 			_scene->freeAnimation();
-			_monsterMode = 3;
+			local._monsterMode = 3;
 			_scene->loadAnimation(formAnimName('D', -1));
-		} else if (_boatDir == 2)
-			_curSequence = 4;
+		} else if (local._boatDir == 2)
+			local._curSequence = 4;
 		else
-			_curSequence = 1;
+			local._curSequence = 1;
 	} else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_SEA_MONSTER) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_SEA_MONSTER)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
-		_monsterMode = 2;
+		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 		_scene->_animation[0]->setCurrentFrame(19);
 	} else if (_action.isAction(VERB_THROW, NOUN_CHICKEN, NOUN_SEA_MONSTER)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
-		_monsterMode = 2;
+		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 	} else if (_action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_SEA_MONSTER)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
-		_monsterMode = 2;
+		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 		_scene->_animation[0]->setCurrentFrame(39);
 	} else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SEA_MONSTER)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
-		_monsterMode = 2;
+		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 		_scene->_animation[0]->setCurrentFrame(59);
 	} else if (_action.isAction(VERB_THROW, NOUN_CHICKEN_BOMB, NOUN_SEA_MONSTER)) {
-		_useBomb = true;
+		local._useBomb = true;
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
-		_monsterMode = 2;
+		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 	} else if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER)) {
 		if (_globals[kBottleStatus] != 4) {
 			handleBottleInterface();
-			_dialog1.start();
+			local._dialog1.start();
 		} else
 			_vm->_dialogs->show(70323);
 	} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_SEA_MONSTER)) {
@@ -583,6 +572,31 @@ static void room_703_parser() {
 	_action._inProgress = false;
 }
 
+void room_703_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._monsterMode);
+	s.syncAsSint16LE(local._boatFrame);
+	s.syncAsSint16LE(local._curSequence);
+	s.syncAsSint16LE(local._boatDir);
+
+	s.syncAsByte(local._useBomb);
+	s.syncAsByte(local._startMonsterTimer);
+	s.syncAsByte(local._rexDeathFl);
+	s.syncAsByte(local._restartTrigger70Fl);
+
+	s.syncAsUint32LE(local._lastFrameTime);
+	s.syncAsUint32LE(local._monsterTime);
+}
+
+void room_703_preload() {
+	room_init_code_pointer = room_703_init;
+	room_daemon_code_pointer = room_703_daemon;
+	room_parser_code_pointer = room_703_parser;
+
+	*player.series_name = '\0';
+	section_7_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room704.cpp b/engines/mads/madsv2/nebular/rooms/room704.cpp
index eab84019ef3..eb4e09da9dc 100644
--- a/engines/mads/madsv2/nebular/rooms/room704.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room704.cpp
@@ -19,73 +19,64 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene704::Scene704(RexNebularEngine *vm) : Scene7xx(vm) {
-	_bottleHotspotId = -1;
-	_boatCurrentFrame = -1;
-	_animationMode = -1;
-	_boatDirection = -1;
+struct Scratch {
+	int16 _bottleHotspotId;
+	int16 _boatCurrentFrame;
+	int16 _animationMode;
+	int16 _boatDirection;
+	bool _takeBottleFl;
+	Conversation _dialog1;
+};
 
-	_takeBottleFl = false;
-}
-
-void room_704_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
+static Scratch local;
 
-	s.syncAsSint16LE(_bottleHotspotId);
-	s.syncAsSint16LE(_boatCurrentFrame);
-	s.syncAsSint16LE(_animationMode);
-	s.syncAsSint16LE(_boatDirection);
-
-	s.syncAsByte(_takeBottleFl);
-}
-
-void Scene704::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-	_scene->addActiveVocab(NOUN_BOTTLE);
-	_scene->addActiveVocab(VERB_LOOK_AT);
-}
 
-void Scene704::handleBottleInterface() {
+static void handleBottleInterface() {
 	switch (_globals[kBottleStatus]) {
 	case 0:
-		_dialog1.write(0x311, true);
-		_dialog1.write(0x312, true);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, true);
+		local._dialog1.write(0x312, true);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 1:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, true);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, true);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 2:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, false);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, false);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 3:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, false);
-		_dialog1.write(0x313, false);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, false);
+		local._dialog1.write(0x313, false);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	default:
@@ -93,16 +84,16 @@ void Scene704::handleBottleInterface() {
 	}
 }
 
-void Scene704::setBottleSequence() {
+static void setBottleSequence() {
 	_scene->_userInterface.setup(kInputBuildingSentences);
 	_game._player._stepEnabled = false;
-	if (_boatDirection == 2)
-		_animationMode = 6;
+	if (local._boatDirection == 2)
+		local._animationMode = 6;
 	else
-		_animationMode = 7;
+		local._animationMode = 7;
 }
 
-void Scene704::handleFillBottle(int quote) {
+static void handleFillBottle(int quote) {
 	switch (quote) {
 	case 0x311:
 		_globals[kBottleStatus] = 1;
@@ -146,27 +137,27 @@ static void room_704_init() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
 		}
 		int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_LOOK_AT, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_bottleHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+		local._bottleHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 	}
 
 	_game._player._visible = false;
-	_takeBottleFl = false;
-	_boatCurrentFrame = -1;
+	local._takeBottleFl = false;
+	local._boatCurrentFrame = -1;
 
 	if (_scene->_priorSceneId == 705) {
 		_game._player._stepEnabled = false;
-		_animationMode = 2;
-		_boatDirection = 2;
+		local._animationMode = 2;
+		local._boatDirection = 2;
 		_scene->loadAnimation(formAnimName('A', -1));
 		_scene->_animation[0]->setCurrentFrame(36);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._stepEnabled = false;
-		_boatDirection = 1;
+		local._boatDirection = 1;
 		_scene->loadAnimation(formAnimName('A', -1));
-	} else if (_boatDirection == 1) {
+	} else if (local._boatDirection == 1) {
 		_scene->loadAnimation(formAnimName('A', -1));
 		_scene->_animation[0]->setCurrentFrame(8);
-	} else if (_boatDirection == 2) {
+	} else if (local._boatDirection == 2) {
 		if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125));
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
@@ -179,21 +170,21 @@ static void room_704_init() {
 		_globals[kMonsterAlive] = false;
 
 	_game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
-	_dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
+	local._dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
 
-	sceneEntrySound();
+	section_7_music();
 	_vm->_sound->command(28);
 }
 
-void Scene704::step() {
+static void room_704_daemon() {
 	if (_scene->_animation[0] != nullptr) {
-		if (_scene->_animation[0]->getCurrentFrame() != _boatCurrentFrame) {
-			_boatCurrentFrame = _scene->_animation[0]->getCurrentFrame();
+		if (_scene->_animation[0]->getCurrentFrame() != local._boatCurrentFrame) {
+			local._boatCurrentFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
-			switch (_boatCurrentFrame) {
+			switch (local._boatCurrentFrame) {
 			case 10:
-				switch (_animationMode) {
+				switch (local._animationMode) {
 				case 1:
 					nextFrame = 10;
 					break;
@@ -201,7 +192,7 @@ void Scene704::step() {
 					nextFrame = 74;
 					break;
 				case 7:
-					_animationMode = 0;
+					local._animationMode = 0;
 					nextFrame = 92;
 					break;
 				default:
@@ -214,12 +205,12 @@ void Scene704::step() {
 				break;
 
 			case 36:
-				if (_animationMode != 2)
+				if (local._animationMode != 2)
 					_scene->_nextSceneId = 705;
 				break;
 
 			case 59:
-				switch (_animationMode) {
+				switch (local._animationMode) {
 				case 3:
 					nextFrame = 59;
 					break;
@@ -229,7 +220,7 @@ void Scene704::step() {
 					break;
 
 				case 6:
-					_animationMode = 0;
+					local._animationMode = 0;
 					nextFrame = 83;
 					break;
 
@@ -255,9 +246,9 @@ void Scene704::step() {
 				break;
 
 			case 90:
-				if (_takeBottleFl) {
+				if (local._takeBottleFl) {
 					_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-					_scene->_dynamicHotspots.remove(_bottleHotspotId);
+					_scene->_dynamicHotspots.remove(local._bottleHotspotId);
 					_game._objects.addToInventory(OBJ_BOTTLE);
 					_vm->_sound->command(15);
 					_vm->_dialogs->showItem(OBJ_BOTTLE, 70415);
@@ -266,16 +257,16 @@ void Scene704::step() {
 
 			case 92:
 				nextFrame = 57;
-				if (!_game._player._stepEnabled && !_takeBottleFl) {
+				if (!_game._player._stepEnabled && !local._takeBottleFl) {
 					_scene->_sequences.addTimer(30, 70);
 					_game._player._stepEnabled = true;
 				}
 				break;
 
 			case 98:
-				if (_takeBottleFl) {
+				if (local._takeBottleFl) {
 					_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-					_scene->_dynamicHotspots.remove(_bottleHotspotId);
+					_scene->_dynamicHotspots.remove(local._bottleHotspotId);
 					_game._objects.addToInventory(OBJ_BOTTLE);
 					_vm->_sound->command(15);
 					_vm->_dialogs->showItem(OBJ_BOTTLE, 70415);
@@ -284,7 +275,7 @@ void Scene704::step() {
 
 			case 101:
 				nextFrame = 8;
-				if (!_game._player._stepEnabled && !_takeBottleFl) {
+				if (!_game._player._stepEnabled && !local._takeBottleFl) {
 					_scene->_sequences.addTimer(30, 70);
 					_game._player._stepEnabled = true;
 				}
@@ -296,7 +287,7 @@ void Scene704::step() {
 
 			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
 				_scene->_animation[0]->setCurrentFrame(nextFrame);
-				_boatCurrentFrame = nextFrame;
+				local._boatCurrentFrame = nextFrame;
 			}
 		}
 	}
@@ -334,32 +325,32 @@ static void room_704_parser() {
 		handleFillBottle(_action._activeAction._verbId);
 	else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
 		_game._player._stepEnabled = false;
-		if (_boatDirection == 1)
-			_animationMode = 5;
+		if (local._boatDirection == 1)
+			local._animationMode = 5;
 		else
-			_animationMode = 3;
+			local._animationMode = 3;
 	} else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_BUILDING_TO_NORTH)) {
 		_game._player._stepEnabled = false;
-		if (_boatDirection == 2)
-			_animationMode = 4;
+		if (local._boatDirection == 2)
+			local._animationMode = 4;
 		else
-			_animationMode = 1;
+			local._animationMode = 1;
 	} else if (_action.isAction(VERB_TAKE, NOUN_BOTTLE)) {
 		if (!_game._objects.isInInventory(OBJ_BOTTLE)) {
 			_game._player._stepEnabled = false;
-			_takeBottleFl = true;
-			if (_boatDirection == 2) {
-				_animationMode = 6;
+			local._takeBottleFl = true;
+			if (local._boatDirection == 2) {
+				local._animationMode = 6;
 			} else {
-				_animationMode = 7;
+				local._animationMode = 7;
 			}
 		}
 	} else if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER)) {
 		if (_game._objects.isInInventory(OBJ_BOTTLE)) {
 			if (_globals[kBottleStatus] != 4) {
-				_takeBottleFl = false;
+				local._takeBottleFl = false;
 				handleBottleInterface();
-				_dialog1.start();
+				local._dialog1.start();
 			} else
 				_vm->_dialogs->show(70323);
 		}
@@ -384,6 +375,27 @@ static void room_704_parser() {
 	_action._inProgress = false;
 }
 
+void room_704_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._bottleHotspotId);
+	s.syncAsSint16LE(local._boatCurrentFrame);
+	s.syncAsSint16LE(local._animationMode);
+	s.syncAsSint16LE(local._boatDirection);
+
+	s.syncAsByte(local._takeBottleFl);
+}
+
+void room_704_preload() {
+	room_init_code_pointer = room_704_init;
+	room_daemon_code_pointer = room_704_daemon;
+	room_parser_code_pointer = room_704_parser;
+
+	*player.series_name = '\0';
+	section_7_interface();
+	_scene->addActiveVocab(NOUN_BOTTLE);
+	_scene->addActiveVocab(VERB_LOOK_AT);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room705.cpp b/engines/mads/madsv2/nebular/rooms/room705.cpp
index 1d1402aec38..5737c9f515c 100644
--- a/engines/mads/madsv2/nebular/rooms/room705.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room705.cpp
@@ -19,55 +19,59 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-void Scene705::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
+struct Scratch {
+	Conversation _dialog1;
+};
 
-void room_705_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
-}
+static Scratch local;
 
-void Scene705::handleBottleInterface() {
+
+static void handleBottleInterface() {
 	switch (_globals[kBottleStatus]) {
 	case 0:
-		_dialog1.write(0x311, true);
-		_dialog1.write(0x312, true);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, true);
+		local._dialog1.write(0x312, true);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 1:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, true);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, true);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 2:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, false);
-		_dialog1.write(0x313, true);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, false);
+		local._dialog1.write(0x313, true);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	case 3:
-		_dialog1.write(0x311, false);
-		_dialog1.write(0x312, false);
-		_dialog1.write(0x313, false);
-		_dialog1.write(0x314, true);
-		_dialog1.write(0x315, true);
+		local._dialog1.write(0x311, false);
+		local._dialog1.write(0x312, false);
+		local._dialog1.write(0x313, false);
+		local._dialog1.write(0x314, true);
+		local._dialog1.write(0x315, true);
 		break;
 
 	default:
@@ -75,7 +79,7 @@ void Scene705::handleBottleInterface() {
 	}
 }
 
-void Scene705::setBottleSequence() {
+static void setBottleSequence() {
 	_scene->_userInterface.setup(kInputBuildingSentences);
 	_game._player._stepEnabled = false;
 	_scene->_sequences.remove(_globals._sequenceIndexes[3]);
@@ -83,7 +87,7 @@ void Scene705::setBottleSequence() {
 	_scene->loadAnimation(formAnimName('F', -1), 90);
 }
 
-void Scene705::handleFillBottle(int quote) {
+static void handleFillBottle(int quote) {
 	switch (quote) {
 	case 0x311:
 		_globals[kBottleStatus] = 1;
@@ -137,11 +141,11 @@ static void room_705_init() {
 		_game._objects.addToInventory(OBJ_BOTTLE);
 
 	_game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
-	_dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
-	sceneEntrySound();
+	local._dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
+	section_7_music();
 }
 
-void Scene705::step() {
+static void room_705_daemon() {
 	switch (_game._trigger) {
 	case 70:
 		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
@@ -276,7 +280,7 @@ static void room_705_parser() {
 	} else if (_action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER)) {
 		if (_globals[kBottleStatus] != 4) {
 			handleBottleInterface();
-			_dialog1.start();
+			local._dialog1.start();
 		} else
 			_vm->_dialogs->show(70323);
 	} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_WATER))
@@ -297,6 +301,20 @@ static void room_705_parser() {
 	_action._inProgress = false;
 }
 
+void room_705_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_705_preload() {
+	room_init_code_pointer = room_705_init;
+	room_daemon_code_pointer = room_705_daemon;
+	room_parser_code_pointer = room_705_parser;
+
+	*player.series_name = '\0';
+	section_7_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room706.cpp b/engines/mads/madsv2/nebular/rooms/room706.cpp
index ced35bfad70..1a54a8a447d 100644
--- a/engines/mads/madsv2/nebular/rooms/room706.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room706.cpp
@@ -19,43 +19,30 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene706::Scene706(RexNebularEngine *vm) : Scene7xx(vm) {
-	_vaseHotspotId = -1;
-	_vaseMode = -1;
-	_animationMode = -1;
-	_animationFrame = -1;
+struct Scratch {
+	int16 _vaseHotspotId;
+	int16 _vaseMode;
+	int16 _animationMode;
+	int16 _animationFrame;
+	bool _emptyPedestral;
+};
 
-	_emptyPedestral = false;
-}
-
-void room_706_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
-
-	s.syncAsSint16LE(_vaseHotspotId);
-	s.syncAsSint16LE(_vaseMode);
-	s.syncAsSint16LE(_animationMode);
-	s.syncAsSint16LE(_animationFrame);
-
-	s.syncAsByte(_emptyPedestral);
-}
-
-void Scene706::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_BOTTLE);
-	_scene->addActiveVocab(NOUN_VASE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
+static Scratch local;
 
-void Scene706::handleRexDeath() {
+static void handleRexDeath() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -64,7 +51,7 @@ void Scene706::handleRexDeath() {
 		break;
 
 	case 2:
-		if (_animationMode == 1)
+		if (local._animationMode == 1)
 			_vm->_dialogs->show(70625);
 		else if (_globals[kBottleStatus] < 2)
 			_vm->_dialogs->show(70628);
@@ -72,10 +59,10 @@ void Scene706::handleRexDeath() {
 			_vm->_dialogs->show(70629);
 
 		_game._objects.setRoom(OBJ_VASE, _scene->_currentSceneId);
-		if (_animationMode == 2)
+		if (local._animationMode == 2)
 			_game._objects.setRoom(OBJ_BOTTLE, 2);
 
-		_animationMode = 0;
+		local._animationMode = 0;
 		_scene->_reloadSceneFlag = true;
 		break;
 
@@ -84,7 +71,7 @@ void Scene706::handleRexDeath() {
 	}
 }
 
-void Scene706::handleTakeVase() {
+static void handleTakeVase() {
 	switch (_game._trigger) {
 	case 0:
 		_game._player._stepEnabled = false;
@@ -98,9 +85,9 @@ void Scene706::handleTakeVase() {
 	case 1:
 		_vm->_sound->command(9);
 		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-		_scene->_dynamicHotspots.remove(_vaseHotspotId);
+		_scene->_dynamicHotspots.remove(local._vaseHotspotId);
 		_game._objects.addToInventory(OBJ_VASE);
-		if (_vaseMode == 1) {
+		if (local._vaseMode == 1) {
 			_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
@@ -127,14 +114,14 @@ static void room_706_init() {
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1));
 
 	if (!_game._visitedScenes._sceneRevisited)
-		_emptyPedestral = false;
+		local._emptyPedestral = false;
 
 	if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId) {
 		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('v', -1));
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
 		int idx = _scene->_dynamicHotspots.add(NOUN_VASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_vaseHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
+		local._vaseHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
 	} else if (_game._objects.isInRoom(OBJ_BOTTLE)) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
@@ -175,17 +162,17 @@ static void room_706_init() {
 		_globals[kTeleporterCommand] = 0;
 	}
 
-	_animationMode = 0;
+	local._animationMode = 0;
 
 	if (_scene->_roomChanged) {
 		_game._objects.addToInventory(OBJ_BOTTLE);
 		_globals[kBottleStatus] = 2;
 	}
 
-	sceneEntrySound();
+	section_7_music();
 }
 
-void Scene706::step() {
+static void room_706_daemon() {
 	if (_game._trigger == 75) {
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
@@ -200,14 +187,14 @@ void Scene706::step() {
 	}
 
 	if (_scene->_animation[0] != nullptr) {
-		if ((_animationMode != 0) && (_scene->_animation[0]->getCurrentFrame() != _animationFrame)) {
-			_animationFrame = _scene->_animation[0]->getCurrentFrame();
+		if ((local._animationMode != 0) && (_scene->_animation[0]->getCurrentFrame() != local._animationFrame)) {
+			local._animationFrame = _scene->_animation[0]->getCurrentFrame();
 
-			if (_animationFrame == 6) {
+			if (local._animationFrame == 6) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 				_game._objects.setRoom(OBJ_VASE, 2);
 
-				if (_animationMode == 2) {
+				if (local._animationMode == 2) {
 					_game._objects.setRoom(OBJ_BOTTLE, 1);
 
 					_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
@@ -243,11 +230,11 @@ static void room_706_parser() {
 
 	if (_action.isAction(VERB_TAKE, NOUN_VASE)) {
 		if (_game._difficulty != DIFFICULTY_EASY) {
-			_animationMode = 1;
+			local._animationMode = 1;
 			handleRexDeath();
 		} else if (_game._trigger || !_game._objects.isInInventory(OBJ_VASE)) {
 			handleTakeVase();
-			_emptyPedestral = true;
+			local._emptyPedestral = true;
 		}
 		_action._inProgress = false;
 		return;
@@ -257,13 +244,13 @@ static void room_706_parser() {
 		if ((_globals[kBottleStatus] == 2 && _game._difficulty == DIFFICULTY_HARD) ||
 			(_globals[kBottleStatus] != 0 && _game._difficulty != DIFFICULTY_HARD)) {
 			if (!_game._objects.isInInventory(OBJ_VASE) || _game._trigger) {
-				_vaseMode = 1;
+				local._vaseMode = 1;
 				handleTakeVase();
 				_action._inProgress = false;
 				return;
 			}
 		} else if (_game._objects.isInRoom(OBJ_VASE) || _game._trigger) {
-			_animationMode = 2;
+			local._animationMode = 2;
 			handleRexDeath();
 			_action._inProgress = false;
 			return;
@@ -318,6 +305,29 @@ static void room_706_parser() {
 	_action._inProgress = false;
 }
 
+void room_706_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._vaseHotspotId);
+	s.syncAsSint16LE(local._vaseMode);
+	s.syncAsSint16LE(local._animationMode);
+	s.syncAsSint16LE(local._animationFrame);
+
+	s.syncAsByte(local._emptyPedestral);
+}
+
+void room_706_preload() {
+	room_init_code_pointer = room_706_init;
+	room_daemon_code_pointer = room_706_daemon;
+	room_pre_parser_code_pointer = room_706_pre_parser;
+	room_parser_code_pointer = room_706_parser;
+
+	section_7_walker();
+	section_7_interface();
+	_scene->addActiveVocab(NOUN_BOTTLE);
+	_scene->addActiveVocab(NOUN_VASE);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room707.cpp b/engines/mads/madsv2/nebular/rooms/room707.cpp
index ceaf1eb3249..d476e3871b9 100644
--- a/engines/mads/madsv2/nebular/rooms/room707.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room707.cpp
@@ -19,37 +19,37 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene707::setup() {
-	_game._player._spritesPrefix = "";
-	// The original calls Scene7xx::setAAName()
-	_game._aaName = Resources::formatAAName(5);
-}
+namespace Rooms {
 
 static void room_707_init() {
-	_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
-	teleporterEnter();
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
+	teleporter_init();
 
-	// The original uses Scene7xx_sceneEntrySound
+	// The original uses Scene7xx_section_7_music
 	if (!_vm->_musicFlag)
 		_vm->_sound->command(2);
 	else
 		_vm->_sound->command(25);
 }
 
-void Scene707::step() {
-	teleporterStep();
+static void room_707_daemon() {
+	teleporter_daemon();
 }
 
 static void room_707_parser() {
-	if (teleporterActions()) {
+	if (teleporter_parser()) {
 		_action._inProgress = false;
 		return;
 	}
@@ -76,6 +76,20 @@ static void room_707_parser() {
 	_action._inProgress = false;
 }
 
+void room_707_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_707_preload() {
+	room_init_code_pointer = room_707_init;
+	room_daemon_code_pointer = room_707_daemon;
+	room_parser_code_pointer = room_707_parser;
+
+	*player.series_name = '\0';
+	section_7_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room710.cpp b/engines/mads/madsv2/nebular/rooms/room710.cpp
index d39756b2753..df0e8375b0a 100644
--- a/engines/mads/madsv2/nebular/rooms/room710.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room710.cpp
@@ -19,18 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene710::setup() {
-	_game._player._spritesPrefix = "";
-	setAAName();
-}
+namespace Rooms {
 
 static void room_710_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
@@ -43,10 +43,10 @@ static void room_710_init() {
 	_game._player._visible = false;
 	_scene->_sequences.addTimer(600, 70);
 
-	sceneEntrySound();
+	section_7_music();
 }
 
-void Scene710::step() {
+static void room_710_daemon() {
 	if (_game._trigger == 70) {
 		if (_game._globals[kCityFlooded])
 			_scene->_nextSceneId = 701;
@@ -68,6 +68,20 @@ static void room_710_parser() {
 	}
 }
 
+void room_710_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_710_preload() {
+	room_init_code_pointer = room_710_init;
+	room_daemon_code_pointer = room_710_daemon;
+	room_parser_code_pointer = room_710_parser;
+
+	*player.series_name = '\0';
+	section_7_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room711.cpp b/engines/mads/madsv2/nebular/rooms/room711.cpp
index defada6b257..666a0b8fecb 100644
--- a/engines/mads/madsv2/nebular/rooms/room711.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room711.cpp
@@ -19,57 +19,59 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene711::setup() {
-	// The original was calling Scene7xx::setPlayerSpreitesPrefix()
-	_vm->_sound->command(5);
-	Common::String oldName = _game._player._spritesPrefix;
-	_game._player._spritesPrefix = "";
-	_game._player._scalingVelocity = true;
-
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
-
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
-
-	// The original was calling Scene7xx::setAAName()
-	_game._aaName = Resources::formatAAName(5);
-
-	_game._player._spritesPrefix = "";
-}
+namespace Rooms {
 
 static void room_711_init() {
 	if (_globals[kSexOfRex] == REX_FEMALE)
-		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
 	else
-		_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
 
-	teleporterEnter();
+	teleporter_init();
 
-	// The original was using Scene7xx_SceneEntrySound()
+	// The original was using Scene7xx_section_7_music()
 	if (!_vm->_musicFlag)
 		_vm->_sound->command(2);
 	else
 		_vm->_sound->command(25);
 }
 
-void Scene711::step() {
-	teleporterStep();
+static void room_711_daemon() {
+	teleporter_daemon();
 }
 
 static void room_711_parser() {
-	if (teleporterActions())
+	if (teleporter_parser())
 		_action._inProgress = false;
 }
 
+void room_711_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_711_preload() {
+	room_init_code_pointer = room_711_init;
+	room_daemon_code_pointer = room_711_daemon;
+	room_parser_code_pointer = room_711_parser;
+
+	section_7_walker();
+	section_7_interface();
+	*player.series_name = '\0';
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room751.cpp b/engines/mads/madsv2/nebular/rooms/room751.cpp
index 699dcf5db75..ee0a1fe63da 100644
--- a/engines/mads/madsv2/nebular/rooms/room751.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room751.cpp
@@ -19,30 +19,25 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene751::Scene751(RexNebularEngine *vm) : Scene7xx(vm) {
-	_rexHandingLine = false;
-}
-
-void room_751_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
+struct Scratch {
+	bool _rexHandingLine;
+};
 
-	s.syncAsByte(_rexHandingLine);
-}
+static Scratch local;
 
-void Scene751::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_FISHING_LINE);
-	_scene->addActiveVocab(VERB_WALKTO);
-}
 
 static void room_751_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RM701X0");
@@ -51,7 +46,7 @@ static void room_751_init() {
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RM202A1");
 
 	if (!_game._visitedScenes._sceneRevisited)
-		_rexHandingLine = false;
+		local._rexHandingLine = false;
 
 	if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
@@ -80,7 +75,7 @@ static void room_751_init() {
 		_game._player._facing = FACING_EAST;
 		_game._player._stepEnabled = false;
 		_scene->_sequences.addTimer(60, 60);
-	} else if (_rexHandingLine) {
+	} else if (local._rexHandingLine) {
 		_game._player._visible = false;
 		_game._player._playerPos = Common::Point(268, 140);
 		_game._player._facing = FACING_NORTHWEST;
@@ -99,14 +94,14 @@ static void room_751_init() {
 		_game._objects.addToInventory(OBJ_BINOCULARS);
 	}
 
-	sceneEntrySound();
+	section_7_music();
 	_game.loadQuoteSet(0x30A, 0x30B, 0x30C, 0x30D, 0x30E, 0);
 
 	if (_globals[kTimebombTimer] > 0)
 		_globals[kTimebombTimer] = 10200;
 }
 
-void Scene751::step() {
+static void room_751_daemon() {
 	switch (_game._trigger) {
 	case 70:
 		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
@@ -178,7 +173,7 @@ static void room_751_pre_parser() {
 	if (_action.isAction(VERB_WALKTO, NOUN_EAST_END_OF_PLATFORM))
 		_game._player._walkOffScreenSceneId = 752;
 
-	if (!_rexHandingLine)
+	if (!local._rexHandingLine)
 		return;
 
 	if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
@@ -199,7 +194,7 @@ static void room_751_pre_parser() {
 		case 1:
 			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
 			_game._player._visible = true;
-			_rexHandingLine = false;
+			local._rexHandingLine = false;
 			_game._player._stepEnabled = true;
 			_game._player._readyToWalk = true;
 			break;
@@ -304,7 +299,7 @@ static void room_751_parser() {
 			break;
 
 			case 2:
-				_rexHandingLine = true;
+				local._rexHandingLine = true;
 				_scene->_sequences.remove(_globals._sequenceIndexes[2]);
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 8, -2);
@@ -321,7 +316,7 @@ static void room_751_parser() {
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
 				_scene->_kernelMessages.reset();
 				_game._objects.setRoom(OBJ_FISHING_LINE, _scene->_currentSceneId);
-				_rexHandingLine = false;
+				local._rexHandingLine = false;
 				_globals[kLineStatus] = 2;
 				_game._player._stepEnabled = true;
 				_vm->_dialogs->show(75120);
@@ -363,6 +358,23 @@ static void room_751_parser() {
 	_action._inProgress = false;
 }
 
+void room_751_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._rexHandingLine);
+}
+
+void room_751_preload() {
+	room_init_code_pointer = room_751_init;
+	room_daemon_code_pointer = room_751_daemon;
+	room_pre_parser_code_pointer = room_751_pre_parser;
+	room_parser_code_pointer = room_751_parser;
+
+	section_7_walker();
+	section_7_interface();
+	_scene->addActiveVocab(NOUN_FISHING_LINE);
+	_scene->addActiveVocab(VERB_WALKTO);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room752.cpp b/engines/mads/madsv2/nebular/rooms/room752.cpp
index 1c8d9fb6e51..a1d942d70ab 100644
--- a/engines/mads/madsv2/nebular/rooms/room752.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room752.cpp
@@ -19,33 +19,25 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene752::Scene752(RexNebularEngine *vm) : Scene7xx(vm) {
-	_cardId = -1;
-}
-
-void room_752_synchronize(Common::Serializer &s) {
-	Scene7xx::synchronize(s);
+struct Scratch {
+	int16 _cardId;
+};
 
-	s.syncAsSint16LE(_cardId);
-}
+static Scratch local;
 
-void Scene752::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-
-	_scene->addActiveVocab(NOUN_ID_CARD);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(VERB_LOOK_AT);
-	_scene->addActiveVocab(NOUN_LASER_BEAM);
-}
 
 static void room_752_init() {
 	_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('l', -1));
@@ -66,7 +58,7 @@ static void room_752_init() {
 		_globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
 		int idx = _scene->_dynamicHotspots.add(NOUN_ID_CARD, VERB_WALKTO, _globals._sequenceIndexes[13], Common::Rect(0, 0, 0, 0));
-		_cardId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 135), FACING_NORTH);
+		local._cardId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 135), FACING_NORTH);
 	}
 
 	if (_game._globals[kLaserHoleIsThere]) {
@@ -91,16 +83,21 @@ static void room_752_init() {
 		_game._globals[kTeleporterCommand] = TELEPORTER_NONE;
 	}
 
-	if (_globals._timebombTimer > 0)
-		_globals._timebombTimer = 10800 - 600;
+	int32 timer = (global[kTimebombTimer + 1] << 16) | global[kTimebombTimer];
+	if (timer > 0) {
+		global[kTimebombTimer] = 10800 - 600;
+		global[kTimebombTimer + 1] = 0;
+	}
 
-	sceneEntrySound();
+	section_7_music();
 }
 
-void Scene752::step() {
-	if (_globals._timebombTimer >= 10800 && _game._globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
-		_globals[kTimebombStatus] = TIMEBOMB_DEAD;
-		_globals._timebombTimer = 0;
+static void room_752_daemon() {
+	int32 timer = (global[kTimebombTimer + 1] << 16) | global[kTimebombTimer];
+
+	if (timer >= 10800 && _game._globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
+		global[kTimebombStatus] = TIMEBOMB_DEAD;
+		global[kTimebombTimer] = global[kTimebombTimer + 1] = 0;
 		_globals[kCheckDaemonTimebomb] = false;
 		_scene->_nextSceneId = 620;
 	}
@@ -133,7 +130,7 @@ static void room_752_parser() {
 			_vm->_sound->command(15);
 			_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 			_game._objects.addToInventory(OBJ_ID_CARD);
-			_scene->_dynamicHotspots.remove(_cardId);
+			_scene->_dynamicHotspots.remove(local._cardId);
 			_vm->_dialogs->showItem(OBJ_ID_CARD, 830);
 			break;
 		case 2:
@@ -200,6 +197,25 @@ static void room_752_parser() {
 	_action._inProgress = false;
 }
 
+void room_752_synchronize(Common::Serializer &s) {
+	s.syncAsSint16LE(local._cardId);
+}
+
+void room_752_preload() {
+	room_init_code_pointer = room_752_init;
+	room_daemon_code_pointer = room_752_daemon;
+	room_pre_parser_code_pointer = room_752_pre_parser;
+	room_parser_code_pointer = room_752_parser;
+
+	section_7_walker();
+	section_7_interface();
+	_scene->addActiveVocab(NOUN_ID_CARD);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(VERB_LOOK_AT);
+	_scene->addActiveVocab(NOUN_LASER_BEAM);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section7.cpp b/engines/mads/madsv2/nebular/rooms/section7.cpp
index c9018a436e6..2d867c85c1e 100644
--- a/engines/mads/madsv2/nebular/rooms/section7.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section7.cpp
@@ -19,72 +19,78 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "mads/nebular/nebular.h"
-#include "mads/nebular/core/scene.h"
-#include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes7.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
-
-void Scene7xx::setAAName() {
-	_game._aaName = Resources::formatAAName(5);
+void section_7_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
 }
 
-void Scene7xx::setPlayerSpritesPrefix() {
-	_vm->_sound->command(5);
+void section_7_walker() {
+	g_engine->_soundManager->command(5);
 
-	Common::String oldName = _game._player._spritesPrefix;
+	Common::String oldName = player.series_name;
 
-	if ((_scene->_nextSceneId == 703) || (_scene->_nextSceneId == 704) || (_scene->_nextSceneId == 705)
-	 || (_scene->_nextSceneId == 707) || (_scene->_nextSceneId == 710) || (_scene->_nextSceneId == 711))
-		_game._player._spritesPrefix = "";
-	else if (_globals[kSexOfRex] == REX_MALE)
-		_game._player._spritesPrefix = "RXM";
+	if ((new_room == 703) || (new_room == 704) || (new_room == 705)
+	 || (new_room == 707) || (new_room == 710) || (new_room == 711))
+		*player.series_name = '\0';
+	else if (global[kSexOfRex] == REX_MALE)
+		Common::strcpy_s(player.series_name, "RXM");
 	else
-		_game._player._spritesPrefix = "ROX";
+		Common::strcpy_s(player.series_name, "ROX");
 
-	_game._player._scalingVelocity = true;
+	player.scaling_velocity = true;
 
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
+	if (oldName != Common::String(player.series_name))
+		player.walker_must_reload = true;
 
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
+	pal_change_color(16, 10, 63, 63);
+	pal_change_color(17, 10, 45, 45);
 }
 
-void Scene7xx::sceneEntrySound() {
-	if (!_vm->_musicFlag) {
-		_vm->_sound->command(2);
+void section_7_music() {
+	if (!config_file.music_flag) {
+		g_engine->_soundManager->command(2);
 		return;
 	}
 
-	switch (_scene->_nextSceneId) {
+	switch (new_room) {
 	case 701:
 	case 702:
 	case 704:
 	case 705:
 	case 751:
-		_vm->_sound->command(38);
+		g_engine->_soundManager->command(38);
 		break;
 	case 703:
-		if (_globals[kMonsterAlive] == 0)
-			_vm->_sound->command(24);
+		if (global[kMonsterAlive] == 0)
+			g_engine->_soundManager->command(24);
 		else
-			_vm->_sound->command(27);
+			g_engine->_soundManager->command(27);
 		break;
 	case 706:
 	case 707:
 	case 710:
 	case 711:
-		_vm->_sound->command(25);
+		g_engine->_soundManager->command(25);
 		break;
 	default:
 		break;
 	}
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 1fab1f6901c..c900be86550 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -99,6 +99,10 @@ void Game::Object::setQuality(int quality_id, long quality_value) {
 	object_set_quality(_object_id, quality_id, quality_value);
 }
 
+bool Game::Object::hasQuality(int quality_id) {
+	return object_has_quality(_object_id, quality_id);
+}
+
 void Game::VisitedScenes::add(int roomNum) {
 	player_discover_room(roomNum);
 }
@@ -440,6 +444,10 @@ void VM::Dialogs::show(int id) {
 	text_show(id);
 }
 
+void VM::Dialogs::show(int object_id, int id) {
+	object_examine(object_id, id, 0);
+}
+
 void VM::Dialogs::showItem(int object_id, int message, int speech) {
 	object_examine(object_id, message, speech);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index e1b9544774e..2d6d9611e5d 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -391,6 +391,8 @@ struct Game {
 		return this;
 	}
 
+	Globals &_globals = Rooms::_globals;
+
 	struct Object {
 		int _object_id;
 		int16 &_roomNumber;
@@ -398,6 +400,7 @@ struct Game {
 		Object(int objectNum);
 		int getQuality(int quality_id);
 		void setQuality(int quality_id, long quality_value);
+		bool hasQuality(int quality_id);
 	};
 
 	struct Objects {
@@ -586,6 +589,7 @@ struct VM {
 		}
 
 		void show(int id);
+		void show(int object_id, int id);
 		void showItem(int object_id, int message, int speech = 0);
 	};
 	Dialogs _dialogs;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index f40c7c2e29f..6409f39c36a 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -166,12 +166,24 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room611.o \
 	madsv2/nebular/rooms/room612.o \
 	madsv2/nebular/rooms/room620.o \
+	madsv2/nebular/rooms/room701.o \
+	madsv2/nebular/rooms/room702.o \
+	madsv2/nebular/rooms/room703.o \
+	madsv2/nebular/rooms/room704.o \
+	madsv2/nebular/rooms/room705.o \
+	madsv2/nebular/rooms/room706.o \
+	madsv2/nebular/rooms/room707.o \
+	madsv2/nebular/rooms/room710.o \
+	madsv2/nebular/rooms/room711.o \
+	madsv2/nebular/rooms/room751.o \
+	madsv2/nebular/rooms/room752.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/nebular/rooms/section2.o \
 	madsv2/nebular/rooms/section3.o \
 	madsv2/nebular/rooms/section4.o \
 	madsv2/nebular/rooms/section5.o \
 	madsv2/nebular/rooms/section6.o \
+	madsv2/nebular/rooms/section7.o \
 	madsv2/nebular/rooms/conversation.o \
 	madsv2/nebular/rooms/forcefield.o \
 	madsv2/nebular/rooms/teleporter.o \


Commit: 61b88a0c271664f1996e411bc84ef159c9ae96bd
    https://github.com/scummvm/scummvm/commit/61b88a0c271664f1996e411bc84ef159c9ae96bd
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:46+10:00

Commit Message:
MADS: NEBULAR: Implemented section 8 rooms

Changed paths:
    engines/mads/madsv2/nebular/rooms/room801.cpp
    engines/mads/madsv2/nebular/rooms/room802.cpp
    engines/mads/madsv2/nebular/rooms/room803.cpp
    engines/mads/madsv2/nebular/rooms/room804.cpp
    engines/mads/madsv2/nebular/rooms/room805.cpp
    engines/mads/madsv2/nebular/rooms/room807.cpp
    engines/mads/madsv2/nebular/rooms/room808.cpp
    engines/mads/madsv2/nebular/rooms/room810.cpp
    engines/mads/madsv2/nebular/rooms/section8.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/room801.cpp b/engines/mads/madsv2/nebular/rooms/room801.cpp
index baad8183a80..f2ef78eb620 100644
--- a/engines/mads/madsv2/nebular/rooms/room801.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room801.cpp
@@ -19,28 +19,25 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene801::Scene801(RexNebularEngine *vm) : Scene8xx(vm) {
-	_walkThroughDoor = false;
-}
-
-void room_801_synchronize(Common::Serializer &s) {
-	Scene8xx::synchronize(s);
+struct Scratch {
+	bool _walkThroughDoor;
+};
 
-	s.syncAsByte(_walkThroughDoor);
-}
+static Scratch local;
 
-void Scene801::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
 static void room_801_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
@@ -56,7 +53,7 @@ static void room_801_init() {
 
 	if ((_globals[kCameFromCut]) && (_globals[kCutX] != 0)) {
 		_game._player._playerPos = Common::Point(_globals[kCutX], _globals[kCutY]);
-		_game._player._facing = (Facing)_globals[kCutFacing];
+		_game._player._facing = _globals[kCutFacing];
 		_globals[kCutX] = 0;
 		_globals[kCameFromCut] = false;
 		_globals[kReturnFromCut] = false;
@@ -115,10 +112,10 @@ static void room_801_init() {
 		_globals[kTeleporterCommand] = 0;
 	}
 
-	_walkThroughDoor = false;
+	local._walkThroughDoor = false;
 	if (_scene->_priorSceneId == 802) {
 		_game._player._stepEnabled = false;
-		_walkThroughDoor = true;
+		local._walkThroughDoor = true;
 	}
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 11, 0, 0, 0);
@@ -129,10 +126,10 @@ static void room_801_init() {
 	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
 
-	sceneEntrySound();
+	section_8_music();
 }
 
-void Scene801::step() {
+static void room_801_daemon() {
 	if (_game._trigger == 75) {
 		if (_globals[kSexOfRex] == REX_FEMALE) {
 			_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0);
@@ -164,12 +161,12 @@ void Scene801::step() {
 		_scene->_reloadSceneFlag = true;
 	}
 
-	if (_walkThroughDoor && (_game._player._playerPos == Common::Point(270, 118))) {
+	if (local._walkThroughDoor && (_game._player._playerPos == Common::Point(270, 118))) {
 		_game._player._stepEnabled = false;
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
-		_walkThroughDoor = false;
+		local._walkThroughDoor = false;
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 120);
 	}
 
@@ -259,6 +256,21 @@ static void room_801_parser() {
 	_action._inProgress = false;
 }
 
+void room_801_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._walkThroughDoor);
+}
+
+void room_801_preload() {
+	room_init_code_pointer = room_801_init;
+	room_daemon_code_pointer = room_801_daemon;
+	room_pre_parser_code_pointer = room_801_pre_parser;
+	room_parser_code_pointer = room_801_parser;
+
+	section_8_walker();
+	section_8_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room802.cpp b/engines/mads/madsv2/nebular/rooms/room802.cpp
index 5037efdbc33..1746c7d8dd2 100644
--- a/engines/mads/madsv2/nebular/rooms/room802.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room802.cpp
@@ -19,21 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene802::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_REMOTE);
-}
+namespace Rooms {
 
 static void room_802_init() {
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_8");
@@ -46,7 +43,7 @@ static void room_802_init() {
 	if ((_globals[kCameFromCut]) && (_globals[kCutX] != 0)) {
 		_game._player._playerPos.x = _globals[kCutX];
 		_game._player._playerPos.y = _globals[kCutY];
-		_game._player._facing = (Facing)_globals[kCutFacing];
+		_game._player._facing = _globals[kCutFacing];
 		_globals[kCutX] = 0;
 		_globals[kCameFromCut] = false;
 		_globals[kReturnFromCut] = false;
@@ -88,10 +85,10 @@ static void room_802_init() {
 		int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(93, 97), FACING_NORTH);
 	}
-	sceneEntrySound();
+	section_8_music();
 }
 
-void Scene802::step() {
+static void room_802_daemon() {
 	if (_game._trigger == 70) {
 		_game._player._stepEnabled = false;
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
@@ -233,6 +230,24 @@ static void room_802_parser() {
 	_action._inProgress = false;
 }
 
+void room_802_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_802_preload() {
+	room_init_code_pointer = room_802_init;
+	room_daemon_code_pointer = room_802_daemon;
+	room_pre_parser_code_pointer = room_802_pre_parser;
+	room_parser_code_pointer = room_802_parser;
+
+	section_8_walker();
+	section_8_interface();
+	_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
+	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(NOUN_REMOTE);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room803.cpp b/engines/mads/madsv2/nebular/rooms/room803.cpp
index b9124ceb537..10f0d829746 100644
--- a/engines/mads/madsv2/nebular/rooms/room803.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room803.cpp
@@ -19,26 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene803::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(NOUN_GUTS);
-	_scene->addActiveVocab(VERB_WALKTO);
-
-	if ((!_globals[kFromCockpit] && _globals[kReturnFromCut] && !_globals[kBeamIsUp])
-		|| (_globals[kFromCockpit] && !_globals[kExitShip])) {
-		_game._player._spritesPrefix = "";
-		_game._player._spritesChanged = true;
-	}
-}
+namespace Rooms {
 
 static void room_803_init() {
 	_globals[kBetweenRooms] = false;
@@ -125,10 +117,10 @@ static void room_803_init() {
 		_scene->_sequences.addTimer(1, 150);
 	}
 
-	sceneEntrySound();
+	section_8_music();
 }
 
-void Scene803::step() {
+static void room_803_daemon() {
 	if (_game._trigger == 120) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 19);
 		_scene->_nextSceneId = 804;
@@ -340,6 +332,30 @@ static void room_803_parser() {
 	_action._inProgress = false;
 }
 
+void room_803_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_803_preload() {
+	room_init_code_pointer = room_803_init;
+	room_daemon_code_pointer = room_803_daemon;
+	room_pre_parser_code_pointer = room_803_pre_parser;
+	room_parser_code_pointer = room_803_parser;
+
+	section_8_walker();
+	section_8_interface();
+
+	_scene->addActiveVocab(NOUN_GUTS);
+	_scene->addActiveVocab(VERB_WALKTO);
+
+	if ((!_globals[kFromCockpit] && _globals[kReturnFromCut] && !_globals[kBeamIsUp])
+		|| (_globals[kFromCockpit] && !_globals[kExitShip])) {
+		*player.series_name = '\0';
+		player.walker_must_reload = true;
+	}
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room804.cpp b/engines/mads/madsv2/nebular/rooms/room804.cpp
index 8dfe7c1e841..24446b14e0b 100644
--- a/engines/mads/madsv2/nebular/rooms/room804.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room804.cpp
@@ -19,57 +19,43 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-Scene804::Scene804(RexNebularEngine *vm) : Scene8xx(vm) {
-	_messWithThrottle = false;
-	_movingThrottle = false;
-	_throttleGone = false;
-	_dontPullThrottleAgain = false;
-	_pullThrottleReally = false;
-	_alreadyOrgan = false;
-	_alreadyPop = false;
-
-	_throttleCounter = 0;
-	_resetFrame = -1;
-}
-
-void room_804_synchronize(Common::Serializer &s) {
-	Scene8xx::synchronize(s);
-
-	s.syncAsByte(_messWithThrottle);
-	s.syncAsByte(_movingThrottle);
-	s.syncAsByte(_throttleGone);
-	s.syncAsByte(_dontPullThrottleAgain);
-	s.syncAsByte(_pullThrottleReally);
-	s.syncAsByte(_alreadyOrgan);
-	s.syncAsByte(_alreadyPop);
-
-	s.syncAsSint16LE(_resetFrame);
-	s.syncAsUint32LE(_throttleCounter);
-}
-
-void Scene804::setup() {
-	Scene8xx::setPlayerSpritesPrefix();
-	Scene8xx::setAAName();
-}
+namespace Rooms {
+
+struct Scratch {
+	bool _messWithThrottle;
+	bool _movingThrottle;
+	bool _throttleGone;
+	bool _dontPullThrottleAgain;
+	bool _pullThrottleReally;
+	bool _alreadyOrgan;
+	bool _alreadyPop;
+	int16 _throttleCounter;
+	int16 _resetFrame;
+};
+
+static Scratch local;
 
 static void room_804_init() {
-	_messWithThrottle = false;
-	_throttleCounter = 0;
-	_movingThrottle = false;
-	_throttleGone = false;
-	_dontPullThrottleAgain = false;
-	_resetFrame = -1;
-	_pullThrottleReally = false;
-	_alreadyOrgan = false;
-	_alreadyPop = false;
+	local._messWithThrottle = false;
+	local._throttleCounter = 0;
+	local._movingThrottle = false;
+	local._throttleGone = false;
+	local._dontPullThrottleAgain = false;
+	local._resetFrame = -1;
+	local._pullThrottleReally = false;
+	local._alreadyOrgan = false;
+	local._alreadyPop = false;
 
 
 	if (_globals[kCopyProtectFailed]) {
@@ -113,7 +99,7 @@ static void room_804_init() {
 
 	_scene->loadAnimation(Resources::formatName(804, 'r', 1, EXT_AA, ""));
 
-	Scene8xx::sceneEntrySound();
+	section_8_music();
 
 	if (_globals[kInSpace] && !_globals[kWindowFixed]) {
 		_scene->_userInterface.setup(kInputLimitedSentences);
@@ -121,24 +107,24 @@ static void room_804_init() {
 	}
 }
 
-void Scene804::step() {
-	if (!_messWithThrottle) {
+static void room_804_daemon() {
+	if (!local._messWithThrottle) {
 
-		if ((_throttleGone) && (_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 39)) {
+		if ((local._throttleGone) && (local._movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 39)) {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle
 			(_globals._spriteIndexes[1], false, 1);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139));
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
-			_throttleGone = false;
+			local._throttleGone = false;
 		}
 
-		if ((_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 42)) {
-			_resetFrame = 0;
-			_movingThrottle = false;
+		if ((local._movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 42)) {
+			local._resetFrame = 0;
+			local._movingThrottle = false;
 		}
 
 		if (_game._trigger == 70) {
-			_resetFrame = 42;
+			local._resetFrame = 42;
 		}
 
 		if (_scene->_animation[0]->getCurrentFrame() == 65)
@@ -148,7 +134,7 @@ void Scene804::step() {
 		case STORYMODE_NAUGHTY:
 		default:
 			if (_scene->_animation[0]->getCurrentFrame() == 81) {
-				_resetFrame = 80;
+				local._resetFrame = 80;
 				_globals[kInSpace] = false;
 				_globals[kBeamIsUp] = true;
 
@@ -160,7 +146,7 @@ void Scene804::step() {
 
 		case STORYMODE_NICE:
 			if (_scene->_animation[0]->getCurrentFrame() == 68) {
-				_resetFrame = 66;
+				local._resetFrame = 66;
 				_globals[kInSpace] = false;
 				_globals[kBeamIsUp] = true;
 
@@ -171,14 +157,14 @@ void Scene804::step() {
 		}
 
 		if (_scene->_animation[0]->getCurrentFrame() == 34) {
-			_resetFrame = 36;
+			local._resetFrame = 36;
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 		}
 
 		if (_scene->_animation[0]->getCurrentFrame() == 37) {
-			_resetFrame = 36;
-			if (!_dontPullThrottleAgain) {
-				_dontPullThrottleAgain = true;
+			local._resetFrame = 36;
+			if (!local._dontPullThrottleAgain) {
+				local._dontPullThrottleAgain = true;
 				_scene->_sequences.addTimer(60, 80);
 			}
 		}
@@ -194,26 +180,26 @@ void Scene804::step() {
 		}
 
 		if (_scene->_animation[0]->getCurrentFrame() == 10) {
-			_resetFrame = 0;
+			local._resetFrame = 0;
 			_game._player._stepEnabled = true;
 			_game._objects.setRoom(OBJ_POLYCEMENT, NOWHERE);
 		}
 
 		// FIXME: Original doesn't have resetFrame check. Check why this has been needed
-		if (_resetFrame == -1 && _scene->_animation[0]->getCurrentFrame() == 1) {
+		if (local._resetFrame == -1 && _scene->_animation[0]->getCurrentFrame() == 1) {
 			int randomVal = _vm->getRandomNumber(29) + 1;
 			switch (randomVal) {
 			case 1:
-				_resetFrame = 25;
+				local._resetFrame = 25;
 				break;
 			case 2:
-				_resetFrame = 27;
+				local._resetFrame = 27;
 				break;
 			case 3:
-				_resetFrame = 29;
+				local._resetFrame = 29;
 				break;
 			default:
-				_resetFrame = 0;
+				local._resetFrame = 0;
 				break;
 			}
 		}
@@ -222,20 +208,20 @@ void Scene804::step() {
 		case 26:
 		case 28:
 		case 31:
-			_resetFrame = 0;
+			local._resetFrame = 0;
 			break;
 		default:
 			break;
 		}
 	} else {
-		if ((_scene->_animation[0]->getCurrentFrame() == 36) && (!_throttleGone)) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 36) && (!local._throttleGone)) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_throttleGone = true;
+			local._throttleGone = true;
 		}
 
 		if (_scene->_animation[0]->getCurrentFrame() == 39) {
-			_movingThrottle = false;
-			switch (_throttleCounter) {
+			local._movingThrottle = false;
+			switch (local._throttleCounter) {
 			case 1:
 				break;
 			case 3:
@@ -246,14 +232,14 @@ void Scene804::step() {
 			}
 		}
 
-		if (!_movingThrottle) {
-			++_throttleCounter;
-			_movingThrottle = true;
-			if (_throttleCounter < 4) {
-				_resetFrame = 34;
+		if (!local._movingThrottle) {
+			++local._throttleCounter;
+			local._movingThrottle = true;
+			if (local._throttleCounter < 4) {
+				local._resetFrame = 34;
 			} else {
-				_messWithThrottle = false;
-				_throttleCounter = 0;
+				local._messWithThrottle = false;
+				local._throttleCounter = 0;
 				_game._player._stepEnabled = true;
 			}
 		}
@@ -267,15 +253,15 @@ void Scene804::step() {
 		_vm->_dialogs->show(80426);
 	}
 
-	if (_pullThrottleReally) {
-		_resetFrame = 32;
-		_pullThrottleReally = false;
+	if (local._pullThrottleReally) {
+		local._resetFrame = 32;
+		local._pullThrottleReally = false;
 	}
 
-	if (_resetFrame >= 0) {
-		if (_resetFrame != _scene->_animation[0]->getCurrentFrame()) {
-			_scene->_animation[0]->setCurrentFrame(_resetFrame);
-			_resetFrame = -1;
+	if (local._resetFrame >= 0) {
+		if (local._resetFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_scene->_animation[0]->setCurrentFrame(local._resetFrame);
+			local._resetFrame = -1;
 		}
 	}
 
@@ -283,14 +269,14 @@ void Scene804::step() {
 		_scene->_nextSceneId = 803;
 	}
 
-	if ((_scene->_animation[0]->getCurrentFrame() == 72) && !_alreadyPop) {
+	if ((_scene->_animation[0]->getCurrentFrame() == 72) && !local._alreadyPop) {
 		_vm->_sound->command(21);
-		_alreadyPop = true;
+		local._alreadyPop = true;
 	}
 
-	if ((_scene->_animation[0]->getCurrentFrame() == 80) && !_alreadyOrgan) {
+	if ((_scene->_animation[0]->getCurrentFrame() == 80) && !local._alreadyOrgan) {
 		_vm->_sound->command(22);
-		_alreadyOrgan = true;
+		local._alreadyOrgan = true;
 	}
 }
 
@@ -323,17 +309,17 @@ static void room_804_parser() {
 				_action._inProgress = false;
 
 				_vm->_dialogs->show(80424);
-				_pullThrottleReally = true;
+				local._pullThrottleReally = true;
 				_scene->_kernelMessages.add(Common::Point(78, 75), 0x1110, 0, 0,
 					120, _game.getQuote(791));
 			}
 		} else {
-			_messWithThrottle = true;
+			local._messWithThrottle = true;
 		}
 	} else if (_action.isAction(VERB_APPLY, NOUN_POLYCEMENT, NOUN_CRACK) ||
 		_action.isAction(VERB_PUT, NOUN_POLYCEMENT, NOUN_CRACK)) {
 		if (!_globals[kWindowFixed]) {
-			_resetFrame = 2;
+			local._resetFrame = 2;
 			_game._player._stepEnabled = false;
 		}
 	} else if (_action.isAction(VERB_EXIT, NOUN_SHIP)) {
@@ -384,6 +370,29 @@ static void room_804_parser() {
 	_action._inProgress = false;
 }
 
+void room_804_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._messWithThrottle);
+	s.syncAsByte(local._movingThrottle);
+	s.syncAsByte(local._throttleGone);
+	s.syncAsByte(local._dontPullThrottleAgain);
+	s.syncAsByte(local._pullThrottleReally);
+	s.syncAsByte(local._alreadyOrgan);
+	s.syncAsByte(local._alreadyPop);
+
+	s.syncAsSint16LE(local._resetFrame);
+	s.syncAsUint32LE(local._throttleCounter);
+}
+
+void room_804_preload() {
+	room_init_code_pointer = room_804_init;
+	room_daemon_code_pointer = room_804_daemon;
+	room_parser_code_pointer = room_804_parser;
+
+	section_8_walker();
+	section_8_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room805.cpp b/engines/mads/madsv2/nebular/rooms/room805.cpp
index cc615326658..9c23092fbc1 100644
--- a/engines/mads/madsv2/nebular/rooms/room805.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room805.cpp
@@ -19,21 +19,18 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene805::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-	_scene->addActiveVocab(VERB_REMOVE);
-	_scene->addActiveVocab(NOUN_TARGET_MODULE);
-	_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
-}
+namespace Rooms {
 
 static void room_805_init() {
 	_game._player._visible = false;
@@ -46,27 +43,27 @@ static void room_805_init() {
 		_scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, false);
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 25);
 		int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_REMOVE, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), 0);
 	}
 
 	if (_globals[kTargetModInstalled]) {
 		_scene->_hotspots.activate(OBJ_TARGET_MODULE, false);
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 12);
 		int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_REMOVE, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), 0);
 	}
 
-	sceneEntrySound();
+	section_8_music();
 }
 
-void Scene805::step() {
-	UserInterface &userInterface = _vm->_game->_scene._userInterface;
+static void room_805_daemon() {
+	auto &userInterface = _vm->_game->_scene._userInterface;
 
 	if (_game._trigger == 70) {
 		_scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, false);
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 25);
 		int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_REMOVE, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), 0);
 		_globals[kShieldModInstalled] = true;
 		_game._objects.setRoom(OBJ_SHIELD_MODULATOR, NOWHERE);
 		userInterface._selectedInvIndex = -1;
@@ -78,7 +75,7 @@ void Scene805::step() {
 		_scene->_hotspots.activate(OBJ_TARGET_MODULE, false);
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 12);
 		int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_REMOVE, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), 0);
 		_globals[kTargetModInstalled] = true;
 		_game._objects.setRoom(OBJ_TARGET_MODULE, NOWHERE);
 		userInterface._selectedInvIndex = -1;
@@ -146,6 +143,24 @@ static void room_805_parser() {
 	_action._inProgress = false;
 }
 
+void room_805_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_805_preload() {
+	room_init_code_pointer = room_805_init;
+	room_daemon_code_pointer = room_805_daemon;
+	room_pre_parser_code_pointer = room_805_pre_parser;
+	room_parser_code_pointer = room_805_parser;
+
+	section_8_walker();
+	section_8_interface();
+	_scene->addActiveVocab(VERB_REMOVE);
+	_scene->addActiveVocab(NOUN_TARGET_MODULE);
+	_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room807.cpp b/engines/mads/madsv2/nebular/rooms/room807.cpp
index 58090c51bff..694f1281423 100644
--- a/engines/mads/madsv2/nebular/rooms/room807.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room807.cpp
@@ -19,41 +19,41 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/teleporter.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
-
-void Scene807::setup() {
-	_game._player._spritesPrefix = "";
-	// The original was calling Scene8xx::setAAName()
-	_game._aaName = Resources::formatAAName(5);
-}
+namespace Rooms {
 
 static void room_807_init() {
 	if (_globals[kSexOfRex] == REX_FEMALE)
-		_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
 	else
-		_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
 
-	teleporterEnter();
+	teleporter_init();
 
-	// The original uses Scene8xx::SceneEntrySound()
+	// The original uses Scene8xx::section_8_music()
 	if (!_vm->_musicFlag)
 		_vm->_sound->command(2);
 	else
 		_vm->_sound->command(20);
 }
 
-void Scene807::step() {
-	teleporterStep();
+static void room_807_daemon() {
+	teleporter_daemon();
 }
 
 static void room_807_parser() {
-	if (teleporterActions()) {
+	if (teleporter_parser()) {
 		_action._inProgress = false;
 		return;
 	}
@@ -81,6 +81,20 @@ static void room_807_parser() {
 	_action._inProgress = false;
 }
 
+void room_807_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
+void room_807_preload() {
+	room_init_code_pointer = room_807_init;
+	room_daemon_code_pointer = room_807_daemon;
+	room_parser_code_pointer = room_807_parser;
+
+	section_8_walker();
+	section_8_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room808.cpp b/engines/mads/madsv2/nebular/rooms/room808.cpp
index 4afa439572d..e0a2ea791f5 100644
--- a/engines/mads/madsv2/nebular/rooms/room808.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room808.cpp
@@ -19,28 +19,25 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene808::Scene808(RexNebularEngine *vm) : Scene8xx(vm) {
-	_goingTo803 = false;
-}
-
-void room_808_synchronize(Common::Serializer &s) {
-	Scene8xx::synchronize(s);
+struct Scratch {
+	bool _goingTo803;
+};
 
-	s.syncAsByte(_goingTo803);
-}
+static Scratch local;
 
-void Scene808::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
 static void room_808_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
@@ -55,7 +52,7 @@ static void room_808_init() {
 	else
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 
-	_goingTo803 = false;
+	local._goingTo803 = false;
 
 	if (_globals[kCameFromCut] && _globals[kCutX] != 0) {
 		_globals[kCutX] = 0;
@@ -80,7 +77,7 @@ static void room_808_init() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
 	}
 
-	sceneEntrySound();
+	section_8_music();
 }
 
 static void room_808_parser() {
@@ -98,7 +95,7 @@ static void room_808_parser() {
 			if (!_globals[kBeamIsUp] && !_globals[kTopButtonPushed]) {
 				_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
-				_goingTo803 = true;
+				local._goingTo803 = true;
 				_vm->_sound->command(20);
 				_vm->_sound->command(25);
 			}
@@ -110,8 +107,8 @@ static void room_808_parser() {
 
 		case 71:
 			_game._player._stepEnabled = true;
-			if (_goingTo803 && !_globals[kTopButtonPushed]) {
-				_goingTo803 = false;
+			if (local._goingTo803 && !_globals[kTopButtonPushed]) {
+				local._goingTo803 = false;
 				_globals[kReturnFromCut] = true;
 				_scene->_nextSceneId = 803;
 			}
@@ -241,6 +238,18 @@ static void room_808_parser() {
 	_action._inProgress = false;
 }
 
+void room_808_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._goingTo803);
+}
+
+void room_808_preload() {
+	room_init_code_pointer = room_808_init;
+
+	section_8_walker();
+	section_8_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/room810.cpp b/engines/mads/madsv2/nebular/rooms/room810.cpp
index 11a43580d2e..7f58f5323e6 100644
--- a/engines/mads/madsv2/nebular/rooms/room810.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room810.cpp
@@ -19,50 +19,60 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "math/utils.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
+#include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
+namespace Rooms {
 
-Scene810::Scene810(RexNebularEngine *vm) : Scene8xx(vm) {
-	_moveAllowed = false;
-}
-
-void room_810_synchronize(Common::Serializer &s) {
-	Scene8xx::synchronize(s);
+struct Scratch {
+	bool _moveAllowed;
+};
 
-	s.syncAsByte(_moveAllowed);
-}
+static Scratch local;
 
-void Scene810::setup() {
-	setPlayerSpritesPrefix();
-	setAAName();
-}
 
 static void room_810_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
 	_game._player._stepEnabled = false;
 	_scene->loadAnimation(Resources::formatName(810, 'a', -1, EXT_AA, ""));
-	_moveAllowed = true;
+	local._moveAllowed = true;
 
-	sceneEntrySound();
+	section_8_music();
 }
 
-void Scene810::step() {
+static void room_810_daemon() {
 	if (_scene->_animation[0] && (_scene->_animation[0]->getCurrentFrame() == 200)
-		&& _moveAllowed) {
+		&& local._moveAllowed) {
 		_scene->_sequences.addTimer(100, 70);
-		_moveAllowed = false;
+		local._moveAllowed = false;
 	}
 
 	if (_game._trigger == 70)
 		_scene->_nextSceneId = 804;
 }
 
+void room_810_synchronize(Common::Serializer &s) {
+	s.syncAsByte(local._moveAllowed);
+}
+
+void room_810_preload() {
+	room_init_code_pointer = room_810_init;
+	room_daemon_code_pointer = room_810_daemon;
+
+	section_8_walker();
+	section_8_interface();
+}
+
+} // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/section8.cpp b/engines/mads/madsv2/nebular/rooms/section8.cpp
index f5e486cd236..ec5c10b516a 100644
--- a/engines/mads/madsv2/nebular/rooms/section8.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section8.cpp
@@ -19,38 +19,44 @@
  *
  */
 
-#include "common/scummsys.h"
-#include "mads/nebular/nebular.h"
-#include "mads/nebular/core/scene.h"
-#include "mads/nebular/nebular_scenes.h"
-#include "mads/nebular/nebular_scenes8.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/global.h"
 
 namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+namespace Rooms {
 
-namespace Nebular {
+void section_8_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
+}
 
-void Scene8xx::setPlayerSpritesPrefix() {
-	_vm->_sound->command(5);
-	if ((_globals[kFromCockpit] && !_globals[kExitShip]) ||
-			_scene->_nextSceneId == 804 || _scene->_nextSceneId == 805 ||
-			_scene->_nextSceneId == 808 || _scene->_nextSceneId == 810) {
-		_game._player._spritesPrefix = "";
-	} else
-		_game._player._spritesPrefix = _globals[kSexOfRex] == SEX_FEMALE ? "ROX" : "RXM";
+void section_8_walker() {
+	g_engine->_soundManager->command(5);
 
-	_vm->_palette->setEntry(16, 0x0A, 0x3F, 0x3F);
-	_vm->_palette->setEntry(17, 0x0A, 0x2D, 0x2D);
-}
+	if ((global[kFromCockpit] && !global[kExitShip]) ||
+			new_room == 804 || new_room == 805 ||
+			new_room == 808 || new_room == 810) {
+		*player.series_name = '\0';
+	} else {
+		Common::strcpy_s(player.series_name, global[kSexOfRex] == SEX_FEMALE ? "ROX" : "RXM");
+	}
 
-void Scene8xx::setAAName() {
-	_game._aaName = Resources::formatAAName(5);
+	pal_change_color(16, 0x0A, 0x3F, 0x3F);
+	pal_change_color(17, 0x0A, 0x2D, 0x2D);
 }
 
-void Scene8xx::sceneEntrySound() {
-	if (!_vm->_musicFlag)
-		_vm->_sound->command(2);
+void section_8_music() {
+	if (!config_file.music_flag)
+		g_engine->_soundManager->command(2);
 	else {
-		switch (_scene->_nextSceneId) {
+		switch (new_room) {
 		case 801:
 		case 802:
 		case 803:
@@ -58,15 +64,15 @@ void Scene8xx::sceneEntrySound() {
 		case 806:
 		case 807:
 		case 808:
-			_vm->_sound->command(20);
+			g_engine->_soundManager->command(20);
 			break;
 
 		case 805:
-			_vm->_sound->command(23);
+			g_engine->_soundManager->command(23);
 			break;
 
 		case 810:
-			_vm->_sound->command(10);
+			g_engine->_soundManager->command(10);
 			break;
 
 		default:
@@ -75,5 +81,7 @@ void Scene8xx::sceneEntrySound() {
 	}
 }
 
-} // namespace Nebular
+} // namespace Rooms
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 2d6d9611e5d..3966c5b9a6c 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -24,6 +24,7 @@
 
 #include "common/rect.h"
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/mcga.h"
@@ -541,6 +542,7 @@ struct Game {
 	int8 &_difficulty = game.difficulty;
 	byte &_widepipeCtr = kernel.cheating;
 	int8 _storyMode = 0;
+	int &_winStatus = win_status;
 
 	void loadQuoteSet(int quote1, ...);
 	char *getQuote(int quote_id);
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 6409f39c36a..180a521ebfd 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -177,6 +177,14 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room711.o \
 	madsv2/nebular/rooms/room751.o \
 	madsv2/nebular/rooms/room752.o \
+	madsv2/nebular/rooms/room801.o \
+	madsv2/nebular/rooms/room802.o \
+	madsv2/nebular/rooms/room803.o \
+	madsv2/nebular/rooms/room804.o \
+	madsv2/nebular/rooms/room805.o \
+	madsv2/nebular/rooms/room807.o \
+	madsv2/nebular/rooms/room808.o \
+	madsv2/nebular/rooms/room810.o \
 	madsv2/nebular/rooms/section1.o \
 	madsv2/nebular/rooms/section2.o \
 	madsv2/nebular/rooms/section3.o \
@@ -184,6 +192,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/section5.o \
 	madsv2/nebular/rooms/section6.o \
 	madsv2/nebular/rooms/section7.o \
+	madsv2/nebular/rooms/section8.o \
 	madsv2/nebular/rooms/conversation.o \
 	madsv2/nebular/rooms/forcefield.o \
 	madsv2/nebular/rooms/teleporter.o \


Commit: d1cb3606242b0263e06c67c263c6d0e5b13f1965
    https://github.com/scummvm/scummvm/commit/d1cb3606242b0263e06c67c263c6d0e5b13f1965
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:47+10:00

Commit Message:
MADS: NEBULAR: Remove deprecated scene declarations

Changed paths:
    engines/mads/madsv2/nebular/rooms/section2.h
    engines/mads/madsv2/nebular/rooms/section3.h
    engines/mads/madsv2/nebular/rooms/section4.h
    engines/mads/madsv2/nebular/rooms/section5.h
    engines/mads/madsv2/nebular/rooms/section6.h
    engines/mads/madsv2/nebular/rooms/section7.h
    engines/mads/madsv2/nebular/rooms/section8.h


diff --git a/engines/mads/madsv2/nebular/rooms/section2.h b/engines/mads/madsv2/nebular/rooms/section2.h
index 134653be817..d97502fc67b 100644
--- a/engines/mads/madsv2/nebular/rooms/section2.h
+++ b/engines/mads/madsv2/nebular/rooms/section2.h
@@ -33,300 +33,6 @@ extern void section_2_walker();
 extern void section_2_interface();
 extern void section_2_music();
 
-#if 0
-class Scene2xx : public NebularScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void setAAName();
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix();
-
-	void sceneEntrySound();
-public:
-	Scene2xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-};
-
-class Scene201 : public Scene2xx {
-private:
-	bool _pterodactylFlag;
-
-public:
-	Scene201(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene202 : public Scene2xx {
-private:
-	bool _activeMsgFl, _ladderTopFl, _waitingMeteoFl, _toStationFl, _toTeleportFl;
-	int _ladderHotspotId, _lastRoute, _stationCounter, _meteoFrame;
-	uint32 _meteoClock1, _meteoClock2, _startTime;
-	bool _meteorologistSpecial;
-
-	int subStep1(int randVal);
-	int subStep2(int randVal);
-	int subStep3(int randVal);
-	int subStep4(int randVal);
-
-public:
-	Scene202(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-
-	void setRandomKernelMessage();
-};
-
-class Scene203 : public Scene2xx {
-private:
-	bool _rhotundaEat2Fl, _rhotundaEatFl;
-
-public:
-	Scene203(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene205 : public Scene2xx {
-private:
-	uint32 _lastFishTime, _chickenTime;
-	bool _beingKicked;
-	int _kernelMessage;
-	Conversation _dialog1;
-
-	void handleWomanSpeech(int quoteId);
-
-public:
-	Scene205(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene207 : public Scene2xx {
-private:
-	bool _vultureFl, _spiderFl, _eyeFl;
-	int _spiderHotspotId, _vultureHotspotId;
-	int32 _spiderTime, _vultureTime;
-
-	void moveVulture();
-	void moveSpider();
-
-public:
-	Scene207(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene208 : public Scene2xx {
-private:
-	bool _rhotundaTurnFl, _boundingFl;
-	int32 _rhotundaTime;
-
-	void updateTrap();
-	void subAction(int mode);
-
-public:
-	Scene208(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene209 : public Scene2xx {
-private:
-	bool _dodgeFl, _forceDodgeFl, _shouldDodgeFl;
-	bool _pitchFl;
-	bool _fallFl, _forceFallFl, _shouldFallFl;
-	bool _playingAnimFl, _playingDialogFl;
-	int _pauseMode, _pauseCounterThreshold, _pauseCounter;
-	bool _removeMonkeyFl;
-	int _monkeyPosition;
-	bool _shootReadyFl, _startShootingInTimerFl, _shootMissedLastFl;
-	bool _binocularsDroppedFl;
-	int _dialogAbortVal;
-	int _counter;
-
-	void handlePause();
-	void initPauseCounterThreshold();
-	void handlePeek();
-	void handleVerticalMove();
-	void handleLookStay();
-	void handleLookRight();
-	void handleBlink();
-	void handleGetBinoculars();
-	void handleStandFromPeek();
-	void handleDodge();
-	void handleBinocularBlink();
-	void handleBinocularScan();
-	void handleJumpInTree();
-	void handleTongue();
-	void handleMonkeyFall();
-	void handleJumpAndHide();
-	void handleMonkeyEating();
-	void handleMonkey1();
-	void handleStandBlink();
-	void handleMonkey2();
-
-public:
-	Scene209(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene210 : public Scene2xx {
-private:
-	int _curDialogNode;
-	int _nextHandsPlace;
-	int _twinkleAnimationType;
-	int _twinklesCurrentFrame;
-	bool _shouldTalk, _shouldFaceRex, _shouldMoveHead;
-	bool _stopWalking;
-	bool _twinklesTalking;
-	bool _twinklesTalk2;
-	int _doorway;
-	Common::String _subQuote2;
-	Conversation _conv1, _conv2, _conv3;
-	Conversation _conv5, _conv6, _conv7, _conv8;
-
-	void handleConversations();
-	void handleConversation1();
-	void handleConversation2();
-	void handleConversation3();
-	void handleConversation5();
-	void handleConversation6();
-	void handleConversation7();
-	void handleConversation8();
-	void setDialogNode(int node);
-	void handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay);
-	void newNode(int node);
-	void restoreDialogNode(int node, int msgId, int posY);
-
-public:
-	Scene210(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene211 : public Scene2xx {
-private:
-	bool _ambushFl, _wakeFl;
-	int _monkeyFrame, _scrollY;
-	uint32 _monkeyTime;
-
-public:
-	Scene211(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene212 : public Scene2xx {
-public:
-	Scene212(RexNebularEngine *vm) : Scene2xx(vm) {
-	}
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene213 : public SceneTeleporter {
-public:
-	Scene213(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene214 : public Scene2xx {
-private:
-	uint32 _devilTime;
-	bool _devilRunningFl;
-
-public:
-	Scene214(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene215 : public Scene2xx {
-public:
-	Scene215(RexNebularEngine *vm) : Scene2xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene216 : public Scene2xx {
-public:
-	Scene216(RexNebularEngine *vm) : Scene2xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override {
-	};
-};
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section3.h b/engines/mads/madsv2/nebular/rooms/section3.h
index 1fa7fca07bf..63573528b21 100644
--- a/engines/mads/madsv2/nebular/rooms/section3.h
+++ b/engines/mads/madsv2/nebular/rooms/section3.h
@@ -34,512 +34,6 @@ extern void section_3_interface();
 extern void section_3_music();
 extern void section_3_pre_parser();
 
-#if 0
-
-class Scene3xx : public NebularScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void setAAName();
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix();
-
-	void sceneEntrySound();
-
-
-public:
-	Scene3xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-
-	void actions() override {
-	}
-};
-
-class Scene300s : public Scene3xx {
-public:
-	Scene300s(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void preActions() override;
-};
-
-class Scene301 : public Scene3xx {
-public:
-	Scene301(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene302 : public Scene3xx {
-private:
-	int _oldFrame;
-
-public:
-	Scene302(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene303 : public Scene3xx {
-public:
-	Scene303(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene304 : public Scene3xx {
-private:
-	int _explosionSpriteId;
-
-public:
-	Scene304(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene307 : public Scene3xx {
-private:
-	ForceField _forceField;
-
-	bool _afterPeeingFl;
-	bool _duringPeeingFl;
-	bool _grateOpenedFl;
-	bool _activePrisonerFl;
-
-	int _animationMode;
-	int  _prisonerMessageId;
-	int _fieldCollisionCounter;
-
-	uint32 _lastFrameTime;
-	uint32 _guardTime;
-	uint32 _prisonerTimer;
-
-	Common::String _subQuote2;
-
-	Conversation _dialog1, _dialog2;
-
-	void handleDialog();
-	void handleRexDialog(int quote);
-	void handlePrisonerDialog();
-	void handlePrisonerEncounter();
-	void setDialogNode(int node);
-	void handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout);
-
-public:
-	Scene307(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene308 : public Scene3xx {
-private:
-	ForceField _forceField;
-
-public:
-	Scene308(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene309 : public Scene3xx {
-private:
-	ForceField _forceField;
-	int _characterSpriteIndexes[3];
-	int _messagesIndexes[3];
-	int _lastFrame;
-
-public:
-	Scene309(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene310 : public Scene3xx {
-private:
-	ForceField _forceField;
-
-public:
-	Scene310(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene311 : public Scene3xx {
-private:
-	bool _checkGuardFl;
-
-public:
-	Scene311(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene313 : public Scene3xx {
-public:
-	Scene313(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene316 : public Scene3xx {
-private:
-	void handleRexInGrate();
-	void handleRoxInGrate();
-
-public:
-	Scene316(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene318 : public Scene3xx {
-private:
-	uint32 _dropTimer;
-
-	int _lastFrame;
-	int _animMode;
-	int _internCounter;
-	int _counter;
-
-	bool _dialogFl;
-	bool _internTalkingFl;
-	bool _internWalkingFl;
-	bool _internVisibleFl;
-	bool _explosionFl;
-
-	uint32 _lastFrameCounter;
-
-	Common::String _subQuote2;
-
-	Conversation _dialog1;
-
-	void handleDialog();
-	void handleRexDialogs(int quote);
-	void handleInternDialog(int quoteId, int quoteNum, uint32 timeout);
-
-public:
-	Scene318(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene319 : public Scene3xx {
-private:
-	Conversation _dialog1, _dialog2, _dialog3;
-
-	int _animMode, _animFrame;
-	int _nextAction1, _nextAction2;
-	int _slacheMode;
-	int _slacheTopic;
-	int _slachePosY;
-
-	bool _slacheTalkingFl;
-	bool _slacheReady;
-	bool _slacheInitFl;
-
-	Common::String _subQuote2;
-
-	void handleRexDialogues(int quote);
-	void handleSlacheDialogs(int quoteId, int counter, uint32 timer);
-public:
-	Scene319(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene320 : public Scene300s {
-private:
-	void setRightView(int view);
-	void setLeftView(int view);
-	void handleButtons();
-
-	bool _blinkFl;
-	bool _flippedFl;
-
-	int _buttonId;
-	int _lastFrame;
-	int _leftItemId;
-	int _posX;
-	int _rightItemId;
-
-public:
-	Scene320(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene321 : public Scene3xx {
-public:
-	Scene321(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-};
-
-class Scene322 : public SceneTeleporter {
-public:
-	Scene322(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene351 : public Scene3xx {
-public:
-	Scene351(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene352 : public Scene3xx {
-private:
-	bool _vaultOpenFl;
-	bool _mustPutArmDownFl;
-	bool _leaveRoomFl;
-
-	int _tapePlayerHotspotIdx;
-	int _hotspot1Idx;
-	int _hotspot2Idx;
-	int _lampHostpotIdx;
-	int _commonSequenceIdx;
-	int _commonSpriteIndex;
-
-	void putArmDown(bool corridorExit, bool doorwayExit);
-
-public:
-	Scene352(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene353 : public Scene3xx {
-public:
-	Scene353(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene354 : public Scene3xx {
-public:
-	Scene354(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene357 : public Scene3xx {
-public:
-	Scene357(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene358 : public Scene3xx {
-public:
-	Scene358(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene359 : public Scene3xx {
-private:
-	int _cardHotspotId;
-
-public:
-	Scene359(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene360 : public Scene3xx {
-public:
-	Scene360(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene361 : public Scene3xx {
-private:
-	void handleRexAction();
-	void handleRoxAction();
-
-public:
-	Scene361(RexNebularEngine *vm) : Scene3xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene366 : public Scene300s {
-public:
-	Scene366(RexNebularEngine *vm) : Scene300s(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene387 : public Scene300s {
-public:
-	Scene387(RexNebularEngine *vm) : Scene300s(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene388 : public Scene300s {
-public:
-	Scene388(RexNebularEngine *vm) : Scene300s(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene389 : public Scene300s {
-private:
-	uint32 _monsterTime;
-
-	int _circularQuoteId;
-
-public:
-	Scene389(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene390 : public Scene300s {
-public:
-	Scene390(RexNebularEngine *vm) : Scene300s(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene391 : public Scene300s {
-public:
-	Scene391(RexNebularEngine *vm) : Scene300s(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene399 : public Scene300s {
-public:
-	Scene399(RexNebularEngine *vm) : Scene300s(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section4.h b/engines/mads/madsv2/nebular/rooms/section4.h
index 06bbc8df062..17aa7751baa 100644
--- a/engines/mads/madsv2/nebular/rooms/section4.h
+++ b/engines/mads/madsv2/nebular/rooms/section4.h
@@ -33,234 +33,6 @@ extern void section_4_walker();
 extern void section_4_interface();
 extern void section_4_music();
 
-#if 0
-class Scene4xx : public NebularScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void setAAName();
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix();
-
-	void sceneEntrySound();
-
-public:
-	Scene4xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-};
-
-class Scene401 : public Scene4xx {
-private:
-	bool _northFl;
-	Common::Point _destPos;
-	uint32 _timer;
-
-public:
-	Scene401(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene402 : public Scene4xx {
-private:
-	bool _lightOn;
-	bool _blowingSmoke;
-	bool _leftWomanMoving;
-	bool _rightWomanMoving;
-	bool _firstTalkToGirlInChair;
-	bool _waitingGinnyMove;
-	bool _ginnyLooking;
-	bool _bigBeatFl;
-	bool _roxOnStool;
-	bool _bartenderSteady;
-	bool _bartenderHandsHips;
-	bool _bartenderLooksLeft;
-	bool _bartenderReady;
-	bool _bartenderTalking;
-	bool _bartenderCalled;
-	bool _conversationFl;
-	bool _activeTeleporter;
-	bool _activeArrows;
-	bool _activeArrow1;
-	bool _activeArrow2;
-	bool _activeArrow3;
-	bool _cutSceneReady;
-	bool _cutSceneNeeded;
-	bool _helgaReady;
-	bool _refuseAlienLiquor;
-
-	int _drinkTimer;
-	int _beatCounter;
-	int _bartenderMode;
-	int _bartenderDialogNode;
-	int _bartenderCurrentQuestion;
-	int _helgaTalkMode;
-	int _roxMode;
-	int _rexMode;
-	int _talkTimer;
-
-	Conversation _dialog1;
-	Conversation _dialog2;
-	Conversation _dialog3;
-	Conversation _dialog4;
-
-	void setDialogNode(int node);
-	void handleConversation1();
-	void handleConversation2();
-	void handleConversation3();
-	void handleConversation4();
-	void handleDialogs();
-
-public:
-	Scene402(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene405 : public Scene4xx {
-public:
-	Scene405(RexNebularEngine *vm) : Scene4xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene406 : public Scene4xx {
-private:
-	bool _hitStorageDoor;
-
-public:
-	Scene406(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene407 : public Scene4xx {
-private:
-	bool _fromNorth;
-	Common::Point _destPos;
-
-public:
-	Scene407(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene408 : public Scene4xx {
-public:
-	Scene408(RexNebularEngine *vm) : Scene4xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene409 : public SceneTeleporter {
-public:
-	Scene409(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene410 : public Scene4xx {
-public:
-	Scene410(RexNebularEngine *vm) : Scene4xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene411 : public Scene4xx {
-private:
-	int _curAnimationFrame;
-	int _newIngredient;
-	int _newQuantity;
-	int _resetFrame;
-	int _badThreshold;
-
-	bool _killRox;
-	bool _makeMushroomCloud;
-
-	Conversation _dialog1;
-	Conversation _dialog2;
-	Conversation _dialog3;
-	Conversation _dialog4;
-
-	void giveToRex(int object);
-	void handleDialog();
-	void handleKettleAction();
-
-	int computeQuoteAndQuantity();
-
-	bool addQuantity();
-	bool addIngredient();
-
-public:
-	Scene411(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene413 : public Scene4xx {
-private:
-	int _rexDeath;
-	int _canMove;
-
-public:
-	Scene413(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section5.h b/engines/mads/madsv2/nebular/rooms/section5.h
index eb6355e1ebf..aff64b74fc2 100644
--- a/engines/mads/madsv2/nebular/rooms/section5.h
+++ b/engines/mads/madsv2/nebular/rooms/section5.h
@@ -33,232 +33,6 @@ extern void section_5_walker();
 extern void section_5_interface();
 extern void section_5_music();
 
-#if 0
-class Scene5xx : public NebularScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void setAAName();
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix();
-
-	void sceneEntrySound();
-
-public:
-	Scene5xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-};
-
-class Scene501 : public Scene5xx {
-private:
-	int _mainSequenceId;
-	int _mainSpriteId;
-	int _doorHotspotid;
-	bool _rexPunched;
-
-	void handleSlotActions();
-
-public:
-	Scene501(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene502 : public SceneTeleporter {
-public:
-	Scene502(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene503 : public Scene5xx {
-private:
-	int _detonatorHotspotId;
-
-public:
-	Scene503(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene504 : public Scene5xx {
-private:
-	int _carAnimationMode;
-	int _carFrame;
-
-public:
-	Scene504(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene505 : public Scene5xx {
-private:
-	int _frame;
-	int _nextButtonId;
-	int _homeSelectedId;
-	int _selectedId;
-	int _activeCars;
-
-	int _carLocations[9];
-
-public:
-	Scene505(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene506 : public Scene5xx {
-private:
-	Common::Point _doorPos;
-	Facing _heroFacing;
-
-	int _doorDepth;
-	int _doorSpriteIdx;
-	int _doorSequenceIdx;
-	int _doorWord;
-
-	bool _labDoorFl;
-	bool _firstDoorFl;
-	bool _actionFl;
-
-	void handleDoorSequences();
-
-public:
-	Scene506(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene507 : public Scene5xx {
-private:
-	int _penlightHotspotId;
-
-public:
-	Scene507(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene508 : public Scene5xx {
-private:
-	int _chosenObject;
-
-	void handlePedestral();
-
-public:
-	Scene508(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene511 : public Scene5xx {
-private:
-	bool _handingLine;
-	bool _lineMoving;
-
-	int _lineAnimationMode;
-	int _lineFrame;
-	int _lineAnimationPosition;
-
-public:
-	Scene511(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene512 : public Scene5xx {
-private:
-	int _fishingRodHotspotId;
-	int _keyHotspotId;
-
-public:
-	Scene512(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene513 : public Scene5xx {
-public:
-	Scene513(RexNebularEngine *vm) : Scene5xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene515 : public Scene5xx {
-public:
-	Scene515(RexNebularEngine *vm) : Scene5xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override {
-	};
-};
-
-class Scene551 : public Scene5xx {
-public:
-	Scene551(RexNebularEngine *vm) : Scene5xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section6.h b/engines/mads/madsv2/nebular/rooms/section6.h
index d1873161b44..f4bf05a3219 100644
--- a/engines/mads/madsv2/nebular/rooms/section6.h
+++ b/engines/mads/madsv2/nebular/rooms/section6.h
@@ -33,298 +33,6 @@ extern void section_6_walker();
 extern void section_6_interface();
 extern void section_6_music();
 
-#if 0
-class Scene6xx : public NebularScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void setAAName();
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix();
-
-	void sceneEntrySound();
-
-public:
-	Scene6xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-};
-
-class Scene601 : public Scene6xx {
-public:
-	Scene601(RexNebularEngine *vm) : Scene6xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene602 : public Scene6xx {
-private:
-	int _lastSpriteIdx;
-	int _lastSequenceIdx;
-	int _cycleIndex;
-	int _safeMode;
-
-	void handleSafeActions();
-
-public:
-	Scene602(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene603 : public Scene6xx {
-private:
-	int _compactCaseHotspotId;
-	int _noteHotspotId;
-
-public:
-	Scene603(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene604 : public Scene6xx {
-private:
-	int _timebombHotspotId;
-	int _bombMode;
-	int _monsterFrame;
-
-	uint32 _monsterTimer;
-
-	bool _monsterActive;
-	bool _animationActiveFl;
-
-	void handleBombActions();
-
-public:
-	Scene604(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene605 : public Scene6xx {
-public:
-	Scene605(RexNebularEngine *vm) : Scene6xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene607 : public Scene6xx {
-private:
-	uint32 _dogTimer;
-	uint32 _lastFrameTime;
-
-	bool _dogLoop;
-	bool _dogEatsRex;
-	bool _dogBarking;
-	bool _shopAvailable;
-
-	int _animationMode;
-	int _animationActive;
-	int _counter;
-
-	void handleThrowingBone();
-
-public:
-	Scene607(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene608 : public Scene6xx {
-private:
-	int _carMode;
-	int _carFrame;
-	int _carMoveMode;
-	int _dogDeathMode;
-	int _carHotspotId;
-	int _barkCount;
-	int _polycementHotspotId;
-	int _animationMode;
-	int _nextTrigger;
-	int _throwMode;
-
-	bool _resetPositionsFl;
-	bool _dogActiveFl;
-	bool _dogBarkingFl;
-	bool _dogFirstEncounter;
-	bool _rexBeingEaten;
-	bool _dogHitWindow;
-	bool _checkFl;
-	bool _dogSquashFl;
-	bool _dogSafeFl;
-	bool _buttonPressedonTimeFl;
-	bool _dogUnderCar;
-	bool _dogYelping;
-
-	long _dogWindowTimer;
-	long _dogRunTimer;
-
-	uint32 _dogTimer1;
-	uint32 _dogTimer2;
-
-	void resetDogVariables();
-	void restoreAnimations();
-	void setCarAnimations();
-	void handleThrowingBone();
-
-public:
-	Scene608(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene609 : public Scene6xx {
-private:
-	int _videoDoorMode;
-
-	void enterStore();
-
-public:
-	Scene609(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene610 : public Scene6xx {
-private:
-	int _handsetHotspotId;
-	int _checkVal;
-
-	bool _cellCharging;
-
-	long _cellChargingTimer;
-	uint32 _lastFrameTimer;
-
-public:
-	Scene610(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene611 : public Scene6xx {
-private:
-	bool _seenRatFl;
-	bool _eyesRunningFl;
-	bool _shouldRemoveEyes;
-	bool _ratPresentFl;
-	bool _duringDialogFl;
-	bool _resetBatterieText;
-	bool _hermitTalkingFl;
-	bool _hermitMovingFl;
-	bool _alreadyTalkingFl;
-	bool _giveBatteriesFl;
-	bool _startTradingFl;
-	bool _check1Fl;
-	bool _stickFingerFl;
-
-	int _randVal;
-	int _ratHotspotId;
-	int _hermitDialogNode;
-	int _hermitDisplayedQuestion;
-	int _nextFrame;
-	int _hermitMode;
-
-	uint32 _ratTimer;
-
-	Conversation _dialog1;
-	Conversation _dialog2;
-
-	Common::Point _defaultDialogPos;
-
-	void handleTrading();
-	void handleRatMoves();
-	void handleDialog();
-	void handleSubDialog1();
-	void handleSubDialog2();
-	void handleTalking(int delay);
-	void setDialogNode(int node);
-	void displayHermitQuestions(int question);
-
-	bool check2ChargedBatteries();
-	bool check4ChargedBatteries();
-
-public:
-	Scene611(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene612 : public Scene6xx {
-private:
-	int _actionMode;
-	int _cycleIndex;
-
-	void handleWinchMovement();
-
-public:
-	Scene612(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene620 : public Scene6xx {
-public:
-	Scene620(RexNebularEngine *vm) : Scene6xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override {
-	};
-};
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section7.h b/engines/mads/madsv2/nebular/rooms/section7.h
index e876d6936c7..34a37d66455 100644
--- a/engines/mads/madsv2/nebular/rooms/section7.h
+++ b/engines/mads/madsv2/nebular/rooms/section7.h
@@ -33,214 +33,6 @@ extern void section_7_walker();
 extern void section_7_interface();
 extern void section_7_music();
 
-#if 0
-class Scene7xx : public NebularScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void setAAName();
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix();
-
-	void sceneEntrySound();
-
-public:
-	Scene7xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-};
-
-class Scene701 : public Scene7xx {
-private:
-	int _fishingLineId;
-
-public:
-	Scene701(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-	void step() override;
-};
-
-class Scene702 : public Scene7xx {
-public:
-	Scene702(RexNebularEngine *vm) : Scene7xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene703 : public Scene7xx {
-private:
-	int _monsterMode;
-	int _boatFrame;
-	int _curSequence;
-	int _boatDir;
-
-	bool _useBomb;
-	bool _startMonsterTimer;
-	bool _rexDeathFl;
-	bool _restartTrigger70Fl;
-
-	uint32 _lastFrameTime;
-	uint32 _monsterTime;
-
-	Conversation _dialog1;
-
-	void handleBottleInterface();
-	void setBottleSequence();
-	void handleFillBottle(int quote);
-
-public:
-	Scene703(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene704 : public Scene7xx {
-private:
-	int _bottleHotspotId;
-	int _boatCurrentFrame;
-	int _animationMode;
-	int _boatDirection;
-
-	bool _takeBottleFl;
-
-	Conversation _dialog1;
-
-	void handleFillBottle(int quote);
-	void setBottleSequence();
-	void handleBottleInterface();
-
-public:
-	Scene704(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene705 : public Scene7xx {
-private:
-	Conversation _dialog1;
-
-	void handleFillBottle(int quote);
-	void setBottleSequence();
-	void handleBottleInterface();
-
-public:
-	Scene705(RexNebularEngine *vm) : Scene7xx(vm) {
-	}
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene706 : public Scene7xx {
-private:
-	int _vaseHotspotId;
-	int _vaseMode;
-	int _animationMode;
-	int _animationFrame;
-
-	bool _emptyPedestral;
-
-	void handleTakeVase();
-	void handleRexDeath();
-
-public:
-	Scene706(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene707 : public SceneTeleporter {
-public:
-	Scene707(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene710 : public Scene7xx {
-public:
-	Scene710(RexNebularEngine *vm) : Scene7xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene711 : public SceneTeleporter {
-public:
-	Scene711(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene751 : public Scene7xx {
-private:
-	bool _rexHandingLine;
-
-public:
-	Scene751(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene752 : public Scene7xx {
-private:
-	int _cardId;
-
-public:
-	Scene752(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section8.h b/engines/mads/madsv2/nebular/rooms/section8.h
index 9ce10acbcc8..0cfef45e90d 100644
--- a/engines/mads/madsv2/nebular/rooms/section8.h
+++ b/engines/mads/madsv2/nebular/rooms/section8.h
@@ -33,141 +33,6 @@ extern void section_8_walker();
 extern void section_8_interface();
 extern void section_8_music();
 
-#if 0
-class Scene8xx : public NebularScene {
-protected:
-	/**
-	 * Initial setup code shared by several scenes
-	 */
-	void setPlayerSpritesPrefix();
-
-	/**
-	* Initial setup code shared by several scenes
-	*/
-	void setAAName();
-
-	/**
-	 * Common scene enter code used by multiple scenes
-	 */
-	void sceneEntrySound();
-public:
-	Scene8xx(RexNebularEngine *vm) : NebularScene(vm) {
-	}
-};
-
-class Scene801 : public Scene8xx {
-private:
-	bool _walkThroughDoor;
-
-public:
-	Scene801(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene802 : public Scene8xx {
-public:
-	Scene802(RexNebularEngine *vm) : Scene8xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene803 : public Scene8xx {
-public:
-	Scene803(RexNebularEngine *vm) : Scene8xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene804 : public Scene8xx {
-private:
-	bool _messWithThrottle;
-	bool _movingThrottle;
-	bool _throttleGone;
-	bool _dontPullThrottleAgain;
-	bool _pullThrottleReally;
-	bool _alreadyOrgan;
-	bool _alreadyPop;
-	uint32 _throttleCounter;
-	int _resetFrame;
-
-public:
-	Scene804(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene805 : public Scene8xx {
-public:
-	Scene805(RexNebularEngine *vm) : Scene8xx(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void preActions() override;
-	void actions() override;
-};
-
-class Scene807 : public SceneTeleporter {
-public:
-	Scene807(RexNebularEngine *vm) : SceneTeleporter(vm) {
-	}
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override;
-};
-
-class Scene808 : public Scene8xx {
-private:
-	bool _goingTo803;
-
-public:
-	Scene808(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void actions() override;
-};
-
-class Scene810 : public Scene8xx {
-private:
-	bool _moveAllowed;
-
-public:
-	Scene810(RexNebularEngine *vm);
-	void synchronize(Common::Serializer &s) override;
-
-	void setup() override;
-	void enter() override;
-	void step() override;
-	void actions() override {
-	};
-};
-#endif
-
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2


Commit: 955d76846931f3c2e7629bfc9f4bf2519ecea1c1
    https://github.com/scummvm/scummvm/commit/955d76846931f3c2e7629bfc9f4bf2519ecea1c1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:47+10:00

Commit Message:
MADS: NEBULAR: Clarify Conversation class as Dialog

Changed paths:
  A engines/mads/madsv2/nebular/rooms/dialog.cpp
  A engines/mads/madsv2/nebular/rooms/dialog.h
  R engines/mads/madsv2/nebular/rooms/conversation.cpp
  R engines/mads/madsv2/nebular/rooms/conversation.h
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room307.cpp
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room319.cpp
    engines/mads/madsv2/nebular/rooms/room402.cpp
    engines/mads/madsv2/nebular/rooms/room411.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp
    engines/mads/madsv2/nebular/rooms/room703.cpp
    engines/mads/madsv2/nebular/rooms/room704.cpp
    engines/mads/madsv2/nebular/rooms/room705.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/rooms/conversation.cpp b/engines/mads/madsv2/nebular/rooms/dialog.cpp
similarity index 92%
rename from engines/mads/madsv2/nebular/rooms/conversation.cpp
rename to engines/mads/madsv2/nebular/rooms/dialog.cpp
index 3731194a188..b68f19979ff 100644
--- a/engines/mads/madsv2/nebular/rooms/conversation.cpp
+++ b/engines/mads/madsv2/nebular/rooms/dialog.cpp
@@ -23,14 +23,14 @@
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/quote.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void Conversation::setup(int globalId, ...) {
+void Dialog::setup(int globalId, ...) {
 	va_list va;
 	va_start(va, globalId);
 
@@ -53,7 +53,7 @@ void Conversation::setup(int globalId, ...) {
 	_globalId = globalId;
 }
 
-void Conversation::set(int quoteId, ...) {
+void Dialog::set(int quoteId, ...) {
 	global[_globalId] = 0;
 
 	va_list va;
@@ -75,7 +75,7 @@ void Conversation::set(int quoteId, ...) {
 	va_end(va);
 }
 
-int Conversation::read(int quoteId) {
+int Dialog::read(int quoteId) {
 	uint16 flags = global[_globalId];
 	int count = 0;
 
@@ -91,7 +91,7 @@ int Conversation::read(int quoteId) {
 	return count;
 }
 
-void Conversation::write(int quoteId, bool flag) {
+void Dialog::write(int quoteId, bool flag) {
 	for (int idx = 0; idx < _count; ++idx) {
 		if (_quotes[idx] == quoteId) {
 			// Found index, so set or clear the flag
@@ -107,7 +107,7 @@ void Conversation::write(int quoteId, bool flag) {
 	}
 }
 
-void Conversation::start() {
+void Dialog::start() {
 	inter_reset_dialog();
 
 	// Loop through each of the quotes loaded into the conversation
diff --git a/engines/mads/madsv2/nebular/rooms/conversation.h b/engines/mads/madsv2/nebular/rooms/dialog.h
similarity index 94%
rename from engines/mads/madsv2/nebular/rooms/conversation.h
rename to engines/mads/madsv2/nebular/rooms/dialog.h
index 3b6338a694a..486af310aab 100644
--- a/engines/mads/madsv2/nebular/rooms/conversation.h
+++ b/engines/mads/madsv2/nebular/rooms/dialog.h
@@ -19,8 +19,8 @@
  *
  */
 
-#ifndef MADS_NEBULAR_ROOMS_CONVERATION_H
-#define MADS_NEBULAR_ROOMS_CONVERATION_H
+#ifndef MADS_NEBULAR_ROOMS_DIALOG_H
+#define MADS_NEBULAR_ROOMS_DIALOG_H
 
 #include "mads/madsv2/engine.h"
 
@@ -31,7 +31,7 @@ namespace Rooms {
 
 #define MAX_CONV_MESSAGE 10
 
-class Conversation {
+class Dialog {
 public:
 	int _globalId;
 	int _count;
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index 776ecdb7311..f69778312d4 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -22,7 +22,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
@@ -38,7 +38,7 @@ struct Scratch {
 	long _chickenTime;
 	bool _beingKicked;
 	int16 _kernelMessage;
-	Conversation _dialog1;
+	Dialog _dialog1;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index cfce88548dd..b171b37a8fc 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -22,7 +22,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/nebular.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
@@ -46,13 +46,13 @@ struct Scratch {
 	bool _twinklesTalk2;
 	int32 _doorway;
 	char _subQuote2[256];
-	Conversation _conv1;
-	Conversation _conv2;
-	Conversation _conv3;
-	Conversation _conv5;
-	Conversation _conv6;
-	Conversation _conv7;
-	Conversation _conv8;
+	Dialog _conv1;
+	Dialog _conv2;
+	Dialog _conv3;
+	Dialog _conv5;
+	Dialog _conv6;
+	Dialog _conv7;
+	Dialog _conv8;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room307.cpp b/engines/mads/madsv2/nebular/rooms/room307.cpp
index d533940dd20..99b191f43ab 100644
--- a/engines/mads/madsv2/nebular/rooms/room307.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room307.cpp
@@ -27,7 +27,7 @@
 #include "mads/madsv2/nebular/rooms/section3.h"
 #include "mads/madsv2/nebular/rooms/forcefield.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -47,8 +47,8 @@ struct Scratch {
 	int32 _prisonerTimer;
 	char _subQuote2[256];
 
-	Conversation _dialog1;
-	Conversation _dialog2;
+	Dialog _dialog1;
+	Dialog _dialog2;
 	Forcefield _forcefield;
 };
 
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index e30fe247a61..74ed974560b 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -26,7 +26,7 @@
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section3.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -46,7 +46,7 @@ struct Scratch {
 	bool _explosionFl;
 	int32 _lastFrameCounter = 0;
 	char _subQuote2[256];
-	Conversation _dialog1;
+	Dialog _dialog1;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room319.cpp b/engines/mads/madsv2/nebular/rooms/room319.cpp
index eb481c63541..9ef2fd1982d 100644
--- a/engines/mads/madsv2/nebular/rooms/room319.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room319.cpp
@@ -27,7 +27,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section3.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -47,9 +47,9 @@ struct Scratch {
 	bool _slacheReady;
 	bool _slacheInitFl;
 	char _subQuote2[256];
-	Conversation _dialog1;
-	Conversation _dialog2;
-	Conversation _dialog3;
+	Dialog _dialog1;
+	Dialog _dialog2;
+	Dialog _dialog3;
 };
 
 static Scratch local;
@@ -454,7 +454,7 @@ static void room_319_parser() {
 				if (local._nextAction1 != local._nextAction2) {
 					_scene->_sequences.addTimer(4, 2);
 				} else {
-					Conversation *curDialog;
+					Dialog *curDialog;
 					int nextDocQuote;
 					if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x167)) {
 						curDialog = &local._dialog1;
@@ -486,7 +486,7 @@ static void room_319_parser() {
 				if (local._nextAction1 != local._nextAction2) {
 					_scene->_sequences.addTimer(4, 2);
 				} else {
-					Conversation *curDialog;
+					Dialog *curDialog;
 					int nextDocQuote;
 					if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x169) || (_action._activeAction._verbId == 0x167)) {
 						curDialog = &local._dialog1;
diff --git a/engines/mads/madsv2/nebular/rooms/room402.cpp b/engines/mads/madsv2/nebular/rooms/room402.cpp
index dae185da86c..85289907d57 100644
--- a/engines/mads/madsv2/nebular/rooms/room402.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room402.cpp
@@ -25,7 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section4.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -70,10 +70,10 @@ struct Scratch {
 	int32 _rexMode;
 	int32 _talkTimer;
 
-	Conversation _dialog1;
-	Conversation _dialog2;
-	Conversation _dialog3;
-	Conversation _dialog4;
+	Dialog _dialog1;
+	Dialog _dialog2;
+	Dialog _dialog3;
+	Dialog _dialog4;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room411.cpp b/engines/mads/madsv2/nebular/rooms/room411.cpp
index f7c9de461a3..2c6bddee4e4 100644
--- a/engines/mads/madsv2/nebular/rooms/room411.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room411.cpp
@@ -25,7 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section4.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -43,10 +43,10 @@ struct Scratch {
 	bool _killRox;
 	bool _makeMushroomCloud;
 
-	Conversation _dialog1;
-	Conversation _dialog2;
-	Conversation _dialog3;
-	Conversation _dialog4;
+	Dialog _dialog1;
+	Dialog _dialog2;
+	Dialog _dialog3;
+	Dialog _dialog4;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room611.cpp b/engines/mads/madsv2/nebular/rooms/room611.cpp
index 5186d7ba54c..cc52a0f8bfc 100644
--- a/engines/mads/madsv2/nebular/rooms/room611.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room611.cpp
@@ -25,7 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section6.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -56,8 +56,8 @@ struct Scratch {
 	int16 _defaultDialogPos_x;
 	int16 _defaultDialogPos_y;
 	int32 _ratTimer;
-	Conversation _dialog1;
-	Conversation _dialog2;
+	Dialog _dialog1;
+	Dialog _dialog2;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room703.cpp b/engines/mads/madsv2/nebular/rooms/room703.cpp
index 5eafcf45a66..cff6bef3ec8 100644
--- a/engines/mads/madsv2/nebular/rooms/room703.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room703.cpp
@@ -25,7 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section7.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -47,7 +47,7 @@ struct Scratch {
 	int32 _lastFrameTime;
 	int32 _monsterTime;
 
-	Conversation _dialog1;
+	Dialog _dialog1;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room704.cpp b/engines/mads/madsv2/nebular/rooms/room704.cpp
index eb4e09da9dc..b64129ef228 100644
--- a/engines/mads/madsv2/nebular/rooms/room704.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room704.cpp
@@ -25,7 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section7.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -39,7 +39,7 @@ struct Scratch {
 	int16 _animationMode;
 	int16 _boatDirection;
 	bool _takeBottleFl;
-	Conversation _dialog1;
+	Dialog _dialog1;
 };
 
 static Scratch local;
diff --git a/engines/mads/madsv2/nebular/rooms/room705.cpp b/engines/mads/madsv2/nebular/rooms/room705.cpp
index 5737c9f515c..c37b702f9ee 100644
--- a/engines/mads/madsv2/nebular/rooms/room705.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room705.cpp
@@ -25,7 +25,7 @@
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/rooms/section7.h"
-#include "mads/madsv2/nebular/rooms/conversation.h"
+#include "mads/madsv2/nebular/rooms/dialog.h"
 #include "mads/madsv2/nebular/rooms/thunks.h"
 
 namespace MADS {
@@ -34,7 +34,7 @@ namespace RexNebular {
 namespace Rooms {
 
 struct Scratch {
-	Conversation _dialog1;
+	Dialog _dialog1;
 };
 
 static Scratch local;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 180a521ebfd..c2781ff3dcc 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -193,7 +193,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/section6.o \
 	madsv2/nebular/rooms/section7.o \
 	madsv2/nebular/rooms/section8.o \
-	madsv2/nebular/rooms/conversation.o \
+	madsv2/nebular/rooms/dialog.o \
 	madsv2/nebular/rooms/forcefield.o \
 	madsv2/nebular/rooms/teleporter.o \
 	madsv2/phantom/mads/mads.o \


Commit: 9a866c3c89478a9b090e68af2bb1c4d6bab02d9f
    https://github.com/scummvm/scummvm/commit/9a866c3c89478a9b090e68af2bb1c4d6bab02d9f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:48+10:00

Commit Message:
MADS: NEBULAR: Hooked Rex sound manager back in again

Changed paths:
  A engines/mads/madsv2/nebular/asound.cpp
  A engines/mads/madsv2/nebular/asound.h
  A engines/mads/madsv2/nebular/sound_nebular.cpp
  A engines/mads/madsv2/nebular/sound_nebular.h
  R engines/mads/nebular/core/asound.cpp
  R engines/mads/nebular/core/asound.h
  R engines/mads/nebular/sound_nebular.cpp
  R engines/mads/nebular/sound_nebular.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/module.mk


diff --git a/engines/mads/nebular/core/asound.cpp b/engines/mads/madsv2/nebular/asound.cpp
similarity index 98%
rename from engines/mads/nebular/core/asound.cpp
rename to engines/mads/madsv2/nebular/asound.cpp
index d3eb0704b44..68cb97b1feb 100644
--- a/engines/mads/nebular/core/asound.cpp
+++ b/engines/mads/madsv2/nebular/asound.cpp
@@ -21,10 +21,11 @@
 
 #include "audio/fmopl.h"
 #include "common/memstream.h"
-#include "mads/nebular/core/asound.h"
+#include "mads/madsv2/nebular/asound.h"
 
 namespace MADS {
-namespace Nebular {
+namespace MADSV2 {
+namespace RexNebular {
 
 bool AdlibChannel::_channelsEnabled;
 
@@ -155,7 +156,7 @@ AdlibSample::AdlibSample(Common::SeekableReadStream &s) {
 /*-----------------------------------------------------------------------*/
 
 ASound::ASound(Audio::Mixer *mixer, OPL::OPL *opl, const Common::Path &filename,
-		int dataOffset, int dataSize) : SoundDriver(mixer, opl, filename, dataOffset, dataSize) {
+	int dataOffset, int dataSize) : SoundDriver(mixer, opl, filename, dataOffset, dataSize) {
 	// Initialize fields
 	_commandParam = 0;
 	_activeChannelPtr = nullptr;
@@ -734,5 +735,6 @@ int ASound::command8() {
 	return result;
 }
 
-} // namespace Nebular
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/nebular/core/asound.h b/engines/mads/madsv2/nebular/asound.h
similarity index 98%
rename from engines/mads/nebular/core/asound.h
rename to engines/mads/madsv2/nebular/asound.h
index 0795b13f7e7..04bf47f3555 100644
--- a/engines/mads/nebular/core/asound.h
+++ b/engines/mads/madsv2/nebular/asound.h
@@ -19,13 +19,14 @@
  *
  */
 
-#ifdef DEPRECATED_MADS_NEBULAR_CORE_ASOUND_H
-#define MADS_NEBULAR_CORE_ASOUND_H
+#ifndef MADS_NEBULAR_ASOUND_H
+#define MADS_NEBULAR_ASOUND_H
 
 #include "mads/core/sound_manager.h"
 
 namespace MADS {
-namespace Nebular {
+namespace MADSV2 {
+namespace RexNebular {
 
 class ASound;
 
@@ -379,7 +380,8 @@ public:
 	void setVolume(int volume) override;
 };
 
-} // namespace Nebular
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
 
 #endif
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 6881f43775c..4b946522a69 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -37,6 +37,7 @@
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/sound_nebular.h"
 #include "mads/madsv2/nebular/rooms/section1.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
 #include "mads/madsv2/nebular/rooms/section3.h"
@@ -66,8 +67,8 @@ Common::Error RexNebularEngine::run() {
 	}
 
 	// Set up sound manager
-	//_soundManager = new DragonSoundManager(_mixer, _soundFlag);
-	//_soundManager->validate();
+	_soundManager = new RexSoundManager(_mixer, _soundFlag);
+	_soundManager->validate();
 
 	// Run the game
 //	RexNebular::dragonsphere_main();
diff --git a/engines/mads/nebular/sound_nebular.cpp b/engines/mads/madsv2/nebular/sound_nebular.cpp
similarity index 98%
rename from engines/mads/nebular/sound_nebular.cpp
rename to engines/mads/madsv2/nebular/sound_nebular.cpp
index 20cb8a79b7d..17095334c59 100644
--- a/engines/mads/nebular/sound_nebular.cpp
+++ b/engines/mads/madsv2/nebular/sound_nebular.cpp
@@ -23,15 +23,15 @@
 #include "common/algorithm.h"
 #include "common/file.h"
 #include "common/md5.h"
-#include "mads/nebular/sound_nebular.h"
+#include "mads/madsv2/nebular/sound_nebular.h"
 
 namespace Audio {
 class Mixer;
 }
 
 namespace MADS {
-
-namespace Nebular {
+namespace MADSV2 {
+namespace RexNebular {
 
 void RexSoundManager::validate() {
 	Common::File f;
@@ -62,31 +62,31 @@ void RexSoundManager::validate() {
 void RexSoundManager::loadDriver(int sectionNumber) {
 	switch (sectionNumber) {
 	case 1:
-		_driver = new Nebular::ASound1(_mixer, _opl);
+		_driver = new RexNebular::ASound1(_mixer, _opl);
 		break;
 	case 2:
-		_driver = new Nebular::ASound2(_mixer, _opl);
+		_driver = new RexNebular::ASound2(_mixer, _opl);
 		break;
 	case 3:
-		_driver = new Nebular::ASound3(_mixer, _opl);
+		_driver = new RexNebular::ASound3(_mixer, _opl);
 		break;
 	case 4:
-		_driver = new Nebular::ASound4(_mixer, _opl);
+		_driver = new RexNebular::ASound4(_mixer, _opl);
 		break;
 	case 5:
-		_driver = new Nebular::ASound5(_mixer, _opl);
+		_driver = new RexNebular::ASound5(_mixer, _opl);
 		break;
 	case 6:
-		_driver = new Nebular::ASound6(_mixer, _opl);
+		_driver = new RexNebular::ASound6(_mixer, _opl);
 		break;
 	case 7:
-		_driver = new Nebular::ASound7(_mixer, _opl);
+		_driver = new RexNebular::ASound7(_mixer, _opl);
 		break;
 	case 8:
-		_driver = new Nebular::ASound8(_mixer, _opl);
+		_driver = new RexNebular::ASound8(_mixer, _opl);
 		break;
 	case 9:
-		_driver = new Nebular::ASound9(_mixer, _opl);
+		_driver = new RexNebular::ASound9(_mixer, _opl);
 		break;
 	default:
 		_driver = nullptr;
@@ -2767,6 +2767,6 @@ int ASound9::command51() {
 }
 
 
-} // namespace Nebular
-
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/nebular/sound_nebular.h b/engines/mads/madsv2/nebular/sound_nebular.h
similarity index 93%
rename from engines/mads/nebular/sound_nebular.h
rename to engines/mads/madsv2/nebular/sound_nebular.h
index b82591d670d..7f55285ee20 100644
--- a/engines/mads/nebular/sound_nebular.h
+++ b/engines/mads/madsv2/nebular/sound_nebular.h
@@ -19,13 +19,14 @@
  *
  */
 
-#ifdef DEPRECATED_MADS_SOUND_NEBULAR_H
-#define MADS_SOUND_NEBULAR_H
+#ifndef MADS_NEBULAR_SOUND_NEBULAR_H
+#define MADS_NEBULAR_SOUND_NEBULAR_H
 
-#include "mads/nebular/core/asound.h"
+#include "mads/madsv2/nebular/asound.h"
 
 namespace MADS {
-namespace Nebular {
+namespace MADSV2 {
+namespace RexNebular {
 
 class RexSoundManager : public SoundManager {
 protected:
@@ -51,7 +52,7 @@ public:
 
 class ASound1 : public RexASound {
 private:
-	typedef int (ASound1::*CommandPtr)();
+	typedef int (ASound1:: *CommandPtr)();
 	static const CommandPtr _commandList[42];
 	bool _cmd23Toggle;
 
@@ -101,7 +102,7 @@ class ASound2 : public RexASound {
 private:
 	byte _command12Param;
 private:
-	typedef int (ASound2::*CommandPtr)();
+	typedef int (ASound2:: *CommandPtr)();
 	static const CommandPtr _commandList[44];
 
 	int command0() override;
@@ -153,7 +154,7 @@ class ASound3 : public RexASound {
 private:
 	bool _command39Flag;
 
-	typedef int (ASound3::*CommandPtr)();
+	typedef int (ASound3:: *CommandPtr)();
 	static const CommandPtr _commandList[61];
 
 	int command9();
@@ -211,7 +212,7 @@ public:
 
 class ASound4 : public RexASound {
 private:
-	typedef int (ASound4::*CommandPtr)();
+	typedef int (ASound4:: *CommandPtr)();
 	static const CommandPtr _commandList[61];
 
 	int command10();
@@ -249,7 +250,7 @@ public:
 
 class ASound5 : public RexASound {
 private:
-	typedef int (ASound5::*CommandPtr)();
+	typedef int (ASound5:: *CommandPtr)();
 	static const CommandPtr _commandList[42];
 
 	int command9();
@@ -295,7 +296,7 @@ public:
 
 class ASound6 : public RexASound {
 private:
-	typedef int (ASound6::*CommandPtr)();
+	typedef int (ASound6:: *CommandPtr)();
 	static const CommandPtr _commandList[30];
 
 	int command9();
@@ -324,7 +325,7 @@ public:
 
 class ASound7 : public RexASound {
 private:
-	typedef int (ASound7::*CommandPtr)();
+	typedef int (ASound7:: *CommandPtr)();
 	static const CommandPtr _commandList[38];
 
 	int command9();
@@ -356,7 +357,7 @@ public:
 
 class ASound8 : public RexASound {
 private:
-	typedef int (ASound8::*CommandPtr)();
+	typedef int (ASound8:: *CommandPtr)();
 	static const CommandPtr _commandList[38];
 
 	int command9();
@@ -402,7 +403,7 @@ private:
 	int _v1, _v2;
 	byte *_soundPtr;
 
-	typedef int (ASound9::*CommandPtr)();
+	typedef int (ASound9:: *CommandPtr)();
 	static const CommandPtr _commandList[52];
 
 	int command9();
@@ -456,8 +457,8 @@ public:
 	int command(int commandId, int param) override;
 };
 
-} // namespace Nebular
-
+} // namespace RexNebular
+} // namespace MADSV2
 } // namespace MADS
 
-#endif /* MADS_SOUND_NEBULAR_H */
+#endif
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index c2781ff3dcc..191c1e80fb4 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -72,6 +72,8 @@ MODULE_OBJS += \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
 	madsv2/nebular/global.o \
+	madsv2/nebular/asound.o \
+	madsv2/nebular/sound_nebular.o \
 	madsv2/nebular/mads/mads.o \
 	madsv2/nebular/rooms/thunks.o \
 	madsv2/nebular/rooms/room101.o \


Commit: 746824c8aeca2a4a48e5a7ae2befc73cfa4a3988
    https://github.com/scummvm/scummvm/commit/746824c8aeca2a4a48e5a7ae2befc73cfa4a3988
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:49+10:00

Commit Message:
MADS: NEBULAR: Adding main function

Changed paths:
  A engines/mads/madsv2/nebular/main.cpp
  A engines/mads/madsv2/nebular/main.h
  A engines/mads/madsv2/nebular/main_menu.cpp
  A engines/mads/madsv2/nebular/main_menu.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
new file mode 100644
index 00000000000..e46920e66ea
--- /dev/null
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -0,0 +1,279 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "gui/saveload.h"
+#include "mads/madsv2/nebular/main.h"
+#include "mads/madsv2/animview/animview.h"
+#include "mads/madsv2/textview/textview.h"
+#include "mads/madsv2/core/env.h"
+#include "mads/madsv2/core/error.h"
+#include "mads/madsv2/core/fileio.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/himem.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/magic.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mcga.h"
+#include "mads/madsv2/core/mouse.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/player.h"
+#include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/core/speech.h"
+#include "mads/madsv2/nebular/main_menu.h"
+//include "mads/madsv2/nebular/menus.h"
+#include "mads/madsv2/engine.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+constexpr bool SHOW_LINES = true;
+constexpr byte LINE_COLOR = 2;
+
+char *quotes;
+
+static void main_menu_main() {
+	auto &screen = *g_engine->getScreen();
+	Palette palette;
+
+	if (!kernel_game_startup(19, KERNEL_STARTUP_CURSOR | KERNEL_STARTUP_INTERRUPT | KERNEL_STARTUP_FONT,
+		nullptr, nullptr)) {
+		matte_init(0xFFFF);
+		bool valid = !kernel_room_startup(920, 0, nullptr, true, true);
+
+		// Setup scr_work to use the full surface of scr_main (i.e. 320x200).
+		// Because of this, viewing_at_y is actually == 0
+		scr_work.y = picture_map.viewport_y;
+		viewing_at_y = (200 - scr_work.y) >> 1;
+
+		mouse_cursor_sprite(cursor, 7);
+		mouse_show();
+		mouse_force(280, 126);
+		mouse_hide();
+
+		mouse_cursor_sprite(cursor, 1);
+		kernel_seq_init();
+		kernel_message_init();
+		kernel_animation_init();
+		kernel_init_dynamic();
+
+		picture_view_x = 0;
+		picture_view_y = 0;
+		new_background = true;
+
+		if (valid) {
+			memset(&palette, 0, sizeof(palette));
+			mcga_setpal(&palette);
+			mouse_cursor_sprite(cursor, 1);
+
+			if (SHOW_LINES && viewing_at_y != 0) {
+				screen.hLine(0, viewing_at_y - 2, 319, LINE_COLOR);
+				screen.hLine(0, scr_work.y + viewing_at_y + 1, 319, LINE_COLOR);
+			}
+
+			kernel_load_sound_driver("*#SOUND.DR9", 'N', 544, 0, 49);
+
+			menu_control();
+
+			if (selected_item >= 0) {
+				// Zero out the first 3 entries of both magic color arrays
+				for (int i = 0; i < 3; i++) {
+					magic_color_values[i] = 0;
+					magic_color_flags[i] = 0;
+				}
+
+				mcga_getpal(&palette);
+
+				magic_fade_to_grey(palette, 0, 0x10, 1, 1, 0, 0, 0);
+			}
+		}
+
+		free(quotes);
+		kernel_unload_sound_driver();
+		kernel_game_shutdown();
+	}
+
+	mcga_reset();
+}
+
+static void main_cold_data_init() {
+	debugger_reset = game_debugger_reset;
+	debugger_update = game_debugger;
+#ifdef TODO
+	game_menu_routine = global_game_menu;
+	game_menu_init = global_menu_system_init;
+	game_menu_exit = global_menu_system_shutdown;
+	game_emergency_save = global_emergency_save;
+#endif
+	Common::strcpy_s(config_file_name, "config.dra");
+	Common::strcpy_s(save_game_key, "drag");
+	Common::strcpy_s(restart_game_key, "dragon");
+
+	Common::strcpy_s(player.series_name, "RAL");
+	player.walker_must_reload = true;
+	player.walker_loads_first = false;
+	player.walker_visible = true;
+	player.scaling_velocity = true;
+
+	Common::strcpy_s(kernel_cheating_password, "WIDECHEW");
+	kernel_cheating_allowed = strlen(kernel_cheating_password);
+
+	kernel.cheating = gDebugLevel == 9 ? kernel_cheating_allowed : 0;
+}
+
+static void game_main(int argc, const char **argv) {
+	int count;
+	int mads_mode;
+	const char *scan;
+
+	pack_enable_pfab_explode();
+
+	mads_mode = env_verify();
+
+	new_section = 1;
+	new_room = 101;
+	player.x = 160;
+	player.y = 78;
+
+	player.target_facing = FACING_NORTH;
+
+	game_cold_data_init();
+	main_cold_data_init();
+	g_engine->readConfigFile();
+	global_load_config_parameters();
+
+	if (argc >= 2) {
+		for (count = 1; count < argc; count++) {
+			if (strchr("-/", argv[count][0]) != NULL) {
+				for (scan = argv[count] + 1; *scan != 0; scan++) {
+					flag_parse(&scan);
+				}
+			} else if (argv[count][0] == '?') {
+				show_logo();
+
+				if (!mads_mode) env_search_mode = ENV_SEARCH_CONCAT_FILES;
+				error_dump_file("*warn2.dat");
+				goto done;
+			}
+		}
+	}
+
+	if (report_version) {
+		show_version();
+		goto done;
+	}
+
+	if (fileio_exist("global.hag")) {
+		art_hags_are_on_hd = true;
+	} else {
+		art_hags_are_on_hd = false;
+	}
+
+	himem_startup();
+
+	himem_shutdown();
+
+	if (!mads_mode && (env_search_mode == ENV_SEARCH_MADS_PATH))
+		error("false start");
+
+	game_control();
+
+done:
+	global_unload_config_parameters();
+
+	if (fileio_exist("config.for")) {
+		global_write_config_file();
+	}
+	if (chain_flag && (win_status || force_chain) && (key_abort_level < 2)) {
+		warning("TODO: chain_execute");
+	} else {
+		if (win_status) {
+			debug("(Ending: %d)", win_status);
+		}
+	}
+}
+
+void nebular_main() {
+	static const char *CMD_LINE[] = { nullptr, "-p" };
+
+	pack_enable_pfab_explode();
+	if (!env_verify())
+		env_search_mode = ENV_SEARCH_CONCAT_FILES;
+
+	if (ConfMan.getBool("start_game") || ConfMan.hasKey("save_slot"))
+		selected_item = 0;
+	else if (ConfMan.getBool("start_intro"))
+		selected_item = 3;
+	else
+		selected_item = -1;
+
+	while (!g_engine->shouldQuit()) {
+		g_engine->getScreen()->clear();
+
+		switch (selected_item) {
+		case -1:
+			main_menu_main();
+			break;
+
+		case 0:
+			game_main(2, CMD_LINE);
+			return;
+
+		case 1: {
+			// Resume savegame
+			// Get a list of saves and choose the last one
+			auto saves = g_engine->listSaves();
+			if (!saves.empty())
+				savegame_slot = saves.back().getSaveSlot();
+
+			// Start the game, which will also load the selected savegame
+			game_main(2, CMD_LINE);
+			return;
+		}
+
+		case 2:
+			// Restore savegame
+			game_restore_flag = 2;
+			game_main(2, CMD_LINE);
+			return;
+
+		case 3:
+			AnimView::animview_main("@dragon");
+			selected_item = -1;
+			break;
+
+		case 4:
+			// Exit
+			return;
+
+		default:
+			// Credits
+			TextView::textview_main("credits");
+			selected_item = -1;
+			break;
+		}
+	}
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/main.h b/engines/mads/madsv2/nebular/main.h
new file mode 100644
index 00000000000..dae4bde91be
--- /dev/null
+++ b/engines/mads/madsv2/nebular/main.h
@@ -0,0 +1,37 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MAIN_H
+#define MADS_NEBULAR_MAIN_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+extern void nebular_main();
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/main_menu.cpp b/engines/mads/madsv2/nebular/main_menu.cpp
new file mode 100644
index 00000000000..e0d14a0074c
--- /dev/null
+++ b/engines/mads/madsv2/nebular/main_menu.cpp
@@ -0,0 +1,71 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/engine.h"
+#include "mads/madsv2/core/general.h"
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/font.h"
+#include "mads/madsv2/core/speech.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/sprite.h"
+#include "mads/madsv2/core/error.h"
+#include "mads/madsv2/core/room.h"
+#include "mads/madsv2/core/fileio.h"
+#include "mads/madsv2/core/env.h"
+#include "mads/madsv2/core/buffer.h"
+#include "mads/madsv2/core/mem.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/timer.h"
+#include "mads/madsv2/core/mcga.h"
+#include "mads/madsv2/core/cycle.h"
+#include "mads/madsv2/core/mouse.h"
+#include "mads/madsv2/core/screen.h"
+#include "mads/madsv2/core/video.h"
+#include "mads/madsv2/core/lib.h"
+#include "mads/madsv2/core/keys.h"
+#include "mads/madsv2/core/sound.h"
+#include "mads/madsv2/core/btype.h"
+#include "mads/madsv2/core/hspot.h"
+#include "mads/madsv2/core/magic.h"
+#include "mads/madsv2/core/ems.h"
+#include "mads/madsv2/core/xms.h"
+#include "mads/madsv2/core/imath.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/pack.h"
+#include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/nebular/main_menu.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+bool new_background;
+int selected_item;
+
+void menu_control() {
+	// TODO
+	selected_item = 0;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/main_menu.h b/engines/mads/madsv2/nebular/main_menu.h
new file mode 100644
index 00000000000..587f0db14f1
--- /dev/null
+++ b/engines/mads/madsv2/nebular/main_menu.h
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MAIN_MENU_H
+#define MADS_NEBULAR_MAIN_MENU_H
+
+#include "common/str.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+#define COMMAND_LINE_MAX        10
+
+#define FRAME_RATE              1
+#define MENU_FRAME_RATE         3
+
+#define NUM_MENU_ITEMS          6
+
+#define MENU_APPEARING          0
+#define MENU_ACCEPTING_COMMANDS 1
+#define MENU_DISAPPEARING       2
+
+#define MENU_HIGH_SPRITE        15
+
+typedef struct {
+	int handle;           /* Sprite series handle */
+	int active;           /* Menu item is active  */
+	int status;           /* Current status       */
+} MenuItem;
+
+extern bool new_background;
+extern int selected_item;
+
+extern void menu_control();
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 4b946522a69..c669c87df22 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -37,15 +37,8 @@
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/main.h"
 #include "mads/madsv2/nebular/sound_nebular.h"
-#include "mads/madsv2/nebular/rooms/section1.h"
-#include "mads/madsv2/nebular/rooms/section2.h"
-#include "mads/madsv2/nebular/rooms/section3.h"
-#include "mads/madsv2/nebular/rooms/section4.h"
-#include "mads/madsv2/nebular/rooms/section5.h"
-#include "mads/madsv2/nebular/rooms/section6.h"
-#include "mads/madsv2/nebular/rooms/section7.h"
-#include "mads/madsv2/nebular/rooms/section8.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -71,7 +64,7 @@ Common::Error RexNebularEngine::run() {
 	_soundManager->validate();
 
 	// Run the game
-//	RexNebular::dragonsphere_main();
+		RexNebular::nebular_main();
 
 	return Common::kNoError;
 }
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 191c1e80fb4..300d20d12c6 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -72,6 +72,8 @@ MODULE_OBJS += \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
 	madsv2/nebular/global.o \
+	madsv2/nebular/main.o \
+	madsv2/nebular/main_menu.o \
 	madsv2/nebular/asound.o \
 	madsv2/nebular/sound_nebular.o \
 	madsv2/nebular/mads/mads.o \


Commit: 99ed64c155a425636913066e8e3c9f5bcc84110c
    https://github.com/scummvm/scummvm/commit/99ed64c155a425636913066e8e3c9f5bcc84110c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:49+10:00

Commit Message:
MADS: NEBULAR: Hooking up room creation

Changed paths:
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/nebular/global.cpp
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/rooms/room112.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp
    engines/mads/madsv2/nebular/rooms/room215.cpp
    engines/mads/madsv2/nebular/rooms/room354.cpp
    engines/mads/madsv2/nebular/rooms/section1.cpp
    engines/mads/madsv2/nebular/rooms/section2.cpp
    engines/mads/madsv2/nebular/rooms/section3.cpp
    engines/mads/madsv2/nebular/rooms/section4.cpp
    engines/mads/madsv2/nebular/rooms/section5.cpp
    engines/mads/madsv2/nebular/rooms/section6.cpp
    engines/mads/madsv2/nebular/rooms/section7.cpp
    engines/mads/madsv2/nebular/rooms/section8.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index 3bec5e720da..d28f5cd9e73 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -481,7 +481,7 @@ extern void kernel_flip_hotspot_loc(int vocab_code, int active, int x, int y);
 extern Sequence sequence_list[KERNEL_MAX_SEQUENCES];
 extern void kernel_seq_init();
 extern void kernel_seq_correction(long old_clock, long new_clock);
-extern void kernel_seq_copy_timeout(int old_sequence_id, int new_sequence_id);
+extern void kernel_seq_timeout(int old_sequence_id, int new_sequence_id);
 extern int kernel_seq_add(int series_id, int mirror, int initial_sprite,
 	int low_sprite, int high_sprite, int loop_mode, int loop_direction,
 	int depth, int scale, int auto_locating, int x, int y,
diff --git a/engines/mads/madsv2/nebular/global.cpp b/engines/mads/madsv2/nebular/global.cpp
index 402d6aa4bab..1d644dd2a97 100644
--- a/engines/mads/madsv2/nebular/global.cpp
+++ b/engines/mads/madsv2/nebular/global.cpp
@@ -20,8 +20,14 @@
  */
 
 #include "mads/madsv2/nebular/global.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/imath.h"
+#include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/object.h"
+#include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/error.h"
 
 namespace MADS {
@@ -40,9 +46,274 @@ extern void section_7_preload();
 extern void section_8_preload();
 
 extern void room_101_synchronize(Common::Serializer &s);
+extern void room_101_synchronize(Common::Serializer &s);
+extern void room_102_synchronize(Common::Serializer &s);
+extern void room_103_synchronize(Common::Serializer &s);
+extern void room_104_synchronize(Common::Serializer &s);
+extern void room_105_synchronize(Common::Serializer &s);
+extern void room_106_synchronize(Common::Serializer &s);
+extern void room_107_synchronize(Common::Serializer &s);
+extern void room_108_synchronize(Common::Serializer &s);
+extern void room_109_synchronize(Common::Serializer &s);
+extern void room_110_synchronize(Common::Serializer &s);
+extern void room_111_synchronize(Common::Serializer &s);
+extern void room_112_synchronize(Common::Serializer &s);
+extern void room_201_synchronize(Common::Serializer &s);
+extern void room_202_synchronize(Common::Serializer &s);
+extern void room_203_synchronize(Common::Serializer &s);
+extern void room_205_synchronize(Common::Serializer &s);
+extern void room_207_synchronize(Common::Serializer &s);
+extern void room_208_synchronize(Common::Serializer &s);
+extern void room_209_synchronize(Common::Serializer &s);
+extern void room_210_synchronize(Common::Serializer &s);
+extern void room_211_synchronize(Common::Serializer &s);
+extern void room_212_synchronize(Common::Serializer &s);
+extern void room_213_synchronize(Common::Serializer &s);
+extern void room_214_synchronize(Common::Serializer &s);
+extern void room_215_synchronize(Common::Serializer &s);
+extern void room_216_synchronize(Common::Serializer &s);
+extern void room_301_synchronize(Common::Serializer &s);
+extern void room_302_synchronize(Common::Serializer &s);
+extern void room_303_synchronize(Common::Serializer &s);
+extern void room_304_synchronize(Common::Serializer &s);
+extern void room_307_synchronize(Common::Serializer &s);
+extern void room_308_synchronize(Common::Serializer &s);
+extern void room_309_synchronize(Common::Serializer &s);
+extern void room_310_synchronize(Common::Serializer &s);
+extern void room_311_synchronize(Common::Serializer &s);
+extern void room_313_synchronize(Common::Serializer &s);
+extern void room_316_synchronize(Common::Serializer &s);
+extern void room_318_synchronize(Common::Serializer &s);
+extern void room_319_synchronize(Common::Serializer &s);
+extern void room_320_synchronize(Common::Serializer &s);
+extern void room_321_synchronize(Common::Serializer &s);
+extern void room_322_synchronize(Common::Serializer &s);
+extern void room_351_synchronize(Common::Serializer &s);
+extern void room_352_synchronize(Common::Serializer &s);
+extern void room_353_synchronize(Common::Serializer &s);
+extern void room_354_synchronize(Common::Serializer &s);
+extern void room_357_synchronize(Common::Serializer &s);
+extern void room_358_synchronize(Common::Serializer &s);
+extern void room_359_synchronize(Common::Serializer &s);
+extern void room_360_synchronize(Common::Serializer &s);
+extern void room_361_synchronize(Common::Serializer &s);
+extern void room_366_synchronize(Common::Serializer &s);
+extern void room_387_synchronize(Common::Serializer &s);
+extern void room_388_synchronize(Common::Serializer &s);
+extern void room_389_synchronize(Common::Serializer &s);
+extern void room_390_synchronize(Common::Serializer &s);
+extern void room_391_synchronize(Common::Serializer &s);
+extern void room_399_synchronize(Common::Serializer &s);
+extern void room_401_synchronize(Common::Serializer &s);
+extern void room_402_synchronize(Common::Serializer &s);
+extern void room_405_synchronize(Common::Serializer &s);
+extern void room_406_synchronize(Common::Serializer &s);
+extern void room_407_synchronize(Common::Serializer &s);
+extern void room_408_synchronize(Common::Serializer &s);
+extern void room_409_synchronize(Common::Serializer &s);
+extern void room_410_synchronize(Common::Serializer &s);
+extern void room_411_synchronize(Common::Serializer &s);
+extern void room_413_synchronize(Common::Serializer &s);
+extern void room_501_synchronize(Common::Serializer &s);
+extern void room_502_synchronize(Common::Serializer &s);
+extern void room_503_synchronize(Common::Serializer &s);
+extern void room_504_synchronize(Common::Serializer &s);
+extern void room_505_synchronize(Common::Serializer &s);
+extern void room_506_synchronize(Common::Serializer &s);
+extern void room_507_synchronize(Common::Serializer &s);
+extern void room_508_synchronize(Common::Serializer &s);
+extern void room_511_synchronize(Common::Serializer &s);
+extern void room_512_synchronize(Common::Serializer &s);
+extern void room_513_synchronize(Common::Serializer &s);
+extern void room_515_synchronize(Common::Serializer &s);
+extern void room_551_synchronize(Common::Serializer &s);
+extern void room_601_synchronize(Common::Serializer &s);
+extern void room_602_synchronize(Common::Serializer &s);
+extern void room_603_synchronize(Common::Serializer &s);
+extern void room_604_synchronize(Common::Serializer &s);
+extern void room_605_synchronize(Common::Serializer &s);
+extern void room_607_synchronize(Common::Serializer &s);
+extern void room_608_synchronize(Common::Serializer &s);
+extern void room_609_synchronize(Common::Serializer &s);
+extern void room_610_synchronize(Common::Serializer &s);
+extern void room_611_synchronize(Common::Serializer &s);
+extern void room_612_synchronize(Common::Serializer &s);
+extern void room_620_synchronize(Common::Serializer &s);
+extern void room_701_synchronize(Common::Serializer &s);
+extern void room_702_synchronize(Common::Serializer &s);
+extern void room_703_synchronize(Common::Serializer &s);
+extern void room_704_synchronize(Common::Serializer &s);
+extern void room_705_synchronize(Common::Serializer &s);
+extern void room_706_synchronize(Common::Serializer &s);
+extern void room_707_synchronize(Common::Serializer &s);
+extern void room_710_synchronize(Common::Serializer &s);
+extern void room_711_synchronize(Common::Serializer &s);
+extern void room_751_synchronize(Common::Serializer &s);
+extern void room_752_synchronize(Common::Serializer &s);
+extern void room_801_synchronize(Common::Serializer &s);
+extern void room_802_synchronize(Common::Serializer &s);
+extern void room_803_synchronize(Common::Serializer &s);
+extern void room_804_synchronize(Common::Serializer &s);
+extern void room_805_synchronize(Common::Serializer &s);
+extern void room_807_synchronize(Common::Serializer &s);
+extern void room_808_synchronize(Common::Serializer &s);
+extern void room_810_synchronize(Common::Serializer &s);
 
 } // namespace Rooms
 
+void global_init_code() {
+	for (int i = 0; i < 210; i++)
+		global[i] = 0;
+
+	global[kTalkInanimateCount]     = 8;
+	global[kMeteorologistStatus]    = 1;
+
+	global[kTurkeyExploded]         = 0;
+	global[kMedicineCabinetOpen]    = 0;
+	global[kWatchedViewScreen]      = 0;
+	global[kWaterInAPuddle]         = 0;
+	global[kLadderBroken]           = 0;
+	global[kBone202Status]          = 0;
+	global[kRhotundaStatus]         = 0;
+	global[kMonkeyStatus]           = 0;
+	global[kMeteorologistEverSeen]  = 0;
+	global[kMeteorologistWatch]     = 0;
+	global[kTeleporterCommand]      = 0;
+	global[kTeleporterUnderstood]   = 0;
+	global[kTwinklesStatus]         = 0;
+	global[kTwinklesApproached]     = 0;
+	global[kAfterHavoc]             = 0;
+	global[kKickedIn391Grate]       = 0;
+
+	global[kNeedToStandUp]          = -1;
+	global[kMedicineCabinetVirgin]  = -1;
+	global[kHoovicAlive]            = -1;
+	global[kFishIn105]              = -1;
+	global[kFishIn107]              = -1;
+	global[kFishIn108]              = -1;
+	global[kBadFirstIngredient]     = -1;
+
+	object_set_quality(OBJ_CHARGE_CASES, 3, 0);
+
+	global[kHasPurchased]           = 0;
+	global[kBeenThruHelgaScene]     = 0;
+	global[kNextIngredient]         = 0;
+	global[kHasSaidTimer]           = 0;
+	global[kHasSaidBinocs]          = 0;
+	global[kBottleDisplayed]        = 0;
+	global[kHasBeenScanned]         = 0;
+	global[kSomeoneHasExploded]     = 0;
+
+	// Fill kIngredientList[0..3] with 4 unique random values in [0, 3]
+	for (int index = 0; index < 4; ) {
+		global[kIngredientList + index] = imath_random(0, 3);
+		int flag = 0;
+		for (int idx2 = 0; idx2 < index; idx2++) {
+			if (global[kIngredientList + idx2] == global[kIngredientList + index])
+				flag = -1;
+		}
+		if (!flag)
+			index++;
+	}
+
+	// Fill kIngredientQuantity[0..3] with 4 unique random values in [0, 3]
+	for (int index = 0; index < 4; ) {
+		global[kIngredientQuantity + index] = imath_random(0, 3);
+		int flag = 0;
+		for (int idx2 = 0; idx2 < index; idx2++) {
+			if (global[kIngredientQuantity + idx2] == global[kIngredientQuantity + index])
+				flag = -1;
+		}
+		if (!flag)
+			index++;
+	}
+
+	global[kHoverCarLocation]       = 501;
+	global[kHoverCarDestination]    = -1;
+	global[kBoatRaised]             = -1;
+	global[kLineStatus]             = 1;
+	global[kHandsetCellStatus]      = 4;
+	global[kCityFlooded]            = 0;
+	global[kLaserHoleIsThere]       = 0;
+	global[kHasTalkedToHermit]      = 0;
+	global[kTimebombStatus]         = 0;
+	global[kTimebombClock + 1]      = 0;
+	global[kTimebombClock]          = 0;
+	global[kTimebombTimer + 1]      = 0;
+	global[kTimebombTimer]          = 0;
+
+	global[kTeleporterRoom + 0]     = 201;
+	global[kTeleporterRoom + 1]     = 301;
+	global[kTeleporterRoom + 2]     = 413;
+	global[kTeleporterRoom + 3]     = 706;
+	global[kTeleporterRoom + 4]     = 801;
+	global[kTeleporterRoom + 5]     = 551;
+	global[kTeleporterRoom + 6]     = 752;
+
+	global[kWarnedFloodCity]        = 0;
+	global[kBottleStatus]           = 0;
+	global[kBoatStatus]             = 0;
+	global[kWindowFixed]            = 0;
+	global[kInSpace]                = 0;
+	global[kReturnFromCut]          = 0;
+	global[kBeamIsUp]               = 0;
+	global[kForceBeamDown]          = 0;
+	global[kCameFromCut]            = 0;
+	global[kDontRepeat]             = 0;
+	global[kHoppyDead]              = 0;
+	global[kHasWatchedAntigrav]     = 0;
+	global[kRemoteSequenceRan]      = 0;
+	global[kRemoteOnGround]         = 0;
+	global[kFromCockpit]            = 0;
+	global[kExitShip]               = 0;
+	global[kBetweenRooms]           = 0;
+	global[kTopButtonPushed]        = 0;
+	global[kShieldModInstalled]     = 0;
+	global[kTargetModInstalled]     = 0;
+	global[kUpBecauseOfRemote]      = 0;
+	global[kTeleporterRoom + 7]     = 0;
+	global[kTeleporterRoom + 8]     = 0;
+	global[kTeleporterRoom + 9]     = 0;
+
+	// Fill kTeleporterCode[0..9] with 10 unique random values in [0, 9999]
+	for (int index = 0; index < 10; ) {
+		global[kTeleporterCode + index] = imath_random(0, 9999);
+		int flag = 0;
+		for (int idx2 = 0; idx2 < index; idx2++) {
+			if (global[kTeleporterCode + idx2] == global[kTeleporterCode + index])
+				flag = -1;
+		}
+		if (!flag)
+			index++;
+	}
+
+	switch (game.difficulty) {
+	case DIFFICULTY_HARD:
+		global[kLeavesStatus] = 0;
+		inter_move_object(OBJ_BLOWGUN, 1);
+		inter_move_object(OBJ_NOTE, 1);
+		global[kPenlightCellStatus] = 5;
+		global[kDurafailRecharged]  = 0;
+		break;
+	case DIFFICULTY_MEDIUM:
+		global[kLeavesStatus] = 0;
+		inter_move_object(OBJ_PLANT_STALK, 1);
+		global[kDurafailRecharged]  = -1;
+		global[kPenlightCellStatus] = 6;
+		break;
+	case DIFFICULTY_EASY:
+		global[kLeavesStatus] = 2;
+		inter_move_object(OBJ_PLANT_STALK, 1);
+		inter_move_object(OBJ_PENLIGHT, 1);
+		break;
+	}
+
+	player.facing          = FACING_NORTH;
+	player.turn_to_facing  = FACING_NORTH;
+	player_himem_preload(player.series_name, 1);
+	player_himem_preload("ROX", 1);
+}
+
 void global_section_constructor() {
 	section_preload_code_pointer = NULL;
 	section_room_constructor = NULL;
@@ -88,7 +359,118 @@ void global_section_constructor() {
 
 void sync_room(Common::Serializer &s) {
 	switch (new_room) {
-	case 101: Rooms::room_101_synchronize(s); break;
+	case 101: Rooms::room_101_synchronize(s);
+	case 102: Rooms::room_102_synchronize(s);
+	case 103: Rooms::room_103_synchronize(s);
+	case 104: Rooms::room_104_synchronize(s);
+	case 105: Rooms::room_105_synchronize(s);
+	case 106: Rooms::room_106_synchronize(s);
+	case 107: Rooms::room_107_synchronize(s);
+	case 108: Rooms::room_108_synchronize(s);
+	case 109: Rooms::room_109_synchronize(s);
+	case 110: Rooms::room_110_synchronize(s);
+	case 111: Rooms::room_111_synchronize(s);
+	case 112: Rooms::room_112_synchronize(s);
+	case 201: Rooms::room_201_synchronize(s);
+	case 202: Rooms::room_202_synchronize(s);
+	case 203: Rooms::room_203_synchronize(s);
+	case 205: Rooms::room_205_synchronize(s);
+	case 207: Rooms::room_207_synchronize(s);
+	case 208: Rooms::room_208_synchronize(s);
+	case 209: Rooms::room_209_synchronize(s);
+	case 210: Rooms::room_210_synchronize(s);
+	case 211: Rooms::room_211_synchronize(s);
+	case 212: Rooms::room_212_synchronize(s);
+	case 213: Rooms::room_213_synchronize(s);
+	case 214: Rooms::room_214_synchronize(s);
+	case 215: Rooms::room_215_synchronize(s);
+	case 216: Rooms::room_216_synchronize(s);
+	case 301: Rooms::room_301_synchronize(s);
+	case 302: Rooms::room_302_synchronize(s);
+	case 303: Rooms::room_303_synchronize(s);
+	case 304: Rooms::room_304_synchronize(s);
+	case 307: Rooms::room_307_synchronize(s);
+	case 308: Rooms::room_308_synchronize(s);
+	case 309: Rooms::room_309_synchronize(s);
+	case 310: Rooms::room_310_synchronize(s);
+	case 311: Rooms::room_311_synchronize(s);
+	case 313: Rooms::room_313_synchronize(s);
+	case 316: Rooms::room_316_synchronize(s);
+	case 318: Rooms::room_318_synchronize(s);
+	case 319: Rooms::room_319_synchronize(s);
+	case 320: Rooms::room_320_synchronize(s);
+	case 321: Rooms::room_321_synchronize(s);
+	case 322: Rooms::room_322_synchronize(s);
+	case 351: Rooms::room_351_synchronize(s);
+	case 352: Rooms::room_352_synchronize(s);
+	case 353: Rooms::room_353_synchronize(s);
+	case 354: Rooms::room_354_synchronize(s);
+	case 357: Rooms::room_357_synchronize(s);
+	case 358: Rooms::room_358_synchronize(s);
+	case 359: Rooms::room_359_synchronize(s);
+	case 360: Rooms::room_360_synchronize(s);
+	case 361: Rooms::room_361_synchronize(s);
+	case 366: Rooms::room_366_synchronize(s);
+	case 387: Rooms::room_387_synchronize(s);
+	case 388: Rooms::room_388_synchronize(s);
+	case 389: Rooms::room_389_synchronize(s);
+	case 390: Rooms::room_390_synchronize(s);
+	case 391: Rooms::room_391_synchronize(s);
+	case 399: Rooms::room_399_synchronize(s);
+	case 401: Rooms::room_401_synchronize(s);
+	case 402: Rooms::room_402_synchronize(s);
+	case 405: Rooms::room_405_synchronize(s);
+	case 406: Rooms::room_406_synchronize(s);
+	case 407: Rooms::room_407_synchronize(s);
+	case 408: Rooms::room_408_synchronize(s);
+	case 409: Rooms::room_409_synchronize(s);
+	case 410: Rooms::room_410_synchronize(s);
+	case 411: Rooms::room_411_synchronize(s);
+	case 413: Rooms::room_413_synchronize(s);
+	case 501: Rooms::room_501_synchronize(s);
+	case 502: Rooms::room_502_synchronize(s);
+	case 503: Rooms::room_503_synchronize(s);
+	case 504: Rooms::room_504_synchronize(s);
+	case 505: Rooms::room_505_synchronize(s);
+	case 506: Rooms::room_506_synchronize(s);
+	case 507: Rooms::room_507_synchronize(s);
+	case 508: Rooms::room_508_synchronize(s);
+	case 511: Rooms::room_511_synchronize(s);
+	case 512: Rooms::room_512_synchronize(s);
+	case 513: Rooms::room_513_synchronize(s);
+	case 515: Rooms::room_515_synchronize(s);
+	case 551: Rooms::room_551_synchronize(s);
+	case 601: Rooms::room_601_synchronize(s);
+	case 602: Rooms::room_602_synchronize(s);
+	case 603: Rooms::room_603_synchronize(s);
+	case 604: Rooms::room_604_synchronize(s);
+	case 605: Rooms::room_605_synchronize(s);
+	case 607: Rooms::room_607_synchronize(s);
+	case 608: Rooms::room_608_synchronize(s);
+	case 609: Rooms::room_609_synchronize(s);
+	case 610: Rooms::room_610_synchronize(s);
+	case 611: Rooms::room_611_synchronize(s);
+	case 612: Rooms::room_612_synchronize(s);
+	case 620: Rooms::room_620_synchronize(s);
+	case 701: Rooms::room_701_synchronize(s);
+	case 702: Rooms::room_702_synchronize(s);
+	case 703: Rooms::room_703_synchronize(s);
+	case 704: Rooms::room_704_synchronize(s);
+	case 705: Rooms::room_705_synchronize(s);
+	case 706: Rooms::room_706_synchronize(s);
+	case 707: Rooms::room_707_synchronize(s);
+	case 710: Rooms::room_710_synchronize(s);
+	case 711: Rooms::room_711_synchronize(s);
+	case 751: Rooms::room_751_synchronize(s);
+	case 752: Rooms::room_752_synchronize(s);
+	case 801: Rooms::room_801_synchronize(s);
+	case 802: Rooms::room_802_synchronize(s);
+	case 803: Rooms::room_803_synchronize(s);
+	case 804: Rooms::room_804_synchronize(s);
+	case 805: Rooms::room_805_synchronize(s);
+	case 807: Rooms::room_807_synchronize(s);
+	case 808: Rooms::room_808_synchronize(s);
+	case 810: Rooms::room_810_synchronize(s);
 	default: break;
 	}
 }
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index f8270426745..068107b0b9b 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -329,6 +329,7 @@ enum {
 
 #define INDEFINITE_TIMEOUT 9999999
 
+extern void global_init_code();
 extern void global_section_constructor();
 extern void sync_room(Common::Serializer &s);
 
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index c669c87df22..a01b00193eb 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -37,8 +37,17 @@
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/main.h"
 #include "mads/madsv2/nebular/sound_nebular.h"
+#include "mads/madsv2/nebular/rooms/section1.h"
+#include "mads/madsv2/nebular/rooms/section2.h"
+#include "mads/madsv2/nebular/rooms/section3.h"
+#include "mads/madsv2/nebular/rooms/section4.h"
+#include "mads/madsv2/nebular/rooms/section5.h"
+#include "mads/madsv2/nebular/rooms/section6.h"
+#include "mads/madsv2/nebular/rooms/section7.h"
+#include "mads/madsv2/nebular/rooms/section8.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -70,22 +79,28 @@ Common::Error RexNebularEngine::run() {
 }
 
 void RexNebularEngine::global_init_code() {
-	int count;
-
-	for (count = 0; count < GLOBAL_LIST_SIZE; count++)
-		global[count] = 0;
+	RexNebular::global_init_code();
 }
 
 void RexNebularEngine::section_music(int section_num) {
-	
+	switch (section_num) {
+	case 1: Rooms::section_1_music(); break;
+	case 2: Rooms::section_2_music(); break;
+	case 3: Rooms::section_3_music(); break;
+	case 4: Rooms::section_4_music(); break;
+	case 5: Rooms::section_5_music(); break;
+	case 6: Rooms::section_6_music(); break;
+	case 7: Rooms::section_7_music(); break;
+	case 8: Rooms::section_8_music(); break;
+	}
 }
 
 void RexNebularEngine::global_section_constructor() {
-	
+	RexNebular::global_section_constructor();
 }
 
 void RexNebularEngine::syncRoom(Common::Serializer &s) {
-	
+	RexNebular::sync_room(s);
 }
 
 void RexNebularEngine::global_daemon_code() {
diff --git a/engines/mads/madsv2/nebular/rooms/room112.cpp b/engines/mads/madsv2/nebular/rooms/room112.cpp
index 05e08cb94af..00457e04f4f 100644
--- a/engines/mads/madsv2/nebular/rooms/room112.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room112.cpp
@@ -74,18 +74,12 @@ static void room_112_daemon() {
 	}
 }
 
-static void room_112_pre_parser() {
-	// No implementation
-}
-
-static void room_112_parser() {
+void room_112_synchronize(Common::Serializer &s) {
 	// No implementation
 }
 
 void room_112_preload() {
 	room_init_code_pointer = room_112_init;
-	room_pre_parser_code_pointer = room_112_pre_parser;
-	room_parser_code_pointer = room_112_parser;
 	room_daemon_code_pointer = room_112_daemon;
 
 	section_1_walker();
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index a592066467c..7a83e42ff51 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -88,6 +88,10 @@ static void room_213_parser() {
 	_action._inProgress = false;
 }
 
+void room_213_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
 void room_213_preload() {
 	room_init_code_pointer = room_213_init;
 	room_parser_code_pointer = room_213_parser;
diff --git a/engines/mads/madsv2/nebular/rooms/room215.cpp b/engines/mads/madsv2/nebular/rooms/room215.cpp
index e1b93f66999..4348b9a8f39 100644
--- a/engines/mads/madsv2/nebular/rooms/room215.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room215.cpp
@@ -149,6 +149,10 @@ static void room_215_parser() {
 	_action._inProgress = false;
 }
 
+void room_215_synchronize(Common::Serializer &s) {
+	// No implementation
+}
+
 void room_215_preload() {
 	room_init_code_pointer = room_215_init;
 	room_parser_code_pointer = room_215_parser;
diff --git a/engines/mads/madsv2/nebular/rooms/room354.cpp b/engines/mads/madsv2/nebular/rooms/room354.cpp
index 06c85d58c6d..c641ba0de86 100644
--- a/engines/mads/madsv2/nebular/rooms/room354.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room354.cpp
@@ -38,6 +38,65 @@ struct Scratch {
 
 static Scratch local;
 
+static void room_354_init() {
+	_globals[kAfterHavoc] = true;
+	_globals[kTeleporterRoom + 1] = 351;
+
+	if (_scene->_priorSceneId == 361)
+		_game._player._playerPos = Common::Point(231, 110);
+	else if (_scene->_priorSceneId == 401) {
+		_game._player._playerPos = Common::Point(106, 152);
+		_game._player._facing = FACING_NORTH;
+	} else if (_scene->_priorSceneId == 316)
+		_game._player._playerPos = Common::Point(71, 107);
+	else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
+		_game._player._playerPos = Common::Point(167, 57);
+
+	section_3_music();
+}
+
+static void room_354_pre_parser() {
+	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+		_game._player._walkOffScreenSceneId = 401;
+}
+
+static void room_354_parser() {
+	if (_action._lookFlag)
+		_vm->_dialogs->show(35414);
+	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+		_game._player.startWalking(Common::Point(208, 0), FACING_NORTHEAST);
+		_game._player._walkOffScreenSceneId = 353;
+	} else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+		_scene->_nextSceneId = 361;
+	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+		_scene->_nextSceneId = 316;
+	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+		_scene->_nextSceneId = 401;
+	else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS))
+		_vm->_dialogs->show(35410);
+	else if (_action.isAction(VERB_LOOK, NOUN_SIGNAL))
+		_vm->_dialogs->show(35411);
+	else if (_action.isAction(VERB_LOOK, NOUN_CATWALK))
+		_vm->_dialogs->show(35412);
+	else if (_action.isAction(VERB_LOOK, NOUN_AIR_DUCT))
+		_vm->_dialogs->show(35413);
+	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+		_vm->_dialogs->show(35415);
+	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+		_vm->_dialogs->show(35416);
+	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+		_vm->_dialogs->show(35417);
+	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+		_vm->_dialogs->show(35418);
+	else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+		_vm->_dialogs->show(35419);
+	else if (_action.isAction(VERB_LOOK, NOUN_GUARD))
+		_vm->_dialogs->show(35420);
+	else
+		return;
+
+	_action._inProgress = false;
+}
 
 void room_354_synchronize(Common::Serializer &s) {
 	// No implementation
@@ -47,7 +106,6 @@ void room_354_preload() {
 	room_init_code_pointer = room_354_init;
 	room_pre_parser_code_pointer = room_354_pre_parser;
 	room_parser_code_pointer = room_354_parser;
-	room_daemon_code_pointer = room_354_daemon;
 
 	section_3_walker();
 	section_3_interface();
diff --git a/engines/mads/madsv2/nebular/rooms/section1.cpp b/engines/mads/madsv2/nebular/rooms/section1.cpp
index c1dd11297e6..73af428fc61 100644
--- a/engines/mads/madsv2/nebular/rooms/section1.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section1.cpp
@@ -19,7 +19,6 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "math/utils.h"
 #include "mads/madsv2/core/config.h"
 #include "mads/madsv2/nebular/nebular.h"
@@ -31,11 +30,108 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
+extern void room_101_preload();
+extern void room_102_preload();
+extern void room_103_preload();
+extern void room_104_preload();
+extern void room_105_preload();
+extern void room_106_preload();
+extern void room_107_preload();
+extern void room_108_preload();
+extern void room_109_preload();
+extern void room_110_preload();
+extern void room_111_preload();
+extern void room_112_preload();
+
+void section_1_walker() {
+	_vm->_sound->command(5);
+	Common::String oldName = _game._player._spritesPrefix;
+	if (_scene->_nextSceneId <= 103 || _scene->_nextSceneId == 111) {
+		if (_globals[kSexOfRex] == SEX_FEMALE)
+			Common::strcpy_s(player.series_name, "ROX");
+		else {
+			Common::strcpy_s(player.series_name, "RXM");
+			_globals[kSexOfRex] = SEX_MALE;
+		}
+	} else if (_scene->_nextSceneId <= 110) {
+		Common::strcpy_s(player.series_name, "RXSW");
+		_globals[kSexOfRex] = SEX_UNKNOWN;
+	} else if (_scene->_nextSceneId == 112)
+		Common::strcpy_s(player.series_name, "");
+
+	if (oldName != _game._player._spritesPrefix)
+		_game._player._spritesChanged = true;
+
+	if (_scene->_nextSceneId == 105 || (_scene->_nextSceneId == 109 && _globals[kHoovicAlive])) {
+		_game._player._spritesChanged = true;
+		_game._player._loadsFirst = false;
+	}
+
+	player.scaling_velocity = 0;
+	_vm->_palette->setEntry(16, 10, 63, 63);
+	_vm->_palette->setEntry(17, 10, 45, 45);
+}
+
 void section_1_interface() {
 	int idx = (_scene->_nextSceneId > 103 && _scene->_nextSceneId < 112) ? 1 : 0;
 	Common::strcpy_s(kernel.interface, kernel_interface_name(idx));
 }
 
+void section_1_init() {
+	player.scaling_velocity = true;
+}
+
+void section_1_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 101:
+		room_preload_code_pointer = room_101_preload;
+		break;
+	case 102:
+		room_preload_code_pointer = room_102_preload;
+		break;
+	case 103:
+		room_preload_code_pointer = room_103_preload;
+		break;
+	case 104:
+		room_preload_code_pointer = room_104_preload;
+		break;
+	case 105:
+		room_preload_code_pointer = room_105_preload;
+		break;
+	case 106:
+		room_preload_code_pointer = room_106_preload;
+		break;
+	case 107:
+		room_preload_code_pointer = room_107_preload;
+		break;
+	case 108:
+		room_preload_code_pointer = room_108_preload;
+		break;
+	case 109:
+		room_preload_code_pointer = room_109_preload;
+		break;
+	case 110:
+		room_preload_code_pointer = room_110_preload;
+		break;
+	case 111:
+		room_preload_code_pointer = room_111_preload;
+		break;
+	case 112:
+		room_preload_code_pointer = room_112_preload;
+		break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_1_music() {
 	if (config_file.music_flag) {
 		switch (_scene->_nextSceneId) {
@@ -69,33 +165,12 @@ void section_1_music() {
 	}
 }
 
-void section_1_walker() {
-	_vm->_sound->command(5);
-	Common::String oldName = _game._player._spritesPrefix;
-	if (_scene->_nextSceneId <= 103 || _scene->_nextSceneId == 111) {
-		if (_globals[kSexOfRex] == SEX_FEMALE)
-			Common::strcpy_s(player.series_name, "ROX");
-		else {
-			Common::strcpy_s(player.series_name, "RXM");
-			_globals[kSexOfRex] = SEX_MALE;
-		}
-	} else if (_scene->_nextSceneId <= 110) {
-		Common::strcpy_s(player.series_name, "RXSW");
-		_globals[kSexOfRex] = SEX_UNKNOWN;
-	} else if (_scene->_nextSceneId == 112)
-		Common::strcpy_s(player.series_name, "");
-
-	if (oldName != _game._player._spritesPrefix)
-		_game._player._spritesChanged = true;
-
-	if (_scene->_nextSceneId == 105 || (_scene->_nextSceneId == 109 && _globals[kHoovicAlive])) {
-		_game._player._spritesChanged = true;
-		_game._player._loadsFirst = false;
-	}
-
-	player.scaling_velocity = 0;
-	_vm->_palette->setEntry(16, 10, 63, 63);
-	_vm->_palette->setEntry(17, 10, 45, 45);
+void section_1_preload() {
+	section_init_code_pointer = section_1_init;
+	section_room_constructor = section_1_constructor;
+	section_music_reset_pointer = section_1_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/section2.cpp b/engines/mads/madsv2/nebular/rooms/section2.cpp
index 2fd7acf4926..d48c778effe 100644
--- a/engines/mads/madsv2/nebular/rooms/section2.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section2.cpp
@@ -19,7 +19,6 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "mads/nebular/nebular.h"
 #include "mads/nebular/core/scene.h"
 #include "mads/nebular/nebular_scenes.h"
@@ -31,10 +30,20 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void section_2_interface() {
-	int idx = (new_room == 216) ? 4 : 2;
-	Common::strcpy_s(kernel.interface, kernel_interface_name(idx));
-}
+extern void room_201_preload();
+extern void room_202_preload();
+extern void room_203_preload();
+extern void room_205_preload();
+extern void room_207_preload();
+extern void room_208_preload();
+extern void room_209_preload();
+extern void room_210_preload();
+extern void room_211_preload();
+extern void room_212_preload();
+extern void room_213_preload();
+extern void room_214_preload();
+extern void room_215_preload();
+extern void room_216_preload();
 
 void section_2_walker() {
 	_vm->_sound->command(5);
@@ -66,6 +75,72 @@ void section_2_walker() {
 	_vm->_palette->setEntry(17, 10, 45, 45);
 }
 
+void section_2_interface() {
+	int idx = (new_room == 216) ? 4 : 2;
+	Common::strcpy_s(kernel.interface, kernel_interface_name(idx));
+}
+
+void section_2_init() {
+	player.scaling_velocity = true;
+}
+
+void section_2_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 201:
+		room_preload_code_pointer = room_201_preload;
+		break;
+	case 202:
+		room_preload_code_pointer = room_202_preload;
+		break;
+	case 203:
+		room_preload_code_pointer = room_203_preload;
+		break;
+	case 205:
+		room_preload_code_pointer = room_205_preload;
+		break;
+	case 207:
+		room_preload_code_pointer = room_207_preload;
+		break;
+	case 208:
+		room_preload_code_pointer = room_208_preload;
+		break;
+	case 209:
+		room_preload_code_pointer = room_209_preload;
+		break;
+	case 210:
+		room_preload_code_pointer = room_210_preload;
+		break;
+	case 211:
+		room_preload_code_pointer = room_211_preload;
+		break;
+	case 212:
+		room_preload_code_pointer = room_212_preload;
+		break;
+	case 213:
+		room_preload_code_pointer = room_213_preload;
+		break;
+	case 214:
+		room_preload_code_pointer = room_214_preload;
+		break;
+	case 215:
+		room_preload_code_pointer = room_215_preload;
+		break;
+	case 216:
+		room_preload_code_pointer = room_216_preload;
+		break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_2_music() {
 	if (_vm->_musicFlag) {
 		switch (new_room) {
@@ -116,6 +191,14 @@ void section_2_music() {
 		_vm->_sound->command(2);
 }
 
+void section_2_preload() {
+	section_init_code_pointer = section_2_init;
+	section_room_constructor = section_2_constructor;
+	section_music_reset_pointer = section_2_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+}
+
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section3.cpp b/engines/mads/madsv2/nebular/rooms/section3.cpp
index 5583a2116f1..43b1940c543 100644
--- a/engines/mads/madsv2/nebular/rooms/section3.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section3.cpp
@@ -19,10 +19,10 @@
  *
  */
 
-#include "common/scummsys.h"
 #include "mads/madsv2/nebular/rooms/section3.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/pal.h"
@@ -34,9 +34,37 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void section_3_interface() {
-	Common::strcpy_s(kernel.interface, kernel_interface_name(4));
-}
+extern void room_301_preload();
+extern void room_302_preload();
+extern void room_303_preload();
+extern void room_304_preload();
+extern void room_307_preload();
+extern void room_308_preload();
+extern void room_309_preload();
+extern void room_310_preload();
+extern void room_311_preload();
+extern void room_313_preload();
+extern void room_316_preload();
+extern void room_318_preload();
+extern void room_319_preload();
+extern void room_320_preload();
+extern void room_321_preload();
+extern void room_322_preload();
+extern void room_351_preload();
+extern void room_352_preload();
+extern void room_353_preload();
+extern void room_357_preload();
+extern void room_358_preload();
+extern void room_359_preload();
+extern void room_360_preload();
+extern void room_361_preload();
+extern void room_366_preload();
+extern void room_387_preload();
+extern void room_388_preload();
+extern void room_389_preload();
+extern void room_390_preload();
+extern void room_391_preload();
+extern void room_399_preload();
 
 void section_3_walker() {
 	g_engine->_soundManager->command(5);
@@ -63,6 +91,65 @@ void section_3_walker() {
 	pal_change_color(17, 10, 45, 45);
 }
 
+void section_3_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(4));
+}
+
+void section_3_pre_parser() {
+	player.need_to_walk = false;
+}
+
+void section_3_init() {
+	player.scaling_velocity = true;
+}
+
+void section_3_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 301: room_preload_code_pointer = room_301_preload; break;
+	case 302: room_preload_code_pointer = room_302_preload; break;
+	case 303: room_preload_code_pointer = room_303_preload; break;
+	case 304: room_preload_code_pointer = room_304_preload; break;
+	case 307: room_preload_code_pointer = room_307_preload; break;
+	case 308: room_preload_code_pointer = room_308_preload; break;
+	case 309: room_preload_code_pointer = room_309_preload; break;
+	case 310: room_preload_code_pointer = room_310_preload; break;
+	case 311: room_preload_code_pointer = room_311_preload; break;
+	case 313: room_preload_code_pointer = room_313_preload; break;
+	case 316: room_preload_code_pointer = room_316_preload; break;
+	case 318: room_preload_code_pointer = room_318_preload; break;
+	case 319: room_preload_code_pointer = room_319_preload; break;
+	case 320: room_preload_code_pointer = room_320_preload; break;
+	case 321: room_preload_code_pointer = room_321_preload; break;
+	case 322: room_preload_code_pointer = room_322_preload; break;
+	case 351: room_preload_code_pointer = room_351_preload; break;
+	case 352: room_preload_code_pointer = room_352_preload; break;
+	case 353: room_preload_code_pointer = room_353_preload; break;
+	case 357: room_preload_code_pointer = room_357_preload; break;
+	case 358: room_preload_code_pointer = room_358_preload; break;
+	case 359: room_preload_code_pointer = room_359_preload; break;
+	case 360: room_preload_code_pointer = room_360_preload; break;
+	case 361: room_preload_code_pointer = room_361_preload; break;
+	case 366: room_preload_code_pointer = room_366_preload; break;
+	case 387: room_preload_code_pointer = room_387_preload; break;
+	case 388: room_preload_code_pointer = room_388_preload; break;
+	case 389: room_preload_code_pointer = room_389_preload; break;
+	case 390: room_preload_code_pointer = room_390_preload; break;
+	case 391: room_preload_code_pointer = room_391_preload; break;
+	case 399: room_preload_code_pointer = room_399_preload; break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
+
 void section_3_music() {
 	if (!config_file.music_flag) {
 		g_engine->_soundManager->command(2);
@@ -129,8 +216,12 @@ void section_3_music() {
 	}
 }
 
-void section_3_pre_parser() {
-	player.need_to_walk = false;
+void section_3_preload() {
+	section_init_code_pointer = section_3_init;
+	section_room_constructor = section_3_constructor;
+	section_music_reset_pointer = section_3_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/section4.cpp b/engines/mads/madsv2/nebular/rooms/section4.cpp
index ddf74271533..fa6a51b4474 100644
--- a/engines/mads/madsv2/nebular/rooms/section4.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section4.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/pal.h"
@@ -33,9 +34,16 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void section_4_interface() {
-	Common::strcpy_s(kernel.interface, kernel_interface_name(4));
-}
+extern void room_401_preload();
+extern void room_402_preload();
+extern void room_405_preload();
+extern void room_406_preload();
+extern void room_407_preload();
+extern void room_408_preload();
+extern void room_409_preload();
+extern void room_410_preload();
+extern void room_411_preload();
+extern void room_413_preload();
 
 void section_4_walker() {
 	g_engine->_soundManager->command(5);
@@ -57,6 +65,39 @@ void section_4_walker() {
 	pal_change_color(17, 10, 45, 45);
 }
 
+void section_4_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(4));
+}
+
+void section_4_init() {
+	player.scaling_velocity = true;
+}
+
+void section_4_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 401: room_preload_code_pointer = room_401_preload; break;
+	case 402: room_preload_code_pointer = room_402_preload; break;
+	case 405: room_preload_code_pointer = room_405_preload; break;
+	case 406: room_preload_code_pointer = room_406_preload; break;
+	case 407: room_preload_code_pointer = room_407_preload; break;
+	case 408: room_preload_code_pointer = room_408_preload; break;
+	case 409: room_preload_code_pointer = room_409_preload; break;
+	case 410: room_preload_code_pointer = room_410_preload; break;
+	case 411: room_preload_code_pointer = room_411_preload; break;
+	case 413: room_preload_code_pointer = room_413_preload; break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_4_music() {
 	if (!config_file.music_flag) {
 		g_engine->_soundManager->command(2);
@@ -94,6 +135,14 @@ void section_4_music() {
 	}
 }
 
+void section_4_preload() {
+	section_init_code_pointer = section_4_init;
+	section_room_constructor = section_4_constructor;
+	section_music_reset_pointer = section_4_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+}
+
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section5.cpp b/engines/mads/madsv2/nebular/rooms/section5.cpp
index 82a4dc8e0e5..1057fe8871a 100644
--- a/engines/mads/madsv2/nebular/rooms/section5.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section5.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/pal.h"
@@ -33,10 +34,18 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-
-void section_5_interface() {
-	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
-}
+extern void room_501_preload();
+extern void room_502_preload();
+extern void room_503_preload();
+extern void room_504_preload();
+extern void room_505_preload();
+extern void room_506_preload();
+extern void room_507_preload();
+extern void room_508_preload();
+extern void room_511_preload();
+extern void room_513_preload();
+extern void room_515_preload();
+extern void room_551_preload();
 
 void section_5_walker() {
 	g_engine->_soundManager->command(5);
@@ -58,6 +67,41 @@ void section_5_walker() {
 	pal_change_color(17, 10, 45, 45);
 }
 
+void section_5_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
+}
+
+void section_5_init() {
+	player.scaling_velocity = true;
+}
+
+void section_5_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 501: room_preload_code_pointer = room_501_preload; break;
+	case 502: room_preload_code_pointer = room_502_preload; break;
+	case 503: room_preload_code_pointer = room_503_preload; break;
+	case 504: room_preload_code_pointer = room_504_preload; break;
+	case 505: room_preload_code_pointer = room_505_preload; break;
+	case 506: room_preload_code_pointer = room_506_preload; break;
+	case 507: room_preload_code_pointer = room_507_preload; break;
+	case 508: room_preload_code_pointer = room_508_preload; break;
+	case 511: room_preload_code_pointer = room_511_preload; break;
+	case 513: room_preload_code_pointer = room_513_preload; break;
+	case 515: room_preload_code_pointer = room_515_preload; break;
+	case 551: room_preload_code_pointer = room_551_preload; break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_5_music() {
 	if (!config_file.music_flag) {
 		g_engine->_soundManager->command(2);
@@ -90,6 +134,14 @@ void section_5_music() {
 	}
 }
 
+void section_5_preload() {
+	section_init_code_pointer = section_5_init;
+	section_room_constructor = section_5_constructor;
+	section_music_reset_pointer = section_5_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+}
+
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section6.cpp b/engines/mads/madsv2/nebular/rooms/section6.cpp
index 7db9cfdd8ec..f42a068e992 100644
--- a/engines/mads/madsv2/nebular/rooms/section6.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section6.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/pal.h"
@@ -33,9 +34,18 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void section_6_interface() {
-	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
-}
+extern void room_601_preload();
+extern void room_602_preload();
+extern void room_603_preload();
+extern void room_604_preload();
+extern void room_605_preload();
+extern void room_607_preload();
+extern void room_608_preload();
+extern void room_609_preload();
+extern void room_610_preload();
+extern void room_611_preload();
+extern void room_612_preload();
+extern void room_620_preload();
 
 void section_6_walker() {
 	g_engine->_soundManager->command(5);
@@ -56,6 +66,41 @@ void section_6_walker() {
 	pal_change_color(17, 10, 45, 45);
 }
 
+void section_6_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
+}
+
+void section_6_init() {
+	player.scaling_velocity = true;
+}
+
+void section_6_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 601: room_preload_code_pointer = room_601_preload; break;
+	case 602: room_preload_code_pointer = room_602_preload; break;
+	case 603: room_preload_code_pointer = room_603_preload; break;
+	case 604: room_preload_code_pointer = room_604_preload; break;
+	case 605: room_preload_code_pointer = room_605_preload; break;
+	case 607: room_preload_code_pointer = room_607_preload; break;
+	case 608: room_preload_code_pointer = room_608_preload; break;
+	case 609: room_preload_code_pointer = room_609_preload; break;
+	case 610: room_preload_code_pointer = room_610_preload; break;
+	case 611: room_preload_code_pointer = room_611_preload; break;
+	case 612: room_preload_code_pointer = room_612_preload; break;
+	case 620: room_preload_code_pointer = room_620_preload; break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_6_music() {
 	if (!config_file.music_flag) {
 		g_engine->_soundManager->command(2);
@@ -84,6 +129,14 @@ void section_6_music() {
 	}
 }
 
+void section_6_preload() {
+	section_init_code_pointer = section_6_init;
+	section_room_constructor = section_6_constructor;
+	section_music_reset_pointer = section_6_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+}
+
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section7.cpp b/engines/mads/madsv2/nebular/rooms/section7.cpp
index 2d867c85c1e..e4da8e7f30a 100644
--- a/engines/mads/madsv2/nebular/rooms/section7.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section7.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/pal.h"
@@ -33,9 +34,17 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void section_7_interface() {
-	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
-}
+extern void room_701_preload();
+extern void room_702_preload();
+extern void room_703_preload();
+extern void room_704_preload();
+extern void room_705_preload();
+extern void room_706_preload();
+extern void room_707_preload();
+extern void room_710_preload();
+extern void room_711_preload();
+extern void room_751_preload();
+extern void room_752_preload();
 
 void section_7_walker() {
 	g_engine->_soundManager->command(5);
@@ -59,6 +68,40 @@ void section_7_walker() {
 	pal_change_color(17, 10, 45, 45);
 }
 
+void section_7_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
+}
+
+void section_7_init() {
+	player.scaling_velocity = true;
+}
+
+void section_7_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 701: room_preload_code_pointer = room_701_preload; break;
+	case 702: room_preload_code_pointer = room_702_preload; break;
+	case 703: room_preload_code_pointer = room_703_preload; break;
+	case 704: room_preload_code_pointer = room_704_preload; break;
+	case 705: room_preload_code_pointer = room_705_preload; break;
+	case 706: room_preload_code_pointer = room_706_preload; break;
+	case 707: room_preload_code_pointer = room_707_preload; break;
+	case 710: room_preload_code_pointer = room_710_preload; break;
+	case 711: room_preload_code_pointer = room_711_preload; break;
+	case 751: room_preload_code_pointer = room_751_preload; break;
+	case 752: room_preload_code_pointer = room_752_preload; break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_7_music() {
 	if (!config_file.music_flag) {
 		g_engine->_soundManager->command(2);
@@ -90,6 +133,14 @@ void section_7_music() {
 	}
 }
 
+void section_7_preload() {
+	section_init_code_pointer = section_7_init;
+	section_room_constructor = section_7_constructor;
+	section_music_reset_pointer = section_7_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+}
+
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/section8.cpp b/engines/mads/madsv2/nebular/rooms/section8.cpp
index ec5c10b516a..12bea00aeef 100644
--- a/engines/mads/madsv2/nebular/rooms/section8.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section8.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/pal.h"
@@ -33,9 +34,14 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-void section_8_interface() {
-	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
-}
+extern void room_801_preload();
+extern void room_802_preload();
+extern void room_803_preload();
+extern void room_804_preload();
+extern void room_805_preload();
+extern void room_807_preload();
+extern void room_808_preload();
+extern void room_810_preload();
 
 void section_8_walker() {
 	g_engine->_soundManager->command(5);
@@ -52,6 +58,37 @@ void section_8_walker() {
 	pal_change_color(17, 0x0A, 0x2D, 0x2D);
 }
 
+void section_8_interface() {
+	Common::strcpy_s(kernel.interface, kernel_interface_name(5));
+}
+
+void section_8_init() {
+	player.scaling_velocity = true;
+}
+
+void section_8_constructor() {
+	room_preload_code_pointer = NULL;
+	room_init_code_pointer = NULL;
+	room_daemon_code_pointer = NULL;
+	room_pre_parser_code_pointer = NULL;
+	room_parser_code_pointer = NULL;
+	room_error_code_pointer = NULL;
+	room_shutdown_code_pointer = NULL;
+
+	switch (new_room) {
+	case 801: room_preload_code_pointer = room_801_preload; break;
+	case 802: room_preload_code_pointer = room_802_preload; break;
+	case 803: room_preload_code_pointer = room_803_preload; break;
+	case 804: room_preload_code_pointer = room_804_preload; break;
+	case 805: room_preload_code_pointer = room_805_preload; break;
+	case 807: room_preload_code_pointer = room_807_preload; break;
+	case 808: room_preload_code_pointer = room_808_preload; break;
+	case 810: room_preload_code_pointer = room_810_preload; break;
+	}
+
+	room_himem_preload(new_room, SECTION);
+}
+
 void section_8_music() {
 	if (!config_file.music_flag)
 		g_engine->_soundManager->command(2);
@@ -81,6 +118,14 @@ void section_8_music() {
 	}
 }
 
+void section_8_preload() {
+	section_init_code_pointer = section_8_init;
+	section_room_constructor = section_8_constructor;
+	section_music_reset_pointer = section_8_music;
+	section_daemon_code_pointer = NULL;
+	section_parser_code_pointer = NULL;
+}
+
 } // namespace Rooms
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index c900be86550..343ffccef63 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -40,8 +40,9 @@ namespace RexNebular {
 namespace Rooms {
 
 Action _action;
-Scene _scene;
+Game _game;
 Globals _globals;
+Scene _scene;
 VM _vm;
 
 bool Action::isAction(int word1) const {
@@ -393,7 +394,7 @@ void Scene::Sequences::setMotion(int sequence_id, int flags,
 }
 
 void Scene::Sequences::updateTimeout(int old_sequence_id, int new_sequence_id) {
-	kernel_seq_copy_timeout(old_sequence_id, new_sequence_id);
+	kernel_seq_timeout(old_sequence_id, new_sequence_id);
 }
 
 void Scene::Sequences::scan() {
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 300d20d12c6..f0a0abbeda1 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -123,6 +123,7 @@ MODULE_OBJS += \
 	madsv2/nebular/rooms/room351.o \
 	madsv2/nebular/rooms/room352.o \
 	madsv2/nebular/rooms/room353.o \
+	madsv2/nebular/rooms/room354.o \
 	madsv2/nebular/rooms/room357.o \
 	madsv2/nebular/rooms/room358.o \
 	madsv2/nebular/rooms/room359.o \


Commit: 3118d2f05049d4e43421facd99bf5ea69fdf165d
    https://github.com/scummvm/scummvm/commit/3118d2f05049d4e43421facd99bf5ea69fdf165d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:50+10:00

Commit Message:
MADS: NEBULAR: Adding more Rex specific global code

Changed paths:
    engines/mads/madsv2/core/object.h
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/nebular.h


diff --git a/engines/mads/madsv2/core/object.h b/engines/mads/madsv2/core/object.h
index b2ff2393e15..985dbe003e5 100644
--- a/engines/mads/madsv2/core/object.h
+++ b/engines/mads/madsv2/core/object.h
@@ -111,7 +111,7 @@ extern void object_set_quality(int object_id, int quality_id, long quality_value
  * Called when the player examines an object from his inventory;
  * greys out main area, then loads & displays object sprite.
  */
-extern int object_examine(int number, long message, int speech);
+extern int object_examine(int number, long message, int speech = 0);
 
 extern void init_object();
 
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index 068107b0b9b..d0b02366a8c 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -329,6 +329,9 @@ enum {
 
 #define INDEFINITE_TIMEOUT 9999999
 
+#define READGLOBAL32(INDEX) ((int32)global[INDEX] | ((int32)global[INDEX + 1] << 16))
+#define WRITEGLOBAL32(INDEX, VALUE) { uint32 v = VALUE; global[INDEX] = v & 0xffff; global[INDEX+1] = v >> 16; } while(0)
+
 extern void global_init_code();
 extern void global_section_constructor();
 extern void sync_room(Common::Serializer &s);
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index a01b00193eb..a0552b8d13b 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -39,6 +39,8 @@
 #include "mads/madsv2/nebular/nebular.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/main.h"
+#include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/sound_nebular.h"
 #include "mads/madsv2/nebular/rooms/section1.h"
 #include "mads/madsv2/nebular/rooms/section2.h"
@@ -104,19 +106,502 @@ void RexNebularEngine::syncRoom(Common::Serializer &s) {
 }
 
 void RexNebularEngine::global_daemon_code() {
+	if (player.walker_visible && player.commands_allowed && !player.walking &&
+		(player.facing == player.turn_to_facing)) {
+
+
+		if (kernel.clock >= READGLOBAL32(kWalkerTiming)) {
+			if (player.stop_walker_pointer == 0) {
+				int randomVal = getRandomNumber(29999);
+				if (global[kSexOfRex] == REX_MALE) {
+					switch (player.facing) {
+					case FACING_SOUTHWEST:
+					case FACING_SOUTHEAST:
+					case FACING_NORTHWEST:
+					case FACING_NORTHEAST:
+						if (randomVal < 200) {
+							player_add_stop_walker(-1, 0);
+							player_add_stop_walker(1, 0);
+						}
+						break;
+
+					case FACING_WEST:
+					case FACING_EAST:
+						if (randomVal < 500) {
+							for (int count = 0; count < 10; ++count) {
+								player_add_stop_walker(1, 0);
+							}
+						}
+						break;
+
+					case FACING_SOUTH:
+						if (randomVal < 500) {
+							for (int count = 0; count < 10; ++count) {
+								player_add_stop_walker((randomVal < 250) ? 1 : 2, 0);
+							}
+						} else if (randomVal < 750) {
+							for (int count = 0; count < 5; ++count) {
+								player_add_stop_walker(1, 0);
+							}
+
+							player_add_stop_walker(0, 0);
+							player_add_stop_walker(0, 0);
+
+							for (int count = 0; count < 5; ++count) {
+								player_add_stop_walker(2, 0);
+							}
+						}
+						break;
+
+					default:
+						break;
+					}
+				}
+			}
+
+			WRITEGLOBAL32(kWalkerTiming, READGLOBAL32(kWalkerTiming) + 6);
+		}
+	}
+
+	// Below is countdown to set the timebomb off in room 604
+	if (global[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
+		int diff = kernel.clock - READGLOBAL32(kTimebombClock);
+		if ((diff >= 0) && (diff <= 60)) {
+			WRITEGLOBAL32(kTimebombTimer, READGLOBAL32(kTimebombTimer) + diff);
+		} else {
+			WRITEGLOBAL32(kTimebombTimer, READGLOBAL32(kTimebombTimer) + 1);
+		}
+
+		WRITEGLOBAL32(kTimebombClock, kernel.clock);
+	}
 }
 
-void RexNebularEngine::global_pre_parser_code() {
+void RexNebularEngine::showRecipe() {
+	int count;
+
+	for (count = 0; count < 4; count++) {
+		switch (global[kIngredientQuantity + count]) {
+		case 0:
+			text_index[count] = NOUN_DROP;
+			break;
+		case 1:
+			text_index[count] = NOUN_DOLLOP;
+			break;
+		case 2:
+			text_index[count] = NOUN_DASH;
+			break;
+		case 3:
+			text_index[count] = NOUN_SPLASH;
+			break;
+		default:
+			break;
+		}
+	}
 
+	for (count = 0; count < 4; count++) {
+		switch (global[kIngredientList + count]) {
+		case 0:
+			text_index[count + 4] = NOUN_ALCOHOL;
+			break;
+		case 1:
+			text_index[count + 4] = NOUN_LECITHIN;
+			break;
+		case 2:
+			text_index[count + 4] = NOUN_PETROX;
+			break;
+		case 3:
+			text_index[count + 4] = NOUN_FORMALDEHYDE;
+			break;
+		default:
+			break;
+		}
+	}
+
+	text_show(401);
 }
 
 void RexNebularEngine::global_parser_code() {
+	int id;
+
+	if (player_parse(VERB_SMELL, 0) && room_id > 103 && room_id < 111) {
+		text_show(440);
+	} else if (player_parse(VERB_EAT, 0) && room_id > 103 && room_id < 111) {
+		text_show(441);
+	} else if (player_parse(VERB_SMELL, NOUN_BURGER, 0)) {
+		text_show(442);
+	} else if (player_parse(VERB_EAT, NOUN_BURGER, 0)) {
+		text_show(443);
+	} else if (player_parse(VERB_SMELL, NOUN_STUFFED_FISH, 0)) {
+		text_show(444);
+	} else if (player_parse(VERB_EAT, NOUN_STUFFED_FISH, 0)) {
+		text_show(445);
+	} else if (player_parse(VERB_WEAR, NOUN_REBREATHER, 0)) {
+		text_show(room_id > 103 && room_id < 111 ? 446 : 447);
+	} else if (player_parse(VERB_SET, NOUN_TIMER_MODULE, 0)) {
+		text_show(448);
+	} else if (player_parse(VERB_NIBBLE_ON, NOUN_BIG_LEAVES, 0)) {
+		text_show(449);
+	} else if (player_parse(VERB_LICK, NOUN_POISON_DARTS, 0)) {
+		text_show(450);
+	} else if (player_parse(VERB_EAT, NOUN_TWINKIFRUIT, 0)) {
+		inter_move_object(OBJ_TWINKIFRUIT, NOWHERE);
+		text_show(451);
+	} else if (player_parse(VERB_GORGE_ON, NOUN_TWINKIFRUIT, 0)) {
+		inter_move_object(OBJ_TWINKIFRUIT, NOWHERE);
+		text_show(452);
+	} else if (player_parse(VERB_GNAW_ON, 0)) {
+		text_show(453);
+	} else if (player_parse(VERB_MASSAGE, NOUN_AUDIO_TAPE, 0)) {
+		text_show(454);
+	} else if (player_parse(VERB_MANGLE, NOUN_CREDIT_CHIP, 0)) {
+		text_show(455);
+	} else if (player_parse(VERB_FONDLE, NOUN_CHARGE_CASES, 0)) {
+		text_show(456);
+	} else if (player_parse(VERB_RUB, NOUN_BOMB, 0)) {
+		text_show(457);
+	} else if (player_parse(VERB_SET, NOUN_TIMEBOMB, 0)) {
+		text_show(458);
+	} else if (player_parse(VERB_GUZZLE, NOUN_ALIEN_LIQUOR, 0)) {
+		text_show(459);
+	} else if (player_parse(VERB_SMASH, NOUN_TARGET_MODULE, 0)) {
+		text_show(460);
+	} else if (player_parse(VERB_JUGGLE, 0)) {
+		text_show(461);
+	} else if (player_parse(VERB_APPLY, NOUN_POLYCEMENT, 0)) {
+		text_show(462);
+	} else if (player_parse(VERB_SNIFF, NOUN_POLYCEMENT, 0)) {
+		text_show(465);
+	} else if (player_parse(VERB_TIE, NOUN_FISHING_LINE, 0)) {
+		text_show(463);
+	} else if (player_parse(VERB_ATTACH, NOUN_FISHING_LINE, 0)) {
+		text_show(463);
+	} else if (player_parse(VERB_UNLOCK, 0)) {
+		text_show(464);
+	} else if (player_parse(VERB_REFLECT, 0)) {
+		text_show(466);
+	} else if (player_parse(VERB_GAZE_INTO, NOUN_REARVIEW_MIRROR, 0)) {
+		text_show(467);
+	} else if (player_parse(VERB_EAT, NOUN_CHICKEN_BOMB, 0)) {
+		text_show(469);
+	} else if (player_parse(VERB_BREAK, NOUN_VASE, 0)) {
+		text_show(471);
+	} else if (player_parse(VERB_SHAKE_HANDS, NOUN_GUARDS_ARM2, 0)) {
+		text_show(472);
+	} else if (player_parse(VERB_READ, NOUN_LOG, 0)) {
+		text_show(473);
+	} else if (player_parse(VERB_RUB, NOUN_BOMBS, 0)) {
+		text_show(474);
+	} else if (player_parse(VERB_DRINK, NOUN_FORMALDEHYDE, 0)) {
+		text_show(475);
+	} else if (player_parse(VERB_DRINK, NOUN_PETROX, 0)) {
+		text_show(476);
+	} else if (player_parse(VERB_DRINK, NOUN_LECITHIN, 0)) {
+		text_show(477);
+	} else if (player_parse(VERB_PUT, NOUN_POISON_DARTS, NOUN_PLANT_STALK, 0) && player_has(OBJ_POISON_DARTS)
+		&& player_has(OBJ_PLANT_STALK)) {
+		inter_give_to_player(OBJ_BLOWGUN);
+		inter_move_object(OBJ_PLANT_STALK, NOWHERE);
+		global[kBlowgunStatus] = 0;
+		object_examine(OBJ_BLOWGUN, 809);
+	} else if (player_parse(VERB_PUT, NOUN_POISON_DARTS, NOUN_BLOWGUN, 0) && player_has(OBJ_POISON_DARTS)
+		&& player_has(OBJ_BLOWGUN)) {
+		text_show(433);
+	} else if (player_parse(VERB_DEFACE, 0) && player_parse(VERB_FOLD, 0) && player_parse(VERB_MUTILATE, 0)) {
+		text_show(434);
+	} else if (player_parse(VERB_SPINDLE, 0)) {
+		text_show(479);
+	} else if ((player_parse(VERB_READ, 0) || player_parse(VERB_LOOK_AT, 0) || player_parse(VERB_LOOK, 0)) &&
+		player_parse(NOUN_NOTE, 0) && player_has(OBJ_NOTE)) {
+		inter_move_object(OBJ_NOTE, NOWHERE);
+		inter_give_to_player(OBJ_COMBINATION);
+		object_examine(OBJ_COMBINATION, 851);
+	} else if ((player_parse(VERB_LOOK, 0) || player_parse(VERB_READ, 0)) &&
+		((id = object_named(inter_main_noun)) > 0 ||
+			(inter_second_noun > 0 &&
+				(id = object_named(inter_second_noun)))) &&
+		player_has(id)) {
+		if (id == OBJ_REPAIR_LIST) {
+			text_index[0] = global[kTeleporterCode + 7];
+			text_index[1] = global[kTeleporterCode + 8];
+			text_index[2] = global[kTeleporterCode + 6];
+			text_index[3] = global[kTeleporterCode + 9];
+			text_index[4] = global[kTeleporterCode + 0];
+			text_index[5] = global[kTeleporterCode + 1];
+			text_index[6] = global[kTeleporterCode + 4];
+			text_index[7] = global[kTeleporterCode + 5];
+			text_index[8] = global[kTeleporterCode + 2];
+
+			object_examine(id, 402);
+		} else {
+			int messageId = 800 + id;
+			if ((id == OBJ_CHARGE_CASES) && object_check_quality(OBJ_CHARGE_CASES, 3) != 0) {
+				messageId = 860;
+			}
+
+			if (id == OBJ_TAPE_PLAYER && object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER)
+				messageId = 867;
+
+			if (id == 32 && object[OBJ_FISHING_LINE].location == 3)
+				messageId = 862;
+
+			if (id == OBJ_BOTTLE && global[kBottleStatus] != 0)
+				messageId = 862 + global[kBottleStatus];
+
+			if (id == OBJ_PHONE_HANDSET && global[kHandsetCellStatus])
+				messageId = 861;
+
+			object_examine(id, messageId);
+		}
+	} else if (player_parse(VERB_PUT, NOUN_BURGER, NOUN_DEAD_FISH, 0)) {
+		if (player_has(OBJ_BURGER) || player_has(OBJ_DEAD_FISH)) {
+			inter_take_from_player(OBJ_DEAD_FISH, PLAYER);
+			inter_take_from_player(OBJ_BURGER, PLAYER);
+			inter_give_to_player(OBJ_STUFFED_FISH);
+			object_examine(OBJ_STUFFED_FISH, 803);
+		}
+	} else if (player_parse(VERB_PUT, NOUN_AUDIO_TAPE, NOUN_TAPE_PLAYER, 0) && player_has(OBJ_AUDIO_TAPE) &&
+		player_has(OBJ_TAPE_PLAYER)) {
+		inter_move_object(OBJ_AUDIO_TAPE, OBJ_TAPE_PLAYER);
+	} else if (player_parse(VERB_ACTIVATE, NOUN_TAPE_PLAYER, 0) && player_has(OBJ_TAPE_PLAYER)) {
+		if (object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER) {
+			showRecipe();
+		} else {
+			text_show(406);
+		}
+	} else if (player_parse(VERB_EJECT, NOUN_TAPE_PLAYER, 0) && player_has(OBJ_TAPE_PLAYER)) {
+		if (object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER) {
+			inter_give_to_player(OBJ_AUDIO_TAPE);
+		} else {
+			text_show(407);
+		}
+	} else if (player_parse(VERB_DISASSEMBLE, NOUN_TAPE_PLAYER, 0)) {
+		text_show(408);
+	} else if (player_parse(VERB_ACTIVATE, NOUN_REMOTE, 0)) {
+		text_show(global[kTopButtonPushed] ? 502 : 501);
+	} else if ((player_parse(VERB_ATTACH, NOUN_DETONATORS, NOUN_CHARGE_CASES, 0) || player_parse(VERB_PUT, NOUN_DETONATORS, NOUN_CHARGE_CASES, 0)) &&
+		player_has(OBJ_DETONATORS) && player_has(OBJ_CHARGE_CASES)) {
+		if (object_check_quality(OBJ_CHARGE_CASES, 3)) {
+			inter_move_object(OBJ_CHARGE_CASES, NOWHERE);
+			inter_move_object(OBJ_DETONATORS, NOWHERE);
+			inter_give_to_player(OBJ_BOMBS);
+			object_examine(OBJ_BOMBS, 403);
+		} else {
+			text_show(405);
+		}
+	} else if (player_parse(VERB_ATTACH, NOUN_DETONATORS, 0)) {
+		text_show(470);
+	} else if ((player_parse(VERB_ATTACH, NOUN_TIMER_MODULE, NOUN_BOMBS, 0) || player_parse(VERB_PUT, NOUN_TIMER_MODULE, NOUN_BOMBS, 0) || player_parse(VERB_ATTACH, NOUN_TIMER_MODULE, NOUN_BOMB, 0)
+		|| player_parse(VERB_PUT, NOUN_TIMER_MODULE, NOUN_BOMB, 0)) && player_has(OBJ_TIMER_MODULE) && (
+			player_has(OBJ_BOMBS) || player_has(OBJ_BOMB))) {
+		if (player_has(OBJ_BOMBS)) {
+			inter_move_object(OBJ_BOMBS, NOWHERE);
+			inter_give_to_player(OBJ_BOMB);
+		} else {
+			inter_move_object(OBJ_BOMB, NOWHERE);
+		}
+
+		inter_move_object(OBJ_TIMER_MODULE, NOWHERE);
+		inter_give_to_player(OBJ_TIMEBOMB);
+		object_examine(OBJ_TIMEBOMB, 404);
+	} else if (player_parse(VERB_FONDLE, NOUN_PLANT_STALK, 0)) {
+		text_show(410);
+	} else if (player_parse(VERB_EMPTY, NOUN_BOTTLE, 0)) {
+		global[kBottleStatus] = 0;
+		text_show(432);
+	} else if (player_parse(VERB_DISASSEMBLE, NOUN_FISHING_ROD, 0)) {
+		if (object[OBJ_FISHING_LINE].location == 3) {
+			inter_give_to_player(OBJ_FISHING_LINE);
+			object_examine(OBJ_FISHING_LINE, 409);
+		} else {
+			text_show(428);
+		}
+	} else if (player_parse(VERB_DISASSEMBLE, NOUN_PENLIGHT, 0)) {
+		switch (global[kPenlightCellStatus]) {
+		case 1:
+		case 2:
+			inter_give_to_player(OBJ_DURAFAIL_CELLS);
+			object_examine(OBJ_DURAFAIL_CELLS, 412);
+			break;
+		case 3:
+			inter_give_to_player(OBJ_PHONE_CELLS);
+			object_examine(OBJ_DURAFAIL_CELLS, 413);
+			break;
+		case 5:
+			inter_give_to_player(OBJ_DURAFAIL_CELLS);
+			object_examine(OBJ_DURAFAIL_CELLS, 411);
+			break;
+		case 6:
+			inter_give_to_player(OBJ_DURAFAIL_CELLS);
+			object_examine(OBJ_DURAFAIL_CELLS, 429);
+			break;
+		default:
+			text_show(478);
+			break;
+		}
+	} else if (player_parse(VERB_DISASSEMBLE, NOUN_PHONE_HANDSET, 0)) {
+		switch (global[kHandsetCellStatus]) {
+		case 1:
+			inter_give_to_player(OBJ_DURAFAIL_CELLS);
+			object_examine(OBJ_DURAFAIL_CELLS,
+				game.difficulty != DIFFICULTY_HARD || global[kDurafailRecharged] ? 415 : 414);
+			global[kDurafailRecharged] = true;
+			break;
+		case 2:
+			inter_give_to_player(OBJ_DURAFAIL_CELLS);
+			if (game.difficulty == DIFFICULTY_HARD) {
+				object_examine(OBJ_DURAFAIL_CELLS, 416);
+			}
+			global[kHandsetCellStatus] = 0;
+			break;
+		case 3:
+			inter_give_to_player(OBJ_PHONE_CELLS);
+			object_examine(OBJ_PHONE_CELLS, 418);
+			break;
+		case 4:
+			inter_give_to_player(OBJ_PHONE_CELLS);
+			object_examine(OBJ_PHONE_CELLS, 417);
+			global[kHandsetCellStatus] = 0;
+			break;
+		default:
+			text_show(478);
+			break;
+		}
+	} else if (player_parse(VERB_PUT, NOUN_PHONE_CELLS, NOUN_PENLIGHT, 0)) {
+		if (global[kPenlightCellStatus] == 0) {
+			global[kPenlightCellStatus] = 3;
+			inter_move_object(OBJ_PHONE_CELLS, NOWHERE);
+			text_show(419);
+		} else {
+			text_show(420);
+		}
+	} else if (player_parse(VERB_PUT, NOUN_PHONE_CELLS, NOUN_PHONE_HANDSET, 0)) {
+		if (global[kHandsetCellStatus] == 0) {
+			global[kHandsetCellStatus] = 3;
+			inter_move_object(OBJ_PHONE_CELLS, NOWHERE);
+			text_show(421);
+		} else {
+			text_show(422);
+		}
+	} else if (player_parse(VERB_PUT, NOUN_DURAFAIL_CELLS, NOUN_PENLIGHT, 0)) {
+		if (global[kPenlightCellStatus]) {
+			text_show(424);
+		} else {
+			inter_move_object(OBJ_DURAFAIL_CELLS, NOWHERE);
+			global[kPenlightCellStatus] = game.difficulty != DIFFICULTY_HARD || global[kDurafailRecharged] ? 1 : 2;
+			text_show(423);
+		}
+	}
 }
 
 void RexNebularEngine::global_error_code() {
-}
+	int randVal = getRandomNumber(1, 1000);
 
-void RexNebularEngine::global_room_init() {
+	if (player_parse(VERB_THROW, NOUN_BOMB, 0) || player_parse(VERB_THROW, NOUN_BOMBS, 0)
+		|| player_parse(VERB_THROW, NOUN_TIMEBOMB, 0) || player_parse(VERB_THROW, NOUN_CHICKEN_BOMB, 0))
+		text_show(42);
+	else if (player_parse(VERB_DISASSEMBLE, 0))
+		text_show(435);
+	else if ((player_parse(VERB_EAT, NOUN_DEAD_FISH, 0) || player_parse(VERB_EAT, NOUN_STUFFED_FISH, 0)) && player_has(object_named(inter_main_noun)))
+		text_show(12);
+	else if ((player_parse(VERB_SMELL, NOUN_DEAD_FISH, 0) || player_parse(VERB_SMELL, NOUN_STUFFED_FISH, 0)) && player_has(object_named(inter_main_noun)))
+		text_show(13);
+	else if (player_parse(VERB_EAT, NOUN_CHICKEN, 0) && player_has(OBJ_CHICKEN))
+		text_show(912);
+	else if ((player_parse(VERB_SHOOT, 0) || player_parse(VERB_HOSE_DOWN, 0)) && player_parse(NOUN_BLOWGUN, 0)) {
+		if ((room_id >= 104) && (room_id <= 111))
+			text_show(38);
+		else if (player_parse(NOUN_PIRANHA, 0))
+			text_show(41);
+		else if (player_parse(NOUN_CHICKEN, 0) || player_parse(NOUN_VULTURE, 0) || player_parse(NOUN_SPIDER, 0)
+			|| player_parse(NOUN_YELLOW_BIRD, 0) || player_parse(NOUN_SWOOPING_CREATURE, 0) || player_parse(NOUN_CAPTIVE_CREATURE, 0)) {
+			text_show(40);
+		} else
+			text_show(39);
+	} else if (player_parse(VERB_TALKTO, 0)) {
+		global[kTalkInanimateCount] = (global[kTalkInanimateCount] + 1) % 16;
+		if (!global[kTalkInanimateCount]) {
+			text_show(2);
+		} else {
+			Common::String tmpMsg = "\"Greetings, ";
+			tmpMsg += vocab_string(inter_main_noun);
+			tmpMsg += "!\"";
+			kernel_message_purge();
+			kernel_message_add(const_cast<char *>(tmpMsg.c_str()), 0, 0, 0x1110, 120, 34, 0);
+		}
+	} else if (player_parse(VERB_GIVE, NOUN_DOOR, NOUN_CEILING, 0) || player_parse(VERB_CLOSE, NOUN_CHAIR, 0))
+		text_show(3);
+	else if (player_parse(VERB_THROW, 0)) {
+		int objId = object_named(inter_main_noun);
+		if (objId < 0)
+			text_show(4);
+		else if (object[objId].location != 2)
+			text_show(5);
+		else
+			text_show(6);
+	} else if (player_parse(VERB_LOOK, 0)) {
+		if (player_parse(NOUN_BINOCULARS, 0) && (inter_second_noun > 0))
+			text_show(10);
+		else if (randVal < 600)
+			text_show(7);
+		else
+			text_show(21);
+	} else if (player_parse(VERB_TAKE, 0)) {
+		int objId = object_named(inter_main_noun);
+		if (player_has(objId))
+			text_show(16);
+		else if (randVal <= 333)
+			text_show(8);
+		else if (randVal <= 666)
+			text_show(22);
+		else
+			text_show(23);
+	} else if (player_parse(VERB_CLOSE, 0)) {
+		if (randVal <= 333)
+			text_show(9);
+		else
+			text_show(33);
+	} else if (player_parse(VERB_OPEN, 0)) {
+		if (randVal <= 500)
+			text_show(30);
+		else if (randVal <= 750)
+			text_show(31);
+		else
+			text_show(32);
+	} else if (player_parse(VERB_PULL, 0))
+		text_show(18);
+	else if (player_parse(VERB_PUSH, 0)) {
+		if (randVal < 750)
+			text_show(19);
+		else
+			text_show(20);
+	} else if (player_parse(VERB_PUT, 0)) {
+		int objId = object_named(inter_main_noun);
+		if (player_has(objId))
+			text_show(25);
+		else
+			text_show(24);
+	} else if (player_parse(VERB_GIVE, 0)) {
+		int objId = object_named(inter_main_noun);
+		if (!player_has(objId))
+			text_show(26);
+		else if (randVal <= 500)
+			text_show(28);
+		else
+			text_show(29);
+	} else if (!player_parse(VERB_WALKTO, 0) && !player_parse(VERB_WALK_ACROSS, 0) && !player_parse(VERB_WALK_TOWARDS, 0) && !player_parse(VERB_WALK_DOWN, 0)
+		&& !player_parse(VERB_SWIM_TO, 0) && !player_parse(VERB_SWIM_ACROSS, 0) && !player_parse(VERB_SWIM_INTO, 0) && !player_parse(VERB_SWIM_THROUGH, 0)
+		&& !player_parse(VERB_SWIM_UNDER, 0)) {
+		if (randVal <= 100)
+			text_show(36);
+		else if (randVal <= 200)
+			text_show(1);
+		else if (randVal <= 475)
+			text_show(34);
+		else if (randVal <= 750)
+			text_show(35);
+		else
+			text_show(37);
+	}
 }
 
 void RexNebularEngine::global_sound_driver() {
diff --git a/engines/mads/madsv2/nebular/nebular.h b/engines/mads/madsv2/nebular/nebular.h
index 23ef2226bbf..a7439d15506 100644
--- a/engines/mads/madsv2/nebular/nebular.h
+++ b/engines/mads/madsv2/nebular/nebular.h
@@ -41,6 +41,9 @@ struct MADSSavegameHeader {
 };
 
 class RexNebularEngine : public MADSV2Engine {
+private:
+	void showRecipe();
+
 public:
 	RexNebularEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
 		MADSV2Engine(syst, gameDesc) {}
@@ -53,10 +56,10 @@ public:
 	void section_music(int section_num) override;
 	void global_section_constructor() override;
 	void global_daemon_code() override;
-	void global_pre_parser_code() override;
+	void global_pre_parser_code() override {}
 	void global_parser_code() override;
 	void global_error_code() override;
-	void global_room_init() override;
+	void global_room_init() override {}
 	void global_sound_driver() override;
 	void player_keep_walking() override;
 };


Commit: c78550201d25dcf252518ef975d7fb709bff9d72
    https://github.com/scummvm/scummvm/commit/c78550201d25dcf252518ef975d7fb709bff9d72
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:50+10:00

Commit Message:
MADS: NEBULAR: Adding original Rex dialogs

Changed paths:
  A engines/mads/madsv2/nebular/mads/quotes.h
  A engines/mads/madsv2/nebular/menus.cpp
  A engines/mads/madsv2/nebular/menus.h
    engines/mads/madsv2/core/config.cpp
    engines/mads/madsv2/core/config.h
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/mads/mads.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/config.cpp b/engines/mads/madsv2/core/config.cpp
index 9c8804d7a84..b59b55108da 100644
--- a/engines/mads/madsv2/core/config.cpp
+++ b/engines/mads/madsv2/core/config.cpp
@@ -69,6 +69,7 @@ void read_config_file() {
 
 	config_file.show_speech_boxes = ConfMan.getBool("show_speech_boxes");
 	config_file.original_save_load = ConfMan.getBool("original_menus");
+	config_file.naughtiness = ConfMan.hasKey("naughtiness") ? ConfMan.getInt("naughtiness") : 1;
 
 	if (ConfMan.hasKey("difficulty") && !g_engine->isDemo())
 		game.difficulty = ConfMan.getInt("difficulty");
@@ -88,6 +89,9 @@ void write_config_file() {
 	ConfMan.setBool("panning_speed", config_file.panning_speed);
 
 	ConfMan.setBool("show_speech_boxes", config_file.show_speech_boxes);
+	if (g_engine->getGameID() == GType_RexNebular)
+	ConfMan.setInt("naughtiness", config_file.naughtiness);
+
 	ConfMan.flushToDisk();
 }
 
diff --git a/engines/mads/madsv2/core/config.h b/engines/mads/madsv2/core/config.h
index 983e0766f37..42ffa7a8988 100644
--- a/engines/mads/madsv2/core/config.h
+++ b/engines/mads/madsv2/core/config.h
@@ -75,7 +75,7 @@ struct ConfigFile {
 
 	int inventory_mode;           /* Spinning / Still          */
 	int animated_interface;       /* On / Off                  */
-
+	int naughtiness;              /* NAUGHTY / NICE            */
 	int quotes_enabled;           /* Quotes option enabled     */
 
 	int high_memory_mode;         /* High memory mode          */
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index d0b02366a8c..1b38d9a9058 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -208,7 +208,9 @@ enum StoryMode {
 };
 
 enum Difficulty {
-	DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3
+	DIFFICULTY_HARD = 1,
+	DIFFICULTY_MEDIUM = 2,
+	DIFFICULTY_EASY = 3
 };
 
 enum {
diff --git a/engines/mads/madsv2/nebular/mads/mads.cpp b/engines/mads/madsv2/nebular/mads/mads.cpp
index ed792a696d9..14bdc568118 100644
--- a/engines/mads/madsv2/nebular/mads/mads.cpp
+++ b/engines/mads/madsv2/nebular/mads/mads.cpp
@@ -20,4 +20,5 @@
  */
 
 #include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/nebular/mads/quotes.h"
 #include "mads/madsv2/nebular/mads/words.h"
diff --git a/engines/mads/madsv2/nebular/mads/quotes.h b/engines/mads/madsv2/nebular/mads/quotes.h
new file mode 100644
index 00000000000..fedc9cc2dd9
--- /dev/null
+++ b/engines/mads/madsv2/nebular/mads/quotes.h
@@ -0,0 +1,77 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MADS_QUOTES_H
+#define MADS_NEBULAR_MADS_QUOTES_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+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_main_title          =  10,
+	quote_main_item1          =  11,
+	quote_options_title       =  16,
+	quote_options_item1       =  17,
+	quote_options_item2       =  18,
+	quote_options_item3       =  19,
+	quote_options_item4       =  20,
+	quote_options_item5       =  21,
+	quote_options_item6       =  22,
+	quote_options_item7       =  23,
+	quote_options_item1a      =  24,
+	quote_options_item1b      =  25,
+	quote_options_item2a      =  26,
+	quote_options_item2b      =  27,
+	quote_options_item3a      =  28,
+	quote_options_item3b      =  29,
+	quote_options_item4a      =  30,
+	quote_options_item4b      =  31,
+	quote_options_item5a      =  32,
+	quote_options_item5b      =  33,
+	quote_options_item6a      =  34,
+	quote_options_item6b      =  35,
+	quote_options_item7a      =  36,
+	quote_options_item7b      =  37,
+	quote_save_title          =  39,
+	quote_restore_title       =  40,
+	quote_difficulty_title    =  41,
+	quote_difficulty_item1    =  42,
+	quote_save_successful     =  45,
+	quote_restore_successful  =  46,
+	quote_save_failed         =  47,
+	quote_restore_failed      =  48
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/menus.cpp b/engines/mads/madsv2/nebular/menus.cpp
new file mode 100644
index 00000000000..0d3b78a434f
--- /dev/null
+++ b/engines/mads/madsv2/nebular/menus.cpp
@@ -0,0 +1,1642 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/error.h"
+#include "mads/madsv2/core/game.h"
+#include "mads/madsv2/core/hspot.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/keys.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mouse.h"
+#include "mads/madsv2/core/mem.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/core/timer.h"
+#include "mads/madsv2/nebular/mads/quotes.h"
+#include "mads/madsv2/nebular/menus.h"
+#include "mads/madsv2/nebular/global.h"
+#include "mads/madsv2/nebular/nebular.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+
+#define MENU_MESSAGE_COLOR_BASE       10    /* 1st color to use for messages          */
+#define MENU_MESSAGE_COLOR_BASE_2     12    /* 1st color to use for second message    */
+#define MENU_MESSAGE_COLOR_BASE_3     14    /* 1st color to use for third  message    */
+
+#define MENU_MESSAGE_COLOR    (((MENU_MESSAGE_COLOR_BASE   + 1) << 8) + MENU_MESSAGE_COLOR_BASE)
+#define MENU_MESSAGE_COLOR_2  (((MENU_MESSAGE_COLOR_BASE_2 + 1) << 8) + MENU_MESSAGE_COLOR_BASE_2)
+#define MENU_MESSAGE_COLOR_3  (((MENU_MESSAGE_COLOR_BASE_3 + 1) << 8) + MENU_MESSAGE_COLOR_BASE_3)
+
+enum {
+	SAVE_SUCCESSFUL     = 1,
+	RESTORE_SUCCESSFUL  = 2,
+	SAVE_FAILED         = 3,
+	RESTORE_FAILED      = 4
+};
+
+struct MenuMessage {
+	int active;         /* Item is present/not present   */
+	int status;         /* Item is selected/not selected */
+	int x, y;           /* Item position                 */
+	int handle;         /* Matte message handle          */
+	char text[80];      /* Text of message string        */
+	FontPtr font;       /* Font to display message       */
+	int spacing;        /* Font auto spacing             */
+};
+
+static MenuMessage *menu = NULL;
+static byte *save_menu = NULL;
+static byte *trash_bag = NULL;
+static int game_menu_num_items;
+static int game_menu_scan_items;
+static int trash_num_items;
+
+static int game_menu_changed;
+static int game_menu_current_item;
+static int game_menu_selected_item;
+static int game_menu_return_key;
+
+static int game_menu_series_id;
+
+static int game_menu_save_top = 0;
+static int game_menu_save_select = 0;
+static int game_menu_save_stroke = 0;
+
+static int game_menu_direct_jump;
+
+static int game_save_menu_virgin;
+
+static int game_been_to_save_screen;
+static int game_save_status = RESTORE_FAILED;
+
+static int  game_menu_save_dirty;
+static char *game_menu_save_buffer;
+static char *game_menu_save_pointer;
+
+static int global_save(int id, const char *save_game_name) {
+	int status;
+
+	game_save_name(id + 1);
+
+	if (g_engine->saveGameState(id + 1, save_game_name).getCode() == Common::kNoError)
+		status = SAVE_SUCCESSFUL;
+	else
+		status = SAVE_FAILED;
+
+	return status;
+}
+
+static int global_restore(int id) {
+	int status;
+
+	if (g_engine->loadGameState(id + 1).getCode() == Common::kNoError)
+		status = RESTORE_SUCCESSFUL;
+	else
+		status = RESTORE_FAILED;
+
+	WRITE_LE_UINT32(&global[walker_timing], 0);
+
+	return status;
+}
+
+static char *game_menu_save_string(int id) {
+	char *string;
+
+	string = (char *)save_menu + (id * (GAME_MAX_SAVE_LENGTH + 1));
+
+	return string;
+}
+
+static void game_menu_write_message(FontPtr font, char *string,
+	int special, int x, int y) {
+	int this_x;
+	int width;
+	int keep_me;
+	char *look;
+	byte *trash_pointer;
+	MenuMessage *message;
+
+	if (game_menu_scan_items < game_menu_num_items) {
+		message = &menu[game_menu_scan_items];
+		keep_me = (strcmp(message->text, string) == 0);
+		if (!keep_me) {
+			if (message->handle >= 0) {
+				if (message_list[message->handle].active) {
+					message_list[message->handle].status = -1;
+					if (trash_num_items < GAME_MENU_MAX_ITEMS) {
+						trash_pointer = trash_bag + (80 * trash_num_items);
+						Common::strcpy_s((char *)trash_pointer, 80, message_list[message->handle].text);
+						message_list[message->handle].text = (char *)trash_pointer;
+						trash_num_items++;
+					}
+				}
+			}
+		} else {
+			goto done;
+		}
+	} else {
+		if (game_menu_num_items < GAME_MENU_MAX_ITEMS) {
+			message = &menu[game_menu_num_items++];
+		} else {
+			goto done;
+		}
+	}
+
+	Common::strcpy_s(message->text, string);
+	message->font = font;
+	message->spacing = -1;
+	message->active = true;
+	message->status = 0;
+	message->y = y;
+	message->handle = -1;
+
+	this_x = x;
+	if (special == GAME_MENU_CENTER) {
+		width = font_string_width(font, message->text, message->spacing);
+		this_x += (video_x >> 1) - (width >> 1);
+	} else if (special == GAME_MENU_SPECIAL) {
+		look = strchr(message->text, '@');
+		if (look != NULL) {
+			*look = 0;
+			width = font_string_width(font, message->text, message->spacing);
+			Common::strcpy_s(look, 80, look + 1);
+			this_x += (video_x >> 1) - width;
+		}
+	} else if (special == GAME_MENU_RIGHT) {
+		width = font_string_width(font, message->text, message->spacing);
+		this_x -= width;
+	}
+	message->x = this_x;
+
+done:
+	game_menu_scan_items++;
+}
+
+
+static void game_menu_make_message(FontPtr font, int quote_1, int quote_2,
+	int special, int x, int y) {
+	char work_buf[80];
+
+	Common::strcpy_s(work_buf, quote_string(kernel.quotes, quote_1));
+	if (quote_2 > 0) {
+		Common::strcat_s(work_buf, " ");
+		Common::strcat_s(work_buf, quote_string(kernel.quotes, quote_2));
+	}
+	game_menu_write_message(font, work_buf, special, x, y);
+}
+
+static void game_save_restore_message(int id, int select, int entries_x, int entries_y, int *menu_scroll) {
+	int width;
+	int ok;
+	char temp_buf[80];
+
+	if ((id + game_menu_save_top) < GAME_MAX_SAVE_SLOTS) {
+		Common::strcpy_s(temp_buf, game_menu_save_string(game_menu_save_top + id));
+
+		if (id + game_menu_save_top == select) {
+			Common::strcat_s(temp_buf, "_");
+		} else {
+			if (!strlen(temp_buf))
+				Common::strcat_s(temp_buf, quote_string(kernel.quotes, quote_menu_empty));
+		}
+
+	} else {
+		temp_buf[0] = 0;
+	}
+
+	do {
+		width = font_string_width(font_conv, temp_buf, -1);
+		ok = !strlen(temp_buf) || (width <= GAME_MAX_SAVE_WIDTH);
+		if (!ok) {
+			temp_buf[strlen(temp_buf) - 1] = 0;
+		}
+	} while (!ok);
+
+	game_menu_write_message(font_conv, temp_buf, 0, entries_x, *menu_scroll += entries_y);
+}
+
+static void game_save_restore_number(int id, int entries_x, int entries_y, int *menu_scroll) {
+	char temp_buf[80];
+
+	if ((id + game_menu_save_top) < GAME_MAX_SAVE_SLOTS) {
+		mads_itoa(game_menu_save_top + id + 1, temp_buf, 10);
+	} else {
+		temp_buf[0] = 0;
+	}
+
+	game_menu_write_message(font_conv, temp_buf, GAME_MENU_RIGHT, entries_x, *menu_scroll += entries_y);
+}
+
+static void game_menu_first_init() {
+	int count;
+
+	game_menu_num_items = 0;
+	game_menu_save_stroke = 0;
+
+	for (count = 0; count < GAME_MENU_MAX_ITEMS; count++) {
+		menu[count].active = false;
+	}
+
+	for (count = 0; count < MESSAGE_LIST_SIZE; count++) {
+		message_list[count].active = false;
+	}
+
+	image_marker = 1;
+	image_list[0].flags = IMAGE_REFRESH;
+	image_list[0].segment_id = (byte)-1;
+}
+
+static void game_menu_general_init() {
+	game_menu_current_item = -1;
+	game_menu_selected_item = -1;
+	game_menu_scan_items = 0;
+
+	game_menu_return_key = false;
+
+	trash_num_items = 0;
+}
+
+static void game_menu_main_init() {
+	int menu_base;
+	int height;
+	int unit, title;
+	int items;
+	int count;
+
+	game_menu_general_init();
+
+	items = 6;
+	unit = (font_conv->max_y_size + 1);
+	title = 6;
+	height = (unit * items) + title;
+	menu_base = (display_y >> 1) - (height >> 1);
+
+	game_menu_make_message(font_conv, quote_main_title, 0, GAME_MENU_CENTER, 0, menu_base);
+
+	menu_base += title;
+	for (count = 0; count < 5; count++) {
+		menu_base += unit;
+		game_menu_make_message(font_conv, quote_main_item1 + count, 0, GAME_MENU_CENTER, 0, menu_base);
+	}
+}
+
+static void game_menu_difficulty_init() {
+	int menu_base;
+	int height;
+	int unit, title;
+	int items;
+	int count;
+
+	game_menu_general_init();
+
+	items = 4;
+	unit = (font_conv->max_y_size + 1);
+	title = 6;
+	height = (unit * items) + title;
+	menu_base = (display_y >> 1) - (height >> 1);
+
+	game_menu_make_message(font_conv, quote_difficulty_title, 0, GAME_MENU_CENTER, 0, menu_base);
+
+	menu_base += title;
+	for (count = 0; count < 3; count++) {
+		menu_base += unit;
+		game_menu_make_message(font_conv, quote_difficulty_item1 + count, 0, GAME_MENU_CENTER, 0, menu_base);
+	}
+}
+
+static void game_menu_alert_init() {
+	int menu_base;
+	int height;
+	int unit, title;
+	int items;
+	int quote;
+
+	game_menu_general_init();
+
+	items = 3;
+	unit = (font_conv->max_y_size + 1);
+	title = 6;
+	height = (unit * items) + title;
+	menu_base = (display_y >> 1) - (height >> 1);
+
+	switch (game_save_status) {
+	case SAVE_SUCCESSFUL:
+		quote = quote_save_successful;
+		break;
+
+	case RESTORE_SUCCESSFUL:
+		quote = quote_restore_successful;
+		break;
+
+	case SAVE_FAILED:
+		quote = quote_save_failed;
+		break;
+
+	case RESTORE_FAILED:
+	default:
+		quote = quote_restore_failed;
+		break;
+	}
+
+	game_menu_make_message(font_conv, quote, 0, GAME_MENU_CENTER, 0, menu_base);
+	menu_base += unit;
+
+	mads_strlwr(&save_game_buf[1]);
+	game_menu_write_message(font_conv, save_game_buf, GAME_MENU_CENTER, 0, menu_base);
+
+	menu_base += title;
+	menu_base += unit;
+	game_menu_make_message(font_conv, quote_menu_ok, 0, GAME_MENU_CENTER, 0, menu_base);
+}
+
+static void game_menu_options_init() {
+	int menu_base;
+	int height;
+	int unit, title;
+	int items;
+	int quote;
+
+	game_menu_general_init();
+
+	items = 9;
+	unit = (font_conv->max_y_size + 1);
+	title = 6;
+	height = (unit * items) + (title * 2);
+	menu_base = (display_y >> 1) - (height >> 1);
+
+	game_menu_make_message(font_conv, quote_options_title, 0, GAME_MENU_CENTER, 0, menu_base);
+
+	quote = config_file.music_flag ? quote_options_item1a : quote_options_item1b;
+	game_menu_make_message(font_conv, quote_options_item1, quote, GAME_MENU_SPECIAL, 0, menu_base += (title + unit));
+
+	quote = config_file.sound_flag ? quote_options_item2a : quote_options_item2b;
+	game_menu_make_message(font_conv, quote_options_item2, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
+
+	quote = quote_options_item3a + config_file.interface_hotspots;
+	game_menu_make_message(font_conv, quote_options_item3, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
+
+	quote = quote_options_item4a + config_file.inventory_mode;
+	game_menu_make_message(font_conv, quote_options_item4, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
+
+	quote = quote_options_item5a + config_file.animated_interface;
+	game_menu_make_message(font_conv, quote_options_item5, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
+
+	quote = quote_options_item6a + config_file.screen_fade;
+	game_menu_make_message(font_conv, quote_options_item6, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
+
+	quote = (config_file.naughtiness == STORYMODE_NAUGHTY) ? quote_options_item7a : quote_options_item7b;
+	game_menu_make_message(font_conv, quote_options_item7, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
+
+	game_menu_make_message(font_conv, quote_menu_done, 0, GAME_MENU_CENTER, -54, menu_base += (unit + title));
+	game_menu_make_message(font_conv, quote_menu_cancel, 0, GAME_MENU_CENTER, 54, menu_base);
+}
+
+static void game_menu_save_init() {
+	int menu_base;
+	int menu_scroll;
+	int height;
+	int unit, title;
+	int items;
+	int count;
+	int numbers_x, entries_x;
+	int save_x, cancel_x, clear_x;
+
+	game_menu_general_init();
+
+	items = 9;
+	unit = (font_conv->max_y_size + 1);
+	title = 6;
+	height = (unit * items) + (title * 2);
+	menu_base = (display_y >> 1) - (height >> 1);
+
+	numbers_x = 24;       /* Main table number locations */
+	entries_x = 32;       /* Main table entry locations  */
+
+	save_x = -103;     /* Button locations */
+	clear_x = 0;
+	cancel_x = 103;
+
+	game_menu_make_message(font_conv, quote_save_title, 0, GAME_MENU_CENTER, 0, menu_base);
+
+	menu_base += title;
+
+	menu_scroll = menu_base;
+	for (count = 0; count < GAME_MAX_SAVES_ON_SCREEN; count++) {
+		game_save_restore_message(count, game_menu_save_select, entries_x, unit, &menu_scroll);
+	}
+
+	menu_scroll = menu_base;
+	for (count = 0; count < GAME_MAX_SAVES_ON_SCREEN; count++) {
+		game_save_restore_number(count, numbers_x, unit, &menu_scroll);
+	}
+
+	menu_base = menu_scroll + title + unit;
+
+	game_menu_make_message(font_conv, quote_menu_save, 0, GAME_MENU_CENTER, save_x, menu_base);
+	game_menu_make_message(font_conv, quote_menu_clear, 0, GAME_MENU_CENTER, clear_x, menu_base);
+	game_menu_make_message(font_conv, quote_menu_cancel, 0, GAME_MENU_CENTER, cancel_x, menu_base);
+}
+
+static void game_menu_restore_init() {
+	int menu_base;
+	int menu_scroll;
+	int height;
+	int unit, title;
+	int items;
+	int count;
+	int numbers_x, entries_x;
+	int save_x, cancel_x, clear_x;
+
+	game_menu_general_init();
+
+	items = 9;
+	unit = (font_conv->max_y_size + 1);
+	title = 6;
+	height = (unit * items) + (title * 2);
+	menu_base = (display_y >> 1) - (height >> 1);
+
+	numbers_x = 24;       /* Main table number locations */
+	entries_x = 32;       /* Main table entry locations  */
+
+	save_x = -103;     /* Button locations */
+	clear_x = 0;
+	cancel_x = 103;
+
+	game_menu_make_message(font_conv, quote_restore_title, 0, GAME_MENU_CENTER, 0, menu_base);
+
+	menu_base += title;
+
+	menu_scroll = menu_base;
+	for (count = 0; count < GAME_MAX_SAVES_ON_SCREEN; count++) {
+		game_save_restore_message(count, -1, entries_x, unit, &menu_scroll);
+	}
+
+	menu_scroll = menu_base;
+	for (count = 0; count < GAME_MAX_SAVES_ON_SCREEN; count++) {
+		game_save_restore_number(count, numbers_x, unit, &menu_scroll);
+	}
+
+	menu_base = menu_scroll + title + unit;
+
+	game_menu_make_message(font_conv, quote_menu_restore, 0, GAME_MENU_CENTER, save_x, menu_base);
+	game_menu_make_message(font_conv, quote_menu_clear, 0, GAME_MENU_CENTER, clear_x, menu_base);
+	game_menu_make_message(font_conv, quote_menu_cancel, 0, GAME_MENU_CENTER, cancel_x, menu_base);
+}
+
+static void game_menu_hotspot_init() {
+	int count;
+	int x1, y1, x2, y2;
+	int width, height;
+
+	numspots = 0;
+
+	for (count = 0; count < GAME_MENU_MAX_ITEMS; count++) {
+		if (menu[count].active) {
+			x1 = menu[count].x;
+			y1 = menu[count].y;
+			width = font_string_width(menu[count].font, menu[count].text, menu[count].spacing);
+			height = menu[count].font->max_y_size;
+			x2 = x1 + width - 1;
+			y2 = y1 + height - 1;
+			hspot_add(x1, y1, x2, y2, 1, count, mcga_mode);
+		}
+	}
+
+	if ((kernel.activate_menu == GAME_SAVE_MENU) ||
+		(kernel.activate_menu == GAME_RESTORE_MENU)) {
+		/* Arrow hot spots                             */
+		/*         x1   y1  x2   y2 clas num  mode     */
+		hspot_add(293, 26, 312, 75, 2, 50, mcga_mode);
+		hspot_add(293, 78, 312, 127, 2, 51, mcga_mode);
+	}
+}
+
+static void game_menu_process_hotspots() {
+	int myspot;
+	int count;
+	int old_select;
+	int stroke_check;
+
+	old_select = game_menu_current_item;
+
+	for (count = 0; count < game_menu_num_items; count++) {
+		menu[count].status = 0;
+	}
+
+	myspot = hspot_which(mouse_x, mouse_y - viewing_at_y, mcga_mode);
+
+	if (game_menu_save_stroke) {
+		if ((mouse_y - viewing_at_y) < spot[2].ul_y) {  /* Hack: drag scroll up   */
+			if (!mouse_stop_stroke) menu[1].status = 1;
+			myspot = 19; /* Up arrow */
+		}
+		if ((mouse_y - viewing_at_y) > spot[8].lr_y) {  /* Hack: drag scroll down */
+			if (!mouse_stop_stroke) menu[7].status = 1;
+			myspot = 20; /* Down arrow */
+		}
+	}
+
+	if ((myspot > 0) && mouse_any_stroke) {
+		game_menu_current_item = spot[myspot].num;
+
+		if ((kernel.activate_menu == GAME_SAVE_MENU) || (kernel.activate_menu == GAME_RESTORE_MENU)) {
+			if ((game_menu_current_item > GAME_MAX_SAVES_ON_SCREEN) && (game_menu_current_item <= (GAME_MAX_SAVES_ON_SCREEN << 1))) {
+				menu[game_menu_current_item].status = 1;
+				game_menu_current_item -= GAME_MAX_SAVES_ON_SCREEN;
+			}
+
+			stroke_check = (game_menu_current_item > 0) && (game_menu_current_item <= GAME_MAX_SAVES_ON_SCREEN);
+			if (mouse_start_stroke) {
+				game_menu_save_stroke = stroke_check;
+			}
+		}
+
+		if (spot[myspot]._class == 1) {
+			menu[game_menu_current_item].status = 1;
+		}
+	} else {
+		game_menu_current_item = -1;
+	}
+
+	if (game_menu_current_item == 0) game_menu_current_item = -1;
+	if (kernel.activate_menu == GAME_ALERT_MENU) {
+		if (game_menu_current_item == 1) game_menu_current_item = -1;
+	}
+
+	if (mouse_stop_stroke) {
+		if (!game_menu_save_stroke || (game_menu_current_item <= 18)) {
+			game_menu_selected_item = game_menu_current_item;
+		}
+		game_menu_changed = true;
+	}
+
+	if ((old_select != game_menu_current_item) || (game_menu_selected_item >= 0)) {
+		game_menu_changed = true;
+	}
+}
+
+static void game_menu_generate_messages() {
+	int count;
+	int my_color;
+	int keep_me;
+
+	for (count = 0; count < GAME_MENU_MAX_ITEMS; count++) {
+		if (menu[count].active) {
+
+			switch (menu[count].status) {
+			case 0:
+				my_color = MENU_MESSAGE_COLOR;
+				break;
+
+			case 1:
+				my_color = MENU_MESSAGE_COLOR_2;
+				break;
+
+			case 2:
+			default:
+				my_color = MENU_MESSAGE_COLOR_3;
+				break;
+			}
+
+			keep_me = false;
+
+			if (menu[count].handle >= 0) {
+				if (message_list[menu[count].handle].main_color == my_color) {
+					keep_me = true;
+				} else {
+					matte_clear_message(menu[count].handle);
+					menu[count].handle = -1;
+				}
+			}
+
+			if (!keep_me) {
+				menu[count].handle = matte_add_message(menu[count].font,
+					menu[count].text,
+					menu[count].x,
+					menu[count].y,
+					my_color,
+					menu[count].spacing);
+			}
+		}
+	}
+}
+
+static int game_menu_standard_keyboard(int mykey, int going) {
+	switch (mykey) {
+	case esc_key:
+		going = false;
+		game_menu_selected_item = 0;
+		break;
+
+	case alt_x_key:
+	case alt_q_key:
+	case ctrl_x_key:
+	case ctrl_q_key:
+		game_menu_selected_item = 0;
+		g_engine->quitGame();
+		going = false;
+		game.going = false;
+		break;
+
+	case enter_key:
+		game_menu_selected_item = 0;
+		game_menu_return_key = true;
+		going = false;
+		break;
+	}
+
+	return going;
+}
+
+static int game_menu_keyboard(int going) {
+	int mykey;
+
+	if (keys_any()) {
+		mykey = keys_get();
+		going = game_menu_standard_keyboard(mykey, going);
+	}
+
+	return going;
+}
+
+static int game_menu_sprite(int sprite, int depth) {
+	int id;
+
+	id = matte_allocate_image();
+	image_list[id].flags = IMAGE_UPDATE;
+	image_list[id].segment_id = (byte)1;
+	image_list[id].series_id = (byte)game_menu_series_id;
+	image_list[id].sprite_id = sprite;
+	image_list[id].x = series_list[game_menu_series_id]->index[sprite - 1].x;
+	image_list[id].y = series_list[game_menu_series_id]->index[sprite - 1].y;
+	image_list[id].depth = (byte)depth;
+	image_list[id].scale = 100;
+
+	return id;
+}
+
+static void game_menu_main() {
+	int going = true;
+	int first_time = true;
+	int frame_id;
+	long menu_clock = 0;
+	long now_clock;
+
+	game_menu_first_init();
+
+	frame_id = game_menu_sprite(1, 2);
+
+	while (kernel.activate_menu == GAME_MAIN_MENU) {
+
+		going = true;
+
+		game_menu_main_init();
+		game_menu_hotspot_init();
+
+		mouse_init_cycle();
+
+		game_menu_changed = true;
+
+		while (going && (game_menu_selected_item < 1)) {
+
+			going = game_menu_keyboard(going);
+
+			now_clock = timer_read();
+
+			if (now_clock != menu_clock) {
+				menu_clock = now_clock;
+
+				mouse_begin_cycle(false);
+
+				game_menu_process_hotspots();
+
+				if (game_menu_changed) {
+
+					if (game_menu_current_item == 0) game_menu_current_item = -1;
+
+					game_menu_generate_messages();
+
+					/* Matte out the next graphics frame */
+
+					matte_frame(kernel.fx, false);
+
+					if (first_time) {
+						/* Hack to prevent matte manager from erasing big frame sprite */
+						/* but to allow it to remain on the screen as long as nothing  */
+						/* overlaps with it.                                           */
+						image_marker = 0;
+						first_time = false;
+					}
+
+					game_menu_changed = false;
+				}
+
+				mouse_end_cycle(false, false);
+
+				kernel.fx = 0;
+			}
+		}
+
+		switch (game_menu_selected_item) {
+		case 1:
+			kernel.activate_menu = GAME_SAVE_MENU;
+			break;
+
+		case 2:
+			kernel.activate_menu = GAME_RESTORE_MENU;
+			break;
+
+		case 3:
+			kernel.activate_menu = GAME_OPTIONS_MENU;
+			break;
+
+		case 4:
+			kernel.activate_menu = 0;
+			break;
+
+		case 5:
+			kernel.activate_menu = 0;
+			game.going = false;
+			break;
+
+		default:
+			kernel.activate_menu = 0;
+			break;
+		}
+	}
+}
+
+
+
+static void game_menu_options() {
+	int going = true;
+	int first_time = true;
+	int frame_id;
+	long menu_clock = 0;
+	long now_clock;
+	ConfigFile save_config;
+
+	save_config = config_file;
+
+	game_menu_first_init();
+
+	frame_id = game_menu_sprite(2, 2);
+
+	while (kernel.activate_menu == GAME_OPTIONS_MENU) {
+		going = true;
+
+		game_menu_options_init();
+		game_menu_hotspot_init();
+
+		mouse_init_cycle();
+
+		game_menu_changed = true;
+
+		while (going && (game_menu_selected_item < 1)) {
+
+			going = game_menu_keyboard(going);
+
+			now_clock = timer_read();
+
+			if (now_clock != menu_clock) {
+				menu_clock = now_clock;
+
+				mouse_begin_cycle(false);
+
+				game_menu_process_hotspots();
+
+				if (game_menu_changed) {
+
+					if (game_menu_current_item == 0) game_menu_current_item = -1;
+
+					game_menu_generate_messages();
+
+					/* Matte out the next graphics frame */
+
+					matte_frame(kernel.fx, false);
+
+					if (first_time) {
+						/* Hack to prevent matte manager from erasing big frame sprite */
+						/* but to allow it to remain on the screen as long as nothing  */
+						/* overlaps with it.                                           */
+						image_marker = 0;
+						first_time = false;
+					}
+
+					game_menu_changed = false;
+				}
+
+				mouse_end_cycle(false, false);
+
+				kernel.fx = 0;
+			}
+		}
+
+		switch (game_menu_selected_item) {
+		case 0:
+			game_menu_selected_item = game_menu_return_key ? 8 : 9;
+			break;
+
+		case 1:
+			config_file.music_flag = !config_file.music_flag;
+			break;
+
+		case 2:
+			config_file.sound_flag = !config_file.sound_flag;
+			break;
+
+		case 3:
+			if (config_file.interface_hotspots == INTERFACE_MACINTOSH) {
+				config_file.interface_hotspots = INTERFACE_BRAINDEAD;
+			} else {
+				config_file.interface_hotspots = INTERFACE_MACINTOSH;
+			}
+			break;
+
+		case 4:
+			if (config_file.inventory_mode == INVENTORY_SPINNING) {
+				config_file.inventory_mode = INVENTORY_SQUAT;
+			} else {
+				config_file.inventory_mode = INVENTORY_SPINNING;
+			}
+			break;
+
+		case 5:
+			if (config_file.animated_interface == INTERFACE_ANIMATED) {
+				config_file.animated_interface = INTERFACE_STILL;
+			} else {
+				config_file.animated_interface = INTERFACE_ANIMATED;
+			}
+			break;
+
+		case 6:
+			config_file.screen_fade++;
+			if (config_file.screen_fade > SCREEN_FADE_FAST) {
+				config_file.screen_fade = SCREEN_FADE_SMOOTH;
+			}
+			break;
+
+		case 7:
+			if (config_file.naughtiness == STORYMODE_NICE) {
+				config_file.naughtiness = STORYMODE_NAUGHTY;
+			} else {
+				if (config_file.naughtiness == STORYMODE_NAUGHTY) {
+					config_file.naughtiness = STORYMODE_NICE;
+				}
+			}
+			break;
+		}
+
+		kernel.activate_menu = (game_menu_selected_item > 7) ? GAME_MAIN_MENU : GAME_OPTIONS_MENU;
+	}
+
+	if (game_menu_selected_item == 9) {
+		save_config = config_file;
+	} else {
+		write_config_file();
+		//game_load_config_parameters();
+	}
+}
+
+static void game_menu_select_slot(int slot) {
+	game_menu_save_select = slot;
+
+	if ((game_menu_save_select >= game_menu_save_top) &&
+		(game_menu_save_select < (game_menu_save_top + GAME_MAX_SAVES_ON_SCREEN))) {
+		goto done;
+	}
+
+	game_menu_save_top = game_menu_save_select - 2;
+	game_menu_save_top = MAX(game_menu_save_top, 0);
+
+done:
+	game_menu_save_select = MAX(game_menu_save_select, 0);
+	game_menu_save_select = MIN(game_menu_save_select, GAME_MAX_SAVE_SLOTS - 1);
+}
+
+static void game_menu_select_free_slot() {
+	int count;
+	int match = -1;
+	char *pointer;
+
+	for (count = 0; (match < 0) && (count < GAME_MAX_SAVE_SLOTS); count++) {
+		pointer = game_menu_save_string(count);
+		if (!*pointer) match = count;
+	}
+
+	if (match >= 0) {
+		game_menu_select_slot(match);
+	}
+}
+
+static void game_menu_select_last() {
+	int match;
+	int count;
+	char *string;
+
+	if (game.last_save < 0) {
+		match = -1;
+		for (count = GAME_MAX_SAVE_SLOTS - 1; (match < 0) && (count >= 0); count--) {
+			string = game_menu_save_string(count);
+			if (*string) {
+				match = count;
+			}
+		}
+		if (match >= 0) {
+			game.last_save = match;
+		} else {
+			game.last_save = 0;
+		}
+	}
+
+	game_menu_select_slot(game.last_save);
+
+	string = game_menu_save_string(game_menu_save_select);
+	if (!*string) {
+		game_menu_select_free_slot();
+	}
+}
+
+static int game_menu_save_keyboard(int going) {
+	int mykey;
+	int width;
+	char teeny[2];
+	char *string;
+	char work_buf[80];
+
+	if (keys_any()) {
+		mykey = keys_get();
+		going = game_menu_standard_keyboard(mykey, going);
+
+		if (going || game_menu_return_key) {
+
+			if (mykey == bksp_key) {
+				string = game_menu_save_string(game_menu_save_select);
+
+				if (*string) {
+					if (!game_menu_save_dirty) {
+						Common::strcpy_s(game_menu_save_buffer, GAME_MAX_SAVE_LENGTH, string);
+						game_menu_save_pointer = string;
+						game_menu_save_dirty = true;
+					}
+					string[strlen(string) - 1] = 0;
+				}
+
+				game_save_menu_virgin = false;
+				going = false;
+			}
+
+			if (mykey == enter_key) {
+				game_menu_selected_item = 15;
+				game_save_menu_virgin = false;
+				going = false;
+			}
+
+			if (mykey == ctrl_c_key) {
+				string = game_menu_save_string(game_menu_save_select);
+				if (!game_menu_save_dirty) {
+					Common::strcpy_s(game_menu_save_buffer, GAME_MAX_SAVE_LENGTH, string);
+					game_menu_save_pointer = string;
+					game_menu_save_dirty = true;
+				}
+				*string = 0;
+			}
+
+			if (mykey == ctrl_r_key) {
+				game_menu_save_dirty = false;
+			}
+
+			if (Common::isPrint(mykey)) {
+				if (game_save_menu_virgin) {
+					game_menu_select_free_slot();
+				}
+
+				string = game_menu_save_string(game_menu_save_select);
+
+				if (strlen(string) < GAME_MAX_SAVE_LENGTH) {
+					teeny[0] = (char)mykey;
+					teeny[1] = 0;
+					Common::strcpy_s(work_buf, string);
+					Common::strcat_s(work_buf, teeny);
+					width = font_string_width(font_conv, work_buf, -1);
+					if (width <= GAME_MAX_SAVE_WIDTH) {
+						if (!game_menu_save_dirty) {
+							Common::strcpy_s(game_menu_save_buffer, GAME_MAX_SAVE_LENGTH, string);
+							game_menu_save_pointer = string;
+							game_menu_save_dirty = true;
+						}
+						Common::strcat_s(string, GAME_MAX_SAVE_LENGTH, teeny);
+					}
+				}
+
+				game_save_menu_virgin = false;
+				game_menu_changed = true;
+				going = false;
+			}
+
+		}
+	}
+
+	return going;
+}
+
+static void game_menu_save() {
+	int going = true;
+	int first_time = true;
+	int frame_id;
+	int id;
+	int special_sprite;
+	int let_scroll_continue;
+	int old_scrolling;
+	int new_scrolling;
+	long menu_clock = 0;
+	long now_clock;
+	long scroll_base_clock = 0;
+	char *string;
+
+	game_menu_select_last();
+
+	game_save_menu_virgin = true;
+
+	game_been_to_save_screen = true;
+
+	game_menu_save_stroke = 0;
+
+	game_menu_first_init();
+
+	frame_id = game_menu_sprite(3, 2);
+
+	game_menu_save_dirty = false;
+
+	while (kernel.activate_menu == GAME_SAVE_MENU) {
+
+		going = true;
+
+		game_menu_save_select = MAX(game_menu_save_select, game_menu_save_top);
+		game_menu_save_select = MIN(game_menu_save_select, game_menu_save_top + GAME_MAX_SAVES_ON_SCREEN - 1);
+		game_menu_save_select = MIN(game_menu_save_select, GAME_MAX_SAVE_SLOTS - 1);
+
+		let_scroll_continue = 0;
+		if (!first_time && (game_menu_selected_item >= 50)) {
+			let_scroll_continue = game_menu_selected_item;
+		}
+
+		game_menu_save_init();
+		game_menu_hotspot_init();
+
+		if (!let_scroll_continue) {
+			mouse_init_cycle();
+		} else {
+			game_menu_current_item = let_scroll_continue;
+		}
+
+		game_menu_changed = true;
+
+		while (going && (game_menu_selected_item < 1)) {
+
+			going = game_menu_save_keyboard(going);
+
+			now_clock = timer_read();
+
+			if (now_clock != menu_clock) {
+				menu_clock = now_clock;
+
+				mouse_begin_cycle(false);
+
+				old_scrolling = (game_menu_current_item >= 50);
+
+				game_menu_process_hotspots();
+
+				new_scrolling = (game_menu_current_item >= 50);
+
+				if (new_scrolling) {
+					if (!old_scrolling) {
+						scroll_base_clock = now_clock + GAME_MENU_SCROLL_FIRST;
+						let_scroll_continue = 0;
+					} else {
+						if (now_clock >= scroll_base_clock) {
+							game_menu_selected_item = game_menu_current_item;
+							game_menu_changed = true;
+							scroll_base_clock = now_clock + GAME_MENU_SCROLL_SECOND;
+						} else if (let_scroll_continue && (game_menu_selected_item >= 0)) {
+							game_menu_selected_item = -1;
+						}
+					}
+				}
+
+				if (game_menu_changed) {
+
+					if (game_menu_current_item == 0) game_menu_current_item = -1;
+
+					id = (game_menu_save_select - game_menu_save_top) + 1;
+					if (!menu[id].status) menu[id].status = 2;
+
+					game_menu_generate_messages();
+
+					special_sprite = (game_menu_current_item == 50) ? 2 : 0;
+					id = game_menu_sprite(4 + special_sprite, 1);
+
+					special_sprite = (game_menu_current_item == 51) ? 2 : 0;
+					id = game_menu_sprite(5 + special_sprite, 1);
+
+					/* Matte out the next graphics frame */
+
+					matte_frame(kernel.fx, false);
+
+					/* Hack to prevent matte manager from erasing big frame sprite */
+					/* but to allow it to remain on the screen as long as nothing  */
+					/* overlaps with it.                                           */
+					image_marker = 0;
+					first_time = 0;
+
+					if (special_sprite >= 0) {
+						image_list[special_sprite].flags = IMAGE_ERASE;
+					}
+
+					game_menu_changed = false;
+				}
+
+				mouse_end_cycle(false, false);
+
+				kernel.fx = 0;
+			}
+		}
+
+		game_save_menu_virgin = false;
+
+		if ((game_menu_selected_item > 0) &&
+			(game_menu_selected_item <= GAME_MAX_SAVES_ON_SCREEN)) {
+			game_menu_save_select = game_menu_save_top + game_menu_selected_item - 1;
+		}
+
+		switch (game_menu_selected_item) {
+		case 0:
+			game_menu_selected_item = 17;
+			break;
+
+		case 15:
+			game_menu_save_dirty = false;
+			break;
+
+		case 16:
+			string = game_menu_save_string(game_menu_save_select);
+			*string = 0;
+			game_menu_save_dirty = false;
+			break;
+
+		case 50:
+			if (game_menu_save_top > 0) {
+				game_menu_save_top--;
+			}
+			break;
+
+		case 51:
+			if (game_menu_save_top < GAME_MAX_SAVE_SLOTS - 1) {
+				game_menu_save_top++;
+			}
+			break;
+
+		default:
+			break;
+		}
+
+		kernel.activate_menu = ((game_menu_selected_item == 15) ||
+			(game_menu_selected_item == 17)) ? GAME_MAIN_MENU : GAME_SAVE_MENU;
+
+		if (game_menu_save_dirty) {
+			if ((kernel.activate_menu != GAME_SAVE_MENU) ||
+				(game_menu_selected_item > 0)) {
+				Common::strcpy_s(game_menu_save_pointer, GAME_MAX_SAVE_LENGTH, game_menu_save_buffer);
+				game_menu_save_dirty = false;
+			}
+		}
+	}
+
+	if (game_menu_selected_item == 15) {
+		id = game_menu_save_select;
+		game.last_save = id;
+		global_save(id, game_menu_save_buffer);
+		kernel.activate_menu = GAME_ALERT_MENU;
+	}
+}
+
+static int game_menu_restore_keyboard(int going) {
+	int mykey;
+
+	if (keys_any()) {
+		mykey = keys_get();
+		going = game_menu_standard_keyboard(mykey, going);
+
+		if (going || game_menu_return_key) {
+			if (mykey == enter_key) {
+				game_menu_selected_item = 15;
+				going = false;
+			}
+		}
+	}
+
+	return going;
+}
+
+static void game_menu_restore() {
+	int going = true;
+	int first_time = true;
+	int frame_id;
+	int id;
+	int special_sprite;
+	int let_scroll_continue;
+	int old_scrolling;
+	int new_scrolling;
+	long menu_clock = 0;
+	long now_clock;
+	long scroll_base_clock = 0;
+	char *string;
+
+	game_been_to_save_screen = true;
+
+	game_menu_select_last();
+
+	game_menu_save_stroke = 0;
+
+	game_menu_first_init();
+
+	frame_id = game_menu_sprite(3, 2);
+
+	while (kernel.activate_menu == GAME_RESTORE_MENU) {
+
+		going = true;
+
+		game_menu_save_select = MAX(game_menu_save_select, game_menu_save_top);
+		game_menu_save_select = MIN(game_menu_save_select, game_menu_save_top + GAME_MAX_SAVES_ON_SCREEN - 1);
+		game_menu_save_select = MIN(game_menu_save_select, GAME_MAX_SAVE_SLOTS - 1);
+
+		let_scroll_continue = 0;
+		if (!first_time && (game_menu_selected_item >= 50)) {
+			let_scroll_continue = game_menu_selected_item;
+		}
+
+		game_menu_restore_init();
+		game_menu_hotspot_init();
+
+		if (!let_scroll_continue) {
+			mouse_init_cycle();
+		} else {
+			game_menu_current_item = let_scroll_continue;
+		}
+
+		game_menu_changed = true;
+
+		while (going && (game_menu_selected_item < 1)) {
+
+			going = game_menu_restore_keyboard(going);
+
+			now_clock = timer_read();
+
+			if (now_clock != menu_clock) {
+				menu_clock = now_clock;
+
+				mouse_begin_cycle(false);
+
+				old_scrolling = (game_menu_current_item >= 50);
+
+				game_menu_process_hotspots();
+
+				new_scrolling = (game_menu_current_item >= 50);
+
+				if (new_scrolling) {
+					if (!old_scrolling) {
+						scroll_base_clock = now_clock + GAME_MENU_SCROLL_FIRST;
+						let_scroll_continue = 0;
+					} else {
+						if (now_clock >= scroll_base_clock) {
+							game_menu_selected_item = game_menu_current_item;
+							game_menu_changed = true;
+							scroll_base_clock = now_clock + GAME_MENU_SCROLL_SECOND;
+						} else if (let_scroll_continue && (game_menu_selected_item >= 0)) {
+							game_menu_selected_item = -1;
+						}
+					}
+				}
+
+				if (game_menu_changed) {
+
+					if (game_menu_current_item == 0) game_menu_current_item = -1;
+
+					id = (game_menu_save_select - game_menu_save_top) + 1;
+					if (!menu[id].status) menu[id].status = 2;
+
+					game_menu_generate_messages();
+
+					special_sprite = (game_menu_current_item == 50) ? 2 : 0;
+					id = game_menu_sprite(4 + special_sprite, 1);
+
+					special_sprite = (game_menu_current_item == 51) ? 2 : 0;
+					id = game_menu_sprite(5 + special_sprite, 1);
+
+					/* Matte out the next graphics frame */
+
+					matte_frame(kernel.fx, false);
+
+					/* Hack to prevent matte manager from erasing big frame sprite */
+					/* but to allow it to remain on the screen as long as nothing  */
+					/* overlaps with it.                                           */
+					image_marker = 0;
+					first_time = 0;
+
+					if (special_sprite >= 0) {
+						image_list[special_sprite].flags = IMAGE_ERASE;
+					}
+
+					game_menu_changed = false;
+				}
+
+				mouse_end_cycle(false, false);
+
+				kernel.fx = 0;
+			}
+		}
+
+		if ((game_menu_selected_item > 0) &&
+			(game_menu_selected_item <= GAME_MAX_SAVES_ON_SCREEN)) {
+			game_menu_save_select = game_menu_save_top + game_menu_selected_item - 1;
+		}
+
+		switch (game_menu_selected_item) {
+		case 0:
+			game_menu_selected_item = 17;
+			break;
+
+		case 15:
+			break;
+
+		case 16:
+			string = game_menu_save_string(game_menu_save_select);
+			*string = 0;
+			break;
+
+		case 50:
+			if (game_menu_save_top > 0) {
+				game_menu_save_top--;
+			}
+			break;
+
+		case 51:
+			if (game_menu_save_top < GAME_MAX_SAVE_SLOTS - 1) {
+				game_menu_save_top++;
+			}
+			break;
+
+		default:
+			break;
+		}
+
+		kernel.activate_menu = ((game_menu_selected_item == 15) ||
+			(game_menu_selected_item == 17)) ? GAME_MAIN_MENU : GAME_RESTORE_MENU;
+	}
+
+	if (game_menu_selected_item == 15) {
+		id = game_menu_save_select;
+		game.last_save = id;
+		global_restore(id);
+		kernel.activate_menu = GAME_ALERT_MENU;
+	}
+}
+
+static void game_menu_difficulty() {
+	int going = true;
+	int first_time = true;
+	int frame_id;
+	long menu_clock = 0;
+	long now_clock;
+
+	game_menu_first_init();
+
+	frame_id = game_menu_sprite(8, 2);
+
+	while (kernel.activate_menu == GAME_DIFFICULTY_MENU) {
+
+		going = true;
+
+		game_menu_difficulty_init();
+		game_menu_hotspot_init();
+
+		mouse_init_cycle();
+
+		game_menu_changed = true;
+
+		while (going && (game_menu_selected_item < 1)) {
+
+			going = game_menu_keyboard(going);
+
+			now_clock = timer_read();
+
+			if (now_clock != menu_clock) {
+				menu_clock = now_clock;
+
+				mouse_begin_cycle(false);
+
+				game_menu_process_hotspots();
+
+				if (game_menu_changed) {
+
+					if (game_menu_current_item == 0) game_menu_current_item = -1;
+
+					game_menu_generate_messages();
+
+					/* Matte out the next graphics frame */
+
+					matte_frame(kernel.fx, false);
+
+					if (first_time) {
+						/* Hack to prevent matte manager from erasing big frame sprite */
+						/* but to allow it to remain on the screen as long as nothing  */
+						/* overlaps with it.                                           */
+						image_marker = 0;
+						first_time = false;
+					}
+
+					game_menu_changed = false;
+				}
+
+				mouse_end_cycle(false, false);
+
+				kernel.fx = 0;
+			}
+		}
+
+		if (game_menu_return_key) {
+			game_menu_selected_item = 1;
+		}
+
+		switch (game_menu_selected_item) {
+		case 1:
+			game.difficulty = DIFFICULTY_EASY;
+			kernel.activate_menu = 0;
+			break;
+
+		case 2:
+			game.difficulty = DIFFICULTY_MEDIUM;
+			kernel.activate_menu = 0;
+			break;
+
+		case 3:
+			game.difficulty = DIFFICULTY_HARD;
+			kernel.activate_menu = 0;
+			break;
+
+		default:
+			game.going = false;
+			kernel.activate_menu = 0;
+			break;
+		}
+	}
+}
+
+
+static void game_menu_alert() {
+	int going = true;
+	int first_time = true;
+	int frame_id;
+	long menu_clock = 0;
+	long now_clock;
+
+	game_menu_first_init();
+
+	frame_id = game_menu_sprite(9, 2);
+
+	while (kernel.activate_menu == GAME_ALERT_MENU) {
+
+		going = true;
+
+		game_menu_alert_init();
+		game_menu_hotspot_init();
+
+		mouse_init_cycle();
+
+		game_menu_changed = true;
+
+		while (going && (game_menu_selected_item < 1)) {
+
+			going = game_menu_keyboard(going);
+
+			now_clock = timer_read();
+
+			if (now_clock != menu_clock) {
+				menu_clock = now_clock;
+
+				mouse_begin_cycle(false);
+
+				game_menu_process_hotspots();
+
+				if (game_menu_changed) {
+
+					if (game_menu_current_item < 2) game_menu_current_item = -1;
+
+					game_menu_generate_messages();
+
+					/* Matte out the next graphics frame */
+
+					matte_frame(kernel.fx, false);
+
+					if (first_time) {
+						/* Hack to prevent matte manager from erasing big frame sprite */
+						/* but to allow it to remain on the screen as long as nothing  */
+						/* overlaps with it.                                           */
+						image_marker = 0;
+						first_time = false;
+					}
+
+					game_menu_changed = false;
+				}
+
+				mouse_end_cycle(false, false);
+
+				kernel.fx = 0;
+			}
+		}
+
+		if (game_menu_return_key) {
+			game_menu_selected_item = 1;
+		}
+
+		kernel.activate_menu = 0;
+	}
+}
+
+
+
+
+
+
+void game_menu() {
+	while (keys_any())
+		keys_get();
+
+	game_menu_setup();
+
+	game_menu_direct_jump = (kernel.activate_menu != GAME_MAIN_MENU);
+
+	while (kernel.activate_menu && game.going) {
+
+		switch (kernel.activate_menu) {
+		case GAME_MAIN_MENU:
+			game_menu_main();
+			break;
+
+		case GAME_SAVE_MENU:
+			game_menu_save();
+			break;
+
+		case GAME_RESTORE_MENU:
+			game_menu_restore();
+			break;
+
+		case GAME_OPTIONS_MENU:
+			game_menu_options();
+			break;
+
+		case GAME_DIFFICULTY_MENU:
+			game_menu_difficulty();
+			break;
+
+		case GAME_ALERT_MENU:
+			game_menu_alert();
+			break;
+
+		default:
+			kernel.activate_menu = 0;
+		}
+
+		if ((kernel.activate_menu == GAME_MAIN_MENU) && game_menu_direct_jump) {
+			kernel.activate_menu = 0;
+		}
+	}
+
+	game_menu_shutdown();
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/menus.h b/engines/mads/madsv2/nebular/menus.h
new file mode 100644
index 00000000000..ed47865b310
--- /dev/null
+++ b/engines/mads/madsv2/nebular/menus.h
@@ -0,0 +1,37 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MENUS_H
+#define MADS_NEBULAR_MENUS_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+extern void game_menu();
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 3966c5b9a6c..d55af025937 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -541,7 +541,7 @@ struct Game {
 	char *const _aaName = kernel.interface;
 	int8 &_difficulty = game.difficulty;
 	byte &_widepipeCtr = kernel.cheating;
-	int8 _storyMode = 0;
+	int &_storyMode = config_file.naughtiness;
 	int &_winStatus = win_status;
 
 	void loadQuoteSet(int quote1, ...);
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index f0a0abbeda1..7415534b400 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -74,6 +74,7 @@ MODULE_OBJS += \
 	madsv2/nebular/global.o \
 	madsv2/nebular/main.o \
 	madsv2/nebular/main_menu.o \
+	madsv2/nebular/menus.o \
 	madsv2/nebular/asound.o \
 	madsv2/nebular/sound_nebular.o \
 	madsv2/nebular/mads/mads.o \


Commit: 444203c48b0c68982ceb25ce88ee39718e149e9d
    https://github.com/scummvm/scummvm/commit/444203c48b0c68982ceb25ce88ee39718e149e9d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:51+10:00

Commit Message:
MADS: NEBULAR: Font loading differences

Changed paths:
    engines/mads/madsv2/core/kernel.cpp


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 72d6f3849ab..dc9bb62b1cc 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -245,8 +245,10 @@ void kernel_game_shutdown() {
 	if (font_conv != NULL) mem_free(font_conv);
 	if (font_inter != NULL) mem_free(font_inter);
 	if (font_main != NULL) mem_free(font_main);
+	if (font_tele != NULL) mem_free(font_tele);
 
-	font_main = font_conv = font_inter = NULL;
+	font_misc = font_menu = font_conv = nullptr;
+	font_inter = font_main = font_tele = NULL;
 
 	// Deallocate main screen buffer
 	if (work_screen_ems_handle < 0)
@@ -384,13 +386,16 @@ int kernel_game_startup(int game_video_mode, int load_flag,
 		font_main = font_load("*FONTMAIN.FF");
 		font_inter = font_load("*FONTINTR.FF");
 		font_conv = font_load("*FONTCONV.FF");
-		font_menu = font_load("*FONTMENU.FF");
 		font_misc = font_load("*FONTMISC.FF");
-		font_tele = (g_engine->getGameID() != GType_RexNebular) ? nullptr :
-			font_load("*FONTTELE.FF");
 
-		if ((font_main == NULL) || (font_inter == NULL) || (font_conv == NULL) ||
-			(font_menu == NULL) || (font_misc == NULL) ||
+		font_menu = font_tele = nullptr;
+		if (g_engine->getGameID() == GType_RexNebular)
+			font_tele = font_load("*FONTTELE.FF");
+		else
+			font_menu = font_load("*FONTMENU.FF");
+
+		if ((font_main == NULL) || (font_inter == NULL) || (font_conv == NULL) || (font_misc == NULL) ||
+			(g_engine->getGameID() != GType_RexNebular && font_menu == NULL) ||
 			(g_engine->getGameID() == GType_RexNebular && font_tele == NULL)) {
 #ifndef disable_error_check
 			error_code = ERROR_KERNEL_NO_FONTS;


Commit: e36437d82d310a17fadf219e487d51756059216c
    https://github.com/scummvm/scummvm/commit/e36437d82d310a17fadf219e487d51756059216c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:51+10:00

Commit Message:
MADS: NEBULAR: Temporarily hardcode game to start, popup load isn't used

Changed paths:
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/nebular/main.cpp


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index dc9bb62b1cc..deb3c5eb19a 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -465,7 +465,7 @@ int kernel_game_startup(int game_video_mode, int load_flag,
 		vocab_load_active();
 	}
 
-	if (load_flag & KERNEL_STARTUP_POPUP) {
+	if (load_flag & KERNEL_STARTUP_POPUP && g_engine->getGameID() != GType_RexNebular) {
 		if (popup_box_load()) {
 			error_code = ERROR_KERNEL_NO_POPUP;
 			goto done;
diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
index e46920e66ea..87e025ed9c2 100644
--- a/engines/mads/madsv2/nebular/main.cpp
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -52,6 +52,10 @@ constexpr byte LINE_COLOR = 2;
 char *quotes;
 
 static void main_menu_main() {
+	// TODO
+	selected_item = 0;
+	return;
+
 	auto &screen = *g_engine->getScreen();
 	Palette palette;
 


Commit: f5e1e37000ed0a97966cafa868fea37787029995
    https://github.com/scummvm/scummvm/commit/f5e1e37000ed0a97966cafa868fea37787029995
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:52+10:00

Commit Message:
MADS: NEBULAR: Rex room loading code

Changed paths:
  A engines/mads/madsv2/nebular/extra.cpp
  A engines/mads/madsv2/nebular/extra.h
    engines/mads/madsv2/core/anim.cpp
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/core/pal.cpp
    engines/mads/madsv2/core/pal.h
    engines/mads/madsv2/core/room.cpp
    engines/mads/madsv2/core/room.h
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/anim.cpp b/engines/mads/madsv2/core/anim.cpp
index 93f4605eb60..b8e028c138f 100644
--- a/engines/mads/madsv2/core/anim.cpp
+++ b/engines/mads/madsv2/core/anim.cpp
@@ -224,7 +224,7 @@ AnimPtr anim_load(const char *file_name, Buffer *orig, Buffer *depth,
 	char temp_buf[80];
 	char block_name[20];
 	char *mark;
-	word *color_slaves = (word *)temp_buf;
+	int16 *color_slaves = (int16 *)temp_buf;
 	word num_color_slaves;
 	long image_size, frame_size, speech_size, anim_size;
 	AnimPtr anim = NULL;
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index deb3c5eb19a..f61a36aa270 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -58,6 +58,7 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/imath.h"
 #include "mads/madsv2/forest/digi.h"
+#include "mads/madsv2/nebular/extra.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -2549,19 +2550,25 @@ int kernel_load_sound_driver(const char *name, char sound_card_, int sound_board
 void kernel_load_variant(int variant) {
 	room_variant = variant;
 
-	if (room_load_variant(room_id, room_variant, NULL, room,
-		&scr_depth,
-		&scr_walk,
-		&scr_special,
-		&depth_map,
-		&depth_resource,
-		-1)) {
-		error_report(ERROR_VARIANT_LOAD_FAILURE, WARNING, MODULE_KERNEL, room_load_error, (room_id * 10) + room_variant);
-	}
+	if (g_engine->getGameID() == GType_RexNebular) {
+		RexNebular::room_load_depth(nullptr, &scr_depth, room, variant);
+		matte_refresh_work();
 
-	rail_connect_all_nodes();
+	} else {
+		if (room_load_variant(room_id, room_variant, NULL, room,
+			&scr_depth,
+			&scr_walk,
+			&scr_special,
+			&depth_map,
+			&depth_resource,
+			-1)) {
+			error_report(ERROR_VARIANT_LOAD_FAILURE, WARNING, MODULE_KERNEL, room_load_error, (room_id * 10) + room_variant);
+		}
 
-	camera_jump_to(picture_view_x, picture_view_y);
+		rail_connect_all_nodes();
+
+		camera_jump_to(picture_view_x, picture_view_y);
+	}
 }
 
 void kernel_new_palette() {
diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index d28f5cd9e73..d66231ab0a3 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -314,24 +314,6 @@ struct KernelGame {
 	void synchronize(Common::Serializer &s);
 };
 
-
-#ifdef old_animation
-#define kernel_animation                kernel_anim[0].anim
-#define kernel_animation_cycled         kernel_anim[0].cycled
-#define kernel_repeat_animation         kernel_anim[0].repeat
-#define kernel_animation_sprite_loaded  kernel_anim[0].sprite_loaded
-#define kernel_animation_buffer_id      kernel_anim[0].buffer_id
-#define kernel_animation_buffer         kernel_anim[0].buffer
-#define kernel_animation_frame          kernel_anim[0].frame
-#define kernel_animation_image          kernel_anim[0].image
-#define kernel_animation_doomed         kernel_anim[0].doomed
-#define kernel_animation_trigger_code   kernel_anim[0].trigger_code
-#define kernel_animation_trigger_mode   kernel_anim[0].trigger_mode
-#define kernel_animation_trigger_words  kernel_anim[0].trigger_words
-#define kernel_animation_next_clock     kernel_anim[0].next_clock
-#endif
-
-
 #define kernel_init_dialog() inter_reset_dialog()
 #define kernel_dialog(q)     inter_add_dialog(quote_string(kernel.quotes, q), q)
 
diff --git a/engines/mads/madsv2/core/pal.cpp b/engines/mads/madsv2/core/pal.cpp
index f48e7bd3b44..4066efab6e0 100644
--- a/engines/mads/madsv2/core/pal.cpp
+++ b/engines/mads/madsv2/core/pal.cpp
@@ -165,7 +165,7 @@ done:
 	return false;
 }
 
-void pal_compact(word master_handle, int num_slaves, word *slave) {
+void pal_compact(int16 master_handle, int num_slaves, int16 *slave) {
 	dword mask_test;
 	dword mask_out;
 	dword mask_in;
diff --git a/engines/mads/madsv2/core/pal.h b/engines/mads/madsv2/core/pal.h
index 120841f2b66..ef8d79ddd36 100644
--- a/engines/mads/madsv2/core/pal.h
+++ b/engines/mads/madsv2/core/pal.h
@@ -137,7 +137,7 @@ extern int  pal_deallocate(int use_flag);
  * Compresses a list of handles to a single handle (designed for use
  * by room loader so that background sprites don't take up lots of handles)
  */
-extern void pal_compact(word master_handle, int num_slaves, word *slave);
+extern void pal_compact(int16 master_handle, int num_slaves, int16 *slave);
 
 /**
  * Computes the sum of squared differences between the two colors
diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index a89ef6912e0..b52dca3dfe6 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -41,6 +41,8 @@
 #include "mads/madsv2/core/mcga.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/inter.h"
+#include "mads/madsv2/nebular/extra.h"
+#include "mads/madsv2/engine.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -79,6 +81,12 @@ void HotSpot::load(Common::SeekableReadStream *src) {
 	src->readMultipleLE(vocab, verb);
 }
 
+void RoomArt::load(Common::SeekableReadStream *src) {
+	src->readMultipleLE(xs, ys);
+	color_list.load(src);
+	cycle_list.load(src);
+}
+
 //====================================================================
 
 int room_read_def(int room_code, char *room_file, char *picture_base, int mads_mode) {
@@ -156,9 +164,13 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 
 	// Initialize structures
 	mem_last_alloc_loader = MODULE_ROOM_LOADER;
-
 	load_handle.open = false;
 
+	if (g_engine->getGameID() == GType_RexNebular) {
+		return RexNebular::room_load_rex(id, variant, base_path, picture, depth, walk, special, picMap, depthMap, picResource,
+			depthResource, picture_ems_handle, depth_ems_handle, load_flags);
+	}
+
 	// Open the room data file
 	room_resolve_base(base, temp_buf, id, base_path);
 
diff --git a/engines/mads/madsv2/core/room.h b/engines/mads/madsv2/core/room.h
index ff3adb1a775..ef6da1aa65b 100644
--- a/engines/mads/madsv2/core/room.h
+++ b/engines/mads/madsv2/core/room.h
@@ -131,6 +131,9 @@ struct RoomArt {
 	int ys;                             /* ...structure in the .ART file)   */
 	ColorList color_list;               /* List of colors used in picture   */
 	CycleList cycle_list;               /* List of color cycling ranges     */
+
+	static constexpr int SIZE = 2 + 2 + ColorList::SIZE + CycleList::SIZE;
+	void load(Common::SeekableReadStream *src);
 };
 typedef RoomArt *RoomArtPtr;
 
@@ -165,7 +168,6 @@ typedef RoomPict RoomPictPtr;
 /* Room definition structure (.DEF files) */
 
 struct RoomDef {
-
 	char picture_base[80];      /* Picture base                         */
 
 	int misc[10];               /* Room padding                         */
@@ -184,9 +186,6 @@ struct RoomDef {
 	ShadowList shadow;          /* Shadow list                          */
 };
 
-
-
-/* Loadable Room definition (.DAT files) */
 struct RoomFile {
 	char picture_base[80];           /* Picture base name             */
 	uint16 misc[10];                 /* Padding for future updates    */
@@ -210,9 +209,7 @@ struct RoomFile {
 /* Run-time room definition structure (in memory) */
 
 struct Room {
-	/* int       id;                       Room number                   */
-	/* int       picture_id;               Room whose ART file is needed */
-	/* int       format;                   Room format (panning/normal)  */
+	int16		room_id;				  /* Room id (only in Rex Nebular) */
 	int16       xs, ys;                   /* X and Y size of room picture  */
 
 	uint16      misc[10];                /* Padding for future updates    */
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
new file mode 100644
index 00000000000..0290eabe15f
--- /dev/null
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -0,0 +1,334 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/engine.h"
+#include "mads/madsv2/core/buffer.h"
+#include "mads/madsv2/core/env.h"
+#include "mads/madsv2/core/error.h"
+#include "mads/madsv2/core/mads.h"
+#include "mads/madsv2/core/mem.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/sprite.h"
+#include "mads/madsv2/nebular/extra.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+/* Loadable Room definition (.DAT files) */
+struct RoomFileRex {
+	uint16 room_id;                  /* Room id                       */
+	uint16 picture_id;               /* Background picture id         */
+	uint16 format;                   /* Background picture format     */
+	uint16 xs, ys;                   /* Background picture size       */
+	// 24 unknown bytes
+	uint16 num_rails;                /* Number of rail nodes          */
+	uint16 front_y, back_y;          /* Player scaling baselines      */
+	uint16 front_scale, back_scale;  /* Player scaling factors        */
+	uint16 depth_table[16];          /* Player depth table            */
+	Rail rail[ROOM_MAX_RAILS];       /* Rail nodes for room           */
+
+	uint16 num_series;
+	uint16 num_images;
+	char series_name[10][64];
+	Image image_list[50];
+
+	static constexpr int SIZE = (5 * 2) + 24 + (5 * 2) + (16 * 2) + (Rail::SIZE * ROOM_MAX_RAILS) +
+		2 + 2 + (10 * 64) + (50 * Image::SIZE);
+	void load(Common::SeekableReadStream *src) {
+		src->readMultipleLE(room_id, picture_id, format, xs, ys);
+		src->skip(24);
+		src->readMultipleLE(num_rails, front_y, back_y, front_scale, back_scale);
+		src->readMultipleLE(depth_table);
+
+		for (Rail &r : rail)
+			r.load(src);
+		src->readMultipleLE(num_series, num_images);
+		for (Image &img : image_list)
+			img.load(src);
+	}
+};
+
+
+static int room_picture_load(Room *room, int room_id, Buffer *picture, int load_flags) {
+	int error_flag = true;
+	int xs, ys;
+//	int color_handle;
+	long picture_size;
+	char temp_buf[80];
+	RoomArt art;
+	Load load_handle;
+	int count;
+
+	load_handle.open = false;
+
+	env_get_level_path(temp_buf, ROOM, ".ART", 0, room_id);
+
+	if (loader_open(&load_handle, temp_buf, "rb", true)) {
+		room_load_error = 1;
+		goto done;
+	}
+
+	// Read the room art header
+	{
+		byte buffer[RoomArt::SIZE];
+		if (!loader_read(&art, RoomArt::SIZE, 1, &load_handle)) {
+			room_load_error = 2;
+			goto done;
+		}
+
+		Common::MemoryReadStream src(buffer, RoomArt::SIZE);
+		art.load(&src);
+	}
+
+	xs = art.xs;
+	ys = art.ys;
+	picture_size = xs * ys;
+
+	// Copy the cycle list
+	room->cycle_list = art.cycle_list;
+
+	if (!(load_flags & ROOM_LOAD_TRANSLATE)) {
+		if (master_shadow) {
+			pal_init_shadow(master_shadow, &art.color_list);
+			pal_shadow_sort(master_shadow, &art.color_list);
+		}
+
+		room->color_handle = pal_allocate(&art.color_list, NULL, (load_flags & PAL_MAP_MASK));
+		if (room->color_handle < 0) {
+			room_load_error = 4;
+			goto done;
+		}
+
+		if (master_shadow) {
+			for (count = 0; count < master_shadow->num_shadow_colors; ++count) {
+				int col = master_shadow->shadow_color[count];
+				master_shadow->shadow_color[count] = art.color_list.table[col].x16;
+			}
+		}
+
+		for (count = 0; count < room->cycle_list.num_cycles; ++count) {
+			int col = room->cycle_list.table[count].first_list_color;
+			room->cycle_list.table[count].first_palette_color = art.color_list.table[col].x16;
+		}
+	}
+
+	buffer_init(picture, xs, ys);
+	if (picture->data == NULL) {
+		room_load_error = 3;
+		goto done;
+	}
+
+	if (!loader_read(picture->data, picture_size, 1, &load_handle)) {
+		room_load_error = 5;
+		goto done;
+	}
+
+	if (!(load_flags & ROOM_LOAD_TRANSLATE)) {
+		color_buffer_list_to_main(&art.color_list, picture);
+	}
+
+	error_flag = false;
+
+done:
+	if (error_flag) {
+		if (picture->data != NULL) buffer_free(picture);
+	}
+	if (load_handle.open) {
+		loader_close(&load_handle);
+	}
+	return (error_flag);
+}
+
+
+int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int variant) {
+	char filename[80];
+	Load load;
+//	void *buffer = nullptr;
+
+	bool hasLoad = load_handle != nullptr;
+	if (!hasLoad) {
+		env_get_level_path(filename, ROOM, ".DAT", room_info->room_id, variant);
+		loader_open(&load, filename, "rb", -1);
+		load_handle = &load;
+	}
+
+	byte *destP = buffer_pointer(depth, 0, 0);
+	byte *endP = destP + depth->x * depth->y;
+
+	byte runLength, runValue;
+	while (destP < endP && loader_read(&runLength, 1, 1, load_handle) == 1 && runLength > 0) {
+		if (loader_read(&runValue, 1, 1, load_handle) != 1)
+			break;
+
+		// Write out the run length
+		Common::fill(destP, MIN(endP, destP + runLength), runValue);
+		destP += runLength;
+	}
+
+	if (!hasLoad)
+		loader_close(&load);
+
+	return 0;
+}
+
+RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *picture,
+	Buffer *depth, Buffer *walk, Buffer *special, TileMapHeader *picMap,
+	TileMapHeader *depthMap, TileResource *picResource, TileResource *depthResource,
+	int picture_ems_handle, int depth_ems_handle, int load_flags) {
+//	int error_flag = true;
+	int count;
+	long mem_needed;
+	Load load_handle;
+	RoomPtr roomPtr = NULL;
+	RoomFileRex roomfile;
+	char temp_buf[80];
+	char base[80];
+	char block_name[20];
+	bool sceneFlag = id >= 0;
+	int width, height, picSize;
+	int depthSize;
+	SeriesPtr sprites[10] = { nullptr };
+	int16 spritesColor[10] = { -1 };
+
+	// Initialize structures
+	mem_last_alloc_loader = MODULE_ROOM_LOADER;
+	load_handle.open = false;
+
+	// Open the room data file
+	room_resolve_base(base, temp_buf, id, base_path);
+
+	if (loader_open(&load_handle, temp_buf, "rb", true)) {
+		room_load_error = 1;
+		goto error;
+	}
+
+	// Load room header block
+	{
+		byte buffer[RoomFileRex::SIZE];
+		if (!loader_read(buffer, RoomFileRex::SIZE, 1, &load_handle)) {
+			room_load_error = 2;
+			goto error;
+		}
+
+		Common::MemoryReadStream src(buffer, RoomFileRex::SIZE);
+		roomfile.load(&src);
+	}
+
+	Common::strcpy_s(block_name, "$ROOM");
+	env_catint(block_name, id, 3);
+
+	// Determine size needed for room data structure (based on # of rails)
+	mem_needed = (sizeof(Room) - sizeof(Rail)) + (sizeof(Rail) * (roomfile.num_rails + 2));
+	roomPtr = (RoomPtr)mem_get_name(mem_needed, block_name);
+	if (roomPtr == NULL) {
+		room_load_error = 3;
+		goto error;
+	}
+
+	roomPtr->num_variants = 0;
+	roomPtr->num_hotspots = 0;
+	roomPtr->num_rails = roomfile.num_rails;
+	roomPtr->xs = roomfile.xs;
+	roomPtr->ys = roomfile.ys;
+	roomPtr->front_y = roomfile.front_y;
+	roomPtr->back_y = roomfile.back_y;
+	roomPtr->front_scale = roomfile.front_scale;
+	roomPtr->back_scale = roomfile.back_scale;
+	Common::copy(roomfile.depth_table, roomfile.depth_table + 16, roomPtr->depth_table);
+
+	// Copy the rail nodes for walk movement
+	for (count = 0; count < roomfile.num_rails; count++) {
+		roomPtr->rail[count] = roomfile.rail[count];
+	}
+
+	width = roomfile.xs;
+	height = roomfile.ys;
+	picSize = width * height;
+
+	if (!picture->data)
+		buffer_init(picture, width, height);
+	assert(picture->data);
+
+	// Determine depth surface size
+	if (roomfile.format == 2)
+		width >>= 2;
+	depthSize = width * height;
+
+	if (!depth->data)
+		buffer_init(depth, width, height);
+	assert(depth->data);
+
+	if (room_load_depth(&load_handle, depth, roomPtr, variant))
+		goto error;
+
+	loader_close(&load_handle);
+
+	// Load in the foreground picture
+	room_picture_load(id, picture, load_flags);
+
+	// Handle room sprites
+
+	for (count = 0; count < roomfile.num_series; ++count) {
+		// Get series name
+		*base = '\0';
+		if (sceneFlag || *base_path == '*')
+			Common::strcpy_s(base, "*");
+		Common::strcat_s(base, roomfile.series_name[count]);
+
+		sprites[count] = sprite_series_load(base, load_flags);
+		if (!sprites[count]) {
+			error_report(-7, 1, 4, id, count);
+			goto error;
+		}
+
+		spritesColor[count] = sprites[count]->color_handle;
+	}
+
+	pal_compact(roomPtr->color_handle, roomfile.num_series, spritesColor);
+
+	for (count = 0; count < roomfile.num_images; ++count) {
+		const Image &img = roomfile.image_list[count];
+		SeriesPtr seriesPtr = sprites[img.series_id];
+
+		if (seriesPtr) {
+			assert(roomfile.format != 2);
+
+			// Draw the image onto the picture
+			sprite_draw_3d_scaled_big(seriesPtr, img.sprite_id, picture, depth,
+				img.x, img.y, img.depth, img.scale, 0, 0);
+		}
+	}
+
+	// Finished successfully
+	goto done;
+
+error:
+	delete roomPtr;
+	roomPtr = nullptr;
+
+done:
+	return roomPtr;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/extra.h b/engines/mads/madsv2/nebular/extra.h
new file mode 100644
index 00000000000..f62987015c0
--- /dev/null
+++ b/engines/mads/madsv2/nebular/extra.h
@@ -0,0 +1,41 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_EXTRA_H
+#define MADS_NEBULAR_EXTRA_H
+
+#include "mads/madsv2/core/room.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+extern RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *picture,
+	Buffer *depth, Buffer *walk, Buffer *special, TileMapHeader *picMap,
+	TileMapHeader *depthMap, TileResource *picResource, TileResource *depthResource,
+	int picture_ems_handle, int depth_ems_handle, int load_flags);
+extern int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int variant);
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index d55af025937..7136f661e31 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -106,6 +106,23 @@ enum ScreenTransition {
 	kNullPaletteCopy
 };
 
+// These original constants may be useful when cleaning up room logic
+#ifdef old_animation
+#define kernel_animation                kernel_anim[0].anim
+#define kernel_animation_cycled         kernel_anim[0].cycled
+#define kernel_repeat_animation         kernel_anim[0].repeat
+#define kernel_animation_sprite_loaded  kernel_anim[0].sprite_loaded
+#define kernel_animation_buffer_id      kernel_anim[0].buffer_id
+#define kernel_animation_buffer         kernel_anim[0].buffer
+#define kernel_animation_frame          kernel_anim[0].frame
+#define kernel_animation_image          kernel_anim[0].image
+#define kernel_animation_doomed         kernel_anim[0].doomed
+#define kernel_animation_trigger_code   kernel_anim[0].trigger_code
+#define kernel_animation_trigger_mode   kernel_anim[0].trigger_mode
+#define kernel_animation_trigger_words  kernel_anim[0].trigger_words
+#define kernel_animation_next_clock     kernel_anim[0].next_clock
+#endif
+
 struct Action {
 	struct ActiveAction {
 		int &_verbId = player2.words[0];
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 7415534b400..1df3e9158b9 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -71,6 +71,7 @@ MODULE_OBJS += \
 	madsv2/core/window.o \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
+	madsv2/nebular/extra.o \
 	madsv2/nebular/global.o \
 	madsv2/nebular/main.o \
 	madsv2/nebular/main_menu.o \


Commit: d353b300325ba8f1391d52dce37ee03ef62b66c9
    https://github.com/scummvm/scummvm/commit/d353b300325ba8f1391d52dce37ee03ef62b66c9
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:52+10:00

Commit Message:
MADS: NEBULAR: Fix LoaderReadStream class

Changed paths:
    engines/mads/madsv2/core/loader.cpp
    engines/mads/madsv2/core/loader.h
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/core/loader.cpp b/engines/mads/madsv2/core/loader.cpp
index aabb0d2634c..cf9f5693c41 100644
--- a/engines/mads/madsv2/core/loader.cpp
+++ b/engines/mads/madsv2/core/loader.cpp
@@ -55,11 +55,19 @@ int loader_ems_search_disabled = false;
 char loader_last[14] = "";
 
 
-uint32 LoaderReadStream::read(void *dataPtr, uint32 dataSize) {
-	loader_read(dataPtr, dataSize, 1, _load);
-	return dataSize;
+LoaderReadStream::LoaderReadStream(LoadHandle load) {
+	byte *data = (byte *)malloc(load->decompress_size);
+	(void)loader_read(data, 1, load->decompress_size, load);
+
+	_data = new Common::MemoryReadStream(data, load->decompress_size, DisposeAfterUse::YES);
+}
+
+LoaderReadStream::~LoaderReadStream() {
+	delete _data;
 }
 
+//====================================================================
+
 int loader_open(LoadHandle handle, const char *filename, const char *options, int flags) {
 	int error_flag = true;
 	int found_himem = -1;
diff --git a/engines/mads/madsv2/core/loader.h b/engines/mads/madsv2/core/loader.h
index 4fbbb8777fd..3413d1478ef 100644
--- a/engines/mads/madsv2/core/loader.h
+++ b/engines/mads/madsv2/core/loader.h
@@ -22,6 +22,7 @@
 #ifndef MADS_CORE_LOADER_H
 #define MADS_CORE_LOADER_H
 
+#include "common/memstream.h"
 #include "common/stream.h"
 #include "mads/madsv2/core/general.h"
 #include "mads/madsv2/core/pack.h"
@@ -56,17 +57,27 @@ typedef Load *LoadHandle;
  */
 class LoaderReadStream : public Common::SeekableReadStream {
 private:
-	LoadHandle _load;
+	Common::MemoryReadStream *_data;
+
 public:
-	LoaderReadStream(LoadHandle load) : _load(load) {}
-	~LoaderReadStream() override {
-	}
+	LoaderReadStream(LoadHandle load);
+	~LoaderReadStream() override;
 
-	int64 pos() const override { return 0; }
-	int64 size() const override { return 0; }
-	bool seek(int64 offset, int whence = SEEK_SET) override { return false; }
-	bool eos() const override { return false; }
-	uint32 read(void *dataPtr, uint32 dataSize) override;
+	int64 pos() const override {
+		return _data->pos();
+	}
+	int64 size() const override {
+		return _data->size();
+	}
+	bool seek(int64 offset, int whence = SEEK_SET) override {
+		return _data->seek(offset, whence);
+	}
+	bool eos() const override {
+		return _data->eos();
+	}
+	uint32 read(void *dataPtr, uint32 dataSize) override {
+		return _data->read(dataPtr, dataSize);
+	}
 };
 
 
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 0290eabe15f..2f4515320a4 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -173,12 +173,18 @@ int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int varia
 
 	byte *destP = buffer_pointer(depth, 0, 0);
 	byte *endP = destP + depth->x * depth->y;
-
 	byte runLength, runValue;
-	while (destP < endP && loader_read(&runLength, 1, 1, load_handle) == 1 && runLength > 0) {
-		if (loader_read(&runValue, 1, 1, load_handle) != 1)
+
+	// The data is encoded as a sequence of run lengths of given values
+	LoaderReadStream src(load_handle);
+
+	while (destP < endP) {
+		runLength = src.readByte();
+		if (!runLength)
 			break;
 
+		runValue = src.readByte();
+
 		// Write out the run length
 		Common::fill(destP, MIN(endP, destP + runLength), runValue);
 		destP += runLength;


Commit: 3736606d8663beeccd8a73f7b651e1912a602739
    https://github.com/scummvm/scummvm/commit/3736606d8663beeccd8a73f7b651e1912a602739
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:53+10:00

Commit Message:
MADS: NEBULAR: room_load_rex loading fixes

Changed paths:
    engines/mads/madsv2/core/room.cpp
    engines/mads/madsv2/core/room.h


diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index b52dca3dfe6..3a1c39b4dc3 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -528,17 +528,26 @@ int room_picture_load(int roomId, Buffer *picture, int load_flags) {
 
 	load_handle.open = false;
 
+	// Open up the art file
 	env_get_level_path(temp_buf, ROOM, ".ART", 0, roomId);
 	if (loader_open(&load_handle, temp_buf, "rb", true)) {
 		room_load_error = 1;
 		goto done;
 	}
 
-	if (!loader_read(&art, sizeof(RoomArt), 1, &load_handle)) {
-		room_load_error = 2;
-		goto done;
+	// Read it's contents
+	{
+		byte buffer[RoomArt::SIZE];
+		if (!loader_read(buffer, RoomArt::SIZE, 1, &load_handle)) {
+			room_load_error = 2;
+			goto done;
+		}
+
+		Common::MemoryReadStream src(buffer, RoomArt::SIZE);
+		art.load(&src);
 	}
 
+
 	xs = art.xs;
 	ys = art.ys;
 
diff --git a/engines/mads/madsv2/core/room.h b/engines/mads/madsv2/core/room.h
index ef6da1aa65b..2082498944e 100644
--- a/engines/mads/madsv2/core/room.h
+++ b/engines/mads/madsv2/core/room.h
@@ -127,8 +127,8 @@ typedef Rail *RailPtr;
 /* Room artwork definition structure (.ART files) */
 
 struct RoomArt {
-	int xs;                             /* Size of picture (follows this... */
-	int ys;                             /* ...structure in the .ART file)   */
+	int16 xs;                           /* Size of picture (follows this... */
+	int16 ys;                           /* ...structure in the .ART file)   */
 	ColorList color_list;               /* List of colors used in picture   */
 	CycleList cycle_list;               /* List of color cycling ranges     */
 


Commit: 13a3bd0ce38875b3daacb11f8075e29bafb788b1
    https://github.com/scummvm/scummvm/commit/13a3bd0ce38875b3daacb11f8075e29bafb788b1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:53+10:00

Commit Message:
MADS: NEBULAR: Different hotspot size in room loading

Changed paths:
    engines/mads/madsv2/core/room.cpp
    engines/mads/madsv2/core/room.h


diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index 3a1c39b4dc3..05c883b0b47 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -74,10 +74,17 @@ void RoomFile::load(Common::SeekableReadStream *src) {
 	shadow.load(src);
 }
 
-void HotSpot::load(Common::SeekableReadStream *src) {
+void HotSpot::load(Common::SeekableReadStream *src, bool isRexNebular) {
 	src->readMultipleLE(ul_x, ul_y, lr_x, lr_y, feet_x, feet_y,
-		facing, prep, active, cursor_number, syntax);
-	src->skip(1);
+		facing, prep, active, cursor_number);
+
+	if (isRexNebular) {
+		syntax = 0;
+	} else {
+		syntax = src->readByte();
+		src->skip(1);
+	}
+
 	src->readMultipleLE(vocab, verb);
 }
 
@@ -400,7 +407,8 @@ HotPtr room_load_hotspots(int id, int *num_spots) {
 
 	// Read in the hotspot list
 	{
-		size_t bytes_to_read = num_to_read * HotSpot::SIZE;
+		size_t bytes_to_read = num_to_read * (g_engine->getGameID() == GType_RexNebular ?
+			HotSpot::SIZE - 2 : HotSpot::SIZE);
 		byte *buffer = (byte *)malloc(bytes_to_read);
 		if (!loader_read(buffer, bytes_to_read, 1, &load_handle)) {
 			free(buffer);
@@ -409,7 +417,7 @@ HotPtr room_load_hotspots(int id, int *num_spots) {
 
 		Common::MemoryReadStream src(buffer, bytes_to_read);
 		for (int i = 0; i < num_to_read; ++i)
-			spots[i].load(&src);
+			spots[i].load(&src, g_engine->getGameID() == GType_RexNebular);
 
 		free(buffer);
 	}
diff --git a/engines/mads/madsv2/core/room.h b/engines/mads/madsv2/core/room.h
index 2082498944e..e2500fc3781 100644
--- a/engines/mads/madsv2/core/room.h
+++ b/engines/mads/madsv2/core/room.h
@@ -105,7 +105,7 @@ struct HotSpot {
 	int16 verb;                           /* Vocabulary id of default verb */
 
 	static constexpr size_t SIZE = 6 * 2 + (5 * 1) + 1 + 2 + 2;
-	void load(Common::SeekableReadStream *src);
+	void load(Common::SeekableReadStream *src, bool isRexNebular);
 };
 
 typedef HotSpot *HotPtr;


Commit: decfba815cf8360aad1e876b9334dd9bee7f8194
    https://github.com/scummvm/scummvm/commit/decfba815cf8360aad1e876b9334dd9bee7f8194
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:54+10:00

Commit Message:
MADS: NEBULAR: Fix thunk for getting anim current frame

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 343ffccef63..bf08cdbaefe 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -185,7 +185,7 @@ Scene::Animation &Scene::Animation::operator=(std::nullptr_t) {
 }
 
 int Scene::Animation::getCurrentFrame() const {
-	error("TODO: Animation::getCurrentFrame");
+	return _currentFrame;
 }
 
 void Scene::Animation::setNextFrameTimer(long time) {


Commit: 6e42fe596f6d4e1a7d868bf8f54930b99a88f8ca
    https://github.com/scummvm/scummvm/commit/6e42fe596f6d4e1a7d868bf8f54930b99a88f8ca
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:54+10:00

Commit Message:
MADS: NEBULAR: Fix for on-screen text corruption

kernel_message[].message field is a const char * in the original.
For our original Rex Nebular implementation, this was treated as
a Common::String field, thus automatically making a copy and
caching it. Now though, we have to maintain the original pointer
returned from the loaded quote, so the string content remains
persistent in memory. Likewise, when quote strings are split,
we need to match the original logic that used static memory
buffers to hold both lines until the string has been displayed.

Changed paths:
    engines/mads/madsv2/nebular/rooms/room102.cpp
    engines/mads/madsv2/nebular/rooms/room103.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room307.cpp
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room319.cpp
    engines/mads/madsv2/nebular/rooms/room402.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp
    engines/mads/madsv2/nebular/rooms/teleporter.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room102.cpp b/engines/mads/madsv2/nebular/rooms/room102.cpp
index a06c6cf4cb3..fa9d4ce482b 100644
--- a/engines/mads/madsv2/nebular/rooms/room102.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room102.cpp
@@ -278,7 +278,7 @@ static void room_102_parser() {
 	if (_action.isAction(VERB_WALKTO, NOUN_REFRIGERATOR) && justOpenedFl) {
 		local._fridgeFirstOpenFl = false;
 		int quoteId = _vm->getRandomNumber(59, 63);
-		Common::String curQuote = _game.getQuote(quoteId);
+		const char *curQuote = _game.getQuote(quoteId);
 		int width = _scene->_kernelMessages._talkFont->getWidth(curQuote, -1);
 		_scene->_kernelMessages.reset();
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
diff --git a/engines/mads/madsv2/nebular/rooms/room103.cpp b/engines/mads/madsv2/nebular/rooms/room103.cpp
index 350d590f692..da1f8711097 100644
--- a/engines/mads/madsv2/nebular/rooms/room103.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room103.cpp
@@ -252,7 +252,7 @@ static void room_103_parser() {
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -2, -2);
 
 				// Rex says "Gads.."
-				Common::String msg = _game.getQuote(51);
+				const char *msg = _game.getQuote(51);
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 0, 60, msg);
 				_scene->_sequences.addTimer(120, _vm->_game->_trigger + 1);
 			} else {
@@ -277,14 +277,14 @@ static void room_103_parser() {
 		case 0:
 		{
 			_game._player._stepEnabled = false;
-			Common::String msg = _game.getQuote(71);
+			const char *msg = _game.getQuote(71);
 			_scene->_kernelMessages.add(Common::Point(), 0x1110, 18, 1, 120, msg);
 			break;
 		}
 
 		case 1:
 		{
-			Common::String msg = _game.getQuote(72);
+			const char *msg = _game.getQuote(72);
 			_scene->_kernelMessages.add(Common::Point(310, 132), 0xFDFC, 16, 2, 120, msg);
 			break;
 		}
@@ -345,7 +345,7 @@ void room_103_error() {
 		_vm->_dialogs->show(10305);
 		_action._inProgress = false;
 	} else if (_action.isAction(VERB_PUT, NOUN_COAL, NOUN_FURNACE)) {
-		Common::String msg = _game.getQuote(73);
+		const char *msg = _game.getQuote(73);
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, msg);
 		_action._inProgress = false;
 	}
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index b171b37a8fc..eaa84c2c528 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -549,12 +549,12 @@ static void handleConversations() {
 	if (_game._trigger == 0) {
 		_scene->_kernelMessages.reset();
 		_game._player._stepEnabled = false;
-		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+		const char *curQuote = _game.getQuote(_action._activeAction._verbId);
 		if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
-			Common::String subQuote1, subQuote2;
-			_game.splitQuote(curQuote, subQuote1, subQuote2);
-			Common::strcpy_s(local._subQuote2, subQuote2.c_str());
-			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
+			static char line1[34], line2[34];
+			_game.splitQuote(curQuote, line1, line2);
+			Common::strcpy_s(local._subQuote2, line2);
+			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, line1);
 			_scene->_sequences.addTimer(60, 50);
 		} else {
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
diff --git a/engines/mads/madsv2/nebular/rooms/room307.cpp b/engines/mads/madsv2/nebular/rooms/room307.cpp
index 99b191f43ab..b5564aabd71 100644
--- a/engines/mads/madsv2/nebular/rooms/room307.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room307.cpp
@@ -56,11 +56,11 @@ static Scratch local;
 
 
 static void handleRexDialog(int quote) {
-	Common::String curQuote = _game.getQuote(quote);
+	const char *curQuote = _game.getQuote(quote);
 	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-		Common::String subQuote1, subQuote2;
+		static char subQuote1[34], subQuote2[34];
 		_game.splitQuote(curQuote, subQuote1, subQuote2);
-		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+		Common::strcpy_s(local._subQuote2, subQuote2);
 
 		_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 180, local._subQuote2);
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index 74ed974560b..6def6a0cbc1 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -55,9 +55,9 @@ static Scratch local;
 static void handleRexDialogs(int quote) {
 	_scene->_kernelMessages.reset();
 
-	Common::String curQuote = _game.getQuote(quote);
+	const char *curQuote = _game.getQuote(quote);
 	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-		Common::String subQuote1, subQuote2;
+		static char subQuote1[34], subQuote2[34];
 		_game.splitQuote(curQuote, subQuote1, subQuote2);
 
 
diff --git a/engines/mads/madsv2/nebular/rooms/room319.cpp b/engines/mads/madsv2/nebular/rooms/room319.cpp
index 9ef2fd1982d..1ffb09ec3ad 100644
--- a/engines/mads/madsv2/nebular/rooms/room319.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room319.cpp
@@ -58,11 +58,11 @@ static Scratch local;
 static void handleRexDialogues(int quote) {
 	_scene->_kernelMessages.reset();
 
-	Common::String curQuote = _game.getQuote(quote);
+	const char *curQuote = _game.getQuote(quote);
 	if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-		Common::String subQuote1, subQuote2;
+		static char subQuote1[34], subQuote2[34];
 		_game.splitQuote(curQuote, subQuote1, subQuote2);
-		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
+		Common::strcpy_s(local._subQuote2, subQuote2);
 
 		_scene->_kernelMessages.add(Common::Point(160, 106), 0x1110, 32, 0, 120, subQuote1);
 		_scene->_kernelMessages.add(Common::Point(160, 120), 0x1110, 32, 1, 120, local._subQuote2);
diff --git a/engines/mads/madsv2/nebular/rooms/room402.cpp b/engines/mads/madsv2/nebular/rooms/room402.cpp
index 85289907d57..4696f090cb5 100644
--- a/engines/mads/madsv2/nebular/rooms/room402.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room402.cpp
@@ -401,9 +401,9 @@ static void handleDialogs() {
 	if (_game._trigger == 0) {
 		_scene->_kernelMessages.reset();
 		_game._player._stepEnabled = false;
-		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+		const char *curQuote = _game.getQuote(_action._activeAction._verbId);
 		if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
-			Common::String subQuote1, subQuote2;
+			static char subQuote1[34], subQuote2[34];
 			_game.splitQuote(curQuote, subQuote1, subQuote2);
 			_scene->_kernelMessages.add(Common::Point(230, 42), 0x1110, 32, 0, 140, subQuote1);
 			_scene->_kernelMessages.add(Common::Point(230, 56), 0x1110, 32, 0, 140, subQuote2);
diff --git a/engines/mads/madsv2/nebular/rooms/room611.cpp b/engines/mads/madsv2/nebular/rooms/room611.cpp
index cc52a0f8bfc..e9b2825473c 100644
--- a/engines/mads/madsv2/nebular/rooms/room611.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room611.cpp
@@ -144,7 +144,7 @@ static void displayHermitQuestions(int question) {
 	switch (question) {
 	case 1:
 	{
-		Common::String curQuote = _game.getQuote(0x281);
+		const char *curQuote = _game.getQuote(0x281);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -158,7 +158,7 @@ static void displayHermitQuestions(int question) {
 
 	case 2:
 	{
-		Common::String curQuote = _game.getQuote(0x283);
+		const char *curQuote = _game.getQuote(0x283);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -172,7 +172,7 @@ static void displayHermitQuestions(int question) {
 
 	case 3:
 	{
-		Common::String curQuote = _game.getQuote(0x285);
+		const char *curQuote = _game.getQuote(0x285);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -181,7 +181,7 @@ static void displayHermitQuestions(int question) {
 
 	case 4:
 	{
-		Common::String curQuote = _game.getQuote(0x286);
+		const char *curQuote = _game.getQuote(0x286);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -190,7 +190,7 @@ static void displayHermitQuestions(int question) {
 
 	case 5:
 	{
-		Common::String curQuote = _game.getQuote(0x297);
+		const char *curQuote = _game.getQuote(0x297);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y - 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -209,7 +209,7 @@ static void displayHermitQuestions(int question) {
 
 	case 6:
 	{
-		Common::String curQuote = _game.getQuote(0x29A);
+		const char *curQuote = _game.getQuote(0x29A);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -223,7 +223,7 @@ static void displayHermitQuestions(int question) {
 
 	case 7:
 	{
-		Common::String curQuote = _game.getQuote(0x2A0);
+		const char *curQuote = _game.getQuote(0x2A0);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -237,7 +237,7 @@ static void displayHermitQuestions(int question) {
 
 	case 8:
 	{
-		Common::String curQuote = _game.getQuote(0x2A2);
+		const char *curQuote = _game.getQuote(0x2A2);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -256,7 +256,7 @@ static void displayHermitQuestions(int question) {
 
 	case 9:
 	{
-		Common::String curQuote = _game.getQuote(0x2A5);
+		const char *curQuote = _game.getQuote(0x2A5);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -270,7 +270,7 @@ static void displayHermitQuestions(int question) {
 
 	case 10:
 	{
-		Common::String curQuote = _game.getQuote(0x2A8);
+		const char *curQuote = _game.getQuote(0x2A8);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -289,7 +289,7 @@ static void displayHermitQuestions(int question) {
 
 	case 11:
 	{
-		Common::String curQuote = _game.getQuote(0x2AB);
+		const char *curQuote = _game.getQuote(0x2AB);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -313,7 +313,7 @@ static void displayHermitQuestions(int question) {
 
 	case 12:
 	{
-		Common::String curQuote = _game.getQuote(0x2AF);
+		const char *curQuote = _game.getQuote(0x2AF);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -337,7 +337,7 @@ static void displayHermitQuestions(int question) {
 
 	case 13:
 	{
-		Common::String curQuote = _game.getQuote(0x2B3);
+		const char *curQuote = _game.getQuote(0x2B3);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -365,7 +365,7 @@ static void displayHermitQuestions(int question) {
 
 	case 14:
 	{
-		Common::String curQuote = _game.getQuote(0x2BA);
+		const char *curQuote = _game.getQuote(0x2BA);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -389,7 +389,7 @@ static void displayHermitQuestions(int question) {
 
 	case 15:
 	{
-		Common::String curQuote = _game.getQuote(0x2BE);
+		const char *curQuote = _game.getQuote(0x2BE);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -413,7 +413,7 @@ static void displayHermitQuestions(int question) {
 
 	case 16:
 	{
-		Common::String curQuote = _game.getQuote(0x2C2);
+		const char *curQuote = _game.getQuote(0x2C2);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -442,7 +442,7 @@ static void displayHermitQuestions(int question) {
 
 	case 17:
 	{
-		Common::String curQuote = _game.getQuote(0x2C7);
+		const char *curQuote = _game.getQuote(0x2C7);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -466,7 +466,7 @@ static void displayHermitQuestions(int question) {
 
 	case 18:
 	{
-		Common::String curQuote = _game.getQuote(0x2CB);
+		const char *curQuote = _game.getQuote(0x2CB);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -485,7 +485,7 @@ static void displayHermitQuestions(int question) {
 
 	case 19:
 	{
-		Common::String curQuote = _game.getQuote(0x2CE);
+		const char *curQuote = _game.getQuote(0x2CE);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -504,7 +504,7 @@ static void displayHermitQuestions(int question) {
 
 	case 20:
 	{
-		Common::String curQuote = _game.getQuote(0x2E1);
+		const char *curQuote = _game.getQuote(0x2E1);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
@@ -533,7 +533,7 @@ static void displayHermitQuestions(int question) {
 
 	case 21:
 	{
-		Common::String curQuote = _game.getQuote(0x2D3);
+		const char *curQuote = _game.getQuote(0x2D3);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, 800, curQuote);
@@ -562,7 +562,7 @@ static void displayHermitQuestions(int question) {
 
 	case 22:
 	{
-		Common::String curQuote = _game.getQuote(0x2D8);
+		const char *curQuote = _game.getQuote(0x2D8);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 17), 0xFDFC, 0, 0, 700, curQuote);
@@ -586,7 +586,7 @@ static void displayHermitQuestions(int question) {
 
 	case 23:
 	{
-		Common::String curQuote = _game.getQuote(0x2DC);
+		const char *curQuote = _game.getQuote(0x2DC);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 3), 0xFDFC, 0, 0, 700, curQuote);
@@ -757,7 +757,7 @@ static void handleSubDialog1() {
 		handleTalking(200);
 		_scene->_kernelMessages.reset();
 
-		Common::String curQuote = _game.getQuote(0x2D1);
+		const char *curQuote = _game.getQuote(0x2D1);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, 120, curQuote);
@@ -817,7 +817,7 @@ static void handleSubDialog1() {
 	{
 		_scene->_kernelMessages.reset();
 
-		Common::String curQuote = _game.getQuote(0x2E6);
+		const char *curQuote = _game.getQuote(0x2E6);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, 120, curQuote);
@@ -855,7 +855,7 @@ static void handleSubDialog2() {
 	case 0x29F:
 	{
 		_scene->_kernelMessages.reset();
-		Common::String curQuote = _game.getQuote(0x2A7);
+		const char *curQuote = _game.getQuote(0x2A7);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 14), 0xFDFC, 0, 0, 120, curQuote);
@@ -874,11 +874,11 @@ static void handleDialog() {
 		_scene->_kernelMessages.reset();
 		_game._player._stepEnabled = false;
 
-		Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+		const char *curQuote = _game.getQuote(_action._activeAction._verbId);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 
 		if (width > 200) {
-			Common::String subQuote1, subQuote2;
+			static char subQuote1[34], subQuote2[34];
 			_game.splitQuote(curQuote, subQuote1, subQuote2);
 			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 150, subQuote1);
 
@@ -1348,7 +1348,7 @@ static void room_611_parser() {
 	} else if (_action.isAction(VERB_GIVE, NOUN_HERMIT)) {
 		_scene->_kernelMessages.reset();
 
-		Common::String curQuote = _game.getQuote(0x323);
+		const char *curQuote = _game.getQuote(0x323);
 		int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		int quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y), 0xFDFC, 0, 0, 120, curQuote);
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter.cpp b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
index fb8d94bc260..a268fe1220b 100644
--- a/engines/mads/madsv2/nebular/rooms/teleporter.cpp
+++ b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
@@ -38,8 +38,8 @@ static int _finishedCodeCounter;
 static int _meteorologistNextPlace;
 static int _meteorologistCurPlace;
 static int _teleporterSceneId;
-static char _msgText[256];
-
+static char _msgText1[256];
+static char _msgText2[256];
 
 void teleporter_init() {
 	_buttonTyped = -1;
@@ -60,7 +60,7 @@ void teleporter_init() {
 	_digitCount = 0;
 	_finishedCodeCounter = 0;
 	_curMessageId = -1;
-	Common::strcpy_s(_msgText, "_");
+	Common::strcpy_s(_msgText2, "_");
 
 	if (_scene->_priorSceneId == RETURNING_FROM_DIALOG)
 		_scene->_priorSceneId = _globals[kTeleporterDestination];
@@ -84,11 +84,11 @@ void teleporter_init() {
 			_meteorologistNextPlace = _globals[kTeleporterCode + i];
 	}
 
-	Common::String msgText2 = Common::String::format("#%.4d", codeVal);
+	Common::sprintf_s(_msgText1, "#%.4d", codeVal);
 
 	if (_scene->_currentSceneId != 711) {
-		_scene->_kernelMessages.add(Common::Point(133, 34), 0, 32, 0, INDEFINITE_TIMEOUT, msgText2);
-		_scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText);
+		_scene->_kernelMessages.add(Common::Point(133, 34), 0, 32, 0, INDEFINITE_TIMEOUT, _msgText1);
+		_scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText2);
 	}
 
 	_meteorologistCurPlace = 0;
@@ -195,9 +195,9 @@ void teleporter_handle_key() {
 
 				Common::String format = "%01d";
 				format.setChar('0' + _digitCount, 2);
-				Common::strcpy_s(_msgText, Common::String::format(format.c_str(), _curCode).c_str());
+				Common::strcpy_s(_msgText2, Common::String::format(format.c_str(), _curCode).c_str());
 				if (_digitCount < 4)
-					Common::strcat_s(_msgText, "_");
+					Common::strcat_s(_msgText2, "_");
 
 				if (_scene->_currentSceneId != 711)
 					_vm->_sound->command(32);
@@ -205,7 +205,7 @@ void teleporter_handle_key() {
 		} else if (_buttonTyped == 11) {
 			_digitCount = 0;
 			_curCode = 0;
-			Common::strcpy_s(_msgText, "_");
+			Common::strcpy_s(_msgText2, "_");
 			if (_scene->_currentSceneId != 711)
 				_vm->_sound->command(33);
 		} else if (_digitCount == 4) {
@@ -226,7 +226,7 @@ void teleporter_handle_key() {
 		if (_scene->_currentSceneId != 711) {
 			if (_curMessageId >= 0)
 				_scene->_kernelMessages.remove(_curMessageId);
-			_curMessageId = _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText);
+			_curMessageId = _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText2);
 		}
 		break;
 
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index bf08cdbaefe..9267125389b 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -129,16 +129,8 @@ char *Game::getQuote(int quote_id) {
 	return quote_string(kernel.quotes, quote_id);
 }
 
-void Game::splitQuote(const Common::String &source, Common::String &line1, Common::String &line2) {
-	// Make the first line up the end of the word at the half-way point
-	const char *strP = source.c_str() + source.size() / 2;
-	while (*strP != ' ') ++strP;
-
-	line1 = Common::String(source.c_str(), strP);
-
-	// The rest of the string goes in the second line
-	while (*strP == ' ') ++strP;
-	line2 = Common::String(strP);
+void Game::splitQuote(const char *source, char *line1, char *line2) {
+	quote_split_string(source, line1, line2);
 }
 
 int16 &Globals::operator[](int idx) {
@@ -247,8 +239,8 @@ int Scene::KernelMessages::TalkFont::getWidth(const Common::String &message, int
 }
 
 int Scene::KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
-		uint32 timeout, const Common::String &msg) {
-	return kernel_message_add(const_cast<char *>(msg.c_str()), pt.x, pt.y, fontColor, timeout, endTrigger, 0);
+		uint32 timeout, const char *msg) {
+	return kernel_message_add(const_cast<char *>(msg), pt.x, pt.y, fontColor, timeout, endTrigger, 0);
 }
 
 int Scene::KernelMessages::addQuote(int quoteId, int endTrigger, uint32 timeout) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 7136f661e31..c7a1c2c7a7a 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -269,7 +269,7 @@ struct Scene {
 		Entries _entries;
 
 		int add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
-			uint32 timeout, const Common::String &msg);
+			uint32 timeout, const char *msg);
 		int addQuote(int quoteId, int endTrigger, uint32 timeout);
 		void remove(int msgIndex);
 		void reset();
@@ -563,7 +563,7 @@ struct Game {
 
 	void loadQuoteSet(int quote1, ...);
 	char *getQuote(int quote_id);
-	void splitQuote(const Common::String &source, Common::String &line1, Common::String &line2);
+	void splitQuote(const char *source, char *line1, char *line2);
 };
 extern Game _game;
 


Commit: a3c738b30dc12bc999950c6efc3762f41916941f
    https://github.com/scummvm/scummvm/commit/a3c738b30dc12bc999950c6efc3762f41916941f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:55+10:00

Commit Message:
MADS: NEBULAR: Hooking up original dialogs

Changed paths:
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/core/quote.cpp
    engines/mads/madsv2/nebular/main.cpp
    engines/mads/madsv2/nebular/menus.cpp
    engines/mads/madsv2/nebular/menus.h


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index 70881c795a8..e6eb4cf9427 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1180,7 +1180,7 @@ void game_control() {
 		if (!kernel.teleported_in && (game.difficulty == -1)) {
 			// Difficulty menu
 			int gameId = g_engine->getGameID();
-			if (gameId == GType_Phantom || gameId == GType_Dragonsphere)
+			if (gameId != GType_Forest)
 				kernel.activate_menu = GAME_DIFFICULTY_MENU;
 			game_exec_function(game_menu_routine);
 			if (!game.going)
diff --git a/engines/mads/madsv2/core/quote.cpp b/engines/mads/madsv2/core/quote.cpp
index ac0a6559f78..0d143ea8133 100644
--- a/engines/mads/madsv2/core/quote.cpp
+++ b/engines/mads/madsv2/core/quote.cpp
@@ -66,7 +66,6 @@ char *quote_vload(int quote_id, va_list marker) {
 	if (handle == NULL) goto done;
 
 	mark = 0;
-	va_start(marker, quote_id);
 	for (id = quote_id; id > 0; id = va_arg(marker, int)) {
 		list[mark++] = id;
 		if (mark > QUOTE_MAX_LIST_LENGTH) {
diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
index 87e025ed9c2..232acbdd946 100644
--- a/engines/mads/madsv2/nebular/main.cpp
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -39,7 +39,7 @@
 #include "mads/madsv2/core/quote.h"
 #include "mads/madsv2/core/speech.h"
 #include "mads/madsv2/nebular/main_menu.h"
-//include "mads/madsv2/nebular/menus.h"
+#include "mads/madsv2/nebular/menus.h"
 #include "mads/madsv2/engine.h"
 
 namespace MADS {
@@ -122,12 +122,12 @@ static void main_menu_main() {
 static void main_cold_data_init() {
 	debugger_reset = game_debugger_reset;
 	debugger_update = game_debugger;
-#ifdef TODO
+
 	game_menu_routine = global_game_menu;
 	game_menu_init = global_menu_system_init;
 	game_menu_exit = global_menu_system_shutdown;
 	game_emergency_save = global_emergency_save;
-#endif
+
 	Common::strcpy_s(config_file_name, "config.dra");
 	Common::strcpy_s(save_game_key, "drag");
 	Common::strcpy_s(restart_game_key, "dragon");
diff --git a/engines/mads/madsv2/nebular/menus.cpp b/engines/mads/madsv2/nebular/menus.cpp
index 0d3b78a434f..8bed205d9fc 100644
--- a/engines/mads/madsv2/nebular/menus.cpp
+++ b/engines/mads/madsv2/nebular/menus.cpp
@@ -40,7 +40,6 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-
 #define MENU_MESSAGE_COLOR_BASE       10    /* 1st color to use for messages          */
 #define MENU_MESSAGE_COLOR_BASE_2     12    /* 1st color to use for second message    */
 #define MENU_MESSAGE_COLOR_BASE_3     14    /* 1st color to use for third  message    */
@@ -788,8 +787,6 @@ static void game_menu_main() {
 	}
 }
 
-
-
 static void game_menu_options() {
 	int going = true;
 	int first_time = true;
@@ -1514,7 +1511,6 @@ static void game_menu_difficulty() {
 	}
 }
 
-
 static void game_menu_alert() {
 	int going = true;
 	int first_time = true;
@@ -1585,12 +1581,23 @@ static void game_menu_alert() {
 	}
 }
 
+void global_menu_system_init() {
+	// No implementation
+}
 
+void global_menu_system_shutdown() {
+	// No implementation
+}
 
+void global_emergency_save() {
+	game_save_name(0);
 
+	if (scr_orig.data != NULL) mem_free(scr_orig.data);
 
+	g_engine->saveAutosaveIfEnabled();
+}
 
-void game_menu() {
+void global_game_menu() {
 	while (keys_any())
 		keys_get();
 
diff --git a/engines/mads/madsv2/nebular/menus.h b/engines/mads/madsv2/nebular/menus.h
index ed47865b310..364b0d06165 100644
--- a/engines/mads/madsv2/nebular/menus.h
+++ b/engines/mads/madsv2/nebular/menus.h
@@ -28,7 +28,10 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-extern void game_menu();
+extern void global_menu_system_init();
+extern void global_menu_system_shutdown();
+extern void global_emergency_save();
+extern void global_game_menu();
 
 } // namespace RexNebular
 } // namespace MADSV2


Commit: 3bebb13325183c3768ab29a04b7cf6f88758d209
    https://github.com/scummvm/scummvm/commit/3bebb13325183c3768ab29a04b7cf6f88758d209
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:55+10:00

Commit Message:
MADS: NEBULAR: Implement missing menu setup/shutdown

Changed paths:
    engines/mads/madsv2/core/game.h
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/vocab.cpp
    engines/mads/madsv2/core/vocab.h
    engines/mads/madsv2/nebular/extra.cpp
    engines/mads/madsv2/nebular/menus.cpp


diff --git a/engines/mads/madsv2/core/game.h b/engines/mads/madsv2/core/game.h
index 4717aff2fd5..befc10149e0 100644
--- a/engines/mads/madsv2/core/game.h
+++ b/engines/mads/madsv2/core/game.h
@@ -170,6 +170,7 @@ extern int key_abort_level;
 
 extern int game_keystroke;
 extern int game_any_keystroke;
+extern int game_any_emergency;
 
 extern int win_status;
 
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index f61a36aa270..a1d1f845b88 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2414,7 +2414,7 @@ void kernel_init_dynamic() {
 		kernel_dynamic_hot[count].flags = false;
 	}
 	kernel_num_dynamic = 0;
-	kernel_dynamic_changed = 0;
+	kernel_dynamic_changed = false;
 }
 
 int  kernel_dynamic_consecutive(int id) {
diff --git a/engines/mads/madsv2/core/vocab.cpp b/engines/mads/madsv2/core/vocab.cpp
index 2eea47c4f63..13d01202a50 100644
--- a/engines/mads/madsv2/core/vocab.cpp
+++ b/engines/mads/madsv2/core/vocab.cpp
@@ -42,6 +42,7 @@ int vocab_words = 0;
 int vocab_allocation = 0;
 int vocab_first_soft = 0;
 int vocab_longest = 0;
+bool vocab_active = false;
 
 char *vocab_text = NULL;
 word vocab_size;
@@ -495,6 +496,11 @@ done:
 	return error_flag;
 }
 
+void vocab_clear_active() {
+	vocab_unload_active();
+	vocab_active = 0;
+}
+
 int vocab_make_active(int id) {
 	return id;
 }
@@ -534,6 +540,7 @@ void init_vocab() {
 	vocab_longest = 0;
 	vocab_text = NULL;
 	vocab_size = 0;
+	vocab_active = false;
 }
 
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/core/vocab.h b/engines/mads/madsv2/core/vocab.h
index 99ac5250f13..6a829fa5b05 100644
--- a/engines/mads/madsv2/core/vocab.h
+++ b/engines/mads/madsv2/core/vocab.h
@@ -62,7 +62,7 @@ extern char *vocab;
 extern int vocab_emergency;
 
 extern char *vocab_text;
-extern word vocab_active;
+extern bool vocab_active;
 extern word vocab_list_id[VOCAB_MAX_ACTIVE];
 extern word vocab_list_pointer[VOCAB_MAX_ACTIVE];
 
@@ -74,6 +74,7 @@ extern char *vocab_get_word(char *out, int inp);
 extern void vocab_report_error(int number);
 extern char *vocab_select_word(char *out, const char *prompt, const char *default_word);
 extern void vocab_unload_active();
+extern void vocab_clear_active();
 extern int vocab_make_active(int id);
 extern int vocab_load_active();
 extern char *vocab_string(int vocab_id);
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 2f4515320a4..88dc4f49e95 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -250,6 +250,8 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 		goto error;
 	}
 
+	// Note: num_variants and num_hotspots at least are just part of room statistics, and aren't used.
+	// Hotspots, for examples, are loaded separately, and have their own count
 	roomPtr->num_variants = 0;
 	roomPtr->num_hotspots = 0;
 	roomPtr->num_rails = roomfile.num_rails;
diff --git a/engines/mads/madsv2/nebular/menus.cpp b/engines/mads/madsv2/nebular/menus.cpp
index 8bed205d9fc..10348559cbc 100644
--- a/engines/mads/madsv2/nebular/menus.cpp
+++ b/engines/mads/madsv2/nebular/menus.cpp
@@ -19,18 +19,25 @@
  *
  */
 
+#include "mads/madsv2/core/attr.h"
 #include "mads/madsv2/core/config.h"
 #include "mads/madsv2/core/error.h"
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/hspot.h"
+#include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/keys.h"
+#include "mads/madsv2/core/magic.h"
 #include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mcga.h"
 #include "mads/madsv2/core/mouse.h"
 #include "mads/madsv2/core/mem.h"
 #include "mads/madsv2/core/pal.h"
 #include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/core/sound.h"
+#include "mads/madsv2/core/text.h"
 #include "mads/madsv2/core/timer.h"
+#include "mads/madsv2/core/video.h"
 #include "mads/madsv2/nebular/mads/quotes.h"
 #include "mads/madsv2/nebular/menus.h"
 #include "mads/madsv2/nebular/global.h"
@@ -65,6 +72,8 @@ struct MenuMessage {
 	int spacing;        /* Font auto spacing             */
 };
 
+#define MAX_MENU_MESSAGE 20
+
 static MenuMessage *menu = NULL;
 static byte *save_menu = NULL;
 static byte *trash_bag = NULL;
@@ -93,6 +102,155 @@ static int game_save_status = RESTORE_FAILED;
 static int  game_menu_save_dirty;
 static char *game_menu_save_buffer;
 static char *game_menu_save_pointer;
+static int menu_room_id;
+static int menu_series_handle;
+
+
+
+void global_emergency_save() {
+	game_save_name(0);
+
+	if (scr_orig.data != NULL)
+		mem_free(scr_orig.data);
+
+	g_engine->saveAutosaveIfEnabled();
+}
+
+static void choose_menu_background() {
+	switch (section_id) {
+	case 1:
+	case 2:
+		menu_room_id = 921;
+		break;
+	case 3:
+	case 4:
+		menu_room_id = 922;
+		break;
+	case 5:
+	case 6:
+	case 7:
+		menu_room_id = 923;
+		break;
+	case 8:
+		menu_room_id = 924;
+		break;
+	default:
+		menu_room_id = 920;
+		break;
+	}
+}
+
+static void game_menu_setup() {
+	Palette specialPal;
+
+	MADS::MADSV2::game_menu_setup();
+
+	menu = (MenuMessage *)malloc(MAX_MENU_MESSAGE * sizeof(MenuMessage));
+
+	choose_menu_background();
+
+	kernel.quotes = quote_load(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 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, 0);
+
+	
+	cursor_id = MAX(CURSOR_WAIT, cursor->num_sprites);
+	if (cursor_id != cursor_last) {
+		mouse_cursor_sprite(cursor, cursor_id);
+		cursor_last = cursor_id;
+	}
+
+	vocab_clear_active();
+	kernel_init_dynamic();
+
+	text_default_x = text_default_y = -1;
+
+	int newRoom = new_room;
+	int roomId = room_id;
+	int previousRoom = previous_room;
+
+	inter_input_mode = INTER_BUILDING_SENTENCES;
+
+	bool palFlag = kernel.activate_menu == GAME_DIFFICULTY_MENU;
+	if (!palFlag)
+		player_preserve_palette();
+
+	game.going = (byte)!kernel_room_startup(menu_room_id, 0, kernel.interface, palFlag);
+
+	previous_room = previousRoom;
+	room_id = roomId;
+	new_room = newRoom;
+
+	viewing_at_y = 22;
+	sound_queue_hold();
+
+	Series *menuSprites = sprite_series_load("*MENU", 0);
+	if (!menuSprites) {
+		error_report(-7, 3, 23, 0, 0);
+		return;
+	}
+
+	menu_series_handle = matte_allocate_series(menuSprites, 0);
+
+	Common::fill(magic_color_flags, magic_color_flags + 3, 0);
+	Common::fill(magic_color_values, magic_color_values + 3, 0);
+
+	if (config_file.screen_fade) {
+		memset(&specialPal[0], 0, Graphics::PALETTE_SIZE);
+		mcga_setpal(&specialPal);
+	} else {
+		mcga_getpal(&specialPal);
+		magic_fade_to_grey(specialPal, NULL, 0, 256, 0, 1, 1, 16);
+	}
+
+	mouse_hide();
+	buffer_fill(scr_main, 0);
+	video_update(&scr_main, 0, 0, 0, 0, 320, 200);
+
+	buffer_rect_fill(scr_work, 0, 0, 320, 1, 2);
+	video_update(&scr_work, 0, 0, 0, viewing_at_y - 2, 320, 1);
+	video_update(&scr_work, 0, 0, 0, viewing_at_y + 157, 320, 1);
+
+	kernel.fx = config_file.screen_fade ? MATTE_FX_FAST_THRU_BLACK : MATTE_FX_FADE_FROM_BLACK;
+	kernel.trigger = 0;
+
+	game_emergency_save = global_emergency_save;
+
+	cursor_id = (cursor->num_sprites > 1) ? CURSOR_NORMAL : cursor->num_sprites;
+	if (cursor_id != cursor_last) {
+		mouse_cursor_sprite(cursor, cursor_id);
+		cursor_last = cursor_id;
+	}
+
+	pal_change_color(10, 0, 63, 0);
+	pal_change_color(11, 0, 45, 0);
+	pal_change_color(12, 63, 63, 0);
+	pal_change_color(13, 45, 45, 0);
+	pal_change_color(14, 63, 63, 63);
+	pal_change_color(15, 45, 45, 45);
+
+	mouse_show();
+}
+
+static void game_menu_shutdown() {
+	MADS::MADSV2::game_menu_shutdown();
+
+	viewing_at_y = 0;
+
+	matte_deallocate_series(menu_series_handle, true);
+	kernel_room_shutdown();
+
+	mem_free(kernel.quotes);
+	kernel.quotes = nullptr;
+
+	free(menu);
+	menu = nullptr;
+
+	previous_room = room_id = KERNEL_RESTORING_GAME;
+
+	if (!game.going)
+		room_id = new_room;
+}
 
 static int global_save(int id, const char *save_game_name) {
 	int status;
@@ -1589,14 +1747,6 @@ void global_menu_system_shutdown() {
 	// No implementation
 }
 
-void global_emergency_save() {
-	game_save_name(0);
-
-	if (scr_orig.data != NULL) mem_free(scr_orig.data);
-
-	g_engine->saveAutosaveIfEnabled();
-}
-
 void global_game_menu() {
 	while (keys_any())
 		keys_get();


Commit: d42a77d399a942a0809f8d962b2762c38ab1f3c2
    https://github.com/scummvm/scummvm/commit/d42a77d399a942a0809f8d962b2762c38ab1f3c2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:56+10:00

Commit Message:
MADS: NEBULAR: Fixes for showing difficulty dialog

Changed paths:
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/nebular/menus.cpp


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index e6eb4cf9427..600e43babee 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1176,10 +1176,14 @@ void game_control() {
 	}
 
 	if (!game_restore_flag && (result != COPY_FAIL) && (result != COPY_ESCAPE)) {
+		int gameId = g_engine->getGameID();
+
 		// Get difficulty level if new game
-		if (!kernel.teleported_in && (game.difficulty == -1)) {
+		if (!kernel.teleported_in && (game.difficulty == -1) && gameId != GType_Forest) {
 			// Difficulty menu
-			int gameId = g_engine->getGameID();
+			if (gameId == GType_RexNebular)
+				game.going = !kernel_section_startup(new_section);
+
 			if (gameId != GType_Forest)
 				kernel.activate_menu = GAME_DIFFICULTY_MENU;
 			game_exec_function(game_menu_routine);
diff --git a/engines/mads/madsv2/nebular/menus.cpp b/engines/mads/madsv2/nebular/menus.cpp
index 10348559cbc..c8dc9432ed8 100644
--- a/engines/mads/madsv2/nebular/menus.cpp
+++ b/engines/mads/madsv2/nebular/menus.cpp
@@ -827,7 +827,7 @@ static int game_menu_standard_keyboard(int mykey, int going) {
 	return going;
 }
 
-static int game_menu_keyboard(int going) {
+static bool game_menu_keyboard(int going) {
 	int mykey;
 
 	if (keys_any()) {
@@ -878,7 +878,7 @@ static void game_menu_main() {
 
 		while (going && (game_menu_selected_item < 1)) {
 
-			going = game_menu_keyboard(going);
+			going = game_menu_keyboard(going) && !g_engine->shouldQuit();
 
 			now_clock = timer_read();
 
@@ -971,7 +971,7 @@ static void game_menu_options() {
 
 		while (going && (game_menu_selected_item < 1)) {
 
-			going = game_menu_keyboard(going);
+			going = game_menu_keyboard(going) && !g_engine->shouldQuit();
 
 			now_clock = timer_read();
 
@@ -1602,8 +1602,7 @@ static void game_menu_difficulty() {
 		game_menu_changed = true;
 
 		while (going && (game_menu_selected_item < 1)) {
-
-			going = game_menu_keyboard(going);
+			going = game_menu_keyboard(going) && !g_engine->shouldQuit();
 
 			now_clock = timer_read();
 
@@ -1693,7 +1692,7 @@ static void game_menu_alert() {
 
 		while (going && (game_menu_selected_item < 1)) {
 
-			going = game_menu_keyboard(going);
+			going = game_menu_keyboard(going) && !g_engine->shouldQuit();
 
 			now_clock = timer_read();
 
@@ -1748,6 +1747,8 @@ void global_menu_system_shutdown() {
 }
 
 void global_game_menu() {
+
+
 	while (keys_any())
 		keys_get();
 


Commit: 7a4caf91dbb3c760304f169b66a1aa00edbb0175
    https://github.com/scummvm/scummvm/commit/7a4caf91dbb3c760304f169b66a1aa00edbb0175
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:56+10:00

Commit Message:
MADS: NEBULAR: scr_depth expected to be packed 2 pixels per byte

Changed paths:
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 88dc4f49e95..29cd0cb232b 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -173,21 +173,28 @@ int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int varia
 
 	byte *destP = buffer_pointer(depth, 0, 0);
 	byte *endP = destP + depth->x * depth->y;
-	byte runLength, runValue;
+	int runLength, runValue;
 
-	// The data is encoded as a sequence of run lengths of given values
+	// The data is encoded as a sequence of run lengths of given values, though they're nibble amounts,
+	// and the engine expects them to be saved in a two pixels per byte format
 	LoaderReadStream src(load_handle);
+	bool isLowNibble = true;
 
-	while (destP < endP) {
-		runLength = src.readByte();
-		if (!runLength)
-			break;
-
-		runValue = src.readByte();
+	runLength = src.readByte();
+	while (destP < endP && runLength != 0) {
+		runValue = src.readByte() & 0xf;
 
 		// Write out the run length
-		Common::fill(destP, MIN(endP, destP + runLength), runValue);
-		destP += runLength;
+		for (; runLength > 0 && destP < endP; --runLength) {
+			if (isLowNibble) {
+				*destP = runValue;
+			} else {
+				*destP++ |= (runValue << 4);
+			}
+			isLowNibble = !isLowNibble;
+		}
+
+		runLength = src.readByte();
 	}
 
 	if (!hasLoad)
@@ -211,7 +218,6 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 	char block_name[20];
 	bool sceneFlag = id >= 0;
 	int width, height, picSize;
-	int depthSize;
 	SeriesPtr sprites[10] = { nullptr };
 	int16 spritesColor[10] = { -1 };
 
@@ -276,10 +282,10 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 		buffer_init(picture, width, height);
 	assert(picture->data);
 
-	// Determine depth surface size
-	if (roomfile.format == 2)
-		width >>= 2;
-	depthSize = width * height;
+	// Original only used packed surface for a specific format, but subsequent games' codebase
+	// expects the depth surface to always be fixed
+	//if (roomfile.format == 2) width >>= 2;
+	width >>= 2;
 
 	if (!depth->data)
 		buffer_init(depth, width, height);


Commit: ca792b1807480c6ed4700c4dda49e97b780d5a46
    https://github.com/scummvm/scummvm/commit/ca792b1807480c6ed4700c4dda49e97b780d5a46
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:57+10:00

Commit Message:
MADS: NEBULAR: Fix interface text font color

Changed paths:
    engines/mads/madsv2/core/inter.cpp
    engines/mads/madsv2/core/inter.h


diff --git a/engines/mads/madsv2/core/inter.cpp b/engines/mads/madsv2/core/inter.cpp
index 271a37c5cef..bdab97e87a6 100644
--- a/engines/mads/madsv2/core/inter.cpp
+++ b/engines/mads/madsv2/core/inter.cpp
@@ -2175,14 +2175,19 @@ void inter_main_loop(int allow_input) {
 			use_font = font_main;
 			use_spacing = -1;
 			width = font_string_width(use_font, inter_sentence, use_spacing);
+
 			if (width > video_x) {
 				use_font = font_inter;
 				use_spacing = 0;
 				width = font_string_width(font_inter, inter_sentence, use_spacing);
 			}
+
 			x = (video_x >> 1) - (width >> 1);
 			y = (viewing_at_y + scr_work.y - 1) - 12;
-			inter_sentence_handle = matte_add_message (use_font, inter_sentence, x, y, INTER_MESSAGE_COLOR, use_spacing);
+
+			inter_sentence_handle = matte_add_message (use_font, inter_sentence, x, y,
+				g_engine->getGameID() == GType_RexNebular ? INTER_MESSAGE_COLOR_REX : INTER_MESSAGE_COLOR,
+				use_spacing);
 		}
 		inter_sentence_changed = false;
 	}
diff --git a/engines/mads/madsv2/core/inter.h b/engines/mads/madsv2/core/inter.h
index 085047469d8..822a82d3f59 100644
--- a/engines/mads/madsv2/core/inter.h
+++ b/engines/mads/madsv2/core/inter.h
@@ -149,7 +149,7 @@ namespace MADSV2 {
 #define AWAITING_RIGHT_MOUSE    4       /* Waiting for button release */
 
 #define INTER_MESSAGE_COLOR     254
-
+#define INTER_MESSAGE_COLOR_REX   3
 
 #define inter_verb            inter_words[0]
 #define inter_main_noun       inter_words[1]


Commit: 018c4a3431acbaff22975feaa44ee3703b5644f2
    https://github.com/scummvm/scummvm/commit/018c4a3431acbaff22975feaa44ee3703b5644f2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:57+10:00

Commit Message:
MADS: NEBULAR: Starting to implement Rex-specific version of popup code

Changed paths:
  A engines/mads/madsv2/nebular/copy.cpp
  A engines/mads/madsv2/nebular/copy.h
  A engines/mads/madsv2/nebular/popup.cpp
  A engines/mads/madsv2/nebular/popup.h
    engines/mads/madsv2/core/kernel.h
    engines/mads/madsv2/core/object.cpp
    engines/mads/madsv2/core/popup.cpp
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/nebular.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index d66231ab0a3..b4dc7b5636d 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -40,8 +40,10 @@ namespace MADSV2 {
 
 #define KERNEL_INTERRUPT_STACK_SIZE    256    /* Size of interrupt stack */
 
-#define KERNEL_RESERVED_LOW_COLORS      26    /* Colors to reserve at bottom of palette */
-#define KERNEL_RESERVED_HIGH_COLORS     10    /* Colors to reserve at top of palette    */
+/* Colors to reserve at bottom of palette */
+#define KERNEL_RESERVED_LOW_COLORS      (g_engine->getGameID() == GType_RexNebular ? 18 : 26)
+/* Colors to reserve at top of palette    */
+#define KERNEL_RESERVED_HIGH_COLORS     10
 
 #define KERNEL_MESSAGE_COLOR_BASE       16    /* 1st color to use for messages          */
 #define KERNEL_MESSAGE_COLOR_BASE_2     252   /* 1st color to use for second message    */
diff --git a/engines/mads/madsv2/core/object.cpp b/engines/mads/madsv2/core/object.cpp
index 370cd4ecb1f..8ee6cba6582 100644
--- a/engines/mads/madsv2/core/object.cpp
+++ b/engines/mads/madsv2/core/object.cpp
@@ -44,6 +44,7 @@
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/core/tile.h"
 #include "mads/madsv2/core/video.h"
+#include "mads/madsv2/engine.h"
 
 namespace MADS {
 namespace MADSV2 {
diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index 40a51ad583a..9d7147d5e55 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -67,6 +67,7 @@ int popup_available = false;
 BoxParam box_param;
 Popup *popup = NULL;
 word popup_default_status = POPUP_STATUS_BAR;
+bool popup_vomitation_flag = true;
 
 static char *popup_savelist_string(PopupItem *item, int element);
 
@@ -90,6 +91,7 @@ void init_popup() {
 	};
 	Common::copy(POPUP_COLORS, POPUP_COLORS + 24, popup_colors);
 	memset(&popup_preserve_initiator[0], BUFFER_PRESERVE, 3);
+	popup_vomitation_flag = true;
 }
 
 int popup_create(int horiz_pieces, int x, int y) {
diff --git a/engines/mads/madsv2/nebular/copy.cpp b/engines/mads/madsv2/nebular/copy.cpp
new file mode 100644
index 00000000000..f9864acb6e1
--- /dev/null
+++ b/engines/mads/madsv2/nebular/copy.cpp
@@ -0,0 +1,205 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mads/madsv2/core/env.h"
+#include "mads/madsv2/core/font.h"
+#include "mads/madsv2/core/global.h"
+#include "mads/madsv2/core/imath.h"
+#include "mads/madsv2/nebular/copy.h"
+#include "mads/madsv2/nebular/popup.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+#define COPY_SUCCEED            0
+#define COPY_FAIL               1
+#define COPY_ESCAPE             2
+
+#define COPY_TRIES_ALLOWED      2
+
+#define COPY_LENGTH             4096
+#define COPY_CHECK              256
+
+struct CopyProt {
+	char manual;
+	int16 page;
+	int16 line;
+	int16 word_number;
+	char say[20];
+
+	static constexpr size_t SIZE = 2 + (3 * 2) + 20;
+	void load(Common::SeekableReadStream *src) {
+		manual = src->readByte();
+		src->skip(1);
+		src->readMultipleLE(page, line, word_number);
+		src->read(say, 20);
+	}
+};
+
+
+void copy_mangle(CopyProt *copy_prot) {
+	int count;
+	byte *dog;
+
+	dog = (byte *)copy_prot;
+
+	for (count = 0; count < sizeof(CopyProt); count++) {
+		*dog ^= 0xff;
+		dog++;
+	}
+}
+
+static int copy_load(CopyProt *copy_prot) {
+	int error_flag = true;
+	int num_items;
+	int item;
+	int seek_dog;
+	Common::SeekableReadStream *handle;
+
+	handle = env_open("*HOGANUS.DAT", "rb");
+	if (handle == NULL)
+		goto done;
+
+	num_items = handle->readUint16LE();
+	item = imath_random(1, num_items);
+
+	seek_dog = (item - 1) * CopyProt::SIZE;
+	if (seek_dog)
+		handle->seek(seek_dog);
+
+	copy_prot->load(handle);
+
+	copy_mangle(copy_prot);
+
+	error_flag = false;
+
+done:
+	delete handle;
+	return error_flag;
+}
+
+static int copy_pop_and_ask() {
+	int error_flag = COPY_FAIL;
+	int result;
+	int count;
+	char work_buf[80];
+	char page_buf[10];
+	char line_buf[10];
+	char word_buf[10];
+	char entry_buf[80];
+	CopyProt copy_prot;
+
+	popup_vomitation_flag = false; /* Allow keep of first letter */
+
+	if (copy_load(&copy_prot)) goto finish;
+
+	mads_itoa(copy_prot.page, page_buf, 10);
+	mads_itoa(copy_prot.line, line_buf, 10);
+	mads_itoa(copy_prot.word_number, word_buf, 10);
+
+	for (count = 0; (count < COPY_TRIES_ALLOWED); count++) {
+
+		if (popup_create(font_inter, 32, POPUP_CENTER, POPUP_CENTER)) goto finish;
+
+		if (!count) {
+			Common::strcpy_s(work_buf, "REX NEBULAR version ");
+			Common::strcat_s(work_buf, global_release_version);
+			popup_center_string(work_buf, true);
+			popup_write_string("\n");
+			popup_center_string("(Copy Protection, for your convenience)", false);
+		} else {
+			popup_center_string("ANSWER INCORRECT!", true);
+			popup_write_string("\n");
+			popup_center_string("(But we'll give you another chance!)", false);
+		}
+		popup_write_string("\n");
+
+		Common::strcpy_s(work_buf, "Now comes the part that everybody hates.  But if we don't");
+		popup_write_string(work_buf);
+		Common::strcpy_s(work_buf, "do this, nasty rodent-like people will pirate this game,");
+		popup_write_string(work_buf);
+		Common::strcpy_s(work_buf, "and a whole generation of talented designers, programmers,");
+		popup_write_string(work_buf);
+		Common::strcpy_s(work_buf, "artists, and playtesters will go hungry, and will wander");
+		popup_write_string(work_buf);
+		Common::strcpy_s(work_buf, "aimlessly through the land at night searching for peace.");
+		popup_write_string(work_buf);
+		Common::strcpy_s(work_buf, "So let's grit our teeth and get it over with.  Just get");
+		popup_write_string(work_buf);
+
+		Common::strcpy_s(work_buf, "out your copy of ");
+		if (copy_prot.manual == 'g') {
+			Common::strcat_s(work_buf, "the GAME MANUAL");
+		} else {
+			Common::strcat_s(work_buf, "REX'S LOGBOOK");
+		}
+		Common::strcat_s(work_buf, ".  See!  That was easy.  ");
+		popup_write_string(work_buf);
+
+		Common::strcpy_s(work_buf, "Next, just turn to page ");
+		Common::strcat_s(work_buf, page_buf);
+		Common::strcat_s(work_buf, ".  On line ");
+		Common::strcat_s(work_buf, line_buf);
+		Common::strcat_s(work_buf, ", find word number ");
+		Common::strcat_s(work_buf, word_buf);
+		Common::strcat_s(work_buf, ", ");
+		popup_write_string(work_buf);
+
+		Common::strcpy_s(work_buf, "and type it on the line below (we've even given you");
+		popup_write_string(work_buf);
+		Common::strcpy_s(work_buf, "first letter as a hint).  As soon as you do that, we can get");
+		popup_write_string(work_buf);
+		popup_write_string("right into this really COOL adventure game!\n");
+
+		popup_write_string("\n");
+		popup_write_string("                    ");
+		popup_set_ask();
+		popup_write_string("\n");
+
+		entry_buf[0] = copy_prot.say[0];
+		entry_buf[1] = 0;
+
+		result = popup_ask_string(entry_buf, 12, true);
+		if (result < 0) goto finish;
+		if (result > 0) {
+			error_flag = COPY_ESCAPE;
+			goto done;
+		}
+
+		mads_strlwr(entry_buf);
+		if (strcmp(entry_buf, copy_prot.say) == 0) goto finish;
+	}
+
+	goto done;
+
+finish:
+	error_flag = COPY_SUCCEED;
+
+done:
+	popup_vomitation_flag = true; /* Reset */
+
+	return (error_flag);
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/copy.h b/engines/mads/madsv2/nebular/copy.h
new file mode 100644
index 00000000000..571f1844d36
--- /dev/null
+++ b/engines/mads/madsv2/nebular/copy.h
@@ -0,0 +1,36 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_COPY_H
+#define MADS_NEBULAR_COPY_H
+
+#include "mads/madsv2/core/general.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index a0552b8d13b..542942892c8 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -39,6 +39,7 @@
 #include "mads/madsv2/nebular/nebular.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/main.h"
+#include "mads/madsv2/nebular/popup.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
 #include "mads/madsv2/nebular/mads/words.h"
 #include "mads/madsv2/nebular/sound_nebular.h"
@@ -74,8 +75,11 @@ Common::Error RexNebularEngine::run() {
 	_soundManager = new RexSoundManager(_mixer, _soundFlag);
 	_soundManager->validate();
 
+	// Initialize globals
+	RexNebular::popup_init();
+
 	// Run the game
-		RexNebular::nebular_main();
+	RexNebular::nebular_main();
 
 	return Common::kNoError;
 }
@@ -609,9 +613,6 @@ void RexNebularEngine::global_sound_driver() {
 	env_catint(kernel.sound_driver, new_section, 1);
 }
 
-void RexNebularEngine::player_keep_walking() {
-}
-
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/nebular.h b/engines/mads/madsv2/nebular/nebular.h
index a7439d15506..44b643fad05 100644
--- a/engines/mads/madsv2/nebular/nebular.h
+++ b/engines/mads/madsv2/nebular/nebular.h
@@ -61,7 +61,6 @@ public:
 	void global_error_code() override;
 	void global_room_init() override {}
 	void global_sound_driver() override;
-	void player_keep_walking() override;
 };
 
 } // namespace RexNebular
diff --git a/engines/mads/madsv2/nebular/popup.cpp b/engines/mads/madsv2/nebular/popup.cpp
new file mode 100644
index 00000000000..2af021201e5
--- /dev/null
+++ b/engines/mads/madsv2/nebular/popup.cpp
@@ -0,0 +1,230 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "graphics/palette.h"
+#include "mads/madsv2/core/buffer.h"
+#include "mads/madsv2/core/cycle.h"
+#include "mads/madsv2/core/env.h"
+#include "mads/madsv2/core/imath.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mem.h"
+#include "mads/madsv2/core/mcga.h"
+#include "mads/madsv2/core/mouse.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/video.h"
+#include "mads/madsv2/nebular/popup.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+static constexpr int BLACK = 0;
+static constexpr int PALETTE_CYCLING_AREA = 6;
+static constexpr int DIALOG_CONTENT1_COLOR = 248;
+static constexpr int DIALOG_CONTENT2_COLOR = 249;
+static constexpr int DIALOG_EDGE_COLOR = 250;
+static constexpr int DIALOG_BACKGROUND_COLOR = 251;
+static constexpr int DIALOG_FC_COLOR = 252;
+static constexpr int DIALOG_FD_COLOR = 253;
+static constexpr int DIALOG_FE_COLOR = 254;
+static constexpr int DIALOG_BLACK_COLOR = 0;
+
+int dialog_content_handle;
+bool popup_vomitation_flag;
+
+
+void popup_init() {
+	dialog_content_handle = -1;
+	popup_vomitation_flag = true;
+}
+
+int popup_create(FontPtr font, int horiz_pieces, int x, int y) {
+	int count;
+
+	box->x = x;
+	box->y = y;
+	box_param.font = font;
+	box->xs = (box_param.font->max_x_size + 1) * horiz_pieces + 10;
+	box->text_width = horiz_pieces * 2;
+
+	box->cursor_x = 0;
+	box->text_x = box->text_y = 0;
+	font_set_colors(-1, BLACK, BLACK, BLACK);
+
+	// Allocate text lines
+	box->text[0] = (char *)malloc((box->text_width + 1) * POPUP_MAX_LINES);
+	assert(box->text[0]);
+
+	// Set pointers within text for remaining text array indexes
+	for (count = 1; count < POPUP_MAX_LINES; ++count)
+		box->text[count] = box->text[0] + (count * (box->text_width + 1));
+
+	for (count = 0; count < POPUP_MAX_LINES; ++count) {
+		*box->text[count] = '\0';
+		box->tab[count] = 0;
+	}
+
+
+	memcpy(&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+		&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+		PALETTE_CYCLING_AREA * 3);
+	pal_grey(master_palette, DIALOG_CONTENT1_COLOR, 2, 36, 32);
+	pal_grey(master_palette, DIALOG_EDGE_COLOR, 2, 39, 28);
+	pal_grey(master_palette, DIALOG_FC_COLOR, 2, 36, 32);
+	pal_grey(master_palette, DIALOG_FE_COLOR, 1, 55, 55);
+	mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
+	box->active = true;
+
+	return 0;
+}
+
+void popup_destroy() {
+	if (box->depth_saved) {
+		buffer_restore(&scr_main, box->preserve_handle, 0, box->x, box->y, box->xs, box->ys);
+		video_update(&scr_main, box->x, box->y - viewing_at_y, box->x, box->y, box->xs, box->ys);
+	}
+	box->depth_saved = false;
+
+	if (box->active)
+		mem_free(box->text);
+
+	memcpy(&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+		&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+		PALETTE_CYCLING_AREA * 3);
+	mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
+	box->active = false;
+}
+
+static uint16 rotr16(uint16 value, int amount) {
+	return (value >> amount) | (value << (16 - amount));
+}
+
+static int popup_draw_content(int x, int y, int xs, int ys, int unknown, byte color1, byte color2, int height, Buffer &buffer) {
+	int result = 0;
+	int stride = buffer.x - xs;
+
+	if (!buffer.data)
+		return result;
+
+	byte *ptr = (byte *)mem_normalize(buffer_pointer(&buffer, x, y));
+
+	if (height == 0)
+		return result;
+
+	uint16 seed = unknown ? unknown : 0xB78E;
+
+	for (int row = 0; row < height; ++row) {
+		if (row == ys)
+			result = seed;
+
+		for (int col = 0; col < xs; ++col) {
+			uint16 t = seed;
+			seed += 0x181D;
+			t = rotr16(t, 9);
+			seed ^= t;
+			t = rotr16(t, 3);
+			seed += t;
+
+			*ptr++ = (seed & 0x10) ? color1 : color2;
+		}
+
+		ptr += stride;
+	}
+
+	return result;
+}
+
+void popup_draw(bool save_screen) {
+	int askY;
+
+	if (box->cursor_x == 0)
+		box->text_y--;
+
+	box->ys = (box_param.font->max_y_size + 1) * (box->text_y + 1) + 10;
+
+	if (box->x == POPUP_CENTER)
+		box->x = 160 - box->xs / 2;
+	if (box->y == POPUP_CENTER)
+		box->y = 100 - box->ys / 2;
+
+	int y2 = box->y + box->ys;
+	int x2 = box->x + box->xs;
+
+	if (x2 > 320)
+		x2 = -(x2 - 320);
+	if (y2 > 200)
+		y2 = -(y2 - 200);
+
+	if (save_screen) {
+		box->preserve_handle = buffer_preserve(&scr_main, 0xfff8, 0, box->x, box->y, box->xs, box->ys);
+		box->depth_saved = true;
+	}
+
+	askY = (box_param.font->max_y_size + 1) * box->ask_y;
+
+	// Fill area
+	buffer_rect_fill(scr_main, box->x, box->y, box->xs, box->ys, DIALOG_BACKGROUND_COLOR);
+
+	// Edge lines
+	buffer_rect_fill(scr_main, box->x + 1, box->y + box->ys - 2, box->xs - 1, 1, DIALOG_EDGE_COLOR);
+	buffer_rect_fill(scr_main, box->x, box->y + box->ys - 1, box->xs, 1, DIALOG_EDGE_COLOR);
+
+	// Right edge
+	buffer_rect_fill(scr_main, box->x + box->xs - 2, box->y + 2, 1, box->ys - 2, DIALOG_EDGE_COLOR);
+	buffer_rect_fill(scr_main, box->x + box->xs - 1, box->y + 1, 1, box->ys - 1, DIALOG_EDGE_COLOR);
+
+	dialog_content_handle = popup_draw_content(box->x + 2, box->y + 2, box->xs - 4, askY, 0,
+		DIALOG_CONTENT2_COLOR, DIALOG_CONTENT1_COLOR, box->ys - 4, scr_main);
+
+	askY = box->y + 5;
+
+	if (box->text_y + 1 > 0) {
+		for (int lineCtr = 0; lineCtr <= box->text_y; ++lineCtr) {
+			if (box->tab[lineCtr] == POPUP_BAR) {
+				buffer_rect_fill(scr_main, box->x + 2, askY + (box_param.font->max_y_size + 1) / 2,
+					box->xs - 4, 1, DIALOG_BLACK_COLOR);
+			} else {
+				int tab = box->tab[lineCtr];
+				int xp = (tab & 0x7f) + box->x + 5;
+				int yp = askY;
+				if (tab & 0x40)
+					yp++;
+
+				font_write(box_param.font, &scr_main, box->text[lineCtr], xp, yp, 1);
+
+				if (tab & 0x80) {
+					buffer_rect_fill(scr_main, xp, yp + box_param.font->max_y_size,
+						font_string_width(box_param.font, box->text[lineCtr], 1), 1, DIALOG_BLACK_COLOR);
+				}
+			}
+
+			askY += box_param.font->max_y_size + 1;
+		}
+	}
+
+	mouse_hide();
+	video_update(&scr_main, box->x, box->y, box->x, box->y, box->xs, box->ys);
+	mouse_show();
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/popup.h b/engines/mads/madsv2/nebular/popup.h
new file mode 100644
index 00000000000..8324c82e16d
--- /dev/null
+++ b/engines/mads/madsv2/nebular/popup.h
@@ -0,0 +1,43 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_POPUP_H
+#define MADS_NEBULAR_POPUP_H
+
+#include "mads/madsv2/core/font.h"
+#include "mads/madsv2/core/popup.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+extern bool popup_vomitation_flag;
+
+extern void popup_init();
+extern int popup_create(FontPtr font, int horiz_pieces, int x, int y);
+extern void popup_destroy();
+extern void popup_draw(bool save_screen);
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 1df3e9158b9..a69acae6484 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -71,12 +71,14 @@ MODULE_OBJS += \
 	madsv2/core/window.o \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
+	madsv2/nebular/asound.o \
+	madsv2/nebular/copy.o \
 	madsv2/nebular/extra.o \
 	madsv2/nebular/global.o \
 	madsv2/nebular/main.o \
 	madsv2/nebular/main_menu.o \
 	madsv2/nebular/menus.o \
-	madsv2/nebular/asound.o \
+	madsv2/nebular/popup.o \
 	madsv2/nebular/sound_nebular.o \
 	madsv2/nebular/mads/mads.o \
 	madsv2/nebular/rooms/thunks.o \


Commit: add1bf9b329976e043dcbe103f93662f76671eb7
    https://github.com/scummvm/scummvm/commit/add1bf9b329976e043dcbe103f93662f76671eb7
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:58+10:00

Commit Message:
MADS: NEBULAR: Remove madsv2/core/copy.cpp

This was generic copy protection dialog functionality that was
only ever used in the original Rex Nebular release. And even then
the Rex Nebular version had some differences. So now there's only
a single nebular/copy.cpp remaining

Changed paths:
  R engines/mads/madsv2/core/copy.cpp
  R engines/mads/madsv2/core/copy.h
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/core/game.h
    engines/mads/madsv2/engine.h
    engines/mads/madsv2/nebular/copy.cpp
    engines/mads/madsv2/nebular/copy.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/nebular.h
    engines/mads/madsv2/phantom/phantom.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/core/copy.cpp b/engines/mads/madsv2/core/copy.cpp
deleted file mode 100644
index f6d01bb4372..00000000000
--- a/engines/mads/madsv2/core/copy.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "common/config-manager.h"
-#include "common/file.h"
-#include "mads/madsv2/core/copy.h"
-#include "mads/madsv2/core/imath.h"
-#include "mads/madsv2/core/env.h"
-#include "mads/madsv2/core/popup.h"
-#include "mads/madsv2/core/font.h"
-#include "mads/madsv2/core/fileio.h"
-#include "mads/madsv2/core/mem.h"
-#include "mads/madsv2/core/error.h"
-#include "mads/madsv2/core/timer.h"
-#include "mads/madsv2/core/font.h"
-#include "mads/madsv2/core/popup.h"
-
-namespace MADS {
-namespace MADSV2 {
-
-#define NUM_TEXT_LINES          10
-
-extern char global_release_version[10];
-
-void CopyProt::load(Common::SeekableReadStream *src) {
-	src->readMultipleLE(manual, page, line, word_number);
-	src->read(say, 20);
-}
-
-
-static void copy_mangle(CopyProt *copy_prot) {
-	int count;
-	byte *dog;
-
-	dog = (byte *)copy_prot;
-
-	for (count = 0; count < (int)sizeof(CopyProt); count++) {
-		*dog ^= 0xff;
-		dog++;
-	}
-}
-
-
-static int copy_load(CopyProt *copy_prot) {
-	int error_flag = true;
-	int num_items;
-	int item;
-	int seek_dog;
-	Common::SeekableReadStream *handle;
-
-	handle = env_open("*HOGANUS.DAT", "rb");
-	if (handle == NULL) goto done;
-
-	num_items = handle->readUint16LE();
-	item = imath_random(1, num_items);
-
-	seek_dog = (item - 1) * CopyProt::SIZE;
-	if (seek_dog)
-		handle->seek(seek_dog, SEEK_CUR);
-
-	copy_prot->load(handle);
-	copy_mangle(copy_prot);
-
-	error_flag = false;
-
-done:
-	delete handle;
-	return error_flag;
-}
-
-static int copy_pop_and_ask() {
-	int error_flag = COPY_FAIL;
-	int result;
-	int count;
-	long mem_to_get;
-	char work_buf[80];
-	char page_buf[10];
-	char line_buf[10];
-	char word_buf[10];
-	char entry_buf[80];
-	char *read_buf[NUM_TEXT_LINES];
-	char *load_buffer = NULL;
-	CopyProt copy_prot;
-	Common::SeekableReadStream *handle = NULL;
-
-	box_param.erase_on_first = false;  // Allow keep of first letter
-
-	if (copy_load(&copy_prot)) goto finish;
-
-	mem_to_get = 80 * NUM_TEXT_LINES;
-	load_buffer = (char *)mem_get(mem_to_get);
-	if (load_buffer == NULL) goto finish;
-
-	handle = env_open("*LANGUAGE.DAT", "rb");
-	if (handle == NULL) goto finish;
-
-	for (count = 0; count < NUM_TEXT_LINES; count++) {
-		read_buf[count] = load_buffer + (count * 80);
-		if (!fileio_fread_f(read_buf[count], 80, 1, handle)) goto finish;
-	}
-
-	delete handle;
-	handle = NULL;
-
-	mads_itoa(copy_prot.page, page_buf, 10);
-	mads_itoa(copy_prot.line, line_buf, 10);
-	mads_itoa(copy_prot.word_number, word_buf, 10);
-
-	for (count = 0; (count < COPY_TRIES_ALLOWED); count++) {
-
-		if (popup_create(popup_estimate_pieces(26), POPUP_CENTER, POPUP_CENTER)) goto finish;
-
-		if (!count) {
-			popup_center_string(read_buf[0], false);
-			Common::strcpy_s(work_buf, read_buf[1]);
-			Common::strcat_s(work_buf, " ");
-			Common::strcat_s(work_buf, global_release_version);
-			popup_center_string(work_buf, false);
-			popup_next_line();
-		} else {
-			popup_center_string(read_buf[8], false);
-			popup_next_line();
-			popup_center_string(read_buf[9], false);
-		}
-		popup_next_line();
-
-		popup_write_string(read_buf[2]);
-		popup_write_string(read_buf[3]);
-
-		Common::strcpy_s(work_buf, page_buf);
-		Common::strcat_s(work_buf, read_buf[4]);
-		popup_write_string(work_buf);
-
-		Common::strcpy_s(work_buf, line_buf);
-		Common::strcat_s(work_buf, read_buf[5]);
-		popup_write_string(work_buf);
-
-		Common::strcpy_s(work_buf, word_buf);
-		popup_write_string(work_buf);
-
-		popup_write_string(read_buf[6]);
-		popup_write_string(read_buf[7]);
-
-		popup_next_line();
-		popup_next_line();
-		popup_write_string("                      ");
-		popup_set_ask();
-		popup_next_line();
-
-		entry_buf[0] = copy_prot.say[0];
-		entry_buf[1] = 0;
-
-		result = popup_ask_string(entry_buf, 12, true);
-		if (result < 0) goto finish;
-		if (result > 0) {
-			error_flag = COPY_ESCAPE;
-			goto done;
-		}
-
-		mads_strlwr(entry_buf);
-		if (strcmp(entry_buf, copy_prot.say) == 0)
-			goto finish;
-	}
-
-	goto done;
-
-finish:
-	error_flag = COPY_SUCCEED;
-
-done:
-	box_param.erase_on_first = true;  // Reset
-
-	delete handle;
-	if (load_buffer != NULL)
-		mem_free(load_buffer);
-
-	return error_flag;
-}
-
-int global_copy_verify() {
-	int error_flag = COPY_FAIL;
-	int loaded = false;
-
-	if (!ConfMan.getBool("copy_protection"))
-		return COPY_SUCCEED;
-
-	if (box_param.series == NULL) {
-		Common::strcpy_s(box_param.name, "*BOX");
-		if (popup_box_load())
-			goto done;
-		loaded = true;
-	}
-
-	error_flag = copy_pop_and_ask();
-
-	if (loaded) {
-		sprite_free(&box_param.menu, true);
-		sprite_free(&box_param.logo, true);
-		sprite_free(&box_param.series, true);
-	}
-
-done:
-	return error_flag;
-}
-
-} // namespace MADSV2
-} // namespace MADS
diff --git a/engines/mads/madsv2/core/copy.h b/engines/mads/madsv2/core/copy.h
deleted file mode 100644
index fe619561e55..00000000000
--- a/engines/mads/madsv2/core/copy.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef MADS_CORE_COPY_H
-#define MADS_CORE_COPY_H
-
-#include "common/stream.h"
-#include "mads/madsv2/core/general.h"
-
-namespace MADS {
-namespace MADSV2 {
-
-#define COPY_SUCCEED            0
-#define COPY_FAIL               1
-#define COPY_ESCAPE             2
-
-#define COPY_TRIES_ALLOWED      2
-
-#define COPY_LENGTH             4096
-#define COPY_CHECK              256
-
-
-struct CopyProt {
-	byte manual;
-	int16 page;
-	int16 line;
-	int16 word_number;
-	char say[20];
-
-	static constexpr size_t SIZE = 1 + 2 + 2 + 2 + 20;
-	void load(Common::SeekableReadStream *src);
-};
-
-extern int global_copy_verify();
-
-} // namespace MADSV2
-} // namespace MADS
-
-#endif
diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index 600e43babee..be8cfd03285 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -57,7 +57,6 @@
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/config.h"
 #include "mads/madsv2/core/fileio.h"
-#include "mads/madsv2/core/copy.h"
 #include "mads/madsv2/core/camera.h"
 #include "mads/madsv2/core/quote.h"
 #include "mads/madsv2/core/text.h"
diff --git a/engines/mads/madsv2/core/game.h b/engines/mads/madsv2/core/game.h
index befc10149e0..d449237a832 100644
--- a/engines/mads/madsv2/core/game.h
+++ b/engines/mads/madsv2/core/game.h
@@ -94,6 +94,12 @@ namespace MADSV2 {
 
 #define DEBUGGER_MAX_WATCH      12
 
+// Copy protection statuses. Only Rex Nebular had a copy protection screen in the original release
+enum {
+	COPY_SUCCEED   = 0,
+	COPY_FAIL      = 1,
+	COPY_ESCAPE    = 2
+};
 
 extern int selected_intro;
 
diff --git a/engines/mads/madsv2/engine.h b/engines/mads/madsv2/engine.h
index a82bc3e35eb..ccecddf9e8d 100644
--- a/engines/mads/madsv2/engine.h
+++ b/engines/mads/madsv2/engine.h
@@ -30,6 +30,7 @@
 #include "graphics/screen.h"
 #include "mads/mads.h"
 #include "mads/core/sound_manager.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/speech.h"
 
 namespace MADS {
@@ -91,8 +92,8 @@ public:
 	int main_normal_key(int mykey) const {
 		return mykey;
 	}
-	int  main_copy_verify() {
-		return 0;
+	virtual int main_copy_verify() {
+		return COPY_SUCCEED;
 	}
 
 	bool canLoadGameStateCurrently(Common::U32String *msg) override;
diff --git a/engines/mads/madsv2/nebular/copy.cpp b/engines/mads/madsv2/nebular/copy.cpp
index f9864acb6e1..b5984fa2ae4 100644
--- a/engines/mads/madsv2/nebular/copy.cpp
+++ b/engines/mads/madsv2/nebular/copy.cpp
@@ -19,8 +19,10 @@
  *
  */
 
+#include "common/config-manager.h"
 #include "mads/madsv2/core/env.h"
 #include "mads/madsv2/core/font.h"
+#include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/imath.h"
 #include "mads/madsv2/nebular/copy.h"
@@ -30,10 +32,6 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-#define COPY_SUCCEED            0
-#define COPY_FAIL               1
-#define COPY_ESCAPE             2
-
 #define COPY_TRIES_ALLOWED      2
 
 #define COPY_LENGTH             4096
@@ -56,7 +54,7 @@ struct CopyProt {
 };
 
 
-void copy_mangle(CopyProt *copy_prot) {
+static void copy_mangle(CopyProt *copy_prot) {
 	int count;
 	byte *dog;
 
@@ -200,6 +198,17 @@ done:
 	return (error_flag);
 }
 
+int global_copy_verify() {
+	if (!ConfMan.getBool("copy_protection"))
+		return COPY_SUCCEED;
+
+	// Note: the original did some extra work at this point to see whether the user's boot sector
+	// remained the same, and if so, bypass the copy protection check. And even if there wasn't
+	// an existing match, it would only sometimes prompt the user
+
+	return copy_pop_and_ask();
+}
+
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/copy.h b/engines/mads/madsv2/nebular/copy.h
index 571f1844d36..caba2f06fb1 100644
--- a/engines/mads/madsv2/nebular/copy.h
+++ b/engines/mads/madsv2/nebular/copy.h
@@ -28,6 +28,7 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
+extern int global_copy_verify();
 
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 542942892c8..38340898a0a 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -37,6 +37,7 @@
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/copy.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/main.h"
 #include "mads/madsv2/nebular/popup.h"
@@ -84,6 +85,10 @@ Common::Error RexNebularEngine::run() {
 	return Common::kNoError;
 }
 
+int RexNebularEngine::main_copy_verify() {
+	return global_copy_verify();
+}
+
 void RexNebularEngine::global_init_code() {
 	RexNebular::global_init_code();
 }
diff --git a/engines/mads/madsv2/nebular/nebular.h b/engines/mads/madsv2/nebular/nebular.h
index 44b643fad05..20a2d1b4b9e 100644
--- a/engines/mads/madsv2/nebular/nebular.h
+++ b/engines/mads/madsv2/nebular/nebular.h
@@ -52,6 +52,7 @@ public:
 	Common::Error run() override;
 	void syncRoom(Common::Serializer &s) override;
 
+	int main_copy_verify() override;
 	void global_init_code() override;
 	void section_music(int section_num) override;
 	void global_section_constructor() override;
diff --git a/engines/mads/madsv2/phantom/phantom.cpp b/engines/mads/madsv2/phantom/phantom.cpp
index 73a8684e47a..2ce6c08c641 100644
--- a/engines/mads/madsv2/phantom/phantom.cpp
+++ b/engines/mads/madsv2/phantom/phantom.cpp
@@ -22,7 +22,6 @@
 #include "engines/util.h"
 #include "mads/madsv2/console.h"
 #include "mads/madsv2/core/conv.h"
-#include "mads/madsv2/core/copy.h"
 #include "mads/madsv2/core/env.h"
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/himem.h"
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index a69acae6484..7a71b4e5523 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -21,7 +21,6 @@ MODULE_OBJS += \
 	madsv2/core/color.o \
 	madsv2/core/config.o \
 	madsv2/core/conv.o \
-	madsv2/core/copy.o \
 	madsv2/core/cursor.o \
 	madsv2/core/cycle.o \
 	madsv2/core/dialog.o \


Commit: 196d0b182ee390cb2881e31e06aca52575c8c6eb
    https://github.com/scummvm/scummvm/commit/196d0b182ee390cb2881e31e06aca52575c8c6eb
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:59+10:00

Commit Message:
MADS: NEBULAR: Text dialogs partially showing

Changed paths:
    engines/mads/madsv2/core/popup.cpp
    engines/mads/madsv2/core/popup.h
    engines/mads/madsv2/core/text.cpp
    engines/mads/madsv2/nebular/copy.cpp
    engines/mads/madsv2/nebular/popup.cpp
    engines/mads/madsv2/nebular/popup.h


diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index 9d7147d5e55..a336f7178a2 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -23,6 +23,7 @@
 #include "mads/madsv2/core/general.h"
 #include "mads/madsv2/core/popup.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/cycle.h"
 #include "mads/madsv2/core/error.h"
 #include "mads/madsv2/core/mem.h"
 #include "mads/madsv2/core/heap.h"
@@ -39,6 +40,7 @@
 #include "mads/madsv2/core/pal.h"
 #include "mads/madsv2/core/mcga.h"
 #include "mads/madsv2/engine.h"
+#include "mads/madsv2/nebular/popup.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -51,6 +53,18 @@ byte popup_colors[24] = {
 	0,   0,  0,  0,  3,  0,  0,  0
 };
 
+// Rex Nebular dialog colors
+static constexpr int BLACK = 0;
+static constexpr int PALETTE_CYCLING_AREA = 6;
+static constexpr int DIALOG_CONTENT1_COLOR = 248;
+static constexpr int DIALOG_CONTENT2_COLOR = 249;
+static constexpr int DIALOG_EDGE_COLOR = 250;
+static constexpr int DIALOG_BACKGROUND_COLOR = 251;
+static constexpr int DIALOG_FC_COLOR = 252;
+static constexpr int DIALOG_FD_COLOR = 253;
+static constexpr int DIALOG_FE_COLOR = 254;
+static constexpr int DIALOG_BLACK_COLOR = 0;
+
 int popup_preserve_initiator[3] = {
 	BUFFER_PRESERVE, BUFFER_PRESERVE, BUFFER_PRESERVE
 };
@@ -99,8 +113,13 @@ int popup_create(int horiz_pieces, int x, int y) {
 	int middle_width;
 	int count;
 	long mem_to_get;
+	bool isRex = g_engine->getGameID() == GType_RexNebular;
+
+	if (isRex)
+		box_param.font = font_inter;
 
-	if (box == NULL) goto done;
+	if (box == NULL)
+		goto done;
 
 	box->dialog_system = false;
 
@@ -119,21 +138,36 @@ int popup_create(int horiz_pieces, int x, int y) {
 
 	box->horiz_pieces = horiz_pieces;
 
-	middle_width = pop_xs(POPUP_UPPER_CENTER) + ((pop_xs(POPUP_TOP) << 1) * horiz_pieces);
+	if (isRex) {
+		middle_width = (box_param.font->max_x_size + 1) * horiz_pieces;
+		box->xs = middle_width + 10;
+		box->window_xs = middle_width;
 
-	box->xs = pop_xs(POPUP_UPPER_LEFT) + pop_xs(POPUP_UPPER_RIGHT) + middle_width;
+		font_set_colors(-1, BLACK, BLACK, BLACK);
 
-	box->window_xs = box_param.extra_x + middle_width;
+		memcpy(&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+			&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+			PALETTE_CYCLING_AREA * 3);
+		pal_grey(master_palette, DIALOG_CONTENT1_COLOR, 2, 36, 32);
+		pal_grey(master_palette, DIALOG_EDGE_COLOR, 2, 39, 28);
+		pal_grey(master_palette, DIALOG_FC_COLOR, 2, 36, 32);
+		pal_grey(master_palette, DIALOG_FE_COLOR, 1, 55, 55);
+		mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
 
-	box->cursor_x = 0;
+	} else {
+		middle_width = pop_xs(POPUP_UPPER_CENTER) + ((pop_xs(POPUP_TOP) << 1) * horiz_pieces);
+		box->xs = pop_xs(POPUP_UPPER_LEFT) + pop_xs(POPUP_UPPER_RIGHT) + middle_width;
+		box->window_xs = box_param.extra_x + middle_width;
+
+		font_set_colors(-1, POPUP_TEXT_COLOR, POPUP_TEXT_COLOR, POPUP_TEXT_COLOR);
+	}
 
+	box->cursor_x = 0;
 	box->text_x = 0;
 	box->text_y = 0;
 
 	box->dont_add_space = false;
 
-	font_set_colors(-1, POPUP_TEXT_COLOR, POPUP_TEXT_COLOR, POPUP_TEXT_COLOR);
-
 	box->text_xs = box->window_xs - (popup_padding_width << 1);
 
 	box->text_width = (box->text_xs / box_param.font->max_x_size) << 1;
@@ -395,7 +429,7 @@ int popup_draw(int save_screen, int depth_code) {
 	int base_size;
 	int text_size;
 	int top, left, right;
-	int x_bonus, y_bonus;
+	int x_bonus = 0, y_bonus = 0;
 	int depth_x2;
 	int bottom_pieces;
 	int x, y;
@@ -408,6 +442,7 @@ int popup_draw(int save_screen, int depth_code) {
 	int icon_padding;
 	int icon_x;
 	int sum_y;
+	bool isRex = g_engine->getGameID() == GType_RexNebular;
 
 	// Arrow cursor
 	cursor_id = 1;
@@ -416,7 +451,8 @@ int popup_draw(int save_screen, int depth_code) {
 		cursor_last = cursor_id;
 	}
 
-	if (!box->cursor_x) box->text_y--;
+	if (!box->cursor_x)
+		box->text_y--;
 
 	// Find out how many vertical pieces are needed to contain the text,
 	// and determine the resulting size.
@@ -432,40 +468,42 @@ int popup_draw(int save_screen, int depth_code) {
 	}
 	base_size = MAX(base_text_size, base_sprite_size);
 
-	box->vert_pieces = ((base_size - (box_param.extra_y + 1)) / pop_ys(POPUP_LEFT)) + 1;
-	box->vert_pieces = MAX(0, box->vert_pieces);
-	text_size = (pop_ys(POPUP_LEFT) * box->vert_pieces) + box_param.extra_y;
+	if (!isRex) {
+		box->vert_pieces = ((base_size - (box_param.extra_y + 1)) / pop_ys(POPUP_LEFT)) + 1;
+		box->vert_pieces = MAX(0, box->vert_pieces);
+		text_size = (pop_ys(POPUP_LEFT) * box->vert_pieces) + box_param.extra_y;
 
-	box->window_ys = text_size;
-	box->text_extra = text_size - base_text_size;
+		box->window_ys = text_size;
+		box->text_extra = text_size - base_text_size;
 
-	box->ys = text_size - (box_param.extra_y)
-		+ pop_ys(POPUP_UPPER_LEFT)
-		+ pop_ys(POPUP_LOWER_LEFT);
+		box->ys = text_size - (box_param.extra_y)
+			+ pop_ys(POPUP_UPPER_LEFT)
+			+ pop_ys(POPUP_LOWER_LEFT);
 
-	// Determine the true size of the entire window (figure out which border
-	// pieces extend the furthest).
-	top = pop_y(POPUP_UPPER_LEFT);
-	top = MIN(top, pop_y(POPUP_UPPER_CENTER));
-	top = MIN(top, pop_y(POPUP_TOP));
+		// Determine the true size of the entire window (figure out which border
+		// pieces extend the furthest).
+		top = pop_y(POPUP_UPPER_LEFT);
+		top = MIN(top, pop_y(POPUP_UPPER_CENTER));
+		top = MIN(top, pop_y(POPUP_TOP));
 
-	y_bonus = pop_y(POPUP_UPPER_LEFT) - top;
-	box->ys += y_bonus;
+		y_bonus = pop_y(POPUP_UPPER_LEFT) - top;
+		box->ys += y_bonus;
 
 
 
-	left = pop_x(POPUP_UPPER_LEFT);
-	left = MIN(left, pop_x(POPUP_LEFT));
-	left = MIN(left, pop_x(POPUP_LOWER_LEFT));
+		left = pop_x(POPUP_UPPER_LEFT);
+		left = MIN(left, pop_x(POPUP_LEFT));
+		left = MIN(left, pop_x(POPUP_LOWER_LEFT));
 
-	x_bonus = pop_x(POPUP_UPPER_LEFT) - left;
-	box->xs += x_bonus;
+		x_bonus = pop_x(POPUP_UPPER_LEFT) - left;
+		box->xs += x_bonus;
 
-	right = pop_x2(POPUP_UPPER_RIGHT);
-	right = MAX(right, pop_x2(POPUP_RIGHT));
-	right = MAX(right, pop_x2(POPUP_LOWER_RIGHT));
+		right = pop_x2(POPUP_UPPER_RIGHT);
+		right = MAX(right, pop_x2(POPUP_RIGHT));
+		right = MAX(right, pop_x2(POPUP_LOWER_RIGHT));
 
-	box->xs += (right - pop_x2(POPUP_UPPER_RIGHT));
+		box->xs += (right - pop_x2(POPUP_UPPER_RIGHT));
+	}
 
 	// Determine the popup's coordinates on the screen
 	if (box->base_x & POPUP_CENTER) {
@@ -508,6 +546,12 @@ int popup_draw(int save_screen, int depth_code) {
 	box->window_x = box->base_x + box_param.offset_x;
 	box->window_y = box->base_y + box_param.offset_y;
 
+
+	if (g_engine->getGameID() == GType_RexNebular) {
+		RexNebular::popup_draw(save_screen);
+		return 0;
+	}
+
 	if (save_screen) {
 		matte_map_work_screen();
 
diff --git a/engines/mads/madsv2/core/popup.h b/engines/mads/madsv2/core/popup.h
index 13fd40fdec2..7d3c440bb06 100644
--- a/engines/mads/madsv2/core/popup.h
+++ b/engines/mads/madsv2/core/popup.h
@@ -100,6 +100,17 @@ namespace MADSV2 {
 
 #define popup_padding_width     3     /* Extra space on each side */
 
+enum {
+	REX_PALETTE_CYCLING_AREA	=   6,
+	REX_DIALOG_CONTENT1_COLOR	= 248,
+	REX_DIALOG_CONTENT2_COLOR	= 249,
+	REX_DIALOG_EDGE_COLOR		= 250,
+	REX_DIALOG_BACKGROUND_COLOR	= 251,
+	REX_DIALOG_FC_COLOR			= 252,
+	REX_DIALOG_FD_COLOR			= 253,
+	REX_DIALOG_FE_COLOR			= 254,
+	REX_DIALOG_BLACK_COLOR		=   0
+};
 
 
 struct BoxParam {
diff --git a/engines/mads/madsv2/core/text.cpp b/engines/mads/madsv2/core/text.cpp
index 1e660c43024..221a399faa9 100644
--- a/engines/mads/madsv2/core/text.cpp
+++ b/engines/mads/madsv2/core/text.cpp
@@ -38,6 +38,7 @@
 #include "mads/madsv2/core/object.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/core/global.h"
+#include "mads/madsv2/engine.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -203,8 +204,11 @@ static void text_copy_vocab(char **mark, int vocab_id, char *alternative) {
 static int text_popup_check(int *popup_created, word width, int x, int y, SeriesPtr icon, int icon_id, int icon_center) {
 	int error_flag = false;
 
+	if (g_engine->getGameID() != GType_RexNebular)
+		width = popup_estimate_pieces(width);
+
 	if (!*popup_created) {
-		error_flag = popup_create(popup_estimate_pieces(width), x, y);
+		error_flag = popup_create(width, x, y);
 		*popup_created = !error_flag;
 
 		if (!error_flag) {
diff --git a/engines/mads/madsv2/nebular/copy.cpp b/engines/mads/madsv2/nebular/copy.cpp
index b5984fa2ae4..f49304620eb 100644
--- a/engines/mads/madsv2/nebular/copy.cpp
+++ b/engines/mads/madsv2/nebular/copy.cpp
@@ -106,7 +106,7 @@ static int copy_pop_and_ask() {
 	char entry_buf[80];
 	CopyProt copy_prot;
 
-	popup_vomitation_flag = false; /* Allow keep of first letter */
+	//popup_vomitation_flag = false; /* Allow keep of first letter */
 
 	if (copy_load(&copy_prot)) goto finish;
 
@@ -116,7 +116,8 @@ static int copy_pop_and_ask() {
 
 	for (count = 0; (count < COPY_TRIES_ALLOWED); count++) {
 
-		if (popup_create(font_inter, 32, POPUP_CENTER, POPUP_CENTER)) goto finish;
+		if (popup_create(32, POPUP_CENTER, POPUP_CENTER))
+			goto finish;
 
 		if (!count) {
 			Common::strcpy_s(work_buf, "REX NEBULAR version ");
@@ -193,9 +194,9 @@ finish:
 	error_flag = COPY_SUCCEED;
 
 done:
-	popup_vomitation_flag = true; /* Reset */
+	//popup_vomitation_flag = true; /* Reset */
 
-	return (error_flag);
+	return error_flag;
 }
 
 int global_copy_verify() {
diff --git a/engines/mads/madsv2/nebular/popup.cpp b/engines/mads/madsv2/nebular/popup.cpp
index 2af021201e5..b3a5948c7b6 100644
--- a/engines/mads/madsv2/nebular/popup.cpp
+++ b/engines/mads/madsv2/nebular/popup.cpp
@@ -36,26 +36,17 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-static constexpr int BLACK = 0;
-static constexpr int PALETTE_CYCLING_AREA = 6;
-static constexpr int DIALOG_CONTENT1_COLOR = 248;
-static constexpr int DIALOG_CONTENT2_COLOR = 249;
-static constexpr int DIALOG_EDGE_COLOR = 250;
-static constexpr int DIALOG_BACKGROUND_COLOR = 251;
-static constexpr int DIALOG_FC_COLOR = 252;
-static constexpr int DIALOG_FD_COLOR = 253;
-static constexpr int DIALOG_FE_COLOR = 254;
 static constexpr int DIALOG_BLACK_COLOR = 0;
 
-int dialog_content_handle;
-bool popup_vomitation_flag;
-
+int dialog_content_seed;
 
 void popup_init() {
-	dialog_content_handle = -1;
-	popup_vomitation_flag = true;
+	dialog_content_seed = -1;
 }
 
+#if 0
+bool popup_vomitation_flag;
+
 int popup_create(FontPtr font, int horiz_pieces, int x, int y) {
 	int count;
 
@@ -113,6 +104,8 @@ void popup_destroy() {
 	box->active = false;
 }
 
+#endif
+
 static uint16 rotr16(uint16 value, int amount) {
 	return (value >> amount) | (value << (16 - amount));
 }
@@ -181,18 +174,18 @@ void popup_draw(bool save_screen) {
 	askY = (box_param.font->max_y_size + 1) * box->ask_y;
 
 	// Fill area
-	buffer_rect_fill(scr_main, box->x, box->y, box->xs, box->ys, DIALOG_BACKGROUND_COLOR);
+	buffer_rect_fill(scr_main, box->x, box->y, box->xs, box->ys, REX_DIALOG_BACKGROUND_COLOR);
 
 	// Edge lines
-	buffer_rect_fill(scr_main, box->x + 1, box->y + box->ys - 2, box->xs - 1, 1, DIALOG_EDGE_COLOR);
-	buffer_rect_fill(scr_main, box->x, box->y + box->ys - 1, box->xs, 1, DIALOG_EDGE_COLOR);
+	buffer_rect_fill(scr_main, box->x + 1, box->y + box->ys - 2, box->xs - 1, 1, REX_DIALOG_EDGE_COLOR);
+	buffer_rect_fill(scr_main, box->x, box->y + box->ys - 1, box->xs, 1, REX_DIALOG_EDGE_COLOR);
 
 	// Right edge
-	buffer_rect_fill(scr_main, box->x + box->xs - 2, box->y + 2, 1, box->ys - 2, DIALOG_EDGE_COLOR);
-	buffer_rect_fill(scr_main, box->x + box->xs - 1, box->y + 1, 1, box->ys - 1, DIALOG_EDGE_COLOR);
+	buffer_rect_fill(scr_main, box->x + box->xs - 2, box->y + 2, 1, box->ys - 2, REX_DIALOG_EDGE_COLOR);
+	buffer_rect_fill(scr_main, box->x + box->xs - 1, box->y + 1, 1, box->ys - 1, REX_DIALOG_EDGE_COLOR);
 
-	dialog_content_handle = popup_draw_content(box->x + 2, box->y + 2, box->xs - 4, askY, 0,
-		DIALOG_CONTENT2_COLOR, DIALOG_CONTENT1_COLOR, box->ys - 4, scr_main);
+	dialog_content_seed = popup_draw_content(box->x + 2, box->y + 2, box->xs - 4, askY, 0,
+		REX_DIALOG_CONTENT2_COLOR, REX_DIALOG_CONTENT1_COLOR, box->ys - 4, scr_main);
 
 	askY = box->y + 5;
 
diff --git a/engines/mads/madsv2/nebular/popup.h b/engines/mads/madsv2/nebular/popup.h
index 8324c82e16d..250cbab7b93 100644
--- a/engines/mads/madsv2/nebular/popup.h
+++ b/engines/mads/madsv2/nebular/popup.h
@@ -29,11 +29,11 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-extern bool popup_vomitation_flag;
+//extern bool popup_vomitation_flag;
 
 extern void popup_init();
-extern int popup_create(FontPtr font, int horiz_pieces, int x, int y);
-extern void popup_destroy();
+//extern int popup_create(FontPtr font, int horiz_pieces, int x, int y);
+//extern void popup_destroy();
 extern void popup_draw(bool save_screen);
 
 } // namespace RexNebular


Commit: 83a3100dc5e24f465c84663dacdca00b47667055
    https://github.com/scummvm/scummvm/commit/83a3100dc5e24f465c84663dacdca00b47667055
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:04:59+10:00

Commit Message:
MADS: NEBULAR: Further work on text dialog display

Changed paths:
    engines/mads/madsv2/core/popup.cpp
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/nebular.h
    engines/mads/madsv2/nebular/popup.cpp
    engines/mads/madsv2/nebular/popup.h


diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index a336f7178a2..9cd9ca49f89 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -115,8 +115,10 @@ int popup_create(int horiz_pieces, int x, int y) {
 	long mem_to_get;
 	bool isRex = g_engine->getGameID() == GType_RexNebular;
 
-	if (isRex)
+	if (isRex) {
 		box_param.font = font_inter;
+		box_param.font_spacing = 1;
+	}
 
 	if (box == NULL)
 		goto done;
@@ -141,7 +143,8 @@ int popup_create(int horiz_pieces, int x, int y) {
 	if (isRex) {
 		middle_width = (box_param.font->max_x_size + 1) * horiz_pieces;
 		box->xs = middle_width + 10;
-		box->window_xs = middle_width;
+		box->text_xs = middle_width;
+		box->text_width = horiz_pieces * 2;
 
 		font_set_colors(-1, BLACK, BLACK, BLACK);
 
@@ -158,6 +161,8 @@ int popup_create(int horiz_pieces, int x, int y) {
 		middle_width = pop_xs(POPUP_UPPER_CENTER) + ((pop_xs(POPUP_TOP) << 1) * horiz_pieces);
 		box->xs = pop_xs(POPUP_UPPER_LEFT) + pop_xs(POPUP_UPPER_RIGHT) + middle_width;
 		box->window_xs = box_param.extra_x + middle_width;
+		box->text_xs = box->window_xs - (popup_padding_width << 1);
+		box->text_width = (box->text_xs / box_param.font->max_x_size) << 1;
 
 		font_set_colors(-1, POPUP_TEXT_COLOR, POPUP_TEXT_COLOR, POPUP_TEXT_COLOR);
 	}
@@ -168,10 +173,6 @@ int popup_create(int horiz_pieces, int x, int y) {
 
 	box->dont_add_space = false;
 
-	box->text_xs = box->window_xs - (popup_padding_width << 1);
-
-	box->text_width = (box->text_xs / box_param.font->max_x_size) << 1;
-
 	box->screen_buffer.data = NULL;
 	box->orig_buffer.data   = NULL;
 	box->depth_buffer.data  = NULL;
@@ -468,7 +469,10 @@ int popup_draw(int save_screen, int depth_code) {
 	}
 	base_size = MAX(base_text_size, base_sprite_size);
 
-	if (!isRex) {
+	if (isRex) {
+		box->ys = (box_param.font->max_y_size + 1) * (box->text_y + 1) + 10;
+
+	} else {
 		box->vert_pieces = ((base_size - (box_param.extra_y + 1)) / pop_ys(POPUP_LEFT)) + 1;
 		box->vert_pieces = MAX(0, box->vert_pieces);
 		text_size = (pop_ys(POPUP_LEFT) * box->vert_pieces) + box_param.extra_y;
@@ -489,8 +493,6 @@ int popup_draw(int save_screen, int depth_code) {
 		y_bonus = pop_y(POPUP_UPPER_LEFT) - top;
 		box->ys += y_bonus;
 
-
-
 		left = pop_x(POPUP_UPPER_LEFT);
 		left = MIN(left, pop_x(POPUP_LEFT));
 		left = MIN(left, pop_x(POPUP_LOWER_LEFT));
@@ -546,12 +548,6 @@ int popup_draw(int save_screen, int depth_code) {
 	box->window_x = box->base_x + box_param.offset_x;
 	box->window_y = box->base_y + box_param.offset_y;
 
-
-	if (g_engine->getGameID() == GType_RexNebular) {
-		RexNebular::popup_draw(save_screen);
-		return 0;
-	}
-
 	if (save_screen) {
 		matte_map_work_screen();
 
@@ -612,6 +608,12 @@ int popup_draw(int save_screen, int depth_code) {
 		}
 	}
 
+	if (g_engine->getGameID() == GType_RexNebular) {
+		RexNebular::popup_draw();
+		return 0;
+	}
+
+
 	matte_map_work_screen();
 
 	x = box->base_x;
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 38340898a0a..abde830edf5 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -57,6 +57,12 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
+RexNebularEngine::RexNebularEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
+		MADSV2Engine(syst, gameDesc) {
+	// Initialize globals
+	RexNebular::popup_init();
+}
+
 Common::Error RexNebularEngine::run() {
 	initGraphics(320, 200);
 	_screen = new Graphics::Screen();
@@ -76,9 +82,6 @@ Common::Error RexNebularEngine::run() {
 	_soundManager = new RexSoundManager(_mixer, _soundFlag);
 	_soundManager->validate();
 
-	// Initialize globals
-	RexNebular::popup_init();
-
 	// Run the game
 	RexNebular::nebular_main();
 
diff --git a/engines/mads/madsv2/nebular/nebular.h b/engines/mads/madsv2/nebular/nebular.h
index 20a2d1b4b9e..b5ea9e3f82b 100644
--- a/engines/mads/madsv2/nebular/nebular.h
+++ b/engines/mads/madsv2/nebular/nebular.h
@@ -45,8 +45,7 @@ private:
 	void showRecipe();
 
 public:
-	RexNebularEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
-		MADSV2Engine(syst, gameDesc) {}
+	RexNebularEngine(OSystem *syst, const MADSGameDescription *gameDesc);
 	~RexNebularEngine() override {}
 
 	Common::Error run() override;
diff --git a/engines/mads/madsv2/nebular/popup.cpp b/engines/mads/madsv2/nebular/popup.cpp
index b3a5948c7b6..484cfff4769 100644
--- a/engines/mads/madsv2/nebular/popup.cpp
+++ b/engines/mads/madsv2/nebular/popup.cpp
@@ -44,68 +44,6 @@ void popup_init() {
 	dialog_content_seed = -1;
 }
 
-#if 0
-bool popup_vomitation_flag;
-
-int popup_create(FontPtr font, int horiz_pieces, int x, int y) {
-	int count;
-
-	box->x = x;
-	box->y = y;
-	box_param.font = font;
-	box->xs = (box_param.font->max_x_size + 1) * horiz_pieces + 10;
-	box->text_width = horiz_pieces * 2;
-
-	box->cursor_x = 0;
-	box->text_x = box->text_y = 0;
-	font_set_colors(-1, BLACK, BLACK, BLACK);
-
-	// Allocate text lines
-	box->text[0] = (char *)malloc((box->text_width + 1) * POPUP_MAX_LINES);
-	assert(box->text[0]);
-
-	// Set pointers within text for remaining text array indexes
-	for (count = 1; count < POPUP_MAX_LINES; ++count)
-		box->text[count] = box->text[0] + (count * (box->text_width + 1));
-
-	for (count = 0; count < POPUP_MAX_LINES; ++count) {
-		*box->text[count] = '\0';
-		box->tab[count] = 0;
-	}
-
-
-	memcpy(&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
-		&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
-		PALETTE_CYCLING_AREA * 3);
-	pal_grey(master_palette, DIALOG_CONTENT1_COLOR, 2, 36, 32);
-	pal_grey(master_palette, DIALOG_EDGE_COLOR, 2, 39, 28);
-	pal_grey(master_palette, DIALOG_FC_COLOR, 2, 36, 32);
-	pal_grey(master_palette, DIALOG_FE_COLOR, 1, 55, 55);
-	mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
-	box->active = true;
-
-	return 0;
-}
-
-void popup_destroy() {
-	if (box->depth_saved) {
-		buffer_restore(&scr_main, box->preserve_handle, 0, box->x, box->y, box->xs, box->ys);
-		video_update(&scr_main, box->x, box->y - viewing_at_y, box->x, box->y, box->xs, box->ys);
-	}
-	box->depth_saved = false;
-
-	if (box->active)
-		mem_free(box->text);
-
-	memcpy(&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
-		&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
-		PALETTE_CYCLING_AREA * 3);
-	mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
-	box->active = false;
-}
-
-#endif
-
 static uint16 rotr16(uint16 value, int amount) {
 	return (value >> amount) | (value << (16 - amount));
 }
@@ -145,19 +83,9 @@ static int popup_draw_content(int x, int y, int xs, int ys, int unknown, byte co
 	return result;
 }
 
-void popup_draw(bool save_screen) {
+void popup_draw() {
 	int askY;
 
-	if (box->cursor_x == 0)
-		box->text_y--;
-
-	box->ys = (box_param.font->max_y_size + 1) * (box->text_y + 1) + 10;
-
-	if (box->x == POPUP_CENTER)
-		box->x = 160 - box->xs / 2;
-	if (box->y == POPUP_CENTER)
-		box->y = 100 - box->ys / 2;
-
 	int y2 = box->y + box->ys;
 	int x2 = box->x + box->xs;
 
@@ -166,11 +94,6 @@ void popup_draw(bool save_screen) {
 	if (y2 > 200)
 		y2 = -(y2 - 200);
 
-	if (save_screen) {
-		box->preserve_handle = buffer_preserve(&scr_main, 0xfff8, 0, box->x, box->y, box->xs, box->ys);
-		box->depth_saved = true;
-	}
-
 	askY = (box_param.font->max_y_size + 1) * box->ask_y;
 
 	// Fill area
diff --git a/engines/mads/madsv2/nebular/popup.h b/engines/mads/madsv2/nebular/popup.h
index 250cbab7b93..6e057fcf3de 100644
--- a/engines/mads/madsv2/nebular/popup.h
+++ b/engines/mads/madsv2/nebular/popup.h
@@ -34,7 +34,7 @@ namespace RexNebular {
 extern void popup_init();
 //extern int popup_create(FontPtr font, int horiz_pieces, int x, int y);
 //extern void popup_destroy();
-extern void popup_draw(bool save_screen);
+extern void popup_draw();
 
 } // namespace RexNebular
 } // namespace MADSV2


Commit: bfe96bdc9d3734a9cf8aae72dd75393ae74276c7
    https://github.com/scummvm/scummvm/commit/bfe96bdc9d3734a9cf8aae72dd75393ae74276c7
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:00+10:00

Commit Message:
MADS: NEBULAR: Properly implement screen shaking

Changed paths:
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/popup.cpp
    engines/mads/madsv2/engine.cpp
    engines/mads/madsv2/engine.h
    engines/mads/madsv2/nebular/main.cpp


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index be8cfd03285..fa778347806 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -481,6 +481,11 @@ int game_parse_keystroke(int mykey) {
 			}
 			break;
 
+
+		case ctrl_e_key:
+			mcga_shakes = 350;
+			break;
+
 		case ctrl_f_key:
 			kernel.frame_by_frame = (byte)!(int)kernel.frame_by_frame;
 			kernel.paused = false;
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index a1d1f845b88..016d6d25bdc 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -390,10 +390,13 @@ int kernel_game_startup(int game_video_mode, int load_flag,
 		font_misc = font_load("*FONTMISC.FF");
 
 		font_menu = font_tele = nullptr;
-		if (g_engine->getGameID() == GType_RexNebular)
+
+		if (g_engine->getGameID() == GType_RexNebular) {
 			font_tele = font_load("*FONTTELE.FF");
-		else
+			box_param.font = font_inter;
+		} else {
 			font_menu = font_load("*FONTMENU.FF");
+		}
 
 		if ((font_main == NULL) || (font_inter == NULL) || (font_conv == NULL) || (font_misc == NULL) ||
 			(g_engine->getGameID() != GType_RexNebular && font_menu == NULL) ||
diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index 9cd9ca49f89..279682676be 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -1020,6 +1020,9 @@ int popup_ask_string(char *target, int maxlen, int save_screen) {
 	mouse_init_cycle();
 
 	while (going) {
+		if (g_engine->shouldQuit())
+			return 1;
+
 		len = strlen(temp_buf);
 		while (!keys_any()) {
 			mouse_begin_cycle(false);
diff --git a/engines/mads/madsv2/engine.cpp b/engines/mads/madsv2/engine.cpp
index 50eab1c48c5..bd16b136cf2 100644
--- a/engines/mads/madsv2/engine.cpp
+++ b/engines/mads/madsv2/engine.cpp
@@ -41,6 +41,7 @@
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/keys.h"
 #include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mcga.h"
 #include "mads/madsv2/core/object.h"
 #include "mads/madsv2/core/pal.h"
 #include "mads/madsv2/core/player.h"
@@ -247,10 +248,7 @@ void MADSV2Engine::pollEvents() {
 	// Check for screen update time
 	uint32 time = g_system->getMillis();
 	if (time >= _nextFrameTime) {
-		// Because the screen is accessed directly via Buffer objects,
-		// we need to do a full screen update each frame
-		_screen->markAllDirty();
-		_screen->update();
+		updateScreen();
 		_nextFrameTime = time + GAME_FRAME_TIME;
 	}
 
@@ -308,6 +306,30 @@ void MADSV2Engine::pollEvents() {
 	}
 }
 
+void MADSV2Engine::updateScreen() {
+	// Handle any screen shaking
+	if (mcga_shakes) {
+		_shakeRandom = _shakeRandom * 5 + 1;
+		int offset = (_shakeRandom >> 8) & 3;
+		if (--mcga_shakes == 0)
+			offset = 0;
+
+		// Manually copy the screen with the left hand hide side of the screen of a given offset width shown
+		// at the very right. The offset changes to give an effect of shaking the screen
+		offset *= 4;
+		const byte *buf = (const byte *)_screen->getBasePtr(offset, 0);
+		g_system->copyRectToScreen(buf, 320, 0, 0, 320 - offset, 200);
+		if (offset > 0)
+			g_system->copyRectToScreen(_screen->getPixels(), 320, 320 - offset, 0, offset, 200);
+		g_system->updateScreen();
+
+	} else {
+		// Because the screen is accessed directly via Buffer objects, we need to do a full screen update each frame
+		_screen->markAllDirty();
+		_screen->update();
+	}
+}
+
 bool MADSV2Engine::isSpecialKey(Common::KeyCode key) const {
 	static const Common::KeyCode KEYS[] = {
 		Common::KEYCODE_LCTRL, Common::KEYCODE_LALT, Common::KEYCODE_RSHIFT, Common::KEYCODE_RALT,
diff --git a/engines/mads/madsv2/engine.h b/engines/mads/madsv2/engine.h
index ccecddf9e8d..c0ebc5a9cb9 100644
--- a/engines/mads/madsv2/engine.h
+++ b/engines/mads/madsv2/engine.h
@@ -40,9 +40,12 @@ typedef void (*TimerFunction)();
 
 class MADSV2Engine : public MADSEngine {
 private:
+	uint16 _shakeRandom = 0x4D2;
+
 	void initGlobals();
 	void syncGame(Common::Serializer &s);
 	bool isSpecialKey(Common::KeyCode key) const;
+	void updateScreen();
 	
 protected:
 	Graphics::Screen *_screen = nullptr;
diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
index 232acbdd946..40c17b3d19a 100644
--- a/engines/mads/madsv2/nebular/main.cpp
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -128,9 +128,9 @@ static void main_cold_data_init() {
 	game_menu_exit = global_menu_system_shutdown;
 	game_emergency_save = global_emergency_save;
 
-	Common::strcpy_s(config_file_name, "config.dra");
-	Common::strcpy_s(save_game_key, "drag");
-	Common::strcpy_s(restart_game_key, "dragon");
+	Common::strcpy_s(config_file_name, "config.rex");
+	Common::strcpy_s(save_game_key, "rex");
+	Common::strcpy_s(restart_game_key, "rex");
 
 	Common::strcpy_s(player.series_name, "RAL");
 	player.walker_must_reload = true;
@@ -138,7 +138,7 @@ static void main_cold_data_init() {
 	player.walker_visible = true;
 	player.scaling_velocity = true;
 
-	Common::strcpy_s(kernel_cheating_password, "WIDECHEW");
+	Common::strcpy_s(kernel_cheating_password, "WIDEPIPE");
 	kernel_cheating_allowed = strlen(kernel_cheating_password);
 
 	kernel.cheating = gDebugLevel == 9 ? kernel_cheating_allowed : 0;


Commit: ae2d2ccede39a5f7d6e651c000d697d91f645228
    https://github.com/scummvm/scummvm/commit/ae2d2ccede39a5f7d6e651c000d697d91f645228
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:00+10:00

Commit Message:
MADS: NEBULAR: Fix displaying alert popups

Changed paths:
    engines/mads/madsv2/core/popup.cpp


diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index 279682676be..0ae7c04d3a9 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -1135,10 +1135,15 @@ int popup_estimate_pieces(int maxlen) {
 	int pieces;
 	int estimate;
 
-	font_len = maxlen * (box_param.font->max_x_size + box_param.font_spacing);
-	pieces = ((font_len - 1) / pop_xs(POPUP_TOP)) + 1;
-	estimate = (pieces - box_param.pieces_per_center) >> 1;
-	return (estimate);
+	if (g_engine->getGameID() == GType_RexNebular) {
+		estimate = maxlen;
+	} else {
+		font_len = maxlen * (box_param.font->max_x_size + box_param.font_spacing);
+		pieces = ((font_len - 1) / pop_xs(POPUP_TOP)) + 1;
+		estimate = (pieces - box_param.pieces_per_center) >> 1;
+	}
+
+	return estimate;
 }
 
 int popup_get_string(char *target, const char *top, const char *left, int maxlen) {


Commit: ccdc1b2a6afbb3e4865957d82574722995e5b357
    https://github.com/scummvm/scummvm/commit/ccdc1b2a6afbb3e4865957d82574722995e5b357
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:01+10:00

Commit Message:
MADS: NEBULAR: Fix pal flags in room background loading

Changed paths:
    engines/mads/madsv2/core/room.cpp


diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index 05c883b0b47..ab4876919b4 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -568,7 +568,11 @@ int room_picture_load(int roomId, Buffer *picture, int load_flags) {
 	}
 
 	if (!(load_flags & ROOM_LOAD_TRANSLATE)) {
-		color_handle = pal_allocate(&art.color_list, NULL, (load_flags & PAL_MAP_MASK));
+		int palFlags = load_flags & PAL_MAP_MASK;
+		if (g_engine->getGameID() == GType_RexNebular)
+			palFlags |= PAL_MAP_BACKGROUND;
+
+		color_handle = pal_allocate(&art.color_list, NULL, palFlags);
 		if (color_handle < 0) {
 			room_load_error = 4;
 			goto done;


Commit: 36353130e6d98d6c8a4e4eb943e09dfc16c782c6
    https://github.com/scummvm/scummvm/commit/36353130e6d98d6c8a4e4eb943e09dfc16c782c6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:01+10:00

Commit Message:
MADS: NEBULAR: Fix pal_allocate conduct_search flag

Changed paths:
    engines/mads/madsv2/core/color.cpp
    engines/mads/madsv2/core/color.h
    engines/mads/madsv2/core/pal.cpp
    engines/mads/madsv2/core/sprite.cpp


diff --git a/engines/mads/madsv2/core/color.cpp b/engines/mads/madsv2/core/color.cpp
index 7ae436c3788..d5ad1e61785 100644
--- a/engines/mads/madsv2/core/color.cpp
+++ b/engines/mads/madsv2/core/color.cpp
@@ -34,23 +34,6 @@ void Color::load(Common::SeekableReadStream *src) {
 
 //====================================================================
 
-bool ColorList::load(Load &load_handle, int size) {
-	// Load in the needed data
-	byte *buffer = (byte *)malloc(size);
-	bool result = loader_read(buffer, size, 1, &load_handle);
-
-	if (result) {
-		Common::MemoryReadStream src(buffer, size);
-
-		num_colors = src.readUint16LE();
-		for (int i = 0; i < num_colors; ++i)
-			table[i].load(&src);
-	}
-
-	free(buffer);
-	return result;
-}
-
 void ColorList::load(Common::SeekableReadStream *src) {
 	num_colors = src->readUint16LE();
 
diff --git a/engines/mads/madsv2/core/color.h b/engines/mads/madsv2/core/color.h
index a70d1fc61ee..613622a823d 100644
--- a/engines/mads/madsv2/core/color.h
+++ b/engines/mads/madsv2/core/color.h
@@ -81,7 +81,6 @@ struct ColorList {
 	Color table[COLOR_MAX_USER_COLORS];
 
 	static constexpr size_t SIZE = 2 + (Color::SIZE * COLOR_MAX_USER_COLORS);
-	bool load(Load &load_handle, int size);
 	void load(Common::SeekableReadStream *src);
 };
 
diff --git a/engines/mads/madsv2/core/pal.cpp b/engines/mads/madsv2/core/pal.cpp
index 4066efab6e0..7e1d010cdd1 100644
--- a/engines/mads/madsv2/core/pal.cpp
+++ b/engines/mads/madsv2/core/pal.cpp
@@ -425,7 +425,8 @@ int pal_allocate(ColorListPtr new_list, ShadowListPtr shadow_list, int pal_flags
 		// found a (shadowing) match; and  B) if we are defining an initial
 		// background and therefore should not have any matches.
 		conduct_search = !found && !defining_background &&
-			(cycle_mask != 0 || g_engine->getGameID() == GType_Dragonsphere);
+			(cycle_mask != 0 || g_engine->getGameID() == GType_Dragonsphere ||
+				g_engine->getGameID() == GType_RexNebular);
 
 		if (conduct_search) {
 			// Now, decide whether we need an exact match or are willing to just
@@ -439,10 +440,8 @@ int pal_allocate(ColorListPtr new_list, ShadowListPtr shadow_list, int pal_flags
 				best_hash = 1;
 			}
 
-
 			// Search through the existing palette for an appropriate color
 			for (target_color = search_start; target_color < search_stop; target_color++) {
-
 				if (color_status[target_color]) {
 					if ((!(color_status[target_color] & PAL_RESERVED)) || (pal_flags & PAL_MAP_RESERVED)) {
 						if (!(color_status[target_color] & cycle_mask)) {
@@ -451,8 +450,7 @@ int pal_allocate(ColorListPtr new_list, ShadowListPtr shadow_list, int pal_flags
 							} else {
 								// This is a little hack (or "optimization") to compare the 3 RGB bytes much
 								// more quickly when we are looking for an exact match only.
-								hash = ((*(word *) & new_list->table[list_color] == *(word *) & master_palette[target_color]) &&
-									(*(((byte *) & new_list->table[list_color]) + 2) == *(((byte *) & master_palette[target_color]) + 2))) ? 0 : 1;
+								hash = !memcmp(&new_list->table[list_color].r, &master_palette[target_color].r, 3) ? 0 : 1;
 							}
 							if (hash < best_hash) {
 								found = true;
diff --git a/engines/mads/madsv2/core/sprite.cpp b/engines/mads/madsv2/core/sprite.cpp
index 6af5823f411..d5e11e6ddbe 100644
--- a/engines/mads/madsv2/core/sprite.cpp
+++ b/engines/mads/madsv2/core/sprite.cpp
@@ -470,16 +470,21 @@ SeriesPtr sprite_series_load(const char *filename, int load_flags) {
 	}
 
 	// Read the color list
-	total_color_size = load_handle.pack.strategy[load_handle.pack_list_marker].size;
+	{
+		total_color_size = load_handle.pack.strategy[load_handle.pack_list_marker].size;
+		byte *buffer = (byte *)malloc(total_color_size);
+		if (!loader_read(buffer, total_color_size, 1, &load_handle)) {
+			free(buffer);
+			sprite_error = SS_ERR_READFILE;
+			goto done;
+		}
 
-	color_list = (ColorListPtr)mem_get_name(total_color_size, "$color$");
-	if (color_list == NULL) {
-		sprite_error = SS_ERR_NOMOREMEMORY;
-		goto done;
-	}
+		color_list = (ColorListPtr)mem_get_name(sizeof(ColorList), "$color$");
+		Common::MemoryReadStream src(buffer, total_color_size);
+		color_list->load(&src);
 
-	if (!color_list->load(load_handle, total_color_size))
-		goto done;
+		free(buffer);
+	}
 
 	/* Copy relevant header data to target header */
 


Commit: 6459d5ef9a8e4e946af77a95cc60d89f53f7e39c
    https://github.com/scummvm/scummvm/commit/6459d5ef9a8e4e946af77a95cc60d89f53f7e39c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:02+10:00

Commit Message:
MADS: NEBULAR: Fix moving between room 101 and 102

Changed paths:
    engines/mads/madsv2/nebular/rooms/room102.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room102.cpp b/engines/mads/madsv2/nebular/rooms/room102.cpp
index fa9d4ce482b..67dec61fe9c 100644
--- a/engines/mads/madsv2/nebular/rooms/room102.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room102.cpp
@@ -90,7 +90,7 @@ static void room_102_init() {
 	if (_scene->_priorSceneId == 101) {
 		_game._player._playerPos = Common::Point(229, 109);
 		_game._player._stepEnabled = false;
-		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 2, 0);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 	} else if (_scene->_priorSceneId == 103)
 		_game._player._playerPos = Common::Point(47, 152);
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 9267125389b..6841b6bcde2 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -329,13 +329,15 @@ void Scene::UserInterface::setup(int inputMode) {
 	kernel_set_interface_mode(inputMode);
 }
 
-int16 Scene::Sequences::addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
-	word start_ticks, int expire) {
+int16 Scene::Sequences::addSpriteCycle(int series_id, int mirror, word ticks, word expire,
+	word start_ticks, int interval_ticks) {
+	// ***WARNING***: Last 3 params reversed
 	return kernel_seq_forward(series_id, mirror, ticks, interval_ticks, start_ticks, expire);
 }
 
-int16 Scene::Sequences::addReverseSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks,
-		word start_ticks, int expire) {
+int16 Scene::Sequences::addReverseSpriteCycle(int series_id, int mirror, word ticks, word expire,
+		word start_ticks, int interval_ticks) {
+	// ***WARNING***: Last 3 params reversed
 	return kernel_seq_backward(series_id, mirror, ticks, interval_ticks, start_ticks, expire);
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index c7a1c2c7a7a..4b6e3059611 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -311,10 +311,10 @@ struct Scene {
 	};
 
 	struct Sequences {
-		int16 addSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
-			word start_ticks = 0, int expire = 0);
-		int16 addReverseSpriteCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
-			word start_ticks = 0, int expire = 0);
+		int16 addSpriteCycle(int series_id, int mirror, word ticks, word expire = 0,
+			word start_ticks = 0, int interval_ticks = 0); 	// ***WARNING***: Last 3 params reversed
+		int16 addReverseSpriteCycle(int series_id, int mirror, word ticks, word expire = 0,
+			word start_ticks = 0, int interval_ticks = 0);	// ***WARNING***: Last 3 params reversed
 		int startPingPongCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
 			word start_ticks = 0, int expire = 0);
 		void remove(int sequence_id);


Commit: 77c58095a226767486335a136fb513bef119ef81
    https://github.com/scummvm/scummvm/commit/77c58095a226767486335a136fb513bef119ef81
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:02+10:00

Commit Message:
MADS: NEBULAR: Fix looking at view screen in room 101

Changed paths:
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index fa778347806..9035b6d1a08 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1629,22 +1629,22 @@ static void game_handle_preparse() {
  * various levels of parser code and error code.
  */
 static void game_handle_command() {
-	int handled_this_one;
-	int kernel_trigger_in;
+	bool isRex = g_engine->getGameID() == GType_RexNebular;
+	int handled_this_one = false;
+	int kernel_trigger_in = kernel.trigger;
 
-	kernel_trigger_in = kernel.trigger;
-
-	if (conv_control.running >= 0) {
-		player.look_around = false;
-		if ((conv_control.status == CONV_STATUS_WAIT_AUTO) ||
-			(conv_control.status == CONV_STATUS_WAIT_ENTRY)) {
-			player.commands_allowed = false;
+	if (!isRex) {
+		if (conv_control.running >= 0) {
+			player.look_around = false;
+			if ((conv_control.status == CONV_STATUS_WAIT_AUTO) ||
+				(conv_control.status == CONV_STATUS_WAIT_ENTRY)) {
+				player.commands_allowed = false;
+			}
 		}
-	}
 
-	handled_this_one = false;
-	if (kernel.trigger)
-		player.command_ready = true;
+		if (kernel.trigger)
+			player.command_ready = true;
+	}
 
 	kernel.trigger_setup_mode = KERNEL_TRIGGER_PARSER;
 
@@ -1660,7 +1660,7 @@ static void game_handle_command() {
 		handled_this_one = !player.command_ready;
 	}
 
-	if (conv_control.running >= 0) {
+	if (conv_control.running >= 0 || (isRex && inter_input_mode == INTER_CONVERSATION)) {
 		player.command_ready = false;
 		goto done;
 	}
@@ -1695,7 +1695,7 @@ done:
 	player.command_ready = false;
 
 	if (kernel.trigger_mode == KERNEL_TRIGGER_PARSER) {
-		if (kernel.trigger == kernel_trigger_in) {
+		if (isRex || kernel.trigger == kernel_trigger_in) {
 			kernel.trigger = 0;
 		}
 	}
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 6841b6bcde2..0ad25fb6ac4 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -341,8 +341,9 @@ int16 Scene::Sequences::addReverseSpriteCycle(int series_id, int mirror, word ti
 	return kernel_seq_backward(series_id, mirror, ticks, interval_ticks, start_ticks, expire);
 }
 
-int Scene::Sequences::startPingPongCycle(int series_id, int mirror, word ticks, word interval_ticks,
-	word start_ticks, int expire) {
+int Scene::Sequences::startPingPongCycle(int series_id, int mirror, word ticks, word expire,
+	word start_ticks, int interval_ticks) {
+	// ***WARNING***: Last 3 params reversed
 	return kernel_seq_pingpong(series_id, mirror, ticks, interval_ticks, start_ticks, expire);
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 4b6e3059611..0a3951078c4 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -315,8 +315,9 @@ struct Scene {
 			word start_ticks = 0, int interval_ticks = 0); 	// ***WARNING***: Last 3 params reversed
 		int16 addReverseSpriteCycle(int series_id, int mirror, word ticks, word expire = 0,
 			word start_ticks = 0, int interval_ticks = 0);	// ***WARNING***: Last 3 params reversed
-		int startPingPongCycle(int series_id, int mirror, word ticks, word interval_ticks = 0,
-			word start_ticks = 0, int expire = 0);
+		int startPingPongCycle(int series_id, int mirror, word ticks, word expire = 0,
+			word start_ticks = 0, int interval_ticks = 0);	// ***WARNING***: Last 3 params reversed
+
 		void remove(int sequence_id);
 		SequenceProxy operator[](uint sequence_id);
 


Commit: b088f2b0b47c0b63145940958e31e24cd3a411ff
    https://github.com/scummvm/scummvm/commit/b088f2b0b47c0b63145940958e31e24cd3a411ff
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:03+10:00

Commit Message:
MADS: NEBULAR: Properly implement popup_ask_string

Changed paths:
    engines/mads/madsv2/core/popup.cpp
    engines/mads/madsv2/nebular/copy.cpp
    engines/mads/madsv2/nebular/popup.cpp
    engines/mads/madsv2/nebular/popup.h


diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index 0ae7c04d3a9..81d206e5452 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -53,18 +53,6 @@ byte popup_colors[24] = {
 	0,   0,  0,  0,  3,  0,  0,  0
 };
 
-// Rex Nebular dialog colors
-static constexpr int BLACK = 0;
-static constexpr int PALETTE_CYCLING_AREA = 6;
-static constexpr int DIALOG_CONTENT1_COLOR = 248;
-static constexpr int DIALOG_CONTENT2_COLOR = 249;
-static constexpr int DIALOG_EDGE_COLOR = 250;
-static constexpr int DIALOG_BACKGROUND_COLOR = 251;
-static constexpr int DIALOG_FC_COLOR = 252;
-static constexpr int DIALOG_FD_COLOR = 253;
-static constexpr int DIALOG_FE_COLOR = 254;
-static constexpr int DIALOG_BLACK_COLOR = 0;
-
 int popup_preserve_initiator[3] = {
 	BUFFER_PRESERVE, BUFFER_PRESERVE, BUFFER_PRESERVE
 };
@@ -146,16 +134,7 @@ int popup_create(int horiz_pieces, int x, int y) {
 		box->text_xs = middle_width;
 		box->text_width = horiz_pieces * 2;
 
-		font_set_colors(-1, BLACK, BLACK, BLACK);
-
-		memcpy(&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
-			&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
-			PALETTE_CYCLING_AREA * 3);
-		pal_grey(master_palette, DIALOG_CONTENT1_COLOR, 2, 36, 32);
-		pal_grey(master_palette, DIALOG_EDGE_COLOR, 2, 39, 28);
-		pal_grey(master_palette, DIALOG_FC_COLOR, 2, 36, 32);
-		pal_grey(master_palette, DIALOG_FE_COLOR, 1, 55, 55);
-		mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
+		RexNebular::popup_setup_cycle();
 
 	} else {
 		middle_width = pop_xs(POPUP_UPPER_CENTER) + ((pop_xs(POPUP_TOP) << 1) * horiz_pieces);
@@ -957,6 +936,11 @@ done:
 void popup_update_ask(char *string, int maxlen) {
 	int x1, y1, x2, x3, xs, ys, xs2;
 
+	if (g_engine->getGameID() == GType_RexNebular) {
+		RexNebular::popup_update_ask(string, maxlen);
+		return;
+	}
+
 	xs = box->text_xs;
 	ys = (box_param.font->max_y_size + 1);
 	x1 = box->window_x + popup_padding_width;
@@ -1009,7 +993,8 @@ int popup_ask_string(char *target, int maxlen, int save_screen) {
 		Common::strcat_s(box->text[box->ask_y], 65536, " ");
 	}
 
-	if (popup_draw(save_screen, false)) goto done;
+	if (popup_draw(save_screen, false))
+		goto done;
 
 	popup_update_ask(temp_buf, maxlen);
 
@@ -1024,7 +1009,7 @@ int popup_ask_string(char *target, int maxlen, int save_screen) {
 			return 1;
 
 		len = strlen(temp_buf);
-		while (!keys_any()) {
+		while (!g_engine->shouldQuit() && !keys_any()) {
 			mouse_begin_cycle(false);
 			if (mouse_stop_stroke) {
 				error_flag = 1;
diff --git a/engines/mads/madsv2/nebular/copy.cpp b/engines/mads/madsv2/nebular/copy.cpp
index f49304620eb..29bf6c611bc 100644
--- a/engines/mads/madsv2/nebular/copy.cpp
+++ b/engines/mads/madsv2/nebular/copy.cpp
@@ -54,13 +54,13 @@ struct CopyProt {
 };
 
 
-static void copy_mangle(CopyProt *copy_prot) {
+static void copy_mangle(byte copy_prot[CopyProt::SIZE]) {
 	int count;
 	byte *dog;
 
 	dog = (byte *)copy_prot;
 
-	for (count = 0; count < sizeof(CopyProt); count++) {
+	for (count = 0; count < CopyProt::SIZE; count++) {
 		*dog ^= 0xff;
 		dog++;
 	}
@@ -81,12 +81,18 @@ static int copy_load(CopyProt *copy_prot) {
 	item = imath_random(1, num_items);
 
 	seek_dog = (item - 1) * CopyProt::SIZE;
-	if (seek_dog)
-		handle->seek(seek_dog);
+	handle->seek(seek_dog, SEEK_CUR);
 
-	copy_prot->load(handle);
+	// Read in the entry and de-mangle it
+	byte buffer[CopyProt::SIZE];
+	handle->read(buffer, CopyProt::SIZE);
+	copy_mangle(buffer);
 
-	copy_mangle(copy_prot);
+	// Load the buffer into the copy protection record
+	{
+		Common::MemoryReadStream src(buffer, CopyProt::SIZE);
+		copy_prot->load(&src);
+	}
 
 	error_flag = false;
 
@@ -106,7 +112,8 @@ static int copy_pop_and_ask() {
 	char entry_buf[80];
 	CopyProt copy_prot;
 
-	//popup_vomitation_flag = false; /* Allow keep of first letter */
+	// Allow keep of first letter
+	box_param.erase_on_first = false;
 
 	if (copy_load(&copy_prot)) goto finish;
 
@@ -115,7 +122,6 @@ static int copy_pop_and_ask() {
 	mads_itoa(copy_prot.word_number, word_buf, 10);
 
 	for (count = 0; (count < COPY_TRIES_ALLOWED); count++) {
-
 		if (popup_create(32, POPUP_CENTER, POPUP_CENTER))
 			goto finish;
 
@@ -175,7 +181,7 @@ static int copy_pop_and_ask() {
 		popup_write_string("\n");
 
 		entry_buf[0] = copy_prot.say[0];
-		entry_buf[1] = 0;
+		entry_buf[1] = '\0';
 
 		result = popup_ask_string(entry_buf, 12, true);
 		if (result < 0) goto finish;
diff --git a/engines/mads/madsv2/nebular/popup.cpp b/engines/mads/madsv2/nebular/popup.cpp
index 484cfff4769..b3c7768e309 100644
--- a/engines/mads/madsv2/nebular/popup.cpp
+++ b/engines/mads/madsv2/nebular/popup.cpp
@@ -36,7 +36,17 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-static constexpr int DIALOG_BLACK_COLOR = 0;
+enum {
+	DIALOG_BLACK_COLOR		= 0,
+	PALETTE_CYCLING_AREA	= 6,
+	DIALOG_CONTENT1_COLOR	= 248,
+	DIALOG_CONTENT2_COLOR	= 249,
+	DIALOG_EDGE_COLOR		= 250,
+	DIALOG_BACKGROUND_COLOR	= 251,
+	DIALOG_FC_COLOR			= 252,
+	DIALOG_FD_COLOR			= 253,
+	DIALOG_FE_COLOR			= 254
+};
 
 int dialog_content_seed;
 
@@ -141,6 +151,48 @@ void popup_draw() {
 	mouse_show();
 }
 
+void popup_setup_cycle() {
+	font_set_colors(-1, DIALOG_BLACK_COLOR, DIALOG_BLACK_COLOR, DIALOG_BLACK_COLOR);
+
+	memcpy(&cycling_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+		&master_palette[Graphics::PALETTE_COUNT - PALETTE_CYCLING_AREA].r,
+		PALETTE_CYCLING_AREA * 3);
+	pal_grey(master_palette, DIALOG_CONTENT1_COLOR, 2, 36, 32);
+	pal_grey(master_palette, DIALOG_EDGE_COLOR, 2, 39, 28);
+	pal_grey(master_palette, DIALOG_FC_COLOR, 2, 36, 32);
+	pal_grey(master_palette, DIALOG_FE_COLOR, 1, 55, 55);
+	mcga_setpal_range(&master_palette, DIALOG_CONTENT1_COLOR, 8);
+}
+
+void popup_update_ask(const char *string, int maxlen) {
+	int xs = box->text_xs;
+	int ys = box_param.font->max_y_size + 1;
+	int x1 = box->x + 5;
+	int y1 = ys * box->ask_y + box->y + 5;
+
+	dialog_content_seed = popup_draw_content(x1, y1, box->text_xs, 0, dialog_content_seed,
+		DIALOG_CONTENT2_COLOR, DIALOG_CONTENT1_COLOR, ys, scr_main);
+
+	font_set_colors(-1, DIALOG_BLACK_COLOR, DIALOG_BLACK_COLOR, DIALOG_BLACK_COLOR);
+	int x2 = font_write(box_param.font, &scr_main, box->text[box->ask_y], x1, y1, 1);
+
+	int xs2 = font_string_width(box_param.font, "W", 1) * maxlen + 4;
+	int xs3 = font_string_width(box_param.font, string, 1) + 2;
+	int x3 = x2 + 2;
+
+	buffer_rect_fill(scr_main, x2 - 1, y1 - 3, xs2, 1, 0);
+	buffer_rect_fill(scr_main, x2 - 1, y1 + ys, xs2, 1, 0);
+	buffer_rect_fill(scr_main, x2 - 1, y1 - 3, 1, ys + 4, 0);
+	buffer_rect_fill(scr_main, x2 + xs2 - 1, y1 - 3, 1, ys + 4, 0);
+
+	buffer_rect_fill_swap(scr_main, x3 - 1, y1 - 1, xs3, ys, DIALOG_CONTENT1_COLOR, DIALOG_FC_COLOR);
+	buffer_rect_fill_swap(scr_main, x3 - 1, y1 - 1, xs3, ys, DIALOG_CONTENT2_COLOR, DIALOG_FD_COLOR);
+
+	font_set_colors(-1, DIALOG_FE_COLOR, DIALOG_FE_COLOR, DIALOG_FE_COLOR);
+	font_write(box_param.font, &scr_main, string, x3, y1, 1);
+	video_update(&scr_main, x1, y1 - 3, x1, y1 - 3, xs, ys + 4);
+}
+
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/popup.h b/engines/mads/madsv2/nebular/popup.h
index 6e057fcf3de..d1e009a802a 100644
--- a/engines/mads/madsv2/nebular/popup.h
+++ b/engines/mads/madsv2/nebular/popup.h
@@ -29,12 +29,10 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-//extern bool popup_vomitation_flag;
-
 extern void popup_init();
-//extern int popup_create(FontPtr font, int horiz_pieces, int x, int y);
-//extern void popup_destroy();
 extern void popup_draw();
+extern void popup_setup_cycle();
+extern void popup_update_ask(const char *string, int maxlen);
 
 } // namespace RexNebular
 } // namespace MADSV2


Commit: 43f9c142e1dc4babb94baba9a5429bb50fbd9128
    https://github.com/scummvm/scummvm/commit/43f9c142e1dc4babb94baba9a5429bb50fbd9128
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:03+10:00

Commit Message:
MADS: NEBULAR: In progress main menu

Changed paths:
    engines/mads/madsv2/nebular/main.cpp


diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
index 40c17b3d19a..c6775b2b3f6 100644
--- a/engines/mads/madsv2/nebular/main.cpp
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -29,6 +29,8 @@
 #include "mads/madsv2/core/fileio.h"
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/himem.h"
+#include "mads/madsv2/core/imath.h"
+#include "mads/madsv2/core/keys.h"
 #include "mads/madsv2/core/kernel.h"
 #include "mads/madsv2/core/magic.h"
 #include "mads/madsv2/core/matte.h"
@@ -37,7 +39,11 @@
 #include "mads/madsv2/core/pal.h"
 #include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/core/screen.h"
+#include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/speech.h"
+#include "mads/madsv2/core/timer.h"
+#include "mads/madsv2/core/video.h"
 #include "mads/madsv2/nebular/main_menu.h"
 #include "mads/madsv2/nebular/menus.h"
 #include "mads/madsv2/engine.h"
@@ -50,73 +56,188 @@ constexpr bool SHOW_LINES = true;
 constexpr byte LINE_COLOR = 2;
 
 char *quotes;
+static int mainmenu_val1;
+static void *mainmenu_ptr1;
+static void *mainmenu_ptr2;
+static Palette black_palette;
 
-static void main_menu_main() {
+static void timer_function() {
 	// TODO
-	selected_item = 0;
-	return;
+}
 
+static void main_menu_main() {
 	auto &screen = *g_engine->getScreen();
 	Palette palette;
+	int screenId, soundId;
 
-	if (!kernel_game_startup(19, KERNEL_STARTUP_CURSOR | KERNEL_STARTUP_INTERRUPT | KERNEL_STARTUP_FONT,
-		nullptr, nullptr)) {
-		matte_init(0xFFFF);
-		bool valid = !kernel_room_startup(920, 0, nullptr, true, true);
+	mcga_compute_retrace_parameters();
+	memset(&black_palette, 0, sizeof(black_palette));
 
-		// Setup scr_work to use the full surface of scr_main (i.e. 320x200).
-		// Because of this, viewing_at_y is actually == 0
-		scr_work.y = picture_map.viewport_y;
-		viewing_at_y = (200 - scr_work.y) >> 1;
+	mainmenu_val1 = 0;
+	pal_init(8, 8);
+	pal_white(master_palette);
 
-		mouse_cursor_sprite(cursor, 7);
-		mouse_show();
-		mouse_force(280, 126);
-		mouse_hide();
+	buffer_init(&scr_work, 320, 156);
+	viewing_at_y = (200 - scr_work.y) >> 1;
+	if (!scr_work.data)
+		error("mainmenu -- didn't get work screen.");
 
-		mouse_cursor_sprite(cursor, 1);
-		kernel_seq_init();
-		kernel_message_init();
-		kernel_animation_init();
-		kernel_init_dynamic();
+	mainmenu_ptr1 = nullptr;
 
-		picture_view_x = 0;
-		picture_view_y = 0;
-		new_background = true;
+	buffer_init(&scr_orig, 320, 156);
+	if (!scr_orig.data)
+		error("mainmenu -- didn't get orig screen.");
 
-		if (valid) {
-			memset(&palette, 0, sizeof(palette));
-			mcga_setpal(&palette);
-			mouse_cursor_sprite(cursor, 1);
+	buffer_init(&scr_depth, 320, 156);
+	if (!scr_depth.data)
+		error("mainmenu -- didn't get orig screen.");
 
-			if (SHOW_LINES && viewing_at_y != 0) {
-				screen.hLine(0, viewing_at_y - 2, 319, LINE_COLOR);
-				screen.hLine(0, scr_work.y + viewing_at_y + 1, 319, LINE_COLOR);
-			}
+	buffer_fill(scr_work, 0);
+	buffer_fill(scr_orig, 0);
+	buffer_fill(scr_depth, 15);
+
+	// TODO: identify what disassembly calls "nullsub_1" corresponds to (called
+	// with the mode value right before video_init/mouse_init in this exact spot).
+	// screen_dominant_mode looked like the closest candidate (it's a no-op stub
+	// taking a single mode int, called immediately before video_init/mouse_init
+	// in the equivalent kernel_game_startup() sequence), so using that for now.
+	screen_dominant_mode(mcga_mode);
+	video_init(mcga_mode, -1);
+	mouse_init(-1, mcga_mode);
+
+	memset(&master_palette, 0, sizeof(master_palette));
+	mcga_setpal(&master_palette);
+
+	// TODO: sub_11E31(scr_work.data, scr_work.x) - unidentified call, please
+	// confirm the target function before this is implemented.
+
+	mouse_set_view_port_loc(0, viewing_at_y, scr_work.x, scr_work.y + viewing_at_y - 1);
+	mouse_set_view_port(0, 0);
+
+	timer_install();
+	keys_install();
+	matte_init(0xFFFF);
+	timer_activate_low_priority(timer_function);
 
-			kernel_load_sound_driver("*#SOUND.DR9", 'N', 544, 0, 49);
+	if (SHOW_LINES && viewing_at_y != 0) {
+		screen.hLine(0, viewing_at_y - 2, 319, LINE_COLOR);
+		screen.hLine(0, scr_work.y + viewing_at_y + 1, 319, LINE_COLOR);
+	}
+
+	menu_control();
+
+	if (selected_item >= 0) {
+		for (int i = 0; i < 3; i++) {
+			magic_color_values[i] = 0;
+			magic_color_flags[i] = 0;
+		}
+
+		mcga_getpal(&palette);
+		magic_fade_to_grey(palette, 0, 0x10, 1, 1, 0, 0, 0);
+	}
+
+	kernel_unload_sound_driver();
+
+	if (selected_item == 5) {
+		buffer_free(&scr_depth);
+		buffer_free(&scr_orig);
+		buffer_free(&scr_work);
 
-			menu_control();
+		srand(timer_read_dos());
+
+		char soundName[] = "#SOUND.007";
+		if (imath_random(1, 1000) > 500) {
+			screenId = 996;
+			soundId = 9;
+		} else {
+			screenId = 995;
+			soundName[strlen(soundName) - 1] = '4';
+			soundId = 12;
+		}
 
-			if (selected_item >= 0) {
-				// Zero out the first 3 entries of both magic color arrays
-				for (int i = 0; i < 3; i++) {
-					magic_color_values[i] = 0;
-					magic_color_flags[i] = 0;
+		pal_init(1, 8);
+
+		RoomPtr room = room_load(screenId, 0, nullptr, &scr_orig, &scr_depth, &scr_walk,
+			&scr_special, &picture_map, &depth_map, &picture_resource,
+			&depth_resource, -1, -1, 0);
+
+		if (room) {
+			mouse_hide();
+			video_update(&scr_orig, 0, 0, 0, 0, 320, 200);
+
+			// TODO: kernel_load_sound_driver(-1, -1) - only two int arguments are
+			// pushed in the disassembly, which doesn't match the current 5-param
+			// (name, sound_card, address, type, irq) signature. Please confirm how
+			// Rex Nebular's sound driver should be loaded here.
+
+			sound_queue(soundId);
+
+			magic_map_to_grey_ramp(&master_palette, 0x10, 1, 1, 0, (MagicGreyPtr)&palette);
+
+			mouse_init_cycle();
+			bool flag1 = true;
+			bool flag2 = false;
+			long time = timer_read();
+
+			while (flag1) {
+				mouse_begin_cycle(false);
+
+				if (keys_any()) {
+					keys_get();
+					flag1 = false;
+					flag2 = true;
 				}
 
-				mcga_getpal(&palette);
+				long elapsed = timer_read() - time;
+				if (elapsed > 900)
+					flag1 = false;
+
+				if (mouse_stop_stroke) {
+					flag1 = false;
+					flag2 = true;
+				}
 
-				magic_fade_to_grey(palette, 0, 0x10, 1, 1, 0, 0, 0);
+				mouse_end_cycle(false, true);
 			}
+
+			sound_queue(1);
+
+			if (flag2) {
+				memset(&master_palette, 0, sizeof(master_palette));
+				mcga_setpal(&master_palette);
+			} else {
+				magic_fade_to_grey(master_palette, 0, 0x10, 1, 1, 0, 0, 0);
+			}
+
+			kernel_unload_sound_driver();
+
+			keys_remove();
+			timer_remove();
+			mouse_hide();
+
+			mouse_init(0, 3);
+			video_init(3, -1);
+			mcga_reset();
 		}
+		// If room_load failed, the keys_remove/timer_remove/mouse_init/video_init/
+		// mcga_reset block above is intentionally skipped, matching the disassembly
+		// (which jumps straight past it to the final buffer_free/mem_free cleanup).
+	} else {
+		keys_remove();
+		timer_remove();
+		mouse_hide();
 
-		free(quotes);
-		kernel_unload_sound_driver();
-		kernel_game_shutdown();
+		mouse_init(0, 3);
+		video_init(3, -1);
+		mcga_reset();
 	}
 
-	mcga_reset();
+	buffer_free(&scr_depth);
+	buffer_free(&scr_orig);
+	buffer_free(&scr_work);
+
+	if (mainmenu_ptr2)
+		mem_free(mainmenu_ptr2);
 }
 
 static void main_cold_data_init() {


Commit: 03b277322966c811ab0a1b5dd36a162e95fd76b6
    https://github.com/scummvm/scummvm/commit/03b277322966c811ab0a1b5dd36a162e95fd76b6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:04+10:00

Commit Message:
MADS: NEBULAR: In progress main menu

Changed paths:
  A engines/mads/madsv2/nebular/mads/sounds.h
    engines/mads/madsv2/core/image.h
    engines/mads/madsv2/dragonsphere/main_menu.cpp
    engines/mads/madsv2/dragonsphere/main_menu.h
    engines/mads/madsv2/nebular/main.cpp
    engines/mads/madsv2/nebular/main_menu.cpp


diff --git a/engines/mads/madsv2/core/image.h b/engines/mads/madsv2/core/image.h
index 0aaa73a86c5..e86280679fe 100644
--- a/engines/mads/madsv2/core/image.h
+++ b/engines/mads/madsv2/core/image.h
@@ -42,6 +42,11 @@ struct Image {
 
 	static constexpr size_t SIZE = 2 + 1 + 1 + 2 + 2 + 2 + 1 + 1;
 	void load(Common::SeekableReadStream *src);
+
+	bool equals(const Image &rhs) const {
+		return series_id == rhs.series_id && sprite_id == rhs.sprite_id &&
+			x == rhs.x && y == rhs.y && depth == rhs.depth && scale == rhs.scale;
+	}
 };
 
 typedef Image *ImagePtr;
diff --git a/engines/mads/madsv2/dragonsphere/main_menu.cpp b/engines/mads/madsv2/dragonsphere/main_menu.cpp
index 32c93df6fc5..b94d2e31189 100644
--- a/engines/mads/madsv2/dragonsphere/main_menu.cpp
+++ b/engines/mads/madsv2/dragonsphere/main_menu.cpp
@@ -61,6 +61,20 @@ namespace Dragonsphere {
 
 #define CONFIG_FILE_NAME "CONFIG.PHA"
 
+#define COMMAND_LINE_MAX        10
+
+#define FRAME_RATE              1
+#define MENU_FRAME_RATE         3
+
+#define NUM_MENU_ITEMS          6
+
+#define MENU_APPEARING          0
+#define MENU_ACCEPTING_COMMANDS 1
+#define MENU_DISAPPEARING       2
+
+#define MENU_HIGH_SPRITE        15
+
+
 #define EYE_QUOTES      16
 #define EYE_HOTSPOT     32
 #define EYE_MESSAGES    2
@@ -271,8 +285,7 @@ static void process_sprites() {
 
 			for (look = 0; !match && (look < (int)image_marker); look++) {
 				if (image_list[look].segment_id == image.segment_id) {
-					if (memcmp(&image_list[look].series_id,
-						&image.series_id, 9) == 0) {
+					if (image_list[look].equals(image)) {
 						image_list[look].flags = IMAGE_STATIC;
 						match = true;
 					}
diff --git a/engines/mads/madsv2/dragonsphere/main_menu.h b/engines/mads/madsv2/dragonsphere/main_menu.h
index 5f75208484d..c69d7cb0d1e 100644
--- a/engines/mads/madsv2/dragonsphere/main_menu.h
+++ b/engines/mads/madsv2/dragonsphere/main_menu.h
@@ -28,19 +28,6 @@ namespace MADS {
 namespace MADSV2 {
 namespace Dragonsphere {
 
-#define COMMAND_LINE_MAX        10
-
-#define FRAME_RATE              1
-#define MENU_FRAME_RATE         3
-
-#define NUM_MENU_ITEMS          6
-
-#define MENU_APPEARING          0
-#define MENU_ACCEPTING_COMMANDS 1
-#define MENU_DISAPPEARING       2
-
-#define MENU_HIGH_SPRITE        15
-
 struct MenuItem {
 	int handle;           /* Sprite series handle */
 	int active;           /* Menu item is active  */
diff --git a/engines/mads/madsv2/nebular/mads/sounds.h b/engines/mads/madsv2/nebular/mads/sounds.h
new file mode 100644
index 00000000000..eac50d720f0
--- /dev/null
+++ b/engines/mads/madsv2/nebular/mads/sounds.h
@@ -0,0 +1,46 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADS_NEBULAR_MADS_SOUNDS_H
+#define MADS_NEBULAR_MADS_SOUNDS_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+enum {
+	/* Shared */
+	N_AllFade       =  1,
+	N_MusicOff      =  2,
+	N_MusicFade     =  3,
+	N_NoiseFade     =  5,
+	N_IsAnySoundOn  =  8,
+
+	N_TitleScreen   = 24
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
index c6775b2b3f6..3f088e6809b 100644
--- a/engines/mads/madsv2/nebular/main.cpp
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -56,51 +56,33 @@ constexpr bool SHOW_LINES = true;
 constexpr byte LINE_COLOR = 2;
 
 char *quotes;
-static int mainmenu_val1;
-static void *mainmenu_ptr1;
-static void *mainmenu_ptr2;
 static Palette black_palette;
 
-static void timer_function() {
-	// TODO
-}
-
 static void main_menu_main() {
-	auto &screen = *g_engine->getScreen();
+	auto &scr_screen = *g_engine->getScreen();
 	Palette palette;
 	int screenId, soundId;
 
 	mcga_compute_retrace_parameters();
 	memset(&black_palette, 0, sizeof(black_palette));
 
-	mainmenu_val1 = 0;
 	pal_init(8, 8);
 	pal_white(master_palette);
 
 	buffer_init(&scr_work, 320, 156);
 	viewing_at_y = (200 - scr_work.y) >> 1;
-	if (!scr_work.data)
-		error("mainmenu -- didn't get work screen.");
-
-	mainmenu_ptr1 = nullptr;
+	assert(scr_work.data);
 
 	buffer_init(&scr_orig, 320, 156);
-	if (!scr_orig.data)
-		error("mainmenu -- didn't get orig screen.");
+	assert(scr_orig.data);
 
 	buffer_init(&scr_depth, 320, 156);
-	if (!scr_depth.data)
-		error("mainmenu -- didn't get orig screen.");
+	assert(scr_depth.data);
 
 	buffer_fill(scr_work, 0);
 	buffer_fill(scr_orig, 0);
 	buffer_fill(scr_depth, 15);
 
-	// TODO: identify what disassembly calls "nullsub_1" corresponds to (called
-	// with the mode value right before video_init/mouse_init in this exact spot).
-	// screen_dominant_mode looked like the closest candidate (it's a no-op stub
-	// taking a single mode int, called immediately before video_init/mouse_init
-	// in the equivalent kernel_game_startup() sequence), so using that for now.
 	screen_dominant_mode(mcga_mode);
 	video_init(mcga_mode, -1);
 	mouse_init(-1, mcga_mode);
@@ -108,20 +90,17 @@ static void main_menu_main() {
 	memset(&master_palette, 0, sizeof(master_palette));
 	mcga_setpal(&master_palette);
 
-	// TODO: sub_11E31(scr_work.data, scr_work.x) - unidentified call, please
-	// confirm the target function before this is implemented.
-
+	mouse_set_work_buffer(scr_work.data, scr_work.x);
 	mouse_set_view_port_loc(0, viewing_at_y, scr_work.x, scr_work.y + viewing_at_y - 1);
 	mouse_set_view_port(0, 0);
 
 	timer_install();
 	keys_install();
 	matte_init(0xFFFF);
-	timer_activate_low_priority(timer_function);
 
-	if (SHOW_LINES && viewing_at_y != 0) {
-		screen.hLine(0, viewing_at_y - 2, 319, LINE_COLOR);
-		screen.hLine(0, scr_work.y + viewing_at_y + 1, 319, LINE_COLOR);
+	if (viewing_at_y != 0) {
+		scr_screen.hLine(0, viewing_at_y - 2, 319, LINE_COLOR);
+		scr_screen.hLine(0, scr_work.y + viewing_at_y + 1, 319, LINE_COLOR);
 	}
 
 	menu_control();
@@ -143,21 +122,19 @@ static void main_menu_main() {
 		buffer_free(&scr_orig);
 		buffer_free(&scr_work);
 
-		srand(timer_read_dos());
-
-		char soundName[] = "#SOUND.007";
+		int sectionNum = 7;
 		if (imath_random(1, 1000) > 500) {
 			screenId = 996;
 			soundId = 9;
 		} else {
 			screenId = 995;
-			soundName[strlen(soundName) - 1] = '4';
+			sectionNum = 4;
 			soundId = 12;
 		}
 
 		pal_init(1, 8);
 
-		RoomPtr room = room_load(screenId, 0, nullptr, &scr_orig, &scr_depth, &scr_walk,
+		room = room_load(screenId, 0, nullptr, &scr_orig, &scr_depth, &scr_walk,
 			&scr_special, &picture_map, &depth_map, &picture_resource,
 			&depth_resource, -1, -1, 0);
 
@@ -165,11 +142,7 @@ static void main_menu_main() {
 			mouse_hide();
 			video_update(&scr_orig, 0, 0, 0, 0, 320, 200);
 
-			// TODO: kernel_load_sound_driver(-1, -1) - only two int arguments are
-			// pushed in the disassembly, which doesn't match the current 5-param
-			// (name, sound_card, address, type, irq) signature. Please confirm how
-			// Rex Nebular's sound driver should be loaded here.
-
+			g_engine->_soundManager->init(sectionNum);
 			sound_queue(soundId);
 
 			magic_map_to_grey_ramp(&master_palette, 0x10, 1, 1, 0, (MagicGreyPtr)&palette);
@@ -179,7 +152,7 @@ static void main_menu_main() {
 			bool flag2 = false;
 			long time = timer_read();
 
-			while (flag1) {
+			while (!g_engine->shouldQuit() && flag1) {
 				mouse_begin_cycle(false);
 
 				if (keys_any()) {
@@ -219,9 +192,6 @@ static void main_menu_main() {
 			video_init(3, -1);
 			mcga_reset();
 		}
-		// If room_load failed, the keys_remove/timer_remove/mouse_init/video_init/
-		// mcga_reset block above is intentionally skipped, matching the disassembly
-		// (which jumps straight past it to the final buffer_free/mem_free cleanup).
 	} else {
 		keys_remove();
 		timer_remove();
@@ -235,9 +205,6 @@ static void main_menu_main() {
 	buffer_free(&scr_depth);
 	buffer_free(&scr_orig);
 	buffer_free(&scr_work);
-
-	if (mainmenu_ptr2)
-		mem_free(mainmenu_ptr2);
 }
 
 static void main_cold_data_init() {
@@ -339,6 +306,7 @@ done:
 
 void nebular_main() {
 	static const char *CMD_LINE[] = { nullptr, "-p" };
+	Palette palette;
 
 	pack_enable_pfab_explode();
 	if (!env_verify())
@@ -357,9 +325,17 @@ void nebular_main() {
 		switch (selected_item) {
 		case -1:
 			main_menu_main();
+
+			if (selected_item >= 0) {
+				Common::fill(magic_color_values, magic_color_values + 3, 0);
+				Common::fill(magic_color_flags, magic_color_flags + 3, 0);
+				mcga_getpal(&palette);
+				magic_fade_to_grey(palette, nullptr, 0, 256, 0, 1, 1, 16);
+			}
 			break;
 
 		case 0:
+			// Start Game
 			game_main(2, CMD_LINE);
 			return;
 
@@ -376,25 +352,43 @@ void nebular_main() {
 		}
 
 		case 2:
-			// Restore savegame
-			game_restore_flag = 2;
-			game_main(2, CMD_LINE);
-			return;
+			// Intro
+			AnimView::animview_main("@rexopen");
+			selected_item = -1;
+			break;
 
 		case 3:
-			AnimView::animview_main("@dragon");
+			// Credits
+			TextView::textview_main("credits");
 			selected_item = -1;
 			break;
 
 		case 4:
-			// Exit
-			return;
+			// Quotes
+			TextView::textview_main("quotes");
+			selected_item = -1;
+			break;
 
-		default:
-			// Credits
+		case 17:
+			// Endgame cutscene
+			AnimView::animview_main("@rexend1");
+			AnimView::animview_main("@rexend2");
+			AnimView::animview_main("@rexend3");
+			TextView::textview_main("ending4");
+			selected_item = -1;
+			break;
+
+		case 33:
+			TextView::textview_main("ending1");
+			TextView::textview_main("ending2");
 			TextView::textview_main("credits");
 			selected_item = -1;
 			break;
+
+		case 5:
+		default:
+			// Exit
+			return;
 		}
 	}
 }
diff --git a/engines/mads/madsv2/nebular/main_menu.cpp b/engines/mads/madsv2/nebular/main_menu.cpp
index e0d14a0074c..3a2d4d661fc 100644
--- a/engines/mads/madsv2/nebular/main_menu.cpp
+++ b/engines/mads/madsv2/nebular/main_menu.cpp
@@ -19,51 +19,403 @@
  *
  */
 
-#include "mads/madsv2/engine.h"
 #include "mads/madsv2/core/general.h"
 #include "mads/madsv2/core/config.h"
+#include "mads/madsv2/core/error.h"
 #include "mads/madsv2/core/font.h"
-#include "mads/madsv2/core/speech.h"
+#include "mads/madsv2/core/hspot.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/keys.h"
 #include "mads/madsv2/core/matte.h"
-#include "mads/madsv2/core/sprite.h"
-#include "mads/madsv2/core/error.h"
-#include "mads/madsv2/core/room.h"
-#include "mads/madsv2/core/fileio.h"
-#include "mads/madsv2/core/env.h"
-#include "mads/madsv2/core/buffer.h"
 #include "mads/madsv2/core/mem.h"
-#include "mads/madsv2/core/pal.h"
-#include "mads/madsv2/core/timer.h"
-#include "mads/madsv2/core/mcga.h"
-#include "mads/madsv2/core/cycle.h"
 #include "mads/madsv2/core/mouse.h"
-#include "mads/madsv2/core/screen.h"
-#include "mads/madsv2/core/video.h"
-#include "mads/madsv2/core/lib.h"
-#include "mads/madsv2/core/keys.h"
+#include "mads/madsv2/core/pal.h"
+#include "mads/madsv2/core/room.h"
 #include "mads/madsv2/core/sound.h"
-#include "mads/madsv2/core/btype.h"
-#include "mads/madsv2/core/hspot.h"
-#include "mads/madsv2/core/magic.h"
-#include "mads/madsv2/core/ems.h"
-#include "mads/madsv2/core/xms.h"
-#include "mads/madsv2/core/imath.h"
-#include "mads/madsv2/core/kernel.h"
-#include "mads/madsv2/core/game.h"
-#include "mads/madsv2/core/pack.h"
-#include "mads/madsv2/core/quote.h"
+#include "mads/madsv2/core/sprite.h"
+#include "mads/madsv2/core/timer.h"
 #include "mads/madsv2/nebular/main_menu.h"
+#include "mads/madsv2/nebular/extra.h"
+#include "mads/madsv2/nebular/mads/sounds.h"
+#include "mads/madsv2/engine.h"
 
 namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-bool new_background;
-int selected_item;
+#define CONFIG_FILE_NAME "CONFIG.REX"
+
+#define COMMAND_LINE_MAX        10
+
+#define FRAME_RATE              1
+#define MENU_FRAME_RATE         3
+
+#define NUM_MENU_ITEMS          6
+
+#define MENU_APPEARING          0
+#define MENU_ACCEPTING_COMMANDS 1
+#define MENU_DISAPPEARING       2
+
+#define MENU_HIGH_SPRITE        15
+
+
+ConfigFile config_file;
+
+int mads_mode = false;
+
+FontPtr font = NULL;
+int font_auto_spacing = -1;
+
+bool new_background = false;
+int room_number = 0;
+
+int win_status = 0;
+
+bool force_opening = false;
+bool dont_return = false;
+bool white_bars = true;
+byte white_border = 2;
+
+char command_line[COMMAND_LINE_MAX][80];
+char *command_list[COMMAND_LINE_MAX + 1];
+int  command_line_size = 0;
+
+int  use_mouse_cursor_fix = false;
+
+bool going;
+int  menu_mode;
+int  must_perform_matte;
+
+long frame_clock;
+long now_clock;
+long menu_clock;
+
+int menu_state;
+int menu_appear_state;
+
+int highest_y = -1;
+int next_x = -1;
+
+char sound_file[80] = "*#SOUND.PH9";
+char sound_letter = 'N';
+
+int  sound_board_address = 0x220;              /* Default sound board address */
+int  sound_board_type = sound_board_roland; /* Default sound board type    */
+
+int  swapping = false;                   /* Flag when swapping in new background */
+int  swap_line;                          /* Currently active swap line           */
+long swap_clock;                         /* Time for next swap */
+
+int  current_item;
+int  current_eye = false;
+int  eye_latch = false;
+int  selected_item = -1;
+int  animating_item = -1;
+
+#define LEFT_EYE   0
+#define RIGHT_EYE  1
+
+Palette special_pal;                     /* Palette for fadeout */
+
+
+MenuItem menu_item[NUM_MENU_ITEMS + 1];    /* Menu item array */
+
+
+static void load_title_screen() {
+	constexpr int ROOM_ID = 990;
+	new_background = true;
+	buffer_free(&scr_depth);
+	buffer_free(&scr_orig);
+
+	if (room)
+		mem_free(room);
+
+	pal_init(4, 8);
+	pal_white(master_palette);
+
+	room = RexNebular::room_load_rex(ROOM_ID, 0, nullptr, &scr_orig, &scr_depth, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, 0, 0, 0);
+	if (!room)
+		error("Could not load title screen room %d", ROOM_ID);
+
+	image_marker = 1;
+	image_list[0].flags = IMAGE_REFRESH;
+	image_list[0].segment_id = 0xff;
+}
+
+static void start_series() {
+	int error_flag = true;
+	char temp_buf[80];
+	SeriesPtr series;
+	int count;
+	int handle;
+
+	for (count = 0; count < NUM_MENU_ITEMS; count++) {
+		handle = -1;
+		Common::strcpy_s(temp_buf, "*RM990A0.SS");
+		temp_buf[7] = '1' + count;
+
+		series = sprite_series_load(temp_buf, 0);
+		if (!series) goto done;
+		handle = matte_allocate_series(series, 0);
+		if (handle < 0) goto done;
+
+		menu_item[count].handle = handle;
+		menu_item[count].active = true;
+		menu_item[count].status = 0;
+	}
+
+	menu_item[5].active = config_file.quotes_enabled;
+	error_flag = false;
+
+done:
+	if (error_flag) {
+		Common::strcpy_s(error_string, temp_buf);
+		error_report(ERROR_SERIES_LOAD_FAILED, WARNING, MODULE_UNKNOWN, count, handle);
+	}
+}
+
+static void stop_series() {
+	int count;
+
+	for (count = NUM_MENU_ITEMS - 1; count >= 0; count--) {
+		matte_deallocate_series(menu_item[count].handle, true);
+	}
+}
+
+static void start_hotspots() {
+	int count;
+	int x1, x2, y1, y2;
+	int xs, ys;
+	SeriesPtr series;
+
+	numspots = 0;
+
+	for (count = 0; count < NUM_MENU_ITEMS; count++) {
+		series = series_list[menu_item[count].handle];
+		xs = series->index[0].xs;
+		ys = series->index[0].ys;
+		x1 = series->index[0].x - (xs >> 1);
+		y1 = series->index[0].y - (ys - 1);
+
+		x2 = x1 + xs - 1;
+		y2 = y1 + ys - 1;
+		hspot_add(x1, y1, x2, y2, 1, count, mcga_mode);
+	}
+}
+
+static void process_menu() {
+	int myspot;
+
+	myspot = hspot_which(mouse_x, mouse_y - viewing_at_y, mcga_mode);
+
+	//current_eye = false;
+
+	if ((myspot > 0) && mouse_any_stroke && (menu_mode == MENU_ACCEPTING_COMMANDS)) {
+		current_item = spot[myspot].num;
+	} else {
+		current_item = -1;
+	}
+
+	if (mouse_stop_stroke && (current_item >= 0) && (menu_mode == MENU_ACCEPTING_COMMANDS)) {
+		selected_item = current_item;
+		menu_mode = MENU_DISAPPEARING;
+		menu_state = 1;
+		sound_queue(N_AllFade);
+	}
+}
+
+static void process_sprites() {
+	int count;
+	int sprite;
+	int series = 0;
+	int look, match;
+	Image image;
+
+	for (count = 0; count < (int)image_marker; count++) {
+		if (image_list[count].flags >= IMAGE_STATIC) {
+			image_list[count].flags = IMAGE_ERASE;
+		}
+	}
+
+	for (count = 0; count < NUM_MENU_ITEMS; count++) {
+		if (menu_item[count].active) {
+			image.flags = IMAGE_UPDATE;
+			image.segment_id = (byte)(count + 1);
+
+			switch (menu_mode) {
+			case MENU_APPEARING:
+				series = count;
+
+				if (series < animating_item) {
+					sprite = 1;
+				} else if (series == animating_item) {
+					sprite = menu_state;
+				} else {
+					sprite = MENU_HIGH_SPRITE + 1;
+				}
+				break;
+
+			case MENU_ACCEPTING_COMMANDS:
+				if (count != current_item) {
+					sprite = 1;
+					series = count;
+				} else {
+					sprite = count + 1;
+					series = 6;
+				}
+				break;
+
+			default:
+				if (count == selected_item)
+					sprite = 1;
+				else
+					sprite = menu_state;
+				series = count;
+				break;
+			}
+
+			image.series_id = (byte)menu_item[series].handle;
+			image.sprite_id = sprite;
+
+			image.x = series_list[series]->index[sprite - 1].x;
+			image.y = series_list[series]->index[sprite - 1].y;
+
+			image.depth = 0;
+			image.scale = 100;
+
+			match = !(sprite <= MENU_HIGH_SPRITE);
+
+			for (look = 0; !match && (look < (int)image_marker); look++) {
+				if (image_list[look].segment_id == image.segment_id) {
+					if (image_list[look].equals(image)) {
+						image_list[look].flags = IMAGE_STATIC;
+						match = true;
+					}
+				}
+			}
+
+			if (!match) {
+				image_list[image_marker] = image;
+				image_marker++;
+			}
+		}
+	}
+}
 
 void menu_control() {
-	// TODO
-	selected_item = 0;
+	int fx;
+	int mykey;
+
+	menu_mode = MENU_APPEARING;
+	animating_item = 0;
+	menu_state = MENU_HIGH_SPRITE;
+	menu_appear_state = 0;
+	menu_clock = 999999999;
+	frame_clock = 0;
+
+	going = true;
+	must_perform_matte = false;
+
+	frame_clock = 0;
+
+	g_engine->_soundManager->init(7);
+	sound_queue(N_TitleScreen);
+
+	load_title_screen();
+	start_series();
+	start_hotspots();
+
+	mouse_init_cycle();
+
+	while (going && !g_engine->shouldQuit()) {
+		if (keys_any()) {
+			mykey = keys_get();
+			switch (toupper(mykey)) {
+			case esc_key:
+				selected_item = 5;
+				going = false;
+				break;
+
+			case alt_x_key:
+			case alt_q_key:
+			case ctrl_x_key:
+			case ctrl_q_key:
+				going = false;
+				break;
+
+			case 'S':
+				menu_mode = MENU_APPEARING;
+				menu_state = MENU_HIGH_SPRITE;
+				animating_item = 0;
+				menu_appear_state = 0;
+				break;
+
+			default:
+				if (menu_mode == MENU_APPEARING)
+					menu_mode = MENU_ACCEPTING_COMMANDS;
+				break;
+			}
+		}
+
+		mouse_begin_cycle(false);
+
+		if (mouse_stroke_going) {
+			if (menu_mode == MENU_APPEARING)
+				menu_mode = MENU_ACCEPTING_COMMANDS;
+		}
+
+		now_clock = timer_read();
+		kernel.clock = now_clock;
+
+		if (now_clock >= menu_clock) {
+			switch (menu_mode) {
+			case MENU_APPEARING:
+				if (--menu_state <= 1) {
+					menu_state = MENU_HIGH_SPRITE;
+					while (++animating_item < NUM_MENU_ITEMS && !menu_item[animating_item].active) {
+					}
+
+					if (animating_item >= NUM_MENU_ITEMS)
+						menu_mode = MENU_ACCEPTING_COMMANDS;
+				}
+				break;
+
+			case MENU_DISAPPEARING:
+				if (++menu_state > (MENU_HIGH_SPRITE + 1))
+					going = false;
+				break;
+
+			default:
+				break;
+			}
+
+			menu_clock = now_clock + MENU_FRAME_RATE;
+		}
+
+		process_menu();
+
+		if (now_clock >= frame_clock) {
+			process_sprites();
+
+			fx = new_background ? 1 : 0;
+			matte_frame(fx, false);
+
+			if (fx) {
+				now_clock = timer_read();
+				menu_clock = now_clock + MENU_FRAME_RATE;
+			}
+
+			must_perform_matte = false;
+			new_background = false;
+
+			frame_clock = now_clock + FRAME_RATE;
+		}
+
+		mouse_end_cycle(false, going);
+	}
+
+	stop_series();
 }
 
 } // namespace RexNebular


Commit: 9770d5cef3618e41a912a8ca3ce55ff1d635c6ce
    https://github.com/scummvm/scummvm/commit/9770d5cef3618e41a912a8ca3ce55ff1d635c6ce
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:04+10:00

Commit Message:
MADS: NEBULAR: Add main menu arrow cursor

Changed paths:
    engines/mads/madsv2/core/mouse.cpp
    engines/mads/madsv2/core/mouse.h
    engines/mads/madsv2/dragonsphere/main_menu.cpp
    engines/mads/madsv2/nebular/main_menu.cpp


diff --git a/engines/mads/madsv2/core/mouse.cpp b/engines/mads/madsv2/core/mouse.cpp
index a4ec96ffe8d..0a14cda84a0 100644
--- a/engines/mads/madsv2/core/mouse.cpp
+++ b/engines/mads/madsv2/core/mouse.cpp
@@ -151,6 +151,12 @@ void mouse_cursor_sprite(SeriesPtr series, int id) {
 	CursorMan.disableCursorPalette(true);
 }
 
+void mouse_cursor_surface(const Graphics::Surface &surf, int hot_x, int hot_y) {
+	// Set the cursor
+	CursorMan.replaceCursor(surf, hot_x, hot_y, 0xff);
+	CursorMan.disableCursorPalette(true);
+}
+
 void mouse_video_init() {
 	mouse_set_work_buffer(scr_work.data, scr_work.x);
 	mouse_set_view_port_loc(0, 0, scr_work.x - 1, scr_work.y - 1);
diff --git a/engines/mads/madsv2/core/mouse.h b/engines/mads/madsv2/core/mouse.h
index 6661e7ca5bd..851d6ee82c6 100644
--- a/engines/mads/madsv2/core/mouse.h
+++ b/engines/mads/madsv2/core/mouse.h
@@ -22,6 +22,7 @@
 #ifndef MADS_CORE_MOUSE_H
 #define MADS_CORE_MOUSE_H
 
+#include "graphics/surface.h"
 #include "mads/madsv2/core/general.h"
 #include "mads/madsv2/core/sprite.h"
 
@@ -107,6 +108,7 @@ extern void mouse_begin_cycle(int double_flag);
 extern void mouse_end_cycle(int double_flag, int timing_flag);
 
 extern void mouse_cursor_sprite(SeriesPtr series, int id);
+extern void mouse_cursor_surface(const Graphics::Surface &surf, int hot_x, int hot_y);
 extern void mouse_video_init();
 extern void mouse_video_update(int from_x, int from_y,
 	int unto_x, int unto_y, int size_x, int size_y);
diff --git a/engines/mads/madsv2/dragonsphere/main_menu.cpp b/engines/mads/madsv2/dragonsphere/main_menu.cpp
index b94d2e31189..7bec7fb7ab8 100644
--- a/engines/mads/madsv2/dragonsphere/main_menu.cpp
+++ b/engines/mads/madsv2/dragonsphere/main_menu.cpp
@@ -83,8 +83,6 @@ namespace Dragonsphere {
 #define MESSAGE_COLOR   1284
 
 
-ConfigFile config_file;
-
 int mads_mode = false;
 
 FontPtr font = NULL;
diff --git a/engines/mads/madsv2/nebular/main_menu.cpp b/engines/mads/madsv2/nebular/main_menu.cpp
index 3a2d4d661fc..442a5564520 100644
--- a/engines/mads/madsv2/nebular/main_menu.cpp
+++ b/engines/mads/madsv2/nebular/main_menu.cpp
@@ -58,8 +58,24 @@ namespace RexNebular {
 
 #define MENU_HIGH_SPRITE        15
 
-
-ConfigFile config_file;
+static const byte ARROW_CURSOR[16][16] = {
+	{ 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x03, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x02, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
+};
 
 int mads_mode = false;
 
@@ -133,6 +149,15 @@ static void load_title_screen() {
 	pal_init(4, 8);
 	pal_white(master_palette);
 
+	// Set up mouse cursor
+	Graphics::Surface surf;
+	surf.format = Graphics::PixelFormat::createFormatCLUT8();
+	surf.w = surf.pitch = surf.h = 16;
+	surf.setPixels(const_cast<byte *>(&ARROW_CURSOR[0][0]));
+	mouse_cursor_surface(surf, 1, 1);
+	mouse_show();
+
+	// Load the title screen room
 	room = RexNebular::room_load_rex(ROOM_ID, 0, nullptr, &scr_orig, &scr_depth, nullptr, nullptr, nullptr,
 		nullptr, nullptr, nullptr, 0, 0, 0);
 	if (!room)


Commit: 9db95c9712d700f220107a24ce45f4ac3282fa29
    https://github.com/scummvm/scummvm/commit/9db95c9712d700f220107a24ce45f4ac3282fa29
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:05+10:00

Commit Message:
MADS: NEBULAR: Fix selecting Start Game option in main menu

Changed paths:
    engines/mads/madsv2/nebular/main_menu.cpp


diff --git a/engines/mads/madsv2/nebular/main_menu.cpp b/engines/mads/madsv2/nebular/main_menu.cpp
index 442a5564520..dda266e5160 100644
--- a/engines/mads/madsv2/nebular/main_menu.cpp
+++ b/engines/mads/madsv2/nebular/main_menu.cpp
@@ -175,7 +175,7 @@ static void start_series() {
 	int count;
 	int handle;
 
-	for (count = 0; count < NUM_MENU_ITEMS; count++) {
+	for (count = 0; count <= NUM_MENU_ITEMS; count++) {
 		handle = -1;
 		Common::strcpy_s(temp_buf, "*RM990A0.SS");
 		temp_buf[7] = '1' + count;
@@ -203,7 +203,7 @@ done:
 static void stop_series() {
 	int count;
 
-	for (count = NUM_MENU_ITEMS - 1; count >= 0; count--) {
+	for (count = NUM_MENU_ITEMS; count >= 0; count--) {
 		matte_deallocate_series(menu_item[count].handle, true);
 	}
 }


Commit: 432150b063bdfee6f5203dbf68b6cc8cfda766f6
    https://github.com/scummvm/scummvm/commit/432150b063bdfee6f5203dbf68b6cc8cfda766f6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:05+10:00

Commit Message:
MADS: NEBULAR: Exit on copy protection dialog failure

Changed paths:
    engines/mads/madsv2/core/game.cpp


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index 9035b6d1a08..3960de227d9 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1165,8 +1165,8 @@ void game_control() {
 			game.going = false;
 			force_chain = true;
 			game_restore_flag = false;
-
-			error_report(ERROR_COPY_PROTECTION, SEVERE, MODULE_LOCK, 0, 0);
+			return;
+			
 		} else if (result == COPY_ESCAPE) {
 			game.going = false;
 			force_chain = true;


Commit: 37dc2a251a422a2d1be1b086af3bae0c9f9e3447
    https://github.com/scummvm/scummvm/commit/37dc2a251a422a2d1be1b086af3bae0c9f9e3447
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:06+10:00

Commit Message:
MADS: NEBULAR: Properly pre-process walk/depth data

In Rex Nebular, the walk bits for each pixel are embedded along
with the depth information. To keep things simple, these changes
pre-process the data on load to split them up into the separate
depth and walk buffers used by all the other games.

Changed paths:
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/room.cpp
    engines/mads/madsv2/core/room.h
    engines/mads/madsv2/nebular/extra.cpp
    engines/mads/madsv2/nebular/extra.h


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 016d6d25bdc..9502759e5a3 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2554,7 +2554,7 @@ void kernel_load_variant(int variant) {
 	room_variant = variant;
 
 	if (g_engine->getGameID() == GType_RexNebular) {
-		RexNebular::room_load_depth(nullptr, &scr_depth, room, variant);
+		RexNebular::room_load_depth(nullptr, &scr_depth, &scr_walk, room, variant, room->format == 2);
 		matte_refresh_work();
 
 	} else {
diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index ab4876919b4..aeaadb177d7 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -209,6 +209,8 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 		goto done;
 	}
 
+	roomPtr->room_id = id;
+	roomPtr->format = 0;
 	Common::copy(roomfile.misc, roomfile.misc + 10, roomPtr->misc);
 	roomPtr->num_variants = roomfile.num_variants;
 	roomPtr->num_hotspots = roomfile.num_hotspots;
diff --git a/engines/mads/madsv2/core/room.h b/engines/mads/madsv2/core/room.h
index e2500fc3781..3a517e011cb 100644
--- a/engines/mads/madsv2/core/room.h
+++ b/engines/mads/madsv2/core/room.h
@@ -210,6 +210,7 @@ struct RoomFile {
 
 struct Room {
 	int16		room_id;				  /* Room id (only in Rex Nebular) */
+	byte        format;					  /* Room format (only in Rex Nebular) */
 	int16       xs, ys;                   /* X and Y size of room picture  */
 
 	uint16      misc[10];                /* Padding for future updates    */
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 29cd0cb232b..9facb5c5fc2 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mads/madsv2/engine.h"
+#include "mads/madsv2/core/attr.h"
 #include "mads/madsv2/core/buffer.h"
 #include "mads/madsv2/core/env.h"
 #include "mads/madsv2/core/error.h"
@@ -159,10 +160,38 @@ done:
 }
 
 
-int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int variant) {
+// Sets or clears the walk bit for pixel (x, y) in a bit-packed (8 pixels/byte, MSB first)
+// walk surface, matching the layout attr_walk() reads. No-op if walk is not being loaded.
+static void room_set_walk_bit(Buffer *walk, int x, int y, bool walkable) {
+	if (walk == nullptr || walk->data == nullptr)
+		return;
+
+	byte *scan = buffer_pointer(walk, x >> 3, y);
+	byte mask = (byte)(0x80 >> (x & 7));
+	if (walkable)
+		*scan |= mask;
+	else
+		*scan &= ~mask;
+}
+
+// Sets the depth nibble for pixel (x, y) in a nibble-packed (2 pixels/byte, even x in the
+// high nibble) depth surface, matching the layout attr_depth() reads. No-op if depth is not
+// being loaded.
+static void room_set_depth_nibble(Buffer *depth, int x, int y, byte depthVal) {
+	if (depth == nullptr || depth->data == nullptr)
+		return;
+
+	byte *scan = buffer_pointer(depth, x >> 1, y);
+	if (x & 1)
+		*scan = (byte)((*scan & 0xf0) | (depthVal & 0x0f));
+	else
+		*scan = (byte)((*scan & 0x0f) | ((depthVal & 0x0f) << 4));
+}
+
+int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_info,
+		int variant, bool packedFormat) {
 	char filename[80];
 	Load load;
-//	void *buffer = nullptr;
 
 	bool hasLoad = load_handle != nullptr;
 	if (!hasLoad) {
@@ -171,27 +200,47 @@ int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int varia
 		load_handle = &load;
 	}
 
-	byte *destP = buffer_pointer(depth, 0, 0);
-	byte *endP = destP + depth->x * depth->y;
+	int width = room_info->xs;
+	int totalPixels = width * room_info->ys;
+	int pixelIndex = 0;
 	int runLength, runValue;
 
-	// The data is encoded as a sequence of run lengths of given values, though they're nibble amounts,
-	// and the engine expects them to be saved in a two pixels per byte format
+	// The data is encoded as a sequence of run lengths of a given source byte value. For
+	// packed (format == 2) rooms, each source byte represents a run of *groups* of 4 pixels
+	// (2 bits each); for unpacked rooms, each source byte represents a run of single pixels.
+	// In both cases, the byte's high bit(s) flag whether the pixel is walkable, and the
+	// remaining bit(s) give its depth. The results are unpacked into the standard walk
+	// (1 bit/pixel) and depth (4 bits/pixel) surface formats used throughout the engine.
 	LoaderReadStream src(load_handle);
-	bool isLowNibble = true;
 
 	runLength = src.readByte();
-	while (destP < endP && runLength != 0) {
-		runValue = src.readByte() & 0xf;
-
-		// Write out the run length
-		for (; runLength > 0 && destP < endP; --runLength) {
-			if (isLowNibble) {
-				*destP = runValue;
-			} else {
-				*destP++ |= (runValue << 4);
+	while (pixelIndex < totalPixels && runLength != 0) {
+		runValue = src.readByte();
+
+		if (packedFormat) {
+			for (; runLength > 0 && pixelIndex < totalPixels; --runLength) {
+				for (int sub = 0; sub < 4 && pixelIndex < totalPixels; ++sub) {
+					int bits = (3 - sub) * 2;
+					int subVal = (runValue >> bits) & ATTR_PACKED_ATTR_MASK;
+					bool walkable = (subVal & ATTR_PACKED_WALK_MASK) != 0;
+					byte depthVal = (subVal & ATTR_PACKED_DEPTH_MASK) ? 0x0f : 0x00;
+
+					int x = pixelIndex % width, y = pixelIndex / width;
+					room_set_walk_bit(walk, x, y, walkable);
+					room_set_depth_nibble(depth, x, y, depthVal);
+					++pixelIndex;
+				}
+			}
+		} else {
+			bool walkable = (runValue & ATTR_WALK_MASK) != 0;
+			byte depthVal = runValue & ATTR_DEPTH_MASK;
+
+			for (; runLength > 0 && pixelIndex < totalPixels; --runLength) {
+				int x = pixelIndex % width, y = pixelIndex / width;
+				room_set_walk_bit(walk, x, y, walkable);
+				room_set_depth_nibble(depth, x, y, depthVal);
+				++pixelIndex;
 			}
-			isLowNibble = !isLowNibble;
 		}
 
 		runLength = src.readByte();
@@ -282,16 +331,19 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 		buffer_init(picture, width, height);
 	assert(picture->data);
 
-	// Original only used packed surface for a specific format, but subsequent games' codebase
-	// expects the depth surface to always be fixed
-	//if (roomfile.format == 2) width >>= 2;
-	width >>= 2;
-
+	// scr_depth (nibble-packed, 2 pixels/byte) and scr_walk (bit-packed, 8 pixels/byte) always
+	// use the same layout as every other game, regardless of the source room's packed format
 	if (!depth->data)
-		buffer_init(depth, width, height);
+		buffer_init(depth, ((width - 1) >> 1) + 1, height);
 	assert(depth->data);
 
-	if (room_load_depth(&load_handle, depth, roomPtr, variant))
+	if (walk != nullptr) {
+		if (!walk->data)
+			buffer_init(walk, ((width - 1) >> 3) + 1, height);
+		assert(walk->data);
+	}
+
+	if (room_load_depth(&load_handle, depth, walk, roomPtr, variant, roomfile.format == 2))
 		goto error;
 
 	loader_close(&load_handle);
diff --git a/engines/mads/madsv2/nebular/extra.h b/engines/mads/madsv2/nebular/extra.h
index f62987015c0..efe054f3113 100644
--- a/engines/mads/madsv2/nebular/extra.h
+++ b/engines/mads/madsv2/nebular/extra.h
@@ -32,7 +32,8 @@ extern RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer
 	Buffer *depth, Buffer *walk, Buffer *special, TileMapHeader *picMap,
 	TileMapHeader *depthMap, TileResource *picResource, TileResource *depthResource,
 	int picture_ems_handle, int depth_ems_handle, int load_flags);
-extern int room_load_depth(Load *load_handle, Buffer *depth, Room *room_info, int variant);
+extern int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_info,
+	int variant, bool packedFormat);
 
 } // namespace RexNebular
 } // namespace MADSV2


Commit: 0b90a4367e3740ff1429e5210dede8bcad9748a4
    https://github.com/scummvm/scummvm/commit/0b90a4367e3740ff1429e5210dede8bcad9748a4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:06+10:00

Commit Message:
MADS: NEBULAR: Added walkable console command

Changed paths:
    engines/mads/madsv2/console.cpp
    engines/mads/madsv2/console.h


diff --git a/engines/mads/madsv2/console.cpp b/engines/mads/madsv2/console.cpp
index 7c2fb30dc39..63d8073c0e1 100644
--- a/engines/mads/madsv2/console.cpp
+++ b/engines/mads/madsv2/console.cpp
@@ -20,13 +20,16 @@
  */
 
 #include "mads/madsv2/console.h"
+#include "mads/madsv2/core/imath.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/matte.h"
 
 namespace MADS {
 namespace MADSV2 {
 
 Console::Console() : GUI::Debugger() {
 	registerCmd("teleport", WRAP_METHOD(Console, cmdTeleport));
+	registerCmd("walkable", WRAP_METHOD(Console, cmdWalkable));
 }
 
 static int strToInt(const char *s) {
@@ -59,5 +62,30 @@ bool Console::cmdTeleport(int argc, const char **argv) {
 	}
 }
 
+bool Console::cmdWalkable(int argc, const char **argv) {
+	const byte *srcP = scr_walk.data - 1;
+	byte *destP = scr_orig.data;
+	assert((scr_walk.x * 8) == scr_orig.x);
+
+	// Draw the walkable areas
+	for (int i = 0; i < scr_orig.x * scr_orig.y; ++i, ++destP) {
+		if ((i % 8) == 0)
+			++srcP;
+		if (!(*srcP & (1 << (7 - (i % 8)))))
+			*destP = 10;
+	}
+
+	// Draw cross-hairs at the locations of the rails within the room
+	for (int i = 0; i < room->num_rails; ++i) {
+		const Rail &r = room->rail[i];
+
+		buffer_hline(scr_orig, r.x - 2, r.x + 2, r.y, 0);
+		buffer_vline(scr_orig, r.x, r.y - 2, r.y + 2, 0);
+	}
+
+	matte_refresh_work();
+	return false;
+}
+
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/console.h b/engines/mads/madsv2/console.h
index 95e09a1a4aa..2202411f3b6 100644
--- a/engines/mads/madsv2/console.h
+++ b/engines/mads/madsv2/console.h
@@ -30,6 +30,7 @@ namespace MADSV2 {
 class Console : public GUI::Debugger {
 private:
 	bool cmdTeleport(int argc, const char **argv);
+	bool cmdWalkable(int argc, const char **argv);
 
 public:
 	Console();


Commit: 70b5287bc131092c8fa0b607db3fba0e16534b66
    https://github.com/scummvm/scummvm/commit/70b5287bc131092c8fa0b607db3fba0e16534b66
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:07+10:00

Commit Message:
MADS: NEBULAR: Added depth console command

Changed paths:
    engines/mads/madsv2/console.cpp
    engines/mads/madsv2/console.h


diff --git a/engines/mads/madsv2/console.cpp b/engines/mads/madsv2/console.cpp
index 63d8073c0e1..d8017ebd2db 100644
--- a/engines/mads/madsv2/console.cpp
+++ b/engines/mads/madsv2/console.cpp
@@ -28,6 +28,7 @@ namespace MADS {
 namespace MADSV2 {
 
 Console::Console() : GUI::Debugger() {
+	registerCmd("depth", WRAP_METHOD(Console, cmdDepth));
 	registerCmd("teleport", WRAP_METHOD(Console, cmdTeleport));
 	registerCmd("walkable", WRAP_METHOD(Console, cmdWalkable));
 }
@@ -48,6 +49,19 @@ static int strToInt(const char *s) {
 	return (int)tmp;
 }
 
+bool Console::cmdDepth(int argc, const char **argv) {
+	const byte *srcP = scr_depth.data;
+	byte *destP = scr_orig.data;
+
+	for (int i = 0; i < scr_orig.x * scr_orig.y; i += 2, ++srcP) {
+		*destP++ = *srcP >> 4;
+		*destP++ = *srcP & 0xf;
+	}
+
+	matte_refresh_work();
+	return false;
+}
+
 bool Console::cmdTeleport(int argc, const char **argv) {
 	if (argc < 2) {
 		debugPrintf("Current room is: %d\n", new_room);
diff --git a/engines/mads/madsv2/console.h b/engines/mads/madsv2/console.h
index 2202411f3b6..a9a2b3dcc23 100644
--- a/engines/mads/madsv2/console.h
+++ b/engines/mads/madsv2/console.h
@@ -31,6 +31,7 @@ class Console : public GUI::Debugger {
 private:
 	bool cmdTeleport(int argc, const char **argv);
 	bool cmdWalkable(int argc, const char **argv);
+	bool cmdDepth(int argc, const char **argv);
 
 public:
 	Console();


Commit: 9a5292dce0feb891e9627b7cab0584c17405737a
    https://github.com/scummvm/scummvm/commit/9a5292dce0feb891e9627b7cab0584c17405737a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:07+10:00

Commit Message:
MADS: NEBULAR: Properly clear command_ready in global_parser_code

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index abde830edf5..4341c21d055 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -502,7 +502,14 @@ void RexNebularEngine::global_parser_code() {
 			global[kPenlightCellStatus] = game.difficulty != DIFFICULTY_HARD || global[kDurafailRecharged] ? 1 : 2;
 			text_show(423);
 		}
+	} else {
+		goto done;
 	}
+
+	player.command_ready = false;
+
+done:
+	;
 }
 
 void RexNebularEngine::global_error_code() {


Commit: 37a2d2d29733a0f1a619920df3868c0d10743a25
    https://github.com/scummvm/scummvm/commit/37a2d2d29733a0f1a619920df3868c0d10743a25
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:07+10:00

Commit Message:
MADS: NEBULAR: Fix resetting master_shadow pointer

Changed paths:
    engines/mads/madsv2/core/kernel.cpp


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 9502759e5a3..01e3d05f57e 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -664,6 +664,8 @@ int kernel_room_startup(int newRoom, int initial_variant, const char *interface,
 			nullptr, nullptr, nullptr, nullptr, nullptr, load_flags);
 		if (!inter_anim) goto done;
 
+		pal_activate_shadow(&kernel_shadow_main);
+
 		if (!inter_anim->font) {
 			mem_free(inter_anim);
 			inter_anim = nullptr;


Commit: 373b16dc4ae298732e1136530adb3a35b4087436
    https://github.com/scummvm/scummvm/commit/373b16dc4ae298732e1136530adb3a35b4087436
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:08+10:00

Commit Message:
MADS: NEBULAR: Fix Rex version of room_picture_load

Changed paths:
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 9facb5c5fc2..56eb1d54915 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -72,7 +72,6 @@ struct RoomFileRex {
 static int room_picture_load(Room *room, int room_id, Buffer *picture, int load_flags) {
 	int error_flag = true;
 	int xs, ys;
-//	int color_handle;
 	long picture_size;
 	char temp_buf[80];
 	RoomArt art;
@@ -91,7 +90,7 @@ static int room_picture_load(Room *room, int room_id, Buffer *picture, int load_
 	// Read the room art header
 	{
 		byte buffer[RoomArt::SIZE];
-		if (!loader_read(&art, RoomArt::SIZE, 1, &load_handle)) {
+		if (!loader_read(buffer, RoomArt::SIZE, 1, &load_handle)) {
 			room_load_error = 2;
 			goto done;
 		}
@@ -113,7 +112,7 @@ static int room_picture_load(Room *room, int room_id, Buffer *picture, int load_
 			pal_shadow_sort(master_shadow, &art.color_list);
 		}
 
-		room->color_handle = pal_allocate(&art.color_list, NULL, (load_flags & PAL_MAP_MASK));
+		room->color_handle = pal_allocate(&art.color_list, master_shadow, (load_flags & PAL_MAP_MASK));
 		if (room->color_handle < 0) {
 			room_load_error = 4;
 			goto done;
@@ -256,7 +255,6 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 	Buffer *depth, Buffer *walk, Buffer *special, TileMapHeader *picMap,
 	TileMapHeader *depthMap, TileResource *picResource, TileResource *depthResource,
 	int picture_ems_handle, int depth_ems_handle, int load_flags) {
-//	int error_flag = true;
 	int count;
 	long mem_needed;
 	Load load_handle;
@@ -349,7 +347,7 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 	loader_close(&load_handle);
 
 	// Load in the foreground picture
-	room_picture_load(id, picture, load_flags);
+	room_picture_load(roomPtr, id, picture, load_flags);
 
 	// Handle room sprites
 


Commit: ca2c4eba65a527d526633417639f812989eb5b59
    https://github.com/scummvm/scummvm/commit/ca2c4eba65a527d526633417639f812989eb5b59
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:08+10:00

Commit Message:
MADS: NEBULAR: Fix character shadow palette

Changed paths:
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index 3960de227d9..e0f352057e3 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1336,18 +1336,11 @@ void game_control() {
 
 			if (!player.walker_is_loaded) {
 				if (player.walker_loads_first) {
-
 					game.going |= !player_load_series(NULL);
-
 					player.walker_loaded_first = true;
 				}
 			}
 
-			for (count = 0; count < master_shadow->num_shadow_colors; count++) {
-				color = PAL_FORCE_SHADOW + count;
-				color_status[color] = 0;
-			}
-
 			game.going = (byte)!kernel_room_startup(new_room, kernel_initial_variant, kernel.interface, false);
 
 			camera_init_default();
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 56eb1d54915..1cbe91f2599 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -112,7 +112,7 @@ static int room_picture_load(Room *room, int room_id, Buffer *picture, int load_
 			pal_shadow_sort(master_shadow, &art.color_list);
 		}
 
-		room->color_handle = pal_allocate(&art.color_list, master_shadow, (load_flags & PAL_MAP_MASK));
+		room->color_handle = pal_allocate(&art.color_list, master_shadow, (load_flags & PAL_MAP_MASK) | PAL_MAP_BACKGROUND);
 		if (room->color_handle < 0) {
 			room_load_error = 4;
 			goto done;


Commit: d3397d85dbc5aa69c581907d3ffa42c775036938
    https://github.com/scummvm/scummvm/commit/d3397d85dbc5aa69c581907d3ffa42c775036938
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:09+10:00

Commit Message:
MADS: NEBULAR: In progress adding console load command

This is an in progress attempt to add support for loading
the original format of Rex Nebular savegames. These savegames
have a lot of fields jumbled up, and it's hard to properly
map all of them to equivalent fields in MADSV2. As such, I'm
not comfortable with normal users being able to load them
directly from the GUI. Hence why it's going to be relegated
to an internal console command.

Changed paths:
  A engines/mads/madsv2/nebular/console.cpp
  A engines/mads/madsv2/nebular/console.h
    engines/mads/madsv2/console.cpp
    engines/mads/madsv2/console.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/metaengine.cpp
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/console.cpp b/engines/mads/madsv2/console.cpp
index d8017ebd2db..c501fccf06c 100644
--- a/engines/mads/madsv2/console.cpp
+++ b/engines/mads/madsv2/console.cpp
@@ -33,7 +33,7 @@ Console::Console() : GUI::Debugger() {
 	registerCmd("walkable", WRAP_METHOD(Console, cmdWalkable));
 }
 
-static int strToInt(const char *s) {
+int strToInt(const char *s) {
 	if (!*s)
 		// No string at all
 		return 0;
diff --git a/engines/mads/madsv2/console.h b/engines/mads/madsv2/console.h
index a9a2b3dcc23..ea01c480c9d 100644
--- a/engines/mads/madsv2/console.h
+++ b/engines/mads/madsv2/console.h
@@ -27,6 +27,8 @@
 namespace MADS {
 namespace MADSV2 {
 
+extern int strToInt(const char *s);
+
 class Console : public GUI::Debugger {
 private:
 	bool cmdTeleport(int argc, const char **argv);
diff --git a/engines/mads/madsv2/nebular/console.cpp b/engines/mads/madsv2/nebular/console.cpp
new file mode 100644
index 00000000000..46daca1a44d
--- /dev/null
+++ b/engines/mads/madsv2/nebular/console.cpp
@@ -0,0 +1,190 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+#include "common/savefile.h"
+#include "graphics/surface.h"
+#include "graphics/thumbnail.h"
+#include "mads/madsv2/nebular/console.h"
+#include "mads/madsv2/core/inter.h"
+#include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/object.h"
+#include "mads/madsv2/core/player.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+Console::Console() : MADS::MADSV2::Console() {
+	registerCmd("load", WRAP_METHOD(Console, cmdLoad));
+}
+
+bool Console::cmdLoad(int argc, const char **argv) {
+	// Check a slot number is provided
+	if (argc < 2) {
+		debugPrintf("Usage: load <slot> - Load old Rex Nebular savegame\n");
+		return true;
+	}
+
+	// Open the save file for reading
+	Common::String filename = g_engine->getSaveStateName(strToInt(argv[1]));
+	Common::InSaveFile *sf = g_system->getSavefileManager()->openForLoading(filename);
+	if (!sf) {
+		debugPrintf("Could not open %s\n", filename.c_str());
+		return true;
+	}
+
+	// Validate it has a correct header
+	char ident[5];
+	sf->read(ident, 5);
+	if (strncmp(ident, "MADS", 4) || sf->readByte() != 1) {
+		debugPrintf("Specified file is not an old style Rex savegame.\n");
+		return true;
+	}
+
+	// Skip the remainder of the header
+	(void)sf->readString();
+	Graphics::Surface *dummy;
+	Graphics::loadThumbnail(*sf, dummy, true);
+	sf->skip(14);
+
+	// Read the actual savegame content
+	// Kernel info
+	kernel.fx = sf->readSint16LE();
+	kernel.trigger = sf->readSint16LE();
+	kernel.trigger_setup_mode = sf->readSint16LE();
+	kernel.trigger_mode = sf->readSint16LE();
+
+	Common::String name = Common::Path(sf->readString(), '/').toString();
+	Common::strcpy_s(kernel.interface, name.c_str());
+	sf->skip(2);
+
+	// Scene info
+	// Action
+	player2.words[0] = sf->readSint16LE();
+	player2.words[1] = sf->readSint16LE();
+	player2.words[2] = sf->readSint16LE();
+	// Active action
+	sf->skip(6);
+	// Misc fields
+	sf->skip(12);
+	// Saved fields
+	sf->skip(17);
+	(void)sf->readString();
+	sf->skip(22);
+	// Rails
+	sf->skip(4);
+	// User Interface
+	active_inven = -1;
+	sf->skip(8 * 2);	// category indexes
+	// Misc
+	kernel.force_restart = sf->readByte();
+	kernel.teleported_in = sf->readByte();
+	new_room = sf->readSint16LE();
+	previous_room = sf->readSint16LE();
+	room_variant = sf->readSint16LE();
+
+	// Inventory
+	inven_num_objects = sf->readSint16LE();
+	for (int i = 0; i < inven_num_objects; ++i)
+		inven[i] = sf->readSint32LE();
+
+	// Objects
+	num_objects = sf->readUint16LE();
+	for (int i = 0; i < num_objects; ++i) {
+		Object &obj = object[i];
+		obj.vocab_id = sf->readSint16LE();
+		obj.location = sf->readSint16LE();
+		obj.prep = sf->readByte();
+		obj.num_verbs = sf->readByte();
+		obj.num_qualities = sf->readByte();
+		sf->skip(1);
+
+		for (auto &v : obj.verb) {
+			v.id = sf->readSint16LE();
+			v.verb_type = sf->readByte();
+			v.prep_type = sf->readByte();
+		}
+
+		for (auto &q : obj.quality_id)
+			q = sf->readByte();
+		for (auto &q : obj.quality_value)
+			q = sf->readByte();
+	}
+
+	// Visited scenes
+	player.num_rooms_been_in = sf->readUint16LE();
+	for (int i = 0; i < player.num_rooms_been_in; ++i)
+		player.rooms_been_in[i] = sf->readSint32LE();
+
+	// Player fields
+	player.walking = sf->readByte();
+	player.x = sf->readSint16LE();
+	player.y = sf->readSint16LE();
+	player.target_x = sf->readSint16LE();
+	player.target_y = sf->readSint16LE();
+	player.sign_x = sf->readSint16LE();
+	player.sign_y = sf->readSint16LE();
+	player.x_count = sf->readSint16LE();
+	player.y_count = sf->readSint16LE();
+	player.x_counter = sf->readSint16LE();
+	player.y_counter = sf->readSint16LE();
+	player.target_facing = sf->readSint16LE();
+	player.special_code = sf->readSint16LE();
+	sf->skip(3);
+	player.walk_anywhere = sf->readByte();
+	player.walk_off_edge_to_room = sf->readSint16LE();
+	player.walk_off_edge = sf->readByte();
+	player.need_to_walk = sf->readByte();
+	player.ready_to_walk = sf->readByte();
+	player.prepare_walk_facing = sf->readSint16LE();
+	player.prepare_walk_x = sf->readSint16LE();
+	player.prepare_walk_y = sf->readSint16LE();
+	player.commands_allowed = sf->readByte();
+	player.walker_visible = sf->readByte();
+	player.walker_previously_visible = sf->readByte();
+	sf->skip(8);
+	player.facing = sf->readByte();
+	player.turn_to_facing = sf->readByte();
+	sf->skip(10);
+	// Stop walkers
+	player.stop_walker_pointer = sf->readUint16LE();
+	for (int i = 0; i < player.stop_walker_pointer; ++i) {
+		player.stop_walker_stack[i] = sf->readSint16LE();
+		player.stop_walker_trigger[i] = sf->readSint16LE();
+	}
+	// Walk Trigger Action
+	sf->skip(6);
+	player.walk_trigger_dest = sf->readSint16LE();
+	// Misc
+	sf->skip(18);
+	(void)sf->readString();
+	sf->skip(12);
+
+	// Screen objects
+	sf->skip(4);
+
+	return false;
+}
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
diff --git a/engines/mads/madsv2/nebular/console.h b/engines/mads/madsv2/nebular/console.h
new file mode 100644
index 00000000000..257fd71506d
--- /dev/null
+++ b/engines/mads/madsv2/nebular/console.h
@@ -0,0 +1,45 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MADSV2_NEBULAR_CONSOLE_H
+#define MADSV2_NEBULAR_CONSOLE_H
+
+#include "mads/madsv2/console.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace RexNebular {
+
+class Console : public MADS::MADSV2::Console {
+private:
+	bool cmdLoad(int argc, const char **argv);
+
+public:
+	Console();
+	~Console() override {
+	}
+};
+
+} // namespace RexNebular
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 4341c21d055..a1512481c57 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -21,7 +21,6 @@
 
 #include "engines/util.h"
 #include "mads/core/mps_installer.h"
-#include "mads/madsv2/console.h"
 #include "mads/madsv2/core/attr.h"
 #include "mads/madsv2/core/conv.h"
 #include "mads/madsv2/core/env.h"
@@ -37,6 +36,7 @@
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/nebular/nebular.h"
+#include "mads/madsv2/nebular/console.h"
 #include "mads/madsv2/nebular/copy.h"
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/main.h"
diff --git a/engines/mads/metaengine.cpp b/engines/mads/metaengine.cpp
index f605f05bc40..728e9630824 100644
--- a/engines/mads/metaengine.cpp
+++ b/engines/mads/metaengine.cpp
@@ -192,12 +192,7 @@ public:
 
 	bool hasFeature(MetaEngineFeature f) const override;
 	Common::Error createInstance(OSystem *syst, Engine **engine, const MADS::MADSGameDescription *desc) const override;
-
-	SaveStateList listSaves(const char *target) const override;
 	int getMaximumSaveSlot() const override;
-	bool removeSaveState(const char *target, int slot) const override;
-	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
-
 	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
@@ -236,85 +231,10 @@ Common::Error MADSMetaEngine::createInstance(OSystem *syst, Engine **engine, con
 	return Common::kNoError;
 }
 
-SaveStateList MADSMetaEngine::listSaves(const char *target) const {
-//	if (getGameId(target) != "nebular")
-		return AdvancedMetaEngine<MADS::MADSGameDescription>::listSaves(target);
-#if 0
-	SaveStateList saveList;
-
-	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
-	Common::StringArray filenames;
-	Common::String saveDesc;
-	Common::String pattern = Common::String::format("%s.0##", target);
-	MADS::MADSV2::RexNebular::MADSSavegameHeader header;
-
-	filenames = saveFileMan->listSavefiles(pattern);
-
-	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
-		const char *ext = strrchr(file->c_str(), '.');
-		int slot = ext ? atoi(ext + 1) : -1;
-
-		if (slot >= 0 && slot < MAX_SAVES) {
-			Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
-
-			if (in) {
-				if (MADS::Nebular::Game::readSavegameHeader(in, header))
-					saveList.push_back(SaveStateDescriptor(this, slot, header._saveName));
-				delete in;
-			}
-		}
-	}
-
-	// Sort saves based on slot number.
-	Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
-	return saveList;
-#endif
-}
-
 int MADSMetaEngine::getMaximumSaveSlot() const {
 	return MAX_SAVES;
 }
 
-bool MADSMetaEngine::removeSaveState(const char *target, int slot) const {
-#if 0
-	if (getGameId(target) == "nebular") {
-		Common::String filename = Common::String::format("%s.%03d", target, slot);
-		return g_system->getSavefileManager()->removeSavefile(filename);
-	} else {
-#endif
-		return AdvancedMetaEngine<MADS::MADSGameDescription>::removeSaveState(target, slot);
-//	}
-}
-
-SaveStateDescriptor MADSMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
-//	if (getGameId(target) != "nebular")
-		return AdvancedMetaEngine<MADS::MADSGameDescription>::querySaveMetaInfos(target, slot);
-#if 0
-	Common::String filename = Common::String::format("%s.%03d", target, slot);
-	Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(filename);
-
-	if (f) {
-		MADS::Nebular::MADSSavegameHeader header;
-		if (!MADS::Nebular::Game::readSavegameHeader(f, header, false)) {
-			delete f;
-			return SaveStateDescriptor();
-		}
-		delete f;
-
-		// Create the return descriptor
-		SaveStateDescriptor desc(this, slot, header._saveName);
-		desc.setThumbnail(header._thumbnail);
-		desc.setSaveDate(header._year, header._month, header._day);
-		desc.setSaveTime(header._hour, header._minute);
-		desc.setPlayTime(header._totalFrames * GAME_FRAME_TIME);
-
-		return desc;
-	}
-
-	return SaveStateDescriptor();
-#endif
-}
-
 Common::KeymapArray MADSMetaEngine::initKeymaps(const char *target) const {
 	using namespace Common;
 	using namespace MADS;
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 7a71b4e5523..0f9842dc5d4 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -71,6 +71,7 @@ MODULE_OBJS += \
 	madsv2/core/xms.o \
 	madsv2/nebular/nebular.o \
 	madsv2/nebular/asound.o \
+	madsv2/nebular/console.o \
 	madsv2/nebular/copy.o \
 	madsv2/nebular/extra.o \
 	madsv2/nebular/global.o \


Commit: c37757c607aa579bafd558a424b2963b2f2a8ddf
    https://github.com/scummvm/scummvm/commit/c37757c607aa579bafd558a424b2963b2f2a8ddf
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:09+10:00

Commit Message:
MADS: NEBULAR: Fix depth calculation for sequences

This also includes rex_room_depth functions to get a depth
value from scr_depth.

Changed paths:
    engines/mads/madsv2/core/attr.cpp
    engines/mads/madsv2/core/attr.h
    engines/mads/madsv2/core/kernel.cpp


diff --git a/engines/mads/madsv2/core/attr.cpp b/engines/mads/madsv2/core/attr.cpp
index 44117f270e7..1c0654ec439 100644
--- a/engines/mads/madsv2/core/attr.cpp
+++ b/engines/mads/madsv2/core/attr.cpp
@@ -50,6 +50,18 @@ done:
 	return (int)walk_code;
 }
 
+int rex_attr_depth(Buffer *depth, int x, int y) {
+	assert(depth);
+	if (x < 0 || y < 0 || (x / 2) >= depth->x || y >= depth->y)
+		return 0;
+
+	byte *scan = buffer_pointer(depth, (x >> 1), y);
+	int shift_count = (byte)((x & 1) ? 0 : 4);
+	int depth_code = (byte)((*scan >> shift_count) & 0x0f);
+
+	return depth_code;
+}
+
 int attr_depth(TileMapHeader *depth_map, int x, int y) {
 	byte depth_code = 0x0f;
 	byte *scan;
diff --git a/engines/mads/madsv2/core/attr.h b/engines/mads/madsv2/core/attr.h
index b59dc0ce233..ccc7a57c544 100644
--- a/engines/mads/madsv2/core/attr.h
+++ b/engines/mads/madsv2/core/attr.h
@@ -39,6 +39,7 @@ namespace MADSV2 {
 
 extern int attr_walk(Buffer *attr, int x, int y);
 
+extern int rex_attr_depth(Buffer *depth, int x, int y);
 extern int attr_depth(TileMapHeader *depth_map, int x, int y);
 
 extern int attr_special(Buffer *attr, int x, int y);
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 01e3d05f57e..e29c476085c 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -834,9 +834,9 @@ int kernel_seq_forward(int series_id, int mirror, word ticks, word interval_tick
 
 	sprite = &series_list[series_id]->index[0];
 
-	depth = attr_depth(&depth_map,
-		sprite->x + (sprite->xs >> 1),
-		sprite->y + (sprite->ys >> 1)) - 1;
+	depth = (g_engine->getGameID() == GType_RexNebular) ?
+		MAX(rex_attr_depth(&scr_depth, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1, 0) :
+		attr_depth(&depth_map, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1;
 
 	return (kernel_seq_add(series_id, mirror, 1, 0, 0, AA_LINEAR, 1,
 		depth, 100, true, 0, 0, ticks, interval_ticks,
@@ -862,9 +862,9 @@ int kernel_seq_pingpong(int series_id, int mirror,
 
 	sprite = &series_list[series_id]->index[0];
 
-	depth = attr_depth(&depth_map,
-		sprite->x + (sprite->xs >> 1),
-		sprite->y + (sprite->ys >> 1)) - 1;
+	depth = (g_engine->getGameID() == GType_RexNebular) ?
+		MAX(rex_attr_depth(&scr_depth, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1, 0) :
+		attr_depth(&depth_map, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1;
 
 	return (kernel_seq_add(series_id, mirror, 1, 0, 0, AA_PINGPONG, 1,
 		depth, 100, true, 0, 0, ticks, interval_ticks,
@@ -887,9 +887,9 @@ int kernel_seq_backward(int series_id, int mirror, word ticks, word interval_tic
 
 	sprite = &series_list[series_id]->index[0];
 
-	depth = attr_depth(&depth_map,
-		sprite->x + (sprite->xs >> 1),
-		sprite->y + (sprite->ys >> 1)) - 1;
+	depth = (g_engine->getGameID() == GType_RexNebular) ?
+		MAX(rex_attr_depth(&scr_depth, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1, 0) :
+		attr_depth(&depth_map, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1;
 
 	return kernel_seq_add(series_id, mirror,
 		series_list[series_id]->num_sprites,


Commit: efe0796fd1cecc5f7f53479c75d0355af91f6b07
    https://github.com/scummvm/scummvm/commit/efe0796fd1cecc5f7f53479c75d0355af91f6b07
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:10+10:00

Commit Message:
MADS: NEBULAR: Properly hide Quotes main menu option

Changed paths:
    engines/mads/madsv2/nebular/main_menu.cpp


diff --git a/engines/mads/madsv2/nebular/main_menu.cpp b/engines/mads/madsv2/nebular/main_menu.cpp
index dda266e5160..4183e910a28 100644
--- a/engines/mads/madsv2/nebular/main_menu.cpp
+++ b/engines/mads/madsv2/nebular/main_menu.cpp
@@ -190,7 +190,7 @@ static void start_series() {
 		menu_item[count].status = 0;
 	}
 
-	menu_item[5].active = config_file.quotes_enabled;
+	menu_item[4].active = config_file.quotes_enabled;
 	error_flag = false;
 
 done:


Commit: 1a686ff43d7c942453ed8656667a8993a9856a77
    https://github.com/scummvm/scummvm/commit/1a686ff43d7c942453ed8656667a8993a9856a77
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:10+10:00

Commit Message:
MADS: NEBULAR: Fix fade calls in main menu

Changed paths:
    engines/mads/madsv2/nebular/main.cpp


diff --git a/engines/mads/madsv2/nebular/main.cpp b/engines/mads/madsv2/nebular/main.cpp
index 3f088e6809b..d76c6df479d 100644
--- a/engines/mads/madsv2/nebular/main.cpp
+++ b/engines/mads/madsv2/nebular/main.cpp
@@ -112,7 +112,7 @@ static void main_menu_main() {
 		}
 
 		mcga_getpal(&palette);
-		magic_fade_to_grey(palette, 0, 0x10, 1, 1, 0, 0, 0);
+		magic_fade_to_grey(palette, nullptr, 0, 256, 0, 1, 1, 16);
 	}
 
 	kernel_unload_sound_driver();
@@ -145,7 +145,7 @@ static void main_menu_main() {
 			g_engine->_soundManager->init(sectionNum);
 			sound_queue(soundId);
 
-			magic_map_to_grey_ramp(&master_palette, 0x10, 1, 1, 0, (MagicGreyPtr)&palette);
+			magic_fade_to_grey(master_palette, (byte *)&palette, 0, 256, 0, 1, 1, 16);
 
 			mouse_init_cycle();
 			bool flag1 = true;
@@ -179,7 +179,7 @@ static void main_menu_main() {
 				memset(&master_palette, 0, sizeof(master_palette));
 				mcga_setpal(&master_palette);
 			} else {
-				magic_fade_to_grey(master_palette, 0, 0x10, 1, 1, 0, 0, 0);
+				magic_fade_to_grey(master_palette, nullptr, 0, 256, 0, 1, 1, 16);
 			}
 
 			kernel_unload_sound_driver();


Commit: 88def5e6245030ebe3ec29157da55e99a4ba4987
    https://github.com/scummvm/scummvm/commit/88def5e6245030ebe3ec29157da55e99a4ba4987
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:11+10:00

Commit Message:
MADS: NEBULAR: Cleanup gui options / config loading

Changed paths:
    engines/mads/madsv2/core/config.cpp
    engines/mads/madsv2/core/config.h
    engines/mads/madsv2/nebular/global.cpp
    engines/mads/madsv2/nebular/global.h
    engines/mads/madsv2/nebular/menus.cpp
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h
    engines/mads/metaengine.cpp


diff --git a/engines/mads/madsv2/core/config.cpp b/engines/mads/madsv2/core/config.cpp
index b59b55108da..445284a9feb 100644
--- a/engines/mads/madsv2/core/config.cpp
+++ b/engines/mads/madsv2/core/config.cpp
@@ -49,19 +49,21 @@ void read_config_file() {
 	ConfMan.registerDefault("sfx_mute", false);
 	ConfMan.registerDefault("speech_mute", false);
 
-	ConfMan.registerDefault("interface_hotspots", INTERFACE_BRAINDEAD);
-	ConfMan.registerDefault("inventory_mode", INVENTORY_SQUAT);
+	ConfMan.registerDefault("interface_hotspots", true);
+	ConfMan.registerDefault("inventory_mode", true);
 	ConfMan.registerDefault("animated_interface", true);
 	ConfMan.registerDefault("show_speech_boxes", true);
+	ConfMan.registerDefault("naughtiness", true);
 	ConfMan.registerDefault("difficulty", -1);
 
 	config_file.music_flag = !ConfMan.getBool("music_mute") && !ConfMan.getBool("mute");
 	config_file.sound_flag = !ConfMan.getBool("sfx_mute") && !ConfMan.getBool("mute");
 	config_file.speech_flag = !ConfMan.getBool("speech_mute") && !ConfMan.getBool("mute");
 
-	config_file.interface_hotspots = ConfMan.getInt("interface_hotspots");
-	config_file.inventory_mode = ConfMan.getInt("inventory_spinning");
-	config_file.animated_interface = ConfMan.getBool("animated_interface");
+	config_file.interface_hotspots = ConfMan.getBool("interface_hotspots") ? INTERFACE_BRAINDEAD : INTERFACE_MACINTOSH;
+	config_file.inventory_mode = ConfMan.getBool("inventory_mode") ? INVENTORY_SPINNING : INVENTORY_SQUAT;
+	config_file.animated_interface = ConfMan.getBool("animated_interface") ? INTERFACE_ANIMATED : INTERFACE_STILL;
+	config_file.naughtiness = ConfMan.getBool("naughtiness") ? NAUGHTY : NICE;
 
 	config_file.quotes_enabled = ConfMan.getBool("quotes_enabled");
 	config_file.screen_fade = ConfMan.getBool("screen_fade");
@@ -69,7 +71,6 @@ void read_config_file() {
 
 	config_file.show_speech_boxes = ConfMan.getBool("show_speech_boxes");
 	config_file.original_save_load = ConfMan.getBool("original_menus");
-	config_file.naughtiness = ConfMan.hasKey("naughtiness") ? ConfMan.getInt("naughtiness") : 1;
 
 	if (ConfMan.hasKey("difficulty") && !g_engine->isDemo())
 		game.difficulty = ConfMan.getInt("difficulty");
diff --git a/engines/mads/madsv2/core/config.h b/engines/mads/madsv2/core/config.h
index 42ffa7a8988..662456b138e 100644
--- a/engines/mads/madsv2/core/config.h
+++ b/engines/mads/madsv2/core/config.h
@@ -45,7 +45,18 @@ enum {
 enum {
 	SCREEN_FADE_SMOOTH			= 0,       /* Smooth fade (thru black)     */
 	SCREEN_FADE_MEDIUM			= 1,       /* Medium fade (Detmar-o-matic) */
-	SCREEN_FADE_FAST			= 2       /* Fast fade (thru black)       */
+	SCREEN_FADE_FAST			= 2        /* Fast fade (thru black)       */
+};
+
+enum {
+	NAUGHTY                     = 1,       /* Naughtiness levels */
+	NICE                        = 2
+};
+
+enum Difficulty {
+	DIFFICULTY_HARD             = 1,
+	DIFFICULTY_MEDIUM           = 2,
+	DIFFICULTY_EASY             = 3
 };
 
 #define MEMORY_ALL              0       /* Use all available memory */
diff --git a/engines/mads/madsv2/nebular/global.cpp b/engines/mads/madsv2/nebular/global.cpp
index 1d644dd2a97..cc91fa0777f 100644
--- a/engines/mads/madsv2/nebular/global.cpp
+++ b/engines/mads/madsv2/nebular/global.cpp
@@ -21,6 +21,7 @@
 
 #include "mads/madsv2/nebular/global.h"
 #include "mads/madsv2/nebular/mads/inventory.h"
+#include "mads/madsv2/core/config.h"
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/imath.h"
diff --git a/engines/mads/madsv2/nebular/global.h b/engines/mads/madsv2/nebular/global.h
index 1b38d9a9058..65688e6a5d0 100644
--- a/engines/mads/madsv2/nebular/global.h
+++ b/engines/mads/madsv2/nebular/global.h
@@ -203,16 +203,6 @@ enum GlobalId {
 	kTeleporterCode         = 200
 };
 
-enum StoryMode {
-	STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2
-};
-
-enum Difficulty {
-	DIFFICULTY_HARD = 1,
-	DIFFICULTY_MEDIUM = 2,
-	DIFFICULTY_EASY = 3
-};
-
 enum {
 	SEX_MALE = 0, SEX_UNKNOWN = 1, SEX_FEMALE = 2
 };
diff --git a/engines/mads/madsv2/nebular/menus.cpp b/engines/mads/madsv2/nebular/menus.cpp
index c8dc9432ed8..fb8eadf85e8 100644
--- a/engines/mads/madsv2/nebular/menus.cpp
+++ b/engines/mads/madsv2/nebular/menus.cpp
@@ -563,7 +563,7 @@ static void game_menu_options_init() {
 	quote = quote_options_item6a + config_file.screen_fade;
 	game_menu_make_message(font_conv, quote_options_item6, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
 
-	quote = (config_file.naughtiness == STORYMODE_NAUGHTY) ? quote_options_item7a : quote_options_item7b;
+	quote = (config_file.naughtiness == NAUGHTY) ? quote_options_item7a : quote_options_item7b;
 	game_menu_make_message(font_conv, quote_options_item7, quote, GAME_MENU_SPECIAL, 0, menu_base += unit);
 
 	game_menu_make_message(font_conv, quote_menu_done, 0, GAME_MENU_CENTER, -54, menu_base += (unit + title));
@@ -1054,11 +1054,11 @@ static void game_menu_options() {
 			break;
 
 		case 7:
-			if (config_file.naughtiness == STORYMODE_NICE) {
-				config_file.naughtiness = STORYMODE_NAUGHTY;
+			if (config_file.naughtiness == NICE) {
+				config_file.naughtiness = NAUGHTY;
 			} else {
-				if (config_file.naughtiness == STORYMODE_NAUGHTY) {
-					config_file.naughtiness = STORYMODE_NICE;
+				if (config_file.naughtiness == NAUGHTY) {
+					config_file.naughtiness = NICE;
 				}
 			}
 			break;
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index a1512481c57..7c57d031b50 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -22,6 +22,7 @@
 #include "engines/util.h"
 #include "mads/core/mps_installer.h"
 #include "mads/madsv2/core/attr.h"
+#include "mads/madsv2/core/config.h"
 #include "mads/madsv2/core/conv.h"
 #include "mads/madsv2/core/env.h"
 #include "mads/madsv2/core/game.h"
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 0a3951078c4..2b127bfd603 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -106,6 +106,10 @@ enum ScreenTransition {
 	kNullPaletteCopy
 };
 
+enum StoryMode {
+	STORYMODE_NAUGHTY = NAUGHTY, STORYMODE_NICE = NICE
+};
+
 // These original constants may be useful when cleaning up room logic
 #ifdef old_animation
 #define kernel_animation                kernel_anim[0].anim
diff --git a/engines/mads/metaengine.cpp b/engines/mads/metaengine.cpp
index 728e9630824..64e32bdc63c 100644
--- a/engines/mads/metaengine.cpp
+++ b/engines/mads/metaengine.cpp
@@ -66,7 +66,7 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 		{
 			_s("Easy mouse interface"),
 			_s("Shows object names when hovering the mouse over them"),
-			"EasyMouse",
+			"interface_hotspots",
 			true,
 			0,
 			0
@@ -78,7 +78,7 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 		{
 			_s("Animated inventory items"),
 			_s("Animated inventory items"),
-			"InvObjectsAnimated",
+			"inventory_mode",
 			true,
 			0,
 			0
@@ -90,7 +90,7 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 		{
 			_s("Animated game interface"),
 			_s("Animated game interface"),
-			"TextWindowAnimated",
+			"animated_interface",
 			true,
 			0,
 			0
@@ -102,7 +102,7 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 		{
 			_s("Naughty game mode"),
 			_s("Naughty game mode"),
-			"NaughtyMode",
+			"naughtiness",
 			true,
 			0,
 			0
@@ -121,18 +121,6 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 		}
 	},
 
-	/*{
-		GAMEOPTION_GRAPHICS_DITHERING,
-		{
-			_s("Graphics dithering"),
-			_s("Graphics dithering"),
-			"GraphicsDithering",
-			true,
-			0,
-			0
-		}
-	},*/
-
 #ifdef USE_TTS
 	{
 		GAMEOPTION_TTS_NARRATOR,


Commit: 066813a4c15aaa8e1cdf148adc7958d6095115e3
    https://github.com/scummvm/scummvm/commit/066813a4c15aaa8e1cdf148adc7958d6095115e3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:11+10:00

Commit Message:
MADS: NEBULAR: Fix probe beach cutscene animation

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 0ad25fb6ac4..e3b0a227427 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -413,7 +413,7 @@ int Scene::loadAnimation(const char *name, int trigger_code) {
 }
 
 void Scene::freeAnimation() {
-	error("TODO: freeAnimation");
+	kernel_abort_animation(0);
 }
 
 void Scene::changeVariant(int num) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 2b127bfd603..a3df566e8ad 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -193,16 +193,16 @@ struct Scene {
 		}
 
 		bool operator!() const {
-			return _id == -1;
+			return kernel_anim[_id].anim == nullptr;
 		}
 		bool operator!=(std::nullptr_t) const {
-			return _id != -1;
+			return kernel_anim[_id].anim != nullptr;
 		}
 		bool operator==(std::nullptr_t) const {
-			return _id == -1;
+			return kernel_anim[_id].anim == nullptr;
 		}
 		explicit operator bool() const {
-			return _id != -1;
+			return kernel_anim[_id].anim != nullptr;
 		}
 		Animation &operator=(std::nullptr_t);
 


Commit: c10604a42cf79b2cfaad50d065399535fc86afcc
    https://github.com/scummvm/scummvm/commit/c10604a42cf79b2cfaad50d065399535fc86afcc
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:12+10:00

Commit Message:
MADS: NEBULAR: Fix room_id field usage in room_load_depth

Changed paths:
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 1cbe91f2599..a6f02685999 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -194,7 +194,7 @@ int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_i
 
 	bool hasLoad = load_handle != nullptr;
 	if (!hasLoad) {
-		env_get_level_path(filename, ROOM, ".DAT", room_info->room_id, variant);
+		env_get_level_path(filename, ROOM, ".DAT", 0, room_info->room_id);
 		loader_open(&load, filename, "rb", -1);
 		load_handle = &load;
 	}
@@ -308,6 +308,7 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 	roomPtr->num_variants = 0;
 	roomPtr->num_hotspots = 0;
 	roomPtr->num_rails = roomfile.num_rails;
+	roomPtr->room_id = id;
 	roomPtr->xs = roomfile.xs;
 	roomPtr->ys = roomfile.ys;
 	roomPtr->front_y = roomfile.front_y;


Commit: f4f17c5f09cbfcc409c8338ce54f6972afe1f07d
    https://github.com/scummvm/scummvm/commit/f4f17c5f09cbfcc409c8338ce54f6972afe1f07d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:12+10:00

Commit Message:
MADS: NEBULAR: Fix room_load_depth when loading variants

Changed paths:
    engines/mads/madsv2/core/loader.cpp
    engines/mads/madsv2/core/loader.h
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/core/loader.cpp b/engines/mads/madsv2/core/loader.cpp
index cf9f5693c41..292dc99052b 100644
--- a/engines/mads/madsv2/core/loader.cpp
+++ b/engines/mads/madsv2/core/loader.cpp
@@ -55,11 +55,14 @@ int loader_ems_search_disabled = false;
 char loader_last[14] = "";
 
 
-LoaderReadStream::LoaderReadStream(LoadHandle load) {
-	byte *data = (byte *)malloc(load->decompress_size);
-	(void)loader_read(data, 1, load->decompress_size, load);
+LoaderReadStream::LoaderReadStream(LoadHandle load, long size) {
+	if (size < 0)
+		size = load->decompress_size;
 
-	_data = new Common::MemoryReadStream(data, load->decompress_size, DisposeAfterUse::YES);
+	byte *data = (byte *)malloc(size);
+	(void)loader_read(data, 1, size, load);
+
+	_data = new Common::MemoryReadStream(data, size, DisposeAfterUse::YES);
 }
 
 LoaderReadStream::~LoaderReadStream() {
@@ -276,6 +279,17 @@ done:
 	}
 }
 
+void loader_skip_entries(LoadHandle handle, int count) {
+	long skip = 0;
+	for (int i = 0; i < count; ++i)
+		skip += handle->pack.strategy[handle->pack_list_marker + i].compressed_size;
+
+	if (skip != 0)
+		handle->handle->seek(skip, SEEK_CUR);
+
+	handle->pack_list_marker += count;
+}
+
 long loader_write(void *target, long record_size, long record_count, LoadHandle handle) {
 	long total_size, result = 0;
 	long file_pos;
diff --git a/engines/mads/madsv2/core/loader.h b/engines/mads/madsv2/core/loader.h
index 3413d1478ef..3dcb5a64737 100644
--- a/engines/mads/madsv2/core/loader.h
+++ b/engines/mads/madsv2/core/loader.h
@@ -60,7 +60,7 @@ private:
 	Common::MemoryReadStream *_data;
 
 public:
-	LoaderReadStream(LoadHandle load);
+	LoaderReadStream(LoadHandle load, long size = -1);
 	~LoaderReadStream() override;
 
 	int64 pos() const override {
@@ -101,6 +101,7 @@ extern int loader_open(LoadHandle handle, const char *filename, const char *opti
 extern int loader_close(LoadHandle handle);
 extern void loader_set_priority(LoadHandle handle, int priority);
 extern long loader_read(void *target, long record_size, long record_count, LoadHandle handle);
+extern void loader_skip_entries(LoadHandle handle, int count);
 extern long loader_write(void *target, long record_size, long record_count, LoadHandle handle);
 extern long loader_write_2(Common::WriteStream *source_handle, long total_size, LoadHandle handle);
 
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index a6f02685999..e94384b541c 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -199,6 +199,11 @@ int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_i
 		load_handle = &load;
 	}
 
+	// Pack entry 0 is always the room header; the depth/walk data for a given variant
+	// follows at entry (variant + 1). Skip forward to it before reading.
+	int targetEntry = variant + 1;
+	loader_skip_entries(load_handle, targetEntry - load_handle->pack_list_marker);
+
 	int width = room_info->xs;
 	int totalPixels = width * room_info->ys;
 	int pixelIndex = 0;
@@ -210,7 +215,7 @@ int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_i
 	// In both cases, the byte's high bit(s) flag whether the pixel is walkable, and the
 	// remaining bit(s) give its depth. The results are unpacked into the standard walk
 	// (1 bit/pixel) and depth (4 bits/pixel) surface formats used throughout the engine.
-	LoaderReadStream src(load_handle);
+	LoaderReadStream src(load_handle, load_handle->pack.strategy[load_handle->pack_list_marker].size);
 
 	runLength = src.readByte();
 	while (pixelIndex < totalPixels && runLength != 0) {


Commit: 9a88cd1f8511cee184d87e1b8af12765a7cb1d76
    https://github.com/scummvm/scummvm/commit/9a88cd1f8511cee184d87e1b8af12765a7cb1d76
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:12+10:00

Commit Message:
MADS: NEBULAR: Fix size of SegmentInter struct

Changed paths:
    engines/mads/madsv2/core/anim.cpp
    engines/mads/madsv2/core/anim.h


diff --git a/engines/mads/madsv2/core/anim.cpp b/engines/mads/madsv2/core/anim.cpp
index b8e028c138f..052798037e1 100644
--- a/engines/mads/madsv2/core/anim.cpp
+++ b/engines/mads/madsv2/core/anim.cpp
@@ -92,7 +92,9 @@ void SegmentInter::load(Common::SeekableReadStream *src) {
 	src->readMultipleLE(probability, num_images, first_image, last_image, counter);
 	src->read(spawn, AA_MAX_SPAWNED);
 	src->readMultipleLE(spawn_frame);
-	src->readMultipleLE(sound, sound_frame);
+	sound = src->readByte();
+	src->skip(1);
+	sound_frame = src->readSint16LE();
 }
 
 
diff --git a/engines/mads/madsv2/core/anim.h b/engines/mads/madsv2/core/anim.h
index b385b193f10..869f5f4d949 100644
--- a/engines/mads/madsv2/core/anim.h
+++ b/engines/mads/madsv2/core/anim.h
@@ -299,9 +299,10 @@ struct SegmentInter {
 	byte spawn[AA_MAX_SPAWNED];
 	int16 spawn_frame[AA_MAX_SPAWNED];
 	byte sound;
+	//byte padding;
 	int16 sound_frame;
 
-	static constexpr size_t SIZE = 5 * 2 + AA_MAX_SPAWNED + AA_MAX_SPAWNED * 2 + 1 + 2;
+	static constexpr size_t SIZE = 5 * 2 + AA_MAX_SPAWNED + AA_MAX_SPAWNED * 2 + 2 + 2;
 	void load(Common::SeekableReadStream *src);
 };
 typedef SegmentInter *SegmentInterPtr;


Commit: 1649535b0d98758b05a7e7377f59a8f74a644df5
    https://github.com/scummvm/scummvm/commit/1649535b0d98758b05a7e7377f59a8f74a644df5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:13+10:00

Commit Message:
MADS: NEBULAR: Implement dynamic hotspot cursor function

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index e3b0a227427..aa6f876a853 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -214,8 +214,8 @@ int Scene::DynamicHotspots::setPosition(int id, const Common::Point &pt, int fac
 	return id;
 }
 
-int Scene::DynamicHotspots::setCursor(int index, int cursorNum) {
-	error("TODO: DynamicHotspots::setCursor");
+int Scene::DynamicHotspots::setCursor(int id, int cursorNum) {
+	return kernel_dynamic_cursor(id, cursorNum);
 }
 
 Scene::DynamicHotspot Scene::DynamicHotspots::operator[](int idx) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index a3df566e8ad..5e1e562e725 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -237,7 +237,7 @@ struct Scene {
 		int add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r);
 		void remove(int dyn_id);
 		int setPosition(int id, const Common::Point &pt, int facing);
-		int setCursor(int index, int cursor);
+		int setCursor(int id, int cursor);
 
 		DynamicHotspot operator[](int idx);
 	};


Commit: ed70e70e332b5c08c52293701744c4d2384004d9
    https://github.com/scummvm/scummvm/commit/ed70e70e332b5c08c52293701744c4d2384004d9
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:14+10:00

Commit Message:
MADS: NEBULAR: Replace dynmicHotspots.add calls with proper word constants

Changed paths:
    engines/mads/madsv2/nebular/mads/words.h
    engines/mads/madsv2/nebular/rooms/room105.cpp
    engines/mads/madsv2/nebular/rooms/room107.cpp
    engines/mads/madsv2/nebular/rooms/room108.cpp
    engines/mads/madsv2/nebular/rooms/room109.cpp
    engines/mads/madsv2/nebular/rooms/room110.cpp
    engines/mads/madsv2/nebular/rooms/room201.cpp
    engines/mads/madsv2/nebular/rooms/room202.cpp
    engines/mads/madsv2/nebular/rooms/room203.cpp
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room209.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room211.cpp
    engines/mads/madsv2/nebular/rooms/room214.cpp
    engines/mads/madsv2/nebular/rooms/room307.cpp
    engines/mads/madsv2/nebular/rooms/room309.cpp
    engines/mads/madsv2/nebular/rooms/room701.cpp


diff --git a/engines/mads/madsv2/nebular/mads/words.h b/engines/mads/madsv2/nebular/mads/words.h
index dcb2aade962..ecbe5a6110b 100644
--- a/engines/mads/madsv2/nebular/mads/words.h
+++ b/engines/mads/madsv2/nebular/mads/words.h
@@ -831,7 +831,7 @@ enum Noun {
 	NOUN_CONTROL_STATION = 0x2AF,
 	NOUN_STRANGE_MONSTER = 0x2B0,
 	NOUN_GHASTLY_BEAST = 0x2B1,
-	//NOUN_GAWK_AT = 0x2B2,
+	NOUN_GAWK_AT = 0x2B2,
 	NOUN_CORRIDOR_TO_SOUTH = 0x2B3,
 	NOUN_CORRIDOR_TO_NORTH = 0x2B4,
 	//NOUN_WALK_ONTO = 0x2B5,
diff --git a/engines/mads/madsv2/nebular/rooms/room105.cpp b/engines/mads/madsv2/nebular/rooms/room105.cpp
index 5ff34ad992d..a0dcaf4f538 100644
--- a/engines/mads/madsv2/nebular/rooms/room105.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room105.cpp
@@ -48,7 +48,7 @@ static void room_105_init() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(48, 144));
 
-		int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_FISH, VERB_SWIM_TO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(56, 141), FACING_NORTHWEST);
 	}
 
diff --git a/engines/mads/madsv2/nebular/rooms/room107.cpp b/engines/mads/madsv2/nebular/rooms/room107.cpp
index 26ea3e62c4d..a6425b02695 100644
--- a/engines/mads/madsv2/nebular/rooms/room107.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room107.cpp
@@ -56,7 +56,7 @@ static void room_107_init() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(68, 151));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
-		int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_FISH, VERB_SWIM_TO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(78, 135), FACING_SOUTHWEST);
 	}
 
@@ -73,7 +73,7 @@ static void room_107_init() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(270, 150));
 		_scene->_sequences.setMotion(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, -200, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
-		_scene->_dynamicHotspots.add(218, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.add(NOUN_MANTA_RAY, VERB_SWIM_TO, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 	}
 
 	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
diff --git a/engines/mads/madsv2/nebular/rooms/room108.cpp b/engines/mads/madsv2/nebular/rooms/room108.cpp
index fa711962b1a..bb9edd07096 100644
--- a/engines/mads/madsv2/nebular/rooms/room108.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room108.cpp
@@ -53,7 +53,7 @@ static void room_108_init() {
 	if (_globals[kFishIn108]) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(41, 109));
-		int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_FISH, VERB_SWIM_TO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(41, 109), FACING_NORTHWEST);
 	}
 
diff --git a/engines/mads/madsv2/nebular/rooms/room109.cpp b/engines/mads/madsv2/nebular/rooms/room109.cpp
index 85cd6b550c0..4aaa8e66067 100644
--- a/engines/mads/madsv2/nebular/rooms/room109.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room109.cpp
@@ -76,11 +76,11 @@ static void room_109_init() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
 
-		int idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(256, 57, 267, 87));
+		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(256, 57, 267, 87));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-		idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(242, 79, 265, 90));
+		idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(242, 79, 265, 90));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-		idx = _scene->_dynamicHotspots.add(229, 348, -1, Common::Rect(231, 88, 253, 94));
+		idx = _scene->_dynamicHotspots.add(NOUN_MONSTER_SLUDGE, VERB_SWIM_TO, -1, Common::Rect(231, 88, 253, 94));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
 	}
 
@@ -90,7 +90,7 @@ static void room_109_init() {
 	if (_game._objects.isInRoom(OBJ_BURGER)) {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
-		int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 	} else if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_BURGER);
@@ -311,11 +311,11 @@ static void room_109_parser() {
 							_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
 							_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
 							_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
-							int idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(256, 57, 256 + 12, 57 + 31));
+							int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(256, 57, 256 + 12, 57 + 31));
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-							idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(242, 79, 242 + 24, 79 + 12));
+							idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(242, 79, 242 + 24, 79 + 12));
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-							idx = _scene->_dynamicHotspots.add(229, 348, -1, Common::Rect(231, 88, 231 + 23, 88 + 7));
+							idx = _scene->_dynamicHotspots.add(NOUN_MONSTER_SLUDGE, VERB_SWIM_TO, -1, Common::Rect(231, 88, 231 + 23, 88 + 7));
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
 							_scene->changeVariant(1);
 						} else {
@@ -363,7 +363,7 @@ static void room_109_parser() {
 						_game._objects.setRoom(OBJ_BURGER, _scene->_currentSceneId);
 						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 30, 30);
-						int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 						_scene->_sequences.addTimer(65, 6);
 					}
@@ -374,7 +374,7 @@ static void room_109_parser() {
 						_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 46);
-						int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 7);
 					}
@@ -384,7 +384,7 @@ static void room_109_parser() {
 					{
 						_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 						_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
-						int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 						_vm->_dialogs->show(10915);
 					}
diff --git a/engines/mads/madsv2/nebular/rooms/room110.cpp b/engines/mads/madsv2/nebular/rooms/room110.cpp
index 4fc31470b28..28742960782 100644
--- a/engines/mads/madsv2/nebular/rooms/room110.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room110.cpp
@@ -57,13 +57,13 @@ static void room_110_init() {
 
 		local._crabsFl = true;
 
-		int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(194, 23);
@@ -104,13 +104,13 @@ static void room_110_pre_parser() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 16, 1, 0, 0);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 16, 1, 0, 0);
 
-		int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
 	}
 }
diff --git a/engines/mads/madsv2/nebular/rooms/room201.cpp b/engines/mads/madsv2/nebular/rooms/room201.cpp
index e41f9335179..ea6b5b2d848 100644
--- a/engines/mads/madsv2/nebular/rooms/room201.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room201.cpp
@@ -52,7 +52,7 @@ static void room_201_init() {
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(185, 46));
 
-	int idx = _scene->_dynamicHotspots.add(NOUN_BIRDS, 209, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(NOUN_BIRDS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 81), FACING_NORTH);
 
 	if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId == RETURNING_FROM_LOADING)) {
@@ -122,7 +122,7 @@ static void room_201_init() {
 static void room_201_daemon() {
 	if (local._pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 6, 0);
-		int idx = _scene->_dynamicHotspots.add(351, 13, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_SWOOPING_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(270, 80), FACING_EAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
 		_vm->_sound->command(14);
diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index b13d2621087..2e1940d2357 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -522,7 +522,7 @@ static void room_202_parser() {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
 
-			local._ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, 78, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
+			local._ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, VERB_CLIMB_DOWN, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
 			_scene->_dynamicHotspots.setPosition(local._ladderHotspotId, Common::Point(246, 124), FACING_NORTH);
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
diff --git a/engines/mads/madsv2/nebular/rooms/room203.cpp b/engines/mads/madsv2/nebular/rooms/room203.cpp
index 259871bda38..65cf1810dbc 100644
--- a/engines/mads/madsv2/nebular/rooms/room203.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room203.cpp
@@ -58,7 +58,7 @@ static void room_203_init() {
 	if ((_globals[kRhotundaStatus] == 0) && (!_scene->_roomChanged)) {
 		local._rhotundaEatFl = true;
 		_game._player.walk(Common::Point(158, 135), FACING_SOUTH);
-		int idx = _scene->_dynamicHotspots.add(131, 396, 0, Common::Rect(0, 0, 320, 156));
+		int idx = _scene->_dynamicHotspots.add(NOUN_FIELD_TO_SOUTH, VERB_WALK_TOWARDS, 0, Common::Rect(0, 0, 320, 156));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(155, 152), FACING_SOUTH);
 		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
 	}
@@ -67,7 +67,7 @@ static void room_203_init() {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', -1));
 		if (_vm->getRandomNumber(1, 3) == 2) {
 			_globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 9, 1, 0, 0);
-			int idx = _scene->_dynamicHotspots.add(477, 209, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(NOUN_YELLOW_BIRD, VERB_LOOK_AT, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 			_vm->_sound->command(14);
 		}
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index f69778312d4..2af70c33aab 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -56,11 +56,11 @@ static void room_205_init() {
 		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
 
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 0, 0, 3);
-	int idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(NOUN_CHICKEN, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
 
 	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
-	idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	idx = _scene->_dynamicHotspots.add(NOUN_CHICKEN, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 0, 0, 0);
@@ -69,7 +69,7 @@ static void room_205_init() {
 
 	if (!_game._visitedScenes._sceneRevisited) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
-		idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(NOUN_PIRANHA, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
 	}
 
@@ -135,7 +135,7 @@ static void room_205_daemon() {
 	if (_vm->_game->_scene._frameStartTime - local._lastFishTime > 1300) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(
 			_globals._spriteIndexes[6], false, 5, 1, 0, 0);
-		int idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6],
+		int idx = _scene->_dynamicHotspots.add(NOUN_PIRANHA, VERB_WALKTO, _globals._sequenceIndexes[6],
 			Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
 		local._lastFishTime = _vm->_game->_scene._frameStartTime;
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index 67e01cff4bc..d6c216b798f 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -72,14 +72,14 @@ static void room_207_init() {
 
 	if (local._vultureFl) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 30, 0, 0, 400);
-		local._vultureHotspotId = _scene->_dynamicHotspots.add(389, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		local._vultureHotspotId = _scene->_dynamicHotspots.add(NOUN_VULTURE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._vultureHotspotId, Common::Point(254, 94), FACING_WEST);
 	}
 
 	if (local._spiderFl) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -1);
-		local._spiderHotspotId = _scene->_dynamicHotspots.add(333, 13, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		local._spiderHotspotId = _scene->_dynamicHotspots.add(NOUN_SPIDER, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._spiderHotspotId, Common::Point(59, 132), FACING_SOUTH);
 	}
 
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index dc5886e5c86..c91b340cf47 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -793,7 +793,7 @@ static void handleMonkeyFall() {
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 43, 72);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 222);
-		int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_BINOCULARS, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
 	}
 	break;
@@ -988,7 +988,7 @@ static void room_209_init() {
 
 	if (_game._objects.isInRoom(OBJ_PLANT_STALK)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
-		int idx = _scene->_dynamicHotspots.add(271, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_PLANT_STALK, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(263, 129), FACING_SOUTH);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
 	}
@@ -1005,7 +1005,7 @@ static void room_209_init() {
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(NOUN_BINOCULARS, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
 	}
 
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index eaa84c2c528..f43c4d46c3b 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -632,7 +632,7 @@ static void room_210_init() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
 	} else {
-		int idx = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+		int idx = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
 		local._doorway = _scene->_dynamicHotspots.setPosition(idx, Common::Point(168, 127), FACING_NORTH);
 		_scene->_dynamicHotspots.setCursor(local._doorway, CURSOR_GO_UP);
 	}
@@ -1000,7 +1000,7 @@ static void room_210_parser() {
 		case 1:
 			_game._player._stepEnabled = true;
 			_globals[kCurtainOpen] = true;
-			local._doorway = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+			local._doorway = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
 			_scene->_dynamicHotspots.setPosition(local._doorway, Common::Point(168, 127), FACING_NORTH);
 			_scene->_dynamicHotspots.setCursor(local._doorway, CURSOR_GO_UP);
 			break;
diff --git a/engines/mads/madsv2/nebular/rooms/room211.cpp b/engines/mads/madsv2/nebular/rooms/room211.cpp
index bb285698968..d65dba2fec8 100644
--- a/engines/mads/madsv2/nebular/rooms/room211.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room211.cpp
@@ -67,7 +67,7 @@ static void room_211_init() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(202, 126));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
 		_scene->_sequences.setMotion(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, -200, 0);
-		_scene->_dynamicHotspots.add(324, 13, _globals._sequenceIndexes[2], Common::Rect(1, 1, 1 + 41, 1 + 10));
+		_scene->_dynamicHotspots.add(NOUN_SLITHERING_SNAKE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(1, 1, 1 + 41, 1 + 10));
 	}
 
 	if (_scene->_roomChanged)
diff --git a/engines/mads/madsv2/nebular/rooms/room214.cpp b/engines/mads/madsv2/nebular/rooms/room214.cpp
index 818119d0881..715ddf3f760 100644
--- a/engines/mads/madsv2/nebular/rooms/room214.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room214.cpp
@@ -77,7 +77,7 @@ static void room_214_daemon() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 6, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
-		_scene->_dynamicHotspots.add(451, 13, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.add(NOUN_CAPTIVE_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 	}
 
@@ -88,7 +88,7 @@ static void room_214_daemon() {
 			int oldIdx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 5, 0, 0);
 			_scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
-			_scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.add(NOUN_CAPTIVE_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 8);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
@@ -100,7 +100,7 @@ static void room_214_daemon() {
 			int oldIdx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
 			_scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
-			_scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.add(NOUN_CAPTIVE_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 9, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
 			local._devilTime = _game._player._priorTimer;
diff --git a/engines/mads/madsv2/nebular/rooms/room307.cpp b/engines/mads/madsv2/nebular/rooms/room307.cpp
index b5564aabd71..86850730889 100644
--- a/engines/mads/madsv2/nebular/rooms/room307.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room307.cpp
@@ -345,7 +345,7 @@ static void room_307_init() {
 	if (local._grateOpenedFl) {
 		_scene->_hotspots.activate(17, false);
 
-		int idx = _scene->_dynamicHotspots.add(17, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
+		int idx = _scene->_dynamicHotspots.add(NOUN_AIR_VENT, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
 		int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
 		_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_UP);
 
@@ -540,7 +540,7 @@ static void room_307_parser() {
 			_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 			local._grateOpenedFl = true;
 			_scene->_hotspots.activate(17, false);
-			int idx = _scene->_dynamicHotspots.add(17, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
+			int idx = _scene->_dynamicHotspots.add(NOUN_AIR_VENT, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
 			int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
 			_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_UP);
 			_game._objects.removeFromInventory(OBJ_SCALPEL, NOWHERE);
diff --git a/engines/mads/madsv2/nebular/rooms/room309.cpp b/engines/mads/madsv2/nebular/rooms/room309.cpp
index 768678c32d2..063accdc846 100644
--- a/engines/mads/madsv2/nebular/rooms/room309.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room309.cpp
@@ -137,7 +137,7 @@ static void room_309_daemon() {
 		switch (_game._trigger) {
 		case 70:
 		{
-			int idx = _scene->_dynamicHotspots.add(689, 690, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(NOUN_GHASTLY_BEAST, NOUN_GAWK_AT, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(142, 146), FACING_NORTHEAST);
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 4, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
diff --git a/engines/mads/madsv2/nebular/rooms/room701.cpp b/engines/mads/madsv2/nebular/rooms/room701.cpp
index 73bb63235c0..317a8f3d13b 100644
--- a/engines/mads/madsv2/nebular/rooms/room701.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room701.cpp
@@ -89,7 +89,7 @@ static void room_701_init() {
 	{
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
-		int idx = _scene->_dynamicHotspots.add(837, 759, _globals._sequenceIndexes[2], Common::Rect());
+		int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect());
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(231, 127), FACING_NORTH);
 		break;
 	}


Commit: f78c0ddc088e50c8e5f87faf2b01d7af3d4627d3
    https://github.com/scummvm/scummvm/commit/f78c0ddc088e50c8e5f87faf2b01d7af3d4627d3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:14+10:00

Commit Message:
MADS: NEBULAR: Janitorial for function return statements

Changed paths:
    engines/mads/madsv2/core/anim.cpp
    engines/mads/madsv2/core/buffer.cpp
    engines/mads/madsv2/core/color.cpp
    engines/mads/madsv2/core/env.cpp
    engines/mads/madsv2/core/fileio.cpp
    engines/mads/madsv2/core/font.cpp
    engines/mads/madsv2/core/hspot.cpp
    engines/mads/madsv2/core/inter.cpp
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/keys.cpp
    engines/mads/madsv2/core/loader.cpp
    engines/mads/madsv2/core/mem.cpp
    engines/mads/madsv2/core/pal.cpp
    engines/mads/madsv2/core/popup.cpp
    engines/mads/madsv2/core/screen.cpp
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/core/anim.cpp b/engines/mads/madsv2/core/anim.cpp
index 052798037e1..c644b2b5820 100644
--- a/engines/mads/madsv2/core/anim.cpp
+++ b/engines/mads/madsv2/core/anim.cpp
@@ -511,7 +511,7 @@ done:
 	}
 	if (load_handle.open) loader_close(&load_handle);
 
-	return (anim);
+	return anim;
 }
 
 int anim_get_sound_info(const char *file_name, char *sound_file_buffer, int *sound_load_flag) {
diff --git a/engines/mads/madsv2/core/buffer.cpp b/engines/mads/madsv2/core/buffer.cpp
index e75d062c52d..a4dba5d99cd 100644
--- a/engines/mads/madsv2/core/buffer.cpp
+++ b/engines/mads/madsv2/core/buffer.cpp
@@ -769,7 +769,7 @@ int buffer_preserve(Buffer *source, int flags, int source_ems_handle, int x, int
 	preserve_handle = BUFFER_NOT_PRESERVED;
 
 done:
-	return (preserve_handle);
+	return preserve_handle;
 }
 
 void buffer_restore(Buffer *source, int preserve_handle, int target_ems_handle, int x, int y, int xs, int ys) {
diff --git a/engines/mads/madsv2/core/color.cpp b/engines/mads/madsv2/core/color.cpp
index d5ad1e61785..fac0479b700 100644
--- a/engines/mads/madsv2/core/color.cpp
+++ b/engines/mads/madsv2/core/color.cpp
@@ -81,7 +81,7 @@ byte color_thatch(int color, int thatching) {
 		}
 	}
 
-	return (thatch);
+	return thatch;
 }
 
 void color_list_start_scan(byte *list_flags) {
diff --git a/engines/mads/madsv2/core/env.cpp b/engines/mads/madsv2/core/env.cpp
index c95653e2728..e7676189267 100644
--- a/engines/mads/madsv2/core/env.cpp
+++ b/engines/mads/madsv2/core/env.cpp
@@ -98,7 +98,7 @@ char *env_catint(char *out, int value, int digits) {
 		power = power / 10;
 	}
 
-	return (out);
+	return out;
 }
 
 static void path_concat(char *target, const char *string) {
diff --git a/engines/mads/madsv2/core/fileio.cpp b/engines/mads/madsv2/core/fileio.cpp
index 676c0ca2e4d..8eea8a5e2a3 100644
--- a/engines/mads/madsv2/core/fileio.cpp
+++ b/engines/mads/madsv2/core/fileio.cpp
@@ -98,9 +98,9 @@ char *fileio_ffgets(char *mystring, int num, Common::SeekableReadStream *stream)
 				}
 			}
 		}
-		return (mystring);
+		return mystring;
 	} else {
-		return (NULL);
+		return NULL;
 	}
 }
 
diff --git a/engines/mads/madsv2/core/font.cpp b/engines/mads/madsv2/core/font.cpp
index 3bbefaf63f1..9dcfbfe7ae9 100644
--- a/engines/mads/madsv2/core/font.cpp
+++ b/engines/mads/madsv2/core/font.cpp
@@ -249,7 +249,7 @@ int font_string_width(FontPtr font, const char *out_string, int auto_spacing) {
 		width += more_width;
 	}
 
-	return (width);
+	return width;
 }
 
 void init_font() {
diff --git a/engines/mads/madsv2/core/hspot.cpp b/engines/mads/madsv2/core/hspot.cpp
index d0570e8936a..3c9907b6894 100644
--- a/engines/mads/madsv2/core/hspot.cpp
+++ b/engines/mads/madsv2/core/hspot.cpp
@@ -166,7 +166,7 @@ int hspot_begin(int x, int y, int class_, int num, int hotkey) {
 	hspot_add(x, y, x, y, class_, num, screen_video_mode);
 	hspot_special_num = numspots;
 	hotkeys[num] = hotkey;
-	return (x);
+	return x;
 }
 
 int hspot_end() {
@@ -178,7 +178,7 @@ int hspot_end() {
 	spot[hspot_special_num].lr_y = y;
 
 	cursor_set_follow(false);
-	return (x);
+	return x;
 }
 
 int hspot_which(int coord_x, int coord_y, int video_mode) {
diff --git a/engines/mads/madsv2/core/inter.cpp b/engines/mads/madsv2/core/inter.cpp
index bdab97e87a6..e8d0ef24039 100644
--- a/engines/mads/madsv2/core/inter.cpp
+++ b/engines/mads/madsv2/core/inter.cpp
@@ -647,7 +647,7 @@ int inter_add_dialog(char *string, int result) {
 		inter_dialog_results[id] = result;
 	}
 
-	return (id);
+	return id;
 }
 
 /*
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index e29c476085c..109c20c2bc8 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -838,9 +838,9 @@ int kernel_seq_forward(int series_id, int mirror, word ticks, word interval_tick
 		MAX(rex_attr_depth(&scr_depth, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1, 0) :
 		attr_depth(&depth_map, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1;
 
-	return (kernel_seq_add(series_id, mirror, 1, 0, 0, AA_LINEAR, 1,
+	return kernel_seq_add(series_id, mirror, 1, 0, 0, AA_LINEAR, 1,
 		depth, 100, true, 0, 0, ticks, interval_ticks,
-		start_ticks, expire));
+		start_ticks, expire);
 }
 
 
@@ -866,9 +866,9 @@ int kernel_seq_pingpong(int series_id, int mirror,
 		MAX(rex_attr_depth(&scr_depth, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1, 0) :
 		attr_depth(&depth_map, sprite->x + (sprite->xs >> 1), sprite->y + (sprite->ys >> 1)) - 1;
 
-	return (kernel_seq_add(series_id, mirror, 1, 0, 0, AA_PINGPONG, 1,
+	return kernel_seq_add(series_id, mirror, 1, 0, 0, AA_PINGPONG, 1,
 		depth, 100, true, 0, 0, ticks, interval_ticks,
-		start_ticks, expire));
+		start_ticks, expire);
 }
 
 int kernel_seq_pingpong_scroll(int series_id, int mirror,
@@ -903,10 +903,10 @@ int kernel_seq_backward_scroll(int series_id, int mirror,
 	int expire) {
 	int depth = 0;
 
-	return (kernel_seq_add(series_id, mirror,
+	return kernel_seq_add(series_id, mirror,
 		series_list[series_id]->num_sprites,
 		0, 0, AA_LINEAR, -1, depth, 100, true, 0, 0,
-		ticks, interval_ticks, start_ticks, expire));
+		ticks, interval_ticks, start_ticks, expire);
 }
 
 void kernel_synch(int slave_type, int slave_id, int master_type, int master_id) {
@@ -1026,7 +1026,7 @@ int kernel_seq_stamp(int series_id, int mirror, int sprite) {
 		kernel_seq_range(id, sprite, sprite);
 		sequence_list[id].loop_direction = AA_STAMP;
 	}
-	return (id);
+	return id;
 }
 
 int kernel_seq_stamp_scroll(int series_id, int mirror, int sprite) {
@@ -1037,7 +1037,7 @@ int kernel_seq_stamp_scroll(int series_id, int mirror, int sprite) {
 		kernel_seq_range(id, sprite, sprite);
 		sequence_list[id].loop_direction = AA_STAMP;
 	}
-	return (id);
+	return id;
 }
 
 int kernel_seq_trigger(int sequence_id,
@@ -1567,14 +1567,14 @@ int kernel_run_animation_disp(char thing, int num, int trigger_code) {
 	Common::strcat_s(test, crap);
 
 	feedback = kernel_run_animation(test, trigger_code);
-	return (feedback);
+	return feedback;
 }
 
 int kernel_run_animation_write(int trigger_code) {
 	int feedback;
 
 	feedback = kernel_run_animation("*write_e", trigger_code);
-	return (feedback);
+	return feedback;
 }
 
 int kernel_run_animation_point(int num, int trigger_code) {
@@ -2341,7 +2341,7 @@ int kernel_add_dynamic(int vocab_id, int verb_id, byte syntax,
 	}
 
 done:
-	return (id);
+	return id;
 }
 
 void kernel_dynamic_anim(int id, int anim_id, int segment) {
@@ -2377,7 +2377,7 @@ int kernel_dynamic_walk(int id, int feet_x, int feet_y, int facing) {
 		kernel_dynamic_hot[id].feet_y = feet_y;
 		kernel_dynamic_hot[id].facing = (byte)facing;
 	}
-	return (id);
+	return id;
 }
 
 int kernel_dynamic_cursor(int id, int cursorNum) {
diff --git a/engines/mads/madsv2/core/keys.cpp b/engines/mads/madsv2/core/keys.cpp
index 75ec128d2b0..10e00aa6c15 100644
--- a/engines/mads/madsv2/core/keys.cpp
+++ b/engines/mads/madsv2/core/keys.cpp
@@ -101,7 +101,7 @@ int keys_insert_buffer(KeyPtr key_buf, int newchar, int before) {
 		key_buf->buf[before] = newchar;
 		return (before + 1);
 	} else {
-		return (false);
+		return false;
 	}
 }
 
@@ -145,7 +145,7 @@ int keys_fix_alt(int target) {
 		if ((target >= a_key) && (target <= z_key)) {
 			return (target + A_key - a_key);
 		} else {
-			return (target);
+			return target;
 		}
 	}
 }
diff --git a/engines/mads/madsv2/core/loader.cpp b/engines/mads/madsv2/core/loader.cpp
index 292dc99052b..ddea8c257e8 100644
--- a/engines/mads/madsv2/core/loader.cpp
+++ b/engines/mads/madsv2/core/loader.cpp
@@ -298,7 +298,7 @@ long loader_write(void *target, long record_size, long record_count, LoadHandle
 	int strategy;
 	int going = true;
 
-	if (!record_size) return (0);
+	if (!record_size) return 0;
 
 	total_size = record_size * record_count;
 
diff --git a/engines/mads/madsv2/core/mem.cpp b/engines/mads/madsv2/core/mem.cpp
index 6fd93ce7036..c6301d5a40d 100644
--- a/engines/mads/madsv2/core/mem.cpp
+++ b/engines/mads/madsv2/core/mem.cpp
@@ -60,7 +60,7 @@ void *mem_get_name(long size, const char *) {
 }
 
 void *mem_get(long size) {
-	return (mem_get_name(size, "$sys$"));
+	return mem_get_name(size, "$sys$");
 }
 
 bool mem_free(void *memory_block) {
diff --git a/engines/mads/madsv2/core/pal.cpp b/engines/mads/madsv2/core/pal.cpp
index 7e1d010cdd1..6f41a8b5cd9 100644
--- a/engines/mads/madsv2/core/pal.cpp
+++ b/engines/mads/madsv2/core/pal.cpp
@@ -258,7 +258,7 @@ static int pal_get_new_flag() {
 	}
 
 done:
-	return (return_code);
+	return return_code;
 }
 
 static int pal_free_colors(int *first_free) {
diff --git a/engines/mads/madsv2/core/popup.cpp b/engines/mads/madsv2/core/popup.cpp
index 81d206e5452..4bc5c62f7ba 100644
--- a/engines/mads/madsv2/core/popup.cpp
+++ b/engines/mads/madsv2/core/popup.cpp
@@ -1339,7 +1339,7 @@ static Popup *popup_activate(Popup *newpop) {
 	if (newpop != NULL) {
 		popup = newpop;
 	}
-	return (popup);
+	return popup;
 }
 
 /**
@@ -1461,7 +1461,7 @@ Popup *popup_dialog_destroy() {
 		mem_free(popup);
 	}
 
-	return (NULL);
+	return NULL;
 }
 
 static int extract_keystroke(char *string) {
@@ -1478,7 +1478,7 @@ static int extract_keystroke(char *string) {
 }
 
 static void *popup_heap(long mem_to_get) {
-	return (heap_get(&popup->heap, mem_to_get));
+	return heap_get(&popup->heap, mem_to_get);
 }
 
 static char *string_to_heap(char *string) {
@@ -1488,7 +1488,7 @@ static char *string_to_heap(char *string) {
 
 	Common::strcpy_s(mem_we_got, 65536, string);
 
-	return (mem_we_got);
+	return mem_we_got;
 }
 
 static void set_prompt(PopupItem *item, const char *string) {
@@ -1513,14 +1513,14 @@ static PopupItem *item_allocate(int can_be_default) {
 		popup->active_item = item;
 	}
 
-	return (item);
+	return item;
 }
 
 static PopupList *list_allocate() {
 	PopupList *list;
 
 	list = (PopupList *)popup_heap(sizeof(PopupList));
-	return (list);
+	return list;
 }
 
 static PopupBuffer *buffer_allocate(int size) {
@@ -1532,11 +1532,11 @@ static PopupBuffer *buffer_allocate(int size) {
 
 	*buffer->data = 0;
 
-	return (buffer);
+	return buffer;
 }
 
 static int popup_font_size(const char *string) {
-	return (font_string_width(box_param.font, string, box_param.font_spacing));
+	return font_string_width(box_param.font, string, box_param.font_spacing);
 }
 
 static void popup_y_placement(PopupItem *item, int y) {
@@ -1597,7 +1597,7 @@ static int popup_mouse_refresh() {
 	mouse_set_work_buffer(scr_main.data, video_x);
 	mouse_set_view_port_loc(0, 0, video_x - 1, video_y - 1);
 	mouse_set_view_port(0, 0);
-	return (mouse_refresh_view_port());
+	return mouse_refresh_view_port();
 }
 
 static void popup_mouse_refresh_2(int refresh) {
@@ -1803,7 +1803,7 @@ static int popup_in_item(PopupItem *item) {
 	in_item = ((mouse_x >= x) && (mouse_x <= x2) &&
 		(mouse_y >= y) && (mouse_y <= y2));
 
-	return (in_item);
+	return in_item;
 }
 
 static void popup_find_item() {
@@ -1877,7 +1877,7 @@ static int popup_button_x_size(PopupItem *item) {
 	size = popup_font_size(item->prompt);
 	size += 6 + 2;
 
-	return (size);
+	return size;
 }
 
 static int popup_button_y_size(PopupItem *item) {
@@ -2062,7 +2062,7 @@ static int popup_menu_x_size(PopupItem *item) {
 
 	item->sprite = middles;
 
-	return (size);
+	return size;
 }
 
 static int popup_menu_y_size(PopupItem *item) {
@@ -2283,7 +2283,7 @@ static int popup_savelist_x_size(PopupItem *item) {
 
 	list->list_xs = work_size;
 
-	return (size);
+	return size;
 }
 
 static int popup_savelist_y_size(PopupItem *item) {
@@ -2303,7 +2303,7 @@ static int popup_savelist_y_size(PopupItem *item) {
 
 	list->scroll.arrow_size = (box_param.font->max_y_size) + 2;
 
-	return (size);
+	return size;
 }
 
 static int popup_savelist_adjust(PopupItem *item) {
@@ -2337,7 +2337,7 @@ static char *popup_savelist_string(PopupItem *item, int element) {
 
 	text_locator = list->data + (list->element_offset * element);
 
-	return (text_locator);
+	return text_locator;
 }
 
 static int popup_savelist_vertical(PopupItem *item, int relative) {
@@ -2348,7 +2348,7 @@ static int popup_savelist_vertical(PopupItem *item, int relative) {
 
 	y = list->list_y + (list->list_ys * relative);
 
-	return (y);
+	return y;
 }
 
 static void popup_savelist_number_draw(PopupItem *item, int relative, int number) {
@@ -2977,7 +2977,7 @@ PopupItem *popup_button(const char *prompt, int x) {
 
 	if (first_button) popup->enter_item = item;
 
-	return (item);
+	return item;
 }
 
 PopupItem *popup_cancel_button(const char *prompt) {
@@ -3056,7 +3056,7 @@ PopupItem *popup_menu(const char *prompt,
 
 	popup_x_width_check(item);
 
-	return (item);
+	return item;
 }
 
 PopupItem *popup_message(const char *prompt, int x, int y) {
@@ -3109,7 +3109,7 @@ PopupItem *popup_sprite(SeriesPtr series, int sprite, int x, int y) {
 
 	popup_x_width_check(item);
 
-	return (item);
+	return item;
 }
 
 PopupItem *popup_savelist(char *data, char *empty_string,
@@ -3183,7 +3183,7 @@ PopupItem *popup_savelist(char *data, char *empty_string,
 		popup->string_item = item;
 	}
 
-	return (item);
+	return item;
 }
 
 PopupItem *popup_execute() {
diff --git a/engines/mads/madsv2/core/screen.cpp b/engines/mads/madsv2/core/screen.cpp
index 1ec791206f2..6133c8a0f44 100644
--- a/engines/mads/madsv2/core/screen.cpp
+++ b/engines/mads/madsv2/core/screen.cpp
@@ -150,7 +150,7 @@ short screen_show_wide(const char *outstring, short locx, short locy, short widt
 
 int screen_show(const char *outstring, int locx, int locy) {
 	locx = screen_put(outstring, screen_normal_color, screen_hilite_color, locx, locy);
-	return (locx);
+	return locx;
 }
 
 int screen_printf(int x, int y, const char *string, ...) {
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index e94384b541c..c4be471b50f 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -155,7 +155,7 @@ done:
 	if (load_handle.open) {
 		loader_close(&load_handle);
 	}
-	return (error_flag);
+	return error_flag;
 }
 
 


Commit: 91f72ae65b5f47e706a6b5f6ea7b5a20c045f85a
    https://github.com/scummvm/scummvm/commit/91f72ae65b5f47e706a6b5f6ea7b5a20c045f85a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:15+10:00

Commit Message:
MADS: NEBULAR: Fix highlighting of dynamic hotspots

Changed paths:
    engines/mads/madsv2/core/room.cpp


diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index aeaadb177d7..f3df503b77e 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -174,8 +174,11 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 	load_handle.open = false;
 
 	if (g_engine->getGameID() == GType_RexNebular) {
-		return RexNebular::room_load_rex(id, variant, base_path, picture, depth, walk, special, picMap, depthMap, picResource,
+		roomPtr = RexNebular::room_load_rex(id, variant, base_path, picture, depth, walk, special, picMap, depthMap, picResource,
 			depthResource, picture_ems_handle, depth_ems_handle, load_flags);
+		picture_map.total_x_size = picture->x;
+		picture_map.total_y_size = picture->y;
+		return roomPtr;
 	}
 
 	// Open the room data file


Commit: 68e06af64bd8d2108f94832f22c8bad50cf569b1
    https://github.com/scummvm/scummvm/commit/68e06af64bd8d2108f94832f22c8bad50cf569b1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:15+10:00

Commit Message:
MADS: NEBULAR: Display inventory item image in examine_object

Changed paths:
    engines/mads/madsv2/core/object.cpp


diff --git a/engines/mads/madsv2/core/object.cpp b/engines/mads/madsv2/core/object.cpp
index 8ee6cba6582..3d5c64265e3 100644
--- a/engines/mads/madsv2/core/object.cpp
+++ b/engines/mads/madsv2/core/object.cpp
@@ -214,6 +214,8 @@ int object_examine(int number, long message, int speech) {
 	int object_preserve_handle;
 	byte map[256];
 	RGBcolor top_eight[8];
+	SeriesPtr object_series = nullptr;
+	bool isRex = g_engine->getGameID() == GType_RexNebular;
 
 	// Wait cursor
 	cursor_id = 2;
@@ -244,10 +246,12 @@ int object_examine(int number, long message, int speech) {
 	cycling_save = cycling_active;
 	cycling_active = false;
 
-	// Get sprite series name
-	Common::strcpy_s(sprite_name, "*OB");
-	env_catint(sprite_name, number, 3);
-	Common::strcat_s(sprite_name, ".SS");
+	if (isRex) {
+		// Get sprite series name
+		Common::strcpy_s(sprite_name, "*OB");
+		env_catint(sprite_name, number, 3);
+		Common::strcat_s(sprite_name, ".SS");
+	}
 
 	// Prepare for flicker-free mouse updates
 	mouse_set_work_buffer(scr_main.data, video_x);
@@ -310,9 +314,27 @@ int object_examine(int number, long message, int speech) {
 	mcga_setpal(&master_palette);
 	matte_map_work_screen();
 
-	y_base = OBJECT_VIEW_OFFSET;
 
-	y_base += OBJECT_VIEW_OFFSET;
+	if (isRex) {
+		object_series = sprite_series_load(sprite_name, PAL_MAP_BACKGROUND);
+		mcga_setpal(&master_palette);
+		y_base = OBJECT_VIEW_OFFSET;
+
+		if (object_series) {
+			int x1 = 160 - object_series->index[0].xs / 2, y1 = 6;
+			int x2 = x1 + object_series->index[0].xs, y2 = y1 + object_series->index[0].ys;
+			sprite_draw(object_series, 1, &scr_main, x1, y1);
+			video_update(&scr_main, x1, y1, x1, y1, x2, y2);
+
+			y_base += object_series->index[0].ys;
+
+			if ((byte *)object_series != sprite_force_memory)
+				mem_free(object_series);
+		}
+
+		y_base += OBJECT_VIEW_OFFSET;
+		text_default_y = y_base;
+	}
 
 	if (message) {
 		text_saves_screen = false;
@@ -337,12 +359,8 @@ int object_examine(int number, long message, int speech) {
 		keys_get();
 	}
 
-	// Flush object from memory
-	// if (object_series != (SeriesPtr) sprite_force_memory) mem_free (object_series);
-	// If we saved the work buffer in EMS, we can now fade back to the
-	// original screen.
+	// If we saved the work buffer in EMS, we can now fade back to the original screen.
 	if (object_preserve_handle != BUFFER_NOT_PRESERVED) {
-
 		// Restore a copy of the work screen
 		matte_map_work_screen();
 


Commit: b57f9cb6140abca9bdc215728ce553f7f49c6463
    https://github.com/scummvm/scummvm/commit/b57f9cb6140abca9bdc215728ce553f7f49c6463
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:15+10:00

Commit Message:
MADS: NEBULAR: Fix quote when entering room 110

Changed paths:
    engines/mads/madsv2/nebular/rooms/room110.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room110.cpp b/engines/mads/madsv2/nebular/rooms/room110.cpp
index 28742960782..a1b72439af8 100644
--- a/engines/mads/madsv2/nebular/rooms/room110.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room110.cpp
@@ -49,6 +49,7 @@ static void room_110_init() {
 
 	if (_scene->_priorSceneId == 109) {
 		_game._player._playerPos = Common::Point(59, 71);
+		_game._player._facing = FACING_EAST;
 
 		_globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
@@ -74,10 +75,10 @@ static void room_110_init() {
 	}
 
 	section_1_music();
-	_game.loadQuoteSet(0x59, 0);
+	_game.loadQuoteSet(89, 0);
 
 	if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId == 109))
-		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(109));
+		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(89));
 }
 
 static void room_110_daemon() {


Commit: 1d073673d414b613c69b8a91d980fc37a13b9c10
    https://github.com/scummvm/scummvm/commit/1d073673d414b613c69b8a91d980fc37a13b9c10
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:16+10:00

Commit Message:
MADS: NEBULAR: Fix sprite unload order error in room 209

Changed paths:
    engines/mads/madsv2/nebular/rooms/room209.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index c91b340cf47..25b13da5f70 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -969,6 +969,7 @@ static void handleDodge() {
 }
 
 static void room_209_init() {
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMBD_2");
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1));
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', -1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
@@ -978,7 +979,6 @@ static void room_209_init() {
 	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('m', 3));
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('m', 6));
 	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('m', 8));
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMBD_2");
 
 	_game.loadQuoteSet(0x82, 0x83, 0x84, 0x9C, 0x97, 0x95, 0x99, 0x9E, 0x98, 0x9B, 0xA0, 0x96, 0x9F,
 		0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x91, 0x92, 0x93, 0x94, 0x89, 0x85, 0x8A, 0x86, 0x87, 0x88, 0);


Commit: 39ce646896e20e056980e121cbc4f45cc6a5c3b8
    https://github.com/scummvm/scummvm/commit/39ce646896e20e056980e121cbc4f45cc6a5c3b8
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:16+10:00

Commit Message:
MADS: NEBULAR: Fix native woman animation disappearing in room 210

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index aa6f876a853..af4ebdc9b57 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -189,7 +189,7 @@ long Scene::Animation::getNextFrameTimer() {
 }
 
 void Scene::Animation::setCurrentFrame(int frameNum) {
-	kernel_anim[_id].frame = frameNum;
+	kernel_reset_animation(_id, frameNum);
 }
 
 void Scene::Animation::resetSpriteSetsCount() {


Commit: 698ffdb80197501af2403d33953443eeaa81a6ba
    https://github.com/scummvm/scummvm/commit/698ffdb80197501af2403d33953443eeaa81a6ba
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:17+10:00

Commit Message:
MADS: NEBULAR: Further animation thunks fixes

Changed paths:
    engines/mads/madsv2/nebular/rooms/room511.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room511.cpp b/engines/mads/madsv2/nebular/rooms/room511.cpp
index fdf21457e8f..e3121f98724 100644
--- a/engines/mads/madsv2/nebular/rooms/room511.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room511.cpp
@@ -299,10 +299,6 @@ static void room_511_parser() {
 						local._lineMoving = true;
 						_globals[kLineStatus] = 3;
 						_game._player._stepEnabled = true;
-
-						if (_scene->_animation[0])
-							_scene->_animation[0]->eraseSprites();
-						_game._player.update();
 					}
 				}
 			}
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index af4ebdc9b57..ffa20a57413 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -193,11 +193,7 @@ void Scene::Animation::setCurrentFrame(int frameNum) {
 }
 
 void Scene::Animation::resetSpriteSetsCount() {
-	error("TODO: resetSpriteSetsCount");
-}
-
-void Scene::Animation::eraseSprites() {
-	error("TODO: eraseSprites");
+	kernel_anim[_id].anim->num_series = 0;
 }
 
 int Scene::DynamicHotspots::add(int vocab_id, int verb_id, int auto_sequence, const Common::Rect &r) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 5e1e562e725..daff4defdf8 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -212,7 +212,6 @@ struct Scene {
 		long getNextFrameTimer();
 		void setCurrentFrame(int frameNum);
 		void resetSpriteSetsCount();
-		void eraseSprites();
 	};
 	struct Animations {
 		Animation operator[](int anim_id) {


Commit: 6a2c55328a385488653aca61e18dd69089937b1a
    https://github.com/scummvm/scummvm/commit/6a2c55328a385488653aca61e18dd69089937b1a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:17+10:00

Commit Message:
MADS: NEBULAR: Fix conv quotes loading and room 210 long line splitting

Changed paths:
    engines/mads/madsv2/nebular/rooms/dialog.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/dialog.cpp b/engines/mads/madsv2/nebular/rooms/dialog.cpp
index b68f19979ff..6490a30aa8f 100644
--- a/engines/mads/madsv2/nebular/rooms/dialog.cpp
+++ b/engines/mads/madsv2/nebular/rooms/dialog.cpp
@@ -39,7 +39,7 @@ void Dialog::setup(int globalId, ...) {
 
 	int quoteId = va_arg(va, int);
 	while (quoteId > 0) {
-		_quotes[++_count] = quoteId;
+		_quotes[_count++] = quoteId;
 		quoteId = va_arg(va, int);
 	}
 	va_end(va);
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index f43c4d46c3b..fc9a3ffa4dc 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -551,7 +551,7 @@ static void handleConversations() {
 		_game._player._stepEnabled = false;
 		const char *curQuote = _game.getQuote(_action._activeAction._verbId);
 		if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
-			static char line1[34], line2[34];
+			static char line1[40], line2[40];
 			_game.splitQuote(curQuote, line1, line2);
 			Common::strcpy_s(local._subQuote2, line2);
 			_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, line1);


Commit: b302ddc73475dfb43fc0f4cce4b2a6bcee40ea7c
    https://github.com/scummvm/scummvm/commit/b302ddc73475dfb43fc0f4cce4b2a6bcee40ea7c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:18+10:00

Commit Message:
MADS: NEBULAR: Fix placement of conv text

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index ffa20a57413..6a820a694ba 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -236,7 +236,7 @@ int Scene::KernelMessages::TalkFont::getWidth(const Common::String &message, int
 
 int Scene::KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags, int endTrigger,
 		uint32 timeout, const char *msg) {
-	return kernel_message_add(const_cast<char *>(msg), pt.x, pt.y, fontColor, timeout, endTrigger, 0);
+	return kernel_message_add(const_cast<char *>(msg), pt.x, pt.y, fontColor, timeout, endTrigger, flags);
 }
 
 int Scene::KernelMessages::addQuote(int quoteId, int endTrigger, uint32 timeout) {


Commit: 811df6db53f3428242fc4bbc2bc63562c345fc84
    https://github.com/scummvm/scummvm/commit/811df6db53f3428242fc4bbc2bc63562c345fc84
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:18+10:00

Commit Message:
MADS: NEBULAR: Implementation of Rex version of special walk areas

In the later games, scr_special is filled with 1 bit per pixel
(8 per byte) indications of whether a pixel in the room is a
special area. However in Rex, for unpacked rooms, the special
is actually 3 bits (4 to 6) of the depth surface. So just like
how we already had code to split the depth data into scr_depth
and scr_depth, this commit now also populates scr_special as
well.

The commit also does some renaming of the nebular/extra.cpp
functions for clarity on what function they replace, and a
new buffer_legal function is introduced for tracing walk paths
to see if a special area is being intersected.

Changed paths:
    engines/mads/madsv2/core/attr.cpp
    engines/mads/madsv2/core/attr.h
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/player.cpp
    engines/mads/madsv2/core/room.cpp
    engines/mads/madsv2/engine.cpp
    engines/mads/madsv2/nebular/extra.cpp
    engines/mads/madsv2/nebular/extra.h
    engines/mads/madsv2/nebular/main_menu.cpp


diff --git a/engines/mads/madsv2/core/attr.cpp b/engines/mads/madsv2/core/attr.cpp
index 1c0654ec439..4ba1b8b3a9f 100644
--- a/engines/mads/madsv2/core/attr.cpp
+++ b/engines/mads/madsv2/core/attr.cpp
@@ -118,6 +118,18 @@ done:
 	return (int)special_code;
 }
 
+int rex_attr_special(Buffer *special, int x, int y) {
+	assert(special);
+	if (x < 0 || y < 0 || (x / 2) >= special->x || y >= special->y)
+		return 0;
+
+	byte *scan = buffer_pointer(special, (x >> 1), y);
+	int shift_count = (byte)((x & 1) ? 0 : 4);
+	int special_code = (byte)((*scan >> shift_count) & 0x0f);
+
+	return special_code;
+}
+
 int attr_load(char *base_name,
 	int item_type,
 	int variant,
diff --git a/engines/mads/madsv2/core/attr.h b/engines/mads/madsv2/core/attr.h
index ccc7a57c544..1f5c70c32f6 100644
--- a/engines/mads/madsv2/core/attr.h
+++ b/engines/mads/madsv2/core/attr.h
@@ -43,6 +43,7 @@ extern int rex_attr_depth(Buffer *depth, int x, int y);
 extern int attr_depth(TileMapHeader *depth_map, int x, int y);
 
 extern int attr_special(Buffer *attr, int x, int y);
+extern int rex_attr_special(Buffer *special, int x, int y);
 
 extern int attr_load(char *base_name, int item_type, int variant,
 	Buffer *target, int size_x, int size_y);
diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index e0f352057e3..47a436d9a40 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1422,7 +1422,9 @@ void game_control() {
 
 			player.walker_been_visible = player.walker_visible;
 
-			player.special_code = attr_special(&scr_special, player.x, player.y);
+			player.special_code = (g_engine->getGameID() == GType_RexNebular) ?
+			rex_attr_special(&scr_special, player.x, player.y) :
+			attr_special(&scr_special, player.x, player.y);
 
 			// Reset player clock to make sure walker appears in first frame
 			player.clock = kernel.clock;
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 109c20c2bc8..9a29d4a8b44 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2556,7 +2556,7 @@ void kernel_load_variant(int variant) {
 	room_variant = variant;
 
 	if (g_engine->getGameID() == GType_RexNebular) {
-		RexNebular::room_load_depth(nullptr, &scr_depth, &scr_walk, room, variant, room->format == 2);
+		RexNebular::kernel_load_variant(nullptr, &scr_depth, &scr_walk, &scr_special, room, variant, room->format == 2);
 		matte_refresh_work();
 
 	} else {
diff --git a/engines/mads/madsv2/core/player.cpp b/engines/mads/madsv2/core/player.cpp
index c88277a49b3..6018dbc8173 100644
--- a/engines/mads/madsv2/core/player.cpp
+++ b/engines/mads/madsv2/core/player.cpp
@@ -34,6 +34,7 @@
 #include "mads/madsv2/core/himem.h"
 #include "mads/madsv2/core/object.h"
 #include "mads/madsv2/engine.h"
+#include "mads/madsv2/nebular/extra.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -949,9 +950,15 @@ void player_start_walking(int walk_x, int walk_y, int walk_facing) {
 		temp_stack_pointer--;
 		unto_x = room->rail[rail_solution_stack[temp_stack_pointer]].x;
 		unto_y = room->rail[rail_solution_stack[temp_stack_pointer]].y;
-		player.next_special_code = (buffer_legal(scr_special, room->xs,
-			from_x, from_y,
-			unto_x, unto_y) != LEGAL);
+
+		if (g_engine->getGameID() == GType_RexNebular) {
+			player.next_special_code = RexNebular::buffer_legal(scr_special, room->xs,
+				from_x, from_y, unto_x, unto_y);
+		} else {
+			player.next_special_code = buffer_legal(scr_special, room->xs,
+				from_x, from_y, unto_x, unto_y) != LEGAL;
+		}
+
 		from_x = unto_x;
 		from_y = unto_y;
 	}
diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index f3df503b77e..b9b3d6a7b88 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -174,7 +174,7 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 	load_handle.open = false;
 
 	if (g_engine->getGameID() == GType_RexNebular) {
-		roomPtr = RexNebular::room_load_rex(id, variant, base_path, picture, depth, walk, special, picMap, depthMap, picResource,
+		roomPtr = RexNebular::room_load(id, variant, base_path, picture, depth, walk, special, picMap, depthMap, picResource,
 			depthResource, picture_ems_handle, depth_ems_handle, load_flags);
 		picture_map.total_x_size = picture->x;
 		picture_map.total_y_size = picture->y;
diff --git a/engines/mads/madsv2/engine.cpp b/engines/mads/madsv2/engine.cpp
index bd16b136cf2..c5ab195fc12 100644
--- a/engines/mads/madsv2/engine.cpp
+++ b/engines/mads/madsv2/engine.cpp
@@ -488,7 +488,9 @@ void MADSV2Engine::player_keep_walking() {
 				if (!player.walk_anywhere && !(player.walk_off_edge || player.walk_off_edge_to_room)) {
 					walk_code |= attr_walk(&scr_walk, at_x, at_y);
 					if (!player.special_code) {
-						player.special_code = attr_special(&scr_special, at_x, at_y);
+						player.special_code = (g_engine->getGameID() == GType_RexNebular) ?
+							rex_attr_special(&scr_special, at_x, at_y) :
+							attr_special(&scr_special, at_x, at_y);
 					}
 				}
 
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index c4be471b50f..371edb977bd 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -187,8 +187,22 @@ static void room_set_depth_nibble(Buffer *depth, int x, int y, byte depthVal) {
 		*scan = (byte)((*scan & 0x0f) | ((depthVal & 0x0f) << 4));
 }
 
-int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_info,
-		int variant, bool packedFormat) {
+// Sets the special zone nibble for pixel (x, y) in a nibble-packed (2 pixels/byte, even x in
+// the high nibble) special surface, matching the layout rex_attr_special() and buffer_legal()
+// (the RexNebular version, below) read. No-op if special is not being loaded.
+static void room_set_special_nibble(Buffer *special, int x, int y, byte specialVal) {
+	if (special == nullptr || special->data == nullptr)
+		return;
+
+	byte *scan = buffer_pointer(special, x >> 1, y);
+	if (x & 1)
+		*scan = (byte)((*scan & 0xf0) | (specialVal & 0x0f));
+	else
+		*scan = (byte)((*scan & 0x0f) | ((specialVal & 0x0f) << 4));
+}
+
+int kernel_load_variant(Load *load_handle, Buffer *depth, Buffer *walk, Buffer *special,
+		Room *room_info, int variant, bool packedFormat) {
 	char filename[80];
 	Load load;
 
@@ -213,8 +227,11 @@ int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_i
 	// packed (format == 2) rooms, each source byte represents a run of *groups* of 4 pixels
 	// (2 bits each); for unpacked rooms, each source byte represents a run of single pixels.
 	// In both cases, the byte's high bit(s) flag whether the pixel is walkable, and the
-	// remaining bit(s) give its depth. The results are unpacked into the standard walk
-	// (1 bit/pixel) and depth (4 bits/pixel) surface formats used throughout the engine.
+	// remaining bit(s) give its depth. Unpacked rooms additionally reserve bits 4-6
+	// (ATTR_SPECIAL_MASK) for a special trigger zone code; packed rooms have no bits to
+	// spare for this and never populate special. The results are unpacked into the standard
+	// walk (1 bit/pixel), depth (4 bits/pixel), and special (4 bits/pixel) surface formats
+	// used throughout the engine.
 	LoaderReadStream src(load_handle, load_handle->pack.strategy[load_handle->pack_list_marker].size);
 
 	runLength = src.readByte();
@@ -238,11 +255,13 @@ int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_i
 		} else {
 			bool walkable = (runValue & ATTR_WALK_MASK) != 0;
 			byte depthVal = runValue & ATTR_DEPTH_MASK;
+			byte specialVal = (byte)((runValue & ATTR_SPECIAL_MASK) >> 4);
 
 			for (; runLength > 0 && pixelIndex < totalPixels; --runLength) {
 				int x = pixelIndex % width, y = pixelIndex / width;
 				room_set_walk_bit(walk, x, y, walkable);
 				room_set_depth_nibble(depth, x, y, depthVal);
+				room_set_special_nibble(special, x, y, specialVal);
 				++pixelIndex;
 			}
 		}
@@ -253,10 +272,20 @@ int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_i
 	if (!hasLoad)
 		loader_close(&load);
 
+	// Mark these surfaces as owned by the currently loaded room/variant, so that
+	// room_dump_attribute() (see core/room.cpp) frees and resets them before the next
+	// room or variant is loaded, instead of leaving stale data behind.
+	if (depth != nullptr)
+		room_loaded_depth = true;
+	if (walk != nullptr)
+		room_loaded_walk = true;
+	if (special != nullptr)
+		room_loaded_special = true;
+
 	return 0;
 }
 
-RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *picture,
+RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 	Buffer *depth, Buffer *walk, Buffer *special, TileMapHeader *picMap,
 	TileMapHeader *depthMap, TileResource *picResource, TileResource *depthResource,
 	int picture_ems_handle, int depth_ems_handle, int load_flags) {
@@ -314,6 +343,7 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 	roomPtr->num_hotspots = 0;
 	roomPtr->num_rails = roomfile.num_rails;
 	roomPtr->room_id = id;
+	roomPtr->format = (byte)roomfile.format;
 	roomPtr->xs = roomfile.xs;
 	roomPtr->ys = roomfile.ys;
 	roomPtr->front_y = roomfile.front_y;
@@ -336,7 +366,9 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 	assert(picture->data);
 
 	// scr_depth (nibble-packed, 2 pixels/byte) and scr_walk (bit-packed, 8 pixels/byte) always
-	// use the same layout as every other game, regardless of the source room's packed format
+	// use the same layout as every other game, regardless of the source room's packed format.
+	// scr_special is likewise nibble-packed, matching scr_depth's layout, since it holds a
+	// 0-7 special zone code per pixel rather than a single boolean bit.
 	if (!depth->data)
 		buffer_init(depth, ((width - 1) >> 1) + 1, height);
 	assert(depth->data);
@@ -347,7 +379,13 @@ RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *pictur
 		assert(walk->data);
 	}
 
-	if (room_load_depth(&load_handle, depth, walk, roomPtr, variant, roomfile.format == 2))
+	if (special != nullptr) {
+		if (!special->data)
+			buffer_init(special, ((width - 1) >> 1) + 1, height);
+		assert(special->data);
+	}
+
+	if (kernel_load_variant(&load_handle, depth, walk, special, roomPtr, variant, roomfile.format == 2))
 		goto error;
 
 	loader_close(&load_handle);
@@ -399,6 +437,67 @@ done:
 	return roomPtr;
 }
 
+int buffer_legal(const Buffer &special, int orig_wrap,
+		int x1, int y1, int x2, int y2) {
+	if (special.data == nullptr)
+		return 0;
+	if (x1 < 0 || x2 < 0 || y1 < 0 || y2 < 0)
+		return 0;
+	if (x1 >= orig_wrap || x2 >= orig_wrap)
+		return 0;
+	if (y1 >= special.y || y2 >= special.y)
+		return 0;
+
+	int delta_y = y2 - y1;
+	int y_sign = special.x;
+	if (delta_y < 0) {
+		delta_y = -delta_y;
+		y_sign = -y_sign;
+	}
+
+	int delta_x = x2 - x1;
+	int x_sign = 1;
+	int dAccum = 0;
+
+	if (delta_x < 0) {
+		delta_x = -delta_x;
+		x_sign = -1;
+		dAccum = MIN(delta_x, delta_y);
+	}
+
+	int x_count = delta_x + 1;
+	int y_count = delta_y + 1;
+
+	const byte *ptr = special.data + y1 * special.x + (x1 >> 1);
+	uint nibble_pos = 2 - (x1 & 1);
+
+	for (int col = x_count; col > 0; col--) {
+		dAccum += y_count;
+
+		byte code = (*ptr >> ((nibble_pos - 1) * 4)) & 0x0f;
+
+		while (true) {
+			if (code != 0)
+				return code;
+
+			if (dAccum < x_count)
+				break;
+
+			dAccum -= x_count;
+			ptr += y_sign;
+			code = (*ptr >> ((nibble_pos - 1) * 4)) & 0x0f;
+		}
+
+		// Advance one pixel in X
+		uint new_np = ((nibble_pos - x_sign - 1) & 1) + 1;
+		if ((nibble_pos - x_sign - 1) & ~1)
+			ptr += x_sign;
+		nibble_pos = new_np;
+	}
+
+	return 0;
+}
+
 } // namespace RexNebular
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/nebular/extra.h b/engines/mads/madsv2/nebular/extra.h
index efe054f3113..1a7bd64c14d 100644
--- a/engines/mads/madsv2/nebular/extra.h
+++ b/engines/mads/madsv2/nebular/extra.h
@@ -28,12 +28,41 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
-extern RoomPtr room_load_rex(int id, int variant, const char *base_path, Buffer *picture,
+/**
+ * Rex Nebular's game-specific room loader, called from room_load() (see core/room.h) in
+ * place of the generic loader used by every other game. Reads the room's .DAT header,
+ * loads its background art into picture, its sprite series, and stamps the room's images
+ * onto picture, then defers to kernel_load_variant() to populate depth, walk, and special
+ * for the room's default variant.
+ */
+extern RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 	Buffer *depth, Buffer *walk, Buffer *special, TileMapHeader *picMap,
 	TileMapHeader *depthMap, TileResource *picResource, TileResource *depthResource,
 	int picture_ems_handle, int depth_ems_handle, int load_flags);
-extern int room_load_depth(Load *load_handle, Buffer *depth, Buffer *walk, Room *room_info,
-	int variant, bool packedFormat);
+
+/**
+ * Rex Nebular's version of the default kernel_load_variant() (see core/kernel.h), called
+ * both from room_load() and directly whenever the active room switches to a different
+ * attribute variant. Reads the variant's run-length encoded depth/walk/special data from
+ * the room's .DAT file and unpacks it into depth (nibble-packed, 2 pixels/byte), walk
+ * (bit-packed, 8 pixels/byte), and special (nibble-packed, 2 pixels/byte) surfaces. Any
+ * of depth, walk, or special may be null to skip populating that surface. Packed-format
+ * rooms (packedFormat == true) have no spare bits to encode a special zone code, so
+ * special is left untouched in that case.
+ */
+extern int kernel_load_variant(Load *load_handle, Buffer *depth, Buffer *walk, Buffer *special,
+	Room *room_info, int variant, bool packedFormat);
+
+/**
+ * Rex Nebular's version of buffer_legal() (see core/buffer.h), called from
+ * player_start_walking() to scan each rail segment of a walk path for a special
+ * trigger zone. Unlike the generic engine's boolean, bit-packed special surface,
+ * Rex's special surface is nibble-packed (2 pixels/byte, matching the depth buffer's
+ * layout) and holds a 0-7 special zone code per pixel (see ATTR_SPECIAL_MASK). Traces
+ * a Bresenham line from (x1, y1) to (x2, y2) using the same algorithm as buffer_legal(),
+ * and returns the first non-zero code the line crosses, or 0 if the path is clear.
+ */
+extern int buffer_legal(const Buffer &special, int orig_wrap, int x1, int y1, int x2, int y2);
 
 } // namespace RexNebular
 } // namespace MADSV2
diff --git a/engines/mads/madsv2/nebular/main_menu.cpp b/engines/mads/madsv2/nebular/main_menu.cpp
index 4183e910a28..6587004941d 100644
--- a/engines/mads/madsv2/nebular/main_menu.cpp
+++ b/engines/mads/madsv2/nebular/main_menu.cpp
@@ -158,7 +158,7 @@ static void load_title_screen() {
 	mouse_show();
 
 	// Load the title screen room
-	room = RexNebular::room_load_rex(ROOM_ID, 0, nullptr, &scr_orig, &scr_depth, nullptr, nullptr, nullptr,
+	room = RexNebular::room_load(ROOM_ID, 0, nullptr, &scr_orig, &scr_depth, nullptr, nullptr, nullptr,
 		nullptr, nullptr, nullptr, 0, 0, 0);
 	if (!room)
 		error("Could not load title screen room %d", ROOM_ID);


Commit: 8ac7e591f0dda63f58bc685fae0f6437522516f2
    https://github.com/scummvm/scummvm/commit/8ac7e591f0dda63f58bc685fae0f6437522516f2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:19+10:00

Commit Message:
MADS: NEBULAR: Remove redundant assignment of null to current animation

Changed paths:
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index fc9a3ffa4dc..420538e0057 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -341,7 +341,6 @@ static void setDialogNode(int node) {
 			_vm->_palette->lock();
 			_scene->_kernelMessages.reset();
 			_scene->freeAnimation();
-			_scene->_animation[0] = nullptr;
 			_scene->resetScene();
 
 			_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 6a820a694ba..fc9ca5ea703 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -172,10 +172,6 @@ char *Resources::formatAAName(int num) {
 Scene::Animation::Animation(int anim_id) : _id(anim_id), _currentFrame(kernel_anim[anim_id].frame) {
 }
 
-Scene::Animation &Scene::Animation::operator=(std::nullptr_t) {
-	error("TODO: Animation operator=");
-}
-
 int Scene::Animation::getCurrentFrame() const {
 	return _currentFrame;
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index daff4defdf8..867511bb891 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -204,7 +204,6 @@ struct Scene {
 		explicit operator bool() const {
 			return kernel_anim[_id].anim != nullptr;
 		}
-		Animation &operator=(std::nullptr_t);
 
 
 		int getCurrentFrame() const;


Commit: ec0f8a7c64b05d74f6dc4b4c6e2f3c876c88122e
    https://github.com/scummvm/scummvm/commit/ec0f8a7c64b05d74f6dc4b4c6e2f3c876c88122e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:19+10:00

Commit Message:
MADS: NEBULAR: Fix partially transparent text in room 216 cutscene

Changed paths:
    engines/mads/madsv2/core/kernel.h


diff --git a/engines/mads/madsv2/core/kernel.h b/engines/mads/madsv2/core/kernel.h
index b4dc7b5636d..81421a087a3 100644
--- a/engines/mads/madsv2/core/kernel.h
+++ b/engines/mads/madsv2/core/kernel.h
@@ -47,7 +47,8 @@ namespace MADSV2 {
 
 #define KERNEL_MESSAGE_COLOR_BASE       16    /* 1st color to use for messages          */
 #define KERNEL_MESSAGE_COLOR_BASE_2     252   /* 1st color to use for second message    */
-#define KERNEL_MESSAGE_COLOR_BASE_3     254   /* 1st color to use for third  message    */
+/* 1st color to use for third  message    */
+#define KERNEL_MESSAGE_COLOR_BASE_3     (g_engine->getGameID() == GType_RexNebular ? 250 : 254)
 
 #define KERNEL_OBJECT_COLOR_BASE        246   /* 1st color to use for rotating objects  */
 


Commit: bb65b5031039c907eff9d20731cca6a19401f4f1
    https://github.com/scummvm/scummvm/commit/bb65b5031039c907eff9d20731cca6a19401f4f1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:21+10:00

Commit Message:
MADS: NEBULAR: Change words.h constants to standard 'words_' constants

Changed paths:
    engines/mads/madsv2/nebular/mads/words.h
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/rooms/room101.cpp
    engines/mads/madsv2/nebular/rooms/room102.cpp
    engines/mads/madsv2/nebular/rooms/room103.cpp
    engines/mads/madsv2/nebular/rooms/room104.cpp
    engines/mads/madsv2/nebular/rooms/room105.cpp
    engines/mads/madsv2/nebular/rooms/room106.cpp
    engines/mads/madsv2/nebular/rooms/room107.cpp
    engines/mads/madsv2/nebular/rooms/room108.cpp
    engines/mads/madsv2/nebular/rooms/room109.cpp
    engines/mads/madsv2/nebular/rooms/room110.cpp
    engines/mads/madsv2/nebular/rooms/room111.cpp
    engines/mads/madsv2/nebular/rooms/room201.cpp
    engines/mads/madsv2/nebular/rooms/room202.cpp
    engines/mads/madsv2/nebular/rooms/room203.cpp
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room208.cpp
    engines/mads/madsv2/nebular/rooms/room209.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room211.cpp
    engines/mads/madsv2/nebular/rooms/room212.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp
    engines/mads/madsv2/nebular/rooms/room214.cpp
    engines/mads/madsv2/nebular/rooms/room215.cpp
    engines/mads/madsv2/nebular/rooms/room307.cpp
    engines/mads/madsv2/nebular/rooms/room309.cpp
    engines/mads/madsv2/nebular/rooms/room311.cpp
    engines/mads/madsv2/nebular/rooms/room313.cpp
    engines/mads/madsv2/nebular/rooms/room316.cpp
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room319.cpp
    engines/mads/madsv2/nebular/rooms/room320.cpp
    engines/mads/madsv2/nebular/rooms/room322.cpp
    engines/mads/madsv2/nebular/rooms/room351.cpp
    engines/mads/madsv2/nebular/rooms/room352.cpp
    engines/mads/madsv2/nebular/rooms/room353.cpp
    engines/mads/madsv2/nebular/rooms/room354.cpp
    engines/mads/madsv2/nebular/rooms/room357.cpp
    engines/mads/madsv2/nebular/rooms/room358.cpp
    engines/mads/madsv2/nebular/rooms/room359.cpp
    engines/mads/madsv2/nebular/rooms/room360.cpp
    engines/mads/madsv2/nebular/rooms/room361.cpp
    engines/mads/madsv2/nebular/rooms/room366.cpp
    engines/mads/madsv2/nebular/rooms/room387.cpp
    engines/mads/madsv2/nebular/rooms/room388.cpp
    engines/mads/madsv2/nebular/rooms/room389.cpp
    engines/mads/madsv2/nebular/rooms/room390.cpp
    engines/mads/madsv2/nebular/rooms/room391.cpp
    engines/mads/madsv2/nebular/rooms/room399.cpp
    engines/mads/madsv2/nebular/rooms/room401.cpp
    engines/mads/madsv2/nebular/rooms/room402.cpp
    engines/mads/madsv2/nebular/rooms/room405.cpp
    engines/mads/madsv2/nebular/rooms/room406.cpp
    engines/mads/madsv2/nebular/rooms/room407.cpp
    engines/mads/madsv2/nebular/rooms/room408.cpp
    engines/mads/madsv2/nebular/rooms/room409.cpp
    engines/mads/madsv2/nebular/rooms/room410.cpp
    engines/mads/madsv2/nebular/rooms/room411.cpp
    engines/mads/madsv2/nebular/rooms/room413.cpp
    engines/mads/madsv2/nebular/rooms/room501.cpp
    engines/mads/madsv2/nebular/rooms/room502.cpp
    engines/mads/madsv2/nebular/rooms/room503.cpp
    engines/mads/madsv2/nebular/rooms/room504.cpp
    engines/mads/madsv2/nebular/rooms/room505.cpp
    engines/mads/madsv2/nebular/rooms/room506.cpp
    engines/mads/madsv2/nebular/rooms/room507.cpp
    engines/mads/madsv2/nebular/rooms/room508.cpp
    engines/mads/madsv2/nebular/rooms/room511.cpp
    engines/mads/madsv2/nebular/rooms/room512.cpp
    engines/mads/madsv2/nebular/rooms/room513.cpp
    engines/mads/madsv2/nebular/rooms/room551.cpp
    engines/mads/madsv2/nebular/rooms/room601.cpp
    engines/mads/madsv2/nebular/rooms/room602.cpp
    engines/mads/madsv2/nebular/rooms/room603.cpp
    engines/mads/madsv2/nebular/rooms/room604.cpp
    engines/mads/madsv2/nebular/rooms/room607.cpp
    engines/mads/madsv2/nebular/rooms/room608.cpp
    engines/mads/madsv2/nebular/rooms/room609.cpp
    engines/mads/madsv2/nebular/rooms/room610.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp
    engines/mads/madsv2/nebular/rooms/room612.cpp
    engines/mads/madsv2/nebular/rooms/room701.cpp
    engines/mads/madsv2/nebular/rooms/room702.cpp
    engines/mads/madsv2/nebular/rooms/room703.cpp
    engines/mads/madsv2/nebular/rooms/room704.cpp
    engines/mads/madsv2/nebular/rooms/room705.cpp
    engines/mads/madsv2/nebular/rooms/room706.cpp
    engines/mads/madsv2/nebular/rooms/room707.cpp
    engines/mads/madsv2/nebular/rooms/room710.cpp
    engines/mads/madsv2/nebular/rooms/room751.cpp
    engines/mads/madsv2/nebular/rooms/room752.cpp
    engines/mads/madsv2/nebular/rooms/room801.cpp
    engines/mads/madsv2/nebular/rooms/room802.cpp
    engines/mads/madsv2/nebular/rooms/room803.cpp
    engines/mads/madsv2/nebular/rooms/room804.cpp
    engines/mads/madsv2/nebular/rooms/room805.cpp
    engines/mads/madsv2/nebular/rooms/room807.cpp
    engines/mads/madsv2/nebular/rooms/room808.cpp
    engines/mads/madsv2/nebular/rooms/teleporter.cpp


diff --git a/engines/mads/madsv2/nebular/mads/words.h b/engines/mads/madsv2/nebular/mads/words.h
index ecbe5a6110b..35464e50b30 100644
--- a/engines/mads/madsv2/nebular/mads/words.h
+++ b/engines/mads/madsv2/nebular/mads/words.h
@@ -29,1315 +29,1206 @@ namespace MADSV2 {
 namespace RexNebular {
 
 enum {
-	VERB_NONE = 0,
-	VERB_LOOK = 3,
-	VERB_TAKE = 4,
-	VERB_PUSH = 5,
-	VERB_OPEN = 6,
-	VERB_PUT = 7,
-	VERB_TALKTO = 8,
-	VERB_GIVE = 9,
-	VERB_PULL = 10,
-	VERB_CLOSE = 11,
-	VERB_THROW = 12,
-	VERB_WALKTO = 13,
-	VERB_ACTIVATE = 0x00E,
-	VERB_ATTACH = 0x019,
-	VERB_BREAK = 0x032,
-	VERB_BREATHE_AIR = 0x033,
-	VERB_CAST = 0x03D,
-	VERB_CLIMB_DOWN = 0x04E,
-	VERB_CLIMB_THROUGH = 0x04F,
-	VERB_CLIMB_UP = 0x050,
-	VERB_CUT = 0x061,
-	VERB_DAMPEN = 0x064,
-	VERB_DISASSEMBLE = 0x06C,
-	VERB_DIVE_INTO = 0x06D,
-	VERB_DRINK = 0x072,
-	VERB_EAT = 0x075,
-	VERB_EJECT = 0x076,
-	VERB_EMPTY = 0x077,
-	VERB_EXAMINE = 0x07D,
-	VERB_FILL = 0x085,
-	VERB_FONDLE = 0x08C,
-	VERB_HOSE_DOWN = 0x0A6,
-	VERB_IGNITE = 0x0B4,
-	VERB_INFLATE = 0x0B5,
-	VERB_INSERT = 0x0B6,
-	VERB_INSPECT = 0x0B7,
-	VERB_GNAW_ON = 0x098,
-	VERB_GORGE_ON = 0x099,
-	VERB_HURL = 0x0A9,
-	VERB_LICK = 0x0CB,
-	VERB_LOOK_AT = 0x0D1,
-	VERB_LOOK_IN = 0x0D2,
-	VERB_LOOK_THROUGH = 0x0D3,
-	VERB_PEER_THROUGH = 0x103,
-	VERB_PLAY = 0x112,
-	VERB_PRESS = 0x11A,
-	VERB_PRY = 0x11C,
-	VERB_READ = 0x11F,
-	VERB_SET = 0x132,
-	VERB_SHAKE_HANDS = 0x133,
-	VERB_SHARPEN = 0x134,
-	VERB_SHOOT = 0x13A,
-	VERB_SIT_IN = 0x13F,
-	VERB_SMELL = 0x147,
-	VERB_SNIFF = 0x149,
-	VERB_STARE_AT = 0x155,
-	VERB_SWIM_ACROSS = 0x159,
-	VERB_SWIM_INTO = 0x15A,
-	VERB_SWIM_THROUGH = 0x15B,
-	VERB_SWIM_TO = 0x15C,
-	VERB_SWIM_TOWARDS = 0x15D,
-	VERB_SWIM_UNDER = 0x15E,
-	VERB_TIE = 0x170,
-	VERB_UNLOCK = 0x17B,
-	VERB_WALK_ACROSS = 0x187,
-	VERB_WALK_INSIDE = 0x188,
-	VERB_WALK_OUTSIDE = 0x18A,
-	VERB_WALK_THROUGH = 0x18B,
-	VERB_WALK_TOWARDS = 0x18C,
-	VERB_WEAR = 0x191,
-	VERB_WALK_DOWN = 0x1AD,
-	VERB_LEAVE = 0x1CD,
-	VERB_EXIT_FROM = 0x1CE,
-	VERB_USE = 0x20C,
-	VERB_GAZE_INTO = 0x212,
-	VERB_SIT_AT = 0x21F,
-	VERB_WALK_UP = 0x227,
-	VERB_WALK_INTO = 0x242,
-	VERB_EXIT = 0x298,
-	VERB_WALK_BEHIND = 0x2A2,
-	VERB_WALK_ONTO = 0x2B5,
-	VERB_RETURN_TO = 0x2D5,
-	VERB_CLIMB_INTO = 0x2F7,
-	VERB_STEP_INTO = 0x2F9,
-	VERB_CRAWL_TO = 0x2FB,
-	VERB_CRAWL_DOWN = 0x301,
-	VERB_SIT_ON = 0x30B,
-	VERB_WALK_ALONG = 0x312,
-	VERB_GET_INSIDE = 0x325,
-	VERB_WALK = 0x32F,
-	VERB_REFLECT = 0x365,
-	VERB_GET_INTO = 0x36A,
-	VERB_LOOK_OUT = 0x397,
-	VERB_APPLY = 0x3A6,
-	VERB_STEER_TOWARDS = 0x3B1,
-	VERB_NIBBLE_ON = 0x3B7,
-	VERB_ENTER = 0x3B8,
-	VERB_PUT_DOWN = 0x46F,
-	VERB_INSTALL = 0x474,
-	VERB_REMOVE = 0x476,
-	VERB_DEFACE = 0x489,
-	VERB_MASSAGE = 0x4A3,
-	VERB_MANGLE = 0x4A4,
-	VERB_RUB = 0x4A5,
-	VERB_JUGGLE = 0x4A6,
-	VERB_SMASH = 0x4A7,
-	VERB_GUZZLE = 0x4A8,
-	VERB_FOLD = 0x4AB,
-	VERB_SPINDLE = 0x4AC,
-	VERB_MUTILATE = 0x4AD
-};
-
-enum Noun {
-	//NOUN_GAME = 0x1,
-	//NOUN_QSAVE = 0x2,
-	//NOUN_LOOK = 0x3,
-	//NOUN_TAKE = 0x4,
-	//NOUN_PUSH = 0x5,
-	//NOUN_OPEN = 0x6,
-	//NOUN_PUT = 0x7,
-	//NOUN_TALK_TO = 0x8,
-	//NOUN_GIVE = 0x9,
-	//NOUN_PULL = 0xA,
-	//NOUN_CLOSE = 0xB,
-	//NOUN_THROW = 0xC,
-	//NOUN_WALK_TO = 0xD,
-	//NOUN_ACTIVATE = 0xE,
-	//NOUN_ADMIRE = 0xF,
-	NOUN_ADSM = 0x10,
-	NOUN_AIR_VENT = 0x11,
-	NOUN_ALOE_PLANT = 0x12,
-	NOUN_ANEMONE = 0x13,
-	NOUN_ANOMOMETER = 0x14,
-	NOUN_AREA_AROUND_HUT = 0x15,
-	NOUN_AREA_TO_SOUTH = 0x16,
-	NOUN_AREA_TO_WEST = 0x17,
-	NOUN_AROMATIC_MEAT = 0x18,
-	//NOUN_ATTACH = 0x19,
-	NOUN_AUDIO_TAPE = 0x1A,
-	NOUN_AUXILIARY_POWER = 0x1B,
-	NOUN_BADMITTON_BRAT = 0x1C,
-	NOUN_BAG = 0x1D,
-	NOUN_BAMBOO_TREE = 0x1E,
-	NOUN_BATS = 0x1F,
-	NOUN_BAWLEMER_ORIOLE_HUN = 0x20,
-	NOUN_BEAR_RUG = 0x21,
-	NOUN_BEASTLY_TROPHY = 0x22,
-	NOUN_BIG_LEAVES = 0x23,
-	NOUN_BIG_PIPES = 0x24,
-	NOUN_BIG_SKY = 0x25,
-	NOUN_BIG_STONE = 0x26,
-	NOUN_BINOCULARS = 0x27,
-	NOUN_BIRDIES = 0x28,
-	NOUN_BLOWGUN = 0x29,
-	NOUN_BOMB = 0x2A,
-	NOUN_BOMBS = 0x2B,
-	NOUN_BONE = 0x2C,
-	NOUN_BONES = 0x2D,
-	NOUN_BOTTLE = 0x2E,
-	NOUN_BOULDER = 0x2F,
-	NOUN_BOULDERS = 0x30,
-	NOUN_BRA = 0x31,
-	//NOUN_BREAK = 0x32,
-	//NOUN_BREATHE_AIR = 0x33,
-	NOUN_BULKHEAD = 0x34,
-	NOUN_BURGER = 0x35,
-	NOUN_BURN = 0x36,
-	NOUN_BURNT_OUT_WARP_COIL = 0x37,
-	NOUN_BUSH_LIKE_FORMATION = 0x38,
-	NOUN_BUSHES = 0x39,
-	NOUN_BUSHY_FERN = 0x3A,
-	NOUN_CACTUS = 0x3B,
-	NOUN_CARD = 0x3C,
-	//NOUN_CAST = 0x3D,
-	NOUN_CAULDRON = 0x3E,
-	NOUN_CAVE = 0x3F,
-	NOUN_CAVE_CEILING = 0x40,
-	NOUN_CAVE_ENTRANCE = 0x41,
-	NOUN_CAVE_EXIT = 0x42,
-	NOUN_CAVE_FLOOR = 0x43,
-	NOUN_CAVE_TO_EAST = 0x44,
-	NOUN_CAVE_WALL = 0x45,
-	NOUN_CEILING = 0x46,
-	NOUN_CHAIR = 0x47,
-	NOUN_CHARGE_CASES = 0x48,
-	NOUN_CHICKEN = 0x49,
-	NOUN_CHICKEN_BOMB = 0x4A,
-	NOUN_CLEARING_TO_EAST = 0x4B,
-	NOUN_CLEARING_TO_SOUTH = 0x4C,
-	NOUN_CLIFF_FACE = 0x4D,
-	//NOUN_CLIMB_DOWN = 0x4E,
-	//NOUN_CLIMB_THROUGH = 0x4F,
-	//NOUN_CLIMB_UP = 0x50,
-	NOUN_CLOCK = 0x51,
-	NOUN_CLOSET = 0x52,
-	NOUN_CLOTHESLINE = 0x53,
-	NOUN_CLUMP_OF_TREES = 0x54,
-	NOUN_COAL = 0x55,
-	NOUN_COCOANUT = 0x56,
-	NOUN_COMPACT_CASE = 0x57,
-	NOUN_COMPUTER_GAME = 0x58,
-	NOUN_CONTROL_PANEL = 0x59,
-	NOUN_CORAL = 0x5A,
-	NOUN_CRAB = 0x5B,
-	NOUN_CREDIT_CHIP = 0x5C,
-	NOUN_CUMULOUS_CLOUD = 0x5D,
-	NOUN_CURIOUS_WEED_PATCH = 0x5E,
-	NOUN_CURTAIN = 0x5F,
-	NOUN_CURTAINS = 0x60,
-	//NOUN_CUT = 0x61,
-	NOUN_DAMAGE_CONTROL = 0x62,
-	NOUN_DAMAGE_CONTROL_PANEL = 0x63,
-	//NOUN_DAMPEN = 0x64,
-	NOUN_DEAD_FISH = 0x65,
-	NOUN_DEAD_PURPLE_MONSTER = 0x66,
-	NOUN_DECLIVITOUS_CHASM = 0x67,
-	NOUN_DEEP_DARK_FOREST = 0x68,
-	NOUN_DENSE_FOREST = 0x69,
-	NOUN_DETONATORS = 0x6A,
-	NOUN_DINO_MITE = 0x6B,
-	//NOUN_DISASSEMBLE = 0x6C,
-	//NOUN_DIVE_INTO = 0x6D,
-	NOUN_DOOR = 0x6E,
-	NOUN_DOOR_KEY = 0x6F,
-	NOUN_DOORWAY = 0x70,
-	NOUN_DRAWER = 0x71,
-	//NOUN_DRINK = 0x72,
-	NOUN_DURAFAIL_CELLS = 0x73,
-	NOUN_EASTERN_CLIFF_FACE = 0x74,
-	//NOUN_EAT = 0x75,
-	//NOUN_EJECT = 0x76,
-	//NOUN_EMPTY = 0x77,
-	NOUN_ENGINEERING_CONTROLS = 0x78,
-	NOUN_ENGINEERING_SECTION = 0x79,
-	NOUN_ENTER_KEY = 0x7A,
-	NOUN_ESCAPE_HATCH = 0x7B,
-	NOUN_ESTROTOXIN = 0x7C,
-	//NOUN_EXAMINE = 0x7D,
-	NOUN_EXPERIMENT_CAGE = 0x7E,
-	NOUN_EXTINGUISH = 0x7F,
-	NOUN_FACE_ID = 0x80,
-	NOUN_FERN = 0x81,
-	NOUN_FIELD_TO_NORTH = 0x82,
-	NOUN_FIELD_TO_SOUTH = 0x83,
-	NOUN_FIELD_TO_WEST = 0x84,
-	//NOUN_FILL = 0x85,
-	NOUN_FIRE_PIT = 0x86,
-	NOUN_FISHING_LINE = 0x87,
-	NOUN_FISHING_ROD = 0x88,
-	NOUN_FLOOR = 0x89,
-	NOUN_FLOOR_OF_HUT = 0x8A,
-	NOUN_FLOOR_TILE = 0x8B,
-	//NOUN_FONDLE = 0x8C,
-	NOUN_FOREST_TO_EAST = 0x8D,
-	NOUN_FRONT_WINDOW = 0x8E,
-	NOUN_FUNGOIDS = 0x8F,
-	NOUN_FURNACE = 0x90,
-	NOUN_FUZZY_DICE = 0x91,
-	//NOUN_GAZE = 0x92,
-	//NOUN_GAZE_AT = 0x93,
-	//NOUN_GAZE_IN = 0x94,
-	//NOUN_GLANCE_AT = 0x95,
-	NOUN_GLOVE = 0x96,
-	NOUN_GNARLY_SHRUB = 0x97,
-	//NOUN_GNAW_ON = 0x98,
-	//NOUN_GORGE_ON = 0x99,
-	NOUN_GRAIN_ALCHOHOL = 0x9A,
-	NOUN_GRASSLAND_TO_EAST = 0x9B,
-	NOUN_GRASSLAND_TO_SOUTH = 0x9C,
-	NOUN_GRASSY_AREA = 0x9D,
-	NOUN_GRASSY_AREA_TO_NORTH = 0x9E,
-	NOUN_GRASSY_KNOLL = 0x9F,
-	//NOUN_GRIND = 0xA0,
-	NOUN_GROOVILACTIC_TREE = 0xA1,
-	NOUN_GUARDS_ARM = 0xA2,
-	NOUN_HATCHWAY = 0xA3,
-	//NOUN_HOOK_UP = 0xA4,
-	NOUN_HORIZON = 0xA5,
-	//NOUN_HOSE_DOWN = 0xA6,
-	NOUN_HOTPANTS = 0xA7,
-	NOUN_HULL = 0xA8,
-	//NOUN_HURL = 0xA9,
-	NOUN_HUT = 0xAA,
-	NOUN_HUT_AREA = 0xAB,
-	NOUN_HUT_TO_EAST = 0xAC,
-	NOUN_HUT_TO_SOUTH = 0xAD,
-	NOUN_HUT_TO_THE_SOUTH = 0xAE,
-	NOUN_HUT_TO_WEST = 0xAF,
-	NOUN_HUTS_TO_NORTH = 0xB0,
-	NOUN_HYDROSPANNER = 0xB1,
-	NOUN_HYPERDRIVE_JUMP_UNIT = 0xB2,
-	NOUN_ID_CARD = 0xB3,
-	//NOUN_IGNITE = 0xB4,
-	//NOUN_INFLATE = 0xB5,
-	//NOUN_INSERT = 0xB6,
-	//NOUN_INSPECT = 0xB7,
-	NOUN_JUNGLE = 0xB8,
-	NOUN_JUNGLE_TO_EAST = 0xB9,
-	NOUN_JUNGLE_TO_WEST = 0xBA,
-	NOUN_KEY_1 = 0xBB,
-	NOUN_KEY_2 = 0xBC,
-	NOUN_KEY_3 = 0xBD,
-	NOUN_KEY_4 = 0xBE,
-	NOUN_KEY_5 = 0xBF,
-	NOUN_KEY_6 = 0xC0,
-	NOUN_KEY_7 = 0xC1,
-	NOUN_KEY_8 = 0xC2,
-	NOUN_KEY_9 = 0xC3,
-	NOUN_KEYPAD = 0xC4,
-	NOUN_KNEELING_WOMAN = 0xC5,
-	NOUN_KNIFE = 0xC6,
-	NOUN_LADDER = 0xC7,
-	NOUN_LARGE_STALAGMITE = 0xC8,
-	//NOUN_LEER_AT = 0xC9,
-	NOUN_LIBRARY_COMPUTER = 0xCA,
-	//NOUN_LICK = 0xCB,
-	NOUN_LIFE_SUPPORT_SECTION = 0xCC,
-	NOUN_LIGHT = 0xCD,
-	//NOUN_LOAD = 0xCE,
-	//NOUN_LOCK = 0xCF,
-	NOUN_LOG = 0xD0,
-	//NOUN_LOOK_AT = 0xD1,
-	//NOUN_LOOK_IN = 0xD2,
-	//NOUN_LOOK_THROUGH = 0xD3,
-	NOUN_LOUNGE_AREA = 0xD4,
-	NOUN_LOVE_ALTAR = 0xD5,
-	NOUN_LOWLANDS = 0xD6,
-	NOUN_MACHINE = 0xD7,
-	NOUN_MAGNET = 0xD8,
-	NOUN_MAIN_AIRLOCK = 0xD9,
-	NOUN_MANTA_RAY = 0xDA,
-	NOUN_MARSHY_WETLANDS = 0xDB,
-	NOUN_MATCH = 0xDC,
-	NOUN_MEDICAL_WASTE = 0xDD,
-	NOUN_MEDICINE_CABINET = 0xDE,
-	NOUN_MEN_WHO_CAME_BEFORE = 0xDF,
-	NOUN_MINE = 0xE0,
-	NOUN_MIRROR = 0xE1,
-	NOUN_MONITOR = 0xE2,
-	NOUN_MONKEY = 0xE3,
-	NOUN_MONKEY_LIVER_JUICE = 0xE4,
-	NOUN_MONSTER_SLUDGE = 0xE5,
-	NOUN_MOUNTAIN = 0xE6,
-	NOUN_MOUNTAIN_RANGE = 0xE7,
-	NOUN_MOUNTAINS = 0xE8,
-	NOUN_MTAM = 0xE9,
-	NOUN_MUSHROOMS = 0xEA,
-	NOUN_NAVIGATION_CONTROLS = 0xEB,
-	NOUN_NORTH_PATH = 0xEC,
-	NOUN_NORTHERN_EXPOSURE = 0xED,
-	NOUN_NORTHERN_SEA_CLIFF = 0xEE,
-	NOUN_OBSTACLE = 0xEF,
-	NOUN_OCEAN_FLOOR = 0xF0,
-	NOUN_ODD_ROCK_FORMATION = 0xF1,
-	NOUN_OOGLY_BOOGLY_JUICE = 0xF2,
-	NOUN_OPEN_AREA_TO_EAST = 0xF3,
-	NOUN_OPEN_AREA_TO_NORTH = 0xF4,
-	NOUN_OPEN_AREA_TO_SOUTH = 0xF5,
-	NOUN_OPEN_AREA_TO_WEST = 0xF6,
-	NOUN_OPEN_FIELD = 0xF7,
-	NOUN_OUTER_HULL = 0xF8,
-	NOUN_OUTSIDE = 0xF9,
-	NOUN_OVEN = 0xFA,
-	NOUN_OVERHANG_TO_EAST = 0xFB,
-	NOUN_OVERHANG_TO_WEST = 0xFC,
-	NOUN_OVERHEAD_LAMP = 0xFD,
-	NOUN_PAD_OF_PAPER = 0xFE,
-	NOUN_PADLOCK_KEY = 0xFF,
-	NOUN_PALM_TREE = 0x100,
-	NOUN_PASSAGE_WAY_TO_SOUTH = 0x101,
-	NOUN_PASSION_PUSS = 0x102,
-	//NOUN_PEER_THROUGH = 0x103,
-	NOUN_PENCIL = 0x104,
-	NOUN_PENDULOUS_CRAG = 0x105,
-	NOUN_PENLIGHT = 0x106,
-	NOUN_PHONE_CELLS = 0x107,
-	NOUN_PHONE_HANDSET = 0x108,
-	NOUN_PILE_OF_ROCKS = 0x109,
-	NOUN_PILLOW = 0x10A,
-	NOUN_PILOTS_CHAIR = 0x10B,
-	NOUN_PIPE = 0x10C,
-	NOUN_PIRANHA = 0x10D,
-	NOUN_PLANT = 0x10E,
-	NOUN_PLANT_STALK = 0x10F,
-	NOUN_PLANTS = 0x110,
-	NOUN_PLASTIC_JESUS = 0x111,
-	//NOUN_PLAY = 0x112,
-	NOUN_PLUNGER = 0x113,
-	NOUN_POISON_DARTS = 0x114,
-	NOUN_POLYCEMENT = 0x115,
-	NOUN_POOL = 0x116,
-	NOUN_POSTER = 0x117,
-	NOUN_POWER_STATUS_PANEL = 0x118,
-	NOUN_PRECIPICE = 0x119,
-	//NOUN_PRESS = 0x11A,
-	NOUN_PRESSURE_GAUGE = 0x11B,
-	//NOUN_PRY = 0x11C,
-	NOUN_RAGING_RIVER = 0x11D,
-	NOUN_RAMOLYAN_RUGBY_RATS = 0x11E,
-	//NOUN_READ = 0x11F,
-	NOUN_REARVIEW_MIRROR = 0x120,
-	NOUN_REBREATHER = 0x121,
-	NOUN_REFRIGERATOR = 0x122,
-	NOUN_REMOTE = 0x123,
-	NOUN_REPAIR_LIST = 0x124,
-	NOUN_RIVER = 0x125,
-	NOUN_RIVER_TO_WEST = 0x126,
-	NOUN_ROBO_KITCHEN = 0x127,
-	NOUN_ROCK = 0x128,
-	NOUN_ROCKS = 0x129,
-	NOUN_ROCKY_AREA = 0x12A,
-	NOUN_ROLLING_HILL = 0x12B,
-	NOUN_SCALPEL = 0x12C,
-	NOUN_SCENIC_MOUNTAINS = 0x12D,
-	NOUN_SEA_CLIFF = 0x12E,
-	NOUN_SEAWEED = 0x12F,
-	NOUN_SEAWEED_BANK = 0x130,
-	NOUN_SECURITY_CARD = 0x131,
-	//NOUN_SET = 0x132,
-	//NOUN_SHAKE_HANDS = 0x133,
-	//NOUN_SHARPEN = 0x134,
-	NOUN_SHIELD_ACCESS_PANEL = 0x135,
-	NOUN_SHIELD_GENERATOR = 0x136,
-	NOUN_SHIELD_MODULATOR = 0x137,
-	NOUN_SHIELD_STATUS_PANEL = 0x138,
-	NOUN_SHIP = 0x139,
-	//NOUN_SHOOT = 0x13A,
-	NOUN_SHOVEL = 0x13B,
-	//NOUN_SHRED = 0x13C,
-	NOUN_SHRUNKEN_HEADS = 0x13D,
-	NOUN_SINGED_MEAT = 0x13E,
-	//NOUN_SIT_IN = 0x13F,
-	NOUN_SKULL = 0x140,
-	NOUN_SKULL_AND_CROSSBONES = 0x141,
-	NOUN_SKY = 0x142,
-	//NOUN_SLEEP_ON = 0x143,
-	NOUN_SLITHERING_SNAKE = 0x144,
-	NOUN_SLUG_SECRETION = 0x145,
-	NOUN_SMALL_HOLE = 0x146,
-	//NOUN_SMELL = 0x147,
-	NOUN_SNAKE = 0x148,
-	//NOUN_SNIFF = 0x149,
-	//NOUN_SOAK = 0x14A,
-	NOUN_SPECIAL_KEY_1 = 0x14B,
-	NOUN_SPECIAL_KEY_2 = 0x14C,
-	NOUN_SPIDER = 0x14D,
-	NOUN_SPILT_MILK = 0x14E,
-	NOUN_SPIT_FIRE = 0x14F,
-	//NOUN_SPRAY = 0x150,
-	//NOUN_STAB = 0x151,
-	NOUN_STAIRS = 0x152,
-	NOUN_STALAGMITES = 0x153,
-	//NOUN_STAND_INSIDE = 0x154,
-	//NOUN_STARE_AT = 0x155,
-	NOUN_STEPS = 0x156,
-	NOUN_STUFFED_FISH = 0x157,
-	NOUN_SURFACE = 0x158,
-	//NOUN_SWIM_ACROSS = 0x159,
-	//NOUN_SWIM_INTO = 0x15A,
-	//NOUN_SWIM_THROUGH = 0x15B,
-	//NOUN_SWIM_TO = 0x15C,
-	//NOUN_SWIM_TOWARDS = 0x15D,
-	//NOUN_SWIM_UNDER = 0x15E,
-	NOUN_SWOOPING_CREATURE = 0x15F,
-	NOUN_TABLE = 0x160,
-	//NOUN_TAKE_LIVER = 0x161,
-	//NOUN_TAKE_OFF = 0x162,
-	//NOUN_TAKE_PAGE = 0x163,
-	NOUN_TALL_GRASS = 0x164,
-	NOUN_TAPE_PLAYER = 0x165,
-	NOUN_TARGET_COMPUTER = 0x166,
-	NOUN_TARGET_MODULE = 0x167,
-	NOUN_TARGETTING_COMPUTER = 0x168,
-	NOUN_TASMANIAN_DEVIL = 0x169,
-	NOUN_TASTY_TURKEY = 0x16A,
-	NOUN_TELEPORT_DEVICE = 0x16B,
-	NOUN_TELEPORTER = 0x16C,
-	NOUN_THATCHED_ROOF = 0x16D,
-	NOUN_THORNS = 0x16E,
-	NOUN_THORNY_BUSH = 0x16F,
-	//NOUN_TIE = 0x170,
-	NOUN_TIMEBOMB = 0x171,
-	NOUN_TIMER = 0x172,
-	NOUN_TIMER_MODULE = 0x173,
-	NOUN_TREE = 0x174,
-	NOUN_TREES = 0x175,
-	NOUN_TRODDEN_PATH = 0x176,
-	NOUN_TUBE = 0x177,
-	NOUN_TUNNEL = 0x178,
-	NOUN_TWINKIE_BUSH = 0x179,
-	NOUN_TWINKIFRUIT = 0x17A,
-	//NOUN_UNLOCK = 0x17B,
-	NOUN_UZI = 0x17C,
-	NOUN_VASE = 0x17D,
-	NOUN_VIDEO_GAME = 0x17E,
-	//NOUN_VIEW = 0x17F,
-	NOUN_VIEW_SCREEN = 0x180,
-	NOUN_VIEWPORT = 0x181,
-	NOUN_VILLAGE_AREA = 0x182,
-	NOUN_VILLAGE_TO_WEST = 0x183,
-	NOUN_VOLCANO = 0x184,
-	NOUN_VULTURE = 0x185,
-	NOUN_WAD_OF_CATTLE_PARTS = 0x186,
-	//NOUN_WALK_ACROSS = 0x187,
-	//NOUN_WALK_INSIDE = 0x188,
-	//NOUN_WALK_ON = 0x189,
-	//NOUN_WALK_OUTSIDE = 0x18A,
-	//NOUN_WALK_THROUGH = 0x18B,
-	//NOUN_WALK_TOWARDS = 0x18C,
-	NOUN_WALL = 0x18D,
-	NOUN_WATCH_TOWER = 0x18E,
-	NOUN_WATER = 0x18F,
-	NOUN_WEAPONS_DISPLAY = 0x190,
-	//NOUN_WEAR = 0x191,
-	NOUN_WEATHER_STATION = 0x192,
-	NOUN_WEATHER_VANE = 0x193,
-	NOUN_WEIGHT_MACHINE = 0x194,
-	NOUN_WESTERN_CLIFF_FACE = 0x195,
-	NOUN_WHEEL = 0x196,
-	NOUN_WINDOW = 0x197,
-	NOUN_WITCHDOCTOR_HUT = 0x198,
-	NOUN_WORKBENCH = 0x199,
-	//NOUN_WRITE_ON = 0x19A,
-	NOUN_YELLOW_BIRDY = 0x19B,
-	NOUN_GRASS = 0x19C,
-	NOUN_BOUNCING_REPTILE = 0x19D,
-	NOUN_DEEP_PIT = 0x19E,
-	NOUN_LOWLANDS_TO_NORTH = 0x19F,
-	NOUN_SMALL_BUSH = 0x1A0,
-	NOUN_SMALL_CACTUS = 0x1A1,
-	NOUN_ROCKY_AREA_TO_NORTH = 0x1A2,
-	NOUN_BAMBOO_LIKE_PLANT = 0x1A3,
-	NOUN_MOUNTAINSIDE = 0x1A4,
-	NOUN_FIELD = 0x1A5,
-	NOUN_GRASSY_FIELD = 0x1A6,
-	NOUN_CRAG = 0x1A7,
-	NOUN_HUGE_LEGS = 0x1A8,
-	NOUN_LEAF_COVERED_PIT = 0x1A9,
-	NOUN_PILE_OF_LEAVES = 0x1AA,
-	NOUN_OPEN_FIELD_TO_EAST = 0x1AB,
-	NOUN_LAWN = 0x1AC,
-	//NOUN_WALK_DOWN = 0x1AD,
-	NOUN_PATH_TO_WEST = 0x1AE,
-	NOUN_HEDGE = 0x1AF,
-	NOUN_VILLAGE_PATH = 0x1B0,
-	NOUN_PATH_TO_NORTHEAST = 0x1B1,
-	NOUN_JUNGLE_PATH = 0x1B2,
-	NOUN_THICK_UNDERGROWTH = 0x1B3,
-	NOUN_OCEAN = 0x1B4,
-	NOUN_OCEAN_IN_DISTANCE = 0x1B5,
-	NOUN_STRANGE_DEVICE = 0x1B6,
-	NOUN_BUSH = 0x1B7,
-	NOUN_ANEMOMETER = 0x1B8,
-	NOUN_ISLAND_IN_DISTANCE = 0x1B9,
-	NOUN_PATH = 0x1BA,
-	NOUN_TROPHY = 0x1BB,
-	NOUN_SPECIMEN_JARS = 0x1BC,
-	NOUN_BOWL = 0x1BD,
-	NOUN_LARGE_BOWL = 0x1BE,
-	NOUN_PATH_TO_NORTH = 0x1BF,
-	NOUN_HUT_TO_NORTH = 0x1C0,
-	NOUN_PATH_TO_EAST = 0x1C1,
-	NOUN_CHICKEN_ON_SPIT = 0x1C2,
-	NOUN_CAPTIVE_CREATURE = 0x1C3,
-	NOUN_TWINKIFRUIT_BUSH = 0x1C4,
-	NOUN_STREAM = 0x1C5,
-	NOUN_OPPOSITE_SHORE = 0x1C6,
-	NOUN_PATH_TO_SOUTH = 0x1C7,
-	NOUN_OPPOSITE_BANK = 0x1C8,
-	NOUN_BROKEN_LADDER = 0x1C9,
-	NOUN_BAG_OF_TWINKIFRUITS = 0x1CA,
-	NOUN_BED = 0x1CB,
-	NOUN_DISPLAY = 0x1CC,
-	//NOUN_LEAVE = 0x1CD,
-	//NOUN_EXIT_FROM = 0x1CE,
-	NOUN_DEVICE = 0x1CF,
-	NOUN_0_KEY = 0x1D0,
-	NOUN_1_KEY = 0x1D1,
-	NOUN_2_KEY = 0x1D2,
-	NOUN_3_KEY = 0x1D3,
-	NOUN_4_KEY = 0x1D4,
-	NOUN_5_KEY = 0x1D5,
-	NOUN_6_KEY = 0x1D6,
-	NOUN_7_KEY = 0x1D7,
-	NOUN_8_KEY = 0x1D8,
-	NOUN_9_KEY = 0x1D9,
-	NOUN_FROWN_KEY = 0x1DA,
-	NOUN_SMILE_KEY = 0x1DB,
-	NOUN_NATIVE_WOMAN = 0x1DC,
-	NOUN_YELLOW_BIRD = 0x1DD,
-	NOUN_BLEEPER = 0x1DE,
-	NOUN_SIZEMOMETER = 0x1DF,
-	NOUN_PANEL = 0x1E0,
-	NOUN_PRINTER = 0x1E1,
-	NOUN_HARD_DRIVE = 0x1E2,
-	NOUN_BATHROOM = 0x1E3,
-	NOUN_DESK = 0x1E4,
-	NOUN_PASSAGEWAY = 0x1E5,
-	NOUN_FIRE_HYDRANT = 0x1E6,
-	NOUN_FREEZER = 0x1E7,
-	NOUN_EQUIDIGITIZER = 0x1E8,
-	NOUN_VISION_VIEW = 0x1E9,
-	NOUN_TELEDETECTOR = 0x1EA,
-	NOUN_POLE = 0x1EB,
-	NOUN_TRANSPOSITION_DEVICE = 0x1EC,
-	NOUN_STATUESQUE = 0x1ED,
-	NOUN_TEMPERATURE_GAUGE = 0x1EE,
-	NOUN_CHECK = 0x1EF,
-	NOUN_WATCH = 0x1F0,
-	NOUN_ELECTRO_SCANNER = 0x1F1,
-	NOUN_HALL = 0x1F2,
-	NOUN_SCANNER = 0x1F3,
-	//NOUN_PLACE_HAND_ON = 0x1F4,
-	NOUN_SECURITY_MONITOR = 0x1F5,
-	NOUN_DIGITORAMA = 0x1F6,
-	NOUN_RAIL_BEAM = 0x1F7,
-	NOUN_VAULT = 0x1F8,
-	NOUN_HALLWAY = 0x1F9,
-	NOUN_PIPES = 0x1FA,
-	NOUN_AIR_VENT_GRATE = 0x1FB,
-	NOUN_SECURITY_OFFICE = 0x1FC,
-	NOUN_SIGNAL = 0x1FD,
-	NOUN_BLEEP = 0x1FE,
-	NOUN_BLIP = 0x1FF,
-	NOUN_LOFT = 0x200,
-	NOUN_ELECTRONIC_ANT_FARM = 0x201,
-	NOUN_ELECTRIC_WIRING = 0x202,
-	NOUN_SECURITY_PANEL = 0x203,
-	NOUN_CORRIDOR = 0x204,
-	NOUN_CIRCUIT_CONTROLS = 0x205,
-	NOUN_AIR_DUCT = 0x206,
-	NOUN_CELL_WALL = 0x207,
-	NOUN_LIGHTS = 0x208,
-	//NOUN_STARE_INTO = 0x209,
-	NOUN_CELL_CONTROLS = 0x20A,
-	NOUN_COMMODE = 0x20B,
-	//NOUN_USE = 0x20C,
-	NOUN_BASIN = 0x20D,
-	//NOUN_JUMP_INSIDE = 0x20E,
-	NOUN_PREVIOUS_CELL = 0x20F,
-	NOUN_NEXT_ROOM = 0x210,
-	NOUN_ZINK = 0x211,
-	//NOUN_GAZE_INTO = 0x212,
-	NOUN_THRONE = 0x213,
-	NOUN_SACK = 0x214,
-	NOUN_LIMB = 0x215,
-	NOUN_SINK = 0x216,
-	NOUN_JOHNNY_ON_THE_SPOT = 0x217,
-	NOUN_DEBRIS = 0x218,
-	NOUN_BUNK = 0x219,
-	NOUN_NEXT_CELL = 0x21A,
-	NOUN_TOILET = 0x21B,
-	NOUN_MONITOR_AREA = 0x21C,
-	NOUN_SIDEWALL = 0x21D,
-	NOUN_COFFEE_MUG = 0x21E,
-	//NOUN_SIT_AT = 0x21F,
-	NOUN_LIGHTING_FIXTURE = 0x220,
-	NOUN_MONITORS = 0x221,
-	NOUN_GENDER_CONTROLS = 0x222,
-	NOUN_NEURO_ANALYZER = 0x223,
-	NOUN_MOLECULAR_RECORDER = 0x224,
-	NOUN_MAINTENANCE_PANEL = 0x225,
-	NOUN_RAMP = 0x226,
-	//NOUN_WALK_UP = 0x227,
-	NOUN_SUBSONIC_ATOMIZER = 0x228,
-	NOUN_EIGHT_BALL = 0x229,
-	NOUN_DNA_INVERTER = 0x22A,
-	NOUN_DNA_CONVERTER = 0x22B,
-	NOUN_PLATFORM = 0x22C,
-	NOUN_GUINEA_PIG_TEST_BOX = 0x22D,
-	NOUN_GASEOUS_PROBE_WARPER = 0x22E,
-	NOUN_TOOL_CABINET = 0x22F,
-	NOUN_SURGICAL_BOXES = 0x230,
-	NOUN_FETAL_HEART_MONITOR = 0x231,
-	NOUN_XRAY_CABINET = 0x232,
-	NOUN_STERILIZATION_SINK = 0x233,
-	NOUN_DRIPOLATOR = 0x234,
-	NOUN_SHOCK_MACHINE = 0x235,
-	NOUN_INTERROGATION_TABLE = 0x236,
-	NOUN_LIE_DOWN_ON = 0x237,
-	//NOUN_DECIPHER = 0x238,
-	NOUN_GUARD = 0x239,
-	NOUN_RIP_IN_FLOOR = 0x23A,
-	NOUN_TELEPORT_AREA = 0x23B,
-	NOUN_BROKEN_BEAM = 0x23C,
-	NOUN_ROCK_CHUNK = 0x23D,
-	NOUN_BLOODY_CELL_WALL = 0x23E,
-	NOUN_WALL_BOARD = 0x23F,
-	NOUN_GENDER_SCANNER = 0x240,
-	NOUN_BAR = 0x241,
-	//NOUN_WALK_INTO = 0x242,
-	NOUN_HALLWAY_TO_SOUTH = 0x243,
-	NOUN_SIGN = 0x244,
-	NOUN_HALLWAY_TO_NORTH = 0x245,
-	NOUN_BOTTLES = 0x246,
-	NOUN_UPPER_DANCE_FLOOR = 0x247,
-	NOUN_DANCE_FLOOR = 0x248,
-	NOUN_RAILING = 0x249,
-	NOUN_BAR_STOOL = 0x24A,
-	NOUN_LADY = 0x24B,
-	NOUN_UPPER_LEVEL = 0x24C,
-	NOUN_ALCOVE = 0x24D,
-	NOUN_DISCO_BALL = 0x24E,
-	NOUN_LADIES = 0x24F,
-	NOUN_COACH_LAMP = 0x250,
-	NOUN_CARD_SLOT = 0x251,
-	NOUN_HOOP = 0x252,
-	NOUN_CANNONBALLS = 0x253,
-	NOUN_WATER_FOUNTAIN = 0x254,
-	NOUN_HALLWAY_TO_EAST = 0x255,
-	NOUN_HALLWAY_TO_WEST = 0x256,
-	NOUN_SUPPORT = 0x257,
-	NOUN_BACKBOARD = 0x258,
-	NOUN_WIDE_DOOR = 0x259,
-	NOUN_SIGN_POST = 0x25A,
-	NOUN_FIRE_EXTINGUISHER = 0x25B,
-	NOUN_TRASH = 0x25C,
-	NOUN_MISSILES = 0x25D,
-	NOUN_TANK = 0x25E,
-	NOUN_TWO_TON_WEIGHT = 0x25F,
-	NOUN_ONE_TON_TOMATO = 0x260,
-	NOUN_ANVIL = 0x261,
-	NOUN_MINUTEMAN_IV_ICBM = 0x262,
-	NOUN_CHEST = 0x263,
-	NOUN_ARMOR = 0x264,
-	NOUN_CARTON = 0x265,
-	NOUN_POWDER = 0x266,
-	NOUN_RAFT = 0x267,
-	NOUN_WHATZIT = 0x268,
-	NOUN_CATAPULT = 0x269,
-	NOUN_HAND_GRENADE = 0x26A,
-	NOUN_BARRELS = 0x26B,
-	NOUN_LOADING_RAMP = 0x26C,
-	NOUN_BLIMP = 0x26D,
-	NOUN_FLOUR = 0x26E,
-	NOUN_FLY_PAPER = 0x26F,
-	NOUN_RUG = 0x270,
-	NOUN_CARPET = 0x271,
-	NOUN_CAN = 0x272,
-	NOUN_RUBBER_DUCKIE = 0x273,
-	NOUN_GOLF_CLUBS = 0x274,
-	NOUN_RAT = 0x275,
-	NOUN_BARREL = 0x276,
-	NOUN_BUCKET_OF_TAR = 0x277,
-	NOUN_SACKS = 0x278,
-	NOUN_STORAGE = 0x279,
-	NOUN_120V_3_PHASE_400HZ = 0x27A,
-	NOUN_LAB_EQUIPMENT = 0x27B,
-	NOUN_AIR_HORN = 0x27C,
-	NOUN_JAR = 0x27D,
-	NOUN_SEVERED_CABLE = 0x27E,
-	NOUN_PROBE_ASSEMBLY = 0x27F,
-	NOUN_KNIFE_SWITCH = 0x280,
-	NOUN_WORK_BENCH = 0x281,
-	NOUN_HEATER = 0x282,
-	NOUN_TOXIC_WASTE = 0x283,
-	NOUN_EXPERIMENT = 0x284,
-	NOUN_DRAWING_BOARD = 0x285,
-	NOUN_MISHAP = 0x286,
-	NOUN_AIR_PURIFIER = 0x287,
-	NOUN_DUMMY = 0x288,
-	NOUN_PICTURE = 0x289,
-	NOUN_BAGGAGE_CHECK = 0x28A,
-	NOUN_DEPARTURE_SCHEDULE = 0x28B,
-	NOUN_SHADE_OF_PALE = 0x28C,
-	NOUN_ITINERARY = 0x28D,
-	NOUN_BARGAIN_VAT = 0x28E,
-	NOUN_PENCILS = 0x28F,
-	NOUN_PAD_IF_PAPER = 0x290,
-	NOUN_DEEPEST_DEPTHS = 0x291,
-	NOUN_ROLODEX = 0x292,
-	NOUN_MONA_TISA = 0x293,
-	NOUN_ABSTRACT_ART = 0x294,
-	NOUN_SPACE_QUESTING_VIII = 0x295,
-	NOUN_THEATRICAL_ART = 0x296,
-	NOUN_METAL_POLE = 0x297,
-	NOUN_EXIT = 0x298,
-	NOUN_SWIRLING_LIGHT = 0x299,
-	NOUN_REGISTER = 0x29A,
-	NOUN_PEACHY_BUNS = 0x29B,
-	NOUN_OUR_TOWN = 0x29C,
-	NOUN_EMBROIDERED_ART = 0x29D,
-	NOUN_GEORGE_BUSH_ALIKE = 0x29E,
-	NOUN_COUNTER = 0x29F,
-	NOUN_SENSOR = 0x2A0,
-	NOUN_SOFTWARE_INFORMATION = 0x2A1,
-	//NOUN_WALK_BEHIND = 0x2A2,
-	NOUN_BARGAINS = 0x2A3,
-	NOUN_SCAN_LIGHT = 0x2A4,
-	NOUN_OLD_SOFTWARE_STAND = 0x2A5,
-	NOUN_SOFTWARE_SHELF = 0x2A6,
-	NOUN_HOTTEST_SOFTWARE = 0x2A7,
-	NOUN_GREAT_PAINTBALL_ART = 0x2A8,
-	NOUN_SCENIC_VISTA = 0x2A9,
-	NOUN_LASER = 0x2AA,
-	NOUN_LASER_JET = 0x2AB,
-	NOUN_LEVER = 0x2AC,
-	NOUN_BULLSEYE = 0x2AD,
-	NOUN_STAND = 0x2AE,
-	NOUN_CONTROL_STATION = 0x2AF,
-	NOUN_STRANGE_MONSTER = 0x2B0,
-	NOUN_GHASTLY_BEAST = 0x2B1,
-	NOUN_GAWK_AT = 0x2B2,
-	NOUN_CORRIDOR_TO_SOUTH = 0x2B3,
-	NOUN_CORRIDOR_TO_NORTH = 0x2B4,
-	//NOUN_WALK_ONTO = 0x2B5,
-	NOUN_ROCK_WALL = 0x2B6,
-	NOUN_WOMAN = 0x2B7,
-	NOUN_WOMEN = 0x2B8,
-	NOUN_CORRIDOR_TO_EAST = 0x2B9,
-	NOUN_CORRIDOR_TO_WEST = 0x2BA,
-	NOUN_AMMUNITION = 0x2BB,
-	NOUN_ARMORED_VEHICLE = 0x2BC,
-	NOUN_TOMATO = 0x2BD,
-	NOUN_MISSILE = 0x2BE,
-	NOUN_SUIT_OF_ARMOR = 0x2BF,
-	NOUN_POWDER_CONTAINER = 0x2C0,
-	NOUN_INFLATABLE_RAFT = 0x2C1,
-	NOUN_GRENADE = 0x2C2,
-	NOUN_FENCE = 0x2C3,
-	NOUN_WOODEN_STATUE = 0x2C4,
-	NOUN_CONVEYER_BELT = 0x2C5,
-	NOUN_CONTROLS = 0x2C6,
-	NOUN_EQUIPMENT = 0x2C7,
-	NOUN_SHELF = 0x2C8,
-	NOUN_CABINETS = 0x2C9,
-	NOUN_CONTROL_CONSOLE = 0x2CA,
-	NOUN_FAUCET = 0x2CB,
-	NOUN_PANEL_BOX = 0x2CC,
-	NOUN_STATUE = 0x2CD,
-	NOUN_GAUGE = 0x2CE,
-	NOUN_CIRCUIT_PANEL = 0x2CF,
-	NOUN_CATWALK = 0x2D0,
-	NOUN_CIRCUITS = 0x2D1,
-	NOUN_BLOOD_STAIN = 0x2D2,
-	NOUN_GRATE = 0x2D3,
-	NOUN_AIR_SHAFT = 0x2D4,
-	//NOUN_RETURN_TO = 0x2D5,
-	NOUN_FORMALDEHYDE = 0x2D6,
-	NOUN_PETROX = 0x2D7,
-	NOUN_SODIUM_BENZOATE = 0x2D8,
-	NOUN_GURNEY = 0x2D9,
-	NOUN_IRONING_BOARD = 0x2DA,
-	NOUN_LEFT_MONITOR = 0x2DB,
-	NOUN_RIGHT_MONITOR = 0x2DC,
-	NOUN_RED_BUTTON = 0x2DD,
-	NOUN_GREEN_BUTTON = 0x2DE,
-	NOUN_RIGHT_ONE_KEY = 0x2DF,
-	NOUN_RIGHT_1_KEY = 0x2E0,
-	NOUN_RIGHT_2_KEY = 0x2E1,
-	NOUN_RIGHT_3_KEY = 0x2E2,
-	NOUN_RIGHT_4_KEY = 0x2E3,
-	NOUN_RIGHT_5_KEY = 0x2E4,
-	NOUN_RIGHT_6_KEY = 0x2E5,
-	NOUN_RIGHT_7_KEY = 0x2E6,
-	NOUN_RIGHT_8_KEY = 0x2E7,
-	NOUN_LEFT_1_KEY = 0x2E8,
-	NOUN_LEFT_2_KEY = 0x2E9,
-	NOUN_LEFT_3_KEY = 0x2EA,
-	NOUN_LEFT_4_KEY = 0x2EB,
-	NOUN_CORRIDOR_WALL = 0x2EC,
-	NOUN_MUG = 0x2ED,
-	NOUN_DOUGHNUT = 0x2EE,
-	NOUN_SECURITY_STATION = 0x2EF,
-	NOUN_NEWSPAPER = 0x2F0,
-	NOUN_MAGAZINE = 0x2F1,
-	NOUN_CLIPBOARD = 0x2F2,
-	NOUN_PAPER_FOOTBALL = 0x2F3,
-	NOUN_YOUR_STUFF = 0x2F4,
-	NOUN_OTHER_STUFF = 0x2F5,
-	NOUN_LAMP = 0x2F6,
-	//NOUN_CLIMB_INTO = 0x2F7,
-	NOUN_LIGHT_BULB = 0x2F8,
-	//NOUN_STEP_INTO = 0x2F9,
-	NOUN_ROOM = 0x2FA,
-	//NOUN_CRAWL_TO = 0x2FB,
-	NOUN_FOURTH_CELL = 0x2FC,
-	NOUN_THIRD_CELL = 0x2FD,
-	NOUN_SECOND_CELL = 0x2FE,
-	NOUN_FIRST_CELL = 0x2FF,
-	NOUN_EQUIPMENT_ROOM = 0x300,
-	//NOUN_CRAWL_DOWN = 0x301,
-	NOUN_DESCENDING_SHAFT = 0x302,
-	NOUN_SAUROPOD = 0x303,
-	NOUN_MONSTER = 0x304,
-	NOUN_FAKE_ID = 0x305,
-	NOUN_ALIEN_LIQUOR = 0x306,
-	NOUN_INTERN = 0x307,
-	NOUN_INSTRUMENT_TABLE = 0x308,
-	NOUN_WOMAN_ON_BALCONY = 0x309,
-	NOUN_WOMAN_IN_CHAIR = 0x30A,
-	//NOUN_SIT_ON = 0x30B,
-	NOUN_WOMAN_IN_ALCOVE = 0x30C,
-	NOUN_KETTLE = 0x30D,
-	NOUN_BARTENDER = 0x30E,
-	NOUN_WHISKEY = 0x30F,
-	NOUN_ALCOHOL = 0x310,
-	NOUN_RIM = 0x311,
-	NOUN_SUBMERGED_CITY = 0x313,
-	NOUN_GOVERNORS_HOUSE = 0x314,
-	NOUN_RIM_TOWARDS_EAST = 0x315,
-	NOUN_CEMENT_PYLON = 0x316,
-	NOUN_ELEVATOR = 0x317,
-	NOUN_ELEVATOR_SHAFT = 0x318,
-	NOUN_CONVEYOR_BELT = 0x319,
-	NOUN_CANNON_BALLS = 0x31A,
-	NOUN_ELECTRICAL_OVERHANG = 0x31B,
-	NOUN_GUTTER_PIPE = 0x31C,
-	NOUN_SIDEWALK = 0x31D,
-	NOUN_STREET = 0x31E,
-	NOUN_BARRICADE = 0x31F,
-	NOUN_DOOR_CONTROL_SLOT = 0x320,
-	NOUN_STREET_TO_EAST = 0x321,
-	NOUN_SIDEWALK_TO_EAST = 0x322,
-	NOUN_BUILDING = 0x323,
-	NOUN_CAR = 0x324,
-	//NOUN_GET_INSIDE = 0x325,
-	NOUN_MARQUEE = 0x326,
-	NOUN_BUILDING_ENTRANCE = 0x327,
-	NOUN_GUARD_STATION = 0x328,
-	NOUN_TECHNICAL_EQUIPMENT = 0x329,
-	NOUN_GUARD_TURRET = 0x32A,
-	NOUN_PILLAR = 0x32B,
-	NOUN_PAPERS = 0x32C,
-	NOUN_FILE_CABINET = 0x32D,
-	NOUN_WINDOWS = 0x32E,
-	//NOUN_WALK = 0x32F,
-	NOUN_STORAGE_BOX = 0x330,
-	NOUN_WATER_COOLER = 0x331,
-	NOUN_BOX = 0x332,
-	NOUN_RIFLES = 0x333,
-	NOUN_SLINGSHOT = 0x334,
-	NOUN_MAUSOLEUM = 0x335,
-	NOUN_SOFTWARE_STORE = 0x336,
-	NOUN_CONCRETE_BUILDING = 0x337,
-	NOUN_HUMONGOUS_MONITOR = 0x338,
-	NOUN_SPACE_BIKE = 0x339,
-	NOUN_BILLBOARD = 0x33A,
-	NOUN_LACK_OF_NOOKIE_MOTEL = 0x33B,
-	NOUN_BIDETS_XCREETZA_HUT = 0x33C,
-	NOUN_BUILDINGS = 0x33D,
-	NOUN_SKYSCRAPER = 0x33E,
-	NOUN_SOFTWARE_LOGO = 0x33F,
-	NOUN_GIANT_TELESCOPE = 0x340,
-	NOUN_HANDLE = 0x341,
-	NOUN_HOLE = 0x342,
-	NOUN_LASER_BEAM = 0x343,
-	NOUN_PEDESTAL = 0x344,
-	NOUN_BOAT = 0x345,
-	NOUN_GIANT_MONUMENT = 0x346,
-	NOUN_ROPE = 0x347,
-	NOUN_SAND_BAR_RESTAURANT = 0x348,
-	NOUN_PORTHOLE = 0x349,
-	NOUN_TICKET_BOOTH = 0x34A,
-	NOUN_POLLYS_ENTRANCE = 0x34B,
-	NOUN_RESTAURANT_ENTRANCE = 0x34C,
-	NOUN_THE_PLEASURE_DOME = 0x34D,
-	NOUN_STARFISH = 0x34E,
-	NOUN_FLIPPER = 0x34F,
-	NOUN_SAND_DOLLAR = 0x350,
-	NOUN_SHELL = 0x351,
-	NOUN_GUEST_LIST = 0x352,
-	NOUN_WEIRD_ANIMAL_HEAD = 0x353,
-	NOUN_SHIPS_WHEEL = 0x354,
-	NOUN_HANDICAP_SIGN = 0x355,
-	NOUN_ELEVATOR_CONTROLS = 0x356,
-	NOUN_BRICK_WALL = 0x357,
-	NOUN_BIKE_RACK = 0x358,
-	NOUN_ODONALDS_SIGN = 0x359,
-	NOUN_ELEVATOR_ENTRANCE = 0x35A,
-	NOUN_SPECIAL_SALE_SIGN = 0x35B,
-	NOUN_ATTORNEYS_AT_LAW = 0x35C,
-	NOUN_SLEDGE_MALL = 0x35D,
-	NOUN_SKELETON = 0x35E,
-	NOUN_STRANGE_EQUIPMENT = 0x35F,
-	NOUN_STREET_TO_WEST = 0x360,
-	NOUN_SIDEWALK_TO_WEST = 0x361,
-	NOUN_TELEPORTER_ENTRANCE = 0x362,
-	NOUN_SOFTWARE_DOOR = 0x363,
-	NOUN_SPINACH_PATCH_DOLL = 0x364,
-	//NOUN_REFLECT = 0x365,
-	NOUN_REGISTER_DRAWER = 0x366,
-	NOUN_ELEVATOR_DOOR = 0x367,
-	NOUN_HYDRAULIC_SUPPORT = 0x368,
-	NOUN_EQUIPMENT_OVERHEAD = 0x369,
-	//NOUN_GET_INTO = 0x36A,
-	NOUN_WARNING_LABEL = 0x36B,
-	NOUN_NUCLEAR_SLINGSHOT = 0x36C,
-	NOUN_DISPLAY_CASE = 0x36D,
-	NOUN_PHOTON_RIFLES = 0x36E,
-	NOUN_MONITORING_EQUIPMENT = 0x36F,
-	NOUN_TELESCOPE = 0x370,
-	NOUN_MOTEL = 0x371,
-	NOUN_RESTAURANT = 0x372,
-	NOUN_SOFTWARE_STORE_SIGN = 0x373,
-	NOUN_ADVERTISING_POSTER = 0x374,
-	NOUN_ADVERTISEMENT = 0x375,
-	NOUN_OLD_SOFTWARE = 0x376,
-	NOUN_CASH_REGISTER = 0x377,
-	NOUN_ENTRANCE = 0x378,
-	NOUN_LASER_CANNON = 0x379,
-	NOUN_SAND_BAGS = 0x37A,
-	NOUN_PLEASURE_DOME = 0x37B,
-	NOUN_DOME_ENTRANCE = 0x37C,
-	NOUN_LABORATORY = 0x37D,
-	NOUN_STREET_TO_SOUTH = 0x37E,
-	NOUN_ELEVATOR_ACCESS_SLOT = 0x37F,
-	NOUN_CAR_CONTROLS = 0x380,
-	NOUN_SCENT_PACKET = 0x381,
-	NOUN_KITTY = 0x382,
-	NOUN_GLOVE_COMPARTMENT = 0x383,
-	NOUN_MOLDY_SOCK = 0x384,
-	NOUN_SODA_CANS = 0x385,
-	NOUN_WINDSHIELD = 0x386,
-	NOUN_DASHBOARD = 0x387,
-	NOUN_INTERIOR_OF_CAR = 0x388,
-	NOUN_VIEW_RIGHT_BUTTON = 0x389,
-	NOUN_BLACK_BUTTON = 0x38A,
-	NOUN_WHITE_BUTTON = 0x38B,
-	NOUN_INSIDE_OF_CAR = 0x38C,
-	NOUN_RIM_TOWARDS_WEST = 0x38D,
-	NOUN_CEMENT_BLOCK = 0x38E,
-	NOUN_CITY = 0x38F,
-	NOUN_SPEAKER = 0x390,
-	NOUN_EYE_CHART = 0x391,
-	NOUN_LAUNCH_PAD = 0x392,
-	NOUN_BUILDING_TO_WEST = 0x393,
-	NOUN_PAD_TO_EAST = 0x394,
-	NOUN_PAD_TO_WEST = 0x395,
-	NOUN_TOWER = 0x396,
-	//NOUN_LOOK_OUT = 0x397,
-	NOUN_SERVICE_PANEL = 0x398,
-	NOUN_CRACK = 0x399,
-	NOUN_THROTTLE = 0x39A,
-	NOUN_GRAB = 0x39B,
-	NOUN_INSTRUMENTATION = 0x39C,
-	NOUN_TP = 0x39D,
-	NOUN_SEAT = 0x39E,
-	NOUN_STATUS_PANEL = 0x39F,
-	NOUN_SHIPS_CONTROLS = 0x3A0,
-	NOUN_PROFESSOR = 0x3A1,
-	NOUN_PROFESSORS_GURNEY = 0x3A2,
-	NOUN_WELCOME_MAT = 0x3A3,
-	NOUN_MELON_MUSH = 0x3A4,
-	NOUN_BADMINTON_BRAT = 0x3A5,
-	//NOUN_APPLY = 0x3A6,
-	NOUN_COMBINATION = 0x3A7,
-	NOUN_NOTE = 0x3A8,
-	NOUN_LECITHIN = 0x3A9,
-	NOUN_REPAIR_WOMAN = 0x3AA,
-	NOUN_EXPLOSIVES = 0x3AB,
-	NOUN_DOLLOP = 0x3AC,
-	NOUN_DROP = 0x3AD,
-	NOUN_DASH = 0x3AE,
-	NOUN_SPLASH = 0x3AF,
-	NOUN_DOCK_TO_SOUTH = 0x3B0,
-	//NOUN_STEER_TOWARDS = 0x3B1,
-	NOUN_BUILDING_TO_NORTH = 0x3B2,
-	NOUN_VOLCANO_RIM = 0x3B3,
-	NOUN_OPEN_WATER_TO_SOUTH = 0x3B4,
-	NOUN_PROJECTOR = 0x3B5,
-	NOUN_GUARDS_ARM2 = 0x3B6,
-	//NOUN_NIBBLE_ON = 0x3B7,
-	//NOUN_ENTER = 0x3B8,
-	NOUN_ = 0x3B9,
-	NOUN_TIMER_BUTTON_1 = 0x3BA,
-	NOUN_REMOTE_BUTTON_1 = 0x3BB,
-	NOUN_START_BUTTON_2 = 0x3BC,
-	NOUN_REMOTE_BUTTON_2 = 0x3BD,
-	NOUN_TIMER_BUTTON_2 = 0x3BE,
-	NOUN_START_BUTTON_1 = 0x3BF,
-	NOUN_ANTIGRAV_CONTROLS = 0x3C0,
-	NOUN_BRUCES_TREE = 0x3C1,
-	NOUN_COLISEUM = 0x3C2,
-	NOUN_BRUCES_GARDEN_ROOM = 0x3C3,
-	NOUN_FOUNTAIN = 0x3C4,
-	NOUN_HOUSE_OF_BRUCE = 0x3C5,
-	NOUN_CITY_BACKDROP = 0x3C6,
-	NOUN_BRUCES_BALCONY = 0x3C7,
-	NOUN_BRUCES_ENTRANCE = 0x3C8,
-	NOUN_BRUCES_LOGO = 0x3C9,
-	NOUN_LOUNGE_CHAIR = 0x3CA,
-	NOUN_LIVING_ROOM_FLOOR = 0x3CB,
-	NOUN_LIVINGROOM_FLOOR = 0x3CC,
-	NOUN_PERFUME_BOTTLE = 0x3CD,
-	NOUN_COOL_NEON_LIGHT = 0x3CE,
-	NOUN_FLOWER_POT = 0x3CF,
-	NOUN_COFFEE_TABLE = 0x3D0,
-	NOUN_FLOWERS = 0x3D1,
-	NOUN_ART_DECO_CHAIR = 0x3D2,
-	NOUN_SAFE = 0x3D3,
-	NOUN_SPLASHY_DECOR = 0x3D4,
-	NOUN_THEATRICAL_FACES = 0x3D5,
-	NOUN_ART_DECO_PIECE = 0x3D6,
-	NOUN_END_OF_ROOM = 0x3D7,
-	NOUN_FIREPLACE = 0x3D8,
-	NOUN_ARTWORK = 0x3D9,
-	NOUN_COOL_NEON_LIGHTS = 0x3DA,
-	NOUN_GLASS_PLATED_WINDOW = 0x3DB,
-	NOUN_BEDROOM_FLOOR = 0x3DC,
-	NOUN_BAUBLE = 0x3DD,
-	NOUN_SNAPSHOT = 0x3DE,
-	NOUN_PERFUME = 0x3DF,
-	NOUN_CLAPBOARD = 0x3E0,
-	NOUN_BERET = 0x3E1,
-	NOUN_HORSE_WHIP = 0x3E2,
-	NOUN_CORNER_TABLE = 0x3E3,
-	NOUN_BOA = 0x3E4,
-	NOUN_WIG_STAND = 0x3E5,
-	NOUN_PARTITION = 0x3E6,
-	NOUN_MEGAPHONE = 0x3E7,
-	NOUN_SLIP = 0x3E8,
-	NOUN_SCONCE = 0x3E9,
-	NOUN_VANITY = 0x3EA,
-	NOUN_BEDBOARD = 0x3EB,
-	NOUN_LOVE_SEAT = 0x3EC,
-	NOUN_SOUVENIR_TICKETS = 0x3ED,
-	NOUN_REVIEW = 0x3EE,
-	NOUN_BRUCE_AT_THE_GALA = 0x3EF,
-	NOUN_ART_DECO_RUG = 0x3F0,
-	NOUN_LIVINGROOM = 0x3F1,
-	NOUN_SCULPTURE = 0x3F2,
-	NOUN_SPECIMEN_EPITHET = 0x3F3,
-	NOUN_VENT = 0x3F4,
-	NOUN_FLOWER_BOX = 0x3F5,
-	NOUN_LEDGE = 0x3F6,
-	NOUN_BOLT = 0x3F7,
-	NOUN_OBSERVATION_WINDOW = 0x3F8,
-	NOUN_AIR_HOSE = 0x3F9,
-	NOUN_AUTO_SHOP = 0x3FA,
-	NOUN_MANHOLE = 0x3FB,
-	NOUN_AUTO_SHOP_ENTRANCE = 0x3FC,
-	NOUN_BROKEN_WINDOW = 0x3FD,
-	NOUN_WOMANHOLE = 0x3FE,
-	NOUN_GARAGE_DOOR = 0x3FF,
-	NOUN_SCRATCH_PAD = 0x400,
-	NOUN_GAS_PRICES = 0x401,
-	NOUN_UP_BUTTON = 0x402,
-	NOUN_DOWN_BUTTON = 0x403,
-	NOUN_SPARE_PARTS_LIST = 0x404,
-	NOUN_SKYLIGHT = 0x405,
-	NOUN_TOOL_BOX = 0x406,
-	NOUN_CAR_LIFT = 0x407,
-	NOUN_CAR_SEAT = 0x408,
-	NOUN_GARAGE_FLOOR = 0x409,
-	NOUN_GARAGE_DOOR_CONTROLS = 0x40A,
-	NOUN_AMISH_HAT = 0x40B,
-	NOUN_JACK = 0x40C,
-	NOUN_COILS = 0x40D,
-	NOUN_OIL_CAN = 0x40E,
-	NOUN_FAN_BELTS = 0x40F,
-	NOUN_REAR_OF_GARAGE = 0x410,
-	NOUN_FRONT_OF_GARAGE = 0x411,
-	NOUN_MUFFLER = 0x412,
-	NOUN_SPARE_PART = 0x413,
-	NOUN_HUBCAP = 0x414,
-	NOUN_CANDLE = 0x415,
-	NOUN_RATES = 0x416,
-	NOUN_GREASE_CAN = 0x417,
-	NOUN_CALENDAR = 0x418,
-	NOUN_FORK_LIFT = 0x419,
-	NOUN_TRASH_CAN = 0x41A,
-	NOUN_SHAKER_CHAIR = 0x41B,
-	NOUN_QUARTER_PANEL = 0x41C,
-	NOUN_AREA_BEHIND_CAR = 0x41D,
-	NOUN_DANGER_ZONE = 0x41E,
-	NOUN_NEWSSTAND = 0x41F,
-	NOUN_LADY_GODIVA_MONUMENT = 0x420,
-	NOUN_SPOT_A_POT = 0x421,
-	NOUN_GUARD_RAIL = 0x422,
-	NOUN_ALLEY = 0x423,
-	NOUN_DITCH = 0x424,
-	NOUN_VIDEO_STORE_DOOR = 0x425,
-	NOUN_BUCKLUSTER_MARQUEE = 0x426,
-	NOUN_VIDEO_STORE = 0x427,
-	NOUN_HORMONE_BILLBOARD = 0x428,
-	NOUN_PHONE_ANTENNA = 0x429,
-	NOUN_RETURN_SLOT = 0x42A,
-	NOUN_NOOSE = 0x42B,
-	NOUN_COMEDY_VIDEOS = 0x42C,
-	NOUN_SMELLY_SNEAKER = 0x42D,
-	NOUN_PIPPYS_STOCKING = 0x42E,
-	NOUN_PHONE_CRADLE = 0x42F,
-	NOUN_DRAMA_VIDEOS = 0x430,
-	NOUN_SPOTLIGHT = 0x431,
-	NOUN_STOREROOM_FLOOR = 0x432,
-	NOUN_ALL_SALES_FINAL = 0x433,
-	NOUN_MACHOPROSE_TEE_SHIRT = 0x434,
-	NOUN_UNKNOWN_COMIC_HANDS = 0x435,
-	NOUN_WET_CEMENT = 0x436,
-	NOUN_PIPPYS_TINY_IMPRINT = 0x437,
-	NOUN_OBNOXIOUS_DOG_PAWS = 0x438,
-	NOUN_LEG_AND_A_LEG_JEANS = 0x439,
-	NOUN_VIDEO_STORE_EXIT = 0x43A,
-	NOUN_AISLE = 0x43B,
-	NOUN_VIDEO_MONITOR = 0x43C,
-	NOUN_POLLY_PIGS_IMPRINT = 0x43D,
-	NOUN_JOHN_WYNNS_IMPRINT = 0x43E,
-	NOUN_MR_NEDS_IMPRINT = 0x43F,
-	NOUN_PEG_LEG_PETE_IMPRINT = 0x440,
-	NOUN_MARX_BROS_POSTER = 0x441,
-	NOUN_PIPPY_BILLBOARD = 0x442,
-	NOUN_VIDEOS_NOONE_WANTS = 0x443,
-	NOUN_MORE_CLASSIC_VIDEOS = 0x444,
-	NOUN_JOIN_OUR_PRICE_CLUB = 0x445,
-	NOUN_EDUCATIONAL_VIDEOS = 0x446,
-	NOUN_DEEP_DISCOUNT_TITLES = 0x447,
-	NOUN_WORLD_CHAMPS_POSTER = 0x448,
-	NOUN_WORKOUT_VIDEOS = 0x449,
-	NOUN_20_PERCENT_OFF_SIGN = 0x44A,
-	NOUN_CIVILIZATION_AD = 0x44B,
-	NOUN_NEW_RELEASE_VIDEOS = 0x44C,
-	NOUN_PORNO_VIDEOS = 0x44D,
-	NOUN_FOREIGN_VIDEOS = 0x44E,
-	NOUN_CLASSIC_VIDEOS = 0x44F,
-	NOUN_ADVENTURE_VIDEOS = 0x450,
-	NOUN_BUCKLUSTER_LOGO = 0x451,
-	NOUN_WINE_BOTTLE = 0x452,
-	NOUN_DIRT_PILE = 0x453,
-	NOUN_MAMMOTH_PENCIL_HEAD = 0x454,
-	NOUN_WREAKY_PUMPKIN = 0x455,
-	NOUN_MILK_CARTON = 0x456,
-	NOUN_BUCKET = 0x457,
-	NOUN_EMPTY_BOX = 0x458,
-	NOUN_DIAPER_BOX = 0x459,
-	NOUN_HERMIT = 0x45A,
-	NOUN_METAL_PIPE = 0x45B,
-	NOUN_CONCRETE_SUPPORT = 0x45C,
-	NOUN_VARIOUS_TRASH = 0x45D,
-	NOUN_ARMATURE = 0x45E,
-	NOUN_CONTROL_BOX = 0x45F,
-	NOUN_TOP_OF_DOME = 0x460,
-	NOUN_EXPRESSWAY_TO_EAST = 0x461,
-	NOUN_GO_TOWARDS = 0x462,
-	NOUN_EXPRESSWAY_TO_WEST = 0x463,
-	NOUN_DOME = 0x464,
-	NOUN_VIEW_OF_CITY = 0x465,
-	NOUN_EXPRESSWAY = 0x466,
-	NOUN_HOOK = 0x467,
-	NOUN_SEA_MONSTER = 0x468,
-	NOUN_EDGE_OF_VOLCANO = 0x469,
-	NOUN_JUMP_THROUGH = 0x46A,
-	NOUN_OLD_TEA_CUP = 0x46B,
-	NOUN_NAME_PLATE = 0x46C,
-	NOUN_OLD_VASE = 0x46D,
-	NOUN_PORTRAIT = 0x46E,
-	//NOUN_PUT_DOWN = 0x46F,
-	NOUN_TALL_BUILDING = 0x470,
-	NOUN_OBNOXIOUS_DOG = 0x471,
-	NOUN_GUTS = 0x472,
-	NOUN_BIG_HEADS = 0x473,
-	NOUN_INSTALL = 0x474,
-	NOUN_LIFE_SUPPORT_MODULE = 0x475,
-	//NOUN_REMOVE = 0x476,
-	NOUN_LARGE_BLADE = 0x477,
-	NOUN_SIDE_ENTRANCE = 0x478,
-	NOUN_INDICATOR = 0x479,
-	NOUN_SIGNPOST = 0x47A,
-	NOUN_PIN = 0x47B,
-	NOUN_POWDER_PUFF = 0x47C,
-	NOUN_SHELVES = 0x47D,
-	NOUN_ELECTRODES = 0x47E,
-	NOUN_MISHAP2 = 0x47F,
-	NOUN_ISLD_SUPERSTRUCTURE = 0x480,
-	NOUN_FILE_CABINETS = 0x481,
-	NOUN_CYCLE_SHOP = 0x482,
-	NOUN_AIR_BIKE = 0x483,
-	NOUN_EMERGENCY_LIGHT = 0x484,
-	NOUN_TARGET_AREA = 0x485,
-	NOUN_ICE_CHESTS = 0x486,
-	NOUN_BIRDS = 0x487,
-	NOUN_DOCTORS_OFFICE = 0x488,
-	//NOUN_DEFACE = 0x489,
-	NOUN_LARGE_HEADS = 0x48A,
-	NOUN_SMALL_TABLE = 0x48B,
-	NOUN_COLLOSSEUM = 0x48C,
-	NOUN_HOUSE = 0x48D,
-	NOUN_BALCONY = 0x48E,
-	NOUN_GARDEN_ROOM = 0x48F,
-	NOUN_COVE_LIGHTS = 0x490,
-	NOUN_MASKS = 0x491,
-	NOUN_NEON_LIGHTS = 0x492,
-	NOUN_GLASS_BLOCK_WALL = 0x493,
-	NOUN_SCREEN = 0x494,
-	NOUN_SPARE_RIBS = 0x495,
-	NOUN_BANNER = 0x496,
-	NOUN_INSTRUCTIONAL_VIDEOS = 0x497,
-	NOUN_CEMENT = 0x498,
-	NOUN_STORE = 0x499,
-	NOUN_CARDBOARD_BOX = 0x49A,
-	NOUN_GRAFFITTI = 0x49B,
-	NOUN_GRAFFITI = 0x49C,
-	NOUN_PHOTOGRAPH = 0x49D,
-	NOUN_DIRECTORS_SLATE = 0x49E,
-	NOUN_CROP = 0x49F,
-	NOUN_HAT = 0x4A0,
-	NOUN_LOGO = 0x4A1,
-	NOUN_MAINTENANCE_BUILDING = 0x4A2,
-	//NOUN_MASSAGE = 0x4A3,
-	//NOUN_MANGLE = 0x4A4,
-	//NOUN_RUB = 0x4A5,
-	//NOUN_JUGGLE = 0x4A6,
-	//NOUN_SMASH = 0x4A7,
-	//NOUN_GUZZLE = 0x4A8,
-	NOUN_WEST_END_OF_PLATFORM = 0x4A9,
-	NOUN_EAST_END_OF_PLATFORM = 0x4AA
-	//NOUN_FOLD = 0x4AB,
-	//NOUN_SPINDLE = 0x4AC,
-	//NOUN_MUTILATE = 0x4AD
+	words_none                 = 0,
+	words_game                 = 1,
+	words_qsave                = 2,
+	words_look                 = 3,
+	words_take                 = 4,
+	words_push                 = 5,
+	words_open                 = 6,
+	words_put                  = 7,
+	words_talkto               = 8,
+	words_talk_to              = 8,
+	words_give                 = 9,
+	words_pull                 = 10,
+	words_close                = 11,
+	words_throw                = 12,
+	words_walkto               = 13,
+	words_walk_to              = 13,
+	words_activate             = 14,
+	words_admire               = 15,
+	words_adsm                 = 16,
+	words_air_vent             = 17,
+	words_aloe_plant           = 18,
+	words_anemone              = 19,
+	words_anomometer           = 20,
+	words_area_around_hut      = 21,
+	words_area_to_south        = 22,
+	words_area_to_west         = 23,
+	words_aromatic_meat        = 24,
+	words_attach               = 25,
+	words_audio_tape           = 26,
+	words_auxiliary_power      = 27,
+	words_badmitton_brat       = 28,
+	words_bag                  = 29,
+	words_bamboo_tree          = 30,
+	words_bats                 = 31,
+	words_bawlemer_oriole_hun  = 32,
+	words_bear_rug             = 33,
+	words_beastly_trophy       = 34,
+	words_big_leaves           = 35,
+	words_big_pipes            = 36,
+	words_big_sky              = 37,
+	words_big_stone            = 38,
+	words_binoculars           = 39,
+	words_birdies              = 40,
+	words_blowgun              = 41,
+	words_bomb                 = 42,
+	words_bombs                = 43,
+	words_bone                 = 44,
+	words_bones                = 45,
+	words_bottle               = 46,
+	words_boulder              = 47,
+	words_boulders             = 48,
+	words_bra                  = 49,
+	words_break                = 50,
+	words_breathe_air          = 51,
+	words_bulkhead             = 52,
+	words_burger               = 53,
+	words_burn                 = 54,
+	words_burnt_out_warp_coil  = 55,
+	words_bush_like_formation  = 56,
+	words_bushes               = 57,
+	words_bushy_fern           = 58,
+	words_cactus               = 59,
+	words_card                 = 60,
+	words_cast                 = 61,
+	words_cauldron             = 62,
+	words_cave                 = 63,
+	words_cave_ceiling         = 64,
+	words_cave_entrance        = 65,
+	words_cave_exit            = 66,
+	words_cave_floor           = 67,
+	words_cave_to_east         = 68,
+	words_cave_wall            = 69,
+	words_ceiling              = 70,
+	words_chair                = 71,
+	words_charge_cases         = 72,
+	words_chicken              = 73,
+	words_chicken_bomb         = 74,
+	words_clearing_to_east     = 75,
+	words_clearing_to_south    = 76,
+	words_cliff_face           = 77,
+	words_climb_down           = 78,
+	words_climb_through        = 79,
+	words_climb_up             = 80,
+	words_clock                = 81,
+	words_closet               = 82,
+	words_clothesline          = 83,
+	words_clump_of_trees       = 84,
+	words_coal                 = 85,
+	words_cocoanut             = 86,
+	words_compact_case         = 87,
+	words_computer_game        = 88,
+	words_control_panel        = 89,
+	words_coral                = 90,
+	words_crab                 = 91,
+	words_credit_chip          = 92,
+	words_cumulous_cloud       = 93,
+	words_curious_weed_patch   = 94,
+	words_curtain              = 95,
+	words_curtains             = 96,
+	words_cut                  = 97,
+	words_damage_control       = 98,
+	words_damage_control_panel = 99,
+	words_dampen               = 100,
+	words_dead_fish            = 101,
+	words_dead_purple_monster  = 102,
+	words_declivitous_chasm    = 103,
+	words_deep_dark_forest     = 104,
+	words_dense_forest         = 105,
+	words_detonators           = 106,
+	words_dino_mite            = 107,
+	words_disassemble          = 108,
+	words_dive_into            = 109,
+	words_door                 = 110,
+	words_door_key             = 111,
+	words_doorway              = 112,
+	words_drawer               = 113,
+	words_drink                = 114,
+	words_durafail_cells       = 115,
+	words_eastern_cliff_face   = 116,
+	words_eat                  = 117,
+	words_eject                = 118,
+	words_empty                = 119,
+	words_engineering_controls = 120,
+	words_engineering_section  = 121,
+	words_enter_key            = 122,
+	words_escape_hatch         = 123,
+	words_estrotoxin           = 124,
+	words_examine              = 125,
+	words_experiment_cage      = 126,
+	words_extinguish           = 127,
+	words_face_id              = 128,
+	words_fern                 = 129,
+	words_field_to_north       = 130,
+	words_field_to_south       = 131,
+	words_field_to_west        = 132,
+	words_fill                 = 133,
+	words_fire_pit             = 134,
+	words_fishing_line         = 135,
+	words_fishing_rod          = 136,
+	words_floor                = 137,
+	words_floor_of_hut         = 138,
+	words_floor_tile           = 139,
+	words_fondle               = 140,
+	words_forest_to_east       = 141,
+	words_front_window         = 142,
+	words_fungoids             = 143,
+	words_furnace              = 144,
+	words_fuzzy_dice           = 145,
+	words_gaze                 = 146,
+	words_gaze_at              = 147,
+	words_gaze_in              = 148,
+	words_glance_at            = 149,
+	words_glove                = 150,
+	words_gnarly_shrub         = 151,
+	words_gnaw_on              = 152,
+	words_gorge_on             = 153,
+	words_grain_alchohol       = 154,
+	words_grassland_to_east    = 155,
+	words_grassland_to_south   = 156,
+	words_grassy_area          = 157,
+	words_grassy_area_to_north = 158,
+	words_grassy_knoll         = 159,
+	words_grind                = 160,
+	words_groovilactic_tree    = 161,
+	words_guards_arm           = 162,
+	words_hatchway             = 163,
+	words_hook_up              = 164,
+	words_horizon              = 165,
+	words_hose_down            = 166,
+	words_hotpants             = 167,
+	words_hull                 = 168,
+	words_hurl                 = 169,
+	words_hut                  = 170,
+	words_hut_area             = 171,
+	words_hut_to_east          = 172,
+	words_hut_to_south         = 173,
+	words_hut_to_the_south     = 174,
+	words_hut_to_west          = 175,
+	words_huts_to_north        = 176,
+	words_hydrospanner         = 177,
+	words_hyperdrive_jump_unit = 178,
+	words_id_card              = 179,
+	words_ignite               = 180,
+	words_inflate              = 181,
+	words_insert               = 182,
+	words_inspect              = 183,
+	words_jungle               = 184,
+	words_jungle_to_east       = 185,
+	words_jungle_to_west       = 186,
+	words_key_1                = 187,
+	words_key_2                = 188,
+	words_key_3                = 189,
+	words_key_4                = 190,
+	words_key_5                = 191,
+	words_key_6                = 192,
+	words_key_7                = 193,
+	words_key_8                = 194,
+	words_key_9                = 195,
+	words_keypad               = 196,
+	words_kneeling_woman       = 197,
+	words_knife                = 198,
+	words_ladder               = 199,
+	words_large_stalagmite     = 200,
+	words_leer_at              = 201,
+	words_library_computer     = 202,
+	words_lick                 = 203,
+	words_life_support_section = 204,
+	words_light                = 205,
+	words_load                 = 206,
+	words_lock                 = 207,
+	words_log                  = 208,
+	words_look_at              = 209,
+	words_look_in              = 210,
+	words_look_through         = 211,
+	words_lounge_area          = 212,
+	words_love_altar           = 213,
+	words_lowlands             = 214,
+	words_machine              = 215,
+	words_magnet               = 216,
+	words_main_airlock         = 217,
+	words_manta_ray            = 218,
+	words_marshy_wetlands      = 219,
+	words_match                = 220,
+	words_medical_waste        = 221,
+	words_medicine_cabinet     = 222,
+	words_men_who_came_before  = 223,
+	words_mine                 = 224,
+	words_mirror               = 225,
+	words_monitor              = 226,
+	words_monkey               = 227,
+	words_monkey_liver_juice   = 228,
+	words_monster_sludge       = 229,
+	words_mountain             = 230,
+	words_mountain_range       = 231,
+	words_mountains            = 232,
+	words_mtam                 = 233,
+	words_mushrooms            = 234,
+	words_navigation_controls  = 235,
+	words_north_path           = 236,
+	words_northern_exposure    = 237,
+	words_northern_sea_cliff   = 238,
+	words_obstacle             = 239,
+	words_ocean_floor          = 240,
+	words_odd_rock_formation   = 241,
+	words_oogly_boogly_juice   = 242,
+	words_open_area_to_east    = 243,
+	words_open_area_to_north   = 244,
+	words_open_area_to_south   = 245,
+	words_open_area_to_west    = 246,
+	words_open_field           = 247,
+	words_outer_hull           = 248,
+	words_outside              = 249,
+	words_oven                 = 250,
+	words_overhang_to_east     = 251,
+	words_overhang_to_west     = 252,
+	words_overhead_lamp        = 253,
+	words_pad_of_paper         = 254,
+	words_padlock_key          = 255,
+	words_palm_tree            = 256,
+	words_passage_way_to_south = 257,
+	words_passion_puss         = 258,
+	words_peer_through         = 259,
+	words_pencil               = 260,
+	words_pendulous_crag       = 261,
+	words_penlight             = 262,
+	words_phone_cells          = 263,
+	words_phone_handset        = 264,
+	words_pile_of_rocks        = 265,
+	words_pillow               = 266,
+	words_pilots_chair         = 267,
+	words_pipe                 = 268,
+	words_piranha              = 269,
+	words_plant                = 270,
+	words_plant_stalk          = 271,
+	words_plants               = 272,
+	words_plastic_jesus        = 273,
+	words_play                 = 274,
+	words_plunger              = 275,
+	words_poison_darts         = 276,
+	words_polycement           = 277,
+	words_pool                 = 278,
+	words_poster               = 279,
+	words_power_status_panel   = 280,
+	words_precipice            = 281,
+	words_press                = 282,
+	words_pressure_gauge       = 283,
+	words_pry                  = 284,
+	words_raging_river         = 285,
+	words_ramolyan_rugby_rats  = 286,
+	words_read                 = 287,
+	words_rearview_mirror      = 288,
+	words_rebreather           = 289,
+	words_refrigerator         = 290,
+	words_remote               = 291,
+	words_repair_list          = 292,
+	words_river                = 293,
+	words_river_to_west        = 294,
+	words_robo_kitchen         = 295,
+	words_rock                 = 296,
+	words_rocks                = 297,
+	words_rocky_area           = 298,
+	words_rolling_hill         = 299,
+	words_scalpel              = 300,
+	words_scenic_mountains     = 301,
+	words_sea_cliff            = 302,
+	words_seaweed              = 303,
+	words_seaweed_bank         = 304,
+	words_security_card        = 305,
+	words_set                  = 306,
+	words_shake_hands          = 307,
+	words_sharpen              = 308,
+	words_shield_access_panel  = 309,
+	words_shield_generator     = 310,
+	words_shield_modulator     = 311,
+	words_shield_status_panel  = 312,
+	words_ship                 = 313,
+	words_shoot                = 314,
+	words_shovel               = 315,
+	words_shred                = 316,
+	words_shrunken_heads       = 317,
+	words_singed_meat          = 318,
+	words_sit_in               = 319,
+	words_skull                = 320,
+	words_skull_and_crossbones = 321,
+	words_sky                  = 322,
+	words_sleep_on             = 323,
+	words_slithering_snake     = 324,
+	words_slug_secretion       = 325,
+	words_small_hole           = 326,
+	words_smell                = 327,
+	words_snake                = 328,
+	words_sniff                = 329,
+	words_soak                 = 330,
+	words_special_key_1        = 331,
+	words_special_key_2        = 332,
+	words_spider               = 333,
+	words_spilt_milk           = 334,
+	words_spit_fire            = 335,
+	words_spray                = 336,
+	words_stab                 = 337,
+	words_stairs               = 338,
+	words_stalagmites          = 339,
+	words_stand_inside         = 340,
+	words_stare_at             = 341,
+	words_steps                = 342,
+	words_stuffed_fish         = 343,
+	words_surface              = 344,
+	words_swim_across          = 345,
+	words_swim_into            = 346,
+	words_swim_through         = 347,
+	words_swim_to              = 348,
+	words_swim_towards         = 349,
+	words_swim_under           = 350,
+	words_swooping_creature    = 351,
+	words_table                = 352,
+	words_take_liver           = 353,
+	words_take_off             = 354,
+	words_take_page            = 355,
+	words_tall_grass           = 356,
+	words_tape_player          = 357,
+	words_target_computer      = 358,
+	words_target_module        = 359,
+	words_targetting_computer  = 360,
+	words_tasmanian_devil      = 361,
+	words_tasty_turkey         = 362,
+	words_teleport_device      = 363,
+	words_teleporter           = 364,
+	words_thatched_roof        = 365,
+	words_thorns               = 366,
+	words_thorny_bush          = 367,
+	words_tie                  = 368,
+	words_timebomb             = 369,
+	words_timer                = 370,
+	words_timer_module         = 371,
+	words_tree                 = 372,
+	words_trees                = 373,
+	words_trodden_path         = 374,
+	words_tube                 = 375,
+	words_tunnel               = 376,
+	words_twinkie_bush         = 377,
+	words_twinkifruit          = 378,
+	words_unlock               = 379,
+	words_uzi                  = 380,
+	words_vase                 = 381,
+	words_video_game           = 382,
+	words_view                 = 383,
+	words_view_screen          = 384,
+	words_viewport             = 385,
+	words_village_area         = 386,
+	words_village_to_west      = 387,
+	words_volcano              = 388,
+	words_vulture              = 389,
+	words_wad_of_cattle_parts  = 390,
+	words_walk_across          = 391,
+	words_walk_inside          = 392,
+	words_walk_on              = 393,
+	words_walk_outside         = 394,
+	words_walk_through         = 395,
+	words_walk_towards         = 396,
+	words_wall                 = 397,
+	words_watch_tower          = 398,
+	words_water                = 399,
+	words_weapons_display      = 400,
+	words_wear                 = 401,
+	words_weather_station      = 402,
+	words_weather_vane         = 403,
+	words_weight_machine       = 404,
+	words_western_cliff_face   = 405,
+	words_wheel                = 406,
+	words_window               = 407,
+	words_witchdoctor_hut      = 408,
+	words_workbench            = 409,
+	words_write_on             = 410,
+	words_yellow_birdy         = 411,
+	words_grass                = 412,
+	words_bouncing_reptile     = 413,
+	words_deep_pit             = 414,
+	words_lowlands_to_north    = 415,
+	words_small_bush           = 416,
+	words_small_cactus         = 417,
+	words_rocky_area_to_north  = 418,
+	words_bamboo_like_plant    = 419,
+	words_mountainside         = 420,
+	words_field                = 421,
+	words_grassy_field         = 422,
+	words_crag                 = 423,
+	words_huge_legs            = 424,
+	words_leaf_covered_pit     = 425,
+	words_pile_of_leaves       = 426,
+	words_open_field_to_east   = 427,
+	words_lawn                 = 428,
+	words_walk_down            = 429,
+	words_path_to_west         = 430,
+	words_hedge                = 431,
+	words_village_path         = 432,
+	words_path_to_northeast    = 433,
+	words_jungle_path          = 434,
+	words_thick_undergrowth    = 435,
+	words_ocean                = 436,
+	words_ocean_in_distance    = 437,
+	words_strange_device       = 438,
+	words_bush                 = 439,
+	words_anemometer           = 440,
+	words_island_in_distance   = 441,
+	words_path                 = 442,
+	words_trophy               = 443,
+	words_specimen_jars        = 444,
+	words_bowl                 = 445,
+	words_large_bowl           = 446,
+	words_path_to_north        = 447,
+	words_hut_to_north         = 448,
+	words_path_to_east         = 449,
+	words_chicken_on_spit      = 450,
+	words_captive_creature     = 451,
+	words_twinkifruit_bush     = 452,
+	words_stream               = 453,
+	words_opposite_shore       = 454,
+	words_path_to_south        = 455,
+	words_opposite_bank        = 456,
+	words_broken_ladder        = 457,
+	words_bag_of_twinkifruits  = 458,
+	words_bed                  = 459,
+	words_display              = 460,
+	words_leave                = 461,
+	words_exit_from            = 462,
+	words_device               = 463,
+	words_0_key                = 464,
+	words_1_key                = 465,
+	words_2_key                = 466,
+	words_3_key                = 467,
+	words_4_key                = 468,
+	words_5_key                = 469,
+	words_6_key                = 470,
+	words_7_key                = 471,
+	words_8_key                = 472,
+	words_9_key                = 473,
+	words_frown_key            = 474,
+	words_smile_key            = 475,
+	words_native_woman         = 476,
+	words_yellow_bird          = 477,
+	words_bleeper              = 478,
+	words_sizemometer          = 479,
+	words_panel                = 480,
+	words_printer              = 481,
+	words_hard_drive           = 482,
+	words_bathroom             = 483,
+	words_desk                 = 484,
+	words_passageway           = 485,
+	words_fire_hydrant         = 486,
+	words_freezer              = 487,
+	words_equidigitizer        = 488,
+	words_vision_view          = 489,
+	words_teledetector         = 490,
+	words_pole                 = 491,
+	words_transposition_device = 492,
+	words_statuesque           = 493,
+	words_temperature_gauge    = 494,
+	words_check                = 495,
+	words_watch                = 496,
+	words_electro_scanner      = 497,
+	words_hall                 = 498,
+	words_scanner              = 499,
+	words_place_hand_on        = 500,
+	words_security_monitor     = 501,
+	words_digitorama           = 502,
+	words_rail_beam            = 503,
+	words_vault                = 504,
+	words_hallway              = 505,
+	words_pipes                = 506,
+	words_air_vent_grate       = 507,
+	words_security_office      = 508,
+	words_signal               = 509,
+	words_bleep                = 510,
+	words_blip                 = 511,
+	words_loft                 = 512,
+	words_electronic_ant_farm  = 513,
+	words_electric_wiring      = 514,
+	words_security_panel       = 515,
+	words_corridor             = 516,
+	words_circuit_controls     = 517,
+	words_air_duct             = 518,
+	words_cell_wall            = 519,
+	words_lights               = 520,
+	words_stare_into           = 521,
+	words_cell_controls        = 522,
+	words_commode              = 523,
+	words_use                  = 524,
+	words_basin                = 525,
+	words_jump_inside          = 526,
+	words_previous_cell        = 527,
+	words_next_room            = 528,
+	words_zink                 = 529,
+	words_gaze_into            = 530,
+	words_throne               = 531,
+	words_sack                 = 532,
+	words_limb                 = 533,
+	words_sink                 = 534,
+	words_johnny_on_the_spot   = 535,
+	words_debris               = 536,
+	words_bunk                 = 537,
+	words_next_cell            = 538,
+	words_toilet               = 539,
+	words_monitor_area         = 540,
+	words_sidewall             = 541,
+	words_coffee_mug           = 542,
+	words_sit_at               = 543,
+	words_lighting_fixture     = 544,
+	words_monitors             = 545,
+	words_gender_controls      = 546,
+	words_neuro_analyzer       = 547,
+	words_molecular_recorder   = 548,
+	words_maintenance_panel    = 549,
+	words_ramp                 = 550,
+	words_walk_up              = 551,
+	words_subsonic_atomizer    = 552,
+	words_eight_ball           = 553,
+	words_dna_inverter         = 554,
+	words_dna_converter        = 555,
+	words_platform             = 556,
+	words_guinea_pig_test_box  = 557,
+	words_gaseous_probe_warper = 558,
+	words_tool_cabinet         = 559,
+	words_surgical_boxes       = 560,
+	words_fetal_heart_monitor  = 561,
+	words_xray_cabinet         = 562,
+	words_sterilization_sink   = 563,
+	words_dripolator           = 564,
+	words_shock_machine        = 565,
+	words_interrogation_table  = 566,
+	words_lie_down_on          = 567,
+	words_decipher             = 568,
+	words_guard                = 569,
+	words_rip_in_floor         = 570,
+	words_teleport_area        = 571,
+	words_broken_beam          = 572,
+	words_rock_chunk           = 573,
+	words_bloody_cell_wall     = 574,
+	words_wall_board           = 575,
+	words_gender_scanner       = 576,
+	words_bar                  = 577,
+	words_walk_into            = 578,
+	words_hallway_to_south     = 579,
+	words_sign                 = 580,
+	words_hallway_to_north     = 581,
+	words_bottles              = 582,
+	words_upper_dance_floor    = 583,
+	words_dance_floor          = 584,
+	words_railing              = 585,
+	words_bar_stool            = 586,
+	words_lady                 = 587,
+	words_upper_level          = 588,
+	words_alcove               = 589,
+	words_disco_ball           = 590,
+	words_ladies               = 591,
+	words_coach_lamp           = 592,
+	words_card_slot            = 593,
+	words_hoop                 = 594,
+	words_cannonballs          = 595,
+	words_water_fountain       = 596,
+	words_hallway_to_east      = 597,
+	words_hallway_to_west      = 598,
+	words_support              = 599,
+	words_backboard            = 600,
+	words_wide_door            = 601,
+	words_sign_post            = 602,
+	words_fire_extinguisher    = 603,
+	words_trash                = 604,
+	words_missiles             = 605,
+	words_tank                 = 606,
+	words_two_ton_weight       = 607,
+	words_one_ton_tomato       = 608,
+	words_anvil                = 609,
+	words_minuteman_iv_icbm    = 610,
+	words_chest                = 611,
+	words_armor                = 612,
+	words_carton               = 613,
+	words_powder               = 614,
+	words_raft                 = 615,
+	words_whatzit              = 616,
+	words_catapult             = 617,
+	words_hand_grenade         = 618,
+	words_barrels              = 619,
+	words_loading_ramp         = 620,
+	words_blimp                = 621,
+	words_flour                = 622,
+	words_fly_paper            = 623,
+	words_rug                  = 624,
+	words_carpet               = 625,
+	words_can                  = 626,
+	words_rubber_duckie        = 627,
+	words_golf_clubs           = 628,
+	words_rat                  = 629,
+	words_barrel               = 630,
+	words_bucket_of_tar        = 631,
+	words_sacks                = 632,
+	words_storage              = 633,
+	words_120v_3_phase_400hz   = 634,
+	words_lab_equipment        = 635,
+	words_air_horn             = 636,
+	words_jar                  = 637,
+	words_severed_cable        = 638,
+	words_probe_assembly       = 639,
+	words_knife_switch         = 640,
+	words_work_bench           = 641,
+	words_heater               = 642,
+	words_toxic_waste          = 643,
+	words_experiment           = 644,
+	words_drawing_board        = 645,
+	words_mishap               = 646,
+	words_air_purifier         = 647,
+	words_dummy                = 648,
+	words_picture              = 649,
+	words_baggage_check        = 650,
+	words_departure_schedule   = 651,
+	words_shade_of_pale        = 652,
+	words_itinerary            = 653,
+	words_bargain_vat          = 654,
+	words_pencils              = 655,
+	words_pad_if_paper         = 656,
+	words_deepest_depths       = 657,
+	words_rolodex              = 658,
+	words_mona_tisa            = 659,
+	words_abstract_art         = 660,
+	words_space_questing_viii  = 661,
+	words_theatrical_art       = 662,
+	words_metal_pole           = 663,
+	words_exit                 = 664,
+	words_swirling_light       = 665,
+	words_register             = 666,
+	words_peachy_buns          = 667,
+	words_our_town             = 668,
+	words_embroidered_art      = 669,
+	words_george_bush_alike    = 670,
+	words_counter              = 671,
+	words_sensor               = 672,
+	words_software_information = 673,
+	words_walk_behind          = 674,
+	words_bargains             = 675,
+	words_scan_light           = 676,
+	words_old_software_stand   = 677,
+	words_software_shelf       = 678,
+	words_hottest_software     = 679,
+	words_great_paintball_art  = 680,
+	words_scenic_vista         = 681,
+	words_laser                = 682,
+	words_laser_jet            = 683,
+	words_lever                = 684,
+	words_bullseye             = 685,
+	words_stand                = 686,
+	words_control_station      = 687,
+	words_strange_monster      = 688,
+	words_ghastly_beast        = 689,
+	words_gawk_at              = 690,
+	words_corridor_to_south    = 691,
+	words_corridor_to_north    = 692,
+	words_walk_onto            = 693,
+	words_rock_wall            = 694,
+	words_woman                = 695,
+	words_women                = 696,
+	words_corridor_to_east     = 697,
+	words_corridor_to_west     = 698,
+	words_ammunition           = 699,
+	words_armored_vehicle      = 700,
+	words_tomato               = 701,
+	words_missile              = 702,
+	words_suit_of_armor        = 703,
+	words_powder_container     = 704,
+	words_inflatable_raft      = 705,
+	words_grenade              = 706,
+	words_fence                = 707,
+	words_wooden_statue        = 708,
+	words_conveyer_belt        = 709,
+	words_controls             = 710,
+	words_equipment            = 711,
+	words_shelf                = 712,
+	words_cabinets             = 713,
+	words_control_console      = 714,
+	words_faucet               = 715,
+	words_panel_box            = 716,
+	words_statue               = 717,
+	words_gauge                = 718,
+	words_circuit_panel        = 719,
+	words_catwalk              = 720,
+	words_circuits             = 721,
+	words_blood_stain          = 722,
+	words_grate                = 723,
+	words_air_shaft            = 724,
+	words_return_to            = 725,
+	words_formaldehyde         = 726,
+	words_petrox               = 727,
+	words_sodium_benzoate      = 728,
+	words_gurney               = 729,
+	words_ironing_board        = 730,
+	words_left_monitor         = 731,
+	words_right_monitor        = 732,
+	words_red_button           = 733,
+	words_green_button         = 734,
+	words_right_one_key        = 735,
+	words_right_1_key          = 736,
+	words_right_2_key          = 737,
+	words_right_3_key          = 738,
+	words_right_4_key          = 739,
+	words_right_5_key          = 740,
+	words_right_6_key          = 741,
+	words_right_7_key          = 742,
+	words_right_8_key          = 743,
+	words_left_1_key           = 744,
+	words_left_2_key           = 745,
+	words_left_3_key           = 746,
+	words_left_4_key           = 747,
+	words_corridor_wall        = 748,
+	words_mug                  = 749,
+	words_doughnut             = 750,
+	words_security_station     = 751,
+	words_newspaper            = 752,
+	words_magazine             = 753,
+	words_clipboard            = 754,
+	words_paper_football       = 755,
+	words_your_stuff           = 756,
+	words_other_stuff          = 757,
+	words_lamp                 = 758,
+	words_climb_into           = 759,
+	words_light_bulb           = 760,
+	words_step_into            = 761,
+	words_room                 = 762,
+	words_crawl_to             = 763,
+	words_fourth_cell          = 764,
+	words_third_cell           = 765,
+	words_second_cell          = 766,
+	words_first_cell           = 767,
+	words_equipment_room       = 768,
+	words_crawl_down           = 769,
+	words_descending_shaft     = 770,
+	words_sauropod             = 771,
+	words_monster              = 772,
+	words_fake_id              = 773,
+	words_alien_liquor         = 774,
+	words_intern               = 775,
+	words_instrument_table     = 776,
+	words_woman_on_balcony     = 777,
+	words_woman_in_chair       = 778,
+	words_sit_on               = 779,
+	words_woman_in_alcove      = 780,
+	words_kettle               = 781,
+	words_bartender            = 782,
+	words_whiskey              = 783,
+	words_alcohol              = 784,
+	words_rim                  = 785,
+	words_walk_along           = 786,
+	words_submerged_city       = 787,
+	words_governors_house      = 788,
+	words_rim_towards_east     = 789,
+	words_cement_pylon         = 790,
+	words_elevator             = 791,
+	words_elevator_shaft       = 792,
+	words_conveyor_belt        = 793,
+	words_cannon_balls         = 794,
+	words_electrical_overhang  = 795,
+	words_gutter_pipe          = 796,
+	words_sidewalk             = 797,
+	words_street               = 798,
+	words_barricade            = 799,
+	words_door_control_slot    = 800,
+	words_street_to_east       = 801,
+	words_sidewalk_to_east     = 802,
+	words_building             = 803,
+	words_car                  = 804,
+	words_get_inside           = 805,
+	words_marquee              = 806,
+	words_building_entrance    = 807,
+	words_guard_station        = 808,
+	words_technical_equipment  = 809,
+	words_guard_turret         = 810,
+	words_pillar               = 811,
+	words_papers               = 812,
+	words_file_cabinet         = 813,
+	words_windows              = 814,
+	words_walk                 = 815,
+	words_storage_box          = 816,
+	words_water_cooler         = 817,
+	words_box                  = 818,
+	words_rifles               = 819,
+	words_slingshot            = 820,
+	words_mausoleum            = 821,
+	words_software_store       = 822,
+	words_concrete_building    = 823,
+	words_humongous_monitor    = 824,
+	words_space_bike           = 825,
+	words_billboard            = 826,
+	words_lack_of_nookie_motel = 827,
+	words_bidets_xcreetza_hut  = 828,
+	words_buildings            = 829,
+	words_skyscraper           = 830,
+	words_software_logo        = 831,
+	words_giant_telescope      = 832,
+	words_handle               = 833,
+	words_hole                 = 834,
+	words_laser_beam           = 835,
+	words_pedestal             = 836,
+	words_boat                 = 837,
+	words_giant_monument       = 838,
+	words_rope                 = 839,
+	words_sand_bar_restaurant  = 840,
+	words_porthole             = 841,
+	words_ticket_booth         = 842,
+	words_pollys_entrance      = 843,
+	words_restaurant_entrance  = 844,
+	words_the_pleasure_dome    = 845,
+	words_starfish             = 846,
+	words_flipper              = 847,
+	words_sand_dollar          = 848,
+	words_shell                = 849,
+	words_guest_list           = 850,
+	words_weird_animal_head    = 851,
+	words_ships_wheel          = 852,
+	words_handicap_sign        = 853,
+	words_elevator_controls    = 854,
+	words_brick_wall           = 855,
+	words_bike_rack            = 856,
+	words_odonalds_sign        = 857,
+	words_elevator_entrance    = 858,
+	words_special_sale_sign    = 859,
+	words_attorneys_at_law     = 860,
+	words_sledge_mall          = 861,
+	words_skeleton             = 862,
+	words_strange_equipment    = 863,
+	words_street_to_west       = 864,
+	words_sidewalk_to_west     = 865,
+	words_teleporter_entrance  = 866,
+	words_software_door        = 867,
+	words_spinach_patch_doll   = 868,
+	words_reflect              = 869,
+	words_register_drawer      = 870,
+	words_elevator_door        = 871,
+	words_hydraulic_support    = 872,
+	words_equipment_overhead   = 873,
+	words_get_into             = 874,
+	words_warning_label        = 875,
+	words_nuclear_slingshot    = 876,
+	words_display_case         = 877,
+	words_photon_rifles        = 878,
+	words_monitoring_equipment = 879,
+	words_telescope            = 880,
+	words_motel                = 881,
+	words_restaurant           = 882,
+	words_software_store_sign  = 883,
+	words_advertising_poster   = 884,
+	words_advertisement        = 885,
+	words_old_software         = 886,
+	words_cash_register        = 887,
+	words_entrance             = 888,
+	words_laser_cannon         = 889,
+	words_sand_bags            = 890,
+	words_pleasure_dome        = 891,
+	words_dome_entrance        = 892,
+	words_laboratory           = 893,
+	words_street_to_south      = 894,
+	words_elevator_access_slot = 895,
+	words_car_controls         = 896,
+	words_scent_packet         = 897,
+	words_kitty                = 898,
+	words_glove_compartment    = 899,
+	words_moldy_sock           = 900,
+	words_soda_cans            = 901,
+	words_windshield           = 902,
+	words_dashboard            = 903,
+	words_interior_of_car      = 904,
+	words_view_right_button    = 905,
+	words_black_button         = 906,
+	words_white_button         = 907,
+	words_inside_of_car        = 908,
+	words_rim_towards_west     = 909,
+	words_cement_block         = 910,
+	words_city                 = 911,
+	words_speaker              = 912,
+	words_eye_chart            = 913,
+	words_launch_pad           = 914,
+	words_building_to_west     = 915,
+	words_pad_to_east          = 916,
+	words_pad_to_west          = 917,
+	words_tower                = 918,
+	words_look_out             = 919,
+	words_service_panel        = 920,
+	words_crack                = 921,
+	words_throttle             = 922,
+	words_grab                 = 923,
+	words_instrumentation      = 924,
+	words_tp                   = 925,
+	words_seat                 = 926,
+	words_status_panel         = 927,
+	words_ships_controls       = 928,
+	words_professor            = 929,
+	words_professors_gurney    = 930,
+	words_welcome_mat          = 931,
+	words_melon_mush           = 932,
+	words_badminton_brat       = 933,
+	words_apply                = 934,
+	words_combination          = 935,
+	words_note                 = 936,
+	words_lecithin             = 937,
+	words_repair_woman         = 938,
+	words_explosives           = 939,
+	words_dollop               = 940,
+	words_drop                 = 941,
+	words_dash                 = 942,
+	words_splash               = 943,
+	words_dock_to_south        = 944,
+	words_steer_towards        = 945,
+	words_building_to_north    = 946,
+	words_volcano_rim          = 947,
+	words_open_water_to_south  = 948,
+	words_projector            = 949,
+	words_guards_arm2          = 950,
+	words_nibble_on            = 951,
+	words_enter                = 952,
+	words_                     = 953,
+	words_timer_button_1       = 954,
+	words_remote_button_1      = 955,
+	words_start_button_2       = 956,
+	words_remote_button_2      = 957,
+	words_timer_button_2       = 958,
+	words_start_button_1       = 959,
+	words_antigrav_controls    = 960,
+	words_bruces_tree          = 961,
+	words_coliseum             = 962,
+	words_bruces_garden_room   = 963,
+	words_fountain             = 964,
+	words_house_of_bruce       = 965,
+	words_city_backdrop        = 966,
+	words_bruces_balcony       = 967,
+	words_bruces_entrance      = 968,
+	words_bruces_logo          = 969,
+	words_lounge_chair         = 970,
+	words_living_room_floor    = 971,
+	words_livingroom_floor     = 972,
+	words_perfume_bottle       = 973,
+	words_cool_neon_light      = 974,
+	words_flower_pot           = 975,
+	words_coffee_table         = 976,
+	words_flowers              = 977,
+	words_art_deco_chair       = 978,
+	words_safe                 = 979,
+	words_splashy_decor        = 980,
+	words_theatrical_faces     = 981,
+	words_art_deco_piece       = 982,
+	words_end_of_room          = 983,
+	words_fireplace            = 984,
+	words_artwork              = 985,
+	words_cool_neon_lights     = 986,
+	words_glass_plated_window  = 987,
+	words_bedroom_floor        = 988,
+	words_bauble               = 989,
+	words_snapshot             = 990,
+	words_perfume              = 991,
+	words_clapboard            = 992,
+	words_beret                = 993,
+	words_horse_whip           = 994,
+	words_corner_table         = 995,
+	words_boa                  = 996,
+	words_wig_stand            = 997,
+	words_partition            = 998,
+	words_megaphone            = 999,
+	words_slip                 = 1000,
+	words_sconce               = 1001,
+	words_vanity               = 1002,
+	words_bedboard             = 1003,
+	words_love_seat            = 1004,
+	words_souvenir_tickets     = 1005,
+	words_review               = 1006,
+	words_bruce_at_the_gala    = 1007,
+	words_art_deco_rug         = 1008,
+	words_livingroom           = 1009,
+	words_sculpture            = 1010,
+	words_specimen_epithet     = 1011,
+	words_vent                 = 1012,
+	words_flower_box           = 1013,
+	words_ledge                = 1014,
+	words_bolt                 = 1015,
+	words_observation_window   = 1016,
+	words_air_hose             = 1017,
+	words_auto_shop            = 1018,
+	words_manhole              = 1019,
+	words_auto_shop_entrance   = 1020,
+	words_broken_window        = 1021,
+	words_womanhole            = 1022,
+	words_garage_door          = 1023,
+	words_scratch_pad          = 1024,
+	words_gas_prices           = 1025,
+	words_up_button            = 1026,
+	words_down_button          = 1027,
+	words_spare_parts_list     = 1028,
+	words_skylight             = 1029,
+	words_tool_box             = 1030,
+	words_car_lift             = 1031,
+	words_car_seat             = 1032,
+	words_garage_floor         = 1033,
+	words_garage_door_controls = 1034,
+	words_amish_hat            = 1035,
+	words_jack                 = 1036,
+	words_coils                = 1037,
+	words_oil_can              = 1038,
+	words_fan_belts            = 1039,
+	words_rear_of_garage       = 1040,
+	words_front_of_garage      = 1041,
+	words_muffler              = 1042,
+	words_spare_part           = 1043,
+	words_hubcap               = 1044,
+	words_candle               = 1045,
+	words_rates                = 1046,
+	words_grease_can           = 1047,
+	words_calendar             = 1048,
+	words_fork_lift            = 1049,
+	words_trash_can            = 1050,
+	words_shaker_chair         = 1051,
+	words_quarter_panel        = 1052,
+	words_area_behind_car      = 1053,
+	words_danger_zone          = 1054,
+	words_newsstand            = 1055,
+	words_lady_godiva_monument = 1056,
+	words_spot_a_pot           = 1057,
+	words_guard_rail           = 1058,
+	words_alley                = 1059,
+	words_ditch                = 1060,
+	words_video_store_door     = 1061,
+	words_buckluster_marquee   = 1062,
+	words_video_store          = 1063,
+	words_hormone_billboard    = 1064,
+	words_phone_antenna        = 1065,
+	words_return_slot          = 1066,
+	words_noose                = 1067,
+	words_comedy_videos        = 1068,
+	words_smelly_sneaker       = 1069,
+	words_pippys_stocking      = 1070,
+	words_phone_cradle         = 1071,
+	words_drama_videos         = 1072,
+	words_spotlight            = 1073,
+	words_storeroom_floor      = 1074,
+	words_all_sales_final      = 1075,
+	words_machoprose_tee_shirt = 1076,
+	words_unknown_comic_hands  = 1077,
+	words_wet_cement           = 1078,
+	words_pippys_tiny_imprint  = 1079,
+	words_obnoxious_dog_paws   = 1080,
+	words_leg_and_a_leg_jeans  = 1081,
+	words_video_store_exit     = 1082,
+	words_aisle                = 1083,
+	words_video_monitor        = 1084,
+	words_polly_pigs_imprint   = 1085,
+	words_john_wynns_imprint   = 1086,
+	words_mr_neds_imprint      = 1087,
+	words_peg_leg_pete_imprint = 1088,
+	words_marx_bros_poster     = 1089,
+	words_pippy_billboard      = 1090,
+	words_videos_noone_wants   = 1091,
+	words_more_classic_videos  = 1092,
+	words_join_our_price_club  = 1093,
+	words_educational_videos   = 1094,
+	words_deep_discount_titles = 1095,
+	words_world_champs_poster  = 1096,
+	words_workout_videos       = 1097,
+	words_20_percent_off_sign  = 1098,
+	words_civilization_ad      = 1099,
+	words_new_release_videos   = 1100,
+	words_porno_videos         = 1101,
+	words_foreign_videos       = 1102,
+	words_classic_videos       = 1103,
+	words_adventure_videos     = 1104,
+	words_buckluster_logo      = 1105,
+	words_wine_bottle          = 1106,
+	words_dirt_pile            = 1107,
+	words_mammoth_pencil_head  = 1108,
+	words_wreaky_pumpkin       = 1109,
+	words_milk_carton          = 1110,
+	words_bucket               = 1111,
+	words_empty_box            = 1112,
+	words_diaper_box           = 1113,
+	words_hermit               = 1114,
+	words_metal_pipe           = 1115,
+	words_concrete_support     = 1116,
+	words_various_trash        = 1117,
+	words_armature             = 1118,
+	words_control_box          = 1119,
+	words_top_of_dome          = 1120,
+	words_expressway_to_east   = 1121,
+	words_go_towards           = 1122,
+	words_expressway_to_west   = 1123,
+	words_dome                 = 1124,
+	words_view_of_city         = 1125,
+	words_expressway           = 1126,
+	words_hook                 = 1127,
+	words_sea_monster          = 1128,
+	words_edge_of_volcano      = 1129,
+	words_jump_through         = 1130,
+	words_old_tea_cup          = 1131,
+	words_name_plate           = 1132,
+	words_old_vase             = 1133,
+	words_portrait             = 1134,
+	words_put_down             = 1135,
+	words_tall_building        = 1136,
+	words_obnoxious_dog        = 1137,
+	words_guts                 = 1138,
+	words_big_heads            = 1139,
+	words_install              = 1140,
+	words_life_support_module  = 1141,
+	words_remove               = 1142,
+	words_large_blade          = 1143,
+	words_side_entrance        = 1144,
+	words_indicator            = 1145,
+	words_signpost             = 1146,
+	words_pin                  = 1147,
+	words_powder_puff          = 1148,
+	words_shelves              = 1149,
+	words_electrodes           = 1150,
+	words_mishap2              = 1151,
+	words_isld_superstructure  = 1152,
+	words_file_cabinets        = 1153,
+	words_cycle_shop           = 1154,
+	words_air_bike             = 1155,
+	words_emergency_light      = 1156,
+	words_target_area          = 1157,
+	words_ice_chests           = 1158,
+	words_birds                = 1159,
+	words_doctors_office       = 1160,
+	words_deface               = 1161,
+	words_large_heads          = 1162,
+	words_small_table          = 1163,
+	words_collosseum           = 1164,
+	words_house                = 1165,
+	words_balcony              = 1166,
+	words_garden_room          = 1167,
+	words_cove_lights          = 1168,
+	words_masks                = 1169,
+	words_neon_lights          = 1170,
+	words_glass_block_wall     = 1171,
+	words_screen               = 1172,
+	words_spare_ribs           = 1173,
+	words_banner               = 1174,
+	words_instructional_videos = 1175,
+	words_cement               = 1176,
+	words_store                = 1177,
+	words_cardboard_box        = 1178,
+	words_graffitti            = 1179,
+	words_graffiti             = 1180,
+	words_photograph           = 1181,
+	words_directors_slate      = 1182,
+	words_crop                 = 1183,
+	words_hat                  = 1184,
+	words_logo                 = 1185,
+	words_maintenance_building = 1186,
+	words_massage              = 1187,
+	words_mangle               = 1188,
+	words_rub                  = 1189,
+	words_juggle               = 1190,
+	words_smash                = 1191,
+	words_guzzle               = 1192,
+	words_west_end_of_platform = 1193,
+	words_east_end_of_platform = 1194,
+	words_fold                 = 1195,
+	words_spindle              = 1196,
+	words_mutilate             = 1197
 };
 
 } // namespace RexNebular
diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 7c57d031b50..c3cb8d7de4e 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -195,16 +195,16 @@ void RexNebularEngine::showRecipe() {
 	for (count = 0; count < 4; count++) {
 		switch (global[kIngredientQuantity + count]) {
 		case 0:
-			text_index[count] = NOUN_DROP;
+			text_index[count] = words_drop;
 			break;
 		case 1:
-			text_index[count] = NOUN_DOLLOP;
+			text_index[count] = words_dollop;
 			break;
 		case 2:
-			text_index[count] = NOUN_DASH;
+			text_index[count] = words_dash;
 			break;
 		case 3:
-			text_index[count] = NOUN_SPLASH;
+			text_index[count] = words_splash;
 			break;
 		default:
 			break;
@@ -214,16 +214,16 @@ void RexNebularEngine::showRecipe() {
 	for (count = 0; count < 4; count++) {
 		switch (global[kIngredientList + count]) {
 		case 0:
-			text_index[count + 4] = NOUN_ALCOHOL;
+			text_index[count + 4] = words_alcohol;
 			break;
 		case 1:
-			text_index[count + 4] = NOUN_LECITHIN;
+			text_index[count + 4] = words_lecithin;
 			break;
 		case 2:
-			text_index[count + 4] = NOUN_PETROX;
+			text_index[count + 4] = words_petrox;
 			break;
 		case 3:
-			text_index[count + 4] = NOUN_FORMALDEHYDE;
+			text_index[count + 4] = words_formaldehyde;
 			break;
 		default:
 			break;
@@ -236,99 +236,99 @@ void RexNebularEngine::showRecipe() {
 void RexNebularEngine::global_parser_code() {
 	int id;
 
-	if (player_parse(VERB_SMELL, 0) && room_id > 103 && room_id < 111) {
+	if (player_parse(words_smell, 0) && room_id > 103 && room_id < 111) {
 		text_show(440);
-	} else if (player_parse(VERB_EAT, 0) && room_id > 103 && room_id < 111) {
+	} else if (player_parse(words_eat, 0) && room_id > 103 && room_id < 111) {
 		text_show(441);
-	} else if (player_parse(VERB_SMELL, NOUN_BURGER, 0)) {
+	} else if (player_parse(words_smell, words_burger, 0)) {
 		text_show(442);
-	} else if (player_parse(VERB_EAT, NOUN_BURGER, 0)) {
+	} else if (player_parse(words_eat, words_burger, 0)) {
 		text_show(443);
-	} else if (player_parse(VERB_SMELL, NOUN_STUFFED_FISH, 0)) {
+	} else if (player_parse(words_smell, words_stuffed_fish, 0)) {
 		text_show(444);
-	} else if (player_parse(VERB_EAT, NOUN_STUFFED_FISH, 0)) {
+	} else if (player_parse(words_eat, words_stuffed_fish, 0)) {
 		text_show(445);
-	} else if (player_parse(VERB_WEAR, NOUN_REBREATHER, 0)) {
+	} else if (player_parse(words_wear, words_rebreather, 0)) {
 		text_show(room_id > 103 && room_id < 111 ? 446 : 447);
-	} else if (player_parse(VERB_SET, NOUN_TIMER_MODULE, 0)) {
+	} else if (player_parse(words_set, words_timer_module, 0)) {
 		text_show(448);
-	} else if (player_parse(VERB_NIBBLE_ON, NOUN_BIG_LEAVES, 0)) {
+	} else if (player_parse(words_nibble_on, words_big_leaves, 0)) {
 		text_show(449);
-	} else if (player_parse(VERB_LICK, NOUN_POISON_DARTS, 0)) {
+	} else if (player_parse(words_lick, words_poison_darts, 0)) {
 		text_show(450);
-	} else if (player_parse(VERB_EAT, NOUN_TWINKIFRUIT, 0)) {
+	} else if (player_parse(words_eat, words_twinkifruit, 0)) {
 		inter_move_object(OBJ_TWINKIFRUIT, NOWHERE);
 		text_show(451);
-	} else if (player_parse(VERB_GORGE_ON, NOUN_TWINKIFRUIT, 0)) {
+	} else if (player_parse(words_gorge_on, words_twinkifruit, 0)) {
 		inter_move_object(OBJ_TWINKIFRUIT, NOWHERE);
 		text_show(452);
-	} else if (player_parse(VERB_GNAW_ON, 0)) {
+	} else if (player_parse(words_gnaw_on, 0)) {
 		text_show(453);
-	} else if (player_parse(VERB_MASSAGE, NOUN_AUDIO_TAPE, 0)) {
+	} else if (player_parse(words_massage, words_audio_tape, 0)) {
 		text_show(454);
-	} else if (player_parse(VERB_MANGLE, NOUN_CREDIT_CHIP, 0)) {
+	} else if (player_parse(words_mangle, words_credit_chip, 0)) {
 		text_show(455);
-	} else if (player_parse(VERB_FONDLE, NOUN_CHARGE_CASES, 0)) {
+	} else if (player_parse(words_fondle, words_charge_cases, 0)) {
 		text_show(456);
-	} else if (player_parse(VERB_RUB, NOUN_BOMB, 0)) {
+	} else if (player_parse(words_rub, words_bomb, 0)) {
 		text_show(457);
-	} else if (player_parse(VERB_SET, NOUN_TIMEBOMB, 0)) {
+	} else if (player_parse(words_set, words_timebomb, 0)) {
 		text_show(458);
-	} else if (player_parse(VERB_GUZZLE, NOUN_ALIEN_LIQUOR, 0)) {
+	} else if (player_parse(words_guzzle, words_alien_liquor, 0)) {
 		text_show(459);
-	} else if (player_parse(VERB_SMASH, NOUN_TARGET_MODULE, 0)) {
+	} else if (player_parse(words_smash, words_target_module, 0)) {
 		text_show(460);
-	} else if (player_parse(VERB_JUGGLE, 0)) {
+	} else if (player_parse(words_juggle, 0)) {
 		text_show(461);
-	} else if (player_parse(VERB_APPLY, NOUN_POLYCEMENT, 0)) {
+	} else if (player_parse(words_apply, words_polycement, 0)) {
 		text_show(462);
-	} else if (player_parse(VERB_SNIFF, NOUN_POLYCEMENT, 0)) {
+	} else if (player_parse(words_sniff, words_polycement, 0)) {
 		text_show(465);
-	} else if (player_parse(VERB_TIE, NOUN_FISHING_LINE, 0)) {
+	} else if (player_parse(words_tie, words_fishing_line, 0)) {
 		text_show(463);
-	} else if (player_parse(VERB_ATTACH, NOUN_FISHING_LINE, 0)) {
+	} else if (player_parse(words_attach, words_fishing_line, 0)) {
 		text_show(463);
-	} else if (player_parse(VERB_UNLOCK, 0)) {
+	} else if (player_parse(words_unlock, 0)) {
 		text_show(464);
-	} else if (player_parse(VERB_REFLECT, 0)) {
+	} else if (player_parse(words_reflect, 0)) {
 		text_show(466);
-	} else if (player_parse(VERB_GAZE_INTO, NOUN_REARVIEW_MIRROR, 0)) {
+	} else if (player_parse(words_gaze_into, words_rearview_mirror, 0)) {
 		text_show(467);
-	} else if (player_parse(VERB_EAT, NOUN_CHICKEN_BOMB, 0)) {
+	} else if (player_parse(words_eat, words_chicken_bomb, 0)) {
 		text_show(469);
-	} else if (player_parse(VERB_BREAK, NOUN_VASE, 0)) {
+	} else if (player_parse(words_break, words_vase, 0)) {
 		text_show(471);
-	} else if (player_parse(VERB_SHAKE_HANDS, NOUN_GUARDS_ARM2, 0)) {
+	} else if (player_parse(words_shake_hands, words_guards_arm2, 0)) {
 		text_show(472);
-	} else if (player_parse(VERB_READ, NOUN_LOG, 0)) {
+	} else if (player_parse(words_read, words_log, 0)) {
 		text_show(473);
-	} else if (player_parse(VERB_RUB, NOUN_BOMBS, 0)) {
+	} else if (player_parse(words_rub, words_bombs, 0)) {
 		text_show(474);
-	} else if (player_parse(VERB_DRINK, NOUN_FORMALDEHYDE, 0)) {
+	} else if (player_parse(words_drink, words_formaldehyde, 0)) {
 		text_show(475);
-	} else if (player_parse(VERB_DRINK, NOUN_PETROX, 0)) {
+	} else if (player_parse(words_drink, words_petrox, 0)) {
 		text_show(476);
-	} else if (player_parse(VERB_DRINK, NOUN_LECITHIN, 0)) {
+	} else if (player_parse(words_drink, words_lecithin, 0)) {
 		text_show(477);
-	} else if (player_parse(VERB_PUT, NOUN_POISON_DARTS, NOUN_PLANT_STALK, 0) && player_has(OBJ_POISON_DARTS)
+	} else if (player_parse(words_put, words_poison_darts, words_plant_stalk, 0) && player_has(OBJ_POISON_DARTS)
 		&& player_has(OBJ_PLANT_STALK)) {
 		inter_give_to_player(OBJ_BLOWGUN);
 		inter_move_object(OBJ_PLANT_STALK, NOWHERE);
 		global[kBlowgunStatus] = 0;
 		object_examine(OBJ_BLOWGUN, 809);
-	} else if (player_parse(VERB_PUT, NOUN_POISON_DARTS, NOUN_BLOWGUN, 0) && player_has(OBJ_POISON_DARTS)
+	} else if (player_parse(words_put, words_poison_darts, words_blowgun, 0) && player_has(OBJ_POISON_DARTS)
 		&& player_has(OBJ_BLOWGUN)) {
 		text_show(433);
-	} else if (player_parse(VERB_DEFACE, 0) && player_parse(VERB_FOLD, 0) && player_parse(VERB_MUTILATE, 0)) {
+	} else if (player_parse(words_deface, 0) && player_parse(words_fold, 0) && player_parse(words_mutilate, 0)) {
 		text_show(434);
-	} else if (player_parse(VERB_SPINDLE, 0)) {
+	} else if (player_parse(words_spindle, 0)) {
 		text_show(479);
-	} else if ((player_parse(VERB_READ, 0) || player_parse(VERB_LOOK_AT, 0) || player_parse(VERB_LOOK, 0)) &&
-		player_parse(NOUN_NOTE, 0) && player_has(OBJ_NOTE)) {
+	} else if ((player_parse(words_read, 0) || player_parse(words_look_at, 0) || player_parse(words_look, 0)) &&
+		player_parse(words_note, 0) && player_has(OBJ_NOTE)) {
 		inter_move_object(OBJ_NOTE, NOWHERE);
 		inter_give_to_player(OBJ_COMBINATION);
 		object_examine(OBJ_COMBINATION, 851);
-	} else if ((player_parse(VERB_LOOK, 0) || player_parse(VERB_READ, 0)) &&
+	} else if ((player_parse(words_look, 0) || player_parse(words_read, 0)) &&
 		((id = object_named(inter_main_noun)) > 0 ||
 			(inter_second_noun > 0 &&
 				(id = object_named(inter_second_noun)))) &&
@@ -365,33 +365,33 @@ void RexNebularEngine::global_parser_code() {
 
 			object_examine(id, messageId);
 		}
-	} else if (player_parse(VERB_PUT, NOUN_BURGER, NOUN_DEAD_FISH, 0)) {
+	} else if (player_parse(words_put, words_burger, words_dead_fish, 0)) {
 		if (player_has(OBJ_BURGER) || player_has(OBJ_DEAD_FISH)) {
 			inter_take_from_player(OBJ_DEAD_FISH, PLAYER);
 			inter_take_from_player(OBJ_BURGER, PLAYER);
 			inter_give_to_player(OBJ_STUFFED_FISH);
 			object_examine(OBJ_STUFFED_FISH, 803);
 		}
-	} else if (player_parse(VERB_PUT, NOUN_AUDIO_TAPE, NOUN_TAPE_PLAYER, 0) && player_has(OBJ_AUDIO_TAPE) &&
+	} else if (player_parse(words_put, words_audio_tape, words_tape_player, 0) && player_has(OBJ_AUDIO_TAPE) &&
 		player_has(OBJ_TAPE_PLAYER)) {
 		inter_move_object(OBJ_AUDIO_TAPE, OBJ_TAPE_PLAYER);
-	} else if (player_parse(VERB_ACTIVATE, NOUN_TAPE_PLAYER, 0) && player_has(OBJ_TAPE_PLAYER)) {
+	} else if (player_parse(words_activate, words_tape_player, 0) && player_has(OBJ_TAPE_PLAYER)) {
 		if (object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER) {
 			showRecipe();
 		} else {
 			text_show(406);
 		}
-	} else if (player_parse(VERB_EJECT, NOUN_TAPE_PLAYER, 0) && player_has(OBJ_TAPE_PLAYER)) {
+	} else if (player_parse(words_eject, words_tape_player, 0) && player_has(OBJ_TAPE_PLAYER)) {
 		if (object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER) {
 			inter_give_to_player(OBJ_AUDIO_TAPE);
 		} else {
 			text_show(407);
 		}
-	} else if (player_parse(VERB_DISASSEMBLE, NOUN_TAPE_PLAYER, 0)) {
+	} else if (player_parse(words_disassemble, words_tape_player, 0)) {
 		text_show(408);
-	} else if (player_parse(VERB_ACTIVATE, NOUN_REMOTE, 0)) {
+	} else if (player_parse(words_activate, words_remote, 0)) {
 		text_show(global[kTopButtonPushed] ? 502 : 501);
-	} else if ((player_parse(VERB_ATTACH, NOUN_DETONATORS, NOUN_CHARGE_CASES, 0) || player_parse(VERB_PUT, NOUN_DETONATORS, NOUN_CHARGE_CASES, 0)) &&
+	} else if ((player_parse(words_attach, words_detonators, words_charge_cases, 0) || player_parse(words_put, words_detonators, words_charge_cases, 0)) &&
 		player_has(OBJ_DETONATORS) && player_has(OBJ_CHARGE_CASES)) {
 		if (object_check_quality(OBJ_CHARGE_CASES, 3)) {
 			inter_move_object(OBJ_CHARGE_CASES, NOWHERE);
@@ -401,10 +401,10 @@ void RexNebularEngine::global_parser_code() {
 		} else {
 			text_show(405);
 		}
-	} else if (player_parse(VERB_ATTACH, NOUN_DETONATORS, 0)) {
+	} else if (player_parse(words_attach, words_detonators, 0)) {
 		text_show(470);
-	} else if ((player_parse(VERB_ATTACH, NOUN_TIMER_MODULE, NOUN_BOMBS, 0) || player_parse(VERB_PUT, NOUN_TIMER_MODULE, NOUN_BOMBS, 0) || player_parse(VERB_ATTACH, NOUN_TIMER_MODULE, NOUN_BOMB, 0)
-		|| player_parse(VERB_PUT, NOUN_TIMER_MODULE, NOUN_BOMB, 0)) && player_has(OBJ_TIMER_MODULE) && (
+	} else if ((player_parse(words_attach, words_timer_module, words_bombs, 0) || player_parse(words_put, words_timer_module, words_bombs, 0) || player_parse(words_attach, words_timer_module, words_bomb, 0)
+		|| player_parse(words_put, words_timer_module, words_bomb, 0)) && player_has(OBJ_TIMER_MODULE) && (
 			player_has(OBJ_BOMBS) || player_has(OBJ_BOMB))) {
 		if (player_has(OBJ_BOMBS)) {
 			inter_move_object(OBJ_BOMBS, NOWHERE);
@@ -416,19 +416,19 @@ void RexNebularEngine::global_parser_code() {
 		inter_move_object(OBJ_TIMER_MODULE, NOWHERE);
 		inter_give_to_player(OBJ_TIMEBOMB);
 		object_examine(OBJ_TIMEBOMB, 404);
-	} else if (player_parse(VERB_FONDLE, NOUN_PLANT_STALK, 0)) {
+	} else if (player_parse(words_fondle, words_plant_stalk, 0)) {
 		text_show(410);
-	} else if (player_parse(VERB_EMPTY, NOUN_BOTTLE, 0)) {
+	} else if (player_parse(words_empty, words_bottle, 0)) {
 		global[kBottleStatus] = 0;
 		text_show(432);
-	} else if (player_parse(VERB_DISASSEMBLE, NOUN_FISHING_ROD, 0)) {
+	} else if (player_parse(words_disassemble, words_fishing_rod, 0)) {
 		if (object[OBJ_FISHING_LINE].location == 3) {
 			inter_give_to_player(OBJ_FISHING_LINE);
 			object_examine(OBJ_FISHING_LINE, 409);
 		} else {
 			text_show(428);
 		}
-	} else if (player_parse(VERB_DISASSEMBLE, NOUN_PENLIGHT, 0)) {
+	} else if (player_parse(words_disassemble, words_penlight, 0)) {
 		switch (global[kPenlightCellStatus]) {
 		case 1:
 		case 2:
@@ -451,7 +451,7 @@ void RexNebularEngine::global_parser_code() {
 			text_show(478);
 			break;
 		}
-	} else if (player_parse(VERB_DISASSEMBLE, NOUN_PHONE_HANDSET, 0)) {
+	} else if (player_parse(words_disassemble, words_phone_handset, 0)) {
 		switch (global[kHandsetCellStatus]) {
 		case 1:
 			inter_give_to_player(OBJ_DURAFAIL_CELLS);
@@ -479,7 +479,7 @@ void RexNebularEngine::global_parser_code() {
 			text_show(478);
 			break;
 		}
-	} else if (player_parse(VERB_PUT, NOUN_PHONE_CELLS, NOUN_PENLIGHT, 0)) {
+	} else if (player_parse(words_put, words_phone_cells, words_penlight, 0)) {
 		if (global[kPenlightCellStatus] == 0) {
 			global[kPenlightCellStatus] = 3;
 			inter_move_object(OBJ_PHONE_CELLS, NOWHERE);
@@ -487,7 +487,7 @@ void RexNebularEngine::global_parser_code() {
 		} else {
 			text_show(420);
 		}
-	} else if (player_parse(VERB_PUT, NOUN_PHONE_CELLS, NOUN_PHONE_HANDSET, 0)) {
+	} else if (player_parse(words_put, words_phone_cells, words_phone_handset, 0)) {
 		if (global[kHandsetCellStatus] == 0) {
 			global[kHandsetCellStatus] = 3;
 			inter_move_object(OBJ_PHONE_CELLS, NOWHERE);
@@ -495,7 +495,7 @@ void RexNebularEngine::global_parser_code() {
 		} else {
 			text_show(422);
 		}
-	} else if (player_parse(VERB_PUT, NOUN_DURAFAIL_CELLS, NOUN_PENLIGHT, 0)) {
+	} else if (player_parse(words_put, words_durafail_cells, words_penlight, 0)) {
 		if (global[kPenlightCellStatus]) {
 			text_show(424);
 		} else {
@@ -516,28 +516,28 @@ done:
 void RexNebularEngine::global_error_code() {
 	int randVal = getRandomNumber(1, 1000);
 
-	if (player_parse(VERB_THROW, NOUN_BOMB, 0) || player_parse(VERB_THROW, NOUN_BOMBS, 0)
-		|| player_parse(VERB_THROW, NOUN_TIMEBOMB, 0) || player_parse(VERB_THROW, NOUN_CHICKEN_BOMB, 0))
+	if (player_parse(words_throw, words_bomb, 0) || player_parse(words_throw, words_bombs, 0)
+		|| player_parse(words_throw, words_timebomb, 0) || player_parse(words_throw, words_chicken_bomb, 0))
 		text_show(42);
-	else if (player_parse(VERB_DISASSEMBLE, 0))
+	else if (player_parse(words_disassemble, 0))
 		text_show(435);
-	else if ((player_parse(VERB_EAT, NOUN_DEAD_FISH, 0) || player_parse(VERB_EAT, NOUN_STUFFED_FISH, 0)) && player_has(object_named(inter_main_noun)))
+	else if ((player_parse(words_eat, words_dead_fish, 0) || player_parse(words_eat, words_stuffed_fish, 0)) && player_has(object_named(inter_main_noun)))
 		text_show(12);
-	else if ((player_parse(VERB_SMELL, NOUN_DEAD_FISH, 0) || player_parse(VERB_SMELL, NOUN_STUFFED_FISH, 0)) && player_has(object_named(inter_main_noun)))
+	else if ((player_parse(words_smell, words_dead_fish, 0) || player_parse(words_smell, words_stuffed_fish, 0)) && player_has(object_named(inter_main_noun)))
 		text_show(13);
-	else if (player_parse(VERB_EAT, NOUN_CHICKEN, 0) && player_has(OBJ_CHICKEN))
+	else if (player_parse(words_eat, words_chicken, 0) && player_has(OBJ_CHICKEN))
 		text_show(912);
-	else if ((player_parse(VERB_SHOOT, 0) || player_parse(VERB_HOSE_DOWN, 0)) && player_parse(NOUN_BLOWGUN, 0)) {
+	else if ((player_parse(words_shoot, 0) || player_parse(words_hose_down, 0)) && player_parse(words_blowgun, 0)) {
 		if ((room_id >= 104) && (room_id <= 111))
 			text_show(38);
-		else if (player_parse(NOUN_PIRANHA, 0))
+		else if (player_parse(words_piranha, 0))
 			text_show(41);
-		else if (player_parse(NOUN_CHICKEN, 0) || player_parse(NOUN_VULTURE, 0) || player_parse(NOUN_SPIDER, 0)
-			|| player_parse(NOUN_YELLOW_BIRD, 0) || player_parse(NOUN_SWOOPING_CREATURE, 0) || player_parse(NOUN_CAPTIVE_CREATURE, 0)) {
+		else if (player_parse(words_chicken, 0) || player_parse(words_vulture, 0) || player_parse(words_spider, 0)
+			|| player_parse(words_yellow_bird, 0) || player_parse(words_swooping_creature, 0) || player_parse(words_captive_creature, 0)) {
 			text_show(40);
 		} else
 			text_show(39);
-	} else if (player_parse(VERB_TALKTO, 0)) {
+	} else if (player_parse(words_talkto, 0)) {
 		global[kTalkInanimateCount] = (global[kTalkInanimateCount] + 1) % 16;
 		if (!global[kTalkInanimateCount]) {
 			text_show(2);
@@ -548,9 +548,9 @@ void RexNebularEngine::global_error_code() {
 			kernel_message_purge();
 			kernel_message_add(const_cast<char *>(tmpMsg.c_str()), 0, 0, 0x1110, 120, 34, 0);
 		}
-	} else if (player_parse(VERB_GIVE, NOUN_DOOR, NOUN_CEILING, 0) || player_parse(VERB_CLOSE, NOUN_CHAIR, 0))
+	} else if (player_parse(words_give, words_door, words_ceiling, 0) || player_parse(words_close, words_chair, 0))
 		text_show(3);
-	else if (player_parse(VERB_THROW, 0)) {
+	else if (player_parse(words_throw, 0)) {
 		int objId = object_named(inter_main_noun);
 		if (objId < 0)
 			text_show(4);
@@ -558,14 +558,14 @@ void RexNebularEngine::global_error_code() {
 			text_show(5);
 		else
 			text_show(6);
-	} else if (player_parse(VERB_LOOK, 0)) {
-		if (player_parse(NOUN_BINOCULARS, 0) && (inter_second_noun > 0))
+	} else if (player_parse(words_look, 0)) {
+		if (player_parse(words_binoculars, 0) && (inter_second_noun > 0))
 			text_show(10);
 		else if (randVal < 600)
 			text_show(7);
 		else
 			text_show(21);
-	} else if (player_parse(VERB_TAKE, 0)) {
+	} else if (player_parse(words_take, 0)) {
 		int objId = object_named(inter_main_noun);
 		if (player_has(objId))
 			text_show(16);
@@ -575,32 +575,32 @@ void RexNebularEngine::global_error_code() {
 			text_show(22);
 		else
 			text_show(23);
-	} else if (player_parse(VERB_CLOSE, 0)) {
+	} else if (player_parse(words_close, 0)) {
 		if (randVal <= 333)
 			text_show(9);
 		else
 			text_show(33);
-	} else if (player_parse(VERB_OPEN, 0)) {
+	} else if (player_parse(words_open, 0)) {
 		if (randVal <= 500)
 			text_show(30);
 		else if (randVal <= 750)
 			text_show(31);
 		else
 			text_show(32);
-	} else if (player_parse(VERB_PULL, 0))
+	} else if (player_parse(words_pull, 0))
 		text_show(18);
-	else if (player_parse(VERB_PUSH, 0)) {
+	else if (player_parse(words_push, 0)) {
 		if (randVal < 750)
 			text_show(19);
 		else
 			text_show(20);
-	} else if (player_parse(VERB_PUT, 0)) {
+	} else if (player_parse(words_put, 0)) {
 		int objId = object_named(inter_main_noun);
 		if (player_has(objId))
 			text_show(25);
 		else
 			text_show(24);
-	} else if (player_parse(VERB_GIVE, 0)) {
+	} else if (player_parse(words_give, 0)) {
 		int objId = object_named(inter_main_noun);
 		if (!player_has(objId))
 			text_show(26);
@@ -608,9 +608,9 @@ void RexNebularEngine::global_error_code() {
 			text_show(28);
 		else
 			text_show(29);
-	} else if (!player_parse(VERB_WALKTO, 0) && !player_parse(VERB_WALK_ACROSS, 0) && !player_parse(VERB_WALK_TOWARDS, 0) && !player_parse(VERB_WALK_DOWN, 0)
-		&& !player_parse(VERB_SWIM_TO, 0) && !player_parse(VERB_SWIM_ACROSS, 0) && !player_parse(VERB_SWIM_INTO, 0) && !player_parse(VERB_SWIM_THROUGH, 0)
-		&& !player_parse(VERB_SWIM_UNDER, 0)) {
+	} else if (!player_parse(words_walkto, 0) && !player_parse(words_walk_across, 0) && !player_parse(words_walk_towards, 0) && !player_parse(words_walk_down, 0)
+		&& !player_parse(words_swim_to, 0) && !player_parse(words_swim_across, 0) && !player_parse(words_swim_into, 0) && !player_parse(words_swim_through, 0)
+		&& !player_parse(words_swim_under, 0)) {
 		if (randVal <= 100)
 			text_show(36);
 		else if (randVal <= 200)
diff --git a/engines/mads/madsv2/nebular/rooms/room101.cpp b/engines/mads/madsv2/nebular/rooms/room101.cpp
index 5d3e1244dbd..20701e85ba9 100644
--- a/engines/mads/madsv2/nebular/rooms/room101.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room101.cpp
@@ -103,7 +103,7 @@ static void room_101_init() {
 	_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 0, 10, 4);
 	_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 0, 32, 47);
 
-	_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+	_scene->_hotspots.activate(words_shield_modulator, false);
 	local._panelOpened = false;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_LOADING)
@@ -119,8 +119,8 @@ static void room_101_init() {
 		_game._player._facing = FACING_NORTHEAST;
 		_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
-		_scene->_hotspots.activate(NOUN_CHAIR, false);
-		local._chairHotspotId = _scene->_dynamicHotspots.add(NOUN_CHAIR, VERB_SIT_IN, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
+		_scene->_hotspots.activate(words_chair, false);
+		local._chairHotspotId = _scene->_dynamicHotspots.add(words_chair, words_sit_in, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
 		if (_scene->_priorSceneId == 112)
 			room_101_say_dang();
 	} else {
@@ -210,11 +210,11 @@ static void room_101_daemon() {
 }
 
 static void room_101_pre_parser() {
-	if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+	if (_action.isAction(words_look, words_view_screen))
 		_game._player._needToWalk = true;
 
 	if (local._sittingFl) {
-		if (_action.isAction(VERB_LOOK) || _action.isAction(NOUN_CHAIR) || _action.isAction(VERB_TALKTO) || _action.isAction(VERB_PEER_THROUGH) || _action.isAction(VERB_EXAMINE))
+		if (_action.isAction(words_look) || _action.isAction(words_chair) || _action.isAction(words_talkto) || _action.isAction(words_peer_through) || _action.isAction(words_examine))
 			_game._player._needToWalk = false;
 
 		if (_game._player._needToWalk) {
@@ -246,7 +246,7 @@ static void room_101_pre_parser() {
 		}
 	}
 
-	if (local._panelOpened && !(_action.isObject(NOUN_SHIELD_ACCESS_PANEL) || _action.isObject(NOUN_SHIELD_MODULATOR))) {
+	if (local._panelOpened && !(_action.isObject(words_shield_access_panel) || _action.isObject(words_shield_modulator))) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._player._needToWalk) {
@@ -262,7 +262,7 @@ static void room_101_pre_parser() {
 		case 1:
 			_game._player._stepEnabled = true;
 			local._panelOpened = false;
-			_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+			_scene->_hotspots.activate(words_shield_modulator, false);
 			break;
 
 		default:
@@ -278,13 +278,13 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_WALKTO, NOUN_LIFE_SUPPORT_SECTION)) {
+	if (_action.isAction(words_walkto, words_life_support_section)) {
 		_scene->_nextSceneId = 102;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) || (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN) && !local._sittingFl)) {
+	if (_action.isAction(words_sit_in, words_chair) || (_action.isAction(words_look, words_view_screen) && !local._sittingFl)) {
 		if (!local._sittingFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -308,8 +308,8 @@ static void room_101_parser() {
 				_game._player._stepEnabled = true;
 				local._sittingFl = true;
 				_scene->_hotspots.activate(71, false);
-				local._chairHotspotId = _scene->_dynamicHotspots.add(NOUN_CHAIR, VERB_SIT_IN, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
-				if (!_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN)) {
+				local._chairHotspotId = _scene->_dynamicHotspots.add(words_chair, words_sit_in, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
+				if (!_action.isAction(words_look, words_view_screen)) {
 					_action._inProgress = false;
 					return;
 				}
@@ -326,7 +326,7 @@ static void room_101_parser() {
 		}
 	}
 
-	if ((_action.isAction(VERB_WALKTO, NOUN_SHIELD_ACCESS_PANEL) || _action.isAction(VERB_OPEN, NOUN_SHIELD_ACCESS_PANEL)) && !local._panelOpened) {
+	if ((_action.isAction(words_walkto, words_shield_access_panel) || _action.isAction(words_open, words_shield_access_panel)) && !local._panelOpened) {
 		switch (_game._trigger) {
 		case 0:
 			local._shieldSpriteIdx = _game._objects.isInRoom(OBJ_SHIELD_MODULATOR) ? 13 : 14;
@@ -343,7 +343,7 @@ static void room_101_parser() {
 			_game._player._stepEnabled = true;
 			local._panelOpened = true;
 			if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
-				_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, true);
+				_scene->_hotspots.activate(words_shield_modulator, true);
 			break;
 
 		default:
@@ -353,19 +353,19 @@ static void room_101_parser() {
 		return;
 	}
 
-	if ((_action.isAction(VERB_TAKE, NOUN_SHIELD_MODULATOR) || _action.isAction(VERB_PULL, NOUN_SHIELD_MODULATOR)) && _game._objects.isInRoom(OBJ_SHIELD_MODULATOR)) {
+	if ((_action.isAction(words_take, words_shield_modulator) || _action.isAction(words_pull, words_shield_modulator)) && _game._objects.isInRoom(OBJ_SHIELD_MODULATOR)) {
 		_game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
 		_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 		_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[14], false, 6, 0, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
-		_scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+		_scene->_hotspots.activate(words_shield_modulator, false);
 		_vm->_dialogs->showItem(OBJ_SHIELD_MODULATOR, 10120);
 		_vm->_sound->command(22);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_SHIELD_ACCESS_PANEL) || (_action.isAction(VERB_LOOK, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))) {
+	if (_action.isAction(words_look, words_shield_access_panel) || (_action.isAction(words_look, words_shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))) {
 		if (local._panelOpened) {
 			if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
 				_vm->_dialogs->show(10128);
@@ -378,13 +378,13 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_SHIELD_ACCESS_PANEL) && local._panelOpened) {
+	if (_action.isAction(words_open, words_shield_access_panel) && local._panelOpened) {
 		_vm->_dialogs->show(10130);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN) && local._sittingFl) {
+	if (_action.isAction(words_look, words_view_screen) && local._sittingFl) {
 		if (_globals[kWatchedViewScreen])
 			room_101_say_dang();
 		else {
@@ -426,133 +426,133 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_CHAIR)) {
+	if (_action.isAction(words_look, words_chair)) {
 		_vm->_dialogs->show(10101);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_PEER_THROUGH)) && (_action.isObject(NOUN_FRONT_WINDOW) || _action.isObject(NOUN_OUTSIDE))) {
+	if ((_action.isAction(words_look) || _action.isAction(words_peer_through)) && (_action.isObject(words_front_window) || _action.isObject(words_outside))) {
 		_vm->_dialogs->show(10102);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_HULL) || _action.isAction(VERB_LOOK, NOUN_OUTER_HULL) || _action.isAction(VERB_EXAMINE, NOUN_HULL) || _action.isAction(VERB_EXAMINE, NOUN_OUTER_HULL)) {
+	if (_action.isAction(words_look, words_hull) || _action.isAction(words_look, words_outer_hull) || _action.isAction(words_examine, words_hull) || _action.isAction(words_examine, words_outer_hull)) {
 		_vm->_dialogs->show(10103);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_FUZZY_DICE)) {
+	if (_action.isAction(words_look, words_fuzzy_dice)) {
 		_vm->_dialogs->show(10104);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_MIRROR) || _action.isAction(VERB_LOOK_IN, NOUN_MIRROR)) {
+	if (_action.isAction(words_look, words_mirror) || _action.isAction(words_look_in, words_mirror)) {
 		_vm->_dialogs->show(10105);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_CURTAINS)) {
+	if (_action.isAction(words_look, words_curtains)) {
 		_vm->_dialogs->show(10106);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_PLASTIC_JESUS)) {
+	if (_action.isAction(words_look, words_plastic_jesus)) {
 		_vm->_dialogs->show(10107);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_ESCAPE_HATCH) || (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH) && !_game._objects.isInInventory(OBJ_REBREATHER))) {
+	if (_action.isAction(words_look, words_escape_hatch) || (_action.isAction(words_open, words_escape_hatch) && !_game._objects.isInInventory(OBJ_REBREATHER))) {
 		_vm->_dialogs->show(10109);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH)) {
+	if (_action.isAction(words_open, words_escape_hatch)) {
 		_vm->_dialogs->show(10110);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_TARGET_COMPUTER)) {
+	if (_action.isAction(words_look, words_target_computer)) {
 		_vm->_dialogs->show(10111);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_LIBRARY_COMPUTER)) {
+	if (_action.isAction(words_look, words_library_computer)) {
 		_vm->_dialogs->show(10126);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_DAMAGE_CONTROL_PANEL)) {
+	if (_action.isAction(words_look, words_damage_control_panel)) {
 		_vm->_dialogs->show(10112);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_NAVIGATION_CONTROLS)) {
+	if (_action.isAction(words_look, words_navigation_controls)) {
 		_vm->_dialogs->show(10113);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_ENGINEERING_CONTROLS)) {
+	if (_action.isAction(words_look, words_engineering_controls)) {
 		_vm->_dialogs->show(10114);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_WEAPONS_DISPLAY)) {
+	if (_action.isAction(words_look, words_weapons_display)) {
 		_vm->_dialogs->show(10115);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_SHIELD_STATUS_PANEL)) {
+	if (_action.isAction(words_look, words_shield_status_panel)) {
 		_vm->_dialogs->show(10116);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_PLASTIC_JESUS)) {
+	if (_action.isAction(words_take, words_plastic_jesus)) {
 		_vm->_dialogs->show(10118);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_FUZZY_DICE)) {
+	if (_action.isAction(words_take, words_fuzzy_dice)) {
 		_vm->_dialogs->show(10119);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_DAMAGE_CONTROL_PANEL)) {
+	if (_action.isAction(words_open, words_damage_control_panel)) {
 		_vm->_dialogs->show(10121);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_CURTAINS)) {
+	if (_action.isAction(words_open, words_curtains)) {
 		_vm->_dialogs->show(10122);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_CLOSE, NOUN_CURTAINS)) {
+	if (_action.isAction(words_close, words_curtains)) {
 		_vm->_dialogs->show(10123);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_PLAY)) && _action.isObject(NOUN_VIDEO_GAME)) {
+	if ((_action.isAction(words_look) || _action.isAction(words_play)) && _action.isObject(words_video_game)) {
 		_vm->_dialogs->show(10124);
 		_action._inProgress = false;
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room102.cpp b/engines/mads/madsv2/nebular/rooms/room102.cpp
index 67dec61fe9c..80232603ae9 100644
--- a/engines/mads/madsv2/nebular/rooms/room102.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room102.cpp
@@ -78,9 +78,9 @@ static void room_102_init() {
 	if (_game._objects.isInRoom(OBJ_BINOCULARS))
 		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 24, 0, 0, 24);
 	else
-		_scene->_hotspots.activate(NOUN_BINOCULARS, false);
+		_scene->_hotspots.activate(words_binoculars, false);
 
-	_scene->_hotspots.activate(NOUN_BURGER, false);
+	_scene->_hotspots.activate(words_burger, false);
 
 	if (_globals[kMedicineCabinetOpen]) {
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0);
@@ -179,10 +179,10 @@ static void room_102_daemon() {
 }
 
 static void room_102_pre_parser() {
-	if (_action.isObject(NOUN_REFRIGERATOR) || _action.isObject(NOUN_POSTER))
+	if (_action.isObject(words_refrigerator) || _action.isObject(words_poster))
 		_game._player._needToWalk = _game._player._readyToWalk;
 
-	if (local._fridgeOpenedFl && !_action.isObject(NOUN_REFRIGERATOR)) {
+	if (local._fridgeOpenedFl && !_action.isObject(words_refrigerator)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._player._needToWalk) {
@@ -198,7 +198,7 @@ static void room_102_pre_parser() {
 		case 1:
 			if (_game._objects.isInRoom(OBJ_BURGER)) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
-				_scene->_hotspots.activate(NOUN_BURGER, false);
+				_scene->_hotspots.activate(words_burger, false);
 			}
 			local._fridgeOpenedFl = false;
 			_game._player._stepEnabled = true;
@@ -221,7 +221,7 @@ static void room_102_parser() {
 	}
 
 	bool justOpenedFl = false;
-	if (_action.isObject(NOUN_REFRIGERATOR) && !local._fridgeOpenedFl) {
+	if (_action.isObject(words_refrigerator) && !local._fridgeOpenedFl) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
@@ -241,7 +241,7 @@ static void room_102_parser() {
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
 			int delay;
-			if (_action.isAction(VERB_WALKTO) && !local._fridgeFirstOpenFl)
+			if (_action.isAction(words_walkto) && !local._fridgeFirstOpenFl)
 				delay = 0;
 			else
 				delay = 48;
@@ -256,7 +256,7 @@ static void room_102_parser() {
 			_game._player._stepEnabled = true;
 			justOpenedFl = true;
 			if (_game._objects.isInRoom(OBJ_BURGER))
-				_scene->_hotspots.activate(NOUN_BURGER, true);
+				_scene->_hotspots.activate(words_burger, true);
 			break;
 
 		default:
@@ -264,7 +264,7 @@ static void room_102_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_REFRIGERATOR) || _action.isAction(VERB_OPEN, NOUN_REFRIGERATOR)) {
+	if (_action.isAction(words_look, words_refrigerator) || _action.isAction(words_open, words_refrigerator)) {
 		if (_game._objects.isInRoom(OBJ_BURGER))
 			_vm->_dialogs->show(10230);
 		else
@@ -275,7 +275,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_WALKTO, NOUN_REFRIGERATOR) && justOpenedFl) {
+	if (_action.isAction(words_walkto, words_refrigerator) && justOpenedFl) {
 		local._fridgeFirstOpenFl = false;
 		int quoteId = _vm->getRandomNumber(59, 63);
 		const char *curQuote = _game.getQuote(quoteId);
@@ -289,19 +289,19 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_CLOSE, NOUN_REFRIGERATOR)) {
+	if (_action.isAction(words_close, words_refrigerator)) {
 		_vm->_dialogs->show(10213);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_REFRIGERATOR)) {
+	if (_action.isAction(words_take, words_refrigerator)) {
 		_vm->_dialogs->show(8);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+	if (_action.isAction(words_walk_through, words_door)) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
@@ -321,99 +321,99 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_WALKTO, NOUN_ENGINEERING_SECTION)) {
+	if (_action.isAction(words_walkto, words_engineering_section)) {
 		_scene->_nextSceneId = 103;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_WALKTO, NOUN_POSTER) || _action.isAction(VERB_LOOK, NOUN_POSTER) || _action.isAction(VERB_WALKTO, NOUN_BINOCULARS)) {
+	if (_action.isAction(words_walkto, words_poster) || _action.isAction(words_look, words_poster) || _action.isAction(words_walkto, words_binoculars)) {
 		addRandomMessage();
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_WEIGHT_MACHINE)) {
+	if (_action.isAction(words_look, words_weight_machine)) {
 		_vm->_dialogs->show(10212);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_ENGINEERING_SECTION)) {
+	if (_action.isAction(words_look, words_engineering_section)) {
 		_vm->_dialogs->show(10205);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_DOOR)) {
+	if (_action.isAction(words_look, words_door)) {
 		_vm->_dialogs->show(10204);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_STARE_AT, NOUN_CEILING) || _action.isAction(VERB_LOOK, NOUN_CEILING)) {
+	if (_action.isAction(words_stare_at, words_ceiling) || _action.isAction(words_look, words_ceiling)) {
 		_vm->_dialogs->show(10203);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_STARE_AT, NOUN_OVERHEAD_LAMP) || _action.isAction(VERB_LOOK, NOUN_OVERHEAD_LAMP)) {
+	if (_action.isAction(words_stare_at, words_overhead_lamp) || _action.isAction(words_look, words_overhead_lamp)) {
 		_vm->_dialogs->show(10202);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_ROBO_KITCHEN)) {
+	if (_action.isAction(words_look, words_robo_kitchen)) {
 		_vm->_dialogs->show(10215);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(OBJ_BURGER)) {
+	if (_action.isAction(words_put, words_burger, words_robo_kitchen) && _game._objects.isInInventory(OBJ_BURGER)) {
 		_vm->_dialogs->show(10216);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_PUT, NOUN_REFRIGERATOR) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	if (_action.isAction(words_put, words_refrigerator) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		_vm->_dialogs->show(10217);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_ROBO_KITCHEN) || _action.isAction(VERB_PUT, NOUN_STUFFED_FISH, NOUN_ROBO_KITCHEN)) {
+	if (_action.isAction(words_put, words_dead_fish, words_robo_kitchen) || _action.isAction(words_put, words_stuffed_fish, words_robo_kitchen)) {
 		_vm->_dialogs->show(10230);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_ROBO_KITCHEN)) {
+	if (_action.isAction(words_open, words_robo_kitchen)) {
 		_vm->_dialogs->show(10218);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_CLOSET)) {
+	if (_action.isAction(words_look, words_closet)) {
 		_vm->_dialogs->show(10219);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isObject(NOUN_LADDER) || _action.isObject(NOUN_HATCHWAY)) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_CLIMB_UP) || _action.isAction(VERB_CLIMB_THROUGH))) {
+	if ((_action.isObject(words_ladder) || _action.isObject(words_hatchway)) && (_action.isAction(words_look) || _action.isAction(words_climb_up) || _action.isAction(words_climb_through))) {
 		if (_game._objects.isInInventory(OBJ_REBREATHER)) {
-			if (!_action.isAction(VERB_CLIMB_UP) && !_action.isAction(VERB_CLIMB_THROUGH)) {
+			if (!_action.isAction(words_climb_up) && !_action.isAction(words_climb_through)) {
 				_vm->_dialogs->show(10231);
 				_action._inProgress = false;
 				return;
 			}
-		} else if (_action.isAction(VERB_LOOK) || (_game._difficulty != DIFFICULTY_HARD)) {
+		} else if (_action.isAction(words_look) || (_game._difficulty != DIFFICULTY_HARD)) {
 			_vm->_dialogs->show(10222);
 			_action._inProgress = false;
 			return;
 		}
 	}
 
-	if ((_action.isObject(NOUN_LADDER) || _action.isObject(NOUN_HATCHWAY)) && (_action.isAction(VERB_CLIMB_UP) || _action.isAction(VERB_CLIMB_THROUGH))) {
+	if ((_action.isObject(words_ladder) || _action.isObject(words_hatchway)) && (_action.isAction(words_climb_up) || _action.isAction(words_climb_through))) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(formAnimName('A', -1), 1);
@@ -451,57 +451,57 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_POWER_STATUS_PANEL)) {
+	if (_action.isAction(words_look, words_power_status_panel)) {
 		_vm->_dialogs->show(10226);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_WINDOW) || _action.isAction(VERB_LOOK_THROUGH, NOUN_WINDOW)) {
+	if (_action.isAction(words_look, words_window) || _action.isAction(words_look_through, words_window)) {
 		_vm->_dialogs->show(10227);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_DOORWAY) || _action.isAction(VERB_WALKTO, NOUN_DOORWAY)) {
+	if (_action.isAction(words_look, words_doorway) || _action.isAction(words_walkto, words_doorway)) {
 		_vm->_dialogs->show(10228);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_DRAWER) || ((_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) && !local._drawerDescrFl)) {
+	if (_action.isAction(words_look, words_drawer) || ((_action.isAction(words_close, words_drawer) || _action.isAction(words_push, words_drawer)) && !local._drawerDescrFl)) {
 		_vm->_dialogs->show(10220);
 		local._drawerDescrFl = true;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) {
+	if (_action.isAction(words_close, words_drawer) || _action.isAction(words_push, words_drawer)) {
 		_vm->_dialogs->show(10221);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_DRAWER)) {
+	if (_action.isAction(words_open, words_drawer)) {
 		_vm->_dialogs->show(10236);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) && !local._chairDescrFl)) {
+	if (_action.isAction(words_look, words_chair) || (_action.isAction(words_sit_in, words_chair) && !local._chairDescrFl)) {
 		local._chairDescrFl = true;
 		_vm->_dialogs->show(10210);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_SIT_IN, NOUN_CHAIR)) {
+	if (_action.isAction(words_sit_in, words_chair)) {
 		_vm->_dialogs->show(10211);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_MEDICINE_CABINET)) {
+	if (_action.isAction(words_look, words_medicine_cabinet)) {
 		if (_globals[kMedicineCabinetOpen])
 			_vm->_dialogs->show(10207);
 		else
@@ -511,7 +511,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_CLOSE, NOUN_MEDICINE_CABINET) && _globals[kMedicineCabinetOpen]) {
+	if (_action.isAction(words_close, words_medicine_cabinet) && _globals[kMedicineCabinetOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->_sequences.remove(_globals._sequenceIndexes[8]);
@@ -538,7 +538,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_MEDICINE_CABINET) && !_globals[kMedicineCabinetOpen]) {
+	if (_action.isAction(words_open, words_medicine_cabinet) && !_globals[kMedicineCabinetOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
@@ -571,7 +571,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && _game._objects.isInRoom(OBJ_BINOCULARS)) {
+	if (_action.isAction(words_take, words_binoculars) && _game._objects.isInRoom(OBJ_BINOCULARS)) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
@@ -584,7 +584,7 @@ static void room_102_parser() {
 		case 1:
 			_game._objects.addToInventory(OBJ_BINOCULARS);
 			_scene->_sequences.remove(_globals._sequenceIndexes[9]);
-			_scene->_hotspots.activate(NOUN_BINOCULARS, false);
+			_scene->_hotspots.activate(words_binoculars, false);
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
 			_vm->_sound->command(22);
@@ -598,12 +598,12 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_BURGER) && _game._objects.isInRoom(OBJ_BURGER)) {
+	if (_action.isAction(words_take, words_burger) && _game._objects.isInRoom(OBJ_BURGER)) {
 		if (_game._trigger == 0) {
 			_vm->_dialogs->showItem(OBJ_BURGER, 10235);
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 			_game._objects.addToInventory(OBJ_BURGER);
-			_scene->_hotspots.activate(NOUN_BURGER, false);
+			_scene->_hotspots.activate(words_burger, false);
 			_vm->_sound->command(22);
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
@@ -612,38 +612,38 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_POSTER)) {
+	if (_action.isAction(words_take, words_poster)) {
 		_vm->_dialogs->show(10224);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_WEIGHT_MACHINE)) {
+	if ((_action.isAction(words_push) || _action.isAction(words_pull)) && _action.isObject(words_weight_machine)) {
 		_vm->_dialogs->show(10225);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_FLOOR)) {
+	if (_action.isAction(words_look, words_floor)) {
 		_vm->_dialogs->show(10232);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && !_game._objects.isInInventory(OBJ_BINOCULARS)) {
+	if (_action.isAction(words_look, words_binoculars) && !_game._objects.isInInventory(OBJ_BINOCULARS)) {
 		_vm->_dialogs->show(10233);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+	if (_action.isAction(words_look, words_burger) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		_vm->_dialogs->show(801);
 		_action._inProgress = false;
 	}
 }
 
 static void room_102_error() {
-	if (_action.isAction(VERB_PUT, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	if (_action.isAction(words_put, words_robo_kitchen) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		_vm->_dialogs->show(10217);
 		_action._inProgress = false;
 	}
diff --git a/engines/mads/madsv2/nebular/rooms/room103.cpp b/engines/mads/madsv2/nebular/rooms/room103.cpp
index da1f8711097..9b8e0c9c090 100644
--- a/engines/mads/madsv2/nebular/rooms/room103.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room103.cpp
@@ -163,7 +163,7 @@ static void room_103_pre_parser() {
 static void room_103_parser() {
 	if (_action._savedFields._lookFlag)
 		_vm->_dialogs->show(10322);
-	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+	else if (_action.isAction(words_walk_through, words_door)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
@@ -181,7 +181,7 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TAKE, NOUN_TIMER_MODULE) && _game._objects.isInRoom(OBJ_TIMER_MODULE)) {
+	} else if (_action.isAction(words_take, words_timer_module) && _game._objects.isInRoom(OBJ_TIMER_MODULE)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 			_scene->changeVariant(1);
@@ -211,7 +211,7 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TAKE, NOUN_REBREATHER, 0) && _game._objects.isInRoom(OBJ_REBREATHER)) {
+	} else if (_action.isAction(words_take, words_rebreather, 0) && _game._objects.isInRoom(OBJ_REBREATHER)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 			_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 3, 2);
@@ -238,9 +238,9 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, 362))
+	} else if (_action.isAction(words_look, 362))
 		_vm->_dialogs->show(10301);
-	else if (_action.isAction(VERB_TAKE, 362)) {
+	else if (_action.isAction(words_take, 362)) {
 		// Take Turkey
 		if (!_vm->_game->_trigger)
 			_vm->_sound->command(31);
@@ -270,9 +270,9 @@ static void room_103_parser() {
 			_vm->_dialogs->show(10302);
 			_scene->_hotspots.activate(362, false);
 		}
-	} else if (_action.isAction(VERB_LOOK, 250))
+	} else if (_action.isAction(words_look, 250))
 		_vm->_dialogs->show(!_globals[kTurkeyExploded] ? 10323 : 10303);
-	else if (_action.isAction(VERB_TALKTO, 27)) {
+	else if (_action.isAction(words_talkto, 27)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 		{
@@ -302,37 +302,37 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, 27))
+	} else if (_action.isAction(words_look, 27))
 		_vm->_dialogs->show(10304);
-	else if (_action.isAction(VERB_LOOK, 36))
+	else if (_action.isAction(words_look, 36))
 		_vm->_dialogs->show(10307);
-	else if (_action.isAction(VERB_LOOK, 55))
+	else if (_action.isAction(words_look, 55))
 		_vm->_dialogs->show(10308);
-	else if (_action.isAction(VERB_TAKE, 315))
+	else if (_action.isAction(words_take, 315))
 		_vm->_dialogs->show(10309);
-	else if (_action.isAction(VERB_TAKE, 85))
+	else if (_action.isAction(words_take, 85))
 		_vm->_dialogs->show(10310);
-	else if (_action.isAction(VERB_LOOK, 144))
+	else if (_action.isAction(words_look, 144))
 		_vm->_dialogs->show(10312);
-	else if (_action.isAction(VERB_OPEN, 144))
+	else if (_action.isAction(words_open, 144))
 		_vm->_dialogs->show(10313);
-	else if (_action.isAction(VERB_CLOSE, 27))
+	else if (_action.isAction(words_close, 27))
 		_vm->_dialogs->show(10314);
-	else if (_action.isAction(VERB_LOOK, 310))
+	else if (_action.isAction(words_look, 310))
 		_vm->_dialogs->show(10315);
-	else if (_action.isAction(VERB_LOOK, 178))
+	else if (_action.isAction(words_look, 178))
 		_vm->_dialogs->show(10316);
-	else if (_action.isAction(VERB_LOOK, 283))
+	else if (_action.isAction(words_look, 283))
 		_vm->_dialogs->show(10317);
-	else if (_action.isAction(VERB_LOOK, 120))
+	else if (_action.isAction(words_look, 120))
 		_vm->_dialogs->show(10318);
-	else if (_action.isAction(VERB_LOOK, 289) && _game._objects.isInInventory(OBJ_REBREATHER))
+	else if (_action.isAction(words_look, 289) && _game._objects.isInInventory(OBJ_REBREATHER))
 		_vm->_dialogs->show(10319);
-	else if (_action.isAction(VERB_LOOK, 371) && _game._objects.isInInventory(OBJ_TIMER_MODULE))
+	else if (_action.isAction(words_look, 371) && _game._objects.isInInventory(OBJ_TIMER_MODULE))
 		_vm->_dialogs->show(10320);
-	else if (_action.isAction(VERB_LOOK, 137))
+	else if (_action.isAction(words_look, 137))
 		_vm->_dialogs->show(10321);
-	else if (_action.isAction(VERB_LOOK, 409))
+	else if (_action.isAction(words_look, 409))
 		_vm->_dialogs->show(_game._objects.isInInventory(OBJ_TIMER_MODULE) ? 10324 : 10325);
 	else
 		return;
@@ -341,10 +341,10 @@ static void room_103_parser() {
 }
 
 void room_103_error() {
-	if (_action.isObject(NOUN_AUXILIARY_POWER) && !_action.isAction(VERB_WALKTO)) {
+	if (_action.isObject(words_auxiliary_power) && !_action.isAction(words_walkto)) {
 		_vm->_dialogs->show(10305);
 		_action._inProgress = false;
-	} else if (_action.isAction(VERB_PUT, NOUN_COAL, NOUN_FURNACE)) {
+	} else if (_action.isAction(words_put, words_coal, words_furnace)) {
 		const char *msg = _game.getQuote(73);
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, msg);
 		_action._inProgress = false;
diff --git a/engines/mads/madsv2/nebular/rooms/room104.cpp b/engines/mads/madsv2/nebular/rooms/room104.cpp
index 493885bba69..482e49b7cf0 100644
--- a/engines/mads/madsv2/nebular/rooms/room104.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room104.cpp
@@ -211,23 +211,23 @@ static void room_104_daemon() {
 }
 
 static void room_104_pre_parser() {
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_EASTERN_CLIFF_FACE))
+	if (_action.isAction(words_swim_towards, words_eastern_cliff_face))
 		_game._player._walkOffScreenSceneId = 105;
 
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+	if (_action.isAction(words_swim_towards, words_open_area_to_south))
 		_game._player._walkOffScreenSceneId = 106;
 }
 
 static void room_104_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10405);
-	else if (_action.isAction(VERB_LOOK, NOUN_CURIOUS_WEED_PATCH))
+	else if (_action.isAction(words_look, words_curious_weed_patch))
 		_vm->_dialogs->show(10404);
-	else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+	else if (_action.isAction(words_look, words_surface))
 		_vm->_dialogs->show(10403);
-	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+	else if (_action.isAction(words_look, words_cliff_face))
 		_vm->_dialogs->show(10401);
-	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+	else if (_action.isAction(words_look, words_ocean_floor))
 		_vm->_dialogs->show(10402);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room105.cpp b/engines/mads/madsv2/nebular/rooms/room105.cpp
index a0dcaf4f538..4bd7abd2660 100644
--- a/engines/mads/madsv2/nebular/rooms/room105.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room105.cpp
@@ -48,7 +48,7 @@ static void room_105_init() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(48, 144));
 
-		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_FISH, VERB_SWIM_TO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_dead_fish, words_swim_to, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(56, 141), FACING_NORTHWEST);
 	}
 
@@ -131,20 +131,20 @@ static void room_105_daemon() {
 }
 
 static void room_105_pre_parser() {
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_WESTERN_CLIFF_FACE))
+	if (_action.isAction(words_swim_towards, words_western_cliff_face))
 		_game._player._walkOffScreenSceneId = 104;
 
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+	if (_action.isAction(words_swim_towards, words_open_area_to_south))
 		_game._player._walkOffScreenSceneId = 107;
 
-	if (_action.isObject(NOUN_MINE) && (_action.isAction(VERB_TALKTO) || _action.isAction(VERB_LOOK)))
+	if (_action.isObject(words_mine) && (_action.isAction(words_talkto) || _action.isAction(words_look)))
 		_game._player._needToWalk = false;
 }
 
 static void room_105_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10512);
-	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn105]) {
+	else if (_action.isAction(words_take, words_dead_fish) && _globals[kFishIn105]) {
 		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
 			int randVal = _vm->getRandomNumber(74, 76);
 			_scene->_kernelMessages.reset();
@@ -155,25 +155,25 @@ static void room_105_parser() {
 			_globals[kFishIn105] = false;
 			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 802, 0);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_WESTERN_CLIFF_FACE))
+	} else if (_action.isAction(words_look, words_western_cliff_face))
 		_vm->_dialogs->show(10501);
-	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+	else if (_action.isAction(words_look, words_cliff_face))
 		_vm->_dialogs->show(10502);
-	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+	else if (_action.isAction(words_look, words_ocean_floor))
 		_vm->_dialogs->show(10503);
-	else if (_action.isAction(VERB_LOOK, NOUN_MEDICAL_WASTE))
+	else if (_action.isAction(words_look, words_medical_waste))
 		_vm->_dialogs->show(10504);
-	else if (_action.isAction(VERB_TAKE, NOUN_MEDICAL_WASTE))
+	else if (_action.isAction(words_take, words_medical_waste))
 		_vm->_dialogs->show(10505);
-	else if (_action.isAction(VERB_LOOK, NOUN_MINE))
+	else if (_action.isAction(words_look, words_mine))
 		_vm->_dialogs->show(10506);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH))
+	else if (_action.isAction(words_look, words_dead_fish))
 		_vm->_dialogs->show(10508);
-	else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+	else if (_action.isAction(words_look, words_surface))
 		_vm->_dialogs->show(10509);
-	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_SOUTH))
+	else if (_action.isAction(words_look, words_open_area_to_south))
 		_vm->_dialogs->show(10510);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(10511);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room106.cpp b/engines/mads/madsv2/nebular/rooms/room106.cpp
index 63bf1234c73..9f33d4a8817 100644
--- a/engines/mads/madsv2/nebular/rooms/room106.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room106.cpp
@@ -184,20 +184,20 @@ static void room_106_daemon() {
 }
 
 static void room_106_pre_parser() {
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_SEA_CLIFF) || _action.isAction(VERB_SWIM_TOWARDS, NOUN_SEAWEED_BANK)) {
+	if (_action.isAction(words_swim_towards, words_sea_cliff) || _action.isAction(words_swim_towards, words_seaweed_bank)) {
 		_game._player._stepEnabled = false;
 		_scene->_sprites[_game._player._spritesStart + 1]->_charInfo->_velocity = 24;
 		_game._player._walkOffScreenSceneId = 104;
 	}
 
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_EAST))
+	if (_action.isAction(words_swim_towards, words_open_area_to_east))
 		_game._player._walkOffScreenSceneId = 107;
 }
 
 static void room_106_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10614);
-	else if (_action.isAction(VERB_SWIM_TO, NOUN_MAIN_AIRLOCK)) {
+	else if (_action.isAction(words_swim_to, words_main_airlock)) {
 		_game._player._stepEnabled = false;
 		_game._player._prepareWalkPos = Common::Point(95, 72);
 		_game._player._prepareWalkFacing = FACING_WEST;
@@ -205,31 +205,31 @@ static void room_106_parser() {
 		_game._player._readyToWalk = true;
 		_game._player._frameNumber = 9;
 		local._backToShipFl = true;
-	} else if (_action.isAction(VERB_LOOK, NOUN_ANEMONE) || _action.isAction(VERB_LOOK_AT, NOUN_ANEMONE))
+	} else if (_action.isAction(words_look, words_anemone) || _action.isAction(words_look_at, words_anemone))
 		_vm->_dialogs->show(10601);
-	else if (_action.isAction(VERB_TAKE, NOUN_ANEMONE))
+	else if (_action.isAction(words_take, words_anemone))
 		_vm->_dialogs->show(10602);
-	else if (_action.isAction(VERB_LOOK, NOUN_SEAWEED) || _action.isAction(VERB_LOOK, NOUN_SEAWEED_BANK))
+	else if (_action.isAction(words_look, words_seaweed) || _action.isAction(words_look, words_seaweed_bank))
 		_vm->_dialogs->show(10603);
-	else if (_action.isAction(VERB_TAKE, NOUN_SEAWEED) || _action.isAction(VERB_TAKE, NOUN_SEAWEED_BANK))
+	else if (_action.isAction(words_take, words_seaweed) || _action.isAction(words_take, words_seaweed_bank))
 		_vm->_dialogs->show(10604);
-	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_EAST))
+	else if (_action.isAction(words_look, words_open_area_to_east))
 		_vm->_dialogs->show(10605);
-	else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_ROCKS) || _action.isAction(VERB_LOOK_AT, NOUN_PILE_OF_ROCKS))
+	else if (_action.isAction(words_look, words_pile_of_rocks) || _action.isAction(words_look_at, words_pile_of_rocks))
 		_vm->_dialogs->show(10606);
-	else if (_action.isObject(NOUN_PILE_OF_ROCKS) && (_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE)))
+	else if (_action.isObject(words_pile_of_rocks) && (_action.isAction(words_push) || _action.isAction(words_pull) || _action.isAction(words_take)))
 		_vm->_dialogs->show(10607);
-	else if (_action.isAction(VERB_LOOK, NOUN_SHIP) || _action.isAction(VERB_LOOK_AT, NOUN_SHIP))
+	else if (_action.isAction(words_look, words_ship) || _action.isAction(words_look_at, words_ship))
 		_vm->_dialogs->show(10608);
-	else if (_action.isAction(VERB_LOOK, NOUN_MAIN_AIRLOCK))
+	else if (_action.isAction(words_look, words_main_airlock))
 		_vm->_dialogs->show(10609);
-	else if (_action.isAction(VERB_OPEN, NOUN_MAIN_AIRLOCK))
+	else if (_action.isAction(words_open, words_main_airlock))
 		_vm->_dialogs->show(10610);
-	else if (_action.isAction(VERB_CLOSE, NOUN_MAIN_AIRLOCK))
+	else if (_action.isAction(words_close, words_main_airlock))
 		_vm->_dialogs->show(10611);
-	else if (_action.isAction(VERB_LOOK, NOUN_SEA_CLIFF))
+	else if (_action.isAction(words_look, words_sea_cliff))
 		_vm->_dialogs->show(10612);
-	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+	else if (_action.isAction(words_look, words_ocean_floor))
 		_vm->_dialogs->show(10613);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room107.cpp b/engines/mads/madsv2/nebular/rooms/room107.cpp
index a6425b02695..0a13a853320 100644
--- a/engines/mads/madsv2/nebular/rooms/room107.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room107.cpp
@@ -56,7 +56,7 @@ static void room_107_init() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(68, 151));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
-		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_FISH, VERB_SWIM_TO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_dead_fish, words_swim_to, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(78, 135), FACING_SOUTHWEST);
 	}
 
@@ -73,7 +73,7 @@ static void room_107_init() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(270, 150));
 		_scene->_sequences.setMotion(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, -200, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
-		_scene->_dynamicHotspots.add(NOUN_MANTA_RAY, VERB_SWIM_TO, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.add(words_manta_ray, words_swim_to, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 	}
 
 	_game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
@@ -95,17 +95,17 @@ static void room_107_daemon() {
 }
 
 static void room_107_pre_parser() {
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
+	if (_action.isAction(words_swim_towards, words_open_area_to_west))
 		_game._player._walkOffScreenSceneId = 106;
 
-	if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+	if (_action.isAction(words_swim_towards, words_open_area_to_south))
 		_game._player._walkOffScreenSceneId = 108;
 }
 
 static void room_107_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10708);
-	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn107]) {
+	else if (_action.isAction(words_take, words_dead_fish) && _globals[kFishIn107]) {
 		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
 			int randVal = _vm->getRandomNumber(74, 76);
 			_scene->_kernelMessages.reset();
@@ -116,25 +116,25 @@ static void room_107_parser() {
 			_globals[kFishIn107] = false;
 			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 802);
 		}
-	} else if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_NORTHERN_SEA_CLIFF))
+	} else if (_action.isAction(words_swim_towards, words_northern_sea_cliff))
 		_scene->_nextSceneId = 105;
-	else if (_action.isAction(VERB_LOOK, NOUN_NORTHERN_SEA_CLIFF))
+	else if (_action.isAction(words_look, words_northern_sea_cliff))
 		_vm->_dialogs->show(10701);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (_action.isAction(words_look, words_dead_fish) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(10702);
-	else if (_action.isAction(VERB_LOOK, NOUN_BUSH_LIKE_FORMATION))
+	else if (_action.isAction(words_look, words_bush_like_formation))
 		_vm->_dialogs->show(10703);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+	else if (_action.isAction(words_look, words_rock))
 		_vm->_dialogs->show(10704);
-	else if (_action.isAction(VERB_LOOK, NOUN_SEAWEED))
+	else if (_action.isAction(words_look, words_seaweed))
 		_vm->_dialogs->show(10705);
-	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_SOUTH))
+	else if (_action.isAction(words_look, words_open_area_to_south))
 		_vm->_dialogs->show(10706);
-	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+	else if (_action.isAction(words_look, words_cliff_face))
 		_vm->_dialogs->show(10707);
-	else if (_action.isAction(VERB_LOOK, NOUN_MANTA_RAY))
+	else if (_action.isAction(words_look, words_manta_ray))
 		_vm->_dialogs->show(10709);
-	else if (_action.isAction(VERB_TAKE, NOUN_MANTA_RAY))
+	else if (_action.isAction(words_take, words_manta_ray))
 		_vm->_dialogs->show(10710);
 	else
 		return;
@@ -154,7 +154,7 @@ void room_107_preload() {
 
 	section_1_walker();
 	section_1_interface();
-	vocab_make_active(NOUN_MANTA_RAY);
+	vocab_make_active(words_manta_ray);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room108.cpp b/engines/mads/madsv2/nebular/rooms/room108.cpp
index bb9edd07096..0b776073712 100644
--- a/engines/mads/madsv2/nebular/rooms/room108.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room108.cpp
@@ -53,7 +53,7 @@ static void room_108_init() {
 	if (_globals[kFishIn108]) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(41, 109));
-		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_FISH, VERB_SWIM_TO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_dead_fish, words_swim_to, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(41, 109), FACING_NORTHWEST);
 	}
 
@@ -71,14 +71,14 @@ static void room_108_daemon() {
 }
 
 static void room_108_pre_parser() {
-	if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_EAST))
+	if (_action.isAction(words_swim_under, words_overhang_to_east))
 		_game._player._walkOffScreenSceneId = 109;
 }
 
 static void room_108_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10812);
-	else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn108]) {
+	else if (_action.isAction(words_take, words_dead_fish) && _globals[kFishIn108]) {
 		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
 			int randVal = _vm->getRandomNumber(74, 76);
 			_scene->_kernelMessages.reset();
@@ -89,27 +89,27 @@ static void room_108_parser() {
 			_globals[kFishIn108] = false;
 			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 10808);
 		}
-	} else if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_NORTH))
+	} else if (_action.isAction(words_swim_towards, words_open_area_to_north))
 		_scene->_nextSceneId = 107;
-	else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+	else if (_action.isAction(words_look, words_cliff_face))
 		_vm->_dialogs->show(10801);
-	else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+	else if (_action.isAction(words_look, words_ocean_floor))
 		_vm->_dialogs->show(10802);
-	else if (_action.isAction(VERB_LOOK, NOUN_ODD_ROCK_FORMATION))
+	else if (_action.isAction(words_look, words_odd_rock_formation))
 		_vm->_dialogs->show(10803);
-	else if (_action.isAction(VERB_TAKE, NOUN_ODD_ROCK_FORMATION))
+	else if (_action.isAction(words_take, words_odd_rock_formation))
 		_vm->_dialogs->show(10804);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(10805);
-	else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+	else if (_action.isAction(words_take, words_rocks))
 		_vm->_dialogs->show(10806);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH))
+	else if (_action.isAction(words_look, words_dead_fish))
 		_vm->_dialogs->show(10807);
-	else if (_action.isAction(VERB_LOOK, NOUN_OVERHANG_TO_EAST))
+	else if (_action.isAction(words_look, words_overhang_to_east))
 		_vm->_dialogs->show(10809);
-	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_NORTH))
+	else if (_action.isAction(words_look, words_open_area_to_north))
 		_vm->_dialogs->show(10810);
-	else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+	else if (_action.isAction(words_look, words_surface))
 		_vm->_dialogs->show(10811);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room109.cpp b/engines/mads/madsv2/nebular/rooms/room109.cpp
index 4aaa8e66067..00c2c75e6d8 100644
--- a/engines/mads/madsv2/nebular/rooms/room109.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room109.cpp
@@ -76,11 +76,11 @@ static void room_109_init() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
 
-		int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(256, 57, 267, 87));
+		int idx = _scene->_dynamicHotspots.add(words_dead_purple_monster, words_swim_to, -1, Common::Rect(256, 57, 267, 87));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-		idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(242, 79, 265, 90));
+		idx = _scene->_dynamicHotspots.add(words_dead_purple_monster, words_swim_to, -1, Common::Rect(242, 79, 265, 90));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-		idx = _scene->_dynamicHotspots.add(NOUN_MONSTER_SLUDGE, VERB_SWIM_TO, -1, Common::Rect(231, 88, 253, 94));
+		idx = _scene->_dynamicHotspots.add(words_monster_sludge, words_swim_to, -1, Common::Rect(231, 88, 253, 94));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
 	}
 
@@ -90,7 +90,7 @@ static void room_109_init() {
 	if (_game._objects.isInRoom(OBJ_BURGER)) {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_burger, words_swim_to, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 	} else if (_scene->_roomChanged)
 		_game._objects.addToInventory(OBJ_BURGER);
@@ -196,12 +196,12 @@ static void room_109_daemon() {
 }
 
 static void room_109_pre_parser() {
-	if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_WEST))
+	if (_action.isAction(words_swim_under, words_overhang_to_west))
 		_game._player._walkOffScreenSceneId = 108;
 
-	if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE) || _action.isAction(VERB_PUT))
-		&& (_action.isTarget(NOUN_SMALL_HOLE) || _action.isTarget(NOUN_TUNNEL))
-		&& (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER))) {
+	if ((_action.isAction(words_throw) || _action.isAction(words_give) || _action.isAction(words_put))
+		&& (_action.isTarget(words_small_hole) || _action.isTarget(words_tunnel))
+		&& (_action.isObject(words_dead_fish) || _action.isObject(words_stuffed_fish) || _action.isObject(words_burger))) {
 		int idx = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 		if ((idx >= 0) && _game._objects.isInInventory(idx)) {
 			_game._player._prepareWalkPos = Common::Point(106, 38);
@@ -211,8 +211,8 @@ static void room_109_pre_parser() {
 		}
 	}
 
-	if ((_action.isAction(VERB_SWIM_INTO, NOUN_TUNNEL) || _action.isAction(VERB_SWIM_TO, NOUN_SMALL_HOLE))
-		&& (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (_action.isObject(NOUN_TUNNEL)))
+	if ((_action.isAction(words_swim_into, words_tunnel) || _action.isAction(words_swim_to, words_small_hole))
+		&& (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (_action.isObject(words_tunnel)))
 		_game._player._walkOffScreenSceneId = 110;
 
 	local._hungryFl = false;
@@ -225,8 +225,8 @@ static void room_109_parser() {
 		return;
 	}
 
-	if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE)) && (_action.isTarget(NOUN_SMALL_HOLE) || _action.isTarget(NOUN_TUNNEL))) {
-		if (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER)) {
+	if ((_action.isAction(words_throw) || _action.isAction(words_give)) && (_action.isTarget(words_small_hole) || _action.isTarget(words_tunnel))) {
+		if (_action.isObject(words_dead_fish) || _action.isObject(words_stuffed_fish) || _action.isObject(words_burger)) {
 			local._throwingObjectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 			if (local._throwingObjectId >= 0) {
 				if ((_game._objects.isInInventory(local._throwingObjectId) && _globals[kHoovicAlive]) || local._rexThrowingObject) {
@@ -311,11 +311,11 @@ static void room_109_parser() {
 							_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
 							_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
 							_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
-							int idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(256, 57, 256 + 12, 57 + 31));
+							int idx = _scene->_dynamicHotspots.add(words_dead_purple_monster, words_swim_to, -1, Common::Rect(256, 57, 256 + 12, 57 + 31));
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-							idx = _scene->_dynamicHotspots.add(NOUN_DEAD_PURPLE_MONSTER, VERB_SWIM_TO, -1, Common::Rect(242, 79, 242 + 24, 79 + 12));
+							idx = _scene->_dynamicHotspots.add(words_dead_purple_monster, words_swim_to, -1, Common::Rect(242, 79, 242 + 24, 79 + 12));
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
-							idx = _scene->_dynamicHotspots.add(NOUN_MONSTER_SLUDGE, VERB_SWIM_TO, -1, Common::Rect(231, 88, 231 + 23, 88 + 7));
+							idx = _scene->_dynamicHotspots.add(words_monster_sludge, words_swim_to, -1, Common::Rect(231, 88, 231 + 23, 88 + 7));
 							_scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
 							_scene->changeVariant(1);
 						} else {
@@ -363,7 +363,7 @@ static void room_109_parser() {
 						_game._objects.setRoom(OBJ_BURGER, _scene->_currentSceneId);
 						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 30, 30);
-						int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(words_burger, words_swim_to, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 						_scene->_sequences.addTimer(65, 6);
 					}
@@ -374,7 +374,7 @@ static void room_109_parser() {
 						_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 						_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 46);
-						int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(words_burger, words_swim_to, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 7);
 					}
@@ -384,7 +384,7 @@ static void room_109_parser() {
 					{
 						_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 						_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
-						int idx = _scene->_dynamicHotspots.add(NOUN_BURGER, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(words_burger, words_swim_to, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
 						_vm->_dialogs->show(10915);
 					}
@@ -407,33 +407,33 @@ static void room_109_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_BURGER) && _game._objects.isInRoom(OBJ_BURGER)) {
+	if (_action.isAction(words_take, words_burger) && _game._objects.isInRoom(OBJ_BURGER)) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_game._objects.addToInventory(OBJ_BURGER);
-	} else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+	} else if (_action.isAction(words_look, words_ocean_floor))
 		_vm->_dialogs->show(10901);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORAL))
+	else if (_action.isAction(words_look, words_coral))
 		_vm->_dialogs->show(10902);
-	else if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_CORAL))
+	else if ((_action.isAction(words_take) || _action.isAction(words_pull)) && _action.isObject(words_coral))
 		_vm->_dialogs->show(10903);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(10904);
-	else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+	else if (_action.isAction(words_take, words_rocks))
 		_vm->_dialogs->show(10905);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_WALL))
+	else if (_action.isAction(words_look, words_cave_wall))
 		_vm->_dialogs->show(10906);
-	else if (_action.isAction(VERB_LOOK, NOUN_TUNNEL)) {
+	else if (_action.isAction(words_look, words_tunnel)) {
 		if (_globals[kHoovicAlive])
 			_vm->_dialogs->show(10907);
 		else
 			_vm->_dialogs->show(10913);
-	} else if (_action.isAction(VERB_LOOK, NOUN_SMALL_HOLE))
+	} else if (_action.isAction(words_look, words_small_hole))
 		_vm->_dialogs->show(10908);
-	else if (_action.isAction(VERB_LOOK, NOUN_OVERHANG_TO_WEST))
+	else if (_action.isAction(words_look, words_overhang_to_west))
 		_vm->_dialogs->show(10911);
-	else if (_action.isAction(VERB_PUT, NOUN_SMALL_HOLE))
+	else if (_action.isAction(words_put, words_small_hole))
 		_vm->_dialogs->show(10910);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_PURPLE_MONSTER))
+	else if (_action.isAction(words_look, words_dead_purple_monster))
 		_vm->_dialogs->show(10914);
 	else
 		return;
@@ -462,8 +462,8 @@ void room_109_preload() {
 		himem_preload_series(kernel_full_name(109, 'H', count, nullptr, 0), 3);
 	}
 
-	_scene->addActiveVocab(NOUN_DEAD_PURPLE_MONSTER);
-	_scene->addActiveVocab(NOUN_MONSTER_SLUDGE);
+	_scene->addActiveVocab(words_dead_purple_monster);
+	_scene->addActiveVocab(words_monster_sludge);
 
 	section_1_walker();
 	section_1_interface();
diff --git a/engines/mads/madsv2/nebular/rooms/room110.cpp b/engines/mads/madsv2/nebular/rooms/room110.cpp
index a1b72439af8..b43337ef0e9 100644
--- a/engines/mads/madsv2/nebular/rooms/room110.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room110.cpp
@@ -58,13 +58,13 @@ static void room_110_init() {
 
 		local._crabsFl = true;
 
-		int idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(194, 23);
@@ -89,7 +89,7 @@ static void room_110_daemon() {
 }
 
 static void room_110_pre_parser() {
-	if (_action.isAction(VERB_SWIM_THROUGH, NOUN_CAVE_ENTRANCE))
+	if (_action.isAction(words_swim_through, words_cave_entrance))
 		_game._player._walkOffScreenSceneId = 109;
 
 	if (local._crabsFl) {
@@ -105,19 +105,19 @@ static void room_110_pre_parser() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 16, 1, 0, 0);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 16, 1, 0, 0);
 
-		int idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
-		idx = _scene->_dynamicHotspots.add(NOUN_CRAB, VERB_SWIM_TO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_crab, words_swim_to, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
 	}
 }
 
 static void room_110_parser() {
-	if (_action.isAction(VERB_SWIM_THROUGH, NOUN_TUNNEL)) {
+	if (_action.isAction(words_swim_through, words_tunnel)) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(Resources::formatName(110, 'T', 0, EXT_AA, ""), 1);
@@ -133,21 +133,21 @@ static void room_110_parser() {
 		default:
 			break;
 		}
-	} else if ((_action._lookFlag) || _action.isAction(VERB_LOOK, NOUN_CAVE))
+	} else if ((_action._lookFlag) || _action.isAction(words_look, words_cave))
 		_vm->_dialogs->show(11001);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_CEILING) || _action.isAction(VERB_LOOK_AT, NOUN_CAVE_CEILING))
+	else if (_action.isAction(words_look, words_cave_ceiling) || _action.isAction(words_look_at, words_cave_ceiling))
 		_vm->_dialogs->show(11002);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(11003);
-	else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+	else if (_action.isAction(words_take, words_rocks))
 		_vm->_dialogs->show(11004);
-	else if (_action.isAction(VERB_LOOK, NOUN_TUNNEL))
+	else if (_action.isAction(words_look, words_tunnel))
 		_vm->_dialogs->show(11005);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+	else if (_action.isAction(words_look, words_cave_entrance))
 		_vm->_dialogs->show(11006);
-	else if (_action.isAction(VERB_LOOK, NOUN_FUNGOIDS))
+	else if (_action.isAction(words_look, words_fungoids))
 		_vm->_dialogs->show(11007);
-	else if (_action.isAction(VERB_TAKE, NOUN_FUNGOIDS))
+	else if (_action.isAction(words_take, words_fungoids))
 		_vm->_dialogs->show(11008);
 	else
 		return;
@@ -167,7 +167,7 @@ void room_110_preload() {
 
 	section_1_walker();
 	section_1_interface();
-	_scene->addActiveVocab(NOUN_CRAB);
+	_scene->addActiveVocab(words_crab);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room111.cpp b/engines/mads/madsv2/nebular/rooms/room111.cpp
index 651919fd710..68d47344a77 100644
--- a/engines/mads/madsv2/nebular/rooms/room111.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room111.cpp
@@ -62,11 +62,11 @@ static void room_111_init() {
 	_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
 	_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
 
-	int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(words_bats, words_look_at, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
-	idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+	idx = _scene->_dynamicHotspots.add(words_bats, words_look_at, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
-	idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+	idx = _scene->_dynamicHotspots.add(words_bats, words_look_at, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 
 	local._launch1Fl = false;
@@ -117,14 +117,14 @@ static void room_111_daemon() {
 		_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
 		local._launch1Fl = true;
-		int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_bats, words_look_at, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 	}
 
 	if (!local._launched2Fl && (_vm->getRandomNumber(1, 30000) == 1)) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 0, 0);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_bats, words_look_at, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 		local._launched2Fl = true;
 	}
@@ -139,12 +139,12 @@ static void room_111_daemon() {
 }
 
 static void room_111_pre_parser() {
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
+	if (_action.isAction(words_walk_through, words_cave_entrance))
 		_game._player._walkOffScreenSceneId = 212;
 }
 
 static void room_111_parser() {
-	if (_action.isAction(VERB_DIVE_INTO, NOUN_POOL) && _game._objects.isInInventory(OBJ_REBREATHER)) {
+	if (_action.isAction(words_dive_into, words_pool) && _game._objects.isInInventory(OBJ_REBREATHER)) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(Resources::formatName(111, 'A', 1, EXT_AA, ""), 1);
@@ -160,17 +160,17 @@ static void room_111_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_CAVE_FLOOR))
+	} else if (_action.isAction(words_look, words_cave_floor))
 		_vm->_dialogs->show(11101);
-	else if (_action.isAction(VERB_LOOK, NOUN_POOL))
+	else if (_action.isAction(words_look, words_pool))
 		_vm->_dialogs->show(11102);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+	else if (_action.isAction(words_look, words_cave_entrance))
 		_vm->_dialogs->show(11103);
-	else if (_action.isAction(VERB_LOOK, NOUN_STALAGMITES))
+	else if (_action.isAction(words_look, words_stalagmites))
 		_vm->_dialogs->show(11104);
-	else if (_action.isAction(VERB_LOOK, NOUN_LARGE_STALAGMITE))
+	else if (_action.isAction(words_look, words_large_stalagmite))
 		_vm->_dialogs->show(11105);
-	else if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE)) && (_action.isObject(NOUN_STALAGMITES) || _action.isObject(NOUN_LARGE_STALAGMITE)))
+	else if ((_action.isAction(words_pull) || _action.isAction(words_take)) && (_action.isObject(words_stalagmites) || _action.isObject(words_large_stalagmite)))
 		_vm->_dialogs->show(11106);
 	else
 		return;
@@ -191,7 +191,7 @@ void room_111_preload() {
 	room_parser_code_pointer = room_111_parser;
 	room_daemon_code_pointer = room_111_daemon;
 
-	_scene->addActiveVocab(NOUN_BATS);
+	_scene->addActiveVocab(words_bats);
 	section_1_walker();
 	section_1_interface();
 }
diff --git a/engines/mads/madsv2/nebular/rooms/room201.cpp b/engines/mads/madsv2/nebular/rooms/room201.cpp
index ea6b5b2d848..235281d617a 100644
--- a/engines/mads/madsv2/nebular/rooms/room201.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room201.cpp
@@ -52,7 +52,7 @@ static void room_201_init() {
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(185, 46));
 
-	int idx = _scene->_dynamicHotspots.add(NOUN_BIRDS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(words_birds, words_look_at, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 81), FACING_NORTH);
 
 	if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId == RETURNING_FROM_LOADING)) {
@@ -114,7 +114,7 @@ static void room_201_init() {
 		local._pterodactylFlag = true;
 
 	if (_globals[kTeleporterUnderstood])
-		_scene->_hotspots.activate(NOUN_STRANGE_DEVICE, false);
+		_scene->_hotspots.activate(words_strange_device, false);
 
 	section_2_music();
 }
@@ -122,7 +122,7 @@ static void room_201_init() {
 static void room_201_daemon() {
 	if (local._pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 6, 0);
-		int idx = _scene->_dynamicHotspots.add(NOUN_SWOOPING_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_swooping_creature, words_walkto, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(270, 80), FACING_EAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
 		_vm->_sound->command(14);
@@ -195,9 +195,9 @@ static void room_201_daemon() {
 
 static void room_201_parser() {
 	if (_action._lookFlag == false) {
-		if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
+		if (_action.isAction(words_walk_towards, words_field_to_south))
 			_scene->_nextSceneId = 202;
-		else if (_action.isAction(VERB_CLIMB_UP, NOUN_STEPS) || (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) || (_action.isAction(VERB_WALK_INSIDE, NOUN_STRANGE_DEVICE))) {
+		else if (_action.isAction(words_climb_up, words_steps) || (_action.isAction(words_walk_inside, words_teleporter)) || (_action.isAction(words_walk_inside, words_strange_device))) {
 			if (_game._trigger == 0) {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
@@ -206,30 +206,30 @@ static void room_201_parser() {
 			} else if (_game._trigger == 1) {
 				_scene->_nextSceneId = 213;
 			}
-		} else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+		} else if (_action.isAction(words_look, words_grassy_field)) {
 			_vm->_dialogs->show(20101);
-		} else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) {
+		} else if (_action.isAction(words_look, words_rocks)) {
 			_vm->_dialogs->show(20102);
-		} else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH)) {
+		} else if (_action.isAction(words_look, words_thorny_bush)) {
 			_vm->_dialogs->show(20103);
-		} else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+		} else if (_action.isAction(words_look, words_sky)) {
 			_vm->_dialogs->show(20104);
-		} else if (_action.isAction(VERB_LOOK, NOUN_WATER)) {
+		} else if (_action.isAction(words_look, words_water)) {
 			_vm->_dialogs->show(20105);
-		} else if (_action.isAction(VERB_LOOK, NOUN_ISLAND_IN_DISTANCE)) {
+		} else if (_action.isAction(words_look, words_island_in_distance)) {
 			_vm->_dialogs->show(20106);
-		} else if (_action.isAction(VERB_LOOK, NOUN_WEATHER_STATION)) {
+		} else if (_action.isAction(words_look, words_weather_station)) {
 			_vm->_dialogs->show(20107);
-		} else if (_action.isAction(VERB_LOOK, NOUN_PATH)) {
+		} else if (_action.isAction(words_look, words_path)) {
 			_vm->_dialogs->show(20108);
-		} else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_SOUTH)) {
+		} else if (_action.isAction(words_look, words_field_to_south)) {
 			_vm->_dialogs->show(20110);
-		} else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+		} else if (_action.isAction(words_look, words_strange_device)) {
 			if (_globals[kMeteorologistEverSeen])
 				_vm->_dialogs->show(20112);
 			else
 				_vm->_dialogs->show(20109);
-		} else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) {
+		} else if (_action.isAction(words_look, words_teleporter)) {
 			_vm->_dialogs->show(20113);
 		} else
 			return;
@@ -251,9 +251,9 @@ void room_201_preload() {
 	section_2_walker();
 	section_2_interface();
 
-	_scene->addActiveVocab(NOUN_SWOOPING_CREATURE);
-	_scene->addActiveVocab(NOUN_BIRDS);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_swooping_creature);
+	_scene->addActiveVocab(words_birds);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index 2e1940d2357..ecd99798854 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -71,14 +71,14 @@ static void room_202_init() {
 	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
 	_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(149, 113));
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
-	int idx = _scene->_dynamicHotspots.add(NOUN_SKULL, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(words_skull, words_walkto, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(153, 97), FACING_SOUTH);
 
 	if (!(_globals[kBone202Status] & 1)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(130, 108));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
-		idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_bone, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(132, 97), FACING_SOUTH);
 	}
 
@@ -86,7 +86,7 @@ static void room_202_init() {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 0, 0, 0);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(166, 110));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
-		idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_bone, words_walkto, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(165, 99), FACING_SOUTH);
 	}
 
@@ -104,8 +104,8 @@ static void room_202_init() {
 	if (_globals[kLadderBroken]) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
-		_scene->_hotspots.activate(NOUN_LADDER, false);
-		idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_hotspots.activate(words_ladder, false);
+		idx = _scene->_dynamicHotspots.add(words_broken_ladder, words_walkto, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH);
 	}
 
@@ -253,9 +253,9 @@ static void room_202_daemon() {
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
 
 			if (_globals[kMeteorologistWatch] == METEOROLOGIST_GROUND) {
-				_action._activeAction._verbId = VERB_LOOK;
-				_action._activeAction._objectNameId = NOUN_BINOCULARS;
-				_action._activeAction._indirectObjectId = NOUN_STRANGE_DEVICE;
+				_action._activeAction._verbId = words_look;
+				_action._activeAction._objectNameId = words_binoculars;
+				_action._activeAction._indirectObjectId = words_strange_device;
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_PARSER;
 				_scene->_sequences.addTimer(2 * 60, 2);
 				local._meteorologistSpecial = true;
@@ -297,8 +297,8 @@ static void room_202_daemon() {
 	{
 		_globals[kLadderBroken] = false;
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
-		_scene->_hotspots.activate(NOUN_LADDER, false);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_hotspots.activate(words_ladder, false);
+		int idx = _scene->_dynamicHotspots.add(words_broken_ladder, words_walkto, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[11], _globals._sequenceIndexes[5]);
 		_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[11]);
@@ -424,7 +424,7 @@ static void room_202_pre_parser() {
 	if (gplayer._needToWalk)
 		_scene->_kernelMessages.reset();
 
-	if (local._ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || gplayer._needToWalk)) {
+	if (local._ladderTopFl && (_action.isAction(words_climb_down, words_ladder) || gplayer._needToWalk)) {
 		if (_game._trigger == 0) {
 			_vm->_sound->command(29);
 			gplayer._readyToWalk = false;
@@ -443,7 +443,7 @@ static void room_202_pre_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && (_action._activeAction._indirectObjectId > 0)) {
+	if (_action.isAction(words_look, words_binoculars) && (_action._activeAction._indirectObjectId > 0)) {
 		if (!gplayer._readyToWalk || local._ladderTopFl)
 			gplayer._needToWalk = false;
 		else
@@ -460,12 +460,12 @@ static void room_202_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER)) {
+	if (_action.isAction(words_climb_down, words_ladder)) {
 		_action._inProgress = false;
 		return;
-	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+	} else if (_action.isAction(words_walk_towards, words_field_to_south)) {
 		_scene->_nextSceneId = 203;
-	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
+	} else if (_action.isAction(words_walk_towards, words_field_to_north)) {
 		if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) {
 			if (_scene->_animation[0])
 				_globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT;
@@ -473,7 +473,7 @@ static void room_202_parser() {
 				_globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT;
 		}
 		_scene->_nextSceneId = 201;
-	} else if (_action.isAction(VERB_TAKE, NOUN_BONE) && (_action._savedFields._mainObjectSource == 4)) {
+	} else if (_action.isAction(words_take, words_bone) && (_action._savedFields._mainObjectSource == 4)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._objects.isInInventory(OBJ_BONES)) {
@@ -514,7 +514,7 @@ static void room_202_parser() {
 		}
 
 		_action._inProgress = false;
-	} else if (_action.isAction(VERB_CLIMB_UP, NOUN_LADDER) && !_globals[kLadderBroken]) {
+	} else if (_action.isAction(words_climb_up, words_ladder) && !_globals[kLadderBroken]) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(29);
@@ -522,7 +522,7 @@ static void room_202_parser() {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
 
-			local._ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, VERB_CLIMB_DOWN, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
+			local._ladderHotspotId = _scene->_dynamicHotspots.add(words_ladder, words_climb_down, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
 			_scene->_dynamicHotspots.setPosition(local._ladderHotspotId, Common::Point(246, 124), FACING_NORTH);
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
@@ -544,7 +544,7 @@ static void room_202_parser() {
 			_action._inProgress = false;
 			return;
 		}
-	} else if ((_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_FIELD_TO_NORTH) || (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_STRANGE_DEVICE))) && (_globals[kSexOfRex] == SEX_MALE)) {
+	} else if ((_action.isAction(words_look, words_binoculars, words_field_to_north) || (_action.isAction(words_look, words_binoculars, words_strange_device))) && (_globals[kSexOfRex] == SEX_MALE)) {
 		if (!local._ladderTopFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -644,43 +644,43 @@ static void room_202_parser() {
 				return;
 			}
 		}
-	} else if (_action.isAction(VERB_WALK_INSIDE, NOUN_HUT)) {
+	} else if (_action.isAction(words_walk_inside, words_hut)) {
 		setRandomKernelMessage();
-	} else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) {
+	} else if (_action.isAction(words_look, words_rocks)) {
 		_vm->_dialogs->show(20202);
-	} else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT)) {
+	} else if (_action.isAction(words_look, words_fire_pit)) {
 		_vm->_dialogs->show(20203);
-	} else if (_action.isAction(VERB_LOOK, NOUN_GRASS)) {
+	} else if (_action.isAction(words_look, words_grass)) {
 		_vm->_dialogs->show(20204);
-	} else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) {
+	} else if (_action.isAction(words_look, words_field_to_north)) {
 		if ((_globals[kMeteorologistStatus] == METEOROLOGIST_ABSENT) || (_globals[kMeteorologistStatus] == METEOROLOGIST_GONE))
 			_vm->_dialogs->show(20205);
 		else if (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT)
 			_vm->_dialogs->show(20220);
-	} else if (_action.isAction(VERB_LOOK, NOUN_WATCH_TOWER)) {
+	} else if (_action.isAction(words_look, words_watch_tower)) {
 		_vm->_dialogs->show(20206);
-	} else if (_action.isAction(VERB_LOOK, NOUN_TALL_GRASS)) {
+	} else if (_action.isAction(words_look, words_tall_grass)) {
 		_vm->_dialogs->show(20207);
-	} else if (_action.isAction(VERB_LOOK, NOUN_TREES)) {
+	} else if (_action.isAction(words_look, words_trees)) {
 		_vm->_dialogs->show(20208);
-	} else if (_action.isAction(VERB_LOOK, NOUN_TREE)) {
+	} else if (_action.isAction(words_look, words_tree)) {
 		_vm->_dialogs->show(20209);
-	} else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+	} else if (_action.isAction(words_look, words_sky)) {
 		_vm->_dialogs->show(20210);
-	} else if (_action.isAction(VERB_LOOK, NOUN_HUT)) {
+	} else if (_action.isAction(words_look, words_hut)) {
 		if ((_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH))
 			_vm->_dialogs->show(20212);
 		else
 			_vm->_dialogs->show(20211);
-	} else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+	} else if (_action.isAction(words_look, words_strange_device)) {
 		_vm->_dialogs->show(20213);
-	} else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_IN_DISTANCE)) {
+	} else if (_action.isAction(words_look, words_ocean_in_distance)) {
 		_vm->_dialogs->show(20214);
-	} else if (_action.isAction(VERB_LOOK, NOUN_SKULL)) {
+	} else if (_action.isAction(words_look, words_skull)) {
 		_vm->_dialogs->show(20215);
-	} else if (_action.isAction(VERB_TAKE, NOUN_SKULL)) {
+	} else if (_action.isAction(words_take, words_skull)) {
 		_vm->_dialogs->show(20216);
-	} else if (_action.isAction(VERB_LOOK, NOUN_BONES) && _action._commandSource == 4) {
+	} else if (_action.isAction(words_look, words_bones) && _action._commandSource == 4) {
 		_vm->_dialogs->show(20217);
 	} else {
 		return;
@@ -717,12 +717,12 @@ void room_202_preload() {
 	section_2_walker();
 	section_2_interface();
 
-	_scene->addActiveVocab(NOUN_LADDER);
-	_scene->addActiveVocab(VERB_CLIMB_DOWN);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_BONE);
-	_scene->addActiveVocab(NOUN_SKULL);
-	_scene->addActiveVocab(NOUN_BROKEN_LADDER);
+	_scene->addActiveVocab(words_ladder);
+	_scene->addActiveVocab(words_climb_down);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_bone);
+	_scene->addActiveVocab(words_skull);
+	_scene->addActiveVocab(words_broken_ladder);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room203.cpp b/engines/mads/madsv2/nebular/rooms/room203.cpp
index 65cf1810dbc..04ff6257dfd 100644
--- a/engines/mads/madsv2/nebular/rooms/room203.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room203.cpp
@@ -58,7 +58,7 @@ static void room_203_init() {
 	if ((_globals[kRhotundaStatus] == 0) && (!_scene->_roomChanged)) {
 		local._rhotundaEatFl = true;
 		_game._player.walk(Common::Point(158, 135), FACING_SOUTH);
-		int idx = _scene->_dynamicHotspots.add(NOUN_FIELD_TO_SOUTH, VERB_WALK_TOWARDS, 0, Common::Rect(0, 0, 320, 156));
+		int idx = _scene->_dynamicHotspots.add(words_field_to_south, words_walk_towards, 0, Common::Rect(0, 0, 320, 156));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(155, 152), FACING_SOUTH);
 		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
 	}
@@ -67,7 +67,7 @@ static void room_203_init() {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', -1));
 		if (_vm->getRandomNumber(1, 3) == 2) {
 			_globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 9, 1, 0, 0);
-			int idx = _scene->_dynamicHotspots.add(NOUN_YELLOW_BIRD, VERB_LOOK_AT, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(words_yellow_bird, words_look_at, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
 			_vm->_sound->command(14);
 		}
@@ -109,34 +109,34 @@ static void room_203_daemon() {
 }
 
 static void room_203_pre_parser() {
-	if (local._rhotundaEatFl && !_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+	if (local._rhotundaEatFl && !_action.isAction(words_walk_towards, words_field_to_south)) {
 		_game._player.walk(Common::Point(158, 136), FACING_SOUTH);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_WALKTO, NOUN_OPEN_AREA_TO_EAST))
+	if (_action.isAction(words_walkto, words_open_area_to_east))
 		_game._player._walkOffScreenSceneId = 209;
 }
 
 static void room_203_parser() {
 	if (_action._savedFields._lookFlag) {
 		_vm->_dialogs->show(20307);
-	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+	} else if (_action.isAction(words_walk_towards, words_field_to_south)) {
 		_scene->_nextSceneId = 208;
-	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
+	} else if (_action.isAction(words_walk_towards, words_field_to_north)) {
 		_scene->_nextSceneId = 202;
-	} else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+	} else if (_action.isAction(words_look, words_sky)) {
 		_vm->_dialogs->show(20301);
-	} else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE)) {
+	} else if (_action.isAction(words_look, words_cliff_face)) {
 		_vm->_dialogs->show(20302);
-	} else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+	} else if (_action.isAction(words_look, words_palm_tree)) {
 		_vm->_dialogs->show(20303);
-	} else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) {
+	} else if (_action.isAction(words_look, words_field_to_north)) {
 		_vm->_dialogs->show(20304);
-	} else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+	} else if (_action.isAction(words_look, words_grassy_field)) {
 		_vm->_dialogs->show(20305);
-	} else if (_action.isAction(VERB_LOOK, NOUN_BOULDERS)) {
+	} else if (_action.isAction(words_look, words_boulders)) {
 		_vm->_dialogs->show(20305);
 	} else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index 2af70c33aab..f57775c39e1 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -56,11 +56,11 @@ static void room_205_init() {
 		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
 
 	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 0, 0, 3);
-	int idx = _scene->_dynamicHotspots.add(NOUN_CHICKEN, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(words_chicken, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
 
 	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
-	idx = _scene->_dynamicHotspots.add(NOUN_CHICKEN, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	idx = _scene->_dynamicHotspots.add(words_chicken, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 	_scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 0, 0, 0);
@@ -69,7 +69,7 @@ static void room_205_init() {
 
 	if (!_game._visitedScenes._sceneRevisited) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
-		idx = _scene->_dynamicHotspots.add(NOUN_PIRANHA, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		idx = _scene->_dynamicHotspots.add(words_piranha, words_walkto, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
 	}
 
@@ -135,7 +135,7 @@ static void room_205_daemon() {
 	if (_vm->_game->_scene._frameStartTime - local._lastFishTime > 1300) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(
 			_globals._spriteIndexes[6], false, 5, 1, 0, 0);
-		int idx = _scene->_dynamicHotspots.add(NOUN_PIRANHA, VERB_WALKTO, _globals._sequenceIndexes[6],
+		int idx = _scene->_dynamicHotspots.add(words_piranha, words_walkto, _globals._sequenceIndexes[6],
 			Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
 		local._lastFishTime = _vm->_game->_scene._frameStartTime;
@@ -223,9 +223,9 @@ static void room_205_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(20502);
-	else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_OPPOSITE_BANK))
+	else if (_action.isAction(words_look, words_binoculars, words_opposite_bank))
 		_vm->_dialogs->show(20518);
-	else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN)) {
+	else if (_action.isAction(words_talkto, words_native_woman)) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(0x73));
@@ -236,14 +236,14 @@ static void room_205_parser() {
 			local._dialog1.write(0x75, true);
 			local._dialog1.start();
 		}
-	} else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	} else if (_action.isAction(words_give, words_native_woman) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			int rndVal = _vm->getRandomNumber(0xAC, 0xAE);
 			_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 1, 120, _game.getQuote(rndVal));
 		} else if (_game._trigger == 1)
 			_game._player._stepEnabled = true;
-	} else if (_action.isAction(VERB_WALKTO, NOUN_OPPOSITE_BANK)) {
+	} else if (_action.isAction(words_walkto, words_opposite_bank)) {
 		if (_game._trigger == 0) {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
@@ -264,50 +264,50 @@ static void room_205_parser() {
 			_scene->_reloadSceneFlag = true;
 		}
 	} else {
-		if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_SOUTH))
+		if (_action.isAction(words_walk_down, words_path_to_south))
 			_scene->_nextSceneId = 210;
 
-		if (_action.isAction(VERB_WALKTO, NOUN_FIRE_PIT) || _action.isAction(VERB_WALKTO, NOUN_CHICKEN_ON_SPIT)) {
+		if (_action.isAction(words_walkto, words_fire_pit) || _action.isAction(words_walkto, words_chicken_on_spit)) {
 			if (_game._objects.isInRoom(OBJ_CHICKEN)) {
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x6B));
 			}
-		} else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) {
+		} else if (_action.isAction(words_take, words_chicken_on_spit) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) {
 			_game._objects.addToInventory(OBJ_CHICKEN);
 			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
-			_scene->_hotspots.activate(NOUN_CHICKEN_ON_SPIT, false);
+			_scene->_hotspots.activate(words_chicken_on_spit, false);
 			_vm->_dialogs->showItem(OBJ_CHICKEN, 812);
-		} else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && (!_globals[kChickenPermitted]))
+		} else if (_action.isAction(words_take, words_chicken_on_spit) && (!_globals[kChickenPermitted]))
 			_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 0, 120, _game.getQuote(0x80));
-		else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN))
+		else if (_action.isAction(words_look, words_native_woman))
 			_vm->_dialogs->show(20503);
-		else if (_action.isAction(VERB_LOOK, NOUN_HUT))
+		else if (_action.isAction(words_look, words_hut))
 			_vm->_dialogs->show(20504);
-		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT))
+		else if (_action.isAction(words_look, words_chicken) && (_action._mainObjectSource == CAT_HOTSPOT))
 			_vm->_dialogs->show(20505);
-		else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT))
+		else if (_action.isAction(words_take, words_chicken) && (_action._mainObjectSource == CAT_HOTSPOT))
 			_vm->_dialogs->show(20506);
-		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN_ON_SPIT))
+		else if (_action.isAction(words_look, words_chicken_on_spit))
 			_vm->_dialogs->show(20507);
-		else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT))
+		else if (_action.isAction(words_look, words_fire_pit))
 			_vm->_dialogs->show(20508);
-		else if (_action.isAction(VERB_TAKE, NOUN_FIRE_PIT))
+		else if (_action.isAction(words_take, words_fire_pit))
 			_vm->_dialogs->show(20509);
-		else if (_action.isAction(VERB_LOOK, NOUN_STREAM))
+		else if (_action.isAction(words_look, words_stream))
 			_vm->_dialogs->show(20510);
-		else if (_action.isAction(VERB_LOOK, NOUN_OPPOSITE_BANK))
+		else if (_action.isAction(words_look, words_opposite_bank))
 			_vm->_dialogs->show(20511);
 		else if (_game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))
-			&& (_action.isAction(VERB_GIVE, NOUN_STREAM) || _action.isAction(VERB_THROW, NOUN_STREAM)
-				|| _action.isAction(VERB_GIVE, NOUN_PIRANHA) || _action.isAction(VERB_THROW, NOUN_PIRANHA)))
+			&& (_action.isAction(words_give, words_stream) || _action.isAction(words_throw, words_stream)
+				|| _action.isAction(words_give, words_piranha) || _action.isAction(words_throw, words_piranha)))
 			_vm->_dialogs->show(20512);
-		else if (_action.isAction(VERB_LOOK, NOUN_PIRANHA))
+		else if (_action.isAction(words_look, words_piranha))
 			_vm->_dialogs->show(20513);
-		else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT_BUSH))
+		else if (_action.isAction(words_look, words_twinkifruit_bush))
 			_vm->_dialogs->show(20514);
-		else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT_BUSH))
+		else if (_action.isAction(words_take, words_twinkifruit_bush))
 			_vm->_dialogs->show(20515);
-		else if (_action.isAction(VERB_TAKE, NOUN_NATIVE_WOMAN))
+		else if (_action.isAction(words_take, words_native_woman))
 			_vm->_dialogs->show(20517);
 		else
 			return;
@@ -333,9 +333,9 @@ void room_205_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_CHICKEN);
-	_scene->addActiveVocab(NOUN_PIRANHA);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_chicken);
+	_scene->addActiveVocab(words_piranha);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index d6c216b798f..f3d80ec0780 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -72,14 +72,14 @@ static void room_207_init() {
 
 	if (local._vultureFl) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 30, 0, 0, 400);
-		local._vultureHotspotId = _scene->_dynamicHotspots.add(NOUN_VULTURE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		local._vultureHotspotId = _scene->_dynamicHotspots.add(words_vulture, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._vultureHotspotId, Common::Point(254, 94), FACING_WEST);
 	}
 
 	if (local._spiderFl) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -1);
-		local._spiderHotspotId = _scene->_dynamicHotspots.add(NOUN_SPIDER, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		local._spiderHotspotId = _scene->_dynamicHotspots.add(words_spider, words_walkto, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._spiderHotspotId, Common::Point(59, 132), FACING_SOUTH);
 	}
 
@@ -153,16 +153,16 @@ static void room_207_daemon() {
 }
 
 static void room_207_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
+	if (_action.isAction(words_walk_down, words_path_to_west))
 		_game._player._walkOffScreenSceneId = 211;
 
-	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_FIELD_TO_EAST))
+	if (_action.isAction(words_walk_towards, words_open_field_to_east))
 		_game._player._walkOffScreenSceneId = 208;
 
-	if (_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) {
-		if (_action.isObject(NOUN_VULTURE)) {
+	if (_action.isAction(words_walkto) || _action.isAction(words_look)) {
+		if (_action.isObject(words_vulture)) {
 			local._vultureTime = -9999;
-		} else if (_action.isObject(NOUN_SPIDER)) {
+		} else if (_action.isObject(words_spider)) {
 			local._spiderTime = -9999;
 		}
 	}
@@ -171,7 +171,7 @@ static void room_207_pre_parser() {
 static void room_207_parser() {
 	if (_action._savedFields._lookFlag)
 		_vm->_dialogs->show(20711);
-	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+	else if (_action.isAction(words_walk_through, words_doorway))
 		_scene->_nextSceneId = 214;
 	else {
 		if ((_game._player._playerPos.x > 150) && (_game._player._playerPos.x < 189) &&
@@ -189,33 +189,33 @@ static void room_207_parser() {
 			local._eyeFl = false;
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_DENSE_FOREST))
+		if (_action.isAction(words_look, words_dense_forest))
 			_vm->_dialogs->show(20701);
-		else if (_action.isAction(VERB_LOOK, NOUN_HEDGE))
+		else if (_action.isAction(words_look, words_hedge))
 			_vm->_dialogs->show(20702);
-		else if (_action.isAction(VERB_LOOK, NOUN_SKULL_AND_CROSSBONES))
+		else if (_action.isAction(words_look, words_skull_and_crossbones))
 			_vm->_dialogs->show(20703);
-		else if (_action.isAction(VERB_LOOK, NOUN_CAULDRON))
+		else if (_action.isAction(words_look, words_cauldron))
 			_vm->_dialogs->show(20704);
-		else if (_action.isAction(VERB_LOOK, NOUN_WITCHDOCTOR_HUT))
+		else if (_action.isAction(words_look, words_witchdoctor_hut))
 			_vm->_dialogs->show(20705);
-		else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST))
+		else if (_action.isAction(words_look, words_path_to_west))
 			_vm->_dialogs->show(20706);
-		else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS))
+		else if (_action.isAction(words_look, words_mountains))
 			_vm->_dialogs->show(20707);
-		else if (_action.isAction(VERB_LOOK, NOUN_ALOE_PLANT))
+		else if (_action.isAction(words_look, words_aloe_plant))
 			_vm->_dialogs->show(20708);
-		else if (_action.isAction(VERB_LOOK, NOUN_LAWN))
+		else if (_action.isAction(words_look, words_lawn))
 			_vm->_dialogs->show(20709);
-		else if (_action.isAction(VERB_LOOK, NOUN_VULTURE))
+		else if (_action.isAction(words_look, words_vulture))
 			_vm->_dialogs->show(20710);
-		else if (_action.isAction(VERB_TAKE, NOUN_SKULL_AND_CROSSBONES))
+		else if (_action.isAction(words_take, words_skull_and_crossbones))
 			_vm->_dialogs->show(20712);
-		else if (_action.isAction(VERB_TAKE, NOUN_ALOE_PLANT))
+		else if (_action.isAction(words_take, words_aloe_plant))
 			_vm->_dialogs->show(20713);
-		else if (_action.isAction(VERB_LOOK, NOUN_SPIDER))
+		else if (_action.isAction(words_look, words_spider))
 			_vm->_dialogs->show(20714);
-		else if (_action.isAction(VERB_TAKE, NOUN_SPIDER))
+		else if (_action.isAction(words_take, words_spider))
 			_vm->_dialogs->show(20715);
 		else
 			return;
@@ -244,10 +244,10 @@ void room_207_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_VULTURE);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_SPIDER);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_vulture);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_spider);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
index de4fc79f136..07cd5591243 100644
--- a/engines/mads/madsv2/nebular/rooms/room208.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -45,7 +45,7 @@ static void updateTrap() {
 	if (_globals[kRhotundaStatus] == 1) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 24);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
-		int idx = _scene->_dynamicHotspots.add(NOUN_HUGE_LEGS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_huge_legs, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH);
 		_scene->_hotspots.activate(414, false);
 		return;
@@ -56,7 +56,7 @@ static void updateTrap() {
 	{
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 15);
-		int idx = _scene->_dynamicHotspots.add(NOUN_PILE_OF_LEAVES, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_pile_of_leaves, words_walkto, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(60, 152), FACING_NORTH);
 	}
 	break;
@@ -64,8 +64,8 @@ static void updateTrap() {
 	{
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
-		_scene->_hotspots.activate(NOUN_DEEP_PIT, false);
-		int idx = _scene->_dynamicHotspots.add(NOUN_LEAF_COVERED_PIT, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_hotspots.activate(words_deep_pit, false);
+		int idx = _scene->_dynamicHotspots.add(words_leaf_covered_pit, words_walkto, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH);
 		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
 	}
@@ -157,13 +157,13 @@ static void room_208_daemon() {
 static void room_208_pre_parser() {
 	auto &gplayer = _vm->_game->_player;
 
-	if (_action.isAction(VERB_LOOK) && gplayer._readyToWalk)
+	if (_action.isAction(words_look) && gplayer._readyToWalk)
 		gplayer._needToWalk = true;
 
-	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_GRASSLAND_TO_EAST))
+	if (_action.isAction(words_walk_towards, words_grassland_to_east))
 		gplayer._walkOffScreenSceneId = 209;
 
-	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
+	if (_action.isAction(words_walk_towards, words_open_area_to_west))
 		gplayer._walkOffScreenSceneId = 207;
 }
 
@@ -253,7 +253,7 @@ static void subAction(int mode) {
 }
 
 static void room_208_parser() {
-	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LOWLANDS_TO_NORTH)) {
+	if (_action.isAction(words_walk_towards, words_lowlands_to_north)) {
 		if (_globals[kRhotundaStatus])
 			_scene->_nextSceneId = 203;
 		else if (_game._trigger == 0) {
@@ -262,59 +262,59 @@ static void room_208_parser() {
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
 		} else if (_game._trigger == 1)
 			_scene->_nextSceneId = 203;
-	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
+	} else if (_action.isAction(words_walk_towards, words_field_to_south))
 		_scene->_nextSceneId = 212;
-	else if (_action.isAction(VERB_TAKE, NOUN_PILE_OF_LEAVES) && (!_globals[kLeavesStatus] || _game._trigger)) {
+	else if (_action.isAction(words_take, words_pile_of_leaves) && (!_globals[kLeavesStatus] || _game._trigger)) {
 		subAction(1);
 		if (_game._player._stepEnabled)
 			_vm->_dialogs->showItem(OBJ_BIG_LEAVES, 0x326, 0);
-	} else if (_action.isAction(VERB_PUT, NOUN_BIG_LEAVES, NOUN_DEEP_PIT) && (_globals[kLeavesStatus] == 1 || _game._trigger))
+	} else if (_action.isAction(words_put, words_big_leaves, words_deep_pit) && (_globals[kLeavesStatus] == 1 || _game._trigger))
 		subAction(2);
-	else if (_action.isAction(VERB_PUT, NOUN_TWINKIFRUIT, NOUN_LEAF_COVERED_PIT)) {
+	else if (_action.isAction(words_put, words_twinkifruit, words_leaf_covered_pit)) {
 		subAction(3);
 		if (_game._player._stepEnabled) {
 			_game._player._stepEnabled = false;
 			local._rhotundaTurnFl = true;
 			_game._player.walk(Common::Point(20, 148), FACING_EAST);
 		}
-	} else if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_LEAF_COVERED_PIT)) {
+	} else if (_action.isAction(words_put, words_burger, words_leaf_covered_pit)) {
 		subAction(4);
 		if (_game._player._stepEnabled)
 			_vm->_dialogs->show(20812);
-	} else if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_LEAF_COVERED_PIT)) {
+	} else if (_action.isAction(words_put, words_dead_fish, words_leaf_covered_pit)) {
 		subAction(5);
 		if (_game._player._stepEnabled)
 			_vm->_dialogs->show(20812);
-	} else if (_action.isAction(VERB_LOOK, NOUN_CUMULOUS_CLOUD))
+	} else if (_action.isAction(words_look, words_cumulous_cloud))
 		_vm->_dialogs->show(20801);
-	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_WEST))
+	else if (_action.isAction(words_look, words_open_area_to_west))
 		_vm->_dialogs->show(20802);
-	else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH))
+	else if (_action.isAction(words_look, words_thorny_bush))
 		_vm->_dialogs->show(20803);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(20804);
-	else if (_action.isAction(VERB_LOOK, NOUN_SMALL_CACTUS))
+	else if (_action.isAction(words_look, words_small_cactus))
 		_vm->_dialogs->show(20805);
-	else if (_action.isAction(VERB_TAKE, NOUN_SMALL_CACTUS))
+	else if (_action.isAction(words_take, words_small_cactus))
 		_vm->_dialogs->show(20806);
-	else if (_action.isAction(VERB_LOOK, NOUN_GRASSLAND_TO_EAST))
+	else if (_action.isAction(words_look, words_grassland_to_east))
 		_vm->_dialogs->show(20807);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEEP_PIT))
+	else if (_action.isAction(words_look, words_deep_pit))
 		_vm->_dialogs->show(20808);
-	else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_LEAVES))
+	else if (_action.isAction(words_look, words_pile_of_leaves))
 		_vm->_dialogs->show(20809);
-	else if (_action.isAction(VERB_LOOK, NOUN_LEAF_COVERED_PIT)) {
+	else if (_action.isAction(words_look, words_leaf_covered_pit)) {
 		if (_game._difficulty == DIFFICULTY_EASY)
 			_vm->_dialogs->show(20810);
 		else
 			_vm->_dialogs->show(20811);
-	} else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
+	} else if (_action.isAction(words_look, words_tree) || _action.isAction(words_look, words_trees))
 		_vm->_dialogs->show(20813);
-	else if (_action.isAction(VERB_TAKE, NOUN_LEAF_COVERED_PIT))
+	else if (_action.isAction(words_take, words_leaf_covered_pit))
 		_vm->_dialogs->show(20814);
-	else if (_action.isAction(VERB_LOOK, NOUN_HUGE_LEGS))
+	else if (_action.isAction(words_look, words_huge_legs))
 		_vm->_dialogs->show(20815);
-	else if (_action.isAction(VERB_TAKE, NOUN_HUGE_LEGS) || _action.isAction(VERB_PULL, NOUN_HUGE_LEGS))
+	else if (_action.isAction(words_take, words_huge_legs) || _action.isAction(words_pull, words_huge_legs))
 		_vm->_dialogs->show(20816);
 	else if (_action._savedFields._lookFlag && (_globals[kRhotundaStatus] == 1))
 		_vm->_dialogs->show(20819);
@@ -342,10 +342,10 @@ void room_208_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_HUGE_LEGS);
-	_scene->addActiveVocab(NOUN_LEAF_COVERED_PIT);
-	_scene->addActiveVocab(NOUN_PILE_OF_LEAVES);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_huge_legs);
+	_scene->addActiveVocab(words_leaf_covered_pit);
+	_scene->addActiveVocab(words_pile_of_leaves);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index 25b13da5f70..38514a2715a 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -793,7 +793,7 @@ static void handleMonkeyFall() {
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 43, 72);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 222);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BINOCULARS, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_binoculars, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
 	}
 	break;
@@ -988,7 +988,7 @@ static void room_209_init() {
 
 	if (_game._objects.isInRoom(OBJ_PLANT_STALK)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
-		int idx = _scene->_dynamicHotspots.add(NOUN_PLANT_STALK, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_plant_stalk, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(263, 129), FACING_SOUTH);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
 	}
@@ -1005,7 +1005,7 @@ static void room_209_init() {
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BINOCULARS, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_binoculars, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
 	}
 
@@ -1328,14 +1328,14 @@ static void room_209_daemon() {
 		case 234:
 			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
 			_scene->_kernelMessages.reset();
-			if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY)) {
+			if (_action.isAction(words_hose_down, words_blowgun, words_monkey)) {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 16, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 12, 239);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235);
-			} else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY)) {
+			} else if (_action.isAction(words_shoot, words_blowgun, words_monkey)) {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
@@ -1411,19 +1411,19 @@ static void room_209_daemon() {
 }
 
 static void room_209_pre_parser() {
-	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_WEST))
+	if (_action.isAction(words_walk_towards, words_field_to_west))
 		_game._player._walkOffScreenSceneId = 208;
 
 	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
-		if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
-			&& _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+		if ((_action.isAction(words_shoot) || _action.isAction(words_hose_down)) && _action.isTarget(words_monkey)
+			&& _action.isObject(words_blowgun) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
 			_game._player._prepareWalkPos = Common::Point(111, 129);
 			_game._player._prepareWalkFacing = FACING_NORTHEAST;
 			_game._player._needToWalk = true;
 			_game._player._readyToWalk = true;
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_MONKEY) || _action.isAction(VERB_TALKTO, NOUN_MONKEY)) {
+		if (_action.isAction(words_look, words_monkey) || _action.isAction(words_talkto, words_monkey)) {
 			_game._player._prepareWalkPos = Common::Point(111, 129);
 			_game._player._prepareWalkFacing = FACING_NORTHEAST;
 			_game._player._needToWalk = true;
@@ -1439,13 +1439,13 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ROCKY_AREA_TO_NORTH)) {
+	if (_action.isAction(words_walk_towards, words_rocky_area_to_north)) {
 		_scene->_nextSceneId = 203;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_TALKTO, NOUN_MONKEY) && !local._pitchFl && !local._playingDialogFl) {
+	if (_action.isAction(words_talkto, words_monkey) && !local._pitchFl && !local._playingDialogFl) {
 		_scene->_sequences.addTimer(1, local._dialogAbortVal);
 		local._playingDialogFl = true;
 		_game._player._stepEnabled = false;
@@ -1555,9 +1555,9 @@ static void room_209_parser() {
 	}
 
 	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
-		if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
-			&& _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
-			if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY) && !local._startShootingInTimerFl) {
+		if ((_action.isAction(words_shoot) || _action.isAction(words_hose_down)) && _action.isTarget(words_monkey)
+			&& _action.isObject(words_blowgun) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+			if (_action.isAction(words_shoot, words_blowgun, words_monkey) && !local._startShootingInTimerFl) {
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(1, 231);
 				local._startShootingInTimerFl = true;
@@ -1567,7 +1567,7 @@ static void room_209_parser() {
 				return;
 			}
 
-			if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY) && !local._startShootingInTimerFl) {
+			if (_action.isAction(words_hose_down, words_blowgun, words_monkey) && !local._startShootingInTimerFl) {
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(1, 228);
 				_game._player._stepEnabled = false;
@@ -1578,7 +1578,7 @@ static void room_209_parser() {
 			}
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_MONKEY)) {
+		if (_action.isAction(words_look, words_monkey)) {
 			local._pitchFl = true;
 			_game._player._stepEnabled = false;
 			_vm->_dialogs->show(20914);
@@ -1587,7 +1587,7 @@ static void room_209_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_PLANT_STALK) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) {
+	if (_action.isAction(words_take, words_plant_stalk) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -1620,7 +1620,7 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) {
+	if (_action.isAction(words_take, words_binoculars) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._spriteIndexes[10] = _scene->_sprites.addSprites("*RXMBD_8");
@@ -1656,75 +1656,75 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+	if (_action.isAction(words_look, words_sky)) {
 		_vm->_dialogs->show(20901);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_BAMBOO_LIKE_PLANT)) {
+	if (_action.isAction(words_look, words_bamboo_like_plant)) {
 		_vm->_dialogs->show(20902);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINSIDE)) {
+	if (_action.isAction(words_look, words_mountainside)) {
 		_vm->_dialogs->show(20903);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+	if (_action.isAction(words_look, words_grassy_field)) {
 		_vm->_dialogs->show(20904);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_WEST)) {
+	if (_action.isAction(words_look, words_field_to_west)) {
 		_vm->_dialogs->show(20905);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_ROCKY_AREA_TO_NORTH)) {
+	if (_action.isAction(words_look, words_rocky_area_to_north)) {
 		_vm->_dialogs->show(20906);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_PLANT_STALK) && (_action._savedFields._mainObjectSource == 4)) {
+	if (_action.isAction(words_look, words_plant_stalk) && (_action._savedFields._mainObjectSource == 4)) {
 		_vm->_dialogs->show(20907);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_MONKEY) || _action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_MONKEY)) {
+	if (_action.isAction(words_give, words_twinkifruit, words_monkey) || _action.isAction(words_throw, words_twinkifruit, words_monkey)) {
 		_vm->_dialogs->show(20909);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_TREES)) {
+	if (_action.isAction(words_look, words_trees)) {
 		_vm->_dialogs->show(20913);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_THROW, NOUN_MONKEY) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
-		if (!_action.isObject(NOUN_POISON_DARTS)) {
+	if (_action.isAction(words_throw, words_monkey) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+		if (!_action.isObject(words_poison_darts)) {
 			_vm->_dialogs->show(20915);
 		}
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_THROW, NOUN_POISON_DARTS, NOUN_MONKEY)) {
+	if (_action.isAction(words_throw, words_poison_darts, words_monkey)) {
 		_vm->_dialogs->show(20916);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+	if (_action.isAction(words_look, words_palm_tree)) {
 		if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
 			if (local._monkeyPosition == 1)
 				_vm->_dialogs->show(20917);
@@ -1740,13 +1740,13 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_MELON_MUSH)) {
+	if (_action.isAction(words_look, words_melon_mush)) {
 		_vm->_dialogs->show(20920);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_MELON_MUSH)) {
+	if (_action.isAction(words_take, words_melon_mush)) {
 		_vm->_dialogs->show(20921);
 		_action._inProgress = false;
 		return;
@@ -1789,7 +1789,7 @@ void room_209_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_PLANT_STALK);
+	_scene->addActiveVocab(words_plant_stalk);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index 420538e0057..bbba047e646 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -631,7 +631,7 @@ static void room_210_init() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
 	} else {
-		int idx = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+		int idx = _scene->_dynamicHotspots.add(words_doorway, words_walk_through, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
 		local._doorway = _scene->_dynamicHotspots.setPosition(idx, Common::Point(168, 127), FACING_NORTH);
 		_scene->_dynamicHotspots.setCursor(local._doorway, CURSOR_GO_UP);
 	}
@@ -898,16 +898,16 @@ static void room_210_daemon() {
 static void room_210_pre_parser() {
 	local._stopWalking = false;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_EAST))
+	if (_action.isAction(words_walk_down, words_path_to_east))
 		_game._player._walkOffScreenSceneId = 211;
 }
 
 static void room_210_parser() {
-	if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_HUT_TO_NORTH)) {
+	if (_action.isAction(words_look, words_binoculars, words_hut_to_north)) {
 		_vm->_dialogs->show(21017);
 	} else if (_game._screenObjects._inputMode == kInputConversation) {
 		handleConversations();
-	} else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN) ||
+	} else if (_action.isAction(words_talkto, words_native_woman) ||
 		((_game._player._playerPos == Common::Point(214, 150)) && (_game._player._facing == FACING_NORTHWEST) && (local._twinkleAnimationType == 1) && local._stopWalking)) {
 		switch (_game._trigger) {
 		case 0:
@@ -962,7 +962,7 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	} else if (_action.isAction(words_give, words_native_woman) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -982,11 +982,11 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_NORTH) || _action.isAction(VERB_WALK_TOWARDS, NOUN_HUT_TO_NORTH)) {
+	} else if (_action.isAction(words_walk_down, words_path_to_north) || _action.isAction(words_walk_towards, words_hut_to_north)) {
 		_scene->_nextSceneId = 205;
-	} else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) {
+	} else if (_action.isAction(words_walk_through, words_doorway)) {
 		_scene->_nextSceneId = 215;
-	} else if ((_action.isAction(VERB_PULL, NOUN_CURTAIN) || _action.isAction(VERB_OPEN, NOUN_CURTAIN)) && !_globals[kCurtainOpen]) {
+	} else if ((_action.isAction(words_pull, words_curtain) || _action.isAction(words_open, words_curtain)) && !_globals[kCurtainOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -999,7 +999,7 @@ static void room_210_parser() {
 		case 1:
 			_game._player._stepEnabled = true;
 			_globals[kCurtainOpen] = true;
-			local._doorway = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+			local._doorway = _scene->_dynamicHotspots.add(words_doorway, words_walk_through, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
 			_scene->_dynamicHotspots.setPosition(local._doorway, Common::Point(168, 127), FACING_NORTH);
 			_scene->_dynamicHotspots.setCursor(local._doorway, CURSOR_GO_UP);
 			break;
@@ -1007,7 +1007,7 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if ((_action.isAction(VERB_PULL, NOUN_CURTAIN) || _action.isAction(VERB_CLOSE, NOUN_CURTAIN)) && _globals[kCurtainOpen]) {
+	} else if ((_action.isAction(words_pull, words_curtain) || _action.isAction(words_close, words_curtain)) && _globals[kCurtainOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
@@ -1031,7 +1031,7 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_HUT)) {
+	} else if (_action.isAction(words_look, words_hut)) {
 		if (_globals[kTwinklesStatus] == TWINKLES_GONE) {
 			if (_game._storyMode == STORYMODE_NAUGHTY)
 				_vm->_dialogs->show(21003);
@@ -1040,31 +1040,31 @@ static void room_210_parser() {
 		} else {
 			_vm->_dialogs->show(21001);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_BRA)) {
+	} else if (_action.isAction(words_look, words_bra)) {
 		_vm->_dialogs->show(21004);
-	} else if (_action.isAction(VERB_LOOK, NOUN_HOTPANTS)) {
+	} else if (_action.isAction(words_look, words_hotpants)) {
 		_vm->_dialogs->show(21005);
-	} else if (_action.isAction(VERB_TAKE, NOUN_HOTPANTS) || _action.isAction(VERB_TAKE, NOUN_BRA)) {
+	} else if (_action.isAction(words_take, words_hotpants) || _action.isAction(words_take, words_bra)) {
 		_vm->_dialogs->show(21006);
-	} else if (_action.isAction(VERB_LOOK, NOUN_STREAM)) {
+	} else if (_action.isAction(words_look, words_stream)) {
 		_vm->_dialogs->show(21007);
-	} else if (_action.isAction(VERB_LOOK, NOUN_BUSHY_FERN)) {
+	} else if (_action.isAction(words_look, words_bushy_fern)) {
 		_vm->_dialogs->show(21008);
-	} else if (_action.isAction(VERB_LOOK, NOUN_VILLAGE_PATH)) {
+	} else if (_action.isAction(words_look, words_village_path)) {
 		_vm->_dialogs->show(21009);
-	} else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN)) {
+	} else if (_action.isAction(words_look, words_native_woman)) {
 		_vm->_dialogs->show(21010);
-	} else if (_action.isAction(VERB_SHOOT, NOUN_NATIVE_WOMAN) || _action.isAction(VERB_HOSE_DOWN, NOUN_NATIVE_WOMAN)) {
+	} else if (_action.isAction(words_shoot, words_native_woman) || _action.isAction(words_hose_down, words_native_woman)) {
 		_vm->_dialogs->show(21011);
-	} else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_NORTH)) {
+	} else if (_action.isAction(words_look, words_path_to_north)) {
 		_vm->_dialogs->show(21012);
-	} else if (_action.isAction(VERB_LOOK, NOUN_CURTAIN)) {
+	} else if (_action.isAction(words_look, words_curtain)) {
 		_vm->_dialogs->show(21013);
-	} else if (_action.isAction(VERB_LOOK, NOUN_CLOTHESLINE)) {
+	} else if (_action.isAction(words_look, words_clothesline)) {
 		_vm->_dialogs->show(21014);
-	} else if (_action.isAction(VERB_TAKE, NOUN_CLOTHESLINE)) {
+	} else if (_action.isAction(words_take, words_clothesline)) {
 		_vm->_dialogs->show(21015);
-	} else if (_action.isAction(VERB_LOOK, NOUN_HUT_TO_NORTH)) {
+	} else if (_action.isAction(words_look, words_hut_to_north)) {
 		_vm->_dialogs->show(21016);
 	} else {
 		// Not handled
@@ -1103,8 +1103,8 @@ void room_210_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_DOORWAY);
-	_scene->addActiveVocab(VERB_WALK_THROUGH);
+	_scene->addActiveVocab(words_doorway);
+	_scene->addActiveVocab(words_walk_through);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room211.cpp b/engines/mads/madsv2/nebular/rooms/room211.cpp
index d65dba2fec8..7970cd72b11 100644
--- a/engines/mads/madsv2/nebular/rooms/room211.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room211.cpp
@@ -67,7 +67,7 @@ static void room_211_init() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(202, 126));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
 		_scene->_sequences.setMotion(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, -200, 0);
-		_scene->_dynamicHotspots.add(NOUN_SLITHERING_SNAKE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(1, 1, 1 + 41, 1 + 10));
+		_scene->_dynamicHotspots.add(words_slithering_snake, words_walkto, _globals._sequenceIndexes[2], Common::Rect(1, 1, 1 + 41, 1 + 10));
 	}
 
 	if (_scene->_roomChanged)
@@ -265,31 +265,31 @@ static void room_211_daemon() {
 }
 
 static void room_211_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_JUNGLE_PATH) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
+	if (_action.isAction(words_walk_down, words_jungle_path) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
 		&& (_scene->_customDest.x <= 52) && (_scene->_customDest.y >= 132))
 		_game._player.walk(Common::Point(52, 132), FACING_WEST);
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST)) {
+	if (_action.isAction(words_walk_down, words_path_to_west)) {
 		if (_game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
 			_game._player.walk(Common::Point(52, 132), FACING_WEST);
 		else
 			_game._player._walkOffScreenSceneId = 210;
 	}
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_NORTHEAST))
+	if (_action.isAction(words_walk_down, words_path_to_northeast))
 		_game._player._walkOffScreenSceneId = 207;
 }
 
 static void room_211_parser() {
 	if (_action._lookFlag && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
 		_vm->_dialogs->show(21111);
-	else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_PALM_TREE))
+	else if (_action.isAction(words_look, words_binoculars, words_palm_tree))
 		_vm->_dialogs->show(21116);
-	else if (_action.isAction(VERB_LOOK, NOUN_BUSHY_FERN))
+	else if (_action.isAction(words_look, words_bushy_fern))
 		_vm->_dialogs->show(21101);
-	else if (_action.isAction(VERB_LOOK, NOUN_JUNGLE_PATH))
+	else if (_action.isAction(words_look, words_jungle_path))
 		_vm->_dialogs->show(21102);
-	else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+	else if (_action.isAction(words_look, words_palm_tree)) {
 		if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) {
 			if (_game._storyMode == STORYMODE_NAUGHTY)
 				_vm->_dialogs->show(21103);
@@ -298,22 +298,22 @@ static void room_211_parser() {
 		} else {
 			_vm->_dialogs->show(21105);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_THICK_UNDERGROWTH)) {
+	} else if (_action.isAction(words_look, words_thick_undergrowth)) {
 		if (_game._storyMode == STORYMODE_NAUGHTY)
 			_vm->_dialogs->show(21106);
 		else
 			_vm->_dialogs->show(21107);
-	} else if (_action.isAction(VERB_LOOK, NOUN_JUNGLE))
+	} else if (_action.isAction(words_look, words_jungle))
 		_vm->_dialogs->show(21108);
-	else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_NORTHEAST))
+	else if (_action.isAction(words_look, words_path_to_northeast))
 		_vm->_dialogs->show(21109);
-	else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST))
+	else if (_action.isAction(words_look, words_path_to_west))
 		_vm->_dialogs->show(21110);
-	else if (_action.isAction(VERB_LOOK, NOUN_SLITHERING_SNAKE))
+	else if (_action.isAction(words_look, words_slithering_snake))
 		_vm->_dialogs->show(21113);
-	else if (_action.isAction(VERB_TAKE, NOUN_SLITHERING_SNAKE))
+	else if (_action.isAction(words_take, words_slithering_snake))
 		_vm->_dialogs->show(21114);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(21115);
 	else
 		return;
@@ -338,7 +338,7 @@ void room_211_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_SLITHERING_SNAKE);
+	_scene->addActiveVocab(words_slithering_snake);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room212.cpp b/engines/mads/madsv2/nebular/rooms/room212.cpp
index 6c3477dc53b..707602c18a5 100644
--- a/engines/mads/madsv2/nebular/rooms/room212.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room212.cpp
@@ -49,32 +49,32 @@ static void room_212_daemon() {
 }
 
 static void room_212_pre_parser() {
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
+	if (_action.isAction(words_walk_through, words_cave_entrance))
 		_game._player._walkOffScreenSceneId = 111;
 }
 
 static void room_212_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21209);
-	else if (_action.isAction(VERB_WALK_TOWARDS) && (_action.isObject(NOUN_FIELD_TO_NORTH) || _action.isObject(NOUN_MOUNTAINS)))
+	else if (_action.isAction(words_walk_towards) && (_action.isObject(words_field_to_north) || _action.isObject(words_mountains)))
 		_scene->_nextSceneId = 208;
-	else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_CAVE))
+	else if (_action.isAction(words_walk_towards, words_cave))
 		_scene->_nextSceneId = 111;
-	else if (_action.isAction(VERB_LOOK, NOUN_GRASS))
+	else if (_action.isAction(words_look, words_grass))
 		_vm->_dialogs->show(21201);
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+	else if (_action.isAction(words_look, words_rocks))
 		_vm->_dialogs->show(21202);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+	else if (_action.isAction(words_look, words_cave_entrance))
 		_vm->_dialogs->show(21203);
-	else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+	else if (_action.isAction(words_look, words_sky))
 		_vm->_dialogs->show(21204);
-	else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH))
+	else if (_action.isAction(words_look, words_field_to_north))
 		_vm->_dialogs->show(21205);
-	else if (_action.isAction(VERB_LOOK, NOUN_TREES))
+	else if (_action.isAction(words_look, words_trees))
 		_vm->_dialogs->show(21206);
-	else if (_action.isAction(VERB_LOOK, NOUN_PLANTS))
+	else if (_action.isAction(words_look, words_plants))
 		_vm->_dialogs->show(21207);
-	else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS))
+	else if (_action.isAction(words_look, words_mountains))
 		_vm->_dialogs->show(21208);
 	else
 		return;
@@ -94,7 +94,7 @@ void room_212_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_BOUNCING_REPTILE);
+	_scene->addActiveVocab(words_bouncing_reptile);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index 7a83e42ff51..498577c2a20 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -64,23 +64,23 @@ static void room_213_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+	if (_action.isAction(words_look, words_control_panel))
 		_vm->_dialogs->show(21301);
-	else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD) || _action.isAction(VERB_INSPECT, NOUN_KEYPAD))
+	else if (_action.isAction(words_look, words_keypad) || _action.isAction(words_inspect, words_keypad))
 		_vm->_dialogs->show(21302);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+	else if (_action.isAction(words_look, words_display))
 		_vm->_dialogs->show(21303);
-	else if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+	else if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
 		_vm->_dialogs->show(21304);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEVICE))
+	else if (_action.isAction(words_look, words_device))
 		_vm->_dialogs->show(21305);
-	else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_ENTER_KEY))
+	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
+		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
+		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
+		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
+		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
+		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_frown_key)
+		|| _action.isAction(words_look, words_enter_key))
 		_vm->_dialogs->show(21306);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room214.cpp b/engines/mads/madsv2/nebular/rooms/room214.cpp
index 715ddf3f760..fe610778c17 100644
--- a/engines/mads/madsv2/nebular/rooms/room214.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room214.cpp
@@ -54,7 +54,7 @@ static void room_214_init() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(103, 86));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 11);
 	} else {
-		_scene->_hotspots.activate(NOUN_POISON_DARTS, false);
+		_scene->_hotspots.activate(words_poison_darts, false);
 	}
 
 	if (_game._objects.isInRoom(OBJ_BLOWGUN)) {
@@ -62,7 +62,7 @@ static void room_214_init() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(90, 87));
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
 	} else {
-		_scene->_hotspots.activate(NOUN_BLOWGUN, false);
+		_scene->_hotspots.activate(words_blowgun, false);
 	}
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
@@ -77,7 +77,7 @@ static void room_214_daemon() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 6, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
-		_scene->_dynamicHotspots.add(NOUN_CAPTIVE_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.add(words_captive_creature, words_walkto, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 	}
 
@@ -88,7 +88,7 @@ static void room_214_daemon() {
 			int oldIdx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 5, 0, 0);
 			_scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
-			_scene->_dynamicHotspots.add(NOUN_CAPTIVE_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.add(words_captive_creature, words_walkto, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 8);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
@@ -100,7 +100,7 @@ static void room_214_daemon() {
 			int oldIdx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
 			_scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
-			_scene->_dynamicHotspots.add(NOUN_CAPTIVE_CREATURE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.add(words_captive_creature, words_walkto, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 9, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
 			local._devilTime = _game._player._priorTimer;
@@ -117,9 +117,9 @@ static void room_214_daemon() {
 static void room_214_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21427);
-	else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT))
+	else if (_action.isAction(words_walk_outside, words_hut))
 		_scene->_nextSceneId = 207;
-	else if (_action.isAction(VERB_TAKE, NOUN_POISON_DARTS) && (_game._trigger || _game._objects.isInRoom(OBJ_POISON_DARTS))) {
+	else if (_action.isAction(words_take, words_poison_darts) && (_game._trigger || _game._objects.isInRoom(OBJ_POISON_DARTS))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -135,7 +135,7 @@ static void room_214_parser() {
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 			_game._objects.addToInventory(OBJ_POISON_DARTS);
-			_scene->_hotspots.activate(NOUN_POISON_DARTS, false);
+			_scene->_hotspots.activate(words_poison_darts, false);
 			break;
 
 		case 2:
@@ -151,7 +151,7 @@ static void room_214_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TAKE, NOUN_BLOWGUN) && (_game._trigger || _game._objects.isInRoom(OBJ_BLOWGUN))) {
+	} else if (_action.isAction(words_take, words_blowgun) && (_game._trigger || _game._objects.isInRoom(OBJ_BLOWGUN))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -167,7 +167,7 @@ static void room_214_parser() {
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
 			_game._objects.addToInventory(OBJ_BLOWGUN);
-			_scene->_hotspots.activate(NOUN_BLOWGUN, false);
+			_scene->_hotspots.activate(words_blowgun, false);
 			break;
 
 		case 2:
@@ -183,53 +183,53 @@ static void room_214_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+	} else if (_action.isAction(words_look, words_window))
 		_vm->_dialogs->show(21401);
-	else if (_action.isAction(VERB_LOOK, NOUN_EXPERIMENT_CAGE))
+	else if (_action.isAction(words_look, words_experiment_cage))
 		_vm->_dialogs->show(21402);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAPTIVE_CREATURE))
+	else if (_action.isAction(words_look, words_captive_creature))
 		_vm->_dialogs->show(21403);
-	else if (_action.isAction(VERB_LOOK, NOUN_BEAR_RUG))
+	else if (_action.isAction(words_look, words_bear_rug))
 		_vm->_dialogs->show(21404);
-	else if (_action.isAction(VERB_LOOK, NOUN_TROPHY))
+	else if (_action.isAction(words_look, words_trophy))
 		_vm->_dialogs->show(21405);
-	else if (_action.isAction(VERB_LOOK, NOUN_LARGE_BOWL)) {
+	else if (_action.isAction(words_look, words_large_bowl)) {
 		if (_game._storyMode == STORYMODE_NAUGHTY) {
 			_vm->_dialogs->show(21406);
 		} else {
 			_vm->_dialogs->show(21407);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_SPECIMEN_JARS))
+	} else if (_action.isAction(words_look, words_specimen_jars))
 		_vm->_dialogs->show(21408);
-	else if (_action.isAction(VERB_TAKE, NOUN_LARGE_BOWL) || _action.isAction(VERB_TAKE, NOUN_SPECIMEN_JARS))
+	else if (_action.isAction(words_take, words_large_bowl) || _action.isAction(words_take, words_specimen_jars))
 		_vm->_dialogs->show(21409);
-	else if (_action.isAction(VERB_LOOK, NOUN_SHRUNKEN_HEADS))
+	else if (_action.isAction(words_look, words_shrunken_heads))
 		_vm->_dialogs->show(21410);
-	else if (_action.isAction(VERB_TAKE, NOUN_SHRUNKEN_HEADS) || _action.isAction(VERB_TAKE, NOUN_LARGE_HEADS))
+	else if (_action.isAction(words_take, words_shrunken_heads) || _action.isAction(words_take, words_large_heads))
 		_vm->_dialogs->show(21411);
-	else if (_action.isAction(VERB_LOOK, NOUN_LARGE_HEADS))
+	else if (_action.isAction(words_look, words_large_heads))
 		_vm->_dialogs->show(21428);
-	else if (_action.isAction(VERB_LOOK, NOUN_POISON_DARTS) && (_action._savedFields._mainObjectSource == 4))
+	else if (_action.isAction(words_look, words_poison_darts) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(21412);
-	else if (_action.isAction(VERB_OPEN, NOUN_EXPERIMENT_CAGE))
+	else if (_action.isAction(words_open, words_experiment_cage))
 		_vm->_dialogs->show(21414);
-	else if (_action.isAction(VERB_TALKTO, NOUN_CAPTIVE_CREATURE))
+	else if (_action.isAction(words_talkto, words_captive_creature))
 		_vm->_dialogs->show(21415);
-	else if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_CAPTIVE_CREATURE))
+	else if (_action.isAction(words_give, words_twinkifruit, words_captive_creature))
 		_vm->_dialogs->show(21416);
-	else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_CAPTIVE_CREATURE) || _action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_CAPTIVE_CREATURE))
+	else if (_action.isAction(words_shoot, words_blowgun, words_captive_creature) || _action.isAction(words_hose_down, words_blowgun, words_captive_creature))
 		_vm->_dialogs->show(21417);
-	else if (_action.isAction(VERB_LOOK, NOUN_BIG_HEADS))
+	else if (_action.isAction(words_look, words_big_heads))
 		_vm->_dialogs->show(21418);
-	else if (_action.isAction(VERB_TAKE, NOUN_BIG_HEADS))
+	else if (_action.isAction(words_take, words_big_heads))
 		_vm->_dialogs->show(21419);
-	else if (_action.isAction(VERB_TAKE, NOUN_BEAR_RUG))
+	else if (_action.isAction(words_take, words_bear_rug))
 		_vm->_dialogs->show(21420);
-	else if (_action.isAction(VERB_LOOK, NOUN_FLOOR_OF_HUT))
+	else if (_action.isAction(words_look, words_floor_of_hut))
 		_vm->_dialogs->show(21421);
-	else if (_action.isAction(VERB_LOOK, NOUN_BLOWGUN))
+	else if (_action.isAction(words_look, words_blowgun))
 		_vm->_dialogs->show(21422);
-	else if (_action.isAction(VERB_LOOK, NOUN_TABLE)) {
+	else if (_action.isAction(words_look, words_table)) {
 		if (_game._objects.isInRoom(OBJ_POISON_DARTS) && _game._objects.isInRoom(OBJ_BLOWGUN)) {
 			_vm->_dialogs->show(21423);
 		} else if (_game._objects.isInRoom(OBJ_POISON_DARTS) && !_game._objects.isInRoom(OBJ_BLOWGUN)) {
@@ -257,8 +257,8 @@ void room_214_preload() {
 
 	section_2_walker();
 	section_2_interface();
-	_scene->addActiveVocab(NOUN_CAPTIVE_CREATURE);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_captive_creature);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room215.cpp b/engines/mads/madsv2/nebular/rooms/room215.cpp
index 4348b9a8f39..9a8ddb9f299 100644
--- a/engines/mads/madsv2/nebular/rooms/room215.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room215.cpp
@@ -78,7 +78,7 @@ static void room_215_daemon() {
 static void room_215_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21509);
-	else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT)) {
+	else if (_action.isAction(words_take, words_twinkifruit)) {
 		if (!_game._objects.isInInventory(OBJ_TWINKIFRUIT) || _game._trigger) {
 			switch (_game._trigger) {
 			case 0:
@@ -117,31 +117,31 @@ static void room_215_parser() {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(idx));
 		}
-	} else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT))
+	} else if (_action.isAction(words_walk_outside, words_hut))
 		_scene->_nextSceneId = 210;
-	else if (_action.isAction(VERB_LOOK, NOUN_BEAR_RUG))
+	else if (_action.isAction(words_look, words_bear_rug))
 		_vm->_dialogs->show(21501);
-	else if (_action.isAction(VERB_LOOK, NOUN_BED))
+	else if (_action.isAction(words_look, words_bed))
 		_vm->_dialogs->show(21502);
-	else if (_action.isAction(VERB_LOOK, NOUN_WELCOME_MAT))
+	else if (_action.isAction(words_look, words_welcome_mat))
 		_vm->_dialogs->show(21503);
-	else if (_action.isAction(VERB_LOOK, NOUN_LOVE_ALTAR))
+	else if (_action.isAction(words_look, words_love_altar))
 		_vm->_dialogs->show(21504);
-	else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+	else if (_action.isAction(words_look, words_window))
 		_vm->_dialogs->show(21505);
-	else if (_action.isAction(VERB_LOOK, NOUN_PICTURE))
+	else if (_action.isAction(words_look, words_picture))
 		_vm->_dialogs->show(21506);
-	else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT) && (_action._savedFields._mainObjectSource == 4))
+	else if (_action.isAction(words_look, words_twinkifruit) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(21507);
-	else if (_action.isAction(VERB_TAKE, NOUN_BEAR_RUG))
+	else if (_action.isAction(words_take, words_bear_rug))
 		_vm->_dialogs->show(21510);
-	else if (_action.isAction(VERB_TAKE, NOUN_LOVE_ALTAR))
+	else if (_action.isAction(words_take, words_love_altar))
 		_vm->_dialogs->show(21511);
-	else if (_action.isAction(VERB_LOOK, NOUN_BAG_OF_TWINKIFRUITS))
+	else if (_action.isAction(words_look, words_bag_of_twinkifruits))
 		_vm->_dialogs->show(21512);
-	else if (_action.isAction(VERB_TAKE, NOUN_BAG_OF_TWINKIFRUITS))
+	else if (_action.isAction(words_take, words_bag_of_twinkifruits))
 		_vm->_dialogs->show(21513);
-	else if (_action.isAction(VERB_TAKE, NOUN_WELCOME_MAT))
+	else if (_action.isAction(words_take, words_welcome_mat))
 		_vm->_dialogs->show(21514);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room307.cpp b/engines/mads/madsv2/nebular/rooms/room307.cpp
index 86850730889..cce95587ba8 100644
--- a/engines/mads/madsv2/nebular/rooms/room307.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room307.cpp
@@ -345,7 +345,7 @@ static void room_307_init() {
 	if (local._grateOpenedFl) {
 		_scene->_hotspots.activate(17, false);
 
-		int idx = _scene->_dynamicHotspots.add(NOUN_AIR_VENT, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
+		int idx = _scene->_dynamicHotspots.add(words_air_vent, words_climb_into, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
 		int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
 		_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_UP);
 
@@ -453,7 +453,7 @@ static void room_307_parser() {
 		_vm->_dialogs->show(30715);
 	else if (_game._screenObjects._inputMode == kInputConversation)
 		handleDialog();
-	else if (_action.isAction(VERB_TALKTO, NOUN_CELL_WALL) || _action.isAction(VERB_TALKTO, NOUN_WALL) || _action.isAction(VERB_TALKTO, NOUN_TOILET)) {
+	else if (_action.isAction(words_talkto, words_cell_wall) || _action.isAction(words_talkto, words_wall) || _action.isAction(words_talkto, words_toilet)) {
 		int node, say;
 		if (_globals[kKnowsBuddyBeast]) {
 			say = 0x10E;
@@ -478,7 +478,7 @@ static void room_307_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_PRY, NOUN_SCALPEL, NOUN_AIR_VENT)) {
+	} else if (_action.isAction(words_pry, words_scalpel, words_air_vent)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -540,7 +540,7 @@ static void room_307_parser() {
 			_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 			local._grateOpenedFl = true;
 			_scene->_hotspots.activate(17, false);
-			int idx = _scene->_dynamicHotspots.add(NOUN_AIR_VENT, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
+			int idx = _scene->_dynamicHotspots.add(words_air_vent, words_climb_into, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
 			int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
 			_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_UP);
 			_game._objects.removeFromInventory(OBJ_SCALPEL, NOWHERE);
@@ -556,7 +556,7 @@ static void room_307_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+	} else if (_action.isAction(words_climb_into, words_air_vent)) {
 		if (local._grateOpenedFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -640,9 +640,9 @@ static void room_307_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(VERB_USE, NOUN_TOILET) && (_game._storyMode != STORYMODE_NAUGHTY))
+	} else if (_action.isAction(words_use, words_toilet) && (_game._storyMode != STORYMODE_NAUGHTY))
 		_vm->_dialogs->show(30723);
-	else if (_action.isAction(VERB_USE, NOUN_TOILET)) {
+	else if (_action.isAction(words_use, words_toilet)) {
 		if (!local._afterPeeingFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -693,24 +693,24 @@ static void room_307_parser() {
 			int idx = _scene->_kernelMessages.add(Common::Point(85, 39), 0x1110, 0, 0, 180, _game.getQuote(238));
 			_scene->_kernelMessages.setQuoted(idx, 4, true);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT)) {
+	} else if (_action.isAction(words_look, words_air_vent)) {
 		if (!local._grateOpenedFl)
 			_vm->_dialogs->show(30710);
 		else
 			_vm->_dialogs->show(30711);
-	} else if (_action.isAction(VERB_LOOK, NOUN_BED))
+	} else if (_action.isAction(words_look, words_bed))
 		_vm->_dialogs->show(30712);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(30713);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+	else if (_action.isAction(words_look, words_toilet))
 		_vm->_dialogs->show(30714);
-	else if (_action.isAction(VERB_SHARPEN, NOUN_SCALPEL))
+	else if (_action.isAction(words_sharpen, words_scalpel))
 		_vm->_dialogs->show(30716);
-	else if (_action.isAction(VERB_LOOK, NOUN_CELL_WALL))
+	else if (_action.isAction(words_look, words_cell_wall))
 		_vm->_dialogs->show(30717);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
+	else if (_action.isAction(words_look, words_light))
 		_vm->_dialogs->show(30718);
-	else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR)) {
+	else if (_action.isAction(words_walk_into, words_corridor)) {
 		switch (local._fieldCollisionCounter) {
 		case 0:
 			_vm->_dialogs->show(30719);
@@ -771,8 +771,8 @@ void room_307_preload() {
 
 	section_3_walker();
 	section_3_interface();
-	_scene->addActiveVocab(NOUN_AIR_VENT);
-	_scene->addActiveVocab(VERB_CLIMB_INTO);
+	_scene->addActiveVocab(words_air_vent);
+	_scene->addActiveVocab(words_climb_into);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room309.cpp b/engines/mads/madsv2/nebular/rooms/room309.cpp
index 063accdc846..8a5186c4bbd 100644
--- a/engines/mads/madsv2/nebular/rooms/room309.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room309.cpp
@@ -137,7 +137,7 @@ static void room_309_daemon() {
 		switch (_game._trigger) {
 		case 70:
 		{
-			int idx = _scene->_dynamicHotspots.add(NOUN_GHASTLY_BEAST, NOUN_GAWK_AT, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(words_ghastly_beast, words_gawk_at, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(142, 146), FACING_NORTHEAST);
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 4, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
diff --git a/engines/mads/madsv2/nebular/rooms/room311.cpp b/engines/mads/madsv2/nebular/rooms/room311.cpp
index 05675e6e2b0..23a6219b64f 100644
--- a/engines/mads/madsv2/nebular/rooms/room311.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room311.cpp
@@ -196,9 +196,9 @@ static void room_311_parser() {
 		local._checkGuardFl = false;
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.addQuote(250, 0, 240);
-	} else if (_action.isAction(VERB_SIT_AT, NOUN_DESK))
+	} else if (_action.isAction(words_sit_at, words_desk))
 		_scene->_nextSceneId = 320;
-	else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+	else if (_action.isAction(words_climb_into, words_air_vent)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -294,25 +294,25 @@ static void room_311_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+	} else if (_action.isAction(words_look, words_desk))
 		_vm->_dialogs->show(31110);
-	else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(31111);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHTING_FIXTURE) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTING_FIXTURE))
+	else if (_action.isAction(words_look, words_lighting_fixture) || _action.isAction(words_stare_at, words_lighting_fixture))
 		_vm->_dialogs->show(31112);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHTS) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTS))
+	else if (_action.isAction(words_look, words_lights) || _action.isAction(words_stare_at, words_lights))
 		_vm->_dialogs->show(31113);
-	else if (_action.isAction(VERB_TAKE, NOUN_LIGHTS))
+	else if (_action.isAction(words_take, words_lights))
 		_vm->_dialogs->show(31114);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHT) || _action.isAction(VERB_STARE_AT, NOUN_LIGHT))
+	else if (_action.isAction(words_look, words_light) || _action.isAction(words_stare_at, words_light))
 		_vm->_dialogs->show(31115);
-	else if (_action.isAction(VERB_TAKE, NOUN_LIGHT))
+	else if (_action.isAction(words_take, words_light))
 		_vm->_dialogs->show(31116);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(31117);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(31118);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(31120);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room313.cpp b/engines/mads/madsv2/nebular/rooms/room313.cpp
index b6f9d65dda8..e772187e180 100644
--- a/engines/mads/madsv2/nebular/rooms/room313.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room313.cpp
@@ -70,30 +70,30 @@ static void room_313_init() {
 }
 
 static void room_313_parser() {
-	if (_action.isAction(VERB_CRAWL_TO, NOUN_FOURTH_CELL))
+	if (_action.isAction(words_crawl_to, words_fourth_cell))
 		_scene->_nextSceneId = 387;
-	else if (_action.isAction(VERB_CRAWL_TO, NOUN_THIRD_CELL))
+	else if (_action.isAction(words_crawl_to, words_third_cell))
 		_scene->_nextSceneId = 388;
-	else if (_action.isAction(VERB_CRAWL_TO, NOUN_SECOND_CELL)) {
+	else if (_action.isAction(words_crawl_to, words_second_cell)) {
 		if (_globals[kAfterHavoc])
 			_scene->_nextSceneId = 399;
 		else
 			_scene->_nextSceneId = 389;
-	} else if (_action.isAction(VERB_CRAWL_TO, NOUN_FIRST_CELL))
+	} else if (_action.isAction(words_crawl_to, words_first_cell))
 		_scene->_nextSceneId = 390;
-	else if (_action.isAction(VERB_CRAWL_TO, NOUN_SECURITY_STATION)) {
+	else if (_action.isAction(words_crawl_to, words_security_station)) {
 		if (_globals[kSexOfRex] == REX_FEMALE) {
 			_globals[kSexOfRex] = REX_MALE;
 			_vm->_dialogs->show(31301);
 		}
 		_scene->_nextSceneId = 391;
-	} else if (_action.isAction(VERB_CRAWL_TO, NOUN_EQUIPMENT_ROOM)) {
+	} else if (_action.isAction(words_crawl_to, words_equipment_room)) {
 		if (_globals[kSexOfRex] == REX_FEMALE) {
 			_globals[kSexOfRex] = REX_MALE;
 			_vm->_dialogs->show(31301);
 		}
 		_scene->_nextSceneId = 366;
-	} else if (!_action.isAction(VERB_CRAWL_DOWN, NOUN_AIR_SHAFT))
+	} else if (!_action.isAction(words_crawl_down, words_air_shaft))
 		return;
 
 	_action._inProgress = false;
diff --git a/engines/mads/madsv2/nebular/rooms/room316.cpp b/engines/mads/madsv2/nebular/rooms/room316.cpp
index 935b79a2c36..eca1ea20714 100644
--- a/engines/mads/madsv2/nebular/rooms/room316.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room316.cpp
@@ -384,7 +384,7 @@ static void room_316_daemon() {
 }
 
 static void room_316_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST)) {
+	if (_action.isAction(words_walk_down, words_corridor_to_east)) {
 		if (_globals[kAfterHavoc])
 			_game._player._walkOffScreenSceneId = 354;
 		else
@@ -393,12 +393,12 @@ static void room_316_pre_parser() {
 }
 
 static void room_316_parser() {
-	if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+	if (_action.isAction(words_climb_into, words_air_vent)) {
 		if (_globals[kSexOfRex] == REX_FEMALE)
 			handleRoxInGrate();
 		else
 			handleRexInGrate();
-	} else if (_action.isAction(VERB_WALK_UP, NOUN_RAMP) || _action.isAction(VERB_WALK_ONTO, NOUN_PLATFORM)) {
+	} else if (_action.isAction(words_walk_up, words_ramp) || _action.isAction(words_walk_onto, words_platform)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_globals[kCityFlooded]) {
@@ -452,35 +452,35 @@ static void room_316_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
+	} else if (_action.isAction(words_look, words_platform))
 		_vm->_dialogs->show(31610);
-	else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+	else if (_action.isAction(words_look, words_strange_device)) {
 		if (_game._visitedScenes.exists(321))
 			_vm->_dialogs->show(31612);
 		else
 			_vm->_dialogs->show(31611);
-	} else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS))
+	} else if (_action.isAction(words_look, words_controls))
 		_vm->_dialogs->show(31613);
-	else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT))
+	else if (_action.isAction(words_look, words_equipment))
 		_vm->_dialogs->show(31614);
-	else if (_action.isAction(VERB_LOOK, NOUN_PANEL))
+	else if (_action.isAction(words_look, words_panel))
 		_vm->_dialogs->show(31615);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+	else if (_action.isAction(words_look, words_monitor))
 		_vm->_dialogs->show(31616);
-	else if (_action.isAction(VERB_LOOK, NOUN_RAMP))
+	else if (_action.isAction(words_look, words_ramp))
 		_vm->_dialogs->show(31617);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(31618);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST)) {
+	else if (_action.isAction(words_look, words_corridor_to_east)) {
 		if (!_globals[kAfterHavoc]) {
 			if (_game._difficulty != DIFFICULTY_EASY)
 				_vm->_dialogs->show(31620);
 			else
 				_vm->_dialogs->show(31619);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+	} else if (_action.isAction(words_look, words_floor))
 		_vm->_dialogs->show(31621);
-	else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+	else if (_action.isAction(words_look, words_support))
 		_vm->_dialogs->show(31622);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index 6def6a0cbc1..da530a9a290 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -215,15 +215,15 @@ static void room_318_init() {
 		_scene->loadAnimation(formAnimName('f', -1));
 		_scene->_animation[0]->_resetFlag = true;
 	} else if (!_globals[kHasSeenProfPyro]) {
-		_scene->_hotspots.activate(NOUN_PROFESSORS_GURNEY, false);
-		_scene->_hotspots.activate(NOUN_PROFESSOR, false);
-		_scene->_hotspots.activate(NOUN_TAPE_PLAYER, false);
+		_scene->_hotspots.activate(words_professors_gurney, false);
+		_scene->_hotspots.activate(words_professor, false);
+		_scene->_hotspots.activate(words_tape_player, false);
 	}
 
 	if (_game._objects.isInRoom(OBJ_SCALPEL)) {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 120);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
-		_scene->_dynamicHotspots.add(NOUN_SCALPEL, VERB_TAKE, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.add(words_scalpel, words_take, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 	}
 
 	if (_scene->_priorSceneId == 357)
@@ -247,7 +247,7 @@ static void room_318_init() {
 	}
 
 	local._lastFrame = 0;
-	_scene->_hotspots.activate(NOUN_INTERN, false);
+	_scene->_hotspots.activate(words_intern, false);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		local._dialogFl = false;
@@ -278,7 +278,7 @@ static void room_318_init() {
 				local._dialogFl = false;
 			} else {
 				_scene->loadAnimation(formAnimName('b', -1), 61);
-				_scene->_hotspots.activate(NOUN_INTERN, true);
+				_scene->_hotspots.activate(words_intern, true);
 			}
 
 			if (local._dialogFl) {
@@ -364,7 +364,7 @@ static void room_318_daemon() {
 
 				if (nextFrame == 184) {
 					handleInternDialog(0x1D1, 3, 240);
-					_scene->_hotspots.activate(NOUN_INTERN, false);
+					_scene->_hotspots.activate(words_intern, false);
 					local._internVisibleFl = false;
 				}
 				break;
@@ -452,7 +452,7 @@ static void room_318_pre_parser() {
 	if (_game._player._needToWalk)
 		_game._player._needToWalk = _game._player._visible;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 357;
 }
 
@@ -463,7 +463,7 @@ static void room_318_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TALKTO, NOUN_INTERN)) {
+	if (_action.isAction(words_talkto, words_intern)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -504,7 +504,7 @@ static void room_318_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_SCALPEL) && (_game._objects.isInRoom(OBJ_SCALPEL) || _game._trigger)) {
+	if (_action.isAction(words_take, words_scalpel) && (_game._objects.isInRoom(OBJ_SCALPEL) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -550,13 +550,13 @@ static void room_318_parser() {
 	}
 
 	if (_game._player._visible) {
-		if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH)) {
+		if (_action.isAction(words_walk_down, words_corridor_to_south)) {
 			_scene->_nextSceneId = 407;
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(VERB_TAKE, NOUN_TAPE_PLAYER)) {
+		if (_action.isAction(words_take, words_tape_player)) {
 			if (_game._objects.isInRoom(OBJ_AUDIO_TAPE)) {
 				_vm->_dialogs->showItem(OBJ_AUDIO_TAPE, 0x7C5B);
 				_game._objects.addToInventory(OBJ_AUDIO_TAPE);
@@ -567,7 +567,7 @@ static void room_318_parser() {
 			return;
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_TAPE_PLAYER)) {
+		if (_action.isAction(words_look, words_tape_player)) {
 			if (_game._objects.isInRoom(OBJ_AUDIO_TAPE))
 				_vm->_dialogs->show(31833);
 			else
@@ -577,68 +577,68 @@ static void room_318_parser() {
 			return;
 		}
 
-		if (_action.isAction(VERB_WALK_INTO, NOUN_DOCTORS_OFFICE)) {
+		if (_action.isAction(words_walk_into, words_doctors_office)) {
 			_vm->_dialogs->show(31831);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_GURNEY)) {
+		if (_action.isAction(words_look, words_gurney)) {
 			_vm->_dialogs->show(31823);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_INSTRUMENT_TABLE)) {
+		if (_action.isAction(words_look, words_instrument_table)) {
 			_vm->_dialogs->show(31825);
 			_action._inProgress = false;
 			return;
 		}
 	} else { // Not visible
-		if (_action.isAction(VERB_LOOK, NOUN_GURNEY)) {
+		if (_action.isAction(words_look, words_gurney)) {
 			_vm->_dialogs->show(31822);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(VERB_LOOK, NOUN_INSTRUMENT_TABLE)) {
+		if (_action.isAction(words_look, words_instrument_table)) {
 			_vm->_dialogs->show(31824);
 			_action._inProgress = false;
 			return;
 		}
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(31810);
-	else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+	else if (_action.isAction(words_look, words_floor))
 		_vm->_dialogs->show(31811);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(31812);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(31813);
-	else if (_action.isAction(VERB_LOOK, NOUN_FAUCET))
+	else if (_action.isAction(words_look, words_faucet))
 		_vm->_dialogs->show(31814);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(31815);
-	else if (_action.isAction(VERB_LOOK, NOUN_CONVEYOR_BELT))
+	else if (_action.isAction(words_look, words_conveyor_belt))
 		_vm->_dialogs->show(31816);
-	else if (_action.isAction(VERB_LOOK, NOUN_LARGE_BLADE))
+	else if (_action.isAction(words_look, words_large_blade))
 		_vm->_dialogs->show(31817);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+	else if (_action.isAction(words_look, words_monitor))
 		_vm->_dialogs->show(31818);
-	else if (_action.isAction(VERB_LOOK, NOUN_CABINETS))
+	else if (_action.isAction(words_look, words_cabinets))
 		_vm->_dialogs->show(31819);
-	else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT))
+	else if (_action.isAction(words_look, words_equipment))
 		_vm->_dialogs->show(31820);
-	else if (_action.isAction(VERB_LOOK, NOUN_SHELF))
+	else if (_action.isAction(words_look, words_shelf))
 		_vm->_dialogs->show(31821);
-	else if (_action.isAction(VERB_OPEN, NOUN_CABINETS))
+	else if (_action.isAction(words_open, words_cabinets))
 		_vm->_dialogs->show(31829);
-	else if (_action.isAction(VERB_LOOK, NOUN_INTERN))
+	else if (_action.isAction(words_look, words_intern))
 		_vm->_dialogs->show(31830);
-	else if (_action.isAction(VERB_LOOK, NOUN_PROFESSOR))
+	else if (_action.isAction(words_look, words_professor))
 		_vm->_dialogs->show(31832);
-	else if (_action.isAction(VERB_LOOK, NOUN_PROFESSORS_GURNEY))
+	else if (_action.isAction(words_look, words_professors_gurney))
 		_vm->_dialogs->show(31836);
 	else if (_action._lookFlag) {
 		if (_game._player._visible || _game._objects.isInInventory(OBJ_SCALPEL))
diff --git a/engines/mads/madsv2/nebular/rooms/room319.cpp b/engines/mads/madsv2/nebular/rooms/room319.cpp
index 1ffb09ec3ad..0cd326b4c48 100644
--- a/engines/mads/madsv2/nebular/rooms/room319.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room319.cpp
@@ -138,7 +138,7 @@ static void room_319_init() {
 		local._slacheInitFl = true;
 
 		if (_globals[kRexHasMetSlache]) {
-			handleSlacheDialogs(VERB_WALK_OUTSIDE, 2, INDEFINITE_TIMEOUT);
+			handleSlacheDialogs(words_walk_outside, 2, INDEFINITE_TIMEOUT);
 			local._slachePosY = 3;
 		} else {
 			handleSlacheDialogs(0x186, 4, INDEFINITE_TIMEOUT);
diff --git a/engines/mads/madsv2/nebular/rooms/room320.cpp b/engines/mads/madsv2/nebular/rooms/room320.cpp
index 2400759ca71..ebd58111f4c 100644
--- a/engines/mads/madsv2/nebular/rooms/room320.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room320.cpp
@@ -238,11 +238,11 @@ static void room_320_daemon() {
 static void room_320_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(32011);
-	else if ((_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) &&
-		(_action.isObject(NOUN_LEFT_1_KEY) || _action.isObject(NOUN_LEFT_2_KEY) || _action.isObject(NOUN_LEFT_3_KEY) || _action.isObject(NOUN_LEFT_4_KEY) ||
-			_action.isObject(NOUN_GREEN_BUTTON) || _action.isObject(NOUN_RED_BUTTON) || _action.isObject(NOUN_RIGHT_1_KEY) || _action.isObject(NOUN_RIGHT_2_KEY) ||
-			_action.isObject(NOUN_RIGHT_3_KEY) || _action.isObject(NOUN_RIGHT_4_KEY) || _action.isObject(NOUN_RIGHT_5_KEY) || _action.isObject(NOUN_RIGHT_6_KEY) ||
-			_action.isObject(NOUN_RIGHT_7_KEY) || _action.isObject(NOUN_RIGHT_8_KEY)
+	else if ((_action.isAction(words_press) || _action.isAction(words_push)) &&
+		(_action.isObject(words_left_1_key) || _action.isObject(words_left_2_key) || _action.isObject(words_left_3_key) || _action.isObject(words_left_4_key) ||
+			_action.isObject(words_green_button) || _action.isObject(words_red_button) || _action.isObject(words_right_1_key) || _action.isObject(words_right_2_key) ||
+			_action.isObject(words_right_3_key) || _action.isObject(words_right_4_key) || _action.isObject(words_right_5_key) || _action.isObject(words_right_6_key) ||
+			_action.isObject(words_right_7_key) || _action.isObject(words_right_8_key)
 			)) {
 		switch (_game._trigger) {
 		case 0:
@@ -306,39 +306,39 @@ static void room_320_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LEAVE, NOUN_SECURITY_STATION))
+	} else if (_action.isAction(words_leave, words_security_station))
 		_scene->_nextSceneId = 311;
-	else if (_action.isAction(VERB_LOOK, NOUN_RIGHT_MONITOR))
+	else if (_action.isAction(words_look, words_right_monitor))
 		_vm->_dialogs->show(32001);
-	else if (_action.isAction(VERB_LOOK, NOUN_LEFT_MONITOR))
+	else if (_action.isAction(words_look, words_left_monitor))
 		_vm->_dialogs->show(32002);
-	else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+	else if (_action.isAction(words_look, words_desk))
 		_vm->_dialogs->show(32003);
-	else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_STATION))
+	else if (_action.isAction(words_look, words_security_station))
 		_vm->_dialogs->show(32004);
-	else if (_action.isAction(VERB_LOOK, NOUN_MUG))
+	else if (_action.isAction(words_look, words_mug))
 		_vm->_dialogs->show(32005);
-	else if (_action.isAction(VERB_LOOK, NOUN_DOUGHNUT))
+	else if (_action.isAction(words_look, words_doughnut))
 		_vm->_dialogs->show(32006);
-	else if (_action.isAction(VERB_LOOK, NOUN_MAGAZINE))
+	else if (_action.isAction(words_look, words_magazine))
 		_vm->_dialogs->show(32007);
-	else if (_action.isAction(VERB_LOOK, NOUN_PAPER_FOOTBALL))
+	else if (_action.isAction(words_look, words_paper_football))
 		_vm->_dialogs->show(32008);
-	else if (_action.isAction(VERB_LOOK, NOUN_NEWSPAPER))
+	else if (_action.isAction(words_look, words_newspaper))
 		_vm->_dialogs->show(32009);
-	else if (_action.isAction(VERB_LOOK, NOUN_CLIPBOARD))
+	else if (_action.isAction(words_look, words_clipboard))
 		_vm->_dialogs->show(32010);
-	else if (_action.isAction(VERB_TAKE, NOUN_MUG))
+	else if (_action.isAction(words_take, words_mug))
 		_vm->_dialogs->show(32012);
-	else if (_action.isAction(VERB_TAKE, NOUN_CLIPBOARD))
+	else if (_action.isAction(words_take, words_clipboard))
 		_vm->_dialogs->show(32013);
-	else if (_action.isAction(VERB_TAKE, NOUN_DOUGHNUT) || _action.isAction(VERB_EAT, NOUN_DOUGHNUT))
+	else if (_action.isAction(words_take, words_doughnut) || _action.isAction(words_eat, words_doughnut))
 		_vm->_dialogs->show(32014);
-	else if (_action.isAction(VERB_TAKE, NOUN_PAPER_FOOTBALL))
+	else if (_action.isAction(words_take, words_paper_football))
 		_vm->_dialogs->show(32015);
-	else if (_action.isAction(VERB_TAKE, NOUN_MAGAZINE))
+	else if (_action.isAction(words_take, words_magazine))
 		_vm->_dialogs->show(32016);
-	else if (_action.isAction(VERB_TAKE, NOUN_NEWSPAPER))
+	else if (_action.isAction(words_take, words_newspaper))
 		_vm->_dialogs->show(32017);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room322.cpp b/engines/mads/madsv2/nebular/rooms/room322.cpp
index a30345c4d80..39e913ced5d 100644
--- a/engines/mads/madsv2/nebular/rooms/room322.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room322.cpp
@@ -64,21 +64,21 @@ static void room_322_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+	if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
 		_vm->_dialogs->show(32210);
-	else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+	else if (_action.isAction(words_look, words_keypad))
 		_vm->_dialogs->show(32211);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+	else if (_action.isAction(words_look, words_display))
 		_vm->_dialogs->show(32212);
-	else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
+		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
+		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
+		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
+		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
+		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_enter_key)
+		|| _action.isAction(words_look, words_frown_key))
 		_vm->_dialogs->show(32213);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEVICE))
+	else if (_action.isAction(words_look, words_device))
 		_vm->_dialogs->show(32214);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room351.cpp b/engines/mads/madsv2/nebular/rooms/room351.cpp
index 37493cb1fd5..d098b7a894b 100644
--- a/engines/mads/madsv2/nebular/rooms/room351.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room351.cpp
@@ -44,7 +44,7 @@ static void room_351_init() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
 	} else
-		_scene->_hotspots.activate(NOUN_CREDIT_CHIP, false);
+		_scene->_hotspots.activate(words_credit_chip, false);
 
 	if (_scene->_priorSceneId == 352)
 		_game._player._playerPos = Common::Point(148, 152);
@@ -115,11 +115,11 @@ static void room_351_daemon() {
 static void room_351_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35121);
-	else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER))
+	else if (_action.isAction(words_step_into, words_teleporter))
 		_scene->_nextSceneId = 322;
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_walk_down, words_corridor_to_south))
 		_scene->_nextSceneId = 352;
-	else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP)) {
+	else if (_action.isAction(words_take, words_credit_chip)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_CREDIT_CHIP)) {
 			switch (_game._trigger) {
 			case 0:
@@ -139,7 +139,7 @@ static void room_351_parser() {
 				break;
 
 			case 1:
-				_scene->_hotspots.activate(NOUN_CREDIT_CHIP, false);
+				_scene->_hotspots.activate(words_credit_chip, false);
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 				_game._objects.addToInventory(OBJ_CREDIT_CHIP);
 				break;
@@ -154,30 +154,30 @@ static void room_351_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+	} else if (_action.isAction(words_look, words_view_screen))
 		_vm->_dialogs->show(35110);
-	else if (_action.isAction(VERB_LOOK, NOUN_RIP_IN_FLOOR))
+	else if (_action.isAction(words_look, words_rip_in_floor))
 		_vm->_dialogs->show(35111);
-	else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT))
+	else if (_action.isAction(words_look, words_fire_hydrant))
 		_vm->_dialogs->show(35112);
-	else if (_action.isAction(VERB_LOOK, NOUN_GUARD)) {
+	else if (_action.isAction(words_look, words_guard)) {
 		if (_game._objects[0xF]._roomNumber == 351)
 			_vm->_dialogs->show(35114);
 		else
 			_vm->_dialogs->show(35113);
-	} else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT))
+	} else if (_action.isAction(words_look, words_equipment))
 		_vm->_dialogs->show(35115);
-	else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+	else if (_action.isAction(words_look, words_desk))
 		_vm->_dialogs->show(35116);
-	else if (_action.isAction(VERB_LOOK, NOUN_MACHINE))
+	else if (_action.isAction(words_look, words_machine))
 		_vm->_dialogs->show(35117);
-	else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+	else if (_action.isAction(words_look, words_teleporter))
 		_vm->_dialogs->show(35118);
-	else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+	else if (_action.isAction(words_look, words_control_panel))
 		_vm->_dialogs->show(35119);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(35120);
-	else if (_action.isAction(VERB_LOOK, NOUN_POLE))
+	else if (_action.isAction(words_look, words_pole))
 		_vm->_dialogs->show(35122);
 	else
 		return;
@@ -199,7 +199,7 @@ void room_351_preload() {
 
 	section_3_walker();
 	section_3_interface();
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room352.cpp b/engines/mads/madsv2/nebular/rooms/room352.cpp
index 00bce2de5c7..d3c22e98547 100644
--- a/engines/mads/madsv2/nebular/rooms/room352.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room352.cpp
@@ -73,7 +73,7 @@ static void putArmDown(bool corridorExit, bool doorwayExit) {
 	case 2:
 	{
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
-		int idx = _scene->_dynamicHotspots.add(NOUN_GUARDS_ARM2, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_guards_arm2, words_walkto, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(230, 117), FACING_NORTHWEST);
 		_scene->changeVariant(0);
 	}
@@ -153,7 +153,7 @@ static void room_352_init() {
 	if (_game._objects.isInRoom(OBJ_TAPE_PLAYER)) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 0, 0, 0);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 5);
-		int idx = _scene->_dynamicHotspots.add(NOUN_TAPE_PLAYER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_tape_player, words_walkto, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		local._tapePlayerHotspotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(84, 145), FACING_WEST);
 	}
 
@@ -167,7 +167,7 @@ static void room_352_init() {
 
 	if (_game._objects.isInRoom(OBJ_GUARDS_ARM)) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
-		int idx = _scene->_dynamicHotspots.add(NOUN_GUARDS_ARM2, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_guards_arm2, words_walkto, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(230, 117), FACING_NORTHWEST);
 	} else
 		local._mustPutArmDownFl = true;
@@ -185,10 +185,10 @@ static void room_352_init() {
 static void room_352_pre_parser() {
 	local._leaveRoomFl = false;
 
-	if (_action.isAction(VERB_OPEN, NOUN_VAULT))
+	if (_action.isAction(words_open, words_vault))
 		_game._player.walk(Common::Point(266, 111), FACING_NORTHEAST);
 
-	if (local._vaultOpenFl && !_action.isObject(NOUN_VAULT) && !_action.isObject(NOUN_LAMP) && !_action.isObject(NOUN_OTHER_STUFF) && !_action.isObject(NOUN_YOUR_STUFF)) {
+	if (local._vaultOpenFl && !_action.isObject(words_vault) && !_action.isObject(words_lamp) && !_action.isObject(words_other_stuff) && !_action.isObject(words_your_stuff)) {
 		if (_globals[kHaveYourStuff]) {
 			local._commonSpriteIndex = _globals._spriteIndexes[13];
 			local._commonSequenceIdx = _globals._sequenceIndexes[13];
@@ -224,14 +224,14 @@ static void room_352_pre_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_SCANNER)) {
+	if (_action.isAction(words_put, words_guards_arm2, words_scanner)) {
 		if (_globals[kSexOfRex] == REX_MALE)
 			_game._player.walk(Common::Point(269, 111), FACING_NORTHEAST);
 		else
 			_game._player.walk(Common::Point(271, 111), FACING_NORTHEAST);
 	}
 
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) || _action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_FLOOR)) {
+	if (_action.isAction(words_walk_through, words_doorway) || _action.isAction(words_walk_down, words_corridor_to_south) || _action.isAction(words_put, words_guards_arm2, words_floor)) {
 		if (_game._objects.isInInventory(OBJ_GUARDS_ARM))
 			_game._player.walk(Common::Point(230, 117), FACING_NORTHWEST);
 	}
@@ -244,7 +244,7 @@ static void room_352_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_OPEN, NOUN_VAULT)) {
+	if (_action.isAction(words_open, words_vault)) {
 		if (!local._vaultOpenFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -306,15 +306,15 @@ static void room_352_parser() {
 	bool exit_corridor = false;
 	bool exit_doorway = false;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH)) {
+	if (_action.isAction(words_walk_down, words_corridor_to_south)) {
 		exit_corridor = true;
 	}
 
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) {
+	if (_action.isAction(words_walk_through, words_doorway)) {
 		exit_doorway = true;
 	}
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_FLOOR)) {
+	if (_action.isAction(words_walk_down, words_corridor_to_south) || _action.isAction(words_walk_through, words_doorway) || _action.isAction(words_put, words_guards_arm2, words_floor)) {
 		if (local._mustPutArmDownFl)
 			putArmDown(exit_corridor, exit_doorway);
 		else if (exit_corridor)
@@ -326,7 +326,7 @@ static void room_352_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_GUARDS_ARM2)) {
+	if (_action.isAction(words_take, words_guards_arm2)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_GUARDS_ARM)) {
 			switch (_game._trigger) {
 			case 0:
@@ -365,7 +365,7 @@ static void room_352_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_SCANNER)) {
+	if (_action.isAction(words_put, words_guards_arm2, words_scanner)) {
 		if (!local._vaultOpenFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -428,7 +428,7 @@ static void room_352_parser() {
 				local._vaultOpenFl = true;
 				int idx;
 				if (!_globals[kHaveYourStuff]) {
-					idx = _scene->_dynamicHotspots.add(NOUN_YOUR_STUFF, VERB_WALKTO, -1, Common::Rect(282, 87, 282 + 13, 87 + 7));
+					idx = _scene->_dynamicHotspots.add(words_your_stuff, words_walkto, -1, Common::Rect(282, 87, 282 + 13, 87 + 7));
 					local._hotspot2Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(280, 111), FACING_NORTHEAST);
 					_globals._sequenceIndexes[1] = local._commonSequenceIdx;
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x102));
@@ -437,9 +437,9 @@ static void room_352_parser() {
 					_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x103));
 				}
 
-				idx = _scene->_dynamicHotspots.add(NOUN_OTHER_STUFF, VERB_WALKTO, -1, Common::Rect(282, 48, 282 + 36, 48 + 27));
+				idx = _scene->_dynamicHotspots.add(words_other_stuff, words_walkto, -1, Common::Rect(282, 48, 282 + 36, 48 + 27));
 				local._hotspot1Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
-				idx = _scene->_dynamicHotspots.add(NOUN_LAMP, VERB_WALKTO, -1, Common::Rect(296, 76, 296 + 11, 76 + 17));
+				idx = _scene->_dynamicHotspots.add(words_lamp, words_walkto, -1, Common::Rect(296, 76, 296 + 11, 76 + 17));
 				local._lampHostpotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
 				_game._player._stepEnabled = true;
 			}
@@ -449,7 +449,7 @@ static void room_352_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(VERB_TAKE, NOUN_YOUR_STUFF)) {
+	} else if (_action.isAction(words_take, words_your_stuff)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -496,7 +496,7 @@ static void room_352_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TAKE, NOUN_TAPE_PLAYER) && !_game._objects.isInInventory(OBJ_TAPE_PLAYER)) {
+	} else if (_action.isAction(words_take, words_tape_player) && !_game._objects.isInInventory(OBJ_TAPE_PLAYER)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -534,53 +534,53 @@ static void room_352_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_SCANNER))
+	} else if (_action.isAction(words_look, words_scanner))
 		_vm->_dialogs->show(35210);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITOR)) {
+	else if (_action.isAction(words_look, words_monitor)) {
 		if (_game._storyMode == STORYMODE_NAUGHTY)
 			_vm->_dialogs->show(35211);
 		else
 			_vm->_dialogs->show(35212);
-	} else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+	} else if (_action.isAction(words_look, words_display))
 		_vm->_dialogs->show(35213);
-	else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
+	else if (_action.isAction(words_look, words_statue))
 		_vm->_dialogs->show(35214);
-	else if (_action.isAction(VERB_LOOK, NOUN_TAPE_PLAYER) && (_action._savedFields._mainObjectSource == 4))
+	else if (_action.isAction(words_look, words_tape_player) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(35215);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(35216);
-	else if (_action.isAction(VERB_LOOK, NOUN_GUARDS_ARM2) && (_action._savedFields._mainObjectSource == 4))
+	else if (_action.isAction(words_look, words_guards_arm2) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(35217);
-	else if (_action.isAction(VERB_LOOK, NOUN_IRONING_BOARD))
+	else if (_action.isAction(words_look, words_ironing_board))
 		_vm->_dialogs->show(35218);
-	else if (_action.isAction(VERB_LOOK, NOUN_CLOCK))
+	else if (_action.isAction(words_look, words_clock))
 		_vm->_dialogs->show(35219);
-	else if (_action.isAction(VERB_LOOK, NOUN_GAUGE))
+	else if (_action.isAction(words_look, words_gauge))
 		_vm->_dialogs->show(35220);
-	else if (_action.isAction(VERB_LOOK, NOUN_VAULT)) {
+	else if (_action.isAction(words_look, words_vault)) {
 		if (!local._vaultOpenFl)
 			_vm->_dialogs->show(35221);
-	} else if (_action.isAction(VERB_LOOK, NOUN_YOUR_STUFF))
+	} else if (_action.isAction(words_look, words_your_stuff))
 		_vm->_dialogs->show(35222);
-	else if (_action.isAction(VERB_LOOK, NOUN_OTHER_STUFF))
+	else if (_action.isAction(words_look, words_other_stuff))
 		_vm->_dialogs->show(35223);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(35224);
-	else if (_action.isAction(VERB_TAKE, NOUN_OTHER_STUFF))
+	else if (_action.isAction(words_take, words_other_stuff))
 		_vm->_dialogs->show(35226);
-	else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+	else if (_action.isAction(words_look, words_desk))
 		_vm->_dialogs->show(35229);
-	else if (_action.isAction(VERB_LOOK, NOUN_GUARD))
+	else if (_action.isAction(words_look, words_guard))
 		_vm->_dialogs->show(35230);
-	else if (_action.isAction(VERB_LOOK, NOUN_DOORWAY))
+	else if (_action.isAction(words_look, words_doorway))
 		_vm->_dialogs->show(35231);
-	else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
+	else if (_action.isAction(words_look, words_table))
 		_vm->_dialogs->show(35232);
-	else if (_action.isAction(VERB_LOOK, NOUN_PROJECTOR))
+	else if (_action.isAction(words_look, words_projector))
 		_vm->_dialogs->show(35233);
-	else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+	else if (_action.isAction(words_look, words_support))
 		_vm->_dialogs->show(35234);
-	else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_MONITOR))
+	else if (_action.isAction(words_look, words_security_monitor))
 		_vm->_dialogs->show(35235);
 	else
 		return;
@@ -608,10 +608,10 @@ void room_352_preload() {
 
 	section_3_walker();
 	section_3_interface();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_YOUR_STUFF);
-	_scene->addActiveVocab(NOUN_OTHER_STUFF);
-	_scene->addActiveVocab(NOUN_LAMP);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_your_stuff);
+	_scene->addActiveVocab(words_other_stuff);
+	_scene->addActiveVocab(words_lamp);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room353.cpp b/engines/mads/madsv2/nebular/rooms/room353.cpp
index a6bf5b49c77..470f5b9204f 100644
--- a/engines/mads/madsv2/nebular/rooms/room353.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room353.cpp
@@ -55,25 +55,25 @@ static void room_353_init() {
 static void room_353_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35315);
-	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+	else if (_action.isAction(words_walk_through, words_doorway))
 		_scene->_nextSceneId = 352;
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_walk_down, words_corridor_to_south))
 		_scene->_nextSceneId = 354;
-	else if (_action.isAction(VERB_LOOK, NOUN_ROCK_CHUNK))
+	else if (_action.isAction(words_look, words_rock_chunk))
 		_vm->_dialogs->show(35310);
-	else if (_action.isAction(VERB_LOOK, NOUN_PIPES) || _action.isAction(VERB_LOOK, NOUN_PIPE))
+	else if (_action.isAction(words_look, words_pipes) || _action.isAction(words_look, words_pipe))
 		_vm->_dialogs->show(35311);
-	else if (_action.isAction(VERB_LOOK, NOUN_BROKEN_BEAM))
+	else if (_action.isAction(words_look, words_broken_beam))
 		_vm->_dialogs->show(35312);
-	else if (_action.isAction(VERB_LOOK, NOUN_DOORWAY))
+	else if (_action.isAction(words_look, words_doorway))
 		_vm->_dialogs->show(35313);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(35314);
-	else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+	else if (_action.isAction(words_look, words_floor))
 		_vm->_dialogs->show(35316);
-	else if (_action.isAction(VERB_LOOK, NOUN_CEILING))
+	else if (_action.isAction(words_look, words_ceiling))
 		_vm->_dialogs->show(35317);
-	else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(35318);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room354.cpp b/engines/mads/madsv2/nebular/rooms/room354.cpp
index c641ba0de86..401201ef3e8 100644
--- a/engines/mads/madsv2/nebular/rooms/room354.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room354.cpp
@@ -56,41 +56,41 @@ static void room_354_init() {
 }
 
 static void room_354_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+	if (_action.isAction(words_walk_down, words_corridor_to_south))
 		_game._player._walkOffScreenSceneId = 401;
 }
 
 static void room_354_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35414);
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+	else if (_action.isAction(words_walk_down, words_corridor_to_north)) {
 		_game._player.startWalking(Common::Point(208, 0), FACING_NORTHEAST);
 		_game._player._walkOffScreenSceneId = 353;
-	} else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	} else if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_scene->_nextSceneId = 361;
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_scene->_nextSceneId = 316;
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_walk_down, words_corridor_to_south))
 		_scene->_nextSceneId = 401;
-	else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS))
+	else if (_action.isAction(words_look, words_controls))
 		_vm->_dialogs->show(35410);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGNAL))
+	else if (_action.isAction(words_look, words_signal))
 		_vm->_dialogs->show(35411);
-	else if (_action.isAction(VERB_LOOK, NOUN_CATWALK))
+	else if (_action.isAction(words_look, words_catwalk))
 		_vm->_dialogs->show(35412);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_DUCT))
+	else if (_action.isAction(words_look, words_air_duct))
 		_vm->_dialogs->show(35413);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+	else if (_action.isAction(words_look, words_corridor_to_north))
 		_vm->_dialogs->show(35415);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(35416);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(35417);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(35418);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+	else if (_action.isAction(words_look, words_debris))
 		_vm->_dialogs->show(35419);
-	else if (_action.isAction(VERB_LOOK, NOUN_GUARD))
+	else if (_action.isAction(words_look, words_guard))
 		_vm->_dialogs->show(35420);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room357.cpp b/engines/mads/madsv2/nebular/rooms/room357.cpp
index da68f11a165..4dc283d1e33 100644
--- a/engines/mads/madsv2/nebular/rooms/room357.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room357.cpp
@@ -50,41 +50,41 @@ static void room_357_init() {
 }
 
 static void room_357_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 318;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 358;
 }
 
 static void room_357_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35715);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(35710);
-	else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT))
+	else if (_action.isAction(words_climb_into, words_air_vent))
 		_vm->_dialogs->show(35711);
-	else if (_action.isAction(VERB_LOOK, NOUN_BED))
+	else if (_action.isAction(words_look, words_bed))
 		_vm->_dialogs->show(35712);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(35713);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+	else if (_action.isAction(words_look, words_toilet))
 		_vm->_dialogs->show(35714);
-	else if (_action.isAction(VERB_LOOK, NOUN_CELL_WALL))
+	else if (_action.isAction(words_look, words_cell_wall))
 		_vm->_dialogs->show(35716);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
+	else if (_action.isAction(words_look, words_light))
 		_vm->_dialogs->show(35717);
-	else if (_action.isAction(VERB_LOOK, NOUN_RIP_IN_FLOOR))
+	else if (_action.isAction(words_look, words_rip_in_floor))
 		_vm->_dialogs->show(35718);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+	else if (_action.isAction(words_look, words_debris))
 		_vm->_dialogs->show(35719);
-	else if (_action.isAction(VERB_TAKE, NOUN_DEBRIS))
+	else if (_action.isAction(words_take, words_debris))
 		_vm->_dialogs->show(35720);
-	else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(35721);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(35722);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(35723);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room358.cpp b/engines/mads/madsv2/nebular/rooms/room358.cpp
index 91aed3445b9..b985b6a952e 100644
--- a/engines/mads/madsv2/nebular/rooms/room358.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room358.cpp
@@ -47,29 +47,29 @@ static void room_358_init() {
 }
 
 static void room_358_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 357;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 359;
 }
 
 static void room_358_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35815);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(35810);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(35811);
-	else if (_action.isAction(VERB_LOOK, NOUN_BED))
+	else if (_action.isAction(words_look, words_bed))
 		_vm->_dialogs->show(35812);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(35813);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+	else if (_action.isAction(words_look, words_toilet))
 		_vm->_dialogs->show(35814);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR) || _action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_corridor) || _action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(35816);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(35817);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room359.cpp b/engines/mads/madsv2/nebular/rooms/room359.cpp
index 0d702690544..e2203e260fd 100644
--- a/engines/mads/madsv2/nebular/rooms/room359.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room359.cpp
@@ -54,7 +54,7 @@ static void room_359_init() {
 
 	if (_game._objects.isInRoom(OBJ_SECURITY_CARD)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		local._cardHotspotId = _scene->_dynamicHotspots.add(NOUN_SECURITY_CARD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		local._cardHotspotId = _scene->_dynamicHotspots.add(words_security_card, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._cardHotspotId, Common::Point(107, 107), FACING_SOUTH);
 	}
 
@@ -67,10 +67,10 @@ static void room_359_init() {
 }
 
 static void room_359_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 358;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 360;
 }
 
@@ -80,7 +80,7 @@ static void room_359_parser() {
 			_vm->_dialogs->show(35914);
 		else
 			_vm->_dialogs->show(35915);
-	} else if (_action.isAction(VERB_TAKE, NOUN_SECURITY_CARD)) {
+	} else if (_action.isAction(words_take, words_security_card)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_SECURITY_CARD)) {
 			switch (_game._trigger) {
 			case 0:
@@ -124,43 +124,43 @@ static void room_359_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_BLOODY_CELL_WALL))
+	} else if (_action.isAction(words_look, words_bloody_cell_wall))
 		_vm->_dialogs->show(35910);
-	else if (_action.isAction(VERB_LOOK, NOUN_BED))
+	else if (_action.isAction(words_look, words_bed))
 		_vm->_dialogs->show(35911);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(35912);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+	else if (_action.isAction(words_look, words_toilet))
 		_vm->_dialogs->show(35913);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(35916);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(35917);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIMB))
+	else if (_action.isAction(words_look, words_limb))
 		_vm->_dialogs->show(35918);
-	else if (_action.isAction(VERB_TAKE, NOUN_LIMB))
+	else if (_action.isAction(words_take, words_limb))
 		_vm->_dialogs->show(35919);
-	else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_CARD) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (_action.isAction(words_look, words_security_card) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(35921);
-	else if (_action.isAction(VERB_LOOK, NOUN_BLOOD_STAIN)) {
+	else if (_action.isAction(words_look, words_blood_stain)) {
 		if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 			_vm->_dialogs->show(35922);
 		else
 			_vm->_dialogs->show(35923);
-	} else if (_action.isAction(VERB_LOOK, NOUN_WALL_BOARD))
+	} else if (_action.isAction(words_look, words_wall_board))
 		_vm->_dialogs->show(35924);
-	else if (_action.isAction(VERB_TAKE, NOUN_WALL_BOARD))
+	else if (_action.isAction(words_take, words_wall_board))
 		_vm->_dialogs->show(35925);
-	else if (_action.isAction(VERB_LOOK, NOUN_RIP_IN_FLOOR))
+	else if (_action.isAction(words_look, words_rip_in_floor))
 		_vm->_dialogs->show(35926);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR))
+	else if (_action.isAction(words_look, words_corridor))
 		_vm->_dialogs->show(35927);
-	else if (_action.isAction(VERB_LOOK, NOUN_FLOOR)) {
+	else if (_action.isAction(words_look, words_floor)) {
 		if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 			_vm->_dialogs->show(35928);
 		else
 			_vm->_dialogs->show(35929);
-	} else if (_action.isAction(VERB_OPEN, NOUN_AIR_VENT) || _action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	} else if (_action.isAction(words_open, words_air_vent) || _action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(36016);
 	else
 		return;
@@ -179,7 +179,7 @@ void room_359_preload() {
 
 	section_3_walker();
 	section_3_interface();
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room360.cpp b/engines/mads/madsv2/nebular/rooms/room360.cpp
index 9487fb1a638..d12e7473aaf 100644
--- a/engines/mads/madsv2/nebular/rooms/room360.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room360.cpp
@@ -47,31 +47,31 @@ static void room_360_init() {
 }
 
 static void room_360_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 359;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 361;
 }
 
 static void room_360_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(36015);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(36010);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(36011);
-	else if (_action.isAction(VERB_LOOK, NOUN_BED))
+	else if (_action.isAction(words_look, words_bed))
 		_vm->_dialogs->show(36012);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(36013);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+	else if (_action.isAction(words_look, words_toilet))
 		_vm->_dialogs->show(36014);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(36016);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR))
+	else if (_action.isAction(words_look, words_corridor))
 		_vm->_dialogs->show(36017);
-	else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(36018);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room361.cpp b/engines/mads/madsv2/nebular/rooms/room361.cpp
index 4e577600b08..8e34123acdb 100644
--- a/engines/mads/madsv2/nebular/rooms/room361.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room361.cpp
@@ -372,43 +372,43 @@ static void room_361_daemon() {
 }
 
 static void room_361_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 360;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 354;
 }
 
 static void room_361_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(36119);
-	else if (_action.isAction(VERB_SIT_AT, NOUN_DESK)) {
+	else if (_action.isAction(words_sit_at, words_desk)) {
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.addQuote(252, 0, 120);
-	} else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+	} else if (_action.isAction(words_climb_into, words_air_vent)) {
 		if (_globals[kSexOfRex] == REX_FEMALE)
 			handleRoxAction();
 		else
 			handleRexAction();
-	} else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+	} else if (_action.isAction(words_look, words_desk))
 		_vm->_dialogs->show(36110);
-	else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(36111);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHTING_FIXTURE) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTING_FIXTURE))
+	else if (_action.isAction(words_look, words_lighting_fixture) || _action.isAction(words_stare_at, words_lighting_fixture))
 		_vm->_dialogs->show(36112);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHTS) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTS))
+	else if (_action.isAction(words_look, words_lights) || _action.isAction(words_stare_at, words_lights))
 		_vm->_dialogs->show(36113);
-	else if (_action.isAction(VERB_TAKE, NOUN_LIGHTS))
+	else if (_action.isAction(words_take, words_lights))
 		_vm->_dialogs->show(36114);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHT_BULB) || _action.isAction(VERB_STARE_AT, NOUN_LIGHT_BULB))
+	else if (_action.isAction(words_look, words_light_bulb) || _action.isAction(words_stare_at, words_light_bulb))
 		_vm->_dialogs->show(36115);
-	else if (_action.isAction(VERB_TAKE, NOUN_LIGHT_BULB))
+	else if (_action.isAction(words_take, words_light_bulb))
 		_vm->_dialogs->show(36116);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(36117);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(36118);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+	else if (_action.isAction(words_look, words_air_vent))
 		_vm->_dialogs->show(36120);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room366.cpp b/engines/mads/madsv2/nebular/rooms/room366.cpp
index 18a059c1f42..a116dde344d 100644
--- a/engines/mads/madsv2/nebular/rooms/room366.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room366.cpp
@@ -39,15 +39,15 @@ static void room_366_init() {
 }
 
 static void room_366_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 302;
-	else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+	else if (_action.isAction(words_open, words_grate)) {
 		if (_game._visitedScenes.exists(316))
 			_vm->_dialogs->show(36612);
 		else
 			_vm->_dialogs->show(36613);
 		_scene->_nextSceneId = 316;
-	} else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+	} else if (_action.isAction(words_look_through, words_grate)) {
 		if (_game._visitedScenes.exists(321))
 			_vm->_dialogs->show(36611);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room387.cpp b/engines/mads/madsv2/nebular/rooms/room387.cpp
index a61168a46ee..cb619a4f4ac 100644
--- a/engines/mads/madsv2/nebular/rooms/room387.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room387.cpp
@@ -40,11 +40,11 @@ static void room_387_init() {
 }
 
 static void room_387_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE))
+	else if (_action.isAction(words_look_through, words_grate))
 		_vm->_dialogs->show(38710);
-	else if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+	else if (_action.isAction(words_open, words_grate))
 		_vm->_dialogs->show(38711);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room388.cpp b/engines/mads/madsv2/nebular/rooms/room388.cpp
index 8fccc6ca4eb..a377060198b 100644
--- a/engines/mads/madsv2/nebular/rooms/room388.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room388.cpp
@@ -36,7 +36,7 @@ static void room_388_init() {
 	_scene->_userInterface.setup(kInputLimitedSentences);
 
 	if (_globals[kAfterHavoc])
-		_scene->_hotspots.activate(NOUN_SAUROPOD, false);
+		_scene->_hotspots.activate(words_sauropod, false);
 	else {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', 0));
 		_globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
@@ -51,9 +51,9 @@ static void room_388_init() {
 }
 
 static void room_388_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(VERB_TALKTO, NOUN_SAUROPOD)) {
+	else if (_action.isAction(words_talkto, words_sauropod)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -75,12 +75,12 @@ static void room_388_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+	} else if (_action.isAction(words_look_through, words_grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(38811);
 		else
 			_vm->_dialogs->show(38810);
-	} else if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+	} else if (_action.isAction(words_open, words_grate))
 		_vm->_dialogs->show(38812);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room389.cpp b/engines/mads/madsv2/nebular/rooms/room389.cpp
index f206c0a71ec..f2f0c5291b3 100644
--- a/engines/mads/madsv2/nebular/rooms/room389.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room389.cpp
@@ -47,7 +47,7 @@ static void room_389_init() {
 	local._circularQuoteId = 0x159;
 
 	if (_globals[kAfterHavoc])
-		_scene->_hotspots.activate(NOUN_MONSTER, false);
+		_scene->_hotspots.activate(words_monster, false);
 	else {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('m', -1));
 		_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
@@ -74,9 +74,9 @@ static void room_389_daemon() {
 }
 
 static void room_389_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(VERB_TALKTO, NOUN_MONSTER)) {
+	else if (_action.isAction(words_talkto, words_monster)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -94,7 +94,7 @@ static void room_389_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+	} else if (_action.isAction(words_look_through, words_grate)) {
 		if (_globals[kAfterHavoc]) {
 			if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 				_vm->_dialogs->show(38911);
@@ -102,7 +102,7 @@ static void room_389_parser() {
 				_vm->_dialogs->show(38912);
 		} else
 			_vm->_dialogs->show(38910);
-	} else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+	} else if (_action.isAction(words_open, words_grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(38914);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room390.cpp b/engines/mads/madsv2/nebular/rooms/room390.cpp
index a3821aa916b..49ed8757209 100644
--- a/engines/mads/madsv2/nebular/rooms/room390.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room390.cpp
@@ -40,11 +40,11 @@ static void room_390_init() {
 }
 
 static void room_390_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE))
+	else if (_action.isAction(words_look_through, words_grate))
 		_vm->_dialogs->show(39010);
-	else if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+	else if (_action.isAction(words_open, words_grate))
 		_vm->_dialogs->show(39011);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room391.cpp b/engines/mads/madsv2/nebular/rooms/room391.cpp
index 4b486447e9c..43a51780272 100644
--- a/engines/mads/madsv2/nebular/rooms/room391.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room391.cpp
@@ -39,9 +39,9 @@ static void room_391_init() {
 }
 
 static void room_391_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+	else if (_action.isAction(words_open, words_grate)) {
 		if (_globals[kKickedIn391Grate])
 			_vm->_dialogs->show(39113);
 		else {
@@ -53,7 +53,7 @@ static void room_391_parser() {
 			_scene->_nextSceneId = 361;
 		else
 			_scene->_nextSceneId = 311;
-	} else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+	} else if (_action.isAction(words_look_through, words_grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(39111);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room399.cpp b/engines/mads/madsv2/nebular/rooms/room399.cpp
index f82ace85467..e0629c1bf65 100644
--- a/engines/mads/madsv2/nebular/rooms/room399.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room399.cpp
@@ -39,9 +39,9 @@ static void room_399_init() {
 }
 
 static void room_399_parser() {
-	if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+	if (_action.isAction(words_return_to, words_air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+	else if (_action.isAction(words_look_through, words_grate)) {
 		if (_globals[kAfterHavoc]) {
 			if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 				_vm->_dialogs->show(38911);
@@ -49,7 +49,7 @@ static void room_399_parser() {
 				_vm->_dialogs->show(38912);
 		} else
 			_vm->_dialogs->show(38910);
-	} else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+	} else if (_action.isAction(words_open, words_grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(38914);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room401.cpp b/engines/mads/madsv2/nebular/rooms/room401.cpp
index 9ba2c8ee62e..e2405fa3737 100644
--- a/engines/mads/madsv2/nebular/rooms/room401.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room401.cpp
@@ -94,15 +94,15 @@ static void room_401_daemon() {
 }
 
 static void room_401_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+	if (_action.isAction(words_walk_down, words_corridor_to_north)) {
 		_game._player.walk(Common::Point(149, 89), FACING_NORTH);
 		local._northFl = false;
 	}
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !local._northFl)
+	if (_action.isAction(words_walk_down, words_corridor_to_south) && !local._northFl)
 		_game._player._walkOffScreenSceneId = 405;
 
-	if (_action.isAction(VERB_TAKE))
+	if (_action.isAction(words_take))
 		_game._player._needToWalk = false;
 
 	if (_game._player._needToWalk && local._northFl) {
@@ -143,23 +143,23 @@ static void room_401_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_WALK_INTO, NOUN_BAR)) {
+	if (_action.isAction(words_walk_into, words_bar)) {
 		if (!local._northFl)
 			_scene->_nextSceneId = 402;
-	} else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH))
+	} else if (_action.isAction(words_walk_down, words_corridor_to_north))
 		_scene->_nextSceneId = 354;
-	else if (_action.isAction(VERB_LOOK, NOUN_SCANNER)) {
+	else if (_action.isAction(words_look, words_scanner)) {
 		if (_globals[kHasBeenScanned])
 			_vm->_dialogs->show(40111);
 		else
 			_vm->_dialogs->show(40110);
-	} else if (_action.isAction(VERB_LOOK, NOUN_BAR))
+	} else if (_action.isAction(words_look, words_bar))
 		_vm->_dialogs->show(40112);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+	else if (_action.isAction(words_look, words_sign))
 		_vm->_dialogs->show(40113);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(40114);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+	else if (_action.isAction(words_look, words_corridor_to_north))
 		_vm->_dialogs->show(40115);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40116);
diff --git a/engines/mads/madsv2/nebular/rooms/room402.cpp b/engines/mads/madsv2/nebular/rooms/room402.cpp
index 4696f090cb5..f81e6d9a36a 100644
--- a/engines/mads/madsv2/nebular/rooms/room402.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room402.cpp
@@ -638,14 +638,14 @@ static void room_402_init() {
 		_globals._sequenceIndexes[14] = _scene->_sequences.startCycle(_globals._spriteIndexes[14], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 7);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[14], Common::Point(210, 80));
-		int idx = _scene->_dynamicHotspots.add(NOUN_REPAIR_LIST, VERB_LOOK_AT, _globals._sequenceIndexes[14], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_repair_list, words_look_at, _globals._sequenceIndexes[14], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_NONE);
 	}
 
 	{
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 	}
 
@@ -653,7 +653,7 @@ static void room_402_init() {
 		_globals._sequenceIndexes[15] = _scene->_sequences.startCycle(_globals._spriteIndexes[15], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[15], 8);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[15], Common::Point(250, 80));
-		int idx = _scene->_dynamicHotspots.add(NOUN_CREDIT_CHIP, VERB_TAKE, _globals._sequenceIndexes[15], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_credit_chip, words_take, _globals._sequenceIndexes[15], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_NONE);
 	}
 
@@ -715,7 +715,7 @@ static void room_402_daemon() {
 			_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 0, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 3, 4);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
-			int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 			local._bartenderTalking = true;
 			if (local._talkTimer > 1000)
@@ -728,7 +728,7 @@ static void room_402_daemon() {
 	if ((_game._trigger == 101) && local._bartenderTalking) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
 		local._bartenderSteady = true;
@@ -865,7 +865,7 @@ static void room_402_daemon() {
 			_globals._sequenceIndexes[15] = _scene->_sequences.startCycle(_globals._spriteIndexes[15], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[15], 8);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[15], Common::Point(250, 80));
-			int idx = _scene->_dynamicHotspots.add(NOUN_CREDIT_CHIP, VERB_TAKE, _globals._sequenceIndexes[15], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(words_credit_chip, words_take, _globals._sequenceIndexes[15], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_NONE);
 		}
 		break;
@@ -899,7 +899,7 @@ static void room_402_daemon() {
 		int seqIdx = _globals._sequenceIndexes[12];
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 		local._bartenderSteady = true;
-		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], seqIdx);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
@@ -982,7 +982,7 @@ static void room_402_daemon() {
 	{
 		_scene->_sequences.remove(_globals._sequenceIndexes[9]);
 		_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
 		local._bartenderSteady = true;
@@ -1081,7 +1081,7 @@ static void room_402_daemon() {
 			{
 				_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[10], false, 4);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
-				int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
+				int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 				local._bartenderHandsHips = true;
 			}
@@ -1091,7 +1091,7 @@ static void room_402_daemon() {
 			{
 				_globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, 2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 8);
-				int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[11], Common::Rect(0, 0, 0, 0));
+				int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[11], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 				local._bartenderLooksLeft = true;
 			}
@@ -1101,7 +1101,7 @@ static void room_402_daemon() {
 			{
 				_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-				int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+				int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 				local._bartenderSteady = true;
 			}
@@ -1400,7 +1400,7 @@ static void room_402_daemon() {
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 			local._bartenderHandsHips = false;
 			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
-			int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 			local._bartenderSteady = true;
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
@@ -1408,7 +1408,7 @@ static void room_402_daemon() {
 			_scene->_sequences.remove(_globals._sequenceIndexes[11]);
 			local._bartenderLooksLeft = false;
 			_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
-			int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+			int idx = _scene->_dynamicHotspots.add(words_bartender, words_walkto, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
 			local._bartenderSteady = true;
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
@@ -1804,29 +1804,29 @@ static void room_402_daemon() {
 }
 
 static void room_402_pre_parser() {
-	if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && (_game._player._prepareWalkPos.x != 248))
+	if (_action.isAction(words_sit_on, words_bar_stool) && (_game._player._prepareWalkPos.x != 248))
 		_game._player.walk(Common::Point(232, 112), FACING_EAST);
 
-	if (_action.isAction(VERB_WALKTO, NOUN_WOMAN_ON_BALCONY))
+	if (_action.isAction(words_walkto, words_woman_on_balcony))
 		_game._player._needToWalk = _game._player._readyToWalk;
 
-	if (!local._roxOnStool && _action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
+	if (!local._roxOnStool && _action.isAction(words_take, words_credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
 		_game._player.walk(Common::Point(246, 108), FACING_NORTH);
 
-	if (_action.isAction(VERB_TAKE))
+	if (_action.isAction(words_take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !local._roxOnStool)
+	if (_action.isAction(words_take, words_credit_chip) && !local._roxOnStool)
 		_game._player._needToWalk = true;
 
 	if (local._roxOnStool) {
-		if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_BAR_STOOL) || _action.isAction(VERB_TALKTO))
+		if (_action.isAction(words_look) || _action.isObject(words_bar_stool) || _action.isAction(words_talkto))
 			_game._player._needToWalk = false;
 
-		if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) || _action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP))
+		if (_action.isAction(words_take, words_repair_list) || _action.isAction(words_take, words_credit_chip))
 			_game._player._needToWalk = false;
 
-		if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) || _action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_ALCOVE))
+		if (_action.isAction(words_talkto, words_woman_in_chair) || _action.isAction(words_talkto, words_woman_in_alcove))
 			_game._player._needToWalk = _game._player._readyToWalk;
 
 		if (_game._player._needToWalk) {
@@ -1838,22 +1838,22 @@ static void room_402_pre_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && !local._roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
+	if (_action.isAction(words_take, words_repair_list) && !local._roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
 		_game._player.walk(Common::Point(191, 99), FACING_NORTHEAST);
 
-	if (_action.isAction(VERB_TALKTO, NOUN_BARTENDER) && !local._roxOnStool)
+	if (_action.isAction(words_talkto, words_bartender) && !local._roxOnStool)
 		_game._player.walk(Common::Point(228, 83), FACING_SOUTH);
 
-	if (_action.isAction(VERB_TALKTO, NOUN_REPAIR_WOMAN) && !local._roxOnStool)
+	if (_action.isAction(words_talkto, words_repair_woman) && !local._roxOnStool)
 		_game._player.walk(Common::Point(208, 102), FACING_NORTHEAST);
 }
 
 static void room_402_parser() {
-	if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && local._roxOnStool) {
+	if (_action.isAction(words_take, words_repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && local._roxOnStool) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 77);
 		_game._player._needToWalk = false;
-	} else if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !local._roxOnStool) {
+	} else if (_action.isAction(words_take, words_repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !local._roxOnStool) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
@@ -1875,11 +1875,11 @@ static void room_402_parser() {
 		_game._player._stepEnabled = true;
 	} else if (_game._screenObjects._inputMode == kInputConversation)
 		handleDialogs();
-	else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_walk_into, words_corridor_to_south))
 		_scene->_nextSceneId = 401;
-	else if (_action.isAction(VERB_WALK_ONTO, NOUN_DANCE_FLOOR))
+	else if (_action.isAction(words_walk_onto, words_dance_floor))
 		; // just... nothing
-	else if (_action.isAction(VERB_TALKTO, NOUN_REPAIR_WOMAN)) {
+	else if (_action.isAction(words_talkto, words_repair_woman)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -1959,26 +1959,26 @@ static void room_402_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && !local._firstTalkToGirlInChair) {
+	} else if (_action.isAction(words_talkto, words_woman_in_chair) && !local._firstTalkToGirlInChair) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1D7));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(150, 39);
 		_game._player._stepEnabled = false;
 		local._firstTalkToGirlInChair = true;
-	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && local._firstTalkToGirlInChair) {
+	} else if (_action.isAction(words_talkto, words_woman_in_chair) && local._firstTalkToGirlInChair) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1DB));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(150, 42);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_ALCOVE) || _action.isAction(VERB_WALKTO, NOUN_WOMAN_IN_ALCOVE)) {
+	} else if (_action.isAction(words_talkto, words_woman_in_alcove) || _action.isAction(words_walkto, words_woman_in_alcove)) {
 		_scene->_kernelMessages.add(Common::Point(102, 48), 0xFBFA, 0, 0, 120, _game.getQuote(0x1DE));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(120, 44);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && (_game._player._targetPos.x == 248)) {
+	} else if (_action.isAction(words_sit_on, words_bar_stool) && (_game._player._targetPos.x == 248)) {
 		_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 120, _game.getQuote(0x20D));
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x20E));
-	} else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && !local._roxOnStool && (_game._player._targetPos.x != 248)) {
+	} else if (_action.isAction(words_sit_on, words_bar_stool) && !local._roxOnStool && (_game._player._targetPos.x != 248)) {
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
@@ -1986,11 +1986,11 @@ static void room_402_parser() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && local._roxOnStool) {
+	} else if (_action.isAction(words_take, words_credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && local._roxOnStool) {
 		local._roxMode = 20;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 92);
-	} else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !local._roxOnStool) {
+	} else if (_action.isAction(words_take, words_credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !local._roxOnStool) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -2001,7 +2001,7 @@ static void room_402_parser() {
 		_scene->_sequences.setScale(_globals._sequenceIndexes[22], 88);
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[22], SEQUENCE_TRIGGER_EXPIRE, 0, 104);
-	} else if (_action.isAction(VERB_TALKTO, NOUN_BARTENDER)) {
+	} else if (_action.isAction(words_talkto, words_bartender)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -2113,66 +2113,66 @@ static void room_402_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_DANCE_FLOOR))
+	} else if (_action.isAction(words_look, words_dance_floor))
 		_vm->_dialogs->show(40210);
-	else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) {
+	else if (_action.isAction(words_look, words_teleporter)) {
 		if (_globals[kSomeoneHasExploded])
 			_vm->_dialogs->show(40212);
 		else
 			_vm->_dialogs->show(40211);
-	} else if (_action.isAction(VERB_LOOK, NOUN_BAR))
+	} else if (_action.isAction(words_look, words_bar))
 		_vm->_dialogs->show(40213);
-	else if (_action.isAction(VERB_LOOK, NOUN_BARTENDER))
+	else if (_action.isAction(words_look, words_bartender))
 		_vm->_dialogs->show(40214);
-	else if (_action.isAction(VERB_LOOK, NOUN_WOMAN_IN_ALCOVE))
+	else if (_action.isAction(words_look, words_woman_in_alcove))
 		_vm->_dialogs->show(40215);
-	else if (_action.isAction(VERB_LOOK, NOUN_WOMAN_ON_BALCONY))
+	else if (_action.isAction(words_look, words_woman_on_balcony))
 		_vm->_dialogs->show(40216);
-	else if (_action.isAction(VERB_LOOK, NOUN_WOMAN_IN_CHAIR))
+	else if (_action.isAction(words_look, words_woman_in_chair))
 		_vm->_dialogs->show(40217);
-	else if (_action.isAction(VERB_LOOK, NOUN_REPAIR_WOMAN))
+	else if (_action.isAction(words_look, words_repair_woman))
 		_vm->_dialogs->show(40218);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(40219);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40220);
-	else if (_action.isAction(VERB_LOOK, NOUN_WOMEN))
+	else if (_action.isAction(words_look, words_women))
 		_vm->_dialogs->show(40221);
-	else if (_action.isAction(VERB_PUSH, NOUN_REPAIR_WOMAN) || _action.isAction(VERB_PULL, NOUN_REPAIR_WOMAN))
+	else if (_action.isAction(words_push, words_repair_woman) || _action.isAction(words_pull, words_repair_woman))
 		_vm->_dialogs->show(40222);
-	else if (_action.isAction(VERB_TALKTO, NOUN_WOMEN))
+	else if (_action.isAction(words_talkto, words_women))
 		_vm->_dialogs->show(40223);
-	else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_ON_BALCONY))
+	else if (_action.isAction(words_talkto, words_woman_on_balcony))
 		_vm->_dialogs->show(40224);
-	else if (_action.isAction(VERB_LOOK, NOUN_RAILING))
+	else if (_action.isAction(words_look, words_railing))
 		_vm->_dialogs->show(40225);
-	else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
+	else if (_action.isAction(words_look, words_table))
 		_vm->_dialogs->show(40226);
-	else if (_action.isAction(VERB_TAKE, NOUN_TABLE))
+	else if (_action.isAction(words_take, words_table))
 		_vm->_dialogs->show(40227);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+	else if (_action.isAction(words_look, words_sign))
 		_vm->_dialogs->show(40228);
-	else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
+	else if (_action.isAction(words_take, words_sign))
 		_vm->_dialogs->show(40229);
-	else if (_action.isAction(VERB_LOOK, NOUN_BAR_STOOL))
+	else if (_action.isAction(words_look, words_bar_stool))
 		_vm->_dialogs->show(40230);
-	else if (_action.isAction(VERB_TAKE, NOUN_BAR_STOOL))
+	else if (_action.isAction(words_take, words_bar_stool))
 		_vm->_dialogs->show(40231);
-	else if (_action.isAction(VERB_LOOK, NOUN_CACTUS))
+	else if (_action.isAction(words_look, words_cactus))
 		_vm->_dialogs->show(40232);
-	else if (_action.isAction(VERB_TAKE, NOUN_CACTUS))
+	else if (_action.isAction(words_take, words_cactus))
 		_vm->_dialogs->show(40233);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISCO_BALL))
+	else if (_action.isAction(words_look, words_disco_ball))
 		_vm->_dialogs->show(40234);
-	else if (_action.isAction(VERB_LOOK, NOUN_UPPER_DANCE_FLOOR))
+	else if (_action.isAction(words_look, words_upper_dance_floor))
 		_vm->_dialogs->show(40235);
-	else if (_action.isAction(VERB_LOOK, NOUN_TREE))
+	else if (_action.isAction(words_look, words_tree))
 		_vm->_dialogs->show(40236);
-	else if (_action.isAction(VERB_LOOK, NOUN_PLANT))
+	else if (_action.isAction(words_look, words_plant))
 		_vm->_dialogs->show(40237);
-	else if (_action.isAction(VERB_TAKE, NOUN_PLANT))
+	else if (_action.isAction(words_take, words_plant))
 		_vm->_dialogs->show(40238);
-	else if (_action.isAction(VERB_LOOK, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST))
+	else if (_action.isAction(words_look, words_repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST))
 		_vm->_dialogs->show(40239);
 	else
 		return;
@@ -2227,15 +2227,15 @@ void room_402_preload() {
 	section_4_walker();
 	section_4_interface();
 
-	_scene->addActiveVocab(NOUN_BARTENDER);
-	_scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
-	_scene->addActiveVocab(VERB_DRINK);
-	_scene->addActiveVocab(NOUN_BINOCULARS);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_CREDIT_CHIP);
-	_scene->addActiveVocab(VERB_TAKE);
-	_scene->addActiveVocab(NOUN_REPAIR_LIST);
-	_scene->addActiveVocab(VERB_LOOK_AT);
+	_scene->addActiveVocab(words_bartender);
+	_scene->addActiveVocab(words_alien_liquor);
+	_scene->addActiveVocab(words_drink);
+	_scene->addActiveVocab(words_binoculars);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_credit_chip);
+	_scene->addActiveVocab(words_take);
+	_scene->addActiveVocab(words_repair_list);
+	_scene->addActiveVocab(words_look_at);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room405.cpp b/engines/mads/madsv2/nebular/rooms/room405.cpp
index f0fec555e5f..63736e51bad 100644
--- a/engines/mads/madsv2/nebular/rooms/room405.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room405.cpp
@@ -109,27 +109,27 @@ static void room_405_daemon() {
 }
 
 static void room_405_pre_parser() {
-	if (_action.isAction(VERB_TAKE))
+	if (_action.isAction(words_take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 401;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 406;
 
-	if (_action.isAction(VERB_CLOSE, NOUN_WIDE_DOOR) && _globals[kArmoryDoorOpen])
+	if (_action.isAction(words_close, words_wide_door) && _globals[kArmoryDoorOpen])
 		_game._player.walk(Common::Point(212, 113), FACING_NORTH);
 }
 
 static void room_405_parser() {
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR))
+	if (_action.isAction(words_walk_through, words_door))
 		_scene->_nextSceneId = 413;
-	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_WIDE_DOOR) && _globals[kArmoryDoorOpen])
+	else if (_action.isAction(words_walk_through, words_wide_door) && _globals[kArmoryDoorOpen])
 		_scene->_nextSceneId = 408;
-	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_WIDE_DOOR) && !_globals[kArmoryDoorOpen])
+	else if (_action.isAction(words_walk_through, words_wide_door) && !_globals[kArmoryDoorOpen])
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
-	else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) && !_globals[kArmoryDoorOpen]) {
+	else if (_action.isAction(words_put, words_security_card, words_card_slot) && !_globals[kArmoryDoorOpen]) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -139,7 +139,7 @@ static void room_405_parser() {
 		Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], msgPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
-	} else if ((_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) || _action.isAction(VERB_CLOSE, NOUN_WIDE_DOOR)) && _globals[kArmoryDoorOpen]) {
+	} else if ((_action.isAction(words_put, words_security_card, words_card_slot) || _action.isAction(words_close, words_wide_door)) && _globals[kArmoryDoorOpen]) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -148,7 +148,7 @@ static void room_405_parser() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
-	} else if (_action.isAction(VERB_PUT, NOUN_CARD_SLOT)) {
+	} else if (_action.isAction(words_put, words_card_slot)) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -157,36 +157,36 @@ static void room_405_parser() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
-	} else if (_action.isAction(VERB_LOOK, NOUN_CANNON_BALLS))
+	} else if (_action.isAction(words_look, words_cannon_balls))
 		_vm->_dialogs->show(40510);
-	else if (_action.isAction(VERB_TAKE, NOUN_CANNON_BALLS))
+	else if (_action.isAction(words_take, words_cannon_balls))
 		_vm->_dialogs->show(40511);
-	else if (_action.isAction(VERB_LOOK, NOUN_WATER_FOUNTAIN))
+	else if (_action.isAction(words_look, words_water_fountain))
 		_vm->_dialogs->show(40512);
-	else if (_action.isAction(VERB_LOOK, NOUN_BACKBOARD) || _action.isAction(VERB_LOOK, NOUN_HOOP))
+	else if (_action.isAction(words_look, words_backboard) || _action.isAction(words_look, words_hoop))
 		_vm->_dialogs->show(40513);
-	else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
+	else if (_action.isAction(words_look, words_light))
 		_vm->_dialogs->show(40514);
-	else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+	else if (_action.isAction(words_look, words_card_slot))
 		_vm->_dialogs->show(40515);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(40516);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(40517);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+	else if (_action.isAction(words_look, words_monitor))
 		_vm->_dialogs->show(40518);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR) || _action._lookFlag)
+	else if (_action.isAction(words_look, words_corridor) || _action._lookFlag)
 		_vm->_dialogs->show(40519);
-	else if (_action.isAction(VERB_LOOK, NOUN_WIDE_DOOR)) {
+	else if (_action.isAction(words_look, words_wide_door)) {
 		if (_globals[kArmoryDoorOpen])
 			_vm->_dialogs->show(40521);
 		else
 			_vm->_dialogs->show(40520);
-	} else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+	} else if (_action.isAction(words_look, words_door))
 		_vm->_dialogs->show(40522);
-	else if (_action.isAction(VERB_LOOK, NOUN_COACH_LAMP))
+	else if (_action.isAction(words_look, words_coach_lamp))
 		_vm->_dialogs->show(40523);
-	else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+	else if (_action.isAction(words_look, words_support))
 		_vm->_dialogs->show(40524);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room406.cpp b/engines/mads/madsv2/nebular/rooms/room406.cpp
index 0d869d74a7f..53338da1c5b 100644
--- a/engines/mads/madsv2/nebular/rooms/room406.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room406.cpp
@@ -136,36 +136,36 @@ static void room_406_daemon() {
 }
 
 static void room_406_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+	if (_action.isAction(words_walk_down, words_corridor_to_west))
 		_game._player._walkOffScreenSceneId = 405;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+	if (_action.isAction(words_walk_down, words_corridor_to_east))
 		_game._player._walkOffScreenSceneId = 407;
 
-	if (_action.isAction(VERB_TAKE))
+	if (_action.isAction(words_take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_LOOK, NOUN_SIGN) || _action.isAction(VERB_LOOK, NOUN_TRASH))
+	if (_action.isAction(words_look, words_sign) || _action.isAction(words_look, words_trash))
 		_game._player._needToWalk = true;
 }
 
 static void room_406_parser() {
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && (_game._player._targetPos.x > 100)) {
+	if (_action.isAction(words_walk_through, words_door) && (_game._player._targetPos.x > 100)) {
 		_game._player._stepEnabled = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 3, 1, 0, 0);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
 		_vm->_sound->command(19);
-	} else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && _globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100))
+	} else if (_action.isAction(words_walk_through, words_door) && _globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100))
 		_scene->_nextSceneId = 410;
-	else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && !_globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100)) {
+	else if (_action.isAction(words_walk_through, words_door) && !_globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
 		if (!local._hitStorageDoor) {
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_scene->_sequences.addTimer(80, 100);
 		}
-	} else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) && !_globals[kStorageDoorOpen]) {
+	} else if (_action.isAction(words_put, words_security_card, words_card_slot) && !_globals[kStorageDoorOpen]) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -175,7 +175,7 @@ static void room_406_parser() {
 		Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], msgPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
-	} else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) && _globals[kStorageDoorOpen]) {
+	} else if (_action.isAction(words_put, words_security_card, words_card_slot) && _globals[kStorageDoorOpen]) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -185,7 +185,7 @@ static void room_406_parser() {
 		Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], msgPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
-	} else if (_action.isAction(VERB_PUT, NOUN_CARD_SLOT)) {
+	} else if (_action.isAction(words_put, words_card_slot)) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -194,42 +194,42 @@ static void room_406_parser() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], _game._player._playerPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
-	} else if (_action.isAction(VERB_LOOK, NOUN_TRASH))
+	} else if (_action.isAction(words_look, words_trash))
 		_vm->_dialogs->show(40610);
-	else if (_action.isAction(VERB_TAKE, NOUN_TRASH))
+	else if (_action.isAction(words_take, words_trash))
 		_vm->_dialogs->show(40611);
-	else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+	else if (_action.isAction(words_look, words_card_slot))
 		_vm->_dialogs->show(40612);
-	else if (_action.isAction(VERB_LOOK, NOUN_FIRE_EXTINGUISHER))
+	else if (_action.isAction(words_look, words_fire_extinguisher))
 		_vm->_dialogs->show(40614);
-	else if (_action.isAction(VERB_TAKE, NOUN_FIRE_EXTINGUISHER))
+	else if (_action.isAction(words_take, words_fire_extinguisher))
 		_vm->_dialogs->show(40615);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+	else if (_action.isAction(words_look, words_corridor_to_east))
 		_vm->_dialogs->show(40616);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+	else if (_action.isAction(words_look, words_corridor_to_west))
 		_vm->_dialogs->show(40617);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR) || _action._lookFlag)
+	else if (_action.isAction(words_look, words_corridor) || _action._lookFlag)
 		_vm->_dialogs->show(40618);
-	else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(40619);
-	else if (_action.isAction(VERB_LOOK, NOUN_DOOR)) {
+	else if (_action.isAction(words_look, words_door)) {
 		if (_globals[kStorageDoorOpen])
 			_vm->_dialogs->show(40621);
 		else
 			_vm->_dialogs->show(40620);
-	} else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+	} else if (_action.isAction(words_look, words_monitor))
 		_vm->_dialogs->show(40623);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGNPOST))
+	else if (_action.isAction(words_look, words_signpost))
 		_vm->_dialogs->show(40624);
-	else if (_action.isAction(VERB_TAKE, NOUN_SIGNPOST))
+	else if (_action.isAction(words_take, words_signpost))
 		_vm->_dialogs->show(40625);
-	else if (_action.isAction(VERB_LOOK, NOUN_BOULDER))
+	else if (_action.isAction(words_look, words_boulder))
 		_vm->_dialogs->show(40626);
-	else if (_action.isAction(VERB_TAKE, NOUN_BOULDER))
+	else if (_action.isAction(words_take, words_boulder))
 		_vm->_dialogs->show(40627);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+	else if (_action.isAction(words_look, words_sign))
 		_vm->_dialogs->show(40628);
-	else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
+	else if (_action.isAction(words_take, words_sign))
 		_vm->_dialogs->show(40629);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room407.cpp b/engines/mads/madsv2/nebular/rooms/room407.cpp
index 92f9166aefc..f8911fc7900 100644
--- a/engines/mads/madsv2/nebular/rooms/room407.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room407.cpp
@@ -74,13 +74,13 @@ static void room_407_daemon() {
 }
 
 static void room_407_pre_parser() {
-	if (_action.isAction(VERB_TAKE))
+	if (_action.isAction(words_take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+	if (_action.isAction(words_look, words_door))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+	if (_action.isAction(words_walk_down, words_corridor_to_north)) {
 		_game._player.walk(Common::Point(172, 91), FACING_NORTH);
 		local._fromNorth = false;
 	}
@@ -121,20 +121,20 @@ static void room_407_parser() {
 		}
 	}
 
-	if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !local._fromNorth)
+	if (_action.isAction(words_walk_down, words_corridor_to_south) && !local._fromNorth)
 		_scene->_nextSceneId = 406;
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH))
+	else if (_action.isAction(words_walk_down, words_corridor_to_north))
 		_scene->_nextSceneId = 318;
-	else if (_action.isAction(VERB_LOOK, NOUN_SCANNER)) {
+	else if (_action.isAction(words_look, words_scanner)) {
 		if (_globals[kHasBeenScanned])
 			_vm->_dialogs->show(40711);
 		else
 			_vm->_dialogs->show(40710);
-	} else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+	} else if (_action.isAction(words_look, words_door))
 		_vm->_dialogs->show(40712);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(40713);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+	else if (_action.isAction(words_look, words_corridor_to_north))
 		_vm->_dialogs->show(40714);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40715);
diff --git a/engines/mads/madsv2/nebular/rooms/room408.cpp b/engines/mads/madsv2/nebular/rooms/room408.cpp
index d00153235e3..949e3421475 100644
--- a/engines/mads/madsv2/nebular/rooms/room408.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room408.cpp
@@ -42,25 +42,25 @@ static void room_408_init() {
 	if (_game._objects.isInRoom(OBJ_TARGET_MODULE)) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
-		int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_target_module, words_walkto, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(283, 128), FACING_NORTHEAST);
 	}
 	section_4_music();
 }
 
 static void room_408_pre_parser() {
-	if ((_action.isAction(VERB_TAKE) && !_action.isObject(NOUN_TARGET_MODULE)) || _action.isAction(VERB_PULL, NOUN_PIN) || _action.isAction(VERB_OPEN, NOUN_CARTON))
+	if ((_action.isAction(words_take) && !_action.isObject(words_target_module)) || _action.isAction(words_pull, words_pin) || _action.isAction(words_open, words_carton))
 		_game._player._needToWalk = false;
 
-	if ((_action.isAction(VERB_LOOK, NOUN_TARGET_MODULE) && _game._objects.isInRoom(OBJ_TARGET_MODULE)) || _action.isAction(VERB_LOOK, NOUN_CHEST))
+	if ((_action.isAction(words_look, words_target_module) && _game._objects.isInRoom(OBJ_TARGET_MODULE)) || _action.isAction(words_look, words_chest))
 		_game._player._needToWalk = true;
 }
 
 static void room_408_parser() {
-	if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH)) {
+	if (_action.isAction(words_walk_into, words_corridor_to_south)) {
 		_scene->_nextSceneId = 405;
 		_vm->_sound->command(58);
-	} else if (_action.isAction(VERB_TAKE, NOUN_TARGET_MODULE) && (_game._objects.isInRoom(OBJ_TARGET_MODULE) || _game._trigger)) {
+	} else if (_action.isAction(words_take, words_target_module) && (_game._objects.isInRoom(OBJ_TARGET_MODULE) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -92,84 +92,84 @@ static void room_408_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_ARMORED_VEHICLE))
+	} else if (_action.isAction(words_look, words_armored_vehicle))
 		_vm->_dialogs->show(40810);
-	else if (_action.isAction(VERB_TAKE, NOUN_ARMORED_VEHICLE) || _action.isAction(VERB_TAKE, NOUN_ANVIL) || _action.isAction(VERB_TAKE, NOUN_TWO_TON_WEIGHT))
+	else if (_action.isAction(words_take, words_armored_vehicle) || _action.isAction(words_take, words_anvil) || _action.isAction(words_take, words_two_ton_weight))
 		_vm->_dialogs->show(40811);
-	else if (_action.isAction(VERB_LOOK, NOUN_MISSILE))
+	else if (_action.isAction(words_look, words_missile))
 		_vm->_dialogs->show(40812);
-	else if (_action.isAction(VERB_TAKE, NOUN_MISSILE))
+	else if (_action.isAction(words_take, words_missile))
 		_vm->_dialogs->show(40813);
-	else if (_action.isAction(VERB_LOOK, NOUN_GRENADE))
+	else if (_action.isAction(words_look, words_grenade))
 		_vm->_dialogs->show(40814);
-	else if (_action.isAction(VERB_TAKE, NOUN_GRENADE))
+	else if (_action.isAction(words_take, words_grenade))
 		_vm->_dialogs->show(40815);
-	else if (_action.isAction(VERB_TAKE, NOUN_PIN) || _action.isAction(VERB_PULL, NOUN_PIN))
+	else if (_action.isAction(words_take, words_pin) || _action.isAction(words_pull, words_pin))
 		_vm->_dialogs->show(40816);
-	else if (_action.isAction(VERB_LOOK, NOUN_BLIMP))
+	else if (_action.isAction(words_look, words_blimp))
 		_vm->_dialogs->show(40817);
-	else if (_action.isAction(VERB_TAKE, NOUN_BLIMP))
+	else if (_action.isAction(words_take, words_blimp))
 		_vm->_dialogs->show(40818);
-	else if (_action.isAction(VERB_LOOK, NOUN_AMMUNITION))
+	else if (_action.isAction(words_look, words_ammunition))
 		_vm->_dialogs->show(40819);
-	else if (_action.isAction(VERB_TAKE, NOUN_AMMUNITION))
+	else if (_action.isAction(words_take, words_ammunition))
 		_vm->_dialogs->show(40820);
-	else if (_action.isAction(VERB_LOOK, NOUN_CATAPULT))
+	else if (_action.isAction(words_look, words_catapult))
 		_vm->_dialogs->show(40821);
-	else if (_action.isAction(VERB_TAKE, NOUN_CATAPULT))
+	else if (_action.isAction(words_take, words_catapult))
 		_vm->_dialogs->show(40822);
-	else if (_action.isAction(VERB_LOOK, NOUN_CHEST)) {
+	else if (_action.isAction(words_look, words_chest)) {
 		if (_game._objects.isInRoom(OBJ_TARGET_MODULE))
 			_vm->_dialogs->show(40823);
 		else
 			_vm->_dialogs->show(40824);
-	} else if (_action.isAction(VERB_TAKE, NOUN_CHEST))
+	} else if (_action.isAction(words_take, words_chest))
 		_vm->_dialogs->show(40825);
-	else if (_action.isAction(VERB_LOOK, NOUN_SUIT_OF_ARMOR))
+	else if (_action.isAction(words_look, words_suit_of_armor))
 		_vm->_dialogs->show(40826);
-	else if (_action.isAction(VERB_TAKE, NOUN_SUIT_OF_ARMOR))
+	else if (_action.isAction(words_take, words_suit_of_armor))
 		_vm->_dialogs->show(40827);
-	else if (_action.isAction(VERB_LOOK, NOUN_ESCAPE_HATCH))
+	else if (_action.isAction(words_look, words_escape_hatch))
 		_vm->_dialogs->show(40828);
-	else if (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH) || _action.isAction(VERB_PULL, NOUN_ESCAPE_HATCH))
+	else if (_action.isAction(words_open, words_escape_hatch) || _action.isAction(words_pull, words_escape_hatch))
 		_vm->_dialogs->show(40829);
-	else if (_action.isAction(VERB_LOOK, NOUN_BARRELS))
+	else if (_action.isAction(words_look, words_barrels))
 		_vm->_dialogs->show(40830);
-	else if (_action.isAction(VERB_TAKE, NOUN_BARRELS))
+	else if (_action.isAction(words_take, words_barrels))
 		_vm->_dialogs->show(40831);
-	else if (_action.isAction(VERB_LOOK, NOUN_INFLATABLE_RAFT))
+	else if (_action.isAction(words_look, words_inflatable_raft))
 		_vm->_dialogs->show(40832);
-	else if (_action.isAction(VERB_TAKE, NOUN_INFLATABLE_RAFT))
+	else if (_action.isAction(words_take, words_inflatable_raft))
 		_vm->_dialogs->show(40833);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOMATO))
+	else if (_action.isAction(words_look, words_tomato))
 		_vm->_dialogs->show(40834);
-	else if (_action.isAction(VERB_TAKE, NOUN_TOMATO))
+	else if (_action.isAction(words_take, words_tomato))
 		_vm->_dialogs->show(40835);
-	else if (_action.isAction(VERB_LOOK, NOUN_ANVIL))
+	else if (_action.isAction(words_look, words_anvil))
 		_vm->_dialogs->show(40836);
-	else if (_action.isAction(VERB_LOOK, NOUN_TWO_TON_WEIGHT))
+	else if (_action.isAction(words_look, words_two_ton_weight))
 		_vm->_dialogs->show(40837);
-	else if (_action.isAction(VERB_LOOK, NOUN_POWDER_CONTAINER))
+	else if (_action.isAction(words_look, words_powder_container))
 		_vm->_dialogs->show(40838);
-	else if (_action.isAction(VERB_LOOK, NOUN_POWDER_PUFF))
+	else if (_action.isAction(words_look, words_powder_puff))
 		_vm->_dialogs->show(40839);
-	else if (_action.isAction(VERB_TAKE, NOUN_POWDER_PUFF))
+	else if (_action.isAction(words_take, words_powder_puff))
 		_vm->_dialogs->show(40840);
-	else if (_action.isAction(VERB_LOOK, NOUN_CARTON))
+	else if (_action.isAction(words_look, words_carton))
 		_vm->_dialogs->show(40841);
-	else if (_action.isAction(VERB_TAKE, NOUN_CARTON))
+	else if (_action.isAction(words_take, words_carton))
 		_vm->_dialogs->show(40842);
-	else if (_action.isAction(VERB_OPEN, NOUN_CARTON))
+	else if (_action.isAction(words_open, words_carton))
 		_vm->_dialogs->show(40843);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(40844);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40845);
-	else if (_action.isAction(VERB_LOOK, NOUN_TARGET_MODULE) && _game._objects.isInRoom(OBJ_TARGET_MODULE))
+	else if (_action.isAction(words_look, words_target_module) && _game._objects.isInRoom(OBJ_TARGET_MODULE))
 		_vm->_dialogs->show(40846);
-	else if (_action.isAction(VERB_LOOK, NOUN_LOADING_RAMP))
+	else if (_action.isAction(words_look, words_loading_ramp))
 		_vm->_dialogs->show(40848);
-	else if (_action.isAction(VERB_OPEN, NOUN_CHEST))
+	else if (_action.isAction(words_open, words_chest))
 		_vm->_dialogs->show(40849);
 	else
 		return;
@@ -188,8 +188,8 @@ void room_408_preload() {
 
 	section_4_walker();
 	section_4_interface();
-	_scene->addActiveVocab(NOUN_TARGET_MODULE);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_target_module);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room409.cpp b/engines/mads/madsv2/nebular/rooms/room409.cpp
index 09b36ec9bfa..afaf444d51f 100644
--- a/engines/mads/madsv2/nebular/rooms/room409.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room409.cpp
@@ -54,24 +54,24 @@ static void room_409_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT))
+	if (_action.isAction(words_look, words_viewport))
 		_vm->_dialogs->show(40910);
-	else if (_action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+	else if (_action.isAction(words_peer_through, words_viewport))
 		_vm->_dialogs->show(40910);
-	else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+	else if (_action.isAction(words_look, words_keypad))
 		_vm->_dialogs->show(40911);
-	else if (_action.isAction(VERB_INSPECT, NOUN_KEYPAD))
+	else if (_action.isAction(words_inspect, words_keypad))
 		_vm->_dialogs->show(40911);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+	else if (_action.isAction(words_look, words_display))
 		_vm->_dialogs->show(40912);
-	else if (_action.isAction(VERB_LOOK, NOUN_1_KEY) || _action.isAction(VERB_LOOK, NOUN_2_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_3_KEY) || _action.isAction(VERB_LOOK, NOUN_4_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_5_KEY) || _action.isAction(VERB_LOOK, NOUN_6_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_7_KEY) || _action.isAction(VERB_LOOK, NOUN_8_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_9_KEY) || _action.isAction(VERB_LOOK, NOUN_0_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+	else if (_action.isAction(words_look, words_1_key) || _action.isAction(words_look, words_2_key)
+		|| _action.isAction(words_look, words_3_key) || _action.isAction(words_look, words_4_key)
+		|| _action.isAction(words_look, words_5_key) || _action.isAction(words_look, words_6_key)
+		|| _action.isAction(words_look, words_7_key) || _action.isAction(words_look, words_8_key)
+		|| _action.isAction(words_look, words_9_key) || _action.isAction(words_look, words_0_key)
+		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_frown_key))
 		_vm->_dialogs->show(40913);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEVICE))
+	else if (_action.isAction(words_look, words_device))
 		_vm->_dialogs->show(40914);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40914);
diff --git a/engines/mads/madsv2/nebular/rooms/room410.cpp b/engines/mads/madsv2/nebular/rooms/room410.cpp
index 81aab8673e7..cdbd5d5bcbf 100644
--- a/engines/mads/madsv2/nebular/rooms/room410.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room410.cpp
@@ -39,7 +39,7 @@ static void room_410_init() {
 	if (_game._objects.isInRoom(OBJ_CHARGE_CASES))
 		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 	else
-		_scene->_hotspots.activate(NOUN_CHARGE_CASES, false);
+		_scene->_hotspots.activate(words_charge_cases, false);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(155, 150);
@@ -83,23 +83,23 @@ static void room_410_daemon() {
 }
 
 static void room_410_pre_parser() {
-	if (_action.isAction(VERB_TAKE) && !_action.isObject(NOUN_CHARGE_CASES))
+	if (_action.isAction(words_take) && !_action.isObject(words_charge_cases))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_LOOK, NOUN_CHARGE_CASES) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
+	if (_action.isAction(words_look, words_charge_cases) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(VERB_OPEN, NOUN_SACKS) || _action.isAction(VERB_OPEN, NOUN_SACK))
+	if (_action.isAction(words_open, words_sacks) || _action.isAction(words_open, words_sack))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_LOOK, NOUN_CAN))
+	if (_action.isAction(words_look, words_can))
 		_game._player._needToWalk = true;
 }
 
 static void room_410_parser() {
-	if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
+	if (_action.isAction(words_walk_into, words_corridor_to_south))
 		_scene->_nextSceneId = 406;
-	else if (_action.isAction(VERB_TAKE, NOUN_CHARGE_CASES) && (_game._objects.isInRoom(OBJ_CHARGE_CASES) || _game._trigger)) {
+	else if (_action.isAction(words_take, words_charge_cases) && (_game._objects.isInRoom(OBJ_CHARGE_CASES) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -114,7 +114,7 @@ static void room_410_parser() {
 
 		case 1:
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_scene->_hotspots.activate(NOUN_CHARGE_CASES, false);
+			_scene->_hotspots.activate(words_charge_cases, false);
 			_game._objects.addToInventory(OBJ_CHARGE_CASES);
 			_vm->_dialogs->showItem(OBJ_CHARGE_CASES, 41032);
 			break;
@@ -132,52 +132,52 @@ static void room_410_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_BARREL))
+	} else if (_action.isAction(words_look, words_barrel))
 		_vm->_dialogs->show(41010);
-	else if (_action.isAction(VERB_TAKE, NOUN_BARREL))
+	else if (_action.isAction(words_take, words_barrel))
 		_vm->_dialogs->show(41011);
-	else if (_action.isAction(VERB_OPEN, NOUN_BARREL))
+	else if (_action.isAction(words_open, words_barrel))
 		_vm->_dialogs->show(41012);
-	else if (_action.isAction(VERB_LOOK, NOUN_RUG))
+	else if (_action.isAction(words_look, words_rug))
 		_vm->_dialogs->show(41013);
-	else if (_action.isAction(VERB_TAKE, NOUN_RUG))
+	else if (_action.isAction(words_take, words_rug))
 		_vm->_dialogs->show(41014);
-	else if (_action.isAction(VERB_LOOK, NOUN_CARTON) || _action.isAction(VERB_OPEN, NOUN_CARTON)) {
+	else if (_action.isAction(words_look, words_carton) || _action.isAction(words_open, words_carton)) {
 		if (_game._objects.isInRoom(OBJ_CHARGE_CASES))
 			_vm->_dialogs->show(41015);
 		else
 			_vm->_dialogs->show(41016);
-	} else if (_action.isAction(VERB_LOOK, NOUN_FLOUR))
+	} else if (_action.isAction(words_look, words_flour))
 		_vm->_dialogs->show(41017);
-	else if (_action.isAction(VERB_TAKE, NOUN_FLOUR))
+	else if (_action.isAction(words_take, words_flour))
 		_vm->_dialogs->show(41018);
-	else if (_action.isAction(VERB_LOOK, NOUN_SACKS))
+	else if (_action.isAction(words_look, words_sacks))
 		_vm->_dialogs->show(41019);
-	else if (_action.isAction(VERB_LOOK, NOUN_SACK))
+	else if (_action.isAction(words_look, words_sack))
 		_vm->_dialogs->show(41019);
-	else if (_action.isAction(VERB_OPEN, NOUN_SACKS))
+	else if (_action.isAction(words_open, words_sacks))
 		_vm->_dialogs->show(41020);
-	else if (_action.isAction(VERB_OPEN, NOUN_SACK))
+	else if (_action.isAction(words_open, words_sack))
 		_vm->_dialogs->show(41020);
-	else if (_action.isAction(VERB_LOOK, NOUN_BUCKET_OF_TAR))
+	else if (_action.isAction(words_look, words_bucket_of_tar))
 		_vm->_dialogs->show(41021);
-	else if (_action.isAction(VERB_TAKE, NOUN_BUCKET_OF_TAR))
+	else if (_action.isAction(words_take, words_bucket_of_tar))
 		_vm->_dialogs->show(41022);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAN))
+	else if (_action.isAction(words_look, words_can))
 		_vm->_dialogs->show(41023);
-	else if (_action.isAction(VERB_TAKE, NOUN_CAN))
+	else if (_action.isAction(words_take, words_can))
 		_vm->_dialogs->show(41024);
-	else if (_action.isAction(VERB_LOOK, NOUN_CHARGE_CASES) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
+	else if (_action.isAction(words_look, words_charge_cases) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
 		_vm->_dialogs->show(41025);
-	else if (_action.isAction(VERB_LOOK, NOUN_FENCE))
+	else if (_action.isAction(words_look, words_fence))
 		_vm->_dialogs->show(41027);
-	else if (_action.isAction(VERB_LOOK, NOUN_SHELVES))
+	else if (_action.isAction(words_look, words_shelves))
 		_vm->_dialogs->show(41028);
-	else if (_action.isAction(VERB_LOOK, NOUN_RAT))
+	else if (_action.isAction(words_look, words_rat))
 		_vm->_dialogs->show(41029);
-	else if (_action.isAction(VERB_TAKE, NOUN_RAT))
+	else if (_action.isAction(words_take, words_rat))
 		_vm->_dialogs->show(41030);
-	else if (_action.isAction(VERB_THROW, NOUN_RAT))
+	else if (_action.isAction(words_throw, words_rat))
 		_vm->_dialogs->show(41031);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(41033);
diff --git a/engines/mads/madsv2/nebular/rooms/room411.cpp b/engines/mads/madsv2/nebular/rooms/room411.cpp
index 2c6bddee4e4..15d672adaa6 100644
--- a/engines/mads/madsv2/nebular/rooms/room411.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room411.cpp
@@ -330,11 +330,11 @@ static void room_411_init() {
 	local._dialog4.setup(0x5E, 0x255, 0x261, 0x25D, 0x259, 0x262, -1);
 
 	if (_globals[kNextIngredient] >= 4 && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
-		_scene->_hotspots.activate(NOUN_KETTLE, false);
-		_scene->_hotspots.activate(NOUN_EXPLOSIVES, true);
+		_scene->_hotspots.activate(words_kettle, false);
+		_scene->_hotspots.activate(words_explosives, true);
 	} else {
-		_scene->_hotspots.activate(NOUN_EXPLOSIVES, false);
-		_scene->_hotspots.activate(NOUN_KETTLE, true);
+		_scene->_hotspots.activate(words_explosives, false);
+		_scene->_hotspots.activate(words_kettle, true);
 	}
 
 	if (_globals[kNextIngredient] >= 4 && _game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
@@ -380,21 +380,21 @@ static void room_411_init() {
 	if (_game._objects.isInRoom(OBJ_FORMALDEHYDE)) {
 		_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
-		int idx = _scene->_dynamicHotspots.add(NOUN_FORMALDEHYDE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_formaldehyde, words_walkto, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(206, 145), FACING_SOUTHEAST);
 	}
 
 	if (_game._objects.isInRoom(OBJ_PETROX)) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
-		int idx = _scene->_dynamicHotspots.add(NOUN_PETROX, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_petrox, words_walkto, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 112), FACING_NORTHEAST);
 	}
 
 	if (_game._objects.isInRoom(OBJ_LECITHIN)) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 8);
-		int idx = _scene->_dynamicHotspots.add(NOUN_LECITHIN, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_lecithin, words_walkto, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 121), FACING_NORTHEAST);
 	}
 
@@ -472,8 +472,8 @@ static void room_411_daemon() {
 				if (local._makeMushroomCloud) {
 					_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 5, 1, 0, 0);
 					local._makeMushroomCloud = false;
-					_scene->_hotspots.activate(NOUN_KETTLE, false);
-					_scene->_hotspots.activate(NOUN_EXPLOSIVES, true);
+					_scene->_hotspots.activate(words_kettle, false);
+					_scene->_hotspots.activate(words_explosives, true);
 				}
 				break;
 
@@ -502,21 +502,21 @@ static void room_411_daemon() {
 }
 
 static void room_411_pre_parser() {
-	if (_action.isAction(VERB_LOOK, NOUN_PETROX) && (_game._objects.isInRoom(OBJ_PETROX)))
+	if (_action.isAction(words_look, words_petrox) && (_game._objects.isInRoom(OBJ_PETROX)))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(VERB_LOOK, NOUN_LECITHIN) && (_game._objects.isInRoom(OBJ_LECITHIN)))
+	if (_action.isAction(words_look, words_lecithin) && (_game._objects.isInRoom(OBJ_LECITHIN)))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(VERB_LOOK, NOUN_FORMALDEHYDE) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
+	if (_action.isAction(words_look, words_formaldehyde) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(VERB_LOOK, NOUN_EXPLOSIVES) || _action.isAction(VERB_LOOK, NOUN_KETTLE) || _action.isAction(VERB_LOOK, NOUN_MISHAP) ||
-		_action.isAction(VERB_LOOK, NOUN_ALCOVE) || _action.isAction(VERB_LOOK, NOUN_SINK) || _action.isAction(VERB_PUT, NOUN_SINK) ||
-		_action.isAction(VERB_LOOK, NOUN_EXPERIMENT) || _action.isAction(VERB_LOOK, NOUN_DRAWING_BOARD))
+	if (_action.isAction(words_look, words_explosives) || _action.isAction(words_look, words_kettle) || _action.isAction(words_look, words_mishap) ||
+		_action.isAction(words_look, words_alcove) || _action.isAction(words_look, words_sink) || _action.isAction(words_put, words_sink) ||
+		_action.isAction(words_look, words_experiment) || _action.isAction(words_look, words_drawing_board))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(VERB_PULL, NOUN_KNIFE_SWITCH) || _action.isAction(VERB_PUSH, NOUN_KNIFE_SWITCH))
+	if (_action.isAction(words_pull, words_knife_switch) || _action.isAction(words_push, words_knife_switch))
 		_game._player._needToWalk = false;
 }
 
@@ -527,14 +527,14 @@ static void room_411_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH)) {
+	if (_action.isAction(words_walk_into, words_corridor_to_south)) {
 		_scene->_nextSceneId = 406;
 		_vm->_sound->command(10);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_globals[kNextIngredient] >= 4) && (_action.isAction(VERB_TAKE, NOUN_EXPLOSIVES) || _action.isAction(VERB_PUT, NOUN_CHARGE_CASES, NOUN_EXPLOSIVES))
+	if ((_globals[kNextIngredient] >= 4) && (_action.isAction(words_take, words_explosives) || _action.isAction(words_put, words_charge_cases, words_explosives))
 		&& !_game._objects[OBJ_CHARGE_CASES].getQuality(3)
 		&& _game._objects.isInInventory(OBJ_CHARGE_CASES)) {
 		switch (_game._trigger) {
@@ -560,8 +560,8 @@ static void room_411_parser() {
 		break;
 
 		case 111:
-			_scene->_hotspots.activate(NOUN_KETTLE, true);
-			_scene->_hotspots.activate(NOUN_EXPLOSIVES, false);
+			_scene->_hotspots.activate(words_kettle, true);
+			_scene->_hotspots.activate(words_explosives, false);
 			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
 
@@ -586,13 +586,13 @@ static void room_411_parser() {
 		}
 		_action._inProgress = false;
 		return;
-	} else if (!_game._objects.isInInventory(OBJ_CHARGE_CASES) && _action.isAction(VERB_TAKE, NOUN_EXPLOSIVES)) {
+	} else if (!_game._objects.isInInventory(OBJ_CHARGE_CASES) && _action.isAction(words_take, words_explosives)) {
 		_vm->_dialogs->show(41143);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_PETROX) && (_game._objects.isInRoom(OBJ_PETROX) || _game._trigger)) {
+	if (_action.isAction(words_take, words_petrox) && (_game._objects.isInRoom(OBJ_PETROX) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -629,7 +629,7 @@ static void room_411_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_LECITHIN) && (_game._objects.isInRoom(OBJ_LECITHIN) || _game._trigger)) {
+	if (_action.isAction(words_take, words_lecithin) && (_game._objects.isInRoom(OBJ_LECITHIN) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -665,7 +665,7 @@ static void room_411_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_FORMALDEHYDE) && _game._objects.isInRoom(OBJ_FORMALDEHYDE) && (_game._trigger == 0)) {
+	if (_action.isAction(words_take, words_formaldehyde) && _game._objects.isInRoom(OBJ_FORMALDEHYDE) && (_game._trigger == 0)) {
 		_vm->_sound->command(57);
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -689,11 +689,11 @@ static void room_411_parser() {
 	if (_game._trigger == 10)
 		_vm->_dialogs->showItem(OBJ_FORMALDEHYDE, 41124);
 
-	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_KETTLE)) {
-		if (_action.isObject(NOUN_PETROX) ||
-			_action.isObject(NOUN_FORMALDEHYDE) ||
-			_action.isObject(NOUN_LECITHIN) ||
-			_action.isObject(NOUN_ALIEN_LIQUOR)) {
+	if (_action.isAction(words_put) && _action.isTarget(words_kettle)) {
+		if (_action.isObject(words_petrox) ||
+			_action.isObject(words_formaldehyde) ||
+			_action.isObject(words_lecithin) ||
+			_action.isObject(words_alien_liquor)) {
 			local._newIngredient = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 			switch (local._newIngredient) {
 			case OBJ_ALIEN_LIQUOR:
@@ -719,67 +719,67 @@ static void room_411_parser() {
 	}
 
 
-	if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+	if (_action.isAction(words_look, words_monitor))
 		_vm->_dialogs->show(41110);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_PURIFIER))
+	else if (_action.isAction(words_look, words_air_purifier))
 		_vm->_dialogs->show(41111);
-	else if (_action.isAction(VERB_LOOK, NOUN_LAB_EQUIPMENT))
+	else if (_action.isAction(words_look, words_lab_equipment))
 		_vm->_dialogs->show(41112);
-	else if (_action.isAction(VERB_LOOK, NOUN_KNIFE_SWITCH))
+	else if (_action.isAction(words_look, words_knife_switch))
 		_vm->_dialogs->show(41113);
-	else if (_action.isAction(VERB_PUSH, NOUN_KNIFE_SWITCH) || _action.isAction(VERB_PULL, NOUN_KNIFE_SWITCH))
+	else if (_action.isAction(words_push, words_knife_switch) || _action.isAction(words_pull, words_knife_switch))
 		_vm->_dialogs->show(41114);
-	else if (_action.isAction(VERB_LOOK, NOUN_TOXIC_WASTE))
+	else if (_action.isAction(words_look, words_toxic_waste))
 		_vm->_dialogs->show(41115);
-	else if (_action.isAction(VERB_TAKE, NOUN_TOXIC_WASTE))
+	else if (_action.isAction(words_take, words_toxic_waste))
 		_vm->_dialogs->show(41116);
-	else if (_action.isAction(VERB_LOOK, NOUN_DRAWING_BOARD))
+	else if (_action.isAction(words_look, words_drawing_board))
 		_vm->_dialogs->show(41117);
-	else if (_action.isAction(VERB_LOOK, NOUN_EXPERIMENT))
+	else if (_action.isAction(words_look, words_experiment))
 		_vm->_dialogs->show(41118);
-	else if (_action.isAction(VERB_LOOK, NOUN_PETROX) && _game._objects.isInRoom(OBJ_PETROX))
+	else if (_action.isAction(words_look, words_petrox) && _game._objects.isInRoom(OBJ_PETROX))
 		_vm->_dialogs->show(41119);
-	else if (_action.isAction(VERB_LOOK, NOUN_ALCOVE))
+	else if (_action.isAction(words_look, words_alcove))
 		_vm->_dialogs->show(41121);
-	else if ((_action.isAction(VERB_LOOK, NOUN_FORMALDEHYDE)) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
+	else if ((_action.isAction(words_look, words_formaldehyde)) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
 		_vm->_dialogs->show(41122);
-	else if ((_action.isAction(VERB_LOOK, NOUN_LECITHIN)) && (_game._objects.isInRoom(OBJ_LECITHIN)))
+	else if ((_action.isAction(words_look, words_lecithin)) && (_game._objects.isInRoom(OBJ_LECITHIN)))
 		_vm->_dialogs->show(41123);
-	else if (_action.isAction(VERB_LOOK, NOUN_KETTLE)) {
+	else if (_action.isAction(words_look, words_kettle)) {
 		if (_globals[kNextIngredient] > 0 && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
 			_vm->_dialogs->show(41126);
 		} else if (_globals[kNextIngredient] == 0 || _game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
 			_vm->_dialogs->show(41125);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_EXPLOSIVES) && _game._objects[OBJ_CHARGE_CASES].getQuality(3) == 0) {
+	} else if (_action.isAction(words_look, words_explosives) && _game._objects[OBJ_CHARGE_CASES].getQuality(3) == 0) {
 		_vm->_dialogs->show(41127);
-	} else if (_action.isAction(VERB_TAKE, NOUN_KETTLE))
+	} else if (_action.isAction(words_take, words_kettle))
 		_vm->_dialogs->show(41128);
-	else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+	else if (_action.isAction(words_look, words_control_panel))
 		_vm->_dialogs->show(41129);
-	else if (_action.isAction(VERB_LOOK, NOUN_MISHAP))
+	else if (_action.isAction(words_look, words_mishap))
 		_vm->_dialogs->show(41130);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(41131);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(41132);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_HORN))
+	else if (_action.isAction(words_look, words_air_horn))
 		_vm->_dialogs->show(41133);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+	else if (_action.isAction(words_look, words_debris))
 		_vm->_dialogs->show(41134);
-	else if (_action.isAction(VERB_LOOK, NOUN_HEATER))
+	else if (_action.isAction(words_look, words_heater))
 		_vm->_dialogs->show(41135);
-	else if (_action.isAction(VERB_LOOK, NOUN_PIPE))
+	else if (_action.isAction(words_look, words_pipe))
 		_vm->_dialogs->show(41136);
-	else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+	else if (_action.isAction(words_look, words_sink))
 		_vm->_dialogs->show(41137);
-	else if (_action.isAction(VERB_PUT, NOUN_SINK))
+	else if (_action.isAction(words_put, words_sink))
 		_vm->_dialogs->show(41138);
-	else if (_action.isAction(VERB_TAKE, NOUN_EXPERIMENT))
+	else if (_action.isAction(words_take, words_experiment))
 		_vm->_dialogs->show(41139);
-	else if (_action.isAction(VERB_LOOK, NOUN_ELECTRODES))
+	else if (_action.isAction(words_look, words_electrodes))
 		_vm->_dialogs->show(41140);
-	else if (_action.isAction(VERB_TAKE, NOUN_ELECTRODES))
+	else if (_action.isAction(words_take, words_electrodes))
 		_vm->_dialogs->show(41141);
 	else
 		return;
@@ -806,11 +806,11 @@ void room_411_preload() {
 
 	section_4_walker();
 	section_4_interface();
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
-	_scene->addActiveVocab(NOUN_FORMALDEHYDE);
-	_scene->addActiveVocab(NOUN_PETROX);
-	_scene->addActiveVocab(NOUN_LECITHIN);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_alien_liquor);
+	_scene->addActiveVocab(words_formaldehyde);
+	_scene->addActiveVocab(words_petrox);
+	_scene->addActiveVocab(words_lecithin);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room413.cpp b/engines/mads/madsv2/nebular/rooms/room413.cpp
index 301553a530d..e4596a23b7b 100644
--- a/engines/mads/madsv2/nebular/rooms/room413.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room413.cpp
@@ -134,41 +134,41 @@ static void room_413_daemon() {
 }
 
 static void room_413_pre_parser() {
-	if (_action.isAction(VERB_TAKE) || _action.isAction(VERB_PUT, NOUN_CONVEYOR_BELT))
+	if (_action.isAction(words_take) || _action.isAction(words_put, words_conveyor_belt))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(VERB_LOOK, NOUN_WOODEN_STATUE) || _action.isAction(VERB_LOOK, NOUN_DISPLAY)
-		|| _action.isAction(VERB_LOOK, NOUN_PICTURE) || _action.isAction(VERB_LOOK, NOUN_PLANT)) {
+	if (_action.isAction(words_look, words_wooden_statue) || _action.isAction(words_look, words_display)
+		|| _action.isAction(words_look, words_picture) || _action.isAction(words_look, words_plant)) {
 		_game._player._needToWalk = true;
 	}
 }
 
 static void room_413_parser() {
-	if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
+	if (_action.isAction(words_walk_inside, words_teleporter)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 409;
-	} else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
+	} else if (_action.isAction(words_walk_into, words_corridor_to_south))
 		_scene->_nextSceneId = 405;
-	else if (_action.isAction(VERB_LOOK, NOUN_WOODEN_STATUE))
+	else if (_action.isAction(words_look, words_wooden_statue))
 		_vm->_dialogs->show(41310);
-	else if (_action.isAction(VERB_TAKE, NOUN_WOODEN_STATUE))
+	else if (_action.isAction(words_take, words_wooden_statue))
 		_vm->_dialogs->show(41311);
-	else if (_action.isAction(VERB_LOOK, NOUN_CONVEYOR_BELT))
+	else if (_action.isAction(words_look, words_conveyor_belt))
 		_vm->_dialogs->show(41312);
-	else if (_action.isAction(VERB_PUT, NOUN_CONVEYOR_BELT))
+	else if (_action.isAction(words_put, words_conveyor_belt))
 		_vm->_dialogs->show(41313);
-	else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+	else if (_action.isAction(words_look, words_teleporter))
 		_vm->_dialogs->show(41314);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+	else if (_action.isAction(words_look, words_display))
 		_vm->_dialogs->show(41315);
-	else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+	else if (_action.isAction(words_look, words_corridor_to_south))
 		_vm->_dialogs->show(41316);
-	else if (_action.isAction(VERB_LOOK, NOUN_PICTURE))
+	else if (_action.isAction(words_look, words_picture))
 		_vm->_dialogs->show(41317);
-	else if (_action.isAction(VERB_LOOK, NOUN_PLANT))
+	else if (_action.isAction(words_look, words_plant))
 		_vm->_dialogs->show(41318);
-	else if (_action.isAction(VERB_TAKE, NOUN_PLANT))
+	else if (_action.isAction(words_take, words_plant))
 		_vm->_dialogs->show(41319);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(41320);
diff --git a/engines/mads/madsv2/nebular/rooms/room501.cpp b/engines/mads/madsv2/nebular/rooms/room501.cpp
index 373f7e969d8..1c734fd5034 100644
--- a/engines/mads/madsv2/nebular/rooms/room501.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room501.cpp
@@ -100,7 +100,7 @@ static void room_501_init() {
 	}
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
-	int idx = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(words_door, words_walk_through, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 	local._doorHotspotid = _scene->_dynamicHotspots.setPosition(idx, Common::Point(282, 110), FACING_NORTH);
 	_scene->_dynamicHotspots.setCursor(local._doorHotspotid, CURSOR_GO_UP);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
@@ -167,7 +167,7 @@ static void room_501_daemon() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
 			_vm->_sound->command(12);
-			local._doorHotspotid = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+			local._doorHotspotid = _scene->_dynamicHotspots.add(words_door, words_walk_through, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(_globals._sequenceIndexes[3], Common::Point(282, 110), FACING_NORTH);
 			_scene->_dynamicHotspots.setCursor(local._doorHotspotid, CURSOR_GO_UP);
 			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
@@ -217,12 +217,12 @@ static void room_501_daemon() {
 }
 
 static void room_501_pre_parser() {
-	if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_EAST) || _action.isObject(NOUN_SIDEWALK_TO_EAST)))
+	if (_action.isAction(words_walk_down) && (_action.isObject(words_street_to_east) || _action.isObject(words_sidewalk_to_east)))
 		_game._player._walkOffScreenSceneId = 551;
 }
 
 static void room_501_parser() {
-	if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+	if (_action.isAction(words_get_into, words_car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -271,9 +271,9 @@ static void room_501_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT))
+	} else if (_action.isAction(words_put, words_security_card, words_card_slot))
 		_vm->_dialogs->show(50113);
-	else if (_action.isAction(VERB_PUT, NOUN_FAKE_ID, NOUN_CARD_SLOT)) {
+	else if (_action.isAction(words_put, words_fake_id, words_card_slot)) {
 		switch (_game._trigger) {
 		case 0:
 		case 1:
@@ -317,7 +317,7 @@ static void room_501_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_PUT, NOUN_ID_CARD, NOUN_CARD_SLOT)) {
+	} else if (_action.isAction(words_put, words_id_card, words_card_slot)) {
 		switch (_game._trigger) {
 		case 0:
 		case 1:
@@ -365,34 +365,34 @@ static void room_501_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET))
+	} else if (_action._lookFlag || _action.isAction(words_look, words_street))
 		_vm->_dialogs->show(50121);
-	else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+	else if (_action.isAction(words_look, words_door))
 		_vm->_dialogs->show(50110);
-	else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+	else if (_action.isAction(words_look, words_card_slot))
 		_vm->_dialogs->show(50112);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+	else if (_action.isAction(words_look, words_sign))
 		_vm->_dialogs->show(50114);
-	else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
+	else if (_action.isAction(words_take, words_sign))
 		_vm->_dialogs->show(50115);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_EAST))
+	else if (_action.isAction(words_look, words_sidewalk_to_east))
 		_vm->_dialogs->show(50118);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST)
-		|| _action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
+	else if (_action.isAction(words_look, words_sidewalk_to_west) || _action.isAction(words_look, words_street_to_west)
+		|| _action.isAction(words_walk_down, words_sidewalk_to_west) || _action.isAction(words_walk_down, words_street_to_west))
 		_vm->_dialogs->show(50119);
-	else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+	else if (_action.isAction(words_look, words_building))
 		_vm->_dialogs->show(50120);
-	else if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+	else if (_action.isAction(words_open, words_door))
 		_vm->_dialogs->show(50122);
-	else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT))
+	else if (_action.isAction(words_look, words_fire_hydrant))
 		_vm->_dialogs->show(50123);
-	else if (_action.isAction(VERB_OPEN, NOUN_FIRE_HYDRANT))
+	else if (_action.isAction(words_open, words_fire_hydrant))
 		_vm->_dialogs->show(50124);
-	else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT_OVERHEAD))
+	else if (_action.isAction(words_look, words_equipment_overhead))
 		_vm->_dialogs->show(50125);
-	else if (_action.isAction(VERB_LOOK, NOUN_PIPES) || _action.isAction(VERB_LOOK, NOUN_PIPE))
+	else if (_action.isAction(words_look, words_pipes) || _action.isAction(words_look, words_pipe))
 		_vm->_dialogs->show(50126);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAR)) {
+	else if (_action.isAction(words_look, words_car)) {
 		if (!_game._visitedScenes.exists(504))
 			_vm->_dialogs->show(50116);
 		else
@@ -418,8 +418,8 @@ void room_501_preload() {
 
 	section_5_walker();
 	section_5_interface();
-	_scene->addActiveVocab(NOUN_DOOR);
-	_scene->addActiveVocab(VERB_WALK_THROUGH);
+	_scene->addActiveVocab(words_door);
+	_scene->addActiveVocab(words_walk_through);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room502.cpp b/engines/mads/madsv2/nebular/rooms/room502.cpp
index 044e49c43d4..ceac10a7cf2 100644
--- a/engines/mads/madsv2/nebular/rooms/room502.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room502.cpp
@@ -61,21 +61,21 @@ static void room_502_parser() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+	if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
 		_vm->_dialogs->show(50210);
-	else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+	else if (_action.isAction(words_look, words_keypad))
 		_vm->_dialogs->show(50211);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+	else if (_action.isAction(words_look, words_display))
 		_vm->_dialogs->show(50212);
-	else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
-		|| _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
+		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
+		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
+		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
+		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
+		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_enter_key)
+		|| _action.isAction(words_look, words_frown_key))
 		_vm->_dialogs->show(50213);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) || _action._lookFlag)
+	else if (_action.isAction(words_look, words_device) || _action._lookFlag)
 		_vm->_dialogs->show(50214);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room503.cpp b/engines/mads/madsv2/nebular/rooms/room503.cpp
index 76547658e13..906bf6b55c0 100644
--- a/engines/mads/madsv2/nebular/rooms/room503.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room503.cpp
@@ -50,7 +50,7 @@ static void room_503_init() {
 
 	if (_game._objects[OBJ_DETONATORS]._roomNumber == _scene->_currentSceneId) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		local._detonatorHotspotId = _scene->_dynamicHotspots.add(NOUN_DETONATORS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		local._detonatorHotspotId = _scene->_dynamicHotspots.add(words_detonators, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._detonatorHotspotId, Common::Point(254, 135), FACING_SOUTH);
 	}
 
@@ -63,9 +63,9 @@ static void room_503_init() {
 }
 
 static void room_503_parser() {
-	if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
+	if (_action.isAction(words_walk, words_outside))
 		_scene->_nextSceneId = 501;
-	else if (_action.isAction(VERB_TAKE, NOUN_DETONATORS)) {
+	else if (_action.isAction(words_take, words_detonators)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_DETONATORS)) {
 			switch (_game._trigger) {
 			case 0:
@@ -110,42 +110,42 @@ static void room_503_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50328);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITORING_EQUIPMENT))
+	else if (_action.isAction(words_look, words_monitoring_equipment))
 		_vm->_dialogs->show(50310);
-	else if (_action.isAction(VERB_LOOK, NOUN_PHOTON_RIFLES))
+	else if (_action.isAction(words_look, words_photon_rifles))
 		_vm->_dialogs->show(50311);
-	else if (_action.isAction(VERB_TAKE, NOUN_PHOTON_RIFLES) || _action.isAction(VERB_TAKE, NOUN_NUCLEAR_SLINGSHOT))
+	else if (_action.isAction(words_take, words_photon_rifles) || _action.isAction(words_take, words_nuclear_slingshot))
 		_vm->_dialogs->show(50312);
-	else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY_CASE))
+	else if (_action.isAction(words_look, words_display_case))
 		_vm->_dialogs->show(50313);
-	else if (_action.isAction(VERB_LOOK, NOUN_NUCLEAR_SLINGSHOT))
+	else if (_action.isAction(words_look, words_nuclear_slingshot))
 		_vm->_dialogs->show(50314);
-	else if (_action.isAction(VERB_LOOK, NOUN_WATER_COOLER))
+	else if (_action.isAction(words_look, words_water_cooler))
 		_vm->_dialogs->show(50315);
-	else if (_action.isAction(VERB_LOOK, NOUN_STORAGE_BOX))
+	else if (_action.isAction(words_look, words_storage_box))
 		_vm->_dialogs->show(50316);
-	else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX))
+	else if (_action.isAction(words_open, words_storage_box))
 		_vm->_dialogs->show(50317);
-	else if (_action.isAction(VERB_LOOK, NOUN_WARNING_LABEL))
+	else if (_action.isAction(words_look, words_warning_label))
 		_vm->_dialogs->show(50318);
-	else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+	else if (_action.isAction(words_look, words_desk))
 		_vm->_dialogs->show(50319);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+	else if (_action.isAction(words_look, words_monitor))
 		_vm->_dialogs->show(50320);
-	else if (_action.isAction(VERB_LOOK, NOUN_FILE_CABINETS))
+	else if (_action.isAction(words_look, words_file_cabinets))
 		_vm->_dialogs->show(50322);
-	else if (_action.isAction(VERB_LOOK, NOUN_BOX)) {
+	else if (_action.isAction(words_look, words_box)) {
 		if (_game._objects.isInRoom(OBJ_DETONATORS))
 			_vm->_dialogs->show(50323);
 		else
 			_vm->_dialogs->show(50324);
-	} else if (_action.isAction(VERB_LOOK, NOUN_DETONATORS) && (_action._savedFields._mainObjectSource == 4))
+	} else if (_action.isAction(words_look, words_detonators) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(50325);
-	else if (_action.isAction(VERB_LOOK, NOUN_WINDOWS))
+	else if (_action.isAction(words_look, words_windows))
 		_vm->_dialogs->show(50327);
-	else if (_action.isAction(VERB_OPEN, NOUN_DISPLAY_CASE))
+	else if (_action.isAction(words_open, words_display_case))
 		_vm->_dialogs->show(50329);
-	else if (_action.isAction(VERB_THROW, NOUN_DISPLAY_CASE) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
+	else if (_action.isAction(words_throw, words_display_case) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
 		_vm->_dialogs->show(50330);
 	else
 		return;
@@ -163,8 +163,8 @@ void room_503_preload() {
 
 	section_5_walker();
 	section_5_interface();
-	_scene->addActiveVocab(NOUN_DETONATORS);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_detonators);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room504.cpp b/engines/mads/madsv2/nebular/rooms/room504.cpp
index 1d1c826323c..040e37efe6c 100644
--- a/engines/mads/madsv2/nebular/rooms/room504.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room504.cpp
@@ -142,10 +142,10 @@ static void room_504_pre_parser() {
 }
 
 static void room_504_parser() {
-	if (_action.isAction(VERB_EXIT_FROM, NOUN_CAR)) {
+	if (_action.isAction(words_exit_from, words_car)) {
 		_vm->_sound->command(15);
 		_scene->_nextSceneId = _globals[kHoverCarLocation];
-	} else if (_action.isAction(VERB_ACTIVATE, NOUN_CAR_CONTROLS)) {
+	} else if (_action.isAction(words_activate, words_car_controls)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -204,27 +204,27 @@ static void room_504_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_INTERIOR_OF_CAR))
+	} else if (_action._lookFlag || _action.isAction(words_look, words_interior_of_car))
 		_vm->_dialogs->show(50412);
-	else if (_action.isAction(VERB_LOOK, NOUN_GLOVE_COMPARTMENT))
+	else if (_action.isAction(words_look, words_glove_compartment))
 		_vm->_dialogs->show(50410);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAR_CONTROLS) || _action.isAction(VERB_LOOK, NOUN_DASHBOARD))
+	else if (_action.isAction(words_look, words_car_controls) || _action.isAction(words_look, words_dashboard))
 		_vm->_dialogs->show(50411);
-	else if (_action.isAction(VERB_LOOK, NOUN_SCENT_PACKET))
+	else if (_action.isAction(words_look, words_scent_packet))
 		_vm->_dialogs->show(50413);
-	else if (_action.isAction(VERB_LOOK, NOUN_SODA_CANS))
+	else if (_action.isAction(words_look, words_soda_cans))
 		_vm->_dialogs->show(50414);
-	else if (_action.isAction(VERB_LOOK, NOUN_KITTY))
+	else if (_action.isAction(words_look, words_kitty))
 		_vm->_dialogs->show(50415);
-	else if (_action.isAction(VERB_LOOK, NOUN_WINDSHIELD) || _action.isAction(VERB_LOOK_THROUGH, NOUN_WINDSHIELD))
+	else if (_action.isAction(words_look, words_windshield) || _action.isAction(words_look_through, words_windshield))
 		_vm->_dialogs->show(50416);
-	else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR))
+	else if (_action.isAction(words_look, words_rearview_mirror))
 		_vm->_dialogs->show(50417);
-	else if (_action.isAction(VERB_TAKE, NOUN_REARVIEW_MIRROR))
+	else if (_action.isAction(words_take, words_rearview_mirror))
 		_vm->_dialogs->show(50418);
-	else if (_action.isAction(VERB_LOOK, NOUN_MOLDY_SOCK))
+	else if (_action.isAction(words_look, words_moldy_sock))
 		_vm->_dialogs->show(50419);
-	else if (_action.isAction(VERB_TAKE, NOUN_MOLDY_SOCK))
+	else if (_action.isAction(words_take, words_moldy_sock))
 		_vm->_dialogs->show(50420);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room505.cpp b/engines/mads/madsv2/nebular/rooms/room505.cpp
index 03e84b636ad..bfc79df9845 100644
--- a/engines/mads/madsv2/nebular/rooms/room505.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room505.cpp
@@ -280,13 +280,13 @@ static void room_505_daemon() {
 }
 
 static void room_505_parser() {
-	if (_action.isAction(VERB_PRESS))
+	if (_action.isAction(words_press))
 		local._nextButtonId = _action._activeAction._objectNameId;
-	else if (_action.isAction(VERB_RETURN_TO, NOUN_INSIDE_OF_CAR))
+	else if (_action.isAction(words_return_to, words_inside_of_car))
 		_scene->_nextSceneId = 504;
-	else if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+	else if (_action.isAction(words_look, words_view_screen))
 		_vm->_dialogs->show(50510);
-	else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+	else if (_action.isAction(words_look, words_control_panel))
 		_vm->_dialogs->show(50511);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room506.cpp b/engines/mads/madsv2/nebular/rooms/room506.cpp
index cba39a305b0..0a85dfb694a 100644
--- a/engines/mads/madsv2/nebular/rooms/room506.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room506.cpp
@@ -53,7 +53,7 @@ static void handleDoorSequences() {
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 
 	if (local._firstDoorFl) {
-		if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE) || ((_scene->_priorSceneId == 507) && !local._actionFl)) {
+		if (_action.isAction(words_walk_into, words_software_store) || ((_scene->_priorSceneId == 507) && !local._actionFl)) {
 			local._doorDepth = 13;
 			local._doorSpriteIdx = _globals._spriteIndexes[2];
 			local._doorSequenceIdx = _globals._sequenceIndexes[2];
@@ -101,7 +101,7 @@ static void handleDoorSequences() {
 	case 83:
 	{
 		local._doorSequenceIdx = _scene->_sequences.startCycle(local._doorSpriteIdx, false, 1);
-		int idx = _scene->_dynamicHotspots.add(local._doorWord, VERB_WALK_INTO, local._doorSequenceIdx, Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(local._doorWord, words_walk_into, local._doorSequenceIdx, Common::Rect(0, 0, 0, 0));
 		int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(local._doorPos_x, local._doorPos_y), FACING_NORTHWEST);
 		_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
 		_scene->_sequences.setDepth(local._doorSequenceIdx, local._doorDepth);
@@ -140,12 +140,12 @@ static void room_506_init() {
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_3");
 
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
-	int idx = _scene->_dynamicHotspots.add(NOUN_LABORATORY, VERB_WALK_INTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	int idx = _scene->_dynamicHotspots.add(words_laboratory, words_walk_into, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 	int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(65, 125), FACING_NORTHWEST);
 	_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
 	_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
-	idx = _scene->_dynamicHotspots.add(NOUN_SOFTWARE_STORE, VERB_WALK_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+	idx = _scene->_dynamicHotspots.add(words_software_store, words_walk_into, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 	hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(112, 102), FACING_NORTHWEST);
 	_scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
@@ -224,7 +224,7 @@ static void room_506_daemon() {
 }
 
 static void room_506_parser() {
-	if (_action.isAction(VERB_WALK_INTO, NOUN_LABORATORY)) {
+	if (_action.isAction(words_walk_into, words_laboratory)) {
 		if (local._firstDoorFl) {
 			local._heroFacing = FACING_NORTHWEST;
 			local._doorPos_x = 16;
@@ -232,7 +232,7 @@ static void room_506_parser() {
 		}
 		local._actionFl = true;
 		handleDoorSequences();
-	} else if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE)) {
+	} else if (_action.isAction(words_walk_into, words_software_store)) {
 		if (local._firstDoorFl) {
 			local._heroFacing = FACING_NORTHWEST;
 			local._doorPos_x = 80;
@@ -240,7 +240,7 @@ static void room_506_parser() {
 		}
 		local._actionFl = true;
 		handleDoorSequences();
-	} else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+	} else if (_action.isAction(words_get_into, words_car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -279,29 +279,29 @@ static void room_506_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET))
+	} else if (_action._lookFlag || _action.isAction(words_look, words_street))
 		_vm->_dialogs->show(50618);
-	else if (_action.isAction(VERB_LOOK, NOUN_RESTAURANT))
+	else if (_action.isAction(words_look, words_restaurant))
 		_vm->_dialogs->show(50610);
-	else if (_action.isAction(VERB_LOOK, NOUN_MOTEL))
+	else if (_action.isAction(words_look, words_motel))
 		_vm->_dialogs->show(50611);
-	else if (_action.isAction(VERB_LOOK, NOUN_CYCLE_SHOP))
+	else if (_action.isAction(words_look, words_cycle_shop))
 		_vm->_dialogs->show(50612);
-	else if (_action.isAction(VERB_LOOK, NOUN_AIR_BIKE))
+	else if (_action.isAction(words_look, words_air_bike))
 		_vm->_dialogs->show(50613);
-	else if (_action.isAction(VERB_TAKE, NOUN_AIR_BIKE))
+	else if (_action.isAction(words_take, words_air_bike))
 		_vm->_dialogs->show(50614);
-	else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_STORE))
+	else if (_action.isAction(words_look, words_software_store))
 		_vm->_dialogs->show(50615);
-	else if (_action.isAction(VERB_LOOK, NOUN_LABORATORY))
+	else if (_action.isAction(words_look, words_laboratory))
 		_vm->_dialogs->show(50616);
-	else if (_action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
+	else if (_action.isAction(words_look, words_street_to_west) || _action.isAction(words_walk_down, words_street_to_west))
 		_vm->_dialogs->show(50617);
-	else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_STORE_SIGN))
+	else if (_action.isAction(words_look, words_software_store_sign))
 		_vm->_dialogs->show(50619);
-	else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+	else if (_action.isAction(words_look, words_car))
 		_vm->_dialogs->show(50620);
-	else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+	else if (_action.isAction(words_look, words_sky))
 		_vm->_dialogs->show(50621);
 	else
 		return;
@@ -332,9 +332,9 @@ void room_506_preload() {
 
 	section_5_walker();
 	section_5_interface();
-	_scene->addActiveVocab(VERB_WALK_INTO);
-	_scene->addActiveVocab(NOUN_SOFTWARE_STORE);
-	_scene->addActiveVocab(NOUN_LABORATORY);
+	_scene->addActiveVocab(words_walk_into);
+	_scene->addActiveVocab(words_software_store);
+	_scene->addActiveVocab(words_laboratory);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room507.cpp b/engines/mads/madsv2/nebular/rooms/room507.cpp
index dfdac14250b..beec85a7dba 100644
--- a/engines/mads/madsv2/nebular/rooms/room507.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room507.cpp
@@ -46,7 +46,7 @@ static void room_507_init() {
 
 	if ((_game._difficulty != DIFFICULTY_EASY) && (_game._objects[OBJ_PENLIGHT]._roomNumber == _scene->_currentSceneId)) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		local._penlightHotspotId = _scene->_dynamicHotspots.add(NOUN_PENLIGHT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		local._penlightHotspotId = _scene->_dynamicHotspots.add(words_penlight, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._penlightHotspotId, Common::Point(233, 152), FACING_SOUTHEAST);
 	}
 
@@ -59,9 +59,9 @@ static void room_507_init() {
 }
 
 static void room_507_parser() {
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
+	if (_action.isAction(words_walk_through, words_entrance))
 		_scene->_nextSceneId = 506;
-	else if (_action.isAction(VERB_TAKE, NOUN_PENLIGHT)) {
+	else if (_action.isAction(words_take, words_penlight)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_PENLIGHT)) {
 			switch (_game._trigger) {
 			case 0:
@@ -94,50 +94,50 @@ static void room_507_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50722);
-	else if (_action.isAction(VERB_LOOK, NOUN_SWIRLING_LIGHT))
+	else if (_action.isAction(words_look, words_swirling_light))
 		_vm->_dialogs->show(50710);
-	else if (_action.isAction(VERB_TAKE, NOUN_SWIRLING_LIGHT))
+	else if (_action.isAction(words_take, words_swirling_light))
 		_vm->_dialogs->show(50711);
-	else if (_action.isAction(VERB_LOOK, NOUN_OLD_SOFTWARE))
+	else if (_action.isAction(words_look, words_old_software))
 		_vm->_dialogs->show(50712);
-	else if (_action.isAction(VERB_TAKE, NOUN_OLD_SOFTWARE))
+	else if (_action.isAction(words_take, words_old_software))
 		_vm->_dialogs->show(50713);
-	else if (_action.isAction(VERB_LOOK, NOUN_ADVERTISEMENT))
+	else if (_action.isAction(words_look, words_advertisement))
 		_vm->_dialogs->show(50714);
-	else if (_action.isAction(VERB_LOOK, NOUN_ADVERTISING_POSTER))
+	else if (_action.isAction(words_look, words_advertising_poster))
 		_vm->_dialogs->show(50715);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIGN)) {
+	else if (_action.isAction(words_look, words_sign)) {
 		if (_scene->_customDest.x < 100)
 			_vm->_dialogs->show(50726);
 		else
 			_vm->_dialogs->show(50716);
-	} else if (_action.isAction(VERB_LOOK, NOUN_HOTTEST_SOFTWARE))
+	} else if (_action.isAction(words_look, words_hottest_software))
 		_vm->_dialogs->show(50717);
-	else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_SHELF))
+	else if (_action.isAction(words_look, words_software_shelf))
 		_vm->_dialogs->show(50718);
-	else if (_action.isAction(VERB_LOOK, NOUN_SENSOR))
+	else if (_action.isAction(words_look, words_sensor))
 		_vm->_dialogs->show(50719);
-	else if (_action.isAction(VERB_LOOK, NOUN_CASH_REGISTER))
+	else if (_action.isAction(words_look, words_cash_register))
 		_vm->_dialogs->show(50720);
-	else if (_action.isAction(VERB_LOOK, NOUN_PAD_OF_PAPER))
+	else if (_action.isAction(words_look, words_pad_of_paper))
 		_vm->_dialogs->show(50721);
-	else if (_action.isAction(VERB_OPEN, NOUN_CASH_REGISTER))
+	else if (_action.isAction(words_open, words_cash_register))
 		_vm->_dialogs->show(50723);
-	else if (_action.isAction(VERB_LOOK, NOUN_BARGAIN_VAT))
+	else if (_action.isAction(words_look, words_bargain_vat))
 		_vm->_dialogs->show(50724);
-	else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+	else if (_action.isAction(words_look, words_window))
 		_vm->_dialogs->show(50725);
-	else if (_action.isAction(VERB_WALK_BEHIND, NOUN_COUNTER)) {
+	else if (_action.isAction(words_walk_behind, words_counter)) {
 		// WORKAROUND: Empty handling to prevent default "can't do that" dialogs showing
-	} else if (_action.isAction(VERB_LOOK, NOUN_COUNTER)) {
+	} else if (_action.isAction(words_look, words_counter)) {
 		if (_game._objects.isInRoom(OBJ_PENLIGHT))
 			_vm->_dialogs->show(50728);
 		else
 			_vm->_dialogs->show(50727);
-	} else if (_action.isAction(VERB_LOOK, NOUN_PENLIGHT) && !_game._objects.isInInventory(OBJ_PENLIGHT)) {
+	} else if (_action.isAction(words_look, words_penlight) && !_game._objects.isInInventory(OBJ_PENLIGHT)) {
 		if (_game._objects.isInRoom(OBJ_PENLIGHT))
 			_vm->_dialogs->show(50729);
-	} else if (_action.isAction(VERB_LOOK, NOUN_EMERGENCY_LIGHT))
+	} else if (_action.isAction(words_look, words_emergency_light))
 		_vm->_dialogs->show(50731);
 	else
 		return;
@@ -155,8 +155,8 @@ void room_507_preload() {
 
 	section_5_walker();
 	section_5_interface();
-	_scene->addActiveVocab(NOUN_PENLIGHT);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_penlight);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room508.cpp b/engines/mads/madsv2/nebular/rooms/room508.cpp
index 00b2d3bbeed..a3cb453ee31 100644
--- a/engines/mads/madsv2/nebular/rooms/room508.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room508.cpp
@@ -58,25 +58,25 @@ static void room_508_init() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
 		_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
-		int idx = _scene->_dynamicHotspots.add(NOUN_SPINACH_PATCH_DOLL, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_spinach_patch_doll, words_walkto, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
-		_scene->_hotspots.activate(NOUN_HOLE, false);
-		_scene->_hotspots.activate(NOUN_LASER_BEAM, false);
+		_scene->_hotspots.activate(words_hole, false);
+		_scene->_hotspots.activate(words_laser_beam, false);
 	} else {
 		_scene->changeVariant(1);
 		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
 		_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
-		int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_laser_beam, words_walkto, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
 		_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
 		if (_globals[kLaserHoleIsThere]) {
 			_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
-			_scene->_hotspots.activate(NOUN_HOLE, true);
-			_scene->_hotspots.activate(NOUN_LASER_BEAM, true);
+			_scene->_hotspots.activate(words_hole, true);
+			_scene->_hotspots.activate(words_laser_beam, true);
 		}
 		_vm->_sound->command(21);
 	}
@@ -100,7 +100,7 @@ static void room_508_init() {
 }
 
 static void room_508_pre_parser() {
-	if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
+	if (_action.isAction(words_walk, words_outside))
 		_game._player._walkOffScreenSceneId = 506;
 }
 
@@ -135,8 +135,8 @@ static void handlePedestral() {
 
 		case 2:
 			_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
-			_scene->_hotspots.activate(NOUN_HOLE, true);
-			_scene->_hotspots.activate(NOUN_LASER_BEAM, true);
+			_scene->_hotspots.activate(words_hole, true);
+			_scene->_hotspots.activate(words_laser_beam, true);
 			break;
 
 		case 3:
@@ -158,7 +158,7 @@ static void handlePedestral() {
 }
 
 static void room_508_parser() {
-	if (_action.isAction(VERB_PULL, NOUN_LEVER)) {
+	if (_action.isAction(words_pull, words_lever)) {
 		if (!_globals[kLaserOn]) {
 			switch (_game._trigger) {
 			case 0:
@@ -204,7 +204,7 @@ static void room_508_parser() {
 				_vm->_sound->command(22);
 				_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
-				int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+				int idx = _scene->_dynamicHotspots.add(words_laser_beam, words_walkto, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
 				_scene->_kernelMessages.reset();
 				_scene->changeVariant(1);
@@ -224,60 +224,60 @@ static void room_508_parser() {
 		} else {
 			_vm->_dialogs->show(50837);
 		}
-	} else if (_action.isAction(VERB_REFLECT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM)) {
+	} else if (_action.isAction(words_reflect, words_rearview_mirror, words_laser_beam) || _action.isAction(words_put, words_rearview_mirror, words_pedestal) || _action.isAction(words_put, words_rearview_mirror, words_laser_beam)) {
 		local._chosenObject = 1;
 		handlePedestral();
-	} else if (_action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM)) {
+	} else if (_action.isAction(words_put, words_compact_case, words_pedestal) || _action.isAction(words_put, words_compact_case, words_laser_beam) || _action.isAction(words_reflect, words_compact_case, words_laser_beam)) {
 		local._chosenObject = 2;
 		handlePedestral();
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50822);
-	else if (_action.isAction(VERB_LOOK, NOUN_TARGET_AREA))
+	else if (_action.isAction(words_look, words_target_area))
 		_vm->_dialogs->show(50810);
-	else if (_action.isAction(VERB_LOOK, NOUN_SPINACH_PATCH_DOLL))
+	else if (_action.isAction(words_look, words_spinach_patch_doll))
 		_vm->_dialogs->show(50811);
-	else if (_action.isAction(VERB_TAKE, NOUN_SPINACH_PATCH_DOLL))
+	else if (_action.isAction(words_take, words_spinach_patch_doll))
 		_vm->_dialogs->show(50812);
-	else if (_action.isAction(VERB_LOOK, NOUN_SAND_BAGS))
+	else if (_action.isAction(words_look, words_sand_bags))
 		_vm->_dialogs->show(50816);
-	else if (_action.isAction(VERB_TAKE, NOUN_SAND_BAGS))
+	else if (_action.isAction(words_take, words_sand_bags))
 		_vm->_dialogs->show(50817);
-	else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_STATION))
+	else if (_action.isAction(words_look, words_control_station))
 		_vm->_dialogs->show(50818);
-	else if (_action.isAction(VERB_LOOK, NOUN_MONITOR)) {
+	else if (_action.isAction(words_look, words_monitor)) {
 		if (_globals[kLaserOn])
 			_vm->_dialogs->show(50820);
 		else
 			_vm->_dialogs->show(50819);
-	} else if (_action.isAction(VERB_LOOK, NOUN_LASER_CANNON)) {
+	} else if (_action.isAction(words_look, words_laser_cannon)) {
 		if (_globals[kLaserOn])
 			_vm->_dialogs->show(50822);
 		else
 			_vm->_dialogs->show(50821);
-	} else if (_action.isAction(VERB_TAKE, NOUN_LASER_CANNON))
+	} else if (_action.isAction(words_take, words_laser_cannon))
 		_vm->_dialogs->show(50823);
-	else if (_action.isAction(VERB_LOOK, NOUN_LEVER)) {
+	else if (_action.isAction(words_look, words_lever)) {
 		if (_globals[kLaserOn])
 			_vm->_dialogs->show(50825);
 		else
 			_vm->_dialogs->show(50824);
-	} else if (_action.isAction(VERB_PUSH, NOUN_LEVER))
+	} else if (_action.isAction(words_push, words_lever))
 		_vm->_dialogs->show(50826);
-	else if (_action.isAction(VERB_LOOK, NOUN_LASER_BEAM)) {
+	else if (_action.isAction(words_look, words_laser_beam)) {
 		if (_globals[kLaserHoleIsThere])
 			_vm->_dialogs->show(50828);
 		else
 			_vm->_dialogs->show(50827);
-	} else if (_action.isAction(VERB_TAKE, NOUN_LASER_BEAM))
+	} else if (_action.isAction(words_take, words_laser_beam))
 		_vm->_dialogs->show(50829);
-	else if (_action.isAction(VERB_LOOK, NOUN_CEILING)) {
+	else if (_action.isAction(words_look, words_ceiling)) {
 		if (_globals[kLaserHoleIsThere])
 			_vm->_dialogs->show(50831);
 		else
 			_vm->_dialogs->show(50830);
-	} else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+	} else if (_action.isAction(words_look, words_wall))
 		_vm->_dialogs->show(50832);
-	else if (_action.isAction(VERB_LOOK, NOUN_PEDESTAL)) {
+	else if (_action.isAction(words_look, words_pedestal)) {
 		if (!_globals[kLaserOn])
 			_vm->_dialogs->show(50813);
 		else if (!_globals[kLaserHoleIsThere])
@@ -301,9 +301,9 @@ void room_508_preload() {
 
 	section_5_walker();
 	section_5_interface();
-	_scene->addActiveVocab(NOUN_SPINACH_PATCH_DOLL);
-	_scene->addActiveVocab(VERB_WALKTO);
-	_scene->addActiveVocab(NOUN_LASER_BEAM);
+	_scene->addActiveVocab(words_spinach_patch_doll);
+	_scene->addActiveVocab(words_walkto);
+	_scene->addActiveVocab(words_laser_beam);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room511.cpp b/engines/mads/madsv2/nebular/rooms/room511.cpp
index e3121f98724..de45b147809 100644
--- a/engines/mads/madsv2/nebular/rooms/room511.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room511.cpp
@@ -55,10 +55,10 @@ static void room_511_init() {
 		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 0));
 		_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
-		_scene->_hotspots.activate(NOUN_BOAT, false);
-		int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+		_scene->_hotspots.activate(words_boat, false);
+		int idx = _scene->_dynamicHotspots.add(words_boat, words_walkto, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(75, 124), FACING_NORTH);
-		_scene->_hotspots.activate(NOUN_ROPE, false);
+		_scene->_hotspots.activate(words_rope, false);
 	} else {
 		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('b', 2));
 		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 3));
@@ -73,8 +73,8 @@ static void room_511_init() {
 		_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 
-		_scene->_hotspots.activate(NOUN_ROPE, true);
-		_scene->_hotspots.activate(NOUN_BOAT, true);
+		_scene->_hotspots.activate(words_rope, true);
+		_scene->_hotspots.activate(words_boat, true);
 		_scene->changeVariant(1);
 	}
 
@@ -87,7 +87,7 @@ static void room_511_init() {
 	if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
 		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('b', 4));
 		_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, frame);
-		int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+		int idx = _scene->_dynamicHotspots.add(words_fishing_line, words_walkto, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 3);
 		if (_globals[kBoatRaised])
@@ -177,10 +177,10 @@ static void room_511_pre_parser() {
 	if (!local._handingLine)
 		return;
 
-	if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
+	if (_action.isAction(words_look) || _action.isObject(words_fishing_line) || _action.isAction(words_talkto))
 		_game._player._needToWalk = false;
 
-	if ((!_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || !_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) && _game._player._needToWalk) {
+	if ((!_action.isAction(words_tie, words_fishing_line, words_boat) || !_action.isAction(words_attach, words_fishing_line, words_boat)) && _game._player._needToWalk) {
 		if (_game._trigger == 0) {
 			_game._player._readyToWalk = false;
 			_game._player._stepEnabled = false;
@@ -199,9 +199,9 @@ static void room_511_pre_parser() {
 }
 
 static void room_511_parser() {
-	if (_action.isAction(VERB_WALK_INTO, NOUN_RESTAURANT))
+	if (_action.isAction(words_walk_into, words_restaurant))
 		_scene->_nextSceneId = 512;
-	else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+	else if (_action.isAction(words_get_into, words_car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -241,7 +241,7 @@ static void room_511_parser() {
 		default:
 			break;
 		}
-	} else 	if (_action.isAction(VERB_TAKE, NOUN_FISHING_LINE)) {
+	} else 	if (_action.isAction(words_take, words_fishing_line)) {
 		if (!_globals[kBoatRaised]) {
 			if (_globals[kLineStatus] == 2) {
 				if (_globals[kLineStatus] != 3) {
@@ -271,8 +271,8 @@ static void room_511_parser() {
 		} else {
 			_vm->_dialogs->show(51130);
 		}
-	} else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) ||
-		_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) {
+	} else if (_action.isAction(words_tie, words_fishing_line, words_boat) ||
+		_action.isAction(words_attach, words_fishing_line, words_boat)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51131);
 		else if (_globals[kLineStatus] == 1)
@@ -292,7 +292,7 @@ static void room_511_parser() {
 						_game._player._visible = true;
 						_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 4);
-						int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+						int idx = _scene->_dynamicHotspots.add(words_fishing_line, words_walkto, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
 						_scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
 						_game._objects.removeFromInventory(OBJ_FISHING_LINE, 1);
 						local._handingLine = false;
@@ -303,7 +303,7 @@ static void room_511_parser() {
 				}
 			}
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_STREET) || _action._lookFlag) {
+	} else if (_action.isAction(words_look, words_street) || _action._lookFlag) {
 		if (_globals[kLineStatus] == 2)
 			_vm->_dialogs->show(51110);
 		else {
@@ -312,45 +312,45 @@ static void room_511_parser() {
 			else
 				_vm->_dialogs->show(51112);
 		}
-	} else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+	} else if (_action.isAction(words_look, words_car))
 		_vm->_dialogs->show(51113);
-	else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK))
+	else if (_action.isAction(words_look, words_sidewalk))
 		_vm->_dialogs->show(51114);
-	else if (_action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_EAST) || _action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_EAST))
+	else if (_action.isAction(words_walk_down, words_sidewalk_to_east) || _action.isAction(words_walk_down, words_sidewalk_to_west) || _action.isAction(words_walk_down, words_street_to_east))
 		_vm->_dialogs->show(51115);
-	else if (_action.isAction(VERB_LOOK, NOUN_PLEASURE_DOME))
+	else if (_action.isAction(words_look, words_pleasure_dome))
 		_vm->_dialogs->show(51116);
-	else if (_action.isAction(VERB_LOOK, NOUN_TICKET_BOOTH))
+	else if (_action.isAction(words_look, words_ticket_booth))
 		_vm->_dialogs->show(51117);
-	else if (_action.isAction(VERB_LOOK, NOUN_DOME_ENTRANCE))
+	else if (_action.isAction(words_look, words_dome_entrance))
 		_vm->_dialogs->show(51118);
-	else if (_action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_DOME_ENTRANCE) || _action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_DOME_ENTRANCE))
+	else if (_action.isAction(words_unlock, words_padlock_key, words_dome_entrance) || _action.isAction(words_unlock, words_door_key, words_dome_entrance))
 		_vm->_dialogs->show(51119);
-	else if ((_action.isAction(VERB_PUT) || _action.isAction(VERB_THROW))
-		&& (_action.isObject(NOUN_TIMEBOMB) || _action.isObject(NOUN_BOMB) || _action.isObject(NOUN_BOMBS))
-		&& _action.isObject(NOUN_DOME_ENTRANCE))
+	else if ((_action.isAction(words_put) || _action.isAction(words_throw))
+		&& (_action.isObject(words_timebomb) || _action.isObject(words_bomb) || _action.isObject(words_bombs))
+		&& _action.isObject(words_dome_entrance))
 		_vm->_dialogs->show(51120);
-	else if (_action.isAction(VERB_LOOK, NOUN_RESTAURANT)) {
+	else if (_action.isAction(words_look, words_restaurant)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51121);
 		else
 			_vm->_dialogs->show(51128);
-	} else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE))
+	} else if (_action.isAction(words_look, words_porthole))
 		_vm->_dialogs->show(51122);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2))
+	else if (_action.isAction(words_look, words_fishing_line) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2))
 		_vm->_dialogs->show(51126);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3))
+	else if (_action.isAction(words_look, words_fishing_line) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3))
 		_vm->_dialogs->show(51133);
-	else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
+	else if (_action.isAction(words_look, words_statue))
 		_vm->_dialogs->show(51127);
-	else if (_action.isAction(VERB_LOOK, NOUN_BOAT))
+	else if (_action.isAction(words_look, words_boat))
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51123);
 		else if (_globals[kLineStatus] != 3)
 			_vm->_dialogs->show(51124);
 		else
 			_vm->_dialogs->show(51125);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_globals[kLineStatus] == 3))
+	else if (_action.isAction(words_look, words_fishing_line) && (_globals[kLineStatus] == 3))
 		_vm->_dialogs->show(51125);
 	else
 		return;
@@ -375,9 +375,9 @@ void room_511_preload() {
 
 	section_5_walker();
 	section_5_interface();
-	_scene->addActiveVocab(NOUN_BOAT);
-	_scene->addActiveVocab(NOUN_FISHING_LINE);
-	_scene->addActiveVocab(VERB_WALKTO);
+	_scene->addActiveVocab(words_boat);
+	_scene->addActiveVocab(words_fishing_line);
+	_scene->addActiveVocab(words_walkto);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/nebular/rooms/room512.cpp b/engines/mads/madsv2/nebular/rooms/room512.cpp
index f85f423fde0..a5ac8ebb1bc 100644
--- a/engines/mads/madsv2/nebular/rooms/room512.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room512.cpp
@@ -52,38 +52,38 @@ static void room_512_init() {
 
 	if (_game._objects[OBJ_FISHING_ROD]._roomNumber == _scene->_currentSceneId) {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
-		local._fishingRodHotspotId = _scene->_dynamicHotspots.add(NOUN_FISHING_ROD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+		local._fishingRodHotspotId = _scene->_dynamicHotspots.add(words_fishing_rod, words_walkto, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots.setPosition(local._fishingRodHotspotId, Common::Point(199, 101), FACING_NORTHEAST);
 	}
 
 	if (!_game._visitedScenes._sceneRevisited)
 		_globals[kRegisterOpen] = false;
 
-	_scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+	_scene->_hotspots.activate(words_padlock_key, false);
 	if (_game._difficulty == DIFFICULTY_EASY) {
 		if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 3);
-			local._keyHotspotId = _scene->_dynamicHotspots.add(NOUN_PADLOCK_KEY, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+			local._keyHotspotId = _scene->_dynamicHotspots.add(words_padlock_key, words_walkto, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(local._keyHotspotId, Common::Point(218, 152), FACING_NORTHEAST);
 		}
 		if (_globals[kRegisterOpen]) {
 			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
-			_scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+			_scene->_hotspots.activate(words_padlock_key, false);
 		}
 	} else if (_globals[kRegisterOpen]) {
 		if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
-			_scene->_hotspots.activate(NOUN_PADLOCK_KEY, true);
+			_scene->_hotspots.activate(words_padlock_key, true);
 			_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 3);
 		} else {
-			_scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+			_scene->_hotspots.activate(words_padlock_key, false);
 			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
 		}
 	} else
-		_scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+		_scene->_hotspots.activate(words_padlock_key, false);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(144, 152);
@@ -94,9 +94,9 @@ static void room_512_init() {
 }
 
 static void room_512_parser() {
-	if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
+	if (_action.isAction(words_walk, words_outside))
 		_scene->_nextSceneId = 511;
-	else if (_action.isAction(VERB_TAKE, NOUN_FISHING_ROD)) {
+	else if (_action.isAction(words_take, words_fishing_rod)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_FISHING_ROD)) {
 			switch (_game._trigger) {
 			case 0:
@@ -126,7 +126,7 @@ static void room_512_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(VERB_OPEN, NOUN_CASH_REGISTER)) {
+	} else if (_action.isAction(words_open, words_cash_register)) {
 		if (!_globals[kRegisterOpen]) {
 			switch (_game._trigger) {
 			case 0:
@@ -173,7 +173,7 @@ static void room_512_parser() {
 			case 5:
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 14, 0, 0, 0);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 3);
-				_scene->_hotspots.activate(NOUN_PADLOCK_KEY, true);
+				_scene->_hotspots.activate(words_padlock_key, true);
 				_scene->_sequences.addTimer(60, 6);
 				break;
 
@@ -187,7 +187,7 @@ static void room_512_parser() {
 			}
 		} else
 			_vm->_dialogs->show(51239);
-	} else if (_action.isAction(VERB_CLOSE, NOUN_CASH_REGISTER) && _globals[kRegisterOpen]) {
+	} else if (_action.isAction(words_close, words_cash_register) && _globals[kRegisterOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -210,7 +210,7 @@ static void room_512_parser() {
 				_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 				_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 3);
-				_scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+				_scene->_hotspots.activate(words_padlock_key, false);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			}
 			break;
@@ -223,7 +223,7 @@ static void room_512_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(VERB_TAKE, NOUN_PADLOCK_KEY)) {
+	} else if (_action.isAction(words_take, words_padlock_key)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_PADLOCK_KEY)) {
 			switch (_game._trigger) {
 			case 0:
@@ -251,7 +251,7 @@ static void room_512_parser() {
 					_scene->_sequences.remove(_globals._sequenceIndexes[5]);
 					_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
-					_scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+					_scene->_hotspots.activate(words_padlock_key, false);
 				}
 				_vm->_sound->command(9);
 				_game._objects.addToInventory(OBJ_PADLOCK_KEY);
@@ -270,51 +270,51 @@ static void room_512_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(51225);
-	else if (_action.isAction(VERB_LOOK, NOUN_PADLOCK_KEY) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
+	else if (_action.isAction(words_look, words_padlock_key) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
 		_vm->_dialogs->show(51215);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (!_scene->_animation[0] ||
+	else if (_action.isAction(words_look, words_fishing_rod) && (!_scene->_animation[0] ||
 		_scene->_animation[0]->getCurrentFrame() == 4))
 		_vm->_dialogs->show(51216);
-	else if (_action.isAction(VERB_LOOK, NOUN_SHIPS_WHEEL))


Commit: b139bdb0a2e41172175711693380a8e222041b4f
    https://github.com/scummvm/scummvm/commit/b139bdb0a2e41172175711693380a8e222041b4f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:23+10:00

Commit Message:
MADS: NEBULAR: Change parse/isAction calls to use proper player_said_* defines

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/rooms/room101.cpp
    engines/mads/madsv2/nebular/rooms/room102.cpp
    engines/mads/madsv2/nebular/rooms/room103.cpp
    engines/mads/madsv2/nebular/rooms/room104.cpp
    engines/mads/madsv2/nebular/rooms/room105.cpp
    engines/mads/madsv2/nebular/rooms/room106.cpp
    engines/mads/madsv2/nebular/rooms/room107.cpp
    engines/mads/madsv2/nebular/rooms/room108.cpp
    engines/mads/madsv2/nebular/rooms/room109.cpp
    engines/mads/madsv2/nebular/rooms/room110.cpp
    engines/mads/madsv2/nebular/rooms/room111.cpp
    engines/mads/madsv2/nebular/rooms/room201.cpp
    engines/mads/madsv2/nebular/rooms/room202.cpp
    engines/mads/madsv2/nebular/rooms/room203.cpp
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room208.cpp
    engines/mads/madsv2/nebular/rooms/room209.cpp
    engines/mads/madsv2/nebular/rooms/room210.cpp
    engines/mads/madsv2/nebular/rooms/room211.cpp
    engines/mads/madsv2/nebular/rooms/room212.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp
    engines/mads/madsv2/nebular/rooms/room214.cpp
    engines/mads/madsv2/nebular/rooms/room215.cpp
    engines/mads/madsv2/nebular/rooms/room307.cpp
    engines/mads/madsv2/nebular/rooms/room311.cpp
    engines/mads/madsv2/nebular/rooms/room313.cpp
    engines/mads/madsv2/nebular/rooms/room316.cpp
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room320.cpp
    engines/mads/madsv2/nebular/rooms/room322.cpp
    engines/mads/madsv2/nebular/rooms/room351.cpp
    engines/mads/madsv2/nebular/rooms/room352.cpp
    engines/mads/madsv2/nebular/rooms/room353.cpp
    engines/mads/madsv2/nebular/rooms/room354.cpp
    engines/mads/madsv2/nebular/rooms/room357.cpp
    engines/mads/madsv2/nebular/rooms/room358.cpp
    engines/mads/madsv2/nebular/rooms/room359.cpp
    engines/mads/madsv2/nebular/rooms/room360.cpp
    engines/mads/madsv2/nebular/rooms/room361.cpp
    engines/mads/madsv2/nebular/rooms/room366.cpp
    engines/mads/madsv2/nebular/rooms/room387.cpp
    engines/mads/madsv2/nebular/rooms/room388.cpp
    engines/mads/madsv2/nebular/rooms/room389.cpp
    engines/mads/madsv2/nebular/rooms/room390.cpp
    engines/mads/madsv2/nebular/rooms/room391.cpp
    engines/mads/madsv2/nebular/rooms/room399.cpp
    engines/mads/madsv2/nebular/rooms/room401.cpp
    engines/mads/madsv2/nebular/rooms/room402.cpp
    engines/mads/madsv2/nebular/rooms/room405.cpp
    engines/mads/madsv2/nebular/rooms/room406.cpp
    engines/mads/madsv2/nebular/rooms/room407.cpp
    engines/mads/madsv2/nebular/rooms/room408.cpp
    engines/mads/madsv2/nebular/rooms/room409.cpp
    engines/mads/madsv2/nebular/rooms/room410.cpp
    engines/mads/madsv2/nebular/rooms/room411.cpp
    engines/mads/madsv2/nebular/rooms/room413.cpp
    engines/mads/madsv2/nebular/rooms/room501.cpp
    engines/mads/madsv2/nebular/rooms/room502.cpp
    engines/mads/madsv2/nebular/rooms/room503.cpp
    engines/mads/madsv2/nebular/rooms/room504.cpp
    engines/mads/madsv2/nebular/rooms/room505.cpp
    engines/mads/madsv2/nebular/rooms/room506.cpp
    engines/mads/madsv2/nebular/rooms/room507.cpp
    engines/mads/madsv2/nebular/rooms/room508.cpp
    engines/mads/madsv2/nebular/rooms/room511.cpp
    engines/mads/madsv2/nebular/rooms/room512.cpp
    engines/mads/madsv2/nebular/rooms/room513.cpp
    engines/mads/madsv2/nebular/rooms/room551.cpp
    engines/mads/madsv2/nebular/rooms/room601.cpp
    engines/mads/madsv2/nebular/rooms/room602.cpp
    engines/mads/madsv2/nebular/rooms/room603.cpp
    engines/mads/madsv2/nebular/rooms/room604.cpp
    engines/mads/madsv2/nebular/rooms/room607.cpp
    engines/mads/madsv2/nebular/rooms/room608.cpp
    engines/mads/madsv2/nebular/rooms/room609.cpp
    engines/mads/madsv2/nebular/rooms/room610.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp
    engines/mads/madsv2/nebular/rooms/room612.cpp
    engines/mads/madsv2/nebular/rooms/room701.cpp
    engines/mads/madsv2/nebular/rooms/room702.cpp
    engines/mads/madsv2/nebular/rooms/room703.cpp
    engines/mads/madsv2/nebular/rooms/room704.cpp
    engines/mads/madsv2/nebular/rooms/room705.cpp
    engines/mads/madsv2/nebular/rooms/room706.cpp
    engines/mads/madsv2/nebular/rooms/room707.cpp
    engines/mads/madsv2/nebular/rooms/room710.cpp
    engines/mads/madsv2/nebular/rooms/room751.cpp
    engines/mads/madsv2/nebular/rooms/room752.cpp
    engines/mads/madsv2/nebular/rooms/room801.cpp
    engines/mads/madsv2/nebular/rooms/room802.cpp
    engines/mads/madsv2/nebular/rooms/room803.cpp
    engines/mads/madsv2/nebular/rooms/room804.cpp
    engines/mads/madsv2/nebular/rooms/room805.cpp
    engines/mads/madsv2/nebular/rooms/room807.cpp
    engines/mads/madsv2/nebular/rooms/room808.cpp
    engines/mads/madsv2/nebular/rooms/teleporter.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index c3cb8d7de4e..56306b78203 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -236,99 +236,99 @@ void RexNebularEngine::showRecipe() {
 void RexNebularEngine::global_parser_code() {
 	int id;
 
-	if (player_parse(words_smell, 0) && room_id > 103 && room_id < 111) {
+	if (player_said_1(smell) && room_id > 103 && room_id < 111) {
 		text_show(440);
-	} else if (player_parse(words_eat, 0) && room_id > 103 && room_id < 111) {
+	} else if (player_said_1(eat) && room_id > 103 && room_id < 111) {
 		text_show(441);
-	} else if (player_parse(words_smell, words_burger, 0)) {
+	} else if (player_said_2(smell, burger)) {
 		text_show(442);
-	} else if (player_parse(words_eat, words_burger, 0)) {
+	} else if (player_said_2(eat, burger)) {
 		text_show(443);
-	} else if (player_parse(words_smell, words_stuffed_fish, 0)) {
+	} else if (player_said_2(smell, stuffed_fish)) {
 		text_show(444);
-	} else if (player_parse(words_eat, words_stuffed_fish, 0)) {
+	} else if (player_said_2(eat, stuffed_fish)) {
 		text_show(445);
-	} else if (player_parse(words_wear, words_rebreather, 0)) {
+	} else if (player_said_2(wear, rebreather)) {
 		text_show(room_id > 103 && room_id < 111 ? 446 : 447);
-	} else if (player_parse(words_set, words_timer_module, 0)) {
+	} else if (player_said_2(set, timer_module)) {
 		text_show(448);
-	} else if (player_parse(words_nibble_on, words_big_leaves, 0)) {
+	} else if (player_said_2(nibble_on, big_leaves)) {
 		text_show(449);
-	} else if (player_parse(words_lick, words_poison_darts, 0)) {
+	} else if (player_said_2(lick, poison_darts)) {
 		text_show(450);
-	} else if (player_parse(words_eat, words_twinkifruit, 0)) {
+	} else if (player_said_2(eat, twinkifruit)) {
 		inter_move_object(OBJ_TWINKIFRUIT, NOWHERE);
 		text_show(451);
-	} else if (player_parse(words_gorge_on, words_twinkifruit, 0)) {
+	} else if (player_said_2(gorge_on, twinkifruit)) {
 		inter_move_object(OBJ_TWINKIFRUIT, NOWHERE);
 		text_show(452);
-	} else if (player_parse(words_gnaw_on, 0)) {
+	} else if (player_said_1(gnaw_on)) {
 		text_show(453);
-	} else if (player_parse(words_massage, words_audio_tape, 0)) {
+	} else if (player_said_2(massage, audio_tape)) {
 		text_show(454);
-	} else if (player_parse(words_mangle, words_credit_chip, 0)) {
+	} else if (player_said_2(mangle, credit_chip)) {
 		text_show(455);
-	} else if (player_parse(words_fondle, words_charge_cases, 0)) {
+	} else if (player_said_2(fondle, charge_cases)) {
 		text_show(456);
-	} else if (player_parse(words_rub, words_bomb, 0)) {
+	} else if (player_said_2(rub, bomb)) {
 		text_show(457);
-	} else if (player_parse(words_set, words_timebomb, 0)) {
+	} else if (player_said_2(set, timebomb)) {
 		text_show(458);
-	} else if (player_parse(words_guzzle, words_alien_liquor, 0)) {
+	} else if (player_said_2(guzzle, alien_liquor)) {
 		text_show(459);
-	} else if (player_parse(words_smash, words_target_module, 0)) {
+	} else if (player_said_2(smash, target_module)) {
 		text_show(460);
-	} else if (player_parse(words_juggle, 0)) {
+	} else if (player_said_1(juggle)) {
 		text_show(461);
-	} else if (player_parse(words_apply, words_polycement, 0)) {
+	} else if (player_said_2(apply, polycement)) {
 		text_show(462);
-	} else if (player_parse(words_sniff, words_polycement, 0)) {
+	} else if (player_said_2(sniff, polycement)) {
 		text_show(465);
-	} else if (player_parse(words_tie, words_fishing_line, 0)) {
+	} else if (player_said_2(tie, fishing_line)) {
 		text_show(463);
-	} else if (player_parse(words_attach, words_fishing_line, 0)) {
+	} else if (player_said_2(attach, fishing_line)) {
 		text_show(463);
-	} else if (player_parse(words_unlock, 0)) {
+	} else if (player_said_1(unlock)) {
 		text_show(464);
-	} else if (player_parse(words_reflect, 0)) {
+	} else if (player_said_1(reflect)) {
 		text_show(466);
-	} else if (player_parse(words_gaze_into, words_rearview_mirror, 0)) {
+	} else if (player_said_2(gaze_into, rearview_mirror)) {
 		text_show(467);
-	} else if (player_parse(words_eat, words_chicken_bomb, 0)) {
+	} else if (player_said_2(eat, chicken_bomb)) {
 		text_show(469);
-	} else if (player_parse(words_break, words_vase, 0)) {
+	} else if (player_said_2(break, vase)) {
 		text_show(471);
-	} else if (player_parse(words_shake_hands, words_guards_arm2, 0)) {
+	} else if (player_said_2(shake_hands, guards_arm2)) {
 		text_show(472);
-	} else if (player_parse(words_read, words_log, 0)) {
+	} else if (player_said_2(read, log)) {
 		text_show(473);
-	} else if (player_parse(words_rub, words_bombs, 0)) {
+	} else if (player_said_2(rub, bombs)) {
 		text_show(474);
-	} else if (player_parse(words_drink, words_formaldehyde, 0)) {
+	} else if (player_said_2(drink, formaldehyde)) {
 		text_show(475);
-	} else if (player_parse(words_drink, words_petrox, 0)) {
+	} else if (player_said_2(drink, petrox)) {
 		text_show(476);
-	} else if (player_parse(words_drink, words_lecithin, 0)) {
+	} else if (player_said_2(drink, lecithin)) {
 		text_show(477);
-	} else if (player_parse(words_put, words_poison_darts, words_plant_stalk, 0) && player_has(OBJ_POISON_DARTS)
+	} else if (player_said_3(put, poison_darts, plant_stalk) && player_has(OBJ_POISON_DARTS)
 		&& player_has(OBJ_PLANT_STALK)) {
 		inter_give_to_player(OBJ_BLOWGUN);
 		inter_move_object(OBJ_PLANT_STALK, NOWHERE);
 		global[kBlowgunStatus] = 0;
 		object_examine(OBJ_BLOWGUN, 809);
-	} else if (player_parse(words_put, words_poison_darts, words_blowgun, 0) && player_has(OBJ_POISON_DARTS)
+	} else if (player_said_3(put, poison_darts, blowgun) && player_has(OBJ_POISON_DARTS)
 		&& player_has(OBJ_BLOWGUN)) {
 		text_show(433);
-	} else if (player_parse(words_deface, 0) && player_parse(words_fold, 0) && player_parse(words_mutilate, 0)) {
+	} else if (player_said_1(deface) && player_said_1(fold) && player_said_1(mutilate)) {
 		text_show(434);
-	} else if (player_parse(words_spindle, 0)) {
+	} else if (player_said_1(spindle)) {
 		text_show(479);
-	} else if ((player_parse(words_read, 0) || player_parse(words_look_at, 0) || player_parse(words_look, 0)) &&
-		player_parse(words_note, 0) && player_has(OBJ_NOTE)) {
+	} else if ((player_said_1(read) || player_said_1(look_at) || player_said_1(look)) &&
+		player_said_1(note) && player_has(OBJ_NOTE)) {
 		inter_move_object(OBJ_NOTE, NOWHERE);
 		inter_give_to_player(OBJ_COMBINATION);
 		object_examine(OBJ_COMBINATION, 851);
-	} else if ((player_parse(words_look, 0) || player_parse(words_read, 0)) &&
+	} else if ((player_said_1(look) || player_said_1(read)) &&
 		((id = object_named(inter_main_noun)) > 0 ||
 			(inter_second_noun > 0 &&
 				(id = object_named(inter_second_noun)))) &&
@@ -365,33 +365,33 @@ void RexNebularEngine::global_parser_code() {
 
 			object_examine(id, messageId);
 		}
-	} else if (player_parse(words_put, words_burger, words_dead_fish, 0)) {
+	} else if (player_said_3(put, burger, dead_fish)) {
 		if (player_has(OBJ_BURGER) || player_has(OBJ_DEAD_FISH)) {
 			inter_take_from_player(OBJ_DEAD_FISH, PLAYER);
 			inter_take_from_player(OBJ_BURGER, PLAYER);
 			inter_give_to_player(OBJ_STUFFED_FISH);
 			object_examine(OBJ_STUFFED_FISH, 803);
 		}
-	} else if (player_parse(words_put, words_audio_tape, words_tape_player, 0) && player_has(OBJ_AUDIO_TAPE) &&
+	} else if (player_said_3(put, audio_tape, tape_player) && player_has(OBJ_AUDIO_TAPE) &&
 		player_has(OBJ_TAPE_PLAYER)) {
 		inter_move_object(OBJ_AUDIO_TAPE, OBJ_TAPE_PLAYER);
-	} else if (player_parse(words_activate, words_tape_player, 0) && player_has(OBJ_TAPE_PLAYER)) {
+	} else if (player_said_2(activate, tape_player) && player_has(OBJ_TAPE_PLAYER)) {
 		if (object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER) {
 			showRecipe();
 		} else {
 			text_show(406);
 		}
-	} else if (player_parse(words_eject, words_tape_player, 0) && player_has(OBJ_TAPE_PLAYER)) {
+	} else if (player_said_2(eject, tape_player) && player_has(OBJ_TAPE_PLAYER)) {
 		if (object[OBJ_AUDIO_TAPE].location == OBJ_TAPE_PLAYER) {
 			inter_give_to_player(OBJ_AUDIO_TAPE);
 		} else {
 			text_show(407);
 		}
-	} else if (player_parse(words_disassemble, words_tape_player, 0)) {
+	} else if (player_said_2(disassemble, tape_player)) {
 		text_show(408);
-	} else if (player_parse(words_activate, words_remote, 0)) {
+	} else if (player_said_2(activate, remote)) {
 		text_show(global[kTopButtonPushed] ? 502 : 501);
-	} else if ((player_parse(words_attach, words_detonators, words_charge_cases, 0) || player_parse(words_put, words_detonators, words_charge_cases, 0)) &&
+	} else if ((player_said_3(attach, detonators, charge_cases) || player_said_3(put, detonators, charge_cases)) &&
 		player_has(OBJ_DETONATORS) && player_has(OBJ_CHARGE_CASES)) {
 		if (object_check_quality(OBJ_CHARGE_CASES, 3)) {
 			inter_move_object(OBJ_CHARGE_CASES, NOWHERE);
@@ -401,10 +401,10 @@ void RexNebularEngine::global_parser_code() {
 		} else {
 			text_show(405);
 		}
-	} else if (player_parse(words_attach, words_detonators, 0)) {
+	} else if (player_said_2(attach, detonators)) {
 		text_show(470);
-	} else if ((player_parse(words_attach, words_timer_module, words_bombs, 0) || player_parse(words_put, words_timer_module, words_bombs, 0) || player_parse(words_attach, words_timer_module, words_bomb, 0)
-		|| player_parse(words_put, words_timer_module, words_bomb, 0)) && player_has(OBJ_TIMER_MODULE) && (
+	} else if ((player_said_3(attach, timer_module, bombs) || player_said_3(put, timer_module, bombs) || player_said_3(attach, timer_module, bomb)
+		|| player_said_3(put, timer_module, bomb)) && player_has(OBJ_TIMER_MODULE) && (
 			player_has(OBJ_BOMBS) || player_has(OBJ_BOMB))) {
 		if (player_has(OBJ_BOMBS)) {
 			inter_move_object(OBJ_BOMBS, NOWHERE);
@@ -416,19 +416,19 @@ void RexNebularEngine::global_parser_code() {
 		inter_move_object(OBJ_TIMER_MODULE, NOWHERE);
 		inter_give_to_player(OBJ_TIMEBOMB);
 		object_examine(OBJ_TIMEBOMB, 404);
-	} else if (player_parse(words_fondle, words_plant_stalk, 0)) {
+	} else if (player_said_2(fondle, plant_stalk)) {
 		text_show(410);
-	} else if (player_parse(words_empty, words_bottle, 0)) {
+	} else if (player_said_2(empty, bottle)) {
 		global[kBottleStatus] = 0;
 		text_show(432);
-	} else if (player_parse(words_disassemble, words_fishing_rod, 0)) {
+	} else if (player_said_2(disassemble, fishing_rod)) {
 		if (object[OBJ_FISHING_LINE].location == 3) {
 			inter_give_to_player(OBJ_FISHING_LINE);
 			object_examine(OBJ_FISHING_LINE, 409);
 		} else {
 			text_show(428);
 		}
-	} else if (player_parse(words_disassemble, words_penlight, 0)) {
+	} else if (player_said_2(disassemble, penlight)) {
 		switch (global[kPenlightCellStatus]) {
 		case 1:
 		case 2:
@@ -451,7 +451,7 @@ void RexNebularEngine::global_parser_code() {
 			text_show(478);
 			break;
 		}
-	} else if (player_parse(words_disassemble, words_phone_handset, 0)) {
+	} else if (player_said_2(disassemble, phone_handset)) {
 		switch (global[kHandsetCellStatus]) {
 		case 1:
 			inter_give_to_player(OBJ_DURAFAIL_CELLS);
@@ -479,7 +479,7 @@ void RexNebularEngine::global_parser_code() {
 			text_show(478);
 			break;
 		}
-	} else if (player_parse(words_put, words_phone_cells, words_penlight, 0)) {
+	} else if (player_said_3(put, phone_cells, penlight)) {
 		if (global[kPenlightCellStatus] == 0) {
 			global[kPenlightCellStatus] = 3;
 			inter_move_object(OBJ_PHONE_CELLS, NOWHERE);
@@ -487,7 +487,7 @@ void RexNebularEngine::global_parser_code() {
 		} else {
 			text_show(420);
 		}
-	} else if (player_parse(words_put, words_phone_cells, words_phone_handset, 0)) {
+	} else if (player_said_3(put, phone_cells, phone_handset)) {
 		if (global[kHandsetCellStatus] == 0) {
 			global[kHandsetCellStatus] = 3;
 			inter_move_object(OBJ_PHONE_CELLS, NOWHERE);
@@ -495,7 +495,7 @@ void RexNebularEngine::global_parser_code() {
 		} else {
 			text_show(422);
 		}
-	} else if (player_parse(words_put, words_durafail_cells, words_penlight, 0)) {
+	} else if (player_said_3(put, durafail_cells, penlight)) {
 		if (global[kPenlightCellStatus]) {
 			text_show(424);
 		} else {
@@ -516,28 +516,28 @@ done:
 void RexNebularEngine::global_error_code() {
 	int randVal = getRandomNumber(1, 1000);
 
-	if (player_parse(words_throw, words_bomb, 0) || player_parse(words_throw, words_bombs, 0)
-		|| player_parse(words_throw, words_timebomb, 0) || player_parse(words_throw, words_chicken_bomb, 0))
+	if (player_said_2(throw, bomb) || player_said_2(throw, bombs)
+		|| player_said_2(throw, timebomb) || player_said_2(throw, chicken_bomb))
 		text_show(42);
-	else if (player_parse(words_disassemble, 0))
+	else if (player_said_1(disassemble))
 		text_show(435);
-	else if ((player_parse(words_eat, words_dead_fish, 0) || player_parse(words_eat, words_stuffed_fish, 0)) && player_has(object_named(inter_main_noun)))
+	else if ((player_said_2(eat, dead_fish) || player_said_2(eat, stuffed_fish)) && player_has(object_named(inter_main_noun)))
 		text_show(12);
-	else if ((player_parse(words_smell, words_dead_fish, 0) || player_parse(words_smell, words_stuffed_fish, 0)) && player_has(object_named(inter_main_noun)))
+	else if ((player_said_2(smell, dead_fish) || player_said_2(smell, stuffed_fish)) && player_has(object_named(inter_main_noun)))
 		text_show(13);
-	else if (player_parse(words_eat, words_chicken, 0) && player_has(OBJ_CHICKEN))
+	else if (player_said_2(eat, chicken) && player_has(OBJ_CHICKEN))
 		text_show(912);
-	else if ((player_parse(words_shoot, 0) || player_parse(words_hose_down, 0)) && player_parse(words_blowgun, 0)) {
+	else if ((player_said_1(shoot) || player_said_1(hose_down)) && player_said_1(blowgun)) {
 		if ((room_id >= 104) && (room_id <= 111))
 			text_show(38);
-		else if (player_parse(words_piranha, 0))
+		else if (player_said_1(piranha))
 			text_show(41);
-		else if (player_parse(words_chicken, 0) || player_parse(words_vulture, 0) || player_parse(words_spider, 0)
-			|| player_parse(words_yellow_bird, 0) || player_parse(words_swooping_creature, 0) || player_parse(words_captive_creature, 0)) {
+		else if (player_said_1(chicken) || player_said_1(vulture) || player_said_1(spider)
+			|| player_said_1(yellow_bird) || player_said_1(swooping_creature) || player_said_1(captive_creature)) {
 			text_show(40);
 		} else
 			text_show(39);
-	} else if (player_parse(words_talkto, 0)) {
+	} else if (player_said_1(talkto)) {
 		global[kTalkInanimateCount] = (global[kTalkInanimateCount] + 1) % 16;
 		if (!global[kTalkInanimateCount]) {
 			text_show(2);
@@ -548,9 +548,9 @@ void RexNebularEngine::global_error_code() {
 			kernel_message_purge();
 			kernel_message_add(const_cast<char *>(tmpMsg.c_str()), 0, 0, 0x1110, 120, 34, 0);
 		}
-	} else if (player_parse(words_give, words_door, words_ceiling, 0) || player_parse(words_close, words_chair, 0))
+	} else if (player_said_3(give, door, ceiling) || player_said_2(close, chair))
 		text_show(3);
-	else if (player_parse(words_throw, 0)) {
+	else if (player_said_1(throw)) {
 		int objId = object_named(inter_main_noun);
 		if (objId < 0)
 			text_show(4);
@@ -558,14 +558,14 @@ void RexNebularEngine::global_error_code() {
 			text_show(5);
 		else
 			text_show(6);
-	} else if (player_parse(words_look, 0)) {
-		if (player_parse(words_binoculars, 0) && (inter_second_noun > 0))
+	} else if (player_said_1(look)) {
+		if (player_said_1(binoculars) && (inter_second_noun > 0))
 			text_show(10);
 		else if (randVal < 600)
 			text_show(7);
 		else
 			text_show(21);
-	} else if (player_parse(words_take, 0)) {
+	} else if (player_said_1(take)) {
 		int objId = object_named(inter_main_noun);
 		if (player_has(objId))
 			text_show(16);
@@ -575,32 +575,32 @@ void RexNebularEngine::global_error_code() {
 			text_show(22);
 		else
 			text_show(23);
-	} else if (player_parse(words_close, 0)) {
+	} else if (player_said_1(close)) {
 		if (randVal <= 333)
 			text_show(9);
 		else
 			text_show(33);
-	} else if (player_parse(words_open, 0)) {
+	} else if (player_said_1(open)) {
 		if (randVal <= 500)
 			text_show(30);
 		else if (randVal <= 750)
 			text_show(31);
 		else
 			text_show(32);
-	} else if (player_parse(words_pull, 0))
+	} else if (player_said_1(pull))
 		text_show(18);
-	else if (player_parse(words_push, 0)) {
+	else if (player_said_1(push)) {
 		if (randVal < 750)
 			text_show(19);
 		else
 			text_show(20);
-	} else if (player_parse(words_put, 0)) {
+	} else if (player_said_1(put)) {
 		int objId = object_named(inter_main_noun);
 		if (player_has(objId))
 			text_show(25);
 		else
 			text_show(24);
-	} else if (player_parse(words_give, 0)) {
+	} else if (player_said_1(give)) {
 		int objId = object_named(inter_main_noun);
 		if (!player_has(objId))
 			text_show(26);
@@ -608,9 +608,9 @@ void RexNebularEngine::global_error_code() {
 			text_show(28);
 		else
 			text_show(29);
-	} else if (!player_parse(words_walkto, 0) && !player_parse(words_walk_across, 0) && !player_parse(words_walk_towards, 0) && !player_parse(words_walk_down, 0)
-		&& !player_parse(words_swim_to, 0) && !player_parse(words_swim_across, 0) && !player_parse(words_swim_into, 0) && !player_parse(words_swim_through, 0)
-		&& !player_parse(words_swim_under, 0)) {
+	} else if (!player_said_1(walkto) && !player_said_1(walk_across) && !player_said_1(walk_towards) && !player_said_1(walk_down)
+		&& !player_said_1(swim_to) && !player_said_1(swim_across) && !player_said_1(swim_into) && !player_said_1(swim_through)
+		&& !player_said_1(swim_under)) {
 		if (randVal <= 100)
 			text_show(36);
 		else if (randVal <= 200)
diff --git a/engines/mads/madsv2/nebular/rooms/room101.cpp b/engines/mads/madsv2/nebular/rooms/room101.cpp
index 20701e85ba9..bdea41b5489 100644
--- a/engines/mads/madsv2/nebular/rooms/room101.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room101.cpp
@@ -210,11 +210,11 @@ static void room_101_daemon() {
 }
 
 static void room_101_pre_parser() {
-	if (_action.isAction(words_look, words_view_screen))
+	if (player_said_2(look, view_screen))
 		_game._player._needToWalk = true;
 
 	if (local._sittingFl) {
-		if (_action.isAction(words_look) || _action.isAction(words_chair) || _action.isAction(words_talkto) || _action.isAction(words_peer_through) || _action.isAction(words_examine))
+		if (player_said_1(look) || player_said_1(chair) || player_said_1(talkto) || player_said_1(peer_through) || player_said_1(examine))
 			_game._player._needToWalk = false;
 
 		if (_game._player._needToWalk) {
@@ -246,7 +246,7 @@ static void room_101_pre_parser() {
 		}
 	}
 
-	if (local._panelOpened && !(_action.isObject(words_shield_access_panel) || _action.isObject(words_shield_modulator))) {
+	if (local._panelOpened && !(player_said_1(shield_access_panel) || player_said_1(shield_modulator))) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._player._needToWalk) {
@@ -278,13 +278,13 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_walkto, words_life_support_section)) {
+	if (player_said_2(walkto, life_support_section)) {
 		_scene->_nextSceneId = 102;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_sit_in, words_chair) || (_action.isAction(words_look, words_view_screen) && !local._sittingFl)) {
+	if (player_said_2(sit_in, chair) || (player_said_2(look, view_screen) && !local._sittingFl)) {
 		if (!local._sittingFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -309,7 +309,7 @@ static void room_101_parser() {
 				local._sittingFl = true;
 				_scene->_hotspots.activate(71, false);
 				local._chairHotspotId = _scene->_dynamicHotspots.add(words_chair, words_sit_in, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
-				if (!_action.isAction(words_look, words_view_screen)) {
+				if (!player_said_2(look, view_screen)) {
 					_action._inProgress = false;
 					return;
 				}
@@ -326,7 +326,7 @@ static void room_101_parser() {
 		}
 	}
 
-	if ((_action.isAction(words_walkto, words_shield_access_panel) || _action.isAction(words_open, words_shield_access_panel)) && !local._panelOpened) {
+	if ((player_said_2(walkto, shield_access_panel) || player_said_2(open, shield_access_panel)) && !local._panelOpened) {
 		switch (_game._trigger) {
 		case 0:
 			local._shieldSpriteIdx = _game._objects.isInRoom(OBJ_SHIELD_MODULATOR) ? 13 : 14;
@@ -353,7 +353,7 @@ static void room_101_parser() {
 		return;
 	}
 
-	if ((_action.isAction(words_take, words_shield_modulator) || _action.isAction(words_pull, words_shield_modulator)) && _game._objects.isInRoom(OBJ_SHIELD_MODULATOR)) {
+	if ((player_said_2(take, shield_modulator) || player_said_2(pull, shield_modulator)) && _game._objects.isInRoom(OBJ_SHIELD_MODULATOR)) {
 		_game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
 		_scene->_sequences.remove(_globals._sequenceIndexes[13]);
 		_globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[14], false, 6, 0, 0, 0);
@@ -365,7 +365,7 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_shield_access_panel) || (_action.isAction(words_look, words_shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))) {
+	if (player_said_2(look, shield_access_panel) || (player_said_2(look, shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))) {
 		if (local._panelOpened) {
 			if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
 				_vm->_dialogs->show(10128);
@@ -378,13 +378,13 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_open, words_shield_access_panel) && local._panelOpened) {
+	if (player_said_2(open, shield_access_panel) && local._panelOpened) {
 		_vm->_dialogs->show(10130);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_view_screen) && local._sittingFl) {
+	if (player_said_2(look, view_screen) && local._sittingFl) {
 		if (_globals[kWatchedViewScreen])
 			room_101_say_dang();
 		else {
@@ -426,133 +426,133 @@ static void room_101_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_chair)) {
+	if (player_said_2(look, chair)) {
 		_vm->_dialogs->show(10101);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isAction(words_look) || _action.isAction(words_peer_through)) && (_action.isObject(words_front_window) || _action.isObject(words_outside))) {
+	if ((player_said_1(look) || player_said_1(peer_through)) && (player_said_1(front_window) || player_said_1(outside))) {
 		_vm->_dialogs->show(10102);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_hull) || _action.isAction(words_look, words_outer_hull) || _action.isAction(words_examine, words_hull) || _action.isAction(words_examine, words_outer_hull)) {
+	if (player_said_2(look, hull) || player_said_2(look, outer_hull) || player_said_2(examine, hull) || player_said_2(examine, outer_hull)) {
 		_vm->_dialogs->show(10103);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_fuzzy_dice)) {
+	if (player_said_2(look, fuzzy_dice)) {
 		_vm->_dialogs->show(10104);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_mirror) || _action.isAction(words_look_in, words_mirror)) {
+	if (player_said_2(look, mirror) || player_said_2(look_in, mirror)) {
 		_vm->_dialogs->show(10105);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_curtains)) {
+	if (player_said_2(look, curtains)) {
 		_vm->_dialogs->show(10106);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_plastic_jesus)) {
+	if (player_said_2(look, plastic_jesus)) {
 		_vm->_dialogs->show(10107);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_escape_hatch) || (_action.isAction(words_open, words_escape_hatch) && !_game._objects.isInInventory(OBJ_REBREATHER))) {
+	if (player_said_2(look, escape_hatch) || (player_said_2(open, escape_hatch) && !_game._objects.isInInventory(OBJ_REBREATHER))) {
 		_vm->_dialogs->show(10109);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_open, words_escape_hatch)) {
+	if (player_said_2(open, escape_hatch)) {
 		_vm->_dialogs->show(10110);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_target_computer)) {
+	if (player_said_2(look, target_computer)) {
 		_vm->_dialogs->show(10111);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_library_computer)) {
+	if (player_said_2(look, library_computer)) {
 		_vm->_dialogs->show(10126);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_damage_control_panel)) {
+	if (player_said_2(look, damage_control_panel)) {
 		_vm->_dialogs->show(10112);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_navigation_controls)) {
+	if (player_said_2(look, navigation_controls)) {
 		_vm->_dialogs->show(10113);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_engineering_controls)) {
+	if (player_said_2(look, engineering_controls)) {
 		_vm->_dialogs->show(10114);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_weapons_display)) {
+	if (player_said_2(look, weapons_display)) {
 		_vm->_dialogs->show(10115);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_shield_status_panel)) {
+	if (player_said_2(look, shield_status_panel)) {
 		_vm->_dialogs->show(10116);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_take, words_plastic_jesus)) {
+	if (player_said_2(take, plastic_jesus)) {
 		_vm->_dialogs->show(10118);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_take, words_fuzzy_dice)) {
+	if (player_said_2(take, fuzzy_dice)) {
 		_vm->_dialogs->show(10119);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_open, words_damage_control_panel)) {
+	if (player_said_2(open, damage_control_panel)) {
 		_vm->_dialogs->show(10121);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_open, words_curtains)) {
+	if (player_said_2(open, curtains)) {
 		_vm->_dialogs->show(10122);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_close, words_curtains)) {
+	if (player_said_2(close, curtains)) {
 		_vm->_dialogs->show(10123);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isAction(words_look) || _action.isAction(words_play)) && _action.isObject(words_video_game)) {
+	if ((player_said_1(look) || player_said_1(play)) && player_said_1(video_game)) {
 		_vm->_dialogs->show(10124);
 		_action._inProgress = false;
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room102.cpp b/engines/mads/madsv2/nebular/rooms/room102.cpp
index 80232603ae9..a176bef30b2 100644
--- a/engines/mads/madsv2/nebular/rooms/room102.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room102.cpp
@@ -179,10 +179,10 @@ static void room_102_daemon() {
 }
 
 static void room_102_pre_parser() {
-	if (_action.isObject(words_refrigerator) || _action.isObject(words_poster))
+	if (player_said_1(refrigerator) || player_said_1(poster))
 		_game._player._needToWalk = _game._player._readyToWalk;
 
-	if (local._fridgeOpenedFl && !_action.isObject(words_refrigerator)) {
+	if (local._fridgeOpenedFl && !player_said_1(refrigerator)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._player._needToWalk) {
@@ -221,7 +221,7 @@ static void room_102_parser() {
 	}
 
 	bool justOpenedFl = false;
-	if (_action.isObject(words_refrigerator) && !local._fridgeOpenedFl) {
+	if (player_said_1(refrigerator) && !local._fridgeOpenedFl) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
@@ -241,7 +241,7 @@ static void room_102_parser() {
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
 			int delay;
-			if (_action.isAction(words_walkto) && !local._fridgeFirstOpenFl)
+			if (player_said_1(walkto) && !local._fridgeFirstOpenFl)
 				delay = 0;
 			else
 				delay = 48;
@@ -264,7 +264,7 @@ static void room_102_parser() {
 		}
 	}
 
-	if (_action.isAction(words_look, words_refrigerator) || _action.isAction(words_open, words_refrigerator)) {
+	if (player_said_2(look, refrigerator) || player_said_2(open, refrigerator)) {
 		if (_game._objects.isInRoom(OBJ_BURGER))
 			_vm->_dialogs->show(10230);
 		else
@@ -275,7 +275,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_walkto, words_refrigerator) && justOpenedFl) {
+	if (player_said_2(walkto, refrigerator) && justOpenedFl) {
 		local._fridgeFirstOpenFl = false;
 		int quoteId = _vm->getRandomNumber(59, 63);
 		const char *curQuote = _game.getQuote(quoteId);
@@ -289,19 +289,19 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_close, words_refrigerator)) {
+	if (player_said_2(close, refrigerator)) {
 		_vm->_dialogs->show(10213);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_take, words_refrigerator)) {
+	if (player_said_2(take, refrigerator)) {
 		_vm->_dialogs->show(8);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_walk_through, words_door)) {
+	if (player_said_2(walk_through, door)) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
@@ -321,99 +321,99 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_walkto, words_engineering_section)) {
+	if (player_said_2(walkto, engineering_section)) {
 		_scene->_nextSceneId = 103;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_walkto, words_poster) || _action.isAction(words_look, words_poster) || _action.isAction(words_walkto, words_binoculars)) {
+	if (player_said_2(walkto, poster) || player_said_2(look, poster) || player_said_2(walkto, binoculars)) {
 		addRandomMessage();
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_weight_machine)) {
+	if (player_said_2(look, weight_machine)) {
 		_vm->_dialogs->show(10212);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_engineering_section)) {
+	if (player_said_2(look, engineering_section)) {
 		_vm->_dialogs->show(10205);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_door)) {
+	if (player_said_2(look, door)) {
 		_vm->_dialogs->show(10204);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_stare_at, words_ceiling) || _action.isAction(words_look, words_ceiling)) {
+	if (player_said_2(stare_at, ceiling) || player_said_2(look, ceiling)) {
 		_vm->_dialogs->show(10203);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_stare_at, words_overhead_lamp) || _action.isAction(words_look, words_overhead_lamp)) {
+	if (player_said_2(stare_at, overhead_lamp) || player_said_2(look, overhead_lamp)) {
 		_vm->_dialogs->show(10202);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_robo_kitchen)) {
+	if (player_said_2(look, robo_kitchen)) {
 		_vm->_dialogs->show(10215);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_put, words_burger, words_robo_kitchen) && _game._objects.isInInventory(OBJ_BURGER)) {
+	if (player_said_3(put, burger, robo_kitchen) && _game._objects.isInInventory(OBJ_BURGER)) {
 		_vm->_dialogs->show(10216);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_put, words_refrigerator) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	if (player_said_2(put, refrigerator) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		_vm->_dialogs->show(10217);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_put, words_dead_fish, words_robo_kitchen) || _action.isAction(words_put, words_stuffed_fish, words_robo_kitchen)) {
+	if (player_said_3(put, dead_fish, robo_kitchen) || player_said_3(put, stuffed_fish, robo_kitchen)) {
 		_vm->_dialogs->show(10230);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_open, words_robo_kitchen)) {
+	if (player_said_2(open, robo_kitchen)) {
 		_vm->_dialogs->show(10218);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_closet)) {
+	if (player_said_2(look, closet)) {
 		_vm->_dialogs->show(10219);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isObject(words_ladder) || _action.isObject(words_hatchway)) && (_action.isAction(words_look) || _action.isAction(words_climb_up) || _action.isAction(words_climb_through))) {
+	if ((player_said_1(ladder) || player_said_1(hatchway)) && (player_said_1(look) || player_said_1(climb_up) || player_said_1(climb_through))) {
 		if (_game._objects.isInInventory(OBJ_REBREATHER)) {
-			if (!_action.isAction(words_climb_up) && !_action.isAction(words_climb_through)) {
+			if (!player_said_1(climb_up) && !player_said_1(climb_through)) {
 				_vm->_dialogs->show(10231);
 				_action._inProgress = false;
 				return;
 			}
-		} else if (_action.isAction(words_look) || (_game._difficulty != DIFFICULTY_HARD)) {
+		} else if (player_said_1(look) || (_game._difficulty != DIFFICULTY_HARD)) {
 			_vm->_dialogs->show(10222);
 			_action._inProgress = false;
 			return;
 		}
 	}
 
-	if ((_action.isObject(words_ladder) || _action.isObject(words_hatchway)) && (_action.isAction(words_climb_up) || _action.isAction(words_climb_through))) {
+	if ((player_said_1(ladder) || player_said_1(hatchway)) && (player_said_1(climb_up) || player_said_1(climb_through))) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(formAnimName('A', -1), 1);
@@ -451,57 +451,57 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_power_status_panel)) {
+	if (player_said_2(look, power_status_panel)) {
 		_vm->_dialogs->show(10226);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_window) || _action.isAction(words_look_through, words_window)) {
+	if (player_said_2(look, window) || player_said_2(look_through, window)) {
 		_vm->_dialogs->show(10227);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_doorway) || _action.isAction(words_walkto, words_doorway)) {
+	if (player_said_2(look, doorway) || player_said_2(walkto, doorway)) {
 		_vm->_dialogs->show(10228);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_drawer) || ((_action.isAction(words_close, words_drawer) || _action.isAction(words_push, words_drawer)) && !local._drawerDescrFl)) {
+	if (player_said_2(look, drawer) || ((player_said_2(close, drawer) || player_said_2(push, drawer)) && !local._drawerDescrFl)) {
 		_vm->_dialogs->show(10220);
 		local._drawerDescrFl = true;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_close, words_drawer) || _action.isAction(words_push, words_drawer)) {
+	if (player_said_2(close, drawer) || player_said_2(push, drawer)) {
 		_vm->_dialogs->show(10221);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_open, words_drawer)) {
+	if (player_said_2(open, drawer)) {
 		_vm->_dialogs->show(10236);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_chair) || (_action.isAction(words_sit_in, words_chair) && !local._chairDescrFl)) {
+	if (player_said_2(look, chair) || (player_said_2(sit_in, chair) && !local._chairDescrFl)) {
 		local._chairDescrFl = true;
 		_vm->_dialogs->show(10210);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_sit_in, words_chair)) {
+	if (player_said_2(sit_in, chair)) {
 		_vm->_dialogs->show(10211);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_medicine_cabinet)) {
+	if (player_said_2(look, medicine_cabinet)) {
 		if (_globals[kMedicineCabinetOpen])
 			_vm->_dialogs->show(10207);
 		else
@@ -511,7 +511,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_close, words_medicine_cabinet) && _globals[kMedicineCabinetOpen]) {
+	if (player_said_2(close, medicine_cabinet) && _globals[kMedicineCabinetOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->_sequences.remove(_globals._sequenceIndexes[8]);
@@ -538,7 +538,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_open, words_medicine_cabinet) && !_globals[kMedicineCabinetOpen]) {
+	if (player_said_2(open, medicine_cabinet) && !_globals[kMedicineCabinetOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
@@ -571,7 +571,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_binoculars) && _game._objects.isInRoom(OBJ_BINOCULARS)) {
+	if (player_said_2(take, binoculars) && _game._objects.isInRoom(OBJ_BINOCULARS)) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
@@ -598,7 +598,7 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_burger) && _game._objects.isInRoom(OBJ_BURGER)) {
+	if (player_said_2(take, burger) && _game._objects.isInRoom(OBJ_BURGER)) {
 		if (_game._trigger == 0) {
 			_vm->_dialogs->showItem(OBJ_BURGER, 10235);
 			_scene->_sequences.remove(_globals._sequenceIndexes[10]);
@@ -612,38 +612,38 @@ static void room_102_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_poster)) {
+	if (player_said_2(take, poster)) {
 		_vm->_dialogs->show(10224);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_action.isAction(words_push) || _action.isAction(words_pull)) && _action.isObject(words_weight_machine)) {
+	if ((player_said_1(push) || player_said_1(pull)) && player_said_1(weight_machine)) {
 		_vm->_dialogs->show(10225);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_floor)) {
+	if (player_said_2(look, floor)) {
 		_vm->_dialogs->show(10232);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_binoculars) && !_game._objects.isInInventory(OBJ_BINOCULARS)) {
+	if (player_said_2(look, binoculars) && !_game._objects.isInInventory(OBJ_BINOCULARS)) {
 		_vm->_dialogs->show(10233);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_burger) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+	if (player_said_2(look, burger) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		_vm->_dialogs->show(801);
 		_action._inProgress = false;
 	}
 }
 
 static void room_102_error() {
-	if (_action.isAction(words_put, words_robo_kitchen) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	if (player_said_2(put, robo_kitchen) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		_vm->_dialogs->show(10217);
 		_action._inProgress = false;
 	}
diff --git a/engines/mads/madsv2/nebular/rooms/room103.cpp b/engines/mads/madsv2/nebular/rooms/room103.cpp
index 9b8e0c9c090..657f9def811 100644
--- a/engines/mads/madsv2/nebular/rooms/room103.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room103.cpp
@@ -163,7 +163,7 @@ static void room_103_pre_parser() {
 static void room_103_parser() {
 	if (_action._savedFields._lookFlag)
 		_vm->_dialogs->show(10322);
-	else if (_action.isAction(words_walk_through, words_door)) {
+	else if (player_said_2(walk_through, door)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
@@ -181,7 +181,7 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_timer_module) && _game._objects.isInRoom(OBJ_TIMER_MODULE)) {
+	} else if (player_said_2(take, timer_module) && _game._objects.isInRoom(OBJ_TIMER_MODULE)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 			_scene->changeVariant(1);
@@ -211,7 +211,7 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_rebreather, 0) && _game._objects.isInRoom(OBJ_REBREATHER)) {
+	} else if (player_said_2(take, rebreather) && _game._objects.isInRoom(OBJ_REBREATHER)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 			_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 3, 2);
@@ -238,9 +238,9 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, 362))
+	} else if (player_said_2(look, tasty_turkey))
 		_vm->_dialogs->show(10301);
-	else if (_action.isAction(words_take, 362)) {
+	else if (player_said_2(take, tasty_turkey)) {
 		// Take Turkey
 		if (!_vm->_game->_trigger)
 			_vm->_sound->command(31);
@@ -270,9 +270,9 @@ static void room_103_parser() {
 			_vm->_dialogs->show(10302);
 			_scene->_hotspots.activate(362, false);
 		}
-	} else if (_action.isAction(words_look, 250))
+	} else if (player_said_2(look, oven))
 		_vm->_dialogs->show(!_globals[kTurkeyExploded] ? 10323 : 10303);
-	else if (_action.isAction(words_talkto, 27)) {
+	else if (player_said_2(talkto, auxiliary_power)) {
 		switch (_vm->_game->_trigger) {
 		case 0:
 		{
@@ -302,37 +302,37 @@ static void room_103_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, 27))
+	} else if (player_said_2(look, auxiliary_power))
 		_vm->_dialogs->show(10304);
-	else if (_action.isAction(words_look, 36))
+	else if (player_said_2(look, big_pipes))
 		_vm->_dialogs->show(10307);
-	else if (_action.isAction(words_look, 55))
+	else if (player_said_2(look, burnt_out_warp_coil))
 		_vm->_dialogs->show(10308);
-	else if (_action.isAction(words_take, 315))
+	else if (player_said_2(take, shovel))
 		_vm->_dialogs->show(10309);
-	else if (_action.isAction(words_take, 85))
+	else if (player_said_2(take, coal))
 		_vm->_dialogs->show(10310);
-	else if (_action.isAction(words_look, 144))
+	else if (player_said_2(look, furnace))
 		_vm->_dialogs->show(10312);
-	else if (_action.isAction(words_open, 144))
+	else if (player_said_2(open, furnace))
 		_vm->_dialogs->show(10313);
-	else if (_action.isAction(words_close, 27))
+	else if (player_said_2(close, auxiliary_power))
 		_vm->_dialogs->show(10314);
-	else if (_action.isAction(words_look, 310))
+	else if (player_said_2(look, shield_generator))
 		_vm->_dialogs->show(10315);
-	else if (_action.isAction(words_look, 178))
+	else if (player_said_2(look, hyperdrive_jump_unit))
 		_vm->_dialogs->show(10316);
-	else if (_action.isAction(words_look, 283))
+	else if (player_said_2(look, pressure_gauge))
 		_vm->_dialogs->show(10317);
-	else if (_action.isAction(words_look, 120))
+	else if (player_said_2(look, engineering_controls))
 		_vm->_dialogs->show(10318);
-	else if (_action.isAction(words_look, 289) && _game._objects.isInInventory(OBJ_REBREATHER))
+	else if (player_said_2(look, rebreather) && _game._objects.isInInventory(OBJ_REBREATHER))
 		_vm->_dialogs->show(10319);
-	else if (_action.isAction(words_look, 371) && _game._objects.isInInventory(OBJ_TIMER_MODULE))
+	else if (player_said_2(look, timer_module) && _game._objects.isInInventory(OBJ_TIMER_MODULE))
 		_vm->_dialogs->show(10320);
-	else if (_action.isAction(words_look, 137))
+	else if (player_said_2(look, floor))
 		_vm->_dialogs->show(10321);
-	else if (_action.isAction(words_look, 409))
+	else if (player_said_2(look, workbench))
 		_vm->_dialogs->show(_game._objects.isInInventory(OBJ_TIMER_MODULE) ? 10324 : 10325);
 	else
 		return;
@@ -341,10 +341,10 @@ static void room_103_parser() {
 }
 
 void room_103_error() {
-	if (_action.isObject(words_auxiliary_power) && !_action.isAction(words_walkto)) {
+	if (player_said_1(auxiliary_power) && !player_said_1(walkto)) {
 		_vm->_dialogs->show(10305);
 		_action._inProgress = false;
-	} else if (_action.isAction(words_put, words_coal, words_furnace)) {
+	} else if (player_said_3(put, coal, furnace)) {
 		const char *msg = _game.getQuote(73);
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, msg);
 		_action._inProgress = false;
diff --git a/engines/mads/madsv2/nebular/rooms/room104.cpp b/engines/mads/madsv2/nebular/rooms/room104.cpp
index 482e49b7cf0..0f69c5d3d52 100644
--- a/engines/mads/madsv2/nebular/rooms/room104.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room104.cpp
@@ -211,23 +211,23 @@ static void room_104_daemon() {
 }
 
 static void room_104_pre_parser() {
-	if (_action.isAction(words_swim_towards, words_eastern_cliff_face))
+	if (player_said_2(swim_towards, eastern_cliff_face))
 		_game._player._walkOffScreenSceneId = 105;
 
-	if (_action.isAction(words_swim_towards, words_open_area_to_south))
+	if (player_said_2(swim_towards, open_area_to_south))
 		_game._player._walkOffScreenSceneId = 106;
 }
 
 static void room_104_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10405);
-	else if (_action.isAction(words_look, words_curious_weed_patch))
+	else if (player_said_2(look, curious_weed_patch))
 		_vm->_dialogs->show(10404);
-	else if (_action.isAction(words_look, words_surface))
+	else if (player_said_2(look, surface))
 		_vm->_dialogs->show(10403);
-	else if (_action.isAction(words_look, words_cliff_face))
+	else if (player_said_2(look, cliff_face))
 		_vm->_dialogs->show(10401);
-	else if (_action.isAction(words_look, words_ocean_floor))
+	else if (player_said_2(look, ocean_floor))
 		_vm->_dialogs->show(10402);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room105.cpp b/engines/mads/madsv2/nebular/rooms/room105.cpp
index 4bd7abd2660..4ef931f1a5e 100644
--- a/engines/mads/madsv2/nebular/rooms/room105.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room105.cpp
@@ -131,20 +131,20 @@ static void room_105_daemon() {
 }
 
 static void room_105_pre_parser() {
-	if (_action.isAction(words_swim_towards, words_western_cliff_face))
+	if (player_said_2(swim_towards, western_cliff_face))
 		_game._player._walkOffScreenSceneId = 104;
 
-	if (_action.isAction(words_swim_towards, words_open_area_to_south))
+	if (player_said_2(swim_towards, open_area_to_south))
 		_game._player._walkOffScreenSceneId = 107;
 
-	if (_action.isObject(words_mine) && (_action.isAction(words_talkto) || _action.isAction(words_look)))
+	if (player_said_1(mine) && (player_said_1(talkto) || player_said_1(look)))
 		_game._player._needToWalk = false;
 }
 
 static void room_105_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10512);
-	else if (_action.isAction(words_take, words_dead_fish) && _globals[kFishIn105]) {
+	else if (player_said_2(take, dead_fish) && _globals[kFishIn105]) {
 		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
 			int randVal = _vm->getRandomNumber(74, 76);
 			_scene->_kernelMessages.reset();
@@ -155,25 +155,25 @@ static void room_105_parser() {
 			_globals[kFishIn105] = false;
 			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 802, 0);
 		}
-	} else if (_action.isAction(words_look, words_western_cliff_face))
+	} else if (player_said_2(look, western_cliff_face))
 		_vm->_dialogs->show(10501);
-	else if (_action.isAction(words_look, words_cliff_face))
+	else if (player_said_2(look, cliff_face))
 		_vm->_dialogs->show(10502);
-	else if (_action.isAction(words_look, words_ocean_floor))
+	else if (player_said_2(look, ocean_floor))
 		_vm->_dialogs->show(10503);
-	else if (_action.isAction(words_look, words_medical_waste))
+	else if (player_said_2(look, medical_waste))
 		_vm->_dialogs->show(10504);
-	else if (_action.isAction(words_take, words_medical_waste))
+	else if (player_said_2(take, medical_waste))
 		_vm->_dialogs->show(10505);
-	else if (_action.isAction(words_look, words_mine))
+	else if (player_said_2(look, mine))
 		_vm->_dialogs->show(10506);
-	else if (_action.isAction(words_look, words_dead_fish))
+	else if (player_said_2(look, dead_fish))
 		_vm->_dialogs->show(10508);
-	else if (_action.isAction(words_look, words_surface))
+	else if (player_said_2(look, surface))
 		_vm->_dialogs->show(10509);
-	else if (_action.isAction(words_look, words_open_area_to_south))
+	else if (player_said_2(look, open_area_to_south))
 		_vm->_dialogs->show(10510);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(10511);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room106.cpp b/engines/mads/madsv2/nebular/rooms/room106.cpp
index 9f33d4a8817..3191affbe3e 100644
--- a/engines/mads/madsv2/nebular/rooms/room106.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room106.cpp
@@ -184,20 +184,20 @@ static void room_106_daemon() {
 }
 
 static void room_106_pre_parser() {
-	if (_action.isAction(words_swim_towards, words_sea_cliff) || _action.isAction(words_swim_towards, words_seaweed_bank)) {
+	if (player_said_2(swim_towards, sea_cliff) || player_said_2(swim_towards, seaweed_bank)) {
 		_game._player._stepEnabled = false;
 		_scene->_sprites[_game._player._spritesStart + 1]->_charInfo->_velocity = 24;
 		_game._player._walkOffScreenSceneId = 104;
 	}
 
-	if (_action.isAction(words_swim_towards, words_open_area_to_east))
+	if (player_said_2(swim_towards, open_area_to_east))
 		_game._player._walkOffScreenSceneId = 107;
 }
 
 static void room_106_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10614);
-	else if (_action.isAction(words_swim_to, words_main_airlock)) {
+	else if (player_said_2(swim_to, main_airlock)) {
 		_game._player._stepEnabled = false;
 		_game._player._prepareWalkPos = Common::Point(95, 72);
 		_game._player._prepareWalkFacing = FACING_WEST;
@@ -205,31 +205,31 @@ static void room_106_parser() {
 		_game._player._readyToWalk = true;
 		_game._player._frameNumber = 9;
 		local._backToShipFl = true;
-	} else if (_action.isAction(words_look, words_anemone) || _action.isAction(words_look_at, words_anemone))
+	} else if (player_said_2(look, anemone) || player_said_2(look_at, anemone))
 		_vm->_dialogs->show(10601);
-	else if (_action.isAction(words_take, words_anemone))
+	else if (player_said_2(take, anemone))
 		_vm->_dialogs->show(10602);
-	else if (_action.isAction(words_look, words_seaweed) || _action.isAction(words_look, words_seaweed_bank))
+	else if (player_said_2(look, seaweed) || player_said_2(look, seaweed_bank))
 		_vm->_dialogs->show(10603);
-	else if (_action.isAction(words_take, words_seaweed) || _action.isAction(words_take, words_seaweed_bank))
+	else if (player_said_2(take, seaweed) || player_said_2(take, seaweed_bank))
 		_vm->_dialogs->show(10604);
-	else if (_action.isAction(words_look, words_open_area_to_east))
+	else if (player_said_2(look, open_area_to_east))
 		_vm->_dialogs->show(10605);
-	else if (_action.isAction(words_look, words_pile_of_rocks) || _action.isAction(words_look_at, words_pile_of_rocks))
+	else if (player_said_2(look, pile_of_rocks) || player_said_2(look_at, pile_of_rocks))
 		_vm->_dialogs->show(10606);
-	else if (_action.isObject(words_pile_of_rocks) && (_action.isAction(words_push) || _action.isAction(words_pull) || _action.isAction(words_take)))
+	else if (player_said_1(pile_of_rocks) && (player_said_1(push) || player_said_1(pull) || player_said_1(take)))
 		_vm->_dialogs->show(10607);
-	else if (_action.isAction(words_look, words_ship) || _action.isAction(words_look_at, words_ship))
+	else if (player_said_2(look, ship) || player_said_2(look_at, ship))
 		_vm->_dialogs->show(10608);
-	else if (_action.isAction(words_look, words_main_airlock))
+	else if (player_said_2(look, main_airlock))
 		_vm->_dialogs->show(10609);
-	else if (_action.isAction(words_open, words_main_airlock))
+	else if (player_said_2(open, main_airlock))
 		_vm->_dialogs->show(10610);
-	else if (_action.isAction(words_close, words_main_airlock))
+	else if (player_said_2(close, main_airlock))
 		_vm->_dialogs->show(10611);
-	else if (_action.isAction(words_look, words_sea_cliff))
+	else if (player_said_2(look, sea_cliff))
 		_vm->_dialogs->show(10612);
-	else if (_action.isAction(words_look, words_ocean_floor))
+	else if (player_said_2(look, ocean_floor))
 		_vm->_dialogs->show(10613);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room107.cpp b/engines/mads/madsv2/nebular/rooms/room107.cpp
index 0a13a853320..56b574d9bb8 100644
--- a/engines/mads/madsv2/nebular/rooms/room107.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room107.cpp
@@ -95,17 +95,17 @@ static void room_107_daemon() {
 }
 
 static void room_107_pre_parser() {
-	if (_action.isAction(words_swim_towards, words_open_area_to_west))
+	if (player_said_2(swim_towards, open_area_to_west))
 		_game._player._walkOffScreenSceneId = 106;
 
-	if (_action.isAction(words_swim_towards, words_open_area_to_south))
+	if (player_said_2(swim_towards, open_area_to_south))
 		_game._player._walkOffScreenSceneId = 108;
 }
 
 static void room_107_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10708);
-	else if (_action.isAction(words_take, words_dead_fish) && _globals[kFishIn107]) {
+	else if (player_said_2(take, dead_fish) && _globals[kFishIn107]) {
 		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
 			int randVal = _vm->getRandomNumber(74, 76);
 			_scene->_kernelMessages.reset();
@@ -116,25 +116,25 @@ static void room_107_parser() {
 			_globals[kFishIn107] = false;
 			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 802);
 		}
-	} else if (_action.isAction(words_swim_towards, words_northern_sea_cliff))
+	} else if (player_said_2(swim_towards, northern_sea_cliff))
 		_scene->_nextSceneId = 105;
-	else if (_action.isAction(words_look, words_northern_sea_cliff))
+	else if (player_said_2(look, northern_sea_cliff))
 		_vm->_dialogs->show(10701);
-	else if (_action.isAction(words_look, words_dead_fish) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, dead_fish) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(10702);
-	else if (_action.isAction(words_look, words_bush_like_formation))
+	else if (player_said_2(look, bush_like_formation))
 		_vm->_dialogs->show(10703);
-	else if (_action.isAction(words_look, words_rock))
+	else if (player_said_2(look, rock))
 		_vm->_dialogs->show(10704);
-	else if (_action.isAction(words_look, words_seaweed))
+	else if (player_said_2(look, seaweed))
 		_vm->_dialogs->show(10705);
-	else if (_action.isAction(words_look, words_open_area_to_south))
+	else if (player_said_2(look, open_area_to_south))
 		_vm->_dialogs->show(10706);
-	else if (_action.isAction(words_look, words_cliff_face))
+	else if (player_said_2(look, cliff_face))
 		_vm->_dialogs->show(10707);
-	else if (_action.isAction(words_look, words_manta_ray))
+	else if (player_said_2(look, manta_ray))
 		_vm->_dialogs->show(10709);
-	else if (_action.isAction(words_take, words_manta_ray))
+	else if (player_said_2(take, manta_ray))
 		_vm->_dialogs->show(10710);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room108.cpp b/engines/mads/madsv2/nebular/rooms/room108.cpp
index 0b776073712..5e8f133a640 100644
--- a/engines/mads/madsv2/nebular/rooms/room108.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room108.cpp
@@ -71,14 +71,14 @@ static void room_108_daemon() {
 }
 
 static void room_108_pre_parser() {
-	if (_action.isAction(words_swim_under, words_overhang_to_east))
+	if (player_said_2(swim_under, overhang_to_east))
 		_game._player._walkOffScreenSceneId = 109;
 }
 
 static void room_108_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(10812);
-	else if (_action.isAction(words_take, words_dead_fish) && _globals[kFishIn108]) {
+	else if (player_said_2(take, dead_fish) && _globals[kFishIn108]) {
 		if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
 			int randVal = _vm->getRandomNumber(74, 76);
 			_scene->_kernelMessages.reset();
@@ -89,27 +89,27 @@ static void room_108_parser() {
 			_globals[kFishIn108] = false;
 			_vm->_dialogs->showItem(OBJ_DEAD_FISH, 10808);
 		}
-	} else if (_action.isAction(words_swim_towards, words_open_area_to_north))
+	} else if (player_said_2(swim_towards, open_area_to_north))
 		_scene->_nextSceneId = 107;
-	else if (_action.isAction(words_look, words_cliff_face))
+	else if (player_said_2(look, cliff_face))
 		_vm->_dialogs->show(10801);
-	else if (_action.isAction(words_look, words_ocean_floor))
+	else if (player_said_2(look, ocean_floor))
 		_vm->_dialogs->show(10802);
-	else if (_action.isAction(words_look, words_odd_rock_formation))
+	else if (player_said_2(look, odd_rock_formation))
 		_vm->_dialogs->show(10803);
-	else if (_action.isAction(words_take, words_odd_rock_formation))
+	else if (player_said_2(take, odd_rock_formation))
 		_vm->_dialogs->show(10804);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(10805);
-	else if (_action.isAction(words_take, words_rocks))
+	else if (player_said_2(take, rocks))
 		_vm->_dialogs->show(10806);
-	else if (_action.isAction(words_look, words_dead_fish))
+	else if (player_said_2(look, dead_fish))
 		_vm->_dialogs->show(10807);
-	else if (_action.isAction(words_look, words_overhang_to_east))
+	else if (player_said_2(look, overhang_to_east))
 		_vm->_dialogs->show(10809);
-	else if (_action.isAction(words_look, words_open_area_to_north))
+	else if (player_said_2(look, open_area_to_north))
 		_vm->_dialogs->show(10810);
-	else if (_action.isAction(words_look, words_surface))
+	else if (player_said_2(look, surface))
 		_vm->_dialogs->show(10811);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room109.cpp b/engines/mads/madsv2/nebular/rooms/room109.cpp
index 00c2c75e6d8..01dc8412061 100644
--- a/engines/mads/madsv2/nebular/rooms/room109.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room109.cpp
@@ -196,12 +196,12 @@ static void room_109_daemon() {
 }
 
 static void room_109_pre_parser() {
-	if (_action.isAction(words_swim_under, words_overhang_to_west))
+	if (player_said_2(swim_under, overhang_to_west))
 		_game._player._walkOffScreenSceneId = 108;
 
-	if ((_action.isAction(words_throw) || _action.isAction(words_give) || _action.isAction(words_put))
-		&& (_action.isTarget(words_small_hole) || _action.isTarget(words_tunnel))
-		&& (_action.isObject(words_dead_fish) || _action.isObject(words_stuffed_fish) || _action.isObject(words_burger))) {
+	if ((player_said_1(throw) || player_said_1(give) || player_said_1(put))
+		&& (player_said_1(small_hole) || player_said_1(tunnel))
+		&& (player_said_1(dead_fish) || player_said_1(stuffed_fish) || player_said_1(burger))) {
 		int idx = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 		if ((idx >= 0) && _game._objects.isInInventory(idx)) {
 			_game._player._prepareWalkPos = Common::Point(106, 38);
@@ -211,8 +211,8 @@ static void room_109_pre_parser() {
 		}
 	}
 
-	if ((_action.isAction(words_swim_into, words_tunnel) || _action.isAction(words_swim_to, words_small_hole))
-		&& (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (_action.isObject(words_tunnel)))
+	if ((player_said_2(swim_into, tunnel) || player_said_2(swim_to, small_hole))
+		&& (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (player_said_1(tunnel)))
 		_game._player._walkOffScreenSceneId = 110;
 
 	local._hungryFl = false;
@@ -225,8 +225,8 @@ static void room_109_parser() {
 		return;
 	}
 
-	if ((_action.isAction(words_throw) || _action.isAction(words_give)) && (_action.isTarget(words_small_hole) || _action.isTarget(words_tunnel))) {
-		if (_action.isObject(words_dead_fish) || _action.isObject(words_stuffed_fish) || _action.isObject(words_burger)) {
+	if ((player_said_1(throw) || player_said_1(give)) && (player_said_1(small_hole) || player_said_1(tunnel))) {
+		if (player_said_1(dead_fish) || player_said_1(stuffed_fish) || player_said_1(burger)) {
 			local._throwingObjectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 			if (local._throwingObjectId >= 0) {
 				if ((_game._objects.isInInventory(local._throwingObjectId) && _globals[kHoovicAlive]) || local._rexThrowingObject) {
@@ -407,33 +407,33 @@ static void room_109_parser() {
 		}
 	}
 
-	if (_action.isAction(words_take, words_burger) && _game._objects.isInRoom(OBJ_BURGER)) {
+	if (player_said_2(take, burger) && _game._objects.isInRoom(OBJ_BURGER)) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_game._objects.addToInventory(OBJ_BURGER);
-	} else if (_action.isAction(words_look, words_ocean_floor))
+	} else if (player_said_2(look, ocean_floor))
 		_vm->_dialogs->show(10901);
-	else if (_action.isAction(words_look, words_coral))
+	else if (player_said_2(look, coral))
 		_vm->_dialogs->show(10902);
-	else if ((_action.isAction(words_take) || _action.isAction(words_pull)) && _action.isObject(words_coral))
+	else if ((player_said_1(take) || player_said_1(pull)) && player_said_1(coral))
 		_vm->_dialogs->show(10903);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(10904);
-	else if (_action.isAction(words_take, words_rocks))
+	else if (player_said_2(take, rocks))
 		_vm->_dialogs->show(10905);
-	else if (_action.isAction(words_look, words_cave_wall))
+	else if (player_said_2(look, cave_wall))
 		_vm->_dialogs->show(10906);
-	else if (_action.isAction(words_look, words_tunnel)) {
+	else if (player_said_2(look, tunnel)) {
 		if (_globals[kHoovicAlive])
 			_vm->_dialogs->show(10907);
 		else
 			_vm->_dialogs->show(10913);
-	} else if (_action.isAction(words_look, words_small_hole))
+	} else if (player_said_2(look, small_hole))
 		_vm->_dialogs->show(10908);
-	else if (_action.isAction(words_look, words_overhang_to_west))
+	else if (player_said_2(look, overhang_to_west))
 		_vm->_dialogs->show(10911);
-	else if (_action.isAction(words_put, words_small_hole))
+	else if (player_said_2(put, small_hole))
 		_vm->_dialogs->show(10910);
-	else if (_action.isAction(words_look, words_dead_purple_monster))
+	else if (player_said_2(look, dead_purple_monster))
 		_vm->_dialogs->show(10914);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room110.cpp b/engines/mads/madsv2/nebular/rooms/room110.cpp
index b43337ef0e9..81e6e677fba 100644
--- a/engines/mads/madsv2/nebular/rooms/room110.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room110.cpp
@@ -89,7 +89,7 @@ static void room_110_daemon() {
 }
 
 static void room_110_pre_parser() {
-	if (_action.isAction(words_swim_through, words_cave_entrance))
+	if (player_said_2(swim_through, cave_entrance))
 		_game._player._walkOffScreenSceneId = 109;
 
 	if (local._crabsFl) {
@@ -117,7 +117,7 @@ static void room_110_pre_parser() {
 }
 
 static void room_110_parser() {
-	if (_action.isAction(words_swim_through, words_tunnel)) {
+	if (player_said_2(swim_through, tunnel)) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(Resources::formatName(110, 'T', 0, EXT_AA, ""), 1);
@@ -133,21 +133,21 @@ static void room_110_parser() {
 		default:
 			break;
 		}
-	} else if ((_action._lookFlag) || _action.isAction(words_look, words_cave))
+	} else if ((_action._lookFlag) || player_said_2(look, cave))
 		_vm->_dialogs->show(11001);
-	else if (_action.isAction(words_look, words_cave_ceiling) || _action.isAction(words_look_at, words_cave_ceiling))
+	else if (player_said_2(look, cave_ceiling) || player_said_2(look_at, cave_ceiling))
 		_vm->_dialogs->show(11002);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(11003);
-	else if (_action.isAction(words_take, words_rocks))
+	else if (player_said_2(take, rocks))
 		_vm->_dialogs->show(11004);
-	else if (_action.isAction(words_look, words_tunnel))
+	else if (player_said_2(look, tunnel))
 		_vm->_dialogs->show(11005);
-	else if (_action.isAction(words_look, words_cave_entrance))
+	else if (player_said_2(look, cave_entrance))
 		_vm->_dialogs->show(11006);
-	else if (_action.isAction(words_look, words_fungoids))
+	else if (player_said_2(look, fungoids))
 		_vm->_dialogs->show(11007);
-	else if (_action.isAction(words_take, words_fungoids))
+	else if (player_said_2(take, fungoids))
 		_vm->_dialogs->show(11008);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room111.cpp b/engines/mads/madsv2/nebular/rooms/room111.cpp
index 68d47344a77..dea2a558f24 100644
--- a/engines/mads/madsv2/nebular/rooms/room111.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room111.cpp
@@ -139,12 +139,12 @@ static void room_111_daemon() {
 }
 
 static void room_111_pre_parser() {
-	if (_action.isAction(words_walk_through, words_cave_entrance))
+	if (player_said_2(walk_through, cave_entrance))
 		_game._player._walkOffScreenSceneId = 212;
 }
 
 static void room_111_parser() {
-	if (_action.isAction(words_dive_into, words_pool) && _game._objects.isInInventory(OBJ_REBREATHER)) {
+	if (player_said_2(dive_into, pool) && _game._objects.isInInventory(OBJ_REBREATHER)) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(Resources::formatName(111, 'A', 1, EXT_AA, ""), 1);
@@ -160,17 +160,17 @@ static void room_111_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_cave_floor))
+	} else if (player_said_2(look, cave_floor))
 		_vm->_dialogs->show(11101);
-	else if (_action.isAction(words_look, words_pool))
+	else if (player_said_2(look, pool))
 		_vm->_dialogs->show(11102);
-	else if (_action.isAction(words_look, words_cave_entrance))
+	else if (player_said_2(look, cave_entrance))
 		_vm->_dialogs->show(11103);
-	else if (_action.isAction(words_look, words_stalagmites))
+	else if (player_said_2(look, stalagmites))
 		_vm->_dialogs->show(11104);
-	else if (_action.isAction(words_look, words_large_stalagmite))
+	else if (player_said_2(look, large_stalagmite))
 		_vm->_dialogs->show(11105);
-	else if ((_action.isAction(words_pull) || _action.isAction(words_take)) && (_action.isObject(words_stalagmites) || _action.isObject(words_large_stalagmite)))
+	else if ((player_said_1(pull) || player_said_1(take)) && (player_said_1(stalagmites) || player_said_1(large_stalagmite)))
 		_vm->_dialogs->show(11106);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room201.cpp b/engines/mads/madsv2/nebular/rooms/room201.cpp
index 235281d617a..25577f796b4 100644
--- a/engines/mads/madsv2/nebular/rooms/room201.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room201.cpp
@@ -195,9 +195,9 @@ static void room_201_daemon() {
 
 static void room_201_parser() {
 	if (_action._lookFlag == false) {
-		if (_action.isAction(words_walk_towards, words_field_to_south))
+		if (player_said_2(walk_towards, field_to_south))
 			_scene->_nextSceneId = 202;
-		else if (_action.isAction(words_climb_up, words_steps) || (_action.isAction(words_walk_inside, words_teleporter)) || (_action.isAction(words_walk_inside, words_strange_device))) {
+		else if (player_said_2(climb_up, steps) || (player_said_2(walk_inside, teleporter)) || (player_said_2(walk_inside, strange_device))) {
 			if (_game._trigger == 0) {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
@@ -206,30 +206,30 @@ static void room_201_parser() {
 			} else if (_game._trigger == 1) {
 				_scene->_nextSceneId = 213;
 			}
-		} else if (_action.isAction(words_look, words_grassy_field)) {
+		} else if (player_said_2(look, grassy_field)) {
 			_vm->_dialogs->show(20101);
-		} else if (_action.isAction(words_look, words_rocks)) {
+		} else if (player_said_2(look, rocks)) {
 			_vm->_dialogs->show(20102);
-		} else if (_action.isAction(words_look, words_thorny_bush)) {
+		} else if (player_said_2(look, thorny_bush)) {
 			_vm->_dialogs->show(20103);
-		} else if (_action.isAction(words_look, words_sky)) {
+		} else if (player_said_2(look, sky)) {
 			_vm->_dialogs->show(20104);
-		} else if (_action.isAction(words_look, words_water)) {
+		} else if (player_said_2(look, water)) {
 			_vm->_dialogs->show(20105);
-		} else if (_action.isAction(words_look, words_island_in_distance)) {
+		} else if (player_said_2(look, island_in_distance)) {
 			_vm->_dialogs->show(20106);
-		} else if (_action.isAction(words_look, words_weather_station)) {
+		} else if (player_said_2(look, weather_station)) {
 			_vm->_dialogs->show(20107);
-		} else if (_action.isAction(words_look, words_path)) {
+		} else if (player_said_2(look, path)) {
 			_vm->_dialogs->show(20108);
-		} else if (_action.isAction(words_look, words_field_to_south)) {
+		} else if (player_said_2(look, field_to_south)) {
 			_vm->_dialogs->show(20110);
-		} else if (_action.isAction(words_look, words_strange_device)) {
+		} else if (player_said_2(look, strange_device)) {
 			if (_globals[kMeteorologistEverSeen])
 				_vm->_dialogs->show(20112);
 			else
 				_vm->_dialogs->show(20109);
-		} else if (_action.isAction(words_look, words_teleporter)) {
+		} else if (player_said_2(look, teleporter)) {
 			_vm->_dialogs->show(20113);
 		} else
 			return;
diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index ecd99798854..f2677bd5bf1 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -424,7 +424,7 @@ static void room_202_pre_parser() {
 	if (gplayer._needToWalk)
 		_scene->_kernelMessages.reset();
 
-	if (local._ladderTopFl && (_action.isAction(words_climb_down, words_ladder) || gplayer._needToWalk)) {
+	if (local._ladderTopFl && (player_said_2(climb_down, ladder) || gplayer._needToWalk)) {
 		if (_game._trigger == 0) {
 			_vm->_sound->command(29);
 			gplayer._readyToWalk = false;
@@ -443,7 +443,7 @@ static void room_202_pre_parser() {
 		}
 	}
 
-	if (_action.isAction(words_look, words_binoculars) && (_action._activeAction._indirectObjectId > 0)) {
+	if (player_said_2(look, binoculars) && (_action._activeAction._indirectObjectId > 0)) {
 		if (!gplayer._readyToWalk || local._ladderTopFl)
 			gplayer._needToWalk = false;
 		else
@@ -460,12 +460,12 @@ static void room_202_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_climb_down, words_ladder)) {
+	if (player_said_2(climb_down, ladder)) {
 		_action._inProgress = false;
 		return;
-	} else if (_action.isAction(words_walk_towards, words_field_to_south)) {
+	} else if (player_said_2(walk_towards, field_to_south)) {
 		_scene->_nextSceneId = 203;
-	} else if (_action.isAction(words_walk_towards, words_field_to_north)) {
+	} else if (player_said_2(walk_towards, field_to_north)) {
 		if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) {
 			if (_scene->_animation[0])
 				_globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT;
@@ -473,7 +473,7 @@ static void room_202_parser() {
 				_globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT;
 		}
 		_scene->_nextSceneId = 201;
-	} else if (_action.isAction(words_take, words_bone) && (_action._savedFields._mainObjectSource == 4)) {
+	} else if (player_said_2(take, bone) && (_action._savedFields._mainObjectSource == 4)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_game._objects.isInInventory(OBJ_BONES)) {
@@ -514,7 +514,7 @@ static void room_202_parser() {
 		}
 
 		_action._inProgress = false;
-	} else if (_action.isAction(words_climb_up, words_ladder) && !_globals[kLadderBroken]) {
+	} else if (player_said_2(climb_up, ladder) && !_globals[kLadderBroken]) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(29);
@@ -544,7 +544,7 @@ static void room_202_parser() {
 			_action._inProgress = false;
 			return;
 		}
-	} else if ((_action.isAction(words_look, words_binoculars, words_field_to_north) || (_action.isAction(words_look, words_binoculars, words_strange_device))) && (_globals[kSexOfRex] == SEX_MALE)) {
+	} else if ((player_said_3(look, binoculars, field_to_north) || (player_said_3(look, binoculars, strange_device))) && (_globals[kSexOfRex] == SEX_MALE)) {
 		if (!local._ladderTopFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -644,43 +644,43 @@ static void room_202_parser() {
 				return;
 			}
 		}
-	} else if (_action.isAction(words_walk_inside, words_hut)) {
+	} else if (player_said_2(walk_inside, hut)) {
 		setRandomKernelMessage();
-	} else if (_action.isAction(words_look, words_rocks)) {
+	} else if (player_said_2(look, rocks)) {
 		_vm->_dialogs->show(20202);
-	} else if (_action.isAction(words_look, words_fire_pit)) {
+	} else if (player_said_2(look, fire_pit)) {
 		_vm->_dialogs->show(20203);
-	} else if (_action.isAction(words_look, words_grass)) {
+	} else if (player_said_2(look, grass)) {
 		_vm->_dialogs->show(20204);
-	} else if (_action.isAction(words_look, words_field_to_north)) {
+	} else if (player_said_2(look, field_to_north)) {
 		if ((_globals[kMeteorologistStatus] == METEOROLOGIST_ABSENT) || (_globals[kMeteorologistStatus] == METEOROLOGIST_GONE))
 			_vm->_dialogs->show(20205);
 		else if (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT)
 			_vm->_dialogs->show(20220);
-	} else if (_action.isAction(words_look, words_watch_tower)) {
+	} else if (player_said_2(look, watch_tower)) {
 		_vm->_dialogs->show(20206);
-	} else if (_action.isAction(words_look, words_tall_grass)) {
+	} else if (player_said_2(look, tall_grass)) {
 		_vm->_dialogs->show(20207);
-	} else if (_action.isAction(words_look, words_trees)) {
+	} else if (player_said_2(look, trees)) {
 		_vm->_dialogs->show(20208);
-	} else if (_action.isAction(words_look, words_tree)) {
+	} else if (player_said_2(look, tree)) {
 		_vm->_dialogs->show(20209);
-	} else if (_action.isAction(words_look, words_sky)) {
+	} else if (player_said_2(look, sky)) {
 		_vm->_dialogs->show(20210);
-	} else if (_action.isAction(words_look, words_hut)) {
+	} else if (player_said_2(look, hut)) {
 		if ((_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH))
 			_vm->_dialogs->show(20212);
 		else
 			_vm->_dialogs->show(20211);
-	} else if (_action.isAction(words_look, words_strange_device)) {
+	} else if (player_said_2(look, strange_device)) {
 		_vm->_dialogs->show(20213);
-	} else if (_action.isAction(words_look, words_ocean_in_distance)) {
+	} else if (player_said_2(look, ocean_in_distance)) {
 		_vm->_dialogs->show(20214);
-	} else if (_action.isAction(words_look, words_skull)) {
+	} else if (player_said_2(look, skull)) {
 		_vm->_dialogs->show(20215);
-	} else if (_action.isAction(words_take, words_skull)) {
+	} else if (player_said_2(take, skull)) {
 		_vm->_dialogs->show(20216);
-	} else if (_action.isAction(words_look, words_bones) && _action._commandSource == 4) {
+	} else if (player_said_2(look, bones) && _action._commandSource == 4) {
 		_vm->_dialogs->show(20217);
 	} else {
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room203.cpp b/engines/mads/madsv2/nebular/rooms/room203.cpp
index 04ff6257dfd..aa4ef373074 100644
--- a/engines/mads/madsv2/nebular/rooms/room203.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room203.cpp
@@ -109,34 +109,34 @@ static void room_203_daemon() {
 }
 
 static void room_203_pre_parser() {
-	if (local._rhotundaEatFl && !_action.isAction(words_walk_towards, words_field_to_south)) {
+	if (local._rhotundaEatFl && !player_said_2(walk_towards, field_to_south)) {
 		_game._player.walk(Common::Point(158, 136), FACING_SOUTH);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_walkto, words_open_area_to_east))
+	if (player_said_2(walkto, open_area_to_east))
 		_game._player._walkOffScreenSceneId = 209;
 }
 
 static void room_203_parser() {
 	if (_action._savedFields._lookFlag) {
 		_vm->_dialogs->show(20307);
-	} else if (_action.isAction(words_walk_towards, words_field_to_south)) {
+	} else if (player_said_2(walk_towards, field_to_south)) {
 		_scene->_nextSceneId = 208;
-	} else if (_action.isAction(words_walk_towards, words_field_to_north)) {
+	} else if (player_said_2(walk_towards, field_to_north)) {
 		_scene->_nextSceneId = 202;
-	} else if (_action.isAction(words_look, words_sky)) {
+	} else if (player_said_2(look, sky)) {
 		_vm->_dialogs->show(20301);
-	} else if (_action.isAction(words_look, words_cliff_face)) {
+	} else if (player_said_2(look, cliff_face)) {
 		_vm->_dialogs->show(20302);
-	} else if (_action.isAction(words_look, words_palm_tree)) {
+	} else if (player_said_2(look, palm_tree)) {
 		_vm->_dialogs->show(20303);
-	} else if (_action.isAction(words_look, words_field_to_north)) {
+	} else if (player_said_2(look, field_to_north)) {
 		_vm->_dialogs->show(20304);
-	} else if (_action.isAction(words_look, words_grassy_field)) {
+	} else if (player_said_2(look, grassy_field)) {
 		_vm->_dialogs->show(20305);
-	} else if (_action.isAction(words_look, words_boulders)) {
+	} else if (player_said_2(look, boulders)) {
 		_vm->_dialogs->show(20305);
 	} else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index f57775c39e1..ac3aa4f3083 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -223,9 +223,9 @@ static void room_205_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(20502);
-	else if (_action.isAction(words_look, words_binoculars, words_opposite_bank))
+	else if (player_said_3(look, binoculars, opposite_bank))
 		_vm->_dialogs->show(20518);
-	else if (_action.isAction(words_talkto, words_native_woman)) {
+	else if (player_said_2(talkto, native_woman)) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(0x73));
@@ -236,14 +236,14 @@ static void room_205_parser() {
 			local._dialog1.write(0x75, true);
 			local._dialog1.start();
 		}
-	} else if (_action.isAction(words_give, words_native_woman) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	} else if (player_said_2(give, native_woman) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			int rndVal = _vm->getRandomNumber(0xAC, 0xAE);
 			_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 1, 120, _game.getQuote(rndVal));
 		} else if (_game._trigger == 1)
 			_game._player._stepEnabled = true;
-	} else if (_action.isAction(words_walkto, words_opposite_bank)) {
+	} else if (player_said_2(walkto, opposite_bank)) {
 		if (_game._trigger == 0) {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
@@ -264,50 +264,50 @@ static void room_205_parser() {
 			_scene->_reloadSceneFlag = true;
 		}
 	} else {
-		if (_action.isAction(words_walk_down, words_path_to_south))
+		if (player_said_2(walk_down, path_to_south))
 			_scene->_nextSceneId = 210;
 
-		if (_action.isAction(words_walkto, words_fire_pit) || _action.isAction(words_walkto, words_chicken_on_spit)) {
+		if (player_said_2(walkto, fire_pit) || player_said_2(walkto, chicken_on_spit)) {
 			if (_game._objects.isInRoom(OBJ_CHICKEN)) {
 				_scene->_kernelMessages.reset();
 				_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x6B));
 			}
-		} else if (_action.isAction(words_take, words_chicken_on_spit) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) {
+		} else if (player_said_2(take, chicken_on_spit) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) {
 			_game._objects.addToInventory(OBJ_CHICKEN);
 			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
 			_scene->_hotspots.activate(words_chicken_on_spit, false);
 			_vm->_dialogs->showItem(OBJ_CHICKEN, 812);
-		} else if (_action.isAction(words_take, words_chicken_on_spit) && (!_globals[kChickenPermitted]))
+		} else if (player_said_2(take, chicken_on_spit) && (!_globals[kChickenPermitted]))
 			_scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 0, 120, _game.getQuote(0x80));
-		else if (_action.isAction(words_look, words_native_woman))
+		else if (player_said_2(look, native_woman))
 			_vm->_dialogs->show(20503);
-		else if (_action.isAction(words_look, words_hut))
+		else if (player_said_2(look, hut))
 			_vm->_dialogs->show(20504);
-		else if (_action.isAction(words_look, words_chicken) && (_action._mainObjectSource == CAT_HOTSPOT))
+		else if (player_said_2(look, chicken) && (_action._mainObjectSource == CAT_HOTSPOT))
 			_vm->_dialogs->show(20505);
-		else if (_action.isAction(words_take, words_chicken) && (_action._mainObjectSource == CAT_HOTSPOT))
+		else if (player_said_2(take, chicken) && (_action._mainObjectSource == CAT_HOTSPOT))
 			_vm->_dialogs->show(20506);
-		else if (_action.isAction(words_look, words_chicken_on_spit))
+		else if (player_said_2(look, chicken_on_spit))
 			_vm->_dialogs->show(20507);
-		else if (_action.isAction(words_look, words_fire_pit))
+		else if (player_said_2(look, fire_pit))
 			_vm->_dialogs->show(20508);
-		else if (_action.isAction(words_take, words_fire_pit))
+		else if (player_said_2(take, fire_pit))
 			_vm->_dialogs->show(20509);
-		else if (_action.isAction(words_look, words_stream))
+		else if (player_said_2(look, stream))
 			_vm->_dialogs->show(20510);
-		else if (_action.isAction(words_look, words_opposite_bank))
+		else if (player_said_2(look, opposite_bank))
 			_vm->_dialogs->show(20511);
 		else if (_game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))
-			&& (_action.isAction(words_give, words_stream) || _action.isAction(words_throw, words_stream)
-				|| _action.isAction(words_give, words_piranha) || _action.isAction(words_throw, words_piranha)))
+			&& (player_said_2(give, stream) || player_said_2(throw, stream)
+				|| player_said_2(give, piranha) || player_said_2(throw, piranha)))
 			_vm->_dialogs->show(20512);
-		else if (_action.isAction(words_look, words_piranha))
+		else if (player_said_2(look, piranha))
 			_vm->_dialogs->show(20513);
-		else if (_action.isAction(words_look, words_twinkifruit_bush))
+		else if (player_said_2(look, twinkifruit_bush))
 			_vm->_dialogs->show(20514);
-		else if (_action.isAction(words_take, words_twinkifruit_bush))
+		else if (player_said_2(take, twinkifruit_bush))
 			_vm->_dialogs->show(20515);
-		else if (_action.isAction(words_take, words_native_woman))
+		else if (player_said_2(take, native_woman))
 			_vm->_dialogs->show(20517);
 		else
 			return;
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index f3d80ec0780..0369dfed18e 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -153,16 +153,16 @@ static void room_207_daemon() {
 }
 
 static void room_207_pre_parser() {
-	if (_action.isAction(words_walk_down, words_path_to_west))
+	if (player_said_2(walk_down, path_to_west))
 		_game._player._walkOffScreenSceneId = 211;
 
-	if (_action.isAction(words_walk_towards, words_open_field_to_east))
+	if (player_said_2(walk_towards, open_field_to_east))
 		_game._player._walkOffScreenSceneId = 208;
 
-	if (_action.isAction(words_walkto) || _action.isAction(words_look)) {
-		if (_action.isObject(words_vulture)) {
+	if (player_said_1(walkto) || player_said_1(look)) {
+		if (player_said_1(vulture)) {
 			local._vultureTime = -9999;
-		} else if (_action.isObject(words_spider)) {
+		} else if (player_said_1(spider)) {
 			local._spiderTime = -9999;
 		}
 	}
@@ -171,7 +171,7 @@ static void room_207_pre_parser() {
 static void room_207_parser() {
 	if (_action._savedFields._lookFlag)
 		_vm->_dialogs->show(20711);
-	else if (_action.isAction(words_walk_through, words_doorway))
+	else if (player_said_2(walk_through, doorway))
 		_scene->_nextSceneId = 214;
 	else {
 		if ((_game._player._playerPos.x > 150) && (_game._player._playerPos.x < 189) &&
@@ -189,33 +189,33 @@ static void room_207_parser() {
 			local._eyeFl = false;
 		}
 
-		if (_action.isAction(words_look, words_dense_forest))
+		if (player_said_2(look, dense_forest))
 			_vm->_dialogs->show(20701);
-		else if (_action.isAction(words_look, words_hedge))
+		else if (player_said_2(look, hedge))
 			_vm->_dialogs->show(20702);
-		else if (_action.isAction(words_look, words_skull_and_crossbones))
+		else if (player_said_2(look, skull_and_crossbones))
 			_vm->_dialogs->show(20703);
-		else if (_action.isAction(words_look, words_cauldron))
+		else if (player_said_2(look, cauldron))
 			_vm->_dialogs->show(20704);
-		else if (_action.isAction(words_look, words_witchdoctor_hut))
+		else if (player_said_2(look, witchdoctor_hut))
 			_vm->_dialogs->show(20705);
-		else if (_action.isAction(words_look, words_path_to_west))
+		else if (player_said_2(look, path_to_west))
 			_vm->_dialogs->show(20706);
-		else if (_action.isAction(words_look, words_mountains))
+		else if (player_said_2(look, mountains))
 			_vm->_dialogs->show(20707);
-		else if (_action.isAction(words_look, words_aloe_plant))
+		else if (player_said_2(look, aloe_plant))
 			_vm->_dialogs->show(20708);
-		else if (_action.isAction(words_look, words_lawn))
+		else if (player_said_2(look, lawn))
 			_vm->_dialogs->show(20709);
-		else if (_action.isAction(words_look, words_vulture))
+		else if (player_said_2(look, vulture))
 			_vm->_dialogs->show(20710);
-		else if (_action.isAction(words_take, words_skull_and_crossbones))
+		else if (player_said_2(take, skull_and_crossbones))
 			_vm->_dialogs->show(20712);
-		else if (_action.isAction(words_take, words_aloe_plant))
+		else if (player_said_2(take, aloe_plant))
 			_vm->_dialogs->show(20713);
-		else if (_action.isAction(words_look, words_spider))
+		else if (player_said_2(look, spider))
 			_vm->_dialogs->show(20714);
-		else if (_action.isAction(words_take, words_spider))
+		else if (player_said_2(take, spider))
 			_vm->_dialogs->show(20715);
 		else
 			return;
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
index 07cd5591243..0be2771a5bb 100644
--- a/engines/mads/madsv2/nebular/rooms/room208.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -157,13 +157,13 @@ static void room_208_daemon() {
 static void room_208_pre_parser() {
 	auto &gplayer = _vm->_game->_player;
 
-	if (_action.isAction(words_look) && gplayer._readyToWalk)
+	if (player_said_1(look) && gplayer._readyToWalk)
 		gplayer._needToWalk = true;
 
-	if (_action.isAction(words_walk_towards, words_grassland_to_east))
+	if (player_said_2(walk_towards, grassland_to_east))
 		gplayer._walkOffScreenSceneId = 209;
 
-	if (_action.isAction(words_walk_towards, words_open_area_to_west))
+	if (player_said_2(walk_towards, open_area_to_west))
 		gplayer._walkOffScreenSceneId = 207;
 }
 
@@ -253,7 +253,7 @@ static void subAction(int mode) {
 }
 
 static void room_208_parser() {
-	if (_action.isAction(words_walk_towards, words_lowlands_to_north)) {
+	if (player_said_2(walk_towards, lowlands_to_north)) {
 		if (_globals[kRhotundaStatus])
 			_scene->_nextSceneId = 203;
 		else if (_game._trigger == 0) {
@@ -262,59 +262,59 @@ static void room_208_parser() {
 			_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
 		} else if (_game._trigger == 1)
 			_scene->_nextSceneId = 203;
-	} else if (_action.isAction(words_walk_towards, words_field_to_south))
+	} else if (player_said_2(walk_towards, field_to_south))
 		_scene->_nextSceneId = 212;
-	else if (_action.isAction(words_take, words_pile_of_leaves) && (!_globals[kLeavesStatus] || _game._trigger)) {
+	else if (player_said_2(take, pile_of_leaves) && (!_globals[kLeavesStatus] || _game._trigger)) {
 		subAction(1);
 		if (_game._player._stepEnabled)
 			_vm->_dialogs->showItem(OBJ_BIG_LEAVES, 0x326, 0);
-	} else if (_action.isAction(words_put, words_big_leaves, words_deep_pit) && (_globals[kLeavesStatus] == 1 || _game._trigger))
+	} else if (player_said_3(put, big_leaves, deep_pit) && (_globals[kLeavesStatus] == 1 || _game._trigger))
 		subAction(2);
-	else if (_action.isAction(words_put, words_twinkifruit, words_leaf_covered_pit)) {
+	else if (player_said_3(put, twinkifruit, leaf_covered_pit)) {
 		subAction(3);
 		if (_game._player._stepEnabled) {
 			_game._player._stepEnabled = false;
 			local._rhotundaTurnFl = true;
 			_game._player.walk(Common::Point(20, 148), FACING_EAST);
 		}
-	} else if (_action.isAction(words_put, words_burger, words_leaf_covered_pit)) {
+	} else if (player_said_3(put, burger, leaf_covered_pit)) {
 		subAction(4);
 		if (_game._player._stepEnabled)
 			_vm->_dialogs->show(20812);
-	} else if (_action.isAction(words_put, words_dead_fish, words_leaf_covered_pit)) {
+	} else if (player_said_3(put, dead_fish, leaf_covered_pit)) {
 		subAction(5);
 		if (_game._player._stepEnabled)
 			_vm->_dialogs->show(20812);
-	} else if (_action.isAction(words_look, words_cumulous_cloud))
+	} else if (player_said_2(look, cumulous_cloud))
 		_vm->_dialogs->show(20801);
-	else if (_action.isAction(words_look, words_open_area_to_west))
+	else if (player_said_2(look, open_area_to_west))
 		_vm->_dialogs->show(20802);
-	else if (_action.isAction(words_look, words_thorny_bush))
+	else if (player_said_2(look, thorny_bush))
 		_vm->_dialogs->show(20803);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(20804);
-	else if (_action.isAction(words_look, words_small_cactus))
+	else if (player_said_2(look, small_cactus))
 		_vm->_dialogs->show(20805);
-	else if (_action.isAction(words_take, words_small_cactus))
+	else if (player_said_2(take, small_cactus))
 		_vm->_dialogs->show(20806);
-	else if (_action.isAction(words_look, words_grassland_to_east))
+	else if (player_said_2(look, grassland_to_east))
 		_vm->_dialogs->show(20807);
-	else if (_action.isAction(words_look, words_deep_pit))
+	else if (player_said_2(look, deep_pit))
 		_vm->_dialogs->show(20808);
-	else if (_action.isAction(words_look, words_pile_of_leaves))
+	else if (player_said_2(look, pile_of_leaves))
 		_vm->_dialogs->show(20809);
-	else if (_action.isAction(words_look, words_leaf_covered_pit)) {
+	else if (player_said_2(look, leaf_covered_pit)) {
 		if (_game._difficulty == DIFFICULTY_EASY)
 			_vm->_dialogs->show(20810);
 		else
 			_vm->_dialogs->show(20811);
-	} else if (_action.isAction(words_look, words_tree) || _action.isAction(words_look, words_trees))
+	} else if (player_said_2(look, tree) || player_said_2(look, trees))
 		_vm->_dialogs->show(20813);
-	else if (_action.isAction(words_take, words_leaf_covered_pit))
+	else if (player_said_2(take, leaf_covered_pit))
 		_vm->_dialogs->show(20814);
-	else if (_action.isAction(words_look, words_huge_legs))
+	else if (player_said_2(look, huge_legs))
 		_vm->_dialogs->show(20815);
-	else if (_action.isAction(words_take, words_huge_legs) || _action.isAction(words_pull, words_huge_legs))
+	else if (player_said_2(take, huge_legs) || player_said_2(pull, huge_legs))
 		_vm->_dialogs->show(20816);
 	else if (_action._savedFields._lookFlag && (_globals[kRhotundaStatus] == 1))
 		_vm->_dialogs->show(20819);
diff --git a/engines/mads/madsv2/nebular/rooms/room209.cpp b/engines/mads/madsv2/nebular/rooms/room209.cpp
index 38514a2715a..786e73f24be 100644
--- a/engines/mads/madsv2/nebular/rooms/room209.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room209.cpp
@@ -1328,14 +1328,14 @@ static void room_209_daemon() {
 		case 234:
 			_scene->_sequences.remove(_globals._sequenceIndexes[2]);
 			_scene->_kernelMessages.reset();
-			if (_action.isAction(words_hose_down, words_blowgun, words_monkey)) {
+			if (player_said_3(hose_down, blowgun, monkey)) {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 16, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 12, 239);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235);
-			} else if (_action.isAction(words_shoot, words_blowgun, words_monkey)) {
+			} else if (player_said_3(shoot, blowgun, monkey)) {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
@@ -1411,19 +1411,19 @@ static void room_209_daemon() {
 }
 
 static void room_209_pre_parser() {
-	if (_action.isAction(words_walk_towards, words_field_to_west))
+	if (player_said_2(walk_towards, field_to_west))
 		_game._player._walkOffScreenSceneId = 208;
 
 	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
-		if ((_action.isAction(words_shoot) || _action.isAction(words_hose_down)) && _action.isTarget(words_monkey)
-			&& _action.isObject(words_blowgun) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+		if ((player_said_1(shoot) || player_said_1(hose_down)) && player_said_1(monkey)
+			&& player_said_1(blowgun) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
 			_game._player._prepareWalkPos = Common::Point(111, 129);
 			_game._player._prepareWalkFacing = FACING_NORTHEAST;
 			_game._player._needToWalk = true;
 			_game._player._readyToWalk = true;
 		}
 
-		if (_action.isAction(words_look, words_monkey) || _action.isAction(words_talkto, words_monkey)) {
+		if (player_said_2(look, monkey) || player_said_2(talkto, monkey)) {
 			_game._player._prepareWalkPos = Common::Point(111, 129);
 			_game._player._prepareWalkFacing = FACING_NORTHEAST;
 			_game._player._needToWalk = true;
@@ -1439,13 +1439,13 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_walk_towards, words_rocky_area_to_north)) {
+	if (player_said_2(walk_towards, rocky_area_to_north)) {
 		_scene->_nextSceneId = 203;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_talkto, words_monkey) && !local._pitchFl && !local._playingDialogFl) {
+	if (player_said_2(talkto, monkey) && !local._pitchFl && !local._playingDialogFl) {
 		_scene->_sequences.addTimer(1, local._dialogAbortVal);
 		local._playingDialogFl = true;
 		_game._player._stepEnabled = false;
@@ -1555,9 +1555,9 @@ static void room_209_parser() {
 	}
 
 	if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
-		if ((_action.isAction(words_shoot) || _action.isAction(words_hose_down)) && _action.isTarget(words_monkey)
-			&& _action.isObject(words_blowgun) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
-			if (_action.isAction(words_shoot, words_blowgun, words_monkey) && !local._startShootingInTimerFl) {
+		if ((player_said_1(shoot) || player_said_1(hose_down)) && player_said_1(monkey)
+			&& player_said_1(blowgun) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+			if (player_said_3(shoot, blowgun, monkey) && !local._startShootingInTimerFl) {
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(1, 231);
 				local._startShootingInTimerFl = true;
@@ -1567,7 +1567,7 @@ static void room_209_parser() {
 				return;
 			}
 
-			if (_action.isAction(words_hose_down, words_blowgun, words_monkey) && !local._startShootingInTimerFl) {
+			if (player_said_3(hose_down, blowgun, monkey) && !local._startShootingInTimerFl) {
 				_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 				_scene->_sequences.addTimer(1, 228);
 				_game._player._stepEnabled = false;
@@ -1578,7 +1578,7 @@ static void room_209_parser() {
 			}
 		}
 
-		if (_action.isAction(words_look, words_monkey)) {
+		if (player_said_2(look, monkey)) {
 			local._pitchFl = true;
 			_game._player._stepEnabled = false;
 			_vm->_dialogs->show(20914);
@@ -1587,7 +1587,7 @@ static void room_209_parser() {
 		}
 	}
 
-	if (_action.isAction(words_take, words_plant_stalk) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) {
+	if (player_said_2(take, plant_stalk) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -1620,7 +1620,7 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_binoculars) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) {
+	if (player_said_2(take, binoculars) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) {
 		switch (_game._trigger) {
 		case 0:
 			_globals._spriteIndexes[10] = _scene->_sprites.addSprites("*RXMBD_8");
@@ -1656,75 +1656,75 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_sky)) {
+	if (player_said_2(look, sky)) {
 		_vm->_dialogs->show(20901);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_bamboo_like_plant)) {
+	if (player_said_2(look, bamboo_like_plant)) {
 		_vm->_dialogs->show(20902);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_mountainside)) {
+	if (player_said_2(look, mountainside)) {
 		_vm->_dialogs->show(20903);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_grassy_field)) {
+	if (player_said_2(look, grassy_field)) {
 		_vm->_dialogs->show(20904);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_field_to_west)) {
+	if (player_said_2(look, field_to_west)) {
 		_vm->_dialogs->show(20905);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_rocky_area_to_north)) {
+	if (player_said_2(look, rocky_area_to_north)) {
 		_vm->_dialogs->show(20906);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_plant_stalk) && (_action._savedFields._mainObjectSource == 4)) {
+	if (player_said_2(look, plant_stalk) && (_action._savedFields._mainObjectSource == 4)) {
 		_vm->_dialogs->show(20907);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_give, words_twinkifruit, words_monkey) || _action.isAction(words_throw, words_twinkifruit, words_monkey)) {
+	if (player_said_3(give, twinkifruit, monkey) || player_said_3(throw, twinkifruit, monkey)) {
 		_vm->_dialogs->show(20909);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_trees)) {
+	if (player_said_2(look, trees)) {
 		_vm->_dialogs->show(20913);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_throw, words_monkey) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
-		if (!_action.isObject(words_poison_darts)) {
+	if (player_said_2(throw, monkey) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+		if (!player_said_1(poison_darts)) {
 			_vm->_dialogs->show(20915);
 		}
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_throw, words_poison_darts, words_monkey)) {
+	if (player_said_3(throw, poison_darts, monkey)) {
 		_vm->_dialogs->show(20916);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_look, words_palm_tree)) {
+	if (player_said_2(look, palm_tree)) {
 		if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
 			if (local._monkeyPosition == 1)
 				_vm->_dialogs->show(20917);
@@ -1740,13 +1740,13 @@ static void room_209_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_melon_mush)) {
+	if (player_said_2(look, melon_mush)) {
 		_vm->_dialogs->show(20920);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_take, words_melon_mush)) {
+	if (player_said_2(take, melon_mush)) {
 		_vm->_dialogs->show(20921);
 		_action._inProgress = false;
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room210.cpp b/engines/mads/madsv2/nebular/rooms/room210.cpp
index bbba047e646..82ad3c91197 100644
--- a/engines/mads/madsv2/nebular/rooms/room210.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room210.cpp
@@ -898,16 +898,16 @@ static void room_210_daemon() {
 static void room_210_pre_parser() {
 	local._stopWalking = false;
 
-	if (_action.isAction(words_walk_down, words_path_to_east))
+	if (player_said_2(walk_down, path_to_east))
 		_game._player._walkOffScreenSceneId = 211;
 }
 
 static void room_210_parser() {
-	if (_action.isAction(words_look, words_binoculars, words_hut_to_north)) {
+	if (player_said_3(look, binoculars, hut_to_north)) {
 		_vm->_dialogs->show(21017);
 	} else if (_game._screenObjects._inputMode == kInputConversation) {
 		handleConversations();
-	} else if (_action.isAction(words_talkto, words_native_woman) ||
+	} else if (player_said_2(talkto, native_woman) ||
 		((_game._player._playerPos == Common::Point(214, 150)) && (_game._player._facing == FACING_NORTHWEST) && (local._twinkleAnimationType == 1) && local._stopWalking)) {
 		switch (_game._trigger) {
 		case 0:
@@ -962,7 +962,7 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_give, words_native_woman) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	} else if (player_said_2(give, native_woman) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -982,11 +982,11 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_walk_down, words_path_to_north) || _action.isAction(words_walk_towards, words_hut_to_north)) {
+	} else if (player_said_2(walk_down, path_to_north) || player_said_2(walk_towards, hut_to_north)) {
 		_scene->_nextSceneId = 205;
-	} else if (_action.isAction(words_walk_through, words_doorway)) {
+	} else if (player_said_2(walk_through, doorway)) {
 		_scene->_nextSceneId = 215;
-	} else if ((_action.isAction(words_pull, words_curtain) || _action.isAction(words_open, words_curtain)) && !_globals[kCurtainOpen]) {
+	} else if ((player_said_2(pull, curtain) || player_said_2(open, curtain)) && !_globals[kCurtainOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -1007,7 +1007,7 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if ((_action.isAction(words_pull, words_curtain) || _action.isAction(words_close, words_curtain)) && _globals[kCurtainOpen]) {
+	} else if ((player_said_2(pull, curtain) || player_said_2(close, curtain)) && _globals[kCurtainOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
@@ -1031,7 +1031,7 @@ static void room_210_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_hut)) {
+	} else if (player_said_2(look, hut)) {
 		if (_globals[kTwinklesStatus] == TWINKLES_GONE) {
 			if (_game._storyMode == STORYMODE_NAUGHTY)
 				_vm->_dialogs->show(21003);
@@ -1040,31 +1040,31 @@ static void room_210_parser() {
 		} else {
 			_vm->_dialogs->show(21001);
 		}
-	} else if (_action.isAction(words_look, words_bra)) {
+	} else if (player_said_2(look, bra)) {
 		_vm->_dialogs->show(21004);
-	} else if (_action.isAction(words_look, words_hotpants)) {
+	} else if (player_said_2(look, hotpants)) {
 		_vm->_dialogs->show(21005);
-	} else if (_action.isAction(words_take, words_hotpants) || _action.isAction(words_take, words_bra)) {
+	} else if (player_said_2(take, hotpants) || player_said_2(take, bra)) {
 		_vm->_dialogs->show(21006);
-	} else if (_action.isAction(words_look, words_stream)) {
+	} else if (player_said_2(look, stream)) {
 		_vm->_dialogs->show(21007);
-	} else if (_action.isAction(words_look, words_bushy_fern)) {
+	} else if (player_said_2(look, bushy_fern)) {
 		_vm->_dialogs->show(21008);
-	} else if (_action.isAction(words_look, words_village_path)) {
+	} else if (player_said_2(look, village_path)) {
 		_vm->_dialogs->show(21009);
-	} else if (_action.isAction(words_look, words_native_woman)) {
+	} else if (player_said_2(look, native_woman)) {
 		_vm->_dialogs->show(21010);
-	} else if (_action.isAction(words_shoot, words_native_woman) || _action.isAction(words_hose_down, words_native_woman)) {
+	} else if (player_said_2(shoot, native_woman) || player_said_2(hose_down, native_woman)) {
 		_vm->_dialogs->show(21011);
-	} else if (_action.isAction(words_look, words_path_to_north)) {
+	} else if (player_said_2(look, path_to_north)) {
 		_vm->_dialogs->show(21012);
-	} else if (_action.isAction(words_look, words_curtain)) {
+	} else if (player_said_2(look, curtain)) {
 		_vm->_dialogs->show(21013);
-	} else if (_action.isAction(words_look, words_clothesline)) {
+	} else if (player_said_2(look, clothesline)) {
 		_vm->_dialogs->show(21014);
-	} else if (_action.isAction(words_take, words_clothesline)) {
+	} else if (player_said_2(take, clothesline)) {
 		_vm->_dialogs->show(21015);
-	} else if (_action.isAction(words_look, words_hut_to_north)) {
+	} else if (player_said_2(look, hut_to_north)) {
 		_vm->_dialogs->show(21016);
 	} else {
 		// Not handled
diff --git a/engines/mads/madsv2/nebular/rooms/room211.cpp b/engines/mads/madsv2/nebular/rooms/room211.cpp
index 7970cd72b11..89dfacda0ea 100644
--- a/engines/mads/madsv2/nebular/rooms/room211.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room211.cpp
@@ -265,31 +265,31 @@ static void room_211_daemon() {
 }
 
 static void room_211_pre_parser() {
-	if (_action.isAction(words_walk_down, words_jungle_path) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
+	if (player_said_2(walk_down, jungle_path) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
 		&& (_scene->_customDest.x <= 52) && (_scene->_customDest.y >= 132))
 		_game._player.walk(Common::Point(52, 132), FACING_WEST);
 
-	if (_action.isAction(words_walk_down, words_path_to_west)) {
+	if (player_said_2(walk_down, path_to_west)) {
 		if (_game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
 			_game._player.walk(Common::Point(52, 132), FACING_WEST);
 		else
 			_game._player._walkOffScreenSceneId = 210;
 	}
 
-	if (_action.isAction(words_walk_down, words_path_to_northeast))
+	if (player_said_2(walk_down, path_to_northeast))
 		_game._player._walkOffScreenSceneId = 207;
 }
 
 static void room_211_parser() {
 	if (_action._lookFlag && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
 		_vm->_dialogs->show(21111);
-	else if (_action.isAction(words_look, words_binoculars, words_palm_tree))
+	else if (player_said_3(look, binoculars, palm_tree))
 		_vm->_dialogs->show(21116);
-	else if (_action.isAction(words_look, words_bushy_fern))
+	else if (player_said_2(look, bushy_fern))
 		_vm->_dialogs->show(21101);
-	else if (_action.isAction(words_look, words_jungle_path))
+	else if (player_said_2(look, jungle_path))
 		_vm->_dialogs->show(21102);
-	else if (_action.isAction(words_look, words_palm_tree)) {
+	else if (player_said_2(look, palm_tree)) {
 		if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) {
 			if (_game._storyMode == STORYMODE_NAUGHTY)
 				_vm->_dialogs->show(21103);
@@ -298,22 +298,22 @@ static void room_211_parser() {
 		} else {
 			_vm->_dialogs->show(21105);
 		}
-	} else if (_action.isAction(words_look, words_thick_undergrowth)) {
+	} else if (player_said_2(look, thick_undergrowth)) {
 		if (_game._storyMode == STORYMODE_NAUGHTY)
 			_vm->_dialogs->show(21106);
 		else
 			_vm->_dialogs->show(21107);
-	} else if (_action.isAction(words_look, words_jungle))
+	} else if (player_said_2(look, jungle))
 		_vm->_dialogs->show(21108);
-	else if (_action.isAction(words_look, words_path_to_northeast))
+	else if (player_said_2(look, path_to_northeast))
 		_vm->_dialogs->show(21109);
-	else if (_action.isAction(words_look, words_path_to_west))
+	else if (player_said_2(look, path_to_west))
 		_vm->_dialogs->show(21110);
-	else if (_action.isAction(words_look, words_slithering_snake))
+	else if (player_said_2(look, slithering_snake))
 		_vm->_dialogs->show(21113);
-	else if (_action.isAction(words_take, words_slithering_snake))
+	else if (player_said_2(take, slithering_snake))
 		_vm->_dialogs->show(21114);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(21115);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room212.cpp b/engines/mads/madsv2/nebular/rooms/room212.cpp
index 707602c18a5..fb97e444cd7 100644
--- a/engines/mads/madsv2/nebular/rooms/room212.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room212.cpp
@@ -49,32 +49,32 @@ static void room_212_daemon() {
 }
 
 static void room_212_pre_parser() {
-	if (_action.isAction(words_walk_through, words_cave_entrance))
+	if (player_said_2(walk_through, cave_entrance))
 		_game._player._walkOffScreenSceneId = 111;
 }
 
 static void room_212_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21209);
-	else if (_action.isAction(words_walk_towards) && (_action.isObject(words_field_to_north) || _action.isObject(words_mountains)))
+	else if (player_said_1(walk_towards) && (player_said_1(field_to_north) || player_said_1(mountains)))
 		_scene->_nextSceneId = 208;
-	else if (_action.isAction(words_walk_towards, words_cave))
+	else if (player_said_2(walk_towards, cave))
 		_scene->_nextSceneId = 111;
-	else if (_action.isAction(words_look, words_grass))
+	else if (player_said_2(look, grass))
 		_vm->_dialogs->show(21201);
-	else if (_action.isAction(words_look, words_rocks))
+	else if (player_said_2(look, rocks))
 		_vm->_dialogs->show(21202);
-	else if (_action.isAction(words_look, words_cave_entrance))
+	else if (player_said_2(look, cave_entrance))
 		_vm->_dialogs->show(21203);
-	else if (_action.isAction(words_look, words_sky))
+	else if (player_said_2(look, sky))
 		_vm->_dialogs->show(21204);
-	else if (_action.isAction(words_look, words_field_to_north))
+	else if (player_said_2(look, field_to_north))
 		_vm->_dialogs->show(21205);
-	else if (_action.isAction(words_look, words_trees))
+	else if (player_said_2(look, trees))
 		_vm->_dialogs->show(21206);
-	else if (_action.isAction(words_look, words_plants))
+	else if (player_said_2(look, plants))
 		_vm->_dialogs->show(21207);
-	else if (_action.isAction(words_look, words_mountains))
+	else if (player_said_2(look, mountains))
 		_vm->_dialogs->show(21208);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index 498577c2a20..50be7bde3d6 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -64,23 +64,23 @@ static void room_213_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_control_panel))
+	if (player_said_2(look, control_panel))
 		_vm->_dialogs->show(21301);
-	else if (_action.isAction(words_look, words_keypad) || _action.isAction(words_inspect, words_keypad))
+	else if (player_said_2(look, keypad) || player_said_2(inspect, keypad))
 		_vm->_dialogs->show(21302);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(21303);
-	else if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
+	else if (player_said_2(look, viewport) || player_said_2(peer_through, viewport))
 		_vm->_dialogs->show(21304);
-	else if (_action.isAction(words_look, words_device))
+	else if (player_said_2(look, device))
 		_vm->_dialogs->show(21305);
-	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
-		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
-		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
-		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
-		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
-		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_frown_key)
-		|| _action.isAction(words_look, words_enter_key))
+	else if (player_said_2(look, 0_key) || player_said_2(look, 1_key)
+		|| player_said_2(look, 2_key) || player_said_2(look, 3_key)
+		|| player_said_2(look, 4_key) || player_said_2(look, 5_key)
+		|| player_said_2(look, 6_key) || player_said_2(look, 7_key)
+		|| player_said_2(look, 8_key) || player_said_2(look, 9_key)
+		|| player_said_2(look, smile_key) || player_said_2(look, frown_key)
+		|| player_said_2(look, enter_key))
 		_vm->_dialogs->show(21306);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room214.cpp b/engines/mads/madsv2/nebular/rooms/room214.cpp
index fe610778c17..52285d1b29e 100644
--- a/engines/mads/madsv2/nebular/rooms/room214.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room214.cpp
@@ -117,9 +117,9 @@ static void room_214_daemon() {
 static void room_214_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21427);
-	else if (_action.isAction(words_walk_outside, words_hut))
+	else if (player_said_2(walk_outside, hut))
 		_scene->_nextSceneId = 207;
-	else if (_action.isAction(words_take, words_poison_darts) && (_game._trigger || _game._objects.isInRoom(OBJ_POISON_DARTS))) {
+	else if (player_said_2(take, poison_darts) && (_game._trigger || _game._objects.isInRoom(OBJ_POISON_DARTS))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -151,7 +151,7 @@ static void room_214_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_blowgun) && (_game._trigger || _game._objects.isInRoom(OBJ_BLOWGUN))) {
+	} else if (player_said_2(take, blowgun) && (_game._trigger || _game._objects.isInRoom(OBJ_BLOWGUN))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -183,53 +183,53 @@ static void room_214_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_window))
+	} else if (player_said_2(look, window))
 		_vm->_dialogs->show(21401);
-	else if (_action.isAction(words_look, words_experiment_cage))
+	else if (player_said_2(look, experiment_cage))
 		_vm->_dialogs->show(21402);
-	else if (_action.isAction(words_look, words_captive_creature))
+	else if (player_said_2(look, captive_creature))
 		_vm->_dialogs->show(21403);
-	else if (_action.isAction(words_look, words_bear_rug))
+	else if (player_said_2(look, bear_rug))
 		_vm->_dialogs->show(21404);
-	else if (_action.isAction(words_look, words_trophy))
+	else if (player_said_2(look, trophy))
 		_vm->_dialogs->show(21405);
-	else if (_action.isAction(words_look, words_large_bowl)) {
+	else if (player_said_2(look, large_bowl)) {
 		if (_game._storyMode == STORYMODE_NAUGHTY) {
 			_vm->_dialogs->show(21406);
 		} else {
 			_vm->_dialogs->show(21407);
 		}
-	} else if (_action.isAction(words_look, words_specimen_jars))
+	} else if (player_said_2(look, specimen_jars))
 		_vm->_dialogs->show(21408);
-	else if (_action.isAction(words_take, words_large_bowl) || _action.isAction(words_take, words_specimen_jars))
+	else if (player_said_2(take, large_bowl) || player_said_2(take, specimen_jars))
 		_vm->_dialogs->show(21409);
-	else if (_action.isAction(words_look, words_shrunken_heads))
+	else if (player_said_2(look, shrunken_heads))
 		_vm->_dialogs->show(21410);
-	else if (_action.isAction(words_take, words_shrunken_heads) || _action.isAction(words_take, words_large_heads))
+	else if (player_said_2(take, shrunken_heads) || player_said_2(take, large_heads))
 		_vm->_dialogs->show(21411);
-	else if (_action.isAction(words_look, words_large_heads))
+	else if (player_said_2(look, large_heads))
 		_vm->_dialogs->show(21428);
-	else if (_action.isAction(words_look, words_poison_darts) && (_action._savedFields._mainObjectSource == 4))
+	else if (player_said_2(look, poison_darts) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(21412);
-	else if (_action.isAction(words_open, words_experiment_cage))
+	else if (player_said_2(open, experiment_cage))
 		_vm->_dialogs->show(21414);
-	else if (_action.isAction(words_talkto, words_captive_creature))
+	else if (player_said_2(talkto, captive_creature))
 		_vm->_dialogs->show(21415);
-	else if (_action.isAction(words_give, words_twinkifruit, words_captive_creature))
+	else if (player_said_3(give, twinkifruit, captive_creature))
 		_vm->_dialogs->show(21416);
-	else if (_action.isAction(words_shoot, words_blowgun, words_captive_creature) || _action.isAction(words_hose_down, words_blowgun, words_captive_creature))
+	else if (player_said_3(shoot, blowgun, captive_creature) || player_said_3(hose_down, blowgun, captive_creature))
 		_vm->_dialogs->show(21417);
-	else if (_action.isAction(words_look, words_big_heads))
+	else if (player_said_2(look, big_heads))
 		_vm->_dialogs->show(21418);
-	else if (_action.isAction(words_take, words_big_heads))
+	else if (player_said_2(take, big_heads))
 		_vm->_dialogs->show(21419);
-	else if (_action.isAction(words_take, words_bear_rug))
+	else if (player_said_2(take, bear_rug))
 		_vm->_dialogs->show(21420);
-	else if (_action.isAction(words_look, words_floor_of_hut))
+	else if (player_said_2(look, floor_of_hut))
 		_vm->_dialogs->show(21421);
-	else if (_action.isAction(words_look, words_blowgun))
+	else if (player_said_2(look, blowgun))
 		_vm->_dialogs->show(21422);
-	else if (_action.isAction(words_look, words_table)) {
+	else if (player_said_2(look, table)) {
 		if (_game._objects.isInRoom(OBJ_POISON_DARTS) && _game._objects.isInRoom(OBJ_BLOWGUN)) {
 			_vm->_dialogs->show(21423);
 		} else if (_game._objects.isInRoom(OBJ_POISON_DARTS) && !_game._objects.isInRoom(OBJ_BLOWGUN)) {
diff --git a/engines/mads/madsv2/nebular/rooms/room215.cpp b/engines/mads/madsv2/nebular/rooms/room215.cpp
index 9a8ddb9f299..df2d79d877d 100644
--- a/engines/mads/madsv2/nebular/rooms/room215.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room215.cpp
@@ -78,7 +78,7 @@ static void room_215_daemon() {
 static void room_215_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(21509);
-	else if (_action.isAction(words_take, words_twinkifruit)) {
+	else if (player_said_2(take, twinkifruit)) {
 		if (!_game._objects.isInInventory(OBJ_TWINKIFRUIT) || _game._trigger) {
 			switch (_game._trigger) {
 			case 0:
@@ -117,31 +117,31 @@ static void room_215_parser() {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(idx));
 		}
-	} else if (_action.isAction(words_walk_outside, words_hut))
+	} else if (player_said_2(walk_outside, hut))
 		_scene->_nextSceneId = 210;
-	else if (_action.isAction(words_look, words_bear_rug))
+	else if (player_said_2(look, bear_rug))
 		_vm->_dialogs->show(21501);
-	else if (_action.isAction(words_look, words_bed))
+	else if (player_said_2(look, bed))
 		_vm->_dialogs->show(21502);
-	else if (_action.isAction(words_look, words_welcome_mat))
+	else if (player_said_2(look, welcome_mat))
 		_vm->_dialogs->show(21503);
-	else if (_action.isAction(words_look, words_love_altar))
+	else if (player_said_2(look, love_altar))
 		_vm->_dialogs->show(21504);
-	else if (_action.isAction(words_look, words_window))
+	else if (player_said_2(look, window))
 		_vm->_dialogs->show(21505);
-	else if (_action.isAction(words_look, words_picture))
+	else if (player_said_2(look, picture))
 		_vm->_dialogs->show(21506);
-	else if (_action.isAction(words_look, words_twinkifruit) && (_action._savedFields._mainObjectSource == 4))
+	else if (player_said_2(look, twinkifruit) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(21507);
-	else if (_action.isAction(words_take, words_bear_rug))
+	else if (player_said_2(take, bear_rug))
 		_vm->_dialogs->show(21510);
-	else if (_action.isAction(words_take, words_love_altar))
+	else if (player_said_2(take, love_altar))
 		_vm->_dialogs->show(21511);
-	else if (_action.isAction(words_look, words_bag_of_twinkifruits))
+	else if (player_said_2(look, bag_of_twinkifruits))
 		_vm->_dialogs->show(21512);
-	else if (_action.isAction(words_take, words_bag_of_twinkifruits))
+	else if (player_said_2(take, bag_of_twinkifruits))
 		_vm->_dialogs->show(21513);
-	else if (_action.isAction(words_take, words_welcome_mat))
+	else if (player_said_2(take, welcome_mat))
 		_vm->_dialogs->show(21514);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room307.cpp b/engines/mads/madsv2/nebular/rooms/room307.cpp
index cce95587ba8..22b4d4438b8 100644
--- a/engines/mads/madsv2/nebular/rooms/room307.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room307.cpp
@@ -453,7 +453,7 @@ static void room_307_parser() {
 		_vm->_dialogs->show(30715);
 	else if (_game._screenObjects._inputMode == kInputConversation)
 		handleDialog();
-	else if (_action.isAction(words_talkto, words_cell_wall) || _action.isAction(words_talkto, words_wall) || _action.isAction(words_talkto, words_toilet)) {
+	else if (player_said_2(talkto, cell_wall) || player_said_2(talkto, wall) || player_said_2(talkto, toilet)) {
 		int node, say;
 		if (_globals[kKnowsBuddyBeast]) {
 			say = 0x10E;
@@ -478,7 +478,7 @@ static void room_307_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_pry, words_scalpel, words_air_vent)) {
+	} else if (player_said_3(pry, scalpel, air_vent)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -556,7 +556,7 @@ static void room_307_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_climb_into, words_air_vent)) {
+	} else if (player_said_2(climb_into, air_vent)) {
 		if (local._grateOpenedFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -640,9 +640,9 @@ static void room_307_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_use, words_toilet) && (_game._storyMode != STORYMODE_NAUGHTY))
+	} else if (player_said_2(use, toilet) && (_game._storyMode != STORYMODE_NAUGHTY))
 		_vm->_dialogs->show(30723);
-	else if (_action.isAction(words_use, words_toilet)) {
+	else if (player_said_2(use, toilet)) {
 		if (!local._afterPeeingFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -693,24 +693,24 @@ static void room_307_parser() {
 			int idx = _scene->_kernelMessages.add(Common::Point(85, 39), 0x1110, 0, 0, 180, _game.getQuote(238));
 			_scene->_kernelMessages.setQuoted(idx, 4, true);
 		}
-	} else if (_action.isAction(words_look, words_air_vent)) {
+	} else if (player_said_2(look, air_vent)) {
 		if (!local._grateOpenedFl)
 			_vm->_dialogs->show(30710);
 		else
 			_vm->_dialogs->show(30711);
-	} else if (_action.isAction(words_look, words_bed))
+	} else if (player_said_2(look, bed))
 		_vm->_dialogs->show(30712);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(30713);
-	else if (_action.isAction(words_look, words_toilet))
+	else if (player_said_2(look, toilet))
 		_vm->_dialogs->show(30714);
-	else if (_action.isAction(words_sharpen, words_scalpel))
+	else if (player_said_2(sharpen, scalpel))
 		_vm->_dialogs->show(30716);
-	else if (_action.isAction(words_look, words_cell_wall))
+	else if (player_said_2(look, cell_wall))
 		_vm->_dialogs->show(30717);
-	else if (_action.isAction(words_look, words_light))
+	else if (player_said_2(look, light))
 		_vm->_dialogs->show(30718);
-	else if (_action.isAction(words_walk_into, words_corridor)) {
+	else if (player_said_2(walk_into, corridor)) {
 		switch (local._fieldCollisionCounter) {
 		case 0:
 			_vm->_dialogs->show(30719);
diff --git a/engines/mads/madsv2/nebular/rooms/room311.cpp b/engines/mads/madsv2/nebular/rooms/room311.cpp
index 23a6219b64f..0af8fb3a2ed 100644
--- a/engines/mads/madsv2/nebular/rooms/room311.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room311.cpp
@@ -196,9 +196,9 @@ static void room_311_parser() {
 		local._checkGuardFl = false;
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.addQuote(250, 0, 240);
-	} else if (_action.isAction(words_sit_at, words_desk))
+	} else if (player_said_2(sit_at, desk))
 		_scene->_nextSceneId = 320;
-	else if (_action.isAction(words_climb_into, words_air_vent)) {
+	else if (player_said_2(climb_into, air_vent)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -294,25 +294,25 @@ static void room_311_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_desk))
+	} else if (player_said_2(look, desk))
 		_vm->_dialogs->show(31110);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(31111);
-	else if (_action.isAction(words_look, words_lighting_fixture) || _action.isAction(words_stare_at, words_lighting_fixture))
+	else if (player_said_2(look, lighting_fixture) || player_said_2(stare_at, lighting_fixture))
 		_vm->_dialogs->show(31112);
-	else if (_action.isAction(words_look, words_lights) || _action.isAction(words_stare_at, words_lights))
+	else if (player_said_2(look, lights) || player_said_2(stare_at, lights))
 		_vm->_dialogs->show(31113);
-	else if (_action.isAction(words_take, words_lights))
+	else if (player_said_2(take, lights))
 		_vm->_dialogs->show(31114);
-	else if (_action.isAction(words_look, words_light) || _action.isAction(words_stare_at, words_light))
+	else if (player_said_2(look, light) || player_said_2(stare_at, light))
 		_vm->_dialogs->show(31115);
-	else if (_action.isAction(words_take, words_light))
+	else if (player_said_2(take, light))
 		_vm->_dialogs->show(31116);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(31117);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(31118);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(31120);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room313.cpp b/engines/mads/madsv2/nebular/rooms/room313.cpp
index e772187e180..ced84a821a3 100644
--- a/engines/mads/madsv2/nebular/rooms/room313.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room313.cpp
@@ -70,30 +70,30 @@ static void room_313_init() {
 }
 
 static void room_313_parser() {
-	if (_action.isAction(words_crawl_to, words_fourth_cell))
+	if (player_said_2(crawl_to, fourth_cell))
 		_scene->_nextSceneId = 387;
-	else if (_action.isAction(words_crawl_to, words_third_cell))
+	else if (player_said_2(crawl_to, third_cell))
 		_scene->_nextSceneId = 388;
-	else if (_action.isAction(words_crawl_to, words_second_cell)) {
+	else if (player_said_2(crawl_to, second_cell)) {
 		if (_globals[kAfterHavoc])
 			_scene->_nextSceneId = 399;
 		else
 			_scene->_nextSceneId = 389;
-	} else if (_action.isAction(words_crawl_to, words_first_cell))
+	} else if (player_said_2(crawl_to, first_cell))
 		_scene->_nextSceneId = 390;
-	else if (_action.isAction(words_crawl_to, words_security_station)) {
+	else if (player_said_2(crawl_to, security_station)) {
 		if (_globals[kSexOfRex] == REX_FEMALE) {
 			_globals[kSexOfRex] = REX_MALE;
 			_vm->_dialogs->show(31301);
 		}
 		_scene->_nextSceneId = 391;
-	} else if (_action.isAction(words_crawl_to, words_equipment_room)) {
+	} else if (player_said_2(crawl_to, equipment_room)) {
 		if (_globals[kSexOfRex] == REX_FEMALE) {
 			_globals[kSexOfRex] = REX_MALE;
 			_vm->_dialogs->show(31301);
 		}
 		_scene->_nextSceneId = 366;
-	} else if (!_action.isAction(words_crawl_down, words_air_shaft))
+	} else if (!player_said_2(crawl_down, air_shaft))
 		return;
 
 	_action._inProgress = false;
diff --git a/engines/mads/madsv2/nebular/rooms/room316.cpp b/engines/mads/madsv2/nebular/rooms/room316.cpp
index eca1ea20714..d796ada3461 100644
--- a/engines/mads/madsv2/nebular/rooms/room316.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room316.cpp
@@ -384,7 +384,7 @@ static void room_316_daemon() {
 }
 
 static void room_316_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_east)) {
+	if (player_said_2(walk_down, corridor_to_east)) {
 		if (_globals[kAfterHavoc])
 			_game._player._walkOffScreenSceneId = 354;
 		else
@@ -393,12 +393,12 @@ static void room_316_pre_parser() {
 }
 
 static void room_316_parser() {
-	if (_action.isAction(words_climb_into, words_air_vent)) {
+	if (player_said_2(climb_into, air_vent)) {
 		if (_globals[kSexOfRex] == REX_FEMALE)
 			handleRoxInGrate();
 		else
 			handleRexInGrate();
-	} else if (_action.isAction(words_walk_up, words_ramp) || _action.isAction(words_walk_onto, words_platform)) {
+	} else if (player_said_2(walk_up, ramp) || player_said_2(walk_onto, platform)) {
 		switch (_game._trigger) {
 		case 0:
 			if (_globals[kCityFlooded]) {
@@ -452,35 +452,35 @@ static void room_316_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_platform))
+	} else if (player_said_2(look, platform))
 		_vm->_dialogs->show(31610);
-	else if (_action.isAction(words_look, words_strange_device)) {
+	else if (player_said_2(look, strange_device)) {
 		if (_game._visitedScenes.exists(321))
 			_vm->_dialogs->show(31612);
 		else
 			_vm->_dialogs->show(31611);
-	} else if (_action.isAction(words_look, words_controls))
+	} else if (player_said_2(look, controls))
 		_vm->_dialogs->show(31613);
-	else if (_action.isAction(words_look, words_equipment))
+	else if (player_said_2(look, equipment))
 		_vm->_dialogs->show(31614);
-	else if (_action.isAction(words_look, words_panel))
+	else if (player_said_2(look, panel))
 		_vm->_dialogs->show(31615);
-	else if (_action.isAction(words_look, words_monitor))
+	else if (player_said_2(look, monitor))
 		_vm->_dialogs->show(31616);
-	else if (_action.isAction(words_look, words_ramp))
+	else if (player_said_2(look, ramp))
 		_vm->_dialogs->show(31617);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(31618);
-	else if (_action.isAction(words_look, words_corridor_to_east)) {
+	else if (player_said_2(look, corridor_to_east)) {
 		if (!_globals[kAfterHavoc]) {
 			if (_game._difficulty != DIFFICULTY_EASY)
 				_vm->_dialogs->show(31620);
 			else
 				_vm->_dialogs->show(31619);
 		}
-	} else if (_action.isAction(words_look, words_floor))
+	} else if (player_said_2(look, floor))
 		_vm->_dialogs->show(31621);
-	else if (_action.isAction(words_look, words_support))
+	else if (player_said_2(look, support))
 		_vm->_dialogs->show(31622);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index da530a9a290..927a9533528 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -452,7 +452,7 @@ static void room_318_pre_parser() {
 	if (_game._player._needToWalk)
 		_game._player._needToWalk = _game._player._visible;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 357;
 }
 
@@ -463,7 +463,7 @@ static void room_318_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_talkto, words_intern)) {
+	if (player_said_2(talkto, intern)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -504,7 +504,7 @@ static void room_318_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_scalpel) && (_game._objects.isInRoom(OBJ_SCALPEL) || _game._trigger)) {
+	if (player_said_2(take, scalpel) && (_game._objects.isInRoom(OBJ_SCALPEL) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -550,13 +550,13 @@ static void room_318_parser() {
 	}
 
 	if (_game._player._visible) {
-		if (_action.isAction(words_walk_down, words_corridor_to_south)) {
+		if (player_said_2(walk_down, corridor_to_south)) {
 			_scene->_nextSceneId = 407;
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(words_take, words_tape_player)) {
+		if (player_said_2(take, tape_player)) {
 			if (_game._objects.isInRoom(OBJ_AUDIO_TAPE)) {
 				_vm->_dialogs->showItem(OBJ_AUDIO_TAPE, 0x7C5B);
 				_game._objects.addToInventory(OBJ_AUDIO_TAPE);
@@ -567,7 +567,7 @@ static void room_318_parser() {
 			return;
 		}
 
-		if (_action.isAction(words_look, words_tape_player)) {
+		if (player_said_2(look, tape_player)) {
 			if (_game._objects.isInRoom(OBJ_AUDIO_TAPE))
 				_vm->_dialogs->show(31833);
 			else
@@ -577,68 +577,68 @@ static void room_318_parser() {
 			return;
 		}
 
-		if (_action.isAction(words_walk_into, words_doctors_office)) {
+		if (player_said_2(walk_into, doctors_office)) {
 			_vm->_dialogs->show(31831);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(words_look, words_gurney)) {
+		if (player_said_2(look, gurney)) {
 			_vm->_dialogs->show(31823);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(words_look, words_instrument_table)) {
+		if (player_said_2(look, instrument_table)) {
 			_vm->_dialogs->show(31825);
 			_action._inProgress = false;
 			return;
 		}
 	} else { // Not visible
-		if (_action.isAction(words_look, words_gurney)) {
+		if (player_said_2(look, gurney)) {
 			_vm->_dialogs->show(31822);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(words_look, words_instrument_table)) {
+		if (player_said_2(look, instrument_table)) {
 			_vm->_dialogs->show(31824);
 			_action._inProgress = false;
 			return;
 		}
 	}
 
-	if (_action.isAction(words_look, words_wall))
+	if (player_said_2(look, wall))
 		_vm->_dialogs->show(31810);
-	else if (_action.isAction(words_look, words_floor))
+	else if (player_said_2(look, floor))
 		_vm->_dialogs->show(31811);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(31812);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(31813);
-	else if (_action.isAction(words_look, words_faucet))
+	else if (player_said_2(look, faucet))
 		_vm->_dialogs->show(31814);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(31815);
-	else if (_action.isAction(words_look, words_conveyor_belt))
+	else if (player_said_2(look, conveyor_belt))
 		_vm->_dialogs->show(31816);
-	else if (_action.isAction(words_look, words_large_blade))
+	else if (player_said_2(look, large_blade))
 		_vm->_dialogs->show(31817);
-	else if (_action.isAction(words_look, words_monitor))
+	else if (player_said_2(look, monitor))
 		_vm->_dialogs->show(31818);
-	else if (_action.isAction(words_look, words_cabinets))
+	else if (player_said_2(look, cabinets))
 		_vm->_dialogs->show(31819);
-	else if (_action.isAction(words_look, words_equipment))
+	else if (player_said_2(look, equipment))
 		_vm->_dialogs->show(31820);
-	else if (_action.isAction(words_look, words_shelf))
+	else if (player_said_2(look, shelf))
 		_vm->_dialogs->show(31821);
-	else if (_action.isAction(words_open, words_cabinets))
+	else if (player_said_2(open, cabinets))
 		_vm->_dialogs->show(31829);
-	else if (_action.isAction(words_look, words_intern))
+	else if (player_said_2(look, intern))
 		_vm->_dialogs->show(31830);
-	else if (_action.isAction(words_look, words_professor))
+	else if (player_said_2(look, professor))
 		_vm->_dialogs->show(31832);
-	else if (_action.isAction(words_look, words_professors_gurney))
+	else if (player_said_2(look, professors_gurney))
 		_vm->_dialogs->show(31836);
 	else if (_action._lookFlag) {
 		if (_game._player._visible || _game._objects.isInInventory(OBJ_SCALPEL))
diff --git a/engines/mads/madsv2/nebular/rooms/room320.cpp b/engines/mads/madsv2/nebular/rooms/room320.cpp
index ebd58111f4c..708c2a0d3c3 100644
--- a/engines/mads/madsv2/nebular/rooms/room320.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room320.cpp
@@ -238,11 +238,11 @@ static void room_320_daemon() {
 static void room_320_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(32011);
-	else if ((_action.isAction(words_press) || _action.isAction(words_push)) &&
-		(_action.isObject(words_left_1_key) || _action.isObject(words_left_2_key) || _action.isObject(words_left_3_key) || _action.isObject(words_left_4_key) ||
-			_action.isObject(words_green_button) || _action.isObject(words_red_button) || _action.isObject(words_right_1_key) || _action.isObject(words_right_2_key) ||
-			_action.isObject(words_right_3_key) || _action.isObject(words_right_4_key) || _action.isObject(words_right_5_key) || _action.isObject(words_right_6_key) ||
-			_action.isObject(words_right_7_key) || _action.isObject(words_right_8_key)
+	else if ((player_said_1(press) || player_said_1(push)) &&
+		(player_said_1(left_1_key) || player_said_1(left_2_key) || player_said_1(left_3_key) || player_said_1(left_4_key) ||
+			player_said_1(green_button) || player_said_1(red_button) || player_said_1(right_1_key) || player_said_1(right_2_key) ||
+			player_said_1(right_3_key) || player_said_1(right_4_key) || player_said_1(right_5_key) || player_said_1(right_6_key) ||
+			player_said_1(right_7_key) || player_said_1(right_8_key)
 			)) {
 		switch (_game._trigger) {
 		case 0:
@@ -306,39 +306,39 @@ static void room_320_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_leave, words_security_station))
+	} else if (player_said_2(leave, security_station))
 		_scene->_nextSceneId = 311;
-	else if (_action.isAction(words_look, words_right_monitor))
+	else if (player_said_2(look, right_monitor))
 		_vm->_dialogs->show(32001);
-	else if (_action.isAction(words_look, words_left_monitor))
+	else if (player_said_2(look, left_monitor))
 		_vm->_dialogs->show(32002);
-	else if (_action.isAction(words_look, words_desk))
+	else if (player_said_2(look, desk))
 		_vm->_dialogs->show(32003);
-	else if (_action.isAction(words_look, words_security_station))
+	else if (player_said_2(look, security_station))
 		_vm->_dialogs->show(32004);
-	else if (_action.isAction(words_look, words_mug))
+	else if (player_said_2(look, mug))
 		_vm->_dialogs->show(32005);
-	else if (_action.isAction(words_look, words_doughnut))
+	else if (player_said_2(look, doughnut))
 		_vm->_dialogs->show(32006);
-	else if (_action.isAction(words_look, words_magazine))
+	else if (player_said_2(look, magazine))
 		_vm->_dialogs->show(32007);
-	else if (_action.isAction(words_look, words_paper_football))
+	else if (player_said_2(look, paper_football))
 		_vm->_dialogs->show(32008);
-	else if (_action.isAction(words_look, words_newspaper))
+	else if (player_said_2(look, newspaper))
 		_vm->_dialogs->show(32009);
-	else if (_action.isAction(words_look, words_clipboard))
+	else if (player_said_2(look, clipboard))
 		_vm->_dialogs->show(32010);
-	else if (_action.isAction(words_take, words_mug))
+	else if (player_said_2(take, mug))
 		_vm->_dialogs->show(32012);
-	else if (_action.isAction(words_take, words_clipboard))
+	else if (player_said_2(take, clipboard))
 		_vm->_dialogs->show(32013);
-	else if (_action.isAction(words_take, words_doughnut) || _action.isAction(words_eat, words_doughnut))
+	else if (player_said_2(take, doughnut) || player_said_2(eat, doughnut))
 		_vm->_dialogs->show(32014);
-	else if (_action.isAction(words_take, words_paper_football))
+	else if (player_said_2(take, paper_football))
 		_vm->_dialogs->show(32015);
-	else if (_action.isAction(words_take, words_magazine))
+	else if (player_said_2(take, magazine))
 		_vm->_dialogs->show(32016);
-	else if (_action.isAction(words_take, words_newspaper))
+	else if (player_said_2(take, newspaper))
 		_vm->_dialogs->show(32017);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room322.cpp b/engines/mads/madsv2/nebular/rooms/room322.cpp
index 39e913ced5d..a05ec350680 100644
--- a/engines/mads/madsv2/nebular/rooms/room322.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room322.cpp
@@ -64,21 +64,21 @@ static void room_322_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
+	if (player_said_2(look, viewport) || player_said_2(peer_through, viewport))
 		_vm->_dialogs->show(32210);
-	else if (_action.isAction(words_look, words_keypad))
+	else if (player_said_2(look, keypad))
 		_vm->_dialogs->show(32211);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(32212);
-	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
-		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
-		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
-		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
-		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
-		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_enter_key)
-		|| _action.isAction(words_look, words_frown_key))
+	else if (player_said_2(look, 0_key) || player_said_2(look, 1_key)
+		|| player_said_2(look, 2_key) || player_said_2(look, 3_key)
+		|| player_said_2(look, 4_key) || player_said_2(look, 5_key)
+		|| player_said_2(look, 6_key) || player_said_2(look, 7_key)
+		|| player_said_2(look, 8_key) || player_said_2(look, 9_key)
+		|| player_said_2(look, smile_key) || player_said_2(look, enter_key)
+		|| player_said_2(look, frown_key))
 		_vm->_dialogs->show(32213);
-	else if (_action.isAction(words_look, words_device))
+	else if (player_said_2(look, device))
 		_vm->_dialogs->show(32214);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room351.cpp b/engines/mads/madsv2/nebular/rooms/room351.cpp
index d098b7a894b..8fdd266514f 100644
--- a/engines/mads/madsv2/nebular/rooms/room351.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room351.cpp
@@ -115,11 +115,11 @@ static void room_351_daemon() {
 static void room_351_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35121);
-	else if (_action.isAction(words_step_into, words_teleporter))
+	else if (player_said_2(step_into, teleporter))
 		_scene->_nextSceneId = 322;
-	else if (_action.isAction(words_walk_down, words_corridor_to_south))
+	else if (player_said_2(walk_down, corridor_to_south))
 		_scene->_nextSceneId = 352;
-	else if (_action.isAction(words_take, words_credit_chip)) {
+	else if (player_said_2(take, credit_chip)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_CREDIT_CHIP)) {
 			switch (_game._trigger) {
 			case 0:
@@ -154,30 +154,30 @@ static void room_351_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_look, words_view_screen))
+	} else if (player_said_2(look, view_screen))
 		_vm->_dialogs->show(35110);
-	else if (_action.isAction(words_look, words_rip_in_floor))
+	else if (player_said_2(look, rip_in_floor))
 		_vm->_dialogs->show(35111);
-	else if (_action.isAction(words_look, words_fire_hydrant))
+	else if (player_said_2(look, fire_hydrant))
 		_vm->_dialogs->show(35112);
-	else if (_action.isAction(words_look, words_guard)) {
+	else if (player_said_2(look, guard)) {
 		if (_game._objects[0xF]._roomNumber == 351)
 			_vm->_dialogs->show(35114);
 		else
 			_vm->_dialogs->show(35113);
-	} else if (_action.isAction(words_look, words_equipment))
+	} else if (player_said_2(look, equipment))
 		_vm->_dialogs->show(35115);
-	else if (_action.isAction(words_look, words_desk))
+	else if (player_said_2(look, desk))
 		_vm->_dialogs->show(35116);
-	else if (_action.isAction(words_look, words_machine))
+	else if (player_said_2(look, machine))
 		_vm->_dialogs->show(35117);
-	else if (_action.isAction(words_look, words_teleporter))
+	else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(35118);
-	else if (_action.isAction(words_look, words_control_panel))
+	else if (player_said_2(look, control_panel))
 		_vm->_dialogs->show(35119);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(35120);
-	else if (_action.isAction(words_look, words_pole))
+	else if (player_said_2(look, pole))
 		_vm->_dialogs->show(35122);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room352.cpp b/engines/mads/madsv2/nebular/rooms/room352.cpp
index d3c22e98547..200e8ddf054 100644
--- a/engines/mads/madsv2/nebular/rooms/room352.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room352.cpp
@@ -185,10 +185,10 @@ static void room_352_init() {
 static void room_352_pre_parser() {
 	local._leaveRoomFl = false;
 
-	if (_action.isAction(words_open, words_vault))
+	if (player_said_2(open, vault))
 		_game._player.walk(Common::Point(266, 111), FACING_NORTHEAST);
 
-	if (local._vaultOpenFl && !_action.isObject(words_vault) && !_action.isObject(words_lamp) && !_action.isObject(words_other_stuff) && !_action.isObject(words_your_stuff)) {
+	if (local._vaultOpenFl && !player_said_1(vault) && !player_said_1(lamp) && !player_said_1(other_stuff) && !player_said_1(your_stuff)) {
 		if (_globals[kHaveYourStuff]) {
 			local._commonSpriteIndex = _globals._spriteIndexes[13];
 			local._commonSequenceIdx = _globals._sequenceIndexes[13];
@@ -224,14 +224,14 @@ static void room_352_pre_parser() {
 		}
 	}
 
-	if (_action.isAction(words_put, words_guards_arm2, words_scanner)) {
+	if (player_said_3(put, guards_arm2, scanner)) {
 		if (_globals[kSexOfRex] == REX_MALE)
 			_game._player.walk(Common::Point(269, 111), FACING_NORTHEAST);
 		else
 			_game._player.walk(Common::Point(271, 111), FACING_NORTHEAST);
 	}
 
-	if (_action.isAction(words_walk_through, words_doorway) || _action.isAction(words_walk_down, words_corridor_to_south) || _action.isAction(words_put, words_guards_arm2, words_floor)) {
+	if (player_said_2(walk_through, doorway) || player_said_2(walk_down, corridor_to_south) || player_said_3(put, guards_arm2, floor)) {
 		if (_game._objects.isInInventory(OBJ_GUARDS_ARM))
 			_game._player.walk(Common::Point(230, 117), FACING_NORTHWEST);
 	}
@@ -244,7 +244,7 @@ static void room_352_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_open, words_vault)) {
+	if (player_said_2(open, vault)) {
 		if (!local._vaultOpenFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -306,15 +306,15 @@ static void room_352_parser() {
 	bool exit_corridor = false;
 	bool exit_doorway = false;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_south)) {
+	if (player_said_2(walk_down, corridor_to_south)) {
 		exit_corridor = true;
 	}
 
-	if (_action.isAction(words_walk_through, words_doorway)) {
+	if (player_said_2(walk_through, doorway)) {
 		exit_doorway = true;
 	}
 
-	if (_action.isAction(words_walk_down, words_corridor_to_south) || _action.isAction(words_walk_through, words_doorway) || _action.isAction(words_put, words_guards_arm2, words_floor)) {
+	if (player_said_2(walk_down, corridor_to_south) || player_said_2(walk_through, doorway) || player_said_3(put, guards_arm2, floor)) {
 		if (local._mustPutArmDownFl)
 			putArmDown(exit_corridor, exit_doorway);
 		else if (exit_corridor)
@@ -326,7 +326,7 @@ static void room_352_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_guards_arm2)) {
+	if (player_said_2(take, guards_arm2)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_GUARDS_ARM)) {
 			switch (_game._trigger) {
 			case 0:
@@ -365,7 +365,7 @@ static void room_352_parser() {
 		}
 	}
 
-	if (_action.isAction(words_put, words_guards_arm2, words_scanner)) {
+	if (player_said_3(put, guards_arm2, scanner)) {
 		if (!local._vaultOpenFl) {
 			switch (_game._trigger) {
 			case 0:
@@ -449,7 +449,7 @@ static void room_352_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_take, words_your_stuff)) {
+	} else if (player_said_2(take, your_stuff)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -496,7 +496,7 @@ static void room_352_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_tape_player) && !_game._objects.isInInventory(OBJ_TAPE_PLAYER)) {
+	} else if (player_said_2(take, tape_player) && !_game._objects.isInInventory(OBJ_TAPE_PLAYER)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -534,53 +534,53 @@ static void room_352_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_scanner))
+	} else if (player_said_2(look, scanner))
 		_vm->_dialogs->show(35210);
-	else if (_action.isAction(words_look, words_monitor)) {
+	else if (player_said_2(look, monitor)) {
 		if (_game._storyMode == STORYMODE_NAUGHTY)
 			_vm->_dialogs->show(35211);
 		else
 			_vm->_dialogs->show(35212);
-	} else if (_action.isAction(words_look, words_display))
+	} else if (player_said_2(look, display))
 		_vm->_dialogs->show(35213);
-	else if (_action.isAction(words_look, words_statue))
+	else if (player_said_2(look, statue))
 		_vm->_dialogs->show(35214);
-	else if (_action.isAction(words_look, words_tape_player) && (_action._savedFields._mainObjectSource == 4))
+	else if (player_said_2(look, tape_player) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(35215);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(35216);
-	else if (_action.isAction(words_look, words_guards_arm2) && (_action._savedFields._mainObjectSource == 4))
+	else if (player_said_2(look, guards_arm2) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(35217);
-	else if (_action.isAction(words_look, words_ironing_board))
+	else if (player_said_2(look, ironing_board))
 		_vm->_dialogs->show(35218);
-	else if (_action.isAction(words_look, words_clock))
+	else if (player_said_2(look, clock))
 		_vm->_dialogs->show(35219);
-	else if (_action.isAction(words_look, words_gauge))
+	else if (player_said_2(look, gauge))
 		_vm->_dialogs->show(35220);
-	else if (_action.isAction(words_look, words_vault)) {
+	else if (player_said_2(look, vault)) {
 		if (!local._vaultOpenFl)
 			_vm->_dialogs->show(35221);
-	} else if (_action.isAction(words_look, words_your_stuff))
+	} else if (player_said_2(look, your_stuff))
 		_vm->_dialogs->show(35222);
-	else if (_action.isAction(words_look, words_other_stuff))
+	else if (player_said_2(look, other_stuff))
 		_vm->_dialogs->show(35223);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(35224);
-	else if (_action.isAction(words_take, words_other_stuff))
+	else if (player_said_2(take, other_stuff))
 		_vm->_dialogs->show(35226);
-	else if (_action.isAction(words_look, words_desk))
+	else if (player_said_2(look, desk))
 		_vm->_dialogs->show(35229);
-	else if (_action.isAction(words_look, words_guard))
+	else if (player_said_2(look, guard))
 		_vm->_dialogs->show(35230);
-	else if (_action.isAction(words_look, words_doorway))
+	else if (player_said_2(look, doorway))
 		_vm->_dialogs->show(35231);
-	else if (_action.isAction(words_look, words_table))
+	else if (player_said_2(look, table))
 		_vm->_dialogs->show(35232);
-	else if (_action.isAction(words_look, words_projector))
+	else if (player_said_2(look, projector))
 		_vm->_dialogs->show(35233);
-	else if (_action.isAction(words_look, words_support))
+	else if (player_said_2(look, support))
 		_vm->_dialogs->show(35234);
-	else if (_action.isAction(words_look, words_security_monitor))
+	else if (player_said_2(look, security_monitor))
 		_vm->_dialogs->show(35235);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room353.cpp b/engines/mads/madsv2/nebular/rooms/room353.cpp
index 470f5b9204f..d16036bac16 100644
--- a/engines/mads/madsv2/nebular/rooms/room353.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room353.cpp
@@ -55,25 +55,25 @@ static void room_353_init() {
 static void room_353_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35315);
-	else if (_action.isAction(words_walk_through, words_doorway))
+	else if (player_said_2(walk_through, doorway))
 		_scene->_nextSceneId = 352;
-	else if (_action.isAction(words_walk_down, words_corridor_to_south))
+	else if (player_said_2(walk_down, corridor_to_south))
 		_scene->_nextSceneId = 354;
-	else if (_action.isAction(words_look, words_rock_chunk))
+	else if (player_said_2(look, rock_chunk))
 		_vm->_dialogs->show(35310);
-	else if (_action.isAction(words_look, words_pipes) || _action.isAction(words_look, words_pipe))
+	else if (player_said_2(look, pipes) || player_said_2(look, pipe))
 		_vm->_dialogs->show(35311);
-	else if (_action.isAction(words_look, words_broken_beam))
+	else if (player_said_2(look, broken_beam))
 		_vm->_dialogs->show(35312);
-	else if (_action.isAction(words_look, words_doorway))
+	else if (player_said_2(look, doorway))
 		_vm->_dialogs->show(35313);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(35314);
-	else if (_action.isAction(words_look, words_floor))
+	else if (player_said_2(look, floor))
 		_vm->_dialogs->show(35316);
-	else if (_action.isAction(words_look, words_ceiling))
+	else if (player_said_2(look, ceiling))
 		_vm->_dialogs->show(35317);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(35318);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room354.cpp b/engines/mads/madsv2/nebular/rooms/room354.cpp
index 401201ef3e8..1028746bf12 100644
--- a/engines/mads/madsv2/nebular/rooms/room354.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room354.cpp
@@ -56,41 +56,41 @@ static void room_354_init() {
 }
 
 static void room_354_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_south))
+	if (player_said_2(walk_down, corridor_to_south))
 		_game._player._walkOffScreenSceneId = 401;
 }
 
 static void room_354_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35414);
-	else if (_action.isAction(words_walk_down, words_corridor_to_north)) {
+	else if (player_said_2(walk_down, corridor_to_north)) {
 		_game._player.startWalking(Common::Point(208, 0), FACING_NORTHEAST);
 		_game._player._walkOffScreenSceneId = 353;
-	} else if (_action.isAction(words_walk_down, words_corridor_to_east))
+	} else if (player_said_2(walk_down, corridor_to_east))
 		_scene->_nextSceneId = 361;
-	else if (_action.isAction(words_walk_down, words_corridor_to_west))
+	else if (player_said_2(walk_down, corridor_to_west))
 		_scene->_nextSceneId = 316;
-	else if (_action.isAction(words_walk_down, words_corridor_to_south))
+	else if (player_said_2(walk_down, corridor_to_south))
 		_scene->_nextSceneId = 401;
-	else if (_action.isAction(words_look, words_controls))
+	else if (player_said_2(look, controls))
 		_vm->_dialogs->show(35410);
-	else if (_action.isAction(words_look, words_signal))
+	else if (player_said_2(look, signal))
 		_vm->_dialogs->show(35411);
-	else if (_action.isAction(words_look, words_catwalk))
+	else if (player_said_2(look, catwalk))
 		_vm->_dialogs->show(35412);
-	else if (_action.isAction(words_look, words_air_duct))
+	else if (player_said_2(look, air_duct))
 		_vm->_dialogs->show(35413);
-	else if (_action.isAction(words_look, words_corridor_to_north))
+	else if (player_said_2(look, corridor_to_north))
 		_vm->_dialogs->show(35415);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(35416);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(35417);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(35418);
-	else if (_action.isAction(words_look, words_debris))
+	else if (player_said_2(look, debris))
 		_vm->_dialogs->show(35419);
-	else if (_action.isAction(words_look, words_guard))
+	else if (player_said_2(look, guard))
 		_vm->_dialogs->show(35420);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room357.cpp b/engines/mads/madsv2/nebular/rooms/room357.cpp
index 4dc283d1e33..fb42ca239f1 100644
--- a/engines/mads/madsv2/nebular/rooms/room357.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room357.cpp
@@ -50,41 +50,41 @@ static void room_357_init() {
 }
 
 static void room_357_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 318;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 358;
 }
 
 static void room_357_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35715);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(35710);
-	else if (_action.isAction(words_climb_into, words_air_vent))
+	else if (player_said_2(climb_into, air_vent))
 		_vm->_dialogs->show(35711);
-	else if (_action.isAction(words_look, words_bed))
+	else if (player_said_2(look, bed))
 		_vm->_dialogs->show(35712);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(35713);
-	else if (_action.isAction(words_look, words_toilet))
+	else if (player_said_2(look, toilet))
 		_vm->_dialogs->show(35714);
-	else if (_action.isAction(words_look, words_cell_wall))
+	else if (player_said_2(look, cell_wall))
 		_vm->_dialogs->show(35716);
-	else if (_action.isAction(words_look, words_light))
+	else if (player_said_2(look, light))
 		_vm->_dialogs->show(35717);
-	else if (_action.isAction(words_look, words_rip_in_floor))
+	else if (player_said_2(look, rip_in_floor))
 		_vm->_dialogs->show(35718);
-	else if (_action.isAction(words_look, words_debris))
+	else if (player_said_2(look, debris))
 		_vm->_dialogs->show(35719);
-	else if (_action.isAction(words_take, words_debris))
+	else if (player_said_2(take, debris))
 		_vm->_dialogs->show(35720);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(35721);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(35722);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(35723);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room358.cpp b/engines/mads/madsv2/nebular/rooms/room358.cpp
index b985b6a952e..44d9610a803 100644
--- a/engines/mads/madsv2/nebular/rooms/room358.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room358.cpp
@@ -47,29 +47,29 @@ static void room_358_init() {
 }
 
 static void room_358_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 357;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 359;
 }
 
 static void room_358_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(35815);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(35810);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(35811);
-	else if (_action.isAction(words_look, words_bed))
+	else if (player_said_2(look, bed))
 		_vm->_dialogs->show(35812);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(35813);
-	else if (_action.isAction(words_look, words_toilet))
+	else if (player_said_2(look, toilet))
 		_vm->_dialogs->show(35814);
-	else if (_action.isAction(words_look, words_corridor) || _action.isAction(words_look, words_wall))
+	else if (player_said_2(look, corridor) || player_said_2(look, wall))
 		_vm->_dialogs->show(35816);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(35817);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room359.cpp b/engines/mads/madsv2/nebular/rooms/room359.cpp
index e2203e260fd..2eefc82c37d 100644
--- a/engines/mads/madsv2/nebular/rooms/room359.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room359.cpp
@@ -67,10 +67,10 @@ static void room_359_init() {
 }
 
 static void room_359_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 358;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 360;
 }
 
@@ -80,7 +80,7 @@ static void room_359_parser() {
 			_vm->_dialogs->show(35914);
 		else
 			_vm->_dialogs->show(35915);
-	} else if (_action.isAction(words_take, words_security_card)) {
+	} else if (player_said_2(take, security_card)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_SECURITY_CARD)) {
 			switch (_game._trigger) {
 			case 0:
@@ -124,43 +124,43 @@ static void room_359_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_look, words_bloody_cell_wall))
+	} else if (player_said_2(look, bloody_cell_wall))
 		_vm->_dialogs->show(35910);
-	else if (_action.isAction(words_look, words_bed))
+	else if (player_said_2(look, bed))
 		_vm->_dialogs->show(35911);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(35912);
-	else if (_action.isAction(words_look, words_toilet))
+	else if (player_said_2(look, toilet))
 		_vm->_dialogs->show(35913);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(35916);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(35917);
-	else if (_action.isAction(words_look, words_limb))
+	else if (player_said_2(look, limb))
 		_vm->_dialogs->show(35918);
-	else if (_action.isAction(words_take, words_limb))
+	else if (player_said_2(take, limb))
 		_vm->_dialogs->show(35919);
-	else if (_action.isAction(words_look, words_security_card) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, security_card) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(35921);
-	else if (_action.isAction(words_look, words_blood_stain)) {
+	else if (player_said_2(look, blood_stain)) {
 		if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 			_vm->_dialogs->show(35922);
 		else
 			_vm->_dialogs->show(35923);
-	} else if (_action.isAction(words_look, words_wall_board))
+	} else if (player_said_2(look, wall_board))
 		_vm->_dialogs->show(35924);
-	else if (_action.isAction(words_take, words_wall_board))
+	else if (player_said_2(take, wall_board))
 		_vm->_dialogs->show(35925);
-	else if (_action.isAction(words_look, words_rip_in_floor))
+	else if (player_said_2(look, rip_in_floor))
 		_vm->_dialogs->show(35926);
-	else if (_action.isAction(words_look, words_corridor))
+	else if (player_said_2(look, corridor))
 		_vm->_dialogs->show(35927);
-	else if (_action.isAction(words_look, words_floor)) {
+	else if (player_said_2(look, floor)) {
 		if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 			_vm->_dialogs->show(35928);
 		else
 			_vm->_dialogs->show(35929);
-	} else if (_action.isAction(words_open, words_air_vent) || _action.isAction(words_look, words_air_vent))
+	} else if (player_said_2(open, air_vent) || player_said_2(look, air_vent))
 		_vm->_dialogs->show(36016);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room360.cpp b/engines/mads/madsv2/nebular/rooms/room360.cpp
index d12e7473aaf..6e5c2f6c56c 100644
--- a/engines/mads/madsv2/nebular/rooms/room360.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room360.cpp
@@ -47,31 +47,31 @@ static void room_360_init() {
 }
 
 static void room_360_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 359;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 361;
 }
 
 static void room_360_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(36015);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(36010);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(36011);
-	else if (_action.isAction(words_look, words_bed))
+	else if (player_said_2(look, bed))
 		_vm->_dialogs->show(36012);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(36013);
-	else if (_action.isAction(words_look, words_toilet))
+	else if (player_said_2(look, toilet))
 		_vm->_dialogs->show(36014);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(36016);
-	else if (_action.isAction(words_look, words_corridor))
+	else if (player_said_2(look, corridor))
 		_vm->_dialogs->show(36017);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(36018);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room361.cpp b/engines/mads/madsv2/nebular/rooms/room361.cpp
index 8e34123acdb..1f774e0982c 100644
--- a/engines/mads/madsv2/nebular/rooms/room361.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room361.cpp
@@ -372,43 +372,43 @@ static void room_361_daemon() {
 }
 
 static void room_361_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 360;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 354;
 }
 
 static void room_361_parser() {
 	if (_action._lookFlag)
 		_vm->_dialogs->show(36119);
-	else if (_action.isAction(words_sit_at, words_desk)) {
+	else if (player_said_2(sit_at, desk)) {
 		_scene->_kernelMessages.reset();
 		_scene->_kernelMessages.addQuote(252, 0, 120);
-	} else if (_action.isAction(words_climb_into, words_air_vent)) {
+	} else if (player_said_2(climb_into, air_vent)) {
 		if (_globals[kSexOfRex] == REX_FEMALE)
 			handleRoxAction();
 		else
 			handleRexAction();
-	} else if (_action.isAction(words_look, words_desk))
+	} else if (player_said_2(look, desk))
 		_vm->_dialogs->show(36110);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(36111);
-	else if (_action.isAction(words_look, words_lighting_fixture) || _action.isAction(words_stare_at, words_lighting_fixture))
+	else if (player_said_2(look, lighting_fixture) || player_said_2(stare_at, lighting_fixture))
 		_vm->_dialogs->show(36112);
-	else if (_action.isAction(words_look, words_lights) || _action.isAction(words_stare_at, words_lights))
+	else if (player_said_2(look, lights) || player_said_2(stare_at, lights))
 		_vm->_dialogs->show(36113);
-	else if (_action.isAction(words_take, words_lights))
+	else if (player_said_2(take, lights))
 		_vm->_dialogs->show(36114);
-	else if (_action.isAction(words_look, words_light_bulb) || _action.isAction(words_stare_at, words_light_bulb))
+	else if (player_said_2(look, light_bulb) || player_said_2(stare_at, light_bulb))
 		_vm->_dialogs->show(36115);
-	else if (_action.isAction(words_take, words_light_bulb))
+	else if (player_said_2(take, light_bulb))
 		_vm->_dialogs->show(36116);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(36117);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(36118);
-	else if (_action.isAction(words_look, words_air_vent))
+	else if (player_said_2(look, air_vent))
 		_vm->_dialogs->show(36120);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room366.cpp b/engines/mads/madsv2/nebular/rooms/room366.cpp
index a116dde344d..94fc48412d6 100644
--- a/engines/mads/madsv2/nebular/rooms/room366.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room366.cpp
@@ -39,15 +39,15 @@ static void room_366_init() {
 }
 
 static void room_366_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 302;
-	else if (_action.isAction(words_open, words_grate)) {
+	else if (player_said_2(open, grate)) {
 		if (_game._visitedScenes.exists(316))
 			_vm->_dialogs->show(36612);
 		else
 			_vm->_dialogs->show(36613);
 		_scene->_nextSceneId = 316;
-	} else if (_action.isAction(words_look_through, words_grate)) {
+	} else if (player_said_2(look_through, grate)) {
 		if (_game._visitedScenes.exists(321))
 			_vm->_dialogs->show(36611);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room387.cpp b/engines/mads/madsv2/nebular/rooms/room387.cpp
index cb619a4f4ac..cfdbf9a761d 100644
--- a/engines/mads/madsv2/nebular/rooms/room387.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room387.cpp
@@ -40,11 +40,11 @@ static void room_387_init() {
 }
 
 static void room_387_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(words_look_through, words_grate))
+	else if (player_said_2(look_through, grate))
 		_vm->_dialogs->show(38710);
-	else if (_action.isAction(words_open, words_grate))
+	else if (player_said_2(open, grate))
 		_vm->_dialogs->show(38711);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room388.cpp b/engines/mads/madsv2/nebular/rooms/room388.cpp
index a377060198b..a2bcf66ad4a 100644
--- a/engines/mads/madsv2/nebular/rooms/room388.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room388.cpp
@@ -51,9 +51,9 @@ static void room_388_init() {
 }
 
 static void room_388_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(words_talkto, words_sauropod)) {
+	else if (player_said_2(talkto, sauropod)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -75,12 +75,12 @@ static void room_388_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look_through, words_grate)) {
+	} else if (player_said_2(look_through, grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(38811);
 		else
 			_vm->_dialogs->show(38810);
-	} else if (_action.isAction(words_open, words_grate))
+	} else if (player_said_2(open, grate))
 		_vm->_dialogs->show(38812);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room389.cpp b/engines/mads/madsv2/nebular/rooms/room389.cpp
index f2f0c5291b3..932842407c0 100644
--- a/engines/mads/madsv2/nebular/rooms/room389.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room389.cpp
@@ -74,9 +74,9 @@ static void room_389_daemon() {
 }
 
 static void room_389_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(words_talkto, words_monster)) {
+	else if (player_said_2(talkto, monster)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -94,7 +94,7 @@ static void room_389_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look_through, words_grate)) {
+	} else if (player_said_2(look_through, grate)) {
 		if (_globals[kAfterHavoc]) {
 			if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 				_vm->_dialogs->show(38911);
@@ -102,7 +102,7 @@ static void room_389_parser() {
 				_vm->_dialogs->show(38912);
 		} else
 			_vm->_dialogs->show(38910);
-	} else if (_action.isAction(words_open, words_grate)) {
+	} else if (player_said_2(open, grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(38914);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room390.cpp b/engines/mads/madsv2/nebular/rooms/room390.cpp
index 49ed8757209..45c211731f1 100644
--- a/engines/mads/madsv2/nebular/rooms/room390.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room390.cpp
@@ -40,11 +40,11 @@ static void room_390_init() {
 }
 
 static void room_390_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(words_look_through, words_grate))
+	else if (player_said_2(look_through, grate))
 		_vm->_dialogs->show(39010);
-	else if (_action.isAction(words_open, words_grate))
+	else if (player_said_2(open, grate))
 		_vm->_dialogs->show(39011);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room391.cpp b/engines/mads/madsv2/nebular/rooms/room391.cpp
index 43a51780272..622a29b4708 100644
--- a/engines/mads/madsv2/nebular/rooms/room391.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room391.cpp
@@ -39,9 +39,9 @@ static void room_391_init() {
 }
 
 static void room_391_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(words_open, words_grate)) {
+	else if (player_said_2(open, grate)) {
 		if (_globals[kKickedIn391Grate])
 			_vm->_dialogs->show(39113);
 		else {
@@ -53,7 +53,7 @@ static void room_391_parser() {
 			_scene->_nextSceneId = 361;
 		else
 			_scene->_nextSceneId = 311;
-	} else if (_action.isAction(words_look_through, words_grate)) {
+	} else if (player_said_2(look_through, grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(39111);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room399.cpp b/engines/mads/madsv2/nebular/rooms/room399.cpp
index e0629c1bf65..6995a8adac0 100644
--- a/engines/mads/madsv2/nebular/rooms/room399.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room399.cpp
@@ -39,9 +39,9 @@ static void room_399_init() {
 }
 
 static void room_399_parser() {
-	if (_action.isAction(words_return_to, words_air_shaft))
+	if (player_said_2(return_to, air_shaft))
 		_scene->_nextSceneId = 313;
-	else if (_action.isAction(words_look_through, words_grate)) {
+	else if (player_said_2(look_through, grate)) {
 		if (_globals[kAfterHavoc]) {
 			if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
 				_vm->_dialogs->show(38911);
@@ -49,7 +49,7 @@ static void room_399_parser() {
 				_vm->_dialogs->show(38912);
 		} else
 			_vm->_dialogs->show(38910);
-	} else if (_action.isAction(words_open, words_grate)) {
+	} else if (player_said_2(open, grate)) {
 		if (_globals[kAfterHavoc])
 			_vm->_dialogs->show(38914);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room401.cpp b/engines/mads/madsv2/nebular/rooms/room401.cpp
index e2405fa3737..f1a9a371118 100644
--- a/engines/mads/madsv2/nebular/rooms/room401.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room401.cpp
@@ -94,15 +94,15 @@ static void room_401_daemon() {
 }
 
 static void room_401_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_north)) {
+	if (player_said_2(walk_down, corridor_to_north)) {
 		_game._player.walk(Common::Point(149, 89), FACING_NORTH);
 		local._northFl = false;
 	}
 
-	if (_action.isAction(words_walk_down, words_corridor_to_south) && !local._northFl)
+	if (player_said_2(walk_down, corridor_to_south) && !local._northFl)
 		_game._player._walkOffScreenSceneId = 405;
 
-	if (_action.isAction(words_take))
+	if (player_said_1(take))
 		_game._player._needToWalk = false;
 
 	if (_game._player._needToWalk && local._northFl) {
@@ -143,23 +143,23 @@ static void room_401_parser() {
 		}
 	}
 
-	if (_action.isAction(words_walk_into, words_bar)) {
+	if (player_said_2(walk_into, bar)) {
 		if (!local._northFl)
 			_scene->_nextSceneId = 402;
-	} else if (_action.isAction(words_walk_down, words_corridor_to_north))
+	} else if (player_said_2(walk_down, corridor_to_north))
 		_scene->_nextSceneId = 354;
-	else if (_action.isAction(words_look, words_scanner)) {
+	else if (player_said_2(look, scanner)) {
 		if (_globals[kHasBeenScanned])
 			_vm->_dialogs->show(40111);
 		else
 			_vm->_dialogs->show(40110);
-	} else if (_action.isAction(words_look, words_bar))
+	} else if (player_said_2(look, bar))
 		_vm->_dialogs->show(40112);
-	else if (_action.isAction(words_look, words_sign))
+	else if (player_said_2(look, sign))
 		_vm->_dialogs->show(40113);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(40114);
-	else if (_action.isAction(words_look, words_corridor_to_north))
+	else if (player_said_2(look, corridor_to_north))
 		_vm->_dialogs->show(40115);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40116);
diff --git a/engines/mads/madsv2/nebular/rooms/room402.cpp b/engines/mads/madsv2/nebular/rooms/room402.cpp
index f81e6d9a36a..eb7c83a9dfd 100644
--- a/engines/mads/madsv2/nebular/rooms/room402.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room402.cpp
@@ -1804,29 +1804,29 @@ static void room_402_daemon() {
 }
 
 static void room_402_pre_parser() {
-	if (_action.isAction(words_sit_on, words_bar_stool) && (_game._player._prepareWalkPos.x != 248))
+	if (player_said_2(sit_on, bar_stool) && (_game._player._prepareWalkPos.x != 248))
 		_game._player.walk(Common::Point(232, 112), FACING_EAST);
 
-	if (_action.isAction(words_walkto, words_woman_on_balcony))
+	if (player_said_2(walkto, woman_on_balcony))
 		_game._player._needToWalk = _game._player._readyToWalk;
 
-	if (!local._roxOnStool && _action.isAction(words_take, words_credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
+	if (!local._roxOnStool && player_said_2(take, credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
 		_game._player.walk(Common::Point(246, 108), FACING_NORTH);
 
-	if (_action.isAction(words_take))
+	if (player_said_1(take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_take, words_credit_chip) && !local._roxOnStool)
+	if (player_said_2(take, credit_chip) && !local._roxOnStool)
 		_game._player._needToWalk = true;
 
 	if (local._roxOnStool) {
-		if (_action.isAction(words_look) || _action.isObject(words_bar_stool) || _action.isAction(words_talkto))
+		if (player_said_1(look) || player_said_1(bar_stool) || player_said_1(talkto))
 			_game._player._needToWalk = false;
 
-		if (_action.isAction(words_take, words_repair_list) || _action.isAction(words_take, words_credit_chip))
+		if (player_said_2(take, repair_list) || player_said_2(take, credit_chip))
 			_game._player._needToWalk = false;
 
-		if (_action.isAction(words_talkto, words_woman_in_chair) || _action.isAction(words_talkto, words_woman_in_alcove))
+		if (player_said_2(talkto, woman_in_chair) || player_said_2(talkto, woman_in_alcove))
 			_game._player._needToWalk = _game._player._readyToWalk;
 
 		if (_game._player._needToWalk) {
@@ -1838,22 +1838,22 @@ static void room_402_pre_parser() {
 		}
 	}
 
-	if (_action.isAction(words_take, words_repair_list) && !local._roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
+	if (player_said_2(take, repair_list) && !local._roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
 		_game._player.walk(Common::Point(191, 99), FACING_NORTHEAST);
 
-	if (_action.isAction(words_talkto, words_bartender) && !local._roxOnStool)
+	if (player_said_2(talkto, bartender) && !local._roxOnStool)
 		_game._player.walk(Common::Point(228, 83), FACING_SOUTH);
 
-	if (_action.isAction(words_talkto, words_repair_woman) && !local._roxOnStool)
+	if (player_said_2(talkto, repair_woman) && !local._roxOnStool)
 		_game._player.walk(Common::Point(208, 102), FACING_NORTHEAST);
 }
 
 static void room_402_parser() {
-	if (_action.isAction(words_take, words_repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && local._roxOnStool) {
+	if (player_said_2(take, repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && local._roxOnStool) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 77);
 		_game._player._needToWalk = false;
-	} else if (_action.isAction(words_take, words_repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !local._roxOnStool) {
+	} else if (player_said_2(take, repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !local._roxOnStool) {
 		if (_game._trigger == 0) {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
@@ -1875,11 +1875,11 @@ static void room_402_parser() {
 		_game._player._stepEnabled = true;
 	} else if (_game._screenObjects._inputMode == kInputConversation)
 		handleDialogs();
-	else if (_action.isAction(words_walk_into, words_corridor_to_south))
+	else if (player_said_2(walk_into, corridor_to_south))
 		_scene->_nextSceneId = 401;
-	else if (_action.isAction(words_walk_onto, words_dance_floor))
+	else if (player_said_2(walk_onto, dance_floor))
 		; // just... nothing
-	else if (_action.isAction(words_talkto, words_repair_woman)) {
+	else if (player_said_2(talkto, repair_woman)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -1959,26 +1959,26 @@ static void room_402_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_talkto, words_woman_in_chair) && !local._firstTalkToGirlInChair) {
+	} else if (player_said_2(talkto, woman_in_chair) && !local._firstTalkToGirlInChair) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1D7));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(150, 39);
 		_game._player._stepEnabled = false;
 		local._firstTalkToGirlInChair = true;
-	} else if (_action.isAction(words_talkto, words_woman_in_chair) && local._firstTalkToGirlInChair) {
+	} else if (player_said_2(talkto, woman_in_chair) && local._firstTalkToGirlInChair) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1DB));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(150, 42);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_talkto, words_woman_in_alcove) || _action.isAction(words_walkto, words_woman_in_alcove)) {
+	} else if (player_said_2(talkto, woman_in_alcove) || player_said_2(walkto, woman_in_alcove)) {
 		_scene->_kernelMessages.add(Common::Point(102, 48), 0xFBFA, 0, 0, 120, _game.getQuote(0x1DE));
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(120, 44);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_sit_on, words_bar_stool) && (_game._player._targetPos.x == 248)) {
+	} else if (player_said_2(sit_on, bar_stool) && (_game._player._targetPos.x == 248)) {
 		_scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 120, _game.getQuote(0x20D));
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x20E));
-	} else if (_action.isAction(words_sit_on, words_bar_stool) && !local._roxOnStool && (_game._player._targetPos.x != 248)) {
+	} else if (player_said_2(sit_on, bar_stool) && !local._roxOnStool && (_game._player._targetPos.x != 248)) {
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
@@ -1986,11 +1986,11 @@ static void room_402_parser() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_take, words_credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && local._roxOnStool) {
+	} else if (player_said_2(take, credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && local._roxOnStool) {
 		local._roxMode = 20;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addTimer(1, 92);
-	} else if (_action.isAction(words_take, words_credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !local._roxOnStool) {
+	} else if (player_said_2(take, credit_chip) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !local._roxOnStool) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -2001,7 +2001,7 @@ static void room_402_parser() {
 		_scene->_sequences.setScale(_globals._sequenceIndexes[22], 88);
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[22], SEQUENCE_TRIGGER_EXPIRE, 0, 104);
-	} else if (_action.isAction(words_talkto, words_bartender)) {
+	} else if (player_said_2(talkto, bartender)) {
 		switch (_game._trigger) {
 		case 0:
 		{
@@ -2113,66 +2113,66 @@ static void room_402_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_dance_floor))
+	} else if (player_said_2(look, dance_floor))
 		_vm->_dialogs->show(40210);
-	else if (_action.isAction(words_look, words_teleporter)) {
+	else if (player_said_2(look, teleporter)) {
 		if (_globals[kSomeoneHasExploded])
 			_vm->_dialogs->show(40212);
 		else
 			_vm->_dialogs->show(40211);
-	} else if (_action.isAction(words_look, words_bar))
+	} else if (player_said_2(look, bar))
 		_vm->_dialogs->show(40213);
-	else if (_action.isAction(words_look, words_bartender))
+	else if (player_said_2(look, bartender))
 		_vm->_dialogs->show(40214);
-	else if (_action.isAction(words_look, words_woman_in_alcove))
+	else if (player_said_2(look, woman_in_alcove))
 		_vm->_dialogs->show(40215);
-	else if (_action.isAction(words_look, words_woman_on_balcony))
+	else if (player_said_2(look, woman_on_balcony))
 		_vm->_dialogs->show(40216);
-	else if (_action.isAction(words_look, words_woman_in_chair))
+	else if (player_said_2(look, woman_in_chair))
 		_vm->_dialogs->show(40217);
-	else if (_action.isAction(words_look, words_repair_woman))
+	else if (player_said_2(look, repair_woman))
 		_vm->_dialogs->show(40218);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(40219);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40220);
-	else if (_action.isAction(words_look, words_women))
+	else if (player_said_2(look, women))
 		_vm->_dialogs->show(40221);
-	else if (_action.isAction(words_push, words_repair_woman) || _action.isAction(words_pull, words_repair_woman))
+	else if (player_said_2(push, repair_woman) || player_said_2(pull, repair_woman))
 		_vm->_dialogs->show(40222);
-	else if (_action.isAction(words_talkto, words_women))
+	else if (player_said_2(talkto, women))
 		_vm->_dialogs->show(40223);
-	else if (_action.isAction(words_talkto, words_woman_on_balcony))
+	else if (player_said_2(talkto, woman_on_balcony))
 		_vm->_dialogs->show(40224);
-	else if (_action.isAction(words_look, words_railing))
+	else if (player_said_2(look, railing))
 		_vm->_dialogs->show(40225);
-	else if (_action.isAction(words_look, words_table))
+	else if (player_said_2(look, table))
 		_vm->_dialogs->show(40226);
-	else if (_action.isAction(words_take, words_table))
+	else if (player_said_2(take, table))
 		_vm->_dialogs->show(40227);
-	else if (_action.isAction(words_look, words_sign))
+	else if (player_said_2(look, sign))
 		_vm->_dialogs->show(40228);
-	else if (_action.isAction(words_take, words_sign))
+	else if (player_said_2(take, sign))
 		_vm->_dialogs->show(40229);
-	else if (_action.isAction(words_look, words_bar_stool))
+	else if (player_said_2(look, bar_stool))
 		_vm->_dialogs->show(40230);
-	else if (_action.isAction(words_take, words_bar_stool))
+	else if (player_said_2(take, bar_stool))
 		_vm->_dialogs->show(40231);
-	else if (_action.isAction(words_look, words_cactus))
+	else if (player_said_2(look, cactus))
 		_vm->_dialogs->show(40232);
-	else if (_action.isAction(words_take, words_cactus))
+	else if (player_said_2(take, cactus))
 		_vm->_dialogs->show(40233);
-	else if (_action.isAction(words_look, words_disco_ball))
+	else if (player_said_2(look, disco_ball))
 		_vm->_dialogs->show(40234);
-	else if (_action.isAction(words_look, words_upper_dance_floor))
+	else if (player_said_2(look, upper_dance_floor))
 		_vm->_dialogs->show(40235);
-	else if (_action.isAction(words_look, words_tree))
+	else if (player_said_2(look, tree))
 		_vm->_dialogs->show(40236);
-	else if (_action.isAction(words_look, words_plant))
+	else if (player_said_2(look, plant))
 		_vm->_dialogs->show(40237);
-	else if (_action.isAction(words_take, words_plant))
+	else if (player_said_2(take, plant))
 		_vm->_dialogs->show(40238);
-	else if (_action.isAction(words_look, words_repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST))
+	else if (player_said_2(look, repair_list) && _game._objects.isInRoom(OBJ_REPAIR_LIST))
 		_vm->_dialogs->show(40239);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room405.cpp b/engines/mads/madsv2/nebular/rooms/room405.cpp
index 63736e51bad..934907071fe 100644
--- a/engines/mads/madsv2/nebular/rooms/room405.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room405.cpp
@@ -109,27 +109,27 @@ static void room_405_daemon() {
 }
 
 static void room_405_pre_parser() {
-	if (_action.isAction(words_take))
+	if (player_said_1(take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 401;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 406;
 
-	if (_action.isAction(words_close, words_wide_door) && _globals[kArmoryDoorOpen])
+	if (player_said_2(close, wide_door) && _globals[kArmoryDoorOpen])
 		_game._player.walk(Common::Point(212, 113), FACING_NORTH);
 }
 
 static void room_405_parser() {
-	if (_action.isAction(words_walk_through, words_door))
+	if (player_said_2(walk_through, door))
 		_scene->_nextSceneId = 413;
-	else if (_action.isAction(words_walk_through, words_wide_door) && _globals[kArmoryDoorOpen])
+	else if (player_said_2(walk_through, wide_door) && _globals[kArmoryDoorOpen])
 		_scene->_nextSceneId = 408;
-	else if (_action.isAction(words_walk_through, words_wide_door) && !_globals[kArmoryDoorOpen])
+	else if (player_said_2(walk_through, wide_door) && !_globals[kArmoryDoorOpen])
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
-	else if (_action.isAction(words_put, words_security_card, words_card_slot) && !_globals[kArmoryDoorOpen]) {
+	else if (player_said_3(put, security_card, card_slot) && !_globals[kArmoryDoorOpen]) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -139,7 +139,7 @@ static void room_405_parser() {
 		Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], msgPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
-	} else if ((_action.isAction(words_put, words_security_card, words_card_slot) || _action.isAction(words_close, words_wide_door)) && _globals[kArmoryDoorOpen]) {
+	} else if ((player_said_3(put, security_card, card_slot) || player_said_2(close, wide_door)) && _globals[kArmoryDoorOpen]) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -148,7 +148,7 @@ static void room_405_parser() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
-	} else if (_action.isAction(words_put, words_card_slot)) {
+	} else if (player_said_2(put, card_slot)) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -157,36 +157,36 @@ static void room_405_parser() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
-	} else if (_action.isAction(words_look, words_cannon_balls))
+	} else if (player_said_2(look, cannon_balls))
 		_vm->_dialogs->show(40510);
-	else if (_action.isAction(words_take, words_cannon_balls))
+	else if (player_said_2(take, cannon_balls))
 		_vm->_dialogs->show(40511);
-	else if (_action.isAction(words_look, words_water_fountain))
+	else if (player_said_2(look, water_fountain))
 		_vm->_dialogs->show(40512);
-	else if (_action.isAction(words_look, words_backboard) || _action.isAction(words_look, words_hoop))
+	else if (player_said_2(look, backboard) || player_said_2(look, hoop))
 		_vm->_dialogs->show(40513);
-	else if (_action.isAction(words_look, words_light))
+	else if (player_said_2(look, light))
 		_vm->_dialogs->show(40514);
-	else if (_action.isAction(words_look, words_card_slot))
+	else if (player_said_2(look, card_slot))
 		_vm->_dialogs->show(40515);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(40516);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(40517);
-	else if (_action.isAction(words_look, words_monitor))
+	else if (player_said_2(look, monitor))
 		_vm->_dialogs->show(40518);
-	else if (_action.isAction(words_look, words_corridor) || _action._lookFlag)
+	else if (player_said_2(look, corridor) || _action._lookFlag)
 		_vm->_dialogs->show(40519);
-	else if (_action.isAction(words_look, words_wide_door)) {
+	else if (player_said_2(look, wide_door)) {
 		if (_globals[kArmoryDoorOpen])
 			_vm->_dialogs->show(40521);
 		else
 			_vm->_dialogs->show(40520);
-	} else if (_action.isAction(words_look, words_door))
+	} else if (player_said_2(look, door))
 		_vm->_dialogs->show(40522);
-	else if (_action.isAction(words_look, words_coach_lamp))
+	else if (player_said_2(look, coach_lamp))
 		_vm->_dialogs->show(40523);
-	else if (_action.isAction(words_look, words_support))
+	else if (player_said_2(look, support))
 		_vm->_dialogs->show(40524);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room406.cpp b/engines/mads/madsv2/nebular/rooms/room406.cpp
index 53338da1c5b..1c27d6eb1b7 100644
--- a/engines/mads/madsv2/nebular/rooms/room406.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room406.cpp
@@ -136,36 +136,36 @@ static void room_406_daemon() {
 }
 
 static void room_406_pre_parser() {
-	if (_action.isAction(words_walk_down, words_corridor_to_west))
+	if (player_said_2(walk_down, corridor_to_west))
 		_game._player._walkOffScreenSceneId = 405;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_east))
+	if (player_said_2(walk_down, corridor_to_east))
 		_game._player._walkOffScreenSceneId = 407;
 
-	if (_action.isAction(words_take))
+	if (player_said_1(take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_look, words_sign) || _action.isAction(words_look, words_trash))
+	if (player_said_2(look, sign) || player_said_2(look, trash))
 		_game._player._needToWalk = true;
 }
 
 static void room_406_parser() {
-	if (_action.isAction(words_walk_through, words_door) && (_game._player._targetPos.x > 100)) {
+	if (player_said_2(walk_through, door) && (_game._player._targetPos.x > 100)) {
 		_game._player._stepEnabled = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 3, 1, 0, 0);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
 		_vm->_sound->command(19);
-	} else if (_action.isAction(words_walk_through, words_door) && _globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100))
+	} else if (player_said_2(walk_through, door) && _globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100))
 		_scene->_nextSceneId = 410;
-	else if (_action.isAction(words_walk_through, words_door) && !_globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100)) {
+	else if (player_said_2(walk_through, door) && !_globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
 		if (!local._hitStorageDoor) {
 			_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 			_scene->_sequences.addTimer(80, 100);
 		}
-	} else if (_action.isAction(words_put, words_security_card, words_card_slot) && !_globals[kStorageDoorOpen]) {
+	} else if (player_said_3(put, security_card, card_slot) && !_globals[kStorageDoorOpen]) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -175,7 +175,7 @@ static void room_406_parser() {
 		Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], msgPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
-	} else if (_action.isAction(words_put, words_security_card, words_card_slot) && _globals[kStorageDoorOpen]) {
+	} else if (player_said_3(put, security_card, card_slot) && _globals[kStorageDoorOpen]) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -185,7 +185,7 @@ static void room_406_parser() {
 		Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], msgPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
-	} else if (_action.isAction(words_put, words_card_slot)) {
+	} else if (player_said_2(put, card_slot)) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -194,42 +194,42 @@ static void room_406_parser() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[2], _game._player._playerPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
-	} else if (_action.isAction(words_look, words_trash))
+	} else if (player_said_2(look, trash))
 		_vm->_dialogs->show(40610);
-	else if (_action.isAction(words_take, words_trash))
+	else if (player_said_2(take, trash))
 		_vm->_dialogs->show(40611);
-	else if (_action.isAction(words_look, words_card_slot))
+	else if (player_said_2(look, card_slot))
 		_vm->_dialogs->show(40612);
-	else if (_action.isAction(words_look, words_fire_extinguisher))
+	else if (player_said_2(look, fire_extinguisher))
 		_vm->_dialogs->show(40614);
-	else if (_action.isAction(words_take, words_fire_extinguisher))
+	else if (player_said_2(take, fire_extinguisher))
 		_vm->_dialogs->show(40615);
-	else if (_action.isAction(words_look, words_corridor_to_east))
+	else if (player_said_2(look, corridor_to_east))
 		_vm->_dialogs->show(40616);
-	else if (_action.isAction(words_look, words_corridor_to_west))
+	else if (player_said_2(look, corridor_to_west))
 		_vm->_dialogs->show(40617);
-	else if (_action.isAction(words_look, words_corridor) || _action._lookFlag)
+	else if (player_said_2(look, corridor) || _action._lookFlag)
 		_vm->_dialogs->show(40618);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(40619);
-	else if (_action.isAction(words_look, words_door)) {
+	else if (player_said_2(look, door)) {
 		if (_globals[kStorageDoorOpen])
 			_vm->_dialogs->show(40621);
 		else
 			_vm->_dialogs->show(40620);
-	} else if (_action.isAction(words_look, words_monitor))
+	} else if (player_said_2(look, monitor))
 		_vm->_dialogs->show(40623);
-	else if (_action.isAction(words_look, words_signpost))
+	else if (player_said_2(look, signpost))
 		_vm->_dialogs->show(40624);
-	else if (_action.isAction(words_take, words_signpost))
+	else if (player_said_2(take, signpost))
 		_vm->_dialogs->show(40625);
-	else if (_action.isAction(words_look, words_boulder))
+	else if (player_said_2(look, boulder))
 		_vm->_dialogs->show(40626);
-	else if (_action.isAction(words_take, words_boulder))
+	else if (player_said_2(take, boulder))
 		_vm->_dialogs->show(40627);
-	else if (_action.isAction(words_look, words_sign))
+	else if (player_said_2(look, sign))
 		_vm->_dialogs->show(40628);
-	else if (_action.isAction(words_take, words_sign))
+	else if (player_said_2(take, sign))
 		_vm->_dialogs->show(40629);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room407.cpp b/engines/mads/madsv2/nebular/rooms/room407.cpp
index f8911fc7900..c973e8e7d53 100644
--- a/engines/mads/madsv2/nebular/rooms/room407.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room407.cpp
@@ -74,13 +74,13 @@ static void room_407_daemon() {
 }
 
 static void room_407_pre_parser() {
-	if (_action.isAction(words_take))
+	if (player_said_1(take))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_look, words_door))
+	if (player_said_2(look, door))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(words_walk_down, words_corridor_to_north)) {
+	if (player_said_2(walk_down, corridor_to_north)) {
 		_game._player.walk(Common::Point(172, 91), FACING_NORTH);
 		local._fromNorth = false;
 	}
@@ -121,20 +121,20 @@ static void room_407_parser() {
 		}
 	}
 
-	if (_action.isAction(words_walk_down, words_corridor_to_south) && !local._fromNorth)
+	if (player_said_2(walk_down, corridor_to_south) && !local._fromNorth)
 		_scene->_nextSceneId = 406;
-	else if (_action.isAction(words_walk_down, words_corridor_to_north))
+	else if (player_said_2(walk_down, corridor_to_north))
 		_scene->_nextSceneId = 318;
-	else if (_action.isAction(words_look, words_scanner)) {
+	else if (player_said_2(look, scanner)) {
 		if (_globals[kHasBeenScanned])
 			_vm->_dialogs->show(40711);
 		else
 			_vm->_dialogs->show(40710);
-	} else if (_action.isAction(words_look, words_door))
+	} else if (player_said_2(look, door))
 		_vm->_dialogs->show(40712);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(40713);
-	else if (_action.isAction(words_look, words_corridor_to_north))
+	else if (player_said_2(look, corridor_to_north))
 		_vm->_dialogs->show(40714);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40715);
diff --git a/engines/mads/madsv2/nebular/rooms/room408.cpp b/engines/mads/madsv2/nebular/rooms/room408.cpp
index 949e3421475..ad07d76b208 100644
--- a/engines/mads/madsv2/nebular/rooms/room408.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room408.cpp
@@ -49,18 +49,18 @@ static void room_408_init() {
 }
 
 static void room_408_pre_parser() {
-	if ((_action.isAction(words_take) && !_action.isObject(words_target_module)) || _action.isAction(words_pull, words_pin) || _action.isAction(words_open, words_carton))
+	if ((player_said_1(take) && !player_said_1(target_module)) || player_said_2(pull, pin) || player_said_2(open, carton))
 		_game._player._needToWalk = false;
 
-	if ((_action.isAction(words_look, words_target_module) && _game._objects.isInRoom(OBJ_TARGET_MODULE)) || _action.isAction(words_look, words_chest))
+	if ((player_said_2(look, target_module) && _game._objects.isInRoom(OBJ_TARGET_MODULE)) || player_said_2(look, chest))
 		_game._player._needToWalk = true;
 }
 
 static void room_408_parser() {
-	if (_action.isAction(words_walk_into, words_corridor_to_south)) {
+	if (player_said_2(walk_into, corridor_to_south)) {
 		_scene->_nextSceneId = 405;
 		_vm->_sound->command(58);
-	} else if (_action.isAction(words_take, words_target_module) && (_game._objects.isInRoom(OBJ_TARGET_MODULE) || _game._trigger)) {
+	} else if (player_said_2(take, target_module) && (_game._objects.isInRoom(OBJ_TARGET_MODULE) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -92,84 +92,84 @@ static void room_408_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_armored_vehicle))
+	} else if (player_said_2(look, armored_vehicle))
 		_vm->_dialogs->show(40810);
-	else if (_action.isAction(words_take, words_armored_vehicle) || _action.isAction(words_take, words_anvil) || _action.isAction(words_take, words_two_ton_weight))
+	else if (player_said_2(take, armored_vehicle) || player_said_2(take, anvil) || player_said_2(take, two_ton_weight))
 		_vm->_dialogs->show(40811);
-	else if (_action.isAction(words_look, words_missile))
+	else if (player_said_2(look, missile))
 		_vm->_dialogs->show(40812);
-	else if (_action.isAction(words_take, words_missile))
+	else if (player_said_2(take, missile))
 		_vm->_dialogs->show(40813);
-	else if (_action.isAction(words_look, words_grenade))
+	else if (player_said_2(look, grenade))
 		_vm->_dialogs->show(40814);
-	else if (_action.isAction(words_take, words_grenade))
+	else if (player_said_2(take, grenade))
 		_vm->_dialogs->show(40815);
-	else if (_action.isAction(words_take, words_pin) || _action.isAction(words_pull, words_pin))
+	else if (player_said_2(take, pin) || player_said_2(pull, pin))
 		_vm->_dialogs->show(40816);
-	else if (_action.isAction(words_look, words_blimp))
+	else if (player_said_2(look, blimp))
 		_vm->_dialogs->show(40817);
-	else if (_action.isAction(words_take, words_blimp))
+	else if (player_said_2(take, blimp))
 		_vm->_dialogs->show(40818);
-	else if (_action.isAction(words_look, words_ammunition))
+	else if (player_said_2(look, ammunition))
 		_vm->_dialogs->show(40819);
-	else if (_action.isAction(words_take, words_ammunition))
+	else if (player_said_2(take, ammunition))
 		_vm->_dialogs->show(40820);
-	else if (_action.isAction(words_look, words_catapult))
+	else if (player_said_2(look, catapult))
 		_vm->_dialogs->show(40821);
-	else if (_action.isAction(words_take, words_catapult))
+	else if (player_said_2(take, catapult))
 		_vm->_dialogs->show(40822);
-	else if (_action.isAction(words_look, words_chest)) {
+	else if (player_said_2(look, chest)) {
 		if (_game._objects.isInRoom(OBJ_TARGET_MODULE))
 			_vm->_dialogs->show(40823);
 		else
 			_vm->_dialogs->show(40824);
-	} else if (_action.isAction(words_take, words_chest))
+	} else if (player_said_2(take, chest))
 		_vm->_dialogs->show(40825);
-	else if (_action.isAction(words_look, words_suit_of_armor))
+	else if (player_said_2(look, suit_of_armor))
 		_vm->_dialogs->show(40826);
-	else if (_action.isAction(words_take, words_suit_of_armor))
+	else if (player_said_2(take, suit_of_armor))
 		_vm->_dialogs->show(40827);
-	else if (_action.isAction(words_look, words_escape_hatch))
+	else if (player_said_2(look, escape_hatch))
 		_vm->_dialogs->show(40828);
-	else if (_action.isAction(words_open, words_escape_hatch) || _action.isAction(words_pull, words_escape_hatch))
+	else if (player_said_2(open, escape_hatch) || player_said_2(pull, escape_hatch))
 		_vm->_dialogs->show(40829);
-	else if (_action.isAction(words_look, words_barrels))
+	else if (player_said_2(look, barrels))
 		_vm->_dialogs->show(40830);
-	else if (_action.isAction(words_take, words_barrels))
+	else if (player_said_2(take, barrels))
 		_vm->_dialogs->show(40831);
-	else if (_action.isAction(words_look, words_inflatable_raft))
+	else if (player_said_2(look, inflatable_raft))
 		_vm->_dialogs->show(40832);
-	else if (_action.isAction(words_take, words_inflatable_raft))
+	else if (player_said_2(take, inflatable_raft))
 		_vm->_dialogs->show(40833);
-	else if (_action.isAction(words_look, words_tomato))
+	else if (player_said_2(look, tomato))
 		_vm->_dialogs->show(40834);
-	else if (_action.isAction(words_take, words_tomato))
+	else if (player_said_2(take, tomato))
 		_vm->_dialogs->show(40835);
-	else if (_action.isAction(words_look, words_anvil))
+	else if (player_said_2(look, anvil))
 		_vm->_dialogs->show(40836);
-	else if (_action.isAction(words_look, words_two_ton_weight))
+	else if (player_said_2(look, two_ton_weight))
 		_vm->_dialogs->show(40837);
-	else if (_action.isAction(words_look, words_powder_container))
+	else if (player_said_2(look, powder_container))
 		_vm->_dialogs->show(40838);
-	else if (_action.isAction(words_look, words_powder_puff))
+	else if (player_said_2(look, powder_puff))
 		_vm->_dialogs->show(40839);
-	else if (_action.isAction(words_take, words_powder_puff))
+	else if (player_said_2(take, powder_puff))
 		_vm->_dialogs->show(40840);
-	else if (_action.isAction(words_look, words_carton))
+	else if (player_said_2(look, carton))
 		_vm->_dialogs->show(40841);
-	else if (_action.isAction(words_take, words_carton))
+	else if (player_said_2(take, carton))
 		_vm->_dialogs->show(40842);
-	else if (_action.isAction(words_open, words_carton))
+	else if (player_said_2(open, carton))
 		_vm->_dialogs->show(40843);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(40844);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40845);
-	else if (_action.isAction(words_look, words_target_module) && _game._objects.isInRoom(OBJ_TARGET_MODULE))
+	else if (player_said_2(look, target_module) && _game._objects.isInRoom(OBJ_TARGET_MODULE))
 		_vm->_dialogs->show(40846);
-	else if (_action.isAction(words_look, words_loading_ramp))
+	else if (player_said_2(look, loading_ramp))
 		_vm->_dialogs->show(40848);
-	else if (_action.isAction(words_open, words_chest))
+	else if (player_said_2(open, chest))
 		_vm->_dialogs->show(40849);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room409.cpp b/engines/mads/madsv2/nebular/rooms/room409.cpp
index afaf444d51f..40d5217c91c 100644
--- a/engines/mads/madsv2/nebular/rooms/room409.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room409.cpp
@@ -54,24 +54,24 @@ static void room_409_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_viewport))
+	if (player_said_2(look, viewport))
 		_vm->_dialogs->show(40910);
-	else if (_action.isAction(words_peer_through, words_viewport))
+	else if (player_said_2(peer_through, viewport))
 		_vm->_dialogs->show(40910);
-	else if (_action.isAction(words_look, words_keypad))
+	else if (player_said_2(look, keypad))
 		_vm->_dialogs->show(40911);
-	else if (_action.isAction(words_inspect, words_keypad))
+	else if (player_said_2(inspect, keypad))
 		_vm->_dialogs->show(40911);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(40912);
-	else if (_action.isAction(words_look, words_1_key) || _action.isAction(words_look, words_2_key)
-		|| _action.isAction(words_look, words_3_key) || _action.isAction(words_look, words_4_key)
-		|| _action.isAction(words_look, words_5_key) || _action.isAction(words_look, words_6_key)
-		|| _action.isAction(words_look, words_7_key) || _action.isAction(words_look, words_8_key)
-		|| _action.isAction(words_look, words_9_key) || _action.isAction(words_look, words_0_key)
-		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_frown_key))
+	else if (player_said_2(look, 1_key) || player_said_2(look, 2_key)
+		|| player_said_2(look, 3_key) || player_said_2(look, 4_key)
+		|| player_said_2(look, 5_key) || player_said_2(look, 6_key)
+		|| player_said_2(look, 7_key) || player_said_2(look, 8_key)
+		|| player_said_2(look, 9_key) || player_said_2(look, 0_key)
+		|| player_said_2(look, smile_key) || player_said_2(look, frown_key))
 		_vm->_dialogs->show(40913);
-	else if (_action.isAction(words_look, words_device))
+	else if (player_said_2(look, device))
 		_vm->_dialogs->show(40914);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(40914);
diff --git a/engines/mads/madsv2/nebular/rooms/room410.cpp b/engines/mads/madsv2/nebular/rooms/room410.cpp
index cdbd5d5bcbf..430052ef9b3 100644
--- a/engines/mads/madsv2/nebular/rooms/room410.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room410.cpp
@@ -83,23 +83,23 @@ static void room_410_daemon() {
 }
 
 static void room_410_pre_parser() {
-	if (_action.isAction(words_take) && !_action.isObject(words_charge_cases))
+	if (player_said_1(take) && !player_said_1(charge_cases))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_look, words_charge_cases) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
+	if (player_said_2(look, charge_cases) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(words_open, words_sacks) || _action.isAction(words_open, words_sack))
+	if (player_said_2(open, sacks) || player_said_2(open, sack))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_look, words_can))
+	if (player_said_2(look, can))
 		_game._player._needToWalk = true;
 }
 
 static void room_410_parser() {
-	if (_action.isAction(words_walk_into, words_corridor_to_south))
+	if (player_said_2(walk_into, corridor_to_south))
 		_scene->_nextSceneId = 406;
-	else if (_action.isAction(words_take, words_charge_cases) && (_game._objects.isInRoom(OBJ_CHARGE_CASES) || _game._trigger)) {
+	else if (player_said_2(take, charge_cases) && (_game._objects.isInRoom(OBJ_CHARGE_CASES) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -132,52 +132,52 @@ static void room_410_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_barrel))
+	} else if (player_said_2(look, barrel))
 		_vm->_dialogs->show(41010);
-	else if (_action.isAction(words_take, words_barrel))
+	else if (player_said_2(take, barrel))
 		_vm->_dialogs->show(41011);
-	else if (_action.isAction(words_open, words_barrel))
+	else if (player_said_2(open, barrel))
 		_vm->_dialogs->show(41012);
-	else if (_action.isAction(words_look, words_rug))
+	else if (player_said_2(look, rug))
 		_vm->_dialogs->show(41013);
-	else if (_action.isAction(words_take, words_rug))
+	else if (player_said_2(take, rug))
 		_vm->_dialogs->show(41014);
-	else if (_action.isAction(words_look, words_carton) || _action.isAction(words_open, words_carton)) {
+	else if (player_said_2(look, carton) || player_said_2(open, carton)) {
 		if (_game._objects.isInRoom(OBJ_CHARGE_CASES))
 			_vm->_dialogs->show(41015);
 		else
 			_vm->_dialogs->show(41016);
-	} else if (_action.isAction(words_look, words_flour))
+	} else if (player_said_2(look, flour))
 		_vm->_dialogs->show(41017);
-	else if (_action.isAction(words_take, words_flour))
+	else if (player_said_2(take, flour))
 		_vm->_dialogs->show(41018);
-	else if (_action.isAction(words_look, words_sacks))
+	else if (player_said_2(look, sacks))
 		_vm->_dialogs->show(41019);
-	else if (_action.isAction(words_look, words_sack))
+	else if (player_said_2(look, sack))
 		_vm->_dialogs->show(41019);
-	else if (_action.isAction(words_open, words_sacks))
+	else if (player_said_2(open, sacks))
 		_vm->_dialogs->show(41020);
-	else if (_action.isAction(words_open, words_sack))
+	else if (player_said_2(open, sack))
 		_vm->_dialogs->show(41020);
-	else if (_action.isAction(words_look, words_bucket_of_tar))
+	else if (player_said_2(look, bucket_of_tar))
 		_vm->_dialogs->show(41021);
-	else if (_action.isAction(words_take, words_bucket_of_tar))
+	else if (player_said_2(take, bucket_of_tar))
 		_vm->_dialogs->show(41022);
-	else if (_action.isAction(words_look, words_can))
+	else if (player_said_2(look, can))
 		_vm->_dialogs->show(41023);
-	else if (_action.isAction(words_take, words_can))
+	else if (player_said_2(take, can))
 		_vm->_dialogs->show(41024);
-	else if (_action.isAction(words_look, words_charge_cases) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
+	else if (player_said_2(look, charge_cases) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
 		_vm->_dialogs->show(41025);
-	else if (_action.isAction(words_look, words_fence))
+	else if (player_said_2(look, fence))
 		_vm->_dialogs->show(41027);
-	else if (_action.isAction(words_look, words_shelves))
+	else if (player_said_2(look, shelves))
 		_vm->_dialogs->show(41028);
-	else if (_action.isAction(words_look, words_rat))
+	else if (player_said_2(look, rat))
 		_vm->_dialogs->show(41029);
-	else if (_action.isAction(words_take, words_rat))
+	else if (player_said_2(take, rat))
 		_vm->_dialogs->show(41030);
-	else if (_action.isAction(words_throw, words_rat))
+	else if (player_said_2(throw, rat))
 		_vm->_dialogs->show(41031);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(41033);
diff --git a/engines/mads/madsv2/nebular/rooms/room411.cpp b/engines/mads/madsv2/nebular/rooms/room411.cpp
index 15d672adaa6..ab19fe109a4 100644
--- a/engines/mads/madsv2/nebular/rooms/room411.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room411.cpp
@@ -502,21 +502,21 @@ static void room_411_daemon() {
 }
 
 static void room_411_pre_parser() {
-	if (_action.isAction(words_look, words_petrox) && (_game._objects.isInRoom(OBJ_PETROX)))
+	if (player_said_2(look, petrox) && (_game._objects.isInRoom(OBJ_PETROX)))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(words_look, words_lecithin) && (_game._objects.isInRoom(OBJ_LECITHIN)))
+	if (player_said_2(look, lecithin) && (_game._objects.isInRoom(OBJ_LECITHIN)))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(words_look, words_formaldehyde) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
+	if (player_said_2(look, formaldehyde) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(words_look, words_explosives) || _action.isAction(words_look, words_kettle) || _action.isAction(words_look, words_mishap) ||
-		_action.isAction(words_look, words_alcove) || _action.isAction(words_look, words_sink) || _action.isAction(words_put, words_sink) ||
-		_action.isAction(words_look, words_experiment) || _action.isAction(words_look, words_drawing_board))
+	if (player_said_2(look, explosives) || player_said_2(look, kettle) || player_said_2(look, mishap) ||
+		player_said_2(look, alcove) || player_said_2(look, sink) || player_said_2(put, sink) ||
+		player_said_2(look, experiment) || player_said_2(look, drawing_board))
 		_game._player._needToWalk = true;
 
-	if (_action.isAction(words_pull, words_knife_switch) || _action.isAction(words_push, words_knife_switch))
+	if (player_said_2(pull, knife_switch) || player_said_2(push, knife_switch))
 		_game._player._needToWalk = false;
 }
 
@@ -527,14 +527,14 @@ static void room_411_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_walk_into, words_corridor_to_south)) {
+	if (player_said_2(walk_into, corridor_to_south)) {
 		_scene->_nextSceneId = 406;
 		_vm->_sound->command(10);
 		_action._inProgress = false;
 		return;
 	}
 
-	if ((_globals[kNextIngredient] >= 4) && (_action.isAction(words_take, words_explosives) || _action.isAction(words_put, words_charge_cases, words_explosives))
+	if ((_globals[kNextIngredient] >= 4) && (player_said_2(take, explosives) || player_said_3(put, charge_cases, explosives))
 		&& !_game._objects[OBJ_CHARGE_CASES].getQuality(3)
 		&& _game._objects.isInInventory(OBJ_CHARGE_CASES)) {
 		switch (_game._trigger) {
@@ -586,13 +586,13 @@ static void room_411_parser() {
 		}
 		_action._inProgress = false;
 		return;
-	} else if (!_game._objects.isInInventory(OBJ_CHARGE_CASES) && _action.isAction(words_take, words_explosives)) {
+	} else if (!_game._objects.isInInventory(OBJ_CHARGE_CASES) && player_said_2(take, explosives)) {
 		_vm->_dialogs->show(41143);
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_take, words_petrox) && (_game._objects.isInRoom(OBJ_PETROX) || _game._trigger)) {
+	if (player_said_2(take, petrox) && (_game._objects.isInRoom(OBJ_PETROX) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -629,7 +629,7 @@ static void room_411_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_lecithin) && (_game._objects.isInRoom(OBJ_LECITHIN) || _game._trigger)) {
+	if (player_said_2(take, lecithin) && (_game._objects.isInRoom(OBJ_LECITHIN) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_sound->command(57);
@@ -665,7 +665,7 @@ static void room_411_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_take, words_formaldehyde) && _game._objects.isInRoom(OBJ_FORMALDEHYDE) && (_game._trigger == 0)) {
+	if (player_said_2(take, formaldehyde) && _game._objects.isInRoom(OBJ_FORMALDEHYDE) && (_game._trigger == 0)) {
 		_vm->_sound->command(57);
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
@@ -689,11 +689,11 @@ static void room_411_parser() {
 	if (_game._trigger == 10)
 		_vm->_dialogs->showItem(OBJ_FORMALDEHYDE, 41124);
 
-	if (_action.isAction(words_put) && _action.isTarget(words_kettle)) {
-		if (_action.isObject(words_petrox) ||
-			_action.isObject(words_formaldehyde) ||
-			_action.isObject(words_lecithin) ||
-			_action.isObject(words_alien_liquor)) {
+	if (player_said_1(put) && player_said_1(kettle)) {
+		if (player_said_1(petrox) ||
+			player_said_1(formaldehyde) ||
+			player_said_1(lecithin) ||
+			player_said_1(alien_liquor)) {
 			local._newIngredient = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 			switch (local._newIngredient) {
 			case OBJ_ALIEN_LIQUOR:
@@ -719,67 +719,67 @@ static void room_411_parser() {
 	}
 
 
-	if (_action.isAction(words_look, words_monitor))
+	if (player_said_2(look, monitor))
 		_vm->_dialogs->show(41110);
-	else if (_action.isAction(words_look, words_air_purifier))
+	else if (player_said_2(look, air_purifier))
 		_vm->_dialogs->show(41111);
-	else if (_action.isAction(words_look, words_lab_equipment))
+	else if (player_said_2(look, lab_equipment))
 		_vm->_dialogs->show(41112);
-	else if (_action.isAction(words_look, words_knife_switch))
+	else if (player_said_2(look, knife_switch))
 		_vm->_dialogs->show(41113);
-	else if (_action.isAction(words_push, words_knife_switch) || _action.isAction(words_pull, words_knife_switch))
+	else if (player_said_2(push, knife_switch) || player_said_2(pull, knife_switch))
 		_vm->_dialogs->show(41114);
-	else if (_action.isAction(words_look, words_toxic_waste))
+	else if (player_said_2(look, toxic_waste))
 		_vm->_dialogs->show(41115);
-	else if (_action.isAction(words_take, words_toxic_waste))
+	else if (player_said_2(take, toxic_waste))
 		_vm->_dialogs->show(41116);
-	else if (_action.isAction(words_look, words_drawing_board))
+	else if (player_said_2(look, drawing_board))
 		_vm->_dialogs->show(41117);
-	else if (_action.isAction(words_look, words_experiment))
+	else if (player_said_2(look, experiment))
 		_vm->_dialogs->show(41118);
-	else if (_action.isAction(words_look, words_petrox) && _game._objects.isInRoom(OBJ_PETROX))
+	else if (player_said_2(look, petrox) && _game._objects.isInRoom(OBJ_PETROX))
 		_vm->_dialogs->show(41119);
-	else if (_action.isAction(words_look, words_alcove))
+	else if (player_said_2(look, alcove))
 		_vm->_dialogs->show(41121);
-	else if ((_action.isAction(words_look, words_formaldehyde)) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
+	else if ((player_said_2(look, formaldehyde)) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
 		_vm->_dialogs->show(41122);
-	else if ((_action.isAction(words_look, words_lecithin)) && (_game._objects.isInRoom(OBJ_LECITHIN)))
+	else if ((player_said_2(look, lecithin)) && (_game._objects.isInRoom(OBJ_LECITHIN)))
 		_vm->_dialogs->show(41123);
-	else if (_action.isAction(words_look, words_kettle)) {
+	else if (player_said_2(look, kettle)) {
 		if (_globals[kNextIngredient] > 0 && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
 			_vm->_dialogs->show(41126);
 		} else if (_globals[kNextIngredient] == 0 || _game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
 			_vm->_dialogs->show(41125);
 		}
-	} else if (_action.isAction(words_look, words_explosives) && _game._objects[OBJ_CHARGE_CASES].getQuality(3) == 0) {
+	} else if (player_said_2(look, explosives) && _game._objects[OBJ_CHARGE_CASES].getQuality(3) == 0) {
 		_vm->_dialogs->show(41127);
-	} else if (_action.isAction(words_take, words_kettle))
+	} else if (player_said_2(take, kettle))
 		_vm->_dialogs->show(41128);
-	else if (_action.isAction(words_look, words_control_panel))
+	else if (player_said_2(look, control_panel))
 		_vm->_dialogs->show(41129);
-	else if (_action.isAction(words_look, words_mishap))
+	else if (player_said_2(look, mishap))
 		_vm->_dialogs->show(41130);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(41131);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(41132);
-	else if (_action.isAction(words_look, words_air_horn))
+	else if (player_said_2(look, air_horn))
 		_vm->_dialogs->show(41133);
-	else if (_action.isAction(words_look, words_debris))
+	else if (player_said_2(look, debris))
 		_vm->_dialogs->show(41134);
-	else if (_action.isAction(words_look, words_heater))
+	else if (player_said_2(look, heater))
 		_vm->_dialogs->show(41135);
-	else if (_action.isAction(words_look, words_pipe))
+	else if (player_said_2(look, pipe))
 		_vm->_dialogs->show(41136);
-	else if (_action.isAction(words_look, words_sink))
+	else if (player_said_2(look, sink))
 		_vm->_dialogs->show(41137);
-	else if (_action.isAction(words_put, words_sink))
+	else if (player_said_2(put, sink))
 		_vm->_dialogs->show(41138);
-	else if (_action.isAction(words_take, words_experiment))
+	else if (player_said_2(take, experiment))
 		_vm->_dialogs->show(41139);
-	else if (_action.isAction(words_look, words_electrodes))
+	else if (player_said_2(look, electrodes))
 		_vm->_dialogs->show(41140);
-	else if (_action.isAction(words_take, words_electrodes))
+	else if (player_said_2(take, electrodes))
 		_vm->_dialogs->show(41141);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room413.cpp b/engines/mads/madsv2/nebular/rooms/room413.cpp
index e4596a23b7b..8770bb67b8c 100644
--- a/engines/mads/madsv2/nebular/rooms/room413.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room413.cpp
@@ -134,41 +134,41 @@ static void room_413_daemon() {
 }
 
 static void room_413_pre_parser() {
-	if (_action.isAction(words_take) || _action.isAction(words_put, words_conveyor_belt))
+	if (player_said_1(take) || player_said_2(put, conveyor_belt))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_look, words_wooden_statue) || _action.isAction(words_look, words_display)
-		|| _action.isAction(words_look, words_picture) || _action.isAction(words_look, words_plant)) {
+	if (player_said_2(look, wooden_statue) || player_said_2(look, display)
+		|| player_said_2(look, picture) || player_said_2(look, plant)) {
 		_game._player._needToWalk = true;
 	}
 }
 
 static void room_413_parser() {
-	if (_action.isAction(words_walk_inside, words_teleporter)) {
+	if (player_said_2(walk_inside, teleporter)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 409;
-	} else if (_action.isAction(words_walk_into, words_corridor_to_south))
+	} else if (player_said_2(walk_into, corridor_to_south))
 		_scene->_nextSceneId = 405;
-	else if (_action.isAction(words_look, words_wooden_statue))
+	else if (player_said_2(look, wooden_statue))
 		_vm->_dialogs->show(41310);
-	else if (_action.isAction(words_take, words_wooden_statue))
+	else if (player_said_2(take, wooden_statue))
 		_vm->_dialogs->show(41311);
-	else if (_action.isAction(words_look, words_conveyor_belt))
+	else if (player_said_2(look, conveyor_belt))
 		_vm->_dialogs->show(41312);
-	else if (_action.isAction(words_put, words_conveyor_belt))
+	else if (player_said_2(put, conveyor_belt))
 		_vm->_dialogs->show(41313);
-	else if (_action.isAction(words_look, words_teleporter))
+	else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(41314);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(41315);
-	else if (_action.isAction(words_look, words_corridor_to_south))
+	else if (player_said_2(look, corridor_to_south))
 		_vm->_dialogs->show(41316);
-	else if (_action.isAction(words_look, words_picture))
+	else if (player_said_2(look, picture))
 		_vm->_dialogs->show(41317);
-	else if (_action.isAction(words_look, words_plant))
+	else if (player_said_2(look, plant))
 		_vm->_dialogs->show(41318);
-	else if (_action.isAction(words_take, words_plant))
+	else if (player_said_2(take, plant))
 		_vm->_dialogs->show(41319);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(41320);
diff --git a/engines/mads/madsv2/nebular/rooms/room501.cpp b/engines/mads/madsv2/nebular/rooms/room501.cpp
index 1c734fd5034..6c93c742af1 100644
--- a/engines/mads/madsv2/nebular/rooms/room501.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room501.cpp
@@ -217,12 +217,12 @@ static void room_501_daemon() {
 }
 
 static void room_501_pre_parser() {
-	if (_action.isAction(words_walk_down) && (_action.isObject(words_street_to_east) || _action.isObject(words_sidewalk_to_east)))
+	if (player_said_1(walk_down) && (player_said_1(street_to_east) || player_said_1(sidewalk_to_east)))
 		_game._player._walkOffScreenSceneId = 551;
 }
 
 static void room_501_parser() {
-	if (_action.isAction(words_get_into, words_car)) {
+	if (player_said_2(get_into, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -271,9 +271,9 @@ static void room_501_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_put, words_security_card, words_card_slot))
+	} else if (player_said_3(put, security_card, card_slot))
 		_vm->_dialogs->show(50113);
-	else if (_action.isAction(words_put, words_fake_id, words_card_slot)) {
+	else if (player_said_3(put, fake_id, card_slot)) {
 		switch (_game._trigger) {
 		case 0:
 		case 1:
@@ -317,7 +317,7 @@ static void room_501_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_put, words_id_card, words_card_slot)) {
+	} else if (player_said_3(put, id_card, card_slot)) {
 		switch (_game._trigger) {
 		case 0:
 		case 1:
@@ -365,34 +365,34 @@ static void room_501_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_street))
+	} else if (_action._lookFlag || player_said_2(look, street))
 		_vm->_dialogs->show(50121);
-	else if (_action.isAction(words_look, words_door))
+	else if (player_said_2(look, door))
 		_vm->_dialogs->show(50110);
-	else if (_action.isAction(words_look, words_card_slot))
+	else if (player_said_2(look, card_slot))
 		_vm->_dialogs->show(50112);
-	else if (_action.isAction(words_look, words_sign))
+	else if (player_said_2(look, sign))
 		_vm->_dialogs->show(50114);
-	else if (_action.isAction(words_take, words_sign))
+	else if (player_said_2(take, sign))
 		_vm->_dialogs->show(50115);
-	else if (_action.isAction(words_look, words_sidewalk_to_east))
+	else if (player_said_2(look, sidewalk_to_east))
 		_vm->_dialogs->show(50118);
-	else if (_action.isAction(words_look, words_sidewalk_to_west) || _action.isAction(words_look, words_street_to_west)
-		|| _action.isAction(words_walk_down, words_sidewalk_to_west) || _action.isAction(words_walk_down, words_street_to_west))
+	else if (player_said_2(look, sidewalk_to_west) || player_said_2(look, street_to_west)
+		|| player_said_2(walk_down, sidewalk_to_west) || player_said_2(walk_down, street_to_west))
 		_vm->_dialogs->show(50119);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(50120);
-	else if (_action.isAction(words_open, words_door))
+	else if (player_said_2(open, door))
 		_vm->_dialogs->show(50122);
-	else if (_action.isAction(words_look, words_fire_hydrant))
+	else if (player_said_2(look, fire_hydrant))
 		_vm->_dialogs->show(50123);
-	else if (_action.isAction(words_open, words_fire_hydrant))
+	else if (player_said_2(open, fire_hydrant))
 		_vm->_dialogs->show(50124);
-	else if (_action.isAction(words_look, words_equipment_overhead))
+	else if (player_said_2(look, equipment_overhead))
 		_vm->_dialogs->show(50125);
-	else if (_action.isAction(words_look, words_pipes) || _action.isAction(words_look, words_pipe))
+	else if (player_said_2(look, pipes) || player_said_2(look, pipe))
 		_vm->_dialogs->show(50126);
-	else if (_action.isAction(words_look, words_car)) {
+	else if (player_said_2(look, car)) {
 		if (!_game._visitedScenes.exists(504))
 			_vm->_dialogs->show(50116);
 		else
diff --git a/engines/mads/madsv2/nebular/rooms/room502.cpp b/engines/mads/madsv2/nebular/rooms/room502.cpp
index ceac10a7cf2..4592bc5fff6 100644
--- a/engines/mads/madsv2/nebular/rooms/room502.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room502.cpp
@@ -61,21 +61,21 @@ static void room_502_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
+	if (player_said_2(look, viewport) || player_said_2(peer_through, viewport))
 		_vm->_dialogs->show(50210);
-	else if (_action.isAction(words_look, words_keypad))
+	else if (player_said_2(look, keypad))
 		_vm->_dialogs->show(50211);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(50212);
-	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
-		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
-		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
-		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
-		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
-		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_enter_key)
-		|| _action.isAction(words_look, words_frown_key))
+	else if (player_said_2(look, 0_key) || player_said_2(look, 1_key)
+		|| player_said_2(look, 2_key) || player_said_2(look, 3_key)
+		|| player_said_2(look, 4_key) || player_said_2(look, 5_key)
+		|| player_said_2(look, 6_key) || player_said_2(look, 7_key)
+		|| player_said_2(look, 8_key) || player_said_2(look, 9_key)
+		|| player_said_2(look, smile_key) || player_said_2(look, enter_key)
+		|| player_said_2(look, frown_key))
 		_vm->_dialogs->show(50213);
-	else if (_action.isAction(words_look, words_device) || _action._lookFlag)
+	else if (player_said_2(look, device) || _action._lookFlag)
 		_vm->_dialogs->show(50214);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room503.cpp b/engines/mads/madsv2/nebular/rooms/room503.cpp
index 906bf6b55c0..75939a3c7f3 100644
--- a/engines/mads/madsv2/nebular/rooms/room503.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room503.cpp
@@ -63,9 +63,9 @@ static void room_503_init() {
 }
 
 static void room_503_parser() {
-	if (_action.isAction(words_walk, words_outside))
+	if (player_said_2(walk, outside))
 		_scene->_nextSceneId = 501;
-	else if (_action.isAction(words_take, words_detonators)) {
+	else if (player_said_2(take, detonators)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_DETONATORS)) {
 			switch (_game._trigger) {
 			case 0:
@@ -110,42 +110,42 @@ static void room_503_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50328);
-	else if (_action.isAction(words_look, words_monitoring_equipment))
+	else if (player_said_2(look, monitoring_equipment))
 		_vm->_dialogs->show(50310);
-	else if (_action.isAction(words_look, words_photon_rifles))
+	else if (player_said_2(look, photon_rifles))
 		_vm->_dialogs->show(50311);
-	else if (_action.isAction(words_take, words_photon_rifles) || _action.isAction(words_take, words_nuclear_slingshot))
+	else if (player_said_2(take, photon_rifles) || player_said_2(take, nuclear_slingshot))
 		_vm->_dialogs->show(50312);
-	else if (_action.isAction(words_look, words_display_case))
+	else if (player_said_2(look, display_case))
 		_vm->_dialogs->show(50313);
-	else if (_action.isAction(words_look, words_nuclear_slingshot))
+	else if (player_said_2(look, nuclear_slingshot))
 		_vm->_dialogs->show(50314);
-	else if (_action.isAction(words_look, words_water_cooler))
+	else if (player_said_2(look, water_cooler))
 		_vm->_dialogs->show(50315);
-	else if (_action.isAction(words_look, words_storage_box))
+	else if (player_said_2(look, storage_box))
 		_vm->_dialogs->show(50316);
-	else if (_action.isAction(words_open, words_storage_box))
+	else if (player_said_2(open, storage_box))
 		_vm->_dialogs->show(50317);
-	else if (_action.isAction(words_look, words_warning_label))
+	else if (player_said_2(look, warning_label))
 		_vm->_dialogs->show(50318);
-	else if (_action.isAction(words_look, words_desk))
+	else if (player_said_2(look, desk))
 		_vm->_dialogs->show(50319);
-	else if (_action.isAction(words_look, words_monitor))
+	else if (player_said_2(look, monitor))
 		_vm->_dialogs->show(50320);
-	else if (_action.isAction(words_look, words_file_cabinets))
+	else if (player_said_2(look, file_cabinets))
 		_vm->_dialogs->show(50322);
-	else if (_action.isAction(words_look, words_box)) {
+	else if (player_said_2(look, box)) {
 		if (_game._objects.isInRoom(OBJ_DETONATORS))
 			_vm->_dialogs->show(50323);
 		else
 			_vm->_dialogs->show(50324);
-	} else if (_action.isAction(words_look, words_detonators) && (_action._savedFields._mainObjectSource == 4))
+	} else if (player_said_2(look, detonators) && (_action._savedFields._mainObjectSource == 4))
 		_vm->_dialogs->show(50325);
-	else if (_action.isAction(words_look, words_windows))
+	else if (player_said_2(look, windows))
 		_vm->_dialogs->show(50327);
-	else if (_action.isAction(words_open, words_display_case))
+	else if (player_said_2(open, display_case))
 		_vm->_dialogs->show(50329);
-	else if (_action.isAction(words_throw, words_display_case) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
+	else if (player_said_2(throw, display_case) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
 		_vm->_dialogs->show(50330);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room504.cpp b/engines/mads/madsv2/nebular/rooms/room504.cpp
index 040e37efe6c..4b56eac94a0 100644
--- a/engines/mads/madsv2/nebular/rooms/room504.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room504.cpp
@@ -142,10 +142,10 @@ static void room_504_pre_parser() {
 }
 
 static void room_504_parser() {
-	if (_action.isAction(words_exit_from, words_car)) {
+	if (player_said_2(exit_from, car)) {
 		_vm->_sound->command(15);
 		_scene->_nextSceneId = _globals[kHoverCarLocation];
-	} else if (_action.isAction(words_activate, words_car_controls)) {
+	} else if (player_said_2(activate, car_controls)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -204,27 +204,27 @@ static void room_504_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_interior_of_car))
+	} else if (_action._lookFlag || player_said_2(look, interior_of_car))
 		_vm->_dialogs->show(50412);
-	else if (_action.isAction(words_look, words_glove_compartment))
+	else if (player_said_2(look, glove_compartment))
 		_vm->_dialogs->show(50410);
-	else if (_action.isAction(words_look, words_car_controls) || _action.isAction(words_look, words_dashboard))
+	else if (player_said_2(look, car_controls) || player_said_2(look, dashboard))
 		_vm->_dialogs->show(50411);
-	else if (_action.isAction(words_look, words_scent_packet))
+	else if (player_said_2(look, scent_packet))
 		_vm->_dialogs->show(50413);
-	else if (_action.isAction(words_look, words_soda_cans))
+	else if (player_said_2(look, soda_cans))
 		_vm->_dialogs->show(50414);
-	else if (_action.isAction(words_look, words_kitty))
+	else if (player_said_2(look, kitty))
 		_vm->_dialogs->show(50415);
-	else if (_action.isAction(words_look, words_windshield) || _action.isAction(words_look_through, words_windshield))
+	else if (player_said_2(look, windshield) || player_said_2(look_through, windshield))
 		_vm->_dialogs->show(50416);
-	else if (_action.isAction(words_look, words_rearview_mirror))
+	else if (player_said_2(look, rearview_mirror))
 		_vm->_dialogs->show(50417);
-	else if (_action.isAction(words_take, words_rearview_mirror))
+	else if (player_said_2(take, rearview_mirror))
 		_vm->_dialogs->show(50418);
-	else if (_action.isAction(words_look, words_moldy_sock))
+	else if (player_said_2(look, moldy_sock))
 		_vm->_dialogs->show(50419);
-	else if (_action.isAction(words_take, words_moldy_sock))
+	else if (player_said_2(take, moldy_sock))
 		_vm->_dialogs->show(50420);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room505.cpp b/engines/mads/madsv2/nebular/rooms/room505.cpp
index bfc79df9845..7b356f80911 100644
--- a/engines/mads/madsv2/nebular/rooms/room505.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room505.cpp
@@ -280,13 +280,13 @@ static void room_505_daemon() {
 }
 
 static void room_505_parser() {
-	if (_action.isAction(words_press))
+	if (player_said_1(press))
 		local._nextButtonId = _action._activeAction._objectNameId;
-	else if (_action.isAction(words_return_to, words_inside_of_car))
+	else if (player_said_2(return_to, inside_of_car))
 		_scene->_nextSceneId = 504;
-	else if (_action.isAction(words_look, words_view_screen))
+	else if (player_said_2(look, view_screen))
 		_vm->_dialogs->show(50510);
-	else if (_action.isAction(words_look, words_control_panel))
+	else if (player_said_2(look, control_panel))
 		_vm->_dialogs->show(50511);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room506.cpp b/engines/mads/madsv2/nebular/rooms/room506.cpp
index 0a85dfb694a..f0d299c6ee4 100644
--- a/engines/mads/madsv2/nebular/rooms/room506.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room506.cpp
@@ -53,7 +53,7 @@ static void handleDoorSequences() {
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 
 	if (local._firstDoorFl) {
-		if (_action.isAction(words_walk_into, words_software_store) || ((_scene->_priorSceneId == 507) && !local._actionFl)) {
+		if (player_said_2(walk_into, software_store) || ((_scene->_priorSceneId == 507) && !local._actionFl)) {
 			local._doorDepth = 13;
 			local._doorSpriteIdx = _globals._spriteIndexes[2];
 			local._doorSequenceIdx = _globals._sequenceIndexes[2];
@@ -224,7 +224,7 @@ static void room_506_daemon() {
 }
 
 static void room_506_parser() {
-	if (_action.isAction(words_walk_into, words_laboratory)) {
+	if (player_said_2(walk_into, laboratory)) {
 		if (local._firstDoorFl) {
 			local._heroFacing = FACING_NORTHWEST;
 			local._doorPos_x = 16;
@@ -232,7 +232,7 @@ static void room_506_parser() {
 		}
 		local._actionFl = true;
 		handleDoorSequences();
-	} else if (_action.isAction(words_walk_into, words_software_store)) {
+	} else if (player_said_2(walk_into, software_store)) {
 		if (local._firstDoorFl) {
 			local._heroFacing = FACING_NORTHWEST;
 			local._doorPos_x = 80;
@@ -240,7 +240,7 @@ static void room_506_parser() {
 		}
 		local._actionFl = true;
 		handleDoorSequences();
-	} else if (_action.isAction(words_get_into, words_car)) {
+	} else if (player_said_2(get_into, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -279,29 +279,29 @@ static void room_506_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_street))
+	} else if (_action._lookFlag || player_said_2(look, street))
 		_vm->_dialogs->show(50618);
-	else if (_action.isAction(words_look, words_restaurant))
+	else if (player_said_2(look, restaurant))
 		_vm->_dialogs->show(50610);
-	else if (_action.isAction(words_look, words_motel))
+	else if (player_said_2(look, motel))
 		_vm->_dialogs->show(50611);
-	else if (_action.isAction(words_look, words_cycle_shop))
+	else if (player_said_2(look, cycle_shop))
 		_vm->_dialogs->show(50612);
-	else if (_action.isAction(words_look, words_air_bike))
+	else if (player_said_2(look, air_bike))
 		_vm->_dialogs->show(50613);
-	else if (_action.isAction(words_take, words_air_bike))
+	else if (player_said_2(take, air_bike))
 		_vm->_dialogs->show(50614);
-	else if (_action.isAction(words_look, words_software_store))
+	else if (player_said_2(look, software_store))
 		_vm->_dialogs->show(50615);
-	else if (_action.isAction(words_look, words_laboratory))
+	else if (player_said_2(look, laboratory))
 		_vm->_dialogs->show(50616);
-	else if (_action.isAction(words_look, words_street_to_west) || _action.isAction(words_walk_down, words_street_to_west))
+	else if (player_said_2(look, street_to_west) || player_said_2(walk_down, street_to_west))
 		_vm->_dialogs->show(50617);
-	else if (_action.isAction(words_look, words_software_store_sign))
+	else if (player_said_2(look, software_store_sign))
 		_vm->_dialogs->show(50619);
-	else if (_action.isAction(words_look, words_car))
+	else if (player_said_2(look, car))
 		_vm->_dialogs->show(50620);
-	else if (_action.isAction(words_look, words_sky))
+	else if (player_said_2(look, sky))
 		_vm->_dialogs->show(50621);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room507.cpp b/engines/mads/madsv2/nebular/rooms/room507.cpp
index beec85a7dba..2e7c1535b9d 100644
--- a/engines/mads/madsv2/nebular/rooms/room507.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room507.cpp
@@ -59,9 +59,9 @@ static void room_507_init() {
 }
 
 static void room_507_parser() {
-	if (_action.isAction(words_walk_through, words_entrance))
+	if (player_said_2(walk_through, entrance))
 		_scene->_nextSceneId = 506;
-	else if (_action.isAction(words_take, words_penlight)) {
+	else if (player_said_2(take, penlight)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_PENLIGHT)) {
 			switch (_game._trigger) {
 			case 0:
@@ -94,50 +94,50 @@ static void room_507_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50722);
-	else if (_action.isAction(words_look, words_swirling_light))
+	else if (player_said_2(look, swirling_light))
 		_vm->_dialogs->show(50710);
-	else if (_action.isAction(words_take, words_swirling_light))
+	else if (player_said_2(take, swirling_light))
 		_vm->_dialogs->show(50711);
-	else if (_action.isAction(words_look, words_old_software))
+	else if (player_said_2(look, old_software))
 		_vm->_dialogs->show(50712);
-	else if (_action.isAction(words_take, words_old_software))
+	else if (player_said_2(take, old_software))
 		_vm->_dialogs->show(50713);
-	else if (_action.isAction(words_look, words_advertisement))
+	else if (player_said_2(look, advertisement))
 		_vm->_dialogs->show(50714);
-	else if (_action.isAction(words_look, words_advertising_poster))
+	else if (player_said_2(look, advertising_poster))
 		_vm->_dialogs->show(50715);
-	else if (_action.isAction(words_look, words_sign)) {
+	else if (player_said_2(look, sign)) {
 		if (_scene->_customDest.x < 100)
 			_vm->_dialogs->show(50726);
 		else
 			_vm->_dialogs->show(50716);
-	} else if (_action.isAction(words_look, words_hottest_software))
+	} else if (player_said_2(look, hottest_software))
 		_vm->_dialogs->show(50717);
-	else if (_action.isAction(words_look, words_software_shelf))
+	else if (player_said_2(look, software_shelf))
 		_vm->_dialogs->show(50718);
-	else if (_action.isAction(words_look, words_sensor))
+	else if (player_said_2(look, sensor))
 		_vm->_dialogs->show(50719);
-	else if (_action.isAction(words_look, words_cash_register))
+	else if (player_said_2(look, cash_register))
 		_vm->_dialogs->show(50720);
-	else if (_action.isAction(words_look, words_pad_of_paper))
+	else if (player_said_2(look, pad_of_paper))
 		_vm->_dialogs->show(50721);
-	else if (_action.isAction(words_open, words_cash_register))
+	else if (player_said_2(open, cash_register))
 		_vm->_dialogs->show(50723);
-	else if (_action.isAction(words_look, words_bargain_vat))
+	else if (player_said_2(look, bargain_vat))
 		_vm->_dialogs->show(50724);
-	else if (_action.isAction(words_look, words_window))
+	else if (player_said_2(look, window))
 		_vm->_dialogs->show(50725);
-	else if (_action.isAction(words_walk_behind, words_counter)) {
+	else if (player_said_2(walk_behind, counter)) {
 		// WORKAROUND: Empty handling to prevent default "can't do that" dialogs showing
-	} else if (_action.isAction(words_look, words_counter)) {
+	} else if (player_said_2(look, counter)) {
 		if (_game._objects.isInRoom(OBJ_PENLIGHT))
 			_vm->_dialogs->show(50728);
 		else
 			_vm->_dialogs->show(50727);
-	} else if (_action.isAction(words_look, words_penlight) && !_game._objects.isInInventory(OBJ_PENLIGHT)) {
+	} else if (player_said_2(look, penlight) && !_game._objects.isInInventory(OBJ_PENLIGHT)) {
 		if (_game._objects.isInRoom(OBJ_PENLIGHT))
 			_vm->_dialogs->show(50729);
-	} else if (_action.isAction(words_look, words_emergency_light))
+	} else if (player_said_2(look, emergency_light))
 		_vm->_dialogs->show(50731);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room508.cpp b/engines/mads/madsv2/nebular/rooms/room508.cpp
index a3cb453ee31..92f94ec993c 100644
--- a/engines/mads/madsv2/nebular/rooms/room508.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room508.cpp
@@ -100,7 +100,7 @@ static void room_508_init() {
 }
 
 static void room_508_pre_parser() {
-	if (_action.isAction(words_walk, words_outside))
+	if (player_said_2(walk, outside))
 		_game._player._walkOffScreenSceneId = 506;
 }
 
@@ -158,7 +158,7 @@ static void handlePedestral() {
 }
 
 static void room_508_parser() {
-	if (_action.isAction(words_pull, words_lever)) {
+	if (player_said_2(pull, lever)) {
 		if (!_globals[kLaserOn]) {
 			switch (_game._trigger) {
 			case 0:
@@ -224,60 +224,60 @@ static void room_508_parser() {
 		} else {
 			_vm->_dialogs->show(50837);
 		}
-	} else if (_action.isAction(words_reflect, words_rearview_mirror, words_laser_beam) || _action.isAction(words_put, words_rearview_mirror, words_pedestal) || _action.isAction(words_put, words_rearview_mirror, words_laser_beam)) {
+	} else if (player_said_3(reflect, rearview_mirror, laser_beam) || player_said_3(put, rearview_mirror, pedestal) || player_said_3(put, rearview_mirror, laser_beam)) {
 		local._chosenObject = 1;
 		handlePedestral();
-	} else if (_action.isAction(words_put, words_compact_case, words_pedestal) || _action.isAction(words_put, words_compact_case, words_laser_beam) || _action.isAction(words_reflect, words_compact_case, words_laser_beam)) {
+	} else if (player_said_3(put, compact_case, pedestal) || player_said_3(put, compact_case, laser_beam) || player_said_3(reflect, compact_case, laser_beam)) {
 		local._chosenObject = 2;
 		handlePedestral();
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(50822);
-	else if (_action.isAction(words_look, words_target_area))
+	else if (player_said_2(look, target_area))
 		_vm->_dialogs->show(50810);
-	else if (_action.isAction(words_look, words_spinach_patch_doll))
+	else if (player_said_2(look, spinach_patch_doll))
 		_vm->_dialogs->show(50811);
-	else if (_action.isAction(words_take, words_spinach_patch_doll))
+	else if (player_said_2(take, spinach_patch_doll))
 		_vm->_dialogs->show(50812);
-	else if (_action.isAction(words_look, words_sand_bags))
+	else if (player_said_2(look, sand_bags))
 		_vm->_dialogs->show(50816);
-	else if (_action.isAction(words_take, words_sand_bags))
+	else if (player_said_2(take, sand_bags))
 		_vm->_dialogs->show(50817);
-	else if (_action.isAction(words_look, words_control_station))
+	else if (player_said_2(look, control_station))
 		_vm->_dialogs->show(50818);
-	else if (_action.isAction(words_look, words_monitor)) {
+	else if (player_said_2(look, monitor)) {
 		if (_globals[kLaserOn])
 			_vm->_dialogs->show(50820);
 		else
 			_vm->_dialogs->show(50819);
-	} else if (_action.isAction(words_look, words_laser_cannon)) {
+	} else if (player_said_2(look, laser_cannon)) {
 		if (_globals[kLaserOn])
 			_vm->_dialogs->show(50822);
 		else
 			_vm->_dialogs->show(50821);
-	} else if (_action.isAction(words_take, words_laser_cannon))
+	} else if (player_said_2(take, laser_cannon))
 		_vm->_dialogs->show(50823);
-	else if (_action.isAction(words_look, words_lever)) {
+	else if (player_said_2(look, lever)) {
 		if (_globals[kLaserOn])
 			_vm->_dialogs->show(50825);
 		else
 			_vm->_dialogs->show(50824);
-	} else if (_action.isAction(words_push, words_lever))
+	} else if (player_said_2(push, lever))
 		_vm->_dialogs->show(50826);
-	else if (_action.isAction(words_look, words_laser_beam)) {
+	else if (player_said_2(look, laser_beam)) {
 		if (_globals[kLaserHoleIsThere])
 			_vm->_dialogs->show(50828);
 		else
 			_vm->_dialogs->show(50827);
-	} else if (_action.isAction(words_take, words_laser_beam))
+	} else if (player_said_2(take, laser_beam))
 		_vm->_dialogs->show(50829);
-	else if (_action.isAction(words_look, words_ceiling)) {
+	else if (player_said_2(look, ceiling)) {
 		if (_globals[kLaserHoleIsThere])
 			_vm->_dialogs->show(50831);
 		else
 			_vm->_dialogs->show(50830);
-	} else if (_action.isAction(words_look, words_wall))
+	} else if (player_said_2(look, wall))
 		_vm->_dialogs->show(50832);
-	else if (_action.isAction(words_look, words_pedestal)) {
+	else if (player_said_2(look, pedestal)) {
 		if (!_globals[kLaserOn])
 			_vm->_dialogs->show(50813);
 		else if (!_globals[kLaserHoleIsThere])
diff --git a/engines/mads/madsv2/nebular/rooms/room511.cpp b/engines/mads/madsv2/nebular/rooms/room511.cpp
index de45b147809..1b6cc6846b9 100644
--- a/engines/mads/madsv2/nebular/rooms/room511.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room511.cpp
@@ -177,10 +177,10 @@ static void room_511_pre_parser() {
 	if (!local._handingLine)
 		return;
 
-	if (_action.isAction(words_look) || _action.isObject(words_fishing_line) || _action.isAction(words_talkto))
+	if (player_said_1(look) || player_said_1(fishing_line) || player_said_1(talkto))
 		_game._player._needToWalk = false;
 
-	if ((!_action.isAction(words_tie, words_fishing_line, words_boat) || !_action.isAction(words_attach, words_fishing_line, words_boat)) && _game._player._needToWalk) {
+	if ((!player_said_3(tie, fishing_line, boat) || !player_said_3(attach, fishing_line, boat)) && _game._player._needToWalk) {
 		if (_game._trigger == 0) {
 			_game._player._readyToWalk = false;
 			_game._player._stepEnabled = false;
@@ -199,9 +199,9 @@ static void room_511_pre_parser() {
 }
 
 static void room_511_parser() {
-	if (_action.isAction(words_walk_into, words_restaurant))
+	if (player_said_2(walk_into, restaurant))
 		_scene->_nextSceneId = 512;
-	else if (_action.isAction(words_get_into, words_car)) {
+	else if (player_said_2(get_into, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -241,7 +241,7 @@ static void room_511_parser() {
 		default:
 			break;
 		}
-	} else 	if (_action.isAction(words_take, words_fishing_line)) {
+	} else 	if (player_said_2(take, fishing_line)) {
 		if (!_globals[kBoatRaised]) {
 			if (_globals[kLineStatus] == 2) {
 				if (_globals[kLineStatus] != 3) {
@@ -271,8 +271,8 @@ static void room_511_parser() {
 		} else {
 			_vm->_dialogs->show(51130);
 		}
-	} else if (_action.isAction(words_tie, words_fishing_line, words_boat) ||
-		_action.isAction(words_attach, words_fishing_line, words_boat)) {
+	} else if (player_said_3(tie, fishing_line, boat) ||
+		player_said_3(attach, fishing_line, boat)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51131);
 		else if (_globals[kLineStatus] == 1)
@@ -303,7 +303,7 @@ static void room_511_parser() {
 				}
 			}
 		}
-	} else if (_action.isAction(words_look, words_street) || _action._lookFlag) {
+	} else if (player_said_2(look, street) || _action._lookFlag) {
 		if (_globals[kLineStatus] == 2)
 			_vm->_dialogs->show(51110);
 		else {
@@ -312,45 +312,45 @@ static void room_511_parser() {
 			else
 				_vm->_dialogs->show(51112);
 		}
-	} else if (_action.isAction(words_look, words_car))
+	} else if (player_said_2(look, car))
 		_vm->_dialogs->show(51113);
-	else if (_action.isAction(words_look, words_sidewalk))
+	else if (player_said_2(look, sidewalk))
 		_vm->_dialogs->show(51114);
-	else if (_action.isAction(words_walk_down, words_sidewalk_to_east) || _action.isAction(words_walk_down, words_sidewalk_to_west) || _action.isAction(words_walk_down, words_street_to_east))
+	else if (player_said_2(walk_down, sidewalk_to_east) || player_said_2(walk_down, sidewalk_to_west) || player_said_2(walk_down, street_to_east))
 		_vm->_dialogs->show(51115);
-	else if (_action.isAction(words_look, words_pleasure_dome))
+	else if (player_said_2(look, pleasure_dome))
 		_vm->_dialogs->show(51116);
-	else if (_action.isAction(words_look, words_ticket_booth))
+	else if (player_said_2(look, ticket_booth))
 		_vm->_dialogs->show(51117);
-	else if (_action.isAction(words_look, words_dome_entrance))
+	else if (player_said_2(look, dome_entrance))
 		_vm->_dialogs->show(51118);
-	else if (_action.isAction(words_unlock, words_padlock_key, words_dome_entrance) || _action.isAction(words_unlock, words_door_key, words_dome_entrance))
+	else if (player_said_3(unlock, padlock_key, dome_entrance) || player_said_3(unlock, door_key, dome_entrance))
 		_vm->_dialogs->show(51119);
-	else if ((_action.isAction(words_put) || _action.isAction(words_throw))
-		&& (_action.isObject(words_timebomb) || _action.isObject(words_bomb) || _action.isObject(words_bombs))
-		&& _action.isObject(words_dome_entrance))
+	else if ((player_said_1(put) || player_said_1(throw))
+		&& (player_said_1(timebomb) || player_said_1(bomb) || player_said_1(bombs))
+		&& player_said_1(dome_entrance))
 		_vm->_dialogs->show(51120);
-	else if (_action.isAction(words_look, words_restaurant)) {
+	else if (player_said_2(look, restaurant)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51121);
 		else
 			_vm->_dialogs->show(51128);
-	} else if (_action.isAction(words_look, words_porthole))
+	} else if (player_said_2(look, porthole))
 		_vm->_dialogs->show(51122);
-	else if (_action.isAction(words_look, words_fishing_line) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2))
+	else if (player_said_2(look, fishing_line) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2))
 		_vm->_dialogs->show(51126);
-	else if (_action.isAction(words_look, words_fishing_line) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3))
+	else if (player_said_2(look, fishing_line) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3))
 		_vm->_dialogs->show(51133);
-	else if (_action.isAction(words_look, words_statue))
+	else if (player_said_2(look, statue))
 		_vm->_dialogs->show(51127);
-	else if (_action.isAction(words_look, words_boat))
+	else if (player_said_2(look, boat))
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51123);
 		else if (_globals[kLineStatus] != 3)
 			_vm->_dialogs->show(51124);
 		else
 			_vm->_dialogs->show(51125);
-	else if (_action.isAction(words_look, words_fishing_line) && (_globals[kLineStatus] == 3))
+	else if (player_said_2(look, fishing_line) && (_globals[kLineStatus] == 3))
 		_vm->_dialogs->show(51125);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room512.cpp b/engines/mads/madsv2/nebular/rooms/room512.cpp
index a5ac8ebb1bc..65b4f0a3dd4 100644
--- a/engines/mads/madsv2/nebular/rooms/room512.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room512.cpp
@@ -94,9 +94,9 @@ static void room_512_init() {
 }
 
 static void room_512_parser() {
-	if (_action.isAction(words_walk, words_outside))
+	if (player_said_2(walk, outside))
 		_scene->_nextSceneId = 511;
-	else if (_action.isAction(words_take, words_fishing_rod)) {
+	else if (player_said_2(take, fishing_rod)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_FISHING_ROD)) {
 			switch (_game._trigger) {
 			case 0:
@@ -126,7 +126,7 @@ static void room_512_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_open, words_cash_register)) {
+	} else if (player_said_2(open, cash_register)) {
 		if (!_globals[kRegisterOpen]) {
 			switch (_game._trigger) {
 			case 0:
@@ -187,7 +187,7 @@ static void room_512_parser() {
 			}
 		} else
 			_vm->_dialogs->show(51239);
-	} else if (_action.isAction(words_close, words_cash_register) && _globals[kRegisterOpen]) {
+	} else if (player_said_2(close, cash_register) && _globals[kRegisterOpen]) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -223,7 +223,7 @@ static void room_512_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_padlock_key)) {
+	} else if (player_said_2(take, padlock_key)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_PADLOCK_KEY)) {
 			switch (_game._trigger) {
 			case 0:
@@ -270,51 +270,51 @@ static void room_512_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(51225);
-	else if (_action.isAction(words_look, words_padlock_key) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
+	else if (player_said_2(look, padlock_key) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
 		_vm->_dialogs->show(51215);
-	else if (_action.isAction(words_look, words_fishing_rod) && (!_scene->_animation[0] ||
+	else if (player_said_2(look, fishing_rod) && (!_scene->_animation[0] ||
 		_scene->_animation[0]->getCurrentFrame() == 4))
 		_vm->_dialogs->show(51216);
-	else if (_action.isAction(words_look, words_ships_wheel))
+	else if (player_said_2(look, ships_wheel))
 		_vm->_dialogs->show(51218);
-	else if (_action.isAction(words_take, words_ships_wheel))
+	else if (player_said_2(take, ships_wheel))
 		_vm->_dialogs->show(51219);
-	else if (_action.isAction(words_look, words_porthole) || _action.isAction(words_peer_through, words_porthole))
+	else if (player_said_2(look, porthole) || player_said_2(peer_through, porthole))
 		_vm->_dialogs->show(51220);
-	else if (_action.isAction(words_look, words_table))
+	else if (player_said_2(look, table))
 		_vm->_dialogs->show(51221);
-	else if (_action.isAction(words_look, words_starfish))
+	else if (player_said_2(look, starfish))
 		_vm->_dialogs->show(51222);
-	else if (_action.isAction(words_take, words_starfish))
+	else if (player_said_2(take, starfish))
 		_vm->_dialogs->show(51223);
-	else if (_action.isAction(words_look, words_outside))
+	else if (player_said_2(look, outside))
 		_vm->_dialogs->show(51224);
-	else if (_action.isAction(words_look, words_poster))
+	else if (player_said_2(look, poster))
 		_vm->_dialogs->show(51227);
-	else if (_action.isAction(words_take, words_poster))
+	else if (player_said_2(take, poster))
 		_vm->_dialogs->show(51228);
-	else if (_action.isAction(words_look, words_trophy)) {
+	else if (player_said_2(look, trophy)) {
 		if (_game._visitedScenes.exists(604))
 			_vm->_dialogs->show(51229);
 		else
 			_vm->_dialogs->show(51230);
-	} else if (_action.isAction(words_look, words_chair))
+	} else if (player_said_2(look, chair))
 		_vm->_dialogs->show(51231);
-	else if (_action.isAction(words_look, words_rope))
+	else if (player_said_2(look, rope))
 		_vm->_dialogs->show(51232);
-	else if (_action.isAction(words_take, words_rope))
+	else if (player_said_2(take, rope))
 		_vm->_dialogs->show(51233);
-	else if (_action.isAction(words_look, words_lamp))
+	else if (player_said_2(look, lamp))
 		_vm->_dialogs->show(51234);
-	else if (_action.isAction(words_walk_behind, words_counter)) {
+	else if (player_said_2(walk_behind, counter)) {
 		// WORKAROUND: Empty handling to prevent default "can't do that" dialogs showing
-	} else if (_action.isAction(words_look, words_counter))
+	} else if (player_said_2(look, counter))
 		_vm->_dialogs->show(51235);
-	else if (_action.isAction(words_look, words_ice_chests))
+	else if (player_said_2(look, ice_chests))
 		_vm->_dialogs->show(51237);
-	else if (_action.isAction(words_open, words_ice_chests))
+	else if (player_said_2(open, ice_chests))
 		_vm->_dialogs->show(51238);
-	else if (_action.isAction(words_look, words_cash_register)) {
+	else if (player_said_2(look, cash_register)) {
 		if (!_globals[kRegisterOpen])
 			_vm->_dialogs->show(51212);
 		else if (_game._objects.isInRoom(OBJ_PADLOCK_KEY))
diff --git a/engines/mads/madsv2/nebular/rooms/room513.cpp b/engines/mads/madsv2/nebular/rooms/room513.cpp
index e6bae07b979..ed896dfde78 100644
--- a/engines/mads/madsv2/nebular/rooms/room513.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room513.cpp
@@ -128,7 +128,7 @@ static void room_513_daemon() {
 }
 
 static void room_513_parser() {
-	if (_action.isAction(words_get_into, words_car)) {
+	if (player_said_2(get_into, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -168,7 +168,7 @@ static void room_513_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_put, words_id_card, words_card_slot) || _action.isAction(words_put, words_fake_id, words_card_slot)) {
+	} else if (player_said_3(put, id_card, card_slot) || player_said_3(put, fake_id, card_slot)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -217,31 +217,31 @@ static void room_513_parser() {
 		default:
 			break;
 		}
-	} else if ((_action._lookFlag) || _action.isAction(words_look, words_street))
+	} else if ((_action._lookFlag) || player_said_2(look, street))
 		_vm->_dialogs->show(51318);
-	else if (_action.isAction(words_look, words_elevator))
+	else if (player_said_2(look, elevator))
 		_vm->_dialogs->show(51310);
-	else if (_action.isAction(words_look, words_elevator_door))
+	else if (player_said_2(look, elevator_door))
 		_vm->_dialogs->show(51311);
-	else if (_action.isAction(words_look, words_card_slot))
+	else if (player_said_2(look, card_slot))
 		_vm->_dialogs->show(51312);
-	else if (_action.isAction(words_look, words_handicap_sign))
+	else if (player_said_2(look, handicap_sign))
 		_vm->_dialogs->show(51313);
-	else if (_action.isAction(words_look, words_bike_rack))
+	else if (player_said_2(look, bike_rack))
 		_vm->_dialogs->show(51314);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(51315);
-	else if (_action.isAction(words_look, words_sign))
+	else if (player_said_2(look, sign))
 		_vm->_dialogs->show(51316);
-	else if (_action.isAction(words_look, words_street_to_west) || _action.isAction(words_walk_down, words_street_to_west))
+	else if (player_said_2(look, street_to_west) || player_said_2(walk_down, street_to_west))
 		_vm->_dialogs->show(51317);
-	else if (_action.isAction(words_open, words_elevator_door) || _action.isAction(words_open, words_elevator))
+	else if (player_said_2(open, elevator_door) || player_said_2(open, elevator))
 		_vm->_dialogs->show(51319);
-	else if (_action.isAction(words_look, words_car))
+	else if (player_said_2(look, car))
 		_vm->_dialogs->show(51321);
-	else if (_action.isAction(words_look, words_brick_wall))
+	else if (player_said_2(look, brick_wall))
 		_vm->_dialogs->show(51322);
-	else if (_action.isAction(words_put, words_security_card, words_card_slot))
+	else if (player_said_3(put, security_card, card_slot))
 		_vm->_dialogs->show(51320);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room551.cpp b/engines/mads/madsv2/nebular/rooms/room551.cpp
index 9f63b44540e..b58ce7ea2dc 100644
--- a/engines/mads/madsv2/nebular/rooms/room551.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room551.cpp
@@ -130,35 +130,35 @@ static void room_551_daemon() {
 }
 
 static void room_551_pre_parser() {
-	if (_action.isAction(words_walk_down) && (_action.isObject(words_street_to_west) || _action.isObject(words_sidewalk_to_west)))
+	if (player_said_1(walk_down) && (player_said_1(street_to_west) || player_said_1(sidewalk_to_west)))
 		_game._player._walkOffScreenSceneId = 501;
 }
 
 static void room_551_parser() {
-	if (_action.isAction(words_step_into, words_teleporter))
+	if (player_said_2(step_into, teleporter))
 		_scene->_nextSceneId = 502;
 	else if ((_action._lookFlag))
 		_vm->_dialogs->show(55117);
-	else if (_action.isAction(words_look, words_skeleton))
+	else if (player_said_2(look, skeleton))
 		_vm->_dialogs->show(55110);
-	else if (_action.isAction(words_look, words_elevator_shaft))
+	else if (player_said_2(look, elevator_shaft))
 		_vm->_dialogs->show(55111);
-	else if (_action.isAction(words_walkto, words_elevator_shaft))
+	else if (player_said_2(walkto, elevator_shaft))
 		_vm->_dialogs->show(55112);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(55113);
-	else if (_action.isAction(words_look, words_teleporter))
+	else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(55114);
-	else if (_action.isAction(words_look, words_sidewalk_to_west)) {
+	else if (player_said_2(look, sidewalk_to_west)) {
 		if (_game._visitedScenes.exists(505))
 			_vm->_dialogs->show(55116);
 		else
 			_vm->_dialogs->show(55115);
-	} else if (_action.isAction(words_look, words_sidewalk))
+	} else if (player_said_2(look, sidewalk))
 		_vm->_dialogs->show(55118);
-	else if (_action.isAction(words_look, words_equipment_overhead))
+	else if (player_said_2(look, equipment_overhead))
 		_vm->_dialogs->show(55119);
-	else if (_action.isAction(words_look, words_railing))
+	else if (player_said_2(look, railing))
 		_vm->_dialogs->show(55120);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room601.cpp b/engines/mads/madsv2/nebular/rooms/room601.cpp
index 77da4396b09..aaea01350b4 100644
--- a/engines/mads/madsv2/nebular/rooms/room601.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room601.cpp
@@ -89,9 +89,9 @@ static void room_601_daemon() {
 }
 
 static void room_601_parser() {
-	if (_action.isAction(words_walk_through, words_entrance))
+	if (player_said_2(walk_through, entrance))
 		_scene->_nextSceneId = 602;
-	else if (_action.isAction(words_get_inside, words_car)) {
+	else if (player_said_2(get_inside, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -130,28 +130,28 @@ static void room_601_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_street)) {
+	} else if (_action._lookFlag || player_said_2(look, street)) {
 		if (!_globals[kLaserHoleIsThere])
 			_vm->_dialogs->show(60110);
 		else
 			_vm->_dialogs->show(60111);
-	} else if (_action.isAction(words_look, words_car))
+	} else if (player_said_2(look, car))
 		_vm->_dialogs->show(60112);
-	else if (_action.isAction(words_look, words_papers))
+	else if (player_said_2(look, papers))
 		_vm->_dialogs->show(60113);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(60114);
-	else if (_action.isAction(words_walk_down, words_street))
+	else if (player_said_2(walk_down, street))
 		_vm->_dialogs->show(60115);
-	else if (_action.isAction(words_look, words_balcony))
+	else if (player_said_2(look, balcony))
 		_vm->_dialogs->show(60116);
-	else if (_action.isAction(words_look, words_entrance))
+	else if (player_said_2(look, entrance))
 		_vm->_dialogs->show(60117);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(60118);
-	else if (_action.isAction(words_look, words_city))
+	else if (player_said_2(look, city))
 		_vm->_dialogs->show(60119);
-	else if (_action.isAction(words_look, words_fountain))
+	else if (player_said_2(look, fountain))
 		_vm->_dialogs->show(60120);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room602.cpp b/engines/mads/madsv2/nebular/rooms/room602.cpp
index c532ad498d7..ac68661e69c 100644
--- a/engines/mads/madsv2/nebular/rooms/room602.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room602.cpp
@@ -201,26 +201,26 @@ static void handleSafeActions() {
 }
 
 static void room_602_parser() {
-	if (_action.isAction(words_walk_through, words_hallway))
+	if (player_said_2(walk_through, hallway))
 		_scene->_nextSceneId = 601;
-	else if (_action.isAction(words_walk_through, words_doorway))
+	else if (player_said_2(walk_through, doorway))
 		_scene->_nextSceneId = 603;
-	else if (_action.isAction(words_open, words_safe) && ((_globals[kSafeStatus] == 0) || (_globals[kSafeStatus] == 2))) {
+	else if (player_said_2(open, safe) && ((_globals[kSafeStatus] == 0) || (_globals[kSafeStatus] == 2))) {
 		local._safeMode = 1;
 		local._cycleIndex = -2;
 		handleSafeActions();
-	} else if (_action.isAction(words_close, words_safe) && ((_globals[kSafeStatus] == 1) || (_globals[kSafeStatus] == 3))) {
+	} else if (player_said_2(close, safe) && ((_globals[kSafeStatus] == 1) || (_globals[kSafeStatus] == 3))) {
 		local._safeMode = 2;
 		local._cycleIndex = -1;
 		handleSafeActions();
-	} else if (_action.isAction(words_unlock, words_combination, words_safe)) {
+	} else if (player_said_3(unlock, combination, safe)) {
 		if ((_globals[kSafeStatus] == 0) && (_game._difficulty != DIFFICULTY_HARD)) {
 			local._safeMode = 3;
 			local._cycleIndex = -2;
 			handleSafeActions();
 		}
-	} else if ((_action.isAction(words_put, words_rearview_mirror, words_laser_beam) || _action.isAction(words_put, words_compact_case, words_laser_beam)
-		|| _action.isAction(words_reflect, words_compact_case, words_laser_beam) || _action.isAction(words_reflect, words_rearview_mirror, words_laser_beam)) && (_globals[kSafeStatus] == 0)) {
+	} else if ((player_said_3(put, rearview_mirror, laser_beam) || player_said_3(put, compact_case, laser_beam)
+		|| player_said_3(reflect, compact_case, laser_beam) || player_said_3(reflect, rearview_mirror, laser_beam)) && (_globals[kSafeStatus] == 0)) {
 		switch (_game._trigger) {
 		case 0:
 			_vm->_dialogs->show(60230);
@@ -258,7 +258,7 @@ static void room_602_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_door_key) && (_game._trigger || _game._objects.isInRoom(OBJ_DOOR_KEY))) {
+	} else if (player_said_2(take, door_key) && (_game._trigger || _game._objects.isInRoom(OBJ_DOOR_KEY))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -289,29 +289,29 @@ static void room_602_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(60210);
-	else if (_action.isAction(words_look, words_floor))
+	else if (player_said_2(look, floor))
 		_vm->_dialogs->show(60211);
-	else if (_action.isAction(words_look, words_hallway))
+	else if (player_said_2(look, hallway))
 		_vm->_dialogs->show(60212);
-	else if (_action.isAction(words_look, words_table))
+	else if (player_said_2(look, table))
 		_vm->_dialogs->show(60213);
-	else if (_action.isAction(words_look, words_chair) || _action.isAction(words_look, words_lounge_chair))
+	else if (player_said_2(look, chair) || player_said_2(look, lounge_chair))
 		_vm->_dialogs->show(60214);
-	else if (_action.isAction(words_look, words_neon_lights))
+	else if (player_said_2(look, neon_lights))
 		_vm->_dialogs->show(60215);
-	else if (_action.isAction(words_look, words_fireplace))
+	else if (player_said_2(look, fireplace))
 		_vm->_dialogs->show(60216);
-	else if (_action.isAction(words_look, words_picture))
+	else if (player_said_2(look, picture))
 		_vm->_dialogs->show(60217);
-	else if (_action.isAction(words_look, words_lamp))
+	else if (player_said_2(look, lamp))
 		_vm->_dialogs->show(60218);
-	else if (_action.isAction(words_look, words_masks))
+	else if (player_said_2(look, masks))
 		_vm->_dialogs->show(60219);
-	else if (_action.isAction(words_look, words_glass_block_wall))
+	else if (player_said_2(look, glass_block_wall))
 		_vm->_dialogs->show(60220);
-	else if (_action.isAction(words_look, words_doorway))
+	else if (player_said_2(look, doorway))
 		_vm->_dialogs->show(60221);
-	else if (_action.isAction(words_look, words_safe)) {
+	else if (player_said_2(look, safe)) {
 		if (_globals[kSafeStatus] == 0)
 			_vm->_dialogs->show(60222);
 		else if (_globals[kSafeStatus] == 1) {
@@ -325,21 +325,21 @@ static void room_602_parser() {
 			_vm->_dialogs->show(60235);
 		else
 			_vm->_dialogs->show(60236);
-	} else if (_action.isAction(words_unlock, words_door_key, words_safe) || _action.isAction(words_unlock, words_padlock_key, words_safe))
+	} else if (player_said_3(unlock, door_key, safe) || player_said_3(unlock, padlock_key, safe))
 		_vm->_dialogs->show(60225);
-	else if (_action.isAction(words_pull, words_safe))
+	else if (player_said_2(pull, safe))
 		_vm->_dialogs->show(60226);
-	else if (_action.isAction(words_put, words_fireplace) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
+	else if (player_said_2(put, fireplace) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
 		_vm->_dialogs->show(60227);
-	else if (_action.isAction(words_look, words_hole))
+	else if (player_said_2(look, hole))
 		_vm->_dialogs->show(60228);
-	else if (_action.isAction(words_look, words_laser_beam))
+	else if (player_said_2(look, laser_beam))
 		_vm->_dialogs->show(60229);
-	else if (_action.isAction(words_look, words_flower_box))
+	else if (player_said_2(look, flower_box))
 		_vm->_dialogs->show(60231);
-	else if (_action.isAction(words_throw, words_bomb, words_safe) || _action.isAction(words_throw, words_bombs, words_safe))
+	else if (player_said_3(throw, bomb, safe) || player_said_3(throw, bombs, safe))
 		_vm->_dialogs->show(60232);
-	else if (_action.isAction(words_put, words_timebomb))
+	else if (player_said_2(put, timebomb))
 		_vm->_dialogs->show(60233);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room603.cpp b/engines/mads/madsv2/nebular/rooms/room603.cpp
index 68f3bb6e8bb..1754edc528d 100644
--- a/engines/mads/madsv2/nebular/rooms/room603.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room603.cpp
@@ -66,9 +66,9 @@ static void room_603_init() {
 }
 
 static void room_603_parser() {
-	if (_action.isAction(words_walk_towards, words_livingroom))
+	if (player_said_2(walk_towards, livingroom))
 		_scene->_nextSceneId = 602;
-	else if (_action.isAction(words_take, words_compact_case)) {
+	else if (player_said_2(take, compact_case)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_COMPACT_CASE)) {
 			switch (_game._trigger) {
 			case 0:
@@ -99,7 +99,7 @@ static void room_603_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_take, words_note)) {
+	} else if (player_said_2(take, note)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_NOTE)) {
 			if (_game._trigger == 0) {
 				_game._player._stepEnabled = false;
@@ -121,49 +121,49 @@ static void room_603_parser() {
 			_vm->_dialogs->show(60323);
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(60310);
-	else if (_action.isAction(words_look, words_bed))
+	else if (player_said_2(look, bed))
 		_vm->_dialogs->show(60311);
-	else if (_action.isAction(words_look, words_wig_stand))
+	else if (player_said_2(look, wig_stand))
 		_vm->_dialogs->show(60312);
-	else if (_action.isAction(words_take, words_wig_stand))
+	else if (player_said_2(take, wig_stand))
 		_vm->_dialogs->show(60313);
-	else if (_action.isAction(words_look, words_review))
+	else if (player_said_2(look, review))
 		_vm->_dialogs->show(60314);
-	else if (_action.isAction(words_look, words_souvenir_tickets))
+	else if (player_said_2(look, souvenir_tickets))
 		_vm->_dialogs->show(60315);
-	else if (_action.isAction(words_look, words_photograph))
+	else if (player_said_2(look, photograph))
 		_vm->_dialogs->show(60316);
-	else if (_action.isAction(words_look, words_lamp))
+	else if (player_said_2(look, lamp))
 		_vm->_dialogs->show(60317);
-	else if (_action.isAction(words_look, words_directors_slate) || _action.isAction(words_look, words_crop) || _action.isAction(words_look, words_megaphone))
+	else if (player_said_2(look, directors_slate) || player_said_2(look, crop) || player_said_2(look, megaphone))
 		_vm->_dialogs->show(60318);
-	else if (_action.isAction(words_look, words_snapshot))
+	else if (player_said_2(look, snapshot))
 		_vm->_dialogs->show(60319);
-	else if (_action.isAction(words_take, words_snapshot))
+	else if (player_said_2(take, snapshot))
 		_vm->_dialogs->show(60320);
-	else if (_action.isAction(words_look, words_perfume))
+	else if (player_said_2(look, perfume))
 		_vm->_dialogs->show(60321);
-	else if (_action.isAction(words_take, words_perfume))
+	else if (player_said_2(take, perfume))
 		_vm->_dialogs->show(60322);
-	else if (_action.isAction(words_look, words_note)) {
+	else if (player_said_2(look, note)) {
 		if (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(60324);
-	} else if (_action.isAction(words_look, words_corner_table)) {
+	} else if (player_said_2(look, corner_table)) {
 		if (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(60326);
 		else
 			_vm->_dialogs->show(60325);
-	} else if (_action.isAction(words_look, words_vanity)) {
+	} else if (player_said_2(look, vanity)) {
 		if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(60327);
 		else
 			_vm->_dialogs->show(60328);
-	} else if (_action.isAction(words_look, words_compact_case) && (_action._mainObjectSource == CAT_HOTSPOT))
+	} else if (player_said_2(look, compact_case) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(60329);
 	// For the next two checks, the second part of the check wasn't surrounded par parenthesis, which was obviously wrong
-	else if (_action.isAction(words_look) && (_action.isObject(words_bra) || _action.isObject(words_boa) || _action.isObject(words_slip)))
+	else if (player_said_1(look) && (player_said_1(bra) || player_said_1(boa) || player_said_1(slip)))
 		_vm->_dialogs->show(60331);
-	else if (_action.isAction(words_take) && (_action.isObject(words_bra) || _action.isObject(words_boa) || _action.isObject(words_slip)))
+	else if (player_said_1(take) && (player_said_1(bra) || player_said_1(boa) || player_said_1(slip)))
 		_vm->_dialogs->show(60332);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room604.cpp b/engines/mads/madsv2/nebular/rooms/room604.cpp
index d46a666e5fb..65d73c78add 100644
--- a/engines/mads/madsv2/nebular/rooms/room604.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room604.cpp
@@ -217,7 +217,7 @@ static void handleBombActions() {
 }
 
 static void room_604_parser() {
-	if (_action.isAction(words_get_inside, words_car)) {
+	if (player_said_2(get_inside, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -257,10 +257,10 @@ static void room_604_parser() {
 		default:
 			break;
 		}
-	} else if ((_action.isAction(words_put, words_ledge) || _action.isAction(words_put, words_viewport) || _action.isAction(words_throw, words_viewport))
-		&& (_action.isObject(words_bomb) || _action.isObject(words_bombs)))
+	} else if ((player_said_2(put, ledge) || player_said_2(put, viewport) || player_said_2(throw, viewport))
+		&& (player_said_1(bomb) || player_said_1(bombs)))
 		_vm->_dialogs->show(60420);
-	else if (_action.isAction(words_put, words_timebomb, words_ledge) || _action.isAction(words_put, words_timebomb, words_viewport)) {
+	else if (player_said_3(put, timebomb, ledge) || player_said_3(put, timebomb, viewport)) {
 		local._bombMode = 1;
 		if ((_game._difficulty == DIFFICULTY_HARD) || _globals[kWarnedFloodCity])
 			handleBombActions();
@@ -279,30 +279,30 @@ static void room_604_parser() {
 			_vm->_dialogs->show(60425);
 			_globals[kWarnedFloodCity] = true;
 		}
-	} else if (_action.isAction(words_take, words_timebomb)) {
+	} else if (player_said_2(take, timebomb)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_TIMEBOMB)) {
 			local._bombMode = 2;
 			handleBombActions();
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(60411);
-	else if (_action.isAction(words_look, words_viewport)) {
+	else if (player_said_2(look, viewport)) {
 		if (local._monsterActive) {
 			_vm->_dialogs->show(60413);
 		} else {
 			_vm->_dialogs->show(60412);
 		}
-	} else if (_action.isAction(words_look, words_wall))
+	} else if (player_said_2(look, wall))
 		_vm->_dialogs->show(60414);
-	else if (_action.isAction(words_look, words_vent))
+	else if (player_said_2(look, vent))
 		_vm->_dialogs->show(60415);
-	else if (_action.isAction(words_look, words_indicator))
+	else if (player_said_2(look, indicator))
 		_vm->_dialogs->show(60416);
-	else if (_action.isAction(words_look, words_sculpture))
+	else if (player_said_2(look, sculpture))
 		_vm->_dialogs->show(60417);
-	else if (_action.isAction(words_look, words_car))
+	else if (player_said_2(look, car))
 		_vm->_dialogs->show(60418);
-	else if (_action.isAction(words_look, words_fountain))
+	else if (player_said_2(look, fountain))
 		_vm->_dialogs->show(60419);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room607.cpp b/engines/mads/madsv2/nebular/rooms/room607.cpp
index 3dbed431aa3..568ec84c9cc 100644
--- a/engines/mads/madsv2/nebular/rooms/room607.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room607.cpp
@@ -352,25 +352,25 @@ static void handleThrowingBone() {
 }
 
 static void room_607_pre_parser() {
-	if (_action.isAction(words_talkto, words_obnoxious_dog))
+	if (player_said_2(talkto, obnoxious_dog))
 		_game._player._needToWalk = false;
 
-	if (_action.isAction(words_walk_through, words_side_entrance) && (_globals[kDogStatus] == DOG_LEFT) && (_game._difficulty != DIFFICULTY_EASY)) {
+	if (player_said_2(walk_through, side_entrance) && (_globals[kDogStatus] == DOG_LEFT) && (_game._difficulty != DIFFICULTY_EASY)) {
 		local._shopAvailable = true;
 		local._dogTimer = 0;
 	}
 
-	if (_action.isAction(words_throw, words_bones, words_obnoxious_dog) || _action.isAction(words_throw, words_bone, words_obnoxious_dog))
+	if (player_said_3(throw, bones, obnoxious_dog) || player_said_3(throw, bone, obnoxious_dog))
 		_game._player.walk(Common::Point(193, 100), FACING_NORTHEAST);
 
-	if (_action.isAction(words_throw, words_bones, words_fence) || _action.isAction(words_throw, words_bone, words_fence))
+	if (player_said_3(throw, bones, fence) || player_said_3(throw, bone, fence))
 		_game._player.walk(Common::Point(201, 107), FACING_SOUTHEAST);
 }
 
 static void room_607_parser() {
-	if (_action.isAction(words_walk_through, words_side_entrance))
+	if (player_said_2(walk_through, side_entrance))
 		_scene->_nextSceneId = 608;
-	else if (_action.isAction(words_get_inside, words_car)) {
+	else if (player_said_2(get_inside, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -409,7 +409,7 @@ static void room_607_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_throw, words_bones, words_obnoxious_dog) || _action.isAction(words_throw, words_bone, words_obnoxious_dog)) {
+	} else if (player_said_3(throw, bones, obnoxious_dog) || player_said_3(throw, bone, obnoxious_dog)) {
 		if (_game._difficulty != DIFFICULTY_EASY) {
 			local._animationMode = 1;
 			_scene->_kernelMessages.reset();
@@ -418,7 +418,7 @@ static void room_607_parser() {
 
 			handleThrowingBone();
 		}
-	} else if ((_action.isAction(words_throw, words_bones, words_fence) || _action.isAction(words_throw, words_bone, words_fence)) && (_game._difficulty != DIFFICULTY_EASY)
+	} else if ((player_said_3(throw, bones, fence) || player_said_3(throw, bone, fence)) && (_game._difficulty != DIFFICULTY_EASY)
 		&& ((_globals[kDogStatus] == DOG_PRESENT) || _game._trigger)) {
 		local._animationMode = 2;
 		if (_game._trigger == 0) {
@@ -426,50 +426,50 @@ static void room_607_parser() {
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
 		}
 		handleThrowingBone();
-	} else if (_action._lookFlag || _action.isAction(words_look, words_street)) {
+	} else if (_action._lookFlag || player_said_2(look, street)) {
 		if ((_globals[kDogStatus] == DOG_PRESENT) || (_game._difficulty == DIFFICULTY_EASY))
 			_vm->_dialogs->show(60710);
 		else
 			_vm->_dialogs->show(60711);
-	} else if (_action.isAction(words_look, words_wall))
+	} else if (player_said_2(look, wall))
 		_vm->_dialogs->show(60712);
-	else if (_action.isAction(words_look, words_fence))
+	else if (player_said_2(look, fence))
 		_vm->_dialogs->show(60713);
-	else if (_action.isAction(words_look, words_car))
+	else if (player_said_2(look, car))
 		_vm->_dialogs->show(60714);
-	else if (_action.isAction(words_look, words_manhole))
+	else if (player_said_2(look, manhole))
 		_vm->_dialogs->show(60715);
-	else if (_action.isAction(words_look, words_fire_hydrant) && (_globals[kDogStatus] == DOG_PRESENT))
+	else if (player_said_2(look, fire_hydrant) && (_globals[kDogStatus] == DOG_PRESENT))
 		_vm->_dialogs->show(60716);
-	else if (_action.isAction(words_look, words_sign))
+	else if (player_said_2(look, sign))
 		_vm->_dialogs->show(60717);
-	else if (_action.isAction(words_look, words_broken_window))
+	else if (player_said_2(look, broken_window))
 		_vm->_dialogs->show(60718);
-	else if (_action.isAction(words_look, words_garage_door))
+	else if (player_said_2(look, garage_door))
 		_vm->_dialogs->show(60719);
-	else if (_action.isAction(words_look, words_sidewalk))
+	else if (player_said_2(look, sidewalk))
 		_vm->_dialogs->show(60720);
-	else if (_action.isAction(words_look, words_air_hose))
+	else if (player_said_2(look, air_hose))
 		_vm->_dialogs->show(60721);
-	else if (_action.isAction(words_look, words_auto_shop)) {
+	else if (player_said_2(look, auto_shop)) {
 		if (_globals[kDogStatus] == DOG_PRESENT)
 			_vm->_dialogs->show(60723);
 		else
 			_vm->_dialogs->show(60722);
-	} else if (_action.isAction(words_look, words_side_entrance)) {
+	} else if (player_said_2(look, side_entrance)) {
 		if (_globals[kDogStatus] == DOG_PRESENT)
 			_vm->_dialogs->show(60725);
 		else
 			_vm->_dialogs->show(60724);
-	} else if (_action.isAction(words_look, words_obnoxious_dog))
+	} else if (player_said_2(look, obnoxious_dog))
 		_vm->_dialogs->show(60726);
-	else if (_action.isAction(words_talkto, words_obnoxious_dog))
+	else if (player_said_2(talkto, obnoxious_dog))
 		_vm->_dialogs->show(60727);
-	else if (_action.isAction(words_look, words_barricade))
+	else if (player_said_2(look, barricade))
 		_vm->_dialogs->show(60728);
-	else if (_action.isAction(words_walk_down, words_street))
+	else if (player_said_2(walk_down, street))
 		_vm->_dialogs->show(60730);
-	else if (_action.isObject(words_garage_door) && (_action.isAction(words_open) || _action.isAction(words_push) || _action.isAction(words_pull)))
+	else if (player_said_1(garage_door) && (player_said_1(open) || player_said_1(push) || player_said_1(pull)))
 		_vm->_dialogs->show(60731);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room608.cpp b/engines/mads/madsv2/nebular/rooms/room608.cpp
index f81914f6459..a24f3a669b5 100644
--- a/engines/mads/madsv2/nebular/rooms/room608.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room608.cpp
@@ -684,20 +684,20 @@ static void room_608_daemon() {
 static void room_608_pre_parser() {
 	_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 
-	if ((_action.isAction(words_throw, words_bone, words_rear_of_garage) || _action.isAction(words_throw, words_bones, words_rear_of_garage)
-		|| _action.isAction(words_throw, words_bone, words_front_of_garage) || _action.isAction(words_throw, words_bones, words_front_of_garage)
-		|| _action.isAction(words_throw, words_bones, words_obnoxious_dog) || _action.isAction(words_throw, words_bone, words_obnoxious_dog)) && local._dogActiveFl) {
+	if ((player_said_3(throw, bone, rear_of_garage) || player_said_3(throw, bones, rear_of_garage)
+		|| player_said_3(throw, bone, front_of_garage) || player_said_3(throw, bones, front_of_garage)
+		|| player_said_3(throw, bones, obnoxious_dog) || player_said_3(throw, bone, obnoxious_dog)) && local._dogActiveFl) {
 		_game._player._stepEnabled = false;
 		_game._player.walk(Common::Point(56, 146), FACING_EAST);
 	}
 
-	if ((_action.isAction(words_throw, words_bones, words_area_behind_car) || _action.isAction(words_throw, words_bone, words_area_behind_car)
-		|| _action.isAction(words_throw, words_bones, words_danger_zone) || _action.isAction(words_throw, words_bone, words_danger_zone)) && local._dogActiveFl) {
+	if ((player_said_3(throw, bones, area_behind_car) || player_said_3(throw, bone, area_behind_car)
+		|| player_said_3(throw, bones, danger_zone) || player_said_3(throw, bone, danger_zone)) && local._dogActiveFl) {
 		_game._player._stepEnabled = false;
 		_game._player.walk(Common::Point(75, 136), FACING_EAST);
 	}
 
-	if (_action.isAction(words_push, words_down_button) && local._dogUnderCar) {
+	if (player_said_2(push, down_button) && local._dogUnderCar) {
 		local._buttonPressedonTimeFl = true;
 		local._dogDeathMode = 1;
 	} else
@@ -705,9 +705,9 @@ static void room_608_pre_parser() {
 }
 
 static void room_608_parser() {
-	if (_action.isAction(words_walk_through, words_doorway))
+	if (player_said_2(walk_through, doorway))
 		_scene->_nextSceneId = 607;
-	else if (_action.isAction(words_push, words_down_button)) {
+	else if (player_said_2(push, down_button)) {
 		_game._player._stepEnabled = true;
 		switch (_game._trigger) {
 		case 0:
@@ -782,7 +782,7 @@ static void room_608_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_push, words_up_button)) {
+	} else if (player_said_2(push, up_button)) {
 		switch (_game._trigger) {
 		case 0:
 			if ((_globals[kCarStatus] == CAR_DOWN) || (_globals[kCarStatus] == CAR_DOWN_ON_SQUASHED_DOG)) {
@@ -832,8 +832,8 @@ static void room_608_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_throw, words_bone, words_rear_of_garage) || _action.isAction(words_throw, words_bones, words_rear_of_garage)
-		|| _action.isAction(words_throw, words_bones, words_obnoxious_dog) || _action.isAction(words_throw, words_bone, words_obnoxious_dog)) {
+	} else if (player_said_3(throw, bone, rear_of_garage) || player_said_3(throw, bones, rear_of_garage)
+		|| player_said_3(throw, bones, obnoxious_dog) || player_said_3(throw, bone, obnoxious_dog)) {
 		_game._player._stepEnabled = true;
 		if (local._dogActiveFl) {
 			if (_game._trigger == 0) {
@@ -844,7 +844,7 @@ static void room_608_parser() {
 			handleThrowingBone();
 		} else
 			_vm->_dialogs->show(60841);
-	} else if (_action.isAction(words_throw, words_bone, words_front_of_garage) || _action.isAction(words_throw, words_bones, words_front_of_garage)) {
+	} else if (player_said_3(throw, bone, front_of_garage) || player_said_3(throw, bones, front_of_garage)) {
 		_game._player._stepEnabled = true;
 		if (local._dogActiveFl) {
 			if (_game._trigger == 0) {
@@ -855,8 +855,8 @@ static void room_608_parser() {
 			handleThrowingBone();
 		} else
 			_vm->_dialogs->show(60841);
-	} else if (_action.isAction(words_throw, words_bones, words_area_behind_car) || _action.isAction(words_throw, words_bone, words_area_behind_car)
-		|| _action.isAction(words_throw, words_bones, words_danger_zone) || _action.isAction(words_throw, words_bone, words_danger_zone)) {
+	} else if (player_said_3(throw, bones, area_behind_car) || player_said_3(throw, bone, area_behind_car)
+		|| player_said_3(throw, bones, danger_zone) || player_said_3(throw, bone, danger_zone)) {
 		_game._player._stepEnabled = true;
 		if ((_globals[kCarStatus] == CAR_UP) && local._dogActiveFl) {
 			if (local._dogActiveFl) {
@@ -870,7 +870,7 @@ static void room_608_parser() {
 				_vm->_dialogs->show(60841);
 		} else
 			_vm->_dialogs->show(60842);
-	} else if (_action.isAction(words_take, words_polycement) && (_game._trigger || !_game._objects.isInInventory(OBJ_POLYCEMENT))) {
+	} else if (player_said_2(take, polycement) && (_game._trigger || !_game._objects.isInInventory(OBJ_POLYCEMENT))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -898,7 +898,7 @@ static void room_608_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_rearview_mirror) && (_game._trigger || !_game._objects.isInInventory(OBJ_REARVIEW_MIRROR))) {
+	} else if (player_said_2(take, rearview_mirror) && (_game._trigger || !_game._objects.isInInventory(OBJ_REARVIEW_MIRROR))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -933,57 +933,57 @@ static void room_608_parser() {
 			_vm->_dialogs->show(60812);
 		else
 			_vm->_dialogs->show(60811);
-	} else if (_action.isAction(words_look) && (_action.isObject(words_muffler) || _action.isObject(words_car_seat) || _action.isObject(words_hubcap)
-		|| _action.isObject(words_coils) || _action.isObject(words_quarter_panel)))
+	} else if (player_said_1(look) && (player_said_1(muffler) || player_said_1(car_seat) || player_said_1(hubcap)
+		|| player_said_1(coils) || player_said_1(quarter_panel)))
 		_vm->_dialogs->show(60813);
-	else if (_action.isAction(words_take) && (_action.isObject(words_muffler) || _action.isObject(words_car_seat) || _action.isObject(words_hubcap)
-		|| _action.isObject(words_coils) || _action.isObject(words_quarter_panel)))
+	else if (player_said_1(take) && (player_said_1(muffler) || player_said_1(car_seat) || player_said_1(hubcap)
+		|| player_said_1(coils) || player_said_1(quarter_panel)))
 		_vm->_dialogs->show(60814);
-	else if (_action.isAction(words_look, words_garage_floor) || _action.isAction(words_look, words_front_of_garage) || _action.isAction(words_look, words_rear_of_garage)) {
+	else if (player_said_2(look, garage_floor) || player_said_2(look, front_of_garage) || player_said_2(look, rear_of_garage)) {
 		if (local._dogActiveFl)
 			_vm->_dialogs->show(60815);
 		else
 			_vm->_dialogs->show(60816);
-	} else if (_action.isAction(words_look, words_spare_ribs))
+	} else if (player_said_2(look, spare_ribs))
 		_vm->_dialogs->show(60817);
-	else if (_action.isAction(words_take, words_spare_ribs)) {
+	else if (player_said_2(take, spare_ribs)) {
 		if (_game._difficulty == DIFFICULTY_HARD)
 			_vm->_dialogs->show(60818);
 		else
 			_vm->_dialogs->show(60819);
-	} else if (_action.isAction(words_look, words_up_button))
+	} else if (player_said_2(look, up_button))
 		_vm->_dialogs->show(60820);
-	else if (_action.isAction(words_look, words_down_button))
+	else if (player_said_2(look, down_button))
 		_vm->_dialogs->show(60821);
-	else if (_action.isAction(words_look, words_trash_can))
+	else if (player_said_2(look, trash_can))
 		_vm->_dialogs->show(60822);
-	else if (_action.isAction(words_look, words_calendar))
+	else if (player_said_2(look, calendar))
 		_vm->_dialogs->show(60823);
-	else if (_action.isAction(words_look, words_storage_box)) {
+	else if (player_said_2(look, storage_box)) {
 		if (_game._objects[OBJ_REARVIEW_MIRROR]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(60825);
 		else
 			_vm->_dialogs->show(60824);
-	} else if (_action.isAction(words_open, words_storage_box))
+	} else if (player_said_2(open, storage_box))
 		_vm->_dialogs->show(60826);
-	else if (_action.isAction(words_look, words_rearview_mirror) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, rearview_mirror) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(60828);
-	else if (_action.isAction(words_look, words_tool_box)) {
+	else if (player_said_2(look, tool_box)) {
 		if (_game._objects[OBJ_POLYCEMENT]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(60829);
 		else
 			_vm->_dialogs->show(60830);
-	} else if (_action.isAction(words_open, words_tool_box))
+	} else if (player_said_2(open, tool_box))
 		_vm->_dialogs->show(60831);
-	else if ((_action.isAction(words_look, words_polycement)) && (_game._objects.isInRoom(OBJ_POLYCEMENT)))
+	else if ((player_said_2(look, polycement)) && (_game._objects.isInRoom(OBJ_POLYCEMENT)))
 		_vm->_dialogs->show(60832);
-	else if (_action.isAction(words_look, words_grease_can) || _action.isAction(words_look, words_oil_can))
+	else if (player_said_2(look, grease_can) || player_said_2(look, oil_can))
 		_vm->_dialogs->show(60834);
-	else if (_action.isAction(words_look, words_car_lift))
+	else if (player_said_2(look, car_lift))
 		_vm->_dialogs->show(60835);
-	else if (_action.isAction(words_look, words_chair) || _action.isAction(words_look, words_hat))
+	else if (player_said_2(look, chair) || player_said_2(look, hat))
 		_vm->_dialogs->show(60836);
-	else if (_action.isAction(words_look, words_danger_zone))
+	else if (player_said_2(look, danger_zone))
 		_vm->_dialogs->show(60838);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room609.cpp b/engines/mads/madsv2/nebular/rooms/room609.cpp
index 62a21941349..cb5aa9778a4 100644
--- a/engines/mads/madsv2/nebular/rooms/room609.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room609.cpp
@@ -237,14 +237,14 @@ static void enterStore() {
 }
 
 static void room_609_pre_parser() {
-	if (_action.isAction(words_unlock, words_door_key, words_video_store_door))
+	if (player_said_3(unlock, door_key, video_store_door))
 		_game._player.walk(Common::Point(78, 99), FACING_NORTHWEST);
 }
 
 static void room_609_parser() {
-	if (_action.isAction(words_walk_towards, words_alley))
+	if (player_said_2(walk_towards, alley))
 		_scene->_nextSceneId = 611;
-	else if (_action.isAction(words_walk_through, words_video_store_door)) {
+	else if (player_said_2(walk_through, video_store_door)) {
 		if (!_globals[kBeenInVideoStore]) {
 			switch (_game._trigger) {
 			case 0:
@@ -285,10 +285,10 @@ static void room_609_parser() {
 			local._videoDoorMode = 2;
 			enterStore();
 		}
-	} else if (_action.isAction(words_unlock, words_door_key, words_video_store_door)) {
+	} else if (player_said_3(unlock, door_key, video_store_door)) {
 		local._videoDoorMode = 1;
 		enterStore();
-	} else if (_action.isAction(words_get_inside, words_car)) {
+	} else if (player_said_2(get_inside, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -330,26 +330,26 @@ static void room_609_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(60910);
-	else if (_action.isAction(words_look, words_street))
+	else if (player_said_2(look, street))
 		_vm->_dialogs->show(60911);
-	else if (_action.isAction(words_look, words_spot_a_pot))
+	else if (player_said_2(look, spot_a_pot))
 		_vm->_dialogs->show(60912);
-	else if (_action.isAction(words_look, words_video_store))
+	else if (player_said_2(look, video_store))
 		_vm->_dialogs->show(60913);
-	else if (_action.isAction(words_look, words_billboard))
+	else if (player_said_2(look, billboard))
 		_vm->_dialogs->show(60914);
-	else if (_action.isAction(words_look, words_statue))
+	else if (player_said_2(look, statue))
 		_vm->_dialogs->show(60915);
-	else if (_action.isAction(words_look, words_car))
+	else if (player_said_2(look, car))
 		_vm->_dialogs->show(60916);
-	else if (_action.isAction(words_look, words_newsstand))
+	else if (player_said_2(look, newsstand))
 		_vm->_dialogs->show(60917);
-	else if (_action.isAction(words_look, words_video_store_door)) {
+	else if (player_said_2(look, video_store_door)) {
 		if (!_globals[kBeenInVideoStore])
 			_vm->_dialogs->show(60918);
 		else
 			_vm->_dialogs->show(60919);
-	} else if (_action.isAction(words_walk_down, words_street))
+	} else if (player_said_2(walk_down, street))
 		_vm->_dialogs->show(60730);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room610.cpp b/engines/mads/madsv2/nebular/rooms/room610.cpp
index 03e86f23c8c..102747cd934 100644
--- a/engines/mads/madsv2/nebular/rooms/room610.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room610.cpp
@@ -98,9 +98,9 @@ static void room_610_daemon() {
 }
 
 static void room_610_parser() {
-	if (_action.isAction(words_exit_from, words_video_store))
+	if (player_said_2(exit_from, video_store))
 		_scene->_nextSceneId = 609;
-	else if (_action.isAction(words_take, words_phone_handset)) {
+	else if (player_said_2(take, phone_handset)) {
 		if (_game._trigger || !_game._objects.isInInventory(OBJ_PHONE_HANDSET)) {
 			switch (_game._trigger) {
 			case 0:
@@ -131,7 +131,7 @@ static void room_610_parser() {
 				break;
 			}
 		}
-	} else if (_action.isAction(words_put, words_phone_handset, words_phone_cradle)) {
+	} else if (player_said_3(put, phone_handset, phone_cradle)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -163,51 +163,51 @@ static void room_610_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_look, words_pippy_billboard))
+	} else if (player_said_2(look, pippy_billboard))
 		_vm->_dialogs->show(61010);
-	else if (_action.isAction(words_look, words_civilization_ad))
+	else if (player_said_2(look, civilization_ad))
 		_vm->_dialogs->show(61011);
-	else if (_action.isAction(words_look, words_marx_bros_poster))
+	else if (player_said_2(look, marx_bros_poster))
 		_vm->_dialogs->show(61012);
-	else if (_action.isAction(words_look, words_video_monitor))
+	else if (player_said_2(look, video_monitor))
 		_vm->_dialogs->show(61013);
-	else if (_action.isAction(words_look, words_video_store))
+	else if (player_said_2(look, video_store))
 		_vm->_dialogs->show(61014);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(61015);
-	else if (_action.isAction(words_look, words_logo))
+	else if (player_said_2(look, logo))
 		_vm->_dialogs->show(61018);
-	else if (_action.isAction(words_look, words_cement)) {
+	else if (player_said_2(look, cement)) {
 		if (_game._visitedScenes.exists(601))
 			_vm->_dialogs->show(61020);
 		else
 			_vm->_dialogs->show(61019);
-	} else if (_action.isAction(words_look, words_counter))
+	} else if (player_said_2(look, counter))
 		_vm->_dialogs->show(61021);
-	else if (_action.isAction(words_look, words_phone_antenna))
+	else if (player_said_2(look, phone_antenna))
 		_vm->_dialogs->show(61022);
-	else if (_action.isAction(words_look, words_smelly_sneaker))
+	else if (player_said_2(look, smelly_sneaker))
 		_vm->_dialogs->show(61023);
-	else if (_action.isAction(words_take, words_smelly_sneaker))
+	else if (player_said_2(take, smelly_sneaker))
 		_vm->_dialogs->show(61024);
-	else if (_action.isAction(words_look, words_spotlight))
+	else if (player_said_2(look, spotlight))
 		_vm->_dialogs->show(61025);
-	else if (_action.isAction(words_look, words_phone_handset) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, phone_handset) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(61026);
-	else if (_action.isAction(words_look, words_phone_cradle))
+	else if (player_said_2(look, phone_cradle))
 		_vm->_dialogs->show(61027);
-	else if (_action.isAction(words_look, words_return_slot))
+	else if (player_said_2(look, return_slot))
 		_vm->_dialogs->show(61028);
-	else if (_action.isAction(words_put, words_return_slot)
+	else if (player_said_2(put, return_slot)
 		&& _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
 		_vm->_dialogs->show(61029);
-	else if (_action.isObject(words_classic_videos) || _action.isObject(words_more_classic_videos) || _action.isObject(words_drama_videos)
-		|| _action.isObject(words_new_release_videos) || _action.isObject(words_porno_videos) || _action.isObject(words_educational_videos)
-		|| _action.isObject(words_instructional_videos) || _action.isObject(words_workout_videos) || _action.isObject(words_foreign_videos)
-		|| _action.isObject(words_adventure_videos) || _action.isObject(words_comedy_videos)) {
-		if (_action.isAction(words_look))
+	else if (player_said_1(classic_videos) || player_said_1(more_classic_videos) || player_said_1(drama_videos)
+		|| player_said_1(new_release_videos) || player_said_1(porno_videos) || player_said_1(educational_videos)
+		|| player_said_1(instructional_videos) || player_said_1(workout_videos) || player_said_1(foreign_videos)
+		|| player_said_1(adventure_videos) || player_said_1(comedy_videos)) {
+		if (player_said_1(look))
 			_vm->_dialogs->show(61030);
-		else if (_action.isAction(words_take))
+		else if (player_said_1(take))
 			_vm->_dialogs->show(61031);
 		else
 			return;
diff --git a/engines/mads/madsv2/nebular/rooms/room611.cpp b/engines/mads/madsv2/nebular/rooms/room611.cpp
index 051a2e84393..07018bc50ec 100644
--- a/engines/mads/madsv2/nebular/rooms/room611.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room611.cpp
@@ -1331,7 +1331,7 @@ static void room_611_daemon() {
 }
 
 static void room_611_pre_parser() {
-	if (_action.isAction(words_walk_down, words_alley))
+	if (player_said_2(walk_down, alley))
 		_game._player._walkOffScreenSceneId = 609;
 
 	if (local._resetBatterieText)
@@ -1341,11 +1341,11 @@ static void room_611_pre_parser() {
 static void room_611_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleDialog();
-	else if ((_action.isAction(words_give, words_phone_cells, words_hermit)) || (_action.isAction(words_give, words_durafail_cells, words_hermit))) {
+	else if ((player_said_3(give, phone_cells, hermit)) || (player_said_3(give, durafail_cells, hermit))) {
 		_action._activeAction._verbId = 0x294;
 		local._giveBatteriesFl = true;
 		handleSubDialog1();
-	} else if (_action.isAction(words_give, words_hermit)) {
+	} else if (player_said_2(give, hermit)) {
 		_scene->_kernelMessages.reset();
 
 		const char *curQuote = _game.getQuote(0x323);
@@ -1383,7 +1383,7 @@ static void room_611_parser() {
 			local._dialog2.start();
 			local._duringDialogFl = true;
 		}
-	} else if (_action.isAction(words_talkto, words_hermit)) {
+	} else if (player_said_2(talkto, hermit)) {
 		if (!local._dialog1.read(0x287)) {
 			_scene->_kernelMessages.reset();
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x27A));
@@ -1410,7 +1410,7 @@ static void room_611_parser() {
 			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(nextQuote));
 			_scene->_sequences.addTimer(120, 90);
 		}
-	} else if ((_action.isAction(words_walkto) || _action.isAction(words_look)) && _action.isObject(words_rat)) {
+	} else if ((player_said_1(walkto) || player_said_1(look)) && player_said_1(rat)) {
 		switch (_game._trigger) {
 		case 0:
 			_scene->_kernelMessages.reset();
@@ -1431,29 +1431,29 @@ static void room_611_parser() {
 			_vm->_dialogs->show(61111);
 		else
 			_vm->_dialogs->show(61110);
-	} else if (_action.isAction(words_look, words_hermit))
+	} else if (player_said_2(look, hermit))
 		_vm->_dialogs->show(61112);
-	else if (_action.isAction(words_look, words_trash))
+	else if (player_said_2(look, trash))
 		_vm->_dialogs->show(61113);
-	else if (_action.isAction(words_take, words_trash))
+	else if (player_said_2(take, trash))
 		_vm->_dialogs->show(61114);
-	else if (_action.isAction(words_look, words_cardboard_box))
+	else if (player_said_2(look, cardboard_box))
 		_vm->_dialogs->show(61115);
-	else if (_action.isAction(words_take, words_cardboard_box))
+	else if (player_said_2(take, cardboard_box))
 		_vm->_dialogs->show(61116);
-	else if (_action.isAction(words_open, words_cardboard_box))
+	else if (player_said_2(open, cardboard_box))
 		_vm->_dialogs->show(61117);
-	else if (_action.isAction(words_look, words_refrigerator))
+	else if (player_said_2(look, refrigerator))
 		_vm->_dialogs->show(61118);
-	else if (_action.isAction(words_open, words_refrigerator))
+	else if (player_said_2(open, refrigerator))
 		_vm->_dialogs->show(61119);
-	else if (_action.isAction(words_take, words_refrigerator))
+	else if (player_said_2(take, refrigerator))
 		_vm->_dialogs->show(61120);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(61121);
-	else if (_action.isAction(words_look, words_graffiti))
+	else if (player_said_2(look, graffiti))
 		_vm->_dialogs->show(61122);
-	else if (_action.isAction(words_look, words_metal_pipe))
+	else if (player_said_2(look, metal_pipe))
 		_vm->_dialogs->show(61123);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room612.cpp b/engines/mads/madsv2/nebular/rooms/room612.cpp
index 8a67a74998c..657998af196 100644
--- a/engines/mads/madsv2/nebular/rooms/room612.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room612.cpp
@@ -161,7 +161,7 @@ static void room_612_daemon() {
 }
 
 static void room_612_parser() {
-	if (_action.isAction(words_get_inside, words_car)) {
+	if (player_said_2(get_inside, car)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -201,41 +201,41 @@ static void room_612_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_unlock, words_padlock_key, words_control_box)) {
+	} else if (player_said_3(unlock, padlock_key, control_box)) {
 		local._cycleIndex = -2;
 		local._actionMode = 1;
 		handleWinchMovement();
-	} else if (_action._lookFlag || _action.isAction(words_look, words_expressway))
+	} else if (_action._lookFlag || player_said_2(look, expressway))
 		_vm->_dialogs->show(61210);
-	else if (_action.isAction(words_look, words_rope) || _action.isAction(words_look, words_armature)) {
+	else if (player_said_2(look, rope) || player_said_2(look, armature)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(61211);
 		else
 			_vm->_dialogs->show(61212);
-	} else if (_action.isAction(words_take, words_rope))
+	} else if (player_said_2(take, rope))
 		_vm->_dialogs->show(61213);
-	else if (_action.isAction(words_look, words_control_box)) {
+	else if (player_said_2(look, control_box)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(61214);
 		else
 			_vm->_dialogs->show(61216);
-	} else if (_action.isAction(words_open, words_control_box))
+	} else if (player_said_2(open, control_box))
 		_vm->_dialogs->show(61215);
-	else if (_action.isAction(words_look, words_buildings))
+	else if (player_said_2(look, buildings))
 		_vm->_dialogs->show(61218);
-	else if (_action.isAction(words_look, words_dome))
+	else if (player_said_2(look, dome))
 		_vm->_dialogs->show(61219);
-	else if (_action.isAction(words_look, words_statue))
+	else if (player_said_2(look, statue))
 		_vm->_dialogs->show(61220);
-	else if (_action.isAction(words_look, words_maintenance_building))
+	else if (player_said_2(look, maintenance_building))
 		_vm->_dialogs->show(61221);
-	else if (_action.isAction(words_open, words_maintenance_building))
+	else if (player_said_2(open, maintenance_building))
 		_vm->_dialogs->show(61222);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(61223);
-	else if (_action.isAction(words_look, words_support))
+	else if (player_said_2(look, support))
 		_vm->_dialogs->show(61224);
-	else if (_action.isAction(words_walk_down, words_expressway_to_east) || _action.isAction(words_walk_down, words_expressway_to_west))
+	else if (player_said_2(walk_down, expressway_to_east) || player_said_2(walk_down, expressway_to_west))
 		_vm->_dialogs->show(61225);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room701.cpp b/engines/mads/madsv2/nebular/rooms/room701.cpp
index 536f7ff38a1..bf7a5387680 100644
--- a/engines/mads/madsv2/nebular/rooms/room701.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room701.cpp
@@ -200,19 +200,19 @@ static void room_701_daemon() {
 }
 
 static void room_701_pre_parser() {
-	if (_action.isAction(words_walkto, words_east_end_of_platform))
+	if (player_said_2(walkto, east_end_of_platform))
 		_game._player._walkOffScreenSceneId = 702;
 
-	if (_action.isAction(words_look, words_building))
+	if (player_said_2(look, building))
 		_game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
 
-	if (_action.isAction(words_look, words_binoculars, words_building))
+	if (player_said_3(look, binoculars, building))
 		_game._player.walk(Common::Point(154, 129), FACING_NORTH);
 }
 
 static void room_701_parser() {
-	if (_action.isAction(words_walk_along, words_platform)) {
-	} else if (_action.isAction(words_look, words_binoculars, words_building) && _game._objects[OBJ_VASE]._roomNumber == 706) {
+	if (player_said_2(walk_along, platform)) {
+	} else if (player_said_3(look, binoculars, building) && _game._objects[OBJ_VASE]._roomNumber == 706) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -239,7 +239,7 @@ static void room_701_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_step_into, words_elevator)) {
+	} else if (player_said_2(step_into, elevator)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -277,8 +277,8 @@ static void room_701_parser() {
 		default:
 			break;
 		}
-	} else if ((_action.isAction(words_pull, words_boat) || _action.isAction(words_take, words_boat) ||
-		_action.isAction(words_pull, words_fishing_line) || _action.isAction(words_take, words_fishing_line)) &&
+	} else if ((player_said_2(pull, boat) || player_said_2(take, boat) ||
+		player_said_2(pull, fishing_line) || player_said_2(take, fishing_line)) &&
 		!_game._objects.isInInventory(OBJ_FISHING_LINE)) {
 		if (_globals[kBoatStatus] == BOAT_TIED_FLOATING) {
 			switch (_game._trigger) {
@@ -324,7 +324,7 @@ static void room_701_parser() {
 		} else {
 			_vm->_dialogs->show(70127);
 		}
-	} else if (_action.isAction(words_climb_into, words_boat) && _globals[kBoatStatus] == BOAT_TIED) {
+	} else if (player_said_2(climb_into, boat) && _globals[kBoatStatus] == BOAT_TIED) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -348,33 +348,33 @@ static void room_701_parser() {
 				_vm->_dialogs->show(70110);
 		} else
 			_vm->_dialogs->show(70111);
-	} else if (_action.isAction(words_look, words_submerged_city))
+	} else if (player_said_2(look, submerged_city))
 		_vm->_dialogs->show(70112);
-	else if (_action.isAction(words_look, words_elevator))
+	else if (player_said_2(look, elevator))
 		_vm->_dialogs->show(70113);
-	else if (_action.isAction(words_look, words_platform))
+	else if (player_said_2(look, platform))
 		_vm->_dialogs->show(70114);
-	else if (_action.isAction(words_look, words_cement_pylon))
+	else if (player_said_2(look, cement_pylon))
 		_vm->_dialogs->show(70115);
-	else if (_action.isAction(words_look, words_hook)) {
+	else if (player_said_2(look, hook)) {
 		if (_globals[kLineStatus] == LINE_NOT_DROPPED || _globals[kLineStatus] == LINE_NOW_UNTIED)
 			_vm->_dialogs->show(70116);
 		else
 			_vm->_dialogs->show(70117);
-	} else if (_action.isAction(words_look, words_rock))
+	} else if (player_said_2(look, rock))
 		_vm->_dialogs->show(70118);
-	else if (_action.isAction(words_take, words_rock))
+	else if (player_said_2(take, rock))
 		_vm->_dialogs->show(70119);
-	else if (_action.isAction(words_look, words_east_end_of_platform))
+	else if (player_said_2(look, east_end_of_platform))
 		_vm->_dialogs->show(70120);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(70121);
-	else if (_action.isAction(words_look, words_boat)) {
+	else if (player_said_2(look, boat)) {
 		if (_globals[kBoatStatus] == BOAT_ADRIFT || _globals[kBoatStatus] == BOAT_TIED_FLOATING)
 			_vm->_dialogs->show(70122);
 		else
 			_vm->_dialogs->show(70123);
-	} else if (_action.isAction(words_cast, words_fishing_rod, words_boat) && _game._objects.isInInventory(OBJ_FISHING_LINE))
+	} else if (player_said_3(cast, fishing_rod, boat) && _game._objects.isInInventory(OBJ_FISHING_LINE))
 		_vm->_dialogs->show(70124);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room702.cpp b/engines/mads/madsv2/nebular/rooms/room702.cpp
index 10767dfdc56..182094d246f 100644
--- a/engines/mads/madsv2/nebular/rooms/room702.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room702.cpp
@@ -64,18 +64,18 @@ static void room_702_init() {
 }
 
 static void room_702_pre_parser() {
-	if (_action.isAction(words_walkto, words_west_end_of_platform))
+	if (player_said_2(walkto, west_end_of_platform))
 		_game._player._walkOffScreenSceneId = 701;
 }
 
 static void room_702_parser() {
-	if (_action.isAction(words_walk_along, words_platform))
+	if (player_said_2(walk_along, platform))
 		; // Only set the action as finished
-	else if (_action.isAction(words_step_into, words_teleporter)) {
+	else if (player_said_2(step_into, teleporter)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 711;
-	} else if (_action.isAction(words_take, words_bones) && (_action._mainObjectSource == CAT_HOTSPOT) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
+	} else if (player_said_2(take, bones) && (_action._mainObjectSource == CAT_HOTSPOT) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -102,24 +102,24 @@ static void room_702_parser() {
 		}
 	} else if (_action._lookFlag)
 		_vm->_dialogs->show(70210);
-	else if (_action.isAction(words_look, words_platform))
+	else if (player_said_2(look, platform))
 		_vm->_dialogs->show(70211);
-	else if (_action.isAction(words_look, words_cement_block))
+	else if (player_said_2(look, cement_block))
 		_vm->_dialogs->show(70212);
-	else if (_action.isAction(words_look, words_rock))
+	else if (player_said_2(look, rock))
 		_vm->_dialogs->show(70213);
-	else if (_action.isAction(words_take, words_rock))
+	else if (player_said_2(take, rock))
 		_vm->_dialogs->show(70214);
-	else if (_action.isAction(words_look, words_west_end_of_platform))
+	else if (player_said_2(look, west_end_of_platform))
 		_vm->_dialogs->show(70215);
-	else if (_action.isAction(words_look, words_teleporter))
+	else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(70216);
-	else if (_action.isAction(words_look, words_bones) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, bones) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(70217);
-	else if (_action.isAction(words_take, words_bones) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+	else if (player_said_2(take, bones) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		if (_game._objects.isInInventory(OBJ_BONES))
 			_vm->_dialogs->show(70219);
-	} else if (_action.isAction(words_look, words_submerged_city))
+	} else if (player_said_2(look, submerged_city))
 		_vm->_dialogs->show(70220);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room703.cpp b/engines/mads/madsv2/nebular/rooms/room703.cpp
index 1f7128c1a4a..b51c8ef4957 100644
--- a/engines/mads/madsv2/nebular/rooms/room703.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room703.cpp
@@ -493,7 +493,7 @@ static void room_703_daemon() {
 static void room_703_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleFillBottle(_action._activeAction._verbId);
-	else if (_action.isAction(words_steer_towards, words_dock_to_south)) {
+	else if (player_said_2(steer_towards, dock_to_south)) {
 		_game._player._stepEnabled = false;
 		if (_globals[kMonsterAlive])
 			local._curSequence = 8;
@@ -501,7 +501,7 @@ static void room_703_parser() {
 			local._curSequence = 5;
 		else
 			local._curSequence = 3;
-	} else if (_action.isAction(words_steer_towards, words_building_to_north)) {
+	} else if (player_said_2(steer_towards, building_to_north)) {
 		_game._player._stepEnabled = false;
 		if (_globals[kMonsterAlive]) {
 			local._startMonsterTimer = false;
@@ -514,57 +514,57 @@ static void room_703_parser() {
 			local._curSequence = 4;
 		else
 			local._curSequence = 1;
-	} else if (_action.isAction(words_throw, words_bone, words_sea_monster) || _action.isAction(words_throw, words_bones, words_sea_monster)) {
+	} else if (player_said_3(throw, bone, sea_monster) || player_said_3(throw, bones, sea_monster)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
 		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 		_scene->_animation[0]->setCurrentFrame(19);
-	} else if (_action.isAction(words_throw, words_chicken, words_sea_monster)) {
+	} else if (player_said_3(throw, chicken, sea_monster)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
 		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
-	} else if (_action.isAction(words_throw, words_twinkifruit, words_sea_monster)) {
+	} else if (player_said_3(throw, twinkifruit, sea_monster)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
 		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 		_scene->_animation[0]->setCurrentFrame(39);
-	} else if (_action.isAction(words_throw, words_bomb, words_sea_monster)) {
+	} else if (player_said_3(throw, bomb, sea_monster)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
 		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
 		_scene->_animation[0]->setCurrentFrame(59);
-	} else if (_action.isAction(words_throw, words_chicken_bomb, words_sea_monster)) {
+	} else if (player_said_3(throw, chicken_bomb, sea_monster)) {
 		local._useBomb = true;
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
 		local._monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
-	} else if (_action.isAction(words_put, words_bottle, words_water) || _action.isAction(words_fill, words_bottle, words_water)) {
+	} else if (player_said_3(put, bottle, water) || player_said_3(fill, bottle, water)) {
 		if (_globals[kBottleStatus] != 4) {
 			handleBottleInterface();
 			local._dialog1.start();
 		} else
 			_vm->_dialogs->show(70323);
-	} else if (_action._lookFlag || _action.isAction(words_look, words_sea_monster)) {
+	} else if (_action._lookFlag || player_said_2(look, sea_monster)) {
 		if (_globals[kMonsterAlive])
 			_vm->_dialogs->show(70310);
-	} else if (_action.isAction(words_look, words_water)) {
+	} else if (player_said_2(look, water)) {
 		if (!_globals[kMonsterAlive])
 			_vm->_dialogs->show(70311);
 		else
 			_vm->_dialogs->show(70312);
-	} else if (_action.isAction(words_look, words_building_to_north)) {
+	} else if (player_said_2(look, building_to_north)) {
 		if (_globals[kMonsterAlive])
 			_vm->_dialogs->show(70313);
 		else if (_game._visitedScenes.exists(710))
 			_vm->_dialogs->show(70314);
 		else
 			_vm->_dialogs->show(70315);
-	} else if (_action.isAction(words_look, words_volcano_rim))
+	} else if (player_said_2(look, volcano_rim))
 		_vm->_dialogs->show(70316);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room704.cpp b/engines/mads/madsv2/nebular/rooms/room704.cpp
index 1204a0a9036..f9da5884355 100644
--- a/engines/mads/madsv2/nebular/rooms/room704.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room704.cpp
@@ -323,19 +323,19 @@ static void room_704_daemon() {
 static void room_704_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleFillBottle(_action._activeAction._verbId);
-	else if (_action.isAction(words_steer_towards, words_open_water_to_south)) {
+	else if (player_said_2(steer_towards, open_water_to_south)) {
 		_game._player._stepEnabled = false;
 		if (local._boatDirection == 1)
 			local._animationMode = 5;
 		else
 			local._animationMode = 3;
-	} else if (_action.isAction(words_steer_towards, words_building_to_north)) {
+	} else if (player_said_2(steer_towards, building_to_north)) {
 		_game._player._stepEnabled = false;
 		if (local._boatDirection == 2)
 			local._animationMode = 4;
 		else
 			local._animationMode = 1;
-	} else if (_action.isAction(words_take, words_bottle)) {
+	} else if (player_said_2(take, bottle)) {
 		if (!_game._objects.isInInventory(OBJ_BOTTLE)) {
 			_game._player._stepEnabled = false;
 			local._takeBottleFl = true;
@@ -345,7 +345,7 @@ static void room_704_parser() {
 				local._animationMode = 7;
 			}
 		}
-	} else if (_action.isAction(words_put, words_bottle, words_water) || _action.isAction(words_fill, words_bottle, words_water)) {
+	} else if (player_said_3(put, bottle, water) || player_said_3(fill, bottle, water)) {
 		if (_game._objects.isInInventory(OBJ_BOTTLE)) {
 			if (_globals[kBottleStatus] != 4) {
 				local._takeBottleFl = false;
@@ -354,20 +354,20 @@ static void room_704_parser() {
 			} else
 				_vm->_dialogs->show(70323);
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_water))
+	} else if (_action._lookFlag || player_said_2(look, water))
 		_vm->_dialogs->show(70410);
-	else if (_action.isAction(words_look, words_building_to_north)) {
+	else if (player_said_2(look, building_to_north)) {
 		if (_game._visitedScenes.exists(710))
 			_vm->_dialogs->show(70411);
 		else
 			_vm->_dialogs->show(70412);
-	} else if (_action.isAction(words_look, words_volcano_rim))
+	} else if (player_said_2(look, volcano_rim))
 		_vm->_dialogs->show(70413);
-	else if (_action.isAction(words_look, words_bottle) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, bottle) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(70414);
-	else if (_action.isAction(words_look, words_open_water_to_south))
+	else if (player_said_2(look, open_water_to_south))
 		_vm->_dialogs->show(70416);
-	else if (_action.isAction(words_look, words_sky))
+	else if (player_said_2(look, sky))
 		_vm->_dialogs->show(70417);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room705.cpp b/engines/mads/madsv2/nebular/rooms/room705.cpp
index b8fb07ec12d..28cf3088fc1 100644
--- a/engines/mads/madsv2/nebular/rooms/room705.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room705.cpp
@@ -229,7 +229,7 @@ static void room_705_daemon() {
 static void room_705_parser() {
 	if (_game._screenObjects._inputMode == kInputConversation)
 		handleFillBottle(_action._activeAction._verbId);
-	else if (_action.isAction(words_steer_towards, words_open_water_to_south)) {
+	else if (player_said_2(steer_towards, open_water_to_south)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -254,7 +254,7 @@ static void room_705_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_climb_through, words_window)) {
+	} else if (player_said_2(climb_through, window)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -277,23 +277,23 @@ static void room_705_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_fill, words_bottle, words_water) || _action.isAction(words_put, words_bottle, words_water)) {
+	} else if (player_said_3(fill, bottle, water) || player_said_3(put, bottle, water)) {
 		if (_globals[kBottleStatus] != 4) {
 			handleBottleInterface();
 			local._dialog1.start();
 		} else
 			_vm->_dialogs->show(70323);
-	} else if (_action._lookFlag || _action.isAction(words_look, words_water))
+	} else if (_action._lookFlag || player_said_2(look, water))
 		_vm->_dialogs->show(70511);
-	else if (_action.isAction(words_look, words_volcano_rim))
+	else if (player_said_2(look, volcano_rim))
 		_vm->_dialogs->show(70512);
-	else if (_action.isAction(words_look, words_open_water_to_south))
+	else if (player_said_2(look, open_water_to_south))
 		_vm->_dialogs->show(70513);
-	else if (_action.isAction(words_look, words_sky))
+	else if (player_said_2(look, sky))
 		_vm->_dialogs->show(70514);
-	else if (_action.isAction(words_look, words_building))
+	else if (player_said_2(look, building))
 		_vm->_dialogs->show(70515);
-	else if (_action.isAction(words_look, words_window))
+	else if (player_said_2(look, window))
 		_vm->_dialogs->show(70516);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room706.cpp b/engines/mads/madsv2/nebular/rooms/room706.cpp
index dcb776712e7..2c805b98241 100644
--- a/engines/mads/madsv2/nebular/rooms/room706.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room706.cpp
@@ -209,12 +209,12 @@ static void room_706_daemon() {
 }
 
 static void room_706_pre_parser() {
-	if (_action.isAction(words_look, words_portrait))
+	if (player_said_2(look, portrait))
 		_game._player._needToWalk = true;
 }
 
 static void room_706_parser() {
-	if (_action.isAction(words_walk_inside, words_teleporter)) {
+	if (player_said_2(walk_inside, teleporter)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 707;
@@ -222,13 +222,13 @@ static void room_706_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_exit, words_room)) {
+	if (player_said_2(exit, room)) {
 		_scene->_nextSceneId = 705;
 		_action._inProgress = false;
 		return;
 	}
 
-	if (_action.isAction(words_take, words_vase)) {
+	if (player_said_2(take, vase)) {
 		if (_game._difficulty != DIFFICULTY_EASY) {
 			local._animationMode = 1;
 			handleRexDeath();
@@ -240,7 +240,7 @@ static void room_706_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_put, words_bottle, words_pedestal)) {
+	if (player_said_3(put, bottle, pedestal)) {
 		if ((_globals[kBottleStatus] == 2 && _game._difficulty == DIFFICULTY_HARD) ||
 			(_globals[kBottleStatus] != 0 && _game._difficulty != DIFFICULTY_HARD)) {
 			if (!_game._objects.isInInventory(OBJ_VASE) || _game._trigger) {
@@ -257,47 +257,47 @@ static void room_706_parser() {
 		}
 	}
 
-	if (_action.isAction(words_put, words_pedestal) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+	if (player_said_2(put, pedestal) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
 		int objectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
 		if (_game._objects[objectId].hasQuality(10))
 			_vm->_dialogs->show(70626);
 		else
 			_vm->_dialogs->show(70627);
-	} else if (_action.isAction(words_take, words_bottle) && _game._objects.isInInventory(OBJ_VASE))
+	} else if (player_said_2(take, bottle) && _game._objects.isInInventory(OBJ_VASE))
 		_vm->_dialogs->show(70631);
 	else if (_action._lookFlag) {
 		if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(70610);
 		else
 			_vm->_dialogs->show(70611);
-	} else if (_action.isAction(words_look, words_floor))
+	} else if (player_said_2(look, floor))
 		_vm->_dialogs->show(70612);
-	else if (_action.isAction(words_look, words_pillar))
+	else if (player_said_2(look, pillar))
 		_vm->_dialogs->show(70613);
-	else if (_action.isAction(words_look, words_old_tea_cup))
+	else if (player_said_2(look, old_tea_cup))
 		_vm->_dialogs->show(70614);
-	else if (_action.isAction(words_take, words_old_tea_cup))
+	else if (player_said_2(take, old_tea_cup))
 		_vm->_dialogs->show(70615);
-	else if (_action.isAction(words_look, words_old_vase))
+	else if (player_said_2(look, old_vase))
 		_vm->_dialogs->show(70616);
-	else if (_action.isAction(words_look, words_portrait))
+	else if (player_said_2(look, portrait))
 		_vm->_dialogs->show(70617);
-	else if (_action.isAction(words_look, words_name_plate))
+	else if (player_said_2(look, name_plate))
 		_vm->_dialogs->show(70618);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(70619);
-	else if (_action.isAction(words_look, words_pedestal)) {
+	else if (player_said_2(look, pedestal)) {
 		if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(70620);
 		else if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId)
 			_vm->_dialogs->show(70622);
 		else
 			_vm->_dialogs->show(70621);
-	} else if (_action.isAction(words_look, words_teleporter))
+	} else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(70623);
-	else if (_action.isAction(words_look, words_vase) && (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId))
+	else if (player_said_2(look, vase) && (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId))
 		_vm->_dialogs->show(70624);
-	else if (_action.isAction(words_look, words_bottle) && (_action._mainObjectSource == CAT_HOTSPOT))
+	else if (player_said_2(look, bottle) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(70632);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room707.cpp b/engines/mads/madsv2/nebular/rooms/room707.cpp
index 4b8fbcf62a6..e59f014b2d3 100644
--- a/engines/mads/madsv2/nebular/rooms/room707.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room707.cpp
@@ -54,21 +54,21 @@ static void room_707_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_viewport) || _action.isAction(words_peer_through, words_viewport))
+	if (player_said_2(look, viewport) || player_said_2(peer_through, viewport))
 		_vm->_dialogs->show(70710);
-	else if (_action.isAction(words_look, words_keypad))
+	else if (player_said_2(look, keypad))
 		_vm->_dialogs->show(70711);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(70712);
-	else if (_action.isAction(words_look, words_0_key) || _action.isAction(words_look, words_1_key)
-		|| _action.isAction(words_look, words_2_key) || _action.isAction(words_look, words_3_key)
-		|| _action.isAction(words_look, words_4_key) || _action.isAction(words_look, words_5_key)
-		|| _action.isAction(words_look, words_6_key) || _action.isAction(words_look, words_7_key)
-		|| _action.isAction(words_look, words_8_key) || _action.isAction(words_look, words_9_key)
-		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_enter_key)
-		|| _action.isAction(words_look, words_frown_key))
+	else if (player_said_2(look, 0_key) || player_said_2(look, 1_key)
+		|| player_said_2(look, 2_key) || player_said_2(look, 3_key)
+		|| player_said_2(look, 4_key) || player_said_2(look, 5_key)
+		|| player_said_2(look, 6_key) || player_said_2(look, 7_key)
+		|| player_said_2(look, 8_key) || player_said_2(look, 9_key)
+		|| player_said_2(look, smile_key) || player_said_2(look, enter_key)
+		|| player_said_2(look, frown_key))
 		_vm->_dialogs->show(70713);
-	else if (_action.isAction(words_look, words_device) || _action._lookFlag)
+	else if (player_said_2(look, device) || _action._lookFlag)
 		_vm->_dialogs->show(70714);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room710.cpp b/engines/mads/madsv2/nebular/rooms/room710.cpp
index 7b0ad0f9691..15390555a26 100644
--- a/engines/mads/madsv2/nebular/rooms/room710.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room710.cpp
@@ -56,7 +56,7 @@ static void room_710_daemon() {
 }
 
 static void room_710_parser() {
-	if (_action.isAction(words_put_down, words_binoculars)) {
+	if (player_said_2(put_down, binoculars)) {
 		_game._player._stepEnabled = false;
 
 		if (_game._globals[kCityFlooded])
diff --git a/engines/mads/madsv2/nebular/rooms/room751.cpp b/engines/mads/madsv2/nebular/rooms/room751.cpp
index 05f812c2e83..e00eafa9879 100644
--- a/engines/mads/madsv2/nebular/rooms/room751.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room751.cpp
@@ -164,22 +164,22 @@ static void room_751_daemon() {
 }
 
 static void room_751_pre_parser() {
-	if (_action.isAction(words_look, words_tall_building))
+	if (player_said_2(look, tall_building))
 		_game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
 
-	if (_action.isAction(words_look, words_binoculars, words_tall_building))
+	if (player_said_3(look, binoculars, tall_building))
 		_game._player.walk(Common::Point(154, 129), FACING_NORTH);
 
-	if (_action.isAction(words_walkto, words_east_end_of_platform))
+	if (player_said_2(walkto, east_end_of_platform))
 		_game._player._walkOffScreenSceneId = 752;
 
 	if (!local._rexHandingLine)
 		return;
 
-	if (_action.isAction(words_look) || _action.isObject(words_fishing_line) || _action.isAction(words_talkto))
+	if (player_said_1(look) || player_said_1(fishing_line) || player_said_1(talkto))
 		_game._player._needToWalk = false;
 
-	if ((!_action.isAction(words_put, words_fishing_line, words_hook) || !_action.isAction(words_tie, words_fishing_line, words_hook) || !_action.isAction(words_attach, words_fishing_line, words_hook))
+	if ((!player_said_3(put, fishing_line, hook) || !player_said_3(tie, fishing_line, hook) || !player_said_3(attach, fishing_line, hook))
 		&& (_game._player._needToWalk)) {
 		switch (_game._trigger) {
 		case 0:
@@ -206,9 +206,9 @@ static void room_751_pre_parser() {
 }
 
 static void room_751_parser() {
-	if (_action.isAction(words_walk_along, words_platform))
+	if (player_said_2(walk_along, platform))
 		; // Nothing
-	else if (_action.isAction(words_look, words_binoculars, words_tall_building)) {
+	else if (player_said_3(look, binoculars, tall_building)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -235,7 +235,7 @@ static void room_751_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_step_into, words_elevator)) {
+	} else if (player_said_2(step_into, elevator)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -277,7 +277,7 @@ static void room_751_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_put, words_fishing_line, words_hook) || _action.isAction(words_tie, words_fishing_line, words_hook) || _action.isAction(words_attach, words_fishing_line, words_hook)) {
+	} else if (player_said_3(put, fishing_line, hook) || player_said_3(tie, fishing_line, hook) || player_said_3(attach, fishing_line, hook)) {
 		if (_globals[kLineStatus] == 1) {
 			switch (_game._trigger) {
 			case 0:
@@ -327,30 +327,30 @@ static void room_751_parser() {
 				break;
 			}
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_city))
+	} else if (_action._lookFlag || player_said_2(look, city))
 		_vm->_dialogs->show(75110);
-	else if (_action.isAction(words_look, words_elevator))
+	else if (player_said_2(look, elevator))
 		_vm->_dialogs->show(75112);
-	else if (_action.isAction(words_look, words_platform))
+	else if (player_said_2(look, platform))
 		_vm->_dialogs->show(75113);
-	else if (_action.isAction(words_look, words_cement_pylon))
+	else if (player_said_2(look, cement_pylon))
 		_vm->_dialogs->show(75114);
-	else if ((_action.isAction(words_look, words_hook) || _action.isAction(words_look, words_fishing_line))
+	else if ((player_said_2(look, hook) || player_said_2(look, fishing_line))
 		&& (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3))
 		_vm->_dialogs->show(75116);
-	else if (_action.isAction(words_look, words_hook))
+	else if (player_said_2(look, hook))
 		_vm->_dialogs->show(75115);
-	else if (_action.isAction(words_look, words_rock))
+	else if (player_said_2(look, rock))
 		_vm->_dialogs->show(75117);
-	else if (_action.isAction(words_take, words_rock))
+	else if (player_said_2(take, rock))
 		_vm->_dialogs->show(75118);
-	else if (_action.isAction(words_look, words_east_end_of_platform))
+	else if (player_said_2(look, east_end_of_platform))
 		_vm->_dialogs->show(75119);
-	else if (_action.isAction(words_take, words_fishing_line) && (_globals[kLineStatus] == 3 || _globals[kLineStatus] == 2))
+	else if (player_said_2(take, fishing_line) && (_globals[kLineStatus] == 3 || _globals[kLineStatus] == 2))
 		_vm->_dialogs->show(75121);
-	else if (_action.isAction(words_look, words_tall_building))
+	else if (player_said_2(look, tall_building))
 		_vm->_dialogs->show(75122);
-	else if (_action.isAction(words_tie, words_fishing_line, words_cement_pylon) || _action.isAction(words_attach, words_fishing_line, words_cement_pylon))
+	else if (player_said_3(tie, fishing_line, cement_pylon) || player_said_3(attach, fishing_line, cement_pylon))
 		_vm->_dialogs->show(75123);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room752.cpp b/engines/mads/madsv2/nebular/rooms/room752.cpp
index c9e21b26fdf..7a081188314 100644
--- a/engines/mads/madsv2/nebular/rooms/room752.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room752.cpp
@@ -104,19 +104,19 @@ static void room_752_daemon() {
 }
 
 static void room_752_pre_parser() {
-	if (_action.isAction(words_walkto, words_west_end_of_platform)) {
+	if (player_said_2(walkto, west_end_of_platform)) {
 		_game._player._walkOffScreenSceneId = 751;
 	}
 }
 
 static void room_752_parser() {
-	if (_action.isAction(words_walk_along, words_platform))
+	if (player_said_2(walk_along, platform))
 		;
-	else if (_action.isAction(words_step_into, words_teleporter)) {
+	else if (player_said_2(step_into, teleporter)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 711;
-	} else if (_action.isAction(words_take, words_id_card) && (!_game._objects.isInInventory(OBJ_ID_CARD) || _game._trigger)) {
+	} else if (player_said_2(take, id_card) && (!_game._objects.isInInventory(OBJ_ID_CARD) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -140,7 +140,7 @@ static void room_752_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_take, words_bones) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT) &&
+	} else if (player_said_2(take, bones) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT) &&
 		(!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
@@ -166,29 +166,29 @@ static void room_752_parser() {
 		default:
 			break;
 		}
-	} else if (_action._lookFlag || _action.isAction(words_look, words_city)) {
+	} else if (_action._lookFlag || player_said_2(look, city)) {
 		if (_globals[kLaserHoleIsThere])
 			_vm->_dialogs->show(75212);
 		else
 			_vm->_dialogs->show(75210);
-	} else if (_action.isAction(words_look, words_platform))
+	} else if (player_said_2(look, platform))
 		_vm->_dialogs->show(75213);
-	else if (_action.isAction(words_look, words_cement_block))
+	else if (player_said_2(look, cement_block))
 		_vm->_dialogs->show(75214);
-	else if (_action.isAction(words_look, words_rock))
+	else if (player_said_2(look, rock))
 		_vm->_dialogs->show(75215);
-	else if (_action.isAction(words_take, words_rock))
+	else if (player_said_2(take, rock))
 		_vm->_dialogs->show(75216);
-	else if (_action.isAction(words_look, words_west_end_of_platform))
+	else if (player_said_2(look, west_end_of_platform))
 		_vm->_dialogs->show(75217);
-	else if (_action.isAction(words_look, words_teleporter))
+	else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(75218);
-	else if ((_action.isAction(words_look, words_bones) || _action.isAction(words_look, words_id_card)) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+	else if ((player_said_2(look, bones) || player_said_2(look, id_card)) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		if (_game._objects[OBJ_ID_CARD]._roomNumber == 752)
 			_vm->_dialogs->show(75219);
 		else
 			_vm->_dialogs->show(75220);
-	} else if (_action.isAction(words_take, words_bones) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT)) {
+	} else if (player_said_2(take, bones) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT)) {
 		if (_game._objects.isInInventory(OBJ_BONES))
 			_vm->_dialogs->show(75222);
 	} else
diff --git a/engines/mads/madsv2/nebular/rooms/room801.cpp b/engines/mads/madsv2/nebular/rooms/room801.cpp
index a8cdab4b3a1..dfa5875e785 100644
--- a/engines/mads/madsv2/nebular/rooms/room801.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room801.cpp
@@ -199,13 +199,13 @@ static void room_801_daemon() {
 }
 
 static void room_801_pre_parser() {
-	if (_action.isAction(words_look, words_control_panel)) {
+	if (player_said_2(look, control_panel)) {
 		_game._player.walk(Common::Point(148, 110), FACING_NORTH);
 		_game._player._needToWalk = true;
 		_game._player._readyToWalk = true;
 	}
 
-	if (_action.isAction(words_walk_inside, words_teleporter) && _globals[kBeamIsUp]) {
+	if (player_said_2(walk_inside, teleporter) && _globals[kBeamIsUp]) {
 		_globals[kCutX] = _game._player._playerPos.x;
 		_globals[kCutY] = _game._player._playerPos.y;
 		_globals[kCutFacing] = _game._player._facing;
@@ -216,13 +216,13 @@ static void room_801_pre_parser() {
 }
 
 static void room_801_parser() {
-	if (_action.isAction(words_look, words_control_panel))
+	if (player_said_2(look, control_panel))
 		_scene->_nextSceneId = 808;
-	else if (_action.isAction(words_walk_inside, words_teleporter)) {
+	else if (player_said_2(walk_inside, teleporter)) {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 807;
-	} else if (_action.isAction(words_walk_through, words_door) && (_game._player._playerPos == Common::Point(270, 118))) {
+	} else if (player_said_2(walk_through, door) && (_game._player._playerPos == Common::Point(270, 118))) {
 		_game._player._stepEnabled = false;
 		_game._player._facing = FACING_EAST;
 		_game._player.selectSeries();
@@ -234,21 +234,21 @@ static void room_801_parser() {
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
 		_vm->_sound->command(11);
-	} else if (_action.isAction(words_look, words_ceiling))
+	} else if (player_said_2(look, ceiling))
 		_vm->_dialogs->show(80110);
-	else if (_action.isAction(words_look, words_monitor))
+	else if (player_said_2(look, monitor))
 		_vm->_dialogs->show(80111);
-	else if (_action.isAction(words_look, words_teleporter))
+	else if (player_said_2(look, teleporter))
 		_vm->_dialogs->show(80112);
-	else if (_action.isAction(words_look, words_equipment) || _action._lookFlag)
+	else if (player_said_2(look, equipment) || _action._lookFlag)
 		_vm->_dialogs->show(80113);
-	else if (_action.isAction(words_look, words_speaker))
+	else if (player_said_2(look, speaker))
 		_vm->_dialogs->show(80114);
-	else if (_action.isAction(words_look, words_eye_chart))
+	else if (player_said_2(look, eye_chart))
 		_vm->_dialogs->show(80115);
-	else if (_action.isAction(words_look, words_wall))
+	else if (player_said_2(look, wall))
 		_vm->_dialogs->show(80116);
-	else if (_action.isAction(words_look, words_door))
+	else if (player_said_2(look, door))
 		_vm->_dialogs->show(80117);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room802.cpp b/engines/mads/madsv2/nebular/rooms/room802.cpp
index da22131436e..0b2fa0a0bbc 100644
--- a/engines/mads/madsv2/nebular/rooms/room802.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room802.cpp
@@ -113,20 +113,20 @@ static void room_802_daemon() {
 }
 
 static void room_802_pre_parser() {
-	if (_action.isAction(words_walk_towards, words_building_to_west))
+	if (player_said_2(walk_towards, building_to_west))
 		_game._player._walkOffScreenSceneId = 801;
 
-	if (_action.isAction(words_walk_down, words_path_to_east)) {
+	if (player_said_2(walk_down, path_to_east)) {
 		_game._player._walkOffScreenSceneId = 803;
 		_globals[kForceBeamDown] = false;
 	}
 
-	if (_action.isAction(words_take, words_ship))
+	if (player_said_2(take, ship))
 		_game._player._needToWalk = false;
 }
 
 static void room_802_parser() {
-	if (_action.isAction(words_take, words_shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
+	if (player_said_2(take, shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -158,7 +158,7 @@ static void room_802_parser() {
 		default:
 			break;
 		}
-	} else if ((_action.isAction(words_take, words_remote)) && (!_game._objects.isInInventory(OBJ_REMOTE))) {
+	} else if ((player_said_2(take, remote)) && (!_game._objects.isInInventory(OBJ_REMOTE))) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -192,37 +192,37 @@ static void room_802_parser() {
 			break;
 		}
 	} else if (!_globals[kRemoteOnGround] && (_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) || _globals[kShieldModInstalled])
-		&& (_action.isAction(words_look, words_launch_pad) || _action._lookFlag))
+		&& (player_said_2(look, launch_pad) || _action._lookFlag))
 		_vm->_dialogs->show(80210);
 	else if (!_globals[kRemoteOnGround] && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]
-		&& (_action.isAction(words_look, words_launch_pad) || _action._lookFlag))
+		&& (player_said_2(look, launch_pad) || _action._lookFlag))
 		_vm->_dialogs->show(80211);
 	else if (_globals[kRemoteOnGround] && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]
-		&& (_action.isAction(words_look, words_launch_pad) || _action._lookFlag))
+		&& (player_said_2(look, launch_pad) || _action._lookFlag))
 		_vm->_dialogs->show(80213);
 	else if (_globals[kRemoteOnGround] && (_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) || _globals[kShieldModInstalled])
-		&& (_action.isAction(words_look, words_launch_pad) || _action._lookFlag))
+		&& (player_said_2(look, launch_pad) || _action._lookFlag))
 		_vm->_dialogs->show(80212);
-	else if (!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled] && _action.isAction(words_look, words_shield_modulator))
+	else if (!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled] && player_said_2(look, shield_modulator))
 		_vm->_dialogs->show(80214);
-	else if (_globals[kRemoteOnGround] && _action.isAction(words_look, words_remote))
+	else if (_globals[kRemoteOnGround] && player_said_2(look, remote))
 		_vm->_dialogs->show(80216);
-	else if (_action.isAction(words_look, words_ship)) {
+	else if (player_said_2(look, ship)) {
 		if ((!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) && (!_globals[kShieldModInstalled]))
 			_vm->_dialogs->show(80218);
 		else
 			_vm->_dialogs->show(80217);
-	} else if (_action.isAction(words_look, words_bushes))
+	} else if (player_said_2(look, bushes))
 		_vm->_dialogs->show(80219);
-	else if (_action.isAction(words_look, words_path_to_east))
+	else if (player_said_2(look, path_to_east))
 		_vm->_dialogs->show(80220);
-	else if (_action.isAction(words_look, words_sky))
+	else if (player_said_2(look, sky))
 		_vm->_dialogs->show(80221);
-	else if (_action.isAction(words_take, words_ship))
+	else if (player_said_2(take, ship))
 		_vm->_dialogs->show(80222);
-	else if (_action.isAction(words_look, words_tree) || _action.isAction(words_look, words_trees))
+	else if (player_said_2(look, tree) || player_said_2(look, trees))
 		_vm->_dialogs->show(80224);
-	else if (_action.isAction(words_look, words_building_to_west))
+	else if (player_said_2(look, building_to_west))
 		_vm->_dialogs->show(80225);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room803.cpp b/engines/mads/madsv2/nebular/rooms/room803.cpp
index 3a5a4146f4c..45df4c24c71 100644
--- a/engines/mads/madsv2/nebular/rooms/room803.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room803.cpp
@@ -240,15 +240,15 @@ static void room_803_daemon() {
 }
 
 static void room_803_pre_parser() {
-	if (_action.isAction(words_walk_down, words_path_to_west))
+	if (player_said_2(walk_down, path_to_west))
 		_game._player._walkOffScreenSceneId = 802;
 
-	if (_action.isAction(words_take, words_ship))
+	if (player_said_2(take, ship))
 		_game._player._needToWalk = false;
 }
 
 static void room_803_parser() {
-	if (_action.isAction(words_take, words_guts)) {
+	if (player_said_2(take, guts)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -294,7 +294,7 @@ static void room_803_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_enter, words_ship)) {
+	} else if (player_said_2(enter, ship)) {
 		_vm->_sound->command(17);
 		_game._player._stepEnabled = false;
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
@@ -303,28 +303,28 @@ static void room_803_parser() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 120);
 		_globals[kBeamIsUp] = false;
-	} else if (_action.isAction(words_look, words_launch_pad))
+	} else if (player_said_2(look, launch_pad))
 		_vm->_dialogs->show(80310);
 	else if (_action._lookFlag)
 		_vm->_dialogs->show(80310);
-	else if (_action.isAction(words_look, words_pad_to_west))
+	else if (player_said_2(look, pad_to_west))
 		_vm->_dialogs->show(80311);
-	else if (_action.isAction(words_look, words_guts)) {
+	else if (player_said_2(look, guts)) {
 		if (_game._storyMode == STORYMODE_NICE)
 			_vm->_dialogs->show(80312);
 		else
 			_vm->_dialogs->show(80313);
-	} else if (_action.isAction(words_look, words_bushes))
+	} else if (player_said_2(look, bushes))
 		_vm->_dialogs->show(80315);
-	else if (_action.isAction(words_look, words_ship))
+	else if (player_said_2(look, ship))
 		_vm->_dialogs->show(80317);
-	else if (_action.isAction(words_look, words_tower))
+	else if (player_said_2(look, tower))
 		_vm->_dialogs->show(80318);
-	else if (_action.isAction(words_look, words_tree) || _action.isAction(words_look, words_trees))
+	else if (player_said_2(look, tree) || player_said_2(look, trees))
 		_vm->_dialogs->show(80319);
-	else if (_action.isAction(words_look, words_sky))
+	else if (player_said_2(look, sky))
 		_vm->_dialogs->show(80320);
-	else if (_action.isAction(words_take, words_ship))
+	else if (player_said_2(take, ship))
 		_vm->_dialogs->show(80321);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room804.cpp b/engines/mads/madsv2/nebular/rooms/room804.cpp
index a88ef7fef2e..6df7df5bf92 100644
--- a/engines/mads/madsv2/nebular/rooms/room804.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room804.cpp
@@ -281,10 +281,10 @@ static void room_804_daemon() {
 }
 
 static void room_804_parser() {
-	if (_action.isAction(words_look, words_service_panel) ||
-		_action.isAction(words_open, words_service_panel)) {
+	if (player_said_2(look, service_panel) ||
+		player_said_2(open, service_panel)) {
 		_scene->_nextSceneId = 805;
-	} else if ((_action.isAction(words_activate, words_remote)) && _globals[kTopButtonPushed]) {
+	} else if ((player_said_2(activate, remote)) && _globals[kTopButtonPushed]) {
 		if (!_globals[kInSpace]) {
 			// Top button pressed on panel in hanger control
 			if (!_globals[kBeamIsUp]) {
@@ -299,7 +299,7 @@ static void room_804_parser() {
 				_vm->_sound->command(15);
 			}
 		}
-	} else if (_action.isAction(words_pull, words_throttle)) {
+	} else if (player_said_2(pull, throttle)) {
 		_game._player._stepEnabled = false;
 		if (_globals[kBeamIsUp]) {
 			if (!_game._objects.isInInventory(OBJ_VASE) && _globals[kWindowFixed]) {
@@ -316,13 +316,13 @@ static void room_804_parser() {
 		} else {
 			local._messWithThrottle = true;
 		}
-	} else if (_action.isAction(words_apply, words_polycement, words_crack) ||
-		_action.isAction(words_put, words_polycement, words_crack)) {
+	} else if (player_said_3(apply, polycement, crack) ||
+		player_said_3(put, polycement, crack)) {
 		if (!_globals[kWindowFixed]) {
 			local._resetFrame = 2;
 			_game._player._stepEnabled = false;
 		}
-	} else if (_action.isAction(words_exit, words_ship)) {
+	} else if (player_said_2(exit, ship)) {
 		_globals[kExitShip] = true;
 		_globals[kFromCockpit] = true;
 		if (_globals[kBeamIsUp]) {
@@ -335,34 +335,34 @@ static void room_804_parser() {
 		_scene->_sequences.addTimer(2, 90);
 	} else  if (_action._lookFlag) {
 		_vm->_dialogs->show(80410);
-	} else if ((_action.isAction(words_look, words_window)) ||
-		(_action.isAction(words_look_out, words_window))) {
+	} else if ((player_said_2(look, window)) ||
+		(player_said_2(look_out, window))) {
 		if (_globals[kBeamIsUp]) {
 			_vm->_dialogs->show(80412);
 		} else {
 			_vm->_dialogs->show(80411);
 		}
-	} else if (_action.isAction(words_look, words_crack)) {
+	} else if (player_said_2(look, crack)) {
 		if (_globals[kWindowFixed]) {
 			_vm->_dialogs->show(80414);
 		} else {
 			_vm->_dialogs->show(80413);
 		}
-	} else if (_action.isAction(words_look, words_controls)) {
+	} else if (player_said_2(look, controls)) {
 		_vm->_dialogs->show(80415);
-	} else if (_action.isAction(words_look, words_status_panel)) {
+	} else if (player_said_2(look, status_panel)) {
 		if (_globals[kBeamIsUp]) {
 			_vm->_dialogs->show(80417);
 		} else {
 			_vm->_dialogs->show(80416);
 		}
-	} else if (_action.isAction(words_look, words_tp)) {
+	} else if (player_said_2(look, tp)) {
 		_vm->_dialogs->show(80418);
-	} else if (_action.isAction(words_take, words_tp)) {
+	} else if (player_said_2(take, tp)) {
 		_vm->_dialogs->show(80419);
-	} else if (_action.isAction(words_look, words_instrumentation)) {
+	} else if (player_said_2(look, instrumentation)) {
 		_vm->_dialogs->show(80420);
-	} else  if (_action.isAction(words_look, words_seat)) {
+	} else  if (player_said_2(look, seat)) {
 		_vm->_dialogs->show(80421);
 	} else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room805.cpp b/engines/mads/madsv2/nebular/rooms/room805.cpp
index 0ea1924902c..b899686eb21 100644
--- a/engines/mads/madsv2/nebular/rooms/room805.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room805.cpp
@@ -103,39 +103,39 @@ static void room_805_pre_parser() {
 }
 
 static void room_805_parser() {
-	if (_action.isAction(words_exit, words_service_panel))
+	if (player_said_2(exit, service_panel))
 		_scene->_nextSceneId = 804;
-	else if (_action.isAction(words_install, words_shield_modulator) && _game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
+	else if (player_said_2(install, shield_modulator) && _game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_install, words_target_module) && _game._objects.isInInventory(OBJ_TARGET_MODULE)) {
+	} else if (player_said_2(install, target_module) && _game._objects.isInInventory(OBJ_TARGET_MODULE)) {
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_remove, words_shield_modulator) && _globals[kShieldModInstalled]) {
+	} else if (player_said_2(remove, shield_modulator) && _globals[kShieldModInstalled]) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_remove, words_target_module) && _globals[kTargetModInstalled]) {
+	} else if (player_said_2(remove, target_module) && _globals[kTargetModInstalled]) {
 		_scene->_sequences.remove(_globals._sequenceIndexes[2]);
 		_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
 		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
 		_game._player._stepEnabled = false;
-	} else if (_action.isAction(words_install, words_shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))
+	} else if (player_said_2(install, shield_modulator) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))
 		_vm->_dialogs->show(80511);
-	else if (_action.isAction(words_install, words_target_module) && !_game._objects.isInInventory(OBJ_TARGET_MODULE))
+	else if (player_said_2(install, target_module) && !_game._objects.isInInventory(OBJ_TARGET_MODULE))
 		_vm->_dialogs->show(80510);
-	else if (_action.isAction(words_remove, words_life_support_module))
+	else if (player_said_2(remove, life_support_module))
 		_vm->_dialogs->show(80512);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room807.cpp b/engines/mads/madsv2/nebular/rooms/room807.cpp
index 64d77075a15..294a9fa4893 100644
--- a/engines/mads/madsv2/nebular/rooms/room807.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room807.cpp
@@ -58,22 +58,22 @@ static void room_807_parser() {
 		return;
 	}
 
-	if (_action.isAction(words_look, words_viewport))
+	if (player_said_2(look, viewport))
 		_vm->_dialogs->show(80710);
-	else if (_action.isAction(words_peer_through, words_viewport))
+	else if (player_said_2(peer_through, viewport))
 		_vm->_dialogs->show(80710);
-	else if (_action.isAction(words_look, words_keypad) && _action.isAction(words_inspect, words_keypad))
+	else if (player_said_2(look, keypad) && player_said_2(inspect, keypad))
 		_vm->_dialogs->show(80711);
-	else if (_action.isAction(words_look, words_display))
+	else if (player_said_2(look, display))
 		_vm->_dialogs->show(80712);
-	else if (_action.isAction(words_look, words_1_key) || _action.isAction(words_look, words_2_key)
-		|| _action.isAction(words_look, words_3_key) || _action.isAction(words_look, words_4_key)
-		|| _action.isAction(words_look, words_5_key) || _action.isAction(words_look, words_6_key)
-		|| _action.isAction(words_look, words_7_key) || _action.isAction(words_look, words_8_key)
-		|| _action.isAction(words_look, words_9_key) || _action.isAction(words_look, words_0_key)
-		|| _action.isAction(words_look, words_smile_key) || _action.isAction(words_look, words_frown_key))
+	else if (player_said_2(look, 1_key) || player_said_2(look, 2_key)
+		|| player_said_2(look, 3_key) || player_said_2(look, 4_key)
+		|| player_said_2(look, 5_key) || player_said_2(look, 6_key)
+		|| player_said_2(look, 7_key) || player_said_2(look, 8_key)
+		|| player_said_2(look, 9_key) || player_said_2(look, 0_key)
+		|| player_said_2(look, smile_key) || player_said_2(look, frown_key))
 		_vm->_dialogs->show(80713);
-	else if (_action.isAction(words_look, words_device) && _action._lookFlag)
+	else if (player_said_2(look, device) && _action._lookFlag)
 		_vm->_dialogs->show(80714);
 	else
 		return;
diff --git a/engines/mads/madsv2/nebular/rooms/room808.cpp b/engines/mads/madsv2/nebular/rooms/room808.cpp
index 4b60fa4399b..207d000712e 100644
--- a/engines/mads/madsv2/nebular/rooms/room808.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room808.cpp
@@ -81,7 +81,7 @@ static void room_808_init() {
 }
 
 static void room_808_parser() {
-	if (_action.isAction(words_press, words_start_button_2)) {
+	if (player_said_2(press, start_button_2)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -117,7 +117,7 @@ static void room_808_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_press, words_timer_button_2)) {
+	} else if (player_said_2(press, timer_button_2)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -147,7 +147,7 @@ static void room_808_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_press, words_remote_button_2)) {
+	} else if (player_said_2(press, remote_button_2)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -178,7 +178,7 @@ static void room_808_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_press, words_start_button_1)) {
+	} else if (player_said_2(press, start_button_1)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -195,7 +195,7 @@ static void room_808_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_press, words_remote_button_1)) {
+	} else if (player_said_2(press, remote_button_1)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -212,7 +212,7 @@ static void room_808_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_press, words_timer_button_1)) {
+	} else if (player_said_2(press, timer_button_1)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -229,7 +229,7 @@ static void room_808_parser() {
 		default:
 			break;
 		}
-	} else if (_action.isAction(words_exit, words_panel)) {
+	} else if (player_said_2(exit, panel)) {
 		_scene->_nextSceneId = 801;
 		_globals[kBetweenRooms] = true;
 	} else
diff --git a/engines/mads/madsv2/nebular/rooms/teleporter.cpp b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
index 4a541409f56..3357ed062d2 100644
--- a/engines/mads/madsv2/nebular/rooms/teleporter.cpp
+++ b/engines/mads/madsv2/nebular/rooms/teleporter.cpp
@@ -271,7 +271,7 @@ void teleporter_handle_key() {
 bool teleporter_parser() {
 	bool retVal = false;
 
-	if (_action.isAction(words_press) || _action.isAction(words_push)) {
+	if (player_said_1(press) || player_said_1(push)) {
 		static int _buttonList[12] = { words_0_key, words_1_key, words_2_key, words_3_key, words_4_key, words_5_key, words_6_key, words_7_key, words_8_key, words_9_key, words_smile_key, words_frown_key };
 		for (int i = 0; i < 12; i++) {
 			if (_action._activeAction._objectNameId == _buttonList[i])
@@ -281,7 +281,7 @@ bool teleporter_parser() {
 		retVal = true;
 	}
 
-	if (_action.isAction(words_exit_from, words_device)) {
+	if (player_said_2(exit_from, device)) {
 		_globals[kTeleporterCommand] = 3;
 		_scene->_nextSceneId = _teleporterSceneId;
 		retVal = true;
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index fc9ca5ea703..f562f16fa7b 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -45,18 +45,6 @@ Globals _globals;
 Scene _scene;
 VM _vm;
 
-bool Action::isAction(int word1) const {
-	return player_parse(word1, 0);
-}
-
-bool Action::isAction(int word1, int word2) const {
-	return player_parse(word1, word2, 0);
-}
-
-bool Action::isAction(int word1, int word2, int word3) const {
-	return player_parse(word1, word2, word3, 0);
-}
-
 void Game::Objects::addToInventory(int object_id) {
 	inter_give_to_player(object_id);
 }
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 867511bb891..2f191562415 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -142,17 +142,6 @@ struct Action {
 	SavedFields _savedFields;
 
 	int &_mainObjectSource = player.main_object_source;
-
-	bool isAction(int word1) const;
-	bool isAction(int word1, int word2) const;
-	bool isAction(int word1, int word2, int word3) const;
-	bool isObject(int word) const {
-		return isAction(word);
-	}
-	bool isTarget(int word) const {
-		return isAction(word);
-	}
-
 	int &_lookFlag = player.look_around;
 	int &_inProgress = player.command_ready;
 	int &_commandSource = player.command_source;


Commit: 592ba3058ab352bdb50989f7fcbbe5094ef4f549
    https://github.com/scummvm/scummvm/commit/592ba3058ab352bdb50989f7fcbbe5094ef4f549
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:23+10:00

Commit Message:
MADS: NEBULAR: Fix using binoculars in room 202

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp
    engines/mads/madsv2/nebular/nebular.h


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 56306b78203..68d86245b87 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -189,6 +189,18 @@ void RexNebularEngine::global_daemon_code() {
 	}
 }
 
+void RexNebularEngine::global_pre_parser_code() {
+	if (player_said_1(look) || player_said_1(throw))
+		player.need_to_walk = false;
+}
+
+void RexNebularEngine::global_verb_filter() {
+	// Switches the 'look at' used with the binoculars to a standard look verb,
+	// as expected by the room scripts in at least room 202
+	if (player_verb == words_look_at)
+		player_verb = words_look;
+}
+
 void RexNebularEngine::showRecipe() {
 	int count;
 
diff --git a/engines/mads/madsv2/nebular/nebular.h b/engines/mads/madsv2/nebular/nebular.h
index b5ea9e3f82b..bad8942a713 100644
--- a/engines/mads/madsv2/nebular/nebular.h
+++ b/engines/mads/madsv2/nebular/nebular.h
@@ -56,7 +56,8 @@ public:
 	void section_music(int section_num) override;
 	void global_section_constructor() override;
 	void global_daemon_code() override;
-	void global_pre_parser_code() override {}
+	void global_verb_filter() override;
+	void global_pre_parser_code();
 	void global_parser_code() override;
 	void global_error_code() override;
 	void global_room_init() override {}


Commit: 3ceef48fa5f989e9b3e17ef554119911a3e70dea
    https://github.com/scummvm/scummvm/commit/3ceef48fa5f989e9b3e17ef554119911a3e70dea
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:23+10:00

Commit Message:
MADS: NEBULAR: Fix loading room series names

Changed paths:
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 371edb977bd..a5d1905efc3 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -34,6 +34,9 @@ namespace MADS {
 namespace MADSV2 {
 namespace RexNebular {
 
+#define REX_ROOM_MAX_SERIES 10
+#define REX_ROOM_MAX_IMAGES 50
+
 /* Loadable Room definition (.DAT files) */
 struct RoomFileRex {
 	uint16 room_id;                  /* Room id                       */
@@ -49,11 +52,11 @@ struct RoomFileRex {
 
 	uint16 num_series;
 	uint16 num_images;
-	char series_name[10][64];
-	Image image_list[50];
+	char series_name[REX_ROOM_MAX_SERIES][64];
+	Image image_list[REX_ROOM_MAX_IMAGES];
 
-	static constexpr int SIZE = (5 * 2) + 24 + (5 * 2) + (16 * 2) + (Rail::SIZE * ROOM_MAX_RAILS) +
-		2 + 2 + (10 * 64) + (50 * Image::SIZE);
+	static constexpr int SIZE = (5 * 2) + 24 + (5 * 2) + (16 * 2) + (ROOM_MAX_RAILS * Rail::SIZE) +
+		2 + 2 + (REX_ROOM_MAX_SERIES * 64) + (REX_ROOM_MAX_IMAGES * Image::SIZE);
 	void load(Common::SeekableReadStream *src) {
 		src->readMultipleLE(room_id, picture_id, format, xs, ys);
 		src->skip(24);
@@ -63,6 +66,7 @@ struct RoomFileRex {
 		for (Rail &r : rail)
 			r.load(src);
 		src->readMultipleLE(num_series, num_images);
+		src->read(series_name, REX_ROOM_MAX_SERIES * 64);
 		for (Image &img : image_list)
 			img.load(src);
 	}


Commit: a25b7001e1d95d4b7be32868a5bee2a7ab3b2c60
    https://github.com/scummvm/scummvm/commit/a25b7001e1d95d4b7be32868a5bee2a7ab3b2c60
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:24+10:00

Commit Message:
MADS: NEBULAR: Fixes for calling section_2_music

Changed paths:
    engines/mads/madsv2/nebular/rooms/room202.cpp
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room207.cpp
    engines/mads/madsv2/nebular/rooms/room208.cpp
    engines/mads/madsv2/nebular/rooms/room213.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room202.cpp b/engines/mads/madsv2/nebular/rooms/room202.cpp
index f2677bd5bf1..4fc4f9e913b 100644
--- a/engines/mads/madsv2/nebular/rooms/room202.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room202.cpp
@@ -163,6 +163,8 @@ static void room_202_init() {
 	}
 
 	local._meteorologistSpecial = false;
+
+	section_2_music();
 }
 
 static void setRandomKernelMessage() {
diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index ac3aa4f3083..1c015e3424c 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -116,6 +116,7 @@ static void room_205_init() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 11, 74);
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 	}
+
 	section_2_music();
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/room207.cpp b/engines/mads/madsv2/nebular/rooms/room207.cpp
index 0369dfed18e..d9d3e0f8c64 100644
--- a/engines/mads/madsv2/nebular/rooms/room207.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room207.cpp
@@ -94,6 +94,8 @@ static void room_207_init() {
 		_game._player._playerPos = Common::Point(305, 131);
 	}
 
+	section_2_music();
+
 	_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 1, 0, 0);
 	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 22);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
diff --git a/engines/mads/madsv2/nebular/rooms/room208.cpp b/engines/mads/madsv2/nebular/rooms/room208.cpp
index 0be2771a5bb..714dea48b52 100644
--- a/engines/mads/madsv2/nebular/rooms/room208.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room208.cpp
@@ -112,6 +112,7 @@ static void room_208_init() {
 
 	_vm->_palette->setEntry(16, 0, 0, 63);
 	_vm->_palette->setEntry(17, 0, 0, 45);
+
 	section_2_music();
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/room213.cpp b/engines/mads/madsv2/nebular/rooms/room213.cpp
index 50be7bde3d6..91371cfe988 100644
--- a/engines/mads/madsv2/nebular/rooms/room213.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room213.cpp
@@ -43,15 +43,7 @@ static void room_213_init() {
 
 	teleporter_init();
 
-	// The original is calling Scene2xx::section_2_music()
-	if (_vm->_musicFlag) {
-		if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
-			_vm->_sound->command(1);
-		else
-			_vm->_sound->command(9);
-	} else {
-		_vm->_sound->command(2);
-	}
+	section_2_music();
 }
 
 static void room_213_daemon() {


Commit: 2491f5838bd17f1fee45e90a40feb8e7c7ad0a67
    https://github.com/scummvm/scummvm/commit/2491f5838bd17f1fee45e90a40feb8e7c7ad0a67
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:24+10:00

Commit Message:
MADS: NEBULAR: Fix crash entering teleporter room 213

Changed paths:
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/core/pal.cpp
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index 47a436d9a40..ed313c3d3f0 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -1259,10 +1259,11 @@ void game_control() {
 			// Load up next room
 			kernel_mode = KERNEL_ROOM_PRELOAD;
 
-			// Return of the Phantom has this hardcoded true, due to text cutscenes like
+			// Rex Nebular & Return of the Phantom has this hardcoded true. Rex needing it to properly
+			// unload player series when entering teleporter, and Phantom due to text cutscenes like
 			// "5 Minutes Later" zeroing out the palette
 			player.walker_must_reload = (byte)(g_engine->getGameID() == GType_Phantom ||
-				!player.walker_is_loaded);
+				g_engine->getGameID() == GType_RexNebular || !player.walker_is_loaded);
 
 			quote_emergency = false;
 			// vocab_emergency = false;
@@ -1304,7 +1305,6 @@ void game_control() {
 			game_exec_function(room_preload_code_pointer);
 
 			if (player.walker_must_reload || !player.walker_loads_first) {
-
 				if (player.walker_is_loaded) {
 					player_dump_walker();
 				}
diff --git a/engines/mads/madsv2/core/pal.cpp b/engines/mads/madsv2/core/pal.cpp
index 6f41a8b5cd9..50370690e4c 100644
--- a/engines/mads/madsv2/core/pal.cpp
+++ b/engines/mads/madsv2/core/pal.cpp
@@ -520,7 +520,7 @@ int pal_get_flags() {
 	for (a = 0; a < PAL_MAXFLAGS; a++)
 		if (!flag_used[a])
 			out++;
-	return(out);
+	return out;
 }
 
 int pal_get_colors() {
@@ -530,7 +530,7 @@ int pal_get_colors() {
 	for (a = 0; a < 256; a++)
 		if (color_status[a] == 0)
 			out++;
-	return(out);
+	return out;
 }
 
 void pal_interface(Palette &fixpal) {
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index a5d1905efc3..cc33dd59e5e 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -116,7 +116,9 @@ static int room_picture_load(Room *room, int room_id, Buffer *picture, int load_
 			pal_shadow_sort(master_shadow, &art.color_list);
 		}
 
-		room->color_handle = pal_allocate(&art.color_list, master_shadow, (load_flags & PAL_MAP_MASK) | PAL_MAP_BACKGROUND);
+		int pal_flags = (load_flags & (PAL_MAP_RESERVED | PAL_MAP_ANY_TO_CLOSEST |
+			PAL_MAP_ALL_TO_CLOSEST | PAL_MAP_TOP_COLORS)) | PAL_MAP_BACKGROUND;
+		room->color_handle = pal_allocate(&art.color_list, master_shadow, pal_flags);
 		if (room->color_handle < 0) {
 			room_load_error = 4;
 			goto done;
@@ -304,7 +306,7 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 	bool sceneFlag = id >= 0;
 	int width, height, picSize;
 	SeriesPtr sprites[10] = { nullptr };
-	int16 spritesColor[10] = { -1 };
+	int16 spritesHandles[10] = { -1 };
 
 	// Initialize structures
 	mem_last_alloc_loader = MODULE_ROOM_LOADER;
@@ -412,10 +414,10 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 			goto error;
 		}
 
-		spritesColor[count] = sprites[count]->color_handle;
+		spritesHandles[count] = sprites[count]->color_handle;
 	}
 
-	pal_compact(roomPtr->color_handle, roomfile.num_series, spritesColor);
+	pal_compact(roomPtr->color_handle, roomfile.num_series, spritesHandles);
 
 	for (count = 0; count < roomfile.num_images; ++count) {
 		const Image &img = roomfile.image_list[count];
@@ -430,6 +432,12 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 		}
 	}
 
+	// Free the sprites
+	for (count = roomfile.num_series - 1; count >= 0; --count) {
+		pal_deallocate(spritesHandles[count]);
+		mem_free(sprites[count]);
+	}
+
 	// Finished successfully
 	goto done;
 


Commit: ba8d9fbdfa485e37c007d0e2a35e88c425b30830
    https://github.com/scummvm/scummvm/commit/ba8d9fbdfa485e37c007d0e2a35e88c425b30830
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:25+10:00

Commit Message:
MADS: NEBULAR: Fix incorrect removal of burder and fish when merged

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 68d86245b87..270d982ae28 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -379,8 +379,8 @@ void RexNebularEngine::global_parser_code() {
 		}
 	} else if (player_said_3(put, burger, dead_fish)) {
 		if (player_has(OBJ_BURGER) || player_has(OBJ_DEAD_FISH)) {
-			inter_take_from_player(OBJ_DEAD_FISH, PLAYER);
-			inter_take_from_player(OBJ_BURGER, PLAYER);
+			inter_take_from_player(OBJ_DEAD_FISH, NOWHERE);
+			inter_take_from_player(OBJ_BURGER, NOWHERE);
 			inter_give_to_player(OBJ_STUFFED_FISH);
 			object_examine(OBJ_STUFFED_FISH, 803);
 		}


Commit: 8c38984105c7b67a7269cbac6b58fb541aabbe03
    https://github.com/scummvm/scummvm/commit/8c38984105c7b67a7269cbac6b58fb541aabbe03
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:25+10:00

Commit Message:
MADS: NEBULAR: Fixing unknown Animation thunk fields

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index f562f16fa7b..b1d410b8214 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -157,7 +157,10 @@ char *Resources::formatAAName(int num) {
 	return kernel_interface_name(num);
 }
 
-Scene::Animation::Animation(int anim_id) : _id(anim_id), _currentFrame(kernel_anim[anim_id].frame) {
+Scene::Animation::Animation(int anim_id) : _id(anim_id),
+		_currentFrame(kernel_anim[anim_id].frame),
+		_resetFlag(kernel_anim[anim_id].doomed),
+		_spriteListIndexes(&kernel_anim[anim_id].anim->series_id[0]) {
 }
 
 int Scene::Animation::getCurrentFrame() const {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 2f191562415..d18e9e30c95 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -167,10 +167,8 @@ struct Scene {
 	struct Animation {
 		int16 _id;
 		int &_currentFrame;
-
-		// TODO: Not sure what to map this to
-		bool _resetFlag = false;
-		int16 _spriteListIndexes[16] = {};
+		int &_resetFlag;
+		int *const _spriteListIndexes;
 
 		Animation(int anim_id);
 


Commit: 4358a9bfc4d7db88113db6e8bc2303ea89e96f6f
    https://github.com/scummvm/scummvm/commit/4358a9bfc4d7db88113db6e8bc2303ea89e96f6f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:26+10:00

Commit Message:
MADS: NEBULAR: Fix animation crashes during underground capture

Changed paths:
    engines/mads/madsv2/nebular/rooms/room309.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room309.cpp b/engines/mads/madsv2/nebular/rooms/room309.cpp
index 8a5186c4bbd..5579448c91d 100644
--- a/engines/mads/madsv2/nebular/rooms/room309.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room309.cpp
@@ -108,28 +108,25 @@ static void room_309_daemon() {
 			if (local._lastFrame == 97)
 				local._messagesIndexes[2] = _scene->_kernelMessages.add(Common::Point(0, 0), 0xFBFA, 32, 62, 180, _game.getQuote(350));
 
-#if 1
-			error("TODO: animation frame updates");
-#else
 			for (int charIdx = 0; charIdx < 3; charIdx++) {
 				if (local._messagesIndexes[charIdx] >= 0) {
 					bool match = false;
 					int j = -1;
-					for (j = _scene->_animation[0]->_oldFrameEntry; j < _scene->_animation[0]->_header._frameEntriesCount; j++) {
-						if (_scene->_animation[0]->_frameEntries[j]._spriteSlot._spritesIndex == local._characterSpriteIndexes[charIdx]) {
+					for (j = _scene->_animation[0]->_oldFrameEntry; j < _scene->_animation[0]->_frameEntriesCount; j++) {
+						if (_scene->_animation[0]->_frameEntries[j].series_id == local._characterSpriteIndexes[charIdx]) {
 							match = true;
 							break;
 						}
 					}
 
 					if (match) {
-						SpriteSlotSubset *curSpriteSlot = &_scene->_animation[0]->_frameEntries[j]._spriteSlot;
-						_scene->_kernelMessages._entries[local._messagesIndexes[charIdx]]._position.x = curSpriteSlot->_position.x;
-						_scene->_kernelMessages._entries[local._messagesIndexes[charIdx]]._position.y = curSpriteSlot->_position.y - (50 + (14 * ((charIdx == 0) ? 2 : 1)));
+						const Image &img = _scene->_animation[0]->_frameEntries[j];
+						KernelMessage &kmsg = kernel_message[local._messagesIndexes[charIdx]];
+						kmsg.x = img.x;
+						kmsg.y = img.y - (50 + (14 * ((charIdx == 0) ? 2 : 1)));
 					}
 				}
 			}
-#endif
 		}
 	}
 
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index b1d410b8214..f06e2395eeb 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -157,10 +157,14 @@ char *Resources::formatAAName(int num) {
 	return kernel_interface_name(num);
 }
 
+static uint16 dummy_num_images;
 Scene::Animation::Animation(int anim_id) : _id(anim_id),
 		_currentFrame(kernel_anim[anim_id].frame),
 		_resetFlag(kernel_anim[anim_id].doomed),
-		_spriteListIndexes(&kernel_anim[anim_id].anim->series_id[0]) {
+		_spriteListIndexes(kernel_anim[anim_id].anim ? &kernel_anim[anim_id].anim->series_id[0] : nullptr),
+		_oldFrameEntry(kernel_anim[anim_id].image),
+		_frameEntriesCount(kernel_anim[anim_id].anim ? kernel_anim[anim_id].anim->num_images : dummy_num_images),
+		_frameEntries(kernel_anim[anim_id].anim ? kernel_anim[anim_id].anim->image : nullptr) {
 }
 
 int Scene::Animation::getCurrentFrame() const {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index d18e9e30c95..5db69733545 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -169,6 +169,9 @@ struct Scene {
 		int &_currentFrame;
 		int &_resetFlag;
 		int *const _spriteListIndexes;
+		int &_oldFrameEntry;
+		uint16 &_frameEntriesCount;
+		Image *const _frameEntries;
 
 		Animation(int anim_id);
 


Commit: df61fbb92616f03e93b981e4a71ff04c63c30a84
    https://github.com/scummvm/scummvm/commit/df61fbb92616f03e93b981e4a71ff04c63c30a84
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:26+10:00

Commit Message:
MADS: NEBULAR: Fix room 318/319 duplicate quote

Changed paths:
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room319.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index 927a9533528..0b0740d3ae0 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -259,7 +259,7 @@ static void room_318_init() {
 	}
 
 	_game.loadQuoteSet(0x18C, 0x18D, 0x18E, 0x18F, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196,
-		0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19E, 0x19E, 0x1A0, 0x1A1, 0x1A2, 0x1A3,
+		0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19E, 0x19F, 0x1A0, 0x1A1, 0x1A2, 0x1A3,
 		0x1A4, 0x1A5, 0x1A6, 0x1A7, 0x1A8, 0x1A9, 0x1AA, 0x1AB, 0x1AC, 0x1AD, 0x1AE, 0x1AF,
 		0x1B0, 0x1B1, 0x1B2, 0x1B3, 0x1B4, 0x1B5, 0x1B6, 0x1B7, 0x1B8, 0x1B9, 0x1BA, 0x1BB,
 		0x1BC, 0x1BD, 0x1BE, 0x1BF, 0x1C0, 0x1C1, 0x1C2, 0x1C3, 0x1C4, 0x1C5, 0x1C6, 0x1C7,
diff --git a/engines/mads/madsv2/nebular/rooms/room319.cpp b/engines/mads/madsv2/nebular/rooms/room319.cpp
index 0cd326b4c48..0a747a3b6d5 100644
--- a/engines/mads/madsv2/nebular/rooms/room319.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room319.cpp
@@ -113,7 +113,7 @@ static void room_319_init() {
 	}
 
 	_game.loadQuoteSet(0x15F, 0x160, 0x161, 0x162, 0x163, 0x164, 0x16B, 0x16C, 0x16D,
-		0x16E, 0x16F, 0x170, 0x177, 0x178, 0x178, 0x17A, 0x17B, 0x17C, 0x165, 0x166,
+		0x16E, 0x16F, 0x170, 0x177, 0x178, 0x179, 0x17A, 0x17B, 0x17C, 0x165, 0x166,
 		0x167, 0x168, 0x169, 0x16A, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0x17D,
 		0x17E, 0x17F, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x187, 0x188,
 		0x189, 0x18A, 0x18B, 0);


Commit: b2e9684b41f3376ee1311b9a66019d49f0f89fcf
    https://github.com/scummvm/scummvm/commit/b2e9684b41f3376ee1311b9a66019d49f0f89fcf
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:27+10:00

Commit Message:
MADS: NEBULAR: Display 2nd conv lines when Rex is on gurney

Changed paths:
    engines/mads/madsv2/nebular/rooms/dialog.cpp
    engines/mads/madsv2/nebular/rooms/dialog.h
    engines/mads/madsv2/nebular/rooms/room318.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/dialog.cpp b/engines/mads/madsv2/nebular/rooms/dialog.cpp
index 6490a30aa8f..dba33233ace 100644
--- a/engines/mads/madsv2/nebular/rooms/dialog.cpp
+++ b/engines/mads/madsv2/nebular/rooms/dialog.cpp
@@ -43,6 +43,7 @@ void Dialog::setup(int globalId, ...) {
 		quoteId = va_arg(va, int);
 	}
 	va_end(va);
+	assert(_count <= MAX_CONV_MESSAGE);
 
 	if (quoteId < 0) {
 		// For an ending value of -1, also initial the bitflags for the global
diff --git a/engines/mads/madsv2/nebular/rooms/dialog.h b/engines/mads/madsv2/nebular/rooms/dialog.h
index 486af310aab..75557014e11 100644
--- a/engines/mads/madsv2/nebular/rooms/dialog.h
+++ b/engines/mads/madsv2/nebular/rooms/dialog.h
@@ -29,7 +29,7 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-#define MAX_CONV_MESSAGE 10
+#define MAX_CONV_MESSAGE 15
 
 class Dialog {
 public:
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index 0b0740d3ae0..492e992e441 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -45,7 +45,6 @@ struct Scratch {
 	bool _internVisibleFl;
 	bool _explosionFl;
 	int32 _lastFrameCounter = 0;
-	char _subQuote2[256];
 	Dialog _dialog1;
 };
 
@@ -60,9 +59,8 @@ static void handleRexDialogs(int quote) {
 		static char subQuote1[34], subQuote2[34];
 		_game.splitQuote(curQuote, subQuote1, subQuote2);
 
-
 		_scene->_kernelMessages.add(Common::Point(138, 59), 0x1110, 32, 0, 240, subQuote1);
-		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 180, local._subQuote2);
+		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 180, subQuote2);
 	} else
 		_scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 120, curQuote);
 }
@@ -666,11 +664,6 @@ void room_318_synchronize(Common::Serializer &s) {
 	s.syncAsByte(local._internVisibleFl);
 	s.syncAsByte(local._explosionFl);
 	s.syncAsUint32LE(local._lastFrameCounter);
-
-	Common::String subQuote2 = local._subQuote2;
-	s.syncString(subQuote2);
-	if (s.isLoading())
-		Common::strcpy_s(local._subQuote2, subQuote2.c_str());
 }
 
 void room_318_preload() {


Commit: a6b5eb38ccedb759a376cbf9a667557163d5f87e
    https://github.com/scummvm/scummvm/commit/a6b5eb38ccedb759a376cbf9a667557163d5f87e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:27+10:00

Commit Message:
MADS: NEBULAR: Fix to updateTimeout calls, room 311 daemon cleanup

Changed paths:
    engines/mads/madsv2/nebular/rooms/room214.cpp
    engines/mads/madsv2/nebular/rooms/room311.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room214.cpp b/engines/mads/madsv2/nebular/rooms/room214.cpp
index 52285d1b29e..1bdf75dacb0 100644
--- a/engines/mads/madsv2/nebular/rooms/room214.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room214.cpp
@@ -87,7 +87,7 @@ static void room_214_daemon() {
 		{
 			int oldIdx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 5, 0, 0);
-			_scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
 			_scene->_dynamicHotspots.add(words_captive_creature, words_walkto, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 8);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
@@ -99,7 +99,7 @@ static void room_214_daemon() {
 		{
 			int oldIdx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
-			_scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
+			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
 			_scene->_dynamicHotspots.add(words_captive_creature, words_walkto, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 9, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
diff --git a/engines/mads/madsv2/nebular/rooms/room311.cpp b/engines/mads/madsv2/nebular/rooms/room311.cpp
index 0af8fb3a2ed..8e74ebe3461 100644
--- a/engines/mads/madsv2/nebular/rooms/room311.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room311.cpp
@@ -73,107 +73,106 @@ static void room_311_init() {
 }
 
 static void room_311_daemon() {
-	if (_game._trigger == 70)
+	int oldIdx;
+
+	switch (kernel.trigger) {
+	case 70:
 		_scene->_nextSceneId = 310;
+		break;
 
-	if (_game._trigger >= 71) {
-		switch (_game._trigger) {
-		case 71:
-			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+	case 71:
+		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addTimer(15, 72);
-			break;
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addTimer(15, 72);
+		break;
 
-		case 72:
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addTimer(15, 73);
-			break;
+	case 72:
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addTimer(15, 73);
+		break;
 
-		case 73:
-			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+	case 73:
+		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 3);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addTimer(15, 74);
-			break;
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 3);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addTimer(15, 74);
+		break;
 
-		case 74:
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
-			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
-			break;
+	case 74:
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+		break;
 
-		case 75:
-		{
-			int oldIdx = _globals._sequenceIndexes[3];
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
-			_scene->_sequences.addTimer(15, 76);
-		}
+	case 75:
+		oldIdx = _globals._sequenceIndexes[3];
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+		_scene->_sequences.addTimer(15, 76);
 		break;
 
-		case 76:
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addTimer(15, 77);
-			break;
+	case 76:
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addTimer(15, 77);
+		break;
 
-		case 77:
-			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+	case 77:
+		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 8);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addTimer(15, 78);
-			break;
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 8);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addTimer(15, 78);
+		break;
 
-		case 78:
-			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
-			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+	case 78:
+		_scene->_sequences.remove(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
 
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 9);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addTimer(15, 79);
-			break;
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 9);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addTimer(15, 79);
+		break;
 
-		case 79:
-			_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
-			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
-			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 10, -2);
-			_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
-			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
-			break;
+	case 79:
+		_scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 10, -2);
+		_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+		break;
 
-		case 80:
-			_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
-			_game._player._stepEnabled = true;
-			_game._player._visible = true;
-			break;
+	case 80:
+		_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		break;
 
-		default:
-			break;
-		}
+	default:
+		break;
 	}
 
 	if (_game._player._moving && (_scene->_rails.getNext() > 0)) {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index f06e2395eeb..98192afac19 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -375,7 +375,8 @@ void Scene::Sequences::setMotion(int sequence_id, int flags,
 	kernel_seq_motion(sequence_id, flags, delta_x_times_100, delta_y_times_100);
 }
 
-void Scene::Sequences::updateTimeout(int old_sequence_id, int new_sequence_id) {
+void Scene::Sequences::updateTimeout(int new_sequence_id, int old_sequence_id) {
+	// ***WARNING***: params reversed
 	kernel_seq_timeout(old_sequence_id, new_sequence_id);
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index 5db69733545..a254e8aa610 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -321,7 +321,7 @@ struct Scene {
 		void setMsgLayout(int sequence_id);
 		void setPosition(int sequence_id, const Common::Point &pt);
 		void setMotion(int sequence_id, int flags, int delta_x_times_100, int delta_y_times_100);
-		void updateTimeout(int old_sequence_id, int new_sequence_id);
+		void updateTimeout(int new_sequence_id, int old_sequence_id);		// ***WARNING***: params reversed
 		void scan();
 		int startCycle(int srcSpriteIdx, bool flipped, int cycleIndex);
 		void setDone(int sequence_id);


Commit: ff85379ae16f8a73f0d9a84e325c363b1b02a9c6
    https://github.com/scummvm/scummvm/commit/ff85379ae16f8a73f0d9a84e325c363b1b02a9c6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:28+10:00

Commit Message:
MADS: NEBULAR: Fix security scanner ohh oh text

Changed paths:
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/nebular/rooms/room407.cpp


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 9a29d4a8b44..41a38a9855c 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2010,6 +2010,7 @@ int kernel_message_add(char *text, int x, int y, int color,
 	int id = -1;
 	int count;
 	KernelMessagePtr my_message = NULL;
+	assert(text);
 
 	for (count = 0; (id < 0) && (count < KERNEL_MAX_MESSAGES); count++) {
 		my_message = &kernel_message[count];
diff --git a/engines/mads/madsv2/nebular/rooms/room407.cpp b/engines/mads/madsv2/nebular/rooms/room407.cpp
index c973e8e7d53..5754846bafc 100644
--- a/engines/mads/madsv2/nebular/rooms/room407.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room407.cpp
@@ -106,7 +106,7 @@ static void room_407_parser() {
 			_vm->_sound->command(21);
 			_scene->loadAnimation(formAnimName('s', 1), 70);
 			_globals[kHasBeenScanned] = true;
-			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(60));
+			_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(592));
 			_vm->_sound->command(22);
 		}
 


Commit: 3833b814e0736709c056e3e92225bf79a7f90d09
    https://github.com/scummvm/scummvm/commit/3833b814e0736709c056e3e92225bf79a7f90d09
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:29+10:00

Commit Message:
MADS: NEBULAR: Fix Animation _resetFlag to actually be the repeat flag

Changed paths:
    engines/mads/madsv2/nebular/rooms/room205.cpp
    engines/mads/madsv2/nebular/rooms/room318.cpp
    engines/mads/madsv2/nebular/rooms/room402.cpp
    engines/mads/madsv2/nebular/rooms/room410.cpp
    engines/mads/madsv2/nebular/rooms/thunks.cpp
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/room205.cpp b/engines/mads/madsv2/nebular/rooms/room205.cpp
index 1c015e3424c..6b473fab4ce 100644
--- a/engines/mads/madsv2/nebular/rooms/room205.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room205.cpp
@@ -105,7 +105,7 @@ static void room_205_init() {
 
 	if (_globals[kSexOfRex] != SEX_MALE) {
 		_scene->loadAnimation(formAnimName('a', -1));
-		_scene->_animation[0]->_resetFlag = true;
+		_scene->_animation[0]->_repeatFlag = true;
 	} else {
 		local._beingKicked = true;
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
diff --git a/engines/mads/madsv2/nebular/rooms/room318.cpp b/engines/mads/madsv2/nebular/rooms/room318.cpp
index 492e992e441..58479c7ae5e 100644
--- a/engines/mads/madsv2/nebular/rooms/room318.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room318.cpp
@@ -211,7 +211,7 @@ static void room_318_init() {
 
 	if (_globals[kAfterHavoc]) {
 		_scene->loadAnimation(formAnimName('f', -1));
-		_scene->_animation[0]->_resetFlag = true;
+		_scene->_animation[0]->_repeatFlag = true;
 	} else if (!_globals[kHasSeenProfPyro]) {
 		_scene->_hotspots.activate(words_professors_gurney, false);
 		_scene->_hotspots.activate(words_professor, false);
diff --git a/engines/mads/madsv2/nebular/rooms/room402.cpp b/engines/mads/madsv2/nebular/rooms/room402.cpp
index eb7c83a9dfd..436f206bd2f 100644
--- a/engines/mads/madsv2/nebular/rooms/room402.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room402.cpp
@@ -626,7 +626,7 @@ static void room_402_init() {
 	local._refuseAlienLiquor = false;
 
 	_scene->loadAnimation(Resources::formatName(402, 'd', 1, EXT_AA, ""));
-	_scene->_animation[0]->_resetFlag = true;
+	_scene->_animation[0]->_repeatFlag = true;
 
 	_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
diff --git a/engines/mads/madsv2/nebular/rooms/room410.cpp b/engines/mads/madsv2/nebular/rooms/room410.cpp
index 430052ef9b3..70398e17b0d 100644
--- a/engines/mads/madsv2/nebular/rooms/room410.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room410.cpp
@@ -49,7 +49,7 @@ static void room_410_init() {
 	section_4_music();
 
 	_scene->loadAnimation(Resources::formatName(410, 'r', -1, EXT_AA, ""));
-	_scene->_animation[0]->_resetFlag = true;
+	_scene->_animation[0]->_repeatFlag = true;
 }
 
 static void room_410_daemon() {
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.cpp b/engines/mads/madsv2/nebular/rooms/thunks.cpp
index 98192afac19..d07d880a793 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.cpp
+++ b/engines/mads/madsv2/nebular/rooms/thunks.cpp
@@ -160,7 +160,7 @@ char *Resources::formatAAName(int num) {
 static uint16 dummy_num_images;
 Scene::Animation::Animation(int anim_id) : _id(anim_id),
 		_currentFrame(kernel_anim[anim_id].frame),
-		_resetFlag(kernel_anim[anim_id].doomed),
+		_repeatFlag(kernel_anim[anim_id].repeat),
 		_spriteListIndexes(kernel_anim[anim_id].anim ? &kernel_anim[anim_id].anim->series_id[0] : nullptr),
 		_oldFrameEntry(kernel_anim[anim_id].image),
 		_frameEntriesCount(kernel_anim[anim_id].anim ? kernel_anim[anim_id].anim->num_images : dummy_num_images),
diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index a254e8aa610..e3183b2bbb0 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -167,7 +167,7 @@ struct Scene {
 	struct Animation {
 		int16 _id;
 		int &_currentFrame;
-		int &_resetFlag;
+		int &_repeatFlag;
 		int *const _spriteListIndexes;
 		int &_oldFrameEntry;
 		uint16 &_frameEntriesCount;


Commit: c5c980d3b44bfbdd3a6562353eed9b313a320596
    https://github.com/scummvm/scummvm/commit/c5c980d3b44bfbdd3a6562353eed9b313a320596
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:29+10:00

Commit Message:
MADS: NEBULAR: Fix room 354 not being in section 3 room constructor list

Changed paths:
    engines/mads/madsv2/nebular/rooms/section3.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/section3.cpp b/engines/mads/madsv2/nebular/rooms/section3.cpp
index 43b1940c543..1eb01842d5d 100644
--- a/engines/mads/madsv2/nebular/rooms/section3.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section3.cpp
@@ -53,6 +53,7 @@ extern void room_322_preload();
 extern void room_351_preload();
 extern void room_352_preload();
 extern void room_353_preload();
+extern void room_354_preload();
 extern void room_357_preload();
 extern void room_358_preload();
 extern void room_359_preload();
@@ -132,6 +133,7 @@ void section_3_constructor() {
 	case 351: room_preload_code_pointer = room_351_preload; break;
 	case 352: room_preload_code_pointer = room_352_preload; break;
 	case 353: room_preload_code_pointer = room_353_preload; break;
+	case 354: room_preload_code_pointer = room_354_preload; break;
 	case 357: room_preload_code_pointer = room_357_preload; break;
 	case 358: room_preload_code_pointer = room_358_preload; break;
 	case 359: room_preload_code_pointer = room_359_preload; break;


Commit: 925c2001388ae716b6ee3e55a3c5983d91b2c2b3
    https://github.com/scummvm/scummvm/commit/925c2001388ae716b6ee3e55a3c5983d91b2c2b3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:30+10:00

Commit Message:
MADS: NEBULAR: Fix buffer_legal out of bounds call in room 354

Changed paths:
    engines/mads/madsv2/nebular/extra.cpp


diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index cc33dd59e5e..54475727b3a 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -483,6 +483,17 @@ int buffer_legal(const Buffer &special, int orig_wrap,
 	const byte *ptr = special.data + y1 * special.x + (x1 >> 1);
 	uint nibble_pos = 2 - (x1 & 1);
 
+	// The accumulator's threshold/step (x_count, y_count) are both inflated by one
+	// to make the loop cover x1..x2 and y1..y2 inclusively, which means the total
+	// number of row-steps it performs over the full sweep works out to y_count
+	// (= delta_y + 1) rather than delta_y - one more than actually needed to walk
+	// from y1 to y2. That extra step is harmless while it lands on an in-bounds
+	// row, but when y1/y2 sit right at the edge of the surface it steps one row
+	// past the end. Treat stepping off the surface as "no special zone" instead
+	// of reading out of bounds.
+	const byte *bufStart = special.data;
+	const byte *bufEnd = special.data + (long)special.x * special.y;
+
 	for (int col = x_count; col > 0; col--) {
 		dAccum += y_count;
 
@@ -497,13 +508,18 @@ int buffer_legal(const Buffer &special, int orig_wrap,
 
 			dAccum -= x_count;
 			ptr += y_sign;
+			if (ptr < bufStart || ptr >= bufEnd)
+				return 0;
 			code = (*ptr >> ((nibble_pos - 1) * 4)) & 0x0f;
 		}
 
 		// Advance one pixel in X
 		uint new_np = ((nibble_pos - x_sign - 1) & 1) + 1;
-		if ((nibble_pos - x_sign - 1) & ~1)
+		if ((nibble_pos - x_sign - 1) & ~1) {
 			ptr += x_sign;
+			if (ptr < bufStart || ptr >= bufEnd)
+				return 0;
+		}
 		nibble_pos = new_np;
 	}
 


Commit: 102c857e447d60ae29142cd4064003d65a528197
    https://github.com/scummvm/scummvm/commit/102c857e447d60ae29142cd4064003d65a528197
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:30+10:00

Commit Message:
MADS: NEBULAR: Fix room 401 sex scanner

Changed paths:
    engines/mads/madsv2/nebular/rooms/room401.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room401.cpp b/engines/mads/madsv2/nebular/rooms/room401.cpp
index f1a9a371118..9ef651ce596 100644
--- a/engines/mads/madsv2/nebular/rooms/room401.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room401.cpp
@@ -178,6 +178,7 @@ void room_401_synchronize(Common::Serializer &s) {
 
 void room_401_preload() {
 	room_init_code_pointer = room_401_init;
+	room_daemon_code_pointer = room_401_daemon;
 	room_pre_parser_code_pointer = room_401_pre_parser;
 	room_parser_code_pointer = room_401_parser;
 


Commit: 4c8f23a6d77e792033dbc4d37d93c60efdac8567
    https://github.com/scummvm/scummvm/commit/4c8f23a6d77e792033dbc4d37d93c60efdac8567
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:31+10:00

Commit Message:
MADS: NEBULAR: Fix out of bounds array access in room 402

Changed paths:
    engines/mads/madsv2/nebular/rooms/thunks.h


diff --git a/engines/mads/madsv2/nebular/rooms/thunks.h b/engines/mads/madsv2/nebular/rooms/thunks.h
index e3183b2bbb0..b190fdd001a 100644
--- a/engines/mads/madsv2/nebular/rooms/thunks.h
+++ b/engines/mads/madsv2/nebular/rooms/thunks.h
@@ -149,7 +149,7 @@ struct Action {
 extern Action _action;
 
 struct Globals {
-	int16 _spriteIndexes[15];
+	int16 _spriteIndexes[30];
 	int16 _sequenceIndexes[30];
 
 	int16 &operator[](int idx);


Commit: 82ef76eeb31a7d5815cb07e54b6095b454576482
    https://github.com/scummvm/scummvm/commit/82ef76eeb31a7d5815cb07e54b6095b454576482
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:31+10:00

Commit Message:
MADS: NEBULAR: Fix object_examine calls destroying scr_walk buffer

Changed paths:
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/core/room.cpp
    engines/mads/madsv2/nebular/extra.cpp
    engines/mads/madsv2/nebular/extra.h


diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 41a38a9855c..ad4ac8094bd 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -2556,23 +2556,20 @@ int kernel_load_sound_driver(const char *name, char sound_card_, int sound_board
 void kernel_load_variant(int variant) {
 	room_variant = variant;
 
+	if (room_load_variant(room_id, room_variant, NULL, room,
+		&scr_depth,
+		&scr_walk,
+		&scr_special,
+		&depth_map,
+		&depth_resource,
+		-1)) {
+		error_report(ERROR_VARIANT_LOAD_FAILURE, WARNING, MODULE_KERNEL, room_load_error, (room_id * 10) + room_variant);
+	}
+
 	if (g_engine->getGameID() == GType_RexNebular) {
-		RexNebular::kernel_load_variant(nullptr, &scr_depth, &scr_walk, &scr_special, room, variant, room->format == 2);
 		matte_refresh_work();
-
 	} else {
-		if (room_load_variant(room_id, room_variant, NULL, room,
-			&scr_depth,
-			&scr_walk,
-			&scr_special,
-			&depth_map,
-			&depth_resource,
-			-1)) {
-			error_report(ERROR_VARIANT_LOAD_FAILURE, WARNING, MODULE_KERNEL, room_load_error, (room_id * 10) + room_variant);
-		}
-
 		rail_connect_all_nodes();
-
 		camera_jump_to(picture_view_x, picture_view_y);
 	}
 }
diff --git a/engines/mads/madsv2/core/room.cpp b/engines/mads/madsv2/core/room.cpp
index b9b3d6a7b88..704098f17d0 100644
--- a/engines/mads/madsv2/core/room.cpp
+++ b/engines/mads/madsv2/core/room.cpp
@@ -294,6 +294,14 @@ int room_load_variant(int id, int variant, const char *base_path, RoomPtr roomPt
 	int xx, yy;
 	char base[80];
 
+	// Rex Nebular's depth/walk/special data doesn't use the tile system at all (it's
+	// loaded straight into Buffers from the room's .DAT file), so it's handled entirely
+	// separately here rather than falling through into the tile_load()-based logic below.
+	if (g_engine->getGameID() == GType_RexNebular) {
+		return RexNebular::room_load_variant(nullptr, depth, walk, special, roomPtr,
+			variant, roomPtr->format == 2);
+	}
+
 	room_dump_attribute(depth, walk, special, depthMap);
 
 	room_resolve_base(base, NULL, id, base_path);
diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 54475727b3a..1a09ee0d4fd 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -207,7 +207,7 @@ static void room_set_special_nibble(Buffer *special, int x, int y, byte specialV
 		*scan = (byte)((*scan & 0x0f) | ((specialVal & 0x0f) << 4));
 }
 
-int kernel_load_variant(Load *load_handle, Buffer *depth, Buffer *walk, Buffer *special,
+int room_load_variant(Load *load_handle, Buffer *depth, Buffer *walk, Buffer *special,
 		Room *room_info, int variant, bool packedFormat) {
 	char filename[80];
 	Load load;
@@ -391,7 +391,7 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 		assert(special->data);
 	}
 
-	if (kernel_load_variant(&load_handle, depth, walk, special, roomPtr, variant, roomfile.format == 2))
+	if (room_load_variant(&load_handle, depth, walk, special, roomPtr, variant, roomfile.format == 2))
 		goto error;
 
 	loader_close(&load_handle);
diff --git a/engines/mads/madsv2/nebular/extra.h b/engines/mads/madsv2/nebular/extra.h
index 1a7bd64c14d..2e72780b0e9 100644
--- a/engines/mads/madsv2/nebular/extra.h
+++ b/engines/mads/madsv2/nebular/extra.h
@@ -32,7 +32,7 @@ namespace RexNebular {
  * Rex Nebular's game-specific room loader, called from room_load() (see core/room.h) in
  * place of the generic loader used by every other game. Reads the room's .DAT header,
  * loads its background art into picture, its sprite series, and stamps the room's images
- * onto picture, then defers to kernel_load_variant() to populate depth, walk, and special
+ * onto picture, then defers to room_load_variant() to populate depth, walk, and special
  * for the room's default variant.
  */
 extern RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
@@ -41,16 +41,17 @@ extern RoomPtr room_load(int id, int variant, const char *base_path, Buffer *pic
 	int picture_ems_handle, int depth_ems_handle, int load_flags);
 
 /**
- * Rex Nebular's version of the default kernel_load_variant() (see core/kernel.h), called
- * both from room_load() and directly whenever the active room switches to a different
- * attribute variant. Reads the variant's run-length encoded depth/walk/special data from
- * the room's .DAT file and unpacks it into depth (nibble-packed, 2 pixels/byte), walk
- * (bit-packed, 8 pixels/byte), and special (nibble-packed, 2 pixels/byte) surfaces. Any
- * of depth, walk, or special may be null to skip populating that surface. Packed-format
+ * Rex Nebular's version of the default room_load_variant() (see core/room.h), called
+ * from it whenever the active room is Rex Nebular - both when populating a freshly
+ * loaded room's default variant (from room_load()) and when switching to a different
+ * attribute variant thereafter. Reads the variant's run-length encoded depth/walk/special
+ * data from the room's .DAT file and unpacks it into depth (nibble-packed, 2 pixels/byte),
+ * walk (bit-packed, 8 pixels/byte), and special (nibble-packed, 2 pixels/byte) surfaces.
+ * Any of depth, walk, or special may be null to skip populating that surface. Packed-format
  * rooms (packedFormat == true) have no spare bits to encode a special zone code, so
  * special is left untouched in that case.
  */
-extern int kernel_load_variant(Load *load_handle, Buffer *depth, Buffer *walk, Buffer *special,
+extern int room_load_variant(Load *load_handle, Buffer *depth, Buffer *walk, Buffer *special,
 	Room *room_info, int variant, bool packedFormat);
 
 /**


Commit: 7411dd571893d1aafd00679b6ed3b1acaadf87af
    https://github.com/scummvm/scummvm/commit/7411dd571893d1aafd00679b6ed3b1acaadf87af
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:32+10:00

Commit Message:
MADS: NEBULAR: Fix room 406 daemon setup

Changed paths:
    engines/mads/madsv2/nebular/rooms/room406.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room406.cpp b/engines/mads/madsv2/nebular/rooms/room406.cpp
index 1c27d6eb1b7..7ff9714b14a 100644
--- a/engines/mads/madsv2/nebular/rooms/room406.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room406.cpp
@@ -245,7 +245,7 @@ void room_406_preload() {
 	room_init_code_pointer = room_406_init;
 	room_pre_parser_code_pointer = room_406_pre_parser;
 	room_parser_code_pointer = room_406_parser;
-	room_daemon_code_pointer = room_406_parser;
+	room_daemon_code_pointer = room_406_daemon;
 
 	section_4_walker();
 	section_4_interface();


Commit: a7da3a9e07ad216a662dac66b5a9d552a3345c16
    https://github.com/scummvm/scummvm/commit/a7da3a9e07ad216a662dac66b5a9d552a3345c16
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:32+10:00

Commit Message:
MADS: NEBULAR: Fix loading teleporter room 409 background

Changed paths:
    engines/mads/madsv2/nebular/extra.cpp
    engines/mads/madsv2/nebular/rooms/room409.cpp


diff --git a/engines/mads/madsv2/nebular/extra.cpp b/engines/mads/madsv2/nebular/extra.cpp
index 1a09ee0d4fd..5c1acf132f1 100644
--- a/engines/mads/madsv2/nebular/extra.cpp
+++ b/engines/mads/madsv2/nebular/extra.cpp
@@ -397,7 +397,7 @@ RoomPtr room_load(int id, int variant, const char *base_path, Buffer *picture,
 	loader_close(&load_handle);
 
 	// Load in the foreground picture
-	room_picture_load(roomPtr, id, picture, load_flags);
+	room_picture_load(roomPtr, roomfile.picture_id, picture, load_flags);
 
 	// Handle room sprites
 
diff --git a/engines/mads/madsv2/nebular/rooms/room409.cpp b/engines/mads/madsv2/nebular/rooms/room409.cpp
index 40d5217c91c..751e728f7ee 100644
--- a/engines/mads/madsv2/nebular/rooms/room409.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room409.cpp
@@ -36,12 +36,7 @@ namespace Rooms {
 static void room_409_init() {
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXHAND");
 	teleporter_init();
-
-	// The original is calling Scene4xx::section_4_music()
-	if (!_vm->_musicFlag)
-		_vm->_sound->command(2);
-	else
-		_vm->_sound->command(10);
+	section_4_music();
 }
 
 static void room_409_daemon() {


Commit: 92a02ef97f662dd9dfa3b21cde38b799827f77eb
    https://github.com/scummvm/scummvm/commit/92a02ef97f662dd9dfa3b21cde38b799827f77eb
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:33+10:00

Commit Message:
MADS: NEBULAR: Fix hotspots for Macho Prose and Labotatory doorways

Changed paths:
    engines/mads/madsv2/nebular/rooms/room506.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room506.cpp b/engines/mads/madsv2/nebular/rooms/room506.cpp
index f0d299c6ee4..0a3482c73a8 100644
--- a/engines/mads/madsv2/nebular/rooms/room506.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room506.cpp
@@ -139,6 +139,15 @@ static void room_506_init() {
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', -1));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_3");
 
+	// WORKAROUND: Set the animation before creating the door hotspots, since otherwise
+	// with the MADSV2 engine core the hotspot areas were never updated to match the attached sprites
+	if (previous_room != 508 && previous_room != 507 && previous_room != KERNEL_RESTORING_GAME) {
+		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+		_scene->loadAnimation(formAnimName('R', 1), 70);
+	}
+
 	_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
 	int idx = _scene->_dynamicHotspots.add(words_laboratory, words_walk_into, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 	int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(65, 125), FACING_NORTHWEST);
@@ -170,11 +179,8 @@ static void room_506_init() {
 		_game._player._facing = FACING_NORTHEAST;
 		_game._player._visible = false;
 		_game._player._stepEnabled = false;
-		_scene->_sequences.remove(_globals._sequenceIndexes[3]);
-		_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
-		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
-		_scene->loadAnimation(formAnimName('R', 1), 70);
 	}
+
 	section_5_music();
 }
 


Commit: 03c472eaf80ca080a9599a705a2f8ff409979fe1
    https://github.com/scummvm/scummvm/commit/03c472eaf80ca080a9599a705a2f8ff409979fe1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:33+10:00

Commit Message:
MADS: NEBULAR: Fix calling secton_8_music in room 807

Changed paths:
    engines/mads/madsv2/nebular/rooms/room807.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room807.cpp b/engines/mads/madsv2/nebular/rooms/room807.cpp
index 294a9fa4893..cf375c2a674 100644
--- a/engines/mads/madsv2/nebular/rooms/room807.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room807.cpp
@@ -40,12 +40,7 @@ static void room_807_init() {
 		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*REXHAND");
 
 	teleporter_init();
-
-	// The original uses Scene8xx::section_8_music()
-	if (!_vm->_musicFlag)
-		_vm->_sound->command(2);
-	else
-		_vm->_sound->command(20);
+	section_8_music();
 }
 
 static void room_807_daemon() {


Commit: e309028226b41dd50f6ebf766fa5d4c08a58265c
    https://github.com/scummvm/scummvm/commit/e309028226b41dd50f6ebf766fa5d4c08a58265c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:34+10:00

Commit Message:
MADS: NEBULAR: Room 512 missing from section 5 constructor

Changed paths:
    engines/mads/madsv2/nebular/rooms/section5.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/section5.cpp b/engines/mads/madsv2/nebular/rooms/section5.cpp
index 1057fe8871a..40d028d3ed5 100644
--- a/engines/mads/madsv2/nebular/rooms/section5.cpp
+++ b/engines/mads/madsv2/nebular/rooms/section5.cpp
@@ -43,6 +43,7 @@ extern void room_506_preload();
 extern void room_507_preload();
 extern void room_508_preload();
 extern void room_511_preload();
+extern void room_512_preload();
 extern void room_513_preload();
 extern void room_515_preload();
 extern void room_551_preload();
@@ -94,6 +95,7 @@ void section_5_constructor() {
 	case 507: room_preload_code_pointer = room_507_preload; break;
 	case 508: room_preload_code_pointer = room_508_preload; break;
 	case 511: room_preload_code_pointer = room_511_preload; break;
+	case 512: room_preload_code_pointer = room_512_preload; break;
 	case 513: room_preload_code_pointer = room_513_preload; break;
 	case 515: room_preload_code_pointer = room_515_preload; break;
 	case 551: room_preload_code_pointer = room_551_preload; break;


Commit: 046a6af2287ec9f250a134e4016ecfde2ff8dd65
    https://github.com/scummvm/scummvm/commit/046a6af2287ec9f250a134e4016ecfde2ff8dd65
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:34+10:00

Commit Message:
MADS: NEBULAR: Fix entering Buckluster Video alley

Changed paths:
    engines/mads/madsv2/nebular/rooms/dialog.h


diff --git a/engines/mads/madsv2/nebular/rooms/dialog.h b/engines/mads/madsv2/nebular/rooms/dialog.h
index 75557014e11..ada4e9a188e 100644
--- a/engines/mads/madsv2/nebular/rooms/dialog.h
+++ b/engines/mads/madsv2/nebular/rooms/dialog.h
@@ -29,7 +29,7 @@ namespace MADSV2 {
 namespace RexNebular {
 namespace Rooms {
 
-#define MAX_CONV_MESSAGE 15
+#define MAX_CONV_MESSAGE 16
 
 class Dialog {
 public:


Commit: 9efd75b78d4a6f108b85e5a33d124fd29f6bffa4
    https://github.com/scummvm/scummvm/commit/9efd75b78d4a6f108b85e5a33d124fd29f6bffa4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:35+10:00

Commit Message:
MADS: NEBULAR: Hermit conv fixes

Changed paths:
    engines/mads/madsv2/core/font.cpp
    engines/mads/madsv2/core/quote.cpp
    engines/mads/madsv2/nebular/rooms/room611.cpp


diff --git a/engines/mads/madsv2/core/font.cpp b/engines/mads/madsv2/core/font.cpp
index 9dcfbfe7ae9..1157ecc71df 100644
--- a/engines/mads/madsv2/core/font.cpp
+++ b/engines/mads/madsv2/core/font.cpp
@@ -166,7 +166,7 @@ int font_write(FontPtr font, Buffer *target, const char *out_string,
 			continue;  // char_next with zero width: no spacing applied
 
 		screen_loc += char_width;
-		if (screen_loc >= target_wrap)
+		if (screen_loc > target_wrap)
 			break;  // Terminate
 
 		// Locate the character's pixel data in the font, skipping clipped rows.
diff --git a/engines/mads/madsv2/core/quote.cpp b/engines/mads/madsv2/core/quote.cpp
index 0d143ea8133..08c3d542fca 100644
--- a/engines/mads/madsv2/core/quote.cpp
+++ b/engines/mads/madsv2/core/quote.cpp
@@ -142,9 +142,11 @@ char *quote_string(char *quote_list, int quote_id) {
 		for (search = marker; *search; search++);
 		search++;
 		id = *((uint16 *)search);
-		if (id == quote_id) result = marker;
+		if (id == quote_id)
+			result = marker;
 	}
 
+	assert(result);
 	return result;
 }
 
diff --git a/engines/mads/madsv2/nebular/rooms/room611.cpp b/engines/mads/madsv2/nebular/rooms/room611.cpp
index 07018bc50ec..3696631f5b6 100644
--- a/engines/mads/madsv2/nebular/rooms/room611.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room611.cpp
@@ -452,7 +452,7 @@ static void displayHermitQuestions(int question) {
 		quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);
 
-		curQuote = _game.getQuote(0x2C0);
+		curQuote = _game.getQuote(0x2C9);
 		width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
 		quotePosX = local._defaultDialogPos_x - (width / 2);
 		_scene->_kernelMessages.add(Common::Point(quotePosX, local._defaultDialogPos_y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote);


Commit: 7c7ab7ce6bbc48945461094b52532b37118ca65b
    https://github.com/scummvm/scummvm/commit/7c7ab7ce6bbc48945461094b52532b37118ca65b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:35+10:00

Commit Message:
MADS: NEBULAR: Fix getting batteries multiple times

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 270d982ae28..394b271e10c 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -463,6 +463,9 @@ void RexNebularEngine::global_parser_code() {
 			text_show(478);
 			break;
 		}
+
+		global[kPenlightCellStatus] = 0;
+
 	} else if (player_said_2(disassemble, phone_handset)) {
 		switch (global[kHandsetCellStatus]) {
 		case 1:
@@ -476,7 +479,6 @@ void RexNebularEngine::global_parser_code() {
 			if (game.difficulty == DIFFICULTY_HARD) {
 				object_examine(OBJ_DURAFAIL_CELLS, 416);
 			}
-			global[kHandsetCellStatus] = 0;
 			break;
 		case 3:
 			inter_give_to_player(OBJ_PHONE_CELLS);
@@ -485,12 +487,14 @@ void RexNebularEngine::global_parser_code() {
 		case 4:
 			inter_give_to_player(OBJ_PHONE_CELLS);
 			object_examine(OBJ_PHONE_CELLS, 417);
-			global[kHandsetCellStatus] = 0;
 			break;
 		default:
 			text_show(478);
 			break;
 		}
+
+		global[kHandsetCellStatus] = 0;
+
 	} else if (player_said_3(put, phone_cells, penlight)) {
 		if (global[kPenlightCellStatus] == 0) {
 			global[kPenlightCellStatus] = 3;


Commit: 6dee32892965caaaa82d04000bd34d543655b5bc
    https://github.com/scummvm/scummvm/commit/6dee32892965caaaa82d04000bd34d543655b5bc
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:36+10:00

Commit Message:
MADS: NEBULAR: Add missing code for putting batteries in handset

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 394b271e10c..2a4aa27c430 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -519,6 +519,14 @@ void RexNebularEngine::global_parser_code() {
 			global[kPenlightCellStatus] = game.difficulty != DIFFICULTY_HARD || global[kDurafailRecharged] ? 1 : 2;
 			text_show(423);
 		}
+	} else if (player_said_3(put, durafail_cells, phone_handset)) {
+		if (global[kHandsetCellStatus]) {
+			text_show(426);
+		} else {
+			inter_move_object(OBJ_DURAFAIL_CELLS, NOWHERE);
+			global[kHandsetCellStatus] = game.difficulty != DIFFICULTY_HARD || global[kDurafailRecharged] ? 1 : 2;
+			text_show(425);
+		}
 	} else {
 		goto done;
 	}


Commit: 0e29ebd023df8fa608664dabfa66bfe7421ec66c
    https://github.com/scummvm/scummvm/commit/0e29ebd023df8fa608664dabfa66bfe7421ec66c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:36+10:00

Commit Message:
MADS: NEBULAR: Fix getting fishing line to tie to boat

Changed paths:
    engines/mads/madsv2/nebular/rooms/room511.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room511.cpp b/engines/mads/madsv2/nebular/rooms/room511.cpp
index 1b6cc6846b9..143fb102a2e 100644
--- a/engines/mads/madsv2/nebular/rooms/room511.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room511.cpp
@@ -48,6 +48,23 @@ static void room_511_init() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
 	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_6");
 
+	// WORKARUND: Doing this earlier to allow to ensure hotspot bounds will get set from it's image
+	int frame = 0;
+	if (_globals[kLineStatus] == 2)
+		frame = -1;
+	else if (_globals[kLineStatus] == 3)
+		frame = -2;
+
+	if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('b', 4));
+		_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, frame);
+		int idx = _scene->_dynamicHotspots.add(words_fishing_line, words_walkto, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 3);
+		if (_globals[kBoatRaised])
+			_scene->changeVariant(2);
+	}
+
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
 		local._handingLine = false;
 
@@ -78,22 +95,6 @@ static void room_511_init() {
 		_scene->changeVariant(1);
 	}
 
-	int frame = 0;
-	if (_globals[kLineStatus] == 2)
-		frame = -1;
-	else if (_globals[kLineStatus] == 3)
-		frame = -2;
-
-	if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('b', 4));
-		_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, frame);
-		int idx = _scene->_dynamicHotspots.add(words_fishing_line, words_walkto, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
-		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 3);
-		if (_globals[kBoatRaised])
-			_scene->changeVariant(2);
-	}
-
 	local._lineFrame = -1;
 	local._lineMoving = false;
 


Commit: 8448fc7d4907c69f2e3fea151be94445d55035dd
    https://github.com/scummvm/scummvm/commit/8448fc7d4907c69f2e3fea151be94445d55035dd
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:37+10:00

Commit Message:
MADS: NEBULAR: Add missing putting bomb in chicken

Changed paths:
    engines/mads/madsv2/nebular/nebular.cpp


diff --git a/engines/mads/madsv2/nebular/nebular.cpp b/engines/mads/madsv2/nebular/nebular.cpp
index 2a4aa27c430..690efbdf359 100644
--- a/engines/mads/madsv2/nebular/nebular.cpp
+++ b/engines/mads/madsv2/nebular/nebular.cpp
@@ -286,6 +286,7 @@ void RexNebularEngine::global_parser_code() {
 		text_show(457);
 	} else if (player_said_2(set, timebomb)) {
 		text_show(458);
+		// Original also had a second unreachable block for: text_show(427);
 	} else if (player_said_2(guzzle, alien_liquor)) {
 		text_show(459);
 	} else if (player_said_2(smash, target_module)) {
@@ -527,6 +528,16 @@ void RexNebularEngine::global_parser_code() {
 			global[kHandsetCellStatus] = game.difficulty != DIFFICULTY_HARD || global[kDurafailRecharged] ? 1 : 2;
 			text_show(425);
 		}
+	} else if (player_said_3(put, bomb, chicken) || player_said_3(put, bombs, chicken)) {
+		inter_move_object(OBJ_CHICKEN, NOWHERE);
+		if (player_has(OBJ_BOMBS)) {
+			inter_move_object(OBJ_BOMBS, NOWHERE);
+			inter_give_to_player(OBJ_BOMB);
+		} else {
+			inter_move_object(OBJ_BOMB, NOWHERE);
+		}
+		inter_give_to_player(OBJ_CHICKEN_BOMB);
+		object_examine(OBJ_CHICKEN_BOMB, 430);
 	} else {
 		goto done;
 	}


Commit: c882068448a40c3dc1e5584f51287dc0287faffa
    https://github.com/scummvm/scummvm/commit/c882068448a40c3dc1e5584f51287dc0287faffa
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:37+10:00

Commit Message:
MADS: NEBULAR: Hookup room 808 parser in preload

Changed paths:
    engines/mads/madsv2/nebular/rooms/room804.cpp
    engines/mads/madsv2/nebular/rooms/room808.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room804.cpp b/engines/mads/madsv2/nebular/rooms/room804.cpp
index 6df7df5bf92..2a13ed834a3 100644
--- a/engines/mads/madsv2/nebular/rooms/room804.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room804.cpp
@@ -46,6 +46,7 @@ struct Scratch {
 
 static Scratch local;
 
+
 static void room_804_init() {
 	local._messWithThrottle = false;
 	local._throttleCounter = 0;
diff --git a/engines/mads/madsv2/nebular/rooms/room808.cpp b/engines/mads/madsv2/nebular/rooms/room808.cpp
index 207d000712e..f22217062a7 100644
--- a/engines/mads/madsv2/nebular/rooms/room808.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room808.cpp
@@ -244,6 +244,7 @@ void room_808_synchronize(Common::Serializer &s) {
 
 void room_808_preload() {
 	room_init_code_pointer = room_808_init;
+	room_parser_code_pointer = room_808_parser;
 
 	section_8_walker();
 	section_8_interface();


Commit: 723efd2390c078dd4b11fb5fe4fb4efc8156d3fc
    https://github.com/scummvm/scummvm/commit/723efd2390c078dd4b11fb5fe4fb4efc8156d3fc
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:38+10:00

Commit Message:
MADS: NEBULAR: Fix sound crash looking at ship panel

Changed paths:
    engines/mads/madsv2/nebular/sound_nebular.cpp


diff --git a/engines/mads/madsv2/nebular/sound_nebular.cpp b/engines/mads/madsv2/nebular/sound_nebular.cpp
index 17095334c59..2b56f667ac0 100644
--- a/engines/mads/madsv2/nebular/sound_nebular.cpp
+++ b/engines/mads/madsv2/nebular/sound_nebular.cpp
@@ -2332,8 +2332,8 @@ int ASound8::command22() {
 }
 
 int ASound8::command23() {
-	playSound(0x2B08, 34);
-	playSound(0x2B2A, 20);
+	playSound(0x16E8, 34);
+	playSound(0x170A, 20);
 
 	return 0;
 }


Commit: 00faa082f22ec5dd25cbbf9819e98e363fa34f61
    https://github.com/scummvm/scummvm/commit/00faa082f22ec5dd25cbbf9819e98e363fa34f61
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:38+10:00

Commit Message:
MADS: NEBULAR: Cleanup & fixes for ASound8 sound driver

Changed paths:
    engines/mads/madsv2/nebular/rooms/room803.cpp
    engines/mads/madsv2/nebular/sound_nebular.cpp


diff --git a/engines/mads/madsv2/nebular/rooms/room803.cpp b/engines/mads/madsv2/nebular/rooms/room803.cpp
index 45df4c24c71..6793e045d3f 100644
--- a/engines/mads/madsv2/nebular/rooms/room803.cpp
+++ b/engines/mads/madsv2/nebular/rooms/room803.cpp
@@ -218,6 +218,7 @@ static void room_803_daemon() {
 			else
 				_game._winStatus = 3;
 
+			game.going = false;
 			return;
 		}
 	}
diff --git a/engines/mads/madsv2/nebular/sound_nebular.cpp b/engines/mads/madsv2/nebular/sound_nebular.cpp
index 2b56f667ac0..9db614e524d 100644
--- a/engines/mads/madsv2/nebular/sound_nebular.cpp
+++ b/engines/mads/madsv2/nebular/sound_nebular.cpp
@@ -2245,9 +2245,8 @@ int ASound8::command9() {
 }
 
 int ASound8::command10() {
-	byte *pData = loadData(0x2B3E, 10);
-	pData[6] = (getRandomNumber() & 7) + 85;
-	playSoundData(pData);
+	_channels[7].load(loadData(0x171c, 56));
+	_channels[8].load(loadData(0x1754, 56));
 
 	return 0;
 }
@@ -2271,7 +2270,7 @@ int ASound8::command13() {
 }
 
 int ASound8::command14() {
-	playSound(0x169E, 24);
+	_channels[8].load(loadData(0x169e, 24));
 
 	return 0;
 }
@@ -2324,16 +2323,16 @@ int ASound8::command21() {
 }
 
 int ASound8::command22() {
-	playSound(0x178C, 14);
-	playSound(0x179A, 14);
-	playSound(0x17A8, 14);
+	_channels[6].load(loadData(0x178C, 14));
+	_channels[7].load(loadData(0x179A, 14));
+	_channels[8].load(loadData(0x17A8, 14));
 
 	return 0;
 }
 
 int ASound8::command23() {
-	playSound(0x16E8, 34);
-	playSound(0x170A, 20);
+	_channels[7].load(loadData(0x16E8, 34));
+	_channels[8].load(loadData(0x170A, 20));
 
 	return 0;
 }
@@ -2416,7 +2415,7 @@ int ASound8::command30() {
 }
 
 int ASound8::command31() {
-	playSound(0x156A, 14);
+	_channels[7].load(loadData(0x156A, 14));
 
 	return 0;
 }


Commit: e83695a12b1d6fb8e7b44cc539a32744be7b887e
    https://github.com/scummvm/scummvm/commit/e83695a12b1d6fb8e7b44cc539a32744be7b887e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-21T21:05:39+10:00

Commit Message:
MADS: NEBULAR: Mark Rex Nebular as unstable again

Changed paths:
    engines/mads/detection_tables.h


diff --git a/engines/mads/detection_tables.h b/engines/mads/detection_tables.h
index d88d80fef28..9417839df7a 100644
--- a/engines/mads/detection_tables.h
+++ b/engines/mads/detection_tables.h
@@ -30,7 +30,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			AD_ENTRY2s("mpslabs.001", "4df5c557b52abb5b661cf4befe5ae301", 1315354, "mpslabs.idx", "598ede8e361a60a4e577bbe40f83295b", 5598),
 			Common::EN_ANY,
 			Common::kPlatformDOS,
-			GF_INSTALLER,
+			ADGF_UNSTABLE | GF_INSTALLER,
 #ifdef USE_TTS
 			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
 #else
@@ -49,7 +49,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			AD_ENTRY2s("mpslabs.001", "4df5c557b52abb5b661cf4befe5ae301", 1315354, "mpslabs.idx", "d74bed6513d0a5d514269750f574a23b", 5598),
 			Common::EN_ANY,
 			Common::kPlatformDOS,
-			GF_INSTALLER,
+			ADGF_UNSTABLE | GF_INSTALLER,
 #ifdef USE_TTS
 			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
 #else
@@ -68,7 +68,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			AD_ENTRY2s("mpslabs.001", "4df5c557b52abb5b661cf4befe5ae301", 1071642, "mpslabs.idx", "d8fac57aac1c0c41ba3a1554ccc89d21", 5500),
 			Common::EN_ANY,
 			Common::kPlatformDOS,
-			GF_INSTALLER,
+			ADGF_UNSTABLE | GF_INSTALLER,
 #ifdef USE_TTS
 			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
 #else
@@ -87,7 +87,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			AD_ENTRY1s("section1.hag", "6f725eb38660de8af31ec7cdd628d615", 927222),
 			Common::EN_ANY,
 			Common::kPlatformDOS,
-			ADGF_NO_FLAGS,
+			ADGF_UNSTABLE,
 #ifdef USE_TTS
 			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
 #else
@@ -106,7 +106,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			AD_ENTRY1s("section1.hag", "d583576923e3437937fb7f46f4b6274f", 927222),
 			Common::EN_ANY,
 			Common::kPlatformDOS,
-			ADGF_NO_FLAGS,
+			ADGF_UNSTABLE,
 #ifdef USE_TTS
 			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
 #else
@@ -125,7 +125,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			AD_ENTRY1s("section1.hag", "1c09f2cb2c801741769be55c83f89c52", 943426),
 			Common::RU_RUS,
 			Common::kPlatformDOS,
-			ADGF_NO_FLAGS,
+			ADGF_UNSTABLE,
 			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
 		},
 		GType_RexNebular,




More information about the Scummvm-git-logs mailing list