2076 lines
46 KiB
C++
2076 lines
46 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/ },.
|
|
*
|
|
*/
|
|
|
|
#include "m4/riddle/rooms/section3/room303.h"
|
|
#include "m4/graphics/gr_series.h"
|
|
#include "m4/riddle/vars.h"
|
|
#include "m4/adv_r/adv_file.h"
|
|
#include "m4/fileio/extensions.h"
|
|
#include "m4/fileio/info.h"
|
|
#include "m4/gui/gui_vmng.h"
|
|
#include "m4/gui/gui_sys.h"
|
|
#include "m4/platform/keys.h"
|
|
#include "m4/riddle/riddle.h"
|
|
|
|
namespace M4 {
|
|
namespace Riddle {
|
|
namespace Rooms {
|
|
|
|
static const char *const SAID[][2] = {
|
|
{ "IRON MAIDEN", "303R29" },
|
|
{ "MUMMY WITH HAIR", "303R30" },
|
|
{ "MAN WITH HAMMER", "303R33" },
|
|
{ "TICKET WINDOW", "303R34" },
|
|
{ "PICTURE", "303R35" },
|
|
{ nullptr, nullptr }
|
|
};
|
|
|
|
|
|
void Room303::preload() {
|
|
LoadWSAssets("OTHER SCRIPT");
|
|
|
|
if (_G(flags)[V000]) {
|
|
_G(art_base_override) = player_been_here(201) ?
|
|
"EXHIBIT HALL-TREK" : "EH TREK NO SNAKE";
|
|
_G(use_alternate_attribute_file) = true;
|
|
_G(player).walker_type = 1;
|
|
_G(player).shadow_type = 1;
|
|
_G(player).walker_in_this_scene = true;
|
|
|
|
} else {
|
|
_G(player).walker_type = 0;
|
|
_G(player).shadow_type = 0;
|
|
_G(player).walker_in_this_scene = true;
|
|
|
|
if (_G(game).room_id == 352) {
|
|
_G(player).walker_in_this_scene = false;
|
|
_G(player).disable_hyperwalk = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Room303::init() {
|
|
_newExhibitsFlag = _lonelyFlag = false;
|
|
|
|
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
|
|
_digiName1 = nullptr;
|
|
_destTrigger = -1;
|
|
_triggerMode1 = _triggerMode2 = KT_DAEMON;
|
|
_val5 = 0;
|
|
_val6 = 0;
|
|
_meiLipsFlag = false;
|
|
_val8 = 0;
|
|
}
|
|
|
|
if (player_been_here(301)) {
|
|
hotspot_set_active("MEI CHEN", false);
|
|
hotspot_set_active("FENG LI", false);
|
|
hotspot_set_active("COVER", false);
|
|
}
|
|
|
|
if (_G(game).previous_room != 304) {
|
|
_door = series_show_sprite("DOOR", 0, 0xf05);
|
|
}
|
|
|
|
int32 status;
|
|
ScreenContext *game_buff_ptr = vmng_screen_find(_G(gameDrawBuff), &status);
|
|
assert(game_buff_ptr);
|
|
|
|
switch (_G(game).previous_room) {
|
|
case KERNEL_RESTORING_GAME:
|
|
if (!player_been_here(301)) {
|
|
kernel_load_variant(_fengFlag ? "303lock1" : "303lock2");
|
|
setFengActive(_fengFlag);
|
|
setupMei();
|
|
setShadow4(true);
|
|
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
|
|
loadFengLi();
|
|
|
|
if (_fengFlag) {
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
setShadow5(true);
|
|
} else {
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 706, 256, 86, 0xc00, false,
|
|
triggerMachineByHashCallback, "fl state machine");
|
|
setShadow5(false);
|
|
}
|
|
|
|
sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400, _feng4, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
}
|
|
|
|
playSeries();
|
|
break;
|
|
|
|
case 301:
|
|
MoveScreenDelta(game_buff_ptr, -641, 0);
|
|
playSeries();
|
|
|
|
kernel_timing_trigger(1, 9);
|
|
break;
|
|
|
|
case 304:
|
|
if (_G(flags)[V001]) {
|
|
_G(player).disable_hyperwalk = true;
|
|
LoadWSAssets("303 FL SCRIPT");
|
|
|
|
_G(camera_reacts_to_player) = true;
|
|
MoveScreenDelta(game_buff_ptr, -110, 0);
|
|
_val12 = KT_DAEMON;
|
|
|
|
player_set_commands_allowed(false);
|
|
playSeries(false);
|
|
|
|
_door = series_show_sprite("DOOR", 7, 0xf05);
|
|
ws_demand_location(393, 260, 5);
|
|
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
|
|
_fengLi = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
|
|
470, 226, 9, triggerMachineByHashCallback3000, "fl");
|
|
_fengFlag = true;
|
|
|
|
kernel_load_variant("303lock1");
|
|
setFengActive(true);
|
|
loadFengLi();
|
|
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS2, S3_NORMAL_NAMES2);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS2, S3_SHADOW_NAMES2);
|
|
|
|
_mei = triggerMachineByHash_3000(8, 3, *S3_NORMAL_DIRS2, *S3_SHADOW_DIRS2,
|
|
445, 215, 7, triggerMachineByHashCallback3000, "mc");
|
|
_gestTalk4 = series_load("mei ny lft hand gest talk pos4");
|
|
kernel_timing_trigger(1, 107);
|
|
|
|
} else {
|
|
player_set_commands_allowed(false);
|
|
kernel_timing_trigger(1, 10);
|
|
_door = series_show_sprite("DOOR", 7, 0xf05);
|
|
|
|
if (!player_been_here(301)) {
|
|
kernel_load_variant("303lock1");
|
|
setFengActive(true);
|
|
setupMei();
|
|
setShadow4(true);
|
|
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
|
|
loadFengLi();
|
|
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400,
|
|
_feng4, 1, 6, 0);
|
|
|
|
_fengMode = _fengShould = 1;
|
|
_fengFlag = true;
|
|
setShadow5(true);
|
|
}
|
|
|
|
playSeries();
|
|
}
|
|
break;
|
|
|
|
case 305:
|
|
player_set_commands_allowed(false);
|
|
ws_demand_location(28, 267, 3);
|
|
playSeries();
|
|
|
|
if (!player_been_here(301)) {
|
|
kernel_timing_trigger(1, 6);
|
|
setupMei();
|
|
setShadow4(true);
|
|
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
|
|
loadFengLi();
|
|
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400, _feng1, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
setShadow5(true);
|
|
_fengFlag = true;
|
|
|
|
kernel_load_variant("303lock1");
|
|
setFengActive(true);
|
|
} else {
|
|
kernel_timing_trigger(1, 6);
|
|
}
|
|
break;
|
|
|
|
case 309:
|
|
interface_show();
|
|
ws_demand_location(230, 258, 10);
|
|
player_set_commands_allowed(false);
|
|
|
|
if (!player_been_here(301)) {
|
|
setupMei();
|
|
setShadow4(true);
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
|
|
_fengFlag = true;
|
|
loadFengLi();
|
|
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400, _feng4, 1, 6, 0);
|
|
|
|
_fengMode = _fengShould = 1;
|
|
setShadow5(true);
|
|
kernel_load_variant("303lock1");
|
|
setFengActive(true);
|
|
}
|
|
|
|
playSeries();
|
|
|
|
if (player_been_here(301)) {
|
|
_ripBends = series_load("rip trek bends to viewer");
|
|
setGlobals1(_ripBends, 17, 17, 17, 17, 1, 17, 1, 1, 1, 1);
|
|
sendWSMessage_110000(3);
|
|
|
|
} else {
|
|
_ripBends = series_load("RIP BENDS TO SEE CREATURE");
|
|
setGlobals1(_ripBends, 26, 1, 1, 1);
|
|
sendWSMessage_110000(60);
|
|
}
|
|
break;
|
|
|
|
case 352:
|
|
player_set_commands_allowed(false);
|
|
interface_hide();
|
|
digi_preload("303r02");
|
|
digi_preload("303m02");
|
|
digi_preload("303f01");
|
|
|
|
AddSystemHotkey(KEY_ESCAPE, escapePressed);
|
|
_G(kernel).call_daemon_every_loop = true;
|
|
digi_stop(3);
|
|
|
|
series_plain_play("303cow1", -1, 0, 100, 0, 9);
|
|
series_show_sprite("doorknob relocation", 0, 0xf04);
|
|
series_load("303 final frame");
|
|
_machine2 = series_stream("EVERYTHING IN 303", 5, 17, 21);
|
|
series_stream_break_on_frame(_machine2, 3, 18);
|
|
|
|
MoveScreenDelta(game_buff_ptr, -320, 0);
|
|
break;
|
|
|
|
default:
|
|
_val12 = KT_PARSE;
|
|
kernel_load_variant("303lock1");
|
|
setFengActive(true);
|
|
ws_demand_location(145, 289, 3);
|
|
setupMei();
|
|
setShadow4(true);
|
|
|
|
ws_walk_load_walker_series(S3_NORMAL_DIRS, S3_NORMAL_NAMES);
|
|
ws_walk_load_shadow_series(S3_SHADOW_DIRS, S3_SHADOW_NAMES);
|
|
|
|
_fengFlag = true;
|
|
loadFengLi();
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400, _feng4, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
setShadow5(true);
|
|
|
|
playSeries();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Room303::daemon() {
|
|
int frame;
|
|
|
|
switch (_G(kernel).trigger) {
|
|
case 3:
|
|
sendWSMessage_120000(4);
|
|
break;
|
|
|
|
case 4:
|
|
sendWSMessage_150000(5);
|
|
break;
|
|
|
|
case 5:
|
|
case 61:
|
|
series_unload(_ripBends);
|
|
ws_demand_location(230, 258);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
case 6:
|
|
ws_walk(128, 267, nullptr, 75, 3);
|
|
break;
|
|
|
|
case 7:
|
|
priestTalk(true, -1);
|
|
setShadow5(true);
|
|
break;
|
|
|
|
case 8:
|
|
ws_walk(145, 289, nullptr, -1, 2);
|
|
kernel_timing_trigger(200, 38);
|
|
break;
|
|
|
|
case 9:
|
|
ws_demand_location(1350, 276, 9);
|
|
ws_walk(1208, 276, nullptr, 75, 9);
|
|
break;
|
|
|
|
case 10:
|
|
ws_demand_location(425, 227, 7);
|
|
ws_walk(399, 260, nullptr, 50, 7);
|
|
break;
|
|
|
|
case 18:
|
|
digi_play("303r02", 1);
|
|
series_stream_break_on_frame(_machine2, 20, 19);
|
|
break;
|
|
|
|
case 19:
|
|
digi_play("303m02", 1);
|
|
series_stream_break_on_frame(_machine2, 55, 20);
|
|
break;
|
|
|
|
case 20:
|
|
digi_play("303f01", 1);
|
|
series_stream_break_on_frame(_machine2, 77, 24);
|
|
break;
|
|
|
|
case 21:
|
|
series_plain_play("303 final frame", -1, 0, 100,
|
|
0x100, 3000);
|
|
disable_player_commands_and_fade_init(22);
|
|
break;
|
|
|
|
case 22:
|
|
digi_stop(1);
|
|
digi_stop(3);
|
|
adv_kill_digi_between_rooms(false);
|
|
_G(game).setRoom(354);
|
|
break;
|
|
|
|
case 24:
|
|
break;
|
|
|
|
case 38:
|
|
sendWSMessage_10000(_fengLi, 146, 270, 9, 39, 0);
|
|
break;
|
|
|
|
case 39:
|
|
sendWSMessage_10000(_fengLi, 480, 256, 7, 40, 1);
|
|
break;
|
|
|
|
case 40:
|
|
sendWSMessage_60000(_fengLi);
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400,
|
|
_feng4, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
setShadow5(true);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
case 50:
|
|
terminateMachineAndNull(_door);
|
|
digi_preload("950_s44");
|
|
series_plain_play("DOOR", 1, 2, 100, 0xf05, 10, 51);
|
|
break;
|
|
|
|
case 51:
|
|
digi_play("950_s44", 2, 200, 52);
|
|
_door = series_show_sprite("DOOR", 0, 0xf05);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
case 52:
|
|
digi_unload("950_s44");
|
|
break;
|
|
|
|
case 60:
|
|
sendWSMessage_150000(61);
|
|
break;
|
|
|
|
case 70:
|
|
kernel_timing_trigger(imath_ranged_rand(300, 600), 71);
|
|
break;
|
|
|
|
case 71:
|
|
series_plain_play("CREATURE FEATURE LONG VIEW", 1, 0,
|
|
100, 0xf05, 7, 70);
|
|
break;
|
|
|
|
case 75:
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
case 100:
|
|
digi_play("950_s01", 3);
|
|
kernel_timing_trigger(1020, 100);
|
|
break;
|
|
|
|
case 103:
|
|
sendWSMessage_10000(_fengLi, 414, 228, 9, 104, 0);
|
|
break;
|
|
|
|
case 104:
|
|
sendWSMessage_10000(_fengLi, 399, 256, 7, 105, 0);
|
|
break;
|
|
|
|
case 105:
|
|
terminateMachineAndNull(_door);
|
|
digi_preload("950_s44");
|
|
series_plain_play("DOOR", 1, 2, 100, 0xf05, 8, 156);
|
|
sendWSMessage_10000(_fengLi, 480, 256, 7, 106, 1);
|
|
break;
|
|
|
|
case 106:
|
|
sendWSMessage_60000(_fengLi);
|
|
priestTalk(true, -1);
|
|
setShadow5(true);
|
|
break;
|
|
|
|
case 107:
|
|
ws_walk(700, 305, nullptr, -1, 3);
|
|
sendWSMessage_10000(_mei, 393, 260, 9, 109, 0);
|
|
break;
|
|
|
|
case 109:
|
|
sendWSMessage_10000(_mei, 393, 260, 5, 110, 1);
|
|
break;
|
|
|
|
case 110:
|
|
setGlobals3(_gestTalk4, 1, 21);
|
|
sendWSMessage_F0000(_mei, 157);
|
|
digi_play("303m03", 1, 255, 143);
|
|
break;
|
|
|
|
case 111:
|
|
_chinTalk4 = series_load("suit hands out to side pos1");
|
|
_suitTalk1 = series_load("suit talk pos1");
|
|
setGlobals1(_chinTalk4, 1, 8, 8, 8);
|
|
sendWSMessage_110000(154);
|
|
digi_play("303r03", 1, 255, 116);
|
|
break;
|
|
|
|
case 116:
|
|
_gestTalk4 = series_load("mc ny hand out talk pos4");
|
|
sendWSMessage_10000(_mei, 357, 255, 4, 117, 1);
|
|
kernel_timing_trigger(60, 103);
|
|
series_unload(_suitTalk1);
|
|
series_unload(_chinTalk4);
|
|
ws_walk(700, 305, nullptr, -1, 3);
|
|
break;
|
|
|
|
case 117:
|
|
setGlobals1(_gestTalk4, 1, 9, 9, 9);
|
|
sendWSMessage_110000(_mei, 120);
|
|
kernel_timing_trigger(70, 118);
|
|
digi_play("303m04", 1, 255);
|
|
break;
|
|
|
|
case 118:
|
|
ws_walk(444, 295, nullptr, 119, 10);
|
|
break;
|
|
|
|
case 119:
|
|
_chinTalk4 = series_load("rip suit rt hand gest talk pos2");
|
|
setGlobals1(_chinTalk4, 1, 8, 8, 8);
|
|
|
|
_ctr1 = 0;
|
|
sendWSMessage_110000(121);
|
|
digi_play("303r04", 1, 255, 121);
|
|
break;
|
|
|
|
case 120:
|
|
sendWSMessage_140000(_mei, 159);
|
|
break;
|
|
|
|
case 121:
|
|
if (++_ctr1 == 2)
|
|
sendWSMessage_140000(122);
|
|
break;
|
|
|
|
case 122:
|
|
series_unload(_chinTalk4);
|
|
player_update_info();
|
|
ws_walk(_G(player_info).x + 1, _G(player_info).y - 1,
|
|
nullptr, 123, 1);
|
|
break;
|
|
|
|
case 123:
|
|
_chinTalk4 = series_load("suit talk pos1");
|
|
digi_play(_G(flags)[V084] == 2 ? "303r05" : "303r06",
|
|
1, 255, 138);
|
|
setGlobals1(_chinTalk4, 1, 5, 5, 5);
|
|
sendWSMessage_110000(144);
|
|
kernel_timing_trigger(200, 124);
|
|
break;
|
|
|
|
case 124:
|
|
_G(globals)[GLB_TEMP_1] = 0;
|
|
_G(globals)[GLB_TEMP_2] = (int)-1 & ~0xFFFF;
|
|
sendWSMessage(0x200000, 0, _priestTalk, 0, nullptr, 1);
|
|
break;
|
|
|
|
case 125:
|
|
_chinTalk4 = series_load("rip suit lft hand gest talk");
|
|
setGlobals4(_chinTalk4, 6, 6, 13);
|
|
sendWSMessage_C0000(_G(my_walker), 126);
|
|
break;
|
|
|
|
case 126:
|
|
digi_play("303r07", 1, 255, 150);
|
|
sendWSMessage_D0000(_G(my_walker));
|
|
break;
|
|
|
|
case 127:
|
|
ws_walk(_G(player_info).x + 50, _G(player_info).y + 10,
|
|
nullptr, -1, 10);
|
|
break;
|
|
|
|
case 129:
|
|
series_unload(_chinTalk4);
|
|
_chinTalk4 = series_load("rip suit rt hand gest talk pos2");
|
|
setGlobals1(_chinTalk4, 1, 5, 5, 5);
|
|
sendWSMessage_110000(130);
|
|
digi_play("303r08", 1, 255, 131);
|
|
break;
|
|
|
|
case 130:
|
|
sendWSMessage_140000(158);
|
|
break;
|
|
|
|
case 131:
|
|
_val12 = KT_DAEMON;
|
|
playSound("303f03", -1, 132);
|
|
break;
|
|
|
|
case 132:
|
|
ws_walk(565, 306, nullptr, 170, 10);
|
|
kernel_timing_trigger(60, 133);
|
|
break;
|
|
|
|
case 133:
|
|
playSound("303f04", 134, -1);
|
|
break;
|
|
|
|
case 134:
|
|
if (_newExhibitsFlag)
|
|
kernel_timing_trigger(1, 172);
|
|
else
|
|
kernel_timing_trigger(60, 134);
|
|
break;
|
|
|
|
case 136:
|
|
sendWSMessage_140000(137);
|
|
break;
|
|
|
|
case 137:
|
|
sendWSMessage_60000(_mei);
|
|
setupMei();
|
|
setShadow4(true);
|
|
_meiShould = 7;
|
|
kernel_timing_trigger(1, 160);
|
|
break;
|
|
|
|
case 138:
|
|
series_unload(_chinTalk4);
|
|
ws_walk(500, 300, nullptr, 125, 3);
|
|
break;
|
|
|
|
case 143:
|
|
player_update_info();
|
|
sendWSMessage_10000(_G(my_walker),
|
|
_G(player_info).x - 1, _G(player_info).y - 1,
|
|
10, 198, 0);
|
|
break;
|
|
|
|
case 144:
|
|
case 154:
|
|
sendWSMessage_140000(-1);
|
|
break;
|
|
|
|
case 147:
|
|
sendWSMessage_120000(148);
|
|
break;
|
|
|
|
case 148:
|
|
sendWSMessage_110000(-1);
|
|
break;
|
|
|
|
case 150:
|
|
sendWSMessage_B0000(_G(my_walker), 127);
|
|
playSound("303f02", -1, 129);
|
|
break;
|
|
|
|
case 156:
|
|
digi_play("950_s44", 1, 200, 52);
|
|
_door = series_show_sprite("DOOR", 0, 0xf05);
|
|
break;
|
|
|
|
case 157:
|
|
case 159:
|
|
series_unload(_gestTalk4);
|
|
break;
|
|
|
|
case 158:
|
|
series_unload(_chinTalk4);
|
|
break;
|
|
|
|
case 160:
|
|
series_unload(_chinTalk4);
|
|
series_unload(220);
|
|
series_unload(221);
|
|
series_unload(222);
|
|
series_plain_play("303cow1", -1, 0, 100, 0, 9);
|
|
|
|
_G(player).disable_hyperwalk = false;
|
|
_G(camera_reacts_to_player) = true;
|
|
_val12 = KT_PARSE;
|
|
_G(flags)[V001] = 0;
|
|
|
|
terminateMachineAndNull(_priestTalk);
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl");
|
|
sendWSMessage_10000(1, _fengLi, _feng4, 1, 1, 400,
|
|
_feng4, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
case 170:
|
|
_newExhibitsFlag = true;
|
|
break;
|
|
|
|
case 172:
|
|
_chinTalk4 = series_load("RIP HNDS HIPS GEST TALK");
|
|
setGlobals1(_chinTalk4, 1, 15, 15, 15, 0, 16, 25, 25, 25);
|
|
sendWSMessage_110000(-1);
|
|
kernel_timing_trigger(200, 147);
|
|
digi_play("303r09", 1, 255, 136);
|
|
break;
|
|
|
|
case 198:
|
|
ws_walk(444, 295, nullptr, 111, 11);
|
|
break;
|
|
|
|
case 200:
|
|
if (_meiMode == 0 && _meiShould == 0 && _destTrigger != -1) {
|
|
kernel_trigger_dispatchx(_destTrigger);
|
|
_destTrigger = -1;
|
|
|
|
if (_val5) {
|
|
ws_unhide_walker();
|
|
_val5 = 0;
|
|
}
|
|
}
|
|
|
|
kernel_trigger_dispatchx(kernel_trigger_create(201));
|
|
break;
|
|
|
|
case 201:
|
|
switch (_meiMode) {
|
|
case 0:
|
|
switch (_meiShould) {
|
|
case 0:
|
|
if (_meiLipsFlag) {
|
|
series_unload(_meiLips);
|
|
_meiLipsFlag = false;
|
|
}
|
|
|
|
if (_digiName1) {
|
|
digi_play(_digiName1, 1, 255, _val18);
|
|
_digiName1 = nullptr;
|
|
_triggerMode2 = KT_DAEMON;
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
}
|
|
|
|
++_val8;
|
|
if (imath_ranged_rand(7, 12) < _val8) {
|
|
_val8 = 0;
|
|
|
|
switch (imath_ranged_rand(1, 3)) {
|
|
case 1:
|
|
sendWSMessage_10000(1, _mei, _mei2, 1, 14, 200,
|
|
_mei2, 14, 14, 0);
|
|
_meiMode = _meiShould = 1;
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_10000(1, _mei, _mei1, 2, 9, 200,
|
|
_mei1, 9, 9, 0);
|
|
_meiMode = _meiShould = 1;
|
|
break;
|
|
|
|
case 3:
|
|
kernel_timing_trigger(60, 201);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
kernel_timing_trigger(60, 201);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
sendWSMessage_10000(1, _mei, _mei3, 1, 12, 200,
|
|
_mei3, 12, 12, 0);
|
|
_meiMode = 3;
|
|
break;
|
|
|
|
case 4:
|
|
case 5:
|
|
sendWSMessage_10000(1, _mei, _mei3, 17, 17, 200,
|
|
_mei3, 17, 17, 0);
|
|
_meiMode = 4;
|
|
break;
|
|
|
|
case 6:
|
|
sendWSMessage_10000(1, _mei, _meiLips, 1, 13, 200,
|
|
_meiLips, 13, 13, 0);
|
|
_meiMode = 6;
|
|
break;
|
|
|
|
case 7:
|
|
sendWSMessage_10000(1, _mei, _mei2, 1, 14, 200,
|
|
_mei2, 14, 14, 0);
|
|
_meiMode = _meiShould = 1;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
if (_meiShould == 1) {
|
|
++_val8;
|
|
if (imath_ranged_rand(7, 12) < _val8) {
|
|
_val8 = 0;
|
|
|
|
switch (imath_ranged_rand(1, 2)) {
|
|
case 1:
|
|
sendWSMessage_10000(1, _mei, _mei2, 14, 1, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = _meiShould = 0;
|
|
break;
|
|
|
|
case 2:
|
|
kernel_timing_trigger(60, 201);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
kernel_timing_trigger(60, 201);
|
|
}
|
|
} else {
|
|
sendWSMessage_10000(1, _mei, _mei2, 14, 1, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = 0;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (_meiShould == 2) {
|
|
++_val8;
|
|
if (imath_ranged_rand(7, 12) < _val8) {
|
|
_val8 = 0;
|
|
|
|
switch (imath_ranged_rand(1, 2)) {
|
|
case 1:
|
|
sendWSMessage_10000(1, _mei, _mei1, 9, 2, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = _meiShould = 0;
|
|
break;
|
|
|
|
case 2:
|
|
kernel_timing_trigger(60, 201);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
kernel_timing_trigger(60, 201);
|
|
}
|
|
break;
|
|
} else {
|
|
sendWSMessage_10000(1, _mei, _mei1, 9, 2, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = 0;
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if (_meiShould == 3) {
|
|
sendWSMessage_10000(1, _mei, _mei3, 13, 13, 200,
|
|
_mei3, 13, 16, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _mei, _mei3, 12, 1, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = 0;
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
switch (_meiShould) {
|
|
case 4:
|
|
sendWSMessage_10000(1, _mei, _mei3, 17, 17, 200,
|
|
_mei3, 17, 17, 0);
|
|
break;
|
|
|
|
case 5:
|
|
frame = imath_ranged_rand(17, 20);
|
|
sendWSMessage_10000(1, _mei, _mei3, frame, frame, 200,
|
|
_mei3, frame, frame, 0);
|
|
break;
|
|
|
|
default:
|
|
sendWSMessage_10000(1, _mei, _mei1, 1, 1, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = 0;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 6:
|
|
if (_meiShould == 6) {
|
|
frame = imath_ranged_rand(14, 16);
|
|
sendWSMessage_10000(1, _mei, _meiLips, frame, frame, 200,
|
|
_meiLips, frame, frame, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _mei, _meiLips, 17, 24, 200,
|
|
_mei1, 1, 1, 0);
|
|
_meiMode = 0;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 300:
|
|
if (_ripleyMode == 0 && _ripleyShould == 0 && _destTrigger != -1) {
|
|
kernel_trigger_dispatchx(_destTrigger);
|
|
_destTrigger = -1;
|
|
|
|
if (_val5) {
|
|
ws_unhide_walker();
|
|
_val5 = 0;
|
|
}
|
|
}
|
|
|
|
kernel_trigger_dispatchx(kernel_trigger_create(301));
|
|
break;
|
|
|
|
case 301:
|
|
switch (_ripleyMode) {
|
|
case 0:
|
|
switch (_ripleyShould) {
|
|
case 0:
|
|
if (_digiName1) {
|
|
digi_play(_digiName1, 1, 255, _val18);
|
|
_digiName1 = nullptr;
|
|
_triggerMode2 = KT_DAEMON;
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
}
|
|
|
|
sendWSMessage_10000(1, _ripley, 1, 1, 1, 300, 1, 1, 1, 0);
|
|
break;
|
|
|
|
case 1:
|
|
sendWSMessage_10000(1, _ripley, _suit2, 1, 10, 300, _suit2, 10, 10, 0);
|
|
_ripleyMode = 1;
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_10000(1, _ripley, _suit1, 1, 17, 300,
|
|
_suit1, 17, 17, 0);
|
|
_ripleyMode = 2;
|
|
break;
|
|
|
|
case 3:
|
|
case 4:
|
|
sendWSMessage_10000(1, _ripley, _ripGesture, 1, 14, 300,
|
|
_ripGesture, 1, 14, 0);
|
|
_ripleyMode = 3;
|
|
break;
|
|
|
|
case 5:
|
|
terminateMachineAndNull(_ripley);
|
|
terminateMachineAndNull(_ripsh2);
|
|
ws_unhide_walker();
|
|
series_unload(_suit1);
|
|
series_unload(_suit2);
|
|
series_unload(_ripGesture);
|
|
player_set_commands_allowed(true);
|
|
return;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
if (_ripleyShould == 1) {
|
|
sendWSMessage_10000(1, _ripley, _suit2, 10, 10, 300,
|
|
_suit2, 10, 10, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _ripley, _suit2, 11, 18, 300, 1, 1, 1, 0);
|
|
_ripleyMode = 0;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (_ripleyShould == 2) {
|
|
sendWSMessage_10000(1, _ripley, _suit1, 17, 17, 300,
|
|
_suit1, 17, 17, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _ripley, _suit1, 17, 1, 300, 1, 1, 1, 0);
|
|
_ripleyMode = 0;
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
switch (_ripleyShould) {
|
|
case 3:
|
|
sendWSMessage_10000(1, _ripley, _ripGesture, 14, 14, 300,
|
|
_ripGesture, 14, 14, 0);
|
|
break;
|
|
case 4:
|
|
sendWSMessage_10000(1, _ripley, _ripGesture, 15, 25, 300,
|
|
_ripGesture, 25, 25, 0);
|
|
_ripleyMode = 4;
|
|
break;
|
|
default:
|
|
sendWSMessage_10000(1, _ripley, _ripGesture, 14,
|
|
1, 300, 1, 1, 1, 0);
|
|
_ripleyMode = 0;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
if (_ripleyShould == 4) {
|
|
sendWSMessage_10000(1, _ripley, _ripGesture, 25, 25, 300,
|
|
_ripGesture, 25, 25, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _ripley, _ripGesture, 25, 15, 300,
|
|
_ripGesture, 14, 14, 0);
|
|
_ripleyMode = 3;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 400:
|
|
if (_fengMode == 0 && _fengShould == 0 && _destTrigger != -1) {
|
|
kernel_trigger_dispatchx(_destTrigger);
|
|
_destTrigger = -1;
|
|
|
|
if (_val5) {
|
|
ws_unhide_walker();
|
|
_val5 = 0;
|
|
}
|
|
}
|
|
|
|
kernel_trigger_dispatchx(kernel_trigger_create(401));
|
|
break;
|
|
|
|
case 401:
|
|
switch (_fengMode) {
|
|
case 0:
|
|
switch (_fengShould) {
|
|
case 0:
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 1, 1, 400,
|
|
_feng1, 1, 1, 0);
|
|
break;
|
|
|
|
case 1:
|
|
case 2:
|
|
case 4:
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400,
|
|
_feng4, 1, 6, 1);
|
|
_fengMode = 1;
|
|
break;
|
|
|
|
case 3:
|
|
sendWSMessage_10000(1, _fengLi, _feng2, 1, 13, 400,
|
|
_feng2, 14, 19, 1);
|
|
_fengMode = 3;
|
|
break;
|
|
|
|
case 5:
|
|
terminateMachineAndNull(_fengLi);
|
|
|
|
if (_fengFlag)
|
|
_fengLi = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
|
|
480, 256, 7, triggerMachineByHashCallback3000, "fl walker");
|
|
else
|
|
_fengLi = triggerMachineByHash_3000(8, 2, *S3_NORMAL_DIRS, *S3_SHADOW_DIRS,
|
|
706, 256, 5, triggerMachineByHashCallback3000, "fl walker");
|
|
|
|
_G(kernel).trigger_mode = KT_PARSE;
|
|
kernel_timing_trigger(1, 1);
|
|
return;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
switch (_fengShould) {
|
|
case 0:
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 16, 1, 400,
|
|
_feng1, 1, 1, 0);
|
|
_fengMode = 0;
|
|
break;
|
|
|
|
case 1:
|
|
frame = imath_ranged_rand(1, 6);
|
|
sendWSMessage_10000(1, _fengLi, _feng4, frame, frame, 400,
|
|
_feng4, frame, frame, 0);
|
|
break;
|
|
|
|
case 3:
|
|
case 5:
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 16, 1, 400,
|
|
_feng2, 1, 1, 0);
|
|
_fengMode = 0;
|
|
break;
|
|
|
|
case 4:
|
|
frame = imath_ranged_rand(1, 6);
|
|
sendWSMessage_10000(1, _fengLi, _feng4, frame, frame, 400,
|
|
_feng4, frame, frame, 0);
|
|
player_set_commands_allowed(true);
|
|
_fengShould = 1;
|
|
break;
|
|
|
|
default:
|
|
sendWSMessage_10000(1, _fengLi, _feng3, 1, 18, 400,
|
|
_feng3, 19, 21, 1);
|
|
_fengMode = 2;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if (_fengShould == 2) {
|
|
frame = imath_ranged_rand(19, 21);
|
|
sendWSMessage_10000(1, _fengLi, _feng3, frame, frame, 400,
|
|
_feng3, frame, frame, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _fengLi, _feng3, 18, 1, 400,
|
|
_feng4, 1, 6, 0);
|
|
_fengMode = 1;
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if (_fengShould == 3) {
|
|
frame = imath_ranged_rand(14, 19);
|
|
sendWSMessage_10000(1, _fengLi, _feng2, frame, frame, 400,
|
|
_feng2, frame, frame, 0);
|
|
} else {
|
|
sendWSMessage_10000(1, _fengLi, _feng2, 20, 31, 400,
|
|
_feng2, 1, 1, 0);
|
|
_fengMode = 0;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (_G(game).previous_room == 352) {
|
|
switch (_G(kernel).trigger) {
|
|
case 55:
|
|
_G(game).setRoom(304);
|
|
break;
|
|
case 56:
|
|
_G(game).setRoom(494);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (_G(MouseState).ButtonState) {
|
|
_G(room303_btnFlag) = true;
|
|
} else if (_G(room303_btnFlag)) {
|
|
_G(room303_btnFlag) = false;
|
|
|
|
disable_player_commands_and_fade_init(55);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Room303::pre_parser() {
|
|
if (player_said("open") && player_been_here(301)) {
|
|
_G(player).need_to_walk = false;
|
|
_G(player).ready_to_walk = true;
|
|
_G(player).waiting_for_walk = false;
|
|
}
|
|
}
|
|
|
|
void Room303::parser() {
|
|
const bool lookFlag = player_said_any("look", "look at");
|
|
|
|
if (player_said("conv303b")) {
|
|
conv303b();
|
|
} else if (player_said("conv303a")) {
|
|
conv303a();
|
|
} else if (lookFlag && _G(flags)[V000] == 0 && _fengFlag &&
|
|
player_said_any("cow", "giant matchstick")) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
_fengShould = 5;
|
|
player_set_commands_allowed(false);
|
|
break;
|
|
|
|
case 1:
|
|
setShadow5(false);
|
|
if (player_said("giant matchstick"))
|
|
ws_demand_location(_fengLi, 610, 256);
|
|
|
|
sendWSMessage_10000(_fengLi, 706, 256, 5, 2, 1);
|
|
break;
|
|
|
|
case 2:
|
|
setShadow5Alt(true);
|
|
sendWSMessage_60000(_fengLi);
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 706, 256, 86, 0xc00, false,
|
|
triggerMachineByHashCallback, "fl state machine");
|
|
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400,
|
|
_feng4, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
setFengActive(false);
|
|
_fengFlag = false;
|
|
|
|
kernel_load_variant("303lock2");
|
|
_G(kernel).trigger_mode = KT_PARSE;
|
|
kernel_timing_trigger(1, 666);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (lookFlag && player_said("torso tomato") &&
|
|
!_G(flags)[V081] && !_G(flags)[V000] && !_fengFlag) {
|
|
switch (_G(kernel).trigger) {
|
|
case 1:
|
|
setShadow5Alt(false);
|
|
sendWSMessage_10000(_fengLi, 480, 256, 7, 2, 1);
|
|
break;
|
|
|
|
case 2:
|
|
setShadow5(true);
|
|
sendWSMessage_60000(_fengLi);
|
|
_fengLi = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 480, 256, 86, 0xc00, true,
|
|
triggerMachineByHashCallback, "fl state machine");
|
|
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
sendWSMessage_10000(1, _fengLi, _feng1, 1, 16, 400,
|
|
_feng4, 1, 6, 0);
|
|
_fengMode = _fengShould = 1;
|
|
setFengActive(true);
|
|
_fengFlag = true;
|
|
|
|
kernel_load_variant("303lock1");
|
|
_G(kernel).trigger_mode = KT_PARSE;
|
|
kernel_timing_trigger(1, 666);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (lookFlag && player_said("puffball")) {
|
|
if (_G(flags)[V000] == 1) {
|
|
digi_play("303r37", 1);
|
|
} else if (_G(flags)[V080]) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("suit chin in hand pos4");
|
|
setGlobals4(_chinTalk4, 15, 15, 15);
|
|
sendWSMessage_C0000(_G(my_walker), 0);
|
|
digi_play("303r37", 1, 255, 2);
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_B0000(_G(my_walker), 3);
|
|
break;
|
|
|
|
case 3:
|
|
series_unload(_chinTalk4);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("rip hand to chin talk pos4");
|
|
setGlobals4(_chinTalk4, 15, 16, 19);
|
|
sendWSMessage_C0000(_G(my_walker), 0);
|
|
digi_play("303F13", 1, 255, 1);
|
|
_fengShould = 2;
|
|
break;
|
|
|
|
case 1:
|
|
_fengShould = 1;
|
|
kernel_timing_trigger(30, 2);
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_D0000(_G(my_walker));
|
|
digi_play("303r26", 1, 255, 3, -1);
|
|
break;
|
|
|
|
case 3:
|
|
sendWSMessage_E0000(_G(my_walker));
|
|
sendWSMessage(0xe0000, 0, _G(my_walker), 0, nullptr, 1);
|
|
kernel_timing_trigger(30, 4);
|
|
break;
|
|
|
|
case 4:
|
|
digi_play("303F14", 1, 255, 5);
|
|
_fengShould = 2;
|
|
break;
|
|
|
|
case 5:
|
|
_fengShould = 1;
|
|
kernel_timing_trigger(30, 6);
|
|
break;
|
|
|
|
case 6:
|
|
sendWSMessage_D0000(_G(my_walker));
|
|
digi_play("303r27", 1, 255, 7);
|
|
break;
|
|
|
|
case 7:
|
|
sendWSMessage_B0000(_G(my_walker), 8);
|
|
break;
|
|
|
|
case 8:
|
|
series_unload(_chinTalk4);
|
|
player_set_commands_allowed(true);
|
|
_G(flags)[V080] = 1;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (lookFlag && player_said("copper tank") &&
|
|
(_G(flags)[V000] == 1 || _fengFlag)) {
|
|
if (_G(flags)[V000] == 1) {
|
|
digi_play("303r31", 1);
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("suit hand in pocket pos2");
|
|
setGlobals4(_chinTalk4, 19, 19, 19);
|
|
sendWSMessage_C0000(_G(my_walker), 0);
|
|
digi_play("303r31", 1, 255, 2);
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_B0000(_G(my_walker), 3);
|
|
break;
|
|
|
|
case 3:
|
|
series_unload(_chinTalk4);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (lookFlag && player_said("torso tomato")) {
|
|
if (_G(flags)[V000] == 1) {
|
|
digi_play("303r28a", 1);
|
|
} else if (_G(flags)[V081]) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("suit chin in hand pos4");
|
|
setGlobals4(_chinTalk4, 15, 15, 15);
|
|
sendWSMessage_C0000(_G(my_walker), -2);
|
|
digi_play("303r28a", 1, 255, 1);
|
|
break;
|
|
|
|
case 1:
|
|
sendWSMessage_B0000(_G(my_walker), 3);
|
|
break;
|
|
|
|
case 3:
|
|
series_unload(_chinTalk4);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("rip suit talker pos4");
|
|
setGlobals4(_chinTalk4, 1, 1, 5);
|
|
sendWSMessage_C0000(_G(my_walker), -1);
|
|
digi_play("303F15", 1, 255, 1);
|
|
_fengMode = 2;
|
|
break;
|
|
|
|
case 1:
|
|
_fengMode = 1;
|
|
kernel_timing_trigger(30, 2);
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_D0000(_G(my_walker));
|
|
digi_play("303r28", 1, 255, 3);
|
|
break;
|
|
|
|
case 3:
|
|
sendWSMessage_B0000(_G(my_walker), 4);
|
|
break;
|
|
|
|
case 4:
|
|
series_unload(_chinTalk4);
|
|
player_set_commands_allowed(true);
|
|
_G(flags)[V081] = 1;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (lookFlag && player_said("cow")) {
|
|
if (_G(flags)[V086] == 2) {
|
|
_G(flags)[V086] = 1;
|
|
} else if (_G(flags)[V086] == 3) {
|
|
_G(flags)[V086] = 0;
|
|
}
|
|
|
|
if (_G(flags)[V000] == 1) {
|
|
digi_play("303r23", 1);
|
|
} else if (_G(flags)[V082]) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
digi_play("303F09", 1, 255, 1);
|
|
_fengShould = 2;
|
|
break;
|
|
|
|
case 1:
|
|
_fengShould = 1;
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("rip hand to chin talk pos4");
|
|
setGlobals4(_chinTalk4, 15, 16, 19);
|
|
sendWSMessage_C0000(_G(my_walker), 0);
|
|
digi_play("303F10", 1, 255, 6);
|
|
_fengShould = 2;
|
|
break;
|
|
|
|
case 1:
|
|
digi_play("303r24", 1, 255, 3);
|
|
sendWSMessage_D0000(_G(my_walker));
|
|
_fengShould = 0;
|
|
break;
|
|
|
|
case 3:
|
|
kernel_timing_trigger(30, 4);
|
|
break;
|
|
|
|
case 4:
|
|
sendWSMessage_B0000(_G(my_walker), 7);
|
|
_fengShould = 3;
|
|
digi_play("303f11", 1, 255, 5);
|
|
break;
|
|
|
|
case 5:
|
|
_fengShould = 1;
|
|
player_set_commands_allowed(true);
|
|
_G(flags)[V082] = 1;
|
|
break;
|
|
|
|
case 6:
|
|
_fengShould = 1;
|
|
kernel_timing_trigger(30, 1);
|
|
break;
|
|
|
|
case 7:
|
|
series_unload(_chinTalk4);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (lookFlag && player_said("giant matchstick")) {
|
|
if (_G(flags)[V000] == 1) {
|
|
digi_play("303r36", 1);
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
case 666:
|
|
player_set_commands_allowed(false);
|
|
_chinTalk4 = series_load("rip suit talker pos4");
|
|
setGlobals4(_chinTalk4, 1, 1, 5);
|
|
sendWSMessage_C0000(_G(my_walker), 1);
|
|
break;
|
|
|
|
case 1:
|
|
kernel_timing_trigger(10, 2, nullptr);
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_D0000(_G(my_walker));
|
|
digi_play("303r25", 1, 255, 3);
|
|
break;
|
|
|
|
case 3:
|
|
digi_play("303F12", 1, 255, 4);
|
|
_fengShould = 2;
|
|
sendWSMessage_B0000(_G(my_walker), 0);
|
|
break;
|
|
|
|
case 4:
|
|
_fengShould = 1;
|
|
series_unload(_chinTalk4);
|
|
player_set_commands_allowed(true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (player_said("open")) {
|
|
if (player_been_here(301)) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
ws_walk(_G(my_walker),409, 266, nullptr, 1, 1, true);
|
|
break;
|
|
|
|
case 1:
|
|
player_set_commands_allowed(false);
|
|
_med1 = series_load("RIP TREK MED REACH HAND POS1");
|
|
setGlobals1(_med1, 1, 10, 10, 10, 1);
|
|
sendWSMessage_110000(_G(my_walker), 2);
|
|
break;
|
|
|
|
case 2:
|
|
sendWSMessage_140000(4);
|
|
terminateMachineAndNull(_door);
|
|
series_plain_play("DOOR", 1, 0, 100, 0xf05, 7, 3, false);
|
|
digi_play("303_s01", 1);
|
|
break;
|
|
|
|
case 3:
|
|
series_show_sprite("DOOR", 7, 0xf05);
|
|
break;
|
|
|
|
case 4:
|
|
ws_walk(_G(my_walker), 417, 232, nullptr, -1, 2, true);
|
|
disable_player_commands_and_fade_init(5);
|
|
break;
|
|
|
|
case 5:
|
|
_G(game).setRoom(304);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
player_set_commands_allowed(false);
|
|
player_update_info();
|
|
ws_hide_walker();
|
|
_ripsh1 = series_place_sprite("ripsh1", 0,
|
|
_G(player_info).x, _G(player_info).y, _G(player_info).scale,
|
|
_G(player_info).depth + 1);
|
|
_med1 = series_load("SUIT DOOR OPENER POS1");
|
|
|
|
series_play_xy("SUIT DOOR OPENER POS1", 1, 0, 405, 266,
|
|
_G(player_info).scale, _G(player_info).depth, 7, 1);
|
|
break;
|
|
|
|
case 1:
|
|
terminateMachine(_door);
|
|
series_plain_play("DOOR", 1, 0, 100, 3845, 7, 2, false);
|
|
digi_play("303_s01", 1, 255, -1, -1);
|
|
_med1 = series_load("SUIT DOOR OPENER POS1", -1, nullptr);
|
|
series_play_xy("SUIT DOOR OPENER POS1", 1, 2, _G(player_info).x, _G(player_info).y, _G(player_info).scale, _G(player_info).depth, 7, 3);
|
|
break;
|
|
|
|
case 2:
|
|
series_show_sprite("DOOR", 7, 0xf05);
|
|
break;
|
|
|
|
case 3:
|
|
ws_unhide_walker();
|
|
terminateMachineAndNull(_ripsh1);
|
|
kernel_timing_trigger(10, 4);
|
|
break;
|
|
|
|
case 4:
|
|
ws_walk(417, 232, nullptr, -1, 2, true);
|
|
disable_player_commands_and_fade_init(6);
|
|
break;
|
|
|
|
case 6:
|
|
digi_stop(3);
|
|
_G(game).setRoom(304);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (lookFlag && player_said("cobra case")) {
|
|
digi_play(player_been_here(201) ? "303r38" : "303r32", 1);
|
|
} else if ((lookFlag || player_said("peer into")) &&
|
|
player_said("copper tank viewer")) {
|
|
if (player_been_here(301)) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
player_set_commands_allowed(false);
|
|
_ripBends = series_load("rip trek bends to viewer");
|
|
setGlobals1(_ripBends, 1, 17, 17, 17, 1);
|
|
sendWSMessage_110000(-1);
|
|
disable_player_commands_and_fade_init(1);
|
|
break;
|
|
|
|
case 1:
|
|
_G(game).setRoom(309);
|
|
interface_hide();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
player_set_commands_allowed(false);
|
|
_ripBends = series_load("RIP BENDS TO SEE CREATURE");
|
|
setGlobals1(_ripBends, 1, 26, 26, 26);
|
|
sendWSMessage_110000(1);
|
|
break;
|
|
|
|
case 1:
|
|
disable_player_commands_and_fade_init(2);
|
|
break;
|
|
|
|
case 2:
|
|
_G(game).setRoom(309);
|
|
interface_hide();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (player_said("TALK MEI CHEN")) {
|
|
player_set_commands_allowed(false);
|
|
_suit1 = series_load("SUIT CHIN IN HAND POS2");
|
|
_suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
|
|
_meiLips = series_load("MEI PUTS FINGER TO LIPS");
|
|
_ripGesture = series_load("RIP HNDS HIPS GEST TALK");
|
|
player_update_info();
|
|
ws_hide_walker();
|
|
|
|
_ripsh2 = series_show("ripsh2", 0xf00, 128, -1, -1, 0,
|
|
_G(player_info).scale, _G(player_info).x, _G(player_info).y);
|
|
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
|
|
_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
|
|
0x500, true, triggerMachineByHashCallback, "rip");
|
|
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
sendWSMessage_10000(1, _ripley, 1, 1, 1, 300, 1, 1, 1, 0);
|
|
|
|
_ripleyMode = _ripleyShould = 0;
|
|
_G(kernel).trigger_mode = KT_PARSE;
|
|
|
|
conv_load("conv303b", 10, 10, 747);
|
|
conv_play(conv_get_handle());
|
|
_meiShould = 4;
|
|
_ripleyShould = 0;
|
|
|
|
} else if (_G(kernel).trigger == 747) {
|
|
midi_fade_volume(0, 120);
|
|
kernel_timing_trigger(120, 749);
|
|
_lonelyFlag = false;
|
|
_meiLipsFlag = true;
|
|
_meiShould = 0;
|
|
_ripleyShould = 5;
|
|
|
|
} else if (_G(kernel).trigger == 749) {
|
|
midi_stop();
|
|
|
|
} else if (player_said("TALK FL")) {
|
|
_suit1 = series_load("SUIT CHIN IN HAND POS2");
|
|
_suit2 = series_load("RIP SUIT RT HAND GEST TALK POS2");
|
|
_ripGesture = series_load("RIP HNDS HIPS GEST TALK");
|
|
player_update_info();
|
|
ws_hide_walker();
|
|
|
|
if (_fengFlag) {
|
|
_ripsh2 = series_show("ripsh2", 0xf00, 0, -1, -1, 0,
|
|
_G(player_info).scale, _G(player_info).x, _G(player_info).y);
|
|
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
|
|
_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
|
|
0x500, false, triggerMachineByHashCallback, "rip");
|
|
|
|
} else {
|
|
_ripsh2 = series_show("ripsh2", 0xf00, 128, -1, -1, 0,
|
|
_G(player_info).scale, _G(player_info).x, _G(player_info).y);
|
|
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
|
|
_G(player_info).x, _G(player_info).y, _G(player_info).scale + 1,
|
|
0x500, true, triggerMachineByHashCallback, "rip");
|
|
}
|
|
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
sendWSMessage_10000(1, _ripley, 1, 1, 1, 300, 1, 1, 1, 0);
|
|
_ripleyShould = _ripleyMode = 0;
|
|
|
|
_G(kernel).trigger_mode = KT_PARSE;
|
|
player_set_commands_allowed(false);
|
|
conv_load("conv303a", 10, 10, 748);
|
|
|
|
conv_export_value(conv_get_handle(), _G(flags)[V086], 0);
|
|
conv_play();
|
|
_fengShould = 1;
|
|
_ripleyShould = 0;
|
|
|
|
} else if (_G(kernel).trigger == 748) {
|
|
_G(flags)[V082] = 1;
|
|
_G(flags)[V083] = 1;
|
|
midi_fade_volume(0, 120);
|
|
kernel_timing_trigger(120, 749);
|
|
_lonelyFlag = false;
|
|
_fengShould = 4;
|
|
_ripleyShould = 5;
|
|
|
|
} else if (player_said("exit left")) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
player_set_commands_allowed(false);
|
|
disable_player_commands_and_fade_init(1);
|
|
break;
|
|
|
|
case 1:
|
|
digi_stop(3);
|
|
_G(game).setRoom(305);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (lookFlag && _G(walker).ripley_said(SAID)) {
|
|
// Already handled
|
|
} else if (player_said("exit right")) {
|
|
switch (_G(kernel).trigger) {
|
|
case -1:
|
|
player_set_commands_allowed(false);
|
|
disable_player_commands_and_fade_init(1);
|
|
break;
|
|
|
|
case 1:
|
|
digi_stop(3);
|
|
_G(game).setRoom(301);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
_G(player).command_ready = false;
|
|
}
|
|
|
|
void Room303::setupMei() {
|
|
_mei1 = series_load("MC NY hands behind back pos4");
|
|
_mei2 = series_load("MC NY hand on hip pos4");
|
|
_mei3 = series_load("MC NY hand out talk pos4");
|
|
_mei = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 357, 255, 86, 0xf00, false,
|
|
triggerMachineByHashCallback, "mc");
|
|
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
sendWSMessage_10000(1, _mei, _mei1, 1, 1, 200, _mei1, 1, 1, 0);
|
|
_meiMode = _meiShould = 0;
|
|
}
|
|
|
|
void Room303::loadFengLi() {
|
|
_feng1 = series_load("hands clasped pos5");
|
|
_feng2 = series_load("shrug head shake pos5");
|
|
_feng3 = series_load("hands clasped bow pos5");
|
|
_feng4 = series_load("hands clasped flame loop pos5");
|
|
}
|
|
|
|
void Room303::setFengActive(bool flag) {
|
|
for (HotSpotRec *hotspot = _G(currentSceneDef).hotspots;
|
|
hotspot; hotspot = hotspot->next) {
|
|
if (!strcmp(hotspot->vocab, "FENG LI")) {
|
|
if (flag) {
|
|
hotspot->active = hotspot->lr_x < 600;
|
|
} else {
|
|
hotspot->active = hotspot->lr_x > 600;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Room303::setShadow4(bool active) {
|
|
if (active) {
|
|
_shadow4 = series_place_sprite("candleman shadow4", 0, 360, 252, -86, 0xe06);
|
|
} else {
|
|
terminateMachineAndNull(_shadow4);
|
|
}
|
|
}
|
|
|
|
void Room303::setShadow5(bool active) {
|
|
if (active) {
|
|
_shadow5 = series_place_sprite("candleman shadow5", 0, 480, 256, -84, 0xe06);
|
|
} else {
|
|
terminateMachineAndNull(_shadow5);
|
|
}
|
|
}
|
|
|
|
void Room303::setShadow5Alt(bool active) {
|
|
if (active) {
|
|
_shadow5 = series_place_sprite("candleman shadow5", 0, 706, 256, 84, 0xe06);
|
|
} else {
|
|
terminateMachineAndNull(_shadow5);
|
|
}
|
|
}
|
|
|
|
void Room303::escapePressed(void *, void *) {
|
|
_G(kernel).trigger_mode = KT_DAEMON;
|
|
disable_player_commands_and_fade_init(56);
|
|
}
|
|
|
|
void Room303::playSeries(bool cow) {
|
|
series_plain_play("SPINNING TOMATO MAN", -1, 0, 100, 0, 7);
|
|
series_plain_play("PUFFBALL", -1, 0, 100, 0, 8);
|
|
series_plain_play("CREATURE FEATURE LONG VIEW", 1, 0, 100, 0xf05, 7, 70);
|
|
if (cow)
|
|
series_plain_play("303cow1", -1, 0, 100, 0, 9);
|
|
}
|
|
|
|
void Room303::conv303a() {
|
|
const int who = conv_whos_talking();
|
|
const int node = conv_current_node();
|
|
const int entry = conv_current_entry();
|
|
const char *sound = conv_sound_to_play();
|
|
|
|
if (_G(kernel).trigger == 1) {
|
|
if (who <= 0) {
|
|
_fengShould = node != 3 || entry ? 1 : 0;
|
|
|
|
} else if (who == 1) {
|
|
if ((node == 0 && entry != 0) || (node == 0 && entry == 1)) {
|
|
if (!_lonelyFlag) {
|
|
midi_play("ppstreet", 140, true, -1, 949);
|
|
}
|
|
}
|
|
|
|
if (node != 1 || entry != 1) {
|
|
if (node != 3 || entry != 1)
|
|
_ripleyShould = 0;
|
|
} else {
|
|
_ripleyShould = 3;
|
|
}
|
|
}
|
|
|
|
conv_resume();
|
|
|
|
} else if (!conv_sound_to_play()) {
|
|
conv_resume();
|
|
|
|
} else {
|
|
if (who <= 0) {
|
|
if (node == 3 && !entry)
|
|
_ripleyShould = 2;
|
|
if ((node != 3 || entry != 1) && (node != 3 || entry))
|
|
_fengShould = 2;
|
|
else
|
|
_fengShould = 3;
|
|
|
|
} else if (who == 1) {
|
|
if (node != 1 || entry != 1) {
|
|
if (node != 5 || entry) {
|
|
if (node != 3 || entry != 1)
|
|
_ripleyShould = 1;
|
|
} else {
|
|
_ripleyShould = 0;
|
|
}
|
|
} else {
|
|
_ripleyShould = 4;
|
|
}
|
|
}
|
|
|
|
digi_play(sound, 1, 255, 1);
|
|
}
|
|
}
|
|
|
|
// Conversation with Mei
|
|
void Room303::conv303b() {
|
|
const int who = conv_whos_talking();
|
|
const int node = conv_current_node();
|
|
const int entry = conv_current_entry();
|
|
const char *sound = conv_sound_to_play();
|
|
|
|
switch (_G(kernel).trigger) {
|
|
case 1:
|
|
if (who <= 0) {
|
|
_meiShould = 4;
|
|
|
|
if (node == 1 && entry == 0) {
|
|
digi_unload("08_01n01");
|
|
digi_unload("08_02n01");
|
|
} else if (node == 2 && entry == 2) {
|
|
_ripleyShould = 0;
|
|
} else if (node == 1 && entry == 2) {
|
|
digi_preload("com119");
|
|
_ripPonders = series_stream("303 rip reacts", 4, 0, 667);
|
|
series_stream_break_on_frame(_ripPonders, 5, 7);
|
|
return;
|
|
}
|
|
|
|
} else if (who == 1) {
|
|
if ((node == 0 && entry == 0) || (node == 0 && entry == 1)) {
|
|
if (!_lonelyFlag) {
|
|
midi_play("lonelyme", 140, true, -1, 949);
|
|
_lonelyFlag = true;
|
|
}
|
|
}
|
|
|
|
if (node == 0 && entry == 0) {
|
|
series_unload(2);
|
|
series_unload(3);
|
|
series_unload(4);
|
|
_ripPonders = series_stream("303pu01", 4, 0x100, 666);
|
|
series_stream_break_on_frame(_ripPonders, 5, 700);
|
|
return;
|
|
}
|
|
|
|
if (node == 1 && entry == 2) {
|
|
// No implementation
|
|
} else if ((node == 2 && entry == 0) || (node == 2 && entry == 2)) {
|
|
_ripleyShould = 3;
|
|
} else {
|
|
_ripleyShould = 0;
|
|
}
|
|
}
|
|
|
|
conv_resume();
|
|
break;
|
|
|
|
case 2:
|
|
series_set_frame_rate(_ripPonders, 20);
|
|
series_stream_break_on_frame(_ripPonders, 27, 3);
|
|
break;
|
|
|
|
case 3:
|
|
series_set_frame_rate(_ripPonders, 5);
|
|
break;
|
|
|
|
case 4:
|
|
_meiShould = 5;
|
|
break;
|
|
|
|
case 5:
|
|
digi_play("com119", 1, 255, 6);
|
|
break;
|
|
|
|
case 6:
|
|
digi_unload("com119");
|
|
break;
|
|
|
|
case 7:
|
|
_ripleyShould = 0;
|
|
series_stream_break_on_frame(_ripPonders, 22, 5);
|
|
break;
|
|
|
|
case 666:
|
|
kernel_timing_trigger(1, 668);
|
|
break;
|
|
|
|
case 667:
|
|
kernel_timing_trigger(1, 670);
|
|
break;
|
|
|
|
case 668:
|
|
conv_resume();
|
|
digi_preload("08_01n01");
|
|
digi_preload("08_02n01");
|
|
_ripPonders = series_stream("303 rip ponders", 5, 0, -1);
|
|
series_stream_break_on_frame(_ripPonders, 5, 2);
|
|
break;
|
|
|
|
case 670:
|
|
series_load("test1");
|
|
series_load("test3");
|
|
series_load("test4");
|
|
series_load("test5");
|
|
conv_resume();
|
|
break;
|
|
|
|
case 700:
|
|
_ripleyShould = 0;
|
|
break;
|
|
|
|
default:
|
|
if (sound) {
|
|
if (who <= 0) {
|
|
if (node != 2 || entry != 1)
|
|
_meiShould = 5;
|
|
} else if (who == 1) {
|
|
if (node == 1 && entry == 2) {
|
|
_ripleyShould = 2;
|
|
} else if (node == 2 && entry == 1) {
|
|
_meiShould = 6;
|
|
kernel_timing_trigger(150, 4);
|
|
} else if ((node == 2 && entry == 0) ||
|
|
(node == 2 && entry == 2)) {
|
|
_ripleyShould = 4;
|
|
} else {
|
|
_ripleyShould = 1;
|
|
}
|
|
}
|
|
|
|
digi_play(sound, 1, 255, 1);
|
|
} else {
|
|
conv_resume();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Room303::priestTalkCallback(frac16 myMessage, machine *sender) {
|
|
const int trigger = myMessage >> 16;
|
|
|
|
if (trigger > 0) {
|
|
Room303 *room = (Room303 *)g_engine->_activeRoom;
|
|
const KernelTriggerType oldMode = _G(kernel).trigger_mode;
|
|
_G(kernel).trigger_mode = room->_val12;
|
|
kernel_timing_trigger(1, trigger);
|
|
_G(kernel).trigger_mode = oldMode;
|
|
}
|
|
}
|
|
|
|
void Room303::priestTalk(bool flag, int trigger) {
|
|
ws_hide_walker(_fengLi);
|
|
_G(globals)[GLB_TEMP_1] = _feng1 << 24;
|
|
_G(globals)[GLB_TEMP_2] = 0xD << 24;
|
|
_G(globals)[GLB_TEMP_3] = _feng3 << 24;
|
|
_G(globals)[GLB_TEMP_4] = 0xD << 24;
|
|
_G(globals)[GLB_TEMP_9] = _feng4 << 24;
|
|
_G(globals)[GLB_TEMP_10] = 0xD << 24;
|
|
_G(globals)[GLB_TEMP_5] = (flag ? 480 : 706) << 16;
|
|
_G(globals)[GLB_TEMP_6] = 1 << 24;
|
|
_G(globals)[GLB_TEMP_7] = MulSF16((1 << 24) - _G(globals)[GLB_MIN_Y],
|
|
_G(globals)[GLB_SCALER]) + _G(globals)[GLB_MIN_SCALE];
|
|
_G(globals)[GLB_TEMP_8] = (flag ? 1 : 0) << 16;
|
|
_G(globals)[GLB_TEMP_11] = trigger << 16;
|
|
_G(globals)[GLB_TEMP_12] = 0xdc28;
|
|
|
|
_priestTalk = TriggerMachineByHash(32, nullptr, -1, -1,
|
|
priestTalkCallback, false, "fl priest/talk");
|
|
}
|
|
|
|
int Room303::getSize(const Common::String &assetName, int roomNum) {
|
|
Common::String name = expand_name_2_RAW(assetName, roomNum);
|
|
const size_t fileSize = f_info_get_file_size(Common::Path(name));
|
|
|
|
return static_cast<int>((double)fileSize * 0.000090702946);
|
|
}
|
|
|
|
void Room303::playSound(const Common::String &assetName, int trigger1, int trigger2) {
|
|
if (!trigger2)
|
|
trigger2 = -1;
|
|
|
|
const int size = MAX(getSize(assetName), 0);
|
|
_G(globals)[GLB_TEMP_1] = size << 16;
|
|
_G(globals)[GLB_TEMP_2] = trigger2 << 16;
|
|
sendWSMessage(0x200000, 0, _priestTalk, 0, nullptr, 1);
|
|
|
|
digi_play(assetName.c_str(), 1, 255, trigger1);
|
|
}
|
|
|
|
void Room303::syncGame(Common::Serializer &s) {
|
|
s.syncAsByte(_fengFlag);
|
|
}
|
|
|
|
} // namespace Rooms
|
|
} // namespace Riddle
|
|
} // namespace M4
|