2007-05-30 21:56:52 +00:00
|
|
|
/* 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.
|
2001-10-16 10:01:48 +00:00
|
|
|
*
|
|
|
|
* 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
|
2005-10-18 01:30:26 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2001-10-16 10:01:48 +00:00
|
|
|
*
|
2006-02-11 09:55:41 +00:00
|
|
|
* $URL$
|
|
|
|
* $Id$
|
2001-10-16 10:01:48 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2005-06-24 15:23:51 +00:00
|
|
|
#include "common/stdafx.h"
|
2003-09-11 10:32:15 +00:00
|
|
|
|
2003-12-27 15:22:59 +00:00
|
|
|
#include "common/config-manager.h"
|
|
|
|
|
2003-09-11 10:32:15 +00:00
|
|
|
#include "scumm/actor.h"
|
|
|
|
#include "scumm/charset.h"
|
2006-03-03 15:16:02 +00:00
|
|
|
#include "scumm/file.h"
|
2006-02-20 20:57:26 +00:00
|
|
|
#include "scumm/imuse/imuse.h"
|
2005-05-14 23:28:22 +00:00
|
|
|
#include "scumm/imuse_digi/dimuse.h"
|
|
|
|
#include "scumm/insane/insane.h"
|
2003-09-11 10:32:15 +00:00
|
|
|
#include "scumm/intern.h"
|
|
|
|
#include "scumm/object.h"
|
|
|
|
#include "scumm/resource.h"
|
|
|
|
#include "scumm/scumm.h"
|
2005-05-14 23:28:22 +00:00
|
|
|
#include "scumm/smush/smush_player.h"
|
2003-09-11 10:32:15 +00:00
|
|
|
#include "scumm/sound.h"
|
2005-05-14 22:56:41 +00:00
|
|
|
#include "scumm/util.h"
|
2003-09-11 10:32:15 +00:00
|
|
|
#include "scumm/verbs.h"
|
|
|
|
|
2002-04-21 21:33:47 +00:00
|
|
|
#include "sound/mididrv.h"
|
2003-06-15 00:54:14 +00:00
|
|
|
#include "sound/mixer.h"
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-10-03 18:33:57 +00:00
|
|
|
namespace Scumm {
|
|
|
|
|
2004-10-19 12:30:42 +00:00
|
|
|
#define OPCODE(x) _OPCODE(ScummEngine_v6, x)
|
2002-11-06 16:44:57 +00:00
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::setupOpcodes() {
|
2002-12-16 12:12:31 +00:00
|
|
|
static const OpcodeEntryV6 opcodes[256] = {
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 00 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_pushByte),
|
|
|
|
OPCODE(o6_pushWord),
|
|
|
|
OPCODE(o6_pushByteVar),
|
|
|
|
OPCODE(o6_pushWordVar),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 04 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteArrayRead),
|
|
|
|
OPCODE(o6_wordArrayRead),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 08 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteArrayIndexedRead),
|
|
|
|
OPCODE(o6_wordArrayIndexedRead),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 0C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_dup),
|
2002-12-22 19:14:53 +00:00
|
|
|
OPCODE(o6_not),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_eq),
|
|
|
|
OPCODE(o6_neq),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 10 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_gt),
|
|
|
|
OPCODE(o6_lt),
|
|
|
|
OPCODE(o6_le),
|
|
|
|
OPCODE(o6_ge),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 14 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_add),
|
|
|
|
OPCODE(o6_sub),
|
|
|
|
OPCODE(o6_mul),
|
|
|
|
OPCODE(o6_div),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 18 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_land),
|
|
|
|
OPCODE(o6_lor),
|
2002-12-23 12:50:38 +00:00
|
|
|
OPCODE(o6_pop),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 1C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 20 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 24 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 28 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 2C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 30 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 34 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 38 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 3C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 40 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_writeByteVar),
|
|
|
|
OPCODE(o6_writeWordVar),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 44 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteArrayWrite),
|
|
|
|
OPCODE(o6_wordArrayWrite),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 48 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteArrayIndexedWrite),
|
|
|
|
OPCODE(o6_wordArrayIndexedWrite),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 4C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteVarInc),
|
|
|
|
OPCODE(o6_wordVarInc),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 50 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteArrayInc),
|
|
|
|
OPCODE(o6_wordArrayInc),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 54 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteVarDec),
|
|
|
|
OPCODE(o6_wordVarDec),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 58 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_byteArrayDec),
|
|
|
|
OPCODE(o6_wordArrayDec),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 5C */
|
2003-11-09 22:12:16 +00:00
|
|
|
OPCODE(o6_if),
|
|
|
|
OPCODE(o6_ifNot),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_startScript),
|
2003-11-09 22:12:16 +00:00
|
|
|
OPCODE(o6_startScriptQuick),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 60 */
|
2003-11-09 22:12:16 +00:00
|
|
|
OPCODE(o6_startObject),
|
|
|
|
OPCODE(o6_drawObject),
|
|
|
|
OPCODE(o6_drawObjectAt),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_drawBlastObject),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 64 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_setBlastObjectWindow),
|
2002-12-24 02:38:41 +00:00
|
|
|
OPCODE(o6_stopObjectCode),
|
|
|
|
OPCODE(o6_stopObjectCode),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_endCutscene),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 68 */
|
2002-12-22 23:26:10 +00:00
|
|
|
OPCODE(o6_cutscene),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_stopMusic),
|
|
|
|
OPCODE(o6_freezeUnfreeze),
|
|
|
|
OPCODE(o6_cursorCommand),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 6C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_breakHere),
|
2003-11-10 08:00:55 +00:00
|
|
|
OPCODE(o6_ifClassOfIs),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_setClass),
|
|
|
|
OPCODE(o6_getState),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 70 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_setState),
|
|
|
|
OPCODE(o6_setOwner),
|
|
|
|
OPCODE(o6_getOwner),
|
|
|
|
OPCODE(o6_jump),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 74 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_startSound),
|
|
|
|
OPCODE(o6_stopSound),
|
|
|
|
OPCODE(o6_startMusic),
|
|
|
|
OPCODE(o6_stopObjectScript),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 78 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_panCameraTo),
|
|
|
|
OPCODE(o6_actorFollowCamera),
|
|
|
|
OPCODE(o6_setCameraAt),
|
|
|
|
OPCODE(o6_loadRoom),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 7C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_stopScript),
|
|
|
|
OPCODE(o6_walkActorToObj),
|
|
|
|
OPCODE(o6_walkActorTo),
|
2003-11-09 22:12:16 +00:00
|
|
|
OPCODE(o6_putActorAtXY),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 80 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_putActorAtObject),
|
|
|
|
OPCODE(o6_faceActor),
|
|
|
|
OPCODE(o6_animateActor),
|
|
|
|
OPCODE(o6_doSentence),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 84 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_pickupObject),
|
|
|
|
OPCODE(o6_loadRoomWithEgo),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_getRandomNumber),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 88 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getRandomNumberRange),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_getActorMoving),
|
2002-12-22 19:14:53 +00:00
|
|
|
OPCODE(o6_isScriptRunning),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 8C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getActorRoom),
|
|
|
|
OPCODE(o6_getObjectX),
|
|
|
|
OPCODE(o6_getObjectY),
|
|
|
|
OPCODE(o6_getObjectOldDir),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 90 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getActorWalkBox),
|
|
|
|
OPCODE(o6_getActorCostume),
|
|
|
|
OPCODE(o6_findInventory),
|
|
|
|
OPCODE(o6_getInventoryCount),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 94 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getVerbFromXY),
|
|
|
|
OPCODE(o6_beginOverride),
|
|
|
|
OPCODE(o6_endOverride),
|
|
|
|
OPCODE(o6_setObjectName),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 98 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_isSoundRunning),
|
|
|
|
OPCODE(o6_setBoxFlags),
|
|
|
|
OPCODE(o6_createBoxMatrix),
|
|
|
|
OPCODE(o6_resourceRoutines),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* 9C */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_roomOps),
|
2002-12-23 15:46:53 +00:00
|
|
|
OPCODE(o6_actorOps),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_verbOps),
|
|
|
|
OPCODE(o6_getActorFromXY),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* A0 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_findObject),
|
|
|
|
OPCODE(o6_pseudoRoom),
|
|
|
|
OPCODE(o6_getActorElevation),
|
|
|
|
OPCODE(o6_getVerbEntrypoint),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* A4 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_arrayOps),
|
|
|
|
OPCODE(o6_saveRestoreVerbs),
|
|
|
|
OPCODE(o6_drawBox),
|
2003-03-02 22:27:32 +00:00
|
|
|
OPCODE(o6_pop),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* A8 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getActorWidth),
|
|
|
|
OPCODE(o6_wait),
|
|
|
|
OPCODE(o6_getActorScaleX),
|
2006-09-09 18:31:32 +00:00
|
|
|
OPCODE(o6_getActorAnimCounter),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* AC */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_soundKludge),
|
|
|
|
OPCODE(o6_isAnyOf),
|
2005-05-28 08:37:44 +00:00
|
|
|
OPCODE(o6_systemOps),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_isActorInBox),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* B0 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_delay),
|
2002-12-26 21:50:13 +00:00
|
|
|
OPCODE(o6_delaySeconds),
|
|
|
|
OPCODE(o6_delayMinutes),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_stopSentence),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* B4 */
|
2003-01-01 17:57:14 +00:00
|
|
|
OPCODE(o6_printLine),
|
2005-06-13 07:09:12 +00:00
|
|
|
OPCODE(o6_printText),
|
2003-01-01 17:57:14 +00:00
|
|
|
OPCODE(o6_printDebug),
|
|
|
|
OPCODE(o6_printSystem),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* B8 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_printActor),
|
|
|
|
OPCODE(o6_printEgo),
|
|
|
|
OPCODE(o6_talkActor),
|
|
|
|
OPCODE(o6_talkEgo),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* BC */
|
2003-11-10 08:00:55 +00:00
|
|
|
OPCODE(o6_dimArray),
|
2002-12-16 12:12:31 +00:00
|
|
|
OPCODE(o6_dummy),
|
2002-12-23 12:50:38 +00:00
|
|
|
OPCODE(o6_startObjectQuick),
|
2003-11-09 22:12:16 +00:00
|
|
|
OPCODE(o6_startScriptQuick2),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* C0 */
|
2003-11-10 08:00:55 +00:00
|
|
|
OPCODE(o6_dim2dimArray),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* C4 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_abs),
|
|
|
|
OPCODE(o6_distObjectObject),
|
|
|
|
OPCODE(o6_distObjectPt),
|
|
|
|
OPCODE(o6_distPtPt),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* C8 */
|
2003-01-06 01:53:38 +00:00
|
|
|
OPCODE(o6_kernelGetFunctions),
|
|
|
|
OPCODE(o6_kernelSetFunctions),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_delayFrames),
|
|
|
|
OPCODE(o6_pickOneOf),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* CC */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_pickOneOfDefault),
|
2003-02-16 14:52:25 +00:00
|
|
|
OPCODE(o6_stampObject),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* D0 */
|
2003-02-18 00:13:24 +00:00
|
|
|
OPCODE(o6_getDateTime),
|
2003-02-14 08:12:45 +00:00
|
|
|
OPCODE(o6_stopTalking),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getAnimateVariable),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* D4 */
|
2003-02-21 00:42:51 +00:00
|
|
|
OPCODE(o6_shuffle),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_jumpToScript),
|
|
|
|
OPCODE(o6_band),
|
|
|
|
OPCODE(o6_bor),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* D8 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_isRoomScriptRunning),
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* DC */
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
2003-02-17 10:14:43 +00:00
|
|
|
OPCODE(o6_findAllObjects),
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* E0 */
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
2004-08-14 15:14:01 +00:00
|
|
|
OPCODE(o6_getPixel),
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
2003-02-17 21:42:33 +00:00
|
|
|
OPCODE(o6_pickVarRandom),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* E4 */
|
2004-02-16 05:53:17 +00:00
|
|
|
OPCODE(o6_setBoxSet),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* E8 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* EC */
|
2002-12-24 00:41:59 +00:00
|
|
|
OPCODE(o6_getActorLayer),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_getObjectNewDir),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* F0 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* F4 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* F8 */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2004-02-07 02:52:27 +00:00
|
|
|
OPCODE(o6_invalid),
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
2002-04-11 17:19:16 +00:00
|
|
|
/* FC */
|
2002-11-06 16:44:57 +00:00
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
|
|
|
OPCODE(o6_invalid),
|
2002-03-05 09:58:12 +00:00
|
|
|
};
|
|
|
|
|
2002-12-16 12:12:31 +00:00
|
|
|
_opcodesV6 = opcodes;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2002-12-22 19:14:53 +00:00
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::executeOpcode(byte i) {
|
2002-12-22 19:14:53 +00:00
|
|
|
OpcodeProcV6 op = _opcodesV6[i].proc;
|
|
|
|
(this->*op) ();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
const char *ScummEngine_v6::getOpcodeDesc(byte i) {
|
2002-12-22 19:14:53 +00:00
|
|
|
return _opcodesV6[i].desc;
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
int ScummEngine_v6::popRoomAndObj(int *room) {
|
2001-12-27 17:51:58 +00:00
|
|
|
int obj;
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7) {
|
2001-12-27 17:51:58 +00:00
|
|
|
obj = pop();
|
|
|
|
*room = getObjectRoom(obj);
|
|
|
|
} else {
|
|
|
|
*room = pop();
|
|
|
|
obj = pop();
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
2006-10-20 19:44:27 +00:00
|
|
|
byte *ScummEngine_v6::defineArray(int array, int type, int dim2, int dim1) {
|
2004-01-19 20:27:31 +00:00
|
|
|
int id;
|
|
|
|
int size;
|
|
|
|
ArrayHeader *ah;
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-08-01 01:54:37 +00:00
|
|
|
assert(0 <= type && type <= 5);
|
2004-01-19 20:27:31 +00:00
|
|
|
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 61) {
|
2004-08-01 02:03:07 +00:00
|
|
|
if (type == kBitArray || type == kNibbleArray)
|
|
|
|
type = kByteArray;
|
2004-06-30 11:03:55 +00:00
|
|
|
} else {
|
2004-08-01 02:03:07 +00:00
|
|
|
// NOTE: The following code turns all arrays except string arrays into
|
|
|
|
// integer arrays. There seems to be no reason for this, and it wastes
|
|
|
|
// space. However, we can't just remove this either, as that would
|
|
|
|
// break savegame compatibility. So do not touch this unless you are
|
2006-10-20 19:44:27 +00:00
|
|
|
// also adding code which updates old savegames, too. And of course
|
2004-08-01 02:03:07 +00:00
|
|
|
// readArray() and writeArray() would have to be updated, too...
|
|
|
|
if (type != kStringArray)
|
|
|
|
type = kIntArray;
|
2004-02-23 04:01:39 +00:00
|
|
|
}
|
2004-01-19 20:27:31 +00:00
|
|
|
|
|
|
|
nukeArray(array);
|
|
|
|
|
|
|
|
id = findFreeArrayId();
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version == 8) {
|
2004-01-19 20:27:31 +00:00
|
|
|
if (array & 0x40000000) {
|
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
if (array & 0x80000000) {
|
|
|
|
error("Can't define bit variable as array pointer");
|
|
|
|
}
|
|
|
|
|
2004-08-01 01:54:37 +00:00
|
|
|
size = (type == kIntArray) ? 4 : 1;
|
2004-01-19 20:27:31 +00:00
|
|
|
} else {
|
|
|
|
if (array & 0x4000) {
|
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
if (array & 0x8000) {
|
|
|
|
error("Can't define bit variable as array pointer");
|
|
|
|
}
|
|
|
|
|
2004-08-01 01:54:37 +00:00
|
|
|
size = (type == kIntArray) ? 2 : 1;
|
2004-01-19 20:27:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
writeVar(array, id);
|
|
|
|
|
|
|
|
size *= dim2 + 1;
|
|
|
|
size *= dim1 + 1;
|
|
|
|
|
2006-09-17 20:36:48 +00:00
|
|
|
ah = (ArrayHeader *)_res->createResource(rtString, id, size + sizeof(ArrayHeader));
|
2004-01-19 20:27:31 +00:00
|
|
|
|
|
|
|
ah->type = TO_LE_16(type);
|
|
|
|
ah->dim1 = TO_LE_16(dim1 + 1);
|
|
|
|
ah->dim2 = TO_LE_16(dim2 + 1);
|
|
|
|
|
2006-10-20 19:44:27 +00:00
|
|
|
return ah->data;
|
2004-01-19 20:27:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScummEngine_v6::nukeArray(int a) {
|
|
|
|
int data;
|
2001-12-27 17:51:58 +00:00
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
data = readVar(a);
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 80)
|
2005-10-14 12:36:46 +00:00
|
|
|
data &= ~0x33539000;
|
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
if (data)
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->nukeResource(rtString, data);
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 60)
|
2004-08-05 09:32:03 +00:00
|
|
|
_arraySlot[data] = 0;
|
2004-01-19 20:27:31 +00:00
|
|
|
|
|
|
|
writeVar(a, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ScummEngine_v6::findFreeArrayId() {
|
2006-09-17 20:36:48 +00:00
|
|
|
byte **addr = _res->address[rtString];
|
2004-01-19 20:27:31 +00:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 1; i < _numArray; i++) {
|
|
|
|
if (!addr[i])
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
error("Out of array pointers, %d max", _numArray);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2004-08-05 09:57:36 +00:00
|
|
|
#define SWAP16(x) x = SWAP_BYTES_16(x)
|
|
|
|
|
2004-11-27 13:13:41 +00:00
|
|
|
ScummEngine_v6::ArrayHeader *ScummEngine_v6::getArray(int array) {
|
2002-07-07 13:14:34 +00:00
|
|
|
ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, readVar(array));
|
2004-01-19 20:27:31 +00:00
|
|
|
if (!ah)
|
|
|
|
return 0;
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2006-10-20 19:44:27 +00:00
|
|
|
// Workaround for a long standing bug where we saved array headers in native
|
|
|
|
// endianness, instead of a fixed endianness. We now always store the
|
|
|
|
// dimensions in little endian byte order. But to stay compatible with older
|
|
|
|
// savegames, we try to detect savegames which were created on a big endian
|
|
|
|
// system and convert them to the proper little endian format on the fly.
|
2004-08-05 09:57:36 +00:00
|
|
|
if ((FROM_LE_16(ah->dim1) & 0xF000) || (FROM_LE_16(ah->dim2) & 0xF000) || (FROM_LE_16(ah->type) & 0xFF00)) {
|
|
|
|
SWAP16(ah->dim1);
|
|
|
|
SWAP16(ah->dim2);
|
|
|
|
SWAP16(ah->type);
|
2004-01-19 20:27:31 +00:00
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
return ah;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ScummEngine_v6::readArray(int array, int idx, int base) {
|
|
|
|
ArrayHeader *ah = getArray(array);
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2004-08-24 05:04:14 +00:00
|
|
|
if (ah == NULL || ah->data == NULL)
|
2002-04-11 17:19:16 +00:00
|
|
|
error("readArray: invalid array %d (%d)", array, readVar(array));
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-08-02 18:32:19 +00:00
|
|
|
// WORKAROUND bug #645711. This is clearly a script bug, as this script
|
|
|
|
// excerpt shows nicely:
|
|
|
|
// ...
|
|
|
|
// [03A7] (5D) if (isAnyOf(array-447[localvar13][localvar14],[0,4])) {
|
|
|
|
// [03BD] (5D) if ((localvar13 != -1) && (localvar14 != -1)) {
|
|
|
|
// [03CF] (B6) printDebug.begin()
|
|
|
|
// ...
|
2006-10-20 19:44:27 +00:00
|
|
|
// So it checks for invalid array indices only *after* using them to access
|
|
|
|
// the array. Ouch.
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_FT && array == 447 && _currentRoom == 95 && vm.slot[_currentScript].number == 2010 && idx == -1 && base == -1) {
|
2004-08-02 18:32:19 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-08-01 01:21:26 +00:00
|
|
|
const int offset = base + idx * FROM_LE_16(ah->dim1);
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2004-08-01 01:21:26 +00:00
|
|
|
if (offset < 0 || offset >= FROM_LE_16(ah->dim1) * FROM_LE_16(ah->dim2)) {
|
|
|
|
error("readArray: array %d out of bounds: [%d,%d] exceeds [%d,%d]",
|
|
|
|
array, base, idx, FROM_LE_16(ah->dim1), FROM_LE_16(ah->dim2));
|
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2006-02-05 15:49:09 +00:00
|
|
|
int val;
|
2004-08-01 02:03:07 +00:00
|
|
|
if (FROM_LE_16(ah->type) != kIntArray) {
|
2006-02-05 15:49:09 +00:00
|
|
|
val = ah->data[offset];
|
2006-02-20 16:51:30 +00:00
|
|
|
} else if (_game.version == 8) {
|
2006-02-05 15:49:09 +00:00
|
|
|
val = (int32)READ_LE_UINT32(ah->data + offset * 4);
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2006-02-05 15:49:09 +00:00
|
|
|
val = (int16)READ_LE_UINT16(ah->data + offset * 2);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2006-02-05 15:49:09 +00:00
|
|
|
return val;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
void ScummEngine_v6::writeArray(int array, int idx, int base, int value) {
|
|
|
|
ArrayHeader *ah = getArray(array);
|
2002-10-18 09:58:16 +00:00
|
|
|
if (!ah)
|
|
|
|
return;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2004-08-01 01:21:26 +00:00
|
|
|
const int offset = base + idx * FROM_LE_16(ah->dim1);
|
|
|
|
|
|
|
|
if (offset < 0 || offset >= FROM_LE_16(ah->dim1) * FROM_LE_16(ah->dim2)) {
|
|
|
|
error("writeArray: array %d out of bounds: [%d,%d] exceeds [%d,%d]",
|
|
|
|
array, base, idx, FROM_LE_16(ah->dim1), FROM_LE_16(ah->dim2));
|
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2004-08-01 02:03:07 +00:00
|
|
|
if (FROM_LE_16(ah->type) != kIntArray) {
|
2004-08-01 01:21:26 +00:00
|
|
|
ah->data[offset] = value;
|
2006-02-20 16:51:30 +00:00
|
|
|
} else if (_game.version == 8) {
|
2004-08-01 01:21:26 +00:00
|
|
|
WRITE_LE_UINT32(ah->data + offset * 4, value);
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2004-08-01 01:21:26 +00:00
|
|
|
WRITE_LE_UINT16(ah->data + offset * 2, value);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-01-19 20:27:31 +00:00
|
|
|
void ScummEngine_v6::readArrayFromIndexFile() {
|
|
|
|
int num;
|
|
|
|
int a, b, c;
|
|
|
|
|
2005-03-30 21:59:12 +00:00
|
|
|
while ((num = _fileHandle->readUint16LE()) != 0) {
|
|
|
|
a = _fileHandle->readUint16LE();
|
|
|
|
b = _fileHandle->readUint16LE();
|
|
|
|
c = _fileHandle->readUint16LE();
|
2004-08-28 14:48:51 +00:00
|
|
|
if (c == kBitArray)
|
2004-08-24 05:04:14 +00:00
|
|
|
defineArray(num, kBitArray, a, b);
|
|
|
|
else
|
|
|
|
defineArray(num, kIntArray, a, b);
|
2004-01-19 20:27:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
int ScummEngine_v6::getStackList(int *args, uint maxnum) {
|
2001-10-16 10:01:48 +00:00
|
|
|
uint num, i;
|
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
for (i = 0; i < maxnum; i++)
|
2001-10-16 10:01:48 +00:00
|
|
|
args[i] = 0;
|
|
|
|
|
|
|
|
num = pop();
|
|
|
|
|
|
|
|
if (num > maxnum)
|
|
|
|
error("Too many items %d in stack list, max %d", num, maxnum);
|
|
|
|
|
|
|
|
i = num;
|
2004-03-15 21:48:54 +00:00
|
|
|
while (i--) {
|
2001-10-16 10:01:48 +00:00
|
|
|
args[i] = pop();
|
|
|
|
}
|
|
|
|
|
|
|
|
return num;
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pushByte() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(fetchScriptByte());
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pushWord() {
|
2002-12-23 00:23:36 +00:00
|
|
|
push(fetchScriptWordSigned());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pushByteVar() {
|
2004-08-23 14:11:53 +00:00
|
|
|
push(readVar(fetchScriptByte()));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pushWordVar() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(readVar(fetchScriptWord()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_invalid() {
|
2006-04-12 14:54:12 +00:00
|
|
|
error("Invalid opcode '%x' at %lx", _opcode, (long)(_scriptPointer - _scriptOrgPointer));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteArrayRead() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int base = pop();
|
|
|
|
push(readArray(fetchScriptByte(), 0, base));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordArrayRead() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int base = pop();
|
|
|
|
push(readArray(fetchScriptWord(), 0, base));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteArrayIndexedRead() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int base = pop();
|
2002-03-08 08:42:11 +00:00
|
|
|
int idx = pop();
|
|
|
|
push(readArray(fetchScriptByte(), idx, base));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordArrayIndexedRead() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int base = pop();
|
2002-03-08 08:42:11 +00:00
|
|
|
int idx = pop();
|
|
|
|
push(readArray(fetchScriptWord(), idx, base));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_dup() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
|
|
|
push(a);
|
|
|
|
push(a);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_not() {
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() == 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_eq() {
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() == pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_neq() {
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() != pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_gt() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() > a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_lt() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() < a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_le() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() <= a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_ge() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() >= a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_add() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() + a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_sub() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() - a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_mul() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() * a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_div() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
if (a == 0)
|
|
|
|
error("division by zero");
|
|
|
|
push(pop() / a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_land() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() && a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_lor() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(pop() || a);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_bor() {
|
2002-11-02 08:18:21 +00:00
|
|
|
int a = pop();
|
|
|
|
push(pop() | a);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_band() {
|
2002-11-02 08:18:21 +00:00
|
|
|
int a = pop();
|
2003-06-14 16:59:20 +00:00
|
|
|
push(pop() & a);
|
2002-11-02 08:18:21 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pop() {
|
2001-10-16 10:01:48 +00:00
|
|
|
pop();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_writeByteVar() {
|
2001-10-16 10:01:48 +00:00
|
|
|
writeVar(fetchScriptByte(), pop());
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_writeWordVar() {
|
2001-10-16 10:01:48 +00:00
|
|
|
writeVar(fetchScriptWord(), pop());
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteArrayWrite() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
|
|
|
writeArray(fetchScriptByte(), 0, pop(), a);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordArrayWrite() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
|
|
|
writeArray(fetchScriptWord(), 0, pop(), a);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteArrayIndexedWrite() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int val = pop();
|
|
|
|
int base = pop();
|
|
|
|
writeArray(fetchScriptByte(), pop(), base, val);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordArrayIndexedWrite() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int val = pop();
|
|
|
|
int base = pop();
|
|
|
|
writeArray(fetchScriptWord(), pop(), base, val);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteVarInc() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptByte();
|
2002-04-11 17:19:16 +00:00
|
|
|
writeVar(var, readVar(var) + 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordVarInc() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptWord();
|
2002-04-11 17:19:16 +00:00
|
|
|
writeVar(var, readVar(var) + 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteArrayInc() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptByte();
|
|
|
|
int base = pop();
|
|
|
|
writeArray(var, 0, base, readArray(var, 0, base) + 1);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordArrayInc() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptWord();
|
|
|
|
int base = pop();
|
|
|
|
writeArray(var, 0, base, readArray(var, 0, base) + 1);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteVarDec() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptByte();
|
2002-04-11 17:19:16 +00:00
|
|
|
writeVar(var, readVar(var) - 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordVarDec() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptWord();
|
2002-04-11 17:19:16 +00:00
|
|
|
writeVar(var, readVar(var) - 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_byteArrayDec() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptByte();
|
|
|
|
int base = pop();
|
|
|
|
writeArray(var, 0, base, readArray(var, 0, base) - 1);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wordArrayDec() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int var = fetchScriptWord();
|
|
|
|
int base = pop();
|
|
|
|
writeArray(var, 0, base, readArray(var, 0, base) - 1);
|
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_if() {
|
2001-10-16 10:01:48 +00:00
|
|
|
if (pop())
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_jump();
|
2001-10-16 10:01:48 +00:00
|
|
|
else
|
|
|
|
fetchScriptWord();
|
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_ifNot() {
|
2001-10-16 10:01:48 +00:00
|
|
|
if (!pop())
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_jump();
|
2001-10-16 10:01:48 +00:00
|
|
|
else
|
|
|
|
fetchScriptWord();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_jump() {
|
2003-11-11 13:47:53 +00:00
|
|
|
int offset = fetchScriptWordSigned();
|
|
|
|
_scriptPointer += offset;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_startScript() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2002-04-11 17:19:16 +00:00
|
|
|
int script, flags;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
script = pop();
|
|
|
|
flags = pop();
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-08-08 11:43:54 +00:00
|
|
|
// WORKAROUND bug #556558: At Dino Bungee National Memorial, the buttons for
|
2005-07-30 21:11:48 +00:00
|
|
|
// the Wally and Rex dinosaurs will always restart their speech, instead of
|
|
|
|
// stopping and starting their speech. This was a script bug in the original
|
2004-08-08 11:43:54 +00:00
|
|
|
// game.
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_SAMNMAX && _roomResource == 59 &&
|
2004-08-08 10:03:55 +00:00
|
|
|
vm.slot[_currentScript].number == 201 && script == 48) {
|
|
|
|
o6_breakHere();
|
|
|
|
}
|
|
|
|
|
2004-08-06 15:55:12 +00:00
|
|
|
// WORKAROUND bug #903223: In Puerto Pollo, if you have Guybrush examine
|
|
|
|
// the church clock, he'll read out the current time. Nice touch, only that
|
|
|
|
// it sounds crap in the german version (and maybe others, too). It seems
|
|
|
|
// the original engine of the german version played just a simple fixed
|
|
|
|
// text in this spot, for the above reason. Since the data files are
|
|
|
|
// unchanged, it must have been an engine hack job. No idea how they did
|
|
|
|
// it exactly, but this here is how we do it :-)
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_CMI && script == 204 &&
|
2004-08-06 15:55:12 +00:00
|
|
|
_currentRoom == 15 && vm.slot[_currentScript].number == 421 &&
|
|
|
|
_language == Common::DE_DEU) {
|
|
|
|
|
|
|
|
_actorToPrintStrFor = 1;
|
|
|
|
_string[0].loadDefault();
|
|
|
|
actorTalk((const byte *)"/VDSO325/Whoa! Look at the time. Gotta scoot.");
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2003-05-19 15:40:34 +00:00
|
|
|
runScript(script, (flags & 1) != 0, (flags & 2) != 0, args);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_jumpToScript() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2002-04-11 17:19:16 +00:00
|
|
|
int script, flags;
|
2001-11-26 19:57:57 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2001-11-26 19:57:57 +00:00
|
|
|
script = pop();
|
|
|
|
flags = pop();
|
2002-12-26 23:24:57 +00:00
|
|
|
stopObjectCode();
|
2003-05-19 15:40:34 +00:00
|
|
|
runScript(script, (flags & 1) != 0, (flags & 2) != 0, args);
|
2001-11-26 19:57:57 +00:00
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_startScriptQuick() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2001-10-16 10:01:48 +00:00
|
|
|
int script;
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
script = pop();
|
|
|
|
runScript(script, 0, 0, args);
|
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_startScriptQuick2() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2002-12-26 23:24:57 +00:00
|
|
|
int script;
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2002-12-26 23:24:57 +00:00
|
|
|
script = pop();
|
|
|
|
runScript(script, 0, 1, args);
|
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_startObject() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2002-04-11 17:19:16 +00:00
|
|
|
int script, entryp;
|
2001-10-16 10:01:48 +00:00
|
|
|
int flags;
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
entryp = pop();
|
|
|
|
script = pop();
|
|
|
|
flags = pop();
|
2003-05-20 20:58:26 +00:00
|
|
|
runObjectScript(script, entryp, (flags & 1) != 0, (flags & 2) != 0, args);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_startObjectQuick() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2002-12-26 23:24:57 +00:00
|
|
|
int script, entryp;
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2002-12-26 23:24:57 +00:00
|
|
|
entryp = pop();
|
|
|
|
script = pop();
|
2003-05-20 20:58:26 +00:00
|
|
|
runObjectScript(script, entryp, 0, 1, args);
|
2002-12-26 23:24:57 +00:00
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_drawObject() {
|
2004-01-11 21:48:31 +00:00
|
|
|
int state = pop();
|
|
|
|
int obj = pop();
|
2003-11-09 22:12:16 +00:00
|
|
|
|
2004-02-16 03:08:17 +00:00
|
|
|
// This is based on disassembly
|
2004-01-11 21:48:31 +00:00
|
|
|
if (state == 0)
|
|
|
|
state = 1;
|
2002-04-11 17:19:16 +00:00
|
|
|
|
2004-01-11 21:48:31 +00:00
|
|
|
setObjectState(obj, state, -1, -1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_drawObjectAt() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int y = pop();
|
|
|
|
int x = pop();
|
2001-11-26 19:57:57 +00:00
|
|
|
int obj = pop();
|
|
|
|
setObjectState(obj, 1, x, y);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopObjectCode() {
|
2001-10-16 10:01:48 +00:00
|
|
|
stopObjectCode();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_endCutscene() {
|
2001-10-16 10:01:48 +00:00
|
|
|
endCutscene();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_cutscene() {
|
2004-12-19 09:27:08 +00:00
|
|
|
int args[25];
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2003-05-20 20:58:26 +00:00
|
|
|
beginCutscene(args);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopMusic() {
|
2002-08-14 20:43:56 +00:00
|
|
|
_sound->stopAllSounds();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_freezeUnfreeze() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int a = pop();
|
2003-11-09 22:12:16 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
if (a)
|
|
|
|
freezeScripts(a);
|
|
|
|
else
|
|
|
|
unfreezeScripts();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_cursorCommand() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, i;
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[16];
|
2006-02-05 00:40:48 +00:00
|
|
|
|
|
|
|
byte subOp = fetchScriptByte();
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
switch (subOp) {
|
|
|
|
case 0x90: // SO_CURSOR_ON Turn cursor on
|
2002-12-04 22:31:36 +00:00
|
|
|
_cursor.state = 1;
|
2001-10-16 10:01:48 +00:00
|
|
|
verbMouseOver(0);
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x91: // SO_CURSOR_OFF Turn cursor off
|
2002-12-04 22:31:36 +00:00
|
|
|
_cursor.state = 0;
|
2001-10-16 10:01:48 +00:00
|
|
|
verbMouseOver(0);
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x92: // SO_USERPUT_ON
|
2001-10-16 10:01:48 +00:00
|
|
|
_userPut = 1;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x93: // SO_USERPUT_OFF
|
2001-10-16 10:01:48 +00:00
|
|
|
_userPut = 0;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x94: // SO_CURSOR_SOFT_ON Turn soft cursor on
|
2002-12-04 22:31:36 +00:00
|
|
|
_cursor.state++;
|
|
|
|
if (_cursor.state > 1)
|
2001-10-16 10:01:48 +00:00
|
|
|
error("Cursor state greater than 1 in script");
|
|
|
|
verbMouseOver(0);
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x95: // SO_CURSOR_SOFT_OFF Turn soft cursor off
|
2002-12-04 22:31:36 +00:00
|
|
|
_cursor.state--;
|
2001-10-16 10:01:48 +00:00
|
|
|
verbMouseOver(0);
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x96: // SO_USERPUT_SOFT_ON
|
2001-10-16 10:01:48 +00:00
|
|
|
_userPut++;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x97: // SO_USERPUT_SOFT_OFF
|
2001-10-16 10:01:48 +00:00
|
|
|
_userPut--;
|
|
|
|
break;
|
2004-06-06 02:20:53 +00:00
|
|
|
case 0x99: // SO_CURSOR_IMAGE Set cursor image
|
|
|
|
{
|
2005-04-16 10:26:49 +00:00
|
|
|
int room, obj;
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 70) {
|
2005-04-16 10:26:49 +00:00
|
|
|
obj = pop();
|
|
|
|
room = getObjectRoom(obj);
|
|
|
|
} else {
|
|
|
|
obj = popRoomAndObj(&room);
|
|
|
|
}
|
2004-08-22 23:38:00 +00:00
|
|
|
setCursorFromImg(obj, room, 1);
|
2002-04-11 17:19:16 +00:00
|
|
|
break;
|
|
|
|
}
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x9A: // SO_CURSOR_HOTSPOT Set cursor hotspot
|
2001-10-16 10:01:48 +00:00
|
|
|
a = pop();
|
2003-04-26 13:28:34 +00:00
|
|
|
setCursorHotspot(pop(), a);
|
2007-01-24 00:11:22 +00:00
|
|
|
updateCursor();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x9C: // SO_CHARSET_SET
|
2001-10-16 10:01:48 +00:00
|
|
|
initCharset(pop());
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0x9D: // SO_CHARSET_COLOR
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2002-04-11 17:19:16 +00:00
|
|
|
for (i = 0; i < 16; i++)
|
2004-04-05 23:54:58 +00:00
|
|
|
_charsetColorMap[i] = _charsetData[_string[1]._default.charset][i] = (unsigned char)args[i];
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 0xD6: // SO_CURSOR_TRANSPARENT Set cursor transparent color
|
2004-08-22 23:38:00 +00:00
|
|
|
setCursorTransparency(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2001-11-26 19:57:57 +00:00
|
|
|
default:
|
2003-11-09 22:12:16 +00:00
|
|
|
error("o6_cursorCommand: default case %x", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-05-08 15:48:50 +00:00
|
|
|
VAR(VAR_CURSORSTATE) = _cursor.state;
|
|
|
|
VAR(VAR_USERPUT) = _userPut;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_breakHere() {
|
2001-10-16 10:01:48 +00:00
|
|
|
updateScriptPtr();
|
|
|
|
_currentScript = 0xFF;
|
|
|
|
}
|
|
|
|
|
2003-11-10 08:00:55 +00:00
|
|
|
void ScummEngine_v6::o6_ifClassOfIs() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[16];
|
2002-04-11 17:19:16 +00:00
|
|
|
int num, obj, cls;
|
2001-10-16 10:01:48 +00:00
|
|
|
bool b;
|
|
|
|
int cond = 1;
|
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
obj = pop();
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 80 && num == 0) {
|
2005-03-28 10:14:08 +00:00
|
|
|
push(_classData[obj]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
while (--num >= 0) {
|
2001-10-16 10:01:48 +00:00
|
|
|
cls = args[num];
|
|
|
|
b = getClass(obj, cls);
|
2003-05-31 16:24:01 +00:00
|
|
|
if ((cls & 0x80 && !b) || (!(cls & 0x80) && b))
|
2001-10-16 10:01:48 +00:00
|
|
|
cond = 0;
|
|
|
|
}
|
|
|
|
push(cond);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setClass() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[16];
|
2002-04-11 17:19:16 +00:00
|
|
|
int num, obj, cls;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
obj = pop();
|
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
while (--num >= 0) {
|
2001-10-16 10:01:48 +00:00
|
|
|
cls = args[num];
|
2002-04-11 17:19:16 +00:00
|
|
|
if (cls == 0)
|
2001-10-16 10:01:48 +00:00
|
|
|
_classData[num] = 0;
|
2002-04-11 17:19:16 +00:00
|
|
|
else if (cls & 0x80)
|
2001-10-16 10:01:48 +00:00
|
|
|
putClass(obj, cls, 1);
|
|
|
|
else
|
|
|
|
putClass(obj, cls, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getState() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(getState(pop()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setState() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int state = pop();
|
|
|
|
int obj = pop();
|
|
|
|
|
|
|
|
putState(obj, state);
|
2004-01-11 20:42:40 +00:00
|
|
|
markObjectRectAsDirty(obj);
|
2004-09-18 22:42:45 +00:00
|
|
|
if (_bgNeedsRedraw)
|
2001-10-16 10:01:48 +00:00
|
|
|
clearDrawObjectQueue();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setOwner() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int owner = pop();
|
|
|
|
int obj = pop();
|
|
|
|
setOwnerOf(obj, owner);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getOwner() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(getOwner(pop()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_startSound() {
|
2004-07-14 07:29:09 +00:00
|
|
|
int offset = 0;
|
|
|
|
|
|
|
|
// In Fatty Bear's Birthday Surprise the piano uses offsets 1 - 23 to
|
|
|
|
// indicate which note to play, but only when using the standard piano
|
2005-09-02 11:24:16 +00:00
|
|
|
// sound. See also o60_soundOps()
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 60 && (_game.id != GID_PUTTDEMO))
|
2004-07-14 07:29:09 +00:00
|
|
|
offset = pop();
|
2005-05-14 22:56:41 +00:00
|
|
|
|
|
|
|
#ifndef DISABLE_SCUMM_7_8
|
2007-02-10 02:05:59 +00:00
|
|
|
if (_game.version >= 7)
|
2004-07-14 08:16:40 +00:00
|
|
|
_imuseDigital->startSfx(pop(), 64);
|
2005-07-30 21:11:48 +00:00
|
|
|
else
|
2005-05-14 22:56:41 +00:00
|
|
|
#endif
|
2004-07-14 08:16:40 +00:00
|
|
|
_sound->addSoundToQueue(pop(), offset);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopSound() {
|
2002-08-14 20:43:56 +00:00
|
|
|
_sound->stopSound(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_startMusic() {
|
2007-02-10 02:05:59 +00:00
|
|
|
if (_game.version >= 7)
|
2004-01-06 17:28:29 +00:00
|
|
|
error("o6_startMusic() It shouldn't be called here for imuse digital");
|
2004-07-14 07:29:09 +00:00
|
|
|
|
|
|
|
_sound->addSoundToQueue(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopObjectScript() {
|
2001-10-16 10:01:48 +00:00
|
|
|
stopObjectScript(pop());
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_panCameraTo() {
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7) {
|
2002-03-05 20:13:47 +00:00
|
|
|
int y = pop();
|
|
|
|
int x = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
panCameraTo(x, y);
|
2002-03-05 20:13:47 +00:00
|
|
|
} else {
|
|
|
|
panCameraTo(pop(), 0);
|
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_actorFollowCamera() {
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7)
|
2003-05-23 13:24:41 +00:00
|
|
|
setCameraFollows(derefActor(pop(), "actorFollowCamera"));
|
2002-03-06 00:18:22 +00:00
|
|
|
else
|
|
|
|
actorFollowCamera(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setCameraAt() {
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7) {
|
2002-04-11 17:19:16 +00:00
|
|
|
int x, y;
|
2001-12-27 17:51:58 +00:00
|
|
|
|
2002-03-06 00:18:22 +00:00
|
|
|
camera._follows = 0;
|
2003-05-08 15:48:50 +00:00
|
|
|
VAR(VAR_CAMERA_FOLLOWED_ACTOR) = 0;
|
2001-12-27 17:51:58 +00:00
|
|
|
|
2002-03-06 00:18:22 +00:00
|
|
|
y = pop();
|
|
|
|
x = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
|
|
|
|
setCameraAt(x, y);
|
2002-03-06 00:18:22 +00:00
|
|
|
} else {
|
|
|
|
setCameraAtEx(pop());
|
2002-04-11 17:19:16 +00:00
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_loadRoom() {
|
2002-12-23 15:46:53 +00:00
|
|
|
int room = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
startScene(room, 0, 0);
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 61) {
|
2005-04-19 10:19:31 +00:00
|
|
|
setCameraAt(camera._cur.x, 0);
|
|
|
|
}
|
2005-08-06 14:34:40 +00:00
|
|
|
_fullRedraw = true;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopScript() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int script = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
if (script == 0)
|
2001-10-16 10:01:48 +00:00
|
|
|
stopObjectCode();
|
|
|
|
else
|
2003-05-20 20:58:26 +00:00
|
|
|
stopScript(script);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_walkActorToObj() {
|
2003-05-23 13:24:41 +00:00
|
|
|
int act, obj, dist;
|
2001-10-16 10:01:48 +00:00
|
|
|
Actor *a, *a2;
|
2003-06-11 21:45:47 +00:00
|
|
|
int x, y;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
|
|
|
dist = pop();
|
|
|
|
obj = pop();
|
2003-05-23 13:24:41 +00:00
|
|
|
act = pop();
|
|
|
|
a = derefActor(act, "o6_walkActorToObj");
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-13 23:42:41 +00:00
|
|
|
if (obj >= _numActors) {
|
2003-08-13 16:38:02 +00:00
|
|
|
int wio = whereIsObject(obj);
|
|
|
|
|
|
|
|
if (wio != WIO_FLOBJECT && wio != WIO_ROOM)
|
2001-10-16 10:01:48 +00:00
|
|
|
return;
|
2003-08-13 16:38:02 +00:00
|
|
|
|
2003-06-11 21:45:47 +00:00
|
|
|
int dir;
|
2002-07-16 18:51:27 +00:00
|
|
|
getObjectXYPos(obj, x, y, dir);
|
|
|
|
a->startWalkActor(x, y, dir);
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2003-05-24 16:09:29 +00:00
|
|
|
a2 = derefActorSafe(obj, "o6_walkActorToObj(2)");
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_SAMNMAX && a2 == 0) {
|
2006-01-17 18:57:26 +00:00
|
|
|
// WORKAROUND bug #742676 SAM: Fish Farm. Note quite sure why it
|
|
|
|
// happens, whether it's normal or due to a bug in the ScummVM code.
|
2005-08-14 01:41:52 +00:00
|
|
|
debug(0, "o6_walkActorToObj: invalid actor %d", obj);
|
2003-05-24 16:09:29 +00:00
|
|
|
return;
|
|
|
|
}
|
2002-08-04 13:03:33 +00:00
|
|
|
if (!a->isInCurrentRoom() || !a2->isInCurrentRoom())
|
2002-04-11 17:19:16 +00:00
|
|
|
return;
|
|
|
|
if (dist == 0) {
|
2005-03-11 01:10:06 +00:00
|
|
|
dist = a2->_scalex * a2->_width / 0xFF;
|
2003-06-11 21:45:47 +00:00
|
|
|
dist += dist / 2;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2006-11-19 00:39:48 +00:00
|
|
|
x = a2->getPos().x;
|
|
|
|
y = a2->getPos().y;
|
|
|
|
if (x < a->getPos().x)
|
2001-10-16 10:01:48 +00:00
|
|
|
x += dist;
|
|
|
|
else
|
|
|
|
x -= dist;
|
2003-06-11 21:45:47 +00:00
|
|
|
a->startWalkActor(x, y, -1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_walkActorTo() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int x, y;
|
2001-10-16 10:01:48 +00:00
|
|
|
y = pop();
|
|
|
|
x = pop();
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_walkActorTo");
|
2002-12-30 02:06:18 +00:00
|
|
|
a->startWalkActor(x, y, -1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
void ScummEngine_v6::o6_putActorAtXY() {
|
2003-05-23 13:24:41 +00:00
|
|
|
int room, x, y, act;
|
2001-10-16 10:01:48 +00:00
|
|
|
Actor *a;
|
|
|
|
|
|
|
|
room = pop();
|
|
|
|
y = pop();
|
|
|
|
x = pop();
|
2003-05-23 13:24:41 +00:00
|
|
|
act = pop();
|
2003-11-09 22:12:16 +00:00
|
|
|
a = derefActor(act, "o6_putActorAtXY");
|
2001-11-26 19:57:57 +00:00
|
|
|
|
2003-01-05 22:16:09 +00:00
|
|
|
if (room == 0xFF || room == 0x7FFFFFFF) {
|
2005-03-11 01:10:06 +00:00
|
|
|
room = a->_room;
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2005-03-11 01:10:06 +00:00
|
|
|
if (a->_visible && _currentRoom != room && getTalkingActor() == a->_number) {
|
2004-03-15 03:24:29 +00:00
|
|
|
stopTalk();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
if (room != 0)
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_room = room;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2002-07-18 15:45:10 +00:00
|
|
|
a->putActor(x, y, room);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2001-12-27 17:51:58 +00:00
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_putActorAtObject() {
|
2002-07-16 21:03:14 +00:00
|
|
|
int room, obj, x, y;
|
2001-10-16 10:01:48 +00:00
|
|
|
Actor *a;
|
|
|
|
|
2005-04-16 10:26:49 +00:00
|
|
|
obj = popRoomAndObj(&room);
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-23 13:24:41 +00:00
|
|
|
a = derefActor(pop(), "o6_putActorAtObject");
|
2002-04-11 17:19:16 +00:00
|
|
|
if (whereIsObject(obj) != WIO_NOT_FOUND) {
|
2002-07-16 18:51:27 +00:00
|
|
|
getObjectXYPos(obj, x, y);
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2003-04-01 20:56:27 +00:00
|
|
|
x = 160;
|
2001-10-16 10:01:48 +00:00
|
|
|
y = 120;
|
|
|
|
}
|
|
|
|
if (room == 0xFF)
|
2005-03-11 01:10:06 +00:00
|
|
|
room = a->_room;
|
2002-07-18 15:45:10 +00:00
|
|
|
a->putActor(x, y, room);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_faceActor() {
|
2003-01-01 18:22:41 +00:00
|
|
|
int obj = pop();
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_faceActor");
|
2003-04-20 17:11:13 +00:00
|
|
|
a->faceToObject(obj);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_animateActor() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int anim = pop();
|
2003-05-26 01:01:47 +00:00
|
|
|
int act = pop();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_TENTACLE && _roomResource == 57 &&
|
2003-05-26 01:01:47 +00:00
|
|
|
vm.slot[_currentScript].number == 19 && act == 593) {
|
2006-01-17 18:57:26 +00:00
|
|
|
// WORKAROUND bug #743363: This very odd case (animateActor(593,250))
|
|
|
|
// occurs in DOTT, in the cutscene after George cuts down the "cherry
|
|
|
|
// tree" and the tree Laverne is trapped in vanishes...
|
2003-05-26 01:01:47 +00:00
|
|
|
// Not sure if this means animateActor somehow also must work for objects
|
|
|
|
// (593 is the time machine in room 57), or if this is simply a script bug.
|
|
|
|
act = 6;
|
|
|
|
}
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_SAMNMAX && _roomResource == 35 &&
|
2005-09-02 10:49:21 +00:00
|
|
|
vm.slot[_currentScript].number == 202 && act == 4 && anim == 14) {
|
|
|
|
// WORKAROUND bug #1223621 (Animation glitch at World of Fish).
|
|
|
|
// Before starting animation 14 of the fisherman, make sure he isn't
|
|
|
|
// talking anymore. This appears to be a bug in the original game as well.
|
|
|
|
if (getTalkingActor() == 4) {
|
|
|
|
stopTalk();
|
|
|
|
}
|
|
|
|
}
|
2003-05-26 01:01:47 +00:00
|
|
|
Actor *a = derefActor(act, "o6_animateActor");
|
2002-08-04 02:53:50 +00:00
|
|
|
a->animateActor(anim);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_doSentence() {
|
2003-05-24 16:09:29 +00:00
|
|
|
int verb, objectA, objectB, dummy = 0;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-24 16:09:29 +00:00
|
|
|
objectB = pop();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version < 8)
|
2003-05-24 16:45:49 +00:00
|
|
|
dummy = pop(); // dummy pop (in Sam&Max, seems to be always 0 or 130)
|
2003-05-24 16:09:29 +00:00
|
|
|
objectA = pop();
|
|
|
|
verb = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-24 16:09:29 +00:00
|
|
|
doSentence(verb, objectA, objectB);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pickupObject() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int obj, room;
|
2001-11-26 19:57:57 +00:00
|
|
|
int i;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
obj = popRoomAndObj(&room);
|
|
|
|
if (room == 0)
|
2001-12-27 17:51:58 +00:00
|
|
|
room = _roomResource;
|
2001-11-26 19:57:57 +00:00
|
|
|
|
2003-12-26 23:11:35 +00:00
|
|
|
for (i = 0; i < _numInventory; i++) {
|
2001-11-26 19:57:57 +00:00
|
|
|
if (_inventory[i] == (uint16)obj) {
|
2003-05-08 15:48:50 +00:00
|
|
|
putOwner(obj, VAR(VAR_EGO));
|
2003-06-14 12:23:30 +00:00
|
|
|
runInventoryScript(obj);
|
2001-11-26 19:57:57 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2002-04-11 17:19:16 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
addObjectToInventory(obj, room);
|
2003-05-08 15:48:50 +00:00
|
|
|
putOwner(obj, VAR(VAR_EGO));
|
2003-05-20 20:42:28 +00:00
|
|
|
putClass(obj, kObjectClassUntouchable, 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
putState(obj, 1);
|
2004-01-11 20:42:40 +00:00
|
|
|
markObjectRectAsDirty(obj);
|
2001-10-16 10:01:48 +00:00
|
|
|
clearDrawObjectQueue();
|
2006-01-17 18:57:26 +00:00
|
|
|
runInventoryScript(obj);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_loadRoomWithEgo() {
|
2001-10-16 10:01:48 +00:00
|
|
|
Actor *a;
|
2002-08-15 20:12:15 +00:00
|
|
|
int obj, room, x, y;
|
2002-04-07 04:29:15 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
y = pop();
|
|
|
|
x = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
|
2005-04-16 10:26:49 +00:00
|
|
|
obj = popRoomAndObj(&room);
|
2001-12-27 17:51:58 +00:00
|
|
|
|
2003-05-23 13:24:41 +00:00
|
|
|
a = derefActor(VAR(VAR_EGO), "o6_loadRoomWithEgo");
|
2002-07-18 15:45:10 +00:00
|
|
|
a->putActor(0, 0, room);
|
2001-10-26 17:34:50 +00:00
|
|
|
_egoPositioned = false;
|
|
|
|
|
2005-09-09 07:24:11 +00:00
|
|
|
VAR(VAR_WALKTO_OBJ) = obj;
|
2005-03-11 01:10:06 +00:00
|
|
|
startScene(a->_room, a, obj);
|
2005-09-09 07:24:11 +00:00
|
|
|
VAR(VAR_WALKTO_OBJ) = 0;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version == 6) {
|
2006-11-19 00:39:48 +00:00
|
|
|
camera._cur.x = camera._dest.x = a->getPos().x;
|
2006-03-18 10:30:47 +00:00
|
|
|
setCameraFollows(a, (_game.heversion >= 60));
|
2002-03-06 00:18:22 +00:00
|
|
|
}
|
2002-08-15 20:12:15 +00:00
|
|
|
|
2005-08-06 14:34:40 +00:00
|
|
|
_fullRedraw = true;
|
2002-08-15 20:12:15 +00:00
|
|
|
|
2003-09-09 19:30:25 +00:00
|
|
|
if (x != -1 && x != 0x7FFFFFFF) {
|
2002-05-14 19:11:20 +00:00
|
|
|
a->startWalkActor(x, y, -1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getRandomNumber() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int rnd;
|
2002-12-01 14:57:50 +00:00
|
|
|
rnd = _rnd.getRandomNumber(pop());
|
2004-01-19 19:47:47 +00:00
|
|
|
if (VAR_RANDOM_NR != 0xFF)
|
|
|
|
VAR(VAR_RANDOM_NR) = rnd;
|
2001-10-16 10:01:48 +00:00
|
|
|
push(rnd);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getRandomNumberRange() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int max = pop();
|
|
|
|
int min = pop();
|
2002-12-01 14:57:50 +00:00
|
|
|
int rnd = _rnd.getRandomNumberRng(min, max);
|
2004-01-19 19:47:47 +00:00
|
|
|
if (VAR_RANDOM_NR != 0xFF)
|
|
|
|
VAR(VAR_RANDOM_NR) = rnd;
|
2001-10-16 10:01:48 +00:00
|
|
|
push(rnd);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_isScriptRunning() {
|
2001-11-26 19:57:57 +00:00
|
|
|
push(isScriptRunning(pop()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_isRoomScriptRunning() {
|
2001-11-26 19:57:57 +00:00
|
|
|
push(isRoomScriptRunning(pop()));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorMoving() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorMoving");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_moving);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorRoom() {
|
2003-05-23 13:24:41 +00:00
|
|
|
int act = pop();
|
2003-05-23 13:42:12 +00:00
|
|
|
|
|
|
|
if (act == 0) {
|
|
|
|
// This case occurs at the very least in COMI. That's because in COMI's script 28,
|
|
|
|
// there is a check which looks as follows:
|
|
|
|
// if (((VAR_TALK_ACTOR != 0) && (VAR_HAVE_MSG == 1)) &&
|
|
|
|
// (getActorRoom(VAR_TALK_ACTOR) == VAR_ROOM))
|
|
|
|
// Due to the way this is represented in bytecode, the engine cannot
|
2004-01-15 20:37:26 +00:00
|
|
|
// short circuit. Hence, even though this would be perfectly fine code
|
2003-05-23 13:42:12 +00:00
|
|
|
// in C/C++, here it can (and does) lead to getActorRoom(0) being
|
|
|
|
// invoked. We silently ignore this.
|
2002-12-24 00:41:59 +00:00
|
|
|
push(0);
|
2003-05-23 13:24:41 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-05-24 23:08:03 +00:00
|
|
|
if (act == 255) {
|
|
|
|
// This case also occurs in COMI...
|
|
|
|
push(0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-05-23 13:42:12 +00:00
|
|
|
Actor *a = derefActor(act, "o6_getActorRoom");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_room);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorWalkBox() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorWalkBox");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_ignoreBoxes ? 0 : a->_walkbox);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorCostume() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorCostume");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_costume);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorElevation() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorElevation");
|
2004-01-05 16:19:14 +00:00
|
|
|
push(a->getElevation());
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorWidth() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorWidth");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_width);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorScaleX() {
|
2006-09-09 18:31:32 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorScaleX");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_scalex);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2006-09-09 18:31:32 +00:00
|
|
|
void ScummEngine_v6::o6_getActorAnimCounter() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getActorAnimCounter");
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_cost.animCounter);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getAnimateVariable() {
|
2002-12-30 02:06:18 +00:00
|
|
|
int var = pop();
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_getAnimateVariable");
|
2003-01-16 14:42:20 +00:00
|
|
|
push(a->getAnimVar(var));
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_isActorInBox() {
|
2002-12-30 02:06:18 +00:00
|
|
|
int box = pop();
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "o6_isActorInBox");
|
2006-11-19 00:39:48 +00:00
|
|
|
push(checkXYInBoxBounds(box, a->getPos().x, a->getPos().y));
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorLayer() {
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(pop(), "getActorLayer");
|
2004-09-28 19:28:59 +00:00
|
|
|
push(a->_layer);
|
2002-12-30 02:06:18 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getObjectX() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(getObjX(pop()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getObjectY() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(getObjY(pop()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getObjectOldDir() {
|
2001-12-27 17:51:58 +00:00
|
|
|
push(getObjOldDir(pop()));
|
|
|
|
}
|
2001-11-26 19:57:57 +00:00
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getObjectNewDir() {
|
2001-12-27 17:51:58 +00:00
|
|
|
push(getObjNewDir(pop()));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_findInventory() {
|
2002-03-08 08:42:11 +00:00
|
|
|
int idx = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
int owner = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(findInventory(owner, idx));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getInventoryCount() {
|
2001-10-16 10:01:48 +00:00
|
|
|
push(getInventoryCount(pop()));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getVerbFromXY() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int y = pop();
|
|
|
|
int x = pop();
|
2004-09-26 07:30:29 +00:00
|
|
|
int over = findVerbAtPos(x, y);
|
2001-10-16 10:01:48 +00:00
|
|
|
if (over)
|
|
|
|
over = _verbs[over].verbid;
|
|
|
|
push(over);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_beginOverride() {
|
2001-10-16 10:01:48 +00:00
|
|
|
beginOverride();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_endOverride() {
|
2001-10-16 10:01:48 +00:00
|
|
|
endOverride();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setObjectName() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int obj = pop();
|
2004-03-17 01:50:15 +00:00
|
|
|
setObjectName(obj);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_isSoundRunning() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int snd = pop();
|
2002-05-10 18:47:37 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
if (snd)
|
2002-08-14 20:43:56 +00:00
|
|
|
snd = _sound->isSoundRunning(snd);
|
2002-07-07 13:14:34 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
push(snd);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setBoxFlags() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int table[65];
|
2002-04-11 17:19:16 +00:00
|
|
|
int num, value;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
|
|
|
value = pop();
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(table, ARRAYSIZE(table));
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
while (--num >= 0) {
|
2001-10-16 10:01:48 +00:00
|
|
|
setBoxFlags(table[num], value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_createBoxMatrix() {
|
2001-10-16 10:01:48 +00:00
|
|
|
createBoxMatrix();
|
2004-07-04 12:06:17 +00:00
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if ((_game.id == GID_DIG) || (_game.id == GID_CMI))
|
2004-07-07 00:11:11 +00:00
|
|
|
putActors();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_resourceRoutines() {
|
2006-02-05 00:40:48 +00:00
|
|
|
int resid;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2006-02-05 00:40:48 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
|
|
|
|
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 100: // SO_LOAD_SCRIPT
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7)
|
2002-03-08 08:42:11 +00:00
|
|
|
if (resid >= _numGlobalScripts)
|
2002-03-06 00:18:22 +00:00
|
|
|
break;
|
2002-03-08 08:42:11 +00:00
|
|
|
ensureResourceLoaded(rtScript, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 101: // SO_LOAD_SOUND
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
ensureResourceLoaded(rtSound, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 102: // SO_LOAD_COSTUME
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
ensureResourceLoaded(rtCostume, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 103: // SO_LOAD_ROOM
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
ensureResourceLoaded(rtRoom, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 104: // SO_NUKE_SCRIPT
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7)
|
2002-03-08 08:42:11 +00:00
|
|
|
if (resid >= _numGlobalScripts)
|
2002-03-06 00:18:22 +00:00
|
|
|
break;
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->setResourceCounter(rtScript, resid, 0x7F);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 105: // SO_NUKE_SOUND
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->setResourceCounter(rtSound, resid, 0x7F);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 106: // SO_NUKE_COSTUME
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->setResourceCounter(rtCostume, resid, 0x7F);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 107: // SO_NUKE_ROOM
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->setResourceCounter(rtRoom, resid, 0x7F);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 108: // SO_LOCK_SCRIPT
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
if (resid >= _numGlobalScripts)
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->lock(rtScript, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 109: // SO_LOCK_SOUND
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->lock(rtSound, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 110: // SO_LOCK_COSTUME
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->lock(rtCostume, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 111: // SO_LOCK_ROOM
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
if (resid > 0x7F)
|
2002-04-11 17:19:16 +00:00
|
|
|
resid = _resourceMapper[resid & 0x7F];
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->lock(rtRoom, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 112: // SO_UNLOCK_SCRIPT
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
if (resid >= _numGlobalScripts)
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->unlock(rtScript, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 113: // SO_UNLOCK_SOUND
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->unlock(rtSound, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 114: // SO_UNLOCK_COSTUME
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->unlock(rtCostume, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 115: // SO_UNLOCK_ROOM
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
if (resid > 0x7F)
|
2002-04-11 17:19:16 +00:00
|
|
|
resid = _resourceMapper[resid & 0x7F];
|
2006-09-17 20:36:48 +00:00
|
|
|
_res->unlock(rtRoom, resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 116: // SO_CLEAR_HEAP
|
2001-10-16 10:01:48 +00:00
|
|
|
/* this is actually a scumm message */
|
|
|
|
error("clear heap not working yet");
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 117: // SO_LOAD_CHARSET
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
loadCharset(resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 118: // SO_NUKE_CHARSET
|
2002-03-08 08:42:11 +00:00
|
|
|
resid = pop();
|
|
|
|
nukeCharset(resid);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-10 00:05:17 +00:00
|
|
|
case 119: // SO_LOAD_OBJECT
|
|
|
|
{
|
2002-04-11 17:19:16 +00:00
|
|
|
int room, obj = popRoomAndObj(&room);
|
|
|
|
loadFlObject(obj, room);
|
|
|
|
break;
|
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
default:
|
2006-02-05 00:40:48 +00:00
|
|
|
error("o6_resourceRoutines: default case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-09-03 08:55:24 +00:00
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_roomOps() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b, c, d, e;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2006-02-05 00:40:48 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
2003-04-20 15:02:58 +00:00
|
|
|
|
2006-02-05 00:40:48 +00:00
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 172: // SO_ROOM_SCROLL
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2003-05-10 21:49:59 +00:00
|
|
|
if (a < (_screenWidth / 2))
|
|
|
|
a = (_screenWidth / 2);
|
|
|
|
if (b < (_screenWidth / 2))
|
|
|
|
b = (_screenWidth / 2);
|
|
|
|
if (a > _roomWidth - (_screenWidth / 2))
|
|
|
|
a = _roomWidth - (_screenWidth / 2);
|
|
|
|
if (b > _roomWidth - (_screenWidth / 2))
|
|
|
|
b = _roomWidth - (_screenWidth / 2);
|
2003-05-08 15:48:50 +00:00
|
|
|
VAR(VAR_CAMERA_MIN_X) = a;
|
|
|
|
VAR(VAR_CAMERA_MAX_X) = b;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 174: // SO_ROOM_SCREEN
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2004-01-04 14:49:14 +00:00
|
|
|
initScreens(a, b);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 175: // SO_ROOM_PALETTE
|
2001-10-16 10:01:48 +00:00
|
|
|
d = pop();
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
setPalColor(d, a, b, c);
|
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 176: // SO_ROOM_SHAKE_ON
|
2001-10-16 10:01:48 +00:00
|
|
|
setShake(1);
|
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 177: // SO_ROOM_SHAKE_OFF
|
2001-10-16 10:01:48 +00:00
|
|
|
setShake(0);
|
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 179: // SO_ROOM_INTENSITY
|
2001-10-16 10:01:48 +00:00
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2002-12-09 02:14:17 +00:00
|
|
|
darkenPalette(a, a, a, b, c);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 180: // SO_ROOM_SAVEGAME
|
2004-01-31 22:12:35 +00:00
|
|
|
_saveTemporaryState = true;
|
2001-10-26 17:34:50 +00:00
|
|
|
_saveLoadSlot = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
_saveLoadFlag = pop();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_TENTACLE)
|
2004-01-30 16:01:08 +00:00
|
|
|
_saveSound = (_saveLoadSlot != 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 181: // SO_ROOM_FADE
|
2001-10-16 10:01:48 +00:00
|
|
|
a = pop();
|
|
|
|
if (a) {
|
2003-11-16 20:52:57 +00:00
|
|
|
_switchRoomEffect = (byte)(a & 0xFF);
|
2002-04-11 17:19:16 +00:00
|
|
|
_switchRoomEffect2 = (byte)(a >> 8);
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2002-07-13 14:07:37 +00:00
|
|
|
fadeIn(_newEffect);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 182: // SO_RGB_ROOM_INTENSITY
|
2001-10-16 10:01:48 +00:00
|
|
|
e = pop();
|
|
|
|
d = pop();
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2002-12-09 02:14:17 +00:00
|
|
|
darkenPalette(a, b, c, d, e);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 183: // SO_ROOM_SHADOW
|
2001-10-16 10:01:48 +00:00
|
|
|
e = pop();
|
|
|
|
d = pop();
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2006-04-29 16:24:39 +00:00
|
|
|
setShadowPalette(a, b, c, d, e, 0, 256);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 184: // SO_SAVE_STRING
|
2001-10-16 10:01:48 +00:00
|
|
|
error("save string not implemented");
|
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 185: // SO_LOAD_STRING
|
2001-10-16 10:01:48 +00:00
|
|
|
error("load string not implemented");
|
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 186: // SO_ROOM_TRANSFORM
|
2001-10-16 10:01:48 +00:00
|
|
|
d = pop();
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2002-09-13 11:54:59 +00:00
|
|
|
palManipulateInit(a, b, c, d);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 187: // SO_CYCLE_SPEED
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2006-09-16 13:38:43 +00:00
|
|
|
assertRange(1, a, 16, "o6_roomOps: 187: color cycle");
|
2002-04-11 17:19:16 +00:00
|
|
|
_colorCycle[a - 1].delay = (b != 0) ? 0x4000 / (b * 0x4C) : 0;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
|
2003-11-09 22:12:16 +00:00
|
|
|
case 213: // SO_ROOM_NEW_PALETTE
|
2002-12-11 20:48:32 +00:00
|
|
|
a = pop();
|
|
|
|
|
|
|
|
// This opcode is used when turning off noir mode in Sam & Max,
|
|
|
|
// but since our implementation of this feature doesn't change
|
|
|
|
// the original palette there's no need to reload it. Doing it
|
|
|
|
// this way, we avoid some graphics glitches that the original
|
|
|
|
// interpreter had.
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_SAMNMAX && vm.slot[_currentScript].number == 64)
|
2002-12-11 20:48:32 +00:00
|
|
|
setDirtyColors(0, 255);
|
|
|
|
else
|
2006-11-04 22:59:56 +00:00
|
|
|
setCurrentPalette(a);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
default:
|
2006-02-05 00:40:48 +00:00
|
|
|
error("o6_roomOps: default case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_actorOps() {
|
2001-10-16 10:01:48 +00:00
|
|
|
Actor *a;
|
2002-04-11 17:19:16 +00:00
|
|
|
int i, j, k;
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[8];
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2006-02-05 00:40:48 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
2004-10-10 01:52:35 +00:00
|
|
|
if (subOp == 197) {
|
2001-10-16 10:01:48 +00:00
|
|
|
_curActor = pop();
|
|
|
|
return;
|
|
|
|
}
|
2002-04-11 17:19:16 +00:00
|
|
|
|
2002-12-23 15:46:53 +00:00
|
|
|
a = derefActorSafe(_curActor, "o6_actorOps");
|
2002-04-11 17:19:16 +00:00
|
|
|
if (!a)
|
|
|
|
return;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2004-10-10 01:52:35 +00:00
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 76: // SO_COSTUME
|
2002-05-14 19:11:20 +00:00
|
|
|
a->setActorCostume(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 77: // SO_STEP_DIST
|
2001-10-16 10:01:48 +00:00
|
|
|
j = pop();
|
|
|
|
i = pop();
|
2002-05-14 19:11:20 +00:00
|
|
|
a->setActorWalkSpeed(i, j);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 78: // SO_SOUND
|
2003-05-18 21:03:57 +00:00
|
|
|
k = getStackList(args, ARRAYSIZE(args));
|
2002-04-11 17:19:16 +00:00
|
|
|
for (i = 0; i < k; i++)
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_sound[i] = args[i];
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 79: // SO_WALK_ANIMATION
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_walkFrame = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 80: // SO_TALK_ANIMATION
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_talkStopFrame = pop();
|
|
|
|
a->_talkStartFrame = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 81: // SO_STAND_ANIMATION
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_standFrame = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 82: // SO_ANIMATION
|
2004-02-06 16:19:43 +00:00
|
|
|
// dummy case in scumm6
|
2001-10-16 10:01:48 +00:00
|
|
|
pop();
|
|
|
|
pop();
|
|
|
|
pop();
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 83: // SO_DEFAULT
|
2002-05-14 19:11:20 +00:00
|
|
|
a->initActor(0);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 84: // SO_ELEVATION
|
2004-01-05 16:19:14 +00:00
|
|
|
a->setElevation(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 85: // SO_ANIMATION_DEFAULT
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_initFrame = 1;
|
|
|
|
a->_walkFrame = 2;
|
|
|
|
a->_standFrame = 3;
|
|
|
|
a->_talkStartFrame = 4;
|
|
|
|
a->_talkStopFrame = 5;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 86: // SO_PALETTE
|
2001-10-16 10:01:48 +00:00
|
|
|
j = pop();
|
|
|
|
i = pop();
|
2006-09-16 13:38:43 +00:00
|
|
|
assertRange(0, i, 255, "o6_actorOps: palette slot");
|
2004-02-07 02:52:27 +00:00
|
|
|
a->setPalette(i, j);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 87: // SO_TALK_COLOR
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_talkColor = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 88: // SO_ACTOR_NAME
|
2005-03-11 01:10:06 +00:00
|
|
|
loadPtrToResource(rtActorName, a->_number, NULL);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 89: // SO_INIT_ANIMATION
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_initFrame = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 91: // SO_ACTOR_WIDTH
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_width = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 92: // SO_SCALE
|
2004-01-05 16:30:00 +00:00
|
|
|
i = pop();
|
|
|
|
a->setScale(i, i);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 93: // SO_NEVER_ZCLIP
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_forceClip = 0;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2004-01-07 05:51:56 +00:00
|
|
|
case 225: // SO_ALWAYS_ZCLIP
|
2003-11-09 22:12:16 +00:00
|
|
|
case 94: // SO_ALWAYS_ZCLIP
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_forceClip = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 95: // SO_IGNORE_BOXES
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_ignoreBoxes = 1;
|
2006-02-20 16:51:30 +00:00
|
|
|
a->_forceClip = (_game.version >= 7) ? 100 : 0;
|
2002-06-04 23:32:53 +00:00
|
|
|
if (a->isInCurrentRoom())
|
2006-11-19 00:39:48 +00:00
|
|
|
a->putActor();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 96: // SO_FOLLOW_BOXES
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_ignoreBoxes = 0;
|
2006-02-20 16:51:30 +00:00
|
|
|
a->_forceClip = (_game.version >= 7) ? 100 : 0;
|
2003-05-20 23:05:34 +00:00
|
|
|
if (a->isInCurrentRoom())
|
2006-11-19 00:39:48 +00:00
|
|
|
a->putActor();
|
2003-05-20 23:05:34 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 97: // SO_ANIMATION_SPEED
|
2003-07-24 17:44:00 +00:00
|
|
|
a->setAnimSpeed(pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 98: // SO_SHADOW
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_shadowMode = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 99: // SO_TEXT_OFFSET
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_talkPosY = pop();
|
|
|
|
a->_talkPosX = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 198: // SO_ACTOR_VARIABLE
|
|
|
|
i = pop();
|
2002-05-23 00:37:00 +00:00
|
|
|
a->setAnimVar(pop(), i);
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 215: // SO_ACTOR_IGNORE_TURNS_ON
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_ignoreTurns = true;
|
2002-04-11 17:19:16 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 216: // SO_ACTOR_IGNORE_TURNS_OFF
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_ignoreTurns = false;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 217: // SO_ACTOR_NEW
|
2002-05-14 19:11:20 +00:00
|
|
|
a->initActor(2);
|
2001-11-26 19:57:57 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 227: // SO_ACTOR_DEPTH
|
2004-09-28 19:28:59 +00:00
|
|
|
a->_layer = pop();
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 228: // SO_ACTOR_WALK_SCRIPT
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_walkScript = pop();
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 229: // SO_ACTOR_STOP
|
2002-05-14 19:11:20 +00:00
|
|
|
a->stopActorMoving();
|
2004-09-28 19:28:59 +00:00
|
|
|
a->startAnimActor(a->_standFrame);
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2002-04-11 17:19:16 +00:00
|
|
|
case 230: /* set direction */
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_moving &= ~MF_TURN;
|
2002-07-18 15:45:10 +00:00
|
|
|
a->setDirection(pop());
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2002-04-11 17:19:16 +00:00
|
|
|
case 231: /* turn to direction */
|
2002-05-14 19:11:20 +00:00
|
|
|
a->turnToDirection(pop());
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 233: // SO_ACTOR_WALK_PAUSE
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_moving |= MF_FROZEN;
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 234: // SO_ACTOR_WALK_RESUME
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_moving &= ~MF_FROZEN;
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 235: // SO_ACTOR_TALK_SCRIPT
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_talkScript = pop();
|
2002-12-15 17:28:46 +00:00
|
|
|
break;
|
2001-10-16 10:01:48 +00:00
|
|
|
default:
|
2004-10-10 01:52:35 +00:00
|
|
|
error("o6_actorOps: default case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_verbOps() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int slot, a, b;
|
2001-10-16 10:01:48 +00:00
|
|
|
VerbSlot *vs;
|
2002-04-11 17:19:16 +00:00
|
|
|
|
2006-02-05 00:40:48 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
|
|
|
if (subOp == 196) {
|
2001-10-16 10:01:48 +00:00
|
|
|
_curVerb = pop();
|
|
|
|
_curVerbSlot = getVerbSlot(_curVerb, 0);
|
2006-09-16 13:38:43 +00:00
|
|
|
assertRange(0, _curVerbSlot, _numVerbs - 1, "new verb slot");
|
2001-10-16 10:01:48 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
vs = &_verbs[_curVerbSlot];
|
|
|
|
slot = _curVerbSlot;
|
2006-02-05 00:40:48 +00:00
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 124: // SO_VERB_IMAGE
|
2001-10-16 10:01:48 +00:00
|
|
|
a = pop();
|
|
|
|
if (_curVerbSlot) {
|
2002-04-11 17:19:16 +00:00
|
|
|
setVerbObject(_roomResource, a, slot);
|
2002-11-29 18:27:35 +00:00
|
|
|
vs->type = kImageVerbType;
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 61)
|
2004-06-06 11:10:47 +00:00
|
|
|
vs->imgindex = a;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 125: // SO_VERB_NAME
|
2004-09-05 09:36:51 +00:00
|
|
|
loadPtrToResource(rtVerb, slot, NULL);
|
2002-11-29 18:27:35 +00:00
|
|
|
vs->type = kTextVerbType;
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->imgindex = 0;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 126: // SO_VERB_COLOR
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->color = pop();
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 127: // SO_VERB_HICOLOR
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->hicolor = pop();
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 128: // SO_VERB_AT
|
2004-01-15 19:25:17 +00:00
|
|
|
vs->curRect.top = pop();
|
|
|
|
vs->curRect.left = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 129: // SO_VERB_ON
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->curmode = 1;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 130: // SO_VERB_OFF
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->curmode = 0;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 131: // SO_VERB_DELETE
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 60) {
|
2004-06-06 11:10:47 +00:00
|
|
|
slot = getVerbSlot(pop(), 0);
|
2005-04-20 01:33:44 +00:00
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
killVerb(slot);
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 132: // SO_VERB_NEW
|
2001-10-16 10:01:48 +00:00
|
|
|
slot = getVerbSlot(_curVerb, 0);
|
2002-04-11 17:19:16 +00:00
|
|
|
if (slot == 0) {
|
2003-12-26 23:11:35 +00:00
|
|
|
for (slot = 1; slot < _numVerbs; slot++) {
|
2002-04-11 17:19:16 +00:00
|
|
|
if (_verbs[slot].verbid == 0)
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
}
|
2003-12-26 23:11:35 +00:00
|
|
|
if (slot == _numVerbs)
|
2001-10-16 10:01:48 +00:00
|
|
|
error("Too many verbs");
|
|
|
|
_curVerbSlot = slot;
|
|
|
|
}
|
|
|
|
vs = &_verbs[slot];
|
|
|
|
vs->verbid = _curVerb;
|
|
|
|
vs->color = 2;
|
|
|
|
vs->hicolor = 0;
|
|
|
|
vs->dimcolor = 8;
|
2002-11-29 18:27:35 +00:00
|
|
|
vs->type = kTextVerbType;
|
2004-04-05 23:54:58 +00:00
|
|
|
vs->charset_nr = _string[0]._default.charset;
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->curmode = 0;
|
|
|
|
vs->saveid = 0;
|
|
|
|
vs->key = 0;
|
|
|
|
vs->center = 0;
|
|
|
|
vs->imgindex = 0;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 133: // SO_VERB_DIMCOLOR
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->dimcolor = pop();
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 134: // SO_VERB_DIM
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->curmode = 2;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 135: // SO_VERB_KEY
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->key = pop();
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 136: // SO_VERB_CENTER
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->center = 1;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 137: // SO_VERB_NAME_STR
|
2001-10-16 10:01:48 +00:00
|
|
|
a = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
if (a == 0) {
|
2003-05-21 18:09:49 +00:00
|
|
|
loadPtrToResource(rtVerb, slot, (const byte *)"");
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2003-05-21 18:09:49 +00:00
|
|
|
loadPtrToResource(rtVerb, slot, getStringAddress(a));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2002-11-29 18:27:35 +00:00
|
|
|
vs->type = kTextVerbType;
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->imgindex = 0;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 139: // SO_VERB_IMAGE_IN_ROOM
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
|
|
|
a = pop();
|
2004-06-07 00:26:08 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
if (slot && a != vs->imgindex) {
|
|
|
|
setVerbObject(b, a, slot);
|
2002-11-29 18:27:35 +00:00
|
|
|
vs->type = kImageVerbType;
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->imgindex = a;
|
|
|
|
}
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 140: // SO_VERB_BAKCOLOR
|
2001-10-16 10:01:48 +00:00
|
|
|
vs->bkcolor = pop();
|
|
|
|
break;
|
|
|
|
case 255:
|
|
|
|
drawVerb(slot, 0);
|
|
|
|
verbMouseOver(0);
|
|
|
|
break;
|
|
|
|
default:
|
2006-02-05 00:40:48 +00:00
|
|
|
error("o6_verbops: default case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getActorFromXY() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int y = pop();
|
|
|
|
int x = pop();
|
2006-02-05 15:49:09 +00:00
|
|
|
int r = getActorFromPos(x, y);
|
|
|
|
push(r);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_findObject() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int y = pop();
|
|
|
|
int x = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
int r = findObject(x, y);
|
2001-10-16 10:01:48 +00:00
|
|
|
push(r);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pseudoRoom() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int list[100];
|
2002-04-11 17:19:16 +00:00
|
|
|
int num, a, value;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(list, ARRAYSIZE(list));
|
2001-10-16 10:01:48 +00:00
|
|
|
value = pop();
|
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
while (--num >= 0) {
|
2001-10-16 10:01:48 +00:00
|
|
|
a = list[num];
|
|
|
|
if (a > 0x7F)
|
2002-04-11 17:19:16 +00:00
|
|
|
_resourceMapper[a & 0x7F] = value;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getVerbEntrypoint() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int e = pop();
|
|
|
|
int v = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
push(getVerbEntrypoint(v, e));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_arrayOps() {
|
2002-12-28 01:57:19 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
|
|
|
int array = fetchScriptWord();
|
|
|
|
int b, c, d, len;
|
2006-10-20 19:44:27 +00:00
|
|
|
byte *data;
|
2002-12-25 14:46:39 +00:00
|
|
|
int list[128];
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2002-12-28 01:57:19 +00:00
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 205: // SO_ASSIGN_STRING
|
2002-12-28 01:57:19 +00:00
|
|
|
b = pop();
|
|
|
|
len = resStrLen(_scriptPointer);
|
2006-10-20 19:44:27 +00:00
|
|
|
data = defineArray(array, kStringArray, 0, len + 1);
|
|
|
|
copyScriptString(data + b);
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 208: // SO_ASSIGN_INT_LIST
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
|
|
|
c = pop();
|
2002-12-28 01:57:19 +00:00
|
|
|
d = readVar(array);
|
2002-04-11 17:19:16 +00:00
|
|
|
if (d == 0) {
|
2004-08-01 01:54:37 +00:00
|
|
|
defineArray(array, kIntArray, 0, b + c);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
while (c--) {
|
2002-12-28 01:57:19 +00:00
|
|
|
writeArray(array, 0, b + c, pop());
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 212: // SO_ASSIGN_2DIM_LIST
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
2003-05-18 21:03:57 +00:00
|
|
|
len = getStackList(list, ARRAYSIZE(list));
|
2002-12-28 01:57:19 +00:00
|
|
|
d = readVar(array);
|
2002-04-11 17:19:16 +00:00
|
|
|
if (d == 0)
|
2001-10-16 10:01:48 +00:00
|
|
|
error("Must DIM a two dimensional array before assigning");
|
|
|
|
c = pop();
|
2002-12-28 01:57:19 +00:00
|
|
|
while (--len >= 0) {
|
|
|
|
writeArray(array, c, b + len, list[len]);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
2002-12-28 01:57:19 +00:00
|
|
|
error("o6_arrayOps: default case %d (array %d)", subOp, array);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_saveRestoreVerbs() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b, c;
|
|
|
|
int slot, slot2;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
|
2002-12-27 16:49:08 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version == 8) {
|
2002-12-27 16:49:08 +00:00
|
|
|
subOp = (subOp - 141) + 0xB4;
|
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2002-12-27 16:49:08 +00:00
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 141: // SO_SAVE_VERBS
|
2002-04-11 17:19:16 +00:00
|
|
|
while (a <= b) {
|
|
|
|
slot = getVerbSlot(a, 0);
|
|
|
|
if (slot && _verbs[slot].saveid == 0) {
|
2001-10-16 10:01:48 +00:00
|
|
|
_verbs[slot].saveid = c;
|
|
|
|
drawVerb(slot, 0);
|
|
|
|
verbMouseOver(0);
|
|
|
|
}
|
|
|
|
a++;
|
|
|
|
}
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 142: // SO_RESTORE_VERBS
|
2002-04-11 17:19:16 +00:00
|
|
|
while (a <= b) {
|
2001-10-16 10:01:48 +00:00
|
|
|
slot = getVerbSlot(a, c);
|
|
|
|
if (slot) {
|
2002-04-11 17:19:16 +00:00
|
|
|
slot2 = getVerbSlot(a, 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
if (slot2)
|
|
|
|
killVerb(slot2);
|
2002-04-11 17:19:16 +00:00
|
|
|
slot = getVerbSlot(a, c);
|
2001-10-16 10:01:48 +00:00
|
|
|
_verbs[slot].saveid = 0;
|
|
|
|
drawVerb(slot, 0);
|
|
|
|
verbMouseOver(0);
|
|
|
|
}
|
|
|
|
a++;
|
|
|
|
}
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 143: // SO_DELETE_VERBS
|
2002-04-11 17:19:16 +00:00
|
|
|
while (a <= b) {
|
|
|
|
slot = getVerbSlot(a, c);
|
2001-10-16 10:01:48 +00:00
|
|
|
if (slot)
|
|
|
|
killVerb(slot);
|
|
|
|
a++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
2001-10-23 19:51:50 +00:00
|
|
|
error("o6_saveRestoreVerbs: default case");
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_drawBox() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int x, y, x2, y2, color;
|
2001-10-16 10:01:48 +00:00
|
|
|
color = pop();
|
|
|
|
y2 = pop();
|
|
|
|
x2 = pop();
|
|
|
|
y = pop();
|
|
|
|
x = pop();
|
|
|
|
drawBox(x, y, x2, y2, color);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_wait() {
|
2003-05-28 14:01:54 +00:00
|
|
|
int actnum;
|
|
|
|
int offs = -2;
|
|
|
|
Actor *a;
|
2006-02-05 00:40:48 +00:00
|
|
|
|
2003-05-28 14:01:54 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
|
|
|
|
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 168: // SO_WAIT_FOR_ACTOR Wait for actor
|
2003-05-28 14:01:54 +00:00
|
|
|
offs = fetchScriptWordSigned();
|
|
|
|
actnum = pop();
|
|
|
|
a = derefActor(actnum, "o6_wait:168");
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7) {
|
2006-02-12 09:52:13 +00:00
|
|
|
if (a->isInCurrentRoom() && a->_moving)
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
if (a->_moving)
|
|
|
|
break;
|
|
|
|
}
|
2002-12-27 00:23:45 +00:00
|
|
|
return;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 169: // SO_WAIT_FOR_MESSAGE Wait for message
|
2003-05-08 15:48:50 +00:00
|
|
|
if (VAR(VAR_HAVE_MSG))
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
return;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 170: // SO_WAIT_FOR_CAMERA Wait for camera
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7) {
|
2003-05-28 14:01:54 +00:00
|
|
|
if (camera._dest != camera._cur)
|
2001-12-27 17:51:58 +00:00
|
|
|
break;
|
2002-03-06 00:18:22 +00:00
|
|
|
} else {
|
2003-11-16 20:52:57 +00:00
|
|
|
if (camera._cur.x / 8 != camera._dest.x / 8)
|
2002-04-11 17:19:16 +00:00
|
|
|
break;
|
2002-03-06 00:18:22 +00:00
|
|
|
}
|
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
return;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 171: // SO_WAIT_FOR_SENTENCE
|
2001-11-26 19:57:57 +00:00
|
|
|
if (_sentenceNum) {
|
2003-05-08 15:48:50 +00:00
|
|
|
if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(VAR(VAR_SENTENCE_SCRIPT)))
|
2001-10-16 10:01:48 +00:00
|
|
|
return;
|
|
|
|
break;
|
|
|
|
}
|
2003-05-08 15:48:50 +00:00
|
|
|
if (!isScriptInUse(VAR(VAR_SENTENCE_SCRIPT)))
|
2001-10-16 10:01:48 +00:00
|
|
|
return;
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 226: // SO_WAIT_FOR_ANIMATION
|
2003-05-28 14:01:54 +00:00
|
|
|
offs = fetchScriptWordSigned();
|
|
|
|
actnum = pop();
|
|
|
|
a = derefActor(actnum, "o6_wait:226");
|
2005-03-11 01:10:06 +00:00
|
|
|
if (a->isInCurrentRoom() && a->_needRedraw)
|
2003-05-31 21:25:14 +00:00
|
|
|
break;
|
2003-05-28 14:01:54 +00:00
|
|
|
return;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 232: // SO_WAIT_FOR_TURN
|
2006-02-27 23:25:07 +00:00
|
|
|
// WORKAROUND for bug #744441: An angle will often be received as the
|
2006-02-27 23:32:59 +00:00
|
|
|
// actor number due to script bugs in The Dig. In all cases where this
|
2006-02-27 23:25:07 +00:00
|
|
|
// occurs, _curActor is set just before it, so we can use it instead.
|
2006-02-27 22:15:21 +00:00
|
|
|
//
|
|
|
|
// For now, if the value passed in is divisible by 45, assume it is an
|
2006-02-27 23:25:07 +00:00
|
|
|
// angle, and use _curActor as the actor to wait for.
|
2003-05-28 14:01:54 +00:00
|
|
|
offs = fetchScriptWordSigned();
|
2006-02-27 22:15:21 +00:00
|
|
|
actnum = pop();
|
2006-02-27 23:25:07 +00:00
|
|
|
if (actnum % 45 == 0) {
|
2006-02-27 22:15:21 +00:00
|
|
|
actnum = _curActor;
|
|
|
|
}
|
2003-05-28 14:01:54 +00:00
|
|
|
a = derefActor(actnum, "o6_wait:232b");
|
2005-03-11 01:10:06 +00:00
|
|
|
if (a->isInCurrentRoom() && a->_moving & MF_TURN)
|
2003-05-31 21:25:14 +00:00
|
|
|
break;
|
2003-05-28 14:01:54 +00:00
|
|
|
return;
|
2001-10-16 10:01:48 +00:00
|
|
|
default:
|
2003-05-28 14:01:54 +00:00
|
|
|
error("o6_wait: default case 0x%x", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-05-28 14:01:54 +00:00
|
|
|
_scriptPointer += offs;
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_breakHere();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_soundKludge() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int list[16];
|
2003-05-18 21:03:57 +00:00
|
|
|
int num = getStackList(list, ARRAYSIZE(list));
|
2002-05-25 19:40:42 +00:00
|
|
|
|
2002-12-25 14:46:39 +00:00
|
|
|
_sound->soundKludge(list, num);
|
2006-01-23 19:08:47 +00:00
|
|
|
|
|
|
|
// WORKAROUND for bug #1398195: The room-11-2016 script contains a
|
|
|
|
// slight bug causing it to busy-wait for a sound to finish. Even under
|
|
|
|
// the best of circumstances, this will cause the game to hang briefly.
|
|
|
|
// On platforms where threading is cooperative, it will cause the game
|
|
|
|
// to hang indefinitely. We identify the buggy part of the script by
|
|
|
|
// looking for a soundKludge() opcode immediately followed by a jump.
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.id == GID_CMI && _roomResource == 11 && vm.slot[_currentScript].number == 2016 && *_scriptPointer == 0x66) {
|
2006-01-23 19:08:47 +00:00
|
|
|
debug(3, "Working around script bug in room-11-2016");
|
|
|
|
o6_breakHere();
|
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_isAnyOf() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int list[100];
|
2001-10-16 10:01:48 +00:00
|
|
|
int num;
|
2006-01-16 09:20:27 +00:00
|
|
|
int32 val;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(list, ARRAYSIZE(list));
|
2001-10-16 10:01:48 +00:00
|
|
|
val = pop();
|
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
while (--num >= 0) {
|
2001-10-16 10:01:48 +00:00
|
|
|
if (list[num] == val) {
|
|
|
|
push(1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2005-03-07 06:37:56 +00:00
|
|
|
|
2001-10-16 10:01:48 +00:00
|
|
|
push(0);
|
|
|
|
}
|
|
|
|
|
2005-05-28 08:37:44 +00:00
|
|
|
void ScummEngine_v6::o6_systemOps() {
|
2003-06-02 02:25:24 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
2006-02-05 00:40:48 +00:00
|
|
|
|
2003-06-02 02:25:24 +00:00
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 158: // SO_RESTART
|
2003-06-02 02:25:24 +00:00
|
|
|
restart();
|
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 159: // SO_PAUSE
|
2003-06-02 02:25:24 +00:00
|
|
|
pauseGame();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 160: // SO_QUIT
|
2003-06-02 02:25:24 +00:00
|
|
|
shutDown();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
default:
|
2005-05-28 08:37:44 +00:00
|
|
|
error("o6_systemOps invalid case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_delay() {
|
2001-10-16 10:01:48 +00:00
|
|
|
uint32 delay = (uint16)pop();
|
|
|
|
vm.slot[_currentScript].delay = delay;
|
2003-09-11 10:32:15 +00:00
|
|
|
vm.slot[_currentScript].status = ssPaused;
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_breakHere();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_delaySeconds() {
|
2003-01-14 10:33:18 +00:00
|
|
|
uint32 delay = (uint32)pop();
|
2005-10-21 23:31:23 +00:00
|
|
|
delay = delay * 60;
|
2001-10-16 10:01:48 +00:00
|
|
|
vm.slot[_currentScript].delay = delay;
|
2003-09-11 10:32:15 +00:00
|
|
|
vm.slot[_currentScript].status = ssPaused;
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_breakHere();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_delayMinutes() {
|
2001-10-16 10:01:48 +00:00
|
|
|
uint32 delay = (uint16)pop() * 3600;
|
|
|
|
vm.slot[_currentScript].delay = delay;
|
2003-09-11 10:32:15 +00:00
|
|
|
vm.slot[_currentScript].status = ssPaused;
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_breakHere();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopSentence() {
|
2001-11-26 19:57:57 +00:00
|
|
|
_sentenceNum = 0;
|
2003-05-20 20:58:26 +00:00
|
|
|
stopScript(VAR(VAR_SENTENCE_SCRIPT));
|
2001-10-16 10:01:48 +00:00
|
|
|
clearClickedStatus();
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_printLine() {
|
2001-10-16 10:01:48 +00:00
|
|
|
_actorToPrintStrFor = 0xFF;
|
2002-12-23 15:46:53 +00:00
|
|
|
decodeParseString(0, 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2005-06-13 07:09:12 +00:00
|
|
|
void ScummEngine_v6::o6_printText() {
|
2002-12-23 15:46:53 +00:00
|
|
|
decodeParseString(1, 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_printDebug() {
|
2002-12-23 15:46:53 +00:00
|
|
|
decodeParseString(2, 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_printSystem() {
|
2002-12-23 15:46:53 +00:00
|
|
|
decodeParseString(3, 0);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_printActor() {
|
2002-12-23 15:46:53 +00:00
|
|
|
decodeParseString(0, 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_printEgo() {
|
2003-05-08 15:48:50 +00:00
|
|
|
push(VAR(VAR_EGO));
|
2003-01-16 14:42:20 +00:00
|
|
|
decodeParseString(0, 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_talkActor() {
|
2001-10-16 10:01:48 +00:00
|
|
|
_actorToPrintStrFor = pop();
|
2003-06-01 00:45:08 +00:00
|
|
|
|
2004-04-05 23:54:58 +00:00
|
|
|
_string[0].loadDefault();
|
2004-03-19 23:19:57 +00:00
|
|
|
actorTalk(_scriptPointer);
|
|
|
|
|
|
|
|
_scriptPointer += resStrLen(_scriptPointer) + 1;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_talkEgo() {
|
2003-05-08 15:48:50 +00:00
|
|
|
push(VAR(VAR_EGO));
|
2002-12-26 21:50:13 +00:00
|
|
|
o6_talkActor();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-11-10 08:00:55 +00:00
|
|
|
void ScummEngine_v6::o6_dimArray() {
|
2001-10-16 10:01:48 +00:00
|
|
|
int data;
|
|
|
|
|
2006-02-05 00:40:48 +00:00
|
|
|
byte subOp = fetchScriptByte();
|
|
|
|
|
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 199: // SO_INT_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kIntArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 200: // SO_BIT_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kBitArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 201: // SO_NIBBLE_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kNibbleArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 202: // SO_BYTE_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kByteArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 203: // SO_STRING_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kStringArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 204: // SO_UNDIM_ARRAY
|
2001-10-16 10:01:48 +00:00
|
|
|
nukeArray(fetchScriptWord());
|
|
|
|
return;
|
|
|
|
default:
|
2006-02-05 00:40:48 +00:00
|
|
|
error("o6_dimArray: default case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
defineArray(fetchScriptWord(), data, 0, pop());
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_dummy() {
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion >= 60) {
|
2004-08-02 07:49:20 +00:00
|
|
|
stopObjectCode();
|
2005-04-20 01:33:44 +00:00
|
|
|
}
|
2002-12-16 12:12:31 +00:00
|
|
|
}
|
|
|
|
|
2003-11-10 08:00:55 +00:00
|
|
|
void ScummEngine_v6::o6_dim2dimArray() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b, data;
|
2006-02-05 00:40:48 +00:00
|
|
|
|
|
|
|
byte subOp = fetchScriptByte();
|
|
|
|
|
|
|
|
switch (subOp) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 199: // SO_INT_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kIntArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 200: // SO_BIT_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kBitArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 201: // SO_NIBBLE_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kNibbleArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 202: // SO_BYTE_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kByteArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 203: // SO_STRING_ARRAY
|
2004-08-01 01:54:37 +00:00
|
|
|
data = kStringArray;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
|
|
|
default:
|
2006-02-05 00:40:48 +00:00
|
|
|
error("o6_dim2dimArray: default case %d", subOp);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
defineArray(fetchScriptWord(), data, a, b);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_abs() {
|
2005-05-25 09:17:35 +00:00
|
|
|
int a = pop();
|
|
|
|
push(ABS(a));
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_distObjectObject() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b;
|
2001-10-16 10:01:48 +00:00
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
push(getDistanceBetween(true, a, 0, true, b, 0));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_distObjectPt() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b, c;
|
2001-10-16 10:01:48 +00:00
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
push(getDistanceBetween(true, a, 0, false, b, c));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_distPtPt() {
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b, c, d;
|
2001-10-16 10:01:48 +00:00
|
|
|
d = pop();
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
push(getDistanceBetween(false, a, b, false, c, d));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_drawBlastObject() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[16];
|
2002-04-11 17:19:16 +00:00
|
|
|
int a, b, c, d, e;
|
2001-12-27 17:51:58 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2001-12-27 17:51:58 +00:00
|
|
|
e = pop();
|
|
|
|
d = pop();
|
|
|
|
c = pop();
|
|
|
|
b = pop();
|
|
|
|
a = pop();
|
|
|
|
enqueueObject(a, b, c, d, e, 0xFF, 0xFF, 1, 0);
|
|
|
|
}
|
|
|
|
|
2002-12-23 15:46:53 +00:00
|
|
|
// Set BOMP processing window
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_setBlastObjectWindow() {
|
2005-06-17 17:10:54 +00:00
|
|
|
pop();
|
|
|
|
pop();
|
|
|
|
pop();
|
|
|
|
pop();
|
2002-12-23 15:46:53 +00:00
|
|
|
|
2005-06-17 17:10:54 +00:00
|
|
|
// None of the scripts of The Dig and Full Throttle use this opcode.
|
|
|
|
// Sam & Max only uses it at the beginning of the highway subgame. In
|
|
|
|
// the original interpreter pop'ed arguments are just ignored and the
|
|
|
|
// clipping blastObject window is defined with (0, 0, 320, 200)...
|
|
|
|
// which matches the screen dimensions and thus, doesn't require
|
|
|
|
// another clipping operation.
|
|
|
|
// So, we just handle this as no-op opcode.
|
2002-12-23 15:46:53 +00:00
|
|
|
}
|
|
|
|
|
2006-11-13 20:12:52 +00:00
|
|
|
#ifndef DISABLE_SCUMM_7_8
|
|
|
|
void ScummEngine_v7::o6_kernelSetFunctions() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[30];
|
2003-05-24 17:04:54 +00:00
|
|
|
int num;
|
2001-11-11 16:54:45 +00:00
|
|
|
Actor *a;
|
2002-04-23 18:11:36 +00:00
|
|
|
|
2003-05-24 17:04:54 +00:00
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
2001-11-26 19:57:57 +00:00
|
|
|
|
2006-11-13 20:12:52 +00:00
|
|
|
switch (args[0]) {
|
|
|
|
case 4:
|
|
|
|
grabCursor(args[1], args[2], args[3], args[4]);
|
|
|
|
break;
|
|
|
|
case 6: {
|
|
|
|
if (_smushFrameRate == 0)
|
|
|
|
_smushFrameRate = 14;
|
|
|
|
|
|
|
|
// SMUSH movie playback
|
|
|
|
if (args[1] == 0) {
|
2006-11-13 20:20:01 +00:00
|
|
|
const char *videoname = (const char *)getStringAddressVar(VAR_VIDEONAME);
|
|
|
|
assert(videoname);
|
|
|
|
if (strcmp(videoname, "sq3.san") == 0)
|
2004-08-07 11:52:11 +00:00
|
|
|
_smushFrameRate = 14;
|
2003-03-06 17:58:13 +00:00
|
|
|
|
2006-11-13 20:12:52 +00:00
|
|
|
// Correct incorrect smush filename in Macintosh FT demo
|
|
|
|
if ((_game.id == GID_FT) && (_game.features & GF_DEMO) && (_game.platform == Common::kPlatformMacintosh) &&
|
2006-11-13 20:20:01 +00:00
|
|
|
(strcmp(videoname, "jumpgorge.san") == 0))
|
2006-11-13 20:12:52 +00:00
|
|
|
_splayer->play("jumpgorg.san", _smushFrameRate);
|
|
|
|
else
|
2006-11-13 20:20:01 +00:00
|
|
|
_splayer->play(videoname, _smushFrameRate);
|
2006-11-13 20:12:52 +00:00
|
|
|
|
|
|
|
if (_game.id == GID_DIG) {
|
|
|
|
_disableFadeInEffect = true;
|
2002-10-06 06:36:22 +00:00
|
|
|
}
|
2006-11-13 20:12:52 +00:00
|
|
|
} else if (_game.id == GID_FT) {
|
|
|
|
const int insaneVarNum = ((_game.features & GF_DEMO) && (_game.platform == Common::kPlatformPC))
|
|
|
|
? 232 : 233;
|
|
|
|
|
|
|
|
_insaneRunning = true;
|
|
|
|
_insane->setSmushParams(_smushFrameRate);
|
|
|
|
_insane->runScene(insaneVarNum);
|
|
|
|
_insaneRunning = false;
|
2003-03-06 17:58:13 +00:00
|
|
|
}
|
2002-02-23 23:23:28 +00:00
|
|
|
}
|
2006-11-13 20:12:52 +00:00
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
setCursorFromImg(args[1], (uint) - 1, args[2]);
|
|
|
|
break;
|
|
|
|
case 13:
|
|
|
|
derefActor(args[1], "o6_kernelSetFunctions:13")->remapActorPalette(args[2], args[3], args[4], -1);
|
|
|
|
break;
|
|
|
|
case 14:
|
|
|
|
derefActor(args[1], "o6_kernelSetFunctions:14")->remapActorPalette(args[2], args[3], args[4], args[5]);
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
_smushFrameRate = args[1];
|
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
case 17:
|
|
|
|
enqueueText(getStringAddressVar(VAR_STRING2DRAW), args[3], args[4], args[2], args[1], (args[0] == 16));
|
|
|
|
break;
|
|
|
|
case 20:
|
|
|
|
// it's used for turn on/off 'RadioChatter' effect for voice in the dig, but i's not needed
|
|
|
|
break;
|
|
|
|
case 107:
|
|
|
|
a = derefActor(args[1], "o6_kernelSetFunctions: 107");
|
|
|
|
a->setScale((unsigned char)args[2], -1);
|
|
|
|
break;
|
|
|
|
case 108:
|
|
|
|
setShadowPalette(args[1], args[2], args[3], args[4], args[5], args[6]);
|
|
|
|
break;
|
|
|
|
case 109:
|
|
|
|
setShadowPalette(0, args[1], args[2], args[3], args[4], args[5]);
|
|
|
|
break;
|
|
|
|
case 114:
|
|
|
|
error("o6_kernelSetFunctions: stub114()");
|
|
|
|
break;
|
|
|
|
case 117:
|
|
|
|
freezeScripts(2);
|
|
|
|
break;
|
|
|
|
case 118:
|
|
|
|
enqueueObject(args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], 3);
|
|
|
|
break;
|
|
|
|
case 119:
|
|
|
|
enqueueObject(args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], 0);
|
|
|
|
break;
|
|
|
|
case 124:
|
|
|
|
_saveSound = args[1];
|
|
|
|
break;
|
|
|
|
case 215:
|
|
|
|
ConfMan.setBool("subtitles", args[1] != 0);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
error("o6_kernelSetFunctions: default case %d (param count %d)", args[0], num);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void ScummEngine_v6::o6_kernelSetFunctions() {
|
|
|
|
int args[30];
|
|
|
|
int num;
|
|
|
|
Actor *a;
|
|
|
|
|
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
|
|
|
|
|
|
|
switch (args[0]) {
|
|
|
|
case 3:
|
|
|
|
// Dummy case
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
grabCursor(args[1], args[2], args[3], args[4]);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
fadeOut(args[1]);
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
_fullRedraw = true;
|
|
|
|
redrawBGAreas();
|
|
|
|
setActorRedrawFlags();
|
|
|
|
processActors();
|
|
|
|
fadeIn(args[1]);
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
startManiac();
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
killAllScriptsExceptCurrent();
|
|
|
|
break;
|
|
|
|
case 104: /* samnmax */
|
|
|
|
nukeFlObjects(args[2], args[3]);
|
|
|
|
break;
|
|
|
|
case 107: /* set actor scale */
|
|
|
|
a = derefActor(args[1], "o6_kernelSetFunctions: 107");
|
|
|
|
a->setScale((unsigned char)args[2], -1);
|
|
|
|
break;
|
|
|
|
case 108: /* create proc_special_palette */
|
|
|
|
case 109:
|
|
|
|
// Case 108 and 109 share the same function
|
|
|
|
if (num != 6)
|
|
|
|
error("o6_kernelSetFunctions sub op %d: expected 6 params but got %d", args[0], num);
|
|
|
|
setShadowPalette(args[3], args[4], args[5], args[1], args[2], 0, 256);
|
|
|
|
break;
|
|
|
|
case 110:
|
2007-01-28 20:11:31 +00:00
|
|
|
clearCharsetMask();
|
2006-11-13 20:12:52 +00:00
|
|
|
break;
|
|
|
|
case 111:
|
|
|
|
a = derefActor(args[1], "o6_kernelSetFunctions: 111");
|
|
|
|
a->_shadowMode = args[2] + args[3];
|
|
|
|
break;
|
|
|
|
case 112: /* palette shift? */
|
|
|
|
setShadowPalette(args[3], args[4], args[5], args[1], args[2], args[6], args[7]);
|
|
|
|
break;
|
|
|
|
case 114:
|
|
|
|
// Sam & Max film noir mode
|
|
|
|
if (_game.id == GID_SAMNMAX) {
|
|
|
|
// At this point ScummVM will already have set
|
|
|
|
// variable 0x8000 to indicate that the game is
|
|
|
|
// in film noir mode. All we have to do here is
|
|
|
|
// to mark the palette as "dirty", because
|
|
|
|
// updatePalette() will desaturate the colors
|
|
|
|
// as they are uploaded to the backend.
|
2003-06-13 06:45:05 +00:00
|
|
|
//
|
2006-11-13 20:12:52 +00:00
|
|
|
// This actually works better than the original
|
|
|
|
// interpreter, where actors would sometimes
|
|
|
|
// still be drawn in color.
|
|
|
|
setDirtyColors(0, 255);
|
|
|
|
} else
|
|
|
|
error("stub o6_kernelSetFunctions_114()");
|
|
|
|
break;
|
|
|
|
case 117:
|
|
|
|
// Sam & Max uses this opcode in script-43, right
|
|
|
|
// before a screensaver is selected.
|
|
|
|
//
|
|
|
|
// Sam & Max uses variable 132 to specify the number of
|
|
|
|
// minutes of inactivity (no mouse movements) before
|
|
|
|
// starting the screensaver, so setting it to 0 will
|
|
|
|
// help in debugging.
|
|
|
|
freezeScripts(0x80);
|
|
|
|
break;
|
|
|
|
case 119:
|
|
|
|
enqueueObject(args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], 0);
|
|
|
|
break;
|
|
|
|
case 120:
|
|
|
|
swapPalColors(args[1], args[2]);
|
|
|
|
break;
|
|
|
|
case 122:
|
|
|
|
VAR(VAR_SOUNDRESULT) =
|
|
|
|
(short)_imuse->doCommand (num - 1, &args[1]);
|
|
|
|
break;
|
|
|
|
case 123:
|
|
|
|
copyPalColor(args[2], args[1]);
|
|
|
|
break;
|
|
|
|
case 124:
|
|
|
|
_saveSound = args[1];
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
error("o6_kernelSetFunctions: default case %d (param count %d)", args[0], num);
|
|
|
|
break;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2001-11-26 19:57:57 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_kernelGetFunctions() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[30];
|
2001-11-26 19:57:57 +00:00
|
|
|
int i;
|
2003-11-08 03:33:21 +00:00
|
|
|
int slot;
|
2001-11-26 19:57:57 +00:00
|
|
|
Actor *a;
|
2006-02-28 00:46:05 +00:00
|
|
|
VirtScreen *vs = &virtscr[0];
|
2001-11-26 19:57:57 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
getStackList(args, ARRAYSIZE(args));
|
2002-11-20 00:52:07 +00:00
|
|
|
|
2002-04-11 17:19:16 +00:00
|
|
|
switch (args[0]) {
|
2002-03-07 04:29:24 +00:00
|
|
|
case 113:
|
2006-02-28 00:46:05 +00:00
|
|
|
// WORKAROUND for bug #899249: The scripts used for screen savers
|
|
|
|
// in Sam & Max use hard coded values for the maximum height and width.
|
|
|
|
// This causes problems in rooms (ie. Credits) where their values are
|
|
|
|
// lower, so we set result to zero if out of bounds.
|
|
|
|
if (args[1] >= 0 && args[1] <= vs->w && args[2] >= 0 && args[2] <= vs->h) {
|
|
|
|
byte pixel = *vs->getPixels(args[1], args[2]);
|
|
|
|
push(pixel);
|
|
|
|
} else {
|
|
|
|
push(0);
|
2004-03-05 11:08:29 +00:00
|
|
|
}
|
2002-03-07 04:29:24 +00:00
|
|
|
break;
|
2001-11-26 19:57:57 +00:00
|
|
|
case 115:
|
2002-04-25 08:53:10 +00:00
|
|
|
push(getSpecialBox(args[1], args[2]));
|
2001-11-26 19:57:57 +00:00
|
|
|
break;
|
|
|
|
case 116:
|
|
|
|
push(checkXYInBoxBounds(args[3], args[1], args[2]));
|
|
|
|
break;
|
|
|
|
case 206:
|
2004-09-21 13:54:30 +00:00
|
|
|
push(remapPaletteColor(args[1], args[2], args[3], -1));
|
2001-11-26 19:57:57 +00:00
|
|
|
break;
|
|
|
|
case 207:
|
2002-11-02 12:39:42 +00:00
|
|
|
i = getObjectIndex(args[1]);
|
2004-10-08 06:52:08 +00:00
|
|
|
assert(i);
|
2001-11-26 19:57:57 +00:00
|
|
|
push(_objs[i].x_pos);
|
|
|
|
break;
|
|
|
|
case 208:
|
2002-11-02 12:39:42 +00:00
|
|
|
i = getObjectIndex(args[1]);
|
2004-10-08 06:52:08 +00:00
|
|
|
assert(i);
|
2001-11-26 19:57:57 +00:00
|
|
|
push(_objs[i].y_pos);
|
|
|
|
break;
|
|
|
|
case 209:
|
2002-11-02 12:39:42 +00:00
|
|
|
i = getObjectIndex(args[1]);
|
2004-10-08 06:52:08 +00:00
|
|
|
assert(i);
|
2001-11-26 19:57:57 +00:00
|
|
|
push(_objs[i].width);
|
|
|
|
break;
|
|
|
|
case 210:
|
2002-11-02 12:39:42 +00:00
|
|
|
i = getObjectIndex(args[1]);
|
2004-10-08 06:52:08 +00:00
|
|
|
assert(i);
|
2001-11-26 19:57:57 +00:00
|
|
|
push(_objs[i].height);
|
|
|
|
break;
|
|
|
|
case 211:
|
2002-04-25 08:53:10 +00:00
|
|
|
/*
|
2002-07-07 13:14:34 +00:00
|
|
|
13 = thrust
|
|
|
|
336 = thrust
|
|
|
|
328 = thrust
|
2003-03-18 19:26:00 +00:00
|
|
|
27 = abort
|
2002-07-07 13:14:34 +00:00
|
|
|
97 = left
|
|
|
|
331 = left
|
|
|
|
115 = right
|
2003-03-18 19:26:00 +00:00
|
|
|
333 = right
|
2002-07-07 13:14:34 +00:00
|
|
|
*/
|
2002-09-21 17:51:52 +00:00
|
|
|
|
2004-01-02 00:36:20 +00:00
|
|
|
push(getKeyState(args[1]));
|
2001-11-26 19:57:57 +00:00
|
|
|
break;
|
|
|
|
case 212:
|
2003-05-23 13:24:41 +00:00
|
|
|
a = derefActor(args[1], "o6_kernelGetFunctions:212");
|
2002-12-15 17:28:46 +00:00
|
|
|
// This is used by walk scripts
|
2005-03-11 01:10:06 +00:00
|
|
|
push(a->_frame);
|
2001-11-26 19:57:57 +00:00
|
|
|
break;
|
2003-11-08 03:33:21 +00:00
|
|
|
case 213:
|
|
|
|
slot = getVerbSlot(args[1], 0);
|
2004-01-15 19:25:17 +00:00
|
|
|
push(_verbs[slot].curRect.left);
|
2003-11-08 03:33:21 +00:00
|
|
|
break;
|
|
|
|
case 214:
|
|
|
|
slot = getVerbSlot(args[1], 0);
|
2004-01-15 19:25:17 +00:00
|
|
|
push(_verbs[slot].curRect.top);
|
2003-11-08 03:33:21 +00:00
|
|
|
break;
|
2002-03-06 09:40:21 +00:00
|
|
|
case 215:
|
2002-09-07 19:55:16 +00:00
|
|
|
if ((_extraBoxFlags[args[1]] & 0x00FF) == 0x00C0) {
|
2002-03-06 09:40:21 +00:00
|
|
|
push(_extraBoxFlags[args[1]]);
|
2002-04-11 17:19:16 +00:00
|
|
|
} else {
|
2002-12-30 00:40:25 +00:00
|
|
|
push(getBoxFlags(args[1]));
|
2002-03-06 09:40:21 +00:00
|
|
|
}
|
|
|
|
break;
|
2001-11-26 19:57:57 +00:00
|
|
|
default:
|
2003-01-06 01:53:38 +00:00
|
|
|
error("o6_kernelGetFunctions: default case %d", args[0]);
|
2001-11-26 19:57:57 +00:00
|
|
|
}
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
|
2003-12-05 00:02:01 +00:00
|
|
|
int ScummEngine::getKeyState(int key) {
|
2004-10-22 10:25:56 +00:00
|
|
|
switch (key) {
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x147: // Home
|
2007-06-23 11:53:24 +00:00
|
|
|
// FIXME: There seems to be a mistake in the code here ("insert" vs. "home")
|
|
|
|
return (_keyDownMap[Common::KEYCODE_KP7] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_INSERT]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x148: // Up
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP8] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_UP] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_8]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x149: // PgUp
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP9] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_PAGEUP]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x14B: // Left
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP4] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_LEFT] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_4]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x14D: // Right
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP6] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_RIGHT] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_6]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x14F: // End
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP1] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_END]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x150: // Down
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP2] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_DOWN] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_2]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
case 0x151: // PgDn
|
2007-06-23 11:53:24 +00:00
|
|
|
return (_keyDownMap[Common::KEYCODE_KP3] ||
|
|
|
|
_keyDownMap[Common::KEYCODE_PAGEDOWN]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
default:
|
2006-03-19 11:10:24 +00:00
|
|
|
return (_keyDownMap[key]) ? 1 : 0;
|
2003-12-05 00:02:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_delayFrames() {
|
2001-10-16 10:01:48 +00:00
|
|
|
ScriptSlot *ss = &vm.slot[_currentScript];
|
2003-01-06 13:41:29 +00:00
|
|
|
if (ss->delayFrameCount == 0) {
|
2002-08-25 11:35:13 +00:00
|
|
|
ss->delayFrameCount = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
} else {
|
2002-08-25 11:35:13 +00:00
|
|
|
ss->delayFrameCount--;
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
2002-08-25 11:35:13 +00:00
|
|
|
if (ss->delayFrameCount) {
|
2001-10-16 10:01:48 +00:00
|
|
|
_scriptPointer--;
|
2001-10-23 19:51:50 +00:00
|
|
|
o6_breakHere();
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pickOneOf() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[100];
|
2002-04-11 17:19:16 +00:00
|
|
|
int i, num;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
i = pop();
|
2003-05-19 04:29:41 +00:00
|
|
|
if (i < 0 || i > num)
|
|
|
|
error("o6_pickOneOf: %d out of range (0, %d)", i, num - 1);
|
2001-10-16 10:01:48 +00:00
|
|
|
push(args[i]);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pickOneOfDefault() {
|
2002-12-25 14:46:39 +00:00
|
|
|
int args[100];
|
2002-04-11 17:19:16 +00:00
|
|
|
int i, num, def;
|
2001-10-16 10:01:48 +00:00
|
|
|
|
|
|
|
def = pop();
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
2001-10-16 10:01:48 +00:00
|
|
|
i = pop();
|
2002-04-11 17:19:16 +00:00
|
|
|
if (i < 0 || i >= num)
|
2001-10-16 10:01:48 +00:00
|
|
|
i = def;
|
|
|
|
else
|
|
|
|
i = args[i];
|
|
|
|
push(i);
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stampObject() {
|
2003-02-22 20:57:57 +00:00
|
|
|
int object, x, y, state;
|
2004-02-14 16:59:28 +00:00
|
|
|
|
2003-02-22 20:57:57 +00:00
|
|
|
state = pop();
|
2003-02-16 14:52:25 +00:00
|
|
|
y = pop();
|
2003-02-22 20:57:57 +00:00
|
|
|
x = pop();
|
|
|
|
object = pop();
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version >= 7 && object < 30) {
|
2004-06-02 13:32:16 +00:00
|
|
|
if (state == 0)
|
2003-02-22 20:57:57 +00:00
|
|
|
state = 255;
|
2004-06-02 13:32:16 +00:00
|
|
|
|
2003-05-23 13:24:41 +00:00
|
|
|
Actor *a = derefActor(object, "o6_stampObject");
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_scalex = state;
|
|
|
|
a->_scaley = state;
|
2004-06-29 10:21:53 +00:00
|
|
|
a->putActor(x, y, _currentRoom);
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_drawToBackBuf = true;
|
2004-06-29 10:21:53 +00:00
|
|
|
a->drawActorCostume();
|
2005-03-11 01:10:06 +00:00
|
|
|
a->_drawToBackBuf = false;
|
2003-07-20 21:01:06 +00:00
|
|
|
a->drawActorCostume();
|
2003-02-22 20:57:57 +00:00
|
|
|
return;
|
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-06-02 13:32:16 +00:00
|
|
|
if (state == 0)
|
2003-07-20 20:42:58 +00:00
|
|
|
state = 1;
|
2004-06-02 13:32:16 +00:00
|
|
|
|
|
|
|
int objnum = getObjectIndex(object);
|
2004-10-08 06:52:08 +00:00
|
|
|
if (objnum == -1)
|
2004-06-02 13:32:16 +00:00
|
|
|
return;
|
2003-02-22 20:57:57 +00:00
|
|
|
|
2003-07-20 20:42:58 +00:00
|
|
|
if (x != -1) {
|
2004-06-02 13:32:16 +00:00
|
|
|
_objs[objnum].x_pos = x * 8;
|
|
|
|
_objs[objnum].y_pos = y * 8;
|
2003-07-20 20:42:58 +00:00
|
|
|
}
|
2004-06-02 13:32:16 +00:00
|
|
|
|
|
|
|
putState(object, state);
|
|
|
|
drawObject(objnum, 0);
|
2002-10-16 10:59:29 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_stopTalking() {
|
2003-02-17 10:14:43 +00:00
|
|
|
stopTalk();
|
2003-02-14 08:12:45 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_findAllObjects() {
|
2004-09-04 08:13:48 +00:00
|
|
|
int room = pop();
|
2003-02-17 10:14:43 +00:00
|
|
|
int i = 1;
|
|
|
|
|
2004-09-04 08:13:48 +00:00
|
|
|
if (room != _currentRoom)
|
2005-08-14 01:41:52 +00:00
|
|
|
error("o6_findAllObjects: current room is not %d", room);
|
2003-02-17 10:14:43 +00:00
|
|
|
writeVar(0, 0);
|
2004-08-01 01:54:37 +00:00
|
|
|
defineArray(0, kIntArray, 0, _numLocalObjects + 1);
|
2003-02-17 10:40:02 +00:00
|
|
|
writeArray(0, 0, 0, _numLocalObjects);
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2003-06-07 00:49:36 +00:00
|
|
|
while (i < _numLocalObjects) {
|
2003-02-17 10:14:43 +00:00
|
|
|
writeArray(0, 0, i, _objs[i].obj_nr);
|
|
|
|
i++;
|
|
|
|
}
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2003-02-17 10:14:43 +00:00
|
|
|
push(readVar(0));
|
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::shuffleArray(int num, int minIdx, int maxIdx) {
|
2003-03-07 21:38:46 +00:00
|
|
|
int range = maxIdx - minIdx;
|
|
|
|
int count = range * 2;
|
|
|
|
|
2003-03-07 21:49:06 +00:00
|
|
|
// Shuffle the array 'num'
|
2003-03-07 21:38:46 +00:00
|
|
|
while (count--) {
|
2003-03-07 21:49:06 +00:00
|
|
|
// Determine two random elements...
|
2003-03-07 21:38:46 +00:00
|
|
|
int rand1 = _rnd.getRandomNumber(range) + minIdx;
|
|
|
|
int rand2 = _rnd.getRandomNumber(range) + minIdx;
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2003-03-07 21:49:06 +00:00
|
|
|
// ...and swap them
|
|
|
|
int val1 = readArray(num, 0, rand1);
|
|
|
|
int val2 = readArray(num, 0, rand2);
|
|
|
|
writeArray(num, 0, rand1, val2);
|
2003-03-07 21:54:45 +00:00
|
|
|
writeArray(num, 0, rand2, val1);
|
2003-03-02 12:35:27 +00:00
|
|
|
}
|
2003-02-20 21:05:56 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_shuffle() {
|
2004-02-13 01:01:23 +00:00
|
|
|
int b = pop();
|
2004-02-13 01:06:31 +00:00
|
|
|
int a = pop();
|
2004-02-13 01:01:23 +00:00
|
|
|
shuffleArray(fetchScriptWord(), a, b);
|
2003-02-21 00:42:51 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_pickVarRandom() {
|
2003-02-19 01:42:21 +00:00
|
|
|
int num;
|
2003-02-20 21:05:56 +00:00
|
|
|
int args[100];
|
2004-09-16 13:51:03 +00:00
|
|
|
int dim1;
|
2003-02-17 21:42:33 +00:00
|
|
|
|
2003-05-18 21:03:57 +00:00
|
|
|
num = getStackList(args, ARRAYSIZE(args));
|
2003-02-22 11:56:25 +00:00
|
|
|
int value = fetchScriptWord();
|
2003-02-20 21:05:56 +00:00
|
|
|
|
|
|
|
if (readVar(value) == 0) {
|
2004-09-16 14:31:16 +00:00
|
|
|
defineArray(value, kIntArray, 0, num);
|
2003-02-20 21:05:56 +00:00
|
|
|
if (num > 0) {
|
|
|
|
int16 counter = 0;
|
|
|
|
do {
|
2003-02-22 11:56:25 +00:00
|
|
|
writeArray(value, 0, counter + 1, args[counter]);
|
2003-02-20 21:05:56 +00:00
|
|
|
} while (++counter < num);
|
|
|
|
}
|
|
|
|
|
2004-09-16 14:31:16 +00:00
|
|
|
shuffleArray(value, 1, num);
|
2003-02-20 21:05:56 +00:00
|
|
|
writeArray(value, 0, 0, 2);
|
|
|
|
push(readArray(value, 0, 1));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
num = readArray(value, 0, 0);
|
2003-03-07 21:38:46 +00:00
|
|
|
|
2006-10-20 19:44:27 +00:00
|
|
|
ArrayHeader *ah = getArray(value);
|
2004-09-16 13:51:03 +00:00
|
|
|
dim1 = FROM_LE_16(ah->dim1) - 1;
|
2003-02-20 21:05:56 +00:00
|
|
|
|
2004-09-16 23:34:26 +00:00
|
|
|
if (dim1 < num) {
|
2004-09-16 12:54:32 +00:00
|
|
|
int16 var_2 = readArray(value, 0, num - 1);
|
2004-09-16 13:51:03 +00:00
|
|
|
shuffleArray(value, 1, dim1);
|
2003-02-22 11:56:25 +00:00
|
|
|
if (readArray(value, 0, 1) == var_2) {
|
2003-02-20 21:05:56 +00:00
|
|
|
num = 2;
|
2003-02-22 11:56:25 +00:00
|
|
|
} else {
|
|
|
|
num = 1;
|
2003-02-20 21:05:56 +00:00
|
|
|
}
|
|
|
|
}
|
2003-02-17 21:42:33 +00:00
|
|
|
|
2003-02-20 21:05:56 +00:00
|
|
|
writeArray(value, 0, 0, num + 1);
|
|
|
|
push(readArray(value, 0, num));
|
2003-02-17 21:42:33 +00:00
|
|
|
}
|
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::o6_getDateTime() {
|
2003-02-18 00:13:24 +00:00
|
|
|
struct tm *t;
|
|
|
|
time_t now = time(NULL);
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2003-02-18 00:13:24 +00:00
|
|
|
t = localtime(&now);
|
|
|
|
|
2003-05-08 15:48:50 +00:00
|
|
|
VAR(VAR_TIMEDATE_YEAR) = t->tm_year;
|
|
|
|
VAR(VAR_TIMEDATE_MONTH) = t->tm_mon;
|
|
|
|
VAR(VAR_TIMEDATE_DAY) = t->tm_mday;
|
|
|
|
VAR(VAR_TIMEDATE_HOUR) = t->tm_hour;
|
|
|
|
VAR(VAR_TIMEDATE_MINUTE) = t->tm_min;
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version == 8)
|
2003-05-08 15:48:50 +00:00
|
|
|
VAR(VAR_TIMEDATE_SECOND) = t->tm_sec;
|
2003-02-18 00:13:24 +00:00
|
|
|
}
|
|
|
|
|
2004-08-14 15:14:01 +00:00
|
|
|
void ScummEngine_v6::o6_getPixel() {
|
2004-06-20 14:47:14 +00:00
|
|
|
int x, y;
|
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.heversion == 61) {
|
2004-06-20 14:47:14 +00:00
|
|
|
x = pop();
|
|
|
|
y = pop();
|
|
|
|
} else {
|
|
|
|
y = pop();
|
|
|
|
x = pop();
|
|
|
|
}
|
2003-03-18 20:32:01 +00:00
|
|
|
|
|
|
|
VirtScreen *vs = findVirtScreen(y);
|
|
|
|
|
2004-08-14 15:14:01 +00:00
|
|
|
if (vs == NULL || x > _screenWidth - 1 || x < 0) {
|
2003-03-18 20:32:01 +00:00
|
|
|
push(-1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2006-02-28 00:46:05 +00:00
|
|
|
byte pixel = *vs->getPixels(x, y - vs->topline);
|
|
|
|
push(pixel);
|
2003-03-18 20:32:01 +00:00
|
|
|
}
|
|
|
|
|
2004-02-16 05:53:17 +00:00
|
|
|
void ScummEngine_v6::o6_setBoxSet() {
|
2004-09-23 19:49:59 +00:00
|
|
|
int arg = pop() - 1;
|
2004-08-28 04:02:49 +00:00
|
|
|
|
2004-02-14 14:48:14 +00:00
|
|
|
const byte *room = getResourceAddress(rtRoom, _roomResource);
|
2004-02-14 17:01:28 +00:00
|
|
|
const byte *boxd = NULL, *boxm = NULL;
|
2004-02-14 14:48:14 +00:00
|
|
|
int32 dboxSize, mboxSize;
|
2004-02-20 22:16:44 +00:00
|
|
|
int i;
|
2004-02-14 14:48:14 +00:00
|
|
|
|
2004-02-14 16:09:07 +00:00
|
|
|
ResourceIterator boxds(room, false);
|
2004-02-20 22:16:44 +00:00
|
|
|
for (i = 0; i < arg; i++)
|
2006-02-25 02:12:58 +00:00
|
|
|
boxd = boxds.findNext(MKID_BE('BOXD'));
|
2004-02-14 14:48:14 +00:00
|
|
|
|
|
|
|
if (!boxd)
|
2004-02-16 05:53:17 +00:00
|
|
|
error("ScummEngine_v6::o6_setBoxSet: Can't find dboxes for set %d", arg);
|
2004-02-14 14:48:14 +00:00
|
|
|
|
2004-09-29 08:40:15 +00:00
|
|
|
dboxSize = READ_BE_UINT32(boxd + 4) - 8;
|
2006-09-17 20:36:48 +00:00
|
|
|
byte *matrix = _res->createResource(rtMatrix, 2, dboxSize);
|
2004-02-14 14:48:14 +00:00
|
|
|
|
|
|
|
assert(matrix);
|
2004-09-29 08:40:15 +00:00
|
|
|
memcpy(matrix, boxd + 8, dboxSize);
|
2004-02-14 14:48:14 +00:00
|
|
|
|
2004-02-14 16:09:07 +00:00
|
|
|
ResourceIterator boxms(room, false);
|
2004-02-20 22:16:44 +00:00
|
|
|
for (i = 0; i < arg; i++)
|
2006-02-25 02:12:58 +00:00
|
|
|
boxm = boxms.findNext(MKID_BE('BOXM'));
|
2004-02-14 14:48:14 +00:00
|
|
|
|
|
|
|
if (!boxm)
|
2004-02-16 05:53:17 +00:00
|
|
|
error("ScummEngine_v6::o6_setBoxSet: Can't find mboxes for set %d", arg);
|
2004-02-14 14:48:14 +00:00
|
|
|
|
2004-09-29 08:40:15 +00:00
|
|
|
mboxSize = READ_BE_UINT32(boxm + 4) - 8;
|
2006-09-17 20:36:48 +00:00
|
|
|
matrix = _res->createResource(rtMatrix, 1, mboxSize);
|
2004-02-14 14:48:14 +00:00
|
|
|
|
|
|
|
assert(matrix);
|
2004-09-29 08:40:15 +00:00
|
|
|
memcpy(matrix, boxm + 8, mboxSize);
|
2004-02-14 14:48:14 +00:00
|
|
|
|
2006-02-20 16:51:30 +00:00
|
|
|
if (_game.version == 7)
|
2004-07-05 06:25:01 +00:00
|
|
|
putActors();
|
2003-04-20 15:02:58 +00:00
|
|
|
}
|
2003-05-17 01:57:54 +00:00
|
|
|
|
2003-10-02 22:42:03 +00:00
|
|
|
void ScummEngine_v6::decodeParseString(int m, int n) {
|
2006-02-05 00:40:48 +00:00
|
|
|
byte b = fetchScriptByte();
|
2002-04-11 17:19:16 +00:00
|
|
|
|
|
|
|
switch (b) {
|
2003-11-09 22:12:16 +00:00
|
|
|
case 65: // SO_AT
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].ypos = pop();
|
|
|
|
_string[m].xpos = pop();
|
|
|
|
_string[m].overhead = false;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 66: // SO_COLOR
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].color = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 67: // SO_CLIPPED
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].right = pop();
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 69: // SO_CENTER
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].center = true;
|
|
|
|
_string[m].overhead = false;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 71: // SO_LEFT
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].center = false;
|
|
|
|
_string[m].overhead = false;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 72: // SO_OVERHEAD
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].overhead = true;
|
|
|
|
_string[m].no_talk_anim = false;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 74: // SO_MUMBLE
|
2002-09-22 01:17:53 +00:00
|
|
|
_string[m].no_talk_anim = true;
|
2001-10-16 10:01:48 +00:00
|
|
|
break;
|
2003-11-09 22:12:16 +00:00
|
|
|
case 75: // SO_TEXTSTRING
|
2004-09-18 20:50:15 +00:00
|
|
|
printString(m, _scriptPointer);
|
2004-03-19 23:19:57 +00:00
|
|
|
_scriptPointer += resStrLen(_scriptPointer) + 1;
|
2004-03-15 03:09:48 +00:00
|
|
|
break;
|
2001-10-16 10:01:48 +00:00
|
|
|
case 0xFE:
|
2004-04-05 23:54:58 +00:00
|
|
|
_string[m].loadDefault();
|
2001-10-16 10:01:48 +00:00
|
|
|
if (n)
|
|
|
|
_actorToPrintStrFor = pop();
|
2004-03-15 03:09:48 +00:00
|
|
|
break;
|
2001-10-16 10:01:48 +00:00
|
|
|
case 0xFF:
|
2004-04-05 23:54:58 +00:00
|
|
|
_string[m].saveDefault();
|
2004-03-15 03:09:48 +00:00
|
|
|
break;
|
2001-10-16 10:01:48 +00:00
|
|
|
default:
|
2003-08-28 15:23:23 +00:00
|
|
|
error("decodeParseString: default case 0x%x", b);
|
2001-10-16 10:01:48 +00:00
|
|
|
}
|
|
|
|
}
|
2003-10-03 18:33:57 +00:00
|
|
|
|
|
|
|
} // End of namespace Scumm
|