2013-10-24 14:24:27 +01: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 .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
*/
2013-10-13 22:34:26 +01:00
# include "prince/script.h"
2013-10-22 01:05:24 +01:00
# include "prince/prince.h"
2013-10-30 02:28:07 +00:00
# include "prince/flags.h"
# include "prince/variatxt.h"
# include "prince/font.h"
2013-12-05 00:02:31 +00:00
# include "prince/hero.h"
2013-12-13 07:05:37 +00:00
# include "prince/resource.h"
2014-05-22 19:52:38 +02:00
# include "prince/animation.h"
2013-10-13 22:34:26 +01:00
2013-10-14 02:31:26 +01:00
# include "common/debug.h"
2013-10-13 22:34:26 +01:00
# include "common/debug-channels.h"
2013-11-02 01:29:26 +00:00
# include "common/archive.h"
2013-12-13 07:05:37 +00:00
# include "common/memstream.h"
2013-10-13 22:34:26 +01:00
namespace Prince {
2014-07-07 20:46:06 +02:00
static const uint16 kNumOpcodes = 144 ;
2013-10-14 02:31:26 +01:00
2013-12-13 07:05:37 +00:00
Room : : Room ( ) { }
2014-05-17 23:25:31 +02:00
bool Room : : loadRoom ( byte * roomData ) {
int roomSize = 64 ;
Common : : MemoryReadStream roomStream ( roomData , roomSize ) ;
_mobs = roomStream . readSint32LE ( ) ;
_backAnim = roomStream . readSint32LE ( ) ;
_obj = roomStream . readSint32LE ( ) ;
_nak = roomStream . readSint32LE ( ) ;
_itemUse = roomStream . readSint32LE ( ) ;
_itemGive = roomStream . readSint32LE ( ) ;
_walkTo = roomStream . readSint32LE ( ) ;
_examine = roomStream . readSint32LE ( ) ;
_pickup = roomStream . readSint32LE ( ) ;
_use = roomStream . readSint32LE ( ) ;
_pushOpen = roomStream . readSint32LE ( ) ;
_pullClose = roomStream . readSint32LE ( ) ;
_talk = roomStream . readSint32LE ( ) ;
_give = roomStream . readSint32LE ( ) ;
return true ;
}
2014-06-26 02:35:48 +02:00
int Room : : getOptionOffset ( int option ) {
switch ( option ) {
case 0 :
return _walkTo ;
case 1 :
return _examine ;
case 2 :
return _pickup ;
case 3 :
return _use ;
case 4 :
return _pushOpen ;
case 5 :
return _pullClose ;
case 6 :
return _talk ;
case 7 :
return _give ;
default :
error ( " Wrong option - nr %d " , option ) ;
}
}
2014-05-22 19:52:38 +02:00
Script : : Script ( PrinceEngine * vm ) : _vm ( vm ) , _data ( nullptr ) , _dataSize ( 0 ) {
2013-10-13 22:34:26 +01:00
}
Script : : ~ Script ( ) {
2014-08-01 17:38:04 +02:00
if ( _data ! = nullptr ) {
free ( _data ) ;
_dataSize = 0 ;
_data = nullptr ;
}
2013-12-10 00:26:42 +00:00
}
bool Script : : loadFromStream ( Common : : SeekableReadStream & stream ) {
_dataSize = stream . size ( ) ;
2014-08-01 17:38:04 +02:00
if ( ! _dataSize ) {
2013-12-10 00:26:42 +00:00
return false ;
2014-08-01 17:38:04 +02:00
}
2013-12-10 00:26:42 +00:00
2014-08-01 17:38:04 +02:00
_data = ( byte * ) malloc ( _dataSize ) ;
2013-12-10 00:26:42 +00:00
2014-08-01 17:38:04 +02:00
if ( ! _data ) {
2013-12-10 00:26:42 +00:00
return false ;
2014-08-01 17:38:04 +02:00
}
2013-12-10 00:26:42 +00:00
stream . read ( _data , _dataSize ) ;
2014-05-01 16:40:12 +02:00
2013-12-13 07:05:37 +00:00
Common : : MemoryReadStream scriptDataStream ( _data , _dataSize ) ;
2014-05-01 18:50:20 +02:00
_scriptInfo . rooms = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . startGame = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . restoreGame = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdExamine = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdPickup = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdUse = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdOpen = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdClose = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdTalk = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdGive = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . usdCode = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . invObjExam = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . invObjUse = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . invObjUU = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdUseItem = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . lightSources = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . specRout = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . invObjGive = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . stdGiveItem = scriptDataStream . readSint32LE ( ) ;
_scriptInfo . goTester = scriptDataStream . readSint32LE ( ) ;
2013-12-10 00:26:42 +00:00
return true ;
}
2014-05-01 16:40:12 +02:00
int16 Script : : getLightX ( int locationNr ) {
2014-05-01 18:50:20 +02:00
return ( int ) READ_UINT16 ( & _data [ _scriptInfo . lightSources + locationNr * 8 ] ) ;
2014-05-01 16:40:12 +02:00
}
int16 Script : : getLightY ( int locationNr ) {
2014-05-01 18:50:20 +02:00
return ( int ) READ_UINT16 ( & _data [ _scriptInfo . lightSources + locationNr * 8 + 2 ] ) ;
2014-05-01 16:40:12 +02:00
}
int32 Script : : getShadowScale ( int locationNr ) {
2014-05-01 18:50:20 +02:00
return ( int ) READ_UINT16 ( & _data [ _scriptInfo . lightSources + locationNr * 8 + 4 ] ) ;
}
uint32 Script : : getStartGameOffset ( ) {
return _scriptInfo . startGame ;
2014-05-01 16:40:12 +02:00
}
2014-07-29 02:25:42 +02:00
uint32 Script : : getLocationInitScript ( int initRoomTableOffset , int roomNr ) {
return ( uint32 ) READ_UINT32 ( & _data [ initRoomTableOffset + roomNr * 4 ] ) ;
2014-06-28 09:51:14 +02:00
}
2014-07-29 02:25:42 +02:00
byte Script : : getMobVisible ( int roomMobOffset , uint16 mob ) {
return _data [ roomMobOffset + mob ] ;
}
void Script : : setMobVisible ( int roomMobOffset , uint16 mob , byte value ) {
_data [ roomMobOffset + mob ] = value ;
2014-06-26 23:58:33 +02:00
}
2014-05-17 23:25:31 +02:00
uint8 * Script : : getRoomOffset ( int locationNr ) {
2014-05-22 15:40:02 +02:00
return & _data [ _scriptInfo . rooms + locationNr * 64 ] ;
}
2014-06-26 02:35:48 +02:00
int32 Script : : getOptionStandardOffset ( int option ) {
switch ( option ) {
case 1 :
2014-06-26 23:58:33 +02:00
return _scriptInfo . stdExamine ;
2014-06-26 02:35:48 +02:00
case 2 :
2014-06-26 23:58:33 +02:00
return _scriptInfo . stdPickup ;
2014-06-26 02:35:48 +02:00
case 3 :
2014-06-26 23:58:33 +02:00
return _scriptInfo . stdUse ;
2014-06-26 02:35:48 +02:00
case 4 :
2014-06-26 23:58:33 +02:00
return _scriptInfo . stdOpen ;
2014-06-26 02:35:48 +02:00
case 5 :
2014-06-26 23:58:33 +02:00
return _scriptInfo . stdClose ;
2014-06-26 02:35:48 +02:00
case 6 :
2014-06-26 23:58:33 +02:00
return _scriptInfo . stdTalk ;
case 7 :
2014-06-26 02:35:48 +02:00
return _scriptInfo . stdGive ;
default :
error ( " Wrong standard option - nr %d " , option ) ;
}
2014-06-24 03:57:40 +02:00
}
2014-07-20 17:38:17 +02:00
uint8 * Script : : getHeroAnimName ( int offset ) {
return & _data [ offset ] ;
}
2014-07-29 02:25:42 +02:00
uint32 Script : : getBackAnimId ( int roomBackAnimOffset , int slot ) {
uint32 animId = READ_UINT32 ( & _data [ roomBackAnimOffset + slot * 4 ] ) ;
return animId ;
}
void Script : : setBackAnimId ( int roomBackAnimOffset , int slot , int animId ) {
WRITE_UINT32 ( & _data [ roomBackAnimOffset + slot * 4 ] , animId ) ;
2014-07-04 19:10:22 +02:00
}
2014-07-29 02:25:42 +02:00
byte Script : : getObjId ( int roomObjOffset , int slot ) {
return _data [ roomObjOffset + slot ] ;
}
void Script : : setObjId ( int roomObjOffset , int slot , byte objectId ) {
_data [ roomObjOffset + slot ] = objectId ;
2014-07-05 22:31:02 +02:00
}
2014-06-19 01:08:38 +02:00
int Script : : scanMobEvents ( int mobMask , int dataEventOffset ) {
2014-06-19 00:00:44 +02:00
debug ( " mobMask: %d " , mobMask ) ;
int i = 0 ;
2014-06-19 01:08:38 +02:00
int16 mob ;
int32 code ;
2014-06-19 00:00:44 +02:00
do {
2014-06-19 01:08:38 +02:00
mob = ( int ) READ_UINT16 ( & _data [ dataEventOffset + i * 6 ] ) ;
if ( mob = = mobMask ) {
2014-06-19 14:53:56 +02:00
code = ( int ) READ_UINT32 ( & _data [ dataEventOffset + i * 6 + 2 ] ) ;
debug ( " code: %d " , code ) ;
2014-06-19 01:08:38 +02:00
return code ;
2014-06-19 00:00:44 +02:00
}
i + + ;
2014-06-19 01:08:38 +02:00
} while ( mob ! = - 1 ) ;
return - 1 ;
2014-06-19 00:00:44 +02:00
}
2014-06-24 05:03:36 +02:00
int Script : : scanMobEventsWithItem ( int mobMask , int dataEventOffset , int itemMask ) {
2014-06-19 14:53:56 +02:00
debug ( " mobMask: %d " , mobMask ) ;
int i = 0 ;
int16 mob ;
int16 item ;
int32 code ;
do {
mob = ( int ) READ_UINT16 ( & _data [ dataEventOffset + i * 8 ] ) ;
if ( mob = = mobMask ) {
item = ( int ) READ_UINT16 ( & _data [ dataEventOffset + i * 8 + 2 ] ) ;
2014-06-24 05:03:36 +02:00
if ( item = = itemMask ) {
2014-06-19 14:53:56 +02:00
code = ( int ) READ_UINT32 ( & _data [ dataEventOffset + i * 8 + 4 ] ) ;
2014-06-24 05:03:36 +02:00
debug ( " itemMask: %d " , item ) ;
2014-06-19 14:53:56 +02:00
debug ( " code: %d " , code ) ;
return code ;
}
}
i + + ;
} while ( mob ! = - 1 ) ;
return - 1 ;
}
2014-07-29 02:25:42 +02:00
void Script : : installSingleBackAnim ( Common : : Array < BackgroundAnim > & backAnimList , int slot , int roomBackAnimOffset ) {
2014-08-05 18:11:33 +02:00
_vm - > removeSingleBackAnim ( slot ) ;
2014-07-29 02:25:42 +02:00
int offset = roomBackAnimOffset + slot * 4 ;
2014-05-23 21:24:05 +02:00
BackgroundAnim newBackgroundAnim ;
2014-05-23 00:22:31 +02:00
int animOffset = READ_UINT32 ( & _data [ offset ] ) ;
2014-05-23 21:24:05 +02:00
int anims = READ_UINT32 ( & _data [ animOffset + 8 ] ) ;
if ( anims = = 0 ) {
anims = 1 ;
}
2014-05-23 00:22:31 +02:00
if ( animOffset ! = 0 ) {
2014-05-23 21:24:05 +02:00
for ( int i = 0 ; i < anims ; i + + ) {
Anim newAnim ;
2014-05-26 19:16:31 +02:00
newAnim . _basaData . _num = READ_UINT16 ( & _data [ animOffset + 28 + i * 8 ] ) ;
newAnim . _basaData . _start = READ_UINT16 ( & _data [ animOffset + 28 + i * 8 + 2 ] ) ;
newAnim . _basaData . _end = READ_UINT16 ( & _data [ animOffset + 28 + i * 8 + 4 ] ) ;
int animNumber = newAnim . _basaData . _num ;
2014-05-23 21:24:05 +02:00
const Common : : String animName = Common : : String : : format ( " AN%02d " , animNumber ) ;
const Common : : String shadowName = Common : : String : : format ( " AN%02dS " , animNumber ) ;
newAnim . _animData = new Animation ( ) ;
newAnim . _shadowData = new Animation ( ) ;
Resource : : loadResource ( newAnim . _animData , animName . c_str ( ) , true ) ;
if ( ! Resource : : loadResource ( newAnim . _shadowData , shadowName . c_str ( ) , false ) ) {
delete newAnim . _shadowData ;
newAnim . _shadowData = nullptr ;
}
newAnim . _usage = 0 ;
newAnim . _state = 0 ; // enabled
if ( ( _vm - > _animList [ animNumber ] . _flags & 4 ) ! = 0 ) {
newAnim . _state = 1 ;
newAnim . _frame = _vm - > _animList [ animNumber ] . _endPhase ;
newAnim . _showFrame = _vm - > _animList [ animNumber ] . _endPhase ;
} else {
newAnim . _frame = _vm - > _animList [ animNumber ] . _startPhase ;
newAnim . _showFrame = _vm - > _animList [ animNumber ] . _startPhase ;
}
newAnim . _flags = _vm - > _animList [ animNumber ] . _flags ;
newAnim . _lastFrame = _vm - > _animList [ animNumber ] . _endPhase ;
newAnim . _loopFrame = _vm - > _animList [ animNumber ] . _loopPhase ;
newAnim . _loopType = _vm - > _animList [ animNumber ] . _loopType ;
newAnim . _nextAnim = _vm - > _animList [ animNumber ] . _nextAnim ;
newAnim . _x = _vm - > _animList [ animNumber ] . _x ;
newAnim . _y = _vm - > _animList [ animNumber ] . _y ;
newAnim . _currFrame = 0 ;
newAnim . _currX = _vm - > _animList [ animNumber ] . _x ;
newAnim . _currY = _vm - > _animList [ animNumber ] . _y ;
newAnim . _currW = 0 ;
newAnim . _currH = 0 ;
newAnim . _packFlag = 0 ;
newAnim . _shadowBack = _vm - > _animList [ animNumber ] . _type ;
newBackgroundAnim . backAnims . push_back ( newAnim ) ;
2014-05-23 00:22:31 +02:00
}
2014-05-23 21:24:05 +02:00
newBackgroundAnim . _seq . _type = READ_UINT32 ( & _data [ animOffset ] ) ;
newBackgroundAnim . _seq . _data = READ_UINT32 ( & _data [ animOffset + 4 ] ) ;
newBackgroundAnim . _seq . _anims = READ_UINT32 ( & _data [ animOffset + 8 ] ) ;
2014-05-30 19:25:11 +02:00
newBackgroundAnim . _seq . _current = newBackgroundAnim . backAnims [ 0 ] . _basaData . _num ;
2014-05-23 21:24:05 +02:00
newBackgroundAnim . _seq . _counter = 0 ;
newBackgroundAnim . _seq . _currRelative = 0 ;
newBackgroundAnim . _seq . _data2 = READ_UINT32 ( & _data [ animOffset + 24 ] ) ;
2014-05-26 19:16:31 +02:00
int start = newBackgroundAnim . backAnims [ 0 ] . _basaData . _start ; // BASA_Start of first frame
int end = newBackgroundAnim . backAnims [ 0 ] . _basaData . _end ; //BASA_End of first frame
2014-05-23 21:24:05 +02:00
2014-05-26 19:16:31 +02:00
if ( start ! = - 1 ) {
2014-05-23 21:24:05 +02:00
newBackgroundAnim . backAnims [ 0 ] . _frame = start ;
newBackgroundAnim . backAnims [ 0 ] . _showFrame = start ;
newBackgroundAnim . backAnims [ 0 ] . _loopFrame = start ;
}
2014-05-26 19:16:31 +02:00
if ( end ! = - 1 ) {
2014-05-23 21:24:05 +02:00
newBackgroundAnim . backAnims [ 0 ] . _lastFrame = end ;
2014-05-23 00:22:31 +02:00
}
2014-05-23 21:24:05 +02:00
2014-07-04 19:10:22 +02:00
backAnimList [ slot ] = newBackgroundAnim ;
2014-05-23 00:22:31 +02:00
}
}
2014-07-29 02:25:42 +02:00
void Script : : installBackAnims ( Common : : Array < BackgroundAnim > & backAnimList , int roomBackAnimOffset ) {
2014-07-05 22:31:02 +02:00
for ( int i = 0 ; i < _vm - > kMaxBackAnims ; i + + ) {
2014-07-29 02:25:42 +02:00
installSingleBackAnim ( backAnimList , i , roomBackAnimOffset ) ;
2014-05-22 19:52:38 +02:00
}
2014-05-17 23:25:31 +02:00
}
2014-07-05 22:31:02 +02:00
void Script : : installObjects ( int offset ) {
for ( int i = 0 ; i < _vm - > kMaxObjects ; i + + ) {
2014-07-29 02:25:42 +02:00
_vm - > _objSlot [ i ] = _data [ offset ] ;
2014-07-05 22:31:02 +02:00
offset + + ;
}
}
2014-05-30 23:36:49 +02:00
bool Script : : loadAllMasks ( Common : : Array < Mask > & maskList , int offset ) {
Mask tempMask ;
2014-05-30 22:05:40 +02:00
while ( 1 ) {
2014-05-30 23:36:49 +02:00
tempMask . _state = READ_UINT32 ( & _data [ offset ] ) ;
if ( tempMask . _state = = - 1 ) {
2014-05-30 22:05:40 +02:00
break ;
}
2014-05-30 23:36:49 +02:00
tempMask . _flags = READ_UINT32 ( & _data [ offset + 2 ] ) ;
tempMask . _x1 = READ_UINT32 ( & _data [ offset + 4 ] ) ;
tempMask . _y1 = READ_UINT32 ( & _data [ offset + 6 ] ) ;
tempMask . _x2 = READ_UINT32 ( & _data [ offset + 8 ] ) ;
tempMask . _y2 = READ_UINT32 ( & _data [ offset + 10 ] ) ;
tempMask . _z = READ_UINT32 ( & _data [ offset + 12 ] ) ;
tempMask . _number = READ_UINT32 ( & _data [ offset + 14 ] ) ;
const Common : : String msStreamName = Common : : String : : format ( " MS%02d " , tempMask . _number ) ;
Common : : SeekableReadStream * msStream = SearchMan . createReadStreamForMember ( msStreamName ) ;
if ( ! msStream ) {
2014-07-08 16:38:09 +02:00
tempMask . _width = 0 ;
tempMask . _height = 0 ;
tempMask . _data = nullptr ;
debug ( " Can't load %s " , msStreamName . c_str ( ) ) ;
2014-05-30 23:36:49 +02:00
delete msStream ;
2014-07-08 16:38:09 +02:00
} else {
uint32 dataSize = msStream - > size ( ) ;
if ( dataSize ! = - 1 ) {
tempMask . _data = ( byte * ) malloc ( dataSize ) ;
if ( msStream - > read ( tempMask . _data , dataSize ) ! = dataSize ) {
free ( tempMask . _data ) ;
delete msStream ;
return false ;
}
2014-05-30 23:36:49 +02:00
delete msStream ;
}
2014-07-08 16:38:09 +02:00
tempMask . _width = tempMask . getWidth ( ) ;
tempMask . _height = tempMask . getHeight ( ) ;
2014-05-30 23:36:49 +02:00
}
maskList . push_back ( tempMask ) ;
2014-05-31 16:45:10 +02:00
offset + = 16 ; // size of Mask (Nak) struct
2014-05-30 22:05:40 +02:00
}
2014-05-30 23:36:49 +02:00
return true ;
2014-05-30 22:05:40 +02:00
}
2013-12-10 00:26:42 +00:00
InterpreterFlags : : InterpreterFlags ( ) {
resetAllFlags ( ) ;
2013-10-13 22:34:26 +01:00
}
2013-12-10 00:26:42 +00:00
void InterpreterFlags : : resetAllFlags ( ) {
memset ( _flags , 0 , sizeof ( _flags ) ) ;
}
2014-07-30 19:54:39 +02:00
void InterpreterFlags : : setFlagValue ( Flags : : Id flagId , int32 value ) {
2014-07-29 02:25:42 +02:00
_flags [ ( uint32 ) flagId - kFlagMask ] = value ;
2013-11-05 21:57:10 +00:00
}
2014-07-30 19:54:39 +02:00
int32 InterpreterFlags : : getFlagValue ( Flags : : Id flagId ) {
2014-07-29 02:25:42 +02:00
return _flags [ ( uint32 ) flagId - kFlagMask ] ;
2013-11-04 11:28:10 +00:00
}
2013-12-10 00:26:42 +00:00
Interpreter : : Interpreter ( PrinceEngine * vm , Script * script , InterpreterFlags * flags ) :
_vm ( vm ) , _script ( script ) , _flags ( flags ) ,
2014-08-08 22:58:38 +02:00
_stacktop ( 0 ) , _opcodeNF ( false ) , _opcodeEnd ( false ) ,
2013-12-10 00:26:42 +00:00
_waitFlag ( 0 ) , _result ( true ) {
2013-10-13 22:34:26 +01:00
2013-10-30 02:28:07 +00:00
// Initialize the script
2013-11-04 16:07:19 +00:00
_mode = " fg " ;
2013-12-10 00:26:42 +00:00
_fgOpcodePC = _script - > getStartGameOffset ( ) ;
2013-11-04 11:28:10 +00:00
_bgOpcodePC = 0 ;
2013-10-13 22:34:26 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : debugInterpreter ( const char * s , . . . ) {
2013-10-30 02:28:07 +00:00
char buf [ STRINGBUFLEN ] ;
2014-07-07 20:46:06 +02:00
va_list va ;
2013-11-05 22:22:51 +00:00
va_start ( va , s ) ;
vsnprintf ( buf , STRINGBUFLEN , s , va ) ;
va_end ( va ) ;
2013-10-14 02:31:26 +01:00
2013-11-04 16:07:19 +00:00
Common : : String str = Common : : String : : format ( " @0x%08X: " , _lastInstruction ) ;
2013-11-02 02:02:53 +00:00
str + = Common : : String : : format ( " op %04d: " , _lastOpcode ) ;
//debugC(10, DebugChannel::kScript, "PrinceEngine::Script %s %s", str.c_str(), buf);
2014-06-29 20:39:40 +02:00
if ( ! strcmp ( _mode , " fg " ) ) {
2014-06-28 09:51:14 +02:00
debug ( 10 , " PrinceEngine::Script %s %s " , str . c_str ( ) , buf ) ;
}
2014-08-02 13:39:33 +02:00
//debug("Prince::Script mode %s %s %s", _mode, str.c_str(), buf);
2013-10-14 02:31:26 +01:00
}
2014-08-02 16:03:54 +02:00
void Interpreter : : stepBg ( ) {
2013-11-04 11:28:10 +00:00
if ( _bgOpcodePC ) {
2013-11-04 16:07:19 +00:00
_mode = " bg " ;
2013-11-04 11:28:10 +00:00
_bgOpcodePC = step ( _bgOpcodePC ) ;
}
2014-08-02 16:03:54 +02:00
}
void Interpreter : : stepFg ( ) {
2013-11-04 11:28:10 +00:00
if ( _fgOpcodePC ) {
2013-11-04 16:07:19 +00:00
_mode = " fg " ;
2013-11-04 11:28:10 +00:00
_fgOpcodePC = step ( _fgOpcodePC ) ;
}
}
2013-12-10 00:26:42 +00:00
uint32 Interpreter : : step ( uint32 opcodePC ) {
2013-11-04 11:28:10 +00:00
_currentInstruction = opcodePC ;
2013-11-18 16:19:21 +00:00
while ( ! _opcodeNF ) {
2013-10-30 02:28:07 +00:00
_lastInstruction = _currentInstruction ;
2013-10-14 02:31:26 +01:00
2013-10-30 02:28:07 +00:00
// Get the current opcode
2013-12-10 00:26:42 +00:00
_lastOpcode = readScript < uint16 > ( ) ;
2013-10-14 02:31:26 +01:00
2014-07-07 20:46:06 +02:00
if ( _lastOpcode > kNumOpcodes )
2013-11-18 16:19:21 +00:00
error (
" Trying to execute unknown opcode @0x%04X: %02d " ,
_currentInstruction ,
_lastOpcode ) ;
2013-10-14 02:31:26 +01:00
2013-10-30 02:28:07 +00:00
// Execute the current opcode
OpcodeFunc op = _opcodes [ _lastOpcode ] ;
( this - > * op ) ( ) ;
if ( _opcodeNF ) {
_opcodeNF = 0 ;
break ;
}
}
2013-11-04 11:28:10 +00:00
2014-08-08 22:58:38 +02:00
if ( _opcodeEnd ) {
_vm - > quitGame ( ) ;
}
2013-11-04 11:28:10 +00:00
return _currentInstruction ;
2013-10-13 22:34:26 +01:00
}
2014-06-26 02:35:48 +02:00
void Interpreter : : storeNewPC ( int opcodePC ) {
if ( _flags - > getFlagValue ( Flags : : GETACTION ) = = 1 ) {
_flags - > setFlagValue ( Flags : : GETACTIONDATA , opcodePC ) ;
opcodePC = _flags - > getFlagValue ( Flags : : GETACTIONBACK ) ;
}
_fgOpcodePC = opcodePC ;
}
2014-07-18 15:35:43 +02:00
int Interpreter : : getLastOPCode ( ) {
return _lastOpcode ;
}
2014-07-25 15:21:31 +02:00
int Interpreter : : getFgOpcodePC ( ) {
return _fgOpcodePC ;
}
2014-06-26 18:29:19 +02:00
uint32 Interpreter : : getCurrentString ( ) {
return _currentString ;
}
void Interpreter : : setCurrentString ( uint32 value ) {
_currentString = value ;
}
2014-07-03 04:19:52 +02:00
byte * Interpreter : : getString ( ) {
2014-07-02 17:29:42 +02:00
return _string ;
}
2014-07-03 20:53:19 +02:00
void Interpreter : : setString ( byte * newString ) {
_string = newString ;
}
2014-06-28 17:10:12 +02:00
void Interpreter : : increaseString ( ) {
while ( * _string ) {
_string + + ;
}
_string + + ;
}
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
void Interpreter : : setResult ( byte value ) {
_result = value ;
}
2014-07-29 02:25:42 +02:00
void Interpreter : : setBgOpcodePC ( uint32 value ) {
_bgOpcodePC = value ;
}
void Interpreter : : setFgOpcodePC ( uint32 value ) {
_fgOpcodePC = value ;
}
2013-12-10 00:26:42 +00:00
template < typename T >
T Interpreter : : readScript ( ) {
T data = _script - > read < T > ( _currentInstruction ) ;
_currentInstruction + = sizeof ( data ) ;
2013-11-05 22:22:51 +00:00
return data ;
2013-10-13 22:34:26 +01:00
}
2014-08-08 17:09:26 +02:00
int32 Interpreter : : readScriptFlagValue ( ) {
2013-12-10 00:26:42 +00:00
uint16 value = readScript < uint16 > ( ) ;
2014-07-29 02:25:42 +02:00
if ( value & InterpreterFlags : : kFlagMask ) {
2013-12-10 00:26:42 +00:00
return _flags - > getFlagValue ( ( Flags : : Id ) value ) ;
2013-11-05 21:57:10 +00:00
}
return value ;
}
2013-12-10 00:26:42 +00:00
Flags : : Id Interpreter : : readScriptFlagId ( ) {
return ( Flags : : Id ) readScript < uint16 > ( ) ;
2013-10-13 22:34:26 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_WAITFOREVER ( ) {
2014-07-05 22:31:02 +02:00
_vm - > changeCursor ( _vm - > _currentPointerNumber ) ;
2013-10-30 02:28:07 +00:00
_opcodeNF = 1 ;
_currentInstruction - = 2 ;
2014-07-22 16:52:39 +02:00
//debugInterpreter("O_WAITFOREVER");
2013-10-14 02:31:26 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_BLACKPALETTE ( ) {
2014-07-24 18:39:39 +02:00
_vm - > blackPalette ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_BLACKPALETTE " ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETUPPALETTE ( ) {
2014-07-24 18:39:39 +02:00
_vm - > setPalette ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETUPPALETTE " ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_INITROOM ( ) {
2014-08-08 17:09:26 +02:00
int32 roomId = readScriptFlagValue ( ) ;
2013-10-30 02:28:07 +00:00
_vm - > loadLocation ( roomId ) ;
_opcodeNF = 1 ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_INITROOM %d " , roomId ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETSAMPLE ( ) {
2014-08-08 17:09:26 +02:00
int32 sampleId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
int32 sampleNameOffset = readScript < uint32 > ( ) ;
2014-07-01 20:12:43 +02:00
const char * sampleName = _script - > getString ( _currentInstruction + sampleNameOffset - 4 ) ;
2013-12-03 14:46:24 +00:00
_vm - > loadSample ( sampleId , sampleName ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_SETSAMPLE %d %s " , sampleId , sampleName ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREESAMPLE ( ) {
2014-08-08 17:09:26 +02:00
int32 sampleId = readScriptFlagValue ( ) ;
2014-07-26 05:33:33 +02:00
_vm - > freeSample ( sampleId ) ;
debugInterpreter ( " O_FREESAMPLE sampleId: %d " , sampleId ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PLAYSAMPLE ( ) {
2014-08-08 17:09:26 +02:00
int32 sampleId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
uint16 loopType = readScript < uint16 > ( ) ;
2013-11-05 22:15:55 +00:00
_vm - > playSample ( sampleId , loopType ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_PLAYSAMPLE sampleId %d loopType %d " , sampleId , loopType ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PUTOBJECT ( ) {
2014-08-08 17:09:26 +02:00
int32 roomId = readScriptFlagValue ( ) ;
int32 slot = readScriptFlagValue ( ) ;
int32 objectId = readScriptFlagValue ( ) ;
2014-07-05 22:31:02 +02:00
Room * room = new Room ( ) ;
room - > loadRoom ( _script - > getRoomOffset ( roomId ) ) ;
2014-07-29 02:25:42 +02:00
_vm - > _script - > setObjId ( room - > _obj , slot , objectId ) ;
2014-07-05 22:31:02 +02:00
if ( _vm - > _locationNr = = roomId ) {
_vm - > _objSlot [ slot ] = objectId ;
}
delete room ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_PUTOBJECT roomId %d, slot %d, objectId %d " , roomId , slot , objectId ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REMOBJECT ( ) {
2014-08-08 17:09:26 +02:00
int32 roomId = readScriptFlagValue ( ) ;
int32 slot = readScriptFlagValue ( ) ;
2014-07-05 22:31:02 +02:00
Room * room = new Room ( ) ;
room - > loadRoom ( _script - > getRoomOffset ( roomId ) ) ;
2014-07-29 02:25:42 +02:00
_vm - > _script - > setObjId ( room - > _obj , slot , 0xFF ) ;
2014-07-05 22:31:02 +02:00
if ( _vm - > _locationNr = = roomId ) {
2014-07-29 02:25:42 +02:00
_vm - > _objSlot [ slot ] = 0xFF ;
2014-07-05 22:31:02 +02:00
}
delete room ;
debugInterpreter ( " O_REMOBJECT roomId %d slot %d " , roomId , slot ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SHOWANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
int32 animId = readScriptFlagValue ( ) ;
2014-07-01 23:59:37 +02:00
_vm - > freeNormAnim ( slot ) ;
Anim & anim = _vm - > _normAnimList [ slot ] ;
AnimListItem & animList = _vm - > _animList [ animId ] ;
anim . _currFrame = 0 ;
anim . _packFlag = 0 ;
anim . _state = 0 ;
anim . _frame = animList . _startPhase ;
anim . _showFrame = animList . _startPhase ;
anim . _lastFrame = animList . _endPhase ;
anim . _loopFrame = animList . _loopPhase ;
anim . _x = animList . _x ;
anim . _y = animList . _y ;
anim . _loopType = animList . _loopType ;
anim . _shadowBack = animList . _type ;
anim . _flags = animList . _flags ;
anim . _nextAnim = animList . _nextAnim ;
int fileNumber = animList . _fileNumber ;
const Common : : String animName = Common : : String : : format ( " AN%02d " , fileNumber ) ;
const Common : : String shadowName = Common : : String : : format ( " AN%02dS " , fileNumber ) ;
anim . _animData = new Animation ( ) ;
anim . _shadowData = new Animation ( ) ;
Resource : : loadResource ( anim . _animData , animName . c_str ( ) , true ) ;
if ( ! Resource : : loadResource ( anim . _shadowData , shadowName . c_str ( ) , false ) ) {
delete anim . _shadowData ;
anim . _shadowData = nullptr ;
}
2014-08-07 02:20:52 +02:00
// WALKAROUND: fix for turning off bard's wife background animation
// in front of bard's house (location 7) after giving her poem (item 33)
// in script: GiveLetter (line 11082)
if ( _currentInstruction = = kGiveLetterScriptFix ) {
_vm - > _backAnimList [ 1 ] . backAnims [ 0 ] . _state = 1 ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SHOWANIM slot %d, animId %d " , slot , animId ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKANIMEND ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
if ( _vm - > _normAnimList [ slot ] . _frame ! = _vm - > _normAnimList [ slot ] . _lastFrame - 1 ) {
_currentInstruction - = 4 ;
_opcodeNF = 1 ;
}
debugInterpreter ( " O_CHECKANIMEND slot %d " , slot ) ;
2013-10-15 23:21:00 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREEANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2014-07-01 23:59:37 +02:00
_vm - > freeNormAnim ( slot ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_FREEANIM slot %d " , slot ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKANIMFRAME ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
int32 frameNumber = readScriptFlagValue ( ) ;
2014-07-27 17:47:18 +02:00
if ( _vm - > _normAnimList [ slot ] . _frame ! = frameNumber - 1 ) {
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_currentInstruction - = 6 ;
_opcodeNF = 1 ;
}
debugInterpreter ( " O_CHECKANIMFRAME slot %d, frameNumber %d " , slot , frameNumber ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PUTBACKANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 roomId = readScriptFlagValue ( ) ;
int32 slot = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
int32 animId = readScript < uint32 > ( ) ;
2014-07-04 19:10:22 +02:00
Room * room = new Room ( ) ;
room - > loadRoom ( _script - > getRoomOffset ( roomId ) ) ;
2014-07-29 02:25:42 +02:00
_vm - > _script - > setBackAnimId ( room - > _backAnim , slot , animId ) ;
2014-07-04 19:10:22 +02:00
if ( _vm - > _locationNr = = roomId ) {
2014-07-29 02:25:42 +02:00
_vm - > _script - > installSingleBackAnim ( _vm - > _backAnimList , slot , room - > _backAnim ) ;
2014-07-04 19:10:22 +02:00
}
delete room ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_PUTBACKANIM roomId %d, slot %d, animId %d " , roomId , slot , animId ) ;
2013-10-15 00:10:29 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REMBACKANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 roomId = readScriptFlagValue ( ) ;
int32 slot = readScriptFlagValue ( ) ;
2014-07-04 19:10:22 +02:00
if ( _vm - > _locationNr = = roomId ) {
_vm - > removeSingleBackAnim ( slot ) ;
}
Room * room = new Room ( ) ;
room - > loadRoom ( _script - > getRoomOffset ( roomId ) ) ;
2014-07-29 02:25:42 +02:00
_vm - > _script - > setBackAnimId ( room - > _backAnim , slot , 0 ) ;
2014-07-04 19:10:22 +02:00
delete room ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_REMBACKANIM roomId %d, slot %d " , roomId , slot ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKBACKANIMFRAME ( ) {
2014-08-08 17:09:26 +02:00
int32 slotId = readScriptFlagValue ( ) ;
int32 frameId = readScriptFlagValue ( ) ;
2014-07-01 21:54:33 +02:00
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
2014-07-27 17:47:18 +02:00
if ( _vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] . _frame ! = frameId - 1 ) {
2014-07-03 22:35:41 +02:00
_currentInstruction - = 6 ;
2014-07-01 21:54:33 +02:00
_opcodeNF = 1 ;
}
2014-07-01 23:59:37 +02:00
debugInterpreter ( " O_CHECKBACKANIMFRAME slotId %d, frameId %d " , slotId , frameId ) ;
2013-10-15 23:21:00 +01:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREEALLSAMPLES ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_FREEALLSAMPLES " ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETMUSIC ( ) {
uint16 musicId = readScript < uint16 > ( ) ;
2014-07-26 20:49:42 +02:00
_vm - > loadMusic ( musicId ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETMUSIC musicId %d " , musicId ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_STOPMUSIC ( ) {
2014-07-26 20:49:42 +02:00
_vm - > stopMusic ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_STOPMUSIC " ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O__WAIT ( ) {
2014-08-08 17:09:26 +02:00
int32 pause = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O__WAIT pause %d " , pause ) ;
2014-07-07 20:46:06 +02:00
if ( ! _waitFlag ) {
2013-11-02 02:02:53 +00:00
// set new wait flag value and continue
_waitFlag = pause ;
_opcodeNF = 1 ;
_currentInstruction - = 4 ;
return ;
}
2014-07-07 20:46:06 +02:00
_waitFlag - - ;
2013-11-02 02:02:53 +00:00
if ( _waitFlag > 0 ) {
_opcodeNF = 1 ;
_currentInstruction - = 4 ;
return ;
}
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_UPDATEOFF ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_UPDATEOFF " ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_UPDATEON ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_UPDATEON " ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_UPDATE ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_UPDATE " ) ;
2013-10-28 00:06:21 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CLS ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_CLS " ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O__CALL ( ) {
int32 address = readScript < uint32 > ( ) ;
2013-10-30 02:28:07 +00:00
_stack [ _stacktop ] = _currentInstruction ;
_stacktop + + ;
_currentInstruction + = address - 4 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O__CALL 0x%04X " , _currentInstruction ) ;
2013-10-14 02:31:26 +01:00
}
2013-11-04 11:40:22 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_RETURN ( ) {
2013-10-30 02:28:07 +00:00
if ( _stacktop > 0 ) {
_stacktop - - ;
_currentInstruction = _stack [ _stacktop ] ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_RETURN 0x%04X " , _currentInstruction ) ;
2013-10-30 02:28:07 +00:00
} else {
2014-07-26 00:39:57 +02:00
error ( " O_RETURN: Stack is empty " ) ;
2013-10-30 02:28:07 +00:00
}
2013-10-14 02:31:26 +01:00
}
2013-11-04 11:40:22 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GO ( ) {
int32 opPC = readScript < uint32 > ( ) ;
2013-10-30 02:28:07 +00:00
_currentInstruction + = opPC - 4 ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_GO 0x%04X " , opPC ) ;
2013-10-14 02:31:26 +01:00
}
2013-11-04 11:40:22 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_BACKANIMUPDATEOFF ( ) {
2014-08-08 17:09:26 +02:00
int32 slotId = readScriptFlagValue ( ) ;
2014-07-01 21:54:33 +02:00
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
2014-08-05 18:11:33 +02:00
if ( ! _vm - > _backAnimList [ slotId ] . backAnims . empty ( ) ) {
_vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] . _state = 1 ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_BACKANIMUPDATEOFF slotId %d " , slotId ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_BACKANIMUPDATEON ( ) {
2014-08-08 17:09:26 +02:00
int32 slotId = readScriptFlagValue ( ) ;
2014-07-01 21:54:33 +02:00
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
2014-08-05 18:11:33 +02:00
if ( ! _vm - > _backAnimList [ slotId ] . backAnims . empty ( ) ) {
_vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] . _state = 0 ;
}
debugInterpreter ( " O_BACKANIMUPDATEON slotId %d " , slotId ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGECURSOR ( ) {
2014-08-08 17:09:26 +02:00
int32 cursorId = readScriptFlagValue ( ) ;
2013-12-03 14:46:24 +00:00
_vm - > changeCursor ( cursorId ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_CHANGECURSOR %x " , cursorId ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-28 00:06:21 +00:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEANIMTYPE ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_CHANGEANIMTYPE " ) ;
2013-10-28 00:06:21 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O__SETFLAG ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( ( Flags : : Id ) ( flagId ) , value ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O__SETFLAG 0x%04X (%s) = %d " , flagId , Flags : : getFlagName ( flagId ) , value ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_COMPARE ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_result = _flags - > getFlagValue ( flagId ) ! = value ;
debugInterpreter ( " O_COMPARE flagId 0x%04X (%s), value %d == %d (%d) " , flagId , Flags : : getFlagName ( flagId ) , value , _flags - > getFlagValue ( flagId ) , _result ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_JUMPZ ( ) {
int32 offset = readScript < uint32 > ( ) ;
2014-05-07 21:55:25 +02:00
if ( ! _result ) {
2013-10-30 02:28:07 +00:00
_currentInstruction + = offset - 4 ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_JUMPZ result = %d, next %08x, offset 0x%08X " , _result , _currentInstruction , offset ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_JUMPNZ ( ) {
int32 offset = readScript < uint32 > ( ) ;
2013-10-30 02:28:07 +00:00
if ( _result ) {
_currentInstruction + = offset - 4 ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_JUMPNZ result = %d, next %08x, offset 0x%08X " , _result , _currentInstruction , offset ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_EXIT ( ) {
2014-08-08 17:09:26 +02:00
int32 exitCode = readScriptFlagValue ( ) ;
2014-08-08 22:58:38 +02:00
_opcodeEnd = true ;
_opcodeNF = 1 ;
if ( exitCode = = 0x2EAD ) {
2014-08-09 05:37:57 +02:00
_vm - > scrollCredits ( ) ;
2014-08-08 22:58:38 +02:00
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_EXIT exitCode %d " , exitCode ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ADDFLAG ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) + value ) ;
2014-07-26 00:39:57 +02:00
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
2014-07-26 00:39:57 +02:00
}
else {
2013-10-30 02:28:07 +00:00
_result = 0 ;
2014-07-26 00:39:57 +02:00
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ADDFLAG flagId %04x (%s), value %d " , flagId , Flags : : getFlagName ( flagId ) , value ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_TALKANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 animNumber = readScriptFlagValue ( ) ;
int32 slot = readScriptFlagValue ( ) ;
2014-07-02 02:38:39 +02:00
_vm - > doTalkAnim ( animNumber , slot , kNormalAnimation ) ;
debugInterpreter ( " O_TALKANIM animNumber %d, slot %d " , animNumber , slot ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SUBFLAG ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) - value ) ;
2014-07-26 00:39:57 +02:00
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
2014-07-26 00:39:57 +02:00
}
else {
2013-10-30 02:28:07 +00:00
_result = 0 ;
2014-07-26 00:39:57 +02:00
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SUBFLAG flagId %d, value %d " , flagId , value ) ;
2013-10-15 23:21:00 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETSTRING ( ) {
int32 offset = readScript < uint32 > ( ) ;
2013-11-02 01:29:26 +00:00
_currentString = offset ;
2013-10-30 02:28:07 +00:00
if ( offset > = 80000 ) {
2014-07-07 00:19:15 +02:00
_string = _vm - > _variaTxt - > getString ( offset - 80000 ) ;
2014-06-26 18:29:19 +02:00
debugInterpreter ( " GetVaria %s " , _string ) ;
2013-10-30 02:28:07 +00:00
}
else if ( offset < 2000 ) {
2014-07-03 16:47:24 +02:00
_vm - > _dialogData = & _vm - > _dialogDat [ offset * 4 - 4 ] ;
2014-06-28 17:10:12 +02:00
uint32 of = READ_LE_UINT32 ( _vm - > _talkTxt + offset * 4 ) ;
const char * txt = ( const char * ) & _vm - > _talkTxt [ of ] ;
2013-10-30 02:28:07 +00:00
_string = & _vm - > _talkTxt [ of ] ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " TalkTxt %d %s " , of , txt ) ;
2013-10-30 02:28:07 +00:00
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETSTRING %04d " , offset ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ANDFLAG ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) & value ) ;
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
} else {
_result = 0 ;
}
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_ANDFLAG flagId %d, value %d " , flagId , value ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETMOBDATA ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 mobId = readScriptFlagValue ( ) ;
int32 mobOffset = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
int16 value = _vm - > _mobList [ mobId ] . getData ( ( Mob : : AttrId ) mobOffset ) ;
_flags - > setFlagValue ( flagId , value ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETMOBDATA flagId %d, modId %d, mobOffset %d " , flagId , mobId , mobOffset ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ORFLAG ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) | value ) ;
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
} else {
_result = 0 ;
}
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_ORFLAG flagId %d, value %d " , flagId , value ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETMOBDATA ( ) {
2014-08-08 17:09:26 +02:00
int32 mobId = readScriptFlagValue ( ) ;
int32 mobOffset = readScriptFlagValue ( ) ;
int32 value = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > _mobList [ mobId ] . setData ( ( Mob : : AttrId ) mobOffset , value ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETMOBDATA mobId %d, mobOffset %d, value %d " , mobId , mobOffset , value ) ;
2013-10-28 00:06:21 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_XORFLAG ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) ^ value ) ;
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
} else {
_result = 0 ;
}
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_XORFLAG flagId %d, value %d " , flagId , value ) ;
2013-10-28 00:06:21 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETMOBTEXT ( ) {
2014-08-08 17:09:26 +02:00
int32 mob = readScriptFlagValue ( ) ;
2014-06-26 18:29:19 +02:00
_currentString = _vm - > _locationNr * 100 + mob + 60001 ;
2014-06-29 20:39:40 +02:00
_string = ( byte * ) _vm - > _mobList [ mob ] . _examText . c_str ( ) ;
2014-06-26 18:29:19 +02:00
debugInterpreter ( " O_GETMOBTEXT mob %d " , mob ) ;
2013-10-28 00:06:21 +00:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_MOVEHERO ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
int32 x = readScriptFlagValue ( ) ;
int32 y = readScriptFlagValue ( ) ;
int32 dir = readScriptFlagValue ( ) ;
2014-07-19 18:10:11 +02:00
_vm - > moveRunHero ( heroId , x , y , dir , false ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_MOVEHERO heroId %d, x %d, y %d, dir %d " , heroId , x , y , dir ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_WALKHERO ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2014-07-20 01:46:47 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else if ( heroId = = 1 ) {
hero = _vm - > _secondHero ;
}
if ( hero ! = nullptr ) {
2014-07-26 19:31:54 +02:00
if ( hero - > _state ! = Hero : : kHeroStateStay ) {
2014-07-20 01:46:47 +02:00
_currentInstruction - = 4 ;
_opcodeNF = 1 ;
}
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_WALKHERO %d " , heroId ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETHERO ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
int32 x = readScriptFlagValue ( ) ;
int32 y = readScriptFlagValue ( ) ;
int32 dir = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else if ( heroId = = 1 ) {
hero = _vm - > _secondHero ;
2014-07-08 16:38:09 +02:00
}
2014-07-26 00:39:57 +02:00
if ( hero ! = nullptr ) {
hero - > setPos ( x , y ) ;
hero - > _lastDirection = dir ;
hero - > _visible = 1 ;
hero - > countDrawPosition ( ) ;
}
debugInterpreter ( " O_SETHERO heroId %d, x %d, y %d, dir %d " , heroId , x , y , dir ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_HEROOFF ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else if ( heroId = = 1 ) {
hero = _vm - > _secondHero ;
}
if ( hero ! = nullptr ) {
hero - > setVisible ( false ) ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_HEROOFF %d " , heroId ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_HEROON ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else if ( heroId = = 1 ) {
hero = _vm - > _secondHero ;
}
if ( hero ! = nullptr ) {
hero - > setVisible ( true ) ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_HEROON %d " , heroId ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CLSTEXT ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > _textSlots [ slot ] . _str = nullptr ;
_vm - > _textSlots [ slot ] . _time = 0 ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_CLSTEXT slot %d " , slot ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CALLTABLE ( ) {
2014-07-29 02:25:42 +02:00
Flags : : Id flagId = readScriptFlagId ( ) ;
int roomNr = _flags - > getFlagValue ( flagId ) ;
int32 tableOffset = readScript < uint32 > ( ) ;
int initLocationScript = _script - > getLocationInitScript ( tableOffset , roomNr ) ;
if ( initLocationScript ) {
_stack [ _stacktop ] = _currentInstruction ;
_stacktop + + ;
_currentInstruction = initLocationScript ;
}
debugInterpreter ( " O_CALLTABLE loc %d " , roomNr ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEMOB ( ) {
2014-08-08 17:09:26 +02:00
int32 mob = readScriptFlagValue ( ) ;
int32 value = readScriptFlagValue ( ) ;
2014-06-28 09:51:14 +02:00
value ^ = 1 ;
2014-07-29 02:25:42 +02:00
_vm - > _script - > setMobVisible ( _vm - > _room - > _mobs , mob , value ) ;
2014-06-28 09:51:14 +02:00
_vm - > _mobList [ mob ] . _visible = value ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
debugInterpreter ( " O_CHANGEMOB mob %d, value %d " , mob , value ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ADDINV ( ) {
2014-08-08 17:09:26 +02:00
int32 hero = readScriptFlagValue ( ) ;
int32 item = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > addInv ( hero , item , false ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ADDINV hero %d, item %d " , hero , item ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REMINV ( ) {
2014-08-08 17:09:26 +02:00
int32 hero = readScriptFlagValue ( ) ;
int32 item = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > remInv ( hero , item ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_REMINV hero %d, item %d " , hero , item ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REPINV ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_REPINV " ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_OBSOLETE_GETACTION ( ) {
2013-11-18 16:19:21 +00:00
error ( " O_OBSOLETE_GETACTION " ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ADDWALKAREA ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_ADDWALKAREA " ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REMWALKAREA ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_REMWALKAREA " ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_RESTOREWALKAREA ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_RESTOREWALKAREA " ) ;
2013-11-04 16:07:19 +00:00
}
2013-10-22 01:05:24 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_WAITFRAME ( ) {
2013-10-30 02:28:07 +00:00
_opcodeNF = true ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_WAITFRAME " ) ;
2013-10-22 01:05:24 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETFRAME ( ) {
2014-08-08 17:09:26 +02:00
int32 anim = readScriptFlagValue ( ) ;
int32 frame = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
_vm - > _normAnimList [ anim ] . _frame = frame ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETFRAME anim %d, frame %d " , anim , frame ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_RUNACTION ( ) {
2013-11-18 16:19:21 +00:00
error ( " O_RUNACTION " ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_COMPAREHI ( ) {
2013-11-18 16:19:21 +00:00
Flags : : Id flag = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
int32 flagValue = _flags - > getFlagValue ( flag ) ;
2014-07-07 03:12:35 +02:00
if ( flagValue > value ) {
_result = 0 ;
} else {
_result = 1 ;
}
debugInterpreter ( " O_COMPAREHI flag %04x - (%s), value %d, flagValue %d, result %d " , flag , Flags : : getFlagName ( flag ) , value , flagValue , _result ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_COMPARELO ( ) {
2013-11-18 16:19:21 +00:00
Flags : : Id flag = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
int32 flagValue = _flags - > getFlagValue ( flag ) ;
2014-07-07 03:12:35 +02:00
if ( flagValue < value ) {
_result = 0 ;
} else {
_result = 1 ;
}
debugInterpreter ( " O_COMPARELO flag %04x - (%s), value %d, flagValue %d, result %d " , flag , Flags : : getFlagName ( flag ) , value , flagValue , _result ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PRELOADSET ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_PRELOADSET " ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREEPRELOAD ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_FREEPRELOAD " ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:54:44 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKINV ( ) {
2014-07-26 00:54:44 +02:00
error ( " O_CHECKINV " ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_TALKHERO ( ) {
2014-08-08 17:09:26 +02:00
int32 hero = readScriptFlagValue ( ) ;
2014-07-03 20:53:19 +02:00
_vm - > talkHero ( hero ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_TALKHERO hero %d " , hero ) ;
2013-11-04 16:07:19 +00:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_WAITTEXT ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-02 01:29:26 +00:00
Text & text = _vm - > _textSlots [ slot ] ;
2014-07-07 20:46:06 +02:00
if ( text . _time & & text . _str ) {
if ( _flags - > getFlagValue ( Flags : : ESCAPED ) ) {
text . _time = 1 ;
2014-07-26 00:39:57 +02:00
if ( ! slot ) {
2014-07-07 20:46:06 +02:00
_vm - > _mainHero - > _talkTime = 1 ;
} else if ( slot = = 1 ) {
_vm - > _secondHero - > _talkTime = 1 ;
}
} else {
_opcodeNF = 1 ;
_currentInstruction - = 4 ;
}
2013-11-02 01:29:26 +00:00
}
2014-07-26 00:39:57 +02:00
//debugInterpreter("O_WAITTEXT slot %d", slot);
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETHEROANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
int32 offset = readScript < uint32 > ( ) ;
2014-07-20 17:38:17 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else {
hero = _vm - > _secondHero ;
}
if ( hero ! = nullptr ) {
hero - > freeHeroAnim ( ) ;
if ( hero - > _specAnim = = nullptr ) {
hero - > _specAnim = new Animation ( ) ;
if ( offset < 100 ) {
const Common : : String animName = Common : : String : : format ( " AN%02d " , offset ) ;
Resource : : loadResource ( hero - > _specAnim , animName . c_str ( ) , true ) ;
} else {
const Common : : String animName = Common : : String ( ( const char * ) _script - > getHeroAnimName ( offset ) ) ;
Common : : String normalizedPath = lastPathComponent ( animName , ' \\ ' ) ;
Resource : : loadResource ( hero - > _specAnim , normalizedPath . c_str ( ) , true ) ;
}
hero - > _phase = 0 ;
2014-07-26 19:31:54 +02:00
hero - > _state = Hero : : kHeroStateSpec ;
2014-07-20 17:38:17 +02:00
}
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETHEROANIM hero %d, offset %d " , hero , offset ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_WAITHEROANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else {
hero = _vm - > _secondHero ;
}
if ( hero ! = nullptr ) {
2014-07-26 19:31:54 +02:00
if ( hero - > _state = = Hero : : kHeroStateSpec ) {
2014-07-07 20:46:06 +02:00
_currentInstruction - = 4 ;
_opcodeNF = 1 ;
}
}
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_WAITHEROANIM heroId %d " , heroId ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETHERODATA ( ) {
2014-07-08 16:38:09 +02:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
int32 heroOffset = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
Hero * hero = nullptr ;
if ( ! heroId ) {
hero = _vm - > _mainHero ;
} else {
hero = _vm - > _secondHero ;
}
if ( hero ! = nullptr ) {
_flags - > setFlagValue ( flagId , hero - > getData ( ( Hero : : AttrId ) heroOffset ) ) ;
2014-07-08 16:38:09 +02:00
}
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_GETHERODATA flag %04x - (%s), heroId %d, heroOffset %d " , flagId , Flags : : getFlagName ( flagId ) , heroId , heroOffset ) ;
2013-11-04 16:07:19 +00:00
}
2014-08-08 22:58:38 +02:00
// No need of implementation here
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETMOUSEBUTTON ( ) {
debugInterpreter ( " O_GETMOUSEBUTTON " ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEFRAMES ( ) {
2014-08-08 17:09:26 +02:00
int32 anim = readScriptFlagValue ( ) ;
int32 frame = readScriptFlagValue ( ) ;
int32 lastFrame = readScriptFlagValue ( ) ;
int32 loopFrame = readScriptFlagValue ( ) ;
2014-07-02 02:22:55 +02:00
_vm - > _normAnimList [ anim ] . _frame = frame ;
_vm - > _normAnimList [ anim ] . _lastFrame = lastFrame ;
_vm - > _normAnimList [ anim ] . _loopFrame = loopFrame ;
debugInterpreter ( " O_CHANGFRAMES anim %d, frame %d, lastFrame %d, loopFrame %d " , anim , frame , lastFrame , loopFrame ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEBACKFRAMES ( ) {
2014-08-08 17:09:26 +02:00
int32 anim = readScriptFlagValue ( ) ;
int32 frame = readScriptFlagValue ( ) ;
int32 lastFrame = readScriptFlagValue ( ) ;
int32 loopFrame = readScriptFlagValue ( ) ;
2014-07-01 21:54:33 +02:00
int currAnim = _vm - > _backAnimList [ anim ] . _seq . _currRelative ;
Anim & backAnim = _vm - > _backAnimList [ anim ] . backAnims [ currAnim ] ;
backAnim . _frame = frame ;
backAnim . _lastFrame = lastFrame ;
backAnim . _loopFrame = loopFrame ;
debugInterpreter ( " O_CHANGEBACKFRAMES anim %d, frame %d, lastFrame %d, loopFrame %d " , anim , frame , lastFrame , loopFrame ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETBACKANIMDATA ( ) {
2014-07-01 20:44:56 +02:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 animNumber = readScriptFlagValue ( ) ;
int32 animDataOffset = readScriptFlagValue ( ) ;
2014-07-01 20:44:56 +02:00
int currAnim = _vm - > _backAnimList [ animNumber ] . _seq . _currRelative ;
int16 value = _vm - > _backAnimList [ animNumber ] . backAnims [ currAnim ] . getAnimData ( ( Anim : : AnimOffsets ) ( animDataOffset ) ) ;
_flags - > setFlagValue ( ( Flags : : Id ) ( flagId ) , value ) ;
debugInterpreter ( " O_GETBACKANIMDATA flag %04X (%s), animNumber %d, animDataOffset %d, value %d " , flagId , Flags : : getFlagName ( flagId ) , animNumber , animDataOffset , value ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETANIMDATA ( ) {
2014-07-04 03:12:06 +02:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 anim = readScriptFlagValue ( ) ;
int32 animOffset = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
if ( _vm - > _normAnimList [ anim ] . _animData ! = nullptr ) {
_flags - > setFlagValue ( flagId , _vm - > _normAnimList [ anim ] . getAnimData ( ( Anim : : AnimOffsets ) ( animOffset ) ) ) ;
}
debugInterpreter ( " O_GETANIMDATA flag %04X (%s), anim %d, animOffset %d " , flagId , Flags : : getFlagName ( flagId ) , anim , animOffset ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETBGCODE ( ) {
int32 offset = readScript < uint32 > ( ) ;
2013-12-03 14:46:24 +00:00
_bgOpcodePC = _currentInstruction + offset - 4 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETBGCODE next %08x, offset %08x " , _bgOpcodePC , offset ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETBACKFRAME ( ) {
2014-08-08 17:09:26 +02:00
int32 anim = readScriptFlagValue ( ) ;
int32 frame = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
int currAnim = _vm - > _backAnimList [ anim ] . _seq . _currRelative ;
if ( _vm - > _backAnimList [ anim ] . backAnims [ currAnim ] . _animData ! = nullptr ) {
_vm - > _backAnimList [ anim ] . backAnims [ currAnim ] . _frame = frame ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETBACKFRAME anim %d, frame %d " , anim , frame ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETRND ( ) {
2013-11-18 16:19:21 +00:00
Flags : : Id flag = readScriptFlagId ( ) ;
2013-12-10 00:26:42 +00:00
uint16 rndSeed = readScript < uint16 > ( ) ;
2014-07-05 22:31:02 +02:00
int value = _vm - > _randomSource . getRandomNumber ( rndSeed - 1 ) ;
2014-07-04 03:12:06 +02:00
_flags - > setFlagValue ( flag , value ) ;
2014-07-05 22:31:02 +02:00
debugInterpreter ( " O_GETRND flag %d, rndSeed %d, value %d " , flag , rndSeed , value ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_TALKBACKANIM ( ) {
2014-08-08 17:09:26 +02:00
int32 animNumber = readScriptFlagValue ( ) ;
int32 slot = readScriptFlagValue ( ) ;
2014-07-02 02:38:39 +02:00
_vm - > doTalkAnim ( animNumber , slot , kBackgroundAnimation ) ;
debugInterpreter ( " O_TALKBACKANIM animNumber %d, slot %d " , animNumber , slot ) ;
2013-11-04 16:07:19 +00:00
}
2014-07-26 00:39:57 +02:00
// Simplifying, because used only once in Location 20
2013-12-10 00:26:42 +00:00
void Interpreter : : O_LOADPATH ( ) {
2014-07-22 16:52:39 +02:00
readScript < uint32 > ( ) ;
2014-07-19 18:10:11 +02:00
_vm - > loadPath ( " path2 " ) ;
debugInterpreter ( " O_LOADPATH - path2 " ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETCHAR ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , * _string ) ;
2014-07-01 20:12:43 +02:00
_string + + ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_GETCHAR %04X (%s) %02x " , flagId , Flags : : getFlagName ( flagId ) , _flags - > getFlagValue ( flagId ) ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETDFLAG ( ) {
2014-07-01 20:12:43 +02:00
Flags : : Id flagId = readScriptFlagId ( ) ;
int32 address = readScript < uint32 > ( ) ;
_flags - > setFlagValue ( ( Flags : : Id ) ( flagId ) , _currentInstruction + address - 4 ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_SETDFLAG 0x%04X (%s) = 0x%04X " , flagId , Flags : : getFlagName ( flagId ) , _currentInstruction + address - 4 ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CALLDFLAG ( ) {
2014-07-01 20:12:43 +02:00
Flags : : Id flagId = readScriptFlagId ( ) ;
_stack [ _stacktop ] = _currentInstruction ;
_stacktop + + ;
_currentInstruction = _flags - > getFlagValue ( flagId ) ;
debugInterpreter ( " O_CALLDFLAG 0x%04X (%s) = 0x%04X " , flagId , Flags : : getFlagName ( flagId ) , _currentInstruction ) ;
2013-11-04 16:07:19 +00:00
}
2013-10-30 02:28:07 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PRINTAT ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
int32 x = readScriptFlagValue ( ) ;
int32 y = readScriptFlagValue ( ) ;
int32 color = _flags - > getFlagValue ( Flags : : KOLOR ) ;
2014-07-04 03:12:06 +02:00
_vm - > printAt ( slot , color , ( char * ) _string , x , y ) ;
2014-06-28 17:10:12 +02:00
increaseString ( ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_PRINTAT slot %d, x %d, y %d " , slot , x , y ) ;
2013-10-30 02:28:07 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ZOOMIN ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
_vm - > initZoomIn ( slot ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ZOOMIN slot %04d " , slot ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ZOOMOUT ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
_vm - > initZoomOut ( slot ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ZOOMOUT slot %d " , slot ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETSTRINGOFFSET ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_SETSTRINGOFFSET " ) ;
2013-11-04 11:28:10 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETOBJDATA ( ) {
2013-11-18 16:19:21 +00:00
Flags : : Id flag = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
int32 objOffset = readScriptFlagValue ( ) ;
2014-07-30 19:54:39 +02:00
int nr = _vm - > _objSlot [ slot ] ;
if ( nr ! = 0xFF ) {
int16 value = _vm - > _objList [ nr ] - > getData ( ( Object : : AttrId ) objOffset ) ;
_flags - > setFlagValue ( flag , value ) ;
}
debugInterpreter ( " O_GETOBJDATA flag %d, objSlot %d, objOffset %d " , flag , slot , objOffset ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETOBJDATA ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
int32 objOffset = readScriptFlagValue ( ) ;
int32 value = readScriptFlagValue ( ) ;
2014-07-30 19:54:39 +02:00
int nr = _vm - > _objSlot [ slot ] ;
if ( nr ! = 0xFF ) {
_vm - > _objList [ nr ] - > setData ( ( Object : : AttrId ) objOffset , value ) ;
}
debugInterpreter ( " O_SETOBJDATA objSlot %d, objOffset %d, value %d " , slot , objOffset , value ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SWAPOBJECTS ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_SWAPOBJECTS " ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEHEROSET ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
int32 heroSet = readScriptFlagValue ( ) ;
2014-07-23 21:46:50 +02:00
if ( ! heroId ) {
_vm - > _mainHero - > loadAnimSet ( heroSet ) ;
} else if ( heroId = = 1 ) {
_vm - > _secondHero - > loadAnimSet ( heroSet ) ;
}
debugInterpreter ( " O_CHANGEHEROSET hero %d, heroSet %d " , heroId , heroSet ) ;
2013-11-04 11:28:10 +00:00
}
2013-11-02 15:28:56 +00:00
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ADDSTRING ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_ADDSTRING " ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SUBSTRING ( ) {
2014-08-08 17:09:26 +02:00
int32 value = readScriptFlagValue ( ) ;
2014-07-01 20:12:43 +02:00
_string - = value ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_SUBSTRING value %d " , value ) ;
2014-07-01 20:12:43 +02:00
}
int Interpreter : : checkSeq ( byte * string ) {
int freeHSlotIncrease = 0 ;
byte c ;
2014-07-05 16:05:34 +02:00
while ( ( c = string [ 0 ] ) ! = 0xFF ) {
2014-07-01 20:12:43 +02:00
string + + ;
if ( c < 0xF0 ) {
freeHSlotIncrease + + ;
2014-07-05 16:05:34 +02:00
while ( ( c = string [ 0 ] ) ) {
2014-07-01 20:12:43 +02:00
string + + ;
}
string + + ;
2014-07-05 16:05:34 +02:00
} else if ( c ! = 0xFE ) {
string + + ;
2014-07-01 20:12:43 +02:00
}
}
return freeHSlotIncrease ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_INITDIALOG ( ) {
2014-07-01 20:12:43 +02:00
if ( _string [ 0 ] = = 255 ) {
2014-07-03 16:47:24 +02:00
byte * stringCurrOff = _string ;
byte * string = _string ;
stringCurrOff + + ;
int32 adressOfFirstSequence = ( int ) READ_UINT16 ( stringCurrOff ) ;
stringCurrOff + = 2 ;
_string = string + adressOfFirstSequence ;
2014-07-01 20:12:43 +02:00
for ( int i = 0 ; i < 32 ; i + + ) {
2014-07-03 20:53:19 +02:00
_vm - > _dialogBoxAddr [ i ] = 0 ;
_vm - > _dialogOptAddr [ i ] = 0 ;
2014-07-01 20:12:43 +02:00
}
for ( int i = 0 ; i < 4 * 32 ; i + + ) {
2014-07-03 20:53:19 +02:00
_vm - > _dialogOptLines [ i ] = 0 ;
2014-07-01 20:12:43 +02:00
}
2014-07-03 16:47:24 +02:00
int16 off ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
byte * line = nullptr ;
2014-07-03 16:47:24 +02:00
int dialogBox = 0 ;
while ( ( off = ( int ) READ_UINT16 ( stringCurrOff ) ) ! = - 1 ) {
stringCurrOff + = 2 ;
if ( off ) {
line = string + off ;
2014-07-01 20:12:43 +02:00
}
2014-07-03 20:53:19 +02:00
_vm - > _dialogBoxAddr [ dialogBox ] = line ;
2014-07-03 16:47:24 +02:00
dialogBox + + ;
2014-07-01 20:12:43 +02:00
}
2014-07-03 16:47:24 +02:00
stringCurrOff + = 2 ;
int dialogOpt = 0 ;
while ( ( off = ( int ) READ_UINT16 ( stringCurrOff ) ) ! = - 1 ) {
stringCurrOff + = 2 ;
if ( off ) {
line = string + off ;
2014-07-01 20:12:43 +02:00
}
2014-07-03 20:53:19 +02:00
_vm - > _dialogOptAddr [ dialogOpt ] = line ;
2014-07-03 16:47:24 +02:00
dialogOpt + + ;
2014-07-01 20:12:43 +02:00
}
2014-07-03 04:19:52 +02:00
2014-07-01 20:12:43 +02:00
_flags - > setFlagValue ( Flags : : VOICE_A_LINE , 0 ) ;
_flags - > setFlagValue ( Flags : : VOICE_B_LINE , 0 ) ; // bx in original?
int freeHSlot = 0 ;
for ( int i = 31 ; i > = 0 ; i - - ) {
2014-07-03 20:53:19 +02:00
if ( _vm - > _dialogOptAddr [ i ] ! = 0 ) {
2014-07-03 04:19:52 +02:00
i + + ;
2014-07-01 20:12:43 +02:00
freeHSlot = i ;
_flags - > setFlagValue ( Flags : : VOICE_H_LINE , i ) ;
break ;
}
}
freeHSlot + = checkSeq ( _string ) ;
for ( int i = 0 ; i < 32 ; i + + ) {
2014-07-03 20:53:19 +02:00
_vm - > _dialogOptLines [ i * 4 ] = freeHSlot ;
_vm - > _dialogOptLines [ i * 4 + 1 ] = freeHSlot ;
_vm - > _dialogOptLines [ i * 4 + 2 ] = freeHSlot ;
if ( _vm - > _dialogOptAddr [ i ] ) {
freeHSlot + = checkSeq ( _vm - > _dialogOptAddr [ i ] ) ;
2014-07-01 20:12:43 +02:00
}
}
}
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_INITDIALOG " ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ENABLEDIALOGOPT ( ) {
2014-08-08 17:09:26 +02:00
int32 opt = readScriptFlagValue ( ) ;
2014-07-03 22:35:41 +02:00
int dialogDataValue = ( int ) READ_UINT32 ( _vm - > _dialogData ) ;
dialogDataValue & = ~ ( 1u < < opt ) ;
WRITE_UINT32 ( _vm - > _dialogData , dialogDataValue ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_ENABLEDIALOGOPT opt %d " , opt ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_DISABLEDIALOGOPT ( ) {
2014-08-08 17:09:26 +02:00
int32 opt = readScriptFlagValue ( ) ;
2014-07-03 22:35:41 +02:00
int dialogDataValue = ( int ) READ_UINT32 ( _vm - > _dialogData ) ;
dialogDataValue | = ( 1u < < opt ) ;
WRITE_UINT32 ( _vm - > _dialogData , dialogDataValue ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_DISABLEDIALOGOPT opt %d " , opt ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SHOWDIALOGBOX ( ) {
2014-08-08 17:09:26 +02:00
int32 box = readScriptFlagValue ( ) ;
2014-08-02 16:03:54 +02:00
uint32 currInstr = _currentInstruction ;
2014-07-03 20:53:19 +02:00
_vm - > createDialogBox ( box ) ;
_flags - > setFlagValue ( Flags : : DIALINES , _vm - > _dialogLines ) ;
2014-07-26 00:39:57 +02:00
if ( _vm - > _dialogLines ) {
2014-07-03 20:53:19 +02:00
_vm - > changeCursor ( 1 ) ;
_vm - > runDialog ( ) ;
_vm - > changeCursor ( 0 ) ;
2014-06-16 22:06:53 +02:00
}
2014-08-02 16:03:54 +02:00
_currentInstruction = currInstr ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_SHOWDIALOGBOX box %d " , box ) ;
2013-11-04 16:07:19 +00:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_STOPSAMPLE ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-05 22:15:55 +00:00
_vm - > stopSample ( slot ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_STOPSAMPLE slot %d " , slot ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_BACKANIMRANGE ( ) {
2014-08-08 17:09:26 +02:00
int32 slotId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
uint16 animId = readScript < uint16 > ( ) ;
2014-08-08 17:09:26 +02:00
int32 low = readScriptFlagValue ( ) ;
int32 high = readScriptFlagValue ( ) ;
2013-12-03 14:46:24 +00:00
if ( animId ! = 0xFFFF ) {
2014-07-29 02:25:42 +02:00
if ( animId & InterpreterFlags : : kFlagMask ) {
2013-12-10 00:26:42 +00:00
animId = _flags - > getFlagValue ( ( Flags : : Id ) animId ) ;
2013-12-03 14:46:24 +00:00
}
}
_result = 1 ;
2014-07-04 19:10:22 +02:00
if ( ! _vm - > _backAnimList [ slotId ] . backAnims . empty ( ) ) {
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
if ( _vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] . _animData ! = nullptr ) {
if ( animId = = 0xFFFF | | _vm - > _backAnimList [ slotId ] . _seq . _current = = animId ) {
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
Anim & backAnim = _vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] ;
if ( ! backAnim . _state ) {
if ( backAnim . _frame > = low ) {
if ( backAnim . _frame < = high ) {
_result = 0 ;
}
2014-07-01 21:26:53 +02:00
}
}
}
}
}
debugInterpreter ( " O_BACKANIMRANGE slotId %d, animId %d, low %d, high %d, _result %d " , slotId , animId , low , high , _result ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CLEARPATH ( ) {
2014-07-19 18:10:11 +02:00
for ( int i = 0 ; i < _vm - > kPathBitmapLen ; i + + ) {
_vm - > _roomPathBitmap [ i ] = 255 ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CLEARPATH " ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETPATH ( ) {
2014-07-19 18:10:11 +02:00
_vm - > loadPath ( " path " ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETPATH " ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETHEROX ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-07-26 00:39:57 +02:00
if ( ! heroId ) {
2014-07-08 16:38:09 +02:00
_flags - > setFlagValue ( flagId , _vm - > _mainHero - > _middleX ) ;
} else if ( heroId = = 1 ) {
_flags - > setFlagValue ( flagId , _vm - > _secondHero - > _middleX ) ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETHEROX heroId %d, flagId %d " , heroId , flagId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETHEROY ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-07-26 00:39:57 +02:00
if ( ! heroId ) {
2014-07-08 16:38:09 +02:00
_flags - > setFlagValue ( flagId , _vm - > _mainHero - > _middleY ) ;
} else if ( heroId = = 1 ) {
_flags - > setFlagValue ( flagId , _vm - > _secondHero - > _middleY ) ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETHEROY heroId %d, flagId %d " , heroId , flagId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETHEROD ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-07-26 00:39:57 +02:00
if ( ! heroId ) {
2014-07-08 16:38:09 +02:00
_flags - > setFlagValue ( flagId , _vm - > _mainHero - > _lastDirection ) ;
} else if ( heroId = = 1 ) {
_flags - > setFlagValue ( flagId , _vm - > _secondHero - > _lastDirection ) ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETHEROD heroId %d, flagId %d " , heroId , flagId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PUSHSTRING ( ) {
2014-07-23 15:07:54 +02:00
_stringStack . string = _string ;
_stringStack . dialogData = _vm - > _dialogData ;
_stringStack . currentString = _currentString ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_PUSHSTRING " ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_POPSTRING ( ) {
2014-07-23 15:07:54 +02:00
_string = _stringStack . string ;
_vm - > _dialogData = _stringStack . dialogData ;
_currentString = _stringStack . currentString ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_POPSTRING " ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETFGCODE ( ) {
int32 offset = readScript < uint32 > ( ) ;
2013-12-03 14:46:24 +00:00
_fgOpcodePC = _currentInstruction + offset - 4 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETFGCODE next %08x, offset %08x " , _fgOpcodePC , offset ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_STOPHERO ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2014-07-14 03:26:17 +02:00
if ( ! heroId ) {
_vm - > _mainHero - > freeOldMove ( ) ;
} else if ( heroId = = 1 ) {
_vm - > _secondHero - > freeOldMove ( ) ;
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_STOPHERO heroId %d " , heroId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ANIMUPDATEOFF ( ) {
2014-08-08 17:09:26 +02:00
int32 slotId = readScriptFlagValue ( ) ;
2014-07-04 19:10:22 +02:00
_vm - > _normAnimList [ slotId ] . _state = 1 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ANIMUPDATEOFF slotId %d " , slotId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ANIMUPDATEON ( ) {
2014-08-08 17:09:26 +02:00
int32 slotId = readScriptFlagValue ( ) ;
2014-07-04 19:10:22 +02:00
_vm - > _normAnimList [ slotId ] . _state = 0 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ANIMUPDATEON slotId %d " , slotId ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREECURSOR ( ) {
2014-07-04 19:10:22 +02:00
_vm - > changeCursor ( 0 ) ;
_vm - > _currentPointerNumber = 1 ;
// free memory here?
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_FREECURSOR " ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ADDINVQUIET ( ) {
2014-08-08 17:09:26 +02:00
int32 hero = readScriptFlagValue ( ) ;
int32 item = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > addInv ( hero , item , true ) ;
debugInterpreter ( " O_ADDINVQUIET hero %d, item %d " , hero , item ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_RUNHERO ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
int32 x = readScriptFlagValue ( ) ;
int32 y = readScriptFlagValue ( ) ;
int32 dir = readScriptFlagValue ( ) ;
2014-07-19 18:10:11 +02:00
_vm - > moveRunHero ( heroId , x , y , dir , true ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_RUNHERO heroId %d, x %d, y %d, dir %d " , heroId , x , y , dir ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETBACKANIMDATA ( ) {
2014-07-01 20:44:56 +02:00
uint16 animNumber = readScript < uint16 > ( ) ;
uint16 animDataOffset = readScript < uint16 > ( ) ;
Flags : : Id flagId = readScriptFlagId ( ) ;
uint16 value = _flags - > getFlagValue ( ( Flags : : Id ) ( flagId ) ) ;
int currAnim = _vm - > _backAnimList [ animNumber ] . _seq . _currRelative ;
_vm - > _backAnimList [ animNumber ] . backAnims [ currAnim ] . setAnimData ( ( Anim : : AnimOffsets ) ( animDataOffset ) , value ) ;
debugInterpreter ( " O_SETBACKANIMDATA flag %04X (%s), animNumber %d, animDataOffset %d, value %d " , flagId , Flags : : getFlagName ( flagId ) , animNumber , animDataOffset , value ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-22 01:05:24 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_VIEWFLC ( ) {
2014-08-08 17:09:26 +02:00
int32 animNr = readScriptFlagValue ( ) ;
2013-10-30 02:28:07 +00:00
_vm - > loadAnim ( animNr , false ) ;
2014-07-26 00:39:57 +02:00
debugInterpreter ( " O_VIEWFLC animNr %d " , animNr ) ;
2013-10-22 01:05:24 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKFLCFRAME ( ) {
2014-08-08 17:09:26 +02:00
int32 frameNr = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CHECKFLCFRAME frame number %d " , frameNr ) ;
2013-12-10 00:32:07 +00:00
if ( _vm - > _flicPlayer . getCurFrame ( ) ! = frameNr ) {
2014-07-30 23:44:45 +02:00
_currentInstruction - = 4 ;
2013-10-30 02:28:07 +00:00
_opcodeNF = 1 ;
}
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKFLCEND ( ) {
2013-10-30 02:28:07 +00:00
const Video : : FlicDecoder & flicPlayer = _vm - > _flicPlayer ;
2014-07-30 23:44:45 +02:00
debugInterpreter ( " O_CHECKFLCEND frameCount %d, currentFrame %d " , flicPlayer . getFrameCount ( ) , flicPlayer . getCurFrame ( ) ) ;
2013-11-18 16:19:21 +00:00
if ( flicPlayer . getFrameCount ( ) - flicPlayer . getCurFrame ( ) > 1 ) {
2013-10-30 02:28:07 +00:00
_currentInstruction - = 2 ;
_opcodeNF = 1 ;
}
2013-10-24 01:01:55 +01:00
}
2014-07-30 23:44:45 +02:00
// TODO
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREEFLC ( ) {
debugInterpreter ( " O_FREEFLC " ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-22 01:05:24 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_TALKHEROSTOP ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
if ( ! heroId ) {
2014-07-31 20:59:41 +02:00
_vm - > _mainHero - > _state = Hero : : kHeroStateStay ;
2014-07-08 16:38:09 +02:00
} else if ( heroId = = 1 ) {
2014-07-31 20:59:41 +02:00
_vm - > _secondHero - > _state = Hero : : kHeroStateStay ;
2014-07-08 16:38:09 +02:00
}
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_TALKHEROSTOP %d " , heroId ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-22 01:05:24 +01:00
2014-07-08 16:38:09 +02:00
// TODO - check this
2013-12-10 00:26:42 +00:00
void Interpreter : : O_HEROCOLOR ( ) {
2014-08-08 17:09:26 +02:00
int32 heroId = readScriptFlagValue ( ) ;
int32 color = readScriptFlagValue ( ) ;
2014-07-26 00:39:57 +02:00
if ( ! heroId ) {
2014-07-08 16:38:09 +02:00
_vm - > _mainHero - > _color = color ;
} else if ( heroId = = 1 ) {
_vm - > _secondHero - > _color = color ;
}
debugInterpreter ( " O_HEROCOLOR heroId %d, color %d " , heroId , color ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GRABMAPA ( ) {
2014-07-22 16:52:39 +02:00
_vm - > grabMap ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GRABMAPA " ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ENABLENAK ( ) {
2014-08-08 17:09:26 +02:00
int32 nakId = readScriptFlagValue ( ) ;
2014-07-08 16:38:09 +02:00
_vm - > _maskList [ nakId ] . _flags = 0 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ENABLENAK nakId %d " , nakId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_DISABLENAK ( ) {
2014-08-08 17:09:26 +02:00
int32 nakId = readScriptFlagValue ( ) ;
2014-07-08 16:38:09 +02:00
_vm - > _maskList [ nakId ] . _flags = 1 ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_DISABLENAK nakId %d " , nakId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETMOBNAME ( ) {
2014-08-08 17:09:26 +02:00
int32 modId = readScriptFlagValue ( ) ;
2014-07-08 16:38:09 +02:00
_string = ( byte * ) _vm - > _mobList [ modId ] . _name . c_str ( ) ;
debugInterpreter ( " O_GETMOBNAME modId %d " , modId ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SWAPINVENTORY ( ) {
2014-08-08 17:09:26 +02:00
int32 hero = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > swapInv ( hero ) ;
debugInterpreter ( " O_SWAPINVENTORY hero %d " , hero ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CLEARINVENTORY ( ) {
2014-08-08 17:09:26 +02:00
int32 hero = readScriptFlagValue ( ) ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > clearInv ( hero ) ;
debugInterpreter ( " O_CLEARINVENTORY hero %d " , hero ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SKIPTEXT ( ) {
2014-06-28 17:10:12 +02:00
increaseString ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SKIPTEXT " ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETVOICEH ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-18 16:19:21 +00:00
static const uint32 VOICE_H_SLOT = 28 ;
2014-06-26 18:29:19 +02:00
uint16 voiceLineH = _flags - > getFlagValue ( Flags : : VOICE_H_LINE ) ;
_vm - > setVoice ( slot , VOICE_H_SLOT , voiceLineH ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETVOICEA ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-18 16:19:21 +00:00
static const uint32 VOICE_A_SLOT = 29 ;
2014-06-26 18:29:19 +02:00
uint16 voiceLineH = _flags - > getFlagValue ( Flags : : VOICE_H_LINE ) ;
_vm - > setVoice ( slot , VOICE_A_SLOT , voiceLineH ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETVOICEB ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-18 16:19:21 +00:00
static const uint32 VOICE_B_SLOT = 30 ;
2014-06-26 18:29:19 +02:00
uint16 voiceLineH = _flags - > getFlagValue ( Flags : : VOICE_H_LINE ) ;
_vm - > setVoice ( slot , VOICE_B_SLOT , voiceLineH ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETVOICEC ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-18 16:19:21 +00:00
static const uint32 VOICE_C_SLOT = 31 ;
2014-06-26 18:29:19 +02:00
uint16 voiceLineH = _flags - > getFlagValue ( Flags : : VOICE_H_LINE ) ;
_vm - > setVoice ( slot , VOICE_C_SLOT , voiceLineH ) ;
2013-11-18 16:19:21 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETVOICED ( ) {
2014-08-08 17:09:26 +02:00
int32 slot = readScriptFlagValue ( ) ;
2013-11-18 16:19:21 +00:00
static const uint32 VOICE_D_SLOT = 32 ;
2014-06-26 18:29:19 +02:00
uint16 voiceLineH = _flags - > getFlagValue ( Flags : : VOICE_H_LINE ) ;
_vm - > setVoice ( slot , VOICE_D_SLOT , voiceLineH ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_VIEWFLCLOOP ( ) {
2014-08-08 17:09:26 +02:00
int32 animId = readScriptFlagValue ( ) ;
2014-07-30 23:44:45 +02:00
_vm - > loadAnim ( animId , true ) ;
debugInterpreter ( " O_VIEWFLCLOOP animId %d " , animId ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2014-07-30 23:44:45 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FLCSPEED ( ) {
2014-07-30 23:44:45 +02:00
error ( " O_FLCSPEED speed %d " ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_OPENINVENTORY ( ) {
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
_vm - > _showInventoryFlag = true ;
2013-10-30 02:28:07 +00:00
_opcodeNF = 1 ;
PRINCE: O_CHECKANIMFRAME, O_CHECKANIMEND(), O_GETMOBDATA(), O_SETMOBDATA(), O_CLSTEXT(), O_ADDINV(), O_ADDINVQUIET, O_REMINV(), O_SWAPINVENTORY(), O_CLEARINVENTORY(), O_OPENINVENTORY
2014-07-04 02:33:30 +02:00
debugInterpreter ( " O_OPENINVENTORY " ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_KRZYWA ( ) {
2014-08-05 04:30:07 +02:00
_vm - > makeCurve ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_KRZYWA " ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETKRZYWA ( ) {
2014-08-05 04:30:07 +02:00
_vm - > getCurve ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETKRZYWA " ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETMOB ( ) {
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2014-08-08 17:09:26 +02:00
int32 posX = readScriptFlagValue ( ) ;
int32 posY = readScriptFlagValue ( ) ;
2014-08-05 04:30:07 +02:00
int mobNumber = _vm - > getMob ( _vm - > _mobList , true , posX , posY ) ;
_flags - > setFlagValue ( flagId , mobNumber + 1 ) ;
debugInterpreter ( " O_GETMOB flagId %d, posX %d, posY %d " , flagId , posX , posY ) ;
2013-10-24 01:01:55 +01:00
}
2013-10-15 23:21:00 +01:00
2014-07-26 00:39:57 +02:00
// Not used in game
2013-12-10 00:26:42 +00:00
void Interpreter : : O_INPUTLINE ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_INPUTLINE " ) ;
2013-12-10 00:26:42 +00:00
}
2014-07-26 00:39:57 +02:00
// Not used in script
2013-12-10 00:26:42 +00:00
void Interpreter : : O_BREAK_POINT ( ) {
2014-07-26 00:39:57 +02:00
error ( " O_BREAK_POINT " ) ;
2013-12-10 00:26:42 +00:00
}
2014-07-07 20:46:06 +02:00
Interpreter : : OpcodeFunc Interpreter : : _opcodes [ kNumOpcodes ] = {
2013-12-10 00:26:42 +00:00
& Interpreter : : O_WAITFOREVER ,
& Interpreter : : O_BLACKPALETTE ,
& Interpreter : : O_SETUPPALETTE ,
& Interpreter : : O_INITROOM ,
& Interpreter : : O_SETSAMPLE ,
& Interpreter : : O_FREESAMPLE ,
& Interpreter : : O_PLAYSAMPLE ,
& Interpreter : : O_PUTOBJECT ,
& Interpreter : : O_REMOBJECT ,
& Interpreter : : O_SHOWANIM ,
& Interpreter : : O_CHECKANIMEND ,
& Interpreter : : O_FREEANIM ,
& Interpreter : : O_CHECKANIMFRAME ,
& Interpreter : : O_PUTBACKANIM ,
& Interpreter : : O_REMBACKANIM ,
& Interpreter : : O_CHECKBACKANIMFRAME ,
& Interpreter : : O_FREEALLSAMPLES ,
& Interpreter : : O_SETMUSIC ,
& Interpreter : : O_STOPMUSIC ,
& Interpreter : : O__WAIT ,
& Interpreter : : O_UPDATEOFF ,
& Interpreter : : O_UPDATEON ,
& Interpreter : : O_UPDATE ,
& Interpreter : : O_CLS ,
& Interpreter : : O__CALL ,
& Interpreter : : O_RETURN ,
& Interpreter : : O_GO ,
& Interpreter : : O_BACKANIMUPDATEOFF ,
& Interpreter : : O_BACKANIMUPDATEON ,
& Interpreter : : O_CHANGECURSOR ,
& Interpreter : : O_CHANGEANIMTYPE ,
& Interpreter : : O__SETFLAG ,
& Interpreter : : O_COMPARE ,
& Interpreter : : O_JUMPZ ,
& Interpreter : : O_JUMPNZ ,
& Interpreter : : O_EXIT ,
& Interpreter : : O_ADDFLAG ,
& Interpreter : : O_TALKANIM ,
& Interpreter : : O_SUBFLAG ,
& Interpreter : : O_SETSTRING ,
& Interpreter : : O_ANDFLAG ,
& Interpreter : : O_GETMOBDATA ,
& Interpreter : : O_ORFLAG ,
& Interpreter : : O_SETMOBDATA ,
& Interpreter : : O_XORFLAG ,
& Interpreter : : O_GETMOBTEXT ,
& Interpreter : : O_MOVEHERO ,
& Interpreter : : O_WALKHERO ,
& Interpreter : : O_SETHERO ,
& Interpreter : : O_HEROOFF ,
& Interpreter : : O_HEROON ,
& Interpreter : : O_CLSTEXT ,
& Interpreter : : O_CALLTABLE ,
& Interpreter : : O_CHANGEMOB ,
& Interpreter : : O_ADDINV ,
& Interpreter : : O_REMINV ,
& Interpreter : : O_REPINV ,
& Interpreter : : O_OBSOLETE_GETACTION ,
& Interpreter : : O_ADDWALKAREA ,
& Interpreter : : O_REMWALKAREA ,
& Interpreter : : O_RESTOREWALKAREA ,
& Interpreter : : O_WAITFRAME ,
& Interpreter : : O_SETFRAME ,
& Interpreter : : O_RUNACTION ,
& Interpreter : : O_COMPAREHI ,
& Interpreter : : O_COMPARELO ,
& Interpreter : : O_PRELOADSET ,
& Interpreter : : O_FREEPRELOAD ,
& Interpreter : : O_CHECKINV ,
& Interpreter : : O_TALKHERO ,
& Interpreter : : O_WAITTEXT ,
& Interpreter : : O_SETHEROANIM ,
& Interpreter : : O_WAITHEROANIM ,
& Interpreter : : O_GETHERODATA ,
& Interpreter : : O_GETMOUSEBUTTON ,
& Interpreter : : O_CHANGEFRAMES ,
& Interpreter : : O_CHANGEBACKFRAMES ,
& Interpreter : : O_GETBACKANIMDATA ,
& Interpreter : : O_GETANIMDATA ,
& Interpreter : : O_SETBGCODE ,
& Interpreter : : O_SETBACKFRAME ,
& Interpreter : : O_GETRND ,
& Interpreter : : O_TALKBACKANIM ,
& Interpreter : : O_LOADPATH ,
& Interpreter : : O_GETCHAR ,
& Interpreter : : O_SETDFLAG ,
& Interpreter : : O_CALLDFLAG ,
& Interpreter : : O_PRINTAT ,
& Interpreter : : O_ZOOMIN ,
& Interpreter : : O_ZOOMOUT ,
& Interpreter : : O_SETSTRINGOFFSET ,
& Interpreter : : O_GETOBJDATA ,
& Interpreter : : O_SETOBJDATA ,
& Interpreter : : O_SWAPOBJECTS ,
& Interpreter : : O_CHANGEHEROSET ,
& Interpreter : : O_ADDSTRING ,
& Interpreter : : O_SUBSTRING ,
& Interpreter : : O_INITDIALOG ,
& Interpreter : : O_ENABLEDIALOGOPT ,
& Interpreter : : O_DISABLEDIALOGOPT ,
& Interpreter : : O_SHOWDIALOGBOX ,
& Interpreter : : O_STOPSAMPLE ,
& Interpreter : : O_BACKANIMRANGE ,
& Interpreter : : O_CLEARPATH ,
& Interpreter : : O_SETPATH ,
& Interpreter : : O_GETHEROX ,
& Interpreter : : O_GETHEROY ,
& Interpreter : : O_GETHEROD ,
& Interpreter : : O_PUSHSTRING ,
& Interpreter : : O_POPSTRING ,
& Interpreter : : O_SETFGCODE ,
& Interpreter : : O_STOPHERO ,
& Interpreter : : O_ANIMUPDATEOFF ,
& Interpreter : : O_ANIMUPDATEON ,
& Interpreter : : O_FREECURSOR ,
& Interpreter : : O_ADDINVQUIET ,
& Interpreter : : O_RUNHERO ,
& Interpreter : : O_SETBACKANIMDATA ,
& Interpreter : : O_VIEWFLC ,
& Interpreter : : O_CHECKFLCFRAME ,
& Interpreter : : O_CHECKFLCEND ,
& Interpreter : : O_FREEFLC ,
& Interpreter : : O_TALKHEROSTOP ,
& Interpreter : : O_HEROCOLOR ,
& Interpreter : : O_GRABMAPA ,
& Interpreter : : O_ENABLENAK ,
& Interpreter : : O_DISABLENAK ,
& Interpreter : : O_GETMOBNAME ,
& Interpreter : : O_SWAPINVENTORY ,
& Interpreter : : O_CLEARINVENTORY ,
& Interpreter : : O_SKIPTEXT ,
& Interpreter : : O_SETVOICEH ,
& Interpreter : : O_SETVOICEA ,
& Interpreter : : O_SETVOICEB ,
& Interpreter : : O_SETVOICEC ,
& Interpreter : : O_VIEWFLCLOOP ,
& Interpreter : : O_FLCSPEED ,
& Interpreter : : O_OPENINVENTORY ,
& Interpreter : : O_KRZYWA ,
& Interpreter : : O_GETKRZYWA ,
& Interpreter : : O_GETMOB ,
& Interpreter : : O_INPUTLINE ,
& Interpreter : : O_SETVOICED ,
& Interpreter : : O_BREAK_POINT ,
2013-10-14 02:31:26 +01:00
} ;
2014-08-01 17:38:04 +02:00
} // End of namespace Prince