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

dreammaster noreply at scummvm.org
Fri Jun 5 10:54:57 UTC 2026


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

Summary:
c55ec411de MADS: FOREST: Implemented room 107
f157eaacdc MADS: FOREST: Implemented room 199


Commit: c55ec411deb5780469ebd6a7fbd991f7c61cc1eb
    https://github.com/scummvm/scummvm/commit/c55ec411deb5780469ebd6a7fbd991f7c61cc1eb
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-06-05T20:54:49+10:00

Commit Message:
MADS: FOREST: Implemented room 107

Changed paths:
    engines/mads/madsv2/forest/rooms/room107.cpp


diff --git a/engines/mads/madsv2/forest/rooms/room107.cpp b/engines/mads/madsv2/forest/rooms/room107.cpp
index 4e4075d4524..a8c4aa9a173 100644
--- a/engines/mads/madsv2/forest/rooms/room107.cpp
+++ b/engines/mads/madsv2/forest/rooms/room107.cpp
@@ -19,16 +19,12 @@
  *
  */
 
-#include "mads/madsv2/core/conv.h"
+#include "mads/madsv2/core/digi.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/sound.h"
-#include "mads/madsv2/core/text.h"
-#include "mads/madsv2/forest/mads/inventory.h"
-#include "mads/madsv2/forest/mads/sounds.h"
-#include "mads/madsv2/forest/mads/words.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/mouse.h"
+#include "mads/madsv2/core/player.h"
 #include "mads/madsv2/forest/global.h"
 #include "mads/madsv2/forest/rooms/section1.h"
 #include "mads/madsv2/forest/rooms/room107.h"
@@ -39,14 +35,12 @@ namespace Forest {
 namespace Rooms {
 
 struct Scratch {
-	int16 sprite[15];       /* Sprite series handles */
-	int16 sequence[15];     /* Sequence handles      */
-	int16 animation[4];     /* Animation handles     */
-
-	int16 dragon_frame;     /* frame animation is on */
-
-	int16 done_with_conv;   /* T if done with conv   */
-	int16 prev_room;
+	int16 sprite[10];            /* 0x00 — sprite series handles  */
+	int16 sequence[10];          /* 0x14 — sequence handles       */
+	int16 animation[10];         /* 0x28 — animation handles      */
+	AnimationInfo animation_info[10]; /* 0x3C */
+	int16 _8c;                        /* 0x8C */
+	int16 _8e;                        /* 0x8C */
 };
 
 static Scratch scratch;
@@ -55,12 +49,99 @@ static Scratch scratch;
 #define ss    local->sprite
 #define seq   local->sequence
 #define aa    local->animation
+#define aainfo scratch.animation_info
 
+static void room_107_anim1();
 
 static void room_107_init() {
+	flags[8] = 5;
+
+	ss[0] = kernel_load_series(kernel_name('b', 1), 0);
+	seq[0] = kernel_seq_stamp(ss[0], false, KERNEL_FIRST);
+	kernel_seq_depth(seq[0], 1);
+	kernel_seq_loc(seq[0], 274, 147);
+	kernel_seq_scale(seq[0], 100);
+
+	ss[1] = kernel_load_series(kernel_name('e', 1), 0);
+	seq[1] = kernel_seq_stamp(ss[1], false, KERNEL_FIRST);
+	kernel_seq_depth(seq[1], 1);
+	kernel_seq_loc(seq[1], 167, 115);
+	kernel_seq_scale(seq[1], 100);
+
+	ss[2] = kernel_load_series(kernel_name('r', 1), 0);
+	seq[2] = kernel_seq_stamp(ss[2], false, KERNEL_FIRST);
+	kernel_seq_depth(seq[2], 1);
+	kernel_seq_loc(seq[2], 75, 149);
+	kernel_seq_scale(seq[2], 100);
+
+	viewing_at_y = 22;
+	global[player_score] = 0;
+	global[g009] = 0;
+	player.walker_visible = 0;
+	player.commands_allowed = 0;
+	mouse_hide();
+
+	for (int16 i = 0; i < 10; i++) {
+		aainfo[i]._val1 = 0;
+		aainfo[i]._val2 = -1;
+	}
+
+	kernel_timing_trigger(5, 100);
+}
+
+static void room_107_anim1() {
+	int16 prev_frame = aainfo[0]._val2;
+	int16 frame = kernel_anim[aa[0]].frame;
+
+	if (frame != prev_frame) {
+		aainfo[0]._val2 = frame;
+
+		if (frame == 30) {
+			new_room = 104;
+		} else if (frame < 30) {
+			if (frame == 1) {
+				kernel_seq_delete(seq[0]);
+				kernel_seq_delete(seq[1]);
+				kernel_seq_delete(seq[2]);
+			} else if (frame == 21) {
+				aainfo[0]._val3 = 1;
+				digi_play_build(107, 'b', 1, 1);
+				scratch._8e = 21;
+			} else if (frame == 26) {
+				if (aainfo[0]._val3 == 1) {
+					aainfo[0]._val2 = 21;
+					kernel_reset_animation(aa[0], 21);
+				}
+			}
+		}
+	}
+
+	if (kernel.trigger == 7 || kernel.trigger == 28) {
+		if (scratch._8e == 21) {
+			aainfo[0]._val3 = 2;
+			scratch._8e = -1;
+			global_digi_play(4);
+			aainfo[0]._val2 = 26;
+			kernel_reset_animation(aa[0], 26);
+		}
+	}
 }
 
 static void room_107_daemon() {
+	if (global[player_hyperwalked] == -1) {
+		game_save_name(0);
+		kernel_save_game(save_game_buf);
+		new_room = 904;
+	}
+
+	if (kernel.trigger == 100) {
+		aa[0] = kernel_run_animation(kernel_name('T', 1), 0);
+		aainfo[0]._val1 = -1;
+		scratch._8c = 30;
+	}
+
+	if (aainfo[0]._val1 != 0)
+		room_107_anim1();
 }
 
 static void room_107_pre_parser() {
@@ -73,6 +154,8 @@ void room_107_synchronize(Common::Serializer &s) {
 	for (int16 &v : scratch.sprite)    s.syncAsSint16LE(v);
 	for (int16 &v : scratch.sequence)  s.syncAsSint16LE(v);
 	for (int16 &v : scratch.animation) s.syncAsSint16LE(v);
+	for (AnimationInfo &ai : scratch.animation_info) ai.synchronize(s);
+	s.syncAsSint16LE(scratch._8c);
 }
 
 void room_107_preload() {
@@ -83,6 +166,7 @@ void room_107_preload() {
 
 	section_1_walker();
 	section_1_interface();
+	player.walker_must_reload = true;
 }
 
 } // namespace Rooms


Commit: f157eaacdc564b45043341feaa6c820636136409
    https://github.com/scummvm/scummvm/commit/f157eaacdc564b45043341feaa6c820636136409
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-06-05T20:54:50+10:00

Commit Message:
MADS: FOREST: Implemented room 199

Changed paths:
    engines/mads/madsv2/forest/rooms/room199.cpp


diff --git a/engines/mads/madsv2/forest/rooms/room199.cpp b/engines/mads/madsv2/forest/rooms/room199.cpp
index 1ad9e804b96..beffb90cfe8 100644
--- a/engines/mads/madsv2/forest/rooms/room199.cpp
+++ b/engines/mads/madsv2/forest/rooms/room199.cpp
@@ -19,17 +19,14 @@
  *
  */
 
-#include "mads/madsv2/core/conv.h"
+#include "mads/madsv2/core/digi.h"
 #include "mads/madsv2/core/game.h"
-#include "mads/madsv2/core/imath.h"
-#include "mads/madsv2/core/inter.h"
+#include "mads/madsv2/core/global.h"
 #include "mads/madsv2/core/kernel.h"
-#include "mads/madsv2/core/sound.h"
-#include "mads/madsv2/core/text.h"
-#include "mads/madsv2/forest/mads/inventory.h"
-#include "mads/madsv2/forest/mads/sounds.h"
-#include "mads/madsv2/forest/mads/words.h"
+#include "mads/madsv2/core/matte.h"
+#include "mads/madsv2/core/player.h"
 #include "mads/madsv2/forest/global.h"
+#include "mads/madsv2/forest/journal.h"
 #include "mads/madsv2/forest/rooms/section1.h"
 #include "mads/madsv2/forest/rooms/room199.h"
 
@@ -39,14 +36,10 @@ namespace Forest {
 namespace Rooms {
 
 struct Scratch {
-	int16 sprite[15];       /* Sprite series handles */
-	int16 sequence[15];     /* Sequence handles      */
-	int16 animation[4];     /* Animation handles     */
-
-	int16 dragon_frame;     /* frame animation is on */
-
-	int16 done_with_conv;   /* T if done with conv   */
-	int16 prev_room;
+	int16 sprite[10];            /* 0x00 — sprite series handles  */
+	int16 sequence[10];          /* 0x14 — sequence handles       */
+	int16 animation[10];         /* 0x28 — animation handles      */
+	AnimationInfo animation_info[10]; /* 0x3C */
 };
 
 static Scratch scratch;
@@ -55,24 +48,517 @@ static Scratch scratch;
 #define ss    local->sprite
 #define seq   local->sequence
 #define aa    local->animation
+#define aainfo scratch.animation_info
 
 
+static void room_199_init1() {
+	if (flags[15] >= 1) {
+		ss[1] = kernel_load_series("*rm199n2", 0); seq[7] = kernel_seq_stamp(ss[1], false, 1); kernel_seq_depth(seq[7], 5);
+	}
+	if (flags[16] >= 1) {
+		ss[2] = kernel_load_series("*rm199n3", 0); seq[8] = kernel_seq_stamp(ss[2], false, 1); kernel_seq_depth(seq[8], 5);
+	}
+	if (flags[17] >= 1 || flags[24] >= 1) {
+		ss[3] = kernel_load_series("*rm199n5", 0); seq[9] = kernel_seq_stamp(ss[3], false, 1); kernel_seq_depth(seq[9], 5);
+	}
+	if (flags[18] >= 1) {
+		ss[4] = kernel_load_series("*rm199n4", 0); aa[0] = kernel_seq_stamp(ss[4], false, 1); kernel_seq_depth(aa[0], 5);
+	}
+	if (flags[19] >= 1) {
+		ss[5] = kernel_load_series("*rm199n7", 0); aa[1] = kernel_seq_stamp(ss[5], false, 1); kernel_seq_depth(aa[1], 5);
+	}
+	if (flags[20] >= 1) {
+		ss[6] = kernel_load_series("*rm199n8", 0); aa[2] = kernel_seq_stamp(ss[6], false, 1); kernel_seq_depth(aa[2], 5);
+	}
+	if (flags[21] >= 1 || flags[25] >= 1) {
+		ss[7] = kernel_load_series("*rm199n6", 0); aa[3] = kernel_seq_stamp(ss[7], false, 1); kernel_seq_depth(aa[3], 5);
+	}
+	if (flags[22] >= 1) {
+		ss[8] = kernel_load_series("*rm199n9", 0); aa[4] = kernel_seq_stamp(ss[8], false, 1); kernel_seq_depth(aa[4], 5);
+	}
+	if (flags[26] >= 1 || flags[31] >= 1) {
+		ss[9] = kernel_load_series("*rm199n10", 0); aa[5] = kernel_seq_stamp(ss[9], false, 1); kernel_seq_depth(aa[5], 5);
+	}
+	if (flags[27] >= 1) {
+		seq[0] = kernel_load_series("*rm199n11", 0); aa[6] = kernel_seq_stamp(seq[0], false, 1); kernel_seq_depth(aa[6], 5);
+	}
+	if (flags[28] >= 1) {
+		seq[1] = kernel_load_series("*rm199n12", 0); aa[7] = kernel_seq_stamp(seq[1], false, 1); kernel_seq_depth(aa[7], 5);
+	}
+	if (flags[29] >= 1) {
+		seq[2] = kernel_load_series("*rm199n13", 0); aa[8] = kernel_seq_stamp(seq[2], false, 1); kernel_seq_depth(aa[8], 5);
+	}
+	if (flags[30] >= 1) {
+		seq[3] = kernel_load_series("*rm199n14", 0); aa[9] = kernel_seq_stamp(seq[3], false, 1); kernel_seq_depth(aa[9], 5);
+	}
+	if (flags[32] >= 1) {
+		seq[4] = kernel_load_series("*rm199n15", 0); aainfo[0]._val1 = kernel_seq_stamp(seq[4], false, 1); kernel_seq_depth(aainfo[0]._val1, 5);
+	}
+	if (flags[33] >= 1) {
+		seq[5] = kernel_load_series("*rm199n16", 0); aainfo[0]._val2 = kernel_seq_stamp(seq[5], false, 1); kernel_seq_depth(aainfo[0]._val2, 5);
+	}
+}
+
 static void room_199_init() {
+	global[player_score] = 0;
+	global[g009] = -1;
+	global_digi_play(7);
+
+	aainfo[2]._val3 = -1;
+	aainfo[2]._val4 = 0;
+	aainfo[3]._val1 = 0;
+	aainfo[3]._val2 = -1;
+
+	if (previous_room == 304 || previous_room == 402) {
+		if (global[g070] != 0) {
+			aainfo[2]._val2 = 1;
+			ss[1] = kernel_load_series("*rm199z1", 0);
+			kernel_flip_hotspot(99, false);
+			kernel_flip_hotspot(174, false);
+			int16 slot = aainfo[2]._val2;
+			seq[6 + slot] = kernel_seq_stamp(ss[slot], false, 1);
+			kernel_seq_depth(seq[6 + slot], 1);
+			aainfo[2]._val1 = slot;
+			player.commands_allowed = 0;
+			kernel_timing_trigger(300, 111);
+			return;
+		}
+		room_199_init1();
+		aainfo[2]._val2 = 0;
+		ss[0] = kernel_load_series("*rm199n1", 0);
+	} else if (previous_room == 503) {
+		aainfo[2]._val2 = 3;
+		ss[3] = kernel_load_series("*rm199v1", 0);
+		kernel_flip_hotspot(99, false);
+		kernel_flip_hotspot(174, false);
+		int16 slot = aainfo[2]._val2;
+		seq[6 + slot] = kernel_seq_stamp(ss[slot], false, 1);
+		kernel_seq_depth(seq[6 + slot], 5);
+		aainfo[2]._val1 = slot;
+		player.commands_allowed = 0;
+		kernel_timing_trigger(2, 112);
+		return;
+	} else {
+		room_199_init1();
+		aainfo[2]._val2 = 0;
+		ss[0] = kernel_load_series("*rm199n1", 0);
+	}
+
+	kernel_flip_hotspot(99, false);
+	kernel_flip_hotspot(174, false);
+	int16 slot = aainfo[2]._val2;
+	seq[6 + slot] = kernel_seq_stamp(ss[slot], false, 1);
+	kernel_seq_depth(seq[6 + slot], 1);
+	aainfo[2]._val1 = slot;
+}
+
+static int room_199_anim1() {
+	if (!player_has(6))  return 0;
+	if (!player_has(12)) return 0;
+	if (!player_has(0))  return 0;
+	if (!player_has(2))  return 0;
+	if (!player_has(14)) return 0;
+	if (!player_has(4))  return 0;
+	if (!player_has(8))  return 0;
+	if (!player_has(10)) return 0;
+	if (!player_has(9))  return 0;
+	if (!player_has(11)) return 0;
+	if (!player_has(7))  return 0;
+	return 1;
+}
+
+static void room_199_anim2() {
+	if (kernel.trigger == 7)
+		kernel_timing_trigger(30, 28);
+	if (kernel.trigger != 28)
+		return;
+
+	switch (aainfo[2]._val3) {
+	case 1:
+		if (!player_has(14)) digi_play_build(521, 'e', 6, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 2; return;
+	case 2:
+		if (!player_has(11)) digi_play_build(521, 'e', 10, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 3; return;
+	case 3:
+		if (!player_has(12)) digi_play_build(521, 'e', 3, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 4; return;
+	case 4:
+		if (!player_has(10)) digi_play_build(521, 'e', 8, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 5; return;
+	case 5:
+		if (!player_has(9)) digi_play_build(521, 'e', 9, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 6; return;
+	case 6:
+		if (!player_has(8)) digi_play_build(521, 'e', 20, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 7; return;
+	case 7:
+		if (!player_has(2)) digi_play_build(521, 'e', 5, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 8; return;
+	case 8:
+		if (!player_has(6)) digi_play_build(521, 'e', 2, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 9; return;
+	case 9:
+		if (!player_has(4)) digi_play_build(521, 'e', 7, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 10; return;
+	case 10:
+		if (!player_has(0)) digi_play_build(521, 'e', 4, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 11; return;
+	case 11:
+		if (!player_has(7)) digi_play_build(521, 'e', 21, 1);
+		else kernel_timing_trigger(2, 28);
+		aainfo[2]._val3 = 12; return;
+	case 12:
+		digi_play_build(521, 'b', 1, 1);
+		aainfo[2]._val3 = 20; return;
+	case 14:
+		aainfo[2]._val4 = 0;
+		aainfo[2]._val3 = -1;
+		aainfo[3]._val1 = 0;
+		kernel_timing_trigger(2, 113);
+		return;
+	default:
+		return;
+	}
+}
+
+static void room_199_anim3() {
+	switch (aainfo[2]._val3) {
+	case 1:  digi_play_build(521, 'e', 6, 1);  break;
+	case 2:  digi_play_build(521, 'e', 10, 1); break;
+	case 3:  digi_play_build(521, 'e', 3, 1);  break;
+	case 4:  digi_play_build(521, 'e', 8, 1);  break;
+	case 5:  digi_play_build(521, 'e', 9, 1);  break;
+	case 6:  digi_play_build(521, 'e', 20, 1); break;
+	case 7:  digi_play_build(521, 'e', 5, 1);  break;
+	case 8:  digi_play_build(521, 'e', 2, 1);  break;
+	case 9:  digi_play_build(521, 'e', 7, 1);  break;
+	case 10: digi_play_build(521, 'e', 4, 1);  break;
+	case 11: digi_play_build(521, 'e', 21, 1); break;
+	default: break;
+	}
+}
+
+static void room_199_anim4() {
+	if (kernel.trigger == 7) {
+		kernel_timing_trigger(15, 28);
+		aainfo[2]._val3++;
+	}
+	if (kernel.trigger != 28)
+		return;
+
+	switch (aainfo[2]._val3) {
+	case 1:
+		if (player_has(14)) {
+			ss[8] = kernel_load_series("*ob014i", 0);
+			aa[4] = kernel_seq_stamp(ss[8], false, 1);
+			kernel_seq_depth(aa[4], 1);
+			kernel_seq_loc(aa[4], 213, 42);
+			kernel_seq_scale(aa[4], 88);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 2:
+		if (player_has(11)) {
+			seq[3] = kernel_load_series("*ob011i", 0);
+			aa[9] = kernel_seq_stamp(seq[3], false, 1);
+			kernel_seq_depth(aa[9], 1);
+			kernel_seq_loc(aa[9], 250, 41);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 3:
+		if (player_has(12)) {
+			ss[5] = kernel_load_series("*ob012i", 0);
+			aa[1] = kernel_seq_stamp(ss[5], false, 1);
+			kernel_seq_depth(aa[1], 1);
+			kernel_seq_loc(aa[1], 287, 39);
+			kernel_seq_scale(aa[1], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 4:
+		if (player_has(10)) {
+			seq[1] = kernel_load_series("*ob010i", 0);
+			aa[7] = kernel_seq_stamp(seq[1], false, 1);
+			kernel_seq_depth(aa[7], 1);
+			kernel_seq_loc(aa[7], 213, 73);
+			kernel_seq_scale(aa[7], 79);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 5:
+		if (player_has(9)) {
+			seq[2] = kernel_load_series("*ob009i", 0);
+			aa[8] = kernel_seq_stamp(seq[2], false, 1);
+			kernel_seq_depth(aa[8], 1);
+			kernel_seq_loc(aa[8], 248, 73);
+			kernel_seq_scale(aa[8], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 6:
+		if (player_has(8)) {
+			seq[0] = kernel_load_series("*ob008i", 0);
+			aa[6] = kernel_seq_stamp(seq[0], false, 1);
+			kernel_seq_depth(aa[6], 1);
+			kernel_seq_loc(aa[6], 287, 72);
+			kernel_seq_scale(aa[6], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 7:
+		if (player_has(2)) {
+			ss[7] = kernel_load_series("*ob002i", 0);
+			aa[3] = kernel_seq_stamp(ss[7], false, 1);
+			kernel_seq_depth(aa[3], 1);
+			kernel_seq_loc(aa[3], 212, 108);
+			kernel_seq_scale(aa[3], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 8:
+		if (player_has(6)) {
+			ss[4] = kernel_load_series("*ob006i", 0);
+			aa[0] = kernel_seq_stamp(ss[4], false, 1);
+			kernel_seq_depth(aa[0], 1);
+			kernel_seq_loc(aa[0], 249, 105);
+			kernel_seq_scale(aa[0], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 9:
+		if (player_has(4)) {
+			ss[9] = kernel_load_series("*ob004i", 0);
+			aa[5] = kernel_seq_stamp(ss[9], false, 1);
+			kernel_seq_depth(aa[5], 1);
+			kernel_seq_loc(aa[5], 285, 108);
+			kernel_seq_scale(aa[5], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 10:
+		if (player_has(0)) {
+			ss[6] = kernel_load_series("*ob000i", 0);
+			aa[2] = kernel_seq_stamp(ss[6], false, 1);
+			kernel_seq_depth(aa[2], 1);
+			kernel_seq_loc(aa[2], 230, 142);
+			kernel_seq_scale(aa[2], 82);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 11:
+		if (player_has(7)) {
+			seq[4] = kernel_load_series("*ob007i", 0);
+			aainfo[0]._val1 = kernel_seq_stamp(seq[4], false, 1);
+			kernel_seq_depth(aainfo[0]._val1, 1);
+			kernel_seq_loc(aainfo[0]._val1, 270, 144);
+			kernel_seq_scale(aainfo[0]._val1, 85);
+		}
+		kernel_timing_trigger(15, 115); return;
+	case 12:
+		aainfo[2]._val4 = 0;
+		aainfo[2]._val3 = -1;
+		kernel_timing_trigger(30, 114);
+		return;
+	default:
+		return;
+	}
 }
 
 static void room_199_daemon() {
+	int16 trig = kernel.trigger;
+
+	if (trig == 7) {
+		if (aainfo[3]._val2 == 11) {
+			aainfo[3]._val2 = -1;
+			kernel_timing_trigger(30, 113);
+		}
+	} else if (trig == 111) {
+		global[g070] = 0;
+		leave_journal();
+		player.commands_allowed = -1;
+	} else if (trig == 112) {
+		aainfo[2]._val3 = 0;
+		aainfo[2]._val4 = -1;
+		digi_play_build(521, 'e', 1, 1);
+	} else if (trig == 113) {
+		leave_journal();
+		player.commands_allowed = -1;
+	} else if (trig == 114) {
+		int result = room_199_anim1();
+		global[g100] = result;
+		if (result) {
+			digi_play_build(521, 'e', 11, 1);
+			aainfo[3]._val2 = 11;
+		} else {
+			aainfo[2]._val3 = 1;
+			aainfo[3]._val1 = -1;
+			digi_play_build(521, 'e', 12, 1);
+			room_199_anim2();
+		}
+	} else if (trig == 115) {
+		room_199_anim3();
+	}
+
+	if (aainfo[2]._val4 != 0)
+		room_199_anim4();
+	if (aainfo[3]._val1 != 0)
+		room_199_anim2();
 }
 
 static void room_199_pre_parser() {
+	// No implementation
+}
+
+static void room_199_parser2() {
+	if (flags[33] >= 1) {
+		kernel_seq_delete(aainfo[0]._val2); matte_deallocate_series(seq[5], -1);
+	}
+	if (flags[32] >= 1) {
+		kernel_seq_delete(aainfo[0]._val1); matte_deallocate_series(seq[4], -1);
+	}
+	if (flags[30] >= 1) {
+		kernel_seq_delete(aa[9]);            matte_deallocate_series(seq[3], -1);
+	}
+	if (flags[29] >= 1) {
+		kernel_seq_delete(aa[8]);            matte_deallocate_series(seq[2], -1);
+	}
+	if (flags[28] >= 1) {
+		kernel_seq_delete(aa[7]);            matte_deallocate_series(seq[1], -1);
+	}
+	if (flags[27] >= 1) {
+		kernel_seq_delete(aa[6]);            matte_deallocate_series(seq[0], -1);
+	}
+	if (flags[26] >= 1 || flags[31] >= 1) {
+		kernel_seq_delete(aa[5]); matte_deallocate_series(ss[9], -1);
+	}
+	if (flags[22] >= 1) {
+		kernel_seq_delete(aa[4]);            matte_deallocate_series(ss[8], -1);
+	}
+	if (flags[21] >= 1 || flags[25] >= 1) {
+		kernel_seq_delete(aa[3]); matte_deallocate_series(ss[7], -1);
+	}
+	if (flags[20] >= 1) {
+		kernel_seq_delete(aa[2]);            matte_deallocate_series(ss[6], -1);
+	}
+	if (flags[19] >= 1) {
+		kernel_seq_delete(aa[1]);            matte_deallocate_series(ss[5], -1);
+	}
+	if (flags[18] >= 1) {
+		kernel_seq_delete(aa[0]);            matte_deallocate_series(ss[4], -1);
+	}
+	if (flags[17] >= 1 || flags[24] >= 1) {
+		kernel_seq_delete(seq[9]); matte_deallocate_series(ss[3], -1);
+	}
+	if (flags[16] >= 1) {
+		kernel_seq_delete(seq[8]);           matte_deallocate_series(ss[2], -1);
+	}
+	if (flags[15] >= 1) {
+		kernel_seq_delete(seq[7]);           matte_deallocate_series(ss[1], -1);
+	}
+}
+
+static void room_199_parser1() {
+	if (aainfo[2]._val1 == 2)
+		kernel_flip_hotspot(99, 0);
+	if (aainfo[2]._val1 == 3)
+		kernel_flip_hotspot(174, 0);
+
+	int16 old_slot = aainfo[2]._val1;
+	kernel_seq_delete(seq[6 + old_slot]);
+	matte_deallocate_series(ss[old_slot], -1);
+
+	if (aainfo[2]._val1 == 0)
+		room_199_parser2();
+
+	int16 new_slot = aainfo[2]._val2;
+	switch (new_slot) {
+	case 0:
+		room_199_init1();
+		ss[new_slot] = kernel_load_series("*rm199n1", 0);
+		break;
+	case 1:
+		ss[new_slot] = kernel_load_series("*rm199z1", 0);
+		break;
+	case 2:
+		ss[new_slot] = kernel_load_series("*rm199i1", 0);
+		kernel_flip_hotspot(99, -1);
+		break;
+	case 3:
+		ss[new_slot] = kernel_load_series("*rm199v1", 0);
+		kernel_flip_hotspot(174, -1);
+		break;
+	}
+
+	seq[6 + new_slot] = kernel_seq_stamp(ss[new_slot], false, 1);
+	kernel_seq_depth(seq[6 + new_slot], 1);
+	aainfo[2]._val1 = aainfo[2]._val2;
+	digi_play_build_ii('_', 1, 2);
 }
 
 static void room_199_parser() {
+	if (player_parse(174, 121, 0)) { digi_play_build(521, 'e', 6, 2);  goto handled; }
+	if (player_parse(174, 164, 0)) { digi_play_build(521, 'e', 10, 2); goto handled; }
+	if (player_parse(174, 112, 0)) { digi_play_build(521, 'e', 3, 2);  goto handled; }
+	if (player_parse(174, 163, 0)) { digi_play_build(521, 'e', 8, 2);  goto handled; }
+	if (player_parse(174, 158, 0)) { digi_play_build(521, 'e', 9, 2);  goto handled; }
+	if (player_parse(174, 154, 0)) { digi_play_build(521, 'e', 20, 2); goto handled; }
+	if (player_parse(174, 96, 0))  { digi_play_build(521, 'e', 5, 2);  goto handled; }
+	if (player_parse(174, 132, 0)) { digi_play_build(521, 'e', 2, 2);  goto handled; }
+	if (player_parse(174, 113, 0)) { digi_play_build(521, 'e', 7, 2);  goto handled; }
+	if (player_parse(174, 105, 0)) { digi_play_build(521, 'e', 4, 2);  goto handled; }
+	if (player_parse(174, 145, 0)) { digi_play_build(521, 'e', 21, 2); goto handled; }
+
+	if (player_parse(99, 82, 0))  { digi_play_build_ii('e', 9, 2);  goto handled; }
+	if (player_parse(99, 131, 0)) { digi_play_build_ii('e', 5, 2);  goto handled; }
+	if (player_parse(99, 142, 0)) { digi_play_build_ii('e', 3, 2);  goto handled; }
+	if (player_parse(99, 146, 0)) { digi_play_build_ii('e', 6, 2);  goto handled; }
+	if (player_parse(99, 150, 0)) { digi_play_build_ii('e', 8, 2);  goto handled; }
+	if (player_parse(99, 95, 0))  { digi_play_build_ii('e', 11, 2); goto handled; }
+	if (player_parse(99, 118, 0)) { digi_play_build_ii('e', 1, 2);  goto handled; }
+	if (player_parse(99, 103, 0)) { digi_play_build_ii('e', 4, 2);  goto handled; }
+	if (player_parse(99, 83, 0))  { digi_play_build_ii('e', 7, 2);  goto handled; }
+	if (player_parse(99, 172, 0)) { digi_play_build_ii('e', 12, 2); goto handled; }
+	if (player_parse(99, 77, 0))  { digi_play_build_ii('e', 2, 2);  goto handled; }
+
+	if (player_parse(94, 0)) {
+		leave_journal();
+		goto handled;
+	}
+
+	if (player_parse(156, 0)) {
+		if (aainfo[2]._val1 != 3) {
+			aainfo[2]._val1 = aainfo[2]._val2;
+			aainfo[2]._val2++;
+		}
+		if (aainfo[2]._val2 != aainfo[2]._val1)
+			room_199_parser1();
+		goto handled;
+	}
+
+	if (player_parse(90, 0)) {
+		if (aainfo[2]._val1 != 0) {
+			aainfo[2]._val1 = aainfo[2]._val2;
+			aainfo[2]._val2--;
+		}
+		if (aainfo[2]._val2 != aainfo[2]._val1)
+			room_199_parser1();
+		goto handled;
+	}
+
+	goto done;
+handled:
+	player.command_ready = false;
+done:
+	;
 }
 
 void room_199_synchronize(Common::Serializer &s) {
 	for (int16 &v : scratch.sprite)    s.syncAsSint16LE(v);
 	for (int16 &v : scratch.sequence)  s.syncAsSint16LE(v);
 	for (int16 &v : scratch.animation) s.syncAsSint16LE(v);
+	for (AnimationInfo &ai : scratch.animation_info) ai.synchronize(s);
 }
 
 void room_199_preload() {
@@ -81,6 +567,8 @@ void room_199_preload() {
 	room_parser_code_pointer = room_199_parser;
 	room_daemon_code_pointer = room_199_daemon;
 
+	global[g016] = -1;
+	player.walker_visible = false;
 	section_1_walker();
 	section_1_interface();
 }




More information about the Scummvm-git-logs mailing list