ScummVM API documentation
features.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef SCI_ENGINE_FEATURES_H
23#define SCI_ENGINE_FEATURES_H
24
25#include "sci/resource/resource.h"
26#include "sci/engine/seg_manager.h"
27
28namespace Sci {
29
30enum MoveCountType {
31 kMoveCountUninitialized,
32 kIgnoreMoveCount,
33 kIncrementMoveCount
34};
35
36enum PseudoMouseAbilityType {
37 kPseudoMouseAbilityUninitialized,
38 kPseudoMouseAbilityFalse,
39 kPseudoMouseAbilityTrue
40};
41
42enum MessageTypeSyncStrategy {
43 kMessageTypeSyncStrategyNone,
44 kMessageTypeSyncStrategyDefault
45#ifdef ENABLE_SCI32
46 ,
47 kMessageTypeSyncStrategyLSL6Hires,
48 kMessageTypeSyncStrategyShivers
49#endif
50};
51
52enum {
53 kSpeedThrottleDefaultDelay = 30 // kGameIsRestarting default max delay in ms
54};
55
57public:
58 GameFeatures(SegManager *segMan, Kernel *kernel);
59 ~GameFeatures() {}
60
67
73
79
85
91
92#ifdef ENABLE_SCI32
97 SciVersion detectSci21KernelType();
98
99 inline bool usesModifiedAudioAttenuation() const {
100 switch (g_sci->getGameId()) {
101 case GID_PQ4:
102 case GID_QFG4:
103 return g_sci->isCD();
104 case GID_MOTHERGOOSEHIRES:
105 case GID_SQ6:
106 // SQ6 1.0 uses modified attenuation, 1.11 does not.
107 // The interpreters are different even though they both have the
108 // same date and version string. ("May 24 1995", "2.100.002")
109 return true;
110 case GID_KQ7:
111 // KQ7 1.51 (SCI2.1early) uses the non-standard attenuation, but
112 // 2.00b (SCI2.1mid) does not
113 return getSciVersion() == SCI_VERSION_2_1_EARLY;
114 default:
115 return false;
116 }
117 }
118
119 inline bool gameScriptsControlMasterVolume() const {
120 switch (g_sci->getGameId()) {
121 case GID_LSL7:
122 case GID_PHANTASMAGORIA2:
123 case GID_TORIN:
124 return true;
125 default:
126 return false;
127 }
128 }
129
130 inline bool hasSci3Audio() const {
131 return getSciVersion() == SCI_VERSION_3 || g_sci->getGameId() == GID_GK2;
132 }
133
134 inline bool hasTransparentPicturePlanes() const {
135 const SciGameId &gid = g_sci->getGameId();
136
137 // MGDX is assumed to not have transparent picture planes since it
138 // was released before SQ6, but this has not been verified since it
139 // cannot be disassembled at the moment (Phar Lap Windows-only release)
140 return getSciVersion() >= SCI_VERSION_2_1_MIDDLE &&
141 gid != GID_SQ6 &&
142 gid != GID_MOTHERGOOSEHIRES;
143 }
144
145 inline bool hasMidPaletteCode() const {
146 return getSciVersion() >= SCI_VERSION_2_1_MIDDLE || g_sci->getGameId() == GID_KQ7;
147 }
148
149 inline bool hasLatePaletteCode() const {
150 return getSciVersion() > SCI_VERSION_2_1_MIDDLE ||
151 g_sci->getGameId() == GID_GK2 ||
152 g_sci->getGameId() == GID_PQSWAT ||
153 // Guessing that Shivers has the late palette code because it has a
154 // brightness slider
155 g_sci->getGameId() == GID_SHIVERS ||
156 g_sci->getGameId() == GID_TORIN;
157 }
158
159 inline bool VMDOpenStopsAudio() const {
160 // Of the games that use VMDs:
161 // Yes: Phant1, Shivers, Torin
162 // No: SQ6
163 // TODO: Optional extra flag to kPlayVMD which defaults to Yes: PQ:SWAT
164 // TODO: SCI3, GK2 (GK2's VMD code is closer to SCI3 than SCI21)
165 return getSciVersion() == SCI_VERSION_2_1_MIDDLE &&
166 g_sci->getGameId() != GID_SQ6 &&
167 g_sci->getGameId() != GID_GK2;
168 }
169
170 inline bool useDoSoundMac32() const {
171 // Several SCI 2.1 Middle Mac games use a modified kDoSound with
172 // different subop numbers.
173 return g_sci->getPlatform() == Common::kPlatformMacintosh &&
174 (g_sci->getGameId() == GID_HOYLE5 ||
175 g_sci->getGameId() == GID_PHANTASMAGORIA ||
176 g_sci->getGameId() == GID_PQSWAT ||
177 g_sci->getGameId() == GID_SHIVERS ||
178 g_sci->getGameId() == GID_SQ6);
179 }
180
181 inline bool useMacGammaLevel() const {
182 // SCI32 Mac interpreters were hard-coded to use gamma level 2 until
183 // Torin's Passage, PQSWAT, and the 2.1 Late games. The colors in
184 // the game resources are significantly darker than their PC versions.
185 // Confirmed in disassembly of all Mac interpreters.
186 return g_sci->getPlatform() == Common::kPlatformMacintosh &&
187 getSciVersion() >= SCI_VERSION_2 &&
188 getSciVersion() < SCI_VERSION_2_1_LATE &&
189 g_sci->getGameId() != GID_PQSWAT &&
190 g_sci->getGameId() != GID_TORIN;
191 }
192
193 inline bool usesAlternateSelectors() const {
194 return g_sci->getGameId() == GID_PHANTASMAGORIA2;
195 }
196#endif
197
202
206 bool supportsTextSpeed() const {
207 switch (g_sci->getGameId()) {
208 case GID_GK1:
209 case GID_SQ6:
210 return true;
211 default:
212 return false;
213 }
214 }
215
221
226 MessageTypeSyncStrategy getMessageTypeSyncStrategy() const;
227
235 bool usesOldGfxFunctions() { return detectGfxFunctionsType() == SCI_VERSION_0_EARLY; }
236
241 MoveCountType detectMoveCountType();
242
243 int detectPlaneIdBase();
244
245 bool handleMoveCount() { return detectMoveCountType() == kIncrementMoveCount; }
246
247 bool usesCdTrack() { return _usesCdTrack; }
248
255
260
265 void forceDOSTracks() { _forceDOSTracks = true; }
266
267 bool useWindowsCursors() { return _useWindowsCursors; }
268
273 PseudoMouseAbilityType detectPseudoMouseAbility();
274
275 bool useAudioPopfix() const { return _useAudioPopfix; }
276
277 bool useEarlyGetLongestTextCalculations() const;
278
286
292 bool canSaveFromGMM() const;
293
300 uint16 getGameFlagsGlobal() const;
301
308
309private:
310 reg_t getDetectionAddr(const Common::String &objName, Selector slc, int methodNum = -1);
311
312 bool autoDetectLofsType(const Common::String& gameSuperClassName, int methodNum);
313 bool autoDetectGfxFunctionsType(int methodNum = -1);
314 bool autoDetectSoundType();
315 bool autoDetectMoveCountType();
316#ifdef ENABLE_SCI32
317 bool autoDetectSci21KernelType();
318#endif
319
320 SciVersion _doSoundType, _setCursorType, _lofsType, _gfxFunctionsType, _messageFunctionType;
321#ifdef ENABLE_SCI32
322 SciVersion _sci21KernelType;
323#endif
324
325 MoveCountType _moveCountType;
326 bool _usesCdTrack;
327 bool _forceDOSTracks;
328 bool _useWindowsCursors;
329
330 PseudoMouseAbilityType _pseudoMouseAbility;
331
332 bool _useAudioPopfix;
333
334 SegManager *_segMan;
335 Kernel *_kernel;
336};
337
338} // End of namespace Sci
339
340#endif // SCI_ENGINE_FEATURES_H
Definition: str.h:59
Definition: features.h:56
bool audioVolumeSyncUsesGlobals() const
bool usesOldGfxFunctions()
Definition: features.h:235
SciVersion detectLofsType()
void forceDOSTracks()
Definition: features.h:265
bool supportsTextSpeed() const
Definition: features.h:206
bool canSaveFromGMM() const
SciVersion detectMessageFunctionType()
MessageTypeSyncStrategy getMessageTypeSyncStrategy() const
SciVersion detectSetCursorType()
SciVersion detectGfxFunctionsType()
bool isGameFlagBitOrderNormal() const
uint16 getGameFlagsGlobal() const
PseudoMouseAbilityType detectPseudoMouseAbility()
bool hasScriptObjectNames() const
MoveCountType detectMoveCountType()
bool supportsSpeechWithSubtitles() const
SciVersion detectDoSoundType()
Definition: kernel.h:157
Common::Platform getPlatform() const
Definition: seg_manager.h:48
Definition: console.h:28
SciVersion
Definition: detection.h:136
SciEngine * g_sci
Definition: vm_types.h:39