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

1110 lines
27 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/section3/room301.h"
#include "m4/adv_r/other.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room301::preload() {
_G(player).walker_type = WALKER_ALT;
_G(player).shadow_type = SHADOW_ALT;
_G(player).walker_in_this_scene = true;
LoadWSAssets("OTHER SCRIPT");
}
void Room301::init() {
_G(flags)[V000] = 1;
digi_preload("950_s01");
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
_travelDest = 0;
_soundName = nullptr;
_nextSound = nullptr;
_ripleyTrigger = -1;
_val6_triggerMode = KT_DAEMON;
_georgeTriggerMode = KT_DAEMON;
_georgeRandomActionCounter = 0;
_showWalkerFlag = false;
_msgRipleyFlag = false;
_convResumeFlag = false;
_val12 = 0;
}
_ripTrekHandTalk3 = series_load("rip trek hand talk pos3");
_ripTrekTalker3 = series_load("RIP TREK TALKER POS3");
_ripTrekTravel = series_load("rip trek travel disp");
_agentStander = series_load("agent stander / talk disp");
_agentCheckingList = series_load("agent checking list on desk");
_agentSlidesPaper = series_load("AGENT SLIDES PAPER TO RIP");
_agentTakesMoney = series_load("agent takes money from rip");
_agentTakesTelegram = series_load("agent takes telegram from slot");
_agentTalk = series_load("agent animated talk disp");
_agentSalutes = series_load("agent salutes rip");
_georgeMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "guy behind desk");
_georgeMode = 0;
_georgeShould = 0;
sendWSMessage(1, _georgeMach, _agentStander, 1, 1, 10, _agentStander, 1, 1, 0);
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
if (inv_object_in_scene("ROMANOV EMERALD", 305)) {
setFlag45();
inv_move_object("ROMANOV EMERALD", NOWHERE);
}
_val12 = checkFlags(false);
player_set_commands_allowed(false);
ws_demand_location(_G(my_walker), 55, 270, 3);
if (_val12 || (!player_been_here(401) && _G(flags)[V092] && !_G(flags)[V093])) {
ws_walk(_G(my_walker), 352, 269, nullptr, 60, 3);
} else if (!player_been_here(301)) {
digi_preload("301r37");
digi_play("301r37", 1, 255, 51);
ws_walk(_G(my_walker), 165, 270, nullptr, -1, 3);
} else {
ws_walk(_G(my_walker), 165, 270, nullptr, 51, 3);
}
}
digi_play_loop("950_s01", 3, 140);
}
void Room301::daemon() {
int frame, val;
switch (_G(kernel).trigger) {
case 1:
player_set_commands_allowed(true);
break;
case 9:
_georgeMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "guy behind desk");
_georgeMode = _georgeShould = 0;
sendWSMessage_10000(1, _georgeMach, _agentStander, 1,
1, 10, _agentStander, 1, 1, 0);
break;
case 10:
if (_georgeMode == 0 && _georgeShould == 0) {
if (_ripleyTrigger != -1) {
kernel_trigger_dispatchx(_ripleyTrigger);
_ripleyTrigger = -1;
if (_showWalkerFlag) {
ws_unhide_walker(_G(my_walker));
_showWalkerFlag = false;
}
}
if (_convResumeFlag) {
conv_resume();
_convResumeFlag = false;
}
if (_msgRipleyFlag) {
sendWSMessage_80000(_ripleyMach);
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel, 10,
10, 20, _ripTrekTravel, 10, 10, 0);
_msgRipleyFlag = false;
}
}
kernel_timing_trigger(1, 11);
break;
case 11:
switch (_georgeMode) {
case 0:
switch (_georgeShould) {
case 0:
val = imath_ranged_rand(1, 3);
++_georgeRandomActionCounter;
if (imath_ranged_rand(10, 40) <= _georgeRandomActionCounter)
_georgeRandomActionCounter = 0;
else
val = 1;
switch (val) {
case 1:
sendWSMessage_10000(1, _georgeMach, _agentStander, 1, 1, 10,
_agentStander, 1, 1, 0);
break;
case 2:
sendWSMessage_10000(1, _georgeMach, _agentStander, 1, 7, 10,
_agentStander, 7, 7, 0);
_georgeMode = _georgeShould = 3;
break;
case 3:
sendWSMessage_10000(1, _georgeMach, _agentTalk, 1, 6, 10,
_agentTalk, 6, 6, 0);
_georgeMode = _georgeShould = 7;
_georgeRandomActionCounter = 0;
digi_play((imath_ranged_rand(1, 2) == 1) ? "950_s06" : "950_s07",
2, 200);
break;
default:
break;
}
break;
case 1:
case 2:
sendWSMessage_10000(1, _georgeMach, _agentCheckingList,
1, 26, 10, _agentCheckingList, 27, 27, 0);
_georgeMode = 1;
break;
case 3:
case 4:
case 5:
case 6:
sendWSMessage_10000(1, _georgeMach, _agentStander, 1, 7, 10,
_agentStander, 7, 7, 0);
_georgeMode = 3;
_georgeRandomActionCounter = 0;
break;
case 7:
case 8:
case 9:
sendWSMessage_10000(1, _georgeMach, _agentTalk, 1, 6, 10,
_agentTalk, 6, 6, 0);
_georgeMode = 7;
_georgeRandomActionCounter = 0;
break;
case 10:
sendWSMessage_10000(1, _georgeMach, _agentSalutes, 1, 28, 10,
_agentStander, 1, 1, 0);
_georgeMode = _georgeShould = 0;
_georgeRandomActionCounter = 0;
break;
case 12:
// George takes payment from Ripley
terminateMachineAndNull(_ripleyMach);
_convResumeFlag = true;
sendWSMessage_10000(1, _georgeMach, _agentTakesMoney, 1, 52, 13,
_agentStander, 1, 1, 0);
_georgeMode = _georgeShould = 0;
_georgeRandomActionCounter = 0;
_ripleyShould = 0;
break;
case 13:
terminateMachineAndNull(_ripleyMach);
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 1, 49, 14,
_agentStander, 1, 1, 0);
break;
case 15:
terminateMachineAndNull(_ripleyMach);
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 1, 49, 25,
_agentStander, 1, 1, 0);
break;
default:
break;
}
break;
case 1:
switch (_georgeShould) {
case 1:
sendWSMessage_10000(1, _georgeMach, _agentCheckingList, 27, 27, 10,
_agentCheckingList, 27, 27, 0);
break;
case 2:
if (_soundName) {
_G(kernel).trigger_mode = KT_PARSE;
digi_play(_soundName, 1, 255, _georgeTrigger);
_soundName = nullptr;
_G(kernel).trigger_mode = KT_DAEMON;
}
frame = imath_ranged_rand(27, 31);
sendWSMessage_10000(1, _georgeMach, _agentCheckingList, frame, frame, 10,
_agentCheckingList, frame, frame, 0);
break;
default:
sendWSMessage_10000(1, _georgeMach, _agentCheckingList, 27, 22, 100,
_agentCheckingList, 21, 21, 0);
_georgeRandomActionCounter = 0;
break;
}
break;
case 3:
switch (_georgeShould) {
case 3:
val = imath_ranged_rand(1, 2);
++_georgeRandomActionCounter;
if (imath_ranged_rand(10, 40) <= _georgeRandomActionCounter)
_georgeRandomActionCounter = 0;
else
val = 1;
if (val == 1) {
sendWSMessage_10000(1, _georgeMach, _agentStander, 7, 7, 10,
_agentStander, 7, 7, 0);
} else if (val == 2) {
sendWSMessage_10000(1, _georgeMach, _agentStander, 7, 1, 10,
_agentStander, 1, 1, 0);
_georgeMode = _georgeShould = 0;
_georgeRandomActionCounter = 0;
}
break;
case 4:
case 5:
case 6:
sendWSMessage_10000(1, _georgeMach, _agentStander, 8, 12, 10,
_agentStander, 12, 12, 0);
_georgeMode = 4;
break;
default:
sendWSMessage_10000(1, _georgeMach, _agentStander, 7, 1, 10,
_agentStander, 1, 1, 0);
_georgeMode = 0;
_georgeRandomActionCounter = 0;
break;
}
break;
case 4:
switch (_georgeShould) {
case 4:
sendWSMessage_10000(1, _georgeMach, _agentStander, 12,
12, 10, _agentStander, 12, 12, 0);
break;
case 5:
if (_soundName) {
_G(kernel).trigger_mode = _georgeTriggerMode;
digi_play(_soundName, 1, 255, _georgeTrigger);
_soundName = nullptr;
_georgeTriggerMode = KT_DAEMON;
_G(kernel).trigger_mode = KT_DAEMON;
}
_G(kernel).trigger_mode = _val6_triggerMode;
frame = imath_ranged_rand(12, 17);
sendWSMessage_10000(1, _georgeMach, _agentStander, frame, frame,
10, _agentStander, frame, frame, 1);
sendWSMessage_190000(_georgeMach, 13);
sendWSMessage_1a0000(_georgeMach, 13);
_G(kernel).trigger_mode = KT_DAEMON;
_val6_triggerMode = KT_DAEMON;
break;
case 6:
if (_soundName) {
_G(kernel).trigger_mode = _georgeTriggerMode;
digi_play(_soundName, 1, 255, _georgeTrigger);
_soundName = nullptr;
_G(kernel).trigger_mode = KT_DAEMON;
}
frame = imath_ranged_rand(18, 21);
sendWSMessage_10000(1, _georgeMach, _agentStander, frame, frame,
10, _agentStander, frame, frame, 1);
sendWSMessage_190000(_georgeMach, 13);
sendWSMessage_1a0000(_georgeMach, 13);
break;
default:
sendWSMessage(1, _georgeMach, _agentStander, 12,
8, 10, _agentStander, 7, 7, 0);
_georgeMode = 3;
_georgeRandomActionCounter = 0;
break;
}
break;
case 7:
switch (_georgeShould) {
case 7:
val = imath_ranged_rand(1, 2);
if (imath_ranged_rand(10, 40) <= _georgeRandomActionCounter)
_georgeRandomActionCounter = 0;
else
val = 1;
if (val == 1) {
sendWSMessage_10000(1, _georgeMach, _agentTalk, 6, 6, 10,
_agentTalk, 6, 6, 0);
} else if (val == 2) {
sendWSMessage_10000(1, _georgeMach, _agentTalk, 6, 1, 10,
_agentStander, 1, 1, 0);
_georgeMode = _georgeShould = 0;
_georgeRandomActionCounter = 0;
digi_play((imath_ranged_rand(1, 2) == 1) ? "950_s06" : "950_s07",
2, 200);
}
break;
case 8:
case 9:
sendWSMessage_10000(1, _georgeMach, _agentTalk, 6, 15, 10,
_agentTalk, 15, 15, 0);
_georgeMode = 8;
break;
default:
sendWSMessage_10000(1, _georgeMach, _agentTalk, 6, 1, 10,
_agentStander, 1, 1, 0);
_georgeMode = 0;
_georgeRandomActionCounter = 0;
break;
}
break;
case 8:
switch (_georgeShould) {
case 8:
sendWSMessage_10000(1, _georgeMach, _agentTalk, 15, 15, 10,
_agentTalk, 15, 15, 0);
break;
case 9:
if (_soundName) {
digi_play(_soundName, 1, 255, _georgeTrigger);
_soundName = nullptr;
}
sendWSMessage_10000(1, _georgeMach, _agentTalk, 16, 32, 10,
_agentTalk, 15, 15, 0);
_georgeMode = 8;
break;
default:
sendWSMessage_10000(1, _georgeMach, _agentTalk, 15, 6, 10,
_agentTalk, 6, 6, 0);
_georgeMode = 7;
_georgeRandomActionCounter = 0;
break;
}
break;
case 14:
if (_georgeShould == 14) {
if (_soundName) {
_G(kernel).trigger_mode = KT_PARSE;
digi_play(_soundName, 1, 255, _georgeTrigger);
_soundName = nullptr;
_G(kernel).trigger_mode = KT_DAEMON;
}
sendWSMessage(1, _georgeMach, _agentSlidesPaper, 54, 54, 10,
_agentSlidesPaper, 54, 55, 1);
} else {
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 57, 76, 10,
_agentSlidesPaper, 76, 76, 0);
_georgeMode = _georgeShould = 0;
_georgeRandomActionCounter = 0;
_msgRipleyFlag = true;
_convResumeFlag = true;
}
break;
default:
break;
}
break;
case 12:
_ripleyMach = TriggerMachineByHash(triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel, 10, 10, 20,
_ripTrekTravel, 10, 10, 0);
_ripleyShould = _ripleyMode = 0;
kernel_timing_trigger(10, 10);
_georgeShould = 4;
_georgeRandomActionCounter = 0;
conv_resume();
break;
case 13:
_ripleyMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip in conv");
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel, 10, 10, 20,
_ripTrekTravel, 10, 10, 0);
_ripleyShould = _ripleyMode = 0;
kernel_timing_trigger(10, 10);
break;
case 14:
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 50, 63, 15,
_agentStander, 1, 1, 0);
digi_play("950_s35", 2);
break;
case 15:
_G(flags)[V008] = 1;
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 49, 1, 12,
_agentStander, 1, 1, 0);
break;
case 20:
if (!_ripleyMode && _ripleyShould == 0 && _ripleyTrigger != -1) {
kernel_trigger_dispatchx(_ripleyTrigger);
_ripleyTrigger = -1;
if (_showWalkerFlag) {
ws_unhide_walker();
_showWalkerFlag = false;
}
if (_msgRipleyFlag) {
sendWSMessage_80000(_ripleyMach);
_msgRipleyFlag = false;
}
}
kernel_timing_trigger(1, 21);
break;
case 21:
if (!_ripleyMode) {
switch (_ripleyShould) {
case 0:
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel,
10, 10, 20, _ripTrekTravel, 10, 10, 0);
break;
case 1:
frame = imath_ranged_rand(11, 19);
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel,
frame, frame, 20, _ripTrekTravel, frame, frame, 0);
sendWSMessage_190000(_ripleyMach, 13);
sendWSMessage_1a0000(_ripleyMach, 13);
break;
case 2:
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel,
20, 26, 20, _ripTrekTravel, 10, 10, 0);
break;
case 3:
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel,
37, 50, 20, _ripTrekTravel, 10, 10, 0);
break;
case 4:
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel,
9, 1, 22, _ripTrekTravel, 1, 1, 0);
break;
case 5:
_G(kernel).trigger_mode = KT_PARSE;
conv_load("conv301a", 10, 10, 747, player_commands_allowed());
_travelDest = 0;
conv_export_value(conv_get_handle(), _G(flags)[V088] >= 3 ? 1 : 0, 0);
conv_export_value(conv_get_handle(), _G(flags)[V056], 1);
conv_export_value(conv_get_handle(), _G(flags)[V110], 2);
conv_export_pointer(conv_get_handle(), &_travelDest, 5);
if (player_been_here(201))
conv_export_value(conv_get_handle(), 2, 6);
conv_play(conv_get_handle());
_ripleyShould = 0;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 20);
break;
default:
break;
}
}
break;
case 22:
terminateMachineAndNull(_ripleyMach);
terminateMachineAndNull(_shadowMach);
ws_unhide_walker();
player_set_commands_allowed(true);
break;
case 25:
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 50, 64, 26,
_agentSlidesPaper, 64, 64, 0);
digi_play("950_s35", 2);
break;
case 26:
sendWSMessage_10000(1, _georgeMach, _agentSlidesPaper, 49, 1, 27,
_agentStander, 1, 1, 0);
break;
case 27:
sendWSMessage_10000(1, _georgeMach, _agentTakesMoney, 52, 9, 28,
_agentTakesMoney, 9, 9, 0);
_georgeShould = 4;
_georgeMode = 4;
_georgeRandomActionCounter = 0;
_ripleyShould = 0;
break;
case 28:
conv_resume();
kernel_timing_trigger(1, 13);
break;
case 51:
digi_unload("301r37");
setGlobals1(_ripTrekHandTalk3, 1, 7, 7, 7, 1);
sendWSMessage_110000(52);
digi_play("301r01", 1, 255, 53);
break;
case 52:
sendWSMessage_140000(-1);
break;
case 53:
_georgeShould = 6;
_soundName = "301a01";
_georgeTrigger = 56;
break;
case 56:
_georgeShould = 3;
kernel_timing_trigger(1, 11);
player_set_commands_allowed(true);
break;
case 60:
setGlobals1(_ripTrekHandTalk3, 1, 7, 7, 7, 1);
sendWSMessage_110000(62);
digi_play("301r01", 1);
break;
case 62:
sendWSMessage_140000(63);
break;
case 63:
_georgeShould = 6;
_georgeTriggerMode = KT_DAEMON;
_soundName = "301a01";
_georgeTrigger = 72;
break;
case 64:
if (_val12) {
_georgeShould = 5;
_soundName = (_val12 == 1) ? "301a03" : "301a04";
_georgeTriggerMode = KT_DAEMON;
_georgeTrigger = 71;
} else if (!player_been_here(401) && _G(flags)[V092] &&
!_G(flags)[V093]) {
kernel_timing_trigger(1, 1000);
}
break;
case 65:
_G(global301) = 0;
setGlobals1(_ripTrekTalker3, 1, 1, 1, 5, 1);
sendWSMessage_110000(68);
_georgeShould = 8;
digi_play("301r01a", 1, 255, 68);
break;
case 68:
if (_G(global301) >= 1) {
_G(global301) = 0;
sendWSMessage_140000(-1);
_georgeShould = 9;
_soundName = "301a04a";
_georgeTrigger = 70;
} else {
++_G(global301);
}
break;
case 70:
_georgeShould = 0;
player_set_commands_allowed(true);
break;
case 71:
_georgeShould = 0;
kernel_timing_trigger(1, 999);
break;
case 72:
_georgeShould = 4;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 11);
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(10, 64);
break;
case 100:
sendWSMessage_10000(1, _georgeMach, _agentCheckingList, 8,
1, 10, _agentStander, 1, 1, 0);
_georgeMode = 0;
break;
case 200:
if (_marshallMode || _marshallShould || _ripleyTrigger == -1) {
kernel_timing_trigger(1, 201);
} else {
kernel_trigger_dispatchx(_ripleyTrigger);
_ripleyTrigger = -1;
}
break;
case 201:
if (_marshallMode <= 0) {
if (_marshallShould <= 0) {
kernel_timing_trigger(30, 201);
} if (_marshallShould == 1) {
sendWSMessage_10000(1, _marshallMach, _marshalMatt, 17, 51, 201,
_marshalMatt, 51, 51, 0);
_marshallMode = 1;
}
} else if (_marshallMode == 1) {
if (_marshallShould == 1) {
frame = imath_ranged_rand(52, 55);
sendWSMessage_10000(1, _marshallMach, _marshalMatt, frame, frame, 201,
_marshalMatt, frame, frame, 0);
sendWSMessage_190000(_marshallMach, 13);
sendWSMessage_1a0000(_marshallMach, 13);
} else {
sendWSMessage_10000(1, _marshallMach, _marshalMatt, 52, 52, 200,
_marshalMatt, 52, 52, 0);
}
}
break;
case 202:
digi_play("301s01", 1, 255, 203);
sendWSMessage_10000(1, _marshallMach, _marshalMatt, 4, 16, 201,
_marshalMatt, 16, 16, 0);
_marshallShould = 0;
_marshallMode = 0;
break;
case 203:
setGlobals1(_ripTrekArms, 1, 15, 15, 15, 1);
sendWSMessage_110000(-1);
digi_play("301r22", 1, 255, 204);
break;
case 204:
digi_play("301s02", 1, 255, 205);
_marshallShould = 1;
break;
case 205:
_marshallShould = 0;
kernel_timing_trigger(60, 206);
break;
case 206:
disable_player_commands_and_fade_init(207);
break;
case 207:
sendWSMessage_150000(208);
break;
case 208:
ws_demand_facing(_G(my_walker), 3);
kernel_timing_trigger(1, 209);
break;
case 209:
other_save_game_for_resurrection();
_G(game).setRoom(413);
break;
case 300:
terminateMachineAndNull(_georgeMach);
_ripleyMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripleyMach, _agentStander, 7,
1, 304, _agentStander, 1, 1, 0);
break;
case 304:
ws_hide_walker();
sendWSMessage(1, _ripleyMach, _agentTakesTelegram,
1, 53, 305, _agentTakesTelegram, 53, 53, 0);
break;
case 305:
kernel_timing_trigger(1, 990);
inv_give_to_player("MESSAGE LOG");
break;
case 320:
sendWSMessage(1, _ripleyMach, _agentTakesTelegram,
54, 63, 322, _agentTakesTelegram, 63, 63, 0);
break;
case 322:
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel,
10, 1, 324, _ripTrekTravel, 1, 1, 0);
_georgeMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "guy behind desk");
_georgeMode = 0;
_georgeShould = 0;
sendWSMessage_10000(1, _georgeMach, _agentStander, 1,
1, 10, _agentStander, 1, 1, 0);
break;
case 324:
terminateMachineAndNull(_ripleyMach);
ws_unhide_walker();
kernel_timing_trigger(1, 1000);
break;
case 990:
_digiSound1 = _digiSound2 = nullptr;
_digiSound3 = _digiSound4 = nullptr;
if (_val12 <= 0) {
kernel_timing_trigger(1, 320);
} else if (_nextSound) {
_digiSound1 = _nextSound;
_nextSound = nullptr;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V365] == 1) {
_digiSound1 = "201R61";
_G(flags)[V365] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V366] == 1) {
_digiSound1 = "401R31";
_G(flags)[V366] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V373] == 1) {
_digiSound1 = "401R36";
_G(flags)[V373] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V371] == 1) {
_digiSound1 = "501R03C";
_G(flags)[V371] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V372] == 1) {
_digiSound1 = "701R39";
_digiSound2 = "701R39A";
_G(flags)[V372] = 0;
kernel_timing_trigger(1, 991);
}
break;
case 991:
if (_digiSound1)
digi_play(_digiSound1, 1, 255, 993);
else
kernel_timing_trigger(1, 993);
break;
case 993:
if (_digiSound2)
digi_play(_digiSound2, 1, 255, 994);
else
kernel_timing_trigger(1, 994);
break;
case 994:
if (_digiSound3)
digi_play(_digiSound3, 1, 255, 995);
else
kernel_timing_trigger(1, 995);
break;
case 995:
if (_digiSound4)
digi_play(_digiSound4, 1, 255, 996);
else
kernel_timing_trigger(1, 996);
break;
case 996:
if (--_val12 == 0)
kernel_timing_trigger(1, 320);
else
kernel_timing_trigger(1, 990);
break;
case 999:
kernel_timing_trigger(1, !_val12 ? 1000 : 300);
break;
case 1000:
if (!player_been_here(401) && _G(flags)[V092]
&& !_G(flags)[V093]) {
_G(flags)[V092] = 0;
_G(flags)[V093] = 1;
kernel_timing_trigger(30, 65);
}
player_set_commands_allowed(true);
break;
default:
break;
}
}
void Room301::pre_parser() {
if (player_said("exit") && _G(flags)[V007]) {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
}
void Room301::parser() {
const KernelTriggerType oldMode = _G(kernel).trigger_mode;
const bool lookFlag = player_said_any("look", "look at"); // ecx
const bool talkFlag = player_said_any("talk", "talk to");
const bool takeFlag = player_said("take"); // edi
const bool useFlag = player_said_any("push", "pull", "gear", "open", "close"); // esi
if (player_said("conv301a")) {
conv301a();
} else if (player_said("exit")) {
if (_G(flags)[V007]) {
if (_G(kernel).trigger == -1) {
player_set_commands_allowed(false);
_marshalMatt = series_load("marshall matt");
digi_preload("301s01");
_ripTrekArms = series_load("rip trek arms x pos3");
ws_walk(_G(my_walker), 200, 269, nullptr, 1, 9);
} else if (_G(kernel).trigger == 1) {
_G(kernel).trigger_mode = KT_DAEMON;
_marshallMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "marshal");
sendWSMessage(1, _marshallMach, _marshalMatt, 1, 2, 202, _marshalMatt, 3, 3, 0);
_marshallShould = 0;
_marshallMode = 0;
}
} else {
if (_G(kernel).trigger == -1) {
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(1);
} else if (_G(kernel).trigger == 1) {
_G(game).setRoom(303);
}
}
} else if (lookFlag && player_said("poster")) {
digi_play("301r04", 1);
} else if (lookFlag && player_said("window")) {
digi_play(_G(player).been_here_before ? "301r15" : "301r05", 1);
} else if (lookFlag && player_said("magazines")) {
digi_play("301r06", 1);
} else if (lookFlag && player_said("water cooler")) {
digi_play(_G(player).been_here_before ? "301r16" : "301r07", 1);
} else if (lookFlag && player_said("agent")) {
digi_play("301r08", 1);
} else if (lookFlag && player_said("telephone")) {
digi_play("301r27", 1);
} else if (lookFlag && player_said("plant")) {
digi_play("301r28", 1);
} else if (lookFlag && player_said("postcards")) {
if (_G(flags)[V033]) {
digi_play("301r14", 1);
} else {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
digi_play("301r03", 1, 255, 3);
kernel_timing_trigger(260, 1);
break;
case 1:
player_update_info();
ws_walk(_G(my_walker), _G(player_info).x, _G(player_info).y,
nullptr, 2, 3);
break;
case 2:
setGlobals1(_ripTrekHandTalk3, 1, 7, 8, 9, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
sendWSMessage_110000(-1);
break;
case 3:
sendWSMessage_140000(-1);
_georgeShould = 5;
_val6_triggerMode = KT_PARSE;
_georgeTriggerMode = KT_PARSE;
_georgeTrigger = 4;
_soundName = "301a02";
break;
case 4:
_georgeShould = 0;
_ripleyTrigger = kernel_trigger_create(5);
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 11);
_G(kernel).trigger_mode = oldMode;
break;
case 5:
player_set_commands_allowed(true);
_G(flags)[V033] = 1;
break;
default:
break;
}
}
} else if (player_said_any("AMERICAN CURRENCY", "CHINESE CURRENCY") &&
player_said("AGENT")) {
digi_play("301r30", 1);
} else if (lookFlag && player_said_any("sofa", "chair")) {
digi_play("301r29", 1);
} else if (_G(kernel).trigger == 747) {
player_set_commands_allowed(false);
_georgeShould = 0;
_ripleyShould = 4;
if (_travelDest) {
switch (_travelDest) {
case 1:
_G(flags)[kTravelDest] = 0;
break;
case 2:
_G(flags)[kTravelDest] = 2;
break;
case 3:
_G(flags)[kTravelDest] = 3;
break;
case 4:
_G(flags)[kTravelDest] = 4;
break;
default:
break;
}
disable_player_commands_and_fade_init(748);
}
} else if (_G(kernel).trigger == 748) {
_G(game).setRoom(495);
} else if (talkFlag && player_said("agent")) {
ws_hide_walker();
player_set_commands_allowed(false);
player_update_info();
_shadowMach = series_show("safari shadow 3", 0xf00, 0, -1, -1, 0,
_G(player_info).scale, _G(player_info).x, _G(player_info).y);
_ripleyMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
_G(kernel).trigger_mode = KT_DAEMON;
_ripleyMode = 0;
_ripleyShould = 5;
sendWSMessage_10000(1, _ripleyMach, _ripTrekTravel, 1, 9, 20,
_ripTrekTravel, 10, 10, 0);
_georgeShould = 4;
} else if (takeFlag && player_said("postcards")) {
digi_play("301r09", 1);
} else if (takeFlag && player_said("water cooler")) {
digi_play("301r10", 1);
} else if (takeFlag && player_said("magazines")) {
digi_play("301r11", 1);
} else if (useFlag && player_said_any("sofa", "chair")) {
digi_play("301r31", 1);
} else if (useFlag && player_said("telephone")) {
digi_play("301r32", 1);
} else if (useFlag && _G(player).click_y <= 374 &&
!inv_player_has(_G(player).noun)) {
digi_play("301r33", 1);
} else {
return;
}
_G(player).command_ready = false;
}
void Room301::conv301a() {
const char *sound = conv_sound_to_play();
const int who = conv_whos_talking();
const int node = conv_current_node();
if (_G(kernel).trigger == 1) {
if (who <= 0) {
if (node != 3) {
_georgeShould = 4;
conv_resume();
}
} else if (who == 1) {
if (node == 11) {
// Take payment
_georgeShould = 12;
} else if (node != 13) {
_ripleyShould = 0;
conv_resume();
}
} else {
conv_resume();
}
} else if (sound) {
if (who <= 0) {
if (node == 3) {
_georgeShould = 15;
} else if (node != 2) {
_georgeShould = imath_ranged_rand(5, 6);
} else {
_georgeShould = 2;
_soundName = sound;
_georgeTrigger = 1;
return;
}
} else if (who == 1) {
if (node == 13)
_georgeShould = 13;
else
_ripleyShould = 1;
}
digi_play(sound, 1, 255, 1);
} else {
conv_resume();
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4