mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
237 lines
7.7 KiB
C++
237 lines
7.7 KiB
C++
/*
|
|
===========================================================================
|
|
Copyright (C) 2015 the OpenMoHAA team
|
|
|
|
This file is part of OpenMoHAA source code.
|
|
|
|
OpenMoHAA source code 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.
|
|
|
|
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
===========================================================================
|
|
*/
|
|
|
|
// scriptopcodes.cpp
|
|
|
|
#include "scriptopcodes.h"
|
|
#include "short3.h"
|
|
#include "vector.h"
|
|
|
|
static opcode_t OpcodeInfo[] =
|
|
{
|
|
{ "OPCODE_EOF", 0, 0, 0 },
|
|
{ "OPCODE_BOOL_JUMP_FALSE4", 5, -1, 0 },
|
|
{ "OPCODE_BOOL_JUMP_TRUE4", 5, -1, 0 },
|
|
{ "OPCODE_VAR_JUMP_FALSE4", 5, -1, 0 },
|
|
{ "OPCODE_VAR_JUMP_TRUE4", 5, -1, 0 },
|
|
|
|
{ "OPCODE_BOOL_LOGICAL_AND", 5, -1, 0 },
|
|
{ "OPCODE_BOOL_LOGICAL_OR", 5, -1, 0 },
|
|
{ "OPCODE_VAR_LOGICAL_AND", 5, -1, 0 },
|
|
{ "OPCODE_VAR_LOGICAL_OR", 5, -1, 0 },
|
|
|
|
{ "OPCODE_BOOL_TO_VAR", 0, 0, 0 },
|
|
|
|
{ "OPCODE_JUMP4", 1 + sizeof( unsigned int ), 0, 0 },
|
|
{ "OPCODE_JUMP_BACK4", 1 + sizeof( unsigned int ), 0, 0 },
|
|
|
|
{ "OPCODE_STORE_INT0", 1, 1, 0 },
|
|
{ "OPCODE_STORE_INT1", 1 + sizeof( char ), 1, 0 },
|
|
{ "OPCODE_STORE_INT2", 1 + sizeof( short ), 1, 0 },
|
|
{ "OPCODE_STORE_INT3", 1 + sizeof( short3 ), 1, 0 },
|
|
{ "OPCODE_STORE_INT4", 1 + sizeof( int ), 1, 0 },
|
|
|
|
{ "OPCODE_BOOL_STORE_FALSE", 1, 1, 0 },
|
|
{ "OPCODE_BOOL_STORE_TRUE", 1, 1, 0 },
|
|
|
|
{ "OPCODE_STORE_STRING", 1 + sizeof( unsigned int ), 1, 0 },
|
|
{ "OPCODE_STORE_FLOAT", 1 + sizeof( float ), 1, 0 },
|
|
{ "OPCODE_STORE_VECTOR", 1 + sizeof( Vector ), 1, 0 },
|
|
{ "OPCODE_CALC_VECTOR", 1, -2, 0 },
|
|
{ "OPCODE_STORE_NULL", 1, 1, 0 },
|
|
{ "OPCODE_STORE_NIL", 1, 1, 0 },
|
|
|
|
{ "OPCODE_EXEC_CMD0", 5, 0, 1 },
|
|
{ "OPCODE_EXEC_CMD1", 5, -1, 1 },
|
|
{ "OPCODE_EXEC_CMD2", 5, -2, 1 },
|
|
{ "OPCODE_EXEC_CMD3", 5, -3, 1 },
|
|
{ "OPCODE_EXEC_CMD4", 5, -4, 1 },
|
|
{ "OPCODE_EXEC_CMD5", 5, -5, 1 },
|
|
{ "OPCODE_EXEC_CMD_COUNT1", 6, -128, 1 },
|
|
|
|
{ "OPCODE_EXEC_CMD_METHOD0", 5, -1, 1 },
|
|
{ "OPCODE_EXEC_CMD_METHOD1", 5, -2, 1 },
|
|
{ "OPCODE_EXEC_CMD_METHOD2", 5, -3, 1 },
|
|
{ "OPCODE_EXEC_CMD_METHOD3", 5, -4, 1 },
|
|
{ "OPCODE_EXEC_CMD_METHOD4", 5, -5, 1 },
|
|
{ "OPCODE_EXEC_CMD_METHOD5", 5, -6, 1 },
|
|
{ "OPCODE_EXEC_CMD_METHOD_COUNT1", 6, -128, 1 },
|
|
|
|
{ "OPCODE_EXEC_METHOD0", 5, 0, 1 },
|
|
{ "OPCODE_EXEC_METHOD1", 5, -1, 1 },
|
|
{ "OPCODE_EXEC_METHOD2", 5, -2, 1 },
|
|
{ "OPCODE_EXEC_METHOD3", 5, -3, 1 },
|
|
{ "OPCODE_EXEC_METHOD4", 5, -4, 1 },
|
|
{ "OPCODE_EXEC_METHOD5", 5, -5, 1 },
|
|
{ "OPCODE_EXEC_METHOD_COUNT1", 6, -128, 1 },
|
|
|
|
{ "OPCODE_LOAD_GAME_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_LEVEL_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_LOCAL_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_PARM_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_SELF_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_GROUP_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_OWNER_VAR", 5, -1, 0 },
|
|
{ "OPCODE_LOAD_FIELD_VAR", 5, -2, 0 },
|
|
{ "OPCODE_LOAD_ARRAY_VAR", 1, -3, 0 },
|
|
{ "OPCODE_LOAD_CONST_ARRAY1", 2, -128, 0 },
|
|
|
|
{ "OPCODE_STORE_FIELD_REF", 5, 0, 0 },
|
|
{ "OPCODE_STORE_ARRAY_REF", 1, -1, 0 },
|
|
|
|
{ "OPCODE_MARK_STACK_POS", 1, 0, 0 },
|
|
|
|
{ "OPCODE_STORE_PARAM", 1, 1, 0 },
|
|
|
|
{ "OPCODE_RESTORE_STACK_POS", 1, 0, 0 },
|
|
|
|
{ "OPCODE_LOAD_STORE_GAME_VAR", 5, 0, 0 },
|
|
{ "OPCODE_LOAD_STORE_LEVEL_VAR", 5, 0, 0 },
|
|
{ "OPCODE_LOAD_STORE_LOCAL_VAR", 5, 0, 0 },
|
|
{ "OPCODE_LOAD_STORE_PARM_VAR", 5, 0, 0 },
|
|
{ "OPCODE_LOAD_STORE_SELF_VAR", 5, 0, 0 },
|
|
{ "OPCODE_LOAD_STORE_GROUP_VAR", 5, 0, 0 },
|
|
{ "OPCODE_LOAD_STORE_OWNER_VAR", 5, 0, 0 },
|
|
|
|
{ "OPCODE_STORE_GAME_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_LEVEL_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_LOCAL_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_PARM_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_SELF_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_GROUP_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_OWNER_VAR", 5, 1, 0 },
|
|
{ "OPCODE_STORE_FIELD", 5, 0, 1 },
|
|
{ "OPCODE_STORE_ARRAY", 1, -1, 0 },
|
|
{ "OPCODE_STORE_GAME", 1, 1, 0 },
|
|
{ "OPCODE_STORE_LEVEL", 1, 1, 0 },
|
|
{ "OPCODE_STORE_LOCAL", 1, 1, 0 },
|
|
{ "OPCODE_STORE_PARM", 1, 1, 0 },
|
|
{ "OPCODE_STORE_SELF", 1, 1, 0 },
|
|
{ "OPCODE_STORE_GROUP", 1, 1, 0 },
|
|
{ "OPCODE_STORE_OWNER", 1, 1, 0 },
|
|
|
|
{ "OPCODE_BIN_BITWISE_AND", 1, -1, 0 },
|
|
{ "OPCODE_BIN_BITWISE_OR", 1, -1, 0 },
|
|
{ "OPCODE_BIN_BITWISE_EXCL_OR", 1, -1, 0 },
|
|
{ "OPCODE_BIN_EQUALITY", 1, -1, 0 },
|
|
{ "OPCODE_BIN_INEQUALITY", 1, -1, 0 },
|
|
{ "OPCODE_BIN_LESS_THAN", 1, -1, 0 },
|
|
{ "OPCODE_BIN_GREATER_THAN", 1, -1, 0 },
|
|
{ "OPCODE_BIN_LESS_THAN_OR_EQUAL", 1, -1, 0 },
|
|
{ "OPCODE_BIN_GREATER_THAN_OR_EQUAL", 1, -1, 0 },
|
|
{ "OPCODE_BIN_PLUS", 1, -1, 0 },
|
|
{ "OPCODE_BIN_MINUS", 1, -1, 0 },
|
|
{ "OPCODE_BIN_MULTIPLY", 1, -1, 0 },
|
|
{ "OPCODE_BIN_DIVIDE", 1, -1, 0 },
|
|
{ "OPCODE_BIN_PERCENTAGE", 1, -1, 0 },
|
|
|
|
{ "OPCODE_UN_MINUS", 1, 0, 0 },
|
|
{ "OPCODE_UN_COMPLEMENT", 1, 0, 0 },
|
|
{ "OPCODE_UN_TARGETNAME", 1, 0, 0 },
|
|
{ "OPCODE_BOOL_UN_NOT", 1, 0, 0 },
|
|
{ "OPCODE_VAR_UN_NOT", 1, 0, 0 },
|
|
{ "OPCODE_UN_CAST_BOOLEAN", 1, 0, 0 },
|
|
{ "OPCODE_UN_INC", 1, 0, 0 },
|
|
{ "OPCODE_UN_DEC", 1, 0, 0 },
|
|
{ "OPCODE_UN_SIZE", 1, 0, 0 },
|
|
|
|
{ "OPCODE_SWITCH", 5, -1, 0 },
|
|
|
|
{ "OPCODE_FUNC", 11, -128, 1 },
|
|
|
|
{ "OPCODE_NOP", 1, 0, 0 },
|
|
|
|
{ "OPCODE_BIN_SHIFT_LEFT", 1, -1, 0 },
|
|
{ "OPCODE_BIN_SHIFT_RIGHT", 1, -1, 0 },
|
|
|
|
{ "OPCODE_END", 1, -1, 0 },
|
|
{ "OPCODE_RETURN", 1, -1, 0 },
|
|
};
|
|
|
|
static const char *aszVarGroupNames[] =
|
|
{
|
|
"game",
|
|
"level",
|
|
"local",
|
|
"parm",
|
|
"self"
|
|
};
|
|
|
|
/*
|
|
====================
|
|
VarGroupName
|
|
====================
|
|
*/
|
|
const char *VarGroupName( int iVarGroup )
|
|
{
|
|
return aszVarGroupNames[ iVarGroup ];
|
|
}
|
|
|
|
/*
|
|
====================
|
|
OpcodeName
|
|
====================
|
|
*/
|
|
const char *OpcodeName( int opcode )
|
|
{
|
|
return OpcodeInfo[ opcode ].opcodename;
|
|
}
|
|
|
|
/*
|
|
====================
|
|
OpcodeLength
|
|
====================
|
|
*/
|
|
int OpcodeLength( int opcode )
|
|
{
|
|
return OpcodeInfo[ opcode ].opcodelength;
|
|
}
|
|
|
|
/*
|
|
====================
|
|
OpcodeVarStackOffset
|
|
====================
|
|
*/
|
|
int OpcodeVarStackOffset( int opcode )
|
|
{
|
|
return OpcodeInfo[ opcode ].opcodestackoffset;
|
|
}
|
|
|
|
/*
|
|
====================
|
|
SetOpcodeVarStackOffset
|
|
====================
|
|
*/
|
|
void SetOpcodeVarStackOffset( int opcode, int iVarStackOffset )
|
|
{
|
|
OpcodeInfo[ opcode ].opcodestackoffset = iVarStackOffset;
|
|
}
|
|
|
|
/*
|
|
====================
|
|
IsExternalOpcode
|
|
====================
|
|
*/
|
|
bool IsExternalOpcode( int opcode )
|
|
{
|
|
return OpcodeInfo[ opcode ].isexternal ? true : false;
|
|
}
|