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

2237 lines
55 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/section6/room603.h"
#include "m4/riddle/rooms/section6/section6.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
static const int16 NORMAL_DIRS1[] = { 200, -1 };
static const char *NORMAL_NAMES1[] = { "shen guo walker 3" };
static const int16 SHADOW_DIRS1[] = { 210, -1 };
static const char *SHADOW_NAMES1[] = { "shen guo shadow 3" };
static const int16 NORMAL_DIRS2[] = { 220, -1 };
static const char *NORMAL_NAMES2[] = { "kuang walker 2" };
static const int16 SHADOW_DIRS2[] = { 230, -1 };
static const char *SHADOW_NAMES2[] = { "kuangs shadow 2" };
static const char *SAID[][2] = {
{ "shed", "603r03" },
{ "wire", "603r04" },
{ "power line", "603r05" },
{ "altar", "603r06" },
{ "shirt", "603r07" },
{ "cliff", "603r10" },
{ "person in pit", "603r11" },
{ nullptr, nullptr }
};
void Room603::preload() {
if (_G(flags)[V191]) {
_G(art_base_override) = "EXPLOSION BACKGROUND";
_G(use_alternate_attribute_file) = false;
_G(player).walker_in_this_scene = false;
}
Room::preload();
}
void Room603::init() {
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
_trigger1 = 0;
_val2 = 0;
_val3 = 0;
_val4 = 0;
_val5 = 0;
}
_showingNoteCloseup = false;
if (_G(game).previous_room != 604 && _G(game).previous_room != KERNEL_RESTORING_GAME &&
inv_player_has("PULL CORD") && !inv_object_is_here("POLE") &&
_G(flags)[V203] == 4) {
_G(flags)[V203] = 5;
_G(flags)[V011] = 0;
}
if (_G(flags)[V191]) {
interface_hide();
player_set_commands_allowed(false);
digi_preload("explode");
digi_preload("950_s28a");
digi_play_loop("950_s28a", 3, 90);
series_play("653 RIP HOPS ROCK", 0xf00, 16, -1, 5);
series_load("653 FIRST FRAME SHED");
_shed = series_show("653 FIRST FRAME SHED", 0xf00, 16);
ws_walk_load_walker_series(NORMAL_DIRS1, NORMAL_NAMES1);
ws_walk_load_shadow_series(SHADOW_DIRS1, SHADOW_NAMES1);
_shenWalker = triggerMachineByHash_3000(8, 12, *NORMAL_DIRS1, *SHADOW_DIRS1, 525, 238, 3,
triggerMachineByHashCallback3000, "shen suit gun walker");
sendWSMessage_10000(_shenWalker, 535, 235, 3, 10, 1);
ws_walk_load_walker_series(NORMAL_DIRS2, NORMAL_NAMES2);
ws_walk_load_shadow_series(SHADOW_DIRS2, SHADOW_NAMES2);
_kuangWalker = triggerMachineByHash_3000(8, 13, *NORMAL_DIRS2, *SHADOW_DIRS2, 554, 245, 2,
triggerMachineByHashCallback3000, "kuang suit walker");
sendWSMessage_10000(_kuangWalker, 563, 244, 2, -1, 1);
return;
}
if (_G(flags)[V203] != 9) {
digi_preload("603_S02");
digi_preload("603_S02a");
digi_preload("603_S02b");
digi_preload("603_S02c");
if (_G(flags)[V203] == 0) {
digi_preload("603_S01");
digi_preload("603_S01A");
digi_preload("603_S01B");
_rp01 = series_load("603RP01");
_rp02 = series_load("603RP02");
}
_tt03 = series_load("603TT03");
_ttD01 = series_load("603TTD01");
_rp04 = series_load("603RP04");
_ripHandsBehindBack = series_load("RIP TREK HANDS BEHIND BACK POS2");
_ripTalk = series_load("RIP TREK TALK");
_ripHandsHips = series_load("RIP TREK HANDS HIPS POS2");
_ripHandChin = series_load("RIP TREK HAND ON CHIN POS2");
_ripTwoHandTalk = series_load("RIP TREK TWO HAND TALK POS2");
}
if (_G(flags)[V203] == 9) {
_note = series_show("603NOTE", 0x700, 16);
hotspot_set_active("NOTE", false);
hotspot_set_active("twelvetrees", false);
hotspot_set_active("twelvetrees ", false);
hotspot_set_active("person in pit", false);
} else {
hotspot_set_active("NOTE ", false);
if (!inv_object_is_here("TWELVETREES' NOTE")) {
hotspot_set_active("NOTE", false);
} else if (_G(flags)[V203] == 4) {
_note = series_show("603NOTE", 0x800, 16);
} else {
hotspot_set_active("NOTE", false);
}
}
if (inv_object_is_here("POLE")) {
_pole = series_show("603POLE", 0x400, 16);
} else {
hotspot_set_active("POLE", false);
}
if (_G(flags)[V203] < 1) {
_shirt = series_show("603SHIRT", 0x400, 16);
hotspot_set_active("SLEEVE", false);
} else {
hotspot_set_active("SHIRT", false);
if (inv_object_is_here("SLEEVE"))
_sleeve = series_show("603SLEEV", 0x400, 16);
else
hotspot_set_active("SLEEVE", false);
}
if (_G(flags)[V203] == 9) {
hotspot_set_active("POWER LINE", false);
hotspot_set_active("shed", false);
hotspot_set_active("wire", false);
hotspot_set_active(" ", false);
series_show("603ROCKS", 0xf00, 16);
} else {
series_load("603 POWER LINE");
series_show("603 POWER LINE", 0, 16);
}
switch (_G(game).previous_room) {
case KERNEL_RESTORING_GAME:
digi_preload(_G(globals)[GLB_TEMP_5] ? "genrun" : "950_s28a");
break;
case 604:
player_set_commands_allowed(false);
digi_preload("950_s28a");
ws_demand_location(_G(my_walker), 542, 230, 2);
ws_walk(_G(my_walker), 534, 240, nullptr, 5, 7);
break;
case 605:
if (_G(globals)[GLB_TEMP_5]) {
digi_preload("genrun");
} else {
digi_preload("950_s28a");
digi_stop(3);
digi_unload("950_s28");
}
player_set_commands_allowed(false);
ws_demand_location(_G(my_walker), 670, 232, 2);
ws_walk(_G(my_walker), 497, 245, nullptr, 1, 8);
break;
default:
player_set_commands_allowed(false);
digi_preload("950_s28a");
ws_demand_location(_G(my_walker), 67, 391, 2);
ws_walk(_G(my_walker), 135, 356, nullptr, 1, 2);
break;
}
switch (_G(flags)[V203]) {
case 0:
digi_preload("17_04p01");
digi_preload("17_04n06");
_G(player).disable_hyperwalk = true;
_G(kernel).call_daemon_every_loop = true;
_door = series_show("603DOOR", 0xf00, 16, -1, -1, 23, 100, 0, 0);
_ttDigShirtOff = series_load("TT DIG LOOP NO SHIRT");
_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xf00, false,
triggerMachineByHashCallback, "tt");
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 2, 2, 200, _ttDigShirtOff, 2, 2, 0);
_trigger1 = 200;
_ttMode = 1;
_ttShould = 0;
_val9 = 0;
_val10 = 0;
hotspot_set_active("twelvetrees ", false);
hotspot_set_active("twelvetrees", false);
break;
case 1:
case 3:
case 5:
case 7:
_door = series_show("603DOOR", 0xf00, 16);
hotspot_set_active("wire", false);
_ttDigShirtOn = series_load("TT DIG LOOP SHIRT ON");
_ttMode = 6;
_ttShould = 17;
_val9 = 0;
_val10 = 0;
hotspot_set_active("person in pit", false);
if (_val5) {
_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, false,
triggerMachineByHashCallback, "tt");
sendWSMessage_10000(1, _tt, _ttD01, 1, 1, 400, _ttD01, 1, 1, 0);
_trigger1 = 400;
hotspot_set_active("twelvetrees ", false);
_ttShadow = series_show("tt walker shadow 4", 0xf00, 0, -1, -1, 0, 53, 291, 293);
} else {
_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xf00, false,
triggerMachineByHashCallback, "tt");
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 1, 1, 500,
_ttDigShirtOn, 1, 1, 0);
_trigger1 = 500;
hotspot_set_active("twelvetrees", false);
}
break;
default:
if (_G(game).previous_room == 604)
_door = series_show("603DOOR", 0xf00, 16, -1, -1, 14, 100, 0, 0);
else
_door = series_show("603DOOR", 0xf00, 16, -1, -1, 0, 100, 0, 0);
hotspot_set_active("wire", false);
hotspot_set_active("twelvetrees", false);
hotspot_set_active("twelvetrees ", false);
hotspot_set_active("person in pit", false);
break;
}
if (_G(flags)[V011])
digi_play_loop("genrun", 3, 140, -1, 604);
else
digi_play_loop("950_s28a", 3, 90, -1, -1);
}
void Room603::daemon() {
switch (_G(kernel).trigger) {
case 1:
player_set_commands_allowed(true);
break;
case 2:
player_set_commands_allowed(true);
digi_play("603_s03", 2);
break;
case 5:
terminateMachineAndNull(_door);
_door = series_play("603door", 0xf00, 18, 2, 8, 0, 100, 0, 0, 0, 14);
break;
case 10:
sendWSMessage_60000(_shenWalker);
sendWSMessage_60000(_kuangWalker);
_explosion = series_stream("603 EXPLOSION", 5, 0x100, -1);
series_stream_break_on_frame(_explosion, 40, 24);
break;
case 20:
disable_player_commands_and_fade_init(22);
break;
case 22:
kernel_timing_trigger(180, 23);
break;
case 23:
digi_stop(1);
digi_unload("explode");
digi_play_loop("950_s28a", 3, 90);
adv_kill_digi_between_rooms(false);
_G(game).setRoom(615);
break;
case 24:
midi_stop();
series_stream_break_on_frame(_explosion, 105, 20);
terminateMachineAndNull(_shed);
digi_play("explode", 1);
break;
case 200:
kernel_trigger_dispatchx(kernel_trigger_create(201));
break;
case 201:
switch (_ttMode) {
case 1:
switch (_ttShould) {
case 0:
switch (imath_ranged_rand(1, 3)) {
case 1:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 2, 2, 200,
_ttDigShirtOff, 2, 2, 0);
sendWSMessage_190000(_tt, imath_ranged_rand(10, 60));
break;
case 2:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 1, 1, 200,
_ttDigShirtOff, 1, 1, 0);
_ttMode = 2;
sendWSMessage_190000(_tt, imath_ranged_rand(10, 60));
playRandomDigi(8);
break;
default:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 1, 14, 200,
_ttDigShirtOff, 15, 15, 0);
_ttMode = 3;
sendWSMessage_190000(_tt, imath_ranged_rand(7, 10));
playRandomDigi(8);
break;
}
break;
case 5:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 25, 43, 202,
_ttDigShirtOff, 43, 43, 0);
break;
case 22:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 25, 34, 210,
_ttDigShirtOff, 34, 34, 0);
break;
default:
break;
}
break;
case 2:
switch (_ttShould) {
case 0:
if (imath_ranged_rand(1, 2) == 1) {
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 1, 1, 200,
_ttDigShirtOff, 1, 1, 0);
_ttMode = 1;
} else {
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 1, 1, 200,
_ttDigShirtOff, 1, 1, 0);
sendWSMessage_190000(_tt, imath_ranged_rand(10, 60));
}
break;
case 5:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 1, 1, 200,
_ttDigShirtOff, 1, 1, 0);
_ttMode = 1;
break;
default:
break;
}
break;
case 3:
switch (_ttShould) {
case 0:
switch (imath_ranged_rand(1, 3)) {
case 1:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 15, 15, 200,
_ttDigShirtOff, 15, 15, 0);
sendWSMessage_190000(_tt, imath_ranged_rand(10, 60));
break;
case 2:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 14, 1, 200,
_ttDigShirtOff, 2, 2, 0);
_ttMode = 1;
sendWSMessage_190000(_tt, imath_ranged_rand(7, 10));
break;
case 3:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 16, 24, 200,
_ttDigShirtOff, 24, 24, 0);
_ttMode = 4;
sendWSMessage_190000(_tt, imath_ranged_rand(7, 10));
break;
default:
break;
}
break;
case 5:
case 22:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 14, 1, 200,
_ttDigShirtOff, 2, 2, 0);
_ttMode = 1;
break;
default:
break;
}
break;
case 4:
switch (_ttShould) {
case 0:
if (imath_ranged_rand(1, 2) == 1) {
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 24, 16, 200,
_ttDigShirtOff, 15, 15, 0);
_ttMode = 3;
sendWSMessage_190000(_tt, imath_ranged_rand(7, 10));
playRandomDigi(8);
} else {
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 24, 24, 200,
_ttDigShirtOff, 24, 24, 0);
_ttMode = 1;
sendWSMessage_190000(_tt, imath_ranged_rand(10, 60));
}
break;
case 5:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 24, 16, 200,
_ttDigShirtOff, 15, 15, 0);
_ttMode = 3;
break;
case 22:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 14, 16, 200,
_ttDigShirtOff, 15, 15, 0);
_ttMode = 3;
break;
default:
break;
}
break;
default:
break;
}
break;
case 202:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 41, 43, -1,
_ttDigShirtOff, 41, 43, 1);
sendWSMessage_190000(_tt, 12);
sendWSMessage_1a0000(_tt, 12);
digi_play("603t02", 1, 255, 203);
break;
case 203:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 43, 43, -1,
_ttDigShirtOff, 43, 43, 1);
_ripleyShould = 13;
digi_play("603r13", 1, 255, 204);
break;
case 204:
_ripleyShould = 14;
kernel_timing_trigger(1, 300);
_G(kernel).trigger_mode = KT_PARSE;
conv_load("conv603a", 10, 10, 747);
conv_set_shading(65);
conv_export_value_curr(0, 0);
conv_export_value_curr(0, 1);
conv_play();
_G(kernel).trigger_mode = KT_DAEMON;
break;
case 210:
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 35, 43, -1,
_ttDigShirtOff, 43, 43, 1);
digi_play("603t01", 1);
kernel_timing_trigger(60, 212);
break;
case 212:
if (player_said("take", "shirt") || player_said("take", "pole")) {
sendWSMessage_140000(213);
} else {
kernel_timing_trigger(1, 213);
}
break;
case 213:
if (player_said("take", "shirt") || player_said("take", "pole"))
series_unload(_ripAction);
Common::strcpy_s(_G(player).verb, "talk to");
Common::strcpy_s(_G(player).noun, "person in pit");
_G(kernel).trigger_mode = KT_PARSE;
ws_walk(_G(my_walker), 311, 306, nullptr, 666, 10);
_G(kernel).trigger_mode = KT_DAEMON;
_G(player).disable_hyperwalk = false;
break;
case 300:
kernel_trigger_dispatchx(kernel_trigger_create(301));
break;
case 301:
switch (_ripleyMode) {
case 0:
switch (_ripleyShould) {
case 0:
sendWSMessage_10000(1, _ripley, _ripTalk, 1, 1, 300, _ripTalk, 1, 1, 0);
break;
case 2:
case 8:
case 13:
case 14:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 1, 15, 300,
_ripHandsBehindBack, 15, 15, 0);
_ripleyMode = 8;
sendWSMessage_190000(_ripley, 4);
break;
case 5:
sendWSMessage_10000(1, _ripley, _ripTalk, 1, 1, -1, _ripTalk, 1, 7, 4);
sendWSMessage_1a0000(_ripley, 13);
break;
case 6:
sendWSMessage_10000(1, _ripley, _ripTwoHandTalk, 1, 6, 300,
_ripTwoHandTalk, 6, 6, 0);
_ripleyMode = 6;
break;
case 9:
sendWSMessage_10000(1, _ripley, _ripHandChin, 1, 16, 300,
_ripHandChin, 16, 16, 0);
_ripleyMode = 9;
break;
case 10:
sendWSMessage_10000(1, _ripley, _ripHandsHips, 1, 12, 300,
_ripHandsHips, 12, 12, 0);
_ripleyMode = 10;
break;
case 11:
terminateMachineAndNull(_ripley);
player_set_commands_allowed(true);
ws_unhide_walker();
break;
case 12:
terminateMachineAndNull(_ripley);
ws_unhide_walker();
terminateMachineAndNull(_shadow);
ws_walk(_G(my_walker), 670, 232, nullptr, -1, 3);
break;
default:
break;
}
break;
case 6:
if (_ripleyShould == 6) {
sendWSMessage_10000(1, _ripley, _ripTwoHandTalk, 6, 6, 300,
_ripTwoHandTalk, 6, 6, 0);
} else {
sendWSMessage_10000(1, _ripley, _ripTwoHandTalk, 6, 1, 300,
_ripTwoHandTalk, 1, 1, 0);
_ripleyMode = 0;
}
break;
case 8:
switch (_ripleyShould) {
case 1:
terminateMachineAndNull(_tt);
terminateMachineAndNull(_shirt);
terminateMachineAndNull(_shadow);
_sleeve = series_show("603SLEEV", 0x400, 16);
hotspot_set_active("SLEEVE", true);
hotspot_set_active("SHIRT", false);
sendWSMessage_10000(1, _ripley, _rp02, 1, 28, 305, _rp02, 28, 28, 0);
_ripleyShould = 0;
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_1f0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
sendWSMessage_210000(_ripley, 100);
break;
case 2:
sendWSMessage_10000(1, _ripley, _rp04, 1, 31, 330, _rp04, 31, 31, 0);
_ripleyShould = 0;
break;
case 8:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 15, 300,
_ripHandsBehindBack, 15, 15, 0);
break;
case 13:
case 14:
sendWSMessage_10000(1, _ripley, _rp01, 34, 35, 300, _rp01, 35, 35, 1);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
sendWSMessage_1f0000(_ripley, 0, 0);
sendWSMessage_210000(_ripley, 100);
_ripleyMode = 13;
break;
default:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 1, 300,
_rp04, 1, 1, 0);
sendWSMessage_190000(_ripley, 4);
_ripleyMode = 0;
break;
}
break;
case 9:
if (_ripleyShould == 9) {
sendWSMessage_10000(1, _ripley, _ripHandChin, 16, 16, 300,
_ripHandChin, 16, 16, 0);
} else {
sendWSMessage_10000(1, _ripley, _ripHandChin, 16, 1, 300,
_ripHandChin, 1, 1, 0);
_ripleyMode = 0;
}
break;
case 10:
if (_ripleyShould == 10) {
sendWSMessage_10000(1, _ripley, _ripHandsHips, 12, 12, 300,
_ripHandsHips, 12, 12, 0);
} else {
sendWSMessage_10000(1, _ripley, _ripHandsHips, 12, 1, 300,
_rp04, 1, 1, 0);
_ripleyMode = 0;
}
break;
case 13:
switch (_ripleyShould) {
case 5:
case 13:
sendWSMessage_10000(1, _ripley, _rp01, 36, 36, -1, _rp01, 36, 38, 1);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
sendWSMessage_1f0000(_ripley, 0, 0);
sendWSMessage_210000(_ripley, 100);
sendWSMessage_1a0000(_ripley, 13);
break;
case 14:
sendWSMessage_10000(1, _ripley, _rp01, 36, 36, 300, _rp01, 36, 36, 1);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
sendWSMessage_1f0000(_ripley, 0, 0);
sendWSMessage_210000(_ripley, 100);
sendWSMessage_1a0000(_ripley, 30);
break;
default:
sendWSMessage_10000(1, _ripley, _rp01, 35, 34, 300,
_ripHandsBehindBack, 15, 15, 300);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
_ripleyMode = 8;
break;
}
break;
default:
break;
}
break;
case 302:
sendWSMessage_10000(1, _ripley, _rp01, 16, 36, 300,
_ripHandsBehindBack, 15, 15, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
_ripleyMode = 13;
_ripleyShould = 14;
digi_play("603r12", 1, 255, 303);
break;
case 303:
if (_ttShould == 22)
kernel_timing_trigger(1, 202);
else
_ttShould = 5;
break;
case 304:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 15, 300,
_ripHandsBehindBack, 15, 15, 0);
_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 59, 311, 308);
break;
case 305:
sendWSMessage_10000(1, _ripley, _rp02, 29, 36, 309, _rp02, 36, 36, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
digi_play("603_s01", 2, 255, 306);
break;
case 306:
conv_resume();
break;
case 309:
sendWSMessage_10000(1, _ripley, _rp02, 36, 30, 310, _rp02, 30, 30, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
break;
case 310:
sendWSMessage_10000(1, _ripley, _rp02, 30, 37, 311, _rp02, 37, 37, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
break;
case 311:
sendWSMessage_10000(1, _ripley, _rp02, 36, 31, 312, _rp02, 31, 31, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
break;
case 312:
sendWSMessage_10000(1, _ripley, _rp02, 32, 38, 313, _rp02, 38, 38, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
digi_play("603_s01a", 2);
break;
case 313:
sendWSMessage_10000(1, _ripley, _rp02, 39, 124, 320, _rp02, 124, 124, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
digi_stop(2);
break;
case 320:
terminateMachineAndNull(_ripley);
_ttNote = series_show("603rp02a", 0x100, 16);
_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, false,
triggerMachineByHashCallback, "tt");
sendWSMessage_10000(1, _tt, _tt03, 1, 39, 322, _tt03, 39, 39, 0);
break;
case 322:
sendWSMessage_10000(1, _tt, _tt03, 40, 59, 324, _tt03, 59, 59, 0);
conv_resume();
break;
case 324:
sendWSMessage_10000(1, _tt, _tt03, 59, 82, 325, _tt03, 82, 82, 0);
digi_play("603_s01b", 2);
break;
case 325:
sendWSMessage_10000(1, _tt, _tt03, 83, 122, 326, _tt03, 122, 122, 0);
terminateMachineAndNull(_ttNote);
terminateMachineAndNull(_shadow);
ws_unhide_walker();
ws_demand_facing(_G(my_walker), 4);
ws_walk(_G(my_walker), 345, 300, nullptr, -1, 10);
break;
case 326:
terminateMachineAndNull(_tt);
_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, false,
triggerMachineByHashCallback, "tt");
sendWSMessage_10000(1, _tt, _ttD01, 1, 1, 400, _ttD01, 1, 1, 0);
_ttShould = 6;
_ttMode = 6;
_ttShadow = series_show("tt walker shadow 4", 0xf00, 0, -1, -1, 0, 53, 291, 293);
series_unload(_rp01);
series_unload(_rp02);
_trigger1 = 400;
conv_resume();
break;
case 330:
sendWSMessage_10000(1, _ripley, _rp04, 31, 31, -1, _rp04, 31, 31, 0);
kernel_timing_trigger(100, 331);
break;
case 331:
sendWSMessage_10000(1, _ripley, _rp04, 32, 41, 300, _rp04, 15, 15, 0);
break;
case 400:
kernel_trigger_dispatchx(kernel_trigger_create(401));
break;
case 401:
switch (_ttMode) {
case 6:
switch (_ttShould) {
case 6:
sendWSMessage_10000(1, _tt, _ttD01, 1, 1, 400, _ttD01, 1, 1, 0);
break;
case 8:
if (imath_ranged_rand(1, 2) == 1) {
sendWSMessage_10000(1, _tt, _ttD01, 2, 2, -1, _ttD01, 2, 24, 4);
} else {
sendWSMessage_10000(1, _tt, _ttD01, 25, 25, -1, _ttD01, 25, 60, 4);
}
sendWSMessage_1a0000(_tt, 13);
break;
case 11:
case 12:
sendWSMessage_10000(1, _tt, _ttD01, 61, 76, 400, _ttD01, 77, 77, 1);
_ttMode = 12;
break;
case 13:
sendWSMessage_10000(1, _tt, _ttD01, 96, 121, 400, _ttD01, 1, 1, 1);
_ttShould = 6;
break;
case 14:
case 15:
sendWSMessage_10000(1, _tt, _ttD01, 85, 93, 400, _ttD01, 93, 93, 1);
_ttMode = 15;
break;
case 16:
ws_walk_load_walker_series(TT_NORMAL_DIRS, TT_NORMAL_NAMES);
ws_walk_load_shadow_series(TT_SHADOW_DIRS, TT_SHADOW_NAMES);
sendWSMessage_10000(1, _tt, _tt03, 122, 112, 402, _tt03, 112, 112, 0);
break;
case 17:
if (imath_ranged_rand(50, 150) < ++_val9) {
_val9 = 0;
if (imath_ranged_rand(1, 2) == 1) {
sendWSMessage_10000(1, _tt, _ttD01, 61, 76, 400, _ttD01, 77, 77, 1);
_ttMode = 12;
} else {
sendWSMessage_10000(1, _tt, _ttD01, 1, 1, 400, _ttD01, 1, 1, 0);
}
} else {
kernel_timing_trigger(13, 400);
}
break;
case 20:
ws_walk_load_walker_series(TT_NORMAL_DIRS, TT_NORMAL_NAMES);
ws_walk_load_shadow_series(TT_SHADOW_DIRS, TT_SHADOW_NAMES);
sendWSMessage_10000(1, _tt, _tt03, 122, 112, 410, _tt03, 112, 112, 0);
break;
default:
break;
}
break;
case 12:
switch (_ttShould) {
case 11:
sendWSMessage_10000(1, _tt, _ttD01, 77, 77, -1, _ttD01, 77, 84, 4);
sendWSMessage_1a0000(_tt, 13);
break;
case 12:
sendWSMessage_10000(1, _tt, _ttD01, 77, 77, 400, _ttD01, 77, 77, 0);
break;
case 17:
if (imath_ranged_rand(50, 150) < ++_val9) {
_val9 = 0;
if (imath_ranged_rand(1, 2) == 1) {
sendWSMessage_10000(1, _tt, _ttD01, 76, 61, 400, _ttD01, 1, 1, 0);
_ttMode = 6;
} else {
sendWSMessage_10000(1, _tt, _ttD01, 77, 77, 400, _ttD01, 77, 77, 0);
}
} else {
kernel_timing_trigger(13, 400);
}
break;
default:
sendWSMessage_10000(1, _tt, _ttD01, 76, 61, 400, _ttD01, 1, 1, 0);
_ttMode = 6;
break;
}
break;
case 15:
switch (_ttShould) {
case 15:
sendWSMessage_10000(1, _tt, _ttD01, 93, 93, 400, _ttD01, 93, 93, 0);
break;
default:
sendWSMessage_10000(1, _tt, _ttD01, 93, 85, 400, _ttD01, 1, 1, 0);
_ttMode = 6;
if (_ttShould == 14)
_ttShould = 6;
break;
}
break;
default:
break;
}
break;
case 402:
terminateMachineAndNull(_tt);
digi_unload("603_S01");
digi_unload("603_S01B");
_trigger1 = 0;
terminateMachineAndNull(_ttShadow);
_tt = triggerMachineByHash_3000(8, 9, *TT_NORMAL_DIRS, *TT_SHADOW_DIRS,
291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
sendWSMessage_10000(_tt, 357, 283, 1, 405, 0);
conv_resume();
kernel_timing_trigger(180, 406);
break;
case 404:
// Switch case not found :)
break;
case 405:
sendWSMessage_10000(_tt, 501, 235, 8, -1, 1);
break;
case 406:
ws_walk(_G(my_walker), 459, 236, nullptr, 404, 2);
break;
case 410:
terminateMachineAndNull(_tt);
terminateMachineAndNull(_ttShadow);
_tt = triggerMachineByHash_3000(8, 9, *TT_NORMAL_DIRS, *TT_SHADOW_DIRS,
291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
sendWSMessage_10000(_tt, 397, 286, 2, 415, 0);
kernel_timing_trigger(200, 411);
_G(player).disable_hyperwalk = true;
break;
case 411:
case 511:
_ripleyShould = 12;
kernel_timing_trigger(1, 300);
break;
case 412:
sendWSMessage_10000(_tt, 670, 229, 3, -1, 1);
disable_player_commands_and_fade_init(416);
break;
case 415:
sendWSMessage_10000(_tt, 519, 244, 3, 412, 0);
break;
case 416:
_G(game).setRoom(605);
_G(flags)[V203] = 2;
adv_kill_digi_between_rooms(false);
digi_play("950_s28a", 3);
break;
case 500:
kernel_trigger_dispatchx(kernel_trigger_create(501));
break;
case 501:
switch (_ttMode) {
case 6:
switch (_ttShould) {
case 7:
case 8:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 11, 13, 500,
_ttDigShirtOn, 13, 13, 0);
_ttMode = 18;
break;
case 17:
if (imath_ranged_rand(1, 5) < ++_val9) {
_val9 = 0;
switch (imath_ranged_rand(1, 3)) {
case 1:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 1, 1, 500,
_ttDigShirtOn, 1, 1, 0);
break;
case 2:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 1, 10, 500,
_ttDigShirtOn, 1, 1, 0);
playRandomDigi(4);
break;
case 3:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 11, 13, 500,
_ttDigShirtOn, 13, 13, 0);
playRandomDigi(4);
break;
default:
break;
}
} else {
kernel_timing_trigger(13, 500);
}
break;
case 21:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 11, 13, 500,
_ttDigShirtOn, 13, 13, 0);
_ttMode = 18;
break;
default:
break;
}
break;
case 7:
switch (_ttShould) {
case 7:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 38, 38, 500,
_ttDigShirtOn, 38, 38, 0);
break;
case 8:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 39, 39, -1,
_ttDigShirtOn, 39, 65, 4);
sendWSMessage_1a0000(_tt, 13);
break;
case 17:
if (imath_ranged_rand(3, 9) < ++_val9) {
_val9 = 0;
if (imath_ranged_rand(1, 2) == 1) {
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 38, 38, 500,
_ttDigShirtOn, 38, 38, 0);
} else {
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 66, 85, 500,
_ttDigShirtOn, 1, 1, 0);
_ttMode = 6;
}
} else {
kernel_timing_trigger(13, 500);
}
break;
case 20:
ws_walk_load_walker_series(TT_NORMAL_DIRS, TT_NORMAL_NAMES);
ws_walk_load_shadow_series(TT_SHADOW_DIRS, TT_SHADOW_NAMES);
sendWSMessage_10000(1, _tt, _tt03, 83, 111, 510, _tt03, 111, 111, 0);
break;
case 21:
ws_walk_load_walker_series(TT_NORMAL_DIRS, TT_NORMAL_NAMES);
ws_walk_load_shadow_series(TT_SHADOW_DIRS, TT_SHADOW_NAMES);
sendWSMessage_10000(1, _tt, _tt03, 83, 112, 530, _tt03, 112, 112, 1);
break;
default:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 66, 85, 500,
_ttDigShirtOn, 1, 1, 0);
_ttMode = 6;
break;
}
break;
case 18:
switch (_ttShould) {
case 7:
case 8:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 17, 38, 500,
_ttDigShirtOn, 38, 38, 0);
_ttMode = 7;
break;
case 17:
if (imath_ranged_rand(1, 5) < ++_val9) {
_val9 = 0;
switch (imath_ranged_rand(1, 3)) {
case 1:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 13, 13, 500,
_ttDigShirtOn, 13, 13, 0);
break;
case 2:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 13, 11, 500,
_ttDigShirtOn, 1, 1, 0);
_ttMode = 6;
playRandomDigi(4);
break;
case 3:
if (imath_ranged_rand(4, 10) < ++_val10) {
_val10 = 0;
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 17, 38, 500,
_ttDigShirtOn, 38, 38, 0);
_ttMode = 7;
} else {
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 13, 13, 500,
_ttDigShirtOn, 13, 13, 0);
}
break;
default:
break;
}
} else {
kernel_timing_trigger(13, 500);
}
break;
case 21:
sendWSMessage_10000(1, _tt, _ttDigShirtOn, 17, 38, 500,
_ttDigShirtOn, 38, 38, 0);
_ttMode = 7;
break;
default:
break;
}
break;
default:
break;
}
break;
case 510:
terminateMachineAndNull(_tt);
_trigger1 = 0;
_tt = triggerMachineByHash_3000(8, 9, *TT_NORMAL_DIRS, *TT_SHADOW_DIRS,
291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
sendWSMessage_10000(_tt, 357, 283, 3, 0x200, 0);
kernel_timing_trigger(100, 511);
_G(player).disable_hyperwalk = true;
break;
case 512:
sendWSMessage_10000(_tt, 519, 244, 3, 513, 0);
break;
case 513:
sendWSMessage_10000(_tt, 670, 229, 3, -1, 1);
disable_player_commands_and_fade_init(516);
break;
case 516:
_G(game).setRoom(605);
_G(flags)[V203] = 2;
adv_kill_digi_between_rooms(false);
digi_play_loop("950_s28a", 3);
break;
case 530:
terminateMachineAndNull(_tt);
_trigger1 = 0;
_tt = triggerMachineByHash_3000(8, 9, *TT_NORMAL_DIRS, *TT_SHADOW_DIRS,
291, 293, 4, triggerMachineByHashCallback3000, "tt walker");
sendWSMessage_10000(_tt, 397, 286, 2, 533, 0);
kernel_timing_trigger(70, 531);
_G(player).disable_hyperwalk = true;
conv_resume();
break;
case 531:
_ripleyShould = 12;
break;
case 532:
sendWSMessage_10000(_tt, 670, 229, 3, 534, 1);
break;
case 533:
sendWSMessage_10000(_tt, 519, 244, 3, 532, 0);
break;
default:
if (_G(kernel).trigger < 9999)
error("TODO: Unhandled daemon trigger");
break;
}
if (!_G(flags)[V191]) {
player_update_info();
if (_G(player_info).y < 284 && !_val3 && !_G(flags)[V203]) {
_val3 = 1;
_ttShould = 22;
_G(kernel).call_daemon_every_loop = false;
_ttMode = 1;
kernel_timing_trigger(1, 200, KT_DAEMON, KT_PARSE);
player_set_commands_allowed(false);
}
}
}
void Room603::pre_parser() {
if (_G(flags)[V202] && !player_said("talk to", "twelvetrees"))
_G(flags)[V204] = 1;
if (_showingNoteCloseup) {
Common::strcpy_s(_G(player).noun, "remove note");
_G(player).resetWalk();
}
if (player_said("take", "sleeve") && inv_object_is_here("SLEEVE")) {
auto &v203 = _G(flags)[V203];
if (v203 == 1 || v203 == 3 || v203 == 5 || v203 == 7)
_G(player).resetWalk();
}
}
void Room603::parser() {
const bool lookFlag = player_said_any("look", "look at");
const bool takeFlag = player_said("take");
if (player_said("conv603a")) {
conv603a();
} else if (player_said("conv603b")) {
conv603b();
} else if (_G(kernel).trigger == 747) {
if (_ttShould != 20) {
unloadSeries();
_G(player).disable_hyperwalk = false;
_G(flags)[V204] = 0;
_G(flags)[V205] = 0;
_val9 = 1000;
_ripleyShould = 11;
_ttShould = 17;
// FIXME: The _ripTalk series triggered by case 301, mode 0 should 5
// finishes too quickly, and triggers case 301 before should = 11 is set above.
// To fix this, manually trigger case 301
kernel_timing_trigger(1, 301, KT_DAEMON, KT_PARSE);
}
} else if (_G(kernel).trigger == 748) {
if (_ttShould == 21) {
disable_player_commands_and_fade_init(749);
} else {
unloadSeries();
_val9 = 1000;
_ripleyShould = 11;
_ttShould = 17;
}
} else if (_G(kernel).trigger == 749) {
digi_unload("603_S02");
digi_unload("603_S02a");
digi_unload("603_S02b");
digi_unload("603_S02c");
adv_kill_digi_between_rooms(false);
digi_play_loop("950_s28a", 3, 90);
_G(game).setRoom(608);
_G(flags)[V203] = 6;
} else if (player_said("talk to", "person in pit")) {
switch (_G(kernel).trigger) {
case -1:
case 666:
player_set_commands_allowed(false);
player_update_info();
_G(player).disable_hyperwalk = true;
_G(flags)[V202] = 1;
setGlobals1(_ripHandsBehindBack, 1, 15, 15, 15);
sendWSMessage_110000(2);
break;
case 2:
sendWSMessage_150000(-1);
ws_hide_walker();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 311, 308, -59, 0x100, false,
triggerMachineByHashCallback, "rip");
_G(kernel).trigger_mode = KT_DAEMON;
sendWSMessage_10000(1, _ripley, _rp01, 1, 15, 302, _rp01, 15, 15, 0);
sendWSMessage_1e0000(_ripley, 0, 0);
sendWSMessage_200000(_ripley, 100);
_G(kernel).trigger_mode = KT_PARSE;
_ripleyMode = 0;
_ripleyShould = 0;
_G(flags)[V203] = 1;
_val5 = 1;
hotspot_set_active("person in pit", false);
hotspot_set_active("twelvetrees", true);
hotspot_set_active("twelvetrees ", false);
break;
default:
break;
}
} else if (player_said_any("lighter", "lit lighter") &&
player_said_any("twelvetrees", "twelvetrees ")) {
digi_play("com140", 1, 255, -1, 997);
} else if (player_said("talk to", "twelvetrees")) {
player_set_commands_allowed(false);
ws_hide_walker();
_val2 = 1;
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 345, 300, -56, 0x100, true,
triggerMachineByHashCallback, "rip");
_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 56, 345, 300);
_G(kernel).trigger_mode = KT_DAEMON;
sendWSMessage_10000(1, _ripley, _ripTalk, 1, 1, 300, _ripTalk, 1, 1, 0);
sendWSMessage_190000(_ripley, 4);
_G(kernel).trigger_mode = KT_PARSE;
_ripleyMode = 0;
_ripleyShould = 0;
conv_load("conv603a", 10, 10, 747);
conv_set_shading(65);
conv_export_value_curr(_G(flags)[V204], 0);
conv_export_value_curr(_G(flags)[V205], 1);
conv_play();
} else if (player_said("talk to", "twelvetrees ")) {
player_set_commands_allowed(false);
ws_hide_walker();
_val2 = 1;
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 311, 308, -59, 0x100, true,
triggerMachineByHashCallback, "rip");
_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 59, 311, 308);
_G(kernel).trigger_mode = KT_DAEMON;
sendWSMessage_10000(1, _ripley, _ripTalk, 1, 1, 300, _ripTalk, 1, 1, 0);
sendWSMessage_190000(_ripley, 4);
_G(kernel).trigger_mode = KT_PARSE;
_ripleyMode = 0;
_ripleyShould = 0;
_ttShould = 7;
if (_G(flags)[V203] <= 1) {
conv_load("conv603a", 10, 10, 747);
conv_export_value_curr(_G(flags)[V204], 0);
conv_export_value_curr(_G(flags)[V205], 1);
conv_play();
} else {
conv_load("conv603b", 10, 10, 748);
if (_G(flags)[V203] == 7) {
conv_export_value_curr(4, 0);
} else {
switch (_G(flags)[V186]) {
case 0:
conv_export_value_curr(1, 0);
break;
case 1:
conv_export_value_curr(2, 0);
break;
case 2:
conv_export_value_curr(3, 0);
break;
default:
break;
}
}
conv_export_value_curr(1, 1);
conv_export_value_curr(_G(flags)[V039], 6);
conv_play();
}
} else if (takeFlag && player_said("sleeve") && takeSleeve()) {
// No implementation
} else if (takeFlag && player_said("NOTE ")) {
digi_play("603r45", 1);
} else if (takeFlag && player_said("NOTE") && takeNote()) {
// No implementation
} else if (takeFlag && player_said_any("shirt", "pole") && !_G(flags)[V203]) {
player_set_commands_allowed(false);
_ttMode = 1;
_ttShould = 22;
_G(kernel).call_daemon_every_loop = false;
kernel_timing_trigger(1, 200, KT_DAEMON, KT_PARSE);
_ripAction = series_load("RIP MED REACH 1HAND POS2");
setGlobals1(_ripAction, 1, 15, 15, 15);
sendWSMessage_110000(-1);
} else if (takeFlag && player_said("pole") && takePole()) {
// No implementation
} else if (player_said("enter hut")) {
if (_G(flags)[V203] == 4 || _G(flags)[V203] == 9) {
digi_play("603r32", 1);
} else {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
_ttShould = _val5 ? 12 : 7;
_ripAction = series_load("RIP TREK HAT TIP POS4");
kernel_timing_trigger(60, 2);
break;
case 2:
_ttShould = _val5 ? 11 : 8;
digi_play("603t06", 1, 255, 3);
break;
case 3:
_ttShould = 17;
_val9 = 5000;
kernel_timing_trigger(1, _val5 ? 400 : 500, KT_DAEMON, KT_PARSE);
setGlobals1(_ripAction, 1, 8, 8, 8);
sendWSMessage_110000(4);
break;
case 4:
digi_play("603r23", 1, 255, 5);
sendWSMessage_140000(5);
break;
case 5:
series_unload(_ripAction);
player_set_commands_allowed(true);
break;
default:
break;
}
}
} else if (player_said("enter")) {
enter();
} else if (lookFlag && player_said(" ")) {
if (_G(flags)[V200]) {
digi_play("603r01a", 1);
} else {
_G(flags)[V200] = 1;
digi_play("603r01", 1);
}
} else if (lookFlag && player_said("hut")) {
if (_G(flags)[V203] == 4 || _G(flags)[V203] == 9) {
if (inv_object_is_here("TWELVETREES' NOTE") || _G(flags)[V203] == 9)
digi_play("603r26", 1);
else
digi_play("603r02", 1);
} else {
digi_play("603r02", 1);
}
} else if (lookFlag && player_said("note ")) {
_showingNoteCloseup = true;
hotspot_hide_all();
_ttNote = series_show("603 12TREES GONE HOME NOTE", 0, 16);
hotspot_add_dynamic("LOOK AT", " ", 0, 0, 640, 480, 0);
digi_play("603r44", 1);
interface_hide();
} else if (lookFlag && player_said("note") &&
inv_object_is_here("TWELVETREES' NOTE")) {
_showingNoteCloseup = true;
hotspot_hide_all();
_ttNote = series_show("603 tt map popup", 0, 16);
hotspot_add_dynamic("LOOK AT", " ", 0, 0, 640, 480, 0);
_G(flags)[V046] = 1;
digi_play("603r28", 1);
interface_hide();
} else if (player_said("remove note")) {
_showingNoteCloseup = false;
hotspot_restore_all();
terminateMachineAndNull(_ttNote);
interface_show();
} else if (_G(kernel).trigger == 555) {
if (_G(flags)[V038])
_G(flags)[V039] = 1;
_G(flags)[V011] = 0;
_G(game).setRoom(495);
_G(flags)[kTravelDest] = 4;
} else if (_G(kernel).trigger == 556) {
digi_stop(1);
digi_stop(2);
digi_unload("603_S02");
digi_unload("603_S02a");
digi_unload("603_S02b");
digi_unload("603_S02c");
if (_G(flags)[V011]) {
digi_stop(3);
digi_unload("genrun");
digi_preload("950_s28a");
}
adv_kill_digi_between_rooms(false);
digi_play_loop("950_s28a", 3, 90);
if (_G(flags)[V038])
_G(flags)[V039] = 1;
_G(game).setRoom(605);
} else if (player_said("down")) {
if (_G(flags)[V202])
_G(flags)[V205] = 1;
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(555);
} else if (player_said("right")) {
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(556);
} else if (player_said_any("TWELVETREES", "TWELVETREES ") &&
player_said("POLE")) {
digi_play("603r46", 1);
} else if (player_said("go into")) {
if (_G(flags)[V203] == 4 || _G(flags)[V203] == 9)
digi_play("603r34", 1);
else if (_G(flags)[V202])
digi_play("603r25", 1);
else
digi_play("603r24", 1);
} else if (lookFlag && player_said_any("twelvetrees", "twelvetrees ")) {
switch (imath_ranged_rand(1, 4)) {
case 1:
digi_play("603r36", 1);
break;
case 2:
digi_play("603r37", 1);
break;
case 3:
digi_play("603r38", 1);
break;
case 4:
digi_play("603r39", 1);
break;
default:
break;
}
} else if (lookFlag && player_said("pit")) {
digi_play(_G(flags)[V202] ? "603r27" : "603r11", 1);
} else if (lookFlag && player_said("sleeve") && inv_object_is_here("SLEEVE")) {
digi_play("603r08", 1);
} else if (lookFlag && player_said("pole") && inv_object_is_here("POLE")) {
digi_play("603r09", 1);
} else if (lookFlag && _G(walker).ripley_said(SAID)) {
// No implementation
} else {
return;
}
_G(player).command_ready = false;
}
void Room603::conv603a() {
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();
switch (_G(kernel).trigger) {
case 1:
if (who <= 0) {
if (node == 23) {
if (_val5) {
_pu01 = series_stream("603pu03", 5, 0, 30);
_ttShould = 6;
if (_trigger1)
kernel_timing_trigger(1, _trigger1, KT_DAEMON, KT_PARSE);
} else {
_pu01 = series_stream("603pu03a", 5, 0, 30);
_ttShould = 7;
kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
}
} else if (_val5) {
if (node == 3 && (entry == 1 || entry == 2)) {
// No implementation
} else if ((node == 6 || node == 27) && entry == 0) {
_ttShould = 12;
kernel_timing_trigger(1, 400, KT_DAEMON, KT_PARSE);
conv_resume();
} else if ((node == 3 && entry == 7) ||
(node == 3 && entry == 8)) {
// No implementation
} else if (node == 25 && entry == 3) {
_ttShould = 20;
kernel_timing_trigger(1, 400, KT_DAEMON, KT_PARSE);
conv_resume();
} else if (node == 3 && entry == 4) {
_ttShould = 16;
kernel_timing_trigger(1, 400, KT_DAEMON, KT_PARSE);
conv_resume();
} else if (node == 0 || node == 1 || node == 2) {
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 43, 43, -1,
_ttDigShirtOff, 43, 43, 0);
conv_resume();
} else {
_ttShould = 6;
if (_trigger1)
kernel_timing_trigger(1, _trigger1, KT_DAEMON, KT_PARSE);
conv_resume();
}
} else {
_ttShould = (node == 25 && entry == 3) ? 20 : 7;
kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
conv_resume();
}
} else if (who == 1) {
if (node == 3 && entry == 0) {
// No implementation
} else if (node == 0 || node == 1 || node == 2) {
_ripleyShould = 14;
kernel_timing_trigger(1, 300, KT_DAEMON, KT_PARSE);
conv_resume();
} else if (node == 3 && entry == 6) {
// No implementation
} else if ((node == 5 && entry == 0) ||
(node == 25 && entry == 0) ||
(node == 14 && entry == 0) ||
(node == 27 && entry == 0) ||
(node == 11 && entry == 0) ||
(node == 4 && entry == 0) ||
(node == 4 && entry == 1) ||
(node == 7)) {
conv_resume();
} else if (node == 12 && entry == 1) {
_ripleyShould = 0;
conv_resume();
} else if (_val2) {
if (_ripleyShould == 5)
kernel_timing_trigger(1, 300, KT_DAEMON, KT_PARSE);
conv_resume();
} else {
conv_resume();
}
} else {
conv_resume();
}
break;
case 2:
series_stream_break_on_frame(_pu01, 16, 40);
digi_play(sound, 1, 255, 1);
break;
case 3:
ws_hide_walker(_tt);
series_play("603tt07", 0, 0, 4, 6);
break;
case 4:
terminateMachineAndNull(_door);
series_play("603DOOR", 0x300, 2, 6, 6, 0, 100, 0, 0, 1, 23);
series_play("603tt07", 0, 2, 5, 6, 1, 100, 0, 0, 0, 9);
break;
case 5:
ws_unhide_walker(_tt);
sendWSMessage_10000(_tt, 501, 236, 8, 7, 1);
break;
case 6:
_door = series_show("603DOOR", 0xf00, 16);
hotspot_set_active("wire", false);
digi_play("603_s03", 2);
break;
case 7:
case 33:
conv_resume();
break;
case 10:
kernel_timing_trigger(40, 11);
break;
case 11:
_pu01 = series_stream("603pu02", 5, 0, 12);
break;
case 12:
digi_unload("17_04n08");
digi_unload("17_04n99");
sendWSMessage_10000(_tt, 357, 283, 1, 13, 0);
kernel_timing_trigger(200, 15);
break;
case 13:
sendWSMessage_10000(_tt, 291, 293, 4, 14, 1);
break;
case 14:
conv_resume();
sendWSMessage_60000(_tt);
_ttShadow = series_show("tt walker shadow 4", 0xf00, 0, -1, -1, 0, 53, 291, 293);
_trigger1 = 400;
_tt = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x200, false,
triggerMachineByHashCallback, "tt");
_G(kernel).trigger_mode = KT_DAEMON;
sendWSMessage_10000(1, _tt, _tt03, 110, 122, 400, _ttD01, 1, 1, 0);
_G(kernel).trigger_mode = KT_PARSE;
break;
case 15:
ws_walk(_G(my_walker), 345, 300, nullptr, 16, 10);
break;
case 16:
ws_hide_walker();
_val2 = 1;
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 345, 300, -56, 0x100, true,
triggerMachineByHashCallback, "rip");
_shadow = series_show("safari shadow 2", 0xf00, 128, -1, -1, 0, 56, 345, 300);
_G(kernel).trigger_mode = KT_DAEMON;
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 1, 15, 300,
_ripHandsBehindBack, 15, 15, 0);
sendWSMessage_190000(_ripley, 4);
_G(kernel).trigger_mode = KT_PARSE;
_ripleyMode = 8;
_ripleyShould = 8;
break;
case 20:
_ripleyShould = 10;
break;
case 21:
_ttShould = 14;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, _trigger1);
break;
case 22:
_ttShould = 13;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, _trigger1);
break;
case 30:
kernel_timing_trigger(1, 31);
break;
case 31:
_pu01 = series_stream(_val5 ? "603pu04" : "603pu04a", 5, 0, 33);
break;
case 40:
conv_resume();
digi_play(sound, 1, 255, 1);
break;
default:
if (sound) {
if (who <= 0) {
if (!_val5) {
_ttShould = 8;
} else if (node == 0 || node == 1 || node == 2) {
sendWSMessage_10000(1, _tt, _ttDigShirtOff, 41, 43, -1,
_ttDigShirtOff, 41, 43, 0);
sendWSMessage_190000(_tt, 13);
sendWSMessage_1a0000(_tt, 13);
} else if (node == 12 && entry == 1) {
_ttShould = 8;
kernel_timing_trigger(200, 20);
kernel_timing_trigger(760, 21);
} else if (node == 12 && entry == 2) {
_ttShould = 8;
kernel_timing_trigger(210, 22);
} else if (node == 11 && entry == 0) {
_ttShould = 14;
} else if ((node == 27 && entry == 0) ||
(node == 6 && entry == 0)) {
_ttShould = 11;
} else if (node == 3 && entry == 7) {
digi_preload("17_04n08");
digi_preload("17_04n99");
_pu01 = series_stream("603pu01", 5, 0, 10);
series_stream_break_on_frame(_pu01, 6, 2);
return;
} else {
_ttShould = 8;
}
} else if (who == 1) {
if (node == 3 && entry == 0) {
_ripleyShould = 1;
} else if (node == 3 && entry == 6) {
sendWSMessage_10000(_tt, 501, 234, 1, 3, 1);
} else if ((node == 4 && entry == 0) || (node == 7)) {
_ripleyShould = 8;
} else if (node == 0 || node == 1 || node == 2) {
_ripleyShould = 13;
} else if (node == 6 && entry == 0) {
_ripleyShould = 2;
} else if (node == 6 && entry == 1) {
_ripleyShould = 6;
} else if (node == 15 && entry == 0) {
_ripleyShould = 6;
} else if (node == 14 && entry == 0) {
_ripleyShould = 8;
} else if (node == 27 && entry == 0) {
_ripleyShould = 10;
} else if (node == 8 && entry == 0) {
_ripleyShould = 9;
} else if ((node == 11 && entry == 0) ||
(node == 25 && entry == 0)) {
_ripleyShould = 10;
} else if (node == 25 && entry == 2) {
_ripleyShould = 7;
} else if (node == 12 && entry == 1) {
// The original is also testing the following: (node == 7 && entry == 0)
// This is logically dead code, as (node == 7) is already checked earlier in the if cascade
_ripleyShould = 6;
} else if (node == 5 && entry == 0) {
_ripleyShould = 10;
} else if (_val2) {
_ripleyShould = 5;
}
}
digi_play(sound, 1, 255, 1);
} else {
conv_resume();
}
break;
}
}
void Room603::conv603b() {
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 (_G(kernel).trigger == 1) {
if (node != 13 && node != 16) {
if (who <= 0) {
if (node == 2 || node == 5 || node == 7)
_G(flags)[V038] = 1;
if (node == 10 || node == 12) {
_ttShould = 21;
kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
return;
} else {
_ttShould = 7;
kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
}
} else if (who == 1) {
if (node == 11 && entry == 1) {
_ttShould = 21;
kernel_timing_trigger(1, 500, KT_DAEMON, KT_PARSE);
_ripleyShould = 0;
kernel_timing_trigger(1, 300, KT_DAEMON, KT_PARSE);
return;
} else {
_ripleyShould = 0;
kernel_timing_trigger(1, 300, KT_DAEMON, KT_PARSE);
}
}
}
conv_resume();
} else if (sound) {
if (node != 13 && node != 16) {
if (who <= 0)
_ttShould = 8;
else if (who == 1)
_ripleyShould = 5;
}
digi_play(sound, 1, 255, 1);
} else {
conv_resume();
}
}
void Room603::unloadSeries() {
series_unload(200);
series_unload(201);
series_unload(202);
series_unload(203);
series_unload(204);
series_unload(210);
series_unload(211);
series_unload(212);
series_unload(214);
}
bool Room603::takeSleeve() {
if (_G(flags)[V203] == 4 || _val4) {
switch (_G(kernel).trigger) {
case -1:
case 666:
if (inv_object_is_here("sleeve")) {
player_set_commands_allowed(false);
_ripAction = series_load("RIP MED REACH 1HAND POS2");
setGlobals1(_ripAction, 1, 15, 15, 15);
sendWSMessage_110000(2);
return true;
}
break;
case 2:
hotspot_set_active("SLEEVE", false);
inv_give_to_player("SLEEVE");
kernel_examine_inventory_object("ping sleeve", 5, 1, 280, 220, 3, nullptr, -1);
terminateMachineAndNull(_sleeve);
return true;
case 3:
sendWSMessage_140000(5);
return true;
case 5:
series_unload(_ripAction);
player_set_commands_allowed(true);
_val4 = 0;
return true;
default:
break;
}
} else {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("sleeve")) {
if (_val5)
ws_walk(_G(my_walker), 345, 300, nullptr, 1, 10);
else
ws_walk(_G(my_walker), 311, 308, nullptr, 1, 10);
return true;
}
break;
case 1:
player_set_commands_allowed(false);
_ttShould = _val5 ? 12 : 7;
setGlobals1(_ripTalk, 1, 7, 1, 7, 1, 1, 1, 1, 1);
sendWSMessage_110000(-1);
digi_play("603r14", 1, 255, 2);
return true;
case 2:
sendWSMessage_120000(-1);
_ttShould = _val5 ? 11 : 8;
digi_play("603t04", 1, 255, 3);
return true;
case 3:
_ttShould = _val5 ? 12 : 7;
kernel_timing_trigger(1, _val5 ? 400 : 500, KT_DAEMON, KT_PARSE);
sendWSMessage_110000(-1);
digi_play("603r14a", 1, 255, 5);
return true;
case 5:
sendWSMessage_120000(-1);
_ttShould = _val5 ? 11 : 8;
digi_play("603t05", 1, 255, 6);
return true;
case 6:
_ttShould = 17;
kernel_timing_trigger(1, _val5 ? 400 : 500, KT_DAEMON, KT_PARSE);
sendWSMessage_150000(-1);
ws_walk(_G(my_walker), 365, 298, nullptr, 666, 10);
_val4 = 1;
return true;
default:
break;
}
}
return false;
}
bool Room603::takeNote() {
switch (_G(kernel).trigger) {
case -1:
if (!inv_object_is_here("TWELVETREES' NOTE"))
return false;
player_set_commands_allowed(false);
_ripAction = series_load("RIP MED HIGH REACHER POS2");
setGlobals1(_ripAction, 1, 12, 12, 12);
sendWSMessage_110000(2);
break;
case 2:
hotspot_set_active("NOTE", false);
inv_move_object("TWELVETREES' NOTE", NOWHERE);
inv_move_object("TWELVETREES' MAP", NOWHERE);
kernel_examine_inventory_object("PING TWELVETREES' NOTE", 5, 1, 205, 190, 3,
_G(flags)[V046] ? nullptr : "603R28");
_G(flags)[V046] = 1;
terminateMachineAndNull(_note);
break;
case 3:
kernel_timing_trigger(1, 4);
break;
case 4:
kernel_examine_inventory_object("PING OBJ136", 5, 1, 205, 160, 5,
player_been_here(623) ? "603R30" : "603R31");
break;
case 5:
sendWSMessage_140000(6);
break;
case 6:
series_unload(_ripAction);
player_update_info();
_ripAction = series_load("RIP SKETCHING IN NOTEBOOK POS 2");
setGlobals1(_ripAction, 1, 17, 17, 17);
sendWSMessage_110000(7);
break;
case 7:
kernel_timing_trigger(60, 8);
break;
case 8:
sendWSMessage_140000(9);
break;
case 9:
series_unload(_ripAction);
_G(flags)[V047] = 1;
player_set_commands_allowed(true);
break;
default:
return false;
}
return true;
}
bool Room603::takePole() {
if (_G(flags)[V203] == 4) {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("pole")) {
player_set_commands_allowed(false);
_ripAction = series_load("RIP MED REACH 1HAND POS2");
digi_play("603r29", 1, 255, 1);
return true;
}
break;
case 1:
setGlobals1(_ripAction, 1, 15, 15, 15);
sendWSMessage_110000(2);
return true;
case 2:
hotspot_set_active("pole", false);
inv_give_to_player("pole");
kernel_examine_inventory_object("ping pole", 5, 1, 280, 220, 3);
terminateMachineAndNull(_pole);
if (inv_object_is_here("SLEEVE"))
terminateMachineAndNull(_sleeve);
return true;
case 3:
kernel_timing_trigger(1, 6);
return true;
case 4:
sendWSMessage_140000(5);
return true;
case 5:
series_unload(_ripAction);
player_set_commands_allowed(true);
return true;
case 6:
if (inv_object_is_here("SLEEVE")) {
hotspot_set_active("SLEEVE", false);
inv_give_to_player("SLEEVE");
kernel_examine_inventory_object("ping sleeve", 5, 1, 280, 220, 4);
} else {
kernel_timing_trigger(1, 4);
}
return true;
default:
break;
}
} else {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("pole")) {
player_set_commands_allowed(false);
_ttShould = _val5 ? 12 : 7;
_ripAction = series_load("RIP MED REACH 1HAND POS2");
return true;
}
break;
case 2:
_ttShould = _val5 ? 11 : 8;
digi_play("603t03", 1, 255, 3);
return true;
case 3:
_ttShould = 17;
_val9 = 5000;
kernel_timing_trigger(1, _val5 ? 400 : 500, KT_DAEMON, KT_PARSE);
sendWSMessage_140000(5);
return true;
case 5:
series_unload(_ripAction);
player_set_commands_allowed(true);
return true;
default:
break;
}
}
return false;
}
void Room603::enter() {
if (_G(flags)[V203] == 4) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
_ripAction = series_load("rip trek med reach hand pos1");
setGlobals1(_ripAction, 1, 10, 10, 10);
sendWSMessage_110000(4);
disable_player_commands_and_fade_init(4);
break;
case 4:
_G(game).setRoom(604);
digi_stop(1);
if (_G(flags)[V011]) {
adv_kill_digi_between_rooms(false);
digi_play_loop("genrun", 3, 140, -1, 604);
}
break;
default:
break;
}
} else {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
_ttShould = _val5 ? 12 : 7;
_ripAction = series_load("rip trek med reach hand pos1");
setGlobals1(_ripAction, 1, 10, 10, 10);
sendWSMessage_110000(2);
break;
case 2:
_ttShould = _val5 ? 11 : 8;
digi_play("603t07", 1, 255, 3);
break;
case 3:
_ttShould = 17;
_val9 = 5000;
kernel_timing_trigger(1, _val5 ? 400 : 500, KT_DAEMON, KT_PARSE);
sendWSMessage_140000(5);
break;
case 5:
series_unload(_ripAction);
player_set_commands_allowed(true);
break;
default:
break;
}
}
}
void Room603::playRandomDigi(int max) {
static const char *SOUNDS[4] = {
"603_s02", "603_s02a", "603_s02b", "603_s02c"
};
const int num = imath_ranged_rand(1, max) - 1;
if (num < 4)
digi_play(SOUNDS[num], 2);
}
void Room603::syncGame(Common::Serializer &s) {
s.syncAsSint32LE(_val2);
s.syncAsSint32LE(_val3);
s.syncAsSint32LE(_val4);
s.syncAsSint32LE(_val5);
s.syncAsSint32LE(_showingNoteCloseup);
s.syncAsSint32LE(_val9);
s.syncAsSint32LE(_val10);
s.syncAsSint32LE(_ripleyMode);
s.syncAsSint32LE(_ripleyShould);
s.syncAsSint32LE(_ttMode);
s.syncAsSint32LE(_ttShould);
s.syncAsSint32LE(_trigger1);
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4