Files
scummvm-cursorfix/engines/m4/riddle/rooms/section5/room501.cpp
2026-02-02 04:50:13 +01:00

1401 lines
32 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/section5/room501.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
Room501::Room501() : Room() {
Common::fill(_items, _items + 12, 0);
Common::fill(_queuedDigi, _queuedDigi + 4, (const char *)nullptr);
}
void Room501::init() {
digi_preload("501_s01");
_agentTalkLoop = series_load("AGENT TALK LOOP");
_agentStridesForward = series_load("AGENT STRIDES FORWARD");
if (_G(game).previous_room != KERNEL_RESTORING_GAME)
_flag = false;
digi_play_loop("501_s01", 3, 30);
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
_val2 = 0;
_digiName = nullptr;
_val4 = 0;
}
kernel_timing_trigger(1, 504);
if (_G(game).previous_room == KERNEL_RESTORING_GAME) {
if (!_flag)
_paper = series_place_sprite("ONE FRAME PAPER", 0, 0, 0, 100, 0x780);
} else {
player_set_commands_allowed(false);
if (_G(game).previous_room == 504) {
if (inv_player_has("ROPE"))
inv_move_object("ROPE", 504);
} else {
if (!player_been_here(501)) {
_G(flags)[V147] = 0;
_G(flags)[V141] = 0;
_G(flags)[V143] = 0;
_G(flags)[V145] = 0;
_G(flags)[V146] = 0;
_G(flags)[V148] = 0;
}
}
++_G(flags)[V006];
if (setItemsPlacedFlags()) {
_digiName = getItemsPlacedDigi();
++_val4;
}
ws_demand_location(_G(my_walker), 588, 267, 9);
ws_walk(_G(my_walker), 287, 268, nullptr, 522, 9);
_val5 = 0;
_trigger1 = -1;
_trigger4 = -1;
_paper = nullptr;
}
_clock = series_place_sprite(
(_G(flags)[V142] == 1) ? "501 PUFFIN CLOCK" : "PUFFIN CLOCK",
0, 0, 0, 100, 0x780);
}
void Room501::daemon() {
int frame;
switch (_G(kernel).trigger) {
case 501:
_ripleyMode = 1;
_xyzzy1 = 0;
_trigger2 = -1;
_xyzzy3 = 0;
_ripTalkLoop = series_load("RIP TALK LOOP");
player_update_info();
_shadow = series_show("SAFARI SHADOW 3", 0xf00, 128, -1, -1, 0,
_G(player_info).scale, _G(player_info).x, _G(player_info).y);
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x700, false,
triggerMachineByHashCallback, "Rip Delta Machine State");
switch (_ripleyShould) {
case 3:
ws_hide_walker();
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 2, 11, 502,
_ripTalkLoop, 11, 11, 0);
_ripleyMode = 3;
break;
case 4:
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 11, 11, 502,
_ripTalkLoop, 11, 11, 0);
_ripleyMode = 3;
break;
case 5:
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 11, 11, 502,
_ripTalkLoop, 11, 11, 0);
_ripleyShould = 3;
_ripleyMode = 3;
break;
default:
break;
}
break;
case 502:
if (_ripleyMode == 3 && _ripleyShould == 3 && _trigger1 != -1) {
kernel_trigger_dispatchx(_trigger1);
_trigger1 = -1;
}
if (_ripleyMode == 7 && _ripleyShould == 7 && _trigger2 != -1) {
kernel_trigger_dispatchx(_trigger2);
_trigger2 = -1;
}
if (_ripleyMode == 13 && _ripleyShould == 13 && _trigger3 != -1) {
kernel_trigger_dispatchx(_trigger3);
_trigger3 = -1;
}
if (_ripleyMode == 3 && _ripleyShould == 4 && _trigger4 != -1) {
kernel_trigger_dispatchx(_trigger4);
_trigger4 = -1;
}
if (_xyzzy1) {
terminateMachineAndNull(_ripley);
if (!_xyzzy3)
ws_unhide_walker();
terminateMachineAndNull(_shadow);
_val5 = 0;
if (_ripleyMode == 3)
series_unload(_ripTalkLoop);
} else {
kernel_timing_trigger(1, 503);
}
break;
case 503:
switch (_ripleyMode) {
case 3:
switch (_ripleyShould) {
case 2:
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(508);
kernel_timing_trigger(1, 502);
break;
case 3:
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 11, 11, 502,
_ripTalkLoop, 11, 11, 0);
break;
case 4:
frame = imath_ranged_rand(52, 76);
sendWSMessage_10000(1, _ripley, _ripTalkLoop, frame, frame, 502,
_ripTalkLoop, frame, frame, 0);
break;
case 6:
_xyzzy5 = 1;
digi_play((_val4 == 1) ? "501x02" : "501x03", 1);
sendWSMessage_10000(1, _ripley, _ripSeries1, 1, 85, 502,
_ripSeries1, 85, 85, 0);
_ripleyShould = 7;
_ripleyMode = 7;
break;
case 9:
_xyzzy5 = 1;
sendWSMessage_10000(1, _ripley, _ripParcelExchange, 90, 1, 502,
_ripParcelExchange, 1, 1, 0);
_ripleyShould = 10;
break;
case 10:
digi_play("COM084", 1, 255, -1, 997);
kernel_timing_trigger(1, 505);
sendWSMessage_10000(1, _ripley, _ripParcelExchange, 1, 1, 502,
_ripParcelExchange, 1, 1, 0);
_ripleyShould = 3;
break;
case 11:
_xyzzy5 = 1;
sendWSMessage_10000(1, _ripley, _ripParcelExchange, 1, 90, 502,
_ripParcelExchange, 90, 90, 0);
_ripleyShould = 12;
break;
case 12:
kernel_timing_trigger(1, 505);
sendWSMessage_10000(1, _ripley, _ripParcelExchange, 1, 1, 502,
_ripParcelExchange, 1, 1, 0);
_ripleyShould = 3;
break;
case 13:
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 11, 2, 502,
_ripTalkLoop, 2, 2, 0);
_ripleyMode = 13;
break;
case 14:
_xyzzy5 = 1;
sendWSMessage_10000(1, _ripley, _ripMoneyExchange, 1, 85, 502,
_ripMoneyExchange, 85, 85, 0);
_ripleyShould = 15;
break;
case 15:
kernel_timing_trigger(1, 505);
sendWSMessage_10000(1, _ripley, _ripMoneyExchange, 85, 85, 502,
_ripMoneyExchange, 85, 85, 0);
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(551);
if (!inv_player_has("PERUVIAN INTI"))
inv_give_to_player("PERUVIAN INTI");
break;
case 16:
_ripSignsPaper = series_load("RIP SIGNS PAPER");
_xyzzy5 = 1;
digi_play(conv_sound_to_play(), 1);
sendWSMessage_10000(1, _ripley, _ripSignsPaper, 1, 91, 502,
_ripSignsPaper, 91, 91, 0);
_ripleyShould = 17;
break;
case 17:
sendWSMessage_10000(1, _ripley, _ripSignsPaper, 85, 92, -1,
_ripSignsPaper, 90, 92, 4);
digi_play("950_S35", 1, 255, 502);
_ripleyShould = 18;
break;
case 18:
if (!_paper) {
_paper = series_place_sprite("one frame paper", 0, 0, 0, 100, 0x780);
_flag = true;
}
kernel_timing_trigger(1, 505);
sendWSMessage_10000(1, _ripley, _ripSignsPaper, 92, 111, 502,
_ripSignsPaper, 111, 111, 0);
_ripleyShould = 3;
break;
case 19:
_ripMoneyExchange = series_load("MONEY XCHANGE");
_xyzzy5 = 1;
sendWSMessage_10000(1, _ripley, _ripMoneyExchange, 61, 85, 502,
_ripMoneyExchange, 85, 85, 0);
_ripleyShould = 20;
break;
case 20:
if (!inv_player_has("US DOLLARS"))
inv_give_to_player("US DOLLARS");
kernel_timing_trigger(1, 505);
sendWSMessage_10000(1, _ripley, _ripMoneyExchange, 85, 85, 502,
_ripMoneyExchange, 85, 85, 0);
_ripleyShould = 3;
break;
default:
break;
}
break;
case 7:
switch (_ripleyShould) {
case 3:
kernel_timing_trigger(1, 504);
sendWSMessage_10000(1, _ripley, _ripSeries1, 86, 94, 502,
_ripTalkLoop, 11, 11, 0);
_ripleyShould = 3;
_ripleyMode = 3;
break;
case 7:
sendWSMessage_10000(1, _ripley, _ripSeries1, 85, 85, 502,
_ripSeries1, 85, 85, 0);
break;
case 8:
sendWSMessage_10000(1, _ripley, _ripSeries1, 85, 86, 502,
_ripSeries1, 86, 85, 0);
_ripleyShould = 7;
break;
default:
break;
}
break;
case 13:
switch (_ripleyShould) {
case 3:
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 2, 11, 502,
_ripTalkLoop, 11, 11, 0);
_ripleyMode = 3;
break;
case 13:
sendWSMessage_10000(1, _ripley, _ripTalkLoop, 11, 2, 502,
_ripTalkLoop, 2, 2, 0);
break;
default:
break;
}
break;
default:
break;
}
break;
case 504:
_agentMode = 1;
_agentShould = 1;
_xyzzy6 = -1;
_xyzzy7 = -1;
_xyzzy5 = -1;
_agent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x700, false,
triggerMachineByHashCallback, "Agent at Desk");
sendWSMessage_10000(1, _agent, _agentTalkLoop, 1, 1, 506,
_agentTalkLoop, 1, 1, 0);
_agentMode = 1;
break;
case 505:
_agentMode = 5;
_agentShould = 5;
_xyzzy6 = -1;
_xyzzy7 = -1;
_xyzzy5 = -1;
_agent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x700, false,
triggerMachineByHashCallback, "Agent at Desk");
sendWSMessage_10000(1, _agent, _agentStridesForward, 15, 15, 506,
_agentStridesForward, 15, 15, 0);
break;
case 506:
if (_agentShould == 1 && _agentMode == 1 && _xyzzy6 != -1) {
kernel_trigger_dispatchx(_xyzzy6);
_xyzzy6 = -1;
}
if (_agentShould == 5 && _agentMode == 5 && _xyzzy7 != -1) {
kernel_trigger_dispatchx(_xyzzy7);
_xyzzy7 = -1;
}
if (_xyzzy5 == 1) {
terminateMachineAndNull(_agent);
} else {
kernel_timing_trigger(1, 507);
}
break;
case 507:
switch (_agentMode) {
case 1:
switch (_agentShould) {
case 1:
sendWSMessage_10000(1, _agent, _agentTalkLoop, 1, 1, 506,
_agentTalkLoop, 1, 1, 0);
break;
case 2:
frame = imath_ranged_rand(1, 50);
sendWSMessage_10000(1, _agent, _agentTalkLoop, frame, frame, 506,
_agentTalkLoop, frame, frame, 0);
break;
case 3:
player_set_commands_allowed(false);
_ripMoneyExchange = series_load("MONEY XCHANGE");
ws_hide_walker();
sendWSMessage_10000(1, _agent, _ripMoneyExchange, 1, 86, 506,
_ripMoneyExchange, 1, 1, 0);
_agentShould = 4;
break;
case 4:
ws_unhide_walker();
sendWSMessage_10000(1, _agent, _agentTalkLoop, 1, 1, 506,
_agentTalkLoop, 1, 1, 0);
series_unload(_ripMoneyExchange);
_agentShould = 1;
player_set_commands_allowed(true);
break;
case 5:
sendWSMessage_10000(1, _agent, _agentStridesForward, 1, 15, 506,
_agentStridesForward, 15, 15, 0);
_agentMode = 5;
break;
default:
break;
}
break;
case 5:
switch (_agentShould) {
case 1:
sendWSMessage_10000(1, _agent, _agentStridesForward, 15, 1, 506,
_agentTalkLoop, 1, 1, 0);
_agentMode = 1;
break;
case 5:
sendWSMessage_10000(1, _agent, _agentStridesForward, 15, 15, 506,
_agentStridesForward, 15, 15, 0);
break;
case 6:
sendWSMessage_10000(1, _agent, _puffinExchange, 1, 46, 502,
_puffinExchange, 46, 46, 0);
digi_play("501R36", 1);
break;
default:
break;
}
break;
default:
break;
}
break;
case 508:
_val8 = 0;
_G(kernel).trigger_mode = KT_PARSE;
conv_load("conv501a", 10, 10, 747);
conv_export_value_curr((_G(flags)[V088] >= 3) ? 1 : 0, 0);
_hasItems = updateItems();
conv_export_pointer_curr(&_G(flags)[V182], 1);
if (inv_player_has("DRIFTWOOD PUFFIN")) {
_xyzzy9 = 2;
} else if (_G(flags)[V183] == 1) {
_xyzzy9 = 1;
} else {
_xyzzy9 = 0;
}
_hasLetter = inv_player_has("MENENDEZ'S LETTER");
conv_export_pointer_curr(&_hasLetter, 3);
conv_export_pointer_curr(&_hasItems, 4);
conv_export_pointer_curr(&_G(flags)[V145], 5);
conv_export_value_curr(_G(flags)[V146] > 0 ? 1 : 0, 6);
conv_export_pointer_curr(&_G(flags)[V143], 7);
conv_export_pointer_curr(&_G(flags)[V142], 8);
conv_export_pointer_curr(&_G(flags)[V147], 9);
conv_export_value_curr(_G(flags)[V145] == 1 ||
_G(flags)[V146] > 0 || _G(flags)[V143] == 1 ? 1 : 0, 10);
_hasCrystalSkull = inv_player_has("CRYSTAL SKULL");
_hasStickAndShellMap = inv_player_has("STICK AND SHELL MAP");
_hasWheeledToy = inv_player_has("WHEELED TOY");
_hasRebusAmulet = inv_player_has("REBUS AMULET");
_hasShrunkenHead = inv_player_has("SHRUNKEN HEAD");
_hasSilverButterfly = inv_player_has("SILVER BUTTERFLY");
_hasPostageStamp = inv_player_has("POSTAGE STAMP");
_hasGermanBanknote = inv_player_has("GERMAN BANKNOTE");
_hasWhaleBoneHorn = inv_player_has("WHALE BONE HORN");
_hasChisel = inv_player_has("CHISEL");
_hasIncenseBurner = inv_player_has("INCENSE BURNER");
_hasRomanovEmerald = inv_player_has("ROMANOV EMERALD");
conv_export_pointer_curr(&_hasCrystalSkull, 11);
conv_export_pointer_curr(&_hasStickAndShellMap, 12);
conv_export_pointer_curr(&_hasWheeledToy, 13);
conv_export_pointer_curr(&_hasRebusAmulet, 14);
conv_export_pointer_curr(&_hasShrunkenHead, 15);
conv_export_pointer_curr(&_hasSilverButterfly, 16);
conv_export_pointer_curr(&_hasPostageStamp, 17);
conv_export_pointer_curr(&_hasGermanBanknote, 18);
conv_export_pointer_curr(&_hasWhaleBoneHorn, 19);
conv_export_pointer_curr(&_hasChisel, 20);
conv_export_pointer_curr(&_hasIncenseBurner, 21);
conv_export_pointer_curr(&_hasRomanovEmerald, 22);
conv_export_pointer_curr(&_G(flags)[V035], 30);
conv_play();
break;
case 509:
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(510);
break;
case 510:
if (_val8 == 1) {
kernel_timing_trigger(1, 512);
} else {
_ripleyShould = 13;
_trigger3 = kernel_trigger_create(511);
}
break;
case 511:
case 524:
_xyzzy1 = 1;
player_set_commands_allowed(true);
break;
case 512:
player_set_commands_allowed(false);
pal_fade_init(21, 255, 0, 30, 513);
break;
case 513:
switch (_convEntry) {
case 0:
_G(flags)[kTravelDest] = 1;
break;
case 1:
_G(flags)[kTravelDest] = 2;
break;
case 2:
_G(flags)[kTravelDest] = 0;
break;
case 3:
_G(flags)[kTravelDest] = 3;
break;
case 4:
_G(flags)[kTravelDest] = 5;
break;
default:
break;
}
if (_G(flags)[V161] == 1)
_G(flags)[V371] = 1;
_G(game).setRoom((_convEntry == 5) ? 504 : 495);
if (_G(flags)[V035] == 1)
_G(flags)[V147] = 1;
break;
case 514:
_agentShould = 1;
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(515);
kernel_timing_trigger(2, 501);
break;
case 515:
_ripleyShould = 4;
digi_play("501r01", 1, 255, 516);
break;
case 516:
_ripleyShould = 3;
_agentShould = 2;
digi_play("501x01", 1, 255, 517);
break;
case 517:
_val4 = checkFlags(true);
_agentShould = 1;
if (_val4 > 0) {
_ripSeries1 = series_load("TELEGRAM XCHANGE");
kernel_timing_trigger(1, 518);
} else {
kernel_timing_trigger(1, 523);
}
break;
case 518:
_ripleyShould = 6;
_trigger2 = kernel_trigger_create(526);
break;
case 522:
kernel_timing_trigger(30, 514);
break;
case 523:
_ripleyShould = 13;
_trigger3 = kernel_trigger_create(524);
break;
case 526:
Common::fill(_queuedDigi, _queuedDigi + 4, (const char *)nullptr);
inv_give_to_player("MESSAGE LOG");
if (_val4 <= 0) {
kernel_timing_trigger(1, 523);
} else {
if (_digiName) {
_queuedDigi[0] = _digiName;
_digiName = nullptr;
} else if (_G(flags)[V364] == 1) {
_queuedDigi[0] = "201R26";
_G(flags)[V364] = 0;
} else if (_G(flags)[V365] == 1) {
_queuedDigi[0] = "201R61";
_G(flags)[V365] = 0;
} else if (_G(flags)[V373] == 1) {
_queuedDigi[0] = "401R36";
_G(flags)[V373] = 0;
} else if (_G(flags)[V366] == 1) {
_queuedDigi[0] = "401R31";
_G(flags)[V366] = 0;
} else if (_G(flags)[V370] == 1) {
_queuedDigi[0] = "501R02B";
_queuedDigi[1] = nullptr;
_queuedDigi[2] = nullptr;
_G(flags)[V370] = 0;
} else if (_G(flags)[V372] == 1) {
_queuedDigi[0] = "701R39";
_queuedDigi[1] = "701R39A";
_G(flags)[V372] = 0;
} else if (_G(flags)[V367] == 1) {
_queuedDigi[0] = "401R37";
_G(flags)[V367] = 0;
_val2 = 1;
} else if (_G(flags)[V368] == 1) {
_queuedDigi[0] = "401R38";
_G(flags)[V368] = 0;
_val2 = 1;
} else if (_G(flags)[V369] == 1) {
_queuedDigi[0] = "401R39";
_G(flags)[V369] = 0;
_val2 = 1;
}
kernel_timing_trigger(1, 527);
}
break;
case 527:
_ripleyShould = 7;
_trigger2 = kernel_trigger_create(528);
break;
case 528:
if (_queuedDigi[0])
digi_play(_queuedDigi[0], 1, 255, 529);
else
kernel_timing_trigger(1, 529);
break;
case 529:
if (_queuedDigi[1])
digi_play(_queuedDigi[1], 1, 255, 530);
else
kernel_timing_trigger(1, 530);
break;
case 530:
if (_queuedDigi[2])
digi_play(_queuedDigi[2], 1, 255, 531);
else
kernel_timing_trigger(1, 531);
break;
case 531:
if (_queuedDigi[3])
digi_play(_queuedDigi[3], 1, 255, 532);
else
kernel_timing_trigger(1, 532);
break;
case 532:
if (_val2 == 1) {
_val2 = 0;
kernel_timing_trigger(1, 534);
} else {
if (--_val4 > 0) {
_ripleyShould = 8;
_trigger2 = kernel_trigger_create(526);
} else {
kernel_timing_trigger(1, 533);
}
}
break;
case 533:
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(523);
break;
case 534:
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(535);
break;
case 535:
_ripParcelExchange = series_load("PARCEL XCHANGE");
_agentShould = 5;
_xyzzy7 = kernel_trigger_create(536);
break;
case 536:
_ripleyShould = 9;
_xyzzy7 = kernel_trigger_create(537);
break;
case 537:
if (!inv_player_has("ROMANOV EMERALD"))
inv_give_to_player("ROMANOV EMERALD");
_agentShould = 1;
_xyzzy6 = kernel_trigger_create(538);
break;
case 538:
series_unload(_ripParcelExchange);
kernel_timing_trigger(1, 523);
break;
case 539:
_ripParcelExchange = series_load("PARCEL XCHANGE");
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(540);
break;
case 540:
_agentShould = 5;
_xyzzy7 = kernel_trigger_create(541);
break;
case 541:
_ripleyShould = 11;
_trigger1 = kernel_trigger_create(542);
break;
case 542:
_agentShould = 1;
_xyzzy6 = kernel_trigger_create(543);
break;
case 543: {
series_unload(_ripParcelExchange);
const int item = conv_current_entry();
if (item >= 0 && item <= 11) {
static const char *ITEMS[12] = {
"CRYSTAL SKULL", "STICK AND SHELL MAP",
"WHEELED TOY", "REBUS AMULET", "SHRUNKEN HEAD",
"SILVER BUTTERFLY", "POSTAGE STAMP",
"GERMAN BANKNOTE", "WHALE BONE HORN",
"CHISEL", "INCENSE BURNER", "ROMANOV EMERALD"
};
if (item != 11)
inv_move_object(ITEMS[item], 305);
else {
setFlag45();
inv_move_object(ITEMS[item], NOWHERE);
}
}
conv_resume();
break;
}
case 544:
player_set_commands_allowed(false);
digi_preload("950_s34");
_ripSketching = series_load("RIP SKETCHING IN NOTEBOOK POS 2");
setGlobals1(_ripSketching, 1, 17, 17, 17, 0, 18, 39, 37, 39, 1);
sendWSMessage_110000(545);
break;
case 545:
sendWSMessage_120000(-1);
digi_play("950_s34", 2, 200, 546);
break;
case 546:
sendWSMessage_110000(547);
break;
case 547:
sendWSMessage_140000(548);
break;
case 548:
_G(flags)[V148] = 1;
series_unload(_ripSketching);
digi_unload("950_s34");
player_set_commands_allowed(true);
break;
case 549:
player_set_commands_allowed(false);
_ripMoneyExchange = series_load("MONEY XCHANGE");
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(550);
break;
case 550:
_ripleyShould = 14;
break;
case 551:
_xyzzy7 = kernel_trigger_create(552);
break;
case 552:
_agentShould = 1;
_xyzzy6 = kernel_trigger_create(553);
break;
case 553:
series_unload(_ripMoneyExchange);
player_set_commands_allowed(true);
conv_resume();
break;
case 555:
_puffinExchange = series_load("PUFFIN XCHANGE");
_agentShould = 5;
kernel_timing_trigger(1, 501);
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(556);
break;
case 556:
_xyzzy7 = kernel_trigger_create(557);
break;
case 557:
_deltaPuffinMachine = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x700, false,
triggerMachineByHashCallback, "Delta Puffin Machine State");
_xyzzy3 = 1;
_xyzzy1 = 1;
_xyzzy5 = 1;
_xyzzy10 = 1;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 1, 1, 558,
_puffinExchange, 1, 39, 0);
digi_play("501R36", 1, 255, 559);
break;
case 558:
case 569:
case 597:
case 600:
_xyzzy10 = 0;
break;
case 559:
kernel_timing_trigger(1, (_xyzzy10 == 1) ? 559 : 561);
break;
case 561:
inv_move_object("DRIFTWOOD PUFFIN", 501);
_xyzzy10 = 1;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 39, 41, 562,
_puffinExchange, 41, 39, 2);
digi_play("501X05", 1, 255, 563);
break;
case 562:
midi_play("SADBOY2", 255, false, -1, 949);
_xyzzy10 = 0;
break;
case 563:
kernel_timing_trigger(1, (_xyzzy10 == 1) ? 563 : 564);
break;
case 564:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 40, 47, 565,
_puffinExchange, 47, 47, 0);
break;
case 565:
kernel_timing_trigger(1, 501);
_ripleyShould = 4;
_trigger4 = kernel_trigger_create(566);
break;
case 566:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 48, 48, -1,
_puffinExchange, 48, 48, 0);
digi_play("501R37", 1, 255, 567);
break;
case 567:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 47, 40, 568,
_puffinExchange, 47, 47, 0);
_xyzzy3 = 1;
_xyzzy1 = 1;
break;
case 568:
_xyzzy10 = 0;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 39, 41, 569,
_puffinExchange, 39, 41, 2);
digi_play("501X06", 1, 255, 570);
break;
case 570:
kernel_timing_trigger(1, (_xyzzy10 == 1) ? 570 : 571);
break;
case 571:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 40, 47, 572,
_puffinExchange, 47, 47, 0);
break;
case 572:
kernel_timing_trigger(1, 501);
_ripleyShould = 4;
_trigger4 = kernel_trigger_create(573);
break;
case 573:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 48, 48, -1,
_puffinExchange, 48, 48, 0);
digi_play("501R38", 1, 255, 574);
break;
case 574:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 49, 65, 575,
_puffinExchange, 65, 65, 0);
_xyzzy3 = 1;
_xyzzy1 = 1;
break;
case 575:
terminateMachineAndNull(_clock);
_clock = series_place_sprite("501 PUFFIN CLOCK", 0, 0, 0, 100, 0x780);
_xyzzy10 = 1;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 66, 135, 576,
_puffinExchange, 135, 135, 0);
digi_play("501x07", 1, 255, 577);
break;
case 576:
_xyzzy10 = 0;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 135, 135, -1,
_puffinExchange, 135, 135, 0);
break;
case 577:
kernel_timing_trigger(1, (_xyzzy10 == 1) ? 577 : 578);
break;
case 578:
kernel_timing_trigger(1, 505);
kernel_timing_trigger(1, 501);
_ripleyShould = 5;
_trigger1 = kernel_trigger_create(579);
break;
case 579:
terminateMachineAndNull(_deltaPuffinMachine);
kernel_examine_inventory_object("PING CLOCK FACING",
_G(master_palette), 5, 1, 195, 126, -1, nullptr, -1);
if (!inv_player_has("CLOCK FACING"))
inv_give_to_player("CLOCK FACING");
_agentShould = 1;
_xyzzy6 = kernel_trigger_create(580);
break;
case 580:
digi_play("501x08", 1, 255, 581);
break;
case 581:
_agentShould = 1;
_ripleyShould = 4;
digi_play("501R39", 1, 255, 582);
break;
case 582:
_ripleyShould = 13;
_trigger3 = kernel_trigger_create(583);
break;
case 583:
_G(flags)[V143] = 1;
_G(flags)[V142] = 1;
series_unload(_puffinExchange);
_xyzzy3 = 0;
_xyzzy1 = 1;
player_set_commands_allowed(true);
break;
case 585:
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(586);
_agentShould = 5;
break;
case 586:
_xyzzy7 = kernel_trigger_create(587);
break;
case 587:
_ripleyShould = 16;
_trigger1 = kernel_trigger_create(588);
break;
case 588:
_agentShould = 5;
_xyzzy7 = kernel_trigger_create(589);
break;
case 589:
_ripleyShould = 19;
_trigger1 = kernel_trigger_create(590);
break;
case 590:
_agentShould = 1;
_xyzzy6 = kernel_trigger_create(591);
break;
case 591:
series_unload(_ripSignsPaper);
player_set_commands_allowed(true);
conv_resume();
break;
case 594:
_puffinExchange = series_load("PUFFIN XCHANGE");
_agentShould = 5;
kernel_timing_trigger(1, 501);
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(595);
break;
case 595:
_xyzzy7 = kernel_trigger_create(596);
break;
case 596:
_deltaPuffinMachine = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x700, false,
triggerMachineByHashCallback, "Delta Puffin Machine State");
_xyzzy3 = 1;
_xyzzy1 = 1;
_xyzzy5 = 1;
_xyzzy10 = 1;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 1, 1, 558,
_puffinExchange, 1, 39, 0);
digi_play("501R36", 1, 255, 598);
break;
case 598:
kernel_timing_trigger(1, (_xyzzy10 == 1) ? 598 : 599);
break;
case 599:
_xyzzy10 = 1;
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 39, 41, 600,
_puffinExchange, 41, 39, 2);
digi_play("501X05", 1, 255, 601);
break;
case 601:
kernel_timing_trigger(1, (_xyzzy10 == 1) ? 601 : 602);
break;
case 602:
sendWSMessage_10000(1, _deltaPuffinMachine, _puffinExchange, 39, 1, 603,
_puffinExchange, 1, 1, 0);
break;
case 603:
kernel_timing_trigger(1, 505);
kernel_timing_trigger(1, 501);
_ripleyShould = 5;
_trigger1 = kernel_trigger_create(604);
break;
case 604:
terminateMachineAndNull(_deltaPuffinMachine);
_agentShould = 1;
_xyzzy6 = kernel_trigger_create(605);
break;
case 605:
_ripleyShould = 13;
_trigger3 = kernel_trigger_create(606);
break;
case 606:
series_unload(_puffinExchange);
_xyzzy3 = 0;
_xyzzy1 = 1;
player_set_commands_allowed(true);
break;
case 610:
_ripleyShould = 4;
digi_play("COM084", 1, 255, 611, 997);
break;
case 611:
_ripleyShould = 3;
conv_resume();
break;
case 612:
player_set_commands_allowed(true);
break;
default:
break;
}
}
void Room501::parser() {
const bool lookFlag = player_said_any("look", "look at");
const bool takeFlag = player_said("take");
const bool talkFlag = player_said_any("talk", "talk to");
const bool useFlag = player_said("gear");
if (player_said("conv501a")) {
conv501a();
} else if (_G(kernel).trigger == 747) {
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 509);
} else if (lookFlag && player_said(" ")) {
digi_play("COM001", 1, 255, -1, 997);
} else if (lookFlag && player_said("CLOCK") && _G(flags)[V143] == 1) {
digi_play("501R05", 1);
} else if (lookFlag && player_said("CLOCK") && _G(flags)[V143] == 0) {
switch (_G(kernel).trigger) {
case -1:
case 666:
player_set_commands_allowed(false);
digi_play("501R05", 1, 255, 2);
break;
case 2:
_G(flags)[V143] = 1;
digi_play("501R05A", 1);
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (lookFlag && player_said("POSTCARD RACK")) {
digi_play("501R06", 1);
} else if (lookFlag && player_said_any("PUFFIN", "PUFFINS", "PUFFIN POSTER") &&
_G(flags)[V145] == 1) {
digi_play("501R07", 1);
} else if (lookFlag && player_said_any("PUFFIN", "PUFFINS", "PUFFIN POSTER") &&
_G(flags)[V145] == 0) {
switch (_G(kernel).trigger) {
case -1:
case 666:
player_set_commands_allowed(false);
digi_play("501R07", 1, 255, 2);
break;
case 2:
_G(flags)[V145] = 1;
digi_play("501R07A", 1);
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (lookFlag && player_said("STELE")) {
switch (_G(kernel).trigger) {
case -1:
case 666:
player_set_commands_allowed(false);
if (!_G(flags)[V146]) {
digi_play("501R08", 1, 255, 2);
_G(flags)[V146]++;
} else {
if (_G(flags)[V146] < 2)
++_G(flags)[V146];
digi_play("501R08", 1);
}
break;
case 2:
_G(kernel).trigger_mode = KT_DAEMON;
digi_play("501R08A", 1, 255, _G(flags)[V148] ? 612 : 544);
break;
default:
break;
}
} else if (lookFlag && player_said("POSTER")) {
// No implementation
} else if (takeFlag && player_said("POSTCARD RACK")) {
digi_play("COM004", 1, 255, -1, 997);
} else if (takeFlag && player_said("MAGAZINES")) {
digi_play("COM005", 1, 255, -1, 997);
} else if (takeFlag && player_said("STELE")) {
digi_play("501R19", 1);
} else if (takeFlag && player_said("PUFFIN")) {
digi_play("501R20", 1);
} else if (takeFlag && player_said("CLOCK")) {
digi_play("501R21", 1);
} else if (takeFlag) {
Common::String digiName = Common::String::format("COM%.3d",
imath_ranged_rand(6, 11));
digi_play(digiName.c_str(), 1, 255, -1, 997);
} else if (player_said("DRIFTWOOD PUFFIN", "AGENT") &&
_G(flags)[V041] == 1 && _G(flags)[V144] == 1) {
player_set_commands_allowed(false);
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 555);
} else if (player_said("DRIFTWOOD PUFFIN", "AGENT") &&
(_G(flags)[V041] == 0 || _G(flags)[V144] == 0)) {
player_set_commands_allowed(false);
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 594);
} else if (useFlag && player_said("SOFA")) {
digi_play("COM025", 1, 255, -1, 997);
} else if (useFlag && player_said("PHONE")) {
digi_play("COM026", 1, 255, -1, 997);
} else if (useFlag && !inv_player_has(_G(player).noun)) {
digi_play("COM027", 1, 255, -1, 997);
} else if (player_said("WALK THROUGH") && !player_been_here(504)) {
switch (_G(kernel).trigger) {
case -1:
case 666:
ws_walk(_G(my_walker), 595, 267, nullptr, 2, 3);
break;
case 2:
player_set_commands_allowed(false);
digi_play("501R40", 1);
ws_walk(_G(my_walker), 287, 268, nullptr, 3, 9);
break;
case 3:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (player_said("WALK THROUGH") && player_been_here(504)) {
switch (_G(kernel).trigger) {
case -1:
ws_walk(_G(my_walker), 595, 267, nullptr, 2, 3);
break;
case 2:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(3);
break;
case 3:
_G(game).setRoom(504);
if (_G(flags)[V035] == 1)
_G(flags)[V147] = 1;
break;
default:
break;
}
} else if (player_said("JOURNAL", "STELE")) {
if (_G(flags)[V148] == 1) {
digi_play("501R34", 1);
} else {
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 544);
}
} else if (lookFlag && player_said("JOURNAL") && !player_said("STELE")) {
digi_play("501R35", 1);
} else if (talkFlag && player_said("AGENT")) {
switch (_G(kernel).trigger) {
case -1:
case 666:
player_set_commands_allowed(false);
_agentShould = 1;
_ripleyShould = 3;
_trigger1 = kernel_trigger_create(2);
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(2, 501);
break;
case 2:
_ripleyShould = 2;
player_set_commands_allowed(true);
break;
default:
break;
}
} else {
return;
}
_G(player).command_ready = false;
}
void Room501::conv501a() {
const char *sound = conv_sound_to_play();
const int who = conv_whos_talking();
const int node = conv_current_node();
const int entry = conv_current_entry();
if (node == 15) {
if (entry == 0)
_G(flags)[V041] = 1;
if (entry == 5)
_G(flags)[V144] = 1;
}
if (_G(kernel).trigger == 1) {
if (who <= 0) {
_agentShould = 1;
if (node == 1 && (entry == 2 || entry == 3)) {
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 549);
return;
} else if (node == 5 && entry == 0) {
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 610);
return;
}
} else if (who == 1) {
if (node == 1 && entry == 1) {
int32 x1, y1, x2, y2;
conv_set_box_xy(490, -4);
set_dlg_rect();
conv_get_dlg_coords(&x1, &y1, &x2, &y2);
conv_set_dlg_coords(x1, y1 - 10, x2, y2 - 10);
set_dlg_rect();
} else {
conv_set_box_xy(10, 10);
}
_ripleyShould = 3;
if (node == 2)
_convEntry = entry;
if (node == 8 && entry == 0)
_val8 = 1;
}
} else {
if (who <= 0) {
if (node == 15 && entry == 5)
midi_play("SADBOY1", 255, false, -1, 949);
if (node == 7 && entry == 0) {
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 585);
return;
}
_agentShould = 2;
} else if (who == 1) {
if (node == 14 && entry != 12) {
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 539);
conv_set_box_xy(10, 10);
return;
}
if (node == 14 && entry == 12) {
conv_set_box_xy(10, 10);
conv_resume();
return;
}
}
if (sound) {
digi_play(sound, 1, 255, 1);
return;
}
}
conv_resume();
}
bool Room501::updateItems() {
Common::fill(_items, _items + 12, 0);
_itemsCount = 0;
static const char *ITEMS[12] = {
"CRYSTAL SKULL", "STICK AND SHELL MAP", "WHEELED TOY",
"REBUS AMULET", "SHRUNKEN HEAD", "SILVER BUTTERFLY",
"POSTAGE STAMP", "GERMAN BANKNOTE", "WHALE BONE HORN",
"CHISEL", "INCENSE BURNER", "ROMANOV EMERALD"
};
for (int i = 0; i < 12; ++i) {
if (inv_player_has(ITEMS[i]))
_items[_itemsCount++] = i + 1;
}
return _itemsCount > 0;
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4