/* 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 walkPath); _mcTrekMach->walkPath = CreateCustomPath(427, 96, 345, 115, -1); ws_custom_walk(_mcTrekMach, 5, 1, true); break; default: _808RpupSeries = series_load("808rpup", -1, nullptr); ws_demand_facing(_G(my_walker), 2); ws_demand_location(_G(my_walker), 18, 216); ws_hide_walker(_G(my_walker)); if (_G(flags)[V276] == 0) { _808McupSeries = series_load("808mcup", -1, nullptr); series_play("808rpup", 0, 0, 2, 5, 0, 100, 0, 0, 0, -1); } else { _G(flags)[V276] = 0; _mcTrekMach = triggerMachineByHash_3000(8, 4, *S8_SHADOW_DIRS2, *S8_SHADOW_DIRS1, 345, 115, 5, Walker::player_walker_callback, "mc_trek"); series_play("808rpup", 0, 0, 4, 5, 0, 100, 0, 0, 0, -1); } break; } digi_play_loop("950_s29", 3, 96, -1, -1); } void Room808::pre_parser() { if (inv_player_has(_G(player).noun)) { return; } int32 opCode = -1; if (player_said_any("look", "look at")) opCode = 1; else if (player_said_any("gear", "use")) opCode = 0; else if (player_said("take")) opCode = 2; else if (player_said("talk to")) opCode = 3; else if (player_said("go")) opCode = 5; else if (!scumm_stricmp(_G(player).verb, "crank")) opCode = 6; else if (!scumm_stricmp(_G(player).verb, "journal")) opCode = 11; bool doneFl = true; switch (opCode) { case 0: if (player_said_any("wheel", "wheel ", "wheel ", "wheel ")) { _G(player).need_to_walk = false; _G(player).ready_to_walk = true; _G(player).waiting_for_walk = false; } else doneFl = false; break; case 1: if (player_said("slot") && _G(flags)[V097] == 0) { _G(player).walk_x = 202; _G(player).walk_y = 179; _G(player).walk_facing = 2; } else if (player_said_any("mei chen", "east") || !scumm_strnicmp(_G(player).noun, "wheel", 5) || !scumm_strnicmp(_G(player).noun, "bridge", 6)) { _G(player).need_to_walk = false; _G(player).ready_to_walk = true; _G(player).waiting_for_walk = false; } else doneFl = false; break; case 5: _G(player).need_to_walk = false; _G(player).ready_to_walk = true; _G(player).waiting_for_walk = false; break; case 11: // Nothing break; default: doneFl = false; } if (doneFl || _G(flags)[kBridgeLocked]) return; if (!getWalkPath(_G(my_walker), _G(player).walk_x, _G(player).walk_y)) return; player_update_info(_G(my_walker), &_G(player_info)); const bool check1Fl = intr_PathCrossesLine(_G(player_info).x, _G(player_info).y, _G(my_walker)->walkPath, 242, 139, 295, 149); const bool check2Fl = intr_PathCrossesLine(_G(player_info).x, _G(player_info).y, _G(my_walker)->walkPath, 170, 158, 223, 168); DisposePath(_G(my_walker)->walkPath); _G(my_walker)->walkPath = nullptr; if (!check1Fl && !check2Fl) return; if (_G(flags)[kBridgeWheelPosition] != 0 && _G(flags)[kBridgeWheelPosition] != 4) { _G(player).resetWalk(); } else if ((inv_object_in_scene("FARMER'S SHOVEL", 808) && _G(flags)[kBridgeWheelPosition] == 0) || (!inv_object_in_scene("FARMER'S SHOVEL", 808) && _G(flags)[kBridgeLocked] == 0)) { intr_cancel_sentence(); _G(kernel).trigger_mode = KT_DAEMON; if (_G(flags)[V096] == 0) { ws_walk(_G(my_walker), 185, 165, nullptr, 6, 2, true); } else { // Hack to fix #16098 - Save game before the move to ensure the position is correct when restoring the auto-save other_save_game_for_resurrection(); ws_walk(_G(my_walker), 192, 163, nullptr, 10, 2, true); } _G(kernel).trigger_mode = KT_PREPARSE; } else if (inv_object_in_scene("FARMER'S SHOVEL", 808) && _G(flags)[kBridgeWheelPosition] == 4 && check1Fl) { intr_cancel_sentence(); // Hack to fix #16098 - Save game before the move to ensure the position is correct when restoring the auto-save other_save_game_for_resurrection(); _G(kernel).trigger_mode = KT_DAEMON; ws_walk(_G(my_walker), 274, 142, nullptr, 8, 2, true); _G(kernel).trigger_mode = KT_PREPARSE; } } void Room808::parser() { _G(player).command_ready = false; if (_G(kernel).trigger == 747) return; if (inv_player_has(_G(player).noun) && _G(kernel).trigger == -1) { _G(player).command_ready = true; return; } int32 opCode = -1; if (player_said_any("look", "look at", "no walk")) opCode = 1; else if (player_said_any("gear", "use")) opCode = 0; else if (player_said("take")) opCode = 2; else if (player_said("talk to")) opCode = 3; else if (player_said_any("walk to", "spleen")) opCode = 4; else if (player_said("go")) opCode = 5; else if (!scumm_stricmp(_G(player).verb, "crank")) opCode = 6; else if (!scumm_stricmp(_G(player).verb, "FARMER'S SHOVEL")) opCode = 7; else if (!scumm_stricmp(_G(player).verb, "wooden post")) opCode = 8; else if (!scumm_stricmp(_G(player).verb, "wooden beam")) opCode = 9; else if (!scumm_stricmp(_G(player).verb, "journal")) opCode = 11; else if (player_said("conv808a")) opCode = 10; switch (opCode) { case 0: if (player_said("chain")) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808ChainMach); series_play("808rp03", 256, 0, 5, 5, 0, 100, 0, 0, 0, 25); break; case 5: _808RipFallShovelNearSideMach = series_play("808rp03", 256, 16, 10, 5, 0, 100, 0, 0, 26, -1); digi_play("808_s05", 2, 255, -1, -1); break; case 10: kernel_timing_trigger(60, 20, "gong pause"); digi_play("808_s05a", 2, 255, -1, -1); break; case 20: terminateMachineAndNull(_808RipFallShovelNearSideMach); series_play("808rp03", 256, 2, 30, 5, 0, 100, 0, 0, 0, -1); break; case 30: player_set_commands_allowed(true); digi_play("808r19", 1, 255, -1, -1); ws_unhide_walker(_G(my_walker)); ws_demand_facing(_G(my_walker), 10); _808ChainMach = series_plain_play("808chain", 1, 0, 100, 0, 0, -1, true); break; default: break; } } else if (player_said("wheel") && _G(flags)[kBridgeLocked]) { switch (_G(kernel).trigger) { case -1: { bool walkCheck = true; if (getWalkPath(_G(my_walker), 185, 156)) { player_update_info(_G(my_walker), &_G(player_info)); walkCheck = intr_PathCrossesLine(_G(player_info).x, _G(player_info).y, _G(my_walker)->walkPath, 242, 139, 295, 149); } if (walkCheck) ws_turn_to_face(_G(my_walker), 8, 5); else ws_walk(_G(my_walker), 169, 171, nullptr, 10, 2, true); } break; case 5: digi_play("com077", 1, 255, -1, 997); break; case 10: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808PosMach); _808PosMach = series_play("808spn01", 1281, 16, 20, 5, 0, 100, 0, 0, 0, 13); break; case 20: kernel_timing_trigger(60, 30, nullptr); break; case 30: terminateMachineAndNull(_808PosMach); series_play("808spn01", 0, 2, 40, 5, 0, 100, 0, 0, 0, 13); digi_play("com078", 1, 255, -1, 997); break; case 40: player_set_commands_allowed(true); ws_unhide_walker(_G(my_walker)); ws_demand_facing(_G(my_walker), 2); _808PosMach = series_show_sprite("808pos1", 0, 32767); break; default: break; } } else if (player_said_any("wheel", "wheel ", "wheel ", "wheel ")) { switch (_G(kernel).trigger) { case -1: if (_G(flags)[V095]) { _dword1A1964_facing = 1; ws_walk(_G(my_walker), 157, 166, nullptr, 5, 1, true); } else { _dword1A1964_facing = 2; ws_walk(_G(my_walker), 169, 171, nullptr, 5, 2, true); } break; case 5: player_set_commands_allowed(false); setBridgeHotspots(_G(flags)[kBridgeWheelPosition], false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808PosMach); setPosMachInfo(); _808PosMach = series_stream(_posMachName, 5, 1281, 10); series_stream_break_on_frame(_808PosMach, _posMachFrameNum, 7); player_update_info(_G(my_walker), &_G(player_info)); _808RipFallShovelNearSideMach = series_place_sprite(SAFARI_SHADOWS_2[_G(player_info).facing], 0, _G(player_info).x, _G(player_info).y, _G(player_info).scale, 1282); break; case 7: digi_play("808_s04", 2, 255, -1, -1); break; case 10: player_set_commands_allowed(true); setBridgeHotspots(_G(flags)[kBridgeWheelPosition], true); ws_unhide_walker(_G(my_walker)); ws_demand_facing(_G(my_walker), _dword1A1964_facing); _808PosMach = series_show(inv_object_in_scene("FARMER'S SHOVEL", 808) ? "808pos2" : "808pos1", 1281, 0, -1, -1, _posMachIndex, 100, 0, 0); terminateMachineAndNull(_808RipFallShovelNearSideMach); break; default: break; } } else if (player_said("crank") && inv_object_in_scene("crank", 808) && _G(flags)[kBridgeLocked]) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); setGlobals3(_ripMedReach1HandPos2Series, 1, 17); sendWSMessage_3840000(_G(my_walker), 10); break; case 10: kernel_timing_trigger(120, 20, nullptr); break; case 20: setGlobals3(_ripMedReach1HandPos2Series, 17, 1); sendWSMessage_3840000(_G(my_walker), 30); digi_play("808r32", 1, 255, -1, -1); break; case 30: player_set_commands_allowed(true); ws_demand_facing(_G(my_walker), 10); break; default: break; } } else { _G(player).command_ready = true; } break; case 1: if (player_said(" ")) { digi_play("808r01", 1, 255, -1, -1); } else if (!scumm_strnicmp(_G(player).noun, "wheel", 5) || !scumm_strnicmp(_G(player).noun, "bridge", 6)) { switch (_G(kernel).trigger) { case -1: player_update_info(_G(my_walker), &_G(player_info)); if (_G(player).x >= 300) { ws_turn_to_face(_G(my_walker), 9, 10); } else { ws_walk(_G(my_walker), 202, 179, nullptr, 10, !scumm_strnicmp(_G(player).noun, "bridge", 6) ? 1 : 11, true); } break; case 10: if (!scumm_strnicmp(_G(player).noun, "bridge", 6)) { digi_play("808r02", 1, 255, -1, -1); } else { digi_play("808r03", 1, 255, -1, -1); } break; default: break; } } else if (!scumm_strnicmp(_G(player).noun, "FARMER'S SHOVEL", 15) && inv_object_in_scene("FARMER'S SHOVEL", 808)) { digi_play("808r33", 1, 255, -1, -1); } else if (player_said("chain")) { digi_play("808r04", 1, 255, -1, -1); } else if (player_said("slot")) { digi_play("808r05", 1, 255, -1, -1); } else if (player_said("crank") && inv_object_in_scene("crank", 808)) { digi_play("808r06", 1, 255, -1, -1); } else if (player_said("lit urn")) { digi_play("808r07", 1, 255, -1, -1); } else if (player_said("unlit urn")) { digi_play("com061", 1, 255, -1, 997); } else if (player_said("soldier")) { digi_play("808r09", 1, 255, -1, -1); } else if (player_said ("broken feet")) { digi_play("808r10", 1, 255, -1, -1); } else if (player_said("large hole")) { digi_play("808r11", 1, 255, -1, -1); } else if (player_said_any("corridor", "east")) { digi_play("808r12", 1, 255, -1, -1); } else if (player_said("lower staircase")) { digi_play("808r13", 1, 255, -1, -1); } else if (player_said("chasm")) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); player_update_info(_G(my_walker), &_G(player_info)); if (_G(player_info).facing == 2) { setGlobals3(_808Rp02Series, 1, 17); } else { setGlobals3(_808Rp01Series, 1, 23); } sendWSMessage_3840000(_G(my_walker), 10); break; case 10: kernel_timing_trigger(90, 20, "rip peers"); break; case 20: digi_play("808r14", 1, 255, -1, -1); if (_G(player_info).facing == 2) { setGlobals3(_808Rp02Series, 1, 17); } else { setGlobals3(_808Rp01Series, 1, 19); } sendWSMessage_3840000(_G(my_walker), 30); break; case 30: player_set_commands_allowed(true); ws_demand_facing(_G(my_walker), _dword1A1964_facing); break; default: break; } } else if (player_said("hole in bridge")) { switch (_G(kernel).trigger) { case -1: if (_G(flags)[V278] && _G(flags)[V277]) digi_play("808r16", 1, 255, -1, -1); else { _G(flags)[V278] = 1; digi_play("808r15", 1, 255, _G(flags)[V278] ? 10 : -1, -1); } break; case 10: digi_play("808r15a", 1, 255, -1, -1); break; default: break; } } else if (player_said("hole in chasm wall")) { switch (_G(kernel).trigger) { case -1: if (_G(flags)[V278] && _G(flags)[V277]) digi_play("808r16", 1, 255, -1, -1); else { _G(flags)[V277] = 1; digi_play("808r17", 1, 255, _G(flags)[V278] ? 10 : -1, -1); } break; case 10: digi_play("808r17a", 1, 255, -1, -1); break; default: break; } } else if (player_said("mei chen")) { digi_play("808r18", 1, 255, -1, -1); } else { _G(player).command_ready = true; } break; case 2: if (player_said("FARMER'S SHOVEL ")) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808PosMach); _808PosMach = series_show("808pos1", 1281, 0, -1, -1, 3, 100, 0, 0); _808RipFallShovelNearSideMach = series_play("808rp07", 1, 18, 10, 5, 0, 100, 0, 0, 0, -1); player_update_info(_G(my_walker), &_G(player_info)); _safariShadowMach = series_place_sprite(SAFARI_SHADOWS_2[_G(player_info).facing], 0, _G(player_info).x, _G(player_info).y, _G(player_info).scale, 257); break; case 10: inv_give_to_player("FARMER'S SHOVEL"); hotspot_set_active("FARMER'S SHOVEL ", false); kernel_examine_inventory_object("PING FARMER'S SHOVEL", _G(master_palette), 5, 1, 125, 125, 20, nullptr, -1); break; case 20: player_set_commands_allowed(true); terminateMachineAndNull(_808RipFallShovelNearSideMach); terminateMachineAndNull(_safariShadowMach); ws_unhide_walker(_G(my_walker)); ws_demand_facing(_G(my_walker), 2); break; default: break; } } else if ((player_said("FARMER'S SHOVEL") && inv_object_in_scene("FARMER'S SHOVEL", 808)) || player_said_any("FARMER'S SHOVEL ", "FARMER'S SHOVEL ", "FARMER'S SHOVEL ")) { digi_play("808r31", 1, 255, -1, -1); } else if (player_said("crank")) { if (_G(flags)[kBridgeLocked]) { switch (_G(kernel).trigger) { case -1: if (!inv_object_in_scene("crank", 808)) { _G(player).command_ready = true; return; } player_set_commands_allowed(false); setGlobals3(_ripMedReach1HandPos2Series, 1, 17); sendWSMessage_3840000(_G(my_walker), 10); break; case 10: inv_give_to_player("CRANK"); kernel_examine_inventory_object("PING CRANK", _G(master_palette), 5, 1, 280, 85, 20, nullptr, -1); break; case 20: terminateMachineAndNull(_808HandleSpriteMach); setGlobals3(_ripMedReach1HandPos2Series, 17, 1); sendWSMessage_3840000(_G(my_walker), 30); break; case 30: player_set_commands_allowed(true); inv_give_to_player("crank"); hotspot_set_active("slot", true); hotspot_set_active("crank", false); ws_demand_facing(_G(my_walker), 10); break; default: break; } } } else { _G(player).command_ready = true; } break; case 3: if (_G(flags)[V097] == 0 && _G(flags)[kBridgeWheelPosition] == 4 && inv_object_in_scene("FARMER'S SHOVEL", 808)) { conv_load("conv808a", 10, 10, 747); conv_export_value_curr(_G(flags)[V098], 0); conv_play(conv_get_handle()); } else if (_G(flags)[V097] == 0) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); setGlobals1(_ripTalkerPos5Series, 1, 4, 1, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); sendWSMessage_110000(_G(my_walker), -1); switch (imath_ranged_rand(1, 4)) { case 1: digi_play("com034", 1, 255, 10, 997); break; case 2: digi_play("com035", 1, 255, 10, 997); break; case 3: digi_play("com036", 1, 255, 10, 997); break; case 4: default: digi_play("com037", 1, 255, 10, 997); break; } break; case 10: player_set_commands_allowed(true); sendWSMessage_150000(_G(my_walker), -1); switch (_G(kernel).trigger) { case 1: digi_play("com038", 1, 255, -1, 997); break; case 2: digi_play("com039", 1, 255, -1, 997); break; case 3: digi_play("com040", 1, 255, -1, 997); break; case 4: default: digi_play("com041", 1, 255, -1, 997); break; } break; default: break; } } else if (_G(flags)[V097] == 1 && inv_object_in_scene("crank", 808) && _G(flags)[kBridgeLocked] == 0) { switch (_G(kernel).trigger) { case -1: ws_turn_to_face(_G(my_walker), 1, 5); break; case 5: player_set_commands_allowed(false); if (_G(flags)[V099] == 0) { _G(flags)[V099] = 1; digi_play("808r26", 1, 255, 10, -1); } else { digi_play("808r27", 1, 255, 10, -1); } break; case 10: DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(320, 122, -1); ws_custom_walk(_mcTrekMach, 10, 20, true); break; case 20: ws_hide_walker(_mcTrekMach); if (_G(flags)[V098] == 0) terminateMachineAndNull(_808HandleSpriteMach); if (_G(flags)[kBridgeWheelPosition] == 1 || _G(flags)[kBridgeWheelPosition] == 2 || _G(flags)[kBridgeWheelPosition] == 3) { series_load("808 bolt going in and out", -1, nullptr); series_play("808 mei chen cranks handle", 1536, 0, 30, 5, 0, 100, 0, 0, 0, 14); } else if (_G(flags)[kBridgeWheelPosition] == 4 || (_G(flags)[kBridgeWheelPosition] == 0 && inv_object_in_scene("FARMER'S SHOVEL", 808))) { series_play("808 mei chen cranks handle", 1536, 0, 21, 5, 0, 100, 0, 0, 0, 12); } else { series_play("808 mei chen cranks handle", 1536, 0, 40, 5, 0, 100, 0, 0, 0, 7); } digi_preload("808_s10", -1); break; case 21: series_play("808 mei chen cranks handle", 1536, 0, 22, 5, 0, 100, 0, 0, 13, 24); digi_play("808_s10", 2, 255, -1, -1); break; case 22: _808RipFallShovelNearSideMach = series_play("808 mei chen cranks handle", 1536, 16, -1, 5, 0, 100, 0, 0, 25, 29); digi_play("808_s09", 2, 255, -1, -1); kernel_timing_trigger(60, 26, nullptr); break; case 26: terminateMachineAndNull(_808RipFallShovelNearSideMach); series_play("808 mei chen cranks handle", 1536, 2, 38, 5, 0, 100, 0, 0, 8, 29); digi_play("808_s10", 2, 255, -1, -1); break; case 30: if (_G(flags)[V098] == 0) { terminateMachineAndNull(_808HandleSpriteMach); } _808RipFallShovelNearSideMach = series_play("808 mei chen cranks handle", 1536, 16, 35, 5, 0, 100, 0, 0, 15, 47); _safariShadowMach = series_play("808 bolt going in and out", 0, 16, -1, 15, 0, 100, 0, 0, 0, -1); _G(flags)[V279] = 1; digi_play("808_s07", 2, 255, -1, -1); digi_play("808_s10", 1, 255, -1, -1); break; case 35: kernel_timing_trigger(45, 37, "bolt showing"); digi_stop(1); break; case 37: terminateMachineAndNull(_808RipFallShovelNearSideMach); terminateMachineAndNull(_safariShadowMach); series_play("808 mei chen cranks handle", 1536, 2, 38, 5, 0, 100, 0, 0, 8, 47); series_play("808 bolt going in and out", 0, 2, -1, 15, 0, 100, 0, 0, 0, -1); digi_play("808_s08", 2, 255, -1, -1); digi_play("808_s10", 1, 255, -1, -1); break; case 38: _808HandleSpriteMach = series_show("808 handle sprite", 4095, 0, -1, -1, 0, 100, 0, 0); series_play("808 mei chen cranks handle", 1536, 2, 39, 5, 0, 100, 0, 0, 0, 7); digi_stop(1); digi_stop(2); break; case 39: ws_unhide_walker(_mcTrekMach); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(345, 115, -1); ws_custom_walk(_mcTrekMach, 5, 55, true); break; case 40: if (_G(flags)[V098] == 0) { terminateMachineAndNull(_808HandleSpriteMach); } series_play("808 mei chen cranks handle", 1536, 0, 41, 5, 0, 100, 0, 0, 8, 42); digi_play("808_s10", 2, 255, -1, -1); break; case 41: series_play("808 mei chen cranks handle", 1536, 0, 42, 5, 0, 100, 0, 0, 43, 58); digi_play("808_s03", 2, 255, -1, -1); break; case 42: _808HandleSpriteMach = series_show("808 handle sprite", 4095, 0, -1, -1, 0, 100, 0, 0); series_play("808 mei chen cranks handle", 1536, 0, 43, 5, 0, 100, 0, 0, 59, -1); break; case 43: ws_unhide_walker(_mcTrekMach); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(345, 115, -1); ws_custom_walk(_mcTrekMach, 5, 50, true); break; case 50: player_set_commands_allowed(true); _G(flags)[kBridgeLocked] = 1; _G(flags)[V276] = 0; _G(flags)[V098] = 0; hotspot_set_active("crank", true); hotspot_set_active("slot", false); digi_unload("808_s10"); break; case 55: player_set_commands_allowed(true); if (_G(flags)[kBridgeWheelPosition] == 4 || (_G(flags)[kBridgeWheelPosition] == 0 && inv_object_in_scene("FARMER'S SHOVEL", 808))) { digi_play(_G(flags)[V279] ? "808r29" : "808r28", 1, 255, -1, -1); } _G(flags)[V098] = 0; hotspot_set_active("crank", true); hotspot_set_active("slot", false); digi_unload("808_s10"); break; default: break; } } else { switch (_G(kernel).trigger) { case -1: if (_G(flags)[kBridgeLocked] == 0) { ws_turn_to_face(_G(my_walker), 1, 10); } else { ws_walk(_G(my_walker), 335, 121, nullptr, 10, 1, true); } break; case 10: player_set_commands_allowed(false); switch (imath_ranged_rand(1, 4)) { case 1: digi_play("com034", 1, 255, 20, 997); break; case 2: digi_play("com035", 1, 255, 20, 997); break; case 3: digi_play("com036", 1, 255, 20, 997); break; case 4: default: digi_play("com037", 1, 255, 20, 997); break; } break; case 20: player_set_commands_allowed(true); switch (imath_ranged_rand(1, 4)) { case 1: digi_play("com038", 1,255,-1,997); break; case 2: digi_play("com039", 1, 255, -1, 997); break; case 3: digi_play("com040", 1, 255, -1, 997); break; case 4: default: digi_play("com041", 1, 255, -1, 997); break; } break; default: break; } } break; case 4: // Empty return; case 5: if (player_said("west")) { switch (_G(kernel).trigger) { case -1: if (_G(flags)[V097] == 1 && _G(flags)[kBridgeLocked] == 0) { ws_walk(_G(my_walker), 67, 211, nullptr, 2, 7, false); } else { ws_walk(_G(my_walker), 67, 211, nullptr, 10, 7, false); } break; case 2: player_set_commands_allowed(false); ws_turn_to_face(_G(my_walker), 2, 3); break; case 3: digi_play("com137", 1, 255, 5, 997); break; case 5: ws_walk(_G(my_walker), 17, 214, nullptr, 20, 8, true); _G(flags)[V276] = 1; break; case 10: player_set_commands_allowed(false); ws_walk(_G(my_walker), 17, 214, nullptr, 20, 8, true); if (_G(flags)[V097] == 0) { setGlobals3(_meiChenHandsBehindBackSeries, 17, 1); sendWSMessage_3840000(_mcTrekMach, -1); } else { DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(318, 134, -1); ws_custom_walk(_mcTrekMach, -1, -1, true); } break; case 20: disable_player_commands_and_fade_init(30); ws_hide_walker(_G(my_walker)); series_play("808rpdwn", 0, 16, -1, 5, 0, 100, 0, 0, 0, -1); break; case 30: _G(game).setRoom(807); adv_kill_digi_between_rooms(false); digi_play_loop("950_s29", 3, 255, -1, -1); break; default: break; } } else if (player_said("east") && _G(flags)[kBridgeLocked]) { switch (_G(kernel).trigger) { case -1: ws_walk(_G(my_walker), 480, 35, nullptr, 10, 2, true); break; case 10: player_set_commands_allowed(false); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(413, 103, -1); ws_custom_walk(_mcTrekMach, 1, -1, true); disable_player_commands_and_fade_init(20); break; case 20: _G(game).setRoom(809); break; default: break; } } else { _G(player).command_ready = true; } break; case 6: if (player_said("mei chen")) { switch (_G(kernel).trigger) { case -1: if (_G(flags)[kBridgeLocked]) { digi_play("com122", 1, 255, -1, 997); } else if (_G(flags)[V097] == 0) { player_set_commands_allowed(false); setGlobals3(_rptmr15Series, 1, 16); sendWSMessage_3840000(_G(my_walker), -1); setGlobals3(_meiChenHandsBehindBackSeries, 17, 1); sendWSMessage_3840000(_mcTrekMach, 7); } else if (_G(flags)[V097] == 1) { if (inv_object_in_scene("FARMER'S SHOVEL", 808) && _G(flags)[kBridgeWheelPosition] == 4) ws_walk(_G(my_walker), 185, 156, nullptr, 11, 5); else digi_play("808r30", 1); } else { digi_play("808r30", 1); } break; case 7: kernel_timing_trigger(30, 10); break; case 10: setGlobals3(_mctd61Series, 1, 5); sendWSMessage_3840000(_mcTrekMach, 15); break; case 11: player_set_commands_allowed(false); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(348, 130, 193, 163, -1); ws_custom_walk(_mcTrekMach, 11, 21); break; case 15: kernel_timing_trigger(45, 20, "the crank is passed"); inv_move_object("CRANK", 808); break; case 20: _G(flags)[V098] = 1; if (_G(flags)[V097] == 0) { setGlobals3(_mctd61Series, 5, 1); sendWSMessage_3840000(_mcTrekMach, 25); } else { setGlobals3(_mctd61Series, 5, 1); sendWSMessage_3840000(_mcTrekMach, -1); } setGlobals3(_rptmr15Series, 16, 1); sendWSMessage_3840000(_G(my_walker), 30); break; case 21: setGlobals3(_rptmr15Series, 1, 16); sendWSMessage_3840000(_G(my_walker), 10); break; case 25: setGlobals3(_meiChenHandsBehindBackSeries, 1, 17); sendWSMessage_3840000(_mcTrekMach, -1); break; case 30: if (_G(flags)[V097] != 1) { player_set_commands_allowed(true); ws_demand_facing(_G(my_walker), 7); } else { DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(348, 130, 345, 115, -1); ws_custom_walk(_mcTrekMach, 5, 41, true); } break; case 41: player_set_commands_allowed(true); ws_demand_facing(_G(my_walker), 5); break; default: break; } } else if (player_said("slot") && _G(flags)[kBridgeLocked] != 0) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); setGlobals3(_ripMedReach1HandPos2Series, 1, 17); sendWSMessage_3840000(_G(my_walker), 10); break; case 10: inv_move_object("crank", 808); hotspot_set_active("crank", true); hotspot_set_active("slot", false); kernel_timing_trigger(60, 20, nullptr); break; case 20: _808HandleSpriteMach = series_show("808 handle sprite", 4095, 0, -1, -1, 0, 100, 0, 0); setGlobals3(_ripMedReach1HandPos2Series, 17, 1); sendWSMessage_3840000(_G(my_walker), 30); break; case 30: player_set_commands_allowed(true); ws_demand_facing(_G(my_walker), 10); break; default: break; } } else { _G(player).command_ready = true; } break; case 7: if (player_said("hole in bridge")) { switch (_G(kernel).trigger) { case -1: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); inv_move_object("FARMER'S SHOVEL", 808); series_play("808rp07", 256, 0, 5, 5, 0, 100, 0, 0, 0, 22); player_update_info(_G(my_walker), &_G(player_info)); _808RipFallShovelNearSideMach = series_place_sprite(SAFARI_SHADOWS_2[_G(player_info).facing], 0, _G(player_info).x, _G(player_info).y, _G(player_info).scale, 257); break; case 5: series_play("808rp07", 256, 0, 10, 5, 0, 100, 0, 0, 23, -1); digi_play("808_s06", 2, 255, -1, -1); break; case 10: player_set_commands_allowed(true); hotspot_set_active("FARMER'S SHOVEL ", true); terminateMachineAndNull(_808PosMach); _808PosMach = series_show("808pos2", 1281, 0, -1, -1, 3, 100, 0, 0); ws_unhide_walker(_G(my_walker)); ws_demand_facing(_G(my_walker), 2); terminateMachineAndNull(_808RipFallShovelNearSideMach); _G(flags)[V095] = 0; break; default: break; } } else { _G(player).command_ready = true; } break; case 8: if (player_said("hole in bridge")) { digi_play("808r35",1,255,-1,-1); } else { _G(player).command_ready = true; } break; case 9: if (player_said("hole in bridge")) { digi_play("com018", 1, 255, -1, 997); } else if (player_said("bridge")) { digi_play("com019", 1, 255, -1, 997); } else { _G(player).command_ready = true; } break; case 10: switch (_G(kernel).trigger) { case -1: if (conv_sound_to_play()) { if (conv_whos_talking() == 1) { setGlobals1(_ripTalkerPos5Series, 4, 4, 1, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); sendWSMessage_110000(_G(my_walker), -1); if (conv_current_node() == 2 && conv_current_entry() == 0) { setGlobals3(_meiChenHandsBehindBackSeries, 17, 1); sendWSMessage_3840000(_mcTrekMach, -1); } } else { sendWSMessage_150000(_G(my_walker), -1); } digi_play(conv_sound_to_play(), 1, 255, 10, -1); } else { conv_resume(conv_get_handle()); } break; case 10: if (conv_current_node() == 2 && conv_current_entry() == 0) { sendWSMessage_150000(_G(my_walker), -1); ws_walk(_G(my_walker), 185, 156, nullptr, -1, 5, true); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(183, 172, -1); ws_custom_walk(_mcTrekMach, 11, 20, true); } else if (conv_current_node() == 2 && conv_current_entry() == 1) { sendWSMessage_150000(_G(my_walker), -1); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(348, 130, 345, 115, -1); ws_custom_walk(_mcTrekMach, 7, 30, true); } else { conv_resume(conv_get_handle()); } break; case 20: conv_resume(conv_get_handle()); break; case 30: _G(flags)[V097] = 1; addMcHotspot(1); conv_resume(conv_get_handle()); break; default: break; } break; case 11: digi_play("com042", 1, 255, -1, 997); break; default: break; } } void Room808::daemon() { switch (_G(kernel).trigger) { case 1: player_set_commands_allowed(true); setBridgeHotspots(0, false); setBridgeHotspots(1, false); setBridgeHotspots(2, false); setBridgeHotspots(3, false); setBridgeHotspots(4, false); setBridgeHotspots(_G(flags)[kBridgeWheelPosition], true); addMcHotspot(_G(flags)[V097]); if (_G(flags)[V097] == 0) { _meiChenHandsBehindBackSeries = series_load("MEI CHIEN HANDS BEHIND BACK", -1, nullptr); setGlobals3(_meiChenHandsBehindBackSeries, 1, 17); sendWSMessage_3840000(_mcTrekMach, -1); } kernel_timing_trigger(imath_ranged_rand(1200, 1800), 18); break; case 2: ws_unhide_walker(_G(my_walker)); ws_demand_location(_G(my_walker), 18, 216); ws_demand_facing(_G(my_walker), 2); DisposePath(_G(my_walker)->walkPath); _G(my_walker)->walkPath = CreateCustomPath(29, 209, 67, 209, 112, 195, -1); ws_custom_walk(_G(my_walker), 2, -1, true); series_unload(_808McupSeries); series_play("808mcup", 0, 0, 3, 5, 0, 100, 0, 0, 0, -1); break; case 3: _mcTrekMach = triggerMachineByHash_3000(8, 4, *S8_SHADOW_DIRS2, *S8_SHADOW_DIRS1, 18, 216, 2, Walker::player_walker_callback, "mc_trek"); DisposePath(_mcTrekMach->walkPath); _mcTrekMach->walkPath = CreateCustomPath(31, 211, 66, 215, 112, 238, -1); ws_custom_walk(_mcTrekMach, 2, 1, true); series_unload(_808McupSeries); break; case 4: ws_unhide_walker(_G(my_walker)); ws_demand_location(_G(my_walker), 18, 216); ws_demand_facing(_G(my_walker), 2); DisposePath(_G(my_walker)->walkPath); _G(my_walker)->walkPath = CreateCustomPath(29, 209, 67, 209, 112, 195, -1); ws_custom_walk(_G(my_walker), 2, 1, true); break; case 6: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808PosMach); _G(flags)[V096] = 1; if (inv_object_in_scene("farmer's shovel", 808)) { series_play("808 RIP TEST BRIDGESHOVEL FAR", 1, 0, 7, 5, 0, 100, 0, 0, 0, -1); } else if (_G(flags)[kBridgeWheelPosition] == 4) { series_play("808test3", 1, 0, 7, 5, 0, 100, 0, 0, 0, -1); } else { series_play("808 RIP TEST BRIDGE", 1, 0, 7, 5, 0, 100, 0, 0, 0, -1); } break; case 7: player_set_commands_allowed(true); ws_unhide_walker(_G(my_walker)); ws_demand_facing(_G(my_walker), 2); if (inv_object_in_scene("farmer's shovel", 808)) { _808PosMach = series_show("808pos2", 1281, 0, -1, -1, 0, 100, 0, 0); } else if (_G(flags)[kBridgeWheelPosition] == 4) { _808PosMach = series_show("808pos1", 1281, 0, -1, -1, 4, 100, 0, 0); } else { _808PosMach = series_show("808pos1", 1281, 0, -1, -1, 0, 100, 0, 0); } break; case 8: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808PosMach); digi_preload("808_s04", -1); digi_preload("808_s02", -1); digi_preload("28_02n01", 807); _808RipFallShovelNearSideMach = series_stream("808 RIP FALLSHOVEL NEAR SIDE ", 5, 0, -1); series_stream_break_on_frame(_808RipFallShovelNearSideMach, 5, 15); digi_play("808_s04", 3, 255, -1, -1); break; case 9: disable_player_commands_and_fade_init(12); break; case 10: player_set_commands_allowed(false); ws_hide_walker(_G(my_walker)); terminateMachineAndNull(_808PosMach); digi_preload("808_s04", -1); digi_preload("808_s02", -1); digi_preload("28_02n01", 807); if (inv_object_in_scene("farmer's shovel", 808)) { _808RipFallShovelNearSideMach = series_stream("808 RIP FALL WSHOVEL FAR SIDE", 5, 0, -1); series_stream_break_on_frame(_808RipFallShovelNearSideMach, 5, 13); } else { _808RipFallShovelNearSideMach = series_stream("808 RIP FALLS", 5, 0, -1); series_stream_break_on_frame(_808RipFallShovelNearSideMach, 5, 14); } digi_play("808_s04", 3, 255, -1, -1); break; case 11: if (inv_object_in_scene("farmer's shovel", 808)) { series_show("808pos2", 0, 0, -1, -1, 4, 100, 0, 0); } disable_player_commands_and_fade_init(12); break; case 12: if (_G(spleenSpraying)) { kernel_timing_trigger(200, 966, nullptr); } else { _G(player).disable_hyperwalk = false; ws_unhide_walker(_G(my_walker)); ws_demand_location(_G(my_walker), 190, 179); ws_demand_facing(_G(my_walker), 2); // TODO : remove the hack and use this code when we understand why it doesn't save the right position in the auto-save // other_save_game_for_resurrection(); _G(game).setRoom(413); } break; case 13: series_stream_break_on_frame(_808RipFallShovelNearSideMach, 21, 11); digi_play("808_s02", 2, 255, -1, -1); if (_G(flags)[V097] == 0) { setGlobals3(_meiChenHandsBehindBackSeries, 17, 1); sendWSMessage_3840000(_mcTrekMach, 16); } else { ws_hide_walker(_mcTrekMach); series_play("808mc99", 3840, 16, -1, 5, 0, 100, 0, 0, 0, -1); } kernel_timing_trigger(45, 17, nullptr); break; case 14: series_stream_break_on_frame(_808RipFallShovelNearSideMach, 24, 11); digi_play("808_s02", 2, 255, -1, -1); if (_G(flags)[V097] == 0) { setGlobals3(_meiChenHandsBehindBackSeries, 17, 1); sendWSMessage_3840000(_mcTrekMach, 16); } else { ws_hide_walker(_mcTrekMach); series_play("808mc99", 3840, 16, -1, 5, 0, 100, 0, 0, 0, -1); } kernel_timing_trigger(45, 17, nullptr); break; case 15: series_stream_break_on_frame(_808RipFallShovelNearSideMach, 24, 9); digi_play("808_s02", 2, 255, -1, -1); if (_G(flags)[V097] == 0) { setGlobals3(_meiChenHandsBehindBackSeries, 17, 1); sendWSMessage_3840000(_mcTrekMach, 16); } else { ws_demand_location(_mcTrekMach, -1000, -1000); ws_hide_walker(_mcTrekMach); series_play("808mc99", 3840, 16, -1, 5, 0, 100, 0, 0, 0, -1); } kernel_timing_trigger(45, 17, nullptr); break; case 16: series_play("808mc98", 0, 16, -1, 5, 0, 100, 0, 0, 0, -1); break; case 17: digi_play("28_02n01", 1, 255, -1, 807); break; case 18: if (_G(flags)[V097] != 0) break; if (!player_commands_allowed() || !checkStrings()) { kernel_timing_trigger(60, 18, nullptr); } else { player_set_commands_allowed(false); intr_cancel_sentence(); switch (imath_ranged_rand(1, 4)) { case 1: digi_play("950_s15", 2, 255, 19, -1); break; case 2: digi_play("950_s16", 2, 255, 19, -1); break; case 3: digi_play("950_s17", 2, 255, 19, -1); break; case 4: default: digi_play("950_s18", 2, 255, 19, -1); break; } } break; case 19: player_update_info(_G(my_walker), &_G(player_info)); switch (_G(player_info).facing) { case 1: case 2: case 3: case 4: ws_walk(_G(my_walker), _G(player_info).x, _G(player_info).y, nullptr, 20, 3, true); _dword1A195C_facing = 3; break; case 5: kernel_timing_trigger(30, 20, "phantom reaction"); _dword1A195C_facing = 5; break; case 7: kernel_timing_trigger(30, 20, "phantom reaction"); _dword1A195C_facing = 7; break; case 8: case 9: case 10: case 11: ws_walk(_G(my_walker), _G(player_info).x, _G(player_info).y, nullptr, 20, 9, true); _dword1A195C_facing = 9; break; default: break; } break; case 20: _dword1A1958 = 0; _dword1A1960_rand4 = imath_ranged_rand(1, 4); switch(_dword1A1960_rand4) { case 1: digi_play("COM052", 1, 255, 21, 997); break; case 2: digi_play("COM054", 1, 255, 21, 997); break; case 3: digi_play("COM056", 1, 255, 21, 997); break; case 4: digi_play("COM057", 1, 255, 21, 997); break; default: break; } setGlobals3(_mctd82aSeries, 1, 22); sendWSMessage_3840000(_mcTrekMach, 23); if (_dword1A195C_facing == 3 || _dword1A195C_facing == 9) { setGlobals3(_ripPos3LookAroundSeries, 1, 20); } else { setGlobals3(_ripLooksAroundInAweSeries, 1, 14); } sendWSMessage_3840000(_G(my_walker), 22); break; case 21: switch (_dword1A1960_rand4) { case 1: digi_play("COM053", 1, 255, -1, 997); break; case 2: digi_play("COM055", 1, 255, -1, 997); break; case 4: digi_play("COM058", 1, 255, -1, 997); break; default: break; } break; case 22: kernel_timing_trigger(imath_ranged_rand(90, 120), 24, nullptr); break; case 23: kernel_timing_trigger(imath_ranged_rand(90, 120), 25, nullptr); break; case 24: if (_dword1A195C_facing == 3 || _dword1A195C_facing == 9) { setGlobals3(_ripPos3LookAroundSeries, 19, 1); } else { setGlobals3(_ripLooksAroundInAweSeries, 13, 1); } sendWSMessage_3840000(_G(my_walker), 26); break; case 25: setGlobals3(_mctd82aSeries, 22, 1); sendWSMessage_3840000(_mcTrekMach, 26); break; case 26: ++_dword1A1958; if (_dword1A1958 == 2) { player_set_commands_allowed(true); ws_demand_facing(_G(my_walker), _dword1A195C_facing); kernel_timing_trigger(imath_ranged_rand(7200, 14400), 19, nullptr); } break; case 966: digi_play("950_s53", 2, 255, 967, -1); break; case 967: // Note : this block is never used as the environment variable spleenSpraying is never set (thus trigger 966 & 967 are never called) ws_unhide_walker(_G(my_walker)); ws_demand_location(_G(my_walker), 202, 179); ws_demand_facing(_G(my_walker), 2); // TODO : remove the hack and use this code when we understand why it doesn't save the right position in the auto-save // other_save_game_for_resurrection(); _G(game).setRoom(413); break; default: break; } } bool Room808::getWalkPath(machine *machine, int32 walk_x, int32 walk_y) { if (machine == nullptr || machine->myAnim8 == nullptr) { error_show(FL, 514, "ws_walk"); } const int32 currPos_x = machine->myAnim8->myRegs[IDX_X] >> 16; const int32 currPos_y = machine->myAnim8->myRegs[IDX_Y] >> 16; Buffer* currBuffer = _G(screenCodeBuff)->get_buffer(); const int32 currNode = AddRailNode(currPos_x, currPos_y, currBuffer, true); if (currNode < 0) { error_show(FL, 520, "Walker's curr posn: %ld %ld", currPos_x, currPos_y); } const int32 destNode = AddRailNode(walk_x, walk_y, currBuffer, true); if (destNode < 0) { error_show(FL, 520, "Trying to walk to: %ld %ld", walk_x, walk_y); } if (machine->walkPath) DisposePath(machine->walkPath); bool retVal = GetShortestPath(currNode, destNode, &machine->walkPath); RemoveRailNode(currNode, currBuffer, true); RemoveRailNode(destNode, currBuffer, true); _G(screenCodeBuff)->release(); return retVal; } void Room808::setBridgeHotspots(int val1, bool activeFl) { switch (val1) { case 0: hotspot_set_active("wheel", activeFl); hotspot_set_active("bridge", activeFl); hotspot_set_active("hole in chasm wall", false); hotspot_set_active("hole in bridge", false); hotspot_set_active("FARMER'S SHOVEL", inv_object_in_scene("FARMER'S SHOVEL", 808) && activeFl); if (inv_object_in_scene("crank", 808) && !_G(flags)[V098]) { hotspot_set_active("crank", true); hotspot_set_active("slot", false); } else { hotspot_set_active("crank", false); hotspot_set_active("slot", true); } break; case 1: hotspot_set_active("wheel ", activeFl); hotspot_set_active("bridge ", activeFl); hotspot_set_active("hole in chasm wall", activeFl); hotspot_set_active("hole in bridge", false); hotspot_set_active("FARMER'S SHOVEL ", inv_object_in_scene("FARMER'S SHOVEL", 808) && activeFl); hotspot_set_active("crank", false); hotspot_set_active("slot", false); break; case 2: hotspot_set_active("wheel ", activeFl); hotspot_set_active("bridge ", activeFl); hotspot_set_active("hole in chasm wall", activeFl); hotspot_set_active("hole in bridge", false); hotspot_set_active("FARMER'S SHOVEL ", inv_object_in_scene("FARMER'S SHOVEL", 808) && activeFl); if (inv_object_in_scene("crank", 808) && !_G(flags)[V098]) { hotspot_set_active("crank", true); hotspot_set_active("slot", false); } else { hotspot_set_active("crank", false); hotspot_set_active("slot", true); } break; case 3: hotspot_set_active("wheel ", activeFl); hotspot_set_active("bridge ", activeFl); hotspot_set_active("hole in chasm wall", activeFl); hotspot_set_active("hole in bridge", activeFl); hotspot_set_active("FARMER'S SHOVEL ", inv_object_in_scene("FARMER'S SHOVEL", 808) && activeFl); if (inv_object_in_scene("crank", 808) && !_G(flags)[V098]) { hotspot_set_active("crank", true); hotspot_set_active("slot", false); } else { hotspot_set_active("crank", false); hotspot_set_active("slot", true); } break; case 4: hotspot_set_active("wheel", activeFl); hotspot_set_active("bridge", activeFl); hotspot_set_active("hole in chasm wall", false); hotspot_set_active("hole in bridge", false); hotspot_set_active("FARMER'S SHOVEL ", inv_object_in_scene("FARMER'S SHOVEL", 808) && activeFl); if (inv_object_in_scene("crank", 808) && !_G(flags)[V098]) { hotspot_set_active("crank", true); hotspot_set_active("slot", false); } else { hotspot_set_active("crank", false); hotspot_set_active("slot", true); } break; default: break; } } void Room808::addMcHotspot(int32 val1) { for (HotSpotRec* curr = _G(currentSceneDef).hotspots; curr != nullptr; curr = curr->next) { if (scumm_stricmp(curr->vocab, "MEI CHEN")) { _G(currentSceneDef).hotspots = hotspot_delete_record(_G(currentSceneDef).hotspots, curr); break; } } HotSpotRec *newHotspot; switch (val1) { case 0: newHotspot = hotspot_new(100, 170, 124, 241); hotspot_newVerb(newHotspot, "TALK TO"); hotspot_newVocab(newHotspot, "MEI CHEN"); newHotspot->cursor_number = 7; newHotspot->feet_x = 128; newHotspot->feet_y = 221; newHotspot->facing = 7; break; case 1: newHotspot = hotspot_new(336, 74, 352, 117); hotspot_newVerb(newHotspot, "TALK TO"); hotspot_newVocab(newHotspot, "MEI CHEN"); newHotspot->cursor_number = 7; newHotspot->feet_x = 32767; newHotspot->feet_y = 32767; newHotspot->facing = 0; break; default: error("addMcHotspot - unexpected value"); } _G(currentSceneDef).hotspots = hotspot_add(_G(currentSceneDef).hotspots, newHotspot, true); } void Room808::setPosMachInfo() { if (_G(flags)[V095]) { if (inv_object_in_scene("FARMER'S SHOVEL", 808)) { switch (_G(flags)[kBridgeWheelPosition]) { case 1: _posMachName = "808spn16"; _G(flags)[V095] = 0; _posMachIndex = 0; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 0; break; case 2: _posMachName = "808spn15"; _posMachIndex = 6; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 1; break; case 3: _posMachName = "808spn14"; _posMachIndex = 4; _posMachFrameNum = 17; _G(flags)[kBridgeWheelPosition] = 2; break; case 4: _posMachName = "808spn13"; _posMachIndex = 3; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 3; break; default: break; } } else { switch (_G(flags)[kBridgeWheelPosition]) { case 1: _posMachName = "808spn08"; _G(flags)[V095] = 0; _posMachIndex = 0; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 0; break; case 2: _posMachName = "808spn07"; _posMachIndex = 6; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 1; break; case 3: _posMachName = "808spn06"; _posMachIndex = 5; _posMachFrameNum = 17; _G(flags)[kBridgeWheelPosition] = 2; break; case 4: _posMachName = "808spn05"; _posMachIndex = 3; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 3; break; default: break; } } } else { if (inv_object_in_scene("FARMER'S SHOVEL", 808)) { switch (_G(flags)[kBridgeWheelPosition]) { case 0: _posMachName = "808spn09"; _posMachIndex = 1; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 1; break; case 1: _posMachName = "808spn10"; _posMachIndex = 2; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 2; break; case 2: _posMachName = "808spn11"; _posMachIndex = 3; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 3; break; case 3: _posMachName = "808spn12"; _posMachIndex = 5; _posMachFrameNum = 10; _G(flags)[kBridgeWheelPosition] = 4; _G(flags)[V095] = 1; break; default: break; } } else { switch (_G(flags)[kBridgeWheelPosition]) { case 0: _posMachName = "808spn01"; _posMachIndex = 1; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 1; break; case 1: _posMachName = "808spn02"; _posMachIndex = 2; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 2; break; case 2: _posMachName = "808spn03"; _posMachIndex = 3; _posMachFrameNum = 13; _G(flags)[kBridgeWheelPosition] = 3; break; case 3: _posMachName = "808spn04"; _posMachIndex = 4; _posMachFrameNum = 10; _G(flags)[kBridgeWheelPosition] = 4; _G(flags)[V095] = 1; break; default: break; } } } } } // namespace Rooms } // namespace Riddle } // namespace M4