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

2337 lines
58 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/ },.
*
*/
#include "m4/riddle/rooms/section4/room403.h"
#include "m4/riddle/rooms/section4/section4.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
#include "m4/gui/gui_vmng.h"
#include "m4/riddle/riddle.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
static const char *const SAID[][2] = {
{ "BROKEN HEADSTONE", "403r11" },
{ "POMMEE CROSS", "403r12" },
{ "GRAVE PLAQUE", "403r13" },
{ "GRAVE", "403r18" },
{ "1ST MARBLE MONUMENT", "403r15" },
{ "2ND MARBLE MONUMENT", "403r26" },
{ "MARBLE COLUMN", "403r16" },
{ "SMALL HEADSTONE", "403r17" },
{ "MARBLE HEADSTONE", "403r27" },
{ "TOMBSTONE", "403r19" },
{ "BURIAL TABLET", "403r20" },
{ "SMALL GRAVE MARKER", "403r14" },
{ "TALL HEADSTONE", "403r22" },
{ "GRANITE HEADSTONE", "403r23" },
{ "BURIAL PLAQUE", "403r24" },
{ "CELTIC CROSS", "403r25" },
{ "URN", "403r08" },
{ nullptr, nullptr }
};
void Room403::init() {
digi_preload("403_s02");
digi_preload("403_s02a");
digi_preload("403_s02b");
digi_preload("950_s23");
digi_preload("403_s01");
player_set_commands_allowed(false);
_bell = series_place_sprite("ONE FRAME BELL", 0, 0, 0, 100, 0xf00);
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
_val1 = 0;
_ripleyTrigger = -1;
_val3 = 0;
_wolfTrigger = -1;
_val5 = 0;
_ripleyMode = 0;
_ripleyShould = 0;
_wolfMode = 0;
_wolfShould = 0;
_ladderMode = 0;
_sound1.clear();
_val12 = 0;
_G(flags)[V313] = player_been_here(403) && (
(_G(flags)[V110] && inv_player_has("TURTLE")) ||
inv_player_has("STEP LADDER") ||
_G(flags)[kWolfFled] ||
!inv_object_is_here("STEP LADDER")) ? 0 : 1;
_plank = inv_object_in_scene("PLANK", 403) ? 2 : 0;
_ventClosed = series_show("SPRITE OF VENT CLOSED", 0x600, 16);
}
_safariShadow = series_load("SAFARI SHADOW 3");
hotspot_set_active("WOLF", false);
hotspot_set_active("STEP LADDER", false);
hotspot_set_active("STEP LADDER ", false);
hotspot_set_active("EDGER", false);
hotspot_set_active("PLANK", false);
hotspot_set_active("TURTLE TREAT", false);
if (_G(flags)[V139] == 2) {
_G(flags)[V139] = 0;
if (_G(flags)[V133] && _G(flags)[kWolfLocation] != 403) {
_edger = series_place_sprite("ONE FRAME EDGER", 0, 0, 0, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 403);
}
MoveScreenDelta(-640, 0);
ws_demand_location(_G(my_walker), 1172, 322, 3);
ws_walk(_G(my_walker), 1172, 322, nullptr, 400, 1);
} else if (_G(flags)[V139] == 4) {
_G(flags)[V139] = 0;
_ladder = series_place_sprite("LADDER LEANS AGAINST WALL", 0, 0, 0, 100, 0xf00);
hotspot_set_active("STEP LADDER ", true);
MoveScreenDelta(-640, 0);
ws_demand_location(_G(my_walker), 1083, 322, 3);
ws_walk(_G(my_walker), 1201, 321, nullptr, 420, 2);
} else {
if (inv_player_has("TURTLE"))
_G(flags)[V313] = 0;
switch (_G(flags)[V313]) {
case 1:
_ladder = series_place_sprite("LADDER LEANS AGAINST WALL", 0, 0, 0, 100, 0xf00);
hotspot_set_active("STEP LADDER ", true);
break;
case 2:
_ladder = series_place_sprite("1 sprite of ladder", 0, 0, 0, 100, 0xf00);
hotspot_set_active("STEP LADDER", true);
break;
default:
break;
}
if (_G(flags)[V133] && !_G(flags)[kWolfFled] && _G(flags)[kWolfLocation] != 403 &&
!inv_player_has("TURTLE") && !inv_player_has("EDGER")) {
_edger = series_place_sprite("ONE FRAME EDGER", 0, 0, 0, 100, 0xf00);
hotspot_set_active("EDGER", true);
}
if (inv_object_is_here("PLANK") || _plank == 2) {
_board = series_place_sprite("1 SPRITE OF BOARD", 0, 0, 0, 100, 0xf00);
hotspot_set_active("PLANK", true);
_plank = true;
}
if (_G(game).previous_room == KERNEL_RESTORING_GAME) {
if (_G(flags)[kWolfLocation] == 403) {
hotspot_set_active("WOLF", true);
_wolfTurnTalk = series_load("WOLF TURN AND TALK");
_wolfTurnHand = series_load("WOLF TURN WITH HAND OUT");
_wolfTalkLeave = series_load("WOLF TALKS AND LEAVES");
_ripTalkPay = series_load("RIP TALK PAY LOOP");
_wolfEdger = series_load("WOLF EDGER LOOP");
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, false,
triggerMachineByHashCallback, "WOLFIE");
if (_val12) {
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 45, 45, -1,
_wolfTurnHand, 45, 45, 0);
} else {
_wolfMode = 2001;
_wolfShould = 2300;
sendWSMessage_10000(1, _wolfie, _wolfEdger, 1, 6, 110,
_wolfEdger, 6, 6, 0);
}
}
if (_ladderMode) {
ws_demand_facing(_G(my_walker), 11);
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "RIP on ladder/plank");
switch (_ladderMode) {
case 1:
_ripClimbsLadder = series_load("RIPLEY CLIMBS LADDER");
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 52, 52, -1,
_ripClimbsLadder, 52, 52, 0);
break;
case 2:
_ripClimbsLadder = series_load("RIPLEY CLIMBS LADDER");
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 74, 74, -1,
_ripClimbsLadder, 74, 74, 0);
break;
case 3:
_ripLegUp = series_load("RIP GETS A LEG UP");
_ventClosed = series_show("SPRITE OF VENT CLOSED", 0x600, 16);
sendWSMessage_10000(1, _ripOnLadder, _ripLegUp, 44, 44, -1,
_ripLegUp, 44, 44, 0);
break;
case 4:
_ripLegUp = series_load("RIP GETS A LEG UP");
_ripTurtle = series_load("RIP TURTLE SERIES");
_noTreat = series_load("403RP06 NO TREAT");
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 28, 28, -1,
_noTreat, 28, 28, 0);
break;
case 5:
_ripLegUp = series_load("RIP GETS A LEG UP");
_ripTurtle = series_load("RIP TURTLE SERIES");
_noTreat = series_load("403RP06 NO TREAT");
hotspot_set_active("GRATE", false);
hotspot_set_active("TURTLE TREAT", true);
if (_G(flags)[V125] == 2)
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 52, 52, -1,
_noTreat, 52, 52, 0);
else
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 28, 28, -1,
_noTreat, 28, 28, 0);
break;
default:
break;
}
} else {
_ventClosed = series_show("SPRITE OF VENT CLOSED", 0x600, 16);
}
player_set_commands_allowed(true);
} else if (_G(flags)[V132]) {
_G(flags)[V132] = 0;
_G(camera_reacts_to_player) = false;
MoveScreenDelta(-640, 0);
ws_demand_location(_G(my_walker), 620, 326, 3);
ws_walk_load_shadow_series(S4_SHADOW_DIRS, S4_SHADOW_NAMES);
ws_walk_load_walker_series(S4_NORMAL_DIRS, S4_NORMAL_NAMES);
kernel_timing_trigger(1, 310);
} else {
if (_G(flags)[kWolfLocation] == 403) {
hotspot_set_active("WOLF", true);
_wolfTurnTalk = series_load("WOLF TURN AND TALK");
_wolfTurnHand = series_load("WOLF TURN WITH HAND OUT");
_wolfTalkLeave = series_load("WOLF TALKS AND LEAVES");
_ripTalkPay = series_load("RIP TALK PAY LOOP");
_wolfEdger = series_load("WOLF EDGER LOOP");
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, false,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolfEdger, 1, 6, 110,
_wolfEdger, 6, 6, 0);
_wolfMode = 2001;
_wolfShould = 2300;
}
if (_G(kittyScreaming)) {
MoveScreenDelta(-640, 0);
ws_demand_location(_G(my_walker), 1110, 322);
player_set_commands_allowed(true);
} else {
ws_demand_location(_G(my_walker), 4, 296);
ws_walk(_G(my_walker), 80, 300, nullptr, 300, 3);
}
}
}
digi_play_loop("403_s01", 3, 180);
}
void Room403::daemon() {
int frame;
switch (_G(kernel).trigger) {
case 10:
digi_play("graveyard_amb_2", 2, 50);
kernel_timing_trigger(1050, 10);
break;
case 100:
kernel_timing_trigger(1, 102);
break;
case 101:
_ripleyMode = 1000;
_ripleyShould = 1105;
break;
case 102:
if (_ripleyTrigger != -1) {
kernel_timing_trigger(1, _ripleyTrigger);
_ripleyTrigger = -1;
} else {
kernel_timing_trigger(1, 103);
}
break;
case 103:
switch (_ripleyMode) {
case 1000:
switch (_ripleyShould) {
case 1100:
_wolfMode = 2000;
_wolfShould = 2100;
kernel_timing_trigger(1, 110);
player_update_info();
ws_hide_walker();
player_set_commands_allowed(false);
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "rip takes wolf");
_ripTalksWolf = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00, 0,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 1, 10, 102,
_ripTalkPay, 10, 10, 0);
sendWSMessage_10000(1, _ripTalksWolf, _safariShadow, 1, 1, -1,
_safariShadow, 1, 1, 0);
_ripleyShould = 1101;
break;
case 1101:
_ripleyShould = 1103;
kernel_timing_trigger(1, 102);
conv_load("conv403a", 10, 10, 101);
conv_export_value_curr(_G(flags)[V111], 0);
conv_export_value_curr(_G(flags)[V121], 1);
conv_export_value_curr(_G(flags)[V122], 2);
conv_export_value_curr(_G(flags)[V120], 3);
conv_export_value_curr(inv_player_has("POMERANIAN MARKS") ? 1 : 0, 4);
conv_export_pointer_curr(&_G(flags)[V114], 5);
conv_export_pointer_curr(&_G(flags)[V115], 6);
conv_export_value_curr(_G(flags)[V337], 10);
conv_play();
break;
case 1102:
frame = imath_ranged_rand(11, 13);
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, frame, frame, 102,
_ripTalkPay, frame, frame, 0);
sendWSMessage_190000(_ripOnLadder, 11);
sendWSMessage_1a0000(_ripOnLadder, 11);
break;
case 1103:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 10, 102,
_ripTalkPay, 10, 10, 0);
break;
case 1104:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 10, -1,
_ripTalkPay, 10, 10, 0);
break;
case 1105:
player_set_commands_allowed(false);
if (_val5) {
_val5 = 0;
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 1, 305,
_ripTalkPay, 1, 1, 0);
_wolfShould = 2251;
_G(flags)[V124] = 1;
} else {
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 1, 103,
_ripTalkPay, 1, 1, 0);
_ripleyShould = 1106;
if (!_G(flags)[V115])
_wolfShould = 2103;
}
break;
case 1106:
terminateMachineAndNull(_ripOnLadder);
terminateMachineAndNull(_ripTalksWolf);
ws_unhide_walker();
_G(flags)[V114] = 0;
if (!_G(flags)[V115] || _flag2 ||
!inv_player_has("POMERANIAN MARKS")) {
_flag2 = false;
_wolfMode = 2001;
_wolfShould = 2300;
kernel_timing_trigger(1, 110);
player_set_commands_allowed(true);
} else {
player_set_commands_allowed(false);
_val12 = 1;
_wolfMode = 2000;
_wolfShould = 2230;
kernel_timing_trigger(1, 110);
}
break;
default:
break;
}
break;
case 1010:
switch (_ripleyShould) {
case 1200:
player_set_commands_allowed(false);
terminateMachineAndNull(_ventClosed);
_ripClimbsLadder = series_load("RIPLEY CLIMBS LADDER");
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "RIP climbs ladder");
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 1, 12, 103,
_ripClimbsLadder, 12, 12, 0);
_ripleyShould = 1202;
break;
case 1202:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 13, 23, 103,
_ripClimbsLadder, 23, 23, 0);
_ripleyShould = 1203;
break;
case 1203:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 24, 33, 103,
_ripClimbsLadder, 33, 33, 0);
_ripleyShould = 1204;
break;
case 1204:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 34, 40, 103,
_ripClimbsLadder, 40, 40, 0);
_ripleyShould = 1205;
break;
case 1205:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 41, 52, 103,
_ripClimbsLadder, 52, 52, 0);
_ripleyShould = 1209;
break;
case 1209:
_ladderMode = 1;
player_set_commands_allowed(true);
break;
case 1210:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 52, 36, 103,
_ripClimbsLadder, 36, 36, 0);
_ripleyShould = 1212;
break;
case 1212:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 35, 26, 103,
_ripClimbsLadder, 26, 26, 0);
_ripleyShould = 1213;
break;
case 1213:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 25, 14, 103,
_ripClimbsLadder, 14, 14, 0);
_ripleyShould = 1214;
break;
case 1214:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 13, 4, 103,
_ripClimbsLadder, 4, 4, 0);
_ripleyShould = 1215;
break;
case 1215:
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 3, 1, 103,
_ripClimbsLadder, 1, 1, 0);
_ripleyShould = 1219;
break;
case 1219:
terminateMachineAndNull(_ripOnLadder);
ws_unhide_walker();
_ventClosed = series_show("SPRITE OF VENT CLOSED", 0x600, 16);
series_unload(_ripClimbsLadder);
_ladderMode = 0;
player_set_commands_allowed(true);
break;
case 1220:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 53, 59, 103,
_ripClimbsLadder, 59, 59, 0);
_ripleyShould = 1222;
break;
case 1222:
digi_play("403_s06", 2);
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 60, 74, 103,
_ripClimbsLadder, 74, 74, 0);
_ripleyShould = 1223;
break;
case 1223:
_ladderMode = 2;
player_set_commands_allowed(true);
break;
case 1230:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 74, 69, 103,
_ripClimbsLadder, 69, 69, 0);
_ripleyShould = 1232;
break;
case 1232:
digi_play("403_s06", 2);
sendWSMessage_10000(1, _ripOnLadder, _ripClimbsLadder, 68, 53, 103,
_ripClimbsLadder, 53, 53, 0);
_ripleyShould = 1210;
break;
case 1240:
player_set_commands_allowed(false);
digi_preload("403R29");
series_stream("VENT POPUP LADDER", 10, 0, 103);
kernel_timing_trigger(390, 350);
_ripleyShould = 1230;
break;
default:
break;
}
break;
case 1020:
switch (_ripleyShould) {
case 1300:
player_set_commands_allowed(false);
_ripLegUp = series_load("RIP GETS A LEG UP");
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "RIP climbs plank");
sendWSMessage_10000(1, _ripOnLadder, _ripLegUp, 1, 10, 103,
_ripLegUp, 10, 10, 0);
_ripleyShould = 1302;
break;
case 1302:
digi_play("403_s08", 2);
sendWSMessage_10000(1, _ripOnLadder, _ripLegUp, 11, 44, 103,
_ripLegUp, 44, 44, 0);
_ripleyShould = 1303;
break;
case 1303:
_ladderMode = 3;
player_set_commands_allowed(true);
break;
case 1310:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _ripOnLadder, _ripLegUp, 44, 1, 103,
_ripLegUp, 1, 1, 0);
digi_play("403_s08", 2);
_ripleyShould = 1312;
break;
case 1312:
terminateMachineAndNull(_ripOnLadder);
ws_unhide_walker();
series_unload(_ripLegUp);
_ladderMode = 0;
if (_G(flags)[V125] == 3)
kernel_timing_trigger(1, 442);
else
player_set_commands_allowed(true);
break;
case 1320:
player_set_commands_allowed(false);
_ripTurtle = series_load("RIP TURTLE SERIES");
_noTreat = series_load("403RP06 NO TREAT");
terminateMachineAndNull(_ventClosed);
if (_G(flags)[V125] == 1)
sendWSMessage_10000(1, _ripOnLadder, _ripTurtle, 1, 12, 103,
_ripTurtle, 12, 12, 0);
else
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 1, 12, 103,
_noTreat, 12, 12, 0);
_ripleyShould = 1322;
break;
case 1322:
digi_play("403_s06", 2);
if (_G(flags)[V125] == 1)
sendWSMessage_10000(1, _ripOnLadder, _ripTurtle, 13, 28, 103,
_ripTurtle, 28, 28, 0);
else
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 13, 28, 103,
_noTreat, 28, 28, 0);
_ripleyShould = 1323;
break;
case 1323:
if (_G(flags)[V125]) {
hotspot_set_active("GRATE", false);
hotspot_set_active("TURTLE TREAT", true);
_ladderMode = 5;
} else {
_ladderMode = 4;
}
player_set_commands_allowed(true);
break;
case 1330:
player_set_commands_allowed(false);
if (_G(flags)[V125] == 1)
sendWSMessage_10000(1, _ripOnLadder, _ripTurtle, 28, 21, 103,
_ripTurtle, 21, 21, 0);
else
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 28, 21, 103,
_noTreat, 21, 21, 0);
_ripleyShould = 1332;
break;
case 1332:
digi_play("403_s10", 2);
if (_G(flags)[V125] == 1)
sendWSMessage_10000(1, _ripOnLadder, _ripTurtle, 20, 1, 103,
_ripLegUp, 44, 44, 0);
else
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 20, 1, 103,
_ripLegUp, 44, 44, 0);
_ripleyShould = 1333;
break;
case 1333:
series_unload(_noTreat);
series_unload(_ripTurtle);
_ventClosed = series_show("SPRITE OF VENT CLOSED", 0x600, 16);
hotspot_set_active("GRATE", true);
hotspot_set_active("TURTLE TREAT", false);
_ripleyShould = 1310;
kernel_timing_trigger(1, 103);
break;
case 1340:
player_set_commands_allowed(false);
digi_preload("403R29");
series_stream("VENT POPUP PLANK", 10, 0, 103);
kernel_timing_trigger(390, 350);
_ripleyShould = 1330;
break;
case 1400:
player_set_commands_allowed(false);
if (_G(flags)[V125]) {
digi_play("403r49", 1, 255, 103);
} else {
sendWSMessage_10000(1, _ripOnLadder, _ripTurtle, 29, 52, 103,
_ripTurtle, 52, 52, 0);
_G(flags)[V125] = 1;
_ladderMode = 5;
hotspot_set_active("GRATE", false);
hotspot_set_active("TURTLE TREAT", true);
}
_ripleyShould = 1402;
break;
case 1402:
player_set_commands_allowed(true);
break;
case 1410:
player_set_commands_allowed(false);
if (_G(flags)[V125] == 1)
sendWSMessage_10000(1, _ripOnLadder, _ripTurtle, 53, 81, 103,
_ripTurtle, 81, 81, 0);
else
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 53, 81, 103,
_noTreat, 81, 81, 0);
_ripleyShould = 1412;
break;
case 1412:
if (_ladderMode != 5) {
digi_play("403r50", 1, 255, 103);
} else if (_G(flags)[V125] == 1) {
digi_play("403r51", 1, 255, 103);
_G(flags)[V125] = 0;
} else {
kernel_timing_trigger(1, 440);
}
_ripleyShould = 1413;
break;
case 1413:
sendWSMessage_10000(1, _ripOnLadder, _noTreat, 81, 53, 103,
_noTreat, 28, 28, 0);
_ripleyShould = 1414;
break;
case 1414:
inv_give_to_player("TURTLE");
_ladderMode = 4;
hotspot_set_active("GRATE", true);
hotspot_set_active("TURTLE TREAT", false);
player_set_commands_allowed(true);
break;
case 1500:
player_set_commands_allowed(false);
_ripPlankEdger = series_load("RIPLEY ON PLANK USES EDGER");
sendWSMessage_10000(1, _ripOnLadder, _ripPlankEdger, 1, 20, 103,
_ripPlankEdger, 20, 20, 0);
_ripleyShould = 1502;
break;
case 1502:
digi_play("403_s10", 2);
sendWSMessage_10000(1, _ripOnLadder, _ripPlankEdger, 20, 63, 103,
_noTreat, 52, 52, 0);
_ripleyShould = 1503;
break;
case 1503:
_G(flags)[V125] = 2;
series_unload(_ripPlankEdger);
player_set_commands_allowed(true);
break;
default:
break;
}
break;
default:
break;
}
break;
case 110:
switch (_wolfMode) {
case 2000:
case 2001:
if (_wolfTrigger != -1) {
kernel_timing_trigger(1, _wolfTrigger);
_wolfTrigger = -1;
} else {
kernel_timing_trigger(1, 111);
}
break;
default:
break;
}
break;
case 111:
switch (_wolfMode) {
case 2000:
switch (_wolfShould) {
case 2100:
sendWSMessage_10000(1, _wolfie, _wolfTurnTalk, 1, 7, 110,
_wolfTurnTalk, 7, 7, 0);
_wolfShould = 2102;
break;
case 2101:
frame = imath_ranged_rand(8, 13);
sendWSMessage_10000(1, _wolfie, _wolfTurnTalk, frame, frame, 110,
_wolfTurnTalk, frame, frame, 0);
sendWSMessage_190000(_wolfie, 11);
sendWSMessage_1a0000(_wolfie, 11);
break;
case 2102:
sendWSMessage_10000(1, _wolfie, _wolfTurnTalk, 7, 7, 110,
_wolfTurnTalk, 7, 7, 0);
break;
case 2103:
sendWSMessage_10000(1, _wolfie, _wolfTurnTalk, 6, 6, -1,
_wolfEdger, 6, 6, 0);
break;
case 2104:
sendWSMessage_10000(1, _wolfie, _wolfEdger, 1, 6, 110,
_wolfEdger, 6, 6, 0);
break;
case 2105:
sendWSMessage_10000(1, _wolfie, _wolfTurnTalk, 7, 1, 110,
_wolfEdger, 1, 1, 0);
_wolfMode = 2001;
_wolfShould = 2300;
break;
case 2230:
terminateMachineAndNull(_wolfie);
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, false,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 11, 45, 111,
_wolfTurnHand, 45, 45, 0);
_wolfShould = 2231;
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1);
_sound1.clear();
}
break;
case 2231:
player_set_commands_allowed(true);
break;
case 2232:
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "rip talks wolf");
player_update_info();
_ripTalksWolf = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00, 0,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripTalksWolf, _safariShadow, 1, 1, -1,
_safariShadow, 1, 1, 0);
ws_hide_walker();
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 1, 10, 111,
_ripTalkPay, 10, 10, 0);
_wolfShould = 2233;
break;
case 2233:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 40, 56, 213,
_ripTalkPay, 56, 56, 0);
_val13 = _G(flags)[V111];
break;
case 2234:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 45, 11, 111,
_wolfTurnHand, 11, 11, 0);
_wolfShould = 2235;
break;
case 2235:
_wolfMode = 2001;
_wolfShould = 2300;
kernel_timing_trigger(1, 110);
if (!_G(flags)[V052])
player_set_commands_allowed(true);
break;
case 2250:
frame = imath_ranged_rand(19, 24);
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, frame, frame, 110,
_wolfTalkLeave, frame, frame, 0);
sendWSMessage_190000(_wolfie, 11);
sendWSMessage_1a0000(_wolfie, 11);
break;
case 2251:
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, 19, 19, -1,
_wolfTalkLeave, 19, 19, 0);
break;
case 2252:
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, 19, 19, 110,
_wolfTalkLeave, 19, 19, 0);
break;
case 2253:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 15, 34, 111,
_wolfTurnHand, 34, 34, 0);
_wolfShould = 2254;
break;
case 2254:
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, 40, 60, 111,
_wolfTalkLeave, 60, 60, 0);
_wolfShould = 2255;
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1);
_sound1.clear();
}
break;
case 2255:
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, 60, 40, 111,
_wolfTalkLeave, 40, 40, 0);
_wolfShould = 2256;
break;
case 2256:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 34, 15, 111,
_wolfTurnHand, 15, 15, 0);
_wolfShould = 2257;
break;
case 2257:
_wolfShould = 2102;
kernel_timing_trigger(1, 110);
conv_resume();
break;
case 2258:
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, 1, 18, 111,
_wolfTalkLeave, 18, 18, 0);
_wolfShould = 2250;
break;
case 2260:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 11, 45, -1,
_wolfTurnHand, 45, 45, 0);
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1, 255, 111);
_wolfShould = 2262;
_sound1.clear();
}
break;
case 2262:
conv_resume();
break;
case 2270:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 45, 11, 111,
_wolfTurnHand, 11, 11, 0);
_wolfShould = 2272;
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1);
_sound1.clear();
}
break;
case 2272:
_wolfMode = 2001;
_wolfShould = 2300;
kernel_timing_trigger(1, 110);
conv_resume();
break;
default:
break;
}
break;
case 2001:
if (_wolfShould == 2300) {
if (imath_ranged_rand(1, 3) == 1) {
frame = imath_ranged_rand(1, 6);
sendWSMessage_10000(1, _wolfie, _wolfEdger,
imath_ranged_rand(1, 6), imath_ranged_rand(1, 6), 110,
_wolfEdger, frame, frame, 0);
sendWSMessage_190000(_wolfie, 8);
sendWSMessage_1a0000(_wolfie, 6);
switch (imath_ranged_rand(1, 6)) {
case 1:
digi_play("403_s02", 2);
break;
case 2:
digi_play("403_s02a", 2);
break;
case 3:
digi_play("403_s02b", 2);
break;
default:
break;
}
} else {
kernel_timing_trigger(15, 110);
}
}
break;
default:
break;
}
break;
case 200:
player_set_commands_allowed(false);
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "rip talks wolf");
player_update_info();
_ripTalksWolf = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00, false,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripTalksWolf, _safariShadow, 1, 1, -1,
_safariShadow, 1, 1, 0);
ws_hide_walker();
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 11, 45, 202,
_wolfTurnHand, 45, 45, 0);
break;
case 202:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 40, 63, 203,
_ripTalkPay, 63, 63, 0);
break;
case 203:
digi_play("950_s23", 2, 255, -1, 950);
kernel_timing_trigger(30, 205);
digi_play("402w07", 1);
break;
case 205:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 45, 1, 209,
_wolfTurnHand, 1, 1, 0);
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 63, 40, 206,
_ripTalkPay, 40, 40, 0);
break;
case 206:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 1, 207,
_ripTalkPay, 1, 1, 0);
break;
case 207:
case 226:
case 236:
terminateMachineAndNull(_ripOnLadder);
terminateMachineAndNull(_ripTalksWolf);
ws_unhide_walker();
break;
case 209:
case 227:
kernel_timing_trigger(1, 110);
player_set_commands_allowed(true);
break;
case 210:
player_set_commands_allowed(false);
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "rip talks wolf");
player_update_info();
_ripTalksWolf = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00, 0,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripTalksWolf, _safariShadow, 1, 1, -1,
_safariShadow, 1, 1, 0);
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 1, 10, 211,
_ripTalkPay, 10, 110, 0);
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 11, 45, 213,
_wolfTurnHand, 45, 45, 0);
_val13 = _G(flags)[V111];
break;
case 211:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 40, 56, -1,
_ripTalkPay, 56, 56, 0);
break;
case 213:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 57, 63, 214,
_ripTalkPay, 63, 63, 0);
break;
case 214:
digi_play("950_s23", 2, 255, -1, 950);
kernel_timing_trigger(30, 215);
break;
case 215:
if (_val13 > 1) {
--_val13;
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 63, 57, 213,
_ripTalkPay, 57, 57, 0);
} else {
sendWSMessage_10000(1, _wolfie, _wolfTalkLeave, 1, 18, 217,
_wolfTalkLeave, 18, 18, 0);
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 56, 40, 216,
_ripTalkPay, 40, 40, 0);
_flag3 = false;
}
break;
case 216:
case 217:
if (!_flag3) {
_flag3 = true;
} else {
kernel_timing_trigger(1, 218);
}
break;
case 218:
_wolfTrigger = -1;
_wolfMode = 2000;
_wolfShould = 2252;
kernel_timing_trigger(1, 110);
_ripleyMode = 1000;
_ripleyShould = 1103;
kernel_timing_trigger(1, 102);
conv_load("conv403a", 0, 10, 101);
conv_export_value_curr(_G(flags)[V111], 0);
conv_export_value_curr(_G(flags)[V121], 1);
conv_export_value_curr(_G(flags)[V122], 2);
conv_export_value_curr(_G(flags)[V120], 3);
conv_export_value_curr(inv_player_has("POMERANIAN MARKS") ? 1 : 0, 5);
conv_export_pointer_curr(&_G(flags)[V114], 5);
conv_export_pointer_curr(&_G(flags)[V115], 6);
conv_export_value_curr(_G(flags)[V337], 10);
conv_play();
break;
case 220:
player_set_commands_allowed(false);
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "rip talks wolf");
player_update_info();
_ripTalksWolf = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00, 0,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripTalksWolf, _safariShadow, 1, 1, -1,
_safariShadow, 1, 1, 0);
ws_hide_walker();
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 1, 10, -1,
_ripTalkPay, 10, 10, 0);
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 11, 45, 222,
_wolfTurnHand, 45, 45, 0);
break;
case 222:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 40, 63, 223,
_ripTalkPay, 63, 63, 0);
break;
case 223:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 45, 11, 227,
_wolfTurnHand, 11, 11, 0);
digi_play("402w08", 1);
kernel_timing_trigger(60, 224);
break;
case 224:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 63, 40, 225,
_ripTalkPay, 40, 40, 0);
break;
case 225:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 1, 226,
_ripTalkPay, 1, 1, 0);
break;
case 230:
player_set_commands_allowed(false);
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "rip talks wolf");
player_update_info();
_ripTalksWolf = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00, 0,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripTalksWolf, _safariShadow, 1, 1, -1,
_safariShadow, 1, 1, 0);
ws_hide_walker();
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 1, 10, 232,
_ripTalkPay, 10, 10, 0);
break;
case 232:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 40, 63, 233,
_ripTalkPay, 63, 63, 0);
break;
case 233:
sendWSMessage_10000(1, _wolfie, _wolfTurnHand, 45, 11, 237,
_wolfTurnHand, 11, 11, 0);
digi_play("402w08", 1);
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 63, 40, 235,
_ripTalkPay, 40, 40, 0);
break;
case 235:
sendWSMessage_10000(1, _ripOnLadder, _ripTalkPay, 10, 1, 236,
_ripTalkPay, 1, 1, 0);
break;
case 237:
_wolfMode = 2001;
_wolfShould = 2300;
kernel_timing_trigger(1, 110);
player_set_commands_allowed(true);
break;
case 300:
player_set_commands_allowed(true);
break;
case 305:
_edger = series_place_sprite("ONE FRAME EDGER", 0, 0, 0, 100, 0xf00);
hotspot_set_active("WOLF", false);
hotspot_set_active("EDGER", true);
_G(flags)[V133] = 1;
_G(flags)[kWolfLocation] = 402;
terminateMachineAndNull(_ripOnLadder);
terminateMachineAndNull(_ripTalksWolf);
ws_unhide_walker();
terminateMachineAndNull(_wolfie);
series_unload(_wolfEdger);
series_unload(_wolfTurnTalk);
series_unload(_wolfTurnHand);
series_unload(_wolfTalkLeave);
series_unload(_ripTalkPay);
series_stream("403W08", 6, 0, 307);
break;
case 307:
midi_fade_volume(0, 120);
kernel_timing_trigger(120, 308);
break;
case 308:
midi_stop();
player_set_commands_allowed(true);
break;
case 310:
_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
620, 313, 3, triggerMachineByHashCallback, "wolf_walker");
DisposePath(_wolfWalker->walkPath);
_wolfWalker->walkPath = CreateCustomPath(1067, 313, -1);
ws_custom_walk(_wolfWalker, 3, 312);
kernel_timing_trigger(480, 311);
break;
case 311:
ws_walk(_G(my_walker), 1120, 328, nullptr, 314, 1);
break;
case 312:
midi_fade_volume(0, 120);
kernel_timing_trigger(120, 313);
break;
case 313:
case 325:
midi_stop();
break;
case 314:
_ripHeadTurn = series_load("RIP TREK HEAD TURN POS1");
setGlobals1(_ripHeadTurn, 1, 3, 3, 3, 0, 3, 1, 1, 1);
sendWSMessage_110000(315);
break;
case 315:
sendWSMessage_60000(_wolfWalker);
_wolfIndicatesTomb = series_load("WOLF INDICATES TOMB");
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x900, false,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolfIndicatesTomb, 1, 93, -1,
_wolfIndicatesTomb, 93, 93, 0);
digi_play("403w01", 1, 255, 316);
break;
case 316:
sendWSMessage_120000(-1);
digi_play("403r01", 1, 255, 317);
break;
case 317:
sendWSMessage_10000(1, _wolfie, _wolfIndicatesTomb, 94, 96, -1,
_wolfIndicatesTomb, 94, 96, 1);
digi_play("403w02", 1, 255, 318);
break;
case 318:
digi_play("403r02", 1, 255, 319);
break;
case 319:
sendWSMessage_10000(1, _wolfie, _wolfIndicatesTomb, 94, 96, -1,
_wolfIndicatesTomb, 94, 96, 1);
digi_play("403w03", 1, 255, 320);
break;
case 320:
sendWSMessage_10000(1, _wolfie, _wolfIndicatesTomb, 93, 93, -1,
_wolfIndicatesTomb, 93, 93, 1);
digi_play("403r03", 1, 255, 321);
break;
case 321:
digi_preload("403w04");
_wolfJustSo = series_stream("403 WOLF JUST SO", 5, 0, 322);
series_stream_break_on_frame(_wolfJustSo, 8, 323);
break;
case 322:
midi_play("DANZIG1", 255, true, -1, 949);
sendWSMessage_120000(-1);
terminateMachineAndNull(_wolfie);
_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
1067, 313, 3, triggerMachineByHashCallback3000, "wolf_walker");
sendWSMessage_10000(_wolfWalker, 620, 313, 3, 324, 0);
break;
case 323:
digi_play("403w04", 1);
break;
case 324:
midi_fade_volume(0, 120);
kernel_timing_trigger(120, 325);
sendWSMessage_60000(_wolfWalker);
sendWSMessage_150000(-1);
_G(camera_reacts_to_player) = true;
player_set_commands_allowed(true);
break;
case 350:
digi_play("403r29", 1, 255, 2400);
break;
case 400:
_series1 = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(402);
break;
case 402:
_ladder = series_place_sprite("LADDER LEANS AGAINST WALL", 0, 0, 0, 100, 0xf00);
inv_move_object("STEP LADDER", 403);
hotspot_set_active("STEP LADDER ", true);
sendWSMessage_120000(403);
break;
case 403:
sendWSMessage_150000(404);
break;
case 404:
series_unload(_series1);
player_set_commands_allowed(true);
break;
case 420:
_ripMedReach = series_load("RIP MED REACH 1HAND POS2");
setGlobals1(_ripMedReach, 1, 17, 17, 17, 0, 17, 1, 1, 1);
sendWSMessage_110000(422);
break;
case 422:
_edger = series_place_sprite("ONE FRAME EDGER", 0, 0, 0, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 403);
sendWSMessage_120000(423);
break;
case 423:
sendWSMessage_150000(424);
break;
case 424:
series_unload(_ripMedReach);
player_set_commands_allowed(true);
break;
case 440:
player_set_commands_allowed(false);
_G(flags)[V125] = 3;
_turtlePopup = series_load("403 turtle popup");
_wolfJustSo = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "Turtle POPUP");
sendWSMessage_10000(1, _wolfJustSo, _turtlePopup, 1, 46, -1,
_turtlePopup, 46, 46, 0);
midi_play("turtle", 255, true, -1, 949);
_ripleyMode = 1020;
_ripleyShould = 1330;
kernel_timing_trigger(1, 102);
break;
case 442:
_ripPutBoard = series_load("RIPLEY PUTS BOARD ON POTS");
terminateMachineAndNull(_board);
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, false,
triggerMachineByHashCallback, "RIP plants plank");
sendWSMessage_10000(1, _ripOnLadder, _ripPutBoard, 57, 1, 443,
_ripPutBoard, 1, 1, 0);
break;
case 443:
hotspot_set_active("PLANK", false);
inv_give_to_player("PLANK");
terminateMachineAndNull(_ripOnLadder);
ws_unhide_walker();
series_unload(_ripPutBoard);
ws_walk(_G(my_walker), 620, 326, nullptr, -1, 1, true);
kernel_timing_trigger(60, 444);
break;
case 444:
disable_player_commands_and_fade_init(445);
break;
case 445:
digi_stop(3);
_G(game).setRoom(408);
break;
case 2400:
digi_stop(1);
digi_unload("403R29");
break;
default:
break;
}
}
#define MONEY(ITEM) (player_said(ITEM, "WOLF") && inv_player_has(ITEM))
void Room403::pre_parser() {
bool talkFlag = player_said_any("talk", "talk to");
bool lookFlag = player_said_any("look", "look at");
bool enterFlag = player_said("enter");
bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
if (_ladderMode == 5) {
intr_cancel_sentence();
_G(player).resetWalk();
if (player_said("TURTLE", "TURTLE TREAT")) {
_ripleyMode = 1020;
_ripleyShould = 1410;
inv_move_object("TURTLE", 403);
} else if (player_said("TURTLE TREATS", "TURTLE TREAT")) {
_ripleyMode = 1020;
_ripleyShould = 1400;
} else if (player_said("EDGER", "TURTLE TREAT")) {
if (_G(flags)[V125] != 2) {
_ripleyMode = 1020;
_ripleyShould = 1500;
}
} else {
_ripleyMode = 1020;
_ripleyShould = 1330;
}
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
return;
}
if (_ladderMode == 4) {
intr_cancel_sentence();
_G(player).resetWalk();
if (lookFlag && player_said("GRATE")) {
_ripleyMode = 1020;
_ripleyShould = 1340;
} else if (player_said("TURTLE TREATS", "GRATE")) {
_ripleyMode = 1020;
_ripleyShould = 1400;
} else if (player_said("TURTLE", "GRATE")) {
_ripleyMode = 1020;
_ripleyShould = 1410;
inv_move_object("TURTLE", 403);
} else {
_ripleyMode = 1020;
_ripleyShould = 1330;
}
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
return;
}
if (_ladderMode == 3) {
_G(player).resetWalk();
if (lookFlag && player_said("grate")) {
return;
}
intr_cancel_sentence();
if (useFlag && player_said("GRATE")) {
_ripleyMode = 1020;
_ripleyShould = 1320;
} else {
_ripleyMode = 1020;
_ripleyShould = 1310;
}
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
return;
}
if (_ladderMode == 2) {
intr_cancel_sentence();
_G(player).resetWalk();
if (lookFlag && player_said("GRATE")) {
_ripleyMode = 1010;
_ripleyShould = 1240;
} else {
_ripleyMode = 1010;
_ripleyShould = 1230;
}
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
}
if (_ladderMode == 1) {
_G(player).resetWalk();
if (!(lookFlag && player_said("GRATE"))) {
intr_cancel_sentence();
if (useFlag && player_said("GRATE")) {
_ripleyMode = 1010;
_ripleyShould = 1220;
} else {
_ripleyMode = 1010;
_ripleyShould = 1210;
}
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
}
}
if (player_said("PLANK", "URN") || player_said("EDGER", "URN")) {
_G(player).resetWalk();
kernel_timing_trigger(1, 69, KT_PARSE, KT_PREPARSE);
}
if (!_flag1 && !player_said("WALK TO") &&
!player_said("POMERANIAN MARKS", "WOLF"))
_flag1 = true;
if (_val12) {
_val12 = 0;
if (MONEY("POMERANIAN MARKS")) {
player_set_commands_allowed(false);
intr_cancel_sentence();
_G(flags)[V114] = 1;
_wolfMode = 2000;
_wolfShould = 2232;
_G(flags)[V111]++;
kernel_timing_trigger(1, 110, KT_DAEMON, KT_PREPARSE);
} else if (MONEY("US DOLLARS") || MONEY("CHINESE YUAN") ||
MONEY("PERUVIAN INTI") || MONEY("SIKKIMESE RUPEE")) {
_G(flags)[V116] = 1;
intr_cancel_sentence();
kernel_timing_trigger(1, 230, KT_DAEMON, KT_PREPARSE);
} else {
if (talkFlag && player_said("WOLF"))
intr_cancel_sentence();
player_set_commands_allowed(false);
_wolfMode = 2000;
_wolfShould = 2234;
kernel_timing_trigger(1, 110, KT_DAEMON, KT_PREPARSE);
}
}
if ((lookFlag && player_said(" ")) ||
(enterFlag && player_said("GRAVEYARD")) ||
(enterFlag && player_said("CASTLE GROUNDS"))) {
_G(player).resetWalk();
}
}
void Room403::parser() {
const bool lookFlag = player_said_any("look", "look at");
const bool talkFlag = player_said_any("talk", "talk to");
const bool takeFlag = player_said("take");
const bool enterFlag = player_said("enter");
const bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
if (player_said("conv403a")) {
if (_G(kernel).trigger == 1) {
conv403a1();
} else {
conv403a();
}
} else if (talkFlag && player_said("WOLF")) {
player_set_commands_allowed(false);
_wolfTrigger = -1;
_ripleyMode = 1000;
_ripleyShould = 1100;
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
} else if (enterFlag && player_said("CASTLE")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(1);
break;
case 1:
midi_stop();
digi_stop(3);
_G(game).setRoom(408);
break;
default:
break;
}
} else if (lookFlag && player_said("grate")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
if (_G(flags)[V123]) {
digi_play("403R06", 1, 255, 2);
} else {
digi_play("403R06", 1, 255, 1);
_G(flags)[V123] = 1;
}
break;
case 1:
digi_play("403R06A", 1, 255, 2);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (lookFlag && player_said("WOLF")) {
digi_play(_G(flags)[V111] > 0 ? "402R13" : "402R12", 1);
} else if (lookFlag && player_said("wall")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
digi_play("403r09", 1, 255, 1);
break;
case 1:
player_set_commands_allowed(true);
digi_play("403r09a", 1);
break;
default:
break;
}
} else if (lookFlag && player_said_any("tomb", "door")) {
digi_play("403r05", 1);
_G(flags)[V121] = 1;
} else if (lookFlag && player_said("bell")) {
digi_play("403r07", 1);
_G(flags)[V122] = 1;
} else if (lookFlag && _G(walker).ripley_said(SAID)) {
// No implementation
} else if (lookFlag && player_said("edger") && !inv_player_has("EDGER")) {
digi_play("403r53", 1);
} else if (lookFlag && player_said_any("STEP LADDER", "STEP LADDER ") &&
inv_object_is_here("STEP LADDER")) {
digi_play(_G(flags)[kWolfLocation] == 403 ? "403R10" : "403R46", 1);
} else if (useFlag && player_said("PLANK") && inv_object_is_here("PLANK")) {
_ripleyMode = 1020;
_ripleyShould = 1300;
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
} else if (useFlag && HERE("STEP LADDER")) {
_ripleyMode = 1010;
_ripleyShould = 1200;
kernel_timing_trigger(1, 102, KT_DAEMON, KT_PARSE);
} else if (player_said("POMERANIAN MARKS", "WOLF") &&
inv_player_has("POMERANIAN MARKS")) {
if (!_G(flags)[V115] || _G(flags)[V114]) {
player_set_commands_allowed(false);
_wolfTrigger = 200;
} else {
_G(flags)[V114] = 1;
_G(flags)[V111]++;
player_set_commands_allowed(false);
_wolfTrigger = 210;
}
} else if (MONEY("US DOLLARS") || MONEY("CHINESE YUAN") ||
MONEY("PERUVIAN INTI") || MONEY("SIKKIMESE RUPEE")) {
if (!_G(flags)[V116]) {
_G(flags)[V116] = 1;
player_set_commands_allowed(false);
_wolfTrigger = 220;
}
} else if (player_said("EDGER", "BELL") && inv_player_has("EDGER")) {
edgerBell();
} else if (player_said("PLANK", "URN")) {
plankUrn();
} else if (player_said("EDGER", "URN")) {
edgerUrn();
} else if ((player_said("STEP LADDER", "TOMB") ||
player_said("STEP LADDER", "STAIRS")) &&
stepLadderTomb()) {
// No implementation
} else if (player_said("STEP LADDER", "WALL")) {
digi_play("403R32", 1);
} else if (player_said("STEP LADDER", "BELL")) {
digi_play("403R31", 1);
} else if (takeFlag && player_said("URN")) {
digi_play("403R28", 1);
} else if (takeFlag && player_said("BELL")) {
digi_play("403R30", 1);
} else if (takeFlag && player_said("PLANK") &&
takePlank()) {
// No implementation
} else if (takeFlag && player_said("EDGER") && takeEdger()) {
// No implementation
} else if (takeFlag && player_said("STEP LADDER") && takeStepLadder()) {
// No implementation
} else if (takeFlag && player_said("STEP LADDER ")) {
takeStepLadder_();
} else if (takeFlag && player_said("EDGER") && inv_object_is_here("EDGER")) {
digi_play("403R30", 1);
} else if (takeFlag && (
player_said_any(
"broken headstone", "wall", "pommee cross",
"grave plaque", "1ST MARBLE MONUMENT", "2ND MARBLE MONUMENT",
"marble column", "small headstone") ||
player_said_any(
"marble headstone", "tombstone",
"burial tablet", "small grave marker", "tall headstone",
"granite headstone", "burial plaque", "celtic cross")
)) {
digi_play("403R33", 1);
} else if (lookFlag && player_said(" ")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
digi_play("403r04", 1, 255, 2);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (player_said("journal") && (
player_said_any(
"broken headstone", "pommee cross", "grave plaque",
"grave", "1ST MARBLE MONUMENT", "2ND MARBLE MONUMENT",
"marble column", "small headstone") ||
player_said_any(
"marble headstone", "tombstone", "burial tablet",
"small grave marker", "tall headstone", "granite headstone",
"burial plaque", "celtic cross")
)) {
useJournal();
} else {
return;
}
_G(player).command_ready = false;
}
#undef MONEY
#undef TRIGGER
void Room403::conv403a() {
const char *sound = conv_sound_to_play();
const int who = conv_whos_talking();
const int node = conv_current_node();
const int entry = conv_current_entry();
if (sound) {
if (who <= 0) {
switch (node) {
case 8:
_sound1 = sound;
if (inv_player_has("POMERANIAN MARKS")) {
conv_resume();
} else {
_wolfShould = 2260;
}
break;
case 10:
_sound1 = sound;
_wolfShould = 2270;
kernel_timing_trigger(1, 110, KT_DAEMON, KT_PARSE);
break;
case 11:
if (entry == 0) {
_sound1 = sound;
_wolfShould = 2253;
} else {
_wolfShould = 2101;
digi_play(sound, 1, 255, 1);
}
break;
case 17:
if (entry == 1) {
_val5 = 1;
midi_play("DANZIG1", 255, true, -1, 949);
}
_wolfShould = 2250;
digi_play(sound, 1, 255, 1);
break;
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
_flag2 = true;
_wolfShould = 2101;
digi_play(sound, 1, 255, 1);
break;
default:
_wolfShould = 2101;
digi_play(sound, 1, 255, 1);
break;
}
} else if (who == 1) {
_ripleyShould = 1102;
digi_play(sound, 1, 255, 1);
}
} else {
conv_resume();
}
}
void Room403::conv403a1() {
const int who = conv_whos_talking();
if (who <= 0) {
_wolfShould = (_wolfShould == 2250) ? 2252 : 2102;
} else if (who == 1) {
_ripleyShould = 1103;
}
conv_resume();
}
void Room403::edgerBell() {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
if (++_G(flags)[V119] < 8) {
_ripRingsBell = series_load("RIP RINGS BELL");
player_update_info();
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "RIP rings bell");
terminateMachineAndNull(_bell);
sendWSMessage_10000(1, _ripOnLadder, _ripRingsBell, 1, 19, 1,
_ripRingsBell, 19, 19, 0);
} else
digi_play("403r48", 1, 255, 12, -1);
break;
case 1:
digi_play("403_s12", 2);
sendWSMessage_10000(1, _ripOnLadder, _ripRingsBell, 19, 19, 2,
_ripRingsBell, 19, 32, 0);
break;
case 2:
sendWSMessage_10000(1, _ripOnLadder, _ripRingsBell, 32, 1, 3,
_ripRingsBell, 1, 1, 0);
break;
case 3:
terminateMachineAndNull(_ripOnLadder);
ws_unhide_walker();
_bell = series_place_sprite("ONE FRAME BELL", 0, 0, 0, 100, 0xf00);
series_unload(_ripRingsBell);
if (_G(flags)[V119] < 7) {
ws_walk_load_shadow_series(S4_SHADOW_DIRS, S4_SHADOW_NAMES);
ws_walk_load_walker_series(S4_NORMAL_DIRS, S4_NORMAL_NAMES);
_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS, 620, 323, 3,
triggerMachineByHashCallback3000, "wolf_walker");
_wolfAdmonish = series_load("WOLF ADMONISHES RIP");
kernel_timing_trigger(120, 4);
} else {
player_set_commands_allowed(true);
}
break;
case 4:
sendWSMessage_10000(_wolfWalker, 687, 323, 3, 5, 1);
break;
case 5:
sendWSMessage_60000(_wolfWalker);
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, false,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolfAdmonish, 1, 18, 6,
_wolfAdmonish, 18, 18, 0);
_ripHeadTurn = series_load("RIP TREK HEAD TURN POS1");
setGlobals1(_ripHeadTurn, 4, 8, 8, 8, 0, 8, 4, 4, 4);
sendWSMessage_110000(-1);
break;
case 6:
sendWSMessage_10000(1, _wolfie, _wolfAdmonish, 19, 31, 7,
_wolfAdmonish, 31, 31, 0);
playNum1(_G(flags)[V119]);
break;
case 7:
sendWSMessage_10000(1, _wolfie, _wolfAdmonish, 31, 1, -1,
_wolfAdmonish, 1, 1, 0);
break;
case 8:
if (_G(flags)[V119] == 1) {
digi_play("403r47", 1, 255, 9);
} else {
kernel_timing_trigger(60, 9);
}
break;
case 9:
terminateMachineAndNull(_wolfie);
_wolfWalker = triggerMachineByHash_3000(8, 8,
*S4_NORMAL_DIRS, *S4_SHADOW_DIRS, 687, 323, 3,
triggerMachineByHashCallback3000, "wolf_walker");
sendWSMessage_10000(_wolfWalker, 620, 323, 3, 10, 0);
playNum2(_G(flags)[V119]);
break;
case 10:
sendWSMessage_60000(_wolfWalker);
sendWSMessage_120000(11);
break;
case 11:
series_unload(_wolfAdmonish);
series_unload(S4_NORMAL_DIRS[1]);
series_unload(S4_NORMAL_DIRS[0]);
series_unload(S4_SHADOW_DIRS[1]);
series_unload(S4_SHADOW_DIRS[0]);
series_unload(_ripHeadTurn);
sendWSMessage_150000(-1);
player_set_commands_allowed(true);
break;
default: // Will catch case 12 triggered in case 1
player_set_commands_allowed(true);
break;
}
}
void Room403::plankUrn() {
switch (_G(kernel).trigger) {
case 69:
player_set_commands_allowed(false);
ws_walk(_G(my_walker), 1110, 322, nullptr, 1, 11);
_plank = 2;
break;
case 1:
_ripPutBoard = series_load("RIPLEY PUTS BOARD ON POTS");
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, false,
triggerMachineByHashCallback, "RIP plants plank");
sendWSMessage_10000(1, _ripOnLadder, _ripPutBoard, 1, 41, 2,
_ripPutBoard, 41, 41, 0);
break;
case 2:
digi_play("403_s07", 2);
sendWSMessage_10000(1, _ripOnLadder, _ripPutBoard, 41, 57, 3,
_ripPutBoard, 57, 57, 0);
break;
case 3:
_board = series_place_sprite("1 SPRITE OF BOARD", 0, 0, 0, 100, 0xf00);
hotspot_set_active("PLANK", true);
inv_move_object("PLANK", 403);
terminateMachineAndNull(_ripOnLadder);
ws_unhide_walker();
series_unload(_ripPutBoard);
player_set_commands_allowed(true);
break;
default:
break;
}
}
bool Room403::edgerUrn() {
switch (_G(kernel).trigger) {
case 1:
if (inv_player_has("EDGER")) {
player_set_commands_allowed(false);
_ripMedReach = series_load("RIP MED REACH 1HAND POS2");
setGlobals1(_ripMedReach, 1, 17, 17, 17, 0, 17, 1, 1, 1);
sendWSMessage_110000(2);
return true;
}
return false;
case 2:
_edger = series_place_sprite("ONE FRAME EDGER", 0, 0, 0, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 403);
sendWSMessage_120000(3);
return true;
case 3:
sendWSMessage_150000(4);
return true;
case 4:
series_unload(_ripMedReach);
player_set_commands_allowed(true);
return true;
case 69:
if (inv_player_has("EDGER")) {
player_set_commands_allowed(false);
ws_walk(_G(my_walker), 1201, 321, nullptr, 1, 2, true);
return true;
}
return false;
default:
return true;
}
}
bool Room403::stepLadderTomb() {
switch (_G(kernel).trigger) {
case -1:
if (inv_player_has("STEP LADDER")) {
player_set_commands_allowed(false);
_series1 = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(1);
return true;
}
return false;
case 1:
digi_play("403_s04", 2);
_ladder = series_place_sprite("1 sprite of ladder", 0, 0, 0, 100, 0xf00);
hotspot_set_active("STEP LADDER", true);
inv_move_object("STEP LADDER", 403);
_G(flags)[V313] = 2;
sendWSMessage_120000(3);
return true;
case 3:
sendWSMessage_150000(4);
return true;
case 4:
series_unload(_series1);
player_set_commands_allowed(true);
return true;
default:
break;
}
return false;
}
bool Room403::takePlank() {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("PLANK")) {
_ripPutBoard = series_load("RIPLEY PUTS BOARD ON POTS");
terminateMachineAndNull(_board);
ws_hide_walker();
_ripOnLadder = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, false,
triggerMachineByHashCallback, "RIP plants plank");
sendWSMessage_10000(1, _ripOnLadder, _ripPutBoard, 57, 1, 2,
_ripPutBoard, 1, 1, 0);
return true;
}
return false;
case 2:
hotspot_set_active("PLANK", false);
inv_give_to_player("PLANK");
_plank = 0;
kernel_examine_inventory_object("PING PLANK", _G(master_palette),
5, 1, 396, 223, 3, nullptr, -1);
return true;
case 3:
terminateMachineAndNull(_ripOnLadder);
ws_unhide_walker();
series_unload(_ripPutBoard);
player_set_commands_allowed(true);
return true;
default:
break;
}
return false;
}
bool Room403::takeEdger() {
switch (_G(kernel).trigger) {
case -1:
if (!inv_player_has("EDGER")) {
player_set_commands_allowed(false);
_ripMedReach = series_load("RIP MED REACH 1HAND POS2");
setGlobals1(_ripMedReach, 1, 17, 17, 17, 0, 17, 1, 1, 1);
sendWSMessage_110000(1);
return true;
}
return false;
case 1:
terminateMachineAndNull(_edger);
hotspot_set_active("EDGER", false);
inv_give_to_player("EDGER");
kernel_examine_inventory_object("PING EDGER", _G(master_palette),
5, 1, 500, 216, 2, nullptr, -1);
return true;
case 2:
sendWSMessage_120000(3);
return true;
case 3:
sendWSMessage_150000(4);
return true;
case 4:
series_unload(_ripMedReach);
player_set_commands_allowed(true);
return true;
case 5:
player_set_commands_allowed(true);
return true;
default:
break;
}
return false;
}
bool Room403::takeStepLadder() {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("STEP LADDER")) {
player_set_commands_allowed(false);
_series1 = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(1);
return true;
}
return false;
case 1:
if (_G(flags)[kWolfLocation] == 403) {
digi_play("403w08", 1, 255, 3);
_wolfMode = 2000;
_wolfShould = 2100;
kernel_timing_trigger(15, 2);
} else {
digi_play("403_s03", 2);
terminateMachineAndNull(_ladder);
hotspot_set_active("STEP LADDER", false);
inv_give_to_player("STEP LADDER");
_G(flags)[V313] = 0;
kernel_examine_inventory_object("PING STEP LADDER", _G(master_palette),
5, 1, 429, 215, 2, nullptr, -1);
}
return true;
case 2:
sendWSMessage_120000(4);
return true;
case 3:
_wolfShould = 2105;
digi_play("403r47", 1);
return true;
case 4:
sendWSMessage_150000(5);
return true;
case 5:
series_unload(_series1);
player_set_commands_allowed(true);
return true;
default:
break;
}
return false;
}
void Room403::takeStepLadder_() {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("STEP LADDER")) {
player_set_commands_allowed(false);
_series1 = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_series1, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(1);
}
break;
case 1:
if (_G(flags)[kWolfLocation] == 403) {
digi_play("403w08", 1, 255, 3);
_wolfMode = 2000;
_wolfShould = 2100;
kernel_timing_trigger(15, 2);
} else {
digi_play("403_s03", 2);
hotspot_set_active("STEP LADDER ", false);
inv_give_to_player("STEP LADDER");
_G(flags)[V313] = 0;
kernel_examine_inventory_object("PING STEP LADDER",
_G(master_palette), 5, 1, 496, 226, 2, nullptr, -1);
terminateMachineAndNull(_ladder);
}
break;
case 2:
sendWSMessage_120000(4);
break;
case 3:
_wolfShould = 2105;
digi_play("403r47", 1);
break;
case 4:
sendWSMessage_150000(5);
break;
case 5:
series_unload(_series1);
player_set_commands_allowed(true);
break;
case 6:
player_set_commands_allowed(true);
break;
default:
break;
}
}
void Room403::useJournal() {
if (_G(flags)[kGraveyardCartoon]) {
digi_play("403r42", 1);
} else if (_G(flags)[kEpitaphCartoon]) {
if (_G(kernel).trigger == 6)
_G(flags)[kGraveyardCartoon] = 1;
sketchInJournal(nullptr);
} else {
if (_G(kernel).trigger == 6)
_G(flags)[kGraveyardCartoon] = 1;
sketchInJournal("403r41");
}
}
void Room403::playNum1(int num) {
static const char *const NAMES[] = {
"403w11", "403w13", "403w15", "403w16",
"403w17", "403w18", "403w1", "403w1"
};
digi_play(NAMES[num - 1], 1, 255, 8);
}
void Room403::playNum2(int num) {
switch (num) {
case 1:
digi_play("403w12", 1);
break;
case 2:
digi_play("403w14", 1);
break;
default:
break;
}
}
void Room403::syncGame(Common::Serializer &s) {
s.syncAsSint32LE(_ripleyMode);
s.syncAsSint32LE(_ripleyShould);
s.syncAsSint32LE(_wolfMode);
s.syncAsSint32LE(_wolfShould);
s.syncAsSint32LE(_val1);
s.syncAsSint32LE(_val3);
s.syncAsSint32LE(_val5);
s.syncAsSint32LE(_ladderMode);
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4