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

dreammaster noreply at scummvm.org
Sun May 10 06:11:28 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:
d2676bbcc5 MADS: DRAGONSPHERE: Added room 107


Commit: d2676bbcc5a9cf259356b3d7743c91f02a4e1d19
    https://github.com/scummvm/scummvm/commit/d2676bbcc5a9cf259356b3d7743c91f02a4e1d19
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-05-10T16:11:16+10:00

Commit Message:
MADS: DRAGONSPHERE: Added room 107

Changed paths:
    engines/mads/madsv2/dragonsphere/mads/conv.h
    engines/mads/madsv2/dragonsphere/mads/inventory.h
    engines/mads/madsv2/dragonsphere/mads/words.h
    engines/mads/madsv2/dragonsphere/rooms/room107.cpp


diff --git a/engines/mads/madsv2/dragonsphere/mads/conv.h b/engines/mads/madsv2/dragonsphere/mads/conv.h
index 8a0dadad7c6..b64f6ffcd08 100644
--- a/engines/mads/madsv2/dragonsphere/mads/conv.h
+++ b/engines/mads/madsv2/dragonsphere/mads/conv.h
@@ -43,6 +43,19 @@ enum {
 	conv003_replies_defeat = 5
 };
 
+enum {
+	conv004_seen_only = 0,
+	conv004_resolved_only = 1,
+	conv004_am_only = 2,
+	conv004_wait_only = 3,
+	conv004_thanks_only = 4,
+	conv004_nay_only = 5,
+	conv004_queen_only = 6,
+	conv004_fathers_only = 7,
+	conv004_last_only = 8,
+	conv004_exit_b_b = 10
+};
+
 enum {
 	conv034_five_b_b = 4,
 	conv034_seven_only = 7,
diff --git a/engines/mads/madsv2/dragonsphere/mads/inventory.h b/engines/mads/madsv2/dragonsphere/mads/inventory.h
index 1ad6da59151..b683c6c157a 100644
--- a/engines/mads/madsv2/dragonsphere/mads/inventory.h
+++ b/engines/mads/madsv2/dragonsphere/mads/inventory.h
@@ -30,6 +30,8 @@ namespace Dragonsphere {
 
 enum {
 	dummy  = 0,
+	shieldstone = 3,
+	sword = 4,
 	goblet = 5,
 	bone   = 6,
 	rare_coin = 38,
diff --git a/engines/mads/madsv2/dragonsphere/mads/words.h b/engines/mads/madsv2/dragonsphere/mads/words.h
index 2fde0fd32eb..ca35cd68311 100644
--- a/engines/mads/madsv2/dragonsphere/mads/words.h
+++ b/engines/mads/madsv2/dragonsphere/mads/words.h
@@ -28,31 +28,34 @@ 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_look                 =   3,
+	words_take                 =   4,
+	words_push                 =   5,
+	words_open                 =   6,
+	words_talk_to              =   8,
+	words_pull                 =  10,
+	words_walk_to              =  13,
 	words_floor                =  16,
+	words_rug                  =  18,
 	words_carpet               =  19,
 	words_wall                 =  20,
 	words_window               =  24,
 	words_tapestry             =  26,
 	words_look_at              =  30,
+	words_fireplace            =  34,
+	words_fireplace_screen     =  35,
 	words_walk_through         =  37,
 	words_wall_plaque          =  40,
+	words_decoration           =  41,
+	words_shieldstone          =  55,
+	words_sword                =  56,
 	words_goblet               =  59,
 	words_bone                 =  62,
 	words_brazier              = 175,
 	words_door_to_throne_room  = 176,
+	words_dining_table         = 178,
+	words_door_to_guardroom    = 189,
 	words_door_to_council_room = 190,
 	words_ceiling              = 196,
 	words_door_to_hallway      = 197,
@@ -60,16 +63,23 @@ enum {
 	words_chair                = 202,
 	words_dividing_wall        = 208,
 	words_bucket               = 225,
-	words_platform             = 255,
-	words_step                 = 256,
-	words_queen_s_throne       = 260,
-	words_sconce               = 329,
-	words_dining_table         = 178,
+	words_painting             = 231,
+	words_document             = 232,
+	words_ink_bottle           = 233,
+	words_quill_pen            = 234,
+	words_chandelier           = 235,
+	words_council_table        = 236,
+	words_candlestick          = 237,
+	words_desk                 = 238,
 	words_door_to_meeting_room = 249,
 	words_door_to_ballroom     = 250,
 	words_door_to_courtyard    = 254,
+	words_platform             = 255,
+	words_step                 = 256,
 	words_king_s_throne        = 258,
+	words_queen_s_throne       = 260,
 	words_scullery_maid        = 266,
+	words_sconce               = 329,
 	words_sit_on               = 363,
 	words_Dragonsphere         = 571
 };
diff --git a/engines/mads/madsv2/dragonsphere/rooms/room107.cpp b/engines/mads/madsv2/dragonsphere/rooms/room107.cpp
index e172713a8e6..7eddaadfa93 100644
--- a/engines/mads/madsv2/dragonsphere/rooms/room107.cpp
+++ b/engines/mads/madsv2/dragonsphere/rooms/room107.cpp
@@ -23,8 +23,13 @@
 #include "mads/madsv2/core/game.h"
 #include "mads/madsv2/core/imath.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/core/object.h"
 #include "mads/madsv2/core/sound.h"
 #include "mads/madsv2/core/text.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/global.h"
 #include "mads/madsv2/dragonsphere/rooms/section1.h"
 #include "mads/madsv2/dragonsphere/rooms/room107.h"
@@ -35,6 +40,23 @@ namespace Dragonsphere {
 namespace Rooms {
 
 struct Scratch {
+	int16 sprite[15];       /* Sprite series handles */
+	int16 sequence[15];     /* Sequence handles      */
+	int16 animation[4];     /* Animation handles     */
+
+
+	int16 temp;             /* for synching sprites */
+
+	int16 qm_frame;         /* animation frame being held for Queen mom stuff */
+	int16 qm_action;        /* Type of action to run for Queem mom animation */
+	int16 anim_0_running;
+
+	int16 q_frame;          /* animation frame being held for Queen stuff */
+	int16 q_action;         /* Type of action to run for Queen animation */
+	int16 q_talk_count;     /* counter for Queen talking */
+	int16 anim_1_running;
+
+	int16 prevent;
 };
 
 #define local (&scratch)
@@ -42,22 +64,660 @@ struct Scratch {
 #define seq   local->sequence
 #define aa    local->animation
 
-//static Scratch scratch;
+static Scratch scratch;
+
+/* ========================= Sprites ========================= */
+
+#define fx_shieldstone        1  /* rm107p0 */
+#define fx_sword              2  /* rm107p1 */
+#define fx_take_sword_stone   3  /* kgrm_3  */
+#define fx_door               4  /* rm107x  */ 
+#define fx_open_door          5  /* kgrd_9  */ 
+#define fx_fire               6  /* rm107y0 */
+#define fx_chandelier_candles 7  /* rm107y1 */
+#define fx_fire_sconce        8  /* rm107y2 */
+
+
+/* ======================== Triggers ========================= */
+
+#define ROOM_107_DOOR_CLOSES  70
+#define ROOM_107_TALK         78
+#define ROOM_107_YOU_TALK     80
+#define ROOM_107_ME_TALK      82
+
+
+/* walk points */
+#define START_X_ROOM_108      28
+#define START_Y_ROOM_108      152
+#define START_X_ROOM_106      68
+#define START_Y_ROOM_106      83
+#define START_X_ROOM_106_2    66
+#define START_Y_ROOM_106_2    76
+#define WALK_TO_X_FROM_106    70
+#define WALK_TO_Y_FROM_106    102
+
+/* cursor_points */
+#define DOCUMENT_1_Y          129
+#define DOCUMENT_3_X          136
+
+#define TALK_X                59
+#define TALK_Y                106
+
+#define QM_SHUT_UP            0
+#define QM_TALK               1
+#define QM_LEAVE              2
+
+#define Q_SHUT_UP             0
+#define Q_TALK                1
+#define Q_TALK_TO_QM          2
+#define Q_LEAVE               3
+
+#define CONV_4_QUEENS         4
+
+
+static void room_107_init() {
+	if (previous_room != KERNEL_RESTORING_GAME) {
+		local->anim_0_running = false;
+		local->anim_1_running = false;
+		local->prevent = false;
+	}
+
+	conv_get(CONV_4_QUEENS);
+
+
+	/* Load sprite series */
+
+	ss[fx_fire] = kernel_load_series(kernel_name('y', 0), false);
+	ss[fx_chandelier_candles] = kernel_load_series(kernel_name('y', 1), false);
+	ss[fx_door] = kernel_load_series(kernel_name('x', -1), false);
+	ss[fx_open_door] = kernel_load_series("*KGRD_9", false);
+	ss[fx_fire_sconce] = kernel_load_series(kernel_name('y', 2), false);
+
+
+	seq[fx_fire_sconce] = kernel_seq_forward(ss[fx_fire_sconce], false, 7, 0, 0, 0);
+	seq[fx_fire] = kernel_seq_forward(ss[fx_fire], false, 7, 0, 0, 0);
+	kernel_seq_depth(seq[fx_fire], 15);
+	seq[fx_chandelier_candles] = kernel_seq_forward(ss[fx_chandelier_candles], false, 7, 0, 0, 0);
+
+	if (object_is_here(sword) || object_is_here(shieldstone)) {
+		ss[fx_take_sword_stone] = kernel_load_series("*KGRM_3", false);
+	}
+
+	/* Start continuous sequences */
+	/* must put dynamics first before sprite sequencing */
+
+	if (object_is_here(sword)) {
+		ss[fx_sword] = kernel_load_series(kernel_name('p', 1), false);
+		seq[fx_sword] = kernel_seq_stamp(ss[fx_sword], false, KERNEL_FIRST);
+		kernel_seq_depth(seq[fx_sword], 6);
+
+	} else {
+		kernel_flip_hotspot(words_sword, false);
+	}
+
+	if (object_is_here(shieldstone)) {
+		ss[fx_shieldstone] = kernel_load_series(kernel_name('p', 0), false);
+		seq[fx_shieldstone] = kernel_seq_stamp(ss[fx_shieldstone], false, KERNEL_FIRST);
+		kernel_seq_depth(seq[fx_shieldstone], 6);
+
+	} else {
+		kernel_flip_hotspot(words_shieldstone, false);
+	}
+
+	if (previous_room == 108) {        /* Player comes from the Guardroom */
+		player.x = START_X_ROOM_108;
+		player.y = START_Y_ROOM_108;
+		player.facing = FACING_NORTHEAST;
+		seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_FIRST);
+		kernel_seq_depth(seq[fx_door], 15);
+
+	} else if (previous_room != KERNEL_RESTORING_GAME) { /* Player comes from Throne room rm108 */
+		seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_LAST);
+		kernel_seq_depth(seq[fx_door], 13);
+
+		if (player.been_here_before) {
+			player_first_walk(START_X_ROOM_106, START_Y_ROOM_106, FACING_SOUTH,
+				WALK_TO_X_FROM_106, WALK_TO_Y_FROM_106, FACING_SOUTH,
+				false);
+			player_walk_trigger(ROOM_107_DOOR_CLOSES);
+
+		} else {
+			player_first_walk(START_X_ROOM_106, START_Y_ROOM_106, FACING_SOUTH,
+				TALK_X, TALK_Y, FACING_NORTHEAST, false);
+			player_walk_trigger(ROOM_107_TALK);
+
+			aa[0] = kernel_run_animation(kernel_name('q', 1), 0);
+			local->anim_0_running = true;
+			local->qm_action = QM_SHUT_UP;
+			/* Queen Mother */
+
+			aa[1] = kernel_run_animation(kernel_name('q', -1), 0);
+			local->anim_1_running = true;
+			local->q_action = Q_SHUT_UP;
+			/* Queen */
+
+			player.commands_allowed = false;
+		}
+
+	} else {
+
+		seq[fx_door] = kernel_seq_stamp(ss[fx_door], false, KERNEL_FIRST);
+		kernel_seq_depth(seq[fx_door], 15);
+	}
+
+	section_1_music();
+}
+
+static void handle_animation_qm() {
+	int qm_reset_frame;
+
+	if (kernel_anim[aa[0]].frame != local->qm_frame) {
+		local->qm_frame = kernel_anim[aa[0]].frame;
+		qm_reset_frame = -1;
+
+		switch (local->qm_frame) {
+		case 7:   /* end of talk           */
+		case 8:   /* end of freeze         */
+		case 22:  /* end of different talk */
+			switch (local->qm_action) {
+			case QM_TALK:
+				local->qm_action = QM_SHUT_UP;
+				if (imath_random(1, 2) == 1) {
+					qm_reset_frame = 8;  /* talk */
+				} else {
+					qm_reset_frame = 0;  /* different talk */
+				}
+				break;
+
+			case QM_SHUT_UP:
+				qm_reset_frame = 7;    /* freeze */
+				break;
+
+			case QM_LEAVE:
+				qm_reset_frame = 22;   /* leave */
+				break;
+			}
+			break;
+
+		case 62: /* qm is almost out of room */
+			kernel_timing_trigger(1, ROOM_107_DOOR_CLOSES);
+			break;
+
+		case 68:
+			if (local->anim_1_running) {
+				qm_reset_frame = 67;
+
+			} else {
+				kernel_abort_animation(aa[0]);
+				local->anim_0_running = false;
+			}
+			break;
+		}
+
+		if (qm_reset_frame >= 0) {
+			kernel_reset_animation(aa[0], qm_reset_frame);
+			local->qm_frame = qm_reset_frame;
+		}
+	}
+}
+
+static void handle_animation_q() {
+	int q_reset_frame;
+
+	if (kernel_anim[aa[1]].frame != local->q_frame) {
+		local->q_frame = kernel_anim[aa[1]].frame;
+		q_reset_frame = -1;
+
+		switch (local->q_frame) {
+
+		case 1:   /* end of freeze                       */
+		case 10:  /* end of talk                         */
+		case 27:  /* end of talk to QM (from other node) */
+			switch (local->q_action) {
+			case Q_TALK_TO_QM:
+				q_reset_frame = 15;   /* talk to QM (new node) */
+				break;
+
+			case Q_TALK:
+				q_reset_frame = 1;    /* talk */
+				local->q_action = Q_SHUT_UP;
+				break;
 
-void room_107_init() {
+			case Q_LEAVE:
+				q_reset_frame = 27;   /* leave */
+				break;
 
+			case Q_SHUT_UP:
+				q_reset_frame = 0;    /* freeze */
+				break;
+			}
+			break;
+
+		case 21:   /* end of talk frame 1 */
+		case 22:   /* end of talk frame 2 */
+		case 23:   /* end of talk frame 3 */
+			if (local->q_action == Q_TALK_TO_QM) {
+				q_reset_frame = imath_random(20, 22);
+				++local->q_talk_count;
+				if (local->q_talk_count > 15) {
+					if (local->q_action != Q_LEAVE) {
+						local->q_action = Q_SHUT_UP;
+					}
+					local->q_talk_count = 0;
+					q_reset_frame = 23; /* return to other node to freeze (new node) */
+				}
+			} else {
+				q_reset_frame = 23; /* return to other node to freeze (new node) */
+			}
+			break;
+
+		case 42:  /* just out the door */
+			local->qm_action = QM_LEAVE;
+			break;
+
+		case 83:
+			kernel_abort_animation(aa[1]);
+			local->anim_1_running = false;
+			break;
+		}
+
+		if (q_reset_frame >= 0) {
+			kernel_reset_animation(aa[1], q_reset_frame);
+			local->q_frame = q_reset_frame;
+		}
+	}
 }
 
 void room_107_daemon() {
+	if (local->anim_0_running) {
+		handle_animation_qm();
+	}
 
+	if (local->anim_1_running) {
+		handle_animation_q();
+	}
+
+	if (kernel.trigger >= ROOM_107_DOOR_CLOSES) {
+		switch (kernel.trigger) {
+		case ROOM_107_DOOR_CLOSES:
+			kernel_seq_delete(seq[fx_door]);
+			sound_play(N_DoorCloses);
+			seq[fx_door] = kernel_seq_backward(ss[fx_door], false,
+				8, 0, 0, 1);
+			kernel_seq_depth(seq[fx_door], 14);
+			kernel_seq_range(seq[fx_door], 1, 5);
+			kernel_seq_trigger(seq[fx_door],
+				KERNEL_TRIGGER_EXPIRE, 0, ROOM_107_DOOR_CLOSES + 1);
+			break;
+
+		case ROOM_107_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], 14);
+			kernel_synch(KERNEL_SERIES, seq[fx_door], KERNEL_SERIES, local->temp);
+			if (conv_control.running != CONV_4_QUEENS) {
+				player.commands_allowed = true;
+			}
+			break;
+		}
+	}
+
+	if (kernel.trigger == ROOM_107_TALK) {
+		conv_run(CONV_4_QUEENS);
+		conv_export_value(false);
+		conv_export_value(false);
+	}
 }
 
-void room_107_pre_parser() {
+static void process_conversation_queens() {
+	int you_trig_flag = false;
+	int me_trig_flag = false;
+
+	if (player_verb == conv004_exit_b_b) {
+		local->q_action = Q_LEAVE;
+		you_trig_flag = true;
+		me_trig_flag = true;
+	}
 
+	if (local->q_action != Q_LEAVE) {
+		switch (kernel.trigger) {
+		case ROOM_107_YOU_TALK:
+			switch (player_verb) {
+			case conv004_seen_only:
+				local->q_action = Q_TALK_TO_QM;
+				break;
+
+			case conv004_am_only:
+			case conv004_wait_only:
+			case conv004_queen_only:
+			case conv004_last_only:
+				local->q_action = Q_TALK;
+				break;
+
+			case conv004_resolved_only:
+			case conv004_thanks_only:
+			case conv004_nay_only:
+			case conv004_fathers_only:
+				local->qm_action = QM_TALK;
+				local->q_action = Q_SHUT_UP;
+				break;
+			}
+			break;
+
+		case ROOM_107_ME_TALK:
+			local->qm_action = QM_SHUT_UP;
+			local->q_action = Q_SHUT_UP;
+			break;
+		}
+	}
+
+	if (!me_trig_flag) {
+		conv_me_trigger(ROOM_107_ME_TALK);
+	} /* if me_trig_flag == true, then a me trigger is called from above, not here. */
+
+	if (!you_trig_flag) {
+		conv_you_trigger(ROOM_107_YOU_TALK);
+	} /* if you_trig_flag == true, then a you trigger is called from above, not here. */
+
+	local->q_talk_count = 0;
 }
 
-void room_107_parser() {
+static void room_107_pre_parser() {
+	if (player_said_2(look, document)) {
+		player.need_to_walk = true;
+	}
+}
+
+static void room_107_parser() {
+	if (conv_control.running == CONV_4_QUEENS) {
+		process_conversation_queens();
+		goto handled;
+	}
+
+	if (player.look_around) {
+		text_show(10701);
+		goto handled;
+	}
+
+	if (player_said_2(walk_through, door_to_guardroom) || player_said_2(open, door_to_guardroom) ||
+		player_said_2(pull, door_to_guardroom)) {
+		new_room = 108;
+		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)) {
+		switch (kernel.trigger) {
+		case 0:
+			player.commands_allowed = false;
+			player.walker_visible = false;
+			seq[fx_open_door] = kernel_seq_pingpong(ss[fx_open_door],
+				true, 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], 15);
+			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], 15);
+			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_106, START_Y_ROOM_106, FACING_NORTH);
+			player_walk_trigger(5);
+			break;
+
+		case 5:
+			player_walk(START_X_ROOM_106_2, START_Y_ROOM_106_2, FACING_NORTH);
+			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], 1);
+			kernel_seq_trigger(seq[fx_door],
+				KERNEL_TRIGGER_EXPIRE, 0, 6);
+			break;
+
+		case 6:
+			new_room = 106;
+			break;
+		}
+		goto handled;
+	}
+
+	if (player_said_2(take, sword)) {
+		switch (kernel.trigger) {
+		case 0:
+			if (!player_has(sword)) {
+				player.commands_allowed = false;
+				player.walker_visible = false;
+				seq[fx_take_sword_stone] = kernel_seq_pingpong(ss[fx_take_sword_stone], true, 7, 0, 0, 2);
+				kernel_seq_trigger(seq[fx_take_sword_stone], KERNEL_TRIGGER_SPRITE, 5, 2);
+				kernel_seq_trigger(seq[fx_take_sword_stone], KERNEL_TRIGGER_EXPIRE, 0, 3);
+				kernel_seq_depth(seq[fx_take_sword_stone], 1);
+				kernel_seq_range(seq[fx_take_sword_stone], KERNEL_FIRST, 6);
+				kernel_seq_player(seq[fx_take_sword_stone], true);
+				goto handled;
+			}
+			break;
+
+		case 2:
+			if (local->prevent) {
+				kernel_seq_delete(seq[fx_sword]);
+				kernel_flip_hotspot(words_sword, false);
+				global[player_score] += 1;
+				sound_play(N_TakeObjectSnd);
+				inter_give_to_player(sword);
+				object_examine(sword, 10726, 0);
+			}
+			local->prevent = true;
+			goto handled;
+			break;
+
+		case 3:
+			local->prevent = false;
+			player.walker_visible = true;
+			player.commands_allowed = true;
+			kernel_synch(KERNEL_PLAYER, 0, KERNEL_SERIES, seq[fx_take_sword_stone]);
+			goto handled;
+			break;
+		}
+	}
+
+	if (player_said_2(take, shieldstone)) {
+		switch (kernel.trigger) {
+		case 0:
+			if (!player_has(shieldstone)) {
+				player.commands_allowed = false;
+				player.walker_visible = false;
+				seq[fx_take_sword_stone] = kernel_seq_pingpong(ss[fx_take_sword_stone], true, 7, 0, 0, 2);
+				kernel_seq_trigger(seq[fx_take_sword_stone], KERNEL_TRIGGER_SPRITE, 3, 2);
+				kernel_seq_trigger(seq[fx_take_sword_stone], KERNEL_TRIGGER_EXPIRE, 0, 3);
+				kernel_seq_depth(seq[fx_take_sword_stone], 1);
+				kernel_seq_range(seq[fx_take_sword_stone], KERNEL_FIRST, 4);
+				kernel_seq_player(seq[fx_take_sword_stone], true);
+				goto handled;
+			}
+			break;
+
+		case 2:
+			if (local->prevent) {
+				kernel_seq_delete(seq[fx_shieldstone]);
+				kernel_flip_hotspot(words_shieldstone, false);
+				global[player_score] += 1;
+				sound_play(N_TakeObjectSnd);
+				inter_give_to_player(shieldstone);
+				object_examine(shieldstone, 10725, 0);
+			}
+			local->prevent = true;
+			goto handled;
+			break;
+
+		case 3:
+			local->prevent = false;
+			player.walker_visible = true;
+			player.commands_allowed = true;
+			kernel_synch(KERNEL_PLAYER, 0, KERNEL_SERIES, seq[fx_take_sword_stone]);
+			goto handled;
+			break;
+		}
+	}
+
+	if (player_said_1(look) || player_said_1(look_at)) {
+		if (player_said_1(quill_pen)) {
+			text_show(10702);
+			goto handled;
+		}
+
+		if (player_said_1(chair)) {
+			text_show(10704);
+			goto handled;
+		}
+
+		if (player_said_1(council_table)) {
+			text_show(10705);
+			goto handled;
+		}
+
+		if (player_said_1(ink_bottle)) {
+			text_show(10706);
+			goto handled;
+		}
+
+		if (player_said_1(door_to_throne_room)) {
+			text_show(10707);
+			goto handled;
+		}
+
+		if (player_said_1(candlestick)) {
+			text_show(10708);
+			goto handled;
+		}
+
+		if (player_said_1(rug)) {
+			text_show(10709);
+			goto handled;
+		}
+
+		if (player_said_1(desk)) {
+			text_show(10711);
+			goto handled;
+		}
+
+		if (player_said_1(document)) {
+			if (inter_point_y <= DOCUMENT_1_Y) {
+				text_show(10712);
+				text_show(10713);
+
+			} else if (inter_point_x >= DOCUMENT_3_X) {
+				text_show(10716);
+
+			} else {
+				text_show(10714);
+				text_show(10715);
+			}
+			goto handled;
+		}
+
+		if (player_said_1(door_to_guardroom)) {
+			text_show(10717);
+			goto handled;
+		}
+
+		if (player_said_1(fireplace)) {
+			text_show(10718);
+			goto handled;
+		}
+
+		if (player_said_1(fireplace_screen)) {
+			text_show(10719);
+			goto handled;
+		}
+
+		if ((player_said_1(look) || player_said_1(look_at)) &&
+			player_said_1(chandelier)) {
+			text_show(10721);
+			goto handled;
+		}
+
+		if (player_said_1(painting)) {
+			text_show(10722);
+			goto handled;
+		}
+
+		if (player_said_1(shieldstone) && object_is_here(shieldstone)) {
+			text_show(10723);
+			goto handled;
+		}
+
+		if (player_said_1(sword) && object_is_here(sword)) {
+			text_show(10724);
+			goto handled;
+		}
+
+		if (player_said_1(decoration)) {
+			text_show(10727);
+			goto handled;
+		}
+
+		if (player_said_1(sconce)) {
+			text_show(10728);
+			goto handled;
+		}
+	}
+
+	if (player_said_1(take) &&
+		(player_said_1(quill_pen) ||
+			player_said_1(ink_bottle) ||
+			player_said_1(document))) {
+		text_show(10703);
+		goto handled;
+	}
+
+	if ((player_said_1(push) || player_said_1(pull)) &&
+		player_said_1(fireplace_screen)) {
+		text_show(10720);
+		goto handled;
+	}
+
+	if (player_said_2(pull, rug)) {
+		text_show(10710);
+		goto handled;
+	}
+
+	if (player_said_2(take, candlestick)) {
+		text_show(10729);
+		goto handled;
+	}
+
+	goto done;
+
+handled:
+	player.command_ready = false;
 
+done:
+	;
 }
 
 void room_107_synchronize(Common::Serializer &s) {




More information about the Scummvm-git-logs mailing list