Minor refactoring of ScriptValue and some script function handlers.

This commit is contained in:
NovaRain
2019-02-06 12:00:30 +08:00
parent f478e9a1f9
commit 823d2b92f7
7 changed files with 60 additions and 57 deletions
+2 -3
View File
@@ -335,10 +335,9 @@ const char* _stdcall GetSfallTypeName(DWORD dataType) {
} }
DWORD _stdcall getSfallTypeByScriptType(DWORD varType) { DWORD _stdcall getSfallTypeByScriptType(DWORD varType) {
varType &= 0xffff; switch (varType & 0xFFFF) {
switch (varType) {
case VAR_TYPE_STR:
case VAR_TYPE_STR2: case VAR_TYPE_STR2:
case VAR_TYPE_STR:
return DATATYPE_STR; return DATATYPE_STR;
case VAR_TYPE_FLOAT: case VAR_TYPE_FLOAT:
return DATATYPE_FLOAT; return DATATYPE_FLOAT;
+15 -12
View File
@@ -39,7 +39,7 @@
static DWORD _stdcall HandleMapUpdateForScripts(const DWORD procId); static DWORD _stdcall HandleMapUpdateForScripts(const DWORD procId);
// variables for new opcodes // variables for new opcodes
#define OP_MAX_ARGUMENTS (10) #define OP_MAX_ARGUMENTS (8)
// masks for argument validation // masks for argument validation
#define DATATYPE_MASK_INT (1 << DATATYPE_INT) #define DATATYPE_MASK_INT (1 << DATATYPE_INT)
@@ -156,10 +156,14 @@ public:
: nullptr; : nullptr;
} }
const char* String() const { const char* strValue() const {
return _val.str; return _val.str;
} }
float floatValue() const {
return _val.f;
}
SfallDataType type() const { SfallDataType type() const {
return _type; return _type;
} }
@@ -333,12 +337,11 @@ public:
// process return value // process return value
if (hasReturn) { if (hasReturn) {
if (_ret.type() == DATATYPE_NONE) { if (_ret.type() == DATATYPE_NONE) {
// if no value was set in handler, force return 0 to avoid stack error _ret = ScriptValue(0); // if no value was set in handler, force return 0 to avoid stack error
_ret = ScriptValue(0);
} }
DWORD rawResult = _ret.rawValue(); DWORD rawResult = _ret.rawValue();
if (_ret.type() == DATATYPE_STR) { if (_ret.type() == DATATYPE_STR) {
rawResult = InterpretAddString(program, _ret.asString()); rawResult = InterpretAddString(program, _ret.strValue());
} }
InterpretPushLong(program, rawResult); InterpretPushLong(program, rawResult);
InterpretPushShort(program, getScriptTypeBySfallType(_ret.type())); InterpretPushShort(program, getScriptTypeBySfallType(_ret.type()));
@@ -604,7 +607,7 @@ static void SetGlobalVarFunc() {
if ((varArg.isInt() || varArg.isString()) && (valArg.isInt() || valArg.isFloat())) { if ((varArg.isInt() || varArg.isString()) && (valArg.isInt() || valArg.isFloat())) {
if (varArg.isString()) { if (varArg.isString()) {
if (SetGlobalVar2(varArg.String(), valArg.rawValue())) { if (SetGlobalVar2(varArg.strValue(), valArg.rawValue())) {
opHandler.printOpcodeError("set_sfall_global() - The name of the global variable must consist of 8 characters."); opHandler.printOpcodeError("set_sfall_global() - The name of the global variable must consist of 8 characters.");
} }
} else { } else {
@@ -645,7 +648,7 @@ static void GetGlobalVarIntFunc() {
if (varArg.isInt() || varArg.isString()) { if (varArg.isInt() || varArg.isString()) {
if (varArg.isString()) { if (varArg.isString()) {
const char* var = varArg.String(); const char* var = varArg.strValue();
if (strlen(var) != 8) { if (strlen(var) != 8) {
opHandler.printOpcodeError("get_sfall_global_int() - The name of the global variable must consist of 8 characters."); opHandler.printOpcodeError("get_sfall_global_int() - The name of the global variable must consist of 8 characters.");
} else { } else {
@@ -671,7 +674,7 @@ static void GetGlobalVarFloatFunc() {
if (varArg.isInt() || varArg.isString()) { if (varArg.isInt() || varArg.isString()) {
if (varArg.isString()) { if (varArg.isString()) {
const char* var = varArg.String(); const char* var = varArg.strValue();
if (strlen(var) != 8) { if (strlen(var) != 8) {
opHandler.printOpcodeError("get_sfall_global_float() - The name of the global variable must consist of 8 characters."); opHandler.printOpcodeError("get_sfall_global_float() - The name of the global variable must consist of 8 characters.");
} else { } else {
@@ -1326,10 +1329,10 @@ void ScriptExtenderSetup() {
dlogr(" Unsafe opcodes disabled.", DL_SCRIPT); dlogr(" Unsafe opcodes disabled.", DL_SCRIPT);
} }
SafeWrite32(0x46E370, 0x300); //Maximum number of allowed opcodes SafeWrite32(0x46E370, 0x300); // Maximum number of allowed opcodes
SafeWrite32(0x46ce34, (DWORD)opcodes); //cmp check to make sure opcode exists SafeWrite32(0x46CE34, (DWORD)opcodes); // cmp check to make sure opcode exists
SafeWrite32(0x46ce6c, (DWORD)opcodes); //call that actually jumps to the opcode SafeWrite32(0x46CE6C, (DWORD)opcodes); // call that actually jumps to the opcode
SafeWrite32(0x46e390, (DWORD)opcodes); //mov that writes to the opcode SafeWrite32(0x46E390, (DWORD)opcodes); // mov that writes to the opcode
opcodes[0x156] = ReadByte; opcodes[0x156] = ReadByte;
opcodes[0x157] = ReadShort; opcodes[0x157] = ReadShort;
+10 -10
View File
@@ -257,16 +257,16 @@ next:
mov ecx, eax; mov ecx, eax;
mov eax, 3; mov eax, 3;
push 1; push 1; // arg10
mov al, ds:[0x006AB718]; mov al, byte ptr ds:[0x6AB718];
push eax; push eax; // a9
push 0; push 0; // *DisplayText
push eax; push eax; // ColorIndex
push 0x74; push 0x74; // y
mov ecx, 0xC0; mov ecx, 0xC0; // x
mov eax, esi; mov eax, esi; // text
xor ebx, ebx; xor ebx, ebx; // ?
xor edx, edx; xor edx, edx; // ?
call dialog_out_; call dialog_out_;
//xor eax, eax; //xor eax, eax;
end: end:
+6 -6
View File
@@ -82,13 +82,13 @@ static void sf_test() {
// returns current contents of metarule table // returns current contents of metarule table
static void sf_get_metarule_table() { static void sf_get_metarule_table() {
DWORD arr = TempArray(metaruleTable.size(), 0); DWORD arrId = TempArray(metaruleTable.size(), 0);
int i = 0; int i = 0;
for (MetaruleTableType::iterator it = metaruleTable.begin(); it != metaruleTable.end(); it++) { for (MetaruleTableType::iterator it = metaruleTable.begin(); it != metaruleTable.end(); it++) {
arrays[arr].val[i].set(it->first.c_str()); arrays[arrId].val[i].set(it->first.c_str());
i++; i++;
} }
opHandler.setReturn(arr, DATATYPE_INT); opHandler.setReturn(arrId, DATATYPE_INT);
} }
/* /*
@@ -155,8 +155,8 @@ static bool ValidateMetaruleArguments(const SfallMetarule* metaruleInfo) {
metaruleInfo->name, metaruleInfo->name,
argCount, argCount,
metaruleInfo->minArgs, metaruleInfo->minArgs,
metaruleInfo->maxArgs); metaruleInfo->maxArgs
);
return false; return false;
} else { } else {
// check if metadata is available for this handler // check if metadata is available for this handler
@@ -174,7 +174,7 @@ static bool ValidateMetaruleArguments(const SfallMetarule* metaruleInfo) {
static void _stdcall op_sfall_metarule_handler() { static void _stdcall op_sfall_metarule_handler() {
const ScriptValue &nameArg = opHandler.arg(0); const ScriptValue &nameArg = opHandler.arg(0);
if (nameArg.isString()) { if (nameArg.isString()) {
const char* name = nameArg.asString(); const char* name = nameArg.strValue();
MetaruleTableType::iterator lookup = metaruleTable.find(name); MetaruleTableType::iterator lookup = metaruleTable.find(name);
if (lookup != metaruleTable.end()) { if (lookup != metaruleTable.end()) {
currentMetarule = lookup->second; currentMetarule = lookup->second;
+1 -1
View File
@@ -1673,7 +1673,7 @@ static void sf_set_ini_setting() {
const ScriptValue &argVal = opHandler.arg(1); const ScriptValue &argVal = opHandler.arg(1);
if (argVal.isInt()) { if (argVal.isInt()) {
_itoa_s(argVal.asInt(), IniStrBuffer, 10); _itoa_s(argVal.rawValue(), IniStrBuffer, 10);
} else { } else {
strcpy_s(IniStrBuffer, argVal.asString()); strcpy_s(IniStrBuffer, argVal.asString());
} }
+2 -2
View File
@@ -520,8 +520,8 @@ static void _stdcall op_obj_is_carrying_obj2() {
&itemObjArg = opHandler.arg(1); &itemObjArg = opHandler.arg(1);
if (invenObjArg.isInt() && itemObjArg.isInt()) { if (invenObjArg.isInt() && itemObjArg.isInt()) {
TGameObj *invenObj = (TGameObj*)invenObjArg.asObject(), TGameObj *invenObj = invenObjArg.asObject(),
*itemObj = (TGameObj*)itemObjArg.asObject(); *itemObj = itemObjArg.asObject();
if (invenObj != nullptr && itemObj != nullptr) { if (invenObj != nullptr && itemObj != nullptr) {
for (int i = 0; i < invenObj->invenCount; i++) { for (int i = 0; i < invenObj->invenCount; i++) {
if (invenObj->invenTablePtr[i].object == itemObj) { if (invenObj->invenTablePtr[i].object == itemObj) {
+24 -23
View File
@@ -71,7 +71,7 @@ end:
static void funcAbs2() { static void funcAbs2() {
const ScriptValue &value = opHandler.arg(0); const ScriptValue &value = opHandler.arg(0);
if (value.isInt()) { if (value.isInt()) {
opHandler.setReturn(abs(value.asInt())); opHandler.setReturn(abs((int)value.rawValue()));
} else { } else {
opHandler.setReturn(abs(value.asFloat())); opHandler.setReturn(abs(value.asFloat()));
} }
@@ -723,7 +723,7 @@ static void funcPow2() {
float result = 0.0; float result = 0.0;
if (!base.isString() && !power.isString()) { if (!base.isString() && !power.isString()) {
if (power.isFloat()) if (power.isFloat())
result = pow(base.asFloat(), power.asFloat()); result = pow(base.asFloat(), power.floatValue());
else else
result = pow(base.asFloat(), power.asInt()); result = pow(base.asFloat(), power.asInt());
@@ -784,27 +784,28 @@ static void __declspec(naked) funcRound() {
*/ */
// TODO: move to FalloutEngine module // TODO: move to FalloutEngine module
static const DWORD game_msg_files[] = static const DWORD game_msg_files[] = {
{ 0x56D368 // COMBAT 0x56D368, // COMBAT
, 0x56D510 // AI 0x56D510, // AI
, 0x56D754 // SCRNAME 0x56D754, // SCRNAME
, 0x58E940 // MISC 0x58E940, // MISC
, 0x58EA98 // CUSTOM 0x58EA98, // CUSTOM
, 0x59E814 // INVENTRY 0x59E814, // INVENTRY
, 0x59E980 // ITEM 0x59E980, // ITEM
, 0x613D28 // LSGAME 0x613D28, // LSGAME
, 0x631D48 // MAP 0x631D48, // MAP
, 0x6637E8 // OPTIONS 0x6637E8, // OPTIONS
, 0x6642D4 // PERK 0x6642D4, // PERK
, 0x664348 // PIPBOY 0x664348, // PIPBOY
, 0x664410 // QUESTS 0x664410, // QUESTS
, 0x6647FC // PROTO 0x6647FC, // PROTO
, 0x667724 // SCRIPT 0x667724, // SCRIPT
, 0x668080 // SKILL 0x668080, // SKILL
, 0x6680F8 // SKILLDEX 0x6680F8, // SKILLDEX
, 0x66817C // STAT 0x66817C, // STAT
, 0x66BE38 // TRAIT 0x66BE38, // TRAIT
, 0x672FB0 }; // WORLDMAP 0x672FB0, // WORLDMAP
};
// TODO: move to FalloutEngine // TODO: move to FalloutEngine
static const DWORD* proto_msg_files = (DWORD*)0x006647AC; static const DWORD* proto_msg_files = (DWORD*)0x006647AC;