Files
2026-02-02 04:50:13 +01:00

307 lines
9.6 KiB
C++

/* 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 "m4/riddle/rooms/section8/room810.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
static const char *LOOK[][2] = {
{"sarcophagus", "810r03"},
{"grate", "810r05"},
{"large urn", "810r18"},
{nullptr, nullptr}
};
void Room810::preload() {
LoadWSAssets("OTHER SCRIPT", _G(master_palette));
_G(player).walker_type = WALKER_ALT;
_G(player).shadow_type = SHADOW_ALT;
}
void Room810::init() {
digi_preload("950_s45", 950);
digi_preload("950_s29", 950);
digi_preload("810_s01", -1);
_ripleyTakesJadeSealFromTombSeries = series_load("RIPLEY TAKES JADE SEAL FROM TOMB", -1, nullptr);
_ripPos3LookAroundSeries = series_load("RIP POS 3 LOOK AROUND", -1, nullptr);
_ripTrekHandTalkPos3Series = series_load("RIP TREK HAND TALK POS3", -1, nullptr);
_810FireFlickerSeries = series_load("810 fire flicker", -1, nullptr);
_810LitUrnSeries = series_load("810 lit urn", -1, nullptr);
_810MercSeries = series_load("810merc", -1, nullptr);
_810BlockSlidesOutSeries = series_load("810 block slides out", -1, nullptr);
series_load("810seal", -1, nullptr);
series_load("SAFARI SHADOW 3", -1, nullptr);
series_play("810 fire flicker", 1024, 0, -1, 12, -1, 100, 0, 0, 0, -1);
series_play("810 lit urn", 1024, 0, -1, 12, -1, 100, 0, 0, 0, -1);
_810SealMach = series_show_sprite("810seal", 0, 768);
digi_play_loop("950_s29", 3, 100, -1, 950);
if (_G(game).previous_room == KERNEL_RESTORING_GAME)
return;
_alreadyPlayedVideo04aFl = false;
player_set_commands_allowed(false);
ws_demand_facing(_G(my_walker), 3);
ws_demand_location(_G(my_walker), 55, 318);
ws_walk(_G(my_walker), 160, 318, nullptr, 1, 3, true);
}
void Room810::pre_parser() {
const bool lookFl = player_said_any("look", "look at");
if (lookFl && player_said("mausoleum")) {
digi_play("810r02", 1, 255, -1, 810);
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
} else if (lookFl && player_said(" ")) {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
}
void Room810::parser() {
const bool lookFl = player_said_any("look", "look at");
const bool takeFl = player_said_any("talk", "talk to", "take");
const bool gearFl = player_said("gear");
const bool goFl = player_said("go");
if (lookFl && _G(walker).ripley_said(LOOK)) {
// Nothing: ripley_said() triggers digi_play() if a match is found - Do not remove!
} else if (lookFl && player_said("IMPERIAL SEAL")) {
switch (_G(kernel).trigger) {
case -1:
if (!_alreadyPlayedVideo04aFl) {
player_set_commands_allowed(false);
digi_play("810r04", 1, 255, 1, 810);
} else {
digi_play("810r04", 1, 255, -1, 810);
}
break;
case 1:
digi_play("810r04a", 1, 255, 2, 810);
_alreadyPlayedVideo04aFl = true;
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (lookFl && player_said("mausoleum")) {
// Nothing -> already covered by ripley_said(LOOK)
} else if (lookFl && player_said("urn")) {
digi_play("com061", 1, 255, -1, 997);
} else if (goFl && player_said("outside")) {
digi_play("810r06", 1, 255, -1, 810);
} else if (gearFl && player_said("large urn")) {
digi_play("com072", 1, 255, -1, -1);
} else if (gearFl && player_said("urn")) {
digi_play("com073", 1, 255, -1, -1);
} else if ((takeFl || gearFl) && player_said("IMPERIAL SEAL")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
interface_hide();
digi_play("810r07", 1, 255, 18, 810);
kernel_timing_trigger(180, 10, nullptr);
break;
case 10:
_ripLooksAroundAndNodsMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 415, 312, 46, 512, false, triggerMachineByHashCallback, "rip takes seal");
ws_hide_walker(_G(my_walker));
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripTrekHandTalkPos3Series,1, 6, -1, _ripTrekHandTalkPos3Series, 7, 10, 4);
_safariShadow3Mach = series_show("SAFARI SHADOW 3", 1280, 16, -1, -1, 0, 46, 415, 312);
break;
case 18:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripTrekHandTalkPos3Series, 6, 1, -1, _ripTrekHandTalkPos3Series, 1, 1, 0);
kernel_timing_trigger(15, 20, nullptr);
break;
case 20:
digi_play("810r07A", 1, 255, 40, 810);
kernel_timing_trigger(50, 22, nullptr);
break;
case 22:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripTrekHandTalkPos3Series, 1, 6, -1, _ripTrekHandTalkPos3Series, 7, 10, 4);
kernel_timing_trigger(540, 25, nullptr);
break;
case 24:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripTrekHandTalkPos3Series, 6, 1, -1, _ripTrekHandTalkPos3Series, 1, 1, 0);
break;
case 40:
terminateMachine(_ripLooksAroundAndNodsMach);
terminateMachine(_safariShadow3Mach);
terminateMachine(_810SealMach);
_ripLooksAroundAndNodsMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 512, false, triggerMachineByHashCallback, "rip takes seal");
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 1, 38, 48, _ripleyTakesJadeSealFromTombSeries, 38, 38, 0);
break;
case 48:
_blockSlidesOutMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 768, false, triggerMachineByHashCallback, "block slides out");
sendWSMessage_10000(1, _blockSlidesOutMach, _810BlockSlidesOutSeries, 1, 14, -1, _810BlockSlidesOutSeries, 14, 14, 0);
sendWSMessage_190000(_blockSlidesOutMach, 12);
digi_play("810_s01", 3, 255, 60, 810);
kernel_timing_trigger(40, 50, nullptr);
break;
case 50:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 39, 45, 51, _ripleyTakesJadeSealFromTombSeries, 45, 45, 0);
break;
case 51:
kernel_timing_trigger(45, 52, nullptr);
break;
case 52:
digi_play("810r08", 1, 255, 53, 810);
break;
case 53:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 46, 52, 54, _ripleyTakesJadeSealFromTombSeries, 52, 52, 0);
break;
case 54:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 52, 46, 55, _ripleyTakesJadeSealFromTombSeries, 57, 57, 0);
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 46, 52, 56, _ripleyTakesJadeSealFromTombSeries, 52, 52, 0);
break;
case 55:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 46, 52, 56, _ripleyTakesJadeSealFromTombSeries, 52, 52, 0);
break;
case 56:
digi_play("810r09", 1, 255, 58, 810);
break;
case 58:
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripleyTakesJadeSealFromTombSeries, 52, 84, 110, _ripleyTakesJadeSealFromTombSeries, 84, 84, 0);
kernel_timing_trigger(25, 70, nullptr);
break;
case 60:
digi_stop(3);
digi_unload("810_s01");
digi_play_loop("950_s45", 3, 128, -1, 950);
break;
case 70:
series_play("810merc", 768, 0, 130, 12, 0, 100, 0, 0, 0, 35);
break;
case 110:
terminateMachine(_ripLooksAroundAndNodsMach);
ws_unhide_walker(_G(my_walker));
ws_demand_facing(_G(my_walker), 9);
ws_demand_location(_G(my_walker), 404, 311);
sendWSMessage_3860000(_G(my_walker), 2);
ws_walk(_G(my_walker), 55, 318, nullptr, -1, 9, true);
break;
case 130:
_810MercMach = series_play("810merc", 768, 16, -1, 12, 0, 100, 0, 0, 36, 41);
disable_player_commands_and_fade_init(150);
digi_stop(2);
break;
case 150:
adv_kill_digi_between_rooms(false);
digi_unload("950_s29");
_G(game).setRoom(860);
break;
default:
break;
}
} else if (player_said("journal") && !takeFl && !lookFl && !gearFl) {
digi_play("com042", 1, 255, -1, 950);
} else if (!player_said("walk", "mausoleum"))
return;
_G(player).command_ready = false;
}
void Room810::daemon() {
switch (_G(kernel).trigger) {
case 1:
_ripLooksAroundAndNodsMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 160, 318, 46, 768, false, triggerMachineByHashCallback, "rip looks around and nods");
ws_hide_walker(_G(my_walker));
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripPos3LookAroundSeries, 1, 16, 51, _ripPos3LookAroundSeries, 17, 20, 4);
_safariShadow3Mach = series_show("SAFARI SHADOW 3", 1280, 16, -1, -1, 0, 46, 160, 318);
break;
case 51:
sendWSMessage_190000(_ripLooksAroundAndNodsMach, 20);
digi_play("810r01", 1, 255, 52, 810);
break;
case 52:
sendWSMessage_190000(_ripLooksAroundAndNodsMach, 12);
sendWSMessage_10000(1, _ripLooksAroundAndNodsMach, _ripPos3LookAroundSeries, 16, 1, 53, _ripPos3LookAroundSeries, 1, 1, 0);
break;
case 53:
terminateMachine(_ripLooksAroundAndNodsMach);
terminateMachine(_safariShadow3Mach);
ws_unhide_walker(_G(my_walker));
player_set_commands_allowed(true);
break;
default:
break;
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4