Initial commit

This commit is contained in:
2026-02-02 04:50:13 +01:00
commit 5b11698731
22592 changed files with 7677434 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,76 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM401_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM401_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room401 : public Room {
private:
int _val1 = 0;
int _val2 = 0;
int _ripleyShould = 0;
int32 _val4 = 0;
int _agentMode = 0;
int _agentShould = 0;
int _ripleyMode = 0;
const char *_digiName1 = nullptr;
const char *_digiName2 = nullptr;
const char *_digiName3 = nullptr;
const char *_digiName4 = nullptr;
int _401a01 = 0;
int _401a02 = 0;
int _401a03 = 0;
int _401a04 = 0;
int _401a05 = 0;
int _401a06 = 0;
int _401rp01 = 0;
int _rip1 = 0;
int _rip2 = 0;
int _rip3 = 0;
int _rip4 = 0;
machine *_agent = nullptr;
machine *_ripMach = nullptr;
const char *_digiName = nullptr;
int _ctr1 = 0;
void conv401a();
int getItemCount() const;
public:
Room401() : Room() {}
~Room401() override {}
void init() override;
void daemon() override;
void parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,96 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM402_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM402_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room402 : public Room {
private:
int _val1 = 0;
int _val2 = 0;
int _val4 = 0;
int _trigger1 = 0;
int _val6 = 0;
int _val8 = 0;
int _currentNode = 0;
int _dialogMode = 0;
int _dialogShould = 0;
int _wolfMode = 0;
int _wolfShould = 0;
int _val14 = 0;
machine *_wolfie = nullptr;
machine *_wolfieMach = nullptr;
int _shadow3 = 0;
int _ripPaysWolfie = 0;
int _ripTalkWolf = 0;
int _ripTalker = 0;
int _wolfClipping = 0;
int _wolfClippersDown = 0;
int _wolfShakesHead = 0;
int _wolfWantsMoney = 0;
int _ripHeadTurn = 0;
int _ripDownStairs = 0;
machine *_ripEnterLeave = nullptr;
machine *_branch = nullptr;
int _wolfTurnsClipping = 0;
int _turtlePopup = 0;
int _ripLeanWall = 0;
machine *_wolfWalker = nullptr;
machine *_safariShadow = nullptr;
int _ripMessesBush = 0;
int _ripClimbKnock = 0;
int _doorOpens = 0;
machine *_castleDoor = nullptr;
machine *_machine1 = nullptr;
int _machine1Series = 0;
int _flags111 = 0;
machine *_turtlePopupMach = nullptr;
int _letter = 0;
Common::String _sound1;
Common::String _sound2;
void conv402a();
void conv402a777();
void useTopiary();
void enterCastle();
public:
Room402() : Room() {}
~Room402() override {}
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
void syncGame(Common::Serializer &s) override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,109 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM403_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM403_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room403 : public Room {
private:
machine *_bell = nullptr;
int _val1 = 0;
int _ripleyTrigger = -1;
int _val3 = 0;
int _wolfTrigger = -1;
int _val5 = 0;
int _ripleyMode = 0;
int _ripleyShould = 0;
int _wolfMode = 0;
int _wolfShould = 0;
int _ladderMode = 0;
Common::String _sound1;
int _val12 = 0;
int _val13 = 0;
int _plank = 0;
machine *_ventClosed = nullptr;
machine *_edger = nullptr;
machine *_ladder = nullptr;
machine *_board = nullptr;
machine *_wolfie = nullptr;
machine *_ripOnLadder = nullptr;
int _ripClimbsLadder = 0;
int _safariShadow = 0;
int _wolfTurnTalk = 0;
int _wolfTurnHand = 0;
int _wolfTalkLeave = 0;
int _ripTalkPay = 0;
int _wolfEdger = 0;
int _ripLegUp = 0;
int _ripTurtle = 0;
int _noTreat = 0;
bool _flag1 = false;
bool _flag2 = false;
bool _flag3 = 0;
int _ripRingsBell = 0;
machine *_wolfWalker = nullptr;
int _wolfAdmonish = 0;
int _ripHeadTurn = 0;
int _ripMedReach = 0;
int _series1 = 0;
int _ripPutBoard = 0;
machine *_ripTalksWolf = nullptr;
int _ripPlankEdger = 0;
machine *_wolfJustSo = nullptr;
int _wolfIndicatesTomb = 0;
int _turtlePopup = 0;
void conv403a();
void conv403a1();
void edgerBell();
void plankUrn();
bool edgerUrn();
bool stepLadderTomb();
bool takePlank();
bool takeEdger();
bool takeStepLadder();
void takeStepLadder_();
void useJournal();
void playNum1(int num);
void playNum2(int num);
public:
Room403() : Room() {}
~Room403() override {}
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
void syncGame(Common::Serializer &s) override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,589 @@
/* 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/room404.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
#include "m4/riddle/riddle.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
static const int16 NORMAL_DIRS[] = { 200, 201, -1 };
static const char *NORMAL_NAMES[] = {
"butler walker pos1",
"butler walker pos3"
};
static const int16 SHADOW_DIRS[] = { 200, 201, -1 };
static const char *SHADOW_NAMES[] = {
"butler walker shadow pos1",
"butler walker shadow pos3"
};
static const char *const SAID[][2] = {
{ "DOOR", "404r10" },
{ "BUTLER", "404r30" },
{ "HUGE DOOR", "404r11" },
{ "LARGE PAINTING", "404r13" },
{ "PAINTING", "404r14" },
{ "RUG", "404r12" },
{ nullptr, nullptr }
};
void Room404::init() {
_door = series_place_sprite("404DOORA", 0, 0, 0, 100, 0xf00);
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
player_set_commands_allowed(false);
_val1 = 0;
_val2 = -1;
_val3 = 0;
_val4 = -1;
_val5 = 0;
_val6 = 0;
_val7 = 0;
_val8 = 0;
}
_safariShadow = series_load("SAFARI SHADOW 3");
_butlerTurns7 = series_load("Butler turns to pos7");
_butlerTurns9 = series_load("Butler turns to pos9");
_butlerTalkLoop = series_load("Butler talk loop");
_val7 = 2000;
_val8 = 2100;
switch (_G(game).previous_room) {
case KERNEL_RESTORING_GAME:
_butlerTalks = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x900, false,
triggerMachineByHashCallback, "BUTLER talks rip");
sendWSMessage_10000(1, _butlerTalks, _butlerTalkLoop, 1, 1, -1,
_butlerTalkLoop, 1, 1, 0);
player_set_commands_allowed(true);
break;
case 405:
_butlerTalks = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x900, false,
triggerMachineByHashCallback, "BUTLER talks rip");
sendWSMessage_10000(1, _butlerTalks, _butlerTalkLoop, 1, 1, -1,
_butlerTalkLoop, 1, 1, 0);
ws_demand_location(_G(my_walker), 58, 347, 3);
ws_walk(_G(my_walker), 90, 347, nullptr, 50, 3);
break;
case 406:
_butlerTalks = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x900, false,
triggerMachineByHashCallback, "BUTLER talks rip");
sendWSMessage_10000(1, _butlerTalks, _butlerTalkLoop, 1, 1, -1,
_butlerTalkLoop, 1, 1, 0);
ws_demand_location(_G(my_walker), 174, 268, 3);
ws_walk(_G(my_walker), 250, 285, nullptr,
inv_player_has("BILLIARD BALL") ? 70 : 60, 3, true);
break;
default:
ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
ws_demand_location(_G(my_walker), 340, 480, 2);
_machine1 = triggerMachineByHash_3000(8, 10, *NORMAL_DIRS, *SHADOW_DIRS,
380, 421, 1, triggerMachineByHashCallback3000, "BUTLER_walker");
if (_G(kittyScreaming) || player_been_here(404)) {
sendWSMessage_10000(_machine1, 410, 332, 1, 42, 1);
kernel_timing_trigger(1, 40);
} else {
sendWSMessage_10000(_machine1, 410, 332, 1, 21, 1);
kernel_timing_trigger(120, 20);
}
digi_play("404_s01", 2);
break;
}
}
void Room404::daemon() {
int frame;
switch (_G(kernel).trigger) {
case 20:
ws_walk(_G(my_walker), 370, 347, nullptr, -1, 1);
break;
case 21:
sendWSMessage_60000(_machine1);
_butlerTalks = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x900, false,
triggerMachineByHashCallback, "BUTLER talks rip");
sendWSMessage_10000(1, _butlerTalks, _butlerTurns7, 1, 10, 23,
_butlerTalkLoop, 1, 1, 0);
break;
case 23:
if (!_G(flags)[V337]) {
digi_play("404r03", 1, 255, 24);
_G(flags)[V337] = 1;
_val7 = 2000;
_val8 = 2102;
kernel_timing_trigger(1, 110);
} else {
digi_play("404r02", 1, 255, 30);
}
break;
case 24:
_val8 = 2102;
digi_play("404u01", 1, 255, 25);
break;
case 25:
_val8 = 2102;
digi_play("404r04", 1, 255, 26);
break;
case 26:
_val8 = 2101;
digi_play("404u02", 1, 255, 27);
break;
case 27:
_val8 = 2102;
digi_play("404r05", 1, 255, 28);
break;
case 28:
_val8 = 2101;
digi_play("404u03", 1, 255, 29);
break;
case 29:
_val8 = 2103;
digi_play("404r06", 1, 255, 30);
break;
case 30:
digi_play("404u04", 1);
sendWSMessage_10000(1, _butlerTalks, _butlerTurns9, 1, 43, 32,
_butlerTurns9, 43, 43, 0);
break;
case 32:
terminateMachineAndNull(_butlerTalks);
_machine1 = triggerMachineByHash_3000(8, 10, *NORMAL_DIRS, *SHADOW_DIRS,
390, 332, 9, triggerMachineByHashCallback3000, "BUTLER_walker");
sendWSMessage_10000(_machine1, 58, 347, 1, -1, true);
kernel_timing_trigger(270, 33);
break;
case 33:
ws_walk(_G(my_walker), 58, 347, nullptr, -1, 9, true);
kernel_timing_trigger(90, 34);
break;
case 34:
disable_player_commands_and_fade_init(35);
break;
case 35:
midi_stop();
digi_stop(3);
_G(game).setRoom(405);
break;
case 40:
ws_walk(_G(my_walker), 370, 347, nullptr, -1, 1);
break;
case 42:
sendWSMessage_60000(_machine1);
_butlerTalks = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x900, false,
triggerMachineByHashCallback, "BUTLER talks rip");
sendWSMessage_10000(1, _butlerTalks, _butlerTurns7, 1, 10, 43,
_butlerTalkLoop, 1, 1, 0);
break;
case 43:
if (!_G(flags)[kWolfFled] || _G(flags)[kButlerSaidWolfFled]) {
player_set_commands_allowed(true);
} else {
_G(flags)[kButlerSaidWolfFled] = 1;
kernel_timing_trigger(1, 44);
}
break;
case 44:
digi_play("404r20", 1, 255, 45);
_val7 = 2000;
_val8 = 2102;
kernel_timing_trigger(1, 110);
break;
case 45:
_val8 = 2101;
digi_play("404u10", 1, 255, 46);
break;
case 46:
_val8 = 2102;
digi_play("404r21", 1, 255, 47);
break;
case 47:
_val8 = 2101;
digi_play("404u11", 1, 255, 48);
break;
case 48:
_val8 = 2102;
digi_play("404r22", 1, 255, 49);
ws_walk(_G(my_walker), 368, 349, nullptr, -1, 8);
break;
case 49:
case 50:
case 60:
player_set_commands_allowed(true);
break;
case 70:
if (++_G(flags)[V128] == 1)
digi_play("404u12", 1, 255, 72);
else
digi_play("404u13", 1, 255, 72);
_val8 = 2101;
break;
case 72:
_val8 = 2102;
ws_walk(_G(my_walker), 174, 268, nullptr, 73, 9);
if (_G(flags)[V128] == 1)
digi_play("404r23", 1);
break;
case 73:
disable_player_commands_and_fade_init(74);
break;
case 74:
midi_stop();
digi_stop(3);
_G(game).setRoom(406);
break;
case 100:
kernel_timing_trigger(1, 102);
break;
case 101:
_val5 = 1000;
_val6 = 1105;
break;
case 102:
if (_val2 != -1) {
kernel_timing_trigger(1, _val2);
_val2 = -1;
} else {
kernel_timing_trigger(1, 103);
}
break;
case 103:
if (_val5 == 1000) {
switch (_val6) {
case 1100:
player_set_commands_allowed(false);
_val7 = 2000;
_val8 = 2100;
kernel_timing_trigger(1, 110);
_val6 = 1103;
kernel_timing_trigger(1, 102);
conv_load("conv404a", 10, 10, 101);
conv_export_pointer_curr(&_G(flags)[V135], 0);
conv_export_value_curr(player_been_here(407) ? 1 : 0, 1);
conv_play();
break;
case 1102:
case 1103:
kernel_timing_trigger(10, 102);
break;
case 1105:
_val8 = 2103;
player_set_commands_allowed(true);
break;
default:
break;
}
}
break;
case 110:
if (_val7 == 2000) {
switch (_val8) {
case 2100:
case 2101:
case 2102:
case 2103:
if (_val4 != -1) {
kernel_timing_trigger(1, _val4);
_val4 = -1;
} else {
kernel_timing_trigger(1, 111);
}
break;
default:
break;
}
}
break;
case 111:
if (_val7 == 2000) {
switch (_val8) {
case 2100:
case 2102:
sendWSMessage_10000(1, _butlerTalks, _butlerTalkLoop, 1, 1, 110,
_butlerTalkLoop, 1, 1, 0);
break;
case 2101:
frame = imath_ranged_rand(12, 21);
sendWSMessage_10000(1, _butlerTalks, _butlerTalkLoop, frame, frame, 110,
_butlerTalkLoop, frame, frame, 0);
break;
case 2103:
sendWSMessage_10000(1, _butlerTalks, _butlerTalkLoop, 1, 1, -1,
_butlerTalkLoop, 1, 1, 0);
break;
default:
break;
}
}
break;
default:
break;
}
}
void Room404::pre_parser() {
const bool takeFlag = player_said("take");
const bool lookFlag = player_said_any("look", "look at");
const bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
if ((player_said("SITTING ROOM") && (lookFlag || useFlag || takeFlag)) ||
(lookFlag && player_said(" "))) {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
if (player_said("journal") && !takeFlag && !lookFlag &&
_G(kernel).trigger == -1) {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
}
void Room404::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("conv404a")) {
if (_G(kernel).trigger == 1) {
_val6 = 1103;
_val8 = 2102;
conv_resume();
} else {
conv404a();
}
} else if (player_said("-", " ")) {
// No implementation
} else if (talkFlag && player_said("butler")) {
player_set_commands_allowed(false);
_val4 = -1;
_val5 = 1000;
_val6 = 1100;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 102);
_G(kernel).trigger_mode = KT_PARSE;
} else if (enterFlag && player_said("BILLIARDS ROOM")) {
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(406);
break;
default:
break;
}
} else if (player_said("WALK TO", "OUTSIDE CASTLE")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
player_update_info();
ws_walk(_G(my_walker), _G(player_info).x, _G(player_info).y + 50, nullptr, -1, 5);
disable_player_commands_and_fade_init(1);
break;
case 1:
midi_stop();
digi_stop(3);
_G(game).setRoom(402);
break;
default:
break;
}
} else if (player_said("WALK TO", "OUTSIDE CASTLE")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
ws_walk(_G(my_walker), 58, 347, nullptr, -1, 9);
disable_player_commands_and_fade_init(1);
break;
case 1:
midi_stop();
digi_stop(3);
_G(game).setRoom(402);
break;
default:
break;
}
} else if (enterFlag && player_said("SITTING ROOM")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
ws_walk(_G(my_walker), 58, 347, nullptr, -1, 9);
disable_player_commands_and_fade_init(1);
break;
case 1:
midi_stop();
digi_stop(3);
_G(game).setRoom(405);
break;
default:
break;
}
} else if (player_said("GO", "STAIRS")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
if (!_G(flags)[V126]) {
_G(flags)[V126] = 1;
digi_play("404u05", 1, 255, 2);
_val7 = 2000;
_val8 = 2102;
_G(kernel).trigger = KT_DAEMON;
kernel_timing_trigger(1, 110);
_G(kernel).trigger_mode = KT_PARSE;
} else {
digi_play("404r15", 1, 255, 2);
}
break;
case 2:
_val8 = 2103;
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (lookFlag && player_said("BILLIARDS ROOM")) {
digi_play(player_been_here(405) ? "404r08a" : "404r08", 1);
} else if (player_said("SITTING ROOM") && (useFlag || takeFlag) &&
_G(kernel).trigger >= -1) {
ws_walk(_G(my_walker), 115, 350, nullptr, 2, 9);
} else if (lookFlag && player_said("SITTING ROOM")) {
switch (_G(kernel).trigger) {
case -1:
ws_walk(_G(my_walker), 115, 350, nullptr, 2, 9);
break;
default:
digi_play("404r09", 1);
break;
}
} else if (lookFlag && _G(walker).ripley_said(SAID)) {
// No implementation
} else if (lookFlag && player_said(" ")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
digi_play("404r07", 1, 255, 2);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (player_said("journal") && !takeFlag && !lookFlag &&
!inv_player_has(_G(player).noun)) {
if (_G(flags)[kCastleCartoon]) {
digi_play("com016", 1);
} else if (_G(kernel).trigger == 6) {
_G(flags)[kCastleCartoon] = 1;
sketchInJournal("com015");
} else {
sketchInJournal("");
}
} else {
return;
}
_G(player).command_ready = false;
}
void Room404::conv404a() {
const int who = conv_whos_talking();
_currentNode = conv_current_node();
const char *sound = conv_sound_to_play();
if (sound) {
if (who <= 0)
_val8 = 2101;
else if (who == 1)
_val6 = 1102;
digi_play(sound, 1, 255, 1);
} else {
conv_resume();
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,66 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM404_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM404_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room404 : public Room {
private:
int _val1 = 0;
int _val2 = 0;
int _val3 = 0;
int _val4 = 0;
int _val5 = 0;
int _val6 = 0;
int _val7 = 0;
int _val8 = 0;
int _safariShadow = 0;
int _butlerTurns7 = 0;
int _butlerTurns9 = 0;
int _butlerTalkLoop = 0;
machine *_door = nullptr;
machine *_butlerTalks = nullptr;
machine *_machine1 = nullptr;
int _currentNode = 0;
void conv404a();
public:
Room404() : Room() {}
~Room404() override {}
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,923 @@
/* 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/room405.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
#include "m4/riddle/riddle.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
static const int16 NORMAL_DIRS[] = { 220, 221, -1 };
static const char *NORMAL_NAMES[] = {
"baron walker pos1",
"baron walker pos7"
};
static const int16 SHADOW_DIRS[] = { 230, 231, -1 };
static const char *SHADOW_NAMES[] = {
"baron walker shadow pos1",
"baron walker shadow pos7"
};
static const char *const SAID[][2] = {
{ "FIREPLACE", "405r05" },
{ "WINDOW", "405r06" },
{ "ZEBRA SKIN", "405r07" },
{ "DEER HEAD", "405r08" },
{ "BATTLE AXE", "405r09" },
{ "SHIELD", "405r09" },
{ "CHANDELIER", "405r10" },
{ "BOOKSHELF", "405r11" },
{ "RUG", "405r16" },
{ "CHAIR", "405r13" },
{ nullptr, nullptr }
};
void Room405::init() {
player_set_commands_allowed(false);
_door = series_place_sprite("405doora", 0, 0, 0, 100, 0);
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
_val1 = 0;
_val2 = -1;
_val3 = 0;
_val4 = -1;
_val5 = 0;
_val6 = 0;
_val7 = 0;
_val8 = 0;
_val9 = 0;
}
if (!_G(flags)[kGermanBanknoteFound] || !inv_object_is_here("GERMAN BANKNOTE"))
hotspot_set_active("GERMAN BANKNOTE", false);
_safariShadow = series_load("SAFARI SHADOW 3");
if (inv_object_is_here("GERMAN BANKNOTE"))
_bankNote = series_place_sprite("405 BANK NOTE UNDER RUG", 0, 0, 0, 100, 0xf00);
_candlesBurning = series_load("TWO CANDLES BURNING");
_candles = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, false,
triggerMachineByHashCallback, "candles");
sendWSMessage_10000(1, _candles, _candlesBurning, 1, 8, -1,
_candlesBurning, 1, 8, 0);
if (_G(game).previous_room == KERNEL_RESTORING_GAME) {
player_set_commands_allowed(true);
return;
}
_G(flags)[V110] = 1;
if (!inv_player_has("TURTLE"))
inv_move_object("TURTLE", 305);
ws_demand_location(_G(my_walker), 155, 370, 9);
if (player_been_here(405) || _G(kittyScreaming)) {
ws_walk(_G(my_walker), 230, 345, nullptr, 50, 2);
} else {
ws_walk_load_shadow_series(SHADOW_DIRS, SHADOW_NAMES);
ws_walk_load_walker_series(NORMAL_DIRS, NORMAL_NAMES);
_baron = triggerMachineByHash_3000(8, 11, *NORMAL_DIRS, *SHADOW_DIRS, 185, 365, 1,
triggerMachineByHashCallback3000, "BARON_walker");
ws_walk(_G(my_walker), 329, 320, nullptr, 20, 9);
}
}
void Room405::daemon() {
int frame;
switch (_G(kernel).trigger) {
case 20:
digi_preload("405b01a");
_baronShakeSit = series_load("BARON SHAKES AND SITS");
_baronTalkLoop = series_load("BARON TALK LOOP");
_baronLeanForward = series_load("BARON LEAN FORWARD");
_baronTurnWalk = series_load("BARON TURNWALK");
_ripHandLetter = series_load("RIP HANDS BARON LETTER");
_ripTalkGesture = series_load("RIPLEY TALKGESTURE");
_ripLeanForward = series_load("RIPLEY LEAN FORWARD");
_lowReacher = series_load("RIP TREK MED REACH HAND POS1");
_ripHeadTurn = series_load("RIP TREK HEAD TURN POS3");
digi_preload("13_05n03");
digi_preload("13_03n01");
digi_preload("13_09p03");
setGlobals1(_ripHeadTurn, 6, 9, 9, 9, 0, 9, 6, 6, 6);
sendWSMessage_110000(-1);
kernel_timing_trigger(50, 21);
sendWSMessage_10000(_baron, 284, 324, 1, 22, 1);
break;
case 21:
sendWSMessage_120000(-1);
break;
case 22:
ws_demand_location(_G(my_walker), 286, 324, 7);
ws_hide_walker(_baron);
sendWSMessage_150000(-1);
ws_hide_walker(_G(my_walker));
_baronWalker = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x600, false,
triggerMachineByHashCallback, "BARON talks rip");
sendWSMessage_10000(1, _baronWalker, _baronShakeSit, 1, 48, 23,
_baronShakeSit, 48, 48, 0);
digi_play("405b01", 1);
break;
case 23:
sendWSMessage_10000(1, _baronWalker, _baronShakeSit, 48, 100, 24,
_baronShakeSit, 100, 100, 0);
digi_play("405b01a", 1, 255, 25);
break;
case 24:
_ripTalksBaron = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x600, false,
triggerMachineByHashCallback, "rip talks baron");
_val5 = 1000;
_val6 = 1103;
kernel_timing_trigger(1, 102);
_val7 = 2000;
_val8 = 2101;
kernel_timing_trigger(1, 110);
break;
case 25:
digi_play("405b02", 1, 255, 26);
break;
case 26:
_val8 = 2102;
_val6 = 1102;
digi_play("405r01", 1, 255, 27);
break;
case 27:
_val6 = 1104;
_val8 = 2101;
digi_play("405b03", 1, 255, 28);
break;
case 28:
_val8 = 2103;
kernel_timing_trigger(10, 29);
break;
case 29:
terminateMachineAndNull(_baronWalker);
sendWSMessage_10000(1, _ripTalksBaron, _ripHandLetter, 1, 15, 30,
_ripHandLetter, 15, 15, 0);
break;
case 30:
digi_preload("950_s06");
sendWSMessage_10000(1, _ripTalksBaron, _ripHandLetter, 16, 29, -1,
_ripHandLetter, 29, 29, 0);
digi_play("405r02", 1, 255, 31);
digi_play("950_s06", 2, 255, -1, 950);
break;
case 31:
sendWSMessage_10000(1, _ripTalksBaron, _ripHandLetter, 30, 84, -1,
_ripHandLetter, 84, 84, 0);
kernel_timing_trigger(45, 32);
break;
case 32:
digi_play("405b04", 1, 255, 33);
break;
case 33:
digi_play("405b03", 1, 255, 34);
break;
case 34:
digi_play("405b05", 1, 255, 35);
break;
case 35:
digi_play("950_s06", 2, 255, -1, 950);
sendWSMessage_10000(1, _ripTalksBaron, _ripHandLetter, 85, 98, 36,
_ripHandLetter, 98, 98, 0);
break;
case 36:
_baronWalker = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0x600, false,
triggerMachineByHashCallback, "BARON talks rip");
sendWSMessage_10000(1, _baronWalker, _baronTalkLoop, 1, 1, 110,
_baronTalkLoop, 1, 1, 0);
kernel_timing_trigger(1, 37);
break;
case 37:
digi_play("405b05a", 1, 255, 38);
_val8 = 2101;
kernel_timing_trigger(1, 110);
break;
case 38:
_val8 = 2102;
sendWSMessage_10000(1, _ripTalksBaron, _ripHandLetter, 15, 1, 39,
_ripHandLetter, 1, 1, 0);
break;
case 39:
_val5 = 1000;
_val6 = 1100;
kernel_timing_trigger(1, 102);
break;
case 40:
kernel_timing_trigger(1, 60);
break;
case 50:
case 69:
player_set_commands_allowed(true);
break;
case 61:
digi_play("13_15n07", 1, 255, 62);
break;
case 62:
sendWSMessage_10000(1, _baronWalker, _baronTurnWalk, 58, 79, 63,
_baronTurnWalk, 80, 82, 4);
sendWSMessage_1a0000(_baronWalker, 11);
break;
case 63:
digi_play("13_20p01", 1, 255, 64);
break;
case 64:
sendWSMessage_10000(1, _baronWalker, _baronTurnWalk, 83, 99, 65,
_baronTurnWalk, 99, 99, 0);
break;
case 65:
ws_unhide_walker(_baron);
ws_unhide_walker();
setGlobals1(_ripHeadTurn, 6, 9, 9, 9, 0, 9, 6, 6, 6);
sendWSMessage_110000(-1);
terminateMachineAndNull(_baronWalker);
sendWSMessage_10000(_baron, 185, 365, 9, 66, 1);
break;
case 66:
sendWSMessage_60000(_baron);
digi_play("13_20n01", 1, 255, 67);
sendWSMessage_120000(68);
break;
case 67:
digi_play("405_s01", 2, 255, 69);
break;
case 68:
sendWSMessage_150000(-1);
break;
case 100:
kernel_timing_trigger(1, 102);
break;
case 101:
_val8 = 2163;
break;
case 102:
if (_val2 != -1) {
kernel_timing_trigger(1, _val2);
_val2 = -1;
} else {
kernel_timing_trigger(1, 103);
}
break;
case 103:
if (_val5 == 1000) {
switch (_val6) {
case 1100:
ws_hide_walker();
player_set_commands_allowed(false);
sendWSMessage_10000(1, _ripTalksBaron, _ripTalkGesture, 13, 13, 102,
_ripTalkGesture, 13, 13, 0);
_val6 = 1101;
_val7 = 2000;
_val8 = 2100;
kernel_timing_trigger(1, 110);
break;
case 1101:
_val6 = 1103;
kernel_timing_trigger(1, 102);
conv_load("conv405a", 10, 10, 101);
conv_export_pointer_curr(&_G(flags)[V115], 0);
conv_export_pointer_curr(&_G(flags)[V314], 1);
conv_play();
break;
case 1102:
frame = imath_ranged_rand(13, 16);
sendWSMessage_10000(1, _ripTalksBaron, _ripTalkGesture, frame, frame, 102,
_ripTalkGesture, frame, frame, 0);
break;
case 1103:
sendWSMessage_10000(1, _ripTalksBaron, _ripTalkGesture, 13, 13, 102,
_ripTalkGesture, 13, 13, 0);
break;
case 1104:
sendWSMessage_10000(1, _ripTalksBaron, _ripTalkGesture, 13, 13, -1,
_ripTalkGesture, 13, 13, 0);
break;
case 1220:
_G(kernel).call_daemon_every_loop = true;
_response = series_stream("RIP DONT I KNOW", 4, 0, 103);
series_stream_break_on_frame(_response, 9, 103);
_val6 = 1221;
break;
case 1221:
if (!_sound2.empty()) {
digi_play(_sound2.c_str(), 1);
_sound2.clear();
}
_G(kernel).call_daemon_every_loop = false;
_val6 = 1222;
break;
case 1222:
_val6 = 1103;
kernel_timing_trigger(1, 102);
conv_resume();
break;
case 1230:
sendWSMessage_10000(1, _ripTalksBaron, _ripLeanForward, 1, 16, 103,
_ripLeanForward, 16, 16, 0);
_val6 = 1232;
break;
case 1232:
_val6 = 1233;
if (!_sound2.empty()) {
digi_play(_sound2.c_str(), 1, 255, 103);
_sound2.clear();
}
break;
case 1233:
sendWSMessage_10000(1, _ripTalksBaron, _ripLeanForward, 16, 1, 102,
_ripLeanForward, 1, 1, 0);
_val6 = 1103;
conv_resume();
break;
case 2110:
sendWSMessage_10000(1, _ripTalksBaron, _ripTalkGesture, 13, 42, 103,
_ripTalkGesture, 42, 42, 0);
_val6 = 2112;
if (!_sound2.empty()) {
_G(kernel).trigger_mode = KT_PARSE;
digi_play(_sound2.c_str(), 1);
_G(kernel).trigger_mode = KT_DAEMON;
_sound2.clear();
}
break;
case 2112:
_val6 = 1102;
kernel_timing_trigger(1, 102);
conv_resume();
break;
default:
break;
}
}
break;
case 110:
if (_val7 == 2000) {
if (_val4 != -1) {
kernel_timing_trigger(1, _val4);
_val4 = -1;
} else {
kernel_timing_trigger(1, 111);
}
}
break;
case 111:
if (_val7 == 2000) {
switch (_val8) {
case 2100:
case 2102:
sendWSMessage_10000(1, _baronWalker, _baronTalkLoop, 1, 1, 110,
_baronTalkLoop, 1, 1, 0);
_val8 = 2102;
break;
case 2101:
frame = imath_ranged_rand(4, 9);
sendWSMessage_10000(1, _baronWalker, _baronTalkLoop, frame, frame, 110,
_baronTalkLoop, frame, frame, 0);
break;
case 2103:
sendWSMessage_10000(1, _baronWalker, _baronTalkLoop, 1, 1, -1,
_baronTalkLoop, 1, 1, 0);
break;
case 2110:
_G(kernel).call_daemon_every_loop = true;
_response = series_stream("Baron sport is life", 5, 0, 111);
series_stream_break_on_frame(_response, 3, 111);
_val8 = 2111;
break;
case 2111:
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1);
_sound1.clear();
}
_G(kernel).call_daemon_every_loop = false;
_val8 = 2112;
break;
case 2112:
case 2153:
_val8 = 2102;
kernel_timing_trigger(1, 110);
conv_resume();
break;
case 2120:
_G(kernel).call_daemon_every_loop = true;
_response = series_stream("BARON WORLD WAR", 6, 0, 111);
series_stream_break_on_frame(_response, 4, 111);
_val8 = 2121;
break;
case 2121:
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1);
_sound1.clear();
}
_val8 = 2122;
_G(kernel).call_daemon_every_loop = false;
break;
case 2122:
kernel_timing_trigger(1, 666);
break;
case 2123:
_val8 = 2152;
kernel_timing_trigger(1, 110);
_val6 = 1103;
kernel_timing_trigger(1, 102);
break;
case 2140:
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, 1, 11, -1,
_baronLeanForward, 12, 18, 1);
_val8 = 2142;
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1, 255, 111);
_sound1.clear();
}
break;
case 2142:
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, 11, 11, 111,
_baronLeanForward, 11, 11, 0);
_val8 = 2162;
conv_resume();
break;
case 2150:
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, 11, 11, -1,
_baronLeanForward, 12, 18, 1);
if (!_sound1.empty()) {
digi_play(_sound1.c_str(), 1, 255, 111);
_sound1.clear();
}
break;
case 2152:
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, 12, 1, 111,
_baronLeanForward, 1, 1, 0);
_val8 = 2153;
break;
case 2161:
frame = imath_ranged_rand(12, 18);
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, frame, frame, 110,
_baronLeanForward, frame, frame, 0);
break;
case 2162:
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, 11, 11, 111,
_baronLeanForward, 11, 11, 0);
_val8 = 2162;
break;
case 2163:
terminateMachineAndNull(_ripTalksBaron);
sendWSMessage_10000(1, _baronWalker, _baronTurnWalk, 1, 57, 61,
_baronTurnWalk, 77, 79, 4);
sendWSMessage_1a0000(_baronWalker, 11);
break;
case 2171:
sendWSMessage_10000(1, _baronWalker, _baronLeanForward, 12, 1, 111,
_baronLeanForward, 1, 1, 0);
_val8 = 2102;
break;
default:
break;
}
}
break;
case 666:
_response = series_stream("RIP WAR REACTION", 5, 0, 111);
series_stream_break_on_frame(_response, 4, 667);
_val8 = 2123;
break;
case 667:
series_set_frame_rate(_response, 15);
series_stream_break_on_frame(_response, 10, 668);
break;
case 668:
series_set_frame_rate(_response, 5);
ws_OverrideCrunchTime(_response);
break;
default:
break;
}
}
void Room405::pre_parser() {
const bool takeFlag = player_said("take");
const bool lookFlag = player_said_any("look", "look at");
const bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
if (player_said("DOOR") && (lookFlag || useFlag || takeFlag)) {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
if (player_said("journal") && !takeFlag && !lookFlag && _G(kernel).trigger == -1) {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
}
void Room405::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("conv405a")) {
if (_G(kernel).trigger == 1)
conv405a1();
else
conv405a();
} else if (talkFlag && player_said("baron")) {
player_set_commands_allowed(false);
_val4 = -1;
_val5 = 1000;
_val6 = 1100;
_G(kernel).trigger_mode = KT_DAEMON;
kernel_timing_trigger(1, 102);
_G(kernel).trigger_mode = KT_PARSE;
} else if (enterFlag) {
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(404);
break;
default:
break;
}
} else if (lookFlag && player_said("DOOR") && lookDoor()) {
// No implementation
} else if (useFlag && player_said("DOOR") && useDoor()) {
// No implementation
} else if (takeFlag && player_said("DOOR") && takeDoor()) {
// No implementation
} else if (lookFlag && _G(walker).ripley_said(SAID)) {
// No implementation
} else if ((lookFlag && player_said("LIBRARY TABLE")) ||
(lookFlag && player_said("JOURNAL "))) {
if (_val9) {
doAction("405r14");
} else {
switch (_G(kernel).trigger) {
case -1:
digi_play("405r14", 1, 255, 1);
break;
case 1:
digi_play("405r14a", 1);
_val9 = 1;
break;
default:
break;
}
}
} else if (lookFlag && player_said("SOFA")) {
if (!_G(flags)[kGermanBanknoteFound] && inv_object_is_here("GERMAN BANKNOTE")) {
_G(flags)[kGermanBanknoteFound] = 1;
doAction("405r15");
hotspot_set_active("GERMAN BANKNOTE", true);
} else {
doAction("405r12");
}
} else if (lookFlag && player_said("GERMAN BANKNOTE") && inv_object_is_here("GERMAN BANKNOTE")) {
doAction("405r17");
} else if (lookFlag && player_said(" ")) {
doAction("405r04");
} else if (takeFlag && player_said("ZEBRA SKIN")) {
doAction("405r18");
} else if (takeFlag && player_said("DEER HEAD")) {
doAction("405r19");
} else if (takeFlag && player_said("BATTLE AXE")) {
doAction("405r20");
} else if (takeFlag && player_said("SHIELD")) {
doAction("405r20");
} else if (takeFlag && player_said("BOOKSHELF")) {
doAction("405r21");
} else if (takeFlag && player_said("SOFA")) {
doAction("405r22");
} else if (takeFlag && player_said("CHAIR")) {
doAction("405r22");
} else if (takeFlag && player_said("JOURNAL ")) {
doAction("405r23");
} else if (takeFlag && player_said("GERMAN BANKNOTE") && takeBanknote()) {
// No implementation
} else if (player_said("journal") && !takeFlag && !lookFlag && !inv_player_has(_G(player).noun)) {
if (_G(flags)[kCastleCartoon]) {
digi_play("com016", 1);
} else {
if (_G(kernel).trigger == 6)
_G(flags)[kCastleCartoon] = 1;
sketchInJournal("com015");
}
} else {
return;
}
_G(player).command_ready = false;
}
void Room405::conv405a() {
const int who = conv_whos_talking();
_currentNode = conv_current_node();
const int entry = conv_current_entry();
const char *sound = conv_sound_to_play();
if (sound) {
if (who <= 0) {
switch (_currentNode) {
case 2:
if (entry == 0) {
_val8 = 2110;
_sound1 = sound;
} else {
_val8 = 2101;
digi_play(sound, 1, 255, 1);
}
break;
case 4:
if (entry == 1) {
_val8 = 2140;
_sound1 = sound;
} else if (entry == 2) {
_val8 = 2120;
_sound1 = sound;
} else {
_val8 = 2101;
digi_play(sound, 1, 255, 1);
}
break;
case 14:
if (entry == 4) {
_val8 = 2140;
_sound1 = sound;
} else {
_val8 = 2101;
digi_play(sound, 1, 255, 1);
}
break;
default:
_val8 = 2101;
digi_play(sound, 1, 255, 1);
break;
}
} else if (who == 1) {
switch (_currentNode) {
case 1:
if (entry == 3) {
_val6 = 2110;
_sound2 = sound;
} else {
_val6 = 1102;
digi_play(sound, 1, 255, 1);
}
break;
case 8:
if (entry == 2) {
_val6 = 1220;
_sound2 = sound;
} else {
_val6 = 1102;
digi_play(sound, 1, 255, 1);
}
break;
case 14:
if (entry == 1) {
_val6 = 1230;
_sound2 = sound;
} else {
if (entry == 5)
_val8 = 2171;
_val6 = 1102;
digi_play(sound, 1, 255, 1);
}
break;
default:
_val6 = 1102;
digi_play(sound, 1, 255, 1);
break;
}
}
} else {
conv_resume();
}
}
void Room405::conv405a1() {
const int who = conv_whos_talking();
if (who <= 0)
_val8 = 2102;
else if (who == 1)
_val6 = 1103;
conv_resume();
}
bool Room405::lookDoor() {
switch (_G(kernel).trigger) {
case -1:
ws_walk(_G(my_walker), 245, 367, nullptr, 2, 9);
return true;
case 2:
digi_play("405r30", 1);
return true;
default:
break;
}
return false;
}
bool Room405::useDoor() {
switch (_G(kernel).trigger) {
case -1:
ws_walk(_G(my_walker), 245, 367, nullptr, 2, 9);
return true;
case 2:
digi_play("405r31", 1);
return true;
default:
break;
}
return false;
}
bool Room405::takeDoor() {
if (_G(kernel).trigger == 1) {
ws_walk(_G(my_walker), 245, 367, nullptr, 2, 9);
return true;
}
return false;
}
bool Room405::takeBanknote() {
switch (_G(kernel).trigger) {
case -1:
if (inv_object_is_here("GERMAN BANKNOTE")) {
player_set_commands_allowed(false);
_lowReacher = series_load("RIP TREK LOW REACHER POS1");
setGlobals1(_lowReacher, 1, 16, 16, 16, 0, 16, 1, 1, 1);
sendWSMessage_110000(1);
return true;
}
break;
case 1:
kernel_examine_inventory_object("PING GERMAN BANKNOTE", _G(master_palette),
5, 1, 265, 270, 2, "405r24", -1);
return true;
case 2:
terminateMachineAndNull(_bankNote);
inv_give_to_player("GERMAN BANKNOTE");
sendWSMessage_120000(3);
return true;
case 3:
hotspot_set_active("GERMAN BANKNOTE", false);
sendWSMessage_150000(4);
return true;
case 4:
series_unload(_lowReacher);
player_set_commands_allowed(true);
return true;
default:
break;
}
return false;
}
void Room405::doAction(const char *name) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
digi_play(name, 1, 255, 1);
break;
case 1:
player_set_commands_allowed(true);
break;
default:
break;
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,86 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM405_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM405_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room405 : public Room {
private:
int _val1 = 0;
int _val2 = 0;
int _val3 = 0;
int _val4 = 0;
int _val5 = 0;
int _val6 = 0;
int _val7 = 0;
int _val8 = 0;
int _val9 = 0;
int _candlesBurning = 0;
int _safariShadow = 0;
int _lowReacher = 0;
machine *_door = nullptr;
machine *_candles = nullptr;
machine *_bankNote = nullptr;
machine *_baron = nullptr;
machine *_baronWalker = nullptr;
machine *_ripTalksBaron = nullptr;
machine *_response = nullptr;
int _currentNode = 0;
Common::String _sound1;
Common::String _sound2;
int _baronShakeSit = 0;
int _baronTalkLoop = 0;
int _baronLeanForward = 0;
int _baronTurnWalk = 0;
int _ripHandLetter = 0;
int _ripTalkGesture = 0;
int _ripLeanForward = 0;
int _ripHeadTurn = 0;
void conv405a();
void conv405a1();
bool lookDoor();
bool useDoor();
bool takeDoor();
bool takeBanknote();
void doAction(const char *name);
public:
Room405() : Room() {}
~Room405() override {}
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM406_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM406_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room406 : public Room {
private:
machine *_billiardTable = nullptr;
machine *_painting = nullptr;
machine *_mirror = nullptr;
machine *_cardDoor = nullptr;
machine *_gamesCabinet = nullptr;
machine *_desk = nullptr;
machine *_poolBall = nullptr;
machine *_emptyDrawer = nullptr;
machine *_envelope = nullptr;
machine *_keys = nullptr;
machine *_cards = nullptr;
int _rptmhr = 0;
int _rptmr15 = 0;
int _gamesDrawerState = 0;
int deskDrawerState = 0;
int _ripReachHand = 0;
int _ripHiHand = 0;
int _pickupBall = 0;
machine *_ripAction = nullptr;
int _lookMirror = 0;
int _tableRaises = 0;
int _paintingOpening = 0;
int _ripThrowsBall = 0;
int _deskOpening = 0;
int _cabinetOpens = 0;
void patchHotspots();
void setHotspots();
bool takeKeys();
bool takeBilliardBall();
bool billiardBallOnTable();
void useSwitchPaintingOpen();
void useSwitchPaintingClosed();
void useAceOfSpades1();
void useAceOfSpades2();
bool lookBilliardBall();
public:
Room406() : Room() {}
~Room406() override {}
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,269 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM407_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM407_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room407 : public Room {
private:
int _val1 = 0;
int _val2 = 0;
int _valveState2 = 0;
int _valveState1 = 0;
int _drawerState = 0;
int _val6 = 0;
int _val7 = 0;
int _faucetPipeState = 0;
int _airValveState = 0;
int _leverKeyState = 0;
int _rodState = 0;
int _hoseState = 0;
int _tubeState = 0;
int _pumpState = 0;
int _stopperState = 0;
int _periodicTableState = 0;
int _xyzzy7 = 0;
int _items2State = 0;
int _corkState = 0;
int _xyzzy10 = 0;
int _faucetHookedToJar = 0;
int _frotz2 = 0;
int _frotz3 = 0;
int _frotz4 = 0;
int _frotz5 = 0;
int _frotz6 = 0;
int _frotz7 = 0;
int _frotz8 = 0;
int _lookedAtLever = 0;
int _tabletopState = 0;
int _pivotState = 0;
int _fullGlassState = 0;
int _glassTopState = 0;
int _glassBottomState = 0;
int _roofPistonState = 0;
int _glassGoneState = 0;
int _comboLockState = 0;
int _buttonFrame1 = 0;
int _buttonFrame2 = 0;
int _buttonFrame3 = 0;
int _buttonFrame4 = 0;
bool _codeCorrect = false;
int _val11 = 0;
int _val15 = 0;
int _val16 = 0;
int _waterFlowTube = 0;
int _waterFlowFaucet = 0;
int _waterFlowStem = 0;
machine *_bottle = nullptr;
machine *_chart = nullptr;
machine *_cpist = nullptr;
machine *_drawer = nullptr;
machine *_escape = nullptr;
machine *_faucetPipe = nullptr;
machine *_airValve = nullptr;
machine *_lever = nullptr;
machine *_niche = nullptr;
machine *_tpist = nullptr;
machine *_pump = nullptr;
machine *_bits = nullptr;
machine *_star2 = nullptr;
machine *_gears = nullptr;
machine *_letter = nullptr;
int _ripMedReach = 0;
machine *_drawerPopup = nullptr;
machine *_drawerPopupHose = nullptr;
machine *_stopperInDrawer = nullptr;
machine *_tubeInDrawer = nullptr;
machine *_grips = nullptr;
machine *_tabletopPopup = nullptr;
machine *_tabletopPopupWithItems1 = nullptr;
machine *_tabletopPopupWithItems2 = nullptr;
machine *_tabletopPopupWithItems3 = nullptr;
machine *_pivotPopup = nullptr;
machine *_glassJarPopup = nullptr;
machine *_glassTopPopupWithItems1 = nullptr;
machine *_glassTopPopupWithItems2 = nullptr;
machine *_glassBottomWithItems1 = nullptr;
machine *_glassBottomWithItems2 = nullptr;
machine *_roofPiston = nullptr;
machine *_roofPistonWithItems = nullptr;
machine *_glassGone = nullptr;
machine *_comboLockPopup = nullptr;
int _407pu08a = 0;
int _407pu08b = 0;
int _407pu08c = 0;
int _407pu08d = 0;
machine *_lockButton1 = nullptr;
machine *_lockButton2 = nullptr;
machine *_lockButton3 = nullptr;
machine *_lockButton4 = nullptr;
int _ripEnters = 0;
int _stair = 0;
machine *_ripley = nullptr;
machine *_microscopeCloseup = nullptr;
int _ripHiHand1 = 0;
int _ripHiHand2 = 0;
int _ripMedHand1 = 0;
int _ripLowHand1 = 0;
int _placeLeverKey = 0;
machine *_safariShadow = nullptr;
int _rollStuff = 0;
int _407rp98 = 0;
int _407rp99 = 0;
int _pump407 = 0;
int _hangRip = 0;
int _rptmhr11 = 0;
int _407tpis2 = 0;
int _ripHeadTurn = 0;
int _jarWaterFallingLeft = 0;
int _jarWaterFallingCentre = 0;
int _jarWaterFallingRight = 0;
machine *_jarLeft = nullptr;
machine *_jarCentre = nullptr;
machine *_jarRight = nullptr;
machine *_sink = nullptr;
int _407a = 0;
int _407b = 0;
int _407c = 0;
int _407d = 0;
int _407e = 0;
int _407h = 0;
int _407j = 0;
int _407k = 0;
int _407l = 0;
int _407m = 0;
int _407o = 0;
int _407p = 0;
int _407q = 0;
int _407r = 0;
int _407s = 0;
int _exit = 0;
void setHotspots();
void lookItem(const char *item, const char *digi);
void useMicroscope();
void roofPistonPopup();
void glassBottomPopup();
void glassTopPopup();
void glassGonePopup();
void pivotPopup();
void tabletopPopup();
bool lookGlassJar();
void glassJarPopup();
bool lookEmeraldCork();
void periodicTablePopup();
bool lookLeverKey();
void gardenHoseSurgicalTube();
void gardenHoseSurgicalTube2();
void surgicalTubeFaucetPipe();
void surgicalTubeStem();
void reachHand(int frame);
void reachLeverKey();
void faucetPipeGardenHose();
void faucetPipeGlassJar();
void gardenHoseFaucetPipe();
void surgicalTubeGardenHose();
void emeraldIronSupport();
void placeLeverKey();
void rubberPlugGlassJar();
void rubberPlugGlassJar2();
void corkGlassJar1();
void corkGlassJar2();
void pumpGripsGlassJar();
void periodicTableGlassJar();
void surgicalTubeNozzles();
void leverKeyTablePivot();
void pumpRodBracket();
void leverKey1();
void leverKey2();
void faucetHandleAirValve();
void faucetPipeFaucetHandle1();
void faucetPipeFaucetHandle2();
void pumpRodPump();
void pumpGripsPump();
void useButton1();
void useButton2();
void useButton3();
void useButton4();
void checkCode();
void useButtons();
void useLeverKey();
void useFaucet();
void useValveHandle();
bool usePump();
void usePump2();
void takeLetter();
void takeFaucetPipe1();
void takeFaucetPipe2();
void takeFaucetPipe3();
void takeSurgicalTube1();
void takeSurgicalTube2();
void takeSurgicalTube3();
void takeGardenHose1();
void takeGardenHose2();
void takeGardenHose3();
void takeGardenHose4();
void takeGlassJar1();
void takeGlassJar2();
void takePeriodicTable1();
void takePeriodicTable2();
void takeJarGrips();
void takeJarCork1();
void takeJarCork2();
void takeJarRubberPlug1();
void takeJarRubberPlug2();
void takeNozzlesTube();
void takeLeverKeyFromWall();
void takeLeverKeyFromBench();
void takeLeverKey3();
void takeAirValveHandle();
void takeFaucetHandle();
void takePumpRod1();
void takePumpRod2();
void takePumpRod3();
void takePumpGrips1();
void takePumpGrips2();
void takeRubberPlug();
void takeSurgicalTube();
public:
Room407() : Room() {}
~Room407() override {}
void preload() override;
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
void syncGame(Common::Serializer &s) override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,884 @@
/* 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/room408.h"
#include "m4/riddle/rooms/section4/section4.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
#include "m4/riddle/riddle.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room408::init() {
player_set_commands_allowed(false);
if (_G(game).previous_room != KERNEL_RESTORING_GAME) {
_val1 = 0;
_ripleyTrigger = -1;
_val3 = 0;
_wolfTrigger = -1;
_currentNode = -1;
_ripleyMode = 0;
_ripleyShould = 0;
_wolfMode = 0;
_wolfShould = 0;
}
digi_preload("950_s19");
digi_preload("950_s20");
digi_preload("950_s21");
hotspot_set_active("WOLF", false);
hotspot_set_active("PLANK", false);
hotspot_set_active("EDGER", false);
_exit = series_show("RIP EXITS 407", 0xf00, 16);
if (_G(flags)[V139] == 1) {
_G(flags)[V139] = 0;
_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 408);
ws_demand_location(_G(my_walker), 234, 319, 3);
ws_walk(_G(my_walker), 438, 325, nullptr, 400, 1);
} else if (_G(flags)[V139] == 3) {
_G(flags)[V139] = 0;
if (inv_object_is_here("PLANK")) {
_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
hotspot_set_active("PLANK", true);
}
ws_demand_location(_G(my_walker), -20, 345, 3);
ws_walk(_G(my_walker), 234, 319, nullptr, 420, 1);
} else {
if (inv_player_has("TURTLE") && !inv_player_has("EDGER") &&
!_G(flags)[kWolfFled]) {
_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
hotspot_set_active("EDGER", true);
}
if (inv_player_has("TURTLE") && !inv_player_has("PLANK") &&
!_G(flags)[kWolfFled] && inv_object_is_here("PLANK")) {
_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
hotspot_set_active("PLANK", true);
}
switch (_G(game).previous_room) {
case KERNEL_RESTORING_GAME:
digi_preload("950_s22");
if (_G(flags)[kWolfLocation] == 408) {
hotspot_set_active("WOLF", true);
_wolfMode = 2001;
_wolfShould = 2200;
_wolf = series_load("WOLF CLPNG LOOP LOOKS TO SIDE");
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0xd00, 0,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolf, 1, 10, 110, _wolf, 10, 10, 0);
}
player_set_commands_allowed(true);
break;
case 402:
if (_G(flags)[V132]) {
ws_hide_walker();
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, 300);
} else {
if (_G(flags)[kWolfLocation] == 408) {
hotspot_set_active("WOLF", true);
_wolf = series_load("WOLF CLPNG LOOP LOOKS TO SIDE");
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0xd00, 0,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolf, 1, 10, 110, _wolf, 10, 10, 0);
_wolfMode = 2001;
_wolfShould = 2200;
}
ws_demand_location(_G(my_walker), -20, 345, 3);
ws_walk(_G(my_walker), 35, 345, nullptr, 20, 3);
}
break;
case 407:
digi_preload("950_s22");
terminateMachineAndNull(_exit);
if (_G(flags)[kWolfFled]) {
_G(flags)[kWolfLocation] = 999;
} else if (inv_player_has("TURTLE")) {
_G(flags)[kWolfLocation] = 402;
_G(flags)[V117] = 1;
} else if (_G(flags)[V124]) {
_G(flags)[kWolfLocation] = 402;
} else {
_G(flags)[kWolfLocation] = 403;
}
_ripExits = series_load("RIP EXITS 407");
ws_demand_location(_G(my_walker), 201, 287, 4);
ws_hide_walker();
_exit = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
triggerMachineByHashCallback, "RIP ENTERS from GIZMO");
sendWSMessage_10000(1, _exit, _ripExits, 1, 75, 40, _ripExits, 75, 75, 0);
digi_play("408_s01", 2);
break;
default:
digi_preload("950_s22");
if (_G(flags)[V117] && _G(flags)[V125] == 3 &&
!_G(flags)[kWolfFled] && !inv_player_has("EDGER") &&
!inv_player_has("PLANK")) {
_G(flags)[kWolfLocation] = 408;
_G(flags)[V117] = 0;
}
if (_G(flags)[kWolfLocation] == 408) {
hotspot_set_active("WOLF", true);
_wolf = series_load("WOLF CLPNG LOOP LOOKS TO SIDE");
_wolfie = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, -53, 100, 0xd00, 0,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfie, _wolf, 1, 10, 110, _wolf, 10, 10, 0);
_wolfMode = 2001;
_wolfShould = 2200;
}
ws_demand_location(_G(my_walker), 660, 345, 9);
if (_G(flags)[V125] == 3) {
series_simple_play("408 turtle popup", 0, true);
ws_walk(_G(my_walker), 438, 325, nullptr, 350, 1);
} else {
ws_walk(_G(my_walker), 615, 345, nullptr, 30, 9);
}
break;
}
}
digi_play_loop("950_s22", 3, 120, -1, 950);
}
void Room408::daemon() {
int frame;
switch (_G(kernel).trigger) {
case 20:
case 30:
player_set_commands_allowed(true);
break;
case 40:
digi_play("408_s03", 2);
sendWSMessage_10000(1, _exit, _ripExits, 76, 85, 42, _ripExits, 85, 85, 0);
break;
case 42:
ws_unhide_walker();
DisposePath(_G(my_walker)->walkPath);
_G(my_walker)->walkPath = CreateCustomPath(250, 335, -1);
ws_custom_walk(_G(my_walker), 4, -1);
sendWSMessage_10000(1, _exit, _ripExits, 31, 1, 44, _ripExits, 1, 1, 0);
digi_play("408r31", 1);
break;
case 44:
terminateMachineAndNull(_exit);
series_unload(_ripExits);
_exit = series_show("RIP EXITS 407", 0xf00, 16);
player_set_commands_allowed(true);
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:
if (_ripleyMode == 1000) {
switch (_ripleyShould) {
case 1100:
ws_hide_walker();
player_set_commands_allowed(false);
_ripHandsBehindBack = series_load("RIP TREK HANDS BEHIND BACK POS2");
player_update_info();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0x100, 0,
triggerMachineByHashCallback, "rip talks wolf");
_ripleyShadow = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0x100, 0,
triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 1, 15, 102,
_ripHandsBehindBack, 15, 15, 0);
sendWSMessage_10000(1, _ripleyShadow, _ripShadowSeries, 1, 1, -1,
_ripShadowSeries, 1, 1, 0);
_ripleyShould = 1101;
_wolfMode = 2000;
_wolfShould = 2100;
kernel_timing_trigger(1, 110);
break;
case 1101:
_ripleyShould = 1103;
kernel_timing_trigger(1, 102);
conv_load("conv408a", 0, 10, 101);
conv_export_value_curr(_G(flags)[V117], 0);
conv_export_value_curr(_G(flags)[V118], 1);
conv_play();
break;
case 1102:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 15, 102,
_ripHandsBehindBack, 15, 15, 0);
break;
case 1103:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 15, 102,
_ripHandsBehindBack, 15, 15, 0);
break;
case 1104:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 15, -1,
_ripHandsBehindBack, 15, 15, 0);
break;
case 1105:
sendWSMessage_10000(1, _ripley, _ripHandsBehindBack, 15, 1, 103,
_ripHandsBehindBack, 1, 1, 0);
_ripleyShould = 1106;
_wolfShould = 2103;
break;
case 1106:
terminateMachineAndNull(_ripley);
terminateMachineAndNull(_ripleyShadow);
ws_unhide_walker();
series_unload(_ripHandsBehindBack);
if (_currentNode != 8 && _currentNode != 9) {
_wolfMode = 2001;
_wolfShould = 2200;
kernel_timing_trigger(1, 110);
player_set_commands_allowed(true);
} else {
_wolfTrigger = 320;
kernel_timing_trigger(1, 110);
}
break;
default:
break;
}
}
break;
case 110:
switch (_wolfMode) {
case 2000:
if (_wolfShould >= 2100 && _wolfShould <= 2104) {
if (_wolfTrigger != -1) {
kernel_timing_trigger(1, _wolfTrigger);
_wolfTrigger = -1;
} else {
kernel_timing_trigger(1, 111);
}
}
break;
case 2001:
if (_wolfShould == 2200) {
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, _wolf, 10, 13, 110, _wolf, 13, 13, 0);
_wolfShould = 2102;
break;
case 2101:
frame = imath_ranged_rand(14, 16);
sendWSMessage_10000(1, _wolfie, _wolf, frame, frame, 110,
_wolf, frame, frame, 0);
break;
case 2102:
sendWSMessage_10000(1, _wolfie, _wolf, 13, 13, 110, _wolf, 13, 13, 0);
_wolfShould = 2102;
break;
case 2103:
sendWSMessage_10000(1, _wolfie, _wolf, 13, 10, -1, _wolf, 10, 10, 0);
break;
case 2104:
sendWSMessage_10000(1, _wolfie, _wolf, 1, 9, 110, _wolf, 9, 9, 0);
break;
default:
break;
}
break;
case 2001:
if (_wolfShould == 2200) {
sendWSMessage_10000(1, _wolfie, _wolf, 1, 9, 110, _wolf, 9, 9, 0);
switch (imath_ranged_rand(1, 3)) {
case 1:
digi_play("950_s19", 2);
break;
case 2:
digi_play("950_s20", 2);
break;
case 3:
digi_play("950_s21", 2);
break;
default:
break;
}
}
break;
default:
break;
}
break;
case 220:
_wolfMode = 2000;
_wolfShould = 2100;
kernel_timing_trigger(1, 110);
_ripTrekTwoHandTalk = series_load("RIP TREK TWO HAND TALK POS2");
player_update_info();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale,
0x100, 0, triggerMachineByHashCallback, "rip talks wolf");
_ripleyShadow = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale,
0x100, 0, triggerMachineByHashCallback, "rip talks wolf SHADOW");
sendWSMessage_10000(1, _ripleyShadow, _ripShadowSeries, 1, 1, -1,
_ripShadowSeries, 1, 1, 0);
sendWSMessage_10000(1, _ripley, _ripTrekTwoHandTalk, 1, 6, 222,
_ripTrekTwoHandTalk, 6, 6, 0);
break;
case 222:
_wolfShould = 2101;
kernel_timing_trigger(1, 110);
digi_play("402w008", 1, 255, 226);
kernel_timing_trigger(45, 224);
break;
case 225:
terminateMachineAndNull(_ripley);
terminateMachineAndNull(_ripleyShadow);
ws_unhide_walker();
series_unload(_ripTrekTwoHandTalk);
break;
case 226:
_wolfShould = 2103;
kernel_timing_trigger(30, 227);
break;
case 227:
_wolfMode = 2001;
_wolfShould = 2200;
kernel_timing_trigger(1, 110);
player_set_commands_allowed(true);
break;
case 300:
_wolfWalker = triggerMachineByHash_3000(8, 8, *S4_NORMAL_DIRS, *S4_SHADOW_DIRS,
-20, 345, 3, triggerMachineByHashCallback3000, "WOLF_WALKER");
sendWSMessage_10000(_wolfWalker, 660, 345, 9, -1, 0);
kernel_timing_trigger(400, 302);
kernel_timing_trigger(450, 303);
break;
case 302:
ws_unhide_walker();
player_first_walk(-20, 345, 3, 660, 345, 9, false);
break;
case 303:
disable_player_commands_and_fade_init(304);
break;
case 304:
_G(game).setRoom(403);
break;
case 320:
terminateMachineAndNull(_wolfie);
_wolfie = series_stream("WOLF STPS DOWN DRPS CLIPPERS", 6, 0xd00, 323);
series_stream_break_on_frame(_wolfie, 100, 322);
break;
case 322:
ws_walk(_G(my_walker), 414, 336, nullptr, -1, 9);
break;
case 323:
hotspot_set_active("WOLF", false);
_G(flags)[kWolfLocation] = 402;
player_set_commands_allowed(true);
break;
case 350:
_ripLowReacher = series_load("RIP TREK LOW REACHER POS1");
setGlobals1(_ripLowReacher, 1, 7, 7, 7, 0, 7, 1, 1, 1);
sendWSMessage_110000(352);
break;
case 352:
_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
inv_move_object("PLANK", 408);
hotspot_set_active("PLANK", true);
sendWSMessage_120000(353);
break;
case 353:
sendWSMessage_150000(354);
break;
case 354:
series_unload(_ripLowReacher);
ws_walk(_G(my_walker), 234, 319, nullptr, 355, 1);
_ripLowReacher = series_load("RIP TREK MED REACH HAND POS1");
break;
case 355:
setGlobals1(_ripLowReacher, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(356);
break;
case 356:
_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 408);
sendWSMessage_120000(357);
break;
case 357:
sendWSMessage_150000(358);
break;
case 358:
series_unload(_ripLowReacher);
ws_walk(_G(my_walker), -20, 345, nullptr, -1, 9);
kernel_timing_trigger(60, 359);
break;
case 359:
disable_player_commands_and_fade_init(360);
break;
case 360:
digi_stop(3);
_G(game).setRoom(402);
break;
case 400:
_ripLowReacher = series_load("RIP TREK LOW REACHER POS1");
setGlobals1(_ripLowReacher, 1, 7, 7, 7, 0, 7, 1, 1, 1);
sendWSMessage_110000(402);
break;
case 402:
_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
inv_move_object("PLANK", 408);
hotspot_set_active("PLANK", true);
sendWSMessage_120000(403);
break;
case 403:
sendWSMessage_150000(404);
break;
case 404:
case 424:
series_unload(_ripLowReacher);
player_set_commands_allowed(true);
break;
case 420:
_ripLowReacher = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_ripLowReacher, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(422);
break;
case 422:
_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 408);
sendWSMessage_120000(423);
break;
case 423:
sendWSMessage_150000(424);
break;
default:
break;
}
}
void Room408::pre_parser() {
bool takeFlag = player_said("take");
bool lookFlag = player_said_any("look", "look at");
bool enterFlag = player_said("enter");
if (lookFlag && player_said(" "))
_G(player).resetWalk();
if (enterFlag && player_said("GRAVEYARD"))
_G(player).resetWalk();
if (player_said("journal") && !takeFlag && !lookFlag &&
_G(kernel).trigger == -1)
_G(player).resetWalk();
}
void Room408::parser() {
bool lookFlag = player_said_any("look", "look at");
bool talkFlag = player_said_any("talk", "talk to");
bool takeFlag = player_said("take");
bool enterFlag = player_said("enter");
bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
if (player_said("conv408a")) {
if (_G(kernel).trigger == 1) {
_ripleyShould = 1103;
_wolfShould = 2102;
conv_resume();
} else {
conv408a();
}
} 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 (lookFlag && player_said("WINDOW")) {
digi_play("408r03", 1);
} else if (lookFlag && player_said("CASTLE")) {
digi_play("408r01", 1);
} else if (lookFlag && player_said("TOPIARY")) {
digi_play("408r02", 1);
} else if (lookFlag && player_said("SUNDIAL")) {
digi_play(player_been_here(407) ? "408r32" : "408r04", 1);
} else if (lookFlag && player_said_any("BUSH", "BUSH ")) {
digi_play("408r05", 1);
} else if (lookFlag && player_said("PLANK") && inv_object_is_here("PLANK")) {
digi_play("408r20", 1);
} else if (lookFlag && player_said("EDGER") && inv_object_is_here("EDGER")) {
digi_play("408r35", 1);
} else if (lookFlag && player_said("WOLF")) {
digi_play("408r21", 1);
} else if (takeFlag && player_said("TOPIARY")) {
digi_play("408r06", 1);
} else if (takeFlag && player_said("SUNDIAL")) {
digi_play("408r08", 1);
} else if (takeFlag && player_said("PLANK") && takePlank()) {
// No implementation
} else if (takeFlag && player_said("EDGER") && takeEdger()) {
// No implementation
} else if (player_said("EDGER", "BUSH")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
_ripLowReacher = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_ripLowReacher, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(1);
break;
case 1:
_edger = series_place_sprite("Edger gone", 0, 0, -53, 100, 0xf00);
hotspot_set_active("EDGER", true);
inv_move_object("EDGER", 408);
sendWSMessage_120000(3);
break;
case 3:
sendWSMessage_150000(4);
break;
case 4:
series_unload(_ripLowReacher);
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (player_said("PLANK", "TOPIARY")) {
switch (_G(kernel).trigger) {
case -1:
if (_G(flags)[kWolfLocation] != 408) {
player_set_commands_allowed(false);
_ripLowReacher = series_load("RIP TREK LOW REACHER POS1");
setGlobals1(_ripLowReacher, 1, 7, 7, 7, 0, 7, 1, 1, 1);
sendWSMessage_110000(1);
}
break;
case 1:
_plank = series_place_sprite("Plank gone", 0, 0, 0, 100, 0xf00);
inv_move_object("PLANK", 408);
hotspot_set_active("PLANK", true);
sendWSMessage_120000(3);
break;
case 2:
_G(game).setRoom(403);
break;
default:
break;
}
} else if (useFlag && player_said("TOPIARY")) {
digi_play("408r07", 1);
} else if (useFlag && player_said("SUNDIAL")) {
digi_play(player_been_here(407) ? "408r34" : "408r09", 1);
} else if (useFlag && player_said("WINDOW")) {
digi_play("408r10", 1);
} else if (player_said("POMERANIAN MARKS", "WOLF") &&
inv_player_has("POMERANIAN MARKS")) {
digi_play("408w07", 1);
} else if (enterFlag && player_said("CASTLE GROUNDS")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
ws_walk(_G(my_walker), -20, 345, nullptr, 1, 9);
break;
case 1:
disable_player_commands_and_fade_init(2);
break;
case 2:
adv_kill_digi_between_rooms(false);
digi_play_loop("950_s22", 3, 255, -1, 950);
_G(game).setRoom(402);
break;
default:
break;
}
} else if (enterFlag && player_said("GRAVEYARD")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
ws_walk(_G(my_walker), 660, 345, nullptr, 1, 3);
break;
case 1:
disable_player_commands_and_fade_init(2);
break;
case 2:
_G(game).setRoom(403);
break;
default:
break;
}
} else if (player_said("journal") && !takeFlag && !lookFlag &&
!inv_player_has(_G(player).noun)) {
if (_G(flags)[kCastleCartoon]) {
digi_play("com016", 1);
} else if (_G(kernel).trigger == 6) {
_G(flags)[kCastleCartoon] = 1;
sketchInJournal("com015");
} else {
sketchInJournal("com015");
}
} else if (lookFlag && player_said(" ")) {
digi_play("408r01", 1);
} else {
return;
}
_G(player).command_ready = false;
}
void Room408::conv408a() {
int who = conv_whos_talking();
_currentNode = conv_current_node();
const char *sound = conv_sound_to_play();
if (sound) {
if (who <= 0) {
_wolfShould = 2101;
digi_play(sound, 1, 255, 1);
} else if (who == 1) {
_ripleyShould = 1102;
digi_play(sound, 1, 255, 1);
}
} else {
conv_resume();
}
}
bool Room408::takePlank() {
switch (_G(kernel).trigger) {
case -1:
if (!inv_player_has("PLANK")) {
player_set_commands_allowed(false);
if (_G(flags)[kWolfLocation] == 408) {
digi_play("408r29", 1, 255, 5);
} else {
_ripLowReacher = series_load("RIP TREK LOW REACHER POS1");
setGlobals1(_ripLowReacher, 1, 7, 7, 7, 0, 7, 1, 1, 1);
sendWSMessage_110000(1);
}
break;
}
return false;
case 1:
terminateMachineAndNull(_plank);
inv_give_to_player("PLANK");
hotspot_set_active("PLANK", false);
kernel_examine_inventory_object("PING PLANK",
_G(master_palette), 5, 1, 362, 225, 2, "408_s02", -1);
break;
case 2:
sendWSMessage_120000(3);
break;
case 3:
sendWSMessage_150000(4);
break;
case 4:
series_unload(_ripLowReacher);
player_set_commands_allowed(true);
break;
case 5:
player_set_commands_allowed(true);
break;
default:
return false;
}
return true;
}
bool Room408::takeEdger() {
switch (_G(kernel).trigger) {
case -1:
if (!inv_player_has("EDGER")) {
player_set_commands_allowed(false);
if (_G(flags)[kWolfLocation] == 408) {
digi_play("408r30", 1, 255, 5);
} else {
_ripLowReacher = series_load("RIP TREK MED REACH HAND POS1");
setGlobals1(_ripLowReacher, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(1);
}
break;
}
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, 190, 215, 2, nullptr, -1);
break;
case 2:
sendWSMessage_120000(3);
break;
case 3:
sendWSMessage_150000(4);
break;
case 4:
series_unload(_ripLowReacher);
player_set_commands_allowed(true);
break;
case 5:
player_set_commands_allowed(true);
break;
default:
break;
}
return true;
}
void Room408::syncGame(Common::Serializer &s) {
s.syncAsSint32LE(_ripleyMode);
s.syncAsSint32LE(_ripleyShould);
s.syncAsSint32LE(_wolfMode);
s.syncAsSint32LE(_wolfShould);
s.syncAsSint32LE(_currentNode);
s.syncAsSint32LE(_ripExits);
s.syncAsSint32LE(_wolf);
s.syncAsSint32LE(_val1);
s.syncAsSint32LE(_ripleyTrigger);
s.syncAsSint32LE(_val3);
s.syncAsSint32LE(_wolfTrigger);
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,75 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM408_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM408_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room408 : public Room {
private:
int _val1 = 0;
int _val3 = 0;
int _ripleyTrigger = -1;
int _wolfTrigger = -1;
int _currentNode = 0;
int _ripleyMode = 0;
int _ripleyShould = 0;
int _wolfMode = 0;
int _wolfShould = 0;
machine *_exit = nullptr;
int _ripExits = 0;
machine *_edger = nullptr;
machine *_plank = nullptr;
int _wolf = 0;
machine *_wolfie = nullptr;
machine *_wolfWalker = nullptr;
int _ripLowReacher = 0;
int _ripHandsBehindBack = 0;
machine *_ripley = nullptr;
machine *_ripleyShadow = nullptr;
int _ripShadowSeries = 0;
int _ripTrekTwoHandTalk = 0;
void conv408a();
bool takePlank();
bool takeEdger();
public:
Room408() : Room() {}
~Room408() override {}
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
void syncGame(Common::Serializer &s) override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,299 @@
/* 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/room409.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room409::init() {
player_set_commands_allowed(false);
digi_preload("409r01a");
digi_preload("409r01b");
digi_preload("409r01c");
digi_preload("950_s27");
ws_demand_location(_G(my_walker), 239, 295, 3);
_seriesShadow = series_load("SAFARI SHADOW 3");
_seriesDoorOpen = series_load("409 DOOR OPEN");
_seriesRope = series_load("409ROPE");
_seriesWolfOpensDoor = series_load("409 WOLF OPENS DOOR");
_seriesReadTelegram = series_load("RIP TREK READS TELEGRAM POS5");
_seriesRp02 = series_load("409RP02");
_seriesHeadTurn = series_load("RIP TREK HEAD TURN POS5");
_seriesTalker = series_load("RIP TALKER POS 5");
_seriesReachHand = series_load("RIP TREK MED REACH HAND POS1");
_turtleRope = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0, 0,
triggerMachineByHashCallback, "TURTLE & rope");
sendWSMessage_10000(1, _turtleRope, _seriesRope, 1, 20, 100, _seriesRope, 20, 20, 0);
_volume = 255;
_flag = true;
digi_play("950_s27", 2, 255, -1, 950);
digi_play("409_s04", 3);
_wolfWalker = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x300, 0,
triggerMachineByHashCallback, "WOLFIE");
sendWSMessage_10000(1, _wolfWalker, _seriesWolfOpensDoor, 1, 20, 350,
_seriesWolfOpensDoor, 20, 20, 0);
}
void Room409::daemon() {
switch (_G(kernel).trigger) {
case 100:
if (_flag) {
sendWSMessage_10000(1, _turtleRope, _seriesRope, 1, 20, 100,
_seriesRope, 20, 20, 0);
digi_play("950_s27", 3, _volume, -1, 950);
}
break;
case 350:
kernel_timing_trigger(75, 351);
break;
case 351:
sendWSMessage_10000(1, _wolfWalker, _seriesWolfOpensDoor, 21, 38, 352,
_seriesWolfOpensDoor, 38, 38, 0);
digi_play("409_s01", 1);
break;
case 352:
terminateMachineAndNull(_wolfWalker);
_doorOpen = series_place_sprite("409 DOOR OPEN", 0, 0, 0, 100, 0x300);
kernel_timing_trigger(120, 353);
digi_play("409w11a", 1);
break;
case 353:
ws_walk(_G(my_walker), 323, 295, nullptr, 354, 3);
break;
case 354:
kernel_timing_trigger(180, 355);
break;
case 355:
ws_walk(_G(my_walker), 333, 319, nullptr, 356, 5);
break;
case 356:
kernel_timing_trigger(60, 357);
break;
case 357:
ws_hide_walker();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, 0,
triggerMachineByHashCallback, "rip looks at turtle");
sendWSMessage_10000(1, _ripley, _seriesRp02, 1, 16, 358,
_seriesRp02, 16, 16, 0);
break;
case 358:
kernel_timing_trigger(60, 359);
break;
case 359:
sendWSMessage_10000(1, _ripley, _seriesRp02, 16, 1, 360, _seriesRp02, 1, 1, 0);
break;
case 360:
terminateMachineAndNull(_ripley);
ws_unhide_walker();
player_update_info();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0x100, 0,
triggerMachineByHashCallback, "rip looks around");
ws_hide_walker();
sendWSMessage_10000(1, _ripley, _seriesHeadTurn, 1, 6, -1,
_seriesHeadTurn, 6, 6, 0);
kernel_timing_trigger(150, 361);
break;
case 361:
sendWSMessage_10000(1, _ripley, _seriesHeadTurn, 6, 1, -1, _seriesHeadTurn, 1, 1, 0);
kernel_timing_trigger(180, 362);
kernel_timing_trigger(90, 363);
break;
case 362:
_volume = 40;
digi_play("409r01c", 1, 255, 366);
break;
case 363:
sendWSMessage_10000(1, _ripley, _seriesHeadTurn, 8, 12, -1, _seriesHeadTurn, 12, 12, 0);
kernel_timing_trigger(150, 364);
break;
case 364:
sendWSMessage_10000(1, _ripley, _seriesHeadTurn, 12, 8, -1, _seriesHeadTurn, 8, 8, 0);
kernel_timing_trigger(150, 365);
break;
case 366:
sendWSMessage_10000(1, _ripley, _seriesTalker, 1, 4, -1, _seriesTalker, 1, 4, 1);
digi_play("409r01a", 1, 255, 367);
midi_play("ATONING", 255, true, -1, 949);
break;
case 367:
digi_play("409r01b", 1, 255, 368);
break;
case 368:
terminateMachineAndNull(_ripley);
ws_unhide_walker();
ws_walk(_G(my_walker), 379, 330, nullptr, 380, 1);
break;
case 380:
setGlobals1(_seriesReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(381);
break;
case 381:
digi_play("950_s07", 2);
sendWSMessage_120000(382);
inv_give_to_player("TOMB MESSAGE");
break;
case 382:
sendWSMessage_150000(384);
break;
case 384:
ws_walk(_G(my_walker), 377, 332, nullptr, 385, 5);
break;
case 385:
player_update_info();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0x100, 0,
triggerMachineByHashCallback, "rip looks around");
_shadow = series_place_sprite("SAFARI SHADOW 5", 0,
_G(player_info).x, _G(player_info).y, _G(player_info).scale, 0xf00);
ws_hide_walker();
sendWSMessage_10000(1, _ripley, _seriesReadTelegram, 1, 21, 386,
_seriesReadTelegram, 22, 31, 0);
break;
case 386:
sendWSMessage_1a0000(_ripley, 12);
digi_play("409r02d", 1, 255, 387);
break;
case 387:
digi_play("409r02a", 1, 255, 388);
break;
case 388:
digi_play("409r02b", 1, 255, 389);
break;
case 389:
midi_fade_volume(0, 120);
kernel_timing_trigger(120, -1);
sendWSMessage_10000(1, _ripley, _seriesReadTelegram, 21, 1, 391,
_seriesReadTelegram, 1, 1, 0);
sendWSMessage_190000(_ripley, 5);
break;
case 391:
sendWSMessage_10000(1, _ripley, _seriesHeadTurn, 8, 12, -1,
_seriesHeadTurn, 12, 12, 0);
digi_play("409r02c", 1, 255, 401);
break;
case 401:
sendWSMessage_10000(1, _ripley, _seriesHeadTurn, 12, 8, 402,
_seriesHeadTurn, 1, 1, 0);
break;
case 402:
terminateMachineAndNull(_ripley);
terminateMachineAndNull(_shadow);
ws_unhide_walker();
ws_walk(_G(my_walker), 379, 330, nullptr, 403, 1);
break;
case 403:
setGlobals1(_seriesReachHand, 1, 10, 10, 10, 0, 10, 1, 1, 1);
sendWSMessage_110000(405);
break;
case 405:
sendWSMessage_120000(-1);
digi_play("409_s03", 2);
inv_give_to_player("KEY");
kernel_examine_inventory_object("PING KEY", _G(master_palette),
5, 1, 270, 150, -1, nullptr, -1);
digi_play("409r03a", 1, 255, 406);
break;
case 406:
kernel_unexamine_inventory_object(_G(master_palette), 5, 1);
sendWSMessage_150000(-1);
if (!_G(flags)[V286] || !_G(flags)[V287] || !_G(flags)[V288])
digi_play("409r04a", 1, 255, 407);
else
digi_play("409r05a", 1, 255, 407);
break;
case 407:
ws_walk(_G(my_walker), 333, 319, nullptr, 408, 5);
_volume = 255;
break;
case 408:
ws_hide_walker();
_ripley = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0x100, 0,
triggerMachineByHashCallback, "rip looks at turtle");
sendWSMessage_10000(1, _ripley, _seriesRp02, 1, 16, 409, _seriesRp02, 16, 16, 0);
break;
case 409:
digi_play("409r06", 1, 255, 410);
break;
case 410:
disable_player_commands_and_fade_init(420);
break;
case 420:
_G(game).setRoom(401);
break;
default:
break;
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,62 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM409_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM409_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room409 : public Room {
private:
int _volume = 0;
bool _flag = false;
machine *_ripley = nullptr;
machine *_shadow = nullptr;
machine *_turtleRope = nullptr;
machine *_wolfWalker = nullptr;
machine *_doorOpen = nullptr;
int _seriesShadow = 0;
int _seriesDoorOpen = 0;
int _seriesRope = 0;
int _seriesWolfOpensDoor = 0;
int _seriesReadTelegram = 0;
int _seriesRp02 = 0;
int _seriesHeadTurn = 0;
int _seriesTalker = 0;
int _seriesReachHand = 0;
public:
Room409() : Room() {}
~Room409() override {}
void init() override;
void daemon() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,172 @@
/* 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/room410.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room410::preload() {
_G(player).walker_type = 0;
_G(player).shadow_type = 0;
_G(player).walker_in_this_scene = false;
}
void Room410::init() {
digi_preload("410r04");
digi_preload("410r05");
digi_preload("410r01");
digi_preload("410t01");
digi_preload("410r02");
digi_preload("410t02");
digi_preload("410r03");
digi_preload("410_s02");
_val1 = 140;
midi_play("danzig1", 0, true, -1, 949);
interface_hide();
_pu = series_stream("410PU01", 8, 0x100, -1);
series_stream_break_on_frame(_pu, 2, 100);
digi_play("410_s02", 3, 140);
}
void Room410::daemon() {
switch (_G(kernel).trigger) {
case 20:
disable_player_commands_and_fade_init(25);
break;
case 25:
case 229:
interface_show();
_G(game).setRoom(402);
break;
case 100:
if (_G(player).been_here_before) {
series_stream_break_on_frame(_pu, 56, 300);
digi_play("410r05", 1, 255, 103);
} else {
series_stream_break_on_frame(_pu, 71, 104);
digi_play("410r04", 1, 255, 103);
}
break;
case 103:
midi_play("danzig1", 255, true, -1, 949);
break;
case 104:
series_stream_break_on_frame(_pu, 102, 105);
series_set_frame_rate(_pu, 5);
digi_play("410r01", 1);
break;
case 105:
series_stream_break_on_frame(_pu, 116, 110);
series_set_frame_rate(_pu, 3000);
digi_play("410t01", 1, 255, 106);
break;
case 106:
series_set_frame_rate(_pu, 7);
ws_OverrideCrunchTime(_pu);
break;
case 110:
series_stream_break_on_frame(_pu, 126, 112);
digi_play("410r02", 1);
break;
case 112:
series_stream_break_on_frame(_pu, 136, 120);
digi_play("410t02", 1);
break;
case 120:
terminateMachineAndNull(_pu);
_pu = series_stream("410PU02", 7, 0x100, -1);
series_stream_break_on_frame(_pu, 8, 125);
// WORKAROUND: Way back up in the stack, the original _pu's anim
// is what called daemon. So we need to flag for it to bail out,
// so it doesn't try to use freed memory
_GWS(keepProcessing) = false;
_GWS(bailOut) = true;
break;
case 125:
series_stream_break_on_frame(_pu, 19, 127);
digi_play("410r03", 1, 255, 225);
break;
case 127:
series_set_frame_rate(_pu, 3000);
break;
case 225:
kernel_timing_trigger(40, 227);
break;
case 227:
disable_player_commands_and_fade_init(229);
break;
case 300:
series_set_frame_rate(_pu, 3000);
kernel_timing_trigger(1, 305);
disable_player_commands_and_fade_init(-1);
break;
case 305:
_val1 -= 4;
if (_val1 >= 0) {
digi_change_panning(3, _val1);
kernel_timing_trigger(2, 305);
} else {
interface_show();
_G(game).setRoom(402);
}
break;
default:
break;
}
}
void Room410::parser() {
if (player_said("exit")) {
if (_G(kernel).trigger <= 0) {
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(1);
} else if (_G(kernel).trigger == 1) {
digi_stop(3);
_G(game).setRoom(303);
}
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,50 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM410_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM410_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room410 : public Room {
private:
int _val1 = 0;
machine *_pu = nullptr;
public:
Room410() : Room() {}
~Room410() override {}
void preload() override;
void init() override;
void daemon() override;
void parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,81 @@
/* 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/room413.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room413::preload() {
_G(player).walker_in_this_scene = false;
}
void Room413::init() {
_buttonFlag = false;
interface_hide();
player_set_commands_allowed(false);
kernel_timing_trigger(1, 25);
_G(kernel).call_daemon_every_loop = true;
}
void Room413::daemon() {
switch (_G(kernel).trigger) {
case 25:
kernel_timing_trigger(30, 27);
break;
case 27:
digi_play(_G(game).previous_room == 301 ? "413r02" : "413r01", 1, 255, 30);
break;
case 30:
kernel_timing_trigger(30, 50);
break;
case 50:
disable_player_commands_and_fade_init(75);
break;
case 75:
interface_show();
restoreAutosave();
break;
default:
break;
}
if (_G(MouseState).ButtonState) {
if (!_buttonFlag) {
_G(MouseState).Event = 0;
_G(kernel).call_daemon_every_loop = false;
kernel_timing_trigger(1, 50);
}
_buttonFlag = true;
}
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,48 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM413_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM413_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room413 : public Room {
private:
bool _buttonFlag = false;
public:
Room413() : Room() {}
~Room413() override {}
void preload() override;
void init() override;
void daemon() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,330 @@
/* 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/room456.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room456::preload() {
LoadWSAssets("OTHER SCRIPT", _G(master_palette));
_G(player).walker_in_this_scene = false;
}
void Room456::init() {
_G(player).disable_hyperwalk = true;
_trigger = 577;
_G(player).walker_in_this_scene = false;
_seriesLighterChain = series_load("456 Lighter chain");
_seriesGrateOpens = series_load("456 GRATE OPENS");
_seriesCigarBoxTop = series_load("456 CIGAR BOX TOP");
_lighter = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xe00, false,
triggerMachineByHashCallback456, "Lighter");
_vent = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xe00, false,
triggerMachineByHashCallback456, "Vent");
_lid = TriggerMachineByHash(1, 1, 0, 0, 0, 0, 0, 0, 100, 0xe00, false,
triggerMachineByHashCallback456, "Cigar box lid");
if (_G(flags)[V335]) {
sendWSMessage_10000(1, _vent, _seriesGrateOpens, 15, 15, -1,
_seriesGrateOpens, 15, 15, 0);
hotspot_set_active("VENT", false);
} else {
sendWSMessage_10000(1, _vent, _seriesGrateOpens, 1, 1, -1,
_seriesGrateOpens, 1, 1, 0);
hotspot_set_active("VENT ", false);
hotspot_set_active("HOLE", false);
hotspot_set_active("HOLE ", false);
}
if (_G(flags)[V336]) {
sendWSMessage_10000(1, _lid, _seriesCigarBoxTop, 14, 14, -1,
_seriesCigarBoxTop, 14, 14, 0);
hotspot_set_active("LID", false);
} else {
sendWSMessage_10000(1, _lid, _seriesCigarBoxTop, 1, 1, -1,
_seriesCigarBoxTop, 1, 1, 0);
hotspot_set_active("LID ", false);
hotspot_set_active("CIGAR ", false);
}
sendWSMessage_10000(1, _lighter, _seriesLighterChain, 1, 1, -1,
_seriesLighterChain, 1, 1, 0);
if (_G(game).previous_room == KERNEL_RESTORING_GAME) {
player_set_commands_allowed(true);
digi_preload("456_s03a");
digi_preload("456_s03");
digi_preload("456_s01");
if (_G(flags)[kBilliardsFan]) {
digi_play("456_s03a", 3);
kernel_timing_trigger(_trigger, 700);
}
} else if (_G(flags)[kBilliardsFan]) {
digi_play("456_s03a", 3);
kernel_timing_trigger(_trigger, 700);
} else {
digi_preload("456_s03a");
digi_preload("456_s03");
digi_preload("456_s01");
}
}
void Room456::daemon() {
if (_G(kernel).trigger == 700 && _G(flags)[kBilliardsFan]) {
digi_play_loop("456_s03a", 3);
}
}
void Room456::pre_parser() {
_G(player).resetWalk();
}
void Room456::parser() {
const bool lookFlag = player_said_any("look", "look at");
const bool takeFlag = player_said("take");
const bool useFlag = player_said_any("push", "pull", "gear", "open", "close");
if (lookFlag && player_said_any("RED BUTTON", "BLACK BUTTON", "FAN SWITCH")) {
digi_play("456r09", 1);
} else if (lookFlag && player_said_any("RED BUTTON ", "BLACK BUTTON ")) {
digi_play("456r03", 1);
} else if (lookFlag && player_said("ASHTRAY")) {
digi_play("456r11", 1);
} else if (lookFlag && player_said("SWITCH")) {
digi_play("456r26", 1);
} else if (lookFlag && player_said("HOLE ")) {
digi_play("456r27", 1);
} else if (lookFlag && player_said("HOLE")) {
digi_play("456r28", 1);
} else if (lookFlag && player_said("ACE OF SPADES")) {
digi_play("456r26", 1);
} else if (lookFlag && player_said("LIGHTER")) {
digi_play("456r06", 1);
} else if (lookFlag && player_said("CIGAR ")) {
digi_play("com098", 1, 255, -1, 997);
} else if (lookFlag && player_said_any("VENT", "VENT ")) {
digi_play("456r10", 1);
} else if (lookFlag && player_said_any("CIGAR BOX", "LID", "LID ")) {
digi_play("456r04", 1);
} else if (lookFlag && player_said("PICTURE")) {
digi_play("456r16", 1);
} else if (lookFlag && player_said("CHAIN")) {
digi_play("456r07", 1);
} else if (lookFlag && player_said(" ")) {
digi_play("456r17", 1);
} else if (useFlag && player_said("LID")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _lid, _seriesCigarBoxTop, 1, 14, 2,
_seriesCigarBoxTop, 14, 14, 0);
hotspot_set_active("LID", false);
_G(flags)[V336] = 1;
hotspot_set_active("LID ", true);
hotspot_set_active("CIGAR ", true);
digi_play("456_s05", 2);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (useFlag && player_said("LID ")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _lid, _seriesCigarBoxTop, 14, 1, 2,
_seriesCigarBoxTop, 1, 1, 0);
hotspot_set_active("LID", true);
_G(flags)[V336] = 0;
hotspot_set_active("LID ", false);
hotspot_set_active("CIGAR ", false);
digi_play("456_s05", 2);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (useFlag && player_said("VENT")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _vent, _seriesGrateOpens, 1, 15, 2,
_seriesGrateOpens, 15, 15, 0);
hotspot_set_active("VENT", false);
_G(flags)[V335] = 1;
hotspot_set_active("VENT ", true);
hotspot_set_active("HOLE", true);
hotspot_set_active("HOLE ", true);
digi_play("950_s36", 2, 255, -1, 950);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (useFlag && player_said("VENT ")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _vent, _seriesGrateOpens, 15, 1, 2,
_seriesGrateOpens, 1, 1, 0);
hotspot_set_active("VENT", true);
_G(flags)[V335] = 0;
hotspot_set_active("VENT ", false);
hotspot_set_active("HOLE", false);
hotspot_set_active("HOLE ", false);
digi_play("950_s36", 2, 255, -1, 950);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (useFlag && player_said("RED BUTTON")) {
if (_G(flags)[kBilliardsFan]) {
digi_play("456_s01", 2);
} else {
_G(flags)[kBilliardsFan] = 1;
_G(kernel).trigger_mode = KT_DAEMON;
digi_play("456_s03", 3, 255, 700);
_G(kernel).trigger_mode = KT_PARSE;
}
} else if (useFlag && player_said("BLACK BUTTON")) {
if (_G(flags)[kBilliardsFan]) {
digi_stop(3);
digi_play("456_s04", 3);
_G(flags)[kBilliardsFan] = 0;
} else {
digi_play("456_s01", 3);
}
} else if (useFlag && player_said("CHAIN")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
sendWSMessage_10000(1, _lighter, _seriesLighterChain, 1, 4, 2,
_seriesLighterChain, 4, 4, 0);
digi_play("456_s02", 2);
break;
case 2:
sendWSMessage_10000(1, _lighter, _seriesLighterChain, 4, 1, 3,
_seriesLighterChain, 1, 1, 0);
break;
case 3:
digi_play("456r08", 1, 255, 4);
break;
case 4:
player_set_commands_allowed(true);
break;
default:
break;
}
} else if (takeFlag && player_said("CIGAR ")) {
if (_G(flags)[V315]) {
digi_play("456r05", 1);
} else {
switch (_G(kernel).trigger) {
case -1:
kernel_examine_inventory_object("PING CIGAR", _G(master_palette),
5, 1, 210, 210, 2, nullptr, -1);
break;
case 2:
inv_give_to_player("CIGAR");
_G(flags)[V315] = 1;
player_set_commands_allowed(true);
break;
}
}
} else if (takeFlag && player_said("ASHTRAY")) {
digi_play("456r12", 1);
} else if (takeFlag && player_said("LIGHTER")) {
digi_play("456r14", 1);
} else if (takeFlag && player_said("CIGAR BOX")) {
digi_play("456r15", 1);
} else if (useFlag && player_said("RED BUTTON ")) {
digi_play("456_s01", 2);
} else if (useFlag && player_said("BLACK BUTTON ")) {
switch (_G(kernel).trigger) {
case -1:
digi_play("456_s01", 2);
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(2);
break;
case 2:
_G(game).setRoom(406);
if (_G(flags)[kBilliardsFan]) {
adv_kill_digi_between_rooms(false);
digi_play_loop("456_s03a", 3);
}
break;
default:
break;
}
} else if (player_said("BILLIARD BALL", "HOLE")) {
digi_play("456r13", 1);
} else if (player_said("BILLIARD BALL", "HOLE ")) {
switch (_G(kernel).trigger) {
case -1:
player_set_commands_allowed(false);
_G(flags)[kBilliardBallInCabinet] = 1;
_G(flags)[kBilliardsTableState] = 1;
inv_move_object("BILLIARD BALL", 456);
digi_play("456_s06", 1, 255, 1);
break;
case 1:
digi_play("456_s07", 1, 255, 2);
break;
case 2:
player_set_commands_allowed(true);
break;
default:
break;
}
} else {
return;
}
_G(player).command_ready = false;
}
void Room456::triggerMachineByHashCallback456(frac16 myMessage, machine *) {
kernel_trigger_dispatchx(myMessage);
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,58 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM456_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM456_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room456 : public Room {
private:
machine *_lighter = nullptr;
machine *_lid = nullptr;
machine *_vent = nullptr;
int _seriesLighterChain = 0;
int _seriesGrateOpens = 0;
int _seriesCigarBoxTop = 0;
int _trigger = 0;
static void triggerMachineByHashCallback456(frac16 myMessage, machine *);
public:
Room456() : Room() {}
~Room456() override {}
void preload() override;
void init() override;
void daemon() override;
void pre_parser() override;
void parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,212 @@
/* 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/room493.h"
#include "m4/graphics/gr_series.h"
#include "m4/gui/gui_sys.h"
#include "m4/platform/keys.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room493::preload() {
_G(player).walker_type = 1;
_G(player).shadow_type = 1;
_G(player).walker_in_this_scene = false;
}
void Room493::init() {
interface_hide();
player_set_commands_allowed(false);
AddSystemHotkey(KEY_ESCAPE, escape_key_pressed);
RemoveSystemHotkey(303);
RemoveSystemHotkey(22);
_panning = 255;
if (_G(game).previous_room != 494) {
digi_preload("lostcity", 917);
if (_G(game).previous_room != 917) {
digi_preload("riptheme", 917);
digi_play("riptheme", 3, 255, -1, 917);
}
}
_credits = series_stream("game credits", 10, 256, 900);
series_stream_break_on_frame(_credits, 10, 30);
kernel_timing_trigger(360, 700);
}
void Room493::daemon() {
static int32 FRAMES[13] = {
4, 12, 24, 36, 48, 60, 68, 76, 88, 96, 108, 116, 128
};
switch (_G(kernel).trigger) {
case 30:
series_stream_break_on_frame(_credits, FRAMES[2], 50);
setTrigger(40);
break;
case 50:
series_stream_break_on_frame(_credits, FRAMES[3], 70);
setTrigger(60);
break;
case 70:
series_stream_break_on_frame(_credits, FRAMES[4] - 2, 90);
setTrigger(80);
break;
case 90:
series_stream_break_on_frame(_credits, FRAMES[5] - 2, 110);
setTrigger(100);
break;
case 110:
series_stream_break_on_frame(_credits, FRAMES[6] - 2, 130);
setTrigger(120);
break;
case 130:
series_stream_break_on_frame(_credits, FRAMES[7] - 2, 150);
setTrigger(140);
break;
case 150:
series_stream_break_on_frame(_credits, FRAMES[8] - 2, 170);
setTrigger(160);
break;
case 170:
series_stream_break_on_frame(_credits, FRAMES[9] - 2, 190);
setTrigger(180);
break;
case 190:
series_stream_break_on_frame(_credits, FRAMES[10] - 2, 210);
setTrigger(200);
break;
case 210:
series_stream_break_on_frame(_credits, FRAMES[11] - 2, 230);
setTrigger(220);
break;
case 230:
series_stream_break_on_frame(_credits, FRAMES[12] - 2, 250);
setTrigger(240);
break;
case 250:
setTrigger(260);
break;
case 666:
AddSystemHotkey(303, Hotkeys::show_version);
AddSystemHotkey(22, Hotkeys::show_version);
_G(game).setRoom(494);
break;
case 700:
if (checkStrings()) {
digi_stop(3);
kernel_timing_trigger(10, 800);
} else {
kernel_timing_trigger(65, 700);
}
break;
case 800:
digi_play("lostcity", 3, 255, 810, 917);
break;
case 810:
digi_play_loop("riptheme", 3, 255, -1, 917);
break;
case 900:
if (_G(game).previous_room == 494)
disable_player_commands_and_fade_init(920);
else
disable_player_commands_and_fade_init(910);
break;
case 910:
_panning -= 4;
if (_panning > 0) {
digi_change_panning(3, _panning);
kernel_timing_trigger(2, 910);
} else {
AddSystemHotkey(303, Hotkeys::show_version);
AddSystemHotkey(22, Hotkeys::show_version);
_G(game).setRoom(494);
}
break;
case 920:
adv_kill_digi_between_rooms(false);
AddSystemHotkey(303, Hotkeys::show_version);
AddSystemHotkey(22, Hotkeys::show_version);
_G(game).setRoom(494);
break;
case 40:
case 60:
case 80:
case 100:
case 120:
case 140:
case 160:
case 180:
case 200:
case 220:
case 240:
case 260:
crunch();
break;
default:
break;
}
}
void Room493::escape_key_pressed(void *, void *) {
_G(kernel).trigger_mode = KT_DAEMON;
disable_player_commands_and_fade_init(910);
}
void Room493::setTrigger(int16 trigger) {
series_set_frame_rate(_credits, 30000);
kernel_timing_trigger(900, trigger);
}
void Room493::crunch() {
series_set_frame_rate(_credits, 10);
ws_OverrideCrunchTime(_credits);
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,53 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM493_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM493_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room493 : public Room {
private:
machine *_credits = nullptr;
int _panning = 0;
static void escape_key_pressed(void *, void *);
void setTrigger(int16 trigger);
void crunch();
public:
Room493() : Room() {}
~Room493() override {}
void preload() override;
void init() override;
void daemon() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,266 @@
/* 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/graphics/gr_series.h"
#include "m4/gui/gui_sys.h"
#include "m4/platform/keys.h"
#include "m4/riddle/rooms/section4/room494.h"
#include "m4/riddle/inventory.h"
#include "m4/riddle/vars.h"
#include "m4/riddle/walker.h"
#include "m4/riddle/riddle.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room494::preload() {
_G(kernel).letter_box_y = LETTERBOX_Y;
_G(player).walker_type = WALKER_ALT;
_G(player).shadow_type = SHADOW_ALT;
_G(player).walker_in_this_scene = false;
}
void Room494::init() {
midi_stop();
mouse_show();
_hotkeyEscape = GetSystemHotkey(KEY_ESCAPE);
_hotkeySave = GetSystemHotkey(KEY_F2);
_hotkeyLoad = GetSystemHotkey(KEY_F3);
RemoveSystemHotkey(KEY_F2);
AddSystemHotkey(KEY_ESCAPE, escapeFn);
AddSystemHotkey(KEY_F3, loadFn);
_machine1 = _machine2 = nullptr;
_selectedBtn1 = _selectedBtn2 = -1;
midi_stop();
digi_preload("gallery", 950);
digi_play_loop("gallery", 1, 255, -1, 950);
interface_hide();
_G(kernel).call_daemon_every_loop = true;
_menuButtons = series_load("494 MENU BUTTONS");
_buttons[0] = series_show_sprite("494 MENU BUTTONS", 0, 0xf00);
_buttons[1] = series_show_sprite("494 MENU BUTTONS", 3, 0xf00);
_buttons[2] = series_show_sprite("494 MENU BUTTONS", 6, 0xf00);
_buttons[3] = series_show_sprite("494 MENU BUTTONS", 9, 0xf00);
_buttons[4] = series_show_sprite("494 MENU BUTTONS", 12, 0xf00);
_buttons[5] = series_show_sprite("494 MENU BUTTONS", 15, 0xf00);
}
void Room494::daemon() {
const int selectedBtn = getSelectedButton();
bool btnClicked = false;
switch (_G(kernel).trigger) {
case 111:
if (g_engine->autosaveExists()) {
restoreHotkeys();
restoreAutosave();
} else {
_G(flags)[V001] = 1;
digi_stop(1);
_G(game).setRoom(901);
}
break;
case 304:
restoreHotkeys();
setupInventory();
_G(flags)[V001] = 1;
interface_show();
digi_stop(1);
_G(game).setRoom(304);
break;
case 493:
restoreHotkeys();
adv_kill_digi_between_rooms(false);
_G(game).setRoom(493);
break;
case 666:
_G(kernel).going = false;
break;
case 901:
restoreHotkeys();
setupInventory();
_G(flags)[V001] = 1;
digi_stop(1);
_G(game).setRoom(901);
break;
case 999:
interface_hide();
break;
default:
break;
}
if (_G(MouseState).ButtonState) {
if (_selectState) {
if (selectedBtn == _selectedBtn2 && _machine2) {
terminateMachineAndNull(_machine2);
_selectedBtn2 = -1;
digi_play("950_s51", 2);
}
if (!_machine2) {
_machine2 = series_show_sprite("494 menu buttons",
selectedBtn * 3 + 2, 0x100);
_selectedBtn2 = selectedBtn;
digi_play("950_s51", 2);
}
} else {
if (_machine1) {
terminateMachineAndNull(_machine1);
_selectedBtn1 = -1;
}
if (selectedBtn != -1) {
_machine2 = series_show_sprite("494 menu buttons",
selectedBtn * 3 + 2, 0x100);
_selectedBtn2 = selectedBtn;
digi_play("950_s51", 2);
}
}
_selectState = true;
} else if (_selectState) {
if (_machine2) {
terminateMachineAndNull(_machine2);
_selectedBtn2 = -1;
}
_selectState = false;
btnClicked = true;
}
if (selectedBtn != -1) {
if (_selectedBtn1 != -1 && selectedBtn != _selectedBtn1) {
terminateMachineAndNull(_machine1);
_selectedBtn1 = -1;
}
if (_selectedBtn1 == -1 && !_machine2) {
_selectedBtn1 = selectedBtn;
_machine1 = series_show_sprite("494 menu buttons",
selectedBtn * 3 + 1, 0x100);
}
} else {
if (selectedBtn != _selectedBtn1) {
terminateMachineAndNull(_machine1);
_selectedBtn1 = selectedBtn;
}
}
if (btnClicked) {
switch (selectedBtn) {
case 0:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(901);
break;
case 1:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(304);
break;
case 2:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(111);
break;
case 3:
loadFn(nullptr, nullptr);
break;
case 4:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(493);
break;
case 5:
player_set_commands_allowed(false);
disable_player_commands_and_fade_init(666);
break;
default:
break;
}
}
}
void Room494::pre_parser() {
_G(player).need_to_walk = false;
_G(player).ready_to_walk = true;
_G(player).waiting_for_walk = false;
}
void Room494::escapeFn(void *, void *) {
//TODO room 494 escapeFn
warning("TODO: room 494 escapeFn");
}
void Room494::loadFn(void *, void *) {
g_engine->showLoadScreen(M4Engine::kLoadFromGameDialog);
}
int Room494::getSelectedButton() const {
static const Common::Rect BUTTONS[6] = {
{ 91, 323, 150, 370 },
{ 174, 323, 226, 370 },
{ 247, 323, 312, 370 },
{ 333, 323, 388, 370 },
{ 423, 323, 458, 370 },
{ 494, 323, 547, 370 }
};
const int x = _G(MouseState).CursorColumn;
const int y = _G(MouseState).CursorRow;
for (int i = 0; i < 6; ++i) {
if (BUTTONS[i].contains(x, y))
return i;
}
return -1;
}
void Room494::restoreHotkeys() {
AddSystemHotkey(KEY_ESCAPE, _hotkeyEscape);
AddSystemHotkey(KEY_F2, _hotkeySave);
AddSystemHotkey(KEY_F3, _hotkeyLoad);
}
void Room494::setupInventory() {
_G(flags).reset();
static_cast<Inventory *>(_G(inventory))->reset();
conv_reset_all();
player_reset_been();
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,65 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM494_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM494_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room494 : public Room {
private:
static void escapeFn(void *, void *);
static void loadFn(void *, void *);
int getSelectedButton() const;
void restoreHotkeys();
void setupInventory();
private:
int _menuButtons = 0;
int _selectedBtn2 = -1;
int _selectedBtn1 = -1;
machine *_machine1 = nullptr;
machine *_machine2 = nullptr;
machine *_buttons[6] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
HotkeyCB _hotkeyEscape = nullptr;
HotkeyCB _hotkeySave = nullptr;
HotkeyCB _hotkeyLoad = nullptr;
bool _selectState = false;
public:
Room494() : Room() {}
~Room494() override {}
void preload() override;
void init() override;
void daemon() override;
void pre_parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,286 @@
/* 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/room495.h"
#include "m4/graphics/gr_series.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
void Room495::preload() {
_G(player).walker_in_this_scene = false;
}
void Room495::init() {
updateFlags1();
updateFlags2();
interface_hide();
player_set_commands_allowed(false);
digi_preload("950_s46");
_G(player).disable_hyperwalk = true;
_G(player).walker_in_this_scene = false;
_val1 = 255;
series_show("495 peiping", 0xf00);
series_show("495 new york", 0xf00);
if (_G(flags)[V056])
series_show("495 danzig", 0xf00);
if (_G(flags)[V110]) {
series_show("495 sikkim", 0xf00);
series_show("495 lima", 0xf00);
}
if (player_been_here(501))
series_show("495 easter island", 0xf00);
digi_play("950_s46", 3);
switch (_G(game).previous_room) {
case 201:
_G(flags)[V092] = 1;
switch (_G(flags)[kTravelDest]) {
case 1:
play("495 peiping to ny", "495pg03s", 93, 3);
break;
case 2:
play("495 peiping to danzig", "495pg02s", 38, 7);
break;
case 3:
play("495 peiping to sikkim", "495pg01s", 17, 14);
break;
case 4:
play("495 peiping to lima", "495pg04s", 11, 3);
break;
default:
break;
}
break;
case 301:
switch (_G(flags)[kTravelDest]) {
case 0:
play("495 ny to peiping", "495ny03s", 108, 3);
break;
case 2:
play("495 ny to danzig", "495ny02s", 47, 4);
break;
case 3:
play("495 ny to sikkim", "495ny04s", 96, 3);
break;
case 4:
play("495 ny to lima", "495ny01s", 28, 5);
break;
default:
break;
}
break;
case 401:
switch (_G(flags)[kTravelDest]) {
case 0:
play("495 danzig to peiping", "495dg04s", 51, 4);
break;
case 1:
play("495 danzig to ny", "495dg02s", 43, 4);
break;
case 3:
play("495 danzig to sikkim", "495dg03s", 38, 4);
break;
case 4:
play("495 danzig to lima", "495dg01s", 65, 4);
break;
default:
break;
}
break;
case 501:
switch (_G(flags)[kTravelDest]) {
case 0:
play("495 lima to peiping", "495lm05s", 115, 3);
break;
case 1:
play("495 lima to ny", "495lm02s", 18, 10);
break;
case 2:
play("495 lima to danzig", "495lm03s", 70, 4);
break;
case 3:
play("495 lima to sikkim", "495lm04s", 100, 3);
break;
case 5:
play("495 lima to easter isle", "495lm01s", 16, 12);
break;
default:
break;
}
break;
case 603:
case 615:
if (_G(flags)[kTravelDest] == 4)
play("495 easter isle to lima", "495eis", 16, 12);
break;
case 701:
switch (_G(flags)[kTravelDest]) {
case 0:
play("495 sikkim to peiping", "495sm02s", 17, 10);
break;
case 1:
play("495 sikkim to ny", "495sm04s", 93, 3);
break;
case 2:
play("495 sikkim to danzig", "495sm03s", 38, 5);
break;
case 4:
play("495 sikkim to lima", "495sm01s", 100, 3);
break;
default:
break;
}
break;
default:
break;
}
}
void Room495::daemon() {
switch (_G(kernel).trigger) {
case 500:
kernel_timing_trigger(1, 502);
disable_player_commands_and_fade_init(-1);
series_play(_seriesName1, 0, 16, -1, 5, 0, 100, 0, 0,
_lastFrame + 1, -1);
series_play(_seriesName2, 0xf00, 16, -1, 5, 0, 100, 0, 0,
_lastFrame + 1, -1);
break;
case 501:
interface_show();
switch (_G(flags)[kTravelDest]) {
case 0:
_G(flags)[V092] = 0;
_G(game).setRoom(201);
break;
case 1:
_G(game).setRoom(301);
break;
case 2:
_G(flags)[V092] = 0;
_G(game).setRoom(401);
break;
case 3:
_G(flags)[V092] = 0;
_G(game).setRoom(701);
break;
case 4:
_G(flags)[V092] = 0;
_G(game).setRoom(501);
break;
case 5:
_G(flags)[V092] = 0;
_G(game).setRoom(603);
break;
case 6:
_G(flags)[V092] = 0;
_G(game).setRoom(504);
break;
default:
break;
}
break;
case 502:
_val1 -= 5;
digi_change_panning(3, _val1);
kernel_timing_trigger(1, 502);
if (_val1 <= 0) {
digi_stop(3);
kernel_timing_trigger(1, 501);
}
break;
default:
break;
}
}
void Room495::pre_parser() {
_G(player).resetWalk();
}
void Room495::updateFlags1() {
int numPlaced = getNumKeyItemsPlaced();
if (numPlaced < 3)
_G(flags)[V088] = 1;
else if (numPlaced < 6)
_G(flags)[V088] = 3;
else if (numPlaced < 9)
_G(flags)[V088] = 4;
else
_G(flags)[V088] = 5;
}
void Room495::updateFlags2() {
if (_G(flags)[V045]) {
_G(flags)[V045] = 0;
if (++_G(flags)[V090] > 3)
_G(flags)[V090] = 3;
switch (_G(flags)[V090]) {
case 1:
_G(flags)[V367] = 1;
break;
case 2:
_G(flags)[V368] = 1;
break;
case 3:
_G(flags)[V369] = 1;
break;
default:
break;
}
}
}
void Room495::play(const char *seriesName1, const char *seriesName2,
int lastFrame, int frameRate) {
_lastFrame = lastFrame;
_seriesName1 = seriesName1;
_seriesName2 = seriesName2;
series_play(_seriesName1, 0, 0, 500, frameRate, 0, 100, 0, 0, 0, lastFrame);
series_play(_seriesName2, 0xf00, 0, -1, frameRate, 0, 100, 0, 0, 0, lastFrame);
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,57 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_ROOM495_H
#define M4_RIDDLE_ROOMS_SECTION4_ROOM495_H
#include "m4/riddle/rooms/room.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
class Room495 : public Room {
private:
int _val1 = 0;
const char *_seriesName1 = nullptr;
const char *_seriesName2 = nullptr;
int _lastFrame = 0;
void updateFlags1();
void updateFlags2();
void play(const char *seriesName1, const char *seriesName2,
int lastFrame, int frameRate);
public:
Room495() : Room() {}
~Room495() override {}
void preload() override;
void init() override;
void daemon() override;
void pre_parser() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif

View File

@@ -0,0 +1,65 @@
/* 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/section4.h"
#include "m4/riddle/vars.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
const int16 S4_NORMAL_DIRS[] = { 200, 201, -1 };
const char *S4_NORMAL_NAMES[] = {
"wolf walker pos1",
"wolf walker pos3"
};
const int16 S4_SHADOW_DIRS[] = { 210, 211, -1 };
const char *S4_SHADOW_NAMES[] = {
"wolf shadow pos1",
"wolf shadow pos3"
};
Section4::Section4() : Rooms::Section() {
add(401, &_room401);
add(402, &_room402);
add(403, &_room403);
add(404, &_room404);
add(405, &_room405);
add(406, &_room406);
add(407, &_room407);
add(408, &_room408);
add(409, &_room409);
add(410, &_room410);
add(413, &_room413);
add(456, &_room456);
add(493, &_room493);
add(494, &_room494);
add(495, &_room495);
}
void Section4::daemon() {
_G(kernel).continue_handling_trigger = true;
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4

View File

@@ -0,0 +1,81 @@
/* 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/>.
*
*/
#ifndef M4_RIDDLE_ROOMS_SECTION4_H
#define M4_RIDDLE_ROOMS_SECTION4_H
#include "m4/riddle/rooms/section.h"
#include "m4/riddle/rooms/section4/room401.h"
#include "m4/riddle/rooms/section4/room402.h"
#include "m4/riddle/rooms/section4/room403.h"
#include "m4/riddle/rooms/section4/room404.h"
#include "m4/riddle/rooms/section4/room405.h"
#include "m4/riddle/rooms/section4/room406.h"
#include "m4/riddle/rooms/section4/room407.h"
#include "m4/riddle/rooms/section4/room408.h"
#include "m4/riddle/rooms/section4/room409.h"
#include "m4/riddle/rooms/section4/room410.h"
#include "m4/riddle/rooms/section4/room413.h"
#include "m4/riddle/rooms/section4/room456.h"
#include "m4/riddle/rooms/section4/room493.h"
#include "m4/riddle/rooms/section4/room494.h"
#include "m4/riddle/rooms/section4/room495.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
extern const int16 S4_NORMAL_DIRS[];
extern const char *S4_NORMAL_NAMES[];
extern const int16 S4_SHADOW_DIRS[];
extern const char *S4_SHADOW_NAMES[];
class Section4 : public Section {
private:
Room401 _room401;
Room402 _room402;
Room403 _room403;
Room404 _room404;
Room405 _room405;
Room406 _room406;
Room407 _room407;
Room408 _room408;
Room409 _room409;
Room410 _room410;
Room413 _room413;
Room456 _room456;
Room493 _room493;
Room494 _room494;
Room495 _room495;
public:
Section4();
virtual ~Section4() {}
void daemon() override;
};
} // namespace Rooms
} // namespace Riddle
} // namespace M4
#endif