1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
/* 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 2
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "common/scummsys.h"
#include "common/config-manager.h"
#include "mads/mads.h"
#include "mads/compression.h"
#include "mads/resources.h"
#include "mads/scene.h"
#include "mads/phantom/game_phantom.h"
#include "mads/phantom/phantom_scenes.h"
#include "mads/phantom/phantom_scenes1.h"
namespace MADS {
namespace Phantom {
SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
Scene &scene = vm->_game->_scene;
// TODO
//scene.addActiveVocab(NOUN_DROP);
switch (scene._nextSceneId) {
// Scene group #1 (theater, stage and dressing rooms)
case 101: // seats
return new Scene101(vm);
case 102: // music stands
return new Scene102(vm);
case 103: // below stage
return new Scene103(vm);
case 104: // stage
return new Scene104(vm);
case 105: // ground floor, storage room
return new Scene105(vm);
case 106: // behind stage
return new Scene106(vm);
case 107: // stage right wing
return new Scene107(vm);
case 108: // stage left wing
return new Scene108(vm);
case 109: // upper floor, staircase
return new Scene109(vm);
case 110: // outside dressing rooms 1
return new Scene110(vm);
case 111: // outside dressing rooms 2
return new Scene111(vm);
case 112: // inside dressing room 1
return new DummyScene(vm); // TODO
case 113: // inside dressing room 2
return new DummyScene(vm); // TODO
case 114: // lower floor, storage room
return new DummyScene(vm); // TODO
case 150: // cutscene
return new DummyScene(vm); // TODO
// Scene group #2 (theater entrance, offices, balcony)
case 201: // entrance / ticket office
return new DummyScene(vm); // TODO
case 202: // outside offices / paintings room
return new DummyScene(vm); // TODO
case 203: // office
return new DummyScene(vm); // TODO
case 204: // library
return new DummyScene(vm); // TODO
case 205: // upper floor, outside balcony boxes
return new DummyScene(vm); // TODO
case 206: // balcony box #1
return new DummyScene(vm); // TODO
case 207: // balcony box #2
return new DummyScene(vm); // TODO
case 208: // stage and balcony view
return new DummyScene(vm); // TODO
case 250: // cutscene
return new DummyScene(vm); // TODO
// Scene group #3 (catwalks, chandelier, lake / catacombs entrance)
case 301: // catwalk #1 above stage
return new DummyScene(vm); // TODO
case 302: // catwalk #2 above stage
return new DummyScene(vm); // TODO
case 303: // above chandelier
return new DummyScene(vm); // TODO
case 304: // chandelier
return new DummyScene(vm); // TODO
case 305: // chandelier fight, phantom closeup
return new DummyScene(vm); // TODO
case 306: // chandelier #2
return new DummyScene(vm); // TODO
case 307: // catwalk #3 above stage
return new DummyScene(vm); // TODO
case 308: // hidden staircase behind balcony box
return new DummyScene(vm); // TODO
case 309: // lake and archway
return new DummyScene(vm); // TODO
case 310: // lake
return new DummyScene(vm); // TODO
// Scene group #4 (labyrinth)
case 401: // labyrinth room, 3 exits
return new DummyScene(vm); // TODO
case 403: // labyrinth room (big), 4 exits + 1 bricked door, left
return new DummyScene(vm); // TODO
case 404: // labyrinth room, 3 exits
return new DummyScene(vm); // TODO
case 406: // labyrinth room, 2 exits
return new DummyScene(vm); // TODO
case 407: // catacomb room / lake
return new DummyScene(vm); // TODO
case 408: // catacomb corridor
return new DummyScene(vm); // TODO
case 409: // catacomb room, door with switch panel
return new DummyScene(vm); // TODO
case 410: // skull switch panel
return new DummyScene(vm); // TODO
case 453: // Labyrinth room (big), 4 exits + 1 bricked door, right
return new DummyScene(vm); // TODO
case 456: // Labyrinth room, 2 exits
return new DummyScene(vm); // TODO
// Scene group #5 (Phantom's hideout)
case 501: // catacombs, outside phantom's hideout, lake and boat
return new DummyScene(vm); // TODO
case 502: // push panel trap
return new DummyScene(vm); // TODO
case 504: // Phantom's hideout, church organ
return new DummyScene(vm); // TODO
case 505: // Phantom's hideout, sarcophagus
return new DummyScene(vm); // TODO
case 506: // catacomb room with ramp
return new DummyScene(vm); // TODO
default:
error("Invalid scene %d called", scene._nextSceneId);
}
}
/*------------------------------------------------------------------------*/
PhantomScene::PhantomScene(MADSEngine *vm) : SceneLogic(vm),
_globals(static_cast<GamePhantom *>(vm->_game)->_globals),
_game(*static_cast<GamePhantom *>(vm->_game)),
_action(vm->_game->_scene._action) {
}
Common::String PhantomScene::formAnimName(char sepChar, int suffixNum) {
return Resources::formatName(_scene->_currentSceneId, sepChar, suffixNum,
EXT_NONE, "");
}
/*------------------------------------------------------------------------*/
void SceneInfoPhantom::loadCodes(MSurface &depthSurface, int variant) {
// The intro scenes do not have any codes
if (_sceneId >= 900)
return;
Common::String ext = Common::String::format(".WW%d", variant);
File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext));
MadsPack codesPack(&f);
Common::SeekableReadStream *stream = codesPack.getItemStream(0);
loadCodes(depthSurface, stream);
delete stream;
f.close();
}
void SceneInfoPhantom::loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream) {
byte *destP = depthSurface.getData();
byte *walkMap = new byte[stream->size()];
stream->read(walkMap, stream->size());
for (int y = 0; y < 156; ++y) {
for (int x = 0; x < 320; ++x) {
int offset = x + (y * 320);
if ((walkMap[offset / 8] << (offset % 8)) & 0x80)
*destP++ = 1; // walkable
else
*destP++ = 0;
}
}
delete[] walkMap;
}
} // End of namespace Phantom
} // End of namespace MADS
|