aboutsummaryrefslogtreecommitdiff
path: root/engines/mads/phantom/phantom_scenes.cpp
blob: c2cec47bd9b8d916d03185adfee4a0c7abece29d (plain)
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
/* 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"

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 DummyScene(vm);	// TODO
	case 102:	// music stands
		return new DummyScene(vm);	// TODO
	case 103:	// below stage
		return new DummyScene(vm);	// TODO
	case 104:	// stage
		return new DummyScene(vm);	// TODO
	case 105:	// ground floor, storage room
		return new DummyScene(vm);	// TODO
	case 106:	// behind stage
		return new DummyScene(vm);	// TODO
	case 107:	// stage right wing
		return new DummyScene(vm);	// TODO
	case 108:	// stage left wing
		return new DummyScene(vm);	// TODO
	case 109:	// upper floor, staircase
		return new DummyScene(vm);	// TODO
	case 110:	// outside dressing rooms 1
		return new DummyScene(vm);	// TODO
	case 111:	// outside dressing rooms 2
		return new DummyScene(vm);	// TODO
	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) {
	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