[Scummvm-git-logs] scummvm master -> 27334eac8fb89c8bbce54dace3f44727920754bd

dreammaster noreply at scummvm.org
Sun May 10 03:36:13 UTC 2026


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

Summary:
27334eac8f MADS: DRAGONSPHERE: Added room 105


Commit: 27334eac8fb89c8bbce54dace3f44727920754bd
    https://github.com/scummvm/scummvm/commit/27334eac8fb89c8bbce54dace3f44727920754bd
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-05-10T13:36:03+10:00

Commit Message:
MADS: DRAGONSPHERE: Added room 105

Changed paths:
  A engines/mads/madsv2/dragonsphere/mads/conv.h
  A engines/mads/madsv2/dragonsphere/mads/mads.cpp
  A engines/mads/madsv2/dragonsphere/mads/words.h
  R engines/mads/madsv2/dragonsphere/mads/dragon_mads.cpp
  R engines/mads/madsv2/dragonsphere/mads/dragon_mads.h
    engines/mads/madsv2/dragonsphere/mads/inventory.h
    engines/mads/madsv2/dragonsphere/mads/sounds.h
    engines/mads/madsv2/dragonsphere/rooms/room104.cpp
    engines/mads/madsv2/dragonsphere/rooms/room105.cpp
    engines/mads/madsv2/dragonsphere/rooms/room105.h
    engines/mads/module.mk


diff --git a/engines/mads/madsv2/dragonsphere/mads/dragon_mads.cpp b/engines/mads/madsv2/dragonsphere/mads/conv.h
similarity index 64%
rename from engines/mads/madsv2/dragonsphere/mads/dragon_mads.cpp
rename to engines/mads/madsv2/dragonsphere/mads/conv.h
index ad07d4079eb..3c833d73d73 100644
--- a/engines/mads/madsv2/dragonsphere/mads/dragon_mads.cpp
+++ b/engines/mads/madsv2/dragonsphere/mads/conv.h
@@ -19,4 +19,26 @@
  *
  */
 
-#include "mads/madsv2/dragonsphere/mads/dragon_mads.h"
+#ifndef MADS_DRAGONSPHERE_MADS_CONV_H
+#define MADS_DRAGONSPHERE_MADS_CONV_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace Dragonsphere {
+
+// Conversation node IDs are added here as each conversation is ported.
+// Each conversation gets its own enum block named after its .CON file.
+
+enum {
+	conv002_counter_only = 0,
+	conv002_banter_random = 1,
+	conv002_flirt_rand = 2
+};
+
+} // namespace Dragonsphere
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/dragonsphere/mads/inventory.h b/engines/mads/madsv2/dragonsphere/mads/inventory.h
index 8a0d4bab5e0..582c01b86d0 100644
--- a/engines/mads/madsv2/dragonsphere/mads/inventory.h
+++ b/engines/mads/madsv2/dragonsphere/mads/inventory.h
@@ -29,7 +29,9 @@ namespace MADSV2 {
 namespace Dragonsphere {
 
 enum {
-	dummy = 0
+	dummy  = 0,
+	goblet = 5,
+	bone   = 6
 };
 
 } // namespace Dragonsphere
diff --git a/engines/mads/madsv2/dragonsphere/mads/dragon_mads.h b/engines/mads/madsv2/dragonsphere/mads/mads.cpp
similarity index 90%
rename from engines/mads/madsv2/dragonsphere/mads/dragon_mads.h
rename to engines/mads/madsv2/dragonsphere/mads/mads.cpp
index 607fa6390ed..88af2528d5e 100644
--- a/engines/mads/madsv2/dragonsphere/mads/dragon_mads.h
+++ b/engines/mads/madsv2/dragonsphere/mads/mads.cpp
@@ -19,5 +19,7 @@
  *
  */
 
+#include "mads/madsv2/dragonsphere/mads/conv.h"
 #include "mads/madsv2/dragonsphere/mads/inventory.h"
 #include "mads/madsv2/dragonsphere/mads/sounds.h"
+#include "mads/madsv2/dragonsphere/mads/words.h"
diff --git a/engines/mads/madsv2/dragonsphere/mads/sounds.h b/engines/mads/madsv2/dragonsphere/mads/sounds.h
index 31ed7aa91ea..b13de98b12f 100644
--- a/engines/mads/madsv2/dragonsphere/mads/sounds.h
+++ b/engines/mads/madsv2/dragonsphere/mads/sounds.h
@@ -29,8 +29,9 @@ namespace MADSV2 {
 namespace Dragonsphere {
 
 enum {
-	N_DoorOpens = 24,
-	N_DoorCloses = 25,
+	N_DoorOpens      = 24,
+	N_DoorCloses     = 25,
+	N_TakeObjectSnd  = 26,
 	N_QueenMother = 45,
 	N_TurnDiaryPage = 65,
 	N_WallGrinds = 67,
diff --git a/engines/mads/madsv2/dragonsphere/mads/words.h b/engines/mads/madsv2/dragonsphere/mads/words.h
new file mode 100644
index 00000000000..0632a5c8777
--- /dev/null
+++ b/engines/mads/madsv2/dragonsphere/mads/words.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_DRAGONSPHERE_MADS_WORDS_H
+#define MADS_DRAGONSPHERE_MADS_WORDS_H
+
+#include "common/scummsys.h"
+
+namespace MADS {
+namespace MADSV2 {
+namespace Dragonsphere {
+
+// Hardcoded verb IDs (VOCABH.DB, IDs 1-13)
+enum {
+	words_look      =  3,
+	words_take      =  4,
+	words_push      =  5,
+	words_open      =  6,
+	words_talk_to   =  8,
+	words_pull      = 10,
+	words_walk_to   = 13
+};
+
+// Vocabulary word IDs (verified against release disassembly)
+enum {
+	words_floor              =  16,
+	words_wall               =  20,
+	words_window             =  24,
+	words_tapestry           =  26,
+	words_look_at            =  30,
+	words_walk_through       =  37,
+	words_goblet             =  59,
+	words_bone               =  62,
+	words_brazier            = 175,
+	words_door_to_throne_room = 176,
+	words_door_to_hallway    = 197,
+	words_ceiling            = 196,
+	words_chair              = 202,
+	words_dividing_wall      = 208,
+	words_bucket             = 225,
+	words_sconce             = 329,
+	words_dining_table       = 178,
+	words_scullery_maid      = 266
+};
+
+} // namespace Dragonsphere
+} // namespace MADSV2
+} // namespace MADS
+
+#endif
diff --git a/engines/mads/madsv2/dragonsphere/rooms/room104.cpp b/engines/mads/madsv2/dragonsphere/rooms/room104.cpp
index 7afcc1f6571..c99fccd68b8 100644
--- a/engines/mads/madsv2/dragonsphere/rooms/room104.cpp
+++ b/engines/mads/madsv2/dragonsphere/rooms/room104.cpp
@@ -33,7 +33,7 @@
 #include "mads/madsv2/core/text.h"
 #include "mads/madsv2/core/vocab.h"
 #include "mads/madsv2/dragonsphere/global.h"
-#include "mads/madsv2/dragonsphere/mads/dragon_mads.h"
+#include "mads/madsv2/dragonsphere/mads/sounds.h"
 #include "mads/madsv2/dragonsphere/rooms/section1.h"
 #include "mads/madsv2/dragonsphere/rooms/room104.h"
 
diff --git a/engines/mads/madsv2/dragonsphere/rooms/room105.cpp b/engines/mads/madsv2/dragonsphere/rooms/room105.cpp
index 2d0cc8b37eb..fa5bd447be2 100644
--- a/engines/mads/madsv2/dragonsphere/rooms/room105.cpp
+++ b/engines/mads/madsv2/dragonsphere/rooms/room105.cpp
@@ -22,10 +22,18 @@
 #include "mads/madsv2/core/conv.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/object.h"
+#include "mads/madsv2/core/player.h"
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.h"
+#include "mads/madsv2/core/vocab.h"
 #include "mads/madsv2/dragonsphere/global.h"
+#include "mads/madsv2/dragonsphere/mads/conv.h"
+#include "mads/madsv2/dragonsphere/mads/inventory.h"
+#include "mads/madsv2/dragonsphere/mads/sounds.h"
+#include "mads/madsv2/dragonsphere/mads/words.h"
 #include "mads/madsv2/dragonsphere/rooms/section1.h"
 #include "mads/madsv2/dragonsphere/rooms/room105.h"
 
@@ -34,36 +42,751 @@ namespace MADSV2 {
 namespace Dragonsphere {
 namespace Rooms {
 
-//static Scratch scratch;
+// ---------------------------------------------------------------------------
+// Scratch layout (matches ROOM105.MAC)
+//
+//   game.scratch offsets:
+//     sprite[0..14]    = 0x00..0x1C
+//     sequence[0..14]  = 0x1E..0x3A
+//     animation[0..3]  = 0x3C..0x42
+//     temp             = 0x44
+//     maid_frame       = 0x46
+//     new_action       = 0x48
+//     last_action      = 0x4A
+//     maid_talking     = 0x4C
+//     situp            = 0x4E
+//     good_number      = 0x50
+//     maid_id[0]       = 0x52
+//     maid_id[1]       = 0x54
+//     bucket_id        = 0x56
+//     bone_id          = 0x58
+//     goblet_id        = 0x5A
+// ---------------------------------------------------------------------------
+struct Scratch {
+	int16 sprite[15];       // ss[]  — sprite series handles
+	int16 sequence[15];     // seq[] — sequence handles
+	int16 animation[4];     // aa[]  — animation handles
+	int16 temp;             // 0x44
+	int16 maid_frame;       // 0x46
+	int16 new_action;       // 0x48
+	int16 last_action;      // 0x4A
+	int16 maid_talking;     // 0x4C
+	int16 situp;            // 0x4E
+	int16 good_number;      // 0x50
+	int16 maid_id[2];       // 0x52
+	int16 bucket_id;        // 0x56
+	int16 bone_id;          // 0x58
+	int16 goblet_id;        // 0x5A
+};
+
+#define local ((Scratch *)(&game.scratch[0]))
+#define ss    local->sprite
+#define seq   local->sequence
+#define aa    local->animation
+
+#define fx_fire_left    1
+#define fx_fire_right   2
+#define fx_door         3
+#define fx_open_door    4
+#define fx_goblet       5
+#define fx_bone         6
+#define fx_take_bone    7
+#define fx_take_goblet  8
+
+/* walk points */
+#define START_X_ROOM_103     120
+#define START_Y_ROOM_103     96
+#define START_X_ROOM_106     104
+#define START_Y_ROOM_106     152
+
+#define WALK_TO_X_FROM_103   117
+#define WALK_TO_Y_FROM_103   108
+
+#define WALK_TO_BUCKET_X     174
+#define WALK_TO_BUCKET_Y     151
+
+#define WALK_TO_MAID_X       174
+#define WALK_TO_MAID_Y       151
+
+#define WALK_TO_BONE_X       255
+#define WALK_TO_BONE_Y       145
+
+#define WALK_TO_GOBLET_X     63
+#define WALK_TO_GOBLET_Y     142
+
+/* cursor points */
+#define LEFT_TABLE_X         98
+
+/* animation controls */
+#define NO_ACTION            0
+#define SCRUB                1
+#define DIP                  2
+#define WIPEBROW             3
+#define SITUP                4
+#define TALK                 5 
+
+/* conversations */
+/* conv002.con   */
+#define CONVERSATION_WITH_MAID        2
+
+/* dynamic hotspots */
+#define MAID_0_X                      189
+#define MAID_0_Y                      123
+#define MAID_0_X_SIZE                 25
+#define MAID_0_Y_SIZE                 11
+
+#define MAID_1_X                      189
+#define MAID_1_Y                      134
+#define MAID_1_X_SIZE                 38
+#define MAID_1_Y_SIZE                 9
+
+#define BUCKET_X                      176
+#define BUCKET_Y                      137
+#define BUCKET_X_SIZE                 10
+#define BUCKET_Y_SIZE                 8
+
+/* random numbers */
+#define RANDOM_LOW_NUMBER             1
+#define RANDOM_HIGH_NUMBER            30
+#define RANDOM_SCRUB_ALLOWED          20
+#define RANDOM_DIP_ALLOWED_LOW        19    
+#define RANDOM_DIP_ALLOWED_HIGH       27
+#define RANDOM_KEEP_SITTING_UP        100   
+#define RANDOM_WIPEBROW_HIGH_NUMBER   100
+
+#define ROOM_105_DOOR_CLOSES      70
+#define ROOM_105_DOOR_OPEN        71
+#define ROOM_105_DOOR_OPEN2       72
+#define ROOM_105_DOOR_OPEN3       73
+#define ROOM_105_DOOR_OPEN4       74
+#define ROOM_105_TAKE_GOBLET      80
+#define ROOM_105_TAKE_GOBLET2     81
+#define ROOM_105_TAKE_GOBLET3     82
+#define ROOM_105_TAKE_BONE        83
+#define ROOM_105_TAKE_BONE2       84
+#define ROOM_105_TAKE_BONE3       85
+
 
 void room_105_init() {
+	ss[fx_fire_left]  = kernel_load_series(kernel_name('x', 0), false);
+	ss[fx_fire_right] = kernel_load_series(kernel_name('x', 1), false);
+	ss[fx_door]       = kernel_load_series(kernel_name('x', 2), false);
+	ss[fx_open_door]  = kernel_load_series("*KGRD_8", false);
+
+	seq[fx_fire_left]  = kernel_seq_forward(ss[fx_fire_left],  false, 7, 0, 0, 0);
+	seq[fx_fire_right] = kernel_seq_forward(ss[fx_fire_right], false, 7, 3, 0, 0);
+
+	local->maid_id[0] = kernel_add_dynamic(words_scullery_maid, words_walk_to, SYNTAX_SINGULAR, KERNEL_NONE, 189, 123, 25, 11);
+	kernel_dynamic_walk(local->maid_id[0], 174, 151, FACING_NORTHEAST);
+	kernel_dynamic_hot[local->maid_id[0]].prep = PREP_ON;
+
+	local->maid_id[1] = kernel_add_dynamic(words_scullery_maid, words_walk_to, SYNTAX_SINGULAR, KERNEL_NONE, 189, 134, 38, 9);
+	kernel_dynamic_walk(local->maid_id[1], 174, 151, FACING_NORTHEAST);
+	kernel_dynamic_hot[local->maid_id[1]].prep = PREP_ON;
+
+	local->bucket_id = kernel_add_dynamic(words_bucket, words_walk_to, SYNTAX_SINGULAR, KERNEL_NONE, 176, 137, 10, 8);
+	kernel_dynamic_walk(local->bucket_id, 174, 151, FACING_NORTHEAST);
+
+	if (object_is_here(goblet)) {
+		ss[fx_goblet]      = kernel_load_series(kernel_name('p', 1), false);
+		ss[fx_take_goblet] = kernel_load_series("*KGRM1_8", false);
+		seq[fx_goblet]     = kernel_seq_stamp(ss[fx_goblet], false, KERNEL_FIRST);
+		local->goblet_id   = kernel_add_dynamic(words_goblet, words_walk_to, SYNTAX_SINGULAR, seq[fx_goblet], 0, 0, 0, 0);
+		kernel_seq_depth(seq[fx_goblet], 6);
+		kernel_dynamic_walk(local->goblet_id, 63, 142, FACING_WEST);
+	}
+
+	if (object_is_here(bone)) {
+		ss[fx_bone]      = kernel_load_series(kernel_name('p', 0), false);
+		ss[fx_take_bone] = kernel_load_series("*KGRD_8", false);
+		seq[fx_bone]     = kernel_seq_stamp(ss[fx_bone], false, KERNEL_FIRST);
+		local->bone_id   = kernel_add_dynamic(words_bone, words_walk_to, SYNTAX_SINGULAR, seq[fx_bone], 0, 0, 0, 0);
+		kernel_seq_depth(seq[fx_bone], 6);
+		kernel_dynamic_walk(local->bone_id, 255, 145, FACING_EAST);
+	}
+
+	conv_get(2);
+	local->new_action   = 1;
+	local->last_action  = 0;
+	local->maid_talking = 0;
+	local->situp        = 0;
+	local->good_number  = 0;
+	aa[0] = kernel_run_animation(kernel_name('A', -1), 1);
+
+	if (previous_room == 106) {
+		player.x      = 104;
+		player.y      = 152;
+		player.facing = FACING_NORTHEAST;
+		seq[fx_door]  = kernel_seq_stamp(ss[fx_door], false, KERNEL_FIRST);
+		kernel_seq_depth(seq[fx_door], 12);
+	} else if (previous_room != KERNEL_RESTORING_GAME) {
+		seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, 6);
+		kernel_seq_depth(seq[fx_door], 12);
+		player_first_walk(120, 96, FACING_SOUTH, 117, 108, FACING_SOUTH, false);
+		player_walk_trigger(ROOM_105_DOOR_CLOSES);
+	} else {
+		seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_FIRST);
+		kernel_seq_depth(seq[fx_door], 15);
+	}
 
+	section_1_music();
+}
+
+void room_105_get_random() {
+	int random;
+
+	local->last_action = local->new_action;
+	random = imath_random(RANDOM_LOW_NUMBER, RANDOM_HIGH_NUMBER);
+	if (random < RANDOM_SCRUB_ALLOWED) {
+		local->new_action = SCRUB;
+		local->good_number = true;
+
+	} else if ((random > RANDOM_DIP_ALLOWED_LOW) &&
+		(random < RANDOM_DIP_ALLOWED_HIGH) && (local->last_action != DIP)) {
+		local->new_action = DIP;
+		local->good_number = true;
+
+	} else if (local->last_action != WIPEBROW) {
+		local->new_action = WIPEBROW;
+		local->good_number = true;
+	}
+}
+
+void room_105_random_wipebrow() {
+	int random;
+
+	local->last_action = local->new_action;
+	random = imath_random(RANDOM_LOW_NUMBER, RANDOM_WIPEBROW_HIGH_NUMBER);
+
+	if (random < RANDOM_KEEP_SITTING_UP) {
+		local->new_action = SITUP;
+		local->good_number = true;
+
+	} else if (local->last_action != WIPEBROW) {
+		local->new_action = WIPEBROW;
+		local->good_number = true;
+	}
 }
 
 void room_105_daemon() {
+	int reset_frame;
+
+	/* Control scullery maid animation */
+	if (kernel_anim[aa[0]].anim != NULL) {
+		if (kernel_anim[aa[0]].frame != local->maid_frame) {
+			local->maid_frame = kernel_anim[aa[0]].frame;
+			reset_frame = -1;
+
+			if (local->situp && !local->maid_talking) {
+				local->last_action = local->new_action;
+				local->new_action = SITUP;
+			}
+
+			if (local->maid_talking) {
+				local->last_action = local->new_action;
+				local->new_action = TALK;
+			}
 
+			switch (local->maid_frame) {
+			case 16:
+				/* Has finished scrubbing */
+				if (local->new_action == SCRUB) {
+					local->good_number = false;
+					while (!local->good_number) {
+						room_105_get_random();
+					}
+				}
+				if (local->new_action == SCRUB) {
+					reset_frame = 1;
+				}
+				if ((local->new_action == WIPEBROW && !local->situp) ||
+					local->new_action == SITUP) {
+					reset_frame = 53;
+				}
+				if ((local->new_action == WIPEBROW) && (local->situp)) {
+					reset_frame = 24;
+				}
+				break;
+
+			case 24:
+				/* Has finished dip */
+				if (local->new_action == DIP) {
+					local->good_number = false;
+					while (!local->good_number) {
+						room_105_get_random();
+					}
+				}
+				if ((local->new_action == WIPEBROW) || (local->new_action == TALK)) {
+					reset_frame = 53;
+				}
+				if (local->new_action == SCRUB) {
+					reset_frame = 56;
+				}
+				if (local->new_action == SITUP) {
+					reset_frame = 53;
+				}
+				break;
+
+			case 32:
+				/* Has finished wiping brow */
+				if (local->new_action == WIPEBROW) {
+					local->good_number = false;
+					while (!local->good_number) {
+						room_105_get_random();
+					}
+				}
+				if ((local->new_action == SCRUB) || (local->new_action == DIP)) {
+					reset_frame = 57;
+				}
+				if (local->new_action == SITUP) {
+					reset_frame = 55;
+				}
+				break;
+
+				/* Has finished talking */
+			case 53:
+				local->maid_talking = false;
+				local->good_number = false;
+				while (!local->good_number) {
+					room_105_get_random();
+				}
+				if (local->new_action == SCRUB) {
+					reset_frame = 60;
+				}
+				if (local->new_action == DIP) {
+					reset_frame = 57;
+				}
+				if (local->new_action == WIPEBROW) {
+					reset_frame = 63;
+				}
+				if (local->new_action == SITUP) {
+					reset_frame = 55;
+				}
+				break;
+
+			case 56:
+				if (local->new_action == SITUP) {
+					local->good_number = false;
+					while (!local->good_number) {
+						room_105_random_wipebrow();
+					}
+				}
+				if (local->new_action == SITUP) {
+					reset_frame = 55;
+				}
+				if (local->new_action == TALK) {
+					reset_frame = 32;
+				}
+				if (local->new_action == WIPEBROW) {
+					reset_frame = 24;
+				}
+				break;
+
+			case 57:
+				if (local->new_action == SCRUB) {
+					reset_frame = 1;
+				}
+				break;
+
+			case 60:
+				if (local->new_action == SCRUB) {
+					reset_frame = 1;
+				}
+				if (local->new_action == DIP) {
+					reset_frame = 16;
+				}
+				break;
+
+			case 63:
+				if (local->new_action == SCRUB) {
+					reset_frame = 1;
+				}
+				break;
+
+			case 64:
+				/* wipebrow move - didn't check for action status so wouldn't fall */
+				/* through code. Will always go to frame 24.                       */
+				reset_frame = 24;
+				break;
+			}
+
+			if (reset_frame >= 0) {
+				if (reset_frame != kernel_anim[aa[0]].frame) {
+					kernel_reset_animation(aa[0], reset_frame);
+					local->maid_frame = reset_frame;
+				}
+			}
+		}
+	}
+
+	/* Close the door when player enters */
+	if (kernel.trigger >= ROOM_105_DOOR_CLOSES) {
+		switch (kernel.trigger) {
+		case ROOM_105_DOOR_CLOSES:
+			kernel_seq_delete(seq[fx_door]);
+			sound_play(N_DoorCloses);
+			seq[fx_door] = kernel_seq_backward(ss[fx_door], false,
+				6, 0, 0, 1);
+			kernel_seq_depth(seq[fx_door], 12);
+			kernel_seq_range(seq[fx_door], 1, 5);
+			kernel_seq_trigger(seq[fx_door],
+				KERNEL_TRIGGER_EXPIRE, 0, ROOM_105_DOOR_CLOSES + 1);
+			break;
+
+		case ROOM_105_DOOR_CLOSES + 1:
+			local->temp = seq[fx_door];
+			seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_FIRST);
+			kernel_seq_depth(seq[fx_door], 15);
+			kernel_synch(KERNEL_SERIES, seq[fx_door], KERNEL_SERIES, local->temp);
+			player.commands_allowed = true;
+			break;
+		}
+	}
 }
 
-void room_105_pre_parser() {
+void room_105_conversation() {
+	if (player_verb == conv002_counter_only) {
+		if (!local->situp) {
+			local->situp = true;
+		}
+	}
 
+	if ((player_verb == conv002_banter_random) ||
+		(player_verb == conv002_flirt_rand)) {
+		switch (kernel.trigger) {
+		case 0:
+			conv_you_trigger(1);
+			break;
+
+		case 1:
+			local->maid_talking = true;
+			local->situp = false;
+			conv_me_trigger(2);
+			break;
+
+		case 2:
+			local->maid_talking = false;
+			break;
+		}
+	}
+}
+
+void room_105_pre_parser() {
+	if (player_parse(words_talk_to, words_scullery_maid, 0))
+		local->situp = -1;
 }
 
 void room_105_parser() {
+	int temp;
+
+	if (player.look_around) {
+		text_show(10501);
+		goto handled;
+	}
+
+	if (conv_control.running == CONVERSATION_WITH_MAID) {
+		room_105_conversation();
+		goto handled;
+	}
+
+	if (player_said_2(walk_through, door_to_hallway) || player_said_2(open, door_to_hallway) ||
+		player_said_2(pull, door_to_hallway)) {
+		switch (kernel.trigger) {
+		case 0:
+			player.commands_allowed = false;
+			player.walker_visible = false;
+			seq[fx_open_door] = kernel_seq_pingpong(ss[fx_open_door],
+				false, 8, 0, 0, 2);
+			kernel_seq_player(seq[fx_open_door], true);
+			kernel_seq_trigger(seq[fx_open_door],
+				KERNEL_TRIGGER_SPRITE, 2, 1);
+			kernel_seq_trigger(seq[fx_open_door],
+				KERNEL_TRIGGER_EXPIRE, 0, 3);
+			break;
+
+		case 1:
+			kernel_seq_delete(seq[fx_door]);
+			sound_play(N_DoorOpens);
+			seq[fx_door] = kernel_seq_forward(ss[fx_door], false,
+				6, 0, 0, 1);
+			kernel_seq_depth(seq[fx_door], 12);
+			kernel_seq_trigger(seq[fx_door],
+				KERNEL_TRIGGER_EXPIRE, 0, 2);
+			break;
+
+		case 2:
+			local->temp = seq[fx_door];
+			seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_LAST);
+			kernel_seq_depth(seq[fx_door], 12);
+			kernel_synch(KERNEL_SERIES, seq[fx_door], KERNEL_SERIES, local->temp);
+			break;
+
+		case 3:
+			player.walker_visible = true;
+			kernel_synch(KERNEL_PLAYER, 0, KERNEL_SERIES, seq[fx_open_door]);
+			kernel_timing_trigger(1, 4);
+			break;
+
+		case 4:
+			player_walk(START_X_ROOM_103, START_Y_ROOM_103, FACING_NORTH);
+			player_walk_trigger(5);
+			break;
+
+		case 5:
+			kernel_seq_delete(seq[fx_door]);
+			sound_play(N_DoorCloses);
+			seq[fx_door] = kernel_seq_backward(ss[fx_door], false, 7, 0, 0, 1);
+			kernel_seq_depth(seq[fx_door], 1);
+			kernel_seq_trigger(seq[fx_door], KERNEL_TRIGGER_EXPIRE, 0, 6);
+			break;
+
+		case 6:
+			temp = seq[fx_door];
+			seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_FIRST);
+			kernel_seq_depth(seq[fx_door], 1);
+			kernel_synch(KERNEL_SERIES, seq[fx_door], KERNEL_SERIES, temp);
+			kernel_timing_trigger(6, 7);
+			break;
+
+		case 7:
+			new_room = 103;
+			break;
+		}
+		goto handled;
+	}
+
+	if (player_said_2(walk_through, door_to_throne_room) || player_said_2(open, door_to_throne_room) ||
+		player_said_2(pull, door_to_throne_room)) {
+		new_room = 106;
+		goto handled;
+	}
+
+	if (player_said_2(talk_to, scullery_maid)) {
+		conv_run(CONVERSATION_WITH_MAID);
+		goto handled;
+	}
+
+	if (player_said_2(take, goblet)) {
+		if (kernel.trigger || !player_has(goblet)) {
+			switch (kernel.trigger) {
+			case 0:
+				player.commands_allowed = false;
+				player.walker_visible = false;
+				seq[fx_take_goblet] = kernel_seq_pingpong(ss[fx_take_goblet],
+					true, 6, 0, 0, 2);
+				kernel_seq_range(seq[fx_take_goblet], 1, 7);
+				kernel_seq_player(seq[fx_take_goblet], true);
+				kernel_seq_trigger(seq[fx_take_goblet],
+					KERNEL_TRIGGER_SPRITE, 7, 1);
+				kernel_seq_trigger(seq[fx_take_goblet],
+					KERNEL_TRIGGER_EXPIRE, 0, 2);
+				break;
+
+			case 1:
+				/* sound_queue (N_PickUpObject006);*/
+				kernel_seq_delete(seq[fx_goblet]);
+				kernel_delete_dynamic(local->goblet_id);
+				sound_play(N_TakeObjectSnd);
+				inter_give_to_player(goblet);
+				object_examine(goblet, 10519, 0);
+				break;
+
+			case 2:
+				kernel_synch(KERNEL_PLAYER, 0, KERNEL_SERIES, seq[fx_take_goblet]);
+				global[player_score] += 1;
+				player.walker_visible = true;
+				player.commands_allowed = true;
+				break;
+			}
+			goto handled;
+		}
+	}
+
+	if (player_said_2(take, bone) && player.main_object_source == STROKE_INTERFACE) {
+		if (kernel.trigger || !player_has(bone)) {
+			switch (kernel.trigger) {
+			case 0:
+				player.commands_allowed = false;
+				player.walker_visible = false;
+				seq[fx_take_bone] = kernel_seq_pingpong(ss[fx_take_bone],
+					false, 6, 0, 0, 2);
+				kernel_seq_player(seq[fx_take_bone], true);
+				kernel_seq_trigger(seq[fx_take_bone],
+					KERNEL_TRIGGER_SPRITE, 6, 1);
+				kernel_seq_trigger(seq[fx_take_bone],
+					KERNEL_TRIGGER_EXPIRE, 0, 2);
+				break;
+
+			case 1:
+				/* sound_queue (N_PickUpObject006);*/
+				kernel_seq_delete(seq[fx_bone]);
+				sound_play(N_TakeObjectSnd);
+				kernel_delete_dynamic(local->bone_id);
+				inter_give_to_player(bone);
+				object_examine(bone, 10520, 0);
+				break;
+
+			case 2:
+				kernel_synch(KERNEL_PLAYER, 0, KERNEL_SERIES, seq[fx_take_bone]);
+				if (!(global[player_score_flags] & SCORE_TAKE_BONE)) {
+					global[player_score_flags] = global[player_score_flags] | SCORE_TAKE_BONE;
+					global[player_score] += 1;
+				}
+				player.walker_visible = true;
+				player.commands_allowed = true;
+				break;
+			}
+			goto handled;
+		}
+	}
+
+	if (player_said_2(take, bone) && player_has(bone) &&
+		player.main_object_source == STROKE_INTERFACE) {
+		text_show(40112);
+		goto handled;
+	}
+
+	if (player_said_1(look) || player_said_1(look_at)) {
 
+		if (player_said_1(floor)) {
+			text_show(10502);
+			goto handled;
+		}
+
+		if (player_said_1(brazier)) {
+			text_show(10503);
+			goto handled;
+		}
+
+		if (player_said_1(dining_table)) {
+			if (inter_point_x <= 98) {
+				if (object[goblet].location == HERE) {
+					text_show(10505);
+				} else {
+					text_show(10522);
+				}
+			} else {
+				text_show(10504);
+			}
+			goto handled;
+		}
+
+		if (player_said_1(chair)) {
+			text_show(10507);
+			goto handled;
+		}
+
+		if (player_said_1(window)) {
+			text_show(10508);
+			goto handled;
+		}
+
+		if (player_said_1(tapestry)) {
+			text_show(10509);
+			goto handled;
+		}
+
+		if (player_said_1(door_to_throne_room)) {
+			text_show(10511);
+			goto handled;
+		}
+
+		if (player_said_1(wall)) {
+			text_show(10512);
+			goto handled;
+		}
+
+		if (player_said_1(door_to_hallway)) {
+			text_show(10513);
+			goto handled;
+		}
+
+		if (player_said_1(dividing_wall)) {
+			text_show(10514);
+			goto handled;
+		}
+
+		if (player_said_1(ceiling)) {
+			text_show(10515);
+			goto handled;
+		}
+
+		if (player_said_1(scullery_maid)) {
+			text_show(10516);
+			goto handled;
+		}
+
+		if (player_said_1(goblet)) {
+			if (object_is_here(goblet)) {
+				text_show(10517);
+				goto handled;
+			}
+		}
+
+		if (player_said_1(bone)) {
+			if (object_is_here(bone)) {
+				text_show(10518);
+				goto handled;
+			}
+		}
+
+		if (player_said_1(sconce)) {
+			text_show(10524);
+			goto handled;
+		}
+
+		if (player_said_1(bucket)) {
+			text_show(10521);
+			goto handled;
+		}
+	}
+
+	if (player_said_2(take, scullery_maid)) {
+		text_show(30);
+		goto handled;
+	}
+
+	if ((player_said_1(push) || player_said_1(pull)) &&
+		player_said_1(dining_table)) {
+		text_show(10506);
+		goto handled;
+	}
+
+	if ((player_said_1(push) || player_said_1(pull)) &&
+		player_said_1(tapestry)) {
+		text_show(10510);
+		goto handled;
+	}
+
+	goto done;
+
+handled:
+	player.command_ready = false;
+
+done:
+	;
+}
+
+void room_105_error() {
 }
 
 void room_105_synchronize(Common::Serializer &s) {
-	
 }
 
 void room_105_preload() {
-	room_init_code_pointer = room_105_init;
+	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;
+	room_parser_code_pointer     = room_105_parser;
+	room_daemon_code_pointer     = room_105_daemon;
 
 	section_1_walker();
 	section_1_interface();
+
+	vocab_make_active(words_scullery_maid);
+	vocab_make_active(words_bucket);
+	vocab_make_active(words_walk_to);
+	vocab_make_active(words_bone);
+	vocab_make_active(words_goblet);
 }
 
 } // namespace Rooms
diff --git a/engines/mads/madsv2/dragonsphere/rooms/room105.h b/engines/mads/madsv2/dragonsphere/rooms/room105.h
index f6bde79a9f3..6789665922d 100644
--- a/engines/mads/madsv2/dragonsphere/rooms/room105.h
+++ b/engines/mads/madsv2/dragonsphere/rooms/room105.h
@@ -30,17 +30,8 @@ namespace MADSV2 {
 namespace Dragonsphere {
 namespace Rooms {
 
-#define local (&scratch)
-#define ss    local->sprite
-#define seq   local->sequence
-#define aa    local->animation
-
-/**
- * Room local variables
- */
-struct Scratch {
-
-};
+extern void room_105_preload();
+extern void room_105_synchronize(Common::Serializer &s);
 
 } // namespace Rooms
 } // namespace Dragonsphere
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 19f157b18f2..fa0d8485ad7 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -180,7 +180,7 @@ MODULE_OBJS += \
 	madsv2/phantom/sound_phantom.o \
 	madsv2/dragonsphere/dragonsphere.o \
 	madsv2/dragonsphere/global.o \
-	madsv2/dragonsphere/mads/dragon_mads.o \
+	madsv2/dragonsphere/mads/mads.o \
 	madsv2/dragonsphere/rooms/section1.o \
 	madsv2/dragonsphere/rooms/room101.o \
 	madsv2/dragonsphere/rooms/section2.o \




More information about the Scummvm-git-logs mailing list