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"
# include "common/stream.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 {
2013-10-14 02:31:26 +01:00
static const uint16 NUM_OPCODES = 144 ;
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-17 23:25:31 +02:00
/*
2013-12-13 07:05:37 +00:00
void Room : : loadMobs ( Common : : SeekableReadStream & stream ) {
debug ( " loadMobs %d " , stream . pos ( ) ) ;
static const uint8 MAX_MOBS = 64 ;
uint8 mobs [ MAX_MOBS ] ;
stream . read ( & mobs , sizeof ( mobs ) ) ;
2014-05-07 21:55:25 +02:00
for ( uint8 i = 0 ; i < sizeof ( mobs ) ; i + + ) {
2013-12-13 07:05:37 +00:00
debug ( " mob %d flag %d " , i , mobs [ i ] ) ;
}
}
void Room : : loadBackAnim ( Common : : SeekableReadStream & stream ) {
debug ( " loadBackAnim %d " , stream . pos ( ) ) ;
static const uint8 MAX_BACK_ANIMS = 64 ;
uint32 backAnim [ MAX_BACK_ANIMS ] ;
debug ( " loadBackAnim sizeof %lu " , sizeof ( backAnim ) ) ;
stream . read ( backAnim , sizeof ( backAnim ) ) ;
2014-05-07 21:55:25 +02:00
for ( uint8 i = 0 ; i < MAX_BACK_ANIMS ; i + + ) {
2013-12-13 07:05:37 +00:00
debug ( " back anim offset %d " , backAnim [ i ] ) ;
}
}
void Room : : loadObj ( Common : : SeekableReadStream & stream ) { }
void Room : : loadNak ( Common : : SeekableReadStream & stream ) { }
void Room : : loadItemUse ( Common : : SeekableReadStream & stream ) { }
void Room : : loadItemGive ( Common : : SeekableReadStream & stream ) { }
void Room : : loadWalkTo ( Common : : SeekableReadStream & stream ) { }
void Room : : loadExamine ( Common : : SeekableReadStream & stream ) { }
void Room : : loadPickup ( Common : : SeekableReadStream & stream ) { }
void Room : : loadUse ( Common : : SeekableReadStream & stream ) { }
void Room : : loadPushOpen ( Common : : SeekableReadStream & stream ) { }
void Room : : loadPullClose ( Common : : SeekableReadStream & stream ) { }
void Room : : loadTalk ( Common : : SeekableReadStream & stream ) { }
void Room : : loadGive ( Common : : SeekableReadStream & stream ) { }
2014-05-17 23:25:31 +02:00
*/
/*
2013-12-13 07:05:37 +00:00
void Room : : nextLoadStep ( Common : : SeekableReadStream & stream , LoadingStep step ) {
uint32 offset = stream . readUint32LE ( ) ;
uint32 pos = stream . pos ( ) ;
stream . seek ( offset ) ;
debug ( " nextLoadStep offset %d, pos %d " , offset , pos ) ;
( this - > * step ) ( stream ) ;
stream . seek ( pos ) ;
}
2014-05-17 23:25:31 +02:00
*/
/*
2013-12-13 07:05:37 +00:00
bool Room : : loadFromStream ( Common : : SeekableReadStream & stream ) {
uint32 pos = stream . pos ( ) ;
nextLoadStep ( stream , & Room : : loadMobs ) ;
nextLoadStep ( stream , & Room : : loadBackAnim ) ;
nextLoadStep ( stream , & Room : : loadObj ) ;
nextLoadStep ( stream , & Room : : loadNak ) ;
nextLoadStep ( stream , & Room : : loadItemUse ) ;
nextLoadStep ( stream , & Room : : loadItemGive ) ;
nextLoadStep ( stream , & Room : : loadWalkTo ) ;
nextLoadStep ( stream , & Room : : loadExamine ) ;
nextLoadStep ( stream , & Room : : loadPickup ) ;
nextLoadStep ( stream , & Room : : loadUse ) ;
nextLoadStep ( stream , & Room : : loadPushOpen ) ;
nextLoadStep ( stream , & Room : : loadPullClose ) ;
nextLoadStep ( stream , & Room : : loadTalk ) ;
nextLoadStep ( stream , & Room : : loadGive ) ;
// skip some data for now
static const uint8 ROOM_ENTRY_SIZE = 64 ;
stream . seek ( pos + ROOM_ENTRY_SIZE ) ;
2014-05-17 23:25:31 +02:00
return true ;
2013-12-13 07:05:37 +00:00
}
2014-05-17 23:25:31 +02:00
*/
2013-12-13 07:05:37 +00:00
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 ( ) {
2013-12-10 00:26:42 +00:00
delete [ ] _data ;
_dataSize = 0 ;
_data = nullptr ;
}
bool Script : : loadFromStream ( Common : : SeekableReadStream & stream ) {
_dataSize = stream . size ( ) ;
if ( ! _dataSize )
return false ;
_data = new byte [ _dataSize ] ;
if ( ! _data )
return false ;
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-06-28 09:51:14 +02:00
bool Script : : getMobVisible ( int mob ) {
return _data [ _vm - > _room - > _mobs + mob ] ;
}
void Script : : setMobVisible ( int mob , int value ) {
_data [ _vm - > _room - > _mobs + 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-04 19:10:22 +02:00
void Script : : setBackAnimId ( int offset , int animId ) {
WRITE_UINT32 ( & _data [ offset ] , animId ) ;
}
2014-07-05 22:31:02 +02:00
void Script : : setObjId ( int offset , int objId ) {
_data [ offset ] = objId ;
}
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-04 19:10:22 +02:00
void Script : : installSingleBackAnim ( Common : : Array < BackgroundAnim > & backAnimList , int slot , int offset ) {
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-04 19:10:22 +02:00
void Script : : installBackAnims ( Common : : Array < BackgroundAnim > & backAnimList , int offset ) {
2014-07-05 22:31:02 +02:00
for ( int i = 0 ; i < _vm - > kMaxBackAnims ; i + + ) {
2014-07-04 19:10:22 +02:00
installSingleBackAnim ( backAnimList , i , offset ) ;
2014-05-22 19:52:38 +02:00
offset + = 4 ;
}
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 + + ) {
if ( _data [ offset ] ! = 0xFF ) {
_vm - > _objSlot [ i ] = i ;
} else {
_vm - > _objSlot [ i ] = - 1 ;
}
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 ) {
error ( " Can't load %s " , msStreamName . c_str ( ) ) ;
delete msStream ;
return false ;
}
2014-05-31 16:45:10 +02:00
2014-05-30 23:36:49 +02:00
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 ;
}
delete msStream ;
}
2014-05-31 20:57:46 +02:00
tempMask . _width = tempMask . getWidth ( ) ;
2014-05-31 16:45:10 +02:00
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 ) ) ;
}
void InterpreterFlags : : setFlagValue ( Flags : : Id flagId , uint16 value ) {
2013-11-05 21:57:10 +00:00
_flags [ ( uint16 ) flagId - FLAG_MASK ] = value ;
}
2013-12-10 00:26:42 +00:00
uint16 InterpreterFlags : : getFlagValue ( Flags : : Id flagId ) {
2013-11-05 21:57:10 +00:00
return _flags [ ( uint16 ) flagId - FLAG_MASK ] ;
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 ) ,
_stacktop ( 0 ) , _opcodeNF ( false ) ,
_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 ] ;
2013-11-02 02:02:53 +00:00
va_list va ;
2013-10-14 02:31:26 +01:00
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-04-04 16:16:15 +02:00
//debug("Prince::Script frame %08ld mode %s %s %s", _vm->_frameNr, _mode, str.c_str(), buf);
2013-10-14 02:31:26 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : step ( ) {
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 ) ;
}
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
2013-11-18 16:19:21 +00:00
if ( _lastOpcode > NUM_OPCODES )
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
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-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 ;
}
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
}
2013-12-10 00:32:07 +00:00
uint16 Interpreter : : readScriptFlagValue ( ) {
2013-12-10 00:26:42 +00:00
uint16 value = readScript < uint16 > ( ) ;
if ( value & InterpreterFlags : : FLAG_MASK ) {
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-05 22:31:02 +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 ( ) {
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 ( ) {
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 roomId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_INITROOM %d " , roomId ) ;
2013-10-30 02:28:07 +00:00
_vm - > loadLocation ( roomId ) ;
_opcodeNF = 1 ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 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-10 00:26:42 +00:00
debugInterpreter ( " O_SETSAMPLE %d %s " , sampleId , sampleName ) ;
2013-12-03 14:46:24 +00:00
_vm - > loadSample ( sampleId , sampleName ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREESAMPLE ( ) {
2013-12-10 00:32:07 +00:00
uint16 sample = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_FREESAMPLE %d " , sample ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PLAYSAMPLE ( ) {
2013-12-10 00:32:07 +00:00
uint16 sampleId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
uint16 loopType = readScript < uint16 > ( ) ;
debugInterpreter ( " O_PLAYSAMPLE sampleId %d loopType %d " , sampleId , loopType ) ;
2013-11-05 22:15:55 +00:00
_vm - > playSample ( sampleId , loopType ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PUTOBJECT ( ) {
2013-12-10 00:32:07 +00:00
uint16 roomId = readScriptFlagValue ( ) ;
uint16 slot = readScriptFlagValue ( ) ;
uint16 objectId = readScriptFlagValue ( ) ;
2014-07-05 22:31:02 +02:00
Room * room = new Room ( ) ;
room - > loadRoom ( _script - > getRoomOffset ( roomId ) ) ;
int offset = room - > _obj + slot ;
_vm - > _script - > setObjId ( offset , objectId ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 roomId = readScriptFlagValue ( ) ;
2014-07-05 22:31:02 +02:00
uint16 slot = readScriptFlagValue ( ) ;
Room * room = new Room ( ) ;
room - > loadRoom ( _script - > getRoomOffset ( roomId ) ) ;
int offset = room - > _obj + slot ;
_vm - > _script - > setObjId ( offset , 0xFF ) ;
if ( _vm - > _locationNr = = roomId ) {
_vm - > _objSlot [ slot ] = - 1 ;
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 slot = readScriptFlagValue ( ) ;
uint16 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 ;
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 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
uint16 frameNumber = readScriptFlagValue ( ) ;
if ( _vm - > _normAnimList [ slot ] . _frame ! = frameNumber ) {
_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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 roomId = readScriptFlagValue ( ) ;
uint16 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 ) ) ;
int offset = room - > _backAnim + slot * 4 ;
_vm - > _script - > setBackAnimId ( offset , animId ) ;
if ( _vm - > _locationNr = = roomId ) {
_vm - > _script - > installBackAnims ( _vm - > _backAnimList , offset ) ;
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 roomId = readScriptFlagValue ( ) ;
uint16 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 ) ) ;
int offset = room - > _backAnim + slot * 4 ;
_vm - > _script - > setBackAnimId ( offset , 0 ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 slotId = readScriptFlagValue ( ) ;
uint16 frameId = readScriptFlagValue ( ) ;
2014-07-01 21:54:33 +02:00
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
if ( _vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] . _frame ! = frameId ) {
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
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREEALLSAMPLES ( ) {
debugInterpreter ( " 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 > ( ) ;
2013-10-15 23:21:00 +01:00
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 ( ) {
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 pause = readScriptFlagValue ( ) ;
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O__WAIT pause %d " , pause ) ;
2013-10-15 23:21:00 +01:00
2013-11-02 02:02:53 +00:00
if ( _waitFlag = = 0 ) {
// set new wait flag value and continue
_waitFlag = pause ;
_opcodeNF = 1 ;
_currentInstruction - = 4 ;
return ;
}
2013-10-15 23:21:00 +01:00
2013-11-02 02:02:53 +00:00
- - _waitFlag ;
2013-10-15 23:21:00 +01:00
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
2013-12-10 00:26:42 +00:00
void Interpreter : : O_UPDATEOFF ( ) {
debugInterpreter ( " O_UPDATEOFF " ) ;
2013-11-18 16:19:21 +00:00
//_updateEnable = false;
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_UPDATEON ( ) {
debugInterpreter ( " O_UPDATEON " ) ;
2013-11-18 16:19:21 +00:00
//_updateEnable = true;
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_UPDATE ( ) {
debugInterpreter ( " O_UPDATE " ) ;
2013-11-18 16:19:21 +00:00
// Refresh screen
2013-10-28 00:06:21 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CLS ( ) {
debugInterpreter ( " O_CLS " ) ;
2013-11-18 16:19:21 +00:00
// do nothing
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
// Get the return address
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 {
error ( " Return: Stack is empty " ) ;
}
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 > ( ) ;
debugInterpreter ( " O_GO 0x%04X " , opPC ) ;
2013-10-30 02:28:07 +00:00
_currentInstruction + = opPC - 4 ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 slotId = readScriptFlagValue ( ) ;
2014-07-01 21:54:33 +02:00
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
_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-07-01 21:54:33 +02:00
uint16 slotId = readScriptFlagValue ( ) ;
int currAnim = _vm - > _backAnimList [ slotId ] . _seq . _currRelative ;
2014-07-03 22:35:41 +02:00
_vm - > _backAnimList [ slotId ] . backAnims [ currAnim ] . _state = 0 ;
2014-07-01 21:54:33 +02:00
debugInterpreter ( " O_BACKANIMUPDATEON %d " , slotId ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGECURSOR ( ) {
2013-12-10 00:32:07 +00:00
uint16 cursorId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CHANGECURSOR %x " , cursorId ) ;
2013-12-03 14:46:24 +00:00
_vm - > changeCursor ( cursorId ) ;
2013-10-14 02:31:26 +01:00
}
2013-10-28 00:06:21 +00:00
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEANIMTYPE ( ) {
2013-10-30 02:28:07 +00:00
// NOT IMPLEMENTED
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-28 00:06:21 +00:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O__SETFLAG 0x%04X (%s) = %d " , flagId , Flags : : getFlagName ( flagId ) , value ) ;
2013-10-30 02:28:07 +00:00
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( ( Flags : : Id ) ( 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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-28 00:06:21 +00:00
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-11-05 18:45:40 +00:00
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-11-05 18:45:40 +00:00
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 exitCode = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_EXIT exitCode %d " , exitCode ) ;
2013-11-18 16:19:21 +00:00
// Set exit code and shows credits
// if exit code == 0x02EAD
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-15 00:10:29 +01:00
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 ;
2013-10-15 23:21:00 +01: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-07-02 02:38:39 +02:00
uint16 animNumber = readScriptFlagValue ( ) ;
2013-12-10 00:32:07 +00:00
uint16 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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-15 23:21:00 +01:00
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 ;
2013-10-15 23:21:00 +01: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-15 00:10:29 +01:00
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ANDFLAG flagId %d, value %d " , flagId , value ) ;
2013-10-28 00:06:21 +00:00
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) & value ) ;
2013-10-28 00:06:21 +00:00
2013-12-10 00:26:42 +00:00
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
} else {
_result = 0 ;
}
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 ( ) ;
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
uint16 mobId = readScriptFlagValue ( ) ;
uint16 mobOffset = readScriptFlagValue ( ) ;
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-30 02:28:07 +00:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ORFLAG flagId %d, value %d " , flagId , value ) ;
2013-11-05 21:57:10 +00:00
2013-12-10 00:26:42 +00:00
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) | value ) ;
2013-10-15 23:21:00 +01:00
2013-12-10 00:26:42 +00:00
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
} else {
_result = 0 ;
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 mobId = readScriptFlagValue ( ) ;
uint16 mobOffset = readScriptFlagValue ( ) ;
uint16 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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-10-28 00:06:21 +00:00
2013-12-10 00:26:42 +00: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
_flags - > setFlagValue ( flagId , _flags - > getFlagValue ( flagId ) ^ value ) ;
2013-10-28 00:06:21 +00:00
2013-12-10 00:26:42 +00:00
if ( _flags - > getFlagValue ( flagId ) ) {
2013-10-30 02:28:07 +00:00
_result = 1 ;
} else {
_result = 0 ;
}
2013-10-28 00:06:21 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETMOBTEXT ( ) {
2014-06-26 18:29:19 +02:00
uint16 mob = readScriptFlagValue ( ) ;
_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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
uint16 x = readScriptFlagValue ( ) ;
uint16 y = readScriptFlagValue ( ) ;
uint16 dir = readScriptFlagValue ( ) ;
2013-10-30 02:28:07 +00:00
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
2013-10-15 00:10:29 +01:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_WALKHERO %d " , heroId ) ;
2013-10-30 02:28:07 +00:00
_opcodeNF = 1 ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETHERO ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
int16 x = readScriptFlagValue ( ) ;
int16 y = readScriptFlagValue ( ) ;
uint16 dir = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETHERO hero %d, x %d, y %d, dir %d " , hero , x , y , dir ) ;
2013-12-05 00:02:31 +00:00
_vm - > _mainHero - > setPos ( x , y ) ;
2014-04-04 16:16:15 +02:00
_vm - > _mainHero - > _lastDirection = dir ;
_vm - > _mainHero - > _state = _vm - > _mainHero - > STAY ;
_vm - > _mainHero - > _moveSetType = _vm - > _mainHero - > _lastDirection - 1 ; // for countDrawPosition
_vm - > _mainHero - > countDrawPosition ( ) ; //setting drawX, drawY
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_HEROOFF ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_HEROOFF %d " , heroId ) ;
2013-12-05 00:02:31 +00:00
_vm - > _mainHero - > setVisible ( false ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_HEROON %d " , heroId ) ;
2013-12-05 00:02:31 +00:00
_vm - > _mainHero - > setVisible ( true ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CLSTEXT ( ) {
2013-12-10 00:32:07 +00:00
uint16 slot = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CLSTEXT slot %d " , slot ) ;
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 ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CALLTABLE ( ) {
uint16 flag = readScript < uint16 > ( ) ;
int32 table = readScript < uint32 > ( ) ;
2013-11-04 16:07:19 +00:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CALLTABLE flag %d, table %d " , flag , table ) ;
2013-11-18 16:19:21 +00:00
// makes a call from script function table
// must read table pointer from _code and
// use table entry as next opcode
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHANGEMOB ( ) {
2013-12-10 00:32:07 +00:00
uint16 mob = readScriptFlagValue ( ) ;
uint16 value = readScriptFlagValue ( ) ;
2014-06-28 09:51:14 +02:00
value ^ = 1 ;
_vm - > _script - > setMobVisible ( mob , value ) ;
_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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
uint16 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
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REPINV ( ) {
uint16 hero = readScript < uint16 > ( ) ;
uint16 item1 = readScript < uint16 > ( ) ;
uint16 item2 = readScript < uint16 > ( ) ;
2013-11-18 16:19:21 +00:00
// shouldn't be uses
error ( " O_REPINV hero %d, item1 %d, item2 %d " , hero , item1 , item2 ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_OBSOLETE_GETACTION ( ) {
2013-11-18 16:19:21 +00:00
// shouldn't be uses
error ( " O_OBSOLETE_GETACTION " ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ADDWALKAREA ( ) {
uint16 x1 = readScript < uint16 > ( ) ;
uint16 y1 = readScript < uint16 > ( ) ;
uint16 x2 = readScript < uint16 > ( ) ;
uint16 y2 = readScript < uint16 > ( ) ;
2013-11-18 16:19:21 +00:00
// shouldn't be uses
error ( " O_ADDWALKAREA x1 %d, y1 %d, x2 %d, y2 %d " , x1 , y1 , x2 , y2 ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_REMWALKAREA ( ) {
uint16 x1 = readScript < uint16 > ( ) ;
uint16 y1 = readScript < uint16 > ( ) ;
uint16 x2 = readScript < uint16 > ( ) ;
uint16 y2 = readScript < uint16 > ( ) ;
2013-11-18 16:19:21 +00:00
// shouldn't be uses
error ( " O_REMWALKAREA x1 %d, y1 %d, x2 %d, y2 %d " , x1 , y1 , x2 , y2 ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_RESTOREWALKAREA ( ) {
debugInterpreter ( " 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 ( ) {
debugInterpreter ( " O_WAITFRAME " ) ;
2013-10-30 02:28:07 +00:00
_opcodeNF = true ;
2013-10-22 01:05:24 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETFRAME ( ) {
2013-12-10 00:32:07 +00:00
uint16 anim = readScriptFlagValue ( ) ;
uint16 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
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_RUNACTION ( ) {
2013-11-18 16:19:21 +00:00
// It's empty in original and never used in script
// it's better to report error
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-11-04 16:07:19 +00:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_COMPAREHI flag %d, value %d " , flag , value ) ;
_result = value < _flags - > getFlagValue ( flag ) ;
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-11-04 16:07:19 +00:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_COMPARELO flag %d, value %d " , flag , value ) ;
_result = value > _flags - > getFlagValue ( flag ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_PRELOADSET ( ) {
2013-11-18 16:19:21 +00:00
// not used in script
2013-12-10 00:26:42 +00:00
int32 offset = readScript < uint32 > ( ) ;
debugInterpreter ( " O_PRELOADSET offset %04x " , offset ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_FREEPRELOAD ( ) {
2013-11-18 16:19:21 +00:00
// not used in script
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_FREEPRELOAD " ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKINV ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
uint16 item = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
_vm - > checkInv ( hero , item ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CHECKINV 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_TALKHERO ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_TALKHERO hero %d " , hero ) ;
2014-07-03 20:53:19 +02:00
_vm - > talkHero ( hero ) ;
2013-11-04 16:07:19 +00:00
}
2013-10-15 00:10:29 +01:00
2014-07-04 03:12:06 +02:00
//TODO
2013-12-10 00:26:42 +00:00
void Interpreter : : O_WAITTEXT ( ) {
2013-12-10 00:32:07 +00:00
uint16 slot = readScriptFlagValue ( ) ;
2013-11-02 01:29:26 +00:00
Text & text = _vm - > _textSlots [ slot ] ;
if ( text . _time ) {
_opcodeNF = 1 ;
_currentInstruction - = 4 ;
}
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETHEROANIM ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
int32 offset = readScript < uint32 > ( ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
2013-11-04 16:07:19 +00:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_WAITHEROANIM hero %d " , hero ) ;
2013-11-04 16:07:19 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETHERODATA ( ) {
uint16 flag = readScript < uint16 > ( ) ;
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
uint16 heroOffset = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETHERODATA flag %d, hero %d, heroOffset %d " , flag , hero , heroOffset ) ;
2013-11-04 16:07:19 +00:00
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 anim = readScriptFlagValue ( ) ;
uint16 frame = readScriptFlagValue ( ) ;
uint16 lastFrame = readScriptFlagValue ( ) ;
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 anim = readScriptFlagValue ( ) ;
uint16 frame = readScriptFlagValue ( ) ;
uint16 lastFrame = readScriptFlagValue ( ) ;
uint16 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-07-04 03:12:06 +02:00
uint16 animNumber = readScriptFlagValue ( ) ;
uint16 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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 anim = readScriptFlagValue ( ) ;
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 anim = readScriptFlagValue ( ) ;
uint16 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-07-02 02:38:39 +02:00
uint16 animNumber = readScriptFlagValue ( ) ;
2013-12-10 00:32:07 +00:00
uint16 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
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_LOADPATH ( ) {
int32 offset = readScript < uint32 > ( ) ;
debugInterpreter ( " O_LOADPATH offset %d " , offset ) ;
2013-11-18 16:19:21 +00:00
// _currentInstruction + offset path file name ptr
// free path bitmap
// load packet path bitmap and puts in Sala
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
debugInterpreter ( " O_GETCHAR %04X (%s) %02x " , flagId , Flags : : getFlagName ( flagId ) , _flags - > getFlagValue ( flagId ) ) ;
_string + + ;
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 > ( ) ;
debugInterpreter ( " O_SETDFLAG 0x%04X (%s) = 0x%04X " , flagId , Flags : : getFlagName ( flagId ) , _currentInstruction + address - 4 ) ;
_flags - > setFlagValue ( ( Flags : : Id ) ( 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 slot = readScriptFlagValue ( ) ;
2014-07-04 03:12:06 +02:00
uint16 x = readScriptFlagValue ( ) ;
uint16 y = readScriptFlagValue ( ) ;
debugInterpreter ( " O_PRINTAT slot %d, x %d, y %d " , slot , x , y ) ;
2013-12-10 00:26:42 +00:00
uint8 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 ( ) ;
2013-10-30 02:28:07 +00:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ZOOMIN ( ) {
2013-12-10 00:32:07 +00:00
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 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-04 03:12:06 +02:00
// TODO - never used?
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETSTRINGOFFSET ( ) {
int32 offset = readScript < uint32 > ( ) ;
debugInterpreter ( " O_SETSTRINGOFFSET offset %04x " , offset ) ;
2014-07-04 03:12:06 +02:00
_currentString = 0 ;
_string = ( byte * ) _currentInstruction + offset ; //FIXME
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 obj = readScriptFlagValue ( ) ;
int16 objOffset = readScriptFlagValue ( ) ;
2014-07-04 22:00:02 +02:00
int16 value = _vm - > _objList [ obj ] - > getData ( ( Object : : AttrId ) objOffset ) ;
_flags - > setFlagValue ( flag , value ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETOBJDATA flag %d, obj %d, objOffset %d " , flag , obj , 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 obj = readScriptFlagValue ( ) ;
int16 objOffset = readScriptFlagValue ( ) ;
uint16 value = readScriptFlagValue ( ) ;
2014-07-04 22:00:02 +02:00
_vm - > _objList [ obj ] - > setData ( ( Object : : AttrId ) objOffset , value ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SETOBJDATA obj %d, objOffset %d, value %d " , obj , objOffset , value ) ;
2013-11-04 16:07:19 +00:00
}
2013-11-02 15:28:56 +00:00
2014-07-04 22:00:02 +02:00
// not used?
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SWAPOBJECTS ( ) {
2014-07-04 22:00:02 +02:00
uint16 obj1 = readScriptFlagValue ( ) ;
uint16 obj2 = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SWAPOBJECTS obj1 %d, obj2 %d " , obj1 , obj2 ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 hero = readScriptFlagValue ( ) ;
uint16 heroSet = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CHANGEHEROSET hero %d, heroSet %d " , hero , heroSet ) ;
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_ADDSTRING ( ) {
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ADDSTRING value %d " , value ) ;
2014-07-01 20:12:43 +02:00
_string + = value ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SUBSTRING value %d " , value ) ;
2014-07-01 20:12:43 +02:00
_string - = value ;
}
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 ( ) {
debugInterpreter ( " 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
}
}
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 opt = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_ENABLEDIALOGOPT opt %d " , opt ) ;
2014-07-03 22:35:41 +02:00
int dialogDataValue = ( int ) READ_UINT32 ( _vm - > _dialogData ) ;
dialogDataValue & = ~ ( 1u < < opt ) ;
WRITE_UINT32 ( _vm - > _dialogData , dialogDataValue ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 opt = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_DISABLEDIALOGOPT opt %d " , opt ) ;
2014-07-03 22:35:41 +02:00
int dialogDataValue = ( int ) READ_UINT32 ( _vm - > _dialogData ) ;
dialogDataValue | = ( 1u < < opt ) ;
WRITE_UINT32 ( _vm - > _dialogData , dialogDataValue ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 box = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_SHOWDIALOGBOX box %d " , box ) ;
2014-07-03 20:53:19 +02:00
_vm - > createDialogBox ( box ) ;
_flags - > setFlagValue ( Flags : : DIALINES , _vm - > _dialogLines ) ;
if ( _vm - > _dialogLines ! = 0 ) {
_vm - > changeCursor ( 1 ) ;
_vm - > runDialog ( ) ;
_vm - > changeCursor ( 0 ) ;
2014-06-16 22:06:53 +02:00
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 slot = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_STOPSAMPLE slot %d " , slot ) ;
2013-11-05 22:15:55 +00:00
_vm - > stopSample ( slot ) ;
2013-10-15 00:10:29 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_BACKANIMRANGE ( ) {
2013-12-10 00:32:07 +00:00
uint16 slotId = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
uint16 animId = readScript < uint16 > ( ) ;
2013-12-10 00:32:07 +00:00
uint16 low = readScriptFlagValue ( ) ;
uint16 high = readScriptFlagValue ( ) ;
2013-10-24 01:01:55 +01:00
2013-12-03 14:46:24 +00:00
if ( animId ! = 0xFFFF ) {
2013-12-10 00:26:42 +00:00
if ( animId & InterpreterFlags : : FLAG_MASK ) {
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 ( ) {
debugInterpreter ( " O_CLEARPATH " ) ;
2013-11-18 16:19:21 +00:00
// Fill Sala with 255
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SETPATH ( ) {
debugInterpreter ( " O_SETPATH " ) ;
2013-11-18 16:19:21 +00:00
// CopyPath
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETHEROX ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2013-10-24 01:01:55 +01:00
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 ( ) {
uint16 heroId = readScript < uint16 > ( ) ;
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2013-10-24 01:01:55 +01:00
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
2013-11-05 21:57:10 +00:00
Flags : : Id flagId = readScriptFlagId ( ) ;
2013-10-24 01:01:55 +01:00
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 ( ) {
debugInterpreter ( " O_PUSHSTRING " ) ;
2013-11-18 16:19:21 +00:00
// push on the stack
// _currentString
// _dialogData
// _string
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_POPSTRING ( ) {
debugInterpreter ( " O_POPSTRING " ) ;
2013-11-18 16:19:21 +00:00
// pop from the stack
// _currentString
// _dialogData
// _string
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-11-05 18:45:40 +00:00
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
2013-10-24 01:01:55 +01:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_STOPHERO heroId %d " , heroId ) ;
2013-11-18 16:19:21 +00:00
// clear move steps for hero
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ANIMUPDATEOFF ( ) {
2014-07-04 19:10:22 +02:00
uint16 slotId = readScriptFlagValue ( ) ;
_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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 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 ( ) {
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
uint16 hero = readScriptFlagValue ( ) ;
uint16 item = readScriptFlagValue ( ) ;
_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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
uint16 x = readScriptFlagValue ( ) ;
uint16 y = readScriptFlagValue ( ) ;
uint16 dir = readScriptFlagValue ( ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 animNr = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_VIEWFLC animNr %d " , animNr ) ;
2013-10-30 02:28:07 +00:00
_vm - > loadAnim ( animNr , false ) ;
2013-10-22 01:05:24 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKFLCFRAME ( ) {
2013-12-10 00:32:07 +00:00
uint16 frameNr = readScriptFlagValue ( ) ;
2013-10-24 01:01:55 +01:00
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_CHECKFLCFRAME frame number %d " , frameNr ) ;
2013-10-24 01:01:55 +01:00
2013-12-10 00:32:07 +00:00
if ( _vm - > _flicPlayer . getCurFrame ( ) ! = frameNr ) {
2014-07-04 19:10:22 +02:00
// Move instruction pointer before current instruction
2013-10-30 02:28:07 +00:00
// must do this check once again till it's false
_currentInstruction - = 2 ;
_opcodeNF = 1 ;
}
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_CHECKFLCEND ( ) {
2013-10-24 01:01:55 +01:00
2013-12-10 00:26:42 +00:00
//debugInterpreter("O_CHECKFLCEND");
2013-10-24 01:01:55 +01:00
2013-10-30 02:28:07 +00:00
const Video : : FlicDecoder & flicPlayer = _vm - > _flicPlayer ;
2013-10-24 01:01:55 +01:00
2013-10-30 02:28:07 +00:00
//debug("frameCount %d, currentFrame %d", flicPlayer.getFrameCount(), flicPlayer.getCurFrame());
2013-10-24 01:01:55 +01:00
2013-11-18 16:19:21 +00:00
if ( flicPlayer . getFrameCount ( ) - flicPlayer . getCurFrame ( ) > 1 ) {
2013-10-30 02:28:07 +00:00
// Move instruction pointer before current instruciton
// must do this check once again till it's false
_currentInstruction - = 2 ;
_opcodeNF = 1 ;
}
2013-10-24 01:01:55 +01:00
}
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
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
2013-12-10 00:26:42 +00:00
void Interpreter : : O_HEROCOLOR ( ) {
2013-12-10 00:32:07 +00:00
uint16 heroId = readScriptFlagValue ( ) ;
uint16 kolorr = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_HEROCOLOR heroId %d, kolorr %d " , heroId , kolorr ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GRABMAPA ( ) {
debugInterpreter ( " O_GRABMAPA " ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_ENABLENAK ( ) {
2013-12-10 00:32:07 +00:00
uint16 nakId = readScriptFlagValue ( ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 nakId = readScriptFlagValue ( ) ;
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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 war = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETMOBNAME war %d " , war ) ;
2013-10-24 01:01:55 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_SWAPINVENTORY ( ) {
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
uint16 hero = readScriptFlagValue ( ) ;
_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 ( ) {
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
uint16 hero = readScriptFlagValue ( ) ;
_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-06-26 18:29:19 +02:00
uint16 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-06-26 18:29:19 +02:00
uint16 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-06-26 18:29:19 +02:00
uint16 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-06-26 18:29:19 +02:00
uint16 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-06-26 18:29:19 +02:00
uint16 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 ( ) {
2013-12-10 00:32:07 +00:00
uint16 value = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_VIEWFLCLOOP animId %d " , value ) ;
2013-10-30 02:28:07 +00:00
_vm - > loadAnim ( value , true ) ;
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_FLCSPEED ( ) {
2013-12-10 00:32:07 +00:00
uint16 speed = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_FLCSPEED speed %d " , speed ) ;
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 ( ) {
debugInterpreter ( " O_KRZYWA " ) ;
2013-10-15 23:21:00 +01:00
}
2013-12-10 00:26:42 +00:00
void Interpreter : : O_GETKRZYWA ( ) {
debugInterpreter ( " O_GETKRZYWA " ) ;
// _flags->setFlagValue(Flags::TORX1, krzywa[_krzywaIndex++])
// _flags->setFlagValue(Flags::TORY1, krzywa[_krzywaIndex++])
2013-11-18 16:19:21 +00:00
// Check _krzywaIndex
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 ( ) ;
2013-12-10 00:32:07 +00:00
uint16 mx = readScriptFlagValue ( ) ;
uint16 my = readScriptFlagValue ( ) ;
2013-12-10 00:26:42 +00:00
debugInterpreter ( " O_GETMOB flagId %d, mx %d, my %d " , flagId , mx , my ) ;
2013-11-18 16:19:21 +00:00
// check if current mob pos = (mx, my)
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_INPUTLINE ( ) {
debugInterpreter ( " O_INPUTLINE " ) ;
}
void Interpreter : : O_BREAK_POINT ( ) {
debugInterpreter ( " O_BREAK_POINT " ) ;
}
Interpreter : : OpcodeFunc Interpreter : : _opcodes [ NUM_OPCODES ] = {
& 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
} ;
2013-10-13 22:34:26 +01:00
}
2013-10-30 02:28:07 +00:00
/* vim: set tabstop=4 noexpandtab: */