aboutsummaryrefslogtreecommitdiff
path: root/engines/director/lingo
diff options
context:
space:
mode:
authorScott Percival2020-01-01 17:21:50 +0800
committerScott Percival2020-01-01 17:27:25 +0800
commitf263ed4bb63dca26a73790eb12ec908e75e5818a (patch)
treee58ae43dba2f62e2e4a976978b4997600e0468f1 /engines/director/lingo
parent94543467822401b407f4b061268e42d59d6a905b (diff)
downloadscummvm-rg350-f263ed4bb63dca26a73790eb12ec908e75e5818a.tar.gz
scummvm-rg350-f263ed4bb63dca26a73790eb12ec908e75e5818a.tar.bz2
scummvm-rg350-f263ed4bb63dca26a73790eb12ec908e75e5818a.zip
DIRECTOR: LINGO: Add cb_v4putvalue, casting support for REFERENCE
Diffstat (limited to 'engines/director/lingo')
-rw-r--r--engines/director/lingo/lingo-builtins.cpp2
-rw-r--r--engines/director/lingo/lingo-bytecode.cpp34
-rw-r--r--engines/director/lingo/lingo-code.cpp11
-rw-r--r--engines/director/lingo/lingo-code.h3
-rw-r--r--engines/director/lingo/lingo.cpp16
5 files changed, 51 insertions, 15 deletions
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 3ba361e824..40ac67206c 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1724,7 +1724,7 @@ void LB::b_field(int nargs) {
if (g_director->getCurrentScore()->_castsNames.contains(*d.u.s))
id = g_director->getCurrentScore()->_castsNames[*d.u.s];
else
- error("b_filed: Reference to non-existent field: %s", d.u.s->c_str());
+ error("b_field: Reference to non-existent field: %s", d.u.s->c_str());
} else if (d.type == INT || d.type == FLOAT) {
d.toInt();
id = d.u.i;
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index c980d51082..da5da4481d 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -25,13 +25,14 @@
#include "director/director.h"
#include "director/lingo/lingo.h"
#include "director/lingo/lingo-code.h"
+#include "director/lingo/lingo-builtins.h"
#include "director/lingo/lingo-bytecode.h"
#include "director/lingo/lingo-the.h"
namespace Director {
static LingoV4Bytecode lingoV4[] = {
- { 0x01, STOP, "" },
+ { 0x01, LC::c_procret, "" },
{ 0x03, LC::c_voidpush, "" },
{ 0x04, LC::c_mul, "" },
{ 0x05, LC::c_add, "" },
@@ -56,7 +57,7 @@ static LingoV4Bytecode lingoV4[] = {
{ 0x18, LC::c_hilite, "" },
{ 0x19, LC::c_intersects, "" },
{ 0x1a, LC::c_within, "" },
- { 0x1b, LC::c_field, "" },
+ { 0x1b, LC::cb_field, "" },
{ 0x1c, LC::c_tell, "" },
{ 0x1d, LC::c_telldone, "" },
{ 0x41, LC::c_intpush, "b" },
@@ -69,6 +70,7 @@ static LingoV4Bytecode lingoV4[] = {
{ 0x55, LC::c_jumpifz, "jb" },
{ 0x56, LC::cb_localcall, "b" },
{ 0x57, LC::cb_call, "b" },
+ { 0x59, LC::cb_v4putvalue, "b" },
{ 0x5c, LC::cb_v4theentitypush, "b" },
{ 0x5d, LC::cb_v4theentityassign, "b" },
{ 0x66, LC::cb_v4theentitynamepush, "b" },
@@ -190,6 +192,11 @@ void Lingo::initBytecode() {
}
+void LC::cb_field() {
+ LB::b_field(1);
+}
+
+
void LC::cb_localcall() {
int nameId = g_lingo->readInt();
Common::String name = g_lingo->_namelist[nameId];
@@ -208,6 +215,24 @@ void LC::cb_localcall() {
}
+void LC::cb_v4putvalue() {
+ int op = g_lingo->readInt();
+
+ switch (op) {
+ case 0x16:
+ // put value into field textVar
+ {
+ LC::cb_field();
+ LC::c_assign();
+ }
+ break;
+ default:
+ warning("cb_v4putvalue: unknown operator %d", op);
+ break;
+ }
+}
+
+
void LC::cb_call() {
int nameId = g_lingo->readInt();
Common::String name = g_lingo->_namelist[nameId];
@@ -683,6 +708,9 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
}
}
+ // Add backstop
+ g_lingo->code1(STOP);
+
// Rewrite every offset flagged as a jump based on the new code alignment.
// This converts the relative offset from the bytecode to an absolute one.
for (uint j = 0; j < jumpList.size(); j++) {
@@ -707,6 +735,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
warning("Function has unknown name id %d, skipping define", nameIndex);
}
}
+
free(codeStore);
}
@@ -743,6 +772,7 @@ void Lingo::addNamesV4(Common::SeekableSubReadStreamEndian &stream) {
name += stream.readByte();
}
_namelist.push_back(name);
+ debugC(5, kDebugLoading, "%d: \"%s\"", i, name.c_str());
}
}
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index ed307fb1dc..6cf10f861e 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -93,7 +93,6 @@ static struct FuncDescr {
{ LC::c_starts, "c_starts", "" },
{ LC::c_intersects, "c_intersects", "" },
{ LC::c_within, "c_within", "" },
- { LC::c_field, "c_field", "" },
{ LC::c_of, "c_of", "" },
{ LC::c_charOf, "c_charOf", "" }, // D3
{ LC::c_charToOf, "c_charToOf", "" }, // D3
@@ -139,7 +138,9 @@ static struct FuncDescr {
{ LC::c_unk1, "c_unk1", "ii" },
{ LC::c_unk2, "c_unk2", "iii" },
{ LC::cb_call, "cb_call", "i" },
+ { LC::cb_field, "cb_field", "" },
{ LC::cb_localcall, "cb_localcall", "i" },
+ { LC::cb_v4putvalue, "cb_putvalue", "i" },
{ LC::cb_v4theentitypush,"c_v4theentitypush","i" },
{ LC::cb_v4theentitynamepush,"c_v4theentitynamepush","i" },
{ LC::cb_v4theentityassign,"c_v4theentityassign","i" },
@@ -690,14 +691,6 @@ void LC::c_within() {
g_lingo->push(d1);
}
-void LC::c_field() {
- Datum d1 = g_lingo->pop();
-
- warning("STUB: c_field: %d", d1.u.i);
-
- g_lingo->push(d1);
-}
-
void LC::c_of() {
Datum first_char = g_lingo->pop();
Datum last_char = g_lingo->pop();
diff --git a/engines/director/lingo/lingo-code.h b/engines/director/lingo/lingo-code.h
index 87051a8cca..05bfbfb82c 100644
--- a/engines/director/lingo/lingo-code.h
+++ b/engines/director/lingo/lingo-code.h
@@ -49,7 +49,6 @@ namespace LC {
void c_intersects();
void c_within();
- void c_field();
void c_of();
void c_charOf();
void c_charToOf();
@@ -129,6 +128,8 @@ namespace LC {
// bytecode-related instructions
void cb_localcall();
void cb_call();
+ void cb_field();
+ void cb_v4putvalue();
void cb_v4theentitypush();
void cb_v4theentitynamepush();
void cb_v4theentityassign();
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index f5a0d73ac2..03533babe6 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -299,25 +299,35 @@ int Lingo::alignTypes(Datum &d1, Datum &d2) {
int Datum::toInt() {
switch (type) {
+ case REFERENCE:
+ toString();
+ case STRING:
+ u.i = atoi(u.s->c_str());
+ break;
case INT:
// no-op
break;
case FLOAT:
u.i = (int)u.f;
- type = INT;
break;
default:
warning("Incorrect operation toInt() for type: %s", type2str());
}
+ type = INT;
+
return u.i;
}
double Datum::toFloat() {
switch (type) {
+ case REFERENCE:
+ toString();
+ case STRING:
+ u.f = atof(u.s->c_str());
+ break;
case INT:
u.f = (double)u.i;
- type = FLOAT;
break;
case FLOAT:
// no-op
@@ -326,6 +336,8 @@ double Datum::toFloat() {
warning("Incorrect operation toFloat() for type: %s", type2str());
}
+ type = FLOAT;
+
return u.f;
}