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 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (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, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef SCI_ENGINE_KERNEL_TABLES_H 24 #define SCI_ENGINE_KERNEL_TABLES_H 25 26 #include "sci/engine/workarounds.h" 27 #include "sci/engine/vm_types.h" // for opcode_formats 28 29 namespace Sci { 30 31 // [io] -> either integer or object 32 // (io) -> optionally integer AND an object 33 // (i) -> optional integer 34 // . -> any type 35 // i* -> optional multiple integers 36 // .* -> any parameters afterwards (or none) 37 // 38 // data types: 39 // i - regular integer 40 // o - object 41 // r - reference 42 // n - node 43 // 0 - NULL 44 // . - any 45 // ! - invalid reference/offset 46 47 struct SciKernelMapSubEntry { 48 SciVersion fromVersion; 49 SciVersion toVersion; 50 51 uint16 id; 52 53 const char *name; 54 KernelFunctionCall *function; 55 56 const char *signature; 57 const SciWorkaroundEntry *workarounds; 58 }; 59 60 #define SCI_SUBOPENTRY_TERMINATOR { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, NULL, NULL, NULL, NULL } 61 62 63 #define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE 64 #define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 65 #define SIG_SCI1 SCI_VERSION_1_EGA_ONLY, SCI_VERSION_1_LATE 66 #define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 67 #define SIG_SINCE_SCI11 SCI_VERSION_1_1, SCI_VERSION_NONE 68 #define SIG_SCI2 SCI_VERSION_2, SCI_VERSION_2 69 #define SIG_SCI21EARLY SCI_VERSION_2_1_EARLY, SCI_VERSION_2_1_EARLY 70 #define SIG_SCI21MID_LATE SCI_VERSION_2_1_MIDDLE, SCI_VERSION_2_1_LATE 71 #define SIG_THRU_SCI21EARLY SCI_VERSION_2, SCI_VERSION_2_1_EARLY 72 #define SIG_THRU_SCI21MID SCI_VERSION_2, SCI_VERSION_2_1_MIDDLE 73 #define SIG_SINCE_SCI21 SCI_VERSION_2_1_EARLY, SCI_VERSION_3 74 #define SIG_SINCE_SCI21MID SCI_VERSION_2_1_MIDDLE, SCI_VERSION_3 75 #define SIG_SINCE_SCI21LATE SCI_VERSION_2_1_LATE, SCI_VERSION_3 76 #define SIG_SCI21LATE SCI_VERSION_2_1_LATE, SCI_VERSION_2_1_LATE 77 #define SIG_SCI3 SCI_VERSION_3, SCI_VERSION_3 78 79 #define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 80 #define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE 81 82 // SCI-Sound-Version 83 #define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE 84 #define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY 85 #define SIG_SOUNDSCI1LATE SCI_VERSION_1_LATE, SCI_VERSION_1_LATE 86 87 #define SIGFOR_ALL 0x3f 88 #define SIGFOR_DOS 1 << 0 89 #define SIGFOR_PC98 1 << 1 90 #define SIGFOR_WIN 1 << 2 91 #define SIGFOR_MAC 1 << 3 92 #define SIGFOR_AMIGA 1 << 4 93 #define SIGFOR_ATARI 1 << 5 94 #define SIGFOR_PC SIGFOR_DOS|SIGFOR_WIN 95 96 #define SIG_EVERYWHERE SIG_SCIALL, SIGFOR_ALL 97 98 #define MAP_CALL(_name_) #_name_, k##_name_ 99 #define MAP_EMPTY(_name_) #_name_, kEmpty 100 #define MAP_DUMMY(_name_) #_name_, kDummy 101 102 // version, subId, function-mapping, signature, workarounds 103 static const SciKernelMapSubEntry kDoSound_subops[] = { 104 { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, 105 { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, 106 { SIG_SOUNDSCI0, 2, MAP_EMPTY(DoSoundRestore), "(o)", NULL }, 107 { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, 108 { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, 109 { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, 110 { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "i", NULL }, 111 { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResumeAfterRestore), "", NULL }, 112 { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, 113 { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, 114 { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "[o0]", kDoSoundFade_workarounds }, 115 { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "", NULL }, 116 { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStopAll), "", NULL }, 117 { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, 118 { SIG_SOUNDSCI1EARLY, 1, MAP_CALL(DoSoundMute), NULL, NULL }, 119 { SIG_SOUNDSCI1EARLY, 2, MAP_EMPTY(DoSoundRestore), NULL, NULL }, 120 { SIG_SOUNDSCI1EARLY, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, 121 { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, 122 { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, 123 { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, 124 { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, 125 { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, 126 { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, 127 { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", kDoSoundFade_workarounds }, 128 { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, 129 { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiii", NULL }, 130 { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundGlobalReverb), "(i)", NULL }, 131 { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, 132 { SIG_SOUNDSCI1EARLY, 15, MAP_EMPTY(DoSoundDummy), "", NULL }, 133 // ^^ Longbow demo 134 { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, 135 { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, 136 { SIG_SOUNDSCI1LATE, 2, MAP_EMPTY(DoSoundRestore), "", NULL }, 137 { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, 138 { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, 139 { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, 140 { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, 141 { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, 142 { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, 143 { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, 144 { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, 145 { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", kDoSoundFade_workarounds }, 146 { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, 147 { SIG_SOUNDSCI1LATE, 13, MAP_EMPTY(DoSoundDummy), NULL, NULL }, 148 { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, 149 { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), "oi", NULL }, 150 { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), "oi", NULL }, 151 { SIG_SOUNDSCI1LATE, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, 152 { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), "oiii(i)", NULL }, 153 { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundGlobalReverb), NULL, NULL }, 154 { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, 155 #ifdef ENABLE_SCI32 156 { SIG_SCI32, 0, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, 157 { SIG_SCI32, 1, MAP_CALL(DoSoundMute), "(i)", NULL }, 158 { SIG_SCI32, 2, MAP_EMPTY(DoSoundRestore), NULL, NULL }, 159 { SIG_SCI32, 3, MAP_CALL(DoSoundGetPolyphony), "", NULL }, 160 { SIG_SCI32, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, 161 { SIG_SCI32, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, 162 { SIG_SCI32, 6, MAP_CALL(DoSoundInit), "o", NULL }, 163 { SIG_SCI32, 7, MAP_CALL(DoSoundDispose), "o", NULL }, 164 { SIG_SCI32, 8, MAP_CALL(DoSoundPlay), "o", kDoSoundPlay_workarounds }, 165 { SIG_SCI32, 9, MAP_CALL(DoSoundStop), "o", NULL }, 166 { SIG_SCI32, 10, MAP_CALL(DoSoundPause), "[o0]i", NULL }, 167 { SIG_SCI32, 11, MAP_CALL(DoSoundFade), "oiiii", kDoSoundFade_workarounds }, 168 { SIG_SCI32, 12, MAP_CALL(DoSoundSetHold), "oi", NULL }, 169 { SIG_SCI32, 13, MAP_EMPTY(DoSoundDummy), NULL, NULL }, 170 { SIG_SCI32, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, 171 { SIG_SCI32, 15, MAP_CALL(DoSoundSetPriority), "oi", NULL }, 172 { SIG_SCI32, 16, MAP_CALL(DoSoundSetLoop), "oi", NULL }, 173 { SIG_SCI32, 17, MAP_CALL(DoSoundUpdateCues), "o", NULL }, 174 { SIG_SCI32, 18, MAP_CALL(DoSoundSendMidi), "oiiii", NULL }, 175 { SIG_SCI32, 19, MAP_CALL(DoSoundGlobalReverb), "(i)", NULL }, 176 { SIG_SCI32, 20, MAP_CALL(DoSoundUpdate), "o", NULL }, 177 #endif 178 SCI_SUBOPENTRY_TERMINATOR 179 }; 180 181 #ifdef ENABLE_SCI32 182 // NOTE: In SSCI, some 'unused' kDoAudio subops are actually called indirectly 183 // by kDoSound: 184 // 185 // kDoSoundGetAudioCapability -> kDoAudioGetCapability 186 // kDoSoundPlay -> kDoAudioPlay, kDoAudioStop 187 // kDoSoundPause -> kDoAudioPause, kDoAudioResume 188 // kDoSoundFade -> kDoAudioFade 189 // kDoSoundSetVolume -> kDoAudioVolume 190 // kDoSoundSetLoop -> kDoAudioSetLoop 191 // kDoSoundUpdateCues -> kDoAudioPosition 192 // 193 // In ScummVM, logic inside these kernel functions has been moved to methods of 194 // Audio32, and direct calls to Audio32 are made from kDoSound instead. 195 // 196 // Some kDoAudio methods are esoteric and appear to be used only by one or two 197 // games: 198 // 199 // - kDoAudioMixing: Phantasmagoria (other games call this function, but only 200 // to disable the feature) 201 // - kDoAudioHasSignal: SQ6 TalkRandCycle 202 // - kDoAudioPan: Rama RegionSFX::pan method 203 // - kDoAudioCritical: Phantasmagoria, chapter 3, nursery (room 14200), during 204 // the "ghost lullaby" event. It is used to make the 205 // lullaby sound exclusive, but it really doesn't make any 206 // major difference. Returning 0 means "non-critical", i.e. 207 // normal audio behavior. 208 // 209 // Finally, there is a split in SCI2.1mid audio code. QFG4CD & SQ6 do not have 210 // opcodes 18 and 19, but they exist in GK2, KQ7 2.00b, Phantasmagoria 1, 211 // PQ:SWAT, and Torin. It is unknown if they exist in MUMG Deluxe or Shivers 1; 212 // they are not used in either of these games. 213 214 // version, subId, function-mapping, signature, workarounds 215 static const SciKernelMapSubEntry kDoAudio_subops[] = { 216 { SIG_SCI32, 0, MAP_CALL(DoAudioInit), "", NULL }, 217 // SCI2 includes a Sync script that would call 218 // kDoAudioWaitForPlay, but SSCI has no opcode 1 until 219 // SCI2.1early 220 { SIG_SINCE_SCI21, 1, MAP_CALL(DoAudioWaitForPlay), "(i)(i)(i)(i)(i)(i)(i)", NULL }, 221 { SIG_SCI32, 2, MAP_CALL(DoAudioPlay), "(i)(i)(i)(i)(i)(i)(i)", NULL }, 222 { SIG_SCI32, 3, MAP_CALL(DoAudioStop), "(i)(i)(i)(i)(i)", NULL }, 223 { SIG_SCI32, 4, MAP_CALL(DoAudioPause), "(i)(i)(i)(i)(i)", NULL }, 224 { SIG_SCI32, 5, MAP_CALL(DoAudioResume), "(i)(i)(i)(i)(i)", kDoAudioResume_workarounds }, 225 { SIG_SCI32, 6, MAP_CALL(DoAudioPosition), "(i)(i)(i)(i)(i)", NULL }, 226 { SIG_SCI32, 7, MAP_CALL(DoAudioRate), "(i)", NULL }, 227 { SIG_SCI32, 8, MAP_CALL(DoAudioVolume), "(i)(i)(i)(i)(i)(i)", NULL }, 228 { SIG_SCI32, 9, MAP_CALL(DoAudioGetCapability), "", NULL }, 229 { SIG_SCI32, 10, MAP_CALL(DoAudioBitDepth), "(i)", NULL }, 230 { SIG_SCI32, 11, MAP_DUMMY(DoAudioDistort), "(i)", NULL }, 231 { SIG_SCI32, 12, MAP_CALL(DoAudioMixing), "(i)", NULL }, 232 { SIG_SCI2, 13, MAP_EMPTY(DoAudioSetBufferSize), "i", NULL }, 233 { SIG_SINCE_SCI21, 13, MAP_CALL(DoAudioChannels), "(i)", NULL }, 234 { SIG_SINCE_SCI21, 14, MAP_CALL(DoAudioPreload), "(i)", NULL }, 235 { SIG_SINCE_SCI21MID, 15, MAP_CALL(DoAudioFade), "(iiii)(i)(i)", NULL }, 236 { SIG_SINCE_SCI21MID, 16, MAP_DUMMY(DoAudioFade36), "iiiii(iii)(i)", NULL }, 237 { SIG_SINCE_SCI21MID, 17, MAP_CALL(DoAudioHasSignal), "", NULL }, 238 { SIG_SINCE_SCI21MID, 18, MAP_EMPTY(DoAudioCritical), "(i)", NULL }, 239 { SIG_SINCE_SCI21MID, 19, MAP_CALL(DoAudioSetLoop), "iii(o)", NULL }, 240 { SIG_SCI3, 20, MAP_CALL(DoAudioPan), "ii(i)(iii)", NULL }, 241 { SIG_SCI3, 21, MAP_CALL(DoAudioPanOff), "i(i)(iii)", NULL }, 242 SCI_SUBOPENTRY_TERMINATOR 243 }; 244 #endif 245 246 // version, subId, function-mapping, signature, workarounds 247 static const SciKernelMapSubEntry kGraph_subops[] = { 248 // 1 - load bits 249 { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, 250 // 3 - set palette via resource 251 { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", kGraphDrawLine_workarounds }, 252 // 5 - nop 253 // 6 - draw pattern 254 { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", kGraphSaveBox_workarounds }, 255 { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", kGraphRestoreBox_workarounds }, 256 // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same 257 { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, 258 { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", kGraphFillBoxForeground_workarounds }, 259 { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, 260 { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", kGraphUpdateBox_workarounds }, // kq6 hires 261 { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", kGraphUpdateBox_workarounds }, 262 { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", kGraphRedrawBox_workarounds }, 263 { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, 264 { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires 265 SCI_SUBOPENTRY_TERMINATOR 266 }; 267 268 // version, subId, function-mapping, signature, workarounds 269 static const SciKernelMapSubEntry kPalVary_subops[] = { 270 { SIG_SCI16, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, 271 { SIG_SCI16, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, 272 { SIG_SCI16, 2, MAP_CALL(PalVaryGetCurrentStep), "", NULL }, 273 { SIG_SCI16, 3, MAP_CALL(PalVaryDeinit), "", NULL }, 274 { SIG_SCI16, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, 275 { SIG_SCI16, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, 276 { SIG_SCI16, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, 277 #ifdef ENABLE_SCI32 278 { SIG_SCI32, 0, MAP_CALL(PalVarySetVary), "i(i)(i)(i)(i)", kPalVarySetVary_workarounds }, 279 { SIG_SCI32, 1, MAP_CALL(PalVarySetPercent), "(i)(i)", kPalVarySetPercent_workarounds }, 280 { SIG_SCI32, 2, MAP_CALL(PalVaryGetPercent), "", NULL }, 281 { SIG_SCI32, 3, MAP_CALL(PalVaryOff), "", NULL }, 282 { SIG_SCI32, 4, MAP_CALL(PalVaryMergeTarget), "i", NULL }, 283 { SIG_SCI32, 5, MAP_CALL(PalVarySetTime), "i", NULL }, 284 { SIG_SCI32, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, 285 { SIG_SCI32, 7, MAP_CALL(PalVarySetTarget), "i", NULL }, 286 { SIG_SCI32, 8, MAP_CALL(PalVarySetStart), "i", kPalVarySetStart_workarounds }, 287 { SIG_SCI32, 9, MAP_CALL(PalVaryMergeStart), "i", kPalVaryMergeStart_workarounds }, 288 #endif 289 SCI_SUBOPENTRY_TERMINATOR 290 }; 291 292 // version, subId, function-mapping, signature, workarounds 293 static const SciKernelMapSubEntry kPalette_subops[] = { 294 { SIG_SCI16, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, 295 { SIG_SCI16, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, 296 { SIG_SCI16, 3, MAP_CALL(PaletteUnsetFlag), "iii", kPaletteUnsetFlag_workarounds }, 297 { SIG_SCI16, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL }, 298 { SIG_SCI16, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, 299 { SIG_SCI16, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, 300 { SIG_SCI16, 7, MAP_CALL(PaletteSave), "", NULL }, 301 { SIG_SCI16, 8, MAP_CALL(PaletteRestore), "[r0]", NULL }, 302 #ifdef ENABLE_SCI32 303 { SIG_SCI32, 1, MAP_CALL(PaletteSetFromResource32), "i(i)", NULL }, 304 { SIG_SCI32, 2, MAP_CALL(PaletteSetFade), "iii", NULL }, 305 { SIG_SCI32, 3, MAP_CALL(PaletteFindColor32), "iii", NULL }, 306 { SIG_SCI32, 4, MAP_CALL(PaletteSetGamma), "i", NULL }, 307 #endif 308 SCI_SUBOPENTRY_TERMINATOR 309 }; 310 311 // version, subId, function-mapping, signature, workarounds 312 static const SciKernelMapSubEntry kFileIO_subops[] = { 313 { SIG_SCIALL, 0, MAP_CALL(FileIOOpen), "ri", kFileIOOpen_workarounds }, 314 { SIG_SCIALL, 1, MAP_CALL(FileIOClose), "i", NULL }, 315 { SIG_SCIALL, 2, MAP_CALL(FileIOReadRaw), "iri", NULL }, 316 { SIG_SCIALL, 3, MAP_CALL(FileIOWriteRaw), "iri", NULL }, 317 { SIG_SCIALL, 4, MAP_CALL(FileIOUnlink), "r", NULL }, 318 { SIG_SCIALL, 5, MAP_CALL(FileIOReadString), "rii", kFileIOReadString_workarounds }, 319 { SIG_SCIALL, 6, MAP_CALL(FileIOWriteString), "ir", NULL }, 320 { SIG_SCIALL, 7, MAP_CALL(FileIOSeek), "iii", NULL }, 321 { SIG_SCIALL, 8, MAP_CALL(FileIOFindFirst), "rri", NULL }, 322 { SIG_SCIALL, 9, MAP_CALL(FileIOFindNext), "r", NULL }, 323 { SIG_SCIALL, 10, MAP_CALL(FileIOExists), "r", NULL }, 324 { SIG_SINCE_SCI11, 11, MAP_CALL(FileIORename), "rr", NULL }, 325 { SIG_SINCE_SCI11, 12, MAP_CALL(FileIOCopy), "rr", NULL }, 326 #ifdef ENABLE_SCI32 327 { SIG_SINCE_SCI21MID, 13, MAP_CALL(FileIOReadByte), "i", NULL }, 328 { SIG_SINCE_SCI21MID, 14, MAP_CALL(FileIOWriteByte), "ii", NULL }, 329 { SIG_SINCE_SCI21MID, 15, MAP_CALL(FileIOReadWord), "i", NULL }, 330 { SIG_SCI21MID_LATE, 16, MAP_CALL(FileIOWriteWord), "ii", NULL }, 331 { SIG_SCI3, 16, MAP_CALL(FileIOWriteWord), "i[.!]", NULL }, 332 { SIG_SINCE_SCI21MID, 17, "FileIOCheckFreeSpace", kCheckFreeSpace, "i(r)", kFileIOCheckFreeSpace_workarounds }, 333 { SIG_SINCE_SCI21MID, 18, MAP_CALL(FileIOGetCWD), "r", NULL }, 334 { SIG_SINCE_SCI21MID, 19, MAP_CALL(FileIOIsValidDirectory), "[ro]", NULL }, 335 #endif 336 SCI_SUBOPENTRY_TERMINATOR 337 }; 338 339 #ifdef ENABLE_SCI32 340 341 // version, subId, function-mapping, signature, workarounds 342 static const SciKernelMapSubEntry kPalCycle_subops[] = { 343 { SIG_SCI32, 0, MAP_CALL(PalCycleSetCycle), "iii(i)", NULL }, 344 { SIG_SCI32, 1, MAP_CALL(PalCycleDoCycle), "i(i)", NULL }, 345 { SIG_SCI32, 2, MAP_CALL(PalCyclePause), "(i)", NULL }, 346 { SIG_SCI32, 3, MAP_CALL(PalCycleOn), "(i)", NULL }, 347 { SIG_SCI32, 4, MAP_CALL(PalCycleOff), "(i)", NULL }, 348 SCI_SUBOPENTRY_TERMINATOR 349 }; 350 351 // version, subId, function-mapping, signature, workarounds 352 static const SciKernelMapSubEntry kSave_subops[] = { 353 { SIG_SCI32, 0, MAP_CALL(SaveGame32), "[r0]i[r0][r0]", NULL }, 354 { SIG_SCI32, 1, MAP_CALL(RestoreGame32), "[r0]i[r0]", NULL }, 355 // System script 64994 in several SCI2.1mid games (KQ7 2.00b, Phant1, 356 // PQ:SWAT, SQ6, Torin) calls GetSaveDir with an extra unused argument, and 357 // it is easier to just handle it here than to bother with creating 358 // workarounds 359 { SIG_SCI32, 2, MAP_CALL(GetSaveDir), "(r)", NULL }, 360 { SIG_SCI32, 3, MAP_CALL(CheckSaveGame32), "ri[r0]", NULL }, 361 // Subop 4 hasn't been encountered yet 362 { SIG_SCI32, 5, MAP_CALL(GetSaveFiles32), "rrr", NULL }, 363 { SIG_SCI32, 6, MAP_CALL(MakeSaveCatName), "rr", NULL }, 364 { SIG_SCI32, 7, MAP_CALL(MakeSaveFileName), "rri", NULL }, 365 { SIG_SCI32, 8, MAP_EMPTY(GameIsRestarting), "(.*)", NULL }, 366 SCI_SUBOPENTRY_TERMINATOR 367 }; 368 369 // version, subId, function-mapping, signature, workarounds 370 static const SciKernelMapSubEntry kFont_subops[] = { 371 { SIG_SINCE_SCI21MID, 0, MAP_CALL(PointSize), "i", NULL }, 372 { SIG_SINCE_SCI21MID, 1, MAP_CALL(SetFontRes), "ii", NULL }, 373 SCI_SUBOPENTRY_TERMINATOR 374 }; 375 376 // version, subId, function-mapping, signature, workarounds 377 static const SciKernelMapSubEntry kText_subops[] = { 378 { SIG_SINCE_SCI21MID, 0, MAP_CALL(TextSize32), "r[r0]i(i)(i)", NULL }, 379 { SIG_SINCE_SCI21MID, 1, MAP_CALL(TextWidth), "ri", NULL }, 380 SCI_SUBOPENTRY_TERMINATOR 381 }; 382 383 // version, subId, function-mapping, signature, workarounds 384 static const SciKernelMapSubEntry kBitmap_subops[] = { 385 { SIG_SINCE_SCI21, 0, MAP_CALL(BitmapCreate), "iiii(i)(i)(i)", NULL }, 386 { SIG_SINCE_SCI21, 1, MAP_CALL(BitmapDestroy), "[r!]", NULL }, 387 { SIG_SINCE_SCI21, 2, MAP_DUMMY(BitmapDrawLine), "riiiii(i)(i)", NULL }, 388 { SIG_SINCE_SCI21, 3, MAP_CALL(BitmapDrawView), "riii(i)(i)(0)(i)(i)", NULL }, 389 { SIG_SINCE_SCI21, 4, MAP_CALL(BitmapDrawText), "rriiiiiiiiiii", NULL }, 390 { SIG_SINCE_SCI21, 5, MAP_CALL(BitmapDrawColor), "riiiii", NULL }, 391 { SIG_SINCE_SCI21, 6, MAP_DUMMY(BitmapDrawBitmap), "rr(i)(i)(i)", NULL }, 392 { SIG_SINCE_SCI21, 7, MAP_DUMMY(BitmapInvert), "riiiiii", NULL }, 393 { SIG_SINCE_SCI21MID, 8, MAP_CALL(BitmapSetOrigin), "rii", NULL }, 394 { SIG_SINCE_SCI21MID, 9, MAP_CALL(BitmapCreateFromView), "iii(i)(i)(i)([r0])", NULL }, 395 { SIG_SINCE_SCI21MID, 10, MAP_DUMMY(BitmapCopyPixels), "rr", NULL }, 396 { SIG_SINCE_SCI21MID, 11, MAP_DUMMY(BitmapClone), "r", NULL }, 397 { SIG_SINCE_SCI21MID, 12, MAP_CALL(BitmapGetInfo), "r(i)(i)", NULL }, 398 { SIG_SINCE_SCI21LATE,13, MAP_DUMMY(BitmapScale), "r...ii", NULL }, 399 { SIG_SCI3, 14, MAP_DUMMY(BitmapCreateFromUnknown), "......", NULL }, 400 { SIG_SCI3, 15, MAP_DUMMY(Bitmap), "(.*)", NULL }, 401 { SIG_SCI3, 16, MAP_DUMMY(Bitmap), "(.*)", NULL }, 402 SCI_SUBOPENTRY_TERMINATOR 403 }; 404 405 // version, subId, function-mapping, signature, workarounds 406 static const SciKernelMapSubEntry kCD_subops[] = { 407 { SIG_SINCE_SCI21MID, 0, MAP_CALL(CheckCD), "(i)", NULL }, 408 { SIG_SINCE_SCI21MID, 1, MAP_CALL(GetSavedCD), "", NULL }, 409 SCI_SUBOPENTRY_TERMINATOR 410 }; 411 412 // version, subId, function-mapping, signature, workarounds 413 static const SciKernelMapSubEntry kList_subops[] = { 414 { SIG_SINCE_SCI21, 0, MAP_CALL(NewList), "", NULL }, 415 { SIG_SINCE_SCI21, 1, MAP_CALL(DisposeList), "l", NULL }, 416 { SIG_SINCE_SCI21, 2, MAP_CALL(NewNode), ".(.)", NULL }, 417 { SIG_SINCE_SCI21, 3, MAP_CALL(FirstNode), "[l0]", NULL }, 418 { SIG_SINCE_SCI21, 4, MAP_CALL(LastNode), "l", NULL }, 419 { SIG_SINCE_SCI21, 5, MAP_CALL(EmptyList), "l", NULL }, 420 { SIG_SINCE_SCI21, 6, MAP_CALL(NextNode), "n", NULL }, 421 { SIG_SINCE_SCI21, 7, MAP_CALL(PrevNode), "n", NULL }, 422 { SIG_SINCE_SCI21, 8, MAP_CALL(NodeValue), "[n0]", NULL }, 423 { SIG_SINCE_SCI21, 9, MAP_CALL(AddAfter), "lnn(.)", NULL }, 424 { SIG_SINCE_SCI21, 10, MAP_CALL(AddToFront), "ln(.)", NULL }, 425 { SIG_SINCE_SCI21, 11, MAP_CALL(AddToEnd), "ln(.)", NULL }, 426 { SIG_SINCE_SCI21, 12, MAP_CALL(AddBefore), "ln.", NULL }, 427 { SIG_SINCE_SCI21, 13, MAP_CALL(MoveToFront), "ln", NULL }, 428 { SIG_SINCE_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL }, 429 { SIG_SINCE_SCI21, 15, MAP_CALL(FindKey), "l.", NULL }, 430 { SIG_SINCE_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL }, 431 { SIG_SINCE_SCI21, 17, MAP_CALL(ListAt), "li", kListAt_workarounds }, 432 { SIG_SINCE_SCI21, 18, MAP_CALL(ListIndexOf) , "l[io]", NULL }, 433 { SIG_SINCE_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, 434 { SIG_SINCE_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, 435 { SIG_SINCE_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, 436 { SIG_SINCE_SCI21, 22, MAP_CALL(ListSort), "li(i)", NULL }, 437 SCI_SUBOPENTRY_TERMINATOR 438 }; 439 440 // version, subId, function-mapping, signature, workarounds 441 static const SciKernelMapSubEntry kShowMovieWin_subops[] = { 442 { SIG_SCI2, 0, MAP_CALL(ShowMovieWinOpen), "r", NULL }, 443 { SIG_SCI2, 1, MAP_CALL(ShowMovieWinInit), "ii(ii)", NULL }, 444 { SIG_SCI2, 2, MAP_CALL(ShowMovieWinPlay), "i", NULL }, 445 { SIG_SCI2, 6, MAP_CALL(ShowMovieWinClose), "", NULL }, 446 { SIG_SINCE_SCI21, 0, MAP_CALL(ShowMovieWinOpen), "ir", NULL }, 447 { SIG_SINCE_SCI21, 1, MAP_CALL(ShowMovieWinInit), "iii(ii)", NULL }, 448 { SIG_SINCE_SCI21, 2, MAP_CALL(ShowMovieWinPlay), "i(ii)(i)(i)", NULL }, 449 { SIG_SINCE_SCI21, 6, MAP_CALL(ShowMovieWinClose), "i", NULL }, 450 // Since movies are rendered within the graphics engine in ScummVM, 451 // it is not necessary to copy the palette from SCI to MCI, so this 452 // can be a no-op 453 { SIG_SINCE_SCI21, 7, MAP_EMPTY(ShowMovieWinSetPalette), "i", NULL }, 454 { SIG_SINCE_SCI21, 8, MAP_CALL(ShowMovieWinGetDuration), "i", NULL }, 455 { SIG_SINCE_SCI21, 11, MAP_CALL(ShowMovieWinCue), "ii", NULL }, 456 { SIG_SINCE_SCI21, 14, MAP_CALL(ShowMovieWinPlayUntilEvent), "i(i)", NULL }, 457 { SIG_SINCE_SCI21, 15, MAP_CALL(ShowMovieWinInitDouble), "iii", NULL }, 458 SCI_SUBOPENTRY_TERMINATOR 459 }; 460 461 // There are a lot of subops to PlayVMD, but only a few of them are ever 462 // actually used by games 463 // version, subId, function-mapping, signature, workarounds 464 static const SciKernelMapSubEntry kPlayVMD_subops[] = { 465 { SIG_SINCE_SCI21, 0, MAP_CALL(PlayVMDOpen), "r(i)(i)", NULL }, 466 { SIG_SINCE_SCI21, 1, MAP_CALL(PlayVMDInit), "ii(i)(i)(ii)", NULL }, 467 { SIG_SINCE_SCI21, 6, MAP_CALL(PlayVMDClose), "", NULL }, 468 { SIG_SINCE_SCI21, 7, MAP_CALL(PlayVMDIgnorePalettes), "", NULL }, 469 { SIG_SINCE_SCI21, 10, MAP_CALL(PlayVMDGetStatus), "", NULL }, 470 { SIG_SINCE_SCI21, 14, MAP_CALL(PlayVMDPlayUntilEvent), "i(i)(i)", NULL }, 471 { SIG_SINCE_SCI21, 16, MAP_CALL(PlayVMDShowCursor), "i", NULL }, 472 { SIG_SINCE_SCI21, 17, MAP_CALL(PlayVMDStartBlob), "", NULL }, 473 { SIG_SINCE_SCI21, 18, MAP_CALL(PlayVMDStopBlobs), "", NULL }, 474 { SIG_SINCE_SCI21, 19, MAP_CALL(PlayVMDAddBlob), "iiiii", NULL }, 475 { SIG_SINCE_SCI21, 20, MAP_CALL(PlayVMDDeleteBlob), "i", NULL }, 476 { SIG_SINCE_SCI21, 21, MAP_CALL(PlayVMDSetBlackoutArea), "iiii", NULL }, 477 { SIG_SINCE_SCI21, 23, MAP_CALL(PlayVMDRestrictPalette), "ii", NULL }, 478 { SIG_SCI3, 27, MAP_CALL(PlayVMDSetPlane), "i(i)", NULL }, 479 { SIG_SCI3, 28, MAP_EMPTY(PlayVMDSetPreload), "i", NULL }, 480 { SIG_SCI3, 31, MAP_EMPTY(PlayVMDSetFrameRate), "i", NULL }, 481 SCI_SUBOPENTRY_TERMINATOR 482 }; 483 484 // version, subId, function-mapping, signature, workarounds 485 static const SciKernelMapSubEntry kRobot_subops[] = { 486 { SIG_SINCE_SCI21, 0, MAP_CALL(RobotOpen), "ioiii(i)", NULL }, 487 { SIG_SINCE_SCI21, 1, MAP_CALL(RobotShowFrame), "i(ii)", NULL }, 488 { SIG_SINCE_SCI21, 2, MAP_CALL(RobotGetFrameSize), "r", NULL }, 489 { SIG_SINCE_SCI21, 4, MAP_CALL(RobotPlay), "", NULL }, 490 { SIG_SINCE_SCI21, 5, MAP_CALL(RobotGetIsFinished), "", NULL }, 491 { SIG_SINCE_SCI21, 6, MAP_CALL(RobotGetIsInitialized), "", NULL }, 492 { SIG_SINCE_SCI21, 7, MAP_CALL(RobotClose), "", NULL }, 493 { SIG_SINCE_SCI21, 8, MAP_CALL(RobotGetCue), "o", NULL }, 494 { SIG_SINCE_SCI21, 10, MAP_CALL(RobotPause), "", NULL }, 495 { SIG_SINCE_SCI21, 11, MAP_CALL(RobotGetFrameNo), "", NULL }, 496 { SIG_SINCE_SCI21, 12, MAP_CALL(RobotSetPriority), "i", NULL }, 497 SCI_SUBOPENTRY_TERMINATOR 498 }; 499 500 // version, subId, function-mapping, signature, workarounds 501 static const SciKernelMapSubEntry kPlayDuck_subops[] = { 502 { SIG_SCI3, 1, MAP_CALL(PlayDuckPlay), "iiiii", NULL }, 503 { SIG_SCI3, 2, MAP_CALL(PlayDuckSetFrameOut), "i", NULL }, 504 { SIG_SCI3, 5, MAP_CALL(PlayDuckClose), "", NULL }, 505 { SIG_SCI3, 6, MAP_CALL(PlayDuckSetVolume), "i", NULL }, 506 SCI_SUBOPENTRY_TERMINATOR 507 }; 508 509 // version, subId, function-mapping, signature, workarounds 510 static const SciKernelMapSubEntry kRemapColors_subops[] = { 511 { SIG_SCI32, 0, MAP_CALL(RemapColorsOff), "(i)", NULL }, 512 { SIG_SCI32, 1, MAP_CALL(RemapColorsByRange), "iiii(i)", NULL }, 513 { SIG_SCI32, 2, MAP_CALL(RemapColorsByPercent), "ii(i)", NULL }, 514 { SIG_SCI32, 3, MAP_CALL(RemapColorsToGray), "ii(i)", NULL }, 515 { SIG_SCI32, 4, MAP_CALL(RemapColorsToPercentGray), "iii(i)", NULL }, 516 { SIG_SCI32, 5, MAP_CALL(RemapColorsBlockRange), "ii", NULL }, 517 SCI_SUBOPENTRY_TERMINATOR 518 }; 519 520 // version, subId, function-mapping, signature, workarounds 521 static const SciKernelMapSubEntry kArray_subops[] = { 522 { SIG_SCI32, 0, MAP_CALL(ArrayNew), "ii", NULL }, 523 { SIG_SCI32, 1, MAP_CALL(ArrayGetSize), "r", NULL }, 524 { SIG_SCI32, 2, MAP_CALL(ArrayGetElement), "ri", NULL }, 525 { SIG_SCI32, 3, MAP_CALL(ArraySetElements), "ri(.*)", kArraySetElements_workarounds }, 526 { SIG_SCI32, 4, MAP_CALL(ArrayFree), "[r0]", NULL }, 527 { SIG_SCI32, 5, MAP_CALL(ArrayFill), "riii", kArrayFill_workarounds }, 528 { SIG_SCI32, 6, MAP_CALL(ArrayCopy), "ririi", NULL }, 529 // there is no subop 7 530 { SIG_SCI32, 8, MAP_CALL(ArrayDuplicate), "r", NULL }, 531 { SIG_SCI32, 9, MAP_CALL(ArrayGetData), "[or0]", NULL }, 532 { SIG_SCI3, 10, MAP_CALL(ArrayByteCopy), "ririi", NULL }, 533 SCI_SUBOPENTRY_TERMINATOR 534 }; 535 536 // version, subId, function-mapping, signature, workarounds 537 static const SciKernelMapSubEntry kString_subops[] = { 538 // every single copy of script 64918 in SCI2 through 2.1mid calls StringNew 539 // with a second type argument which is unused (new strings are always type 540 // 3) 541 { SIG_THRU_SCI21MID, 0, MAP_CALL(StringNew), "i(i)", NULL }, 542 { SIG_THRU_SCI21MID, 1, MAP_CALL(ArrayGetSize), "r", NULL }, 543 { SIG_THRU_SCI21MID, 2, MAP_CALL(StringGetChar), "[r0]i", NULL }, 544 { SIG_THRU_SCI21MID, 3, MAP_CALL(ArraySetElements), "ri(i*)", kArraySetElements_workarounds }, 545 { SIG_THRU_SCI21MID, 4, MAP_CALL(StringFree), "[r0]", NULL }, 546 { SIG_THRU_SCI21MID, 5, MAP_CALL(ArrayFill), "rii", kArrayFill_workarounds }, 547 { SIG_THRU_SCI21MID, 6, MAP_CALL(ArrayCopy), "ririi", NULL }, 548 { SIG_SCI32, 7, MAP_CALL(StringCompare), "[r0][r0](i)", NULL }, 549 550 { SIG_THRU_SCI21MID, 8, MAP_CALL(ArrayDuplicate), "r", NULL }, 551 { SIG_THRU_SCI21MID, 9, MAP_CALL(ArrayGetData), "[or0]", NULL }, 552 { SIG_THRU_SCI21MID, 10, MAP_CALL(StringLength), "[r0]", NULL }, 553 { SIG_THRU_SCI21MID, 11, MAP_CALL(StringFormat), "[or0](.*)", NULL }, 554 { SIG_THRU_SCI21MID, 12, MAP_CALL(StringFormatAt), "r[or0](.*)", NULL }, 555 { SIG_THRU_SCI21MID, 13, MAP_CALL(StringToInteger), "[r0]", NULL }, 556 { SIG_THRU_SCI21MID, 14, MAP_CALL(StringTrim), "[r0]i(i)", NULL }, 557 { SIG_THRU_SCI21MID, 15, MAP_CALL(StringToUpperCase), "[r0]", NULL }, 558 { SIG_THRU_SCI21MID, 16, MAP_CALL(StringToLowerCase), "[r0]", NULL }, 559 { SIG_THRU_SCI21MID, 17, MAP_CALL(StringReplaceSubstring), "[r0][r0][r0][r0]", NULL }, 560 { SIG_THRU_SCI21MID, 18, MAP_CALL(StringReplaceSubstringEx), "[r0][r0][r0][r0]", NULL }, 561 562 { SIG_SINCE_SCI21LATE, 8, MAP_CALL(StringLength), "[r0]", NULL }, 563 { SIG_SINCE_SCI21LATE, 9, MAP_CALL(StringFormat), "[or0](.*)", NULL }, 564 { SIG_SINCE_SCI21LATE,10, MAP_CALL(StringFormatAt), "[r0][or0](.*)", NULL }, 565 { SIG_SINCE_SCI21LATE,11, MAP_CALL(StringToInteger), "[r0]", NULL }, 566 { SIG_SINCE_SCI21LATE,12, MAP_CALL(StringTrim), "[r0]i(i)", NULL }, 567 { SIG_SINCE_SCI21LATE,13, MAP_CALL(StringToUpperCase), "[r0]", NULL }, 568 { SIG_SINCE_SCI21LATE,14, MAP_CALL(StringToLowerCase), "[r0]", NULL }, 569 { SIG_SINCE_SCI21LATE,15, MAP_CALL(StringReplaceSubstring), "[r0][r0][r0][r0]", NULL }, 570 { SIG_SINCE_SCI21LATE,16, MAP_CALL(StringReplaceSubstringEx), "[r0][r0][r0][r0]", NULL }, 571 SCI_SUBOPENTRY_TERMINATOR 572 }; 573 574 // version, subId, function-mapping, signature, workarounds 575 static const SciKernelMapSubEntry kCelInfo_subops[] = { 576 { SIG_SINCE_SCI21MID, 0, MAP_CALL(CelInfoGetOriginX), "iii", NULL }, 577 { SIG_SINCE_SCI21MID, 1, MAP_CALL(CelInfoGetOriginY), "iii", NULL }, 578 { SIG_SINCE_SCI21MID, 2, MAP_EMPTY(CelInfo), "iii", NULL }, 579 { SIG_SINCE_SCI21MID, 3, MAP_EMPTY(CelInfo), "iii", NULL }, 580 { SIG_SINCE_SCI21MID, 4, MAP_CALL(CelInfoGetPixel), "iiiii", NULL }, 581 SCI_SUBOPENTRY_TERMINATOR 582 }; 583 584 // version, subId, function-mapping, signature, workarounds 585 static const SciKernelMapSubEntry kCelLink_subops[] = { 586 { SIG_SINCE_SCI21MID, 0, MAP_DUMMY(CelLink0), "", NULL }, 587 { SIG_SINCE_SCI21MID, 1, MAP_DUMMY(CelLink1), "", NULL }, 588 { SIG_SINCE_SCI21MID, 2, MAP_CALL(CelLinkGetX), "iiii", NULL }, 589 { SIG_SINCE_SCI21MID, 3, MAP_CALL(CelLinkGetY), "iiii", NULL }, 590 { SIG_SINCE_SCI21MID, 4, MAP_DUMMY(CelLink4), "", NULL }, 591 SCI_SUBOPENTRY_TERMINATOR 592 }; 593 594 // version, subId, function-mapping, signature, workarounds 595 static const SciKernelMapSubEntry kScrollWindow_subops[] = { 596 { SIG_SCI32, 0, MAP_CALL(ScrollWindowCreate), "oi", NULL }, 597 { SIG_SCI32, 1, MAP_CALL(ScrollWindowAdd), "iriii(i)", kScrollWindowAdd_workarounds }, 598 { SIG_SCI32, 2, MAP_DUMMY(ScrollWindowClear), "i", NULL }, 599 { SIG_SCI32, 3, MAP_CALL(ScrollWindowPageUp), "i", NULL }, 600 { SIG_SCI32, 4, MAP_CALL(ScrollWindowPageDown), "i", NULL }, 601 { SIG_SCI32, 5, MAP_CALL(ScrollWindowUpArrow), "i", NULL }, 602 { SIG_SCI32, 6, MAP_CALL(ScrollWindowDownArrow), "i", NULL }, 603 { SIG_SCI32, 7, MAP_CALL(ScrollWindowHome), "i", NULL }, 604 { SIG_SCI32, 8, MAP_CALL(ScrollWindowEnd), "i", NULL }, 605 { SIG_SCI32, 9, MAP_DUMMY(ScrollWindowResize), "i.", NULL }, 606 { SIG_SCI32, 10, MAP_CALL(ScrollWindowWhere), "ii", NULL }, 607 { SIG_SCI32, 11, MAP_CALL(ScrollWindowGo), "i..", NULL }, 608 { SIG_SCI32, 12, MAP_DUMMY(ScrollWindowInsert), "i.....", NULL }, 609 { SIG_SCI32, 13, MAP_DUMMY(ScrollWindowDelete), "i.", NULL }, 610 { SIG_SCI32, 14, MAP_CALL(ScrollWindowModify), "iiriii(i)", NULL }, 611 { SIG_SCI32, 15, MAP_CALL(ScrollWindowHide), "i", NULL }, 612 { SIG_SCI32, 16, MAP_CALL(ScrollWindowShow), "i", NULL }, 613 { SIG_SCI32, 17, MAP_CALL(ScrollWindowDestroy), "i", NULL }, 614 // LSL6hires uses kScrollWindowText and kScrollWindowReconstruct to try to save 615 // and restore the content of the game's subtitle window, but this feature did not 616 // use the normal save/load functionality of the engine and was actually broken 617 // (all text formatting was missing on restore). Since there is no real reason to 618 // save the subtitle scrollback anyway, we just ignore calls to these two functions. 619 { SIG_SCI32, 18, MAP_EMPTY(ScrollWindowText), "i", NULL }, 620 { SIG_SCI32, 19, MAP_EMPTY(ScrollWindowReconstruct), "i.", NULL }, 621 SCI_SUBOPENTRY_TERMINATOR 622 }; 623 624 #endif 625 626 struct SciKernelMapEntry { 627 const char *name; 628 KernelFunctionCall *function; 629 630 SciVersion fromVersion; 631 SciVersion toVersion; 632 byte forPlatform; 633 634 const char *signature; 635 const SciKernelMapSubEntry *subFunctions; 636 const SciWorkaroundEntry *workarounds; 637 }; 638 639 // name, version/platform, signature, sub-signatures, workarounds 640 static SciKernelMapEntry s_kernelMap[] = { 641 { MAP_CALL(Abs), SIG_EVERYWHERE, "i", NULL, kAbs_workarounds }, 642 { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, 643 { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, 644 { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, 645 { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, 646 { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, 647 { MAP_CALL(Animate), SIG_EVERYWHERE, "(l0)(i)", NULL, NULL }, 648 { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, 649 { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, 650 { MAP_CALL(BaseSetter), SIG_SCI16, SIGFOR_ALL, "o", NULL, NULL }, 651 #ifdef ENABLE_SCI32 652 { "BaseSetter", kBaseSetter32, SIG_SCI32, SIGFOR_ALL, "o", NULL, NULL }, 653 #endif 654 { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, 655 { MAP_CALL(CantBeHere), SIG_SCI16, SIGFOR_ALL, "o(l)", NULL, NULL }, 656 #ifdef ENABLE_SCI32 657 { MAP_CALL(CantBeHere), SIG_SCI32, SIGFOR_ALL, "ol", NULL, NULL }, 658 #endif 659 { MAP_CALL(CelHigh), SIG_SCI16, SIGFOR_ALL, "ii(i)", NULL, kCelHigh_workarounds }, 660 { MAP_CALL(CelWide), SIG_SCI16, SIGFOR_ALL, "ii(i)", NULL, kCelWide_workarounds }, 661 #ifdef ENABLE_SCI32 662 { "CelHigh", kCelHigh32, SIG_SCI32, SIGFOR_ALL, "iii", NULL, NULL }, 663 { "CelWide", kCelWide32, SIG_SCI32, SIGFOR_ALL, "iii", NULL, kCelWide_workarounds }, 664 #endif 665 { MAP_CALL(CheckFreeSpace), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "r(i)", NULL, NULL }, 666 { MAP_CALL(CheckFreeSpace), SIG_SCI11, SIGFOR_ALL, "r(i)", NULL, NULL }, 667 { MAP_CALL(CheckFreeSpace), SIG_SCI16, SIGFOR_ALL, "r", NULL, NULL }, 668 #ifdef ENABLE_SCI32 669 { "CheckSaveGame", kCheckSaveGame32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri[r0]", NULL, NULL }, 670 #endif 671 { MAP_CALL(CheckSaveGame), SIG_SCI16, SIGFOR_ALL, ".*", NULL, NULL }, 672 { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, 673 { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, 674 { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, 675 { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, kDeleteKey_workarounds }, 676 { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, kDeviceInfo_workarounds }, // subop 677 { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, kDisplay_workarounds }, 678 // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro 679 // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same 680 { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, kDirLoop_workarounds }, 681 { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, 682 { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, 683 { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds }, 684 { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL }, 685 { MAP_CALL(DoAudio), SIG_SCI16, SIGFOR_ALL, "i(.*)", NULL, NULL }, // subop 686 #ifdef ENABLE_SCI32 687 { "DoAudio", kDoAudio32, SIG_SCI32, SIGFOR_ALL, "(.*)", kDoAudio_subops, NULL }, 688 #endif 689 { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o(i)", NULL, NULL }, 690 { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, 691 { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, 692 { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop 693 { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)([ri])", NULL, NULL }, // reference for kq6 hires 694 { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, 695 { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, 696 { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, 697 { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i(i)(i)(i)", NULL, NULL }, 698 { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "[r0](i)(i)", NULL, NULL }, 699 { MAP_CALL(EditControl), SIG_EVERYWHERE, "[o0][o0]", NULL, NULL }, 700 { MAP_CALL(Empty), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 701 { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, 702 { "FClose", kFileIOClose, SIG_EVERYWHERE, "i", NULL, NULL }, 703 { "FGets", kFileIOReadString, SIG_EVERYWHERE, "rii", NULL, NULL }, 704 { "FOpen", kFileIOOpen, SIG_EVERYWHERE, "ri", NULL, NULL }, 705 { "FPuts", kFileIOWriteString, SIG_EVERYWHERE, "ir", NULL, NULL }, 706 { MAP_CALL(FileIO), SIG_EVERYWHERE, "i([.!]*)", kFileIO_subops, NULL }, 707 { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, kFindKey_workarounds }, 708 { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, 709 { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, 710 { MAP_CALL(Format), SIG_EVERYWHERE, "r[ri](.*)", NULL, NULL }, 711 { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, 712 { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, kGetAngle_workarounds }, 713 { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, kGetCWD_workarounds }, 714 { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, 715 { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, 716 { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, 717 { MAP_CALL(GetFarText), SIG_EVERYWHERE, "ii[r0]", NULL, NULL }, 718 { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, 719 { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, 720 { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, 721 #ifdef ENABLE_SCI32 722 { MAP_CALL(GetSaveDir), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(r)", NULL, NULL }, 723 #endif 724 { MAP_CALL(GetSaveDir), SIG_SCI16, SIGFOR_ALL, "", NULL, NULL }, 725 #ifdef ENABLE_SCI32 726 { "GetSaveFiles", kGetSaveFiles32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "rrr", NULL, NULL }, 727 #endif 728 { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, 729 { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, 730 { MAP_CALL(GlobalToLocal), SIG_SCI16, SIGFOR_ALL, "o", NULL, NULL }, 731 #ifdef ENABLE_SCI32 732 { "GlobalToLocal", kGlobalToLocal32, SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, 733 #endif 734 { MAP_CALL(Graph), SIG_SCI16, SIGFOR_ALL, NULL, kGraph_subops, NULL }, 735 #ifdef ENABLE_SCI32 736 { MAP_EMPTY(Graph), SIG_SCI32, SIGFOR_ALL, "(.*)", NULL, NULL }, 737 #endif 738 { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, 739 { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, 740 { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, 741 { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, 742 { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, 743 { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, kIsObject_workarounds }, 744 { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop 745 { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, 746 { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, 747 { MAP_CALL(LocalToGlobal), SIG_SCI16, SIGFOR_ALL, "o", NULL, NULL }, 748 #ifdef ENABLE_SCI32 749 { "LocalToGlobal", kLocalToGlobal32, SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, 750 #endif 751 { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, kLock_workarounds }, 752 { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, 753 { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, kMemory_workarounds }, // subop 754 { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, 755 { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop 756 { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, 757 { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, 758 { MAP_CALL(Message), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop 759 { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, kMoveCursor_workarounds }, 760 { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, 761 { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, 762 { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, 763 { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, 764 { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, 765 { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, kNewWindow_workarounds }, 766 { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, 767 { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, 768 { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, 769 { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, 770 { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, 771 { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", kPalVary_subops, NULL }, 772 { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", kPalette_subops, NULL }, 773 { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, 774 { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, 775 { MAP_CALL(Platform), SIG_SCI16, SIGFOR_ALL, "(.*)", NULL, NULL }, 776 #ifdef ENABLE_SCI32 777 { "Platform", kPlatform32, SIG_SCI32, SIGFOR_MAC, "(.*)", NULL, NULL }, 778 { "Platform", kPlatform32, SIG_SCI32, SIGFOR_ALL, "(i)", NULL, kPlatform32_workarounds }, 779 #endif 780 { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop 781 { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, 782 { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, 783 { MAP_CALL(Random), SIG_EVERYWHERE, "(i)(i)", NULL, kRandom_workarounds }, 784 { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, kReadNumber_workarounds }, 785 { MAP_CALL(RemapColors), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(i)", NULL, NULL }, 786 { MAP_CALL(RemapColorsKawa), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(i)(i)", NULL, NULL }, 787 #ifdef ENABLE_SCI32 788 { "RemapColors", kRemapColors32, SIG_SCI32, SIGFOR_ALL, "i(i)(i)(i)(i)(i)", kRemapColors_subops, NULL }, 789 #endif 790 { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, kResCheck_workarounds }, 791 { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, 792 { "RestartGame", kRestartGame16, SIG_SCI16, SIGFOR_ALL, "", NULL, NULL }, 793 #ifdef ENABLE_SCI32 794 { MAP_EMPTY(RestartGame), SIG_SCI32, SIGFOR_ALL, "", NULL, NULL }, 795 { "RestoreGame", kRestoreGame32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri[r0]", NULL, NULL }, 796 #endif 797 { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "[r0]i[r0]", NULL, NULL }, 798 { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, 799 #ifdef ENABLE_SCI32 800 { "SaveGame", kSaveGame32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri[r0][r0]", NULL, NULL }, 801 { MAP_CALL(ScummVMSaveLoad), SIG_SCI32, SIGFOR_ALL, "([iro])([iro])", NULL, NULL }, 802 #endif 803 { MAP_CALL(SaveGame), SIG_SCI16, SIGFOR_ALL, "[r0]i[r0](r0)", NULL, NULL }, 804 { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, 805 { MAP_CALL(SetCursor), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(iiiiii)", NULL, NULL }, 806 { MAP_CALL(SetCursor), SIG_SCI16, SIGFOR_ALL, "i(i)(i)(i)(i)", NULL, kSetCursor_workarounds }, 807 #ifdef ENABLE_SCI32 808 { "SetCursor", kSetCursor32, SIG_SCI32, SIGFOR_ALL, "i(i)(i)(i)", NULL, kSetCursor_workarounds }, 809 #endif 810 { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, 811 { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, 812 { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, 813 { MAP_CALL(SetNowSeen), SIG_SCI16, SIGFOR_ALL, "o(i)", NULL, NULL }, 814 #ifdef ENABLE_SCI32 815 { "SetNowSeen", kSetNowSeen32, SIG_SCI32, SIGFOR_ALL, "o", NULL, NULL }, 816 #endif 817 { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iiiii)(i)", NULL, kSetPort_workarounds }, 818 { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, 819 { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, 820 { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, 821 { MAP_CALL(ShakeScreen), SIG_SCI16, SIGFOR_ALL, "(i)(i)", NULL, NULL }, 822 #ifdef ENABLE_SCI32 823 { "ShakeScreen", kShakeScreen32, SIG_SCI32, SIGFOR_ALL, "i(i)", NULL, NULL }, 824 #endif 825 { MAP_CALL(ShowMovie), SIG_SCI16, SIGFOR_ALL, "(.*)", NULL, NULL }, 826 #ifdef ENABLE_SCI32 827 { "ShowMovie", kShowMovie32, SIG_SCI32, SIGFOR_DOS, "ri(i)(i)", NULL, NULL }, 828 { "ShowMovie", kShowMovie32, SIG_SCI32, SIGFOR_MAC, "ri(i)(i)", NULL, NULL }, 829 { "ShowMovie", kShowMovieWin, SIG_SCI32, SIGFOR_WIN, "(.*)", kShowMovieWin_subops, NULL }, 830 #endif 831 { MAP_CALL(Show), SIG_EVERYWHERE, "i", NULL, NULL }, 832 { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, 833 { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, 834 { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, 835 { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, kStrAt_workarounds }, 836 { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, 837 { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, 838 { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, kStrCpy_workarounds }, 839 { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, 840 { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, kStrLen_workarounds }, 841 { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, 842 { MAP_CALL(TextColors), SIG_SCI16, SIGFOR_ALL, "(i*)", NULL, NULL }, 843 { MAP_CALL(TextFonts), SIG_SCI16, SIGFOR_ALL, "(i*)", NULL, NULL }, 844 { MAP_CALL(TextSize), SIG_SCI16, SIGFOR_MAC, "r[r0]i(i)(r0)(i)", NULL, NULL }, 845 { MAP_CALL(TextSize), SIG_SCI16, SIGFOR_ALL, "r[r0]i(i)(r0)", NULL, NULL }, 846 { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, 847 { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, 848 { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, 849 { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, 850 { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, 851 { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, 852 { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ir!]", NULL, kUnLoad_workarounds }, 853 // ^ We allow invalid references here (e.g. bug #6600), since they will be invalidated anyway by the call itself 854 { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, 855 { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, 856 857 // Unimplemented SCI0-SCI1.1 unused functions, always mapped to kDummy 858 { MAP_DUMMY(InspectObj), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 859 { MAP_DUMMY(ShowSends), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 860 { MAP_DUMMY(ShowObjs), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 861 { MAP_DUMMY(ShowFree), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 862 { MAP_DUMMY(StackUsage), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 863 { MAP_DUMMY(Profiler), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 864 { MAP_DUMMY(ShiftScreen), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 865 { MAP_DUMMY(ListOps), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 866 // Used by the sysLogger class (e.g. script 952 in GK1CD), a class used to report bugs by Sierra's testers 867 { MAP_DUMMY(ATan), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 868 { MAP_DUMMY(Record), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 869 { MAP_DUMMY(PlayBack), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 870 { MAP_DUMMY(DbugStr), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 871 // Used in Kawa's SCI11+ 872 { MAP_CALL(KawaDbugStr), SIG_SCI11, SIGFOR_ALL, "(.*)", NULL, NULL }, 873 { MAP_CALL(KawaHacks), SIG_SCI11, SIGFOR_ALL, "(.*)", NULL, NULL }, 874 875 // ======================================================================================================= 876 877 #ifdef ENABLE_SCI32 878 // SCI2 Kernel Functions 879 // TODO: whoever knows his way through those calls, fix the signatures. 880 { "TextSize", kTextSize32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "r[r0]i(i)", NULL, NULL }, 881 { MAP_DUMMY(TextColors), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(.*)", NULL, NULL }, 882 { MAP_DUMMY(TextFonts), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(.*)", NULL, NULL }, 883 884 { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL, NULL }, 885 { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, 886 { MAP_CALL(Array), SIG_EVERYWHERE, "i(.*)", kArray_subops, NULL }, 887 { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, 888 { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL }, 889 { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, 890 { "DisposeTextBitmap", kBitmapDestroy, SIG_SCI2, SIGFOR_ALL, "[r!]", NULL, NULL }, 891 { MAP_CALL(FrameOut), SIG_EVERYWHERE, "(i)", NULL, kFrameOut_workarounds }, 892 { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, 893 { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, 894 { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, 895 { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, 896 { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, 897 { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, 898 { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, 899 { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "l[o0]", NULL, NULL }, 900 // kMessageBox is used only by KQ7 1.51 901 { MAP_CALL(MessageBox), SIG_SCI32, SIGFOR_ALL, "rri", NULL, NULL }, 902 { "OnMe", kIsOnMe, SIG_EVERYWHERE, "iioi", NULL, NULL }, 903 // Purge is used by the memory manager in SSCI to ensure that X number of bytes (the so called "unmovable 904 // memory") are available when the current room changes. This is similar to the SCI0-SCI1.1 FlushResources 905 // call, with the added functionality of ensuring that a specific amount of memory is available. We have 906 // our own memory manager and garbage collector, thus we simply call FlushResources, which in turn invokes 907 // our garbage collector (i.e. the SCI0-SCI1.1 semantics). 908 { "Purge", kFlushResources, SIG_EVERYWHERE, "i", NULL, NULL }, 909 { MAP_CALL(SetShowStyle), SIG_THRU_SCI21MID, SIGFOR_ALL, "ioiiiii([ri])(i)", NULL, NULL }, 910 { MAP_CALL(SetShowStyle), SIG_SCI21LATE, SIGFOR_ALL, "ioiiiii([ri])([ri])(i)", NULL, NULL }, 911 { MAP_CALL(SetShowStyle), SIG_SCI3, SIGFOR_ALL, "ioiiiiii(r)(i)", NULL, NULL }, 912 { MAP_CALL(String), SIG_EVERYWHERE, "(.*)", kString_subops, NULL }, 913 { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL }, 914 { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, 915 { MAP_CALL(ObjectIntersect), SIG_EVERYWHERE, "oo", NULL, NULL }, 916 { MAP_CALL(EditText), SIG_EVERYWHERE, "o", NULL, NULL }, 917 { MAP_CALL(MakeSaveCatName), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "rr", NULL, NULL }, 918 { MAP_CALL(MakeSaveFileName), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "rri", NULL, NULL }, 919 { MAP_CALL(SetScroll), SIG_EVERYWHERE, "oiiii(i)(i)", NULL, NULL }, 920 { MAP_CALL(PalCycle), SIG_EVERYWHERE, "(.*)", kPalCycle_subops, NULL }, 921 922 // SCI2 Empty functions 923 924 // Debug function used to track resources 925 { MAP_EMPTY(ResourceTrack), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 926 // Future TODO: This call is used in the floppy version of QFG4 to add 927 // vibration to exotic mice with force feedback, such as the Logitech 928 // Cyberman and Wingman mice. Since this is only used for very exotic 929 // hardware and we have no direct and cross-platform way of communicating 930 // with them via SDL, plus we would probably need to make changes to common 931 // code, this call is mapped to an empty function for now as it's a rare 932 // feature not worth the effort. 933 { MAP_EMPTY(VibrateMouse), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 934 935 // Unused / debug SCI2 unused functions, always mapped to kDummy 936 937 // AddMagnify/DeleteMagnify are both called by script 64979 (the Magnifier 938 // object) in GK1 only. There is also an associated empty magnifier view 939 // (view 1), however, it doesn't seem to be used anywhere, as all the 940 // magnifier closeups (e.g. in scene 470) are normal views. Thus, these 941 // are marked as dummy, so if they're ever used the engine will error out. 942 { MAP_DUMMY(AddMagnify), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 943 { MAP_DUMMY(DeleteMagnify), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 944 { MAP_DUMMY(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, 945 { MAP_DUMMY(InspectObject), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 946 // Profiler (same as SCI0-SCI1.1) 947 // Record (same as SCI0-SCI1.1) 948 // PlayBack (same as SCI0-SCI1.1) 949 { MAP_DUMMY(MonoOut), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 950 { MAP_DUMMY(SetFatalStr), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 951 { MAP_DUMMY(IntegrityChecking),SIG_EVERYWHERE, "(.*)", NULL, NULL }, 952 { MAP_DUMMY(CheckIntegrity), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 953 { MAP_DUMMY(MarkMemory), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 954 { MAP_DUMMY(GetHighItemPri), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 955 { MAP_DUMMY(ShowStylePercent), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 956 { MAP_DUMMY(InvertRect), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(.*)", NULL, NULL }, 957 { MAP_DUMMY(InputText), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 958 { MAP_CALL(TextWidth), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri", NULL, NULL }, 959 { MAP_CALL(PointSize), SIG_THRU_SCI21EARLY, SIGFOR_ALL, "i", NULL, NULL }, 960 961 // SCI2.1 Kernel Functions 962 { "CheckCDisc", kCheckCD, SIG_SCI21EARLY, SIGFOR_ALL, "(i)", NULL, NULL }, 963 { "GetSaveCDisc", kGetSavedCD, SIG_SCI21EARLY, SIGFOR_ALL, "", NULL, NULL }, 964 { MAP_CALL(CD), SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)", kCD_subops, NULL }, 965 { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iioi", NULL, NULL }, 966 { MAP_CALL(List), SIG_SINCE_SCI21, SIGFOR_ALL, "(.*)", kList_subops, NULL }, 967 { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, 968 { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", kPlayVMD_subops, NULL }, 969 { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", kRobot_subops, NULL }, 970 { MAP_CALL(Save), SIG_EVERYWHERE, "i(.*)", kSave_subops, NULL }, 971 { MAP_CALL(Text), SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)", kText_subops, NULL }, 972 { MAP_CALL(AddPicAt), SIG_EVERYWHERE, "oiii(i)(i)", NULL, NULL }, 973 { MAP_CALL(GetWindowsOption), SIG_EVERYWHERE, "i", NULL, NULL }, 974 { MAP_CALL(WinHelp), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 975 { MAP_CALL(GetConfig), SIG_EVERYWHERE, "ro", NULL, NULL }, 976 { MAP_CALL(GetSierraProfileInt), SIG_EVERYWHERE, "rri", NULL, NULL }, 977 { MAP_CALL(CelInfo), SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)", kCelInfo_subops, NULL }, 978 { MAP_CALL(SetLanguage), SIG_SINCE_SCI21MID, SIGFOR_ALL, "r", NULL, NULL }, 979 { MAP_CALL(ScrollWindow), SIG_EVERYWHERE, "i(.*)", kScrollWindow_subops, NULL }, 980 { MAP_CALL(SetFontRes), SIG_SCI21EARLY, SIGFOR_ALL, "ii", NULL, NULL }, 981 { MAP_CALL(Font), SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)", kFont_subops, NULL }, 982 { MAP_CALL(Bitmap), SIG_EVERYWHERE, "(.*)", kBitmap_subops, NULL }, 983 { MAP_CALL(AddLine), SIG_EVERYWHERE, "oiiii(iiiii)", NULL, NULL }, 984 // The first argument is a ScreenItem instance ID that is created by the 985 // engine, not the VM; as a result, in ScummVM, this argument looks like 986 // an integer and not an object, although it is an object reference. 987 { MAP_CALL(UpdateLine), SIG_EVERYWHERE, "ioiiii(iiiii)", NULL, NULL }, 988 { MAP_CALL(DeleteLine), SIG_EVERYWHERE, "io", NULL, NULL }, 989 990 // SCI2.1 Empty Functions 991 992 // Debug function, used in of Shivers (demo and full). It's marked as a 993 // stub in the original interpreters, but it gets called by the game scripts. 994 // Usually, it gets called with a string (which is the output format) and a 995 // variable number of parameters 996 { MAP_CALL(PrintDebug), SIG_SCI32, SIGFOR_ALL, "r(.*)", NULL, NULL }, 997 998 // SetWindowsOption is used to set Windows specific options, like for example the title bar visibility of 999 // the game window in Phantasmagoria 2. We ignore these settings completely. 1000 { MAP_EMPTY(SetWindowsOption), SIG_EVERYWHERE, "ii", NULL, NULL }, 1001 1002 // Debug function called whenever the current room changes 1003 { MAP_EMPTY(NewRoom), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1004 1005 // Unused / debug SCI2.1 unused functions, always mapped to kDummy 1006 1007 // The debug functions are called from the inbuilt debugger or polygon 1008 // editor in SCI2.1 games. Related objects are: PEditor, EditablePolygon, 1009 // aeDisplayClass and scalerCode 1010 { MAP_DUMMY(FindSelector), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1011 { MAP_DUMMY(FindClass), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1012 { MAP_DUMMY(CelRect), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1013 { MAP_DUMMY(BaseLineSpan), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1014 { MAP_CALL(CelLink), SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)", kCelLink_subops, NULL }, 1015 { MAP_DUMMY(AddPolygon), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1016 { MAP_DUMMY(DeletePolygon), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1017 { MAP_DUMMY(UpdatePolygon), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1018 { MAP_DUMMY(Table), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1019 { MAP_DUMMY(LoadChunk), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1020 { MAP_DUMMY(Priority), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1021 { MAP_CALL(WinDLL), SIG_SINCE_SCI21MID, SIGFOR_ALL, "ir(r)", NULL, NULL }, 1022 { MAP_DUMMY(DeletePic), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1023 { MAP_DUMMY(GetSierraProfileString), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1024 1025 // Unused / debug functions in the in-between SCI2.1 interpreters 1026 { MAP_DUMMY(PreloadResource), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1027 { MAP_DUMMY(TestPoly), SIG_EVERYWHERE, "(.*)", NULL, NULL }, 1028 1029 // Used by Phantasmagoria 1, script 64981 (used in the chase scene) 1030 { MAP_CALL(SetHotRectangles), SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(r)", NULL, NULL }, 1031 1032 // Used by SQ6 to scroll through the inventory via the up/down buttons 1033 { MAP_CALL(MovePlaneItems), SIG_SINCE_SCI21, SIGFOR_ALL, "oii(i)", NULL, NULL }, 1034 1035 { MAP_CALL(SetPalStyleRange), SIG_EVERYWHERE, "ii", NULL, NULL }, 1036 1037 { MAP_CALL(MorphOn), SIG_EVERYWHERE, "", NULL, NULL }, 1038 1039 // SCI3 Kernel Functions 1040 { MAP_EMPTY(Minimize), SIG_SCI3, SIGFOR_ALL, "(.*)", NULL, NULL }, 1041 { MAP_CALL(PlayDuck), SIG_SCI3, SIGFOR_ALL, "(.*)", kPlayDuck_subops,NULL }, 1042 { MAP_CALL(WebConnect), SIG_SCI3, SIGFOR_ALL, "(r)", NULL, NULL }, 1043 { MAP_CALL(WinExec), SIG_SCI3, SIGFOR_ALL, "r", NULL, NULL }, 1044 #endif 1045 1046 { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } 1047 }; 1048 1049 /** Default kernel name table. */ 1050 static const char *const s_defaultKernelNames[] = { 1051 /*0x00*/ "Load", 1052 /*0x01*/ "UnLoad", 1053 /*0x02*/ "ScriptID", 1054 /*0x03*/ "DisposeScript", 1055 /*0x04*/ "Clone", 1056 /*0x05*/ "DisposeClone", 1057 /*0x06*/ "IsObject", 1058 /*0x07*/ "RespondsTo", 1059 /*0x08*/ "DrawPic", 1060 /*0x09*/ "Show", 1061 /*0x0a*/ "PicNotValid", 1062 /*0x0b*/ "Animate", 1063 /*0x0c*/ "SetNowSeen", 1064 /*0x0d*/ "NumLoops", 1065 /*0x0e*/ "NumCels", 1066 /*0x0f*/ "CelWide", 1067 /*0x10*/ "CelHigh", 1068 /*0x11*/ "DrawCel", 1069 /*0x12*/ "AddToPic", 1070 /*0x13*/ "NewWindow", 1071 /*0x14*/ "GetPort", 1072 /*0x15*/ "SetPort", 1073 /*0x16*/ "DisposeWindow", 1074 /*0x17*/ "DrawControl", 1075 /*0x18*/ "HiliteControl", 1076 /*0x19*/ "EditControl", 1077 /*0x1a*/ "TextSize", 1078 /*0x1b*/ "Display", 1079 /*0x1c*/ "GetEvent", 1080 /*0x1d*/ "GlobalToLocal", 1081 /*0x1e*/ "LocalToGlobal", 1082 /*0x1f*/ "MapKeyToDir", 1083 /*0x20*/ "DrawMenuBar", 1084 /*0x21*/ "MenuSelect", 1085 /*0x22*/ "AddMenu", 1086 /*0x23*/ "DrawStatus", 1087 /*0x24*/ "Parse", 1088 /*0x25*/ "Said", 1089 /*0x26*/ "SetSynonyms", // Portrait (KQ6 hires) 1090 /*0x27*/ "HaveMouse", 1091 /*0x28*/ "SetCursor", 1092 // FOpen (SCI0) 1093 // FPuts (SCI0) 1094 // FGets (SCI0) 1095 // FClose (SCI0) 1096 /*0x29*/ "SaveGame", 1097 /*0x2a*/ "RestoreGame", 1098 /*0x2b*/ "RestartGame", 1099 /*0x2c*/ "GameIsRestarting", 1100 /*0x2d*/ "DoSound", 1101 /*0x2e*/ "NewList", 1102 /*0x2f*/ "DisposeList", 1103 /*0x30*/ "NewNode", 1104 /*0x31*/ "FirstNode", 1105 /*0x32*/ "LastNode", 1106 /*0x33*/ "EmptyList", 1107 /*0x34*/ "NextNode", 1108 /*0x35*/ "PrevNode", 1109 /*0x36*/ "NodeValue", 1110 /*0x37*/ "AddAfter", 1111 /*0x38*/ "AddToFront", 1112 /*0x39*/ "AddToEnd", 1113 /*0x3a*/ "FindKey", 1114 /*0x3b*/ "DeleteKey", 1115 /*0x3c*/ "Random", 1116 /*0x3d*/ "Abs", 1117 /*0x3e*/ "Sqrt", 1118 /*0x3f*/ "GetAngle", 1119 /*0x40*/ "GetDistance", 1120 /*0x41*/ "Wait", 1121 /*0x42*/ "GetTime", 1122 /*0x43*/ "StrEnd", 1123 /*0x44*/ "StrCat", 1124 /*0x45*/ "StrCmp", 1125 /*0x46*/ "StrLen", 1126 /*0x47*/ "StrCpy", 1127 /*0x48*/ "Format", 1128 /*0x49*/ "GetFarText", 1129 /*0x4a*/ "ReadNumber", 1130 /*0x4b*/ "BaseSetter", 1131 /*0x4c*/ "DirLoop", 1132 /*0x4d*/ "CanBeHere", // CantBeHere in newer SCI versions 1133 /*0x4e*/ "OnControl", 1134 /*0x4f*/ "InitBresen", 1135 /*0x50*/ "DoBresen", 1136 /*0x51*/ "Platform", // DoAvoider (SCI0) 1137 /*0x52*/ "SetJump", 1138 /*0x53*/ "SetDebug", // for debugging 1139 /*0x54*/ "InspectObj", // for debugging 1140 /*0x55*/ "ShowSends", // for debugging 1141 /*0x56*/ "ShowObjs", // for debugging 1142 /*0x57*/ "ShowFree", // for debugging 1143 /*0x58*/ "MemoryInfo", 1144 /*0x59*/ "StackUsage", // for debugging 1145 /*0x5a*/ "Profiler", // for debugging 1146 /*0x5b*/ "GetMenu", 1147 /*0x5c*/ "SetMenu", 1148 /*0x5d*/ "GetSaveFiles", 1149 /*0x5e*/ "GetCWD", 1150 /*0x5f*/ "CheckFreeSpace", 1151 /*0x60*/ "ValidPath", 1152 /*0x61*/ "CoordPri", 1153 /*0x62*/ "StrAt", 1154 /*0x63*/ "DeviceInfo", 1155 /*0x64*/ "GetSaveDir", 1156 /*0x65*/ "CheckSaveGame", 1157 /*0x66*/ "ShakeScreen", 1158 /*0x67*/ "FlushResources", 1159 /*0x68*/ "SinMult", 1160 /*0x69*/ "CosMult", 1161 /*0x6a*/ "SinDiv", 1162 /*0x6b*/ "CosDiv", 1163 /*0x6c*/ "Graph", 1164 /*0x6d*/ "Joystick", 1165 // End of kernel function table for SCI0 1166 /*0x6e*/ "ShiftScreen", // never called? 1167 /*0x6f*/ "Palette", 1168 /*0x70*/ "MemorySegment", 1169 /*0x71*/ "Intersections", // MoveCursor (SCI1 late), PalVary (SCI1.1) 1170 /*0x72*/ "Memory", 1171 /*0x73*/ "ListOps", // never called? 1172 /*0x74*/ "FileIO", 1173 /*0x75*/ "DoAudio", 1174 /*0x76*/ "DoSync", 1175 /*0x77*/ "AvoidPath", 1176 /*0x78*/ "Sort", // StrSplit (SCI01) 1177 /*0x79*/ "ATan", // never called? 1178 /*0x7a*/ "Lock", 1179 /*0x7b*/ "StrSplit", 1180 /*0x7c*/ "GetMessage", // Message (SCI1.1) 1181 /*0x7d*/ "IsItSkip", 1182 /*0x7e*/ "MergePoly", 1183 /*0x7f*/ "ResCheck", 1184 /*0x80*/ "AssertPalette", 1185 /*0x81*/ "TextColors", 1186 /*0x82*/ "TextFonts", 1187 /*0x83*/ "Record", // for debugging 1188 /*0x84*/ "PlayBack", // for debugging 1189 /*0x85*/ "ShowMovie", 1190 /*0x86*/ "SetVideoMode", 1191 /*0x87*/ "SetQuitStr", 1192 /*0x88*/ "DbugStr", // for debugging 1193 /*0x89*/ "Empty", 1194 /*0x8a*/ "Empty" 1195 }; 1196 1197 #ifdef ENABLE_SCI32 1198 1199 // NOTE: 0x72-0x79, 0x85-0x86, 0x88 are from the GK2 demo (which has debug support) and are 1200 // just Dummy in other SCI2 games. 1201 static const char *const sci2_default_knames[] = { 1202 /*0x00*/ "Load", 1203 /*0x01*/ "UnLoad", 1204 /*0x02*/ "ScriptID", 1205 /*0x03*/ "DisposeScript", 1206 /*0x04*/ "Lock", 1207 /*0x05*/ "ResCheck", 1208 /*0x06*/ "Purge", 1209 /*0x07*/ "Clone", 1210 /*0x08*/ "DisposeClone", 1211 /*0x09*/ "RespondsTo", 1212 /*0x0a*/ "SetNowSeen", 1213 /*0x0b*/ "NumLoops", 1214 /*0x0c*/ "NumCels", 1215 /*0x0d*/ "CelWide", 1216 /*0x0e*/ "CelHigh", 1217 /*0x0f*/ "GetHighPlanePri", 1218 /*0x10*/ "GetHighItemPri", // unused function 1219 /*0x11*/ "ShakeScreen", 1220 /*0x12*/ "OnMe", 1221 /*0x13*/ "ShowMovie", 1222 /*0x14*/ "SetVideoMode", 1223 /*0x15*/ "AddScreenItem", 1224 /*0x16*/ "DeleteScreenItem", 1225 /*0x17*/ "UpdateScreenItem", 1226 /*0x18*/ "FrameOut", 1227 /*0x19*/ "AddPlane", 1228 /*0x1a*/ "DeletePlane", 1229 /*0x1b*/ "UpdatePlane", 1230 /*0x1c*/ "RepaintPlane", // unused function 1231 /*0x1d*/ "SetShowStyle", 1232 /*0x1e*/ "ShowStylePercent", // unused function 1233 /*0x1f*/ "SetScroll", 1234 /*0x20*/ "AddMagnify", 1235 /*0x21*/ "DeleteMagnify", 1236 /*0x22*/ "IsHiRes", 1237 /*0x23*/ "Graph", // Robot in early SCI2.1 games with a SCI2 kernel table 1238 /*0x24*/ "InvertRect", // only in SCI2, not used in any SCI2 game 1239 /*0x25*/ "TextSize", 1240 /*0x26*/ "Message", 1241 /*0x27*/ "TextColors", 1242 /*0x28*/ "TextFonts", 1243 /*0x29*/ "Dummy", 1244 /*0x2a*/ "SetQuitStr", 1245 /*0x2b*/ "EditText", 1246 /*0x2c*/ "InputText", // unused function 1247 /*0x2d*/ "CreateTextBitmap", 1248 /*0x2e*/ "DisposeTextBitmap", // Priority in early SCI2.1 games with a SCI2 kernel table 1249 /*0x2f*/ "GetEvent", 1250 /*0x30*/ "GlobalToLocal", 1251 /*0x31*/ "LocalToGlobal", 1252 /*0x32*/ "MapKeyToDir", 1253 /*0x33*/ "HaveMouse", 1254 /*0x34*/ "SetCursor", 1255 /*0x35*/ "VibrateMouse", 1256 /*0x36*/ "SaveGame", 1257 /*0x37*/ "RestoreGame", 1258 /*0x38*/ "RestartGame", 1259 /*0x39*/ "GameIsRestarting", 1260 /*0x3a*/ "MakeSaveCatName", 1261 /*0x3b*/ "MakeSaveFileName", 1262 /*0x3c*/ "GetSaveFiles", 1263 /*0x3d*/ "GetSaveDir", 1264 /*0x3e*/ "CheckSaveGame", 1265 /*0x3f*/ "CheckFreeSpace", 1266 /*0x40*/ "DoSound", 1267 /*0x41*/ "DoAudio", 1268 /*0x42*/ "DoSync", 1269 /*0x43*/ "NewList", 1270 /*0x44*/ "DisposeList", 1271 /*0x45*/ "NewNode", 1272 /*0x46*/ "FirstNode", 1273 /*0x47*/ "LastNode", 1274 /*0x48*/ "EmptyList", 1275 /*0x49*/ "NextNode", 1276 /*0x4a*/ "PrevNode", 1277 /*0x4b*/ "NodeValue", 1278 /*0x4c*/ "AddAfter", 1279 /*0x4d*/ "AddToFront", 1280 /*0x4e*/ "AddToEnd", 1281 /*0x4f*/ "Dummy", 1282 /*0x50*/ "Dummy", 1283 /*0x51*/ "FindKey", 1284 /*0x52*/ "Dummy", 1285 /*0x53*/ "Dummy", 1286 /*0x54*/ "Dummy", 1287 /*0x55*/ "DeleteKey", 1288 /*0x56*/ "Dummy", 1289 /*0x57*/ "Dummy", 1290 /*0x58*/ "ListAt", 1291 /*0x59*/ "ListIndexOf", 1292 /*0x5a*/ "ListEachElementDo", 1293 /*0x5b*/ "ListFirstTrue", 1294 /*0x5c*/ "ListAllTrue", 1295 /*0x5d*/ "Random", 1296 /*0x5e*/ "Abs", 1297 /*0x5f*/ "Sqrt", 1298 /*0x60*/ "GetAngle", 1299 /*0x61*/ "GetDistance", 1300 /*0x62*/ "ATan", 1301 /*0x63*/ "SinMult", 1302 /*0x64*/ "CosMult", 1303 /*0x65*/ "SinDiv", 1304 /*0x66*/ "CosDiv", 1305 /*0x67*/ "GetTime", 1306 /*0x68*/ "Platform", 1307 /*0x69*/ "BaseSetter", 1308 /*0x6a*/ "DirLoop", 1309 /*0x6b*/ "CantBeHere", 1310 /*0x6c*/ "InitBresen", 1311 /*0x6d*/ "DoBresen", 1312 /*0x6e*/ "SetJump", 1313 /*0x6f*/ "AvoidPath", 1314 /*0x70*/ "InPolygon", 1315 /*0x71*/ "MergePoly", 1316 /*0x72*/ "SetDebug", 1317 /*0x73*/ "InspectObject", // for debugging 1318 /*0x74*/ "MemoryInfo", 1319 /*0x75*/ "Profiler", // for debugging 1320 /*0x76*/ "Record", // for debugging 1321 /*0x77*/ "PlayBack", // for debugging 1322 /*0x78*/ "MonoOut", // for debugging 1323 /*0x79*/ "SetFatalStr", // for debugging 1324 /*0x7a*/ "GetCWD", 1325 /*0x7b*/ "ValidPath", 1326 /*0x7c*/ "FileIO", 1327 /*0x7d*/ "Dummy", 1328 /*0x7e*/ "DeviceInfo", 1329 /*0x7f*/ "Palette", 1330 /*0x80*/ "PalVary", 1331 /*0x81*/ "PalCycle", 1332 /*0x82*/ "Array", 1333 /*0x83*/ "String", 1334 /*0x84*/ "RemapColors", 1335 /*0x85*/ "IntegrityChecking", // for debugging 1336 /*0x86*/ "CheckIntegrity", // for debugging 1337 /*0x87*/ "ObjectIntersect", 1338 /*0x88*/ "MarkMemory", // for debugging 1339 /*0x89*/ "TextWidth", 1340 /*0x8a*/ "PointSize", 1341 1342 /*0x8b*/ "AddLine", 1343 /*0x8c*/ "DeleteLine", 1344 /*0x8d*/ "UpdateLine", 1345 /*0x8e*/ "AddPolygon", 1346 /*0x8f*/ "DeletePolygon", 1347 /*0x90*/ "UpdatePolygon", 1348 /*0x91*/ "Bitmap", 1349 /*0x92*/ "ScrollWindow", 1350 /*0x93*/ "SetFontRes", 1351 /*0x94*/ "MovePlaneItems", 1352 /*0x95*/ "PreloadResource", 1353 /*0x96*/ "Dummy", 1354 /*0x97*/ "ResourceTrack", 1355 /*0x98*/ "CheckCDisc", 1356 /*0x99*/ "GetSaveCDisc", 1357 /*0x9a*/ "TestPoly", 1358 /*0x9b*/ "WinHelp", 1359 /*0x9c*/ "LoadChunk", 1360 /*0x9d*/ "SetPalStyleRange", 1361 /*0x9e*/ "AddPicAt", 1362 /*0x9f*/ "MessageBox" 1363 }; 1364 1365 static const char *const sci21_default_knames[] = { 1366 /*0x00*/ "Load", 1367 /*0x01*/ "UnLoad", 1368 /*0x02*/ "ScriptID", 1369 /*0x03*/ "DisposeScript", 1370 /*0x04*/ "Lock", 1371 /*0x05*/ "ResCheck", 1372 /*0x06*/ "Purge", 1373 /*0x07*/ "SetLanguage", 1374 /*0x08*/ "Dummy", 1375 /*0x09*/ "Dummy", 1376 /*0x0a*/ "Clone", 1377 /*0x0b*/ "DisposeClone", 1378 /*0x0c*/ "RespondsTo", 1379 /*0x0d*/ "FindSelector", 1380 /*0x0e*/ "FindClass", 1381 /*0x0f*/ "Dummy", 1382 /*0x10*/ "Dummy", 1383 /*0x11*/ "Dummy", 1384 /*0x12*/ "Dummy", 1385 /*0x13*/ "Dummy", 1386 /*0x14*/ "SetNowSeen", 1387 /*0x15*/ "NumLoops", 1388 /*0x16*/ "NumCels", 1389 /*0x17*/ "IsOnMe", 1390 /*0x18*/ "AddMagnify", // dummy in SCI3 1391 /*0x19*/ "DeleteMagnify", // dummy in SCI3 1392 /*0x1a*/ "CelRect", 1393 /*0x1b*/ "BaseLineSpan", 1394 /*0x1c*/ "CelWide", 1395 /*0x1d*/ "CelHigh", 1396 /*0x1e*/ "AddScreenItem", 1397 /*0x1f*/ "DeleteScreenItem", 1398 /*0x20*/ "UpdateScreenItem", 1399 /*0x21*/ "FrameOut", 1400 /*0x22*/ "CelInfo", 1401 /*0x23*/ "Bitmap", 1402 /*0x24*/ "CelLink", 1403 /*0x25*/ "Dummy", 1404 /*0x26*/ "Dummy", 1405 /*0x27*/ "Dummy", 1406 /*0x28*/ "AddPlane", 1407 /*0x29*/ "DeletePlane", 1408 /*0x2a*/ "UpdatePlane", 1409 /*0x2b*/ "RepaintPlane", 1410 /*0x2c*/ "GetHighPlanePri", 1411 /*0x2d*/ "GetHighItemPri", // unused function 1412 /*0x2e*/ "SetShowStyle", 1413 /*0x2f*/ "ShowStylePercent", // unused function 1414 /*0x30*/ "SetScroll", // dummy in SCI3 1415 /*0x31*/ "MovePlaneItems", 1416 /*0x32*/ "ShakeScreen", 1417 /*0x33*/ "Dummy", 1418 /*0x34*/ "Dummy", 1419 /*0x35*/ "Dummy", 1420 /*0x36*/ "Dummy", 1421 /*0x37*/ "IsHiRes", 1422 /*0x38*/ "SetVideoMode", 1423 /*0x39*/ "ShowMovie", // dummy in SCI3 1424 /*0x3a*/ "Robot", 1425 /*0x3b*/ "CreateTextBitmap", 1426 /*0x3c*/ "Random", 1427 /*0x3d*/ "Abs", 1428 /*0x3e*/ "Sqrt", 1429 /*0x3f*/ "GetAngle", 1430 /*0x40*/ "GetDistance", 1431 /*0x41*/ "ATan", 1432 /*0x42*/ "SinMult", 1433 /*0x43*/ "CosMult", 1434 /*0x44*/ "SinDiv", 1435 /*0x45*/ "CosDiv", 1436 /*0x46*/ "Text", 1437 /*0x47*/ "Dummy", 1438 /*0x48*/ "Message", 1439 /*0x49*/ "Font", 1440 /*0x4a*/ "EditText", 1441 /*0x4b*/ "InputText", // unused function 1442 /*0x4c*/ "ScrollWindow", // Dummy in SCI3 1443 /*0x4d*/ "Dummy", 1444 /*0x4e*/ "Dummy", 1445 /*0x4f*/ "Dummy", // Replaced with kWait for Hoyle5 in ScummVM 1446 /*0x50*/ "GetEvent", 1447 /*0x51*/ "GlobalToLocal", 1448 /*0x52*/ "LocalToGlobal", 1449 /*0x53*/ "MapKeyToDir", 1450 /*0x54*/ "HaveMouse", 1451 /*0x55*/ "SetCursor", 1452 /*0x56*/ "VibrateMouse", // Dummy in SCI3 1453 /*0x57*/ "Dummy", 1454 /*0x58*/ "Dummy", 1455 /*0x59*/ "Dummy", 1456 /*0x5a*/ "List", 1457 /*0x5b*/ "Array", 1458 /*0x5c*/ "String", 1459 /*0x5d*/ "FileIO", 1460 /*0x5e*/ "BaseSetter", 1461 /*0x5f*/ "DirLoop", 1462 /*0x60*/ "CantBeHere", 1463 /*0x61*/ "InitBresen", 1464 /*0x62*/ "DoBresen", 1465 /*0x63*/ "SetJump", 1466 /*0x64*/ "AvoidPath", // dummy in SCI3 1467 /*0x65*/ "InPolygon", 1468 /*0x66*/ "MergePoly", // dummy in SCI3 1469 /*0x67*/ "ObjectIntersect", 1470 /*0x68*/ "Dummy", 1471 /*0x69*/ "MemoryInfo", 1472 /*0x6a*/ "DeviceInfo", 1473 /*0x6b*/ "Palette", 1474 /*0x6c*/ "PalVary", 1475 /*0x6d*/ "PalCycle", 1476 /*0x6e*/ "RemapColors", 1477 /*0x6f*/ "AddLine", 1478 /*0x70*/ "DeleteLine", 1479 /*0x71*/ "UpdateLine", 1480 /*0x72*/ "AddPolygon", 1481 /*0x73*/ "DeletePolygon", 1482 /*0x74*/ "UpdatePolygon", 1483 /*0x75*/ "DoSound", 1484 /*0x76*/ "DoAudio", 1485 /*0x77*/ "DoSync", 1486 /*0x78*/ "Save", 1487 /*0x79*/ "GetTime", 1488 /*0x7a*/ "Platform", 1489 /*0x7b*/ "CD", 1490 /*0x7c*/ "SetQuitStr", 1491 /*0x7d*/ "GetConfig", 1492 /*0x7e*/ "Table", 1493 /*0x7f*/ "WinHelp", // Windows only 1494 /*0x80*/ "Dummy", 1495 /*0x81*/ "Empty", // called when clicking the On-line Help button in Phant2 control panel 1496 /*0x82*/ "Dummy", 1497 /*0x83*/ "PrintDebug", // debug function, used by Shivers (demo and full) 1498 /*0x84*/ "Dummy", 1499 /*0x85*/ "Dummy", 1500 /*0x86*/ "Dummy", 1501 /*0x87*/ "Dummy", 1502 /*0x88*/ "Dummy", 1503 /*0x89*/ "Dummy", 1504 /*0x8a*/ "LoadChunk", 1505 /*0x8b*/ "SetPalStyleRange", 1506 /*0x8c*/ "AddPicAt", 1507 /*0x8d*/ "Dummy", // MessageBox in SCI3 1508 /*0x8e*/ "NewRoom", // debug function 1509 /*0x8f*/ "Dummy", 1510 /*0x90*/ "Priority", 1511 /*0x91*/ "MorphOn", 1512 /*0x92*/ "PlayVMD", 1513 /*0x93*/ "SetHotRectangles", 1514 /*0x94*/ "MulDiv", 1515 /*0x95*/ "GetSierraProfileInt", // , Windows only 1516 /*0x96*/ "GetSierraProfileString", // , Windows only 1517 /*0x97*/ "SetWindowsOption", // Windows only 1518 /*0x98*/ "GetWindowsOption", // Windows only 1519 /*0x99*/ "WinDLL", // Windows only 1520 /*0x9a*/ "Dummy", 1521 /*0x9b*/ "Dummy", // Minimize in SCI3 1522 /*0x9c*/ "DeletePic", 1523 // == SCI3 only =============== 1524 /*0x9d*/ "Dummy", 1525 /*0x9e*/ "WebConnect", 1526 /*0x9f*/ "Dummy", 1527 /*0xa0*/ "PlayDuck", 1528 /*0xa1*/ "WinExec" 1529 }; 1530 1531 #endif 1532 1533 // Base set of opcode formats. They're copied and adjusted slightly in 1534 // script_adjust_opcode_format depending on SCI version. 1535 static const opcode_format g_base_opcode_formats[128][4] = { 1536 // 00 - 03 / bnot, add, sub, mul 1537 {Script_None}, {Script_None}, {Script_None}, {Script_None}, 1538 // 04 - 07 / div, mod, shr, shl 1539 {Script_None}, {Script_None}, {Script_None}, {Script_None}, 1540 // 08 - 0B / xor, and, or, neg 1541 {Script_None}, {Script_None}, {Script_None}, {Script_None}, 1542 // 0C - 0F / not, eq, ne, gt 1543 {Script_None}, {Script_None}, {Script_None}, {Script_None}, 1544 // 10 - 13 / ge, lt, le, ugt 1545 {Script_None}, {Script_None}, {Script_None}, {Script_None}, 1546 // 14 - 17 / uge, ult, ule, bt 1547 {Script_None}, {Script_None}, {Script_None}, {Script_SRelative}, 1548 // 18 - 1B / bnt, jmp, ldi, push 1549 {Script_SRelative}, {Script_SRelative}, {Script_SVariable}, {Script_None}, 1550 // 1C - 1F / pushi, toss, dup, link 1551 {Script_SVariable}, {Script_None}, {Script_None}, {Script_Variable}, 1552 // 20 - 23 / call, callk, callb, calle 1553 {Script_SRelative, Script_Byte}, {Script_Variable, Script_Byte}, {Script_Variable, Script_Byte}, {Script_Variable, Script_SVariable, Script_Byte}, 1554 // 24 - 27 / ret, send, dummy, dummy 1555 {Script_End}, {Script_Byte}, {Script_Invalid}, {Script_Invalid}, 1556 // 28 - 2B / class, dummy, self, super 1557 {Script_Variable}, {Script_Invalid}, {Script_Byte}, {Script_Variable, Script_Byte}, 1558 // 2C - 2F / rest, lea, selfID, dummy 1559 {Script_SVariable}, {Script_SVariable, Script_Variable}, {Script_None}, {Script_Invalid}, 1560 // 30 - 33 / pprev, pToa, aTop, pTos 1561 {Script_None}, {Script_Property}, {Script_Property}, {Script_Property}, 1562 // 34 - 37 / sTop, ipToa, dpToa, ipTos 1563 {Script_Property}, {Script_Property}, {Script_Property}, {Script_Property}, 1564 // 38 - 3B / dpTos, lofsa, lofss, push0 1565 {Script_Property}, {Script_SRelative}, {Script_SRelative}, {Script_None}, 1566 // 3C - 3F / push1, push2, pushSelf, line 1567 {Script_None}, {Script_None}, {Script_None}, {Script_Word}, 1568 // ------------------------------------------------------------------------ 1569 // 40 - 43 / lag, lal, lat, lap 1570 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1571 // 44 - 47 / lsg, lsl, lst, lsp 1572 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1573 // 48 - 4B / lagi, lali, lati, lapi 1574 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1575 // 4C - 4F / lsgi, lsli, lsti, lspi 1576 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1577 // ------------------------------------------------------------------------ 1578 // 50 - 53 / sag, sal, sat, sap 1579 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1580 // 54 - 57 / ssg, ssl, sst, ssp 1581 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1582 // 58 - 5B / sagi, sali, sati, sapi 1583 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1584 // 5C - 5F / ssgi, ssli, ssti, sspi 1585 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1586 // ------------------------------------------------------------------------ 1587 // 60 - 63 / plusag, plusal, plusat, plusap 1588 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1589 // 64 - 67 / plussg, plussl, plusst, plussp 1590 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1591 // 68 - 6B / plusagi, plusali, plusati, plusapi 1592 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1593 // 6C - 6F / plussgi, plussli, plussti, plusspi 1594 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1595 // ------------------------------------------------------------------------ 1596 // 70 - 73 / minusag, minusal, minusat, minusap 1597 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1598 // 74 - 77 / minussg, minussl, minusst, minussp 1599 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1600 // 78 - 7B / minusagi, minusali, minusati, minusapi 1601 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, 1602 // 7C - 7F / minussgi, minussli, minussti, minusspi 1603 {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param} 1604 }; 1605 1606 } // End of namespace Sci 1607 1608 #endif // SCI_ENGINE_KERNEL_TABLES_H 1609