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

1037 lines
25 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/section4/room401.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
static const char *const SAID[][2] = {
{ "POSTCARD RACK", "401R08" },
{ "POSTER", "COM002" },
{ "WINDOW", "401R10" },
{ "MAGAZINE", "COM003" },
{ "RAILING", "401R22" },
{ "DESK", "401R23" },
{ "FAN", "401R24" },
{ "BUSH", "401R25" },
{ "AGENT", "401R12" },
{ "CHAIR", "COM023" },
{ "SOFA", "COM023" },
{ "TELEPHONE", "COM024" },
{ "COAT", "401R41" },
{ nullptr, nullptr }
};
void Room401::init() {
digi_preload("950_s01");
if (_G(game).previous_room != KERNEL_RESTORING_GAME)
_val1 = _val2 = 0;
_val4 = 0;
_digiName = nullptr;
_401a01 = series_load("401A01");
_401a02 = series_load("401A02");
_401a03 = series_load("401A03");
_401a04 = series_load("401A04");
_401a05 = series_load("401A05");
_401a06 = series_load("401A06");
_rip1 = series_load("rip trek hand talk pos3");
_rip2 = series_load("RIP TREK ARMS X POS3");
_rip3 = series_load("RIP HEAD DOWN TALK OFF TD33");
_rip4 = series_load("RIP TREK TALKER POS3");
_401rp01 = series_load("401rp01");
_agent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x500, false,
triggerMachineByHashCallback, "agent");
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
_agentMode = 1;
_agentShould = 0;
if (_G(game).previous_room <= 495 && _G(game).previous_room != KERNEL_RESTORING_GAME) {
_val1 = checkFlags(true);
_G(flags)[V006]++;
if (setItemsPlacedFlags()) {
_digiName = getItemsPlacedDigi();
++_val1;
}
player_set_commands_allowed(false);
ws_demand_location(_G(my_walker), 66, 266, 3);
if (_val1 ||
!_G(flags)[V020] ||
(_G(flags)[V110] && !_G(flags)[V016]) ||
(_G(flags)[V017] && player_been_here(407) && !_G(flags)[V019]) ||
(_G(flags)[kWolfFled] && !_G(flags)[V091])
) {
ws_walk(_G(my_walker), 346, 267, nullptr, 7, 3, true);
} else {
ws_walk(_G(my_walker), 158, 266, nullptr, 7, 3, true);
}
}
digi_play_loop("950_s01", 3, 140);
}
void Room401::daemon() {
int val;
switch (_G(kernel).trigger) {
case 1:
player_set_commands_allowed(true);
break;
case 7:
setGlobals1(_rip1, 1, 7, 7, 7, 1);
sendWSMessage_110000(9);
digi_play("401r01", 1, 255, 11);
break;
case 9:
sendWSMessage_140000(-1);
break;
case 11:
_agentShould = 5;
digi_play(_G(player).been_here_before ? "401x08" : "401x01",
1, 255, 13);
break;
case 13:
kernel_timing_trigger(1, 100);
_agentShould = 0;
kernel_timing_trigger(2, 999);
break;
case 100:
kernel_trigger_dispatchx(kernel_trigger_create(101));
break;
case 101:
switch (_agentMode) {
case 1:
switch (_agentShould) {
case 0:
val = imath_ranged_rand(1, 2);
++_ctr1;
if (imath_ranged_rand(20, 80) > _ctr1)
val = 1;
else
_ctr1 = 0;
if (val == 1) {
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
} else {
sendWSMessage_10000(1, _agent, _401a01, 1, 3, 100, _401a01, 3, 3, 0);
_agentMode = 4;
}
break;
case 7:
sendWSMessage_10000(1, _agent, _401a02, 1, 57, 100, _401a01, 1, 1, 0);
_agentShould = 4;
_ctr1 = 0;
break;
case 8:
terminateMachineAndNull(_ripMach);
sendWSMessage_10000(1, _agent, _401a04, 1, 62, 108, _401a01, 1, 1, 0);
break;
case 9:
terminateMachineAndNull(_ripMach);
sendWSMessage_10000(1, _agent, _401a05, 1, 53, 105, _401a01, 53, 53, 0);
break;
case 10:
terminateMachineAndNull(_ripMach);
sendWSMessage_10000(1, _agent, _401a03, 1, 47, 103, _401a03, 1, 1, 0);
break;
default:
sendWSMessage_10000(1, _agent, _401a01, 1, 3, 100, _401a01, 3, 3, 0);
_agentMode = 4;
_ctr1 = 0;
break;
}
break;
case 4:
switch (_agentShould) {
case 0:
val = imath_ranged_rand(1, 3);
++_ctr1;
if (imath_ranged_rand(20, 80) > _ctr1)
val = 1;
else
_ctr1 = 0;
switch (val) {
case 1:
sendWSMessage_10000(1, _agent, _401a01, 3, 3, 100, _401a01, 3, 3, 0);
break;
case 2:
sendWSMessage_10000(1, _agent, _401a01, 11, 28, 100, _401a01, 28, 28, 0);
_agentMode = 11;
_ctr1 = 0;
break;
case 3:
sendWSMessage_10000(1, _agent, _401a01, 3, 1, 100, _401a01, 1, 1, 0);
_agentMode = 1;
_ctr1 = 0;
break;
default:
break;
}
break;
case 4:
sendWSMessage_10000(1, _agent, _401a01, 3, 3, 100, _401a01, 3, 3, 0);
break;
case 5:
sendWSMessage_10000(1, _agent, _401a01, 4, 4, -1, _401a01, 4, 10, 4);
sendWSMessage_1a0000(_agent, 13);
break;
case 6:
sendWSMessage_10000(1, _agent, _401a01, 29, 43, 100, _401a01, 3, 3, 0);
sendWSMessage_190000(_agent, 13);
_agentShould = 4;
break;
case 11:
sendWSMessage_10000(1, _agent, _401a01, 11, 28, 100, _401a01, 28, 28, 0);
_agentMode = 11;
break;
default:
sendWSMessage_10000(1, _agent, _401a01, 3, 1, 100, _401a01, 1, 1, 0);
_agentMode = 1;
_ctr1 = 0;
break;
}
break;
case 11:
switch (_agentShould) {
case 0:
val = imath_ranged_rand(1, 2);
++_ctr1;
if (imath_ranged_rand(20, 80) < _ctr1)
val = 1;
else
_ctr1 = 0;
if (val == 1) {
sendWSMessage_10000(1, _agent, _401a01, 28, 28, 100, _401a01, 28, 28, 0);
} else {
sendWSMessage_10000(1, _agent, _401a01, 28, 11, 100, _401a01, 3, 3, 0);
_agentMode = 4;
_ctr1 = 0;
}
break;
case 11:
sendWSMessage_10000(1, _agent, _401a01, 28, 28, 100, _401a01, 28, 28, 0);
break;
default:
sendWSMessage_10000(1, _agent, _401a01, 28, 11, 100, _401a01, 3, 3, 0);
break;
}
break;
default:
break;
}
break;
case 102:
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 11, 200, _401rp01, 11, 11, 0);
_ripleyMode = _ripleyShould = 0;
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
_agentShould = 4;
_ctr1 = 0;
_G(kernel).trigger_mode = KT_PARSE;
digi_play(conv_sound_to_play(), 1, 255, 1);
_G(kernel).trigger_mode = KT_DAEMON;
break;
case 103:
sendWSMessage_10000(1, _agent, _401a03, 48, 67, 102, _401a01, 1, 1, 0);
digi_play(imath_ranged_rand(1, 2) == 1 ? "950_s09" : "950_s10", 2);
break;
case 104:
series_show("401a06", 0);
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 11, 200, _401rp01, 11, 11, 0);
_ripleyMode = _ripleyShould = 0;
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
_agentShould = 4;
_ctr1 = 0;
conv_resume();
break;
case 105:
sendWSMessage_10000(1, _agent, _401a05, 53, 1, 106, _401a01, 1, 1, 0);
break;
case 106:
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 11, 200, _401rp01, 11, 11, 0);
_ripleyMode = _ripleyShould = 0;
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
_agentShould = 0;
_ctr1 = 0;
inv_give_to_player("POMERANIAN MARKS");
conv_resume();
break;
case 108:
sendWSMessage_10000(1, _agent, _401a04, 63, 90, 104, _401a01, 1, 1, 0);
digi_play("950_s35", 2);
break;
case 200:
kernel_timing_trigger(1, 201);
break;
case 201:
if (!_ripleyMode) {
switch (_ripleyShould) {
case 0:
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 11, 200, _401rp01, 11, 11, 0);
break;
case 1:
sendWSMessage_10000(1, _ripMach, _401rp01, 12, 12, -1, _401rp01, 12, 19, 4);
sendWSMessage_1a0000(_ripMach, 13);
break;
case 2:
sendWSMessage_10000(1, _ripMach, _401rp01, 20, 36, 200, _401rp01, 11, 11, 0);
sendWSMessage_190000(_ripMach, 13);
_ripleyShould = 0;
break;
case 3:
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 1, 202, _401rp01, 1, 1, 0);
break;
default:
break;
}
}
break;
case 202:
terminateMachineAndNull(_ripMach);
ws_unhide_walker();
player_set_commands_allowed(true);
break;
case 300:
ws_hide_walker();
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 1, 11, 305, _401rp01, 11, 11, 0);
_agentShould = 5;
digi_play((_val1 == 1) ? "401x02" : "401x03", 1);
break;
case 305:
terminateMachineAndNull(_agent);
sendWSMessage_10000(1, _ripMach, _401a02, 1, 47, 306, _401a02, 47, 47, 0);
break;
case 306:
kernel_timing_trigger(1, 990);
inv_give_to_player("MESSAGE LOG");
break;
case 320:
sendWSMessage_10000(1, _ripMach, _401a02, 48, 57, 322, _401a02, 57, 57, 0);
break;
case 322:
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 1, 324, _401rp01, 1, 1, 0);
_agent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, false,
triggerMachineByHashCallback, "agent");
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
break;
case 324:
case 520:
case 620:
case 720:
case 826:
terminateMachineAndNull(_ripMach);
ws_unhide_walker();
kernel_timing_trigger(1, 1000);
break;
case 400:
_G(flag1) = 0;
setGlobals1(_rip4, 1, 1, 1, 5, 1);
sendWSMessage_110000(405);
_agentShould = 4;
digi_play("401r02", 1, 255, 405);
break;
case 405:
if (_G(flag1) >= 1) {
_G(flag1) = 0;
sendWSMessage_140000(-1);
_agentShould = 5;
digi_play("401x04", 1, 255, 407);
} else {
++_G(flag1);
}
break;
case 407:
_agentShould = 4;
kernel_timing_trigger(1, 100);
setGlobals1(_rip4, 1, 1, 1, 5, 1);
sendWSMessage_110000(410);
digi_play("401r03", 1, 255, 410);
break;
case 410:
if (_G(flag1) >= 1) {
_G(flag1) = 0;
sendWSMessage_140000(-1);
_agentShould = 5;
digi_play("401x05", 1, 255, 412);
} else {
++_G(flag1);
}
break;
case 412:
_agentShould = 0;
kernel_timing_trigger(1, 100);
_G(flags)[V020] = 1;
kernel_timing_trigger(1, 1000);
break;
case 500:
setGlobals1(_rip2, 1, 15, 15, 15, 0, 1, 2, 3, 5, 1, 2, 1, 1, 1);
_agentShould = 4;
sendWSMessage_110000(503);
digi_play("401r29", 1, 255, 505);
break;
case 503:
case 603:
sendWSMessage_29a0000(_rip3);
sendWSMessage_120000(-1);
break;
case 505:
sendWSMessage_130000(-1);
digi_play("401x09", 1, 255, 507);
break;
case 507:
_agentShould = 4;
kernel_timing_trigger(1, 100);
sendWSMessage_120000(-1);
digi_play("401r30", 1, 255, 510);
break;
case 510:
sendWSMessage_110000(511);
_agentShould = 5;
digi_play("401x10", 1, 255, 512);
break;
case 511:
sendWSMessage_29a0000(_rip2);
sendWSMessage_140000(514);
break;
case 512:
sendWSMessage_10000(1, _agent, _401a01, 3, 3, 100, _401a01, 3, 3, 0);
break;
case 514:
kernel_timing_trigger(60, 515);
break;
case 515:
ws_hide_walker();
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 1, 11, 516, _401rp01, 11, 11, 0);
break;
case 516:
terminateMachineAndNull(_ripMach);
sendWSMessage_10000(1, _agent, _401a04, 1, 63, 517, _401a04, 63, 63, 0);
break;
case 517:
sendWSMessage_10000(1, _agent, _401a04, 64, 90, 518, _401a01, 1, 1, 0);
digi_play("950_s35", 2);
break;
case 518:
series_show("401a06", 0x600, 16);
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
_G(flags)[V016] = 1;
_G(flags)[V366] = 1;
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 1, 520, _401rp01, 1, 1, 0);
_agentShould = 0;
_ctr1 = 0;
break;
case 600:
setGlobals1(_rip2, 1, 15, 15, 15, 0, 1, 2, 3, 5, 1, 2, 1, 1, 1);
_agentShould = 4;
sendWSMessage_110000(603);
digi_play("401r32", 1, 255, 605);
break;
case 605:
sendWSMessage_110000(612);
break;
case 612:
sendWSMessage_29a0000(_rip2);
sendWSMessage_140000(613);
break;
case 613:
ws_hide_walker();
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 1, 11, 616, _401rp01, 11, 11, 0);
break;
case 616:
terminateMachineAndNull(_agent);
sendWSMessage_10000(1, _ripMach, _401a04, 1, 63, 617, _401a04, 63, 63, 0);
break;
case 617:
sendWSMessage_10000(1, _ripMach, _401a04, 64, 90, 618, _401a01, 1, 1, 0);
digi_play("950_s35", 2);
break;
case 618:
series_show("401a06", 0x600, 16);
_agent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, false,
triggerMachineByHashCallback, "agent");
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 1, 620, _401rp01, 1, 1, 0);
_G(flags)[V019] = 1;
_agentShould = 0;
_ctr1 = 0;
break;
case 700:
setGlobals1(_rip4, 1, 1, 1, 5, 1);
sendWSMessage_110000(705);
_agentShould = 4;
digi_play(_G(flags)[V019] ? "401r33" : "401r34", 1, 255, 705);
break;
case 705:
if (_G(flag1) >= 1) {
_G(flag1) = 0;
sendWSMessage_140000(-1);
_agentShould = 5;
digi_play("401x12", 1, 255, 707);
} else {
++_G(flag1);
}
break;
case 707:
_agentShould = 4;
kernel_timing_trigger(1, 100);
setGlobals1(_rip4, 1, 1, 1, 5, 1);
sendWSMessage_110000(710);
digi_play("401r35", 1, 255, 710);
_G(flags)[V373] = 1;
break;
case 710:
if (_G(flag1) >= 1) {
_G(flag1) = 0;
sendWSMessage_140000(-1);
_agentShould = 5;
digi_play("401x13", 1, 255, 712);
} else {
++_G(flag1);
}
break;
case 712:
sendWSMessage_10000(1, _agent, _401a01, 3, 3, -1, _401a01, 3, 3, 0);
kernel_timing_trigger(1, 715);
break;
case 715:
ws_hide_walker();
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401a04, 1, 11, 716, _401rp01, 11, 11, 0);
break;
case 716:
terminateMachineAndNull(_ripMach);
sendWSMessage_10000(1, _agent, _401a03, 1, 67, 718, _401a01, 1, 1, 0);
break;
case 718:
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
inv_move_object("TURTLE", 305);
inv_move_object("TURTLE TREATS", 305);
_G(flags[V091]) = 1;
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 1, 720, _401rp01, 1, 1, 0);
_agentShould = 0;
_ctr1 = 0;
break;
case 800:
sendWSMessage_10000(1, _ripMach, _401a02, 48, 57, 822, _401a02, 57, 57, 0);
break;
case 822:
sendWSMessage_10000(1, _ripMach, _401a03, 67, 1, 824, _401rp01, 11, 11, 0);
break;
case 824:
sendWSMessage_10000(1, _ripMach, _401rp01, 11, 1, 826, _401rp01, 1, 1, 0);
inv_give_to_player("ROMANOV EMERALD");
_agent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x600, false,
triggerMachineByHashCallback, "agent");
sendWSMessage_10000(1, _agent, _401a01, 1, 1, 100, _401a01, 1, 1, 0);
_agentShould = 0;
_ctr1 = 0;
break;
case 990:
_digiName1 = nullptr;
_digiName2 = nullptr;
_digiName3 = nullptr;
_digiName4 = nullptr;
if (_val1 <= 0) {
kernel_timing_trigger(1, 320);
} else if (_digiName) {
_digiName1 = _digiName;
_digiName = nullptr;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V364] == 1) {
_digiName1 = "201R26";
_G(flags)[V364] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V365] == 1) {
_digiName1 = "201R61";
_G(flags)[V365] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V366] == 1) {
_digiName1 = "401R31";
_G(flags)[V366] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V371] == 1) {
_digiName = "501R03C";
_G(flags)[V371] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V372] == 1) {
_digiName1 = "701R39";
_digiName2 = "701R39A";
_G(flags)[V372] = 0;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V367] == 1) {
_digiName1 = "401R37";
_G(flags)[V367] = 0;
_val2 = 1;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V368] == 1) {
_digiName1 = "401R38";
_G(flags)[V368] = 0;
_val2 = 1;
kernel_timing_trigger(1, 991);
} else if (_G(flags)[V369] == 1) {
_digiName1 = "401R39";
_G(flags)[V369] = 0;
_val2 = 1;
kernel_timing_trigger(1, 991);
}
break;
case 991:
if (_digiName1) {
digi_play(_digiName1, 1, 255, 993);
} else {
kernel_timing_trigger(1, 993);
}
break;
case 993:
if (_digiName2) {
digi_play(_digiName2, 1, 255, 994);
} else {
kernel_timing_trigger(1, 994);
}
break;
case 994:
if (_digiName3) {
digi_play(_digiName3, 1, 255, 995);
} else {
kernel_timing_trigger(1, 995);
}
break;
case 995:
if (_digiName4) {
digi_play(_digiName4, 1, 255, 996);
} else {
kernel_timing_trigger(1, 996);
}
break;
case 996:
if (_val2) {
_val2 = 0;
kernel_timing_trigger(1, 800);
} else {
if (--_val1 == 0) {
kernel_timing_trigger(1, 320);
} else {
kernel_timing_trigger(1, 800);
}
}
break;
case 999:
kernel_timing_trigger(1, _val1 ? 300 : 1000);
break;
case 1000:
if (!_G(flags)[V020]) {
kernel_timing_trigger(30, 400);
} else if (_G(flags)[V110] && !_G(flags)[V016]) {
kernel_timing_trigger(30, 500);
} else if (_G(flags)[V017] && player_been_here(407) &&
!_G(flags)[V019]) {
kernel_timing_trigger(30, 600);
} else if (_G(flags)[kWolfFled] && !_G(flags)[V091]) {
kernel_timing_trigger(30, 700);
} else {
player_set_commands_allowed(true);
}
break;
default:
break;
}
}
void Room401::parser() {
const bool lookFlag = player_said_any("look", "look at");
const bool takeFlag = player_said("take");
const bool useFlag = player_said("gear");
if (player_said("conv401a")) {
conv401a();
} else if (_G(kernel).trigger == 747) {
if (_val4) {
switch (_val4) {
case 1:
_G(flags)[kTravelDest] = 1;
break;
case 2:
_G(flags)[kTravelDest] = 0;
break;
case 3:
_G(flags)[kTravelDest] = 4;
break;
case 4:
_G(flags)[kTravelDest] = 3;
break;
default:
break;
}
disable_player_commands_and_fade_init(748);
}
_agentShould = 0;
_ripleyShould = 3;
} else if (_G(kernel).trigger == 748) {
_G(flags)[kBilliardsFan] = 0;
_G(game).setRoom(495);
} else if (player_said("talk to", "agent")) {
ws_hide_walker();
_G(kernel).trigger_mode = KT_DAEMON;
_ripMach = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x400, false,
triggerMachineByHashCallback, "rip");
sendWSMessage_10000(1, _ripMach, _401rp01, 1, 11, 200, _401rp01, 11, 11, 0);
_ripleyMode = 0;
_ripleyShould = 0;
_G(kernel).trigger_mode = KT_PARSE;
conv_load("conv401a", 10, 10, 747);
conv_export_value_curr(_G(flags)[V088] < 3 ? 0 : 1, 1);
conv_export_pointer_curr(&_val4, 2);
conv_export_value_curr(inv_player_has("POMERANIAN MARKS") ? 1 : 0, 3);
conv_export_value_curr(_G(flags)[V110], 4);
conv_export_value_curr(getItemCount() ? 1 : 0, 5);
#define EXPORT(INDEX, NAME) conv_export_value_curr(inv_player_has(NAME) ? 1 : 0, INDEX)
EXPORT(6, "CRYSTAL SKULL");
EXPORT(7, "STICK AND SHELL MAP");
EXPORT(8, "WHEELED TOY");
EXPORT(9, "REBUS AMULET");
EXPORT(10, "SHRUNKEN HEAD");
EXPORT(11, "SILVER BUTTERFLY");
EXPORT(12, "POSTAGE STAMP");
EXPORT(13, "GERMAN BANKNOTE");
EXPORT(14, "WHALE BONE HORN");
EXPORT(15, "CHISEL");
EXPORT(16, "INCENSE BURNER");
EXPORT(17, "ROMANOV EMERALD");
#undef EXPORT
conv_play();
_G(kernel).trigger_mode = KT_DAEMON;
_agentShould = 4;
} else if (lookFlag && player_said(" ")) {
digi_play("COM001", 1, 255, -1, 997);
} else if (takeFlag && player_said("BEER STEIN")) {
digi_play("203r58", 1);
} else if (lookFlag && player_said("BEER STEIN")) {
if (_G(flags)[V015]) {
digi_play("401R07", 1);
} else {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
digi_play("401R05", 1, 255, 3);
kernel_timing_trigger(1, 230);
break;
case 1:
player_update_info();
ws_walk(_G(my_walker), _G(player_info).x + 1, _G(player_info).y, nullptr, 2, 3);
_agentShould = 4;
break;
case 2:
setGlobals1(_rip1, 1, 7, 8, 9, 1);
sendWSMessage_110000(-1);
break;
case 3:
sendWSMessage_140000(-1);
_agentShould = 5;
digi_play("401x06", 1, 255, 4);
break;
case 4:
setGlobals1(_rip1, 1, 7, 8, 9, 1);
sendWSMessage_110000(-1);
_agentShould = 4;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 100);
_G(kernel).trigger_mode = KT_PARSE;
digi_play("401r06", 1, 255, 5);
break;
case 5:
sendWSMessage_140000(-1);
_agentShould = 5;
digi_play("401x07", 1, 255, 6);
break;
case 6:
_agentShould = 0;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 100);
_G(kernel).trigger_mode = KT_PARSE;
_G(flags)[V015] = 1;
player_set_commands_allowed(true);
break;
default:
break;
}
}
} else if (lookFlag && _G(walker).ripley_said(SAID)) {
// No implementation
} else if (useFlag && player_said_any("SOFA", "CHAIR")) {
digi_play("COM025", 1, 255, -1, 997);
} else if (useFlag && player_said("TELEPHONE")) {
digi_play("COM026", 1, 255, -1, 997);
} else if ((useFlag || takeFlag) && player_said("COAT")) {
digi_play("203R58", 1);
} else if (takeFlag && player_said("POSTCARD RACK")) {
digi_play("COM004", 1, 255, -1, 997);
} else if (takeFlag && player_said("MAGAZINE")) {
digi_play("COM005", 1, 255, -1, 997);
} else if (player_said("exit")) {
switch (_G(kernel).trigger) {
case -1:
disable_player_commands_and_fade_init(3);
break;
case 3:
_G(game).setRoom(410);
break;
default:
break;
}
} else {
return;
}
_G(player).command_ready = false;
}
void Room401::conv401a() {
const int who = conv_whos_talking();
const int node = conv_current_node();
const int entry = conv_current_entry();
const char *sound = conv_sound_to_play();
if (_G(kernel).trigger == 1) {
if (who <= 0) {
if (node == 3)
return;
_agentShould = 4;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 100);
_G(kernel).trigger_mode = KT_PARSE;
} else if (who == 1) {
if (node == 1 && entry == 1) {
} else {
conv_set_box_xy(10, 10);
}
if (node == 1 && entry == 3) {
_agentShould = 9;
_ripleyShould = 0;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 200);
_G(kernel).trigger_mode = KT_PARSE;
return;
}
_ripleyShould = 0;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 200);
_G(kernel).trigger_mode = KT_PARSE;
}
conv_resume();
} else if (!sound) {
conv_resume();
} else {
if (who <= 0) {
if (node == 3) {
_agentShould = 8;
_G(flags)[V014] = 0;
} else if (node == 2 && entry == 0) {
_agentShould = 10;
return;
} else {
_agentShould = 5;
}
} else if (who == 1) {
#define ITEM(NODE, ENTRY, ITEM) if (node == NODE && entry == ENTRY) inv_move_object(ITEM, 305)
ITEM(11, 0, "CRYSTAL SKULL");
ITEM(11, 1, "STICK AND SHELL MAP");
ITEM(11, 2, "WHEELED TOY");
ITEM(11, 3, "REBUS AMULET");
ITEM(11, 4, "SHRUNKEN HEAD");
ITEM(11, 5, "SILVER BUTTERFLY");
ITEM(11, 6, "POSTAGE STAMP");
ITEM(11, 7, "GERMAN BANKNOTE");
ITEM(11, 8, "WHALE BONE HORN");
ITEM(11, 9, "CHISEL");
ITEM(11, 10, "INCENSE BURNER");
#undef ITEM
if (node == 11 && entry == 11) {
setFlag45();
inv_move_object("ROMANOV EMERALD", NOWHERE);
}
if (node != 11)
_ripleyShould = 1;
}
digi_play(sound, 1, 255, 1);
}
}
int Room401::getItemCount() const {
int count = 0;
static const char *NAMES[12] = {
"SHRUNKEN HEAD", "INCENSE BURNER", "CRYSTAL SKULL",
"WHALE BONE HORN", "WHEELED TOY", "SILVER BUTTERFLY",
"REBUS AMULET", "CHISEL", "GERMAN BANKNOTE",
"POSTAGE STAMP", "STICK AND SHELL MAP", "ROMANOV EMERALD"
};
for (int i = 0; i < 12; ++i) {
if (inv_player_has(NAMES[i]))
++count;
}
return count;
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4