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

199 lines
4.0 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "m4/riddle/rooms/room.h"
#include "m4/riddle/vars.h"
#include "m4/riddle/riddle.h"
namespace M4 {
namespace Riddle {
namespace Rooms {
int Room::_ripSketching;
void Room::preload() {
_G(player).walker_type = 1;
_G(player).shadow_type = 1;
LoadWSAssets("OTHER SCRIPT");
}
void Room::restoreAutosave() {
g_engine->loadGameState(0);
}
int Room::checkFlags(bool flag) {
int count = 0;
if (_G(flags)[V364] == 1) {
++count;
switch (_G(flags)[V005]) {
case 1:
_G(flags)[V351] = 1;
break;
case 2:
_G(flags)[V352] = 1;
break;
case 3:
_G(flags)[V353] = 1;
break;
case 4:
_G(flags)[V354] = 1;
break;
default:
break;
}
}
if (_G(flags)[V365] == 1) {
_G(flags)[V355] = 1;
++count;
}
if (_G(flags)[V366] == 1) {
_G(flags)[V356] = 1;
++count;
}
if (flag) {
if (_G(flags)[V367] == 1) {
_G(flags)[V357] = 1;
++count;
}
if (_G(flags)[V368] == 1) {
_G(flags)[V358] = 1;
++count;
}
if (_G(flags)[V369] == 1) {
_G(flags)[V359] = 1;
++count;
}
}
if (_G(game).room_id == 501 && _G(flags)[V370] == 1) {
_G(flags)[V360] = 1;
++count;
}
if (_G(game).room_id != 401 && _G(flags)[V373] == 1) {
_G(flags)[V363] = 1;
++count;
}
if (_G(game).room_id != 501 && _G(flags)[V371] == 1) {
_G(flags)[V361] = 1;
++count;
}
if (_G(flags)[V372] == 1) {
_G(flags)[V362] = 1;
++count;
}
return count;
}
void Room::setFlag45() {
_G(flags)[V045] = 1;
}
int Room::getNumKeyItemsPlaced() const {
static const char *const ITEMS[11] = {
"SHRUNKEN HEAD", "INCENSE BURNER", "CRYSTAL SKULL",
"WHALE BONE HORN", "WHEELED TOY", "SILVER BUTTERFLY",
"REBUS AMULET", "CHISEL", "GERMAN BANKNOTE",
"POSTAGE STAMP", "STICK AND SHELL MAP"
};
int total = 0;
for (int i = 0; i < 11; ++i) {
if (inv_object_in_scene(ITEMS[i], 305))
++total;
}
return total;
}
bool Room::setItemsPlacedFlags() {
int count = getNumKeyItemsPlaced();
switch (_G(flags)[V005]) {
case 0:
if (_G(flags)[V006] >= 2 && getNumKeyItemsPlaced() == 0) {
_G(flags)[V005] += 1;
return true;
}
break;
case 1:
case 2:
case 3:
if ((_G(flags)[V006] >= 15 && count < 9) ||
(_G(flags)[V006] >= 10 && count < 6) ||
(_G(flags)[V006] >= 5 && count < 3)) {
_G(flags)[V005] += 1;
return true;
}
break;
case 4:
case 5:
if ((_G(flags)[V006] >= 15 && count < 9) ||
(_G(flags)[V006] >= 10 && count < 6) ||
(_G(flags)[V006] >= 5 && count < 3)) {
if (_G(flags)[V005] == 4)
_G(flags)[V005]++;
return true;
}
break;
default:
break;
}
_G(flags)[V007] = 0;
return false;
}
const char *Room::getItemsPlacedDigi() const {
static const char *NAMES[5] = {
"301r18", "301r19", "301r20", "301r21", "301r38"
};
int val = _G(flags)[V005];
return (val >= 1 && val <= 5) ? NAMES[val - 1] : nullptr;
}
void Room::disableHotspots() {
for (auto *hs = _G(currentSceneDef).hotspots; hs; hs = hs->next)
hs->active = false;
}
void Room::enableHotspots() {
for (auto *hs = _G(currentSceneDef).hotspots; hs; hs = hs->next)
hs->active = true;
}
bool Room::checkStrings() const {
return _G(string1).empty() && _G(string2).empty() && _G(string3).empty();
}
} // namespace Rooms
} // namespace Riddle
} // namespace M4