scummvm/engines/cryomni3d/versailles/logic.cpp
2022-10-23 22:46:19 +02:00

4848 lines
129 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 "audio/audiostream.h"
#include "audio/decoders/wave.h"
#include "audio/mixer.h"
#include "common/file.h"
#include "common/system.h"
#include "cryomni3d/fixed_image.h"
#include "cryomni3d/versailles/engine.h"
namespace CryOmni3D {
namespace Versailles {
static const char *kImagesObjects[] = {
"PAMP.gif", // 0: 96
"PAPT_2.gif", // 1: 98
"PAML.gif", // 2: 101
"ESQ1.gif", // 3: 105a, 106b
"ESQ2.gif", // 4: 105b, 106c
"ESQ3.gif", // 5: 105c
"ESQ4.gif", // 6: 105d, 106a, 107a
"ESQ4T.gif", // 7: 107b
"ESQ4D.gif", // 8: 109
"PAMA.gif", // 9: 115
"PAMM1.gif", // 10: 118a
"PAMM2.gif", // 11: 118b
"MEDP.gif", // 12: 121a
"MEDP2.gif", // 13: 121b
"PAMR1.gif", // 14: 125a
"PAMR4.gif", // 15: 125b
"EPIL.gif", // 16: 126
"PAMG.gif", // 17: 127
"PBETE.gif", // 18: 129
"VAU2.gif", // 19: 131
"VAU3.gif", // 20: 132
"GRAV2.gif", // 21: 134
"MEM.gif", // 22: 137
"VS1.gif", // 23: 138
"VS2.gif", // 24: 139
"FAB.gif", // 25: 141
"LABYR.gif", // 26: 142
};
void CryOmni3DEngine_Versailles::setupObjects() {
_objects.reserve(51);
#define SET_OBJECT(cursorId, nameId) _objects.push_back(Object(_sprites, cursorId, nameId))
#define SET_OBJECT_AND_CB(cursorId, nameId, cb) do { \
_objects.push_back(Object(_sprites, cursorId, nameId)); \
_objects.back().setViewCallback(new Common::Functor0Mem<void, CryOmni3DEngine_Versailles>(this, &CryOmni3DEngine_Versailles::cb)); \
} while (false)
#define SET_OBJECT_GENERIC_CB(cursorId, nameId, imageId) SET_OBJECT_AND_CB(cursorId, nameId, genericDisplayObject<imageId>)
#define SET_OBJECT_CB(cursorId, nameId) SET_OBJECT_AND_CB(cursorId, nameId, obj_ ## nameId)
SET_OBJECT(161, 93); // 0
SET_OBJECT(107, 94);
SET_OBJECT(69, 95);
SET_OBJECT_GENERIC_CB(230, 96, 0);
SET_OBJECT(64, 97);
SET_OBJECT_GENERIC_CB(250, 98, 1); // 5
SET_OBJECT(202, 99);
SET_OBJECT(235, 100);
SET_OBJECT_GENERIC_CB(167, 101, 2);
SET_OBJECT(191, 102);
SET_OBJECT(171, 103); // 10
SET_OBJECT(47, 104);
SET_OBJECT_CB(205, 105);
SET_OBJECT_CB(214, 106);
SET_OBJECT_CB(6, 107);
SET_OBJECT(58, 108); // 15
SET_OBJECT_GENERIC_CB(5, 109, 8);
SET_OBJECT(38, 110);
SET_OBJECT(119, 113);
SET_OBJECT(186, 114);
SET_OBJECT_GENERIC_CB(246, 115, 9); // 20
SET_OBJECT(80, 116);
SET_OBJECT(180, 117);
SET_OBJECT_CB(34, 118);
SET_OBJECT(173, 119);
SET_OBJECT(81, 120); // 25
SET_OBJECT_CB(156, 121);
SET_OBJECT(143, 122);
SET_OBJECT(101, 123);
SET_OBJECT(204, 124);
SET_OBJECT_CB(10, 125); // 30
SET_OBJECT_CB(112, 126);
SET_OBJECT_GENERIC_CB(90, 127, 17);
SET_OBJECT(216, 128);
SET_OBJECT_CB(32, 129);
SET_OBJECT(37, 130); // 35
SET_OBJECT_GENERIC_CB(134, 131, 19);
SET_OBJECT_GENERIC_CB(150, 132, 20);
SET_OBJECT(28, 133);
SET_OBJECT_GENERIC_CB(22, 134, 21);
SET_OBJECT(92, 135); // 40
SET_OBJECT_GENERIC_CB(16, 137, 22);
SET_OBJECT_GENERIC_CB(237, 138, 23);
SET_OBJECT_GENERIC_CB(0, 139, 24);
SET_OBJECT(31, 140);
SET_OBJECT_GENERIC_CB(87, 141, 25); // 45
SET_OBJECT_CB(95, 142);
SET_OBJECT(115, 136); // Out of order in EXE
SET_OBJECT(157, 143);
SET_OBJECT(168, 144);
SET_OBJECT(65, 145); // 50
#undef SET_OBJECT_CB
#undef SET_OBJECT_GENERIC_CB
#undef SET_OBJECT_AND_CB
#undef SET_OBJECT
}
template<uint ID>
void CryOmni3DEngine_Versailles::genericDisplayObject() {
displayObject(kImagesObjects[ID]);
}
void CryOmni3DEngine_Versailles::obj_105() {
displayObject(kImagesObjects[3]);
displayObject(kImagesObjects[4]);
displayObject(kImagesObjects[5]);
displayObject(kImagesObjects[6]);
}
void CryOmni3DEngine_Versailles::obj_106() {
displayObject(kImagesObjects[6]);
displayObject(kImagesObjects[3]);
displayObject(kImagesObjects[4]);
}
void CryOmni3DEngine_Versailles::obj_107() {
if (_gameVariables[GameVariables::kSketchState] == 3) {
displayObject(kImagesObjects[7]);
} else {
displayObject(kImagesObjects[6]);
}
}
void CryOmni3DEngine_Versailles::obj_118() {
if (_gameVariables[GameVariables::kDecipherScore]) {
displayObject(kImagesObjects[11]);
} else {
displayObject(kImagesObjects[10]);
}
}
void CryOmni3DEngine_Versailles::obj_121() {
if (_gameVariables[GameVariables::kGotMedalsSolution]) {
displayObject(kImagesObjects[13]);
} else {
displayObject(kImagesObjects[12]);
}
}
void CryOmni3DEngine_Versailles::obj_125() {
if (_gameVariables[GameVariables::kStateLampoonReligion]) {
displayObject(kImagesObjects[15]);
} else {
displayObject(kImagesObjects[14]);
}
}
void CryOmni3DEngine_Versailles::obj_126() {
displayObject(kImagesObjects[16], &CryOmni3DEngine_Versailles::obj_126hk);
}
void CryOmni3DEngine_Versailles::obj_126hk(Graphics::ManagedSurface &surface) {
Graphics::Surface bmpLetters[28];
loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
drawEpigraphLetters(surface, bmpLetters, _epigraphPassword);
for (uint i = 0; i < 28; i++) {
bmpLetters[i].free();
}
if (_messages.size() <= 148) {
return;
}
Common::String &translation = _messages[148];
if (translation.size() == 0) {
return;
}
_fontManager.setCurrentFont(1);
_fontManager.setTransparentBackground(true);
_fontManager.setForeColor(0);
_fontManager.setSurface(&surface);
_fontManager.displayStr(9, 424, translation);
}
void CryOmni3DEngine_Versailles::obj_129() {
displayObject(kImagesObjects[18], &CryOmni3DEngine_Versailles::obj_129hk);
}
void CryOmni3DEngine_Versailles::obj_129hk(Graphics::ManagedSurface &surface) {
if (_messages.size() <= 149) {
return;
}
Common::String &translation = _messages[149];
if (translation.size() == 0) {
return;
}
surface.fillRect(Common::Rect(0, 455, 640, 480), 247);
_fontManager.setCurrentFont(8);
_fontManager.setTransparentBackground(true);
_fontManager.setForeColor(242);
_fontManager.setSurface(&surface);
_fontManager.displayStr(10, 460, translation);
}
void CryOmni3DEngine_Versailles::obj_142() {
// Display a marker only when in maze
if (_currentLevel == 6 && _currentPlaceId >= 14 && _currentPlaceId <= 44) {
displayObject(kImagesObjects[26], &CryOmni3DEngine_Versailles::obj_142hk);
} else {
displayObject(kImagesObjects[26]);
}
}
void CryOmni3DEngine_Versailles::obj_142hk(Graphics::ManagedSurface &surface) {
const Common::Point markers[] = {
Common::Point(135, 403), // 14
Common::Point(136, 321), // 15
Common::Point(225, 109),
Common::Point(441, 88),
Common::Point(505, 78),
Common::Point(550, 82),
Common::Point(479, 242), // 20
Common::Point(529, 333),
Common::Point(466, 407),
Common::Point(359, 411),
Common::Point(305, 415),
Common::Point(217, 405), // 25
Common::Point(216, 325),
Common::Point(280, 378),
Common::Point(340, 313),
Common::Point(282, 313),
Common::Point(253, 285), // 30
Common::Point(225, 258),
Common::Point(154, 255),
Common::Point(219, 188),
Common::Point(294, 251),
Common::Point(341, 242), // 35
Common::Point(308, 206),
Common::Point(270, 172),
Common::Point(363, 161),
Common::Point(416, 201),
Common::Point(513, 195), // 40
Common::Point(412, 311),
Common::Point(446, 280),
Common::Point(377, 347),
Common::Point(448, 356),
};
uint id = _currentPlaceId - 14;
assert(id < ARRAYSIZE(markers));
/*
_fontManager.setSurface(&surface);
_fontManager.setCurrentFont(4);
_fontManager.setTransparentBackground(true);
_fontManager.setForeColor(241);
for(id = 0; id < ARRAYSIZE(markers); id++) {
*/
// Why - 20? Ask to game creators, it's like that in the code
uint spriteX = markers[id].x - _sprites.getCursor(4).getWidth() / 2 - 20;
uint spriteY = markers[id].y - _sprites.getCursor(4).getHeight() / 2;
surface.transBlitFrom(_sprites.getSurface(4), Common::Point(spriteX, spriteY),
_sprites.getKeyColor(4));
/*
_fontManager.displayInt(markers[id].x - 10, markers[id].y, id + 14);
}
*/
}
// This array contains images for all paintings it must be kept in sync with _paintingsTitles
static const char *kImagesPaintings[] = {
"10E_1.GIF", // 0: 41201
nullptr, // 1: 41202
"10E_3.GIF", // 2: 41203
"10E_4.GIF", // 3: 41204
"10E_5.GIF", // 4: 41205
"10D_1.GIF", // 5: 41301
"10D_2.GIF", // 6: 41302
"20C_1.GIF", // 7: 42401
"20G_11.GIF", // 8: 42901
"20G_12.GIF", // 9: 42902
"20G_13.GIF", // 10: 42903
"20G_14.GIF", // 11: 42904
"20G_15.GIF", // 12: 42905
"20G_16.GIF", // 13: 42906
"20G_21.GIF", // 14: 42907
"20G_22.GIF", // 15: 42908
"20G_23.GIF", // 16: 42909
"20G_31.GIF", // 17: 42910
"20G_32.GIF", // 18: 42911
"20G_33.GIF", // 19: 42912
"20G_34.GIF", // 20: 42913
"20G_35.GIF", // 21: 42914
"20G_36.GIF", // 22: 42915
"30N_1.GIF", // 23: 43090
"30N_2.GIF", // 24: 43091
"30N_3.GIF", // 25: 43092
"30O_1.GIF", // 26: 43100
"30O_2.GIF", // 27: 43101
"30O_31.GIF", // 28: 43102
"30O_32.GIF", // 29: 43103
"30O_33.GIF", // 30: 43104
"30M_1.GIF", // 31: 43130
"30M_2.GIF", // 32: 43131
"30M_3.GIF", // 33: 43132
"30L_11.GIF", // 34: 43140
"30L_12.GIF", // 35: 43141
"30L_21.GIF", // 36: 43142
nullptr, // 37: 43143
"30L_32.GIF", // 38: 43144
"30J_11.GIF", // 39: 43150
"30J_12.GIF", // 40: 43151
"30J_13.GIF", // 41: 43152
"30J_21.GIF", // 42: 43153
"30J_22.GIF", // 43: 43154
"30J_31.GIF", // 44: 43155
"30J_32.GIF", // 45: 43156
"30J_33.GIF", // 46: 43157
"51A_1.GIF", // 47: 45260
// Now let's put dumb images, those without description and any special action, they are not synced with _paintingsTitles
"30Q_1.GIF", // 48: 43060
"30Q_2.GIF", // 49: 43061
"DUC.GIF", // 50: 46001
"COQ.GIF", // 51: 46002
"CHAT.GIF", // 52: 46003
"DRAGON.GIF", // 53: 46004
"GRUE.GIF", // 54: 46005
"RENARD.GIF", // 55: 46006
"POULE.GIF", // 56: 46007
"LOUP.GIF", // 57: 46008
"MILAN.GIF", // 58: 46009
"GRENOU.GIF", // 59: 46010
"AIGLE.GIF", // 60: 46011
"SOURIS.GIF", // 61: 46012
"CYGNE.GIF", // 62: 46013 and 46440
"LOUPTETE.GIF", // 63: 46014
"CANNES.GIF", // 64: 46015
};
// Setup array for all see actions
void CryOmni3DEngine_Versailles::setupImgScripts() {
// First all paintings to keep it simple for counting
#define SET_SCRIPT_BY_ID(id) _imgScripts[id] = &CryOmni3DEngine_Versailles::img_ ## id
#define SET_SCRIPT_BY_PAINTING(id, image) _imgScripts[id] = &CryOmni3DEngine_Versailles::genericPainting<image>
SET_SCRIPT_BY_PAINTING(41201, 0);
SET_SCRIPT_BY_ID(41202);
SET_SCRIPT_BY_PAINTING(41203, 2);
SET_SCRIPT_BY_PAINTING(41204, 3);
SET_SCRIPT_BY_PAINTING(41205, 4);
SET_SCRIPT_BY_PAINTING(41301, 5);
SET_SCRIPT_BY_PAINTING(41302, 6);
SET_SCRIPT_BY_PAINTING(42401, 7);
SET_SCRIPT_BY_PAINTING(42901, 8);
SET_SCRIPT_BY_PAINTING(42902, 9);
SET_SCRIPT_BY_PAINTING(42903, 10);
SET_SCRIPT_BY_PAINTING(42904, 11);
SET_SCRIPT_BY_PAINTING(42905, 12);
SET_SCRIPT_BY_PAINTING(42906, 13);
SET_SCRIPT_BY_PAINTING(42907, 14);
SET_SCRIPT_BY_PAINTING(42908, 15);
SET_SCRIPT_BY_PAINTING(42909, 16);
SET_SCRIPT_BY_PAINTING(42910, 17);
SET_SCRIPT_BY_PAINTING(42911, 18);
SET_SCRIPT_BY_PAINTING(42912, 19);
SET_SCRIPT_BY_PAINTING(42913, 20);
SET_SCRIPT_BY_PAINTING(42914, 21);
SET_SCRIPT_BY_PAINTING(42915, 22);
SET_SCRIPT_BY_PAINTING(43090, 23);
SET_SCRIPT_BY_PAINTING(43091, 24);
SET_SCRIPT_BY_PAINTING(43092, 25);
SET_SCRIPT_BY_PAINTING(43100, 26);
SET_SCRIPT_BY_PAINTING(43101, 27);
SET_SCRIPT_BY_PAINTING(43102, 28);
SET_SCRIPT_BY_PAINTING(43103, 29);
SET_SCRIPT_BY_PAINTING(43104, 30);
SET_SCRIPT_BY_PAINTING(43130, 31);
SET_SCRIPT_BY_PAINTING(43131, 32);
SET_SCRIPT_BY_PAINTING(43132, 33);
SET_SCRIPT_BY_PAINTING(43140, 34);
SET_SCRIPT_BY_PAINTING(43141, 35);
SET_SCRIPT_BY_PAINTING(43142, 36);
SET_SCRIPT_BY_ID(43143);
SET_SCRIPT_BY_PAINTING(43144, 38);
SET_SCRIPT_BY_PAINTING(43150, 39);
SET_SCRIPT_BY_PAINTING(43151, 40);
SET_SCRIPT_BY_PAINTING(43152, 41);
SET_SCRIPT_BY_PAINTING(43153, 42);
SET_SCRIPT_BY_PAINTING(43154, 43);
SET_SCRIPT_BY_PAINTING(43155, 44);
SET_SCRIPT_BY_PAINTING(43156, 45);
SET_SCRIPT_BY_PAINTING(43157, 46);
SET_SCRIPT_BY_PAINTING(45260, 47);
#undef SET_SCRIPT_BY_PAINTING
// From now dumb images (like paintings but without interrogation mark handling)
#define SET_SCRIPT_BY_DUMB(id, image) _imgScripts[id] = &CryOmni3DEngine_Versailles::genericDumbImage<image>
SET_SCRIPT_BY_DUMB(43060, 48);
SET_SCRIPT_BY_DUMB(43061, 49);
SET_SCRIPT_BY_DUMB(46001, 50);
SET_SCRIPT_BY_DUMB(46002, 51);
SET_SCRIPT_BY_DUMB(46003, 52);
SET_SCRIPT_BY_DUMB(46004, 53);
SET_SCRIPT_BY_DUMB(46005, 54);
SET_SCRIPT_BY_DUMB(46006, 55);
SET_SCRIPT_BY_DUMB(46007, 56);
SET_SCRIPT_BY_DUMB(46008, 57);
SET_SCRIPT_BY_DUMB(46009, 58);
SET_SCRIPT_BY_DUMB(46010, 59);
SET_SCRIPT_BY_DUMB(46011, 60);
SET_SCRIPT_BY_DUMB(46012, 61);
SET_SCRIPT_BY_DUMB(46013, 62);
SET_SCRIPT_BY_DUMB(46014, 63);
SET_SCRIPT_BY_DUMB(46015, 64);
SET_SCRIPT_BY_DUMB(46440, 62); // Same as 46013
#undef SET_SCRIPT_BY_DUMB
// From now specific handlers for anything that is not a painting
SET_SCRIPT_BY_ID(41801);
SET_SCRIPT_BY_ID(41802);
SET_SCRIPT_BY_ID(43145);
SET_SCRIPT_BY_ID(43146);
SET_SCRIPT_BY_ID(43160);
SET_SCRIPT_BY_ID(43190);
SET_SCRIPT_BY_ID(44071);
SET_SCRIPT_BY_ID(44161);
SET_SCRIPT_BY_ID(45130);
SET_SCRIPT_BY_ID(45270);
SET_SCRIPT_BY_ID(45280);
SET_SCRIPT_BY_ID(88001);
SET_SCRIPT_BY_ID(88002);
SET_SCRIPT_BY_ID(88003);
SET_SCRIPT_BY_ID(88004);
#undef SET_SCRIPT_BY_ID
}
// Generic handler for dumb fixed images
template<uint ID>
void CryOmni3DEngine_Versailles::genericDumbImage(ZonFixedImage *fimg) {
fimg->load(kImagesPaintings[ID]);
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
// Generic handler for interrogation mark action: display the painting title
#define HANDLE_QUESTION(ID) \
do { \
if (fimg->_zoneQuestion) { \
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), _paintingsTitles[ID], Common::Point(600, 400), \
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage)); \
} \
} while (false)
// Generic handler for paintings fixed images
template<uint ID>
void CryOmni3DEngine_Versailles::genericPainting(ZonFixedImage *fimg) {
fimg->load(kImagesPaintings[ID]);
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
HANDLE_QUESTION(ID);
}
}
// Specific fixed images callbacks
#define IMG_CB(name) void CryOmni3DEngine_Versailles::img_ ## name(ZonFixedImage *fimg)
IMG_CB(31101) {
fimg->load("21F_11.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0) {
// Collect key and change image
collectObject(104, fimg);
_gameVariables[GameVariables::kCollectKey] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31101b);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 1 && !_inventory.inInventoryByNameID(103)) {
collectObject(103, fimg);
}
}
}
}
IMG_CB(31101b) {
fimg->load("21F_10.GIF");
if (_inventory.inInventoryByNameID(103)) {
fimg->disableZone(1);
}
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && !_inventory.inInventoryByNameID(103)) {
collectObject(103, fimg);
// Original game resets callback with this one, this is useless
break;
}
}
}
IMG_CB(31142) {
fimg->load("10D2_4.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 7,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
IMG_CB(31142b) {
fimg->load("11D2_2.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (_gameVariables[GameVariables::kCollectScissors] || _inventory.inInventoryByNameID(94)) {
// Empty drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31142d);
fimg->changeCallback(functor);
break;
} else {
// Drawer with scissors in it
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31142c);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(31142c) {
fimg->load("11D2_21.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (!_inventory.inInventoryByNameID(94) && !_gameVariables[GameVariables::kCollectScissors]) {
collectObject(94, fimg);
}
_gameVariables[GameVariables::kCollectScissors] = 1;
// Display empty drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31142d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(31142d) {
fimg->load("11D2_22.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Close drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31142b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(31143) {
fimg->load("10D2_3.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 7,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
IMG_CB(31143b) {
fimg->load("11D2_1.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (_inventory.inInventoryByNameID(96)) {
// Empty drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31143d);
fimg->changeCallback(functor);
break;
} else {
// Drawer with pamphlet about arts in it
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31143c);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(31143c) {
fimg->load("11D2_11.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (!_inventory.inInventoryByNameID(96)) {
collectObject(96, fimg);
}
// Display empty drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31143d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(31143d) {
fimg->load("11D2_12.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Close drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_31143b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(32120) {
if (currentGameTime() != 3) {
fimg->_exit = true;
return;
}
// Already painted
if (_gameVariables[GameVariables::kSketchState] == 3 ||
_gameVariables[GameVariables::kSketchState] == 4) {
fimg->_exit = true;
return;
}
fimg->load("23I_10.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
_sprites.replaceSpriteColor(59, 254, 244);
_sprites.replaceSpriteColor(63, 254, 247);
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0 && !_inventory.inInventoryByIconID(38)) {
// Pick the brush
Object *obj = _objects.findObjectByIconID(38);
collectObject(obj, fimg);
// collectObject animates the cursor
// Make it selected
_inventory.setSelectedObject(obj);
setCursor(obj->idSA()); // 59 in original game
fimg->_zonesMode = ZonFixedImage::kZonesMode_Object;
}
} else if (fimg->_usedObject && fimg->_usedObject->idCA() == 38) {
// Brush used
if (fimg->_currentZone == 1) { // on gold paint
_inventory.removeByIconID(38);
Object *obj = _objects.findObjectByIconID(38);
obj->rename(111); // Brush has gold on it
setMainPaletteColor(254, 128, 128, 0);
_sprites.replaceSpriteColor(59, 244, 254);
_sprites.replaceSpriteColor(63, 247, 254);
// Collect only there once we set the color on the cursors
collectObject(obj, fimg);
_inventory.setSelectedObject(obj);
setCursor(obj->idSA()); // 59 in original game
fimg->_zonesMode = ZonFixedImage::kZonesMode_Object;
_gameVariables[GameVariables::kBrushColor] = 1;
} else if (fimg->_currentZone == 2) { // on red paint
_inventory.removeByIconID(38);
Object *obj = _objects.findObjectByIconID(38);
obj->rename(112); // Brush has red on it
setMainPaletteColor(254, 128, 0, 0);
_sprites.replaceSpriteColor(59, 244, 254);
_sprites.replaceSpriteColor(63, 247, 254);
// Collect only there once we set the color on the cursors
collectObject(obj, fimg);
_inventory.setSelectedObject(obj);
setCursor(obj->idSA()); // 59 in original game
fimg->_zonesMode = ZonFixedImage::kZonesMode_Object;
_gameVariables[GameVariables::kBrushColor] = 2;
} else if (fimg->_currentZone == 3) { // on sketch
if (fimg->_usedObject->idOBJ() == 111 &&
_gameVariables[GameVariables::kBrushColor] == 1) {
// Gold brush used on sketch
_gameVariables[GameVariables::kSketchState] = 3;
playInGameVideo("23I_11");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_inventory.removeByIconID(38);
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_32120b);
fimg->changeCallback(functor);
break;
} else if (fimg->_usedObject->idOBJ() == 112 &&
_gameVariables[GameVariables::kBrushColor] == 2) {
// Red brush used on sketch
_gameVariables[GameVariables::kSketchState] = 4;
playInGameVideo("23I_12");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_inventory.removeByIconID(38);
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_32120c);
fimg->changeCallback(functor);
break;
}
}
}
}
}
IMG_CB(32120b) {
fimg->load("23I_11.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneUse) {
fimg->_exit = true;
break;
}
}
_inventory.removeByNameID(107);
collectObject(107, fimg);
_sprites.replaceSpriteColor(59, 254, 244);
_sprites.replaceSpriteColor(63, 254, 247);
setGameTime(4, 2);
}
IMG_CB(32120c) {
fimg->load("23I_12.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneUse) {
fimg->_exit = true;
break;
}
}
_inventory.removeByNameID(107);
collectObject(109, fimg);
_sprites.replaceSpriteColor(59, 254, 244);
_sprites.replaceSpriteColor(63, 254, 247);
setGameTime(4, 2);
}
IMG_CB(32201) {
fimg->load("21E_41.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
// There is a check of use but only to change sound path
// That must be a leftover
/*
if (fimg->_zoneUse) {
}
*/
}
}
IMG_CB(32202) {
fimg->load("21E_42.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(32203) {
fimg->load("21E_43.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
// There is a check of use but only to change sound path
// That must be a leftover
/*
if (fimg->_zoneUse) {
}
*/
}
}
IMG_CB(32204) {
fimg->load("21E_44.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && !_inventory.inInventoryByNameID(105)) {
// Collect portfolio
collectObject(105, fimg);
_gameVariables[GameVariables::kSketchState] = 1;
_gameVariables[GameVariables::kCollectPortfolio] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_32204b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(32204b) {
fimg->load("21E_45.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(34131) {
fimg->load("43ZA_1.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(34132) {
fimg->load("43ZB_2.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(34172) {
playInGameVideo("43X3_10");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
fimg->_exit = true;
}
IMG_CB(34173) {
fimg->load("43X3_2.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// WORKAROUND: The video doesn't exist there is only a fixed image unused in original game. We will use it.
/*
playInGameVideo("43X3_21");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
*/
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34173b);
fimg->changeCallback(functor);
break;
}
}
}
// WORKAROUND: In original game an empty clickable drawer is displayed
// Happily for them, when you click on an area and change zones, the next zone
// under the cursor get activated too (fixed in fixed_image.cpp). So you don't
// see what happens. You just get the reminder and see the empty drawer.
IMG_CB(34173b) {
// 43X3_21 doesn't have a ZON file, use the one of 43X3_22
fimg->load("43X3_21.GIF", "43X3_22.ZON");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && !_inventory.inInventoryByNameID(129)) {
// Collect reminder
collectObject(129, fimg);
setGameTime(3, 4);
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34173c);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(34173c) {
fimg->load("43X3_22.GIF");
// WORKAROUND: Drawer is empty, just disable the use zone
fimg->disableZone(0);
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(34174) {
fimg->load("43X3_42.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Open the door
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(34174b) {
// Door is open but safe is closed
fimg->load("43X3_40.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (_gameVariables[GameVariables::kSafeUnlocked]) {
// Open the safe
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174c);
fimg->changeCallback(functor);
break;
}
_dialogsMan["{JOUEUR-ALLER-BUREAU-LOUVOIS}"] = 'Y';
if (handleSafe(fimg)) {
// Unlocked the safe
_gameVariables[GameVariables::kSafeUnlocked] = 1;
_dialogsMan["{JOUEUR-ALLER-BUREAU-LOUVOIS}"] = 'N';
// Open it
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174c);
fimg->changeCallback(functor);
break;
}
// If failed to solve: just display this image again
break;
}
}
}
IMG_CB(34174c) {
// Dispatch to the correct state
if (_gameVariables[GameVariables::kCollectVaubanBlueprint1] &&
_gameVariables[GameVariables::kCollectVaubanBlueprint2]) {
// Safe is empty
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174f);
fimg->changeCallback(functor);
return;
}
if (!_gameVariables[GameVariables::kCollectVaubanBlueprint1] &&
_gameVariables[GameVariables::kCollectVaubanBlueprint2] == 1) {
// Blueprint 1 is there not the 2nd one
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174e);
fimg->changeCallback(functor);
return;
}
if (_gameVariables[GameVariables::kCollectVaubanBlueprint1] &&
!_gameVariables[GameVariables::kCollectVaubanBlueprint2]) {
// Blueprint 2 is there not the 1st one
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174d);
fimg->changeCallback(functor);
return;
}
playInGameVideo("cofouv");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
// Safe has both blueprints
fimg->load("43X3_30.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0) {
// Collect 1st blueprint
collectObject(131, fimg);
_dialogsMan["{JOUEUR-TROUVE-PLANS-VAUBAN}"] = 'Y';
_gameVariables[GameVariables::kCollectVaubanBlueprint1] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174d);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 1) {
// Collect 2nd blueprint
collectObject(132, fimg);
_gameVariables[GameVariables::kCollectVaubanBlueprint2] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174e);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(34174d) {
// Safe has only blueprint 2
fimg->load("43X3_43.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Collect 2nd blueprint
collectObject(132, fimg);
_gameVariables[GameVariables::kCollectVaubanBlueprint2] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174f);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(34174e) {
// Safe has only blueprint 1
fimg->load("43X3_41.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Collect 1st blueprint
collectObject(131, fimg);
_dialogsMan["{JOUEUR-TROUVE-PLANS-VAUBAN}"] = 'Y';
_gameVariables[GameVariables::kCollectVaubanBlueprint1] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174f);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(34174f) {
// Safe is empty
fimg->load("43X3_45.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Close safe
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_34174b);
fimg->changeCallback(functor);
break;
}
}
}
bool CryOmni3DEngine_Versailles::handleSafe(ZonFixedImage *fimg) {
bool success = false;
Common::RandomSource rnd("VersaillesSafe");
Graphics::Surface bmpDigits[10];
unsigned char safeDigits[kSafeDigitsCount];
Graphics::ManagedSurface tempSurf;
loadBMPs("coff_%02d.bmp", bmpDigits, 10);
for (uint i = 0; i < kSafeDigitsCount; i++) {
safeDigits[i] = rnd.getRandomNumber(9);
}
fimg->load("43x3_cof.GIF");
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawSafeDigits(tempSurf, bmpDigits, safeDigits);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 15) {
// Safe handle
// Animate handle
playInGameVideo("43x3_poi");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
// Redraw our safe image
fimg->display();
if (checkSafeDigits(safeDigits)) {
success = true;
break;
}
} else if (fimg->_currentZone < kSafeDigitsCount) {
// Safe digit
safeDigits[fimg->_currentZone] = (safeDigits[fimg->_currentZone] + 1) % 10;
// Reset the surface and redraw digits on it
tempSurf.blitFrom(*fimgSurface);
drawSafeDigits(tempSurf, bmpDigits, safeDigits);
fimg->updateSurface(&tempSurf.rawSurface());
waitMouseRelease();
}
}
}
for (uint i = 0; i < 10; i++) {
bmpDigits[i].free();
}
return success;
}
const uint16 CryOmni3DEngine_Versailles::kSafeDigitsX[] = { 267, 318, 370, 421 };
const uint16 CryOmni3DEngine_Versailles::kSafeDigitsY[] = { 148, 230, 311 };
void CryOmni3DEngine_Versailles::drawSafeDigits(Graphics::ManagedSurface &surface,
const Graphics::Surface(&bmpDigits)[10], const unsigned char (&safeDigits)[kSafeDigitsCount]) {
for (uint i = 0; i < ARRAYSIZE(safeDigits); i++) {
const Graphics::Surface &digit = bmpDigits[safeDigits[i]];
Common::Point dst(kSafeDigitsX[i % 4], kSafeDigitsY[i / 4]);
surface.transBlitFrom(digit, dst);
}
}
const char *CryOmni3DEngine_Versailles::kSafeDates[] = { "1643", "1668", "1674" };
bool CryOmni3DEngine_Versailles::checkSafeDigits(unsigned char (&safeDigits)[kSafeDigitsCount]) {
uint dateChecked;
for (dateChecked = 0; dateChecked < ARRAYSIZE(kSafeDates); dateChecked++) {
const char *checkDate = kSafeDates[dateChecked];
// Find the date in one of safe digits lines
uint line;
for (line = 0; line < kSafeDigitsCount; line += 4) {
uint digit;
for (digit = 0; digit < 4; digit++) {
if (safeDigits[line + digit] != checkDate[digit] - '0') {
break;
}
}
if (digit == 4) {
// Check was a success: go to next date
break;
}
// Failure: try next line
}
if (line >= kSafeDigitsCount) {
// All lines were tested and none had the date: failure
return false;
}
}
// All dates were found
return true;
}
IMG_CB(41202) {
fimg->load("10E_20.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
HANDLE_QUESTION(1);
if (fimg->_zoneUse) {
if (fimg->_currentZone == 2 && !_inventory.inInventoryByNameID(97)) {
// Open the jar
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41202b);
fimg->changeCallback(functor);
break;
} else {
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 11,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
}
IMG_CB(41202b) {
fimg->load("10E_21.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
HANDLE_QUESTION(1);
if (fimg->_zoneLow) {
// Go back to jars closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41202);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse) {
if (!_inventory.inInventoryByNameID(97)) {
collectObject(97, fimg);
}
// Go back to jars closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41202);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(41801) {
fimg->load("12E2_10.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_currentZone == 0) {
bool open = false;
if (fimg->_zoneUse) {
// Using without object
if (_gameVariables[GameVariables::kUsedScissors]) {
open = true;
} else {
// Closed
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 8,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
} else if (fimg->_usedObject && fimg->_usedObject->idOBJ() == 94) {
_gameVariables[GameVariables::kUsedScissors] = 1;
_inventory.removeByNameID(94);
open = true;
}
if (open) {
if (_gameVariables[GameVariables::kCollectedPaperInTrunk]) {
// Display empty trunk
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41801c);
fimg->changeCallback(functor);
break;
} else {
// Display trunk with paper in it
// Animate opening
playInGameVideo("12E2_11");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41801b);
fimg->changeCallback(functor);
break;
}
}
}
}
}
IMG_CB(41801b) {
fimg->load("12E2_11.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
// Animate closing
playInGameVideo("12E2_13");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (!_inventory.inInventoryByNameID(100)) {
collectObject(100, fimg);
}
_gameVariables[GameVariables::kCollectedPaperInTrunk] = 1;
// Go to empty trunk
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41801c);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(41801c) {
fimg->load("12E2_12.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
// Animate closing
playInGameVideo("12E2_13");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
fimg->_exit = true;
break;
}
}
}
IMG_CB(41802) {
// Dispatch to the correct state
if (_gameVariables[GameVariables::kInkSpilled] &&
!_gameVariables[GameVariables::kCollectedPaperOnTable]) {
// Draw paper with ink on it
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802b);
fimg->changeCallback(functor);
return;
}
if (!_gameVariables[GameVariables::kInkSpilled] &&
_gameVariables[GameVariables::kCollectedPaperOnTable]) {
// Draw table with ink in inkpot and without paper
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802c);
fimg->changeCallback(functor);
return;
}
if (_gameVariables[GameVariables::kInkSpilled] &&
_gameVariables[GameVariables::kCollectedPaperOnTable]) {
// Draw table with ink directly on table
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802d);
fimg->changeCallback(functor);
return;
}
// There we have paper on table and ink is in its inkpot
fimg->load("12E2_20.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && fimg->_currentZone == 1) {
// Collected paper
collectObject(95, fimg);
_gameVariables[GameVariables::kCollectedPaperOnTable] = 1;
setPlaceState(8, 1);
// Draw table with ink in inkpot and without paper
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802c);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse && fimg->_currentZone == 2) {
_gameVariables[GameVariables::kInkSpilled] = 1;
setPlaceState(8, 3);
// Draw paper with ink on it
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802b);
fimg->changeCallback(functor);
break;
}
if (fimg->_usedObject && fimg->_currentZone == 0) {
uint objID = fimg->_usedObject->idOBJ();
if (objID == 100) {
playInGameVideo("12E2_24");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_inventory.removeByNameID(100);
// Revealed paper
collectObject(98, fimg);
_gameVariables[GameVariables::kGotRevealedPaper] = 1;
setGameTime(3, 1);
} else if (objID == 96) {
// Lampoon about arts
playInGameVideo("PAP-BRUL");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
doGameOver();
}
}
}
}
IMG_CB(41802b) {
// There we have paper on table with ink on it
fimg->load("12E2_21.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && fimg->_currentZone == 1) {
// Collected paper with ink on it
collectObject(99, fimg);
_gameVariables[GameVariables::kCollectedPaperOnTable] = 1;
setPlaceState(8, 2);
// Draw table with ink spilled and without paper
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802d);
fimg->changeCallback(functor);
break;
}
if (fimg->_usedObject && fimg->_currentZone == 0) {
uint objID = fimg->_usedObject->idOBJ();
if (objID == 100) {
playInGameVideo("12E2_24");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_inventory.removeByNameID(100);
// Revealed paper
collectObject(98, fimg);
_gameVariables[GameVariables::kGotRevealedPaper] = 1;
setGameTime(3, 1);
} else if (objID == 96) {
// Lampoon about arts
playInGameVideo("PAP-BRUL");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
doGameOver();
}
}
}
}
IMG_CB(41802c) {
// There we have ink in inkpot and without paper
fimg->load("12E2_22.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && fimg->_currentZone == 1) {
_gameVariables[GameVariables::kInkSpilled] = 1;
setPlaceState(8, 2);
// Draw table with ink on it
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_41802d);
fimg->changeCallback(functor);
break;
}
if (fimg->_usedObject && fimg->_currentZone == 0) {
uint objID = fimg->_usedObject->idOBJ();
if (objID == 100) {
playInGameVideo("12E2_24");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_inventory.removeByNameID(100);
// Revealed paper
collectObject(98, fimg);
_gameVariables[GameVariables::kGotRevealedPaper] = 1;
setGameTime(3, 1);
} else if (objID == 96) {
// Lampoon about arts
playInGameVideo("PAP-BRUL");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
doGameOver();
}
}
}
}
IMG_CB(41802d) {
// There we have ink directly on table
fimg->load("12E2_23.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_usedObject && fimg->_currentZone == 0) {
uint objID = fimg->_usedObject->idOBJ();
if (objID == 100) {
playInGameVideo("12E2_24");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_inventory.removeByNameID(100);
// Revealed paper
collectObject(98, fimg);
_gameVariables[GameVariables::kGotRevealedPaper] = 1;
setGameTime(3, 1);
} else if (objID == 96) {
// Lampoon about arts
playInGameVideo("PAP-BRUL");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
doGameOver();
}
}
}
}
IMG_CB(43143) {
// Lampoon is there: display it
if (!_gameVariables[GameVariables::kCollectLampoonArchitecture] &&
(_currentLevel == 5 || currentGameTime() >= 3)) {
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43143b);
fimg->changeCallback(functor);
return;
}
fimg->load("30L_31.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
HANDLE_QUESTION(37);
}
}
IMG_CB(43143b) {
fimg->load("30L_3101.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
HANDLE_QUESTION(37);
if (fimg->_zoneUse) {
// Paper is out of reach
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 16,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
} else if (fimg->_usedObject && fimg->_usedObject->idOBJ() == 119 && fimg->_currentZone == 0) {
_inventory.removeByNameID(119);
collectLampoonArchitecture(fimg);
// Display without the lampoon
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43143);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43145) {
fimg->load("30L_50.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0) {
playInGameVideo("30L_51");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43145b);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 1) {
playInGameVideo("30L_52");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43145c);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(43145b) {
fimg->load("30L_51.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
// Go back to drawer closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43145);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse) {
if (_gameVariables[GameVariables::kCabinetDrawerStatus] == 1) {
// Small key 2 has been put in it and not yet picked by us
collectObject(116, fimg);
_gameVariables[GameVariables::kCabinetDrawerStatus] = 2;
} else {
// Drawer is empty
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 3,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
}
IMG_CB(43145c) {
fimg->load("30L_52.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
// Go back to drawer closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43145);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse) {
// Drawer is empty
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 3,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
IMG_CB(43146) {
fimg->load("30L_40.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0) {
playInGameVideo("30L_41");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43146b);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 1) {
playInGameVideo("30L_42");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43146c);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(43146b) {
fimg->load("30L_41.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
// Go back to drawer closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43146);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse) {
// Drawer is empty
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 3,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
IMG_CB(43146c) {
fimg->load("30L_42.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
// Go back to drawer closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43146);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse) {
// Drawer is empty
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 3,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
IMG_CB(43160) {
// Dispatch to the correct state
bool inInvCharcoal = _inventory.inInventoryByNameID(113);
bool inInvPaper = _inventory.inInventoryByNameID(114);
if (inInvCharcoal && inInvPaper) {
// When everything is collected, state of place change and we shouldn't be able to look at the table
error("BUG: Shouldn't be here");
} else if (inInvCharcoal && !inInvPaper) {
// Draw table with paper but without charcoal
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43160b);
fimg->changeCallback(functor);
return;
} else if (!inInvCharcoal && inInvPaper) {
// Draw table with charcoal but without paper
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43160c);
fimg->changeCallback(functor);
return;
}
// There we have charcoal and paper on table
fimg->load("31I01.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0) {
// Collected charcoal
collectObject(113, fimg);
// Draw table with paper but without charcoal
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43160b);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 1) {
// Collected paper
collectObject(114, fimg);
// Draw table with charcoal but without paper
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43160c);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(43160b) {
// There we have paper on table but without charcoal
fimg->load("31I02.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneUse) {
// Collected paper
collectObject(114, fimg);
// Draw table empty
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43160d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43160c) {
// There we have charcoal on table but without paper
fimg->load("31I03.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneUse) {
// Collected charcoal
collectObject(113, fimg);
// Draw table empty
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43160d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43160d) {
// There we have neither charcoal nor paper on table
fimg->load("31I04.GIF");
setPlaceState(16, 1);
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(43190) {
fimg->load("31L1_20.GIF");
if (_gameVariables[GameVariables::kCollectScore]) {
fimg->disableZone(0);
}
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
playInGameVideo("31L1_2A");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43190b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43190b) {
fimg->load("31L1_20B.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
playInGameVideo("31L1_2B");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43190c);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43190c) {
fimg->load("31L1_20C.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
playInGameVideo("31L1_2C");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43190d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43190d) {
fimg->load("31L1_20D.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
playInGameVideo("31L1_2D");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43190e);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43190e) {
fimg->load("31L1_20E.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_43190f);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(43190f) {
fimg->load("31L1_22.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneUse) {
_gameVariables[GameVariables::kCollectScore] = 1;
collectObject(118, fimg);
fimg->_exit = true;
break;
}
}
}
IMG_CB(44071) {
// Dispatch to the correct state
if (_gameVariables[GameVariables::kCollectFood]) {
// Draw plate with less food
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44071b);
fimg->changeCallback(functor);
return;
}
// There we have a full plate
fimg->load("41B_bboy.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Collected food
collectObject(124, fimg);
_gameVariables[GameVariables::kCollectFood] = 1;
// Draw plate with less food
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44071b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(44071b) {
// There we have less food on plate
fimg->load("41B_bbo2.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(44161) {
// Dispatch to the correct state
if (_gameVariables[GameVariables::kCollectQuill] == 1 && !_inventory.inInventoryByNameID(126)) {
// We have collected quill but not solved epigraph yet
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161b);
fimg->changeCallback(functor);
return;
} else if (_gameVariables[GameVariables::kUsedVaubanBlueprint1] == 1 &&
_gameVariables[GameVariables::kUsedVaubanBlueprint2] == 1) {
// We have used vauban blueprints: display the solution
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161f);
fimg->changeCallback(functor);
return;
} else if (_gameVariables[GameVariables::kCollectQuill] == 1 &&
_inventory.inInventoryByNameID(126)) {
// We have collected quill and epigraph
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161c);
fimg->changeCallback(functor);
return;
}
// There we have blueprints, quill and epigraph on desk
fimg->load("42X2_20.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse && fimg->_currentZone == 0 && currentGameTime() >= 2) {
// Collected quill
collectObject(128, fimg);
_gameVariables[GameVariables::kCollectQuill] = 1;
// Try to solve epigraph
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161b);
fimg->changeCallback(functor);
break;
} else if (fimg->_zoneSee) {
// Look at blueprints
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(44161b) {
// There we have blueprints and epigraph on desk.
fimg->load("42X2_10.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_usedObject && fimg->_usedObject->idOBJ() == 128 && fimg->_currentZone == 1) {
if (handleEpigraph(fimg)) {
// Epigraph is solved
_inventory.removeByNameID(128);
collectObject(126, fimg, false);
_dialogsMan["{JOUEUR_POSSEDE_EPIGRAPHE}"] = 'Y';
setPlaceState(16, 2);
// No more epigraphe nor quill
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161c);
fimg->changeCallback(functor);
}
// If failed to solve: just display this image again
break;
} else if (fimg->_zoneSee) {
// Look at blueprints
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(44161c) {
// There we have no quill nor epigraph anymore
fimg->load("42X2_11.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneSee) {
// Look at blueprints
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161d);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(44161d) {
// Look at blueprints
fimg->load("VAU1.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_usedObject && fimg->_usedObject->idOBJ() == 131) {
// Overlay blueprints
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161e);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(44161e) {
// Look at blueprints
fimg->load("VAUB22.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_usedObject && fimg->_usedObject->idOBJ() == 132) {
// Overlay blueprints
_gameVariables[GameVariables::kUsedVaubanBlueprint1] = 1;
_gameVariables[GameVariables::kUsedVaubanBlueprint2] = 1;
_inventory.removeByNameID(131);
_inventory.removeByNameID(132);
setGameTime(4, 4);
// Look at the final result
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_44161f);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(44161f) {
// Look at blueprints result
fimg->load("VAU.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
bool CryOmni3DEngine_Versailles::handleEpigraph(ZonFixedImage *fimg) {
bool success = false;
Graphics::Surface bmpLetters[28];
Common::String password;
Graphics::ManagedSurface tempSurf;
loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
fimg->load("EPIL.GIF");
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
// No need to customize image yet
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
break;
}
if (fimg->_zoneUse) {
if (password.size() >= kEpigraphMaxLetters) {
continue;
}
// Find which letter got clicked
char letter = _epigraphContent[fimg->_currentZone];
password += letter;
// Reset the surface and redraw digits on it
tempSurf.blitFrom(*fimgSurface);
drawEpigraphLetters(tempSurf, bmpLetters, password);
fimg->updateSurface(&tempSurf.rawSurface());
waitMouseRelease();
} else if (fimg->_key.keycode) {
Common::KeyCode keyCode = fimg->_key.keycode;
if (keyCode == Common::KEYCODE_BACKSPACE) {
password.deleteLastChar();
} else {
if (password.size() >= kEpigraphMaxLetters) {
continue;
}
if (keyCode >= Common::KEYCODE_a &&
keyCode <= Common::KEYCODE_z &&
_epigraphContent.contains((char)(keyCode - Common::KEYCODE_a + 'A'))) {
password += keyCode - Common::KEYCODE_a + 'A';
} else {
continue;
}
}
// Reset the surface and redraw digits on it
tempSurf.blitFrom(*fimgSurface);
drawEpigraphLetters(tempSurf, bmpLetters, password);
fimg->updateSurface(&tempSurf.rawSurface());
}
if (password == _epigraphPassword) {
success = true;
break;
}
}
for (uint i = 0; i < 28; i++) {
bmpLetters[i].free();
}
return success;
}
void CryOmni3DEngine_Versailles::drawEpigraphLetters(Graphics::ManagedSurface &surface,
const Graphics::Surface(&bmpLetters)[28], const Common::String &letters) {
for (uint i = 0; i < letters.size() && i < kEpigraphMaxLetters; i++) {
uint letterId = 0;
if (letters[i] >= 'A' && letters[i] <= 'Z') {
letterId = letters[i] - 'A';
} else if (letters[i] == ' ') {
letterId = 26;
} else if (letters[i] == '\'') {
letterId = 27;
}
const Graphics::Surface &letter = bmpLetters[letterId];
Common::Point dst(34 * i + 4, 380);
surface.transBlitFrom(letter, dst);
}
}
IMG_CB(45130) {
fimg->load("52M2.GIF");
_dialogsMan["{JOUEUR-VU-PLANS-SALON-DIANE}"] = 'Y';
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
}
IMG_CB(45270) {
fimg->load("51A4_11.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone == 0) {
// Open left drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_45270b);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 1) {
// Open middle drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_45270c);
fimg->changeCallback(functor);
break;
} else if (fimg->_currentZone == 2) {
// Open right drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_45270d);
fimg->changeCallback(functor);
break;
}
}
}
}
IMG_CB(45270b) {
fimg->load("51A4_22.GIF");
if (!_gameVariables[GameVariables::kCollectSmallKey3]) {
// Collected small key 3
collectObject(135, fimg);
_gameVariables[GameVariables::kCollectSmallKey3] = 1;
}
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Close drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_45270);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(45270c) {
fimg->load("51A4_32.GIF");
if (!_gameVariables[GameVariables::kCollectEngraving]) {
// Collected engraving
collectObject(134, fimg);
_gameVariables[GameVariables::kCollectEngraving] = 1;
}
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Close drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_45270);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(45270d) {
fimg->load("51A4_12.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
// Close drawer
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_45270);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(45280) {
if (_gameVariables[GameVariables::kOpenedCurtain]) {
fimg->load("53I_LUST.GIF");
_gameVariables[GameVariables::kSeenMemorandum] = 1;
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
}
} else {
fimg->_exit = true;
}
}
IMG_CB(88001) {
if (!_inventory.inInventoryByNameID(121) &&
_gameVariables[GameVariables::kMedalsDrawerStatus] == 3) {
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88001c);
fimg->changeCallback(functor);
return;
}
fimg->load("33P_10.GIF");
if (_inventory.inInventoryByNameID(121)) {
fimg->disableZone(0);
}
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse &&
!_inventory.inInventoryByNameID(121)) {
// Open the drawer
playInGameVideo("33P_10");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88001b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(88001b) {
_gameVariables[GameVariables::kMedalsDrawerStatus] = 2;
fimg->load("33P_12.GIF");
while (1) {
fimg->manage();
if (fimg->_exit) {
break;
}
if (fimg->_zoneLow) {
_gameVariables[GameVariables::kMedalsDrawerStatus] = 0;
// Go back to drawer closed
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88001);
fimg->changeCallback(functor);
break;
}
if (fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 114 &&
fimg->_currentZone == 0) {
// Lay the paper on the medals
_inventory.removeByNameID(114);
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88001c);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(88001c) {
// Paper is laid on the medals
_gameVariables[GameVariables::kMedalsDrawerStatus] = 3;
fimg->load("33P_13.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 113 &&
fimg->_currentZone == 0) {
// Use charcoal on paper and medals
_inventory.removeByNameID(113);
playInGameVideo("33P_14");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
collectObject(121, fimg);
_dialogsMan["{JOUEUR-POSSEDE-FUSAIN-MEDAILLES}"] = 'Y';
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88001);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(88002) {
fimg->load("53Z1c_10.GIF");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (_currentLevel == 7) {
// You will need something to reach the bomb
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 10,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
}
}
IMG_CB(88003) {
// Dispatch to the correct state
if (_gameVariables[GameVariables::kBombState] >= 1 &&
_gameVariables[GameVariables::kBombState] <= 5) {
FixedImgCallback callback = nullptr;
switch (_gameVariables[GameVariables::kBombState]) {
case 1:
callback = &CryOmni3DEngine_Versailles::img_88003b;
break;
case 2:
callback = &CryOmni3DEngine_Versailles::img_88003c;
break;
case 3:
callback = &CryOmni3DEngine_Versailles::img_88003d;
break;
case 4:
callback = &CryOmni3DEngine_Versailles::img_88003e;
break;
case 5:
callback = &CryOmni3DEngine_Versailles::img_88003f;
break;
default:
error("BUG: Invalid bomb state");
break;
}
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this, callback);
fimg->changeCallback(functor);
return;
}
fimg->load("70Z_10.GIF");
// Draw countdown there and not in fixed image class directly
Graphics::ManagedSurface tempSurf;
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_currentZone == 0 && fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 145) {
// Now we know how to reach the bomb
_gameVariables[GameVariables::kBombState] = 1;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88003b);
fimg->changeCallback(functor);
break;
}
if (fimg->_zoneUse) {
if (_currentLevel == 7) {
// You will need something to reach the bomb
displayMessageBox(kFixedimageMsgBoxParameters, fimg->surface(), 10,
fimg->getZoneCenter(fimg->_currentZone),
Common::Functor0Mem<void, ZonFixedImage>(fimg, &ZonFixedImage::manage));
}
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
}
IMG_CB(88003b) {
fimg->load("70Z_11.GIF");
// Draw countdown there and not in fixed image class directly
Graphics::ManagedSurface tempSurf;
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_currentZone == 0 && fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 97) {
// Unlock first line with key 1
_gameVariables[GameVariables::kBombState] = 2;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88003c);
fimg->changeCallback(functor);
break;
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
}
IMG_CB(88003c) {
fimg->load("70Z_12.GIF");
// Draw countdown there and not in fixed image class directly
Graphics::ManagedSurface tempSurf;
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_currentZone == 1 && fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 116) {
// Unlock second line with key 2
_gameVariables[GameVariables::kBombState] = 3;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88003d);
fimg->changeCallback(functor);
break;
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
}
IMG_CB(88003d) {
fimg->load("70Z_13.GIF");
// Draw countdown there and not in fixed image class directly
Graphics::ManagedSurface tempSurf;
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_currentZone == 2 && fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 135) {
// Unlock third line with key 3
_gameVariables[GameVariables::kBombState] = 4;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88003e);
fimg->changeCallback(functor);
break;
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
}
IMG_CB(88003e) {
fimg->load("70Z_14.GIF");
// Draw countdown there and not in fixed image class directly
Graphics::ManagedSurface tempSurf;
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_currentZone == 3 && fimg->_usedObject &&
fimg->_usedObject->idOBJ() == 136) {
// Unlock fourth line with key 4
_gameVariables[GameVariables::kBombState] = 5;
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88003f);
fimg->changeCallback(functor);
break;
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
}
IMG_CB(88003f) {
fimg->load("70Z_15.GIF");
// Draw countdown there and not in fixed image class directly
Graphics::ManagedSurface tempSurf;
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
if (handleBomb(fimg)) {
playInGameVideo("COFFRE");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
playTransitionEndLevel(7);
break;
}
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
}
bool CryOmni3DEngine_Versailles::handleBomb(ZonFixedImage *fimg) {
bool success = false;
Common::RandomSource rnd("VersaillesBomb");
Graphics::Surface bmpLetters[28];
uint32 bombPossibilites[60][5];
byte bombCurrentLetters[60];
Graphics::ManagedSurface tempSurf;
const uint bombPasswordLength = _bombPassword.size();
if (bombPasswordLength >= kBombPasswordMaxLength) {
error("Bomb password is too long");
}
uint max = _bombAlphabet.size() - 1;
if (getLanguage() != Common::JA_JPN) {
// In bitmap mode we only have 28 images
assert(max < 28);
// BUG: in game the rand is modulo 27
max = 26;
loadBMPs("bomb_%02d.bmp", bmpLetters, 28);
}
for (uint i = 0; i < bombPasswordLength; i++) {
bombPossibilites[i][0] = _bombPassword[i];
for (uint j = 1; j < 5; j++) {
bool foundSameLetter;
do {
foundSameLetter = false;
bombPossibilites[i][j] = _bombAlphabet[rnd.getRandomNumber(max)];
for (uint k = 0; k < j; k++) {
if (bombPossibilites[i][k] == bombPossibilites[i][j]) {
foundSameLetter = true;
}
}
} while (foundSameLetter);
}
bombCurrentLetters[i] = rnd.getRandomNumber(4);
}
if (bombPasswordLength <= kBombPasswordSmallLength) {
fimg->load("70z_16.GIF");
} else {
fimg->load("70z_17.GIF");
}
const Graphics::Surface *fimgSurface = fimg->surface();
tempSurf.create(fimgSurface->w, fimgSurface->h, fimgSurface->format);
tempSurf.blitFrom(*fimgSurface);
drawBombLetters(tempSurf, bmpLetters, bombPasswordLength, bombPossibilites, bombCurrentLetters);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
break;
}
if (fimg->_zoneUse) {
if (fimg->_currentZone < bombPasswordLength) {
// Safe digit
bombCurrentLetters[fimg->_currentZone] = (bombCurrentLetters[fimg->_currentZone] + 1) % 5;
// Reset the surface and redraw letters on it
tempSurf.blitFrom(*fimgSurface);
drawBombLetters(tempSurf, bmpLetters, bombPasswordLength, bombPossibilites, bombCurrentLetters);
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
waitMouseRelease();
// Check if password is OK
success = true;
for (uint i = 0; i < bombPasswordLength; i++) {
uint16 letterId = bombPossibilites[i][bombCurrentLetters[i]];
if (letterId != _bombPassword[i]) {
success = false;
break;
}
}
if (success) {
handleBombTranslation(tempSurf);
break;
}
}
}
if (countDown()) {
// Countdown has changed: refresh surface
drawCountdown(&tempSurf);
fimg->updateSurface(&tempSurf.rawSurface());
}
}
for (uint i = 0; i < 28; i++) {
bmpLetters[i].free();
}
return success;
}
void CryOmni3DEngine_Versailles::handleBombTranslation(Graphics::ManagedSurface &surface) {
if (_messages.size() <= 150) {
return;
}
Common::String &translation = _messages[150];
if (translation.size() == 0) {
return;
}
surface.fillRect(Common::Rect(0, 430, 640, 480), 247);
_fontManager.setCurrentFont(1);
_fontManager.setTransparentBackground(true);
_fontManager.setForeColor(242);
_fontManager.setSurface(&surface);
uint w = _fontManager.getStrWidth(translation);
_fontManager.displayStr((640 - w) / 2, 440, translation);
g_system->copyRectToScreen(surface.getPixels(), surface.pitch, 0, 0,
surface.w, surface.h);
g_system->updateScreen();
uint32 end = g_system->getMillis() + 5000;
bool exitImg = false;
while (!shouldAbort() && !exitImg && g_system->getMillis() < end) {
if (pollEvents()) {
if (checkKeysPressed() || getCurrentMouseButton() == 1) {
exitImg = true;
}
}
g_system->updateScreen();
g_system->delayMillis(10);
}
}
const uint16 CryOmni3DEngine_Versailles::kBombLettersPos[2][kBombPasswordMaxLength][2] = {
{
{26, 91},
{84, 89},
{141, 89},
{202, 88},
{261, 87},
{322, 86},
{384, 85},
{448, 84},
{512, 83},
{576, 83},
{26, 175},
{84, 175},
{142, 174},
{202, 174},
{260, 174},
{322, 174},
{384, 173},
{448, 173},
{512, 173},
{576, 172},
{26, 261},
{84, 261},
{141, 261},
{202, 261},
{261, 262},
{322, 262},
{383, 262},
{447, 263},
{512, 263},
{576, 263},
{26, 344},
{84, 345},
{142, 346},
{202, 347},
{260, 348},
{322, 349},
{384, 350},
{448, 351},
{512, 352},
{576, 352}
},
{
{42, 26},
{100, 24},
{155, 22},
{214, 19},
{271, 18},
{330, 15},
{389, 14},
{451, 11},
{515, 8},
{576, 6},
{45, 102},
{100, 102},
{156, 101},
{215, 100},
{272, 99},
{331, 98},
{391, 97},
{453, 96},
{515, 94},
{578, 94},
{44, 184},
{101, 184},
{157, 184},
{215, 183},
{272, 183},
{331, 183},
{391, 182},
{453, 182},
{515, 182},
{577, 181},
{44, 267},
{101, 267},
{157, 267},
{215, 268},
{272, 268},
{331, 268},
{390, 269},
{453, 269},
{515, 269},
{578, 269},
{45, 348},
{101, 349},
{156, 349},
{215, 351},
{271, 351},
{331, 351},
{391, 353},
{453, 354},
{515, 355},
{577, 356},
{44, 434},
{101, 435},
{156, 436},
{215, 437},
{272, 437},
{331, 437},
{391, 439},
{453, 440},
{515, 441},
{578, 442}
},
};
void CryOmni3DEngine_Versailles::drawBombLetters(Graphics::ManagedSurface &surface,
const Graphics::Surface(&bmpLetters)[28], const uint bombPasswordLength,
const uint32(&bombPossibilites)[kBombPasswordMaxLength][5],
const byte(&bombCurrentLetters)[kBombPasswordMaxLength]) {
uint table = bombPasswordLength <= kBombPasswordSmallLength ? 0 : 1;
if (getLanguage() == Common::JA_JPN) {
_fontManager.setCurrentFont(1);
_fontManager.setTransparentBackground(true);
_fontManager.setForeColor(0);
_fontManager.setSurface(&surface);
for (uint i = 0; i < bombPasswordLength; i++) {
Common::Rect rct(34, 34);
rct.moveTo(kBombLettersPos[table][i][0], kBombLettersPos[table][i][1]);
surface.fillRect(rct, 239);
uint32 letter = bombPossibilites[i][bombCurrentLetters[i]];
Common::U32String str(&letter, 1);
_fontManager.displayStr(rct.left + (34 - _fontManager.getStrWidth(str)) / 2,
rct.top + 5, str);
}
} else {
for (uint i = 0; i < bombPasswordLength; i++) {
uint letterId = _bombAlphabet.find(bombPossibilites[i][bombCurrentLetters[i]]);
if (letterId == _bombAlphabet.npos) {
// Should not happen
continue;
}
const Graphics::Surface &letter = bmpLetters[letterId];
Common::Point dst(kBombLettersPos[table][i][0], kBombLettersPos[table][i][1]);
surface.transBlitFrom(letter, dst);
}
}
}
IMG_CB(88004) {
fimg->load("31j31.gif");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88004b);
fimg->changeCallback(functor);
break;
}
}
}
IMG_CB(88004b) {
// Open the toilets
playInGameVideo("31j32");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
fimg->load("31j32.gif");
while (1) {
fimg->manage();
if (fimg->_exit || fimg->_zoneLow) {
fimg->_exit = true;
break;
}
if (fimg->_zoneUse) {
ZonFixedImage::CallbackFunctor *functor =
new Common::Functor1Mem<ZonFixedImage *, void, CryOmni3DEngine_Versailles>(this,
&CryOmni3DEngine_Versailles::img_88004);
fimg->changeCallback(functor);
break;
}
}
if (!shouldAbort()) {
// Close the toilets
playInGameVideo("31j32b");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
}
}
#undef IMG_CB
// Init place and filter event
#define FILTER_EVENT(level, place) bool CryOmni3DEngine_Versailles::filterEventLevel ## level ## Place ## place(uint *event)
#define INIT_PLACE(level, place) void CryOmni3DEngine_Versailles::initPlaceLevel ## level ## Place ## place()
FILTER_EVENT(1, 1) {
if (*event > 0 && *event < 9999) {
_gameVariables[GameVariables::kWarnedIncomplete] = 0;
}
if (*event == 11015 && currentGameTime() < 3) {
return false;
} else {
return true;
}
}
FILTER_EVENT(1, 2) {
if (*event == 7 && currentGameTime() < 2) {
// Closed
displayMessageBoxWarp(2);
return false;
}
if (*event == 1 && currentGameTime() < 3) {
_dialogsMan.play("11E_HUI");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
return false;
}
return true;
}
INIT_PLACE(1, 3) {
if (!_gameVariables[GameVariables::kHasPlayedLebrun]) {
Common::File *audioFile = new Common::File();
if (!audioFile->open(_localizedFilenames[LocalizedFilenames::kLeb001])) {
warning("Failed to open sound file %s", _localizedFilenames[LocalizedFilenames::kLeb001].c_str());
delete audioFile;
return;
}
Audio::SeekableAudioStream *audioDecoder = Audio::makeWAVStream(audioFile, DisposeAfterUse::YES);
// We lost ownership of the audioFile just set it to nullptr and don't use it
audioFile = nullptr;
if (!audioDecoder) {
return;
}
_mixer->playStream(Audio::Mixer::kSpeechSoundType, nullptr, audioDecoder, SoundIds::kLeb001);
// We lost ownership of the audioDecoder just set it to nullptr and don't use it
audioDecoder = nullptr;
_gameVariables[GameVariables::kHasPlayedLebrun] = 1;
}
}
FILTER_EVENT(1, 3) {
if (*event == 11301) {
while (!shouldAbort() && _mixer->isSoundIDActive(SoundIds::kLeb001)) {
g_system->updateScreen();
g_system->delayMillis(10);
pollEvents();
}
clearKeys();
return true;
}
if (*event > 0 && *event < 10000) {
_mixer->stopID(SoundIds::kLeb001);
return true;
}
return true;
}
// Event 19 is not in this room: must be a leftover
/*
FILTER_EVENT(1, 7) {
if (*event == 19) {
// Too dark
displayMessageBoxWarp(7);
return false;
}
return true;
}
*/
FILTER_EVENT(1, 14) {
if (*event == 31141 && _placeStates[14].state == 0) {
// Open the curtain
uint fakePlaceId = getFakeTransition(*event);
fakeTransition(fakePlaceId);
playInGameVideo("10D2_1");
setPlaceState(14, 1);
// setPlaceState will force reload
// Don't pass the event as we try to avoid implementing use
return false;
}
if (*event != 31142 && *event != 31143) {
// Not for us
return true;
}
const char *video;
FixedImgCallback callback;
if (_currentLevel == 1 && _placeStates[14].state == 0) {
if (*event == 31142) {
video = "10D2_4";
callback = &CryOmni3DEngine_Versailles::img_31142;
} else if (*event == 31143) {
video = "10D2_3";
callback = &CryOmni3DEngine_Versailles::img_31143;
} else {
error("BUG: Shouldn't be here");
}
} else if (_currentLevel == 2 || _placeStates[14].state == 1) {
if (*event == 31142) {
video = "11D2_2";
callback = &CryOmni3DEngine_Versailles::img_31142b;
} else if (*event == 31143) {
video = "11D2_1";
callback = &CryOmni3DEngine_Versailles::img_31143b;
} else {
error("BUG: Shouldn't be here");
}
} else {
error("Invalid state in filter event 1/14: level: %d/ placeState: %d", _currentLevel,
_placeStates[14].state);
}
uint fakePlaceId = getFakeTransition(*event);
fakeTransition(fakePlaceId);
playInGameVideo(video);
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
handleFixedImg(callback);
// Don't pass the event as we try to avoid implementing use
return false;
}
FILTER_EVENT(2, 1) {
if (*event == 22101 && _inventory.selectedObject()) {
_dialogsMan["{JOUEUR-MONTRE-UN-PAMPHLET}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-PAPIER-ECRIT-ENCRE-SYMPATHIQUE}"] = 'N';
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 96 || idOBJ == 101 || idOBJ == 115 ||
idOBJ == 125 || idOBJ == 127) {
_dialogsMan["{JOUEUR-MONTRE-UN-PAMPHLET}"] = 'Y';
} else if (idOBJ == 98) {
_dialogsMan["{JOUEUR-MONTRE-PAPIER-ECRIT-ENCRE-SYMPATHIQUE}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("21F_BON");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-UN-PAMPHLET}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-PAPIER-ECRIT-ENCRE-SYMPATHIQUE}"] = 'N';
if (idOBJ == 98 && _dialogsMan["JOUEUR-CONFIE-MESSAGE-HUISSIER"] == 'Y') {
_inventory.removeByNameID(98);
setGameTime(2, 2);
}
_inventory.deselectObject();
} else if (*event == 31101) {
if (!_inventory.selectedObject() && currentGameTime() > 1) {
const char *video;
FixedImgCallback callback;
if (!_gameVariables[GameVariables::kCollectKey]) {
video = "21F_11";
callback = &CryOmni3DEngine_Versailles::img_31101;
} else {
video = "21F_10";
callback = &CryOmni3DEngine_Versailles::img_31101b;
}
playInGameVideo(video);
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
handleFixedImg(callback);
}
// Don't pass the event as we try to avoid implementing use
return false;
} else if (*event >= 1 && *event <= 9999 && currentGameTime() == 2) {
setPlaceState(1, 1);
}
return true;
}
FILTER_EVENT(2, 2) {
if (*event < 32201 || *event > 32204) {
// Not handled here
return true;
}
const char *video = nullptr;
FixedImgCallback callback = nullptr;
const Object *obj = _inventory.selectedObject();
bool deselectObj = false;
if (*event == 32201) {
if (!obj) {
// Opening left drawer
video = "21E_41";
callback = &CryOmni3DEngine_Versailles::img_32201;
} else {
return false;
}
} else if (*event == 32202) {
if (obj && obj->idOBJ() == 104) {
// Using key on left door
video = "21E_42";
callback = &CryOmni3DEngine_Versailles::img_32202;
} else {
// This door is locked
displayMessageBoxWarp(1);
return false;
}
} else if (*event == 32203) {
if (!obj) {
// Opening right drawer
video = "21E_43";
callback = &CryOmni3DEngine_Versailles::img_32203;
} else {
return false;
}
} else if (*event == 32204) {
if (obj && obj->idOBJ() == 104) {
// Using key on right door
if (_gameVariables[GameVariables::kCollectPortfolio]) {
video = "21E_45";
callback = &CryOmni3DEngine_Versailles::img_32204b;
} else {
video = "21E_44";
callback = &CryOmni3DEngine_Versailles::img_32204;
}
deselectObj = true;
} else {
// This door is locked
displayMessageBoxWarp(1);
return false;
}
}
assert(video != nullptr);
assert(callback != nullptr);
// Adjust viewpoint for video
uint fakePlaceId = getFakeTransition(*event);
fakeTransition(fakePlaceId);
playInGameVideo(video);
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
handleFixedImg(callback);
if (deselectObj) {
_inventory.deselectObject();
}
// Don't pass the event: it has been handled
return false;
}
FILTER_EVENT(2, 5) {
if (*event == 22501 && _inventory.selectedObject()) {
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 96) {
if (!_inventory.inInventoryByNameID(101)) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARTS}"] = 'Y';
}
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-CHOSE}"] = 'Y';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("21B1_HUI");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARTS}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-CHOSE}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_inventory.deselectObject();
} else if (*event >= 1 && *event <= 9999 &&
_inventory.inInventoryByNameID(96) && !_inventory.inInventoryByNameID(101)) {
// Give your clues at the bailiff
displayMessageBoxWarp(15);
return false;
}
return true;
}
INIT_PLACE(2, 9) {
// BUG: This dialog gets played twice when Monseigneur is waiting for the sketches and we speak to him
// The bug is in original version too
if (_gameVariables[GameVariables::kSketchState] == 1 && currentGameTime() == 2) {
// Sketches are not yet sorted
_dialogsMan["{JOUEUR-SE-DIRIGE-VERS-MONSEIGNEUR-AVEC-ESQUISSES}"] = 'Y';
_dialogsMan.play("22G_DAU");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
// Change warp viewpoint
_omni3dMan.setAlpha(4.17);
_omni3dMan.setBeta(0.097);
_inventory.deselectObject();
_dialogsMan["{JOUEUR-SE-DIRIGE-VERS-MONSEIGNEUR-AVEC-ESQUISSES}"] = 'N';
}
}
FILTER_EVENT(2, 9) {
if (*event == 22902 && _inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 105) {
_dialogsMan["{JOUEUR-DONNE-ESQUISSES}"] = 'Y';
_dialogsMan.setIgnoreNoEndOfConversation(true);
_dialogsMan.play("22G_DAU");
_dialogsMan.setIgnoreNoEndOfConversation(false);
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-DONNE-ESQUISSES}"] = 'N';
_inventory.deselectObject();
} else if (*event >= 1 && *event <= 9999 && currentGameTime() == 3 &&
_placeStates[9].state != 2) {
setPlaceState(9, 2);
}
return true;
}
FILTER_EVENT(2, 11) {
if (*event == 22111 && _inventory.selectedObject()) {
bool gameOver = false;
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 107) {
_dialogsMan["{JOUEUR-MONTRE-TITRE-FABLE-APPARU-SUR-ESQUISSE}"] = 'Y';
} else if (idOBJ == 109) {
_dialogsMan["{JOUEUR-MONTRE-ESQUISSE-DETRUITE}"] = 'Y';
gameOver = true;
}
_dialogsMan.play("24Z_BON");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-TITRE-FABLE-APPARU-SUR-ESQUISSE}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-ESQUISSE-DETRUITE}"] = 'N';
_inventory.deselectObject();
if (gameOver) {
doGameOver();
}
}
return true;
}
FILTER_EVENT(2, 12) {
if (*event == 22121 && _inventory.selectedObject()) {
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 105) {
_dialogsMan["{LE JOUEUR-PRESENTE-AUTRES-ESQUISSES-OU-ESQUISSE-NON-TRIEES}"] = 'Y';
_dialogsMan["{JOUEUR-A-MONTRE-ESQUISSES-NON-TRIEES-LEBRUN}"] = 'Y';
} else if (idOBJ == 106) {
_dialogsMan["{LE JOUEUR-PRESENTE-ESQUISSES-TRIEES}"] = 'Y';
_inventory.removeByNameID(106);
} else if (idOBJ == 107 && _gameVariables[GameVariables::kSketchState] == 2) {
if (_gameVariables[GameVariables::kFakeSketchChatState] == 0) {
_dialogsMan["{JOUEUR-PRESENTE-FAUX-CROQUIS}"] = 'Y';
_gameVariables[GameVariables::kFakeSketchChatState] = 1;
} else if (_gameVariables[GameVariables::kFakeSketchChatState] == 1) {
_dialogsMan["{JOUEUR-PRESENTE-FAUX-CROQUIS2}"] = 'Y';
_gameVariables[GameVariables::kFakeSketchChatState] = 2;
} else if (_gameVariables[GameVariables::kFakeSketchChatState] == 2) {
_dialogsMan["{JOUEUR-PRESENTE-FAUX-CROQUIS3}"] = 'Y';
}
} else if (idOBJ == 96) {
_dialogsMan["{JOUEUR-PRESENTE-PAMPHLET-SUR-LEBRUN}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-PRESENTE-TOUT-AUTRE-PAMPHLET-OU-LETTRE}"] = 'Y';
}
_dialogsMan.play("23I_LEB");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-PRESENTE-PAMPHLET-SUR-LEBRUN}"] = 'N';
_dialogsMan["{LE JOUEUR-PRESENTE-AUTRES-ESQUISSES-OU-ESQUISSE-NON-TRIEES}"] = 'N';
_dialogsMan["{LE JOUEUR-PRESENTE-ESQUISSES-TRIEES}"] = 'N';
_dialogsMan["{JOUEUR-PRESENTE-FAUX-CROQUIS}"] = 'N';
_dialogsMan["{JOUEUR-PRESENTE-FAUX-CROQUIS2}"] = 'N';
_dialogsMan["{JOUEUR-PRESENTE-FAUX-CROQUIS3}"] = 'N';
_dialogsMan["{JOUEUR-PRESENTE-TOUT-AUTRE-PAMPHLET-OU-LETTRE}"] = 'N';
_inventory.deselectObject();
} else if (*event == 32120) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 107 &&
_gameVariables[GameVariables::kSketchState] == 2) {
handleFixedImg(&CryOmni3DEngine_Versailles::img_32120);
}
// We handle use here
return false;
}
return true;
}
FILTER_EVENT(2, 14) {
return filterEventLevel1Place14(event);
}
FILTER_EVENT(3, 3) {
if (*event == 23030 && _inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 118 &&
_gameVariables[GameVariables::kDecipherScore]) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-DECHIFFRE-PAR-LULLY}"] = 'Y';
_dialogsMan.play("31X_BON");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-DECHIFFRE-PAR-LULLY}"] = 'N';
_inventory.deselectObject();
}
return true;
}
FILTER_EVENT(3, 10) {
if (*event == 23101 && _inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 120) {
_inventory.removeByNameID(120);
_dialogsMan["{JOUEUR-MONTRE-AUTORISATION-DE-BONTEMPS}"] = 'Y';
_dialogsMan.play("31O_SUIP");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-AUTORISATION-DE-BONTEMPS}"] = 'N';
_inventory.deselectObject();
return true;
} else if (*event == 21) {
if (_dialogsMan["SUISSE-VU-AUTORISATION"] == 'Y') {
fakeTransition(*event);
playInGameVideo("33O_SUIP");
playInGameVideo("33O_P");
executeSeeAction(88001);
if (!shouldAbort()) {
playInGameVideo("33P_O");
}
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
}
// This place is a fake one: so never go in there
return false;
}
return true;
}
FILTER_EVENT(3, 13) {
_dialogsMan["{JOUEUR-MONTRE-FUSAIN-MEDAILLES}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
if (*event == 33130 && !_inventory.inInventoryByNameID(119)) {
collectObject(119);
if (_placeStates[13].state) {
setPlaceState(13, 3);
} else {
setPlaceState(13, 1);
}
// We handle use here
return false;
} else if (*event == 23131 && _inventory.selectedObject()) {
if (_inventory.selectedObject()->idOBJ() == 121) {
_dialogsMan["{JOUEUR-MONTRE-FUSAIN-MEDAILLES}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("32M_MR");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-FUSAIN-MEDAILLES}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_inventory.deselectObject();
return true;
} else {
return true;
}
}
FILTER_EVENT(3, 15) {
if (*event == 23151 && _inventory.selectedObject()) {
return filterEventLevel3Obj23151();
}
return true;
}
FILTER_EVENT(3, 17) {
if (*event == 18) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 123) {
_gameVariables[GameVariables::kUnlockHiddenDoor] = 1;
_inventory.removeByNameID(123);
return true;
} else if (_gameVariables[GameVariables::kUnlockHiddenDoor] != 1) {
// Locked
displayMessageBoxWarp(1);
_dialogsMan["{LE JOUEUR-A-TENTE-OUVRIR-PETITE-PORTE}"] = 'Y';
return false;
} else {
return true;
}
} else if (*event == 23151) {
return filterEventLevel3Obj23151();
} else {
return true;
}
}
FILTER_EVENT(3, 18) {
if (*event != 19) {
return true;
}
// Only take care of event 19
// Adjust camera
fakeTransition(*event);
// As we have just adjusted camera, don't do it later
_transitionAnimateWarp = false;
if (_placeStates[22].state) {
playInGameVideo("31J1_L2");
} else if (_gameVariables[GameVariables::kAlreadyWent3_19]) {
playInGameVideo("31J1_L1");
} else {
playInGameVideo("31J1_L0");
playInGameVideo("31L1_AL2");
playInGameVideo("31L1_AL3");
_gameVariables[GameVariables::kAlreadyWent3_19] = 1;
_gameVariables[GameVariables::kCabinetDrawerStatus] = 1;
}
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
return true;
}
FILTER_EVENT(3, 19) {
if (*event != 18) {
return true;
}
if (currentGameTime() != 3 || _placeStates[22].state) {
return true;
}
if (_gameVariables[GameVariables::kCollectLampoonArchitecture]) {
setPlaceState(22, 2);
} else {
setPlaceState(22, 1);
}
setPlaceState(19, 1);
return true;
}
FILTER_EVENT(3_5, 20) {
if (*event != 25) {
return true;
}
fakeTransition(*event);
playInGameVideo("31j31");
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
// Toilets
executeSeeAction(88004);
_forcePaletteUpdate = true;
return false;
}
FILTER_EVENT(3, 22) {
if (*event == 33220) {
if (!_gameVariables[GameVariables::kCollectLampoonArchitecture]) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 119) {
// Using pool cue
_inventory.removeByNameID(119);
collectLampoonArchitecture();
_forcePaletteUpdate = true;
} else {
// Paper is out of reach
displayMessageBoxWarp(16);
}
}
// We handle use here
return false;
}
if (*event >= 20000 && *event < 30000 &&
_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 118) {
_dialogsMan["{JOUEUR-PRESENTE-PAMPHLET-PARTITION}"] = 'Y';
_dialogsMan.play("31L1_LUL");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-PRESENTE-PAMPHLET-PARTITION}"] = 'N';
if (_dialogsMan["LULLY-DONNE-MISSION1-JOUEUR"] != 'Y' ||
_gameVariables[GameVariables::kDecipherScore]) {
_inventory.deselectObject();
} else {
_inventory.removeByNameID(118);
}
}
return true;
}
FILTER_EVENT(3, 23) {
if (*event != 32) {
return true;
}
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 140) {
_gameVariables[GameVariables::kUnlockedAttic] = 1;
_inventory.removeByNameID(140);
return true;
} else if (_gameVariables[GameVariables::kUnlockedAttic] != 1) {
// Locked
displayMessageBoxWarp(1);
return false;
} else {
return true;
}
}
bool CryOmni3DEngine_Versailles::filterEventLevel3Obj23151() {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 115) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARCHITECTURE}"] = 'Y';
} else if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 121 &&
_gameVariables[GameVariables::kGotMedalsSolution]) {
_inventory.removeByNameID(121);
_dialogsMan["{JOUEUR-MONTRE-EPIGRAPHE-MEDAILLES}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-CHOSE}"] = 'Y';
}
_dialogsMan.play("32J_CRO");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARCHITECTURE}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-EPIGRAPHE-MEDAILLES}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-CHOSE}"] = 'N';
_inventory.deselectObject();
return true;
}
void CryOmni3DEngine_Versailles::collectLampoonArchitecture(const ZonFixedImage *fimg) {
_gameVariables[GameVariables::kCollectLampoonArchitecture] = 1;
collectObject(115, fimg);
if (_currentLevel == 3) {
setPlaceState(22, 2);
}
_dialogsMan["{JOUEUR_POSSEDE_PAMPHLET_ARCHI}"] = 'Y';
}
INIT_PLACE(4, 9) {
if (currentGameTime() == 4 && !_inventory.inInventoryByNameID(125)) {
_dialogsMan.play("4_MAI");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
}
}
FILTER_EVENT(4, 10) {
if (*event == 24104 && _inventory.selectedObject()) {
_dialogsMan["{JOUEUR-PRESENTE-OBJET-HUISSIER}"] = 'Y';
_dialogsMan.play("41C_HUI");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-PRESENTE-OBJET-HUISSIER}"] = 'N';
_inventory.deselectObject();
return true;
} else if (*event == 24105 && _inventory.selectedObject()) {
if (_inventory.selectedObject()->idOBJ() == 127) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-GOUVERNEMENT}"] = 'Y';
} else if (_inventory.selectedObject()->idOBJ() == 125) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'Y';
} else if (_inventory.selectedObject()->idOBJ() == 126) {
_dialogsMan["{JOUEUR-MONTRE-PAPIER-CROISSY}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("42C_BON");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-GOUVERNEMENT}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-PAPIER-CROISSY}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_inventory.deselectObject();
return true;
} else if (*event == 11 && currentGameTime() < 3) {
// Closed
displayMessageBoxWarp(2);
return false;
} else {
return true;
}
}
FILTER_EVENT(4, 12_13_14) {
if (*event != 34131 && *event != 34132) {
// Not for us
return true;
}
if (!_inventory.selectedObject() ||
_inventory.selectedObject()->idOBJ() != 130) {
// Not using scope: do nothing
return false;
}
// Using scope
const char *video;
FixedImgCallback callback;
if (*event == 34131) {
video = "43ZA_1";
callback = &CryOmni3DEngine_Versailles::img_34131;
} else if (*event == 34132) {
video = "43ZB_2";
callback = &CryOmni3DEngine_Versailles::img_34132;
} else {
error("BUG: Shouldn't be here");
}
playInGameVideo(video);
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
handleFixedImg(callback);
// Don't pass the event: it has been handled
return false;
}
FILTER_EVENT(4, 15) {
if (*event == 17 && (_dialogsMan["BONTEMPS-VU-PAPIER-CROISSY"] == 'N' ||
_dialogsMan["BONTEMPS-VU-PAMPHLET-GOUVERNEMENT"] == 'N')) {
// Closed
displayMessageBoxWarp(2);
return false;
}
return true;
}
FILTER_EVENT(4, 16) {
if (*event == 24161 && _inventory.selectedObject()) {
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 124) {
_dialogsMan["{JOUEUR-DONNE-REPAS}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("41X2_CRO");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-DONNE-REPAS}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
if (idOBJ == 124) {
_inventory.removeByNameID(124);
playInGameVideo("41X2_CR1");
setGameTime(2, 4);
}
_inventory.deselectObject();
return true;
} else if (*event == 34162) {
if (!_inventory.inInventoryByNameID(127)) {
collectObject(127);
_forcePaletteUpdate = true;
} else {
// Nothing there anymore
displayMessageBoxWarp(21);
}
// Don't pass the event: it has been handled
return false;
}
return true;
}
FILTER_EVENT(4, 17) {
if (*event == 34171) {
collectObject(130);
setPlaceState(17, 1);
return false;
} else if (*event == 34172) {
uint fakePlaceId = getFakeTransition(*event);
fakeTransition(fakePlaceId);
handleFixedImg(&CryOmni3DEngine_Versailles::img_34172);
return false;
} else if (*event == 34173) {
handleFixedImg(&CryOmni3DEngine_Versailles::img_34173);
return false;
} else if (*event == 34174) {
handleFixedImg(&CryOmni3DEngine_Versailles::img_34174);
return false;
}
return true;
}
INIT_PLACE(5, 6) {
if (currentGameTime() == 2) {
setPlaceState(27, 2);
}
}
FILTER_EVENT(5, 9) {
if (*event == 25090 && _inventory.selectedObject()) {
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (currentGameTime() < 4) {
if (idOBJ == 125 && _gameVariables[GameVariables::kStateLampoonReligion] == 3) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'Y';
} else if (idOBJ == 115) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARCHITECTURE}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("53N_BON");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
if (_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] == 'Y' && currentGameTime() != 3) {
setGameTime(3, 5);
_inventory.removeByNameID(125);
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARCHITECTURE}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_inventory.deselectObject();
} else {
if (_inventory.inInventoryByNameID(135) && _inventory.inInventoryByNameID(116)) {
_dialogsMan["{JOUEUR-POSSEDE-CLEF-3-ET-4}"] = 'Y';
}
// Useless?
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
if (idOBJ == 137) {
_dialogsMan["{JOUEUR-MONTRE-MEMORANDUM}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("54I_BON");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-MEMORANDUM}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_inventory.deselectObject();
}
}
return true;
}
FILTER_EVENT(5, 14) {
if (*event == 25142 && _inventory.selectedObject()) {
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 125) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'Y';
} else {
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'Y';
}
_dialogsMan.play("52L_BOU");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-TOUT-AUTRE-OBJET}"] = 'N';
_inventory.deselectObject();
}
return true;
}
FILTER_EVENT(5, 15) {
if (*event == 16 && _gameVariables[GameVariables::kLoweredChandelier]) {
*event = 29;
}
return true;
}
FILTER_EVENT(5, 16) {
if (*event == 35162) {
// Don't move the ladder when there is a guard
if (_placeStates[16].state != 0) {
// Take back the ladder from the scaffolding
if (_gameVariables[GameVariables::kLadderState] == 2) {
collectObject(108);
_gameVariables[GameVariables::kLadderState] = 1;
filterEventLevel5UpdatePlaceStates();
}
}
// Handled here
return false;
} else if (*event == 35160) {
// Don't move the ladder when there is a guard
if (_placeStates[16].state != 0) {
if (_gameVariables[GameVariables::kLadderState] == 0) {
// Take the ladder from the curtain
collectObject(108);
_gameVariables[GameVariables::kLadderState] = 1;
filterEventLevel5UpdatePlaceStates();
} else if (_gameVariables[GameVariables::kLadderState] == 1 &&
_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 108) {
// Put back the ladder
_inventory.removeByNameID(108);
_gameVariables[GameVariables::kLadderState] = 0;
filterEventLevel5UpdatePlaceStates();
}
}
// Handled here
return false;
} else if (*event == 35161) {
// Don't move the ladder when there is a guard
if (_placeStates[16].state != 0) {
if (!_gameVariables[GameVariables::kOpenedCurtain] &&
_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 133) {
// Try to open the curtain
if (_gameVariables[GameVariables::kLadderState]) {
// Ladder is not near the curtain
// Cannot reach the covering
displayMessageBoxWarp(4);
} else {
_inventory.removeByNameID(133);
_gameVariables[GameVariables::kOpenedCurtain] = 1;
filterEventLevel5UpdatePlaceStates();
}
}
}
// Handled here
return false;
} else if (*event == 28) {
// Try to go to scaffolding
if (_gameVariables[GameVariables::kLadderState] == 1 &&
_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 108) {
// Put the ladder on the scaffolding
_inventory.removeByNameID(108);
_gameVariables[GameVariables::kLadderState] = 2;
filterEventLevel5UpdatePlaceStates();
}
// Don't move if there is no ladder on the scaffolding
// Don't take selected object into account
return _gameVariables[GameVariables::kLadderState] == 2;
} else if (*event == 15 && _inventory.inInventoryByNameID(108)) {
// Cannot move carrying ladder
displayMessageBoxWarp(20);
return false;
} else {
return true;
}
}
void CryOmni3DEngine_Versailles::filterEventLevel5UpdatePlaceStates() {
// Place 28 (mirror of 16 with chandelier on the floor) only depends on curtain state
setPlaceState(28, _gameVariables[GameVariables::kOpenedCurtain]);
if (!_gameVariables[GameVariables::kOpenedCurtain]) {
// Curtain is closed
switch (_gameVariables[GameVariables::kLadderState]) {
case 0:
// Ladder is near the curtain
setPlaceState(16, 2);
break;
case 1:
// Ladder is with us
setPlaceState(16, 4);
break;
case 2:
// Ladder is on the scaffolding
setPlaceState(16, 5);
break;
default:
error("BUG: Invalid ladder state");
break;
}
} else {
// Curtain is opened
switch (_gameVariables[GameVariables::kLadderState]) {
case 0:
// Ladder is near the curtain
setPlaceState(16, 1);
break;
case 1:
// Ladder is with us
setPlaceState(16, 3);
break;
case 2:
// Ladder is on the scaffolding
setPlaceState(16, 6);
break;
default:
error("BUG: Invalid ladder state");
break;
}
}
}
FILTER_EVENT(5, 23) {
if (*event != 32) {
return true;
}
// Event 32 only
// Try to open attic door
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 140) {
_gameVariables[GameVariables::kUnlockedAttic] = 1;
_inventory.removeByNameID(140);
return true;
} else if (_gameVariables[GameVariables::kUnlockedAttic] != 1) {
// Locked
displayMessageBoxWarp(1);
return false;
} else {
return true;
}
}
FILTER_EVENT(5, 27) {
if (*event == 25270) {
if (_inventory.selectedObject()) {
uint idOBJ = _inventory.selectedObject()->idOBJ();
if (idOBJ == 115) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARCHITECTURE}"] = 'Y';
} else if (idOBJ == 125) {
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'Y';
} else if (idOBJ == 134) {
_dialogsMan["{JOUEUR-MONTRE-ECROUELLES}"] = 'Y';
}
_dialogsMan.play("52A4_LAC");
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-ARCHITECTURE}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-PAMPHLET-RELIGION}"] = 'N';
_dialogsMan["{JOUEUR-MONTRE-ECROUELLES}"] = 'N';
if (_dialogsMan["LACHAIZE-TROUVE-ECROUELLES"] == 'Y') {
_inventory.removeByNameID(134);
}
_inventory.deselectObject();
}
} else if (*event == 35270) {
if (!_inventory.inInventoryByNameID(133)) {
collectObject(133);
_gameVariables[GameVariables::kCollectCord] = 1;
setPlaceState(27, 1);
}
// Handled here
return false;
} else if (*event > 0 && *event < 10000 && currentGameTime() == 1 &&
_gameVariables[GameVariables::kCollectCord]) {
setGameTime(2, 5);
}
return true;
}
FILTER_EVENT(5, 28) {
if (*event == 45280 && !_gameVariables[GameVariables::kOpenedCurtain]) {
// Too dark
displayMessageBoxWarp(7);
}
return true;
}
FILTER_EVENT(5, 29) {
if (*event == 35290 && _placeStates[29].state == 0) {
// Collect memorandum
collectObject(137);
setPlaceState(29, 1);
// Handled here
return false;
}
return true;
}
FILTER_EVENT(5, 33) {
if (*event == 35330 && !_gameVariables[GameVariables::kLoweredChandelier]) {
uint fakePlaceId = getFakeTransition(*event);
fakeTransition(fakePlaceId);
playInGameVideo("LUSTRE");
// setPlaceState will force reload
setPlaceState(33, 1);
setGameTime(4, 5);
_gameVariables[GameVariables::kLoweredChandelier] = 1;
// Handled here
return false;
}
return true;
}
FILTER_EVENT(5, 34) {
if (*event == 35) {
fakeTransition(*event);
playInGameVideo("53z1c_10");
executeSeeAction(88002);
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
// Handled here
return false;
}
return true;
}
FILTER_EVENT(6, 1) {
if (*event == 36010 && _placeStates[1].state == 0) {
collectObject(144);
setPlaceState(1, 1);
// Handled here
return false;
}
return true;
}
FILTER_EVENT(6, 3) {
if (!filterEventLevel6PlaceOrangery(event)) {
// Handled
return false;
} else if (*event == 36030 && _placeStates[3].state == 0) {
collectObject(143);
setPlaceState(3, 1);
// Handled here
return false;
} else if (*event == 1) {
// To apothecary
displayMessageBoxWarp(17);
}
return true;
}
FILTER_EVENT(6, Orangery) {
if (*event == 36000) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 143) {
_gameVariables[GameVariables::kCombedOrangeTree]++; // Not used afterwards
displayMessageBoxWarp(5);
}
// Handled here
return false;
} else if (*event == 36001) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 143) {
displayMessageBoxWarp(6);
}
// Handled here
return false;
}
return true;
}
FILTER_EVENT(6, 19) {
if (*event == 26190 && _inventory.selectedObject() &&
_placeStates[19].state == 0) {
if (!_gameVariables[GameVariables::kMaineTalked]) {
if (_inventory.selectedObject()->idOBJ() == 144) {
_dialogsMan["{JOUEUR-DONNE-AUTRE-MEDICAMENT}"] = 'Y';
}
_dialogsMan.play("61_DUC");
} else {
if (_inventory.selectedObject()->idOBJ() == 144) {
_dialogsMan["{JOUEUR-DONNE-SIROP-DE-ROSE}"] = 'Y';
_dialogsMan.setIgnoreNoEndOfConversation(true);
}
_dialogsMan.play("62_DUC");
_dialogsMan.setIgnoreNoEndOfConversation(false);
}
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
_dialogsMan["{JOUEUR-DONNE-AUTRE-MEDICAMENT}"] = 'N';
_dialogsMan["{JOUEUR-DONNE-SIROP-DE-ROSE}"] = 'N';
_inventory.deselectObject();
} else if (*event > 0 && *event < 10000 && _dialogsMan["{DUC_MAIN_A_PARLE}"] == 'Y') {
_gameVariables[GameVariables::kMaineTalked] = 1;
_whoSpeaksWhere[PlaceActionKey(19, 16190)] = "62_DUC";
} else if (*event == 36190 && _placeStates[19].state == 1) {
collectObject(142);
setGameTime(2, 6);
// Handled here
return false;
}
return true;
}
FILTER_EVENT(7, 2) {
if (*event == 37021) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 103) {
// Light the candle
_inventory.removeByNameID(103);
collectObject(102);
}
// Handled here
return false;
} else if (*event == 37022) {
if (!_inventory.inInventoryByNameID(97)) {
collectObject(97);
_inventory.deselectObject();
} else {
// Jar is empty
displayMessageBoxWarp(11);
}
// Handled here
return false;
} else if (*event == 7) {
// Stairs
if (_gameVariables[GameVariables::kUsedLitCandle]) {
return true;
}
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 102) {
// Now you can go
displayMessageBoxWarp(12);
_inventory.removeByNameID(102);
_inventory.deselectObject();
// Save it for later
_gameVariables[GameVariables::kUsedLitCandle] = 1;
return true;
}
// Didn't used lit candle and not using it now: denied
// Too dark
displayMessageBoxWarp(7);
return false;
}
return true;
}
FILTER_EVENT(7, 9) {
if (*event == 37090) {
if (_placeStates[9].state == 0) {
// Get the candle snuffer
collectObject(145);
_inventory.deselectObject();
setPlaceState(9, 1);
}
// Handled here
return false;
}
return true;
}
FILTER_EVENT(7, 10_11_13) {
if (*event == 37131) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 143 &&
!_inventory.inInventoryByNameID(136)) {
collectObject(136);
// WORKAROUND: Deselect the tool
_inventory.deselectObject();
}
// Handled here
return false;
} else if (*event == 37132) {
if (_inventory.selectedObject() &&
_inventory.selectedObject()->idOBJ() == 143) {
// Nothing in this orange tree
displayMessageBoxWarp(5);
}
// Handled here
return false;
}
return true;
}
FILTER_EVENT(7, 20) {
if (*event == 21) {
fakeTransition(*event);
playInGameVideo("70z_10");
executeSeeAction(88003);
_forcePaletteUpdate = true;
// Force reload of the place
if (_nextPlaceId == uint(-1)) {
_nextPlaceId = _currentPlaceId;
}
// Handled here
return false;
}
return true;
}
#undef FILTER_EVENT
#undef INIT_PLACE
// Countdown
void CryOmni3DEngine_Versailles::initCountdown() {
Common::strcpy_s(_countdownValue, "05:00");
if (_gameVariables[GameVariables::kSavedCountdown]) {
uint counter = _gameVariables[GameVariables::kSavedCountdown];
_countdownValue[4] = counter;
counter >>= 8;
_countdownValue[3] = counter;
counter >>= 8;
_countdownValue[1] = counter;
counter >>= 8;
_countdownValue[0] = counter;
}
}
void CryOmni3DEngine_Versailles::syncCountdown() {
uint counter = 0;
counter |= _countdownValue[0];
counter <<= 8;
counter |= _countdownValue[1];
counter <<= 8;
counter |= _countdownValue[3];
counter <<= 8;
counter |= _countdownValue[4];
_gameVariables[GameVariables::kSavedCountdown] = counter;
}
bool CryOmni3DEngine_Versailles::doCountDown() {
if (g_system->getMillis() > _countdownNextEvent) {
_countdownNextEvent = g_system->getMillis() + 1000;
// Decrement countdown
_countdownValue[4]--;
if (_countdownValue[4] < '0') {
_countdownValue[4] = '9';
_countdownValue[3]--;
if (_countdownValue[3] < '0') {
_countdownValue[3] = '5';
_countdownValue[1]--;
if (_countdownValue[1] < '0') {
_countdownValue[1] = '9';
_countdownValue[0]--;
if (_countdownValue[0] < '0') {
// Finished!
_countingDown = false;
playTransitionEndLevel(8);
_abortCommand = kAbortGameOver;
}
}
}
}
// Redraw surface
_countdownSurface.clear(0);
_fontManager.setCurrentFont(3);
_fontManager.setTransparentBackground(true);
_fontManager.setForeColor(241);
_fontManager.setLineHeight(14);
_fontManager.setSpaceWidth(0);
_fontManager.setCharSpacing(1);
_fontManager.setSurface(&_countdownSurface);
_fontManager.displayStr(0, 2, _countdownValue);
// Surface changed: need redraw
return true;
} else {
return false;
}
}
void CryOmni3DEngine_Versailles::doDrawCountdown(Graphics::ManagedSurface *surface) {
if (surface) {
surface->blitFrom(_countdownSurface, Common::Point(600, 0));
} else {
g_system->copyRectToScreen(_countdownSurface.getPixels(), _countdownSurface.pitch, 600, 0,
_countdownSurface.w, _countdownSurface.h);
}
}
} // End of namespace Versailles
} // End of namespace CryOmni3D