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

dreammaster noreply at scummvm.org
Sat Sep 14 17:56:33 UTC 2024


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

Summary:
decdedd830 M4: RIDDLE: Room 506 init, daemon, pre-parser


Commit: decdedd830ae8a296d88edaa07e3151040b738e0
    https://github.com/scummvm/scummvm/commit/decdedd830ae8a296d88edaa07e3151040b738e0
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-09-14T10:56:20-07:00

Commit Message:
M4: RIDDLE: Room 506 init, daemon, pre-parser

Changed paths:
    engines/m4/riddle/rooms/section5/room506.cpp
    engines/m4/riddle/rooms/section5/room506.h


diff --git a/engines/m4/riddle/rooms/section5/room506.cpp b/engines/m4/riddle/rooms/section5/room506.cpp
index a11f86e92c8..618ecde1792 100644
--- a/engines/m4/riddle/rooms/section5/room506.cpp
+++ b/engines/m4/riddle/rooms/section5/room506.cpp
@@ -22,15 +22,226 @@
 #include "m4/riddle/rooms/section5/room506.h"
 #include "m4/graphics/gr_series.h"
 #include "m4/riddle/vars.h"
+#include "m4/gui/gui_vmng_screen.h"
 
 namespace M4 {
 namespace Riddle {
 namespace Rooms {
 
+#define PALETTE_BLOCK 39
+
+Room506::Room506() : Room() {
+}
+
 void Room506::init() {
+	_flag2 = _flag3 = _flag4 = false;
+
+	if (_G(game).previous_room != KERNEL_RESTORING_GAME)
+		_flag1 = true;
+
+	for (int i = 0; i < 39; ++i)
+		_palette[i] = _G(master_palette)[i + 7];
+
+	_G(kernel).call_daemon_every_loop = true;
+	hotspot_set_active("OBSERVATORY DOOR", !_G(flags)[V156]);
+	digi_preload("506_s01");
+	digi_play_loop("506_s01", 3, 100);
+
+	if (_G(flags)[V157] == 1)
+		_dome = series_play("506dome2", 0x100, 16, -1, 5);
+
+	if (inv_object_in_scene("CRYSTAL SKULL", 510)) {
+		_skullSparkle = series_play("506 skull sparkle", 0x100, 16, -1, 5, 0, 100, 0, 0, 0, 0);
+		kernel_timing_trigger(imath_ranged_rand(600, 3600), 505);
+	}
+
+	switch (_G(game).previous_room) {
+	case KERNEL_RESTORING_GAME:
+		break;
+
+	case 504:
+		_flag1 = false;
+		MoveScreenDelta(-640, 0);
+		player_set_commands_allowed(false);
+		series_play("506 RIP UP STEPS", 0x700, 0, 503, 5);
+		ws_demand_location(1054, 346, 12);
+		ws_hide_walker();
+		break;
+
+	case 507:
+		digi_unload("507_s02");
+		ws_demand_location(346, 214, 4);
+		ws_walk(420, 234, nullptr, 502, 4);
+		player_set_commands_allowed(false);
+		break;
+
+	case 508:
+		player_set_commands_allowed(false);
+
+		if (_G(flags)[V158]) {
+			ws_demand_location(100, 100);
+			ws_hide_walker();
+			digi_preload("506_s02");
+			digi_unload("508_s01");
+			_domeRotation = series_stream("506 DOME ROTATION", 20, 0x100, -1);
+			series_stream_break_on_frame(_domeRotation, 45, 500);
+			digi_play("506_S02", 1);
+		} else {
+			ws_demand_location(346, 214, 4);
+			ws_walk(420, 234, nullptr, 502, 4);
+		}
+		break;
+
+	default:
+		MoveScreenDelta(-432, 0);
+		ws_demand_location(754, 242, 8);
+		ws_walk(697, 247, nullptr, 502, 8);
+		break;
+	}
+
+	if (_flag1)
+		restorePalette();
+	else
+		setupPalette();
 }
 
 void Room506::daemon() {
+	switch (_G(kernel).trigger) {
+	case 500:
+		disable_player_commands_and_fade_init(501);
+		break;
+
+	case 501:
+		adv_kill_digi_between_rooms(false);
+		digi_play_loop("506_s01", 3, 100);
+		_G(game).setRoom(508);
+		break;
+
+	case 502:
+		player_set_commands_allowed(true);
+		break;
+
+	case 503:
+		ws_unhide_walker();
+		player_set_commands_allowed(true);
+		break;
+
+	case 505:
+		terminateMachineAndNull(_skullSparkle);
+		_skullSparkle = series_play("506 skull sparkle", 0x100, 16, 506, 5);
+		break;
+
+	case 506:
+		terminateMachineAndNull(_skullSparkle);
+		_skullSparkle = series_play("506 skull sparkle", 0x100, 16, -1, 5);
+		kernel_timing_trigger(imath_ranged_rand(600, 3600), 505);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Room506::pre_parser() {
+	switch (_G(kernel).trigger) {
+	case 1000:
+		_G(i_just_hyperwalked) = true;
+
+		if (_flag4) {
+			ws_walk(_destX, _destY, nullptr, 1002, _destFacing);
+			Common::strcpy_s(_G(player).verb, "IN TOWER");
+		} else {
+			ws_walk(_destX, _destY, nullptr, -1, _destFacing);
+		}
+
+		restorePalette();
+		break;
+
+	case 1001:
+		_G(i_just_hyperwalked) = true;
+
+		if (_flag4) {
+			ws_walk(_destX, _destY, nullptr, 1002, _destFacing);
+			Common::strcpy_s(_G(player).verb, "IN TOWER");
+		} else {
+			ws_walk(_destX, _destY, nullptr, -1, _destFacing);
+		}
+		break;
+
+	case 1002:
+		player_set_commands_allowed(false);
+		disable_player_commands_and_fade_init(1004);
+		break;
+
+	case 1004:
+		_G(game).setRoom(509);
+		break;
+
+	default:
+		break;
+	}
+
+	if (_G(player).need_to_walk || _G(player).ready_to_walk || _G(player).waiting_for_walk) {
+		_flag4 = !scumm_strnicmp(_G(player).verb, "IN TOWER", 8);
+
+		if (_G(player).walk_x > 900 && _flag2 && !player_said("   ") && !player_said("    ")) {
+			saveWalk();
+			ws_walk(717, 144, nullptr, 1000, 1);
+		}
+
+		if (_G(player).walk_x > 900 && _flag3 && !player_said("   ") && !player_said("    ")) {
+			saveWalk();
+			ws_walk(995, 308, nullptr, 1001, 1);
+		}
+	}
+}
+
+void Room506::parser() {
+	// TODO
+}
+
+void Room506::restorePalette() {
+	if (!_flag3) {
+		_flag3 = true;
+		_flag2 = false;
+		hotspot_set_active("   ", false);
+		hotspot_set_active("    ", true);
+
+		Common::copy(_palette, _palette + PALETTE_BLOCK, &_G(master_palette)[21]);
+		gr_pal_set_range(21, PALETTE_BLOCK);
+		_flag1 = true;
+	}
+}
+
+void Room506::setupPalette() {
+	if (!_flag2) {
+		_flag2 = true;
+		_flag3 = false;
+		hotspot_set_active("   ", true);
+		hotspot_set_active("    ", false);
+
+		for (int i = 0; i < PALETTE_BLOCK; ++i) {
+			int palR = MAX(_G(master_palette)[7 + i].r - 100, 0);
+			int palG = MAX(_G(master_palette)[7 + i].g - 100, 0);
+			int palB = MAX(_G(master_palette)[7 + i].b - 100, 0);
+
+			_G(master_palette)[7 + i].r = palR;
+			_G(master_palette)[7 + i].g = palG;
+			_G(master_palette)[7 + i].b = palB;
+		}
+
+		gr_pal_set_range(21, PALETTE_BLOCK);
+		_flag1 = false;
+	}
+}
+
+void Room506::saveWalk() {
+	_G(player).need_to_walk = false;
+	_G(player).ready_to_walk = false;
+	_G(player).waiting_for_walk = false;
+	_destX = _G(player).walk_x;
+	_destY = _G(player).walk_y;
+	_destFacing = _G(player).walk_facing;
 }
 
 } // namespace Rooms
diff --git a/engines/m4/riddle/rooms/section5/room506.h b/engines/m4/riddle/rooms/section5/room506.h
index cbe95d27a9e..627a7b466b6 100644
--- a/engines/m4/riddle/rooms/section5/room506.h
+++ b/engines/m4/riddle/rooms/section5/room506.h
@@ -29,12 +29,30 @@ namespace Riddle {
 namespace Rooms {
 
 class Room506 : public Room {
+private:
+	RGB8 _palette[39];
+	bool _flag1 = false;
+	bool _flag2 = false;
+	bool _flag3 = false;
+	bool _flag4 = false;
+	machine *_dome = nullptr;
+	machine *_skullSparkle = nullptr;
+	machine *_domeRotation = nullptr;
+	int _destX = 0, _destY = 0;
+	int _destFacing = 0;
+
+	void restorePalette();
+	void setupPalette();
+	void saveWalk();
+
 public:
-	Room506() : Room() {}
+	Room506();
 	~Room506() override {}
 
 	void init() override;
 	void daemon() override;
+	void pre_parser() override;
+	void parser() override;
 };
 
 } // namespace Rooms




More information about the Scummvm-git-logs mailing list