[Scummvm-git-logs] scummvm master -> f2ec6cbf638de3f0742d1030162442266801784e
djsrv
dservilla at gmail.com
Thu Jun 18 16:33:58 UTC 2020
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
c4914ea3ca DIRECTOR: LINGO: Add name to ScriptContext
d14e10539b DIRECTOR: Add _score to Cast
f2ec6cbf63 DIRECTOR: LINGO: Implement b_script
Commit: c4914ea3cac01acd7baf451055c35b609181c855
https://github.com/scummvm/scummvm/commit/c4914ea3cac01acd7baf451055c35b609181c855
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T12:33:38-04:00
Commit Message:
DIRECTOR: LINGO: Add name to ScriptContext
Changed paths:
engines/director/lingo/lingo-bytecode.cpp
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
engines/director/score-loading.cpp
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 301d5a0a42..e8df264829 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -738,7 +738,7 @@ void LC::cb_zeropush() {
g_lingo->push(d);
}
-void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &archName) {
+void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &scriptName, Common::String &archName) {
debugC(1, kDebugCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(type), id);
if (getScriptContext(archiveIndex, type, id)) {
@@ -752,6 +752,8 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
_assemblyContext = new ScriptContext;
_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
+ _assemblyContext->name = !scriptName.empty() ? scriptName : Common::String::format("%d", id);
+
if (stream.size() < 0x5c) {
warning("Lscr header too small");
return;
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 988fe821ad..30ec24f2aa 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -253,7 +253,7 @@ const char *Lingo::findNextDefinition(const char *s) {
return NULL;
}
-ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType type, uint16 id) {
+ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName) {
debugC(1, kDebugCompile, "Add code for type %s(%d) with id %d\n"
"***********\n%s\n\n***********", scriptType2str(type), type, id, code);
@@ -270,6 +270,11 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
if (archiveIndex >= 0)
_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
+ if (scriptName && strlen(scriptName) > 0)
+ _assemblyContext->name = Common::String(scriptName);
+ else
+ _assemblyContext->name = Common::String::format("%d", id);
+
_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
_linenumber = _colnumber = 1;
_hadError = false;
@@ -355,15 +360,8 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
currentFunc.type = HANDLER;
currentFunc.u.defn = _currentAssembly;
- // guess the name. don't actually bind it to the event, there's a seperate
- // triggering mechanism for that.
- if (type == kScoreScript) {
- currentFunc.name = new Common::String("[score script]");
- } else if (type == kCastScript) {
- currentFunc.name = new Common::String("[cast script");
- } else {
- currentFunc.name = new Common::String("[unknown]");
- }
+ Common::String typeStr = Common::String(scriptType2str(type));
+ currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->name + "]");
currentFunc.ctx = _currentScriptContext;
currentFunc.archiveIndex = _assemblyArchive;
// arg names should be empty, but just in case
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 4fae571de7..a80e67f88f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -214,6 +214,7 @@ typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Co
typedef Common::HashMap<Common::String, TheEntityField *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityFieldHash;
struct ScriptContext {
+ Common::String name;
Common::Array<Symbol> functions; // used only by bytecode
Common::HashMap<uint32, Symbol> eventHandlers;
SymbolHash functionHandlers;
@@ -315,8 +316,8 @@ public:
void restartLingo(bool keepSharedCast);
- ScriptContext *addCode(const char *code, int archiveIndex, ScriptType type, uint16 id);
- void addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &archName);
+ ScriptContext *addCode(const char *code, int archiveIndex, ScriptType type, uint16 id, const char *scriptName = nullptr);
+ void addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex, ScriptType type, uint16 id, Common::String &scriptName, Common::String &archName);
void addNamesV4(Common::SeekableSubReadStreamEndian &stream, int archiveIndex);
void executeHandler(const Common::String &name);
void executeScript(ScriptType type, uint16 id);
diff --git a/engines/director/score-loading.cpp b/engines/director/score-loading.cpp
index 15247b3ae7..f94006443e 100644
--- a/engines/director/score-loading.cpp
+++ b/engines/director/score-loading.cpp
@@ -873,7 +873,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
if (scriptId < _castScriptIds.size()) {
int resourceId = _castScriptIds[scriptId];
Common::SeekableSubReadStreamEndian *r;
- _lingo->addCodeV4(*(r = _movieArchive->getResource(MKTAG('L', 's', 'c', 'r'), resourceId)), _lingoArchive, ((ScriptCast *)member)->_scriptType, id, _macName);
+ _lingo->addCodeV4(*(r = _movieArchive->getResource(MKTAG('L', 's', 'c', 'r'), resourceId)), _lingoArchive, ((ScriptCast *)member)->_scriptType, id, ci->name, _macName);
delete r;
} else {
warning("Score::loadCastData(): Lingo context missing a resource entry for script %d referenced in cast %d", scriptId, id);
@@ -889,7 +889,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
if (ConfMan.getBool("dump_scripts"))
dumpScript(ci->script.c_str(), scriptType, id);
- _lingo->addCode(ci->script.c_str(), _lingoArchive, scriptType, id);
+ _lingo->addCode(ci->script.c_str(), _lingoArchive, scriptType, id, ci->name.c_str());
}
}
@@ -1127,7 +1127,7 @@ void Score::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id)
dumpScript(ci->script.c_str(), kCastScript, id);
if (!ci->script.empty())
- _lingo->addCode(ci->script.c_str(), _lingoArchive, kCastScript, id);
+ _lingo->addCode(ci->script.c_str(), _lingoArchive, kCastScript, id, ci->name.c_str());
ci->name = getString(castStrings[1]);
ci->directory = getString(castStrings[2]);
Commit: d14e10539b865573f45c11787cd29ff7276d7bbe
https://github.com/scummvm/scummvm/commit/d14e10539b865573f45c11787cd29ff7276d7bbe
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T12:33:38-04:00
Commit Message:
DIRECTOR: Add _score to Cast
Changed paths:
engines/director/cast.cpp
engines/director/cast.h
engines/director/score-loading.cpp
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 6e10e451e4..124c84e25e 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -37,6 +37,7 @@ namespace Director {
Cast::Cast() {
_type = kCastTypeNull;
+ _score = nullptr;
_widget = nullptr;
_hilite = false;
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 50fe39b950..8d97cb9e2b 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -63,6 +63,7 @@ public:
virtual void getColors(int *fgcolor, int *bgcolor) { return; }
CastType _type;
+ Score *_score;
Common::Rect _initialRect;
Common::Rect _boundingRect;
Common::Array<Resource> _children;
diff --git a/engines/director/score-loading.cpp b/engines/director/score-loading.cpp
index f94006443e..21422b199a 100644
--- a/engines/director/score-loading.cpp
+++ b/engines/director/score-loading.cpp
@@ -674,8 +674,9 @@ void Score::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
default:
warning("Score::loadCastDataVWCR(): Unhandled cast id: %d(%s), type: %d, %d bytes", id, numToCastNum(id), castType, size);
stream.skip(size - 1);
- break;
+ continue;
}
+ _loadedCast->getVal(id)->_score = this;
}
}
@@ -894,6 +895,8 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
}
_castsInfo[id] = ci;
+
+ member->_score = this;
}
if (size3)
Commit: f2ec6cbf638de3f0742d1030162442266801784e
https://github.com/scummvm/scummvm/commit/f2ec6cbf638de3f0742d1030162442266801784e
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-18T12:33:38-04:00
Commit Message:
DIRECTOR: LINGO: Implement b_script
Changed paths:
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-bytecode.cpp
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo-events.cpp
engines/director/lingo/lingo-gr.cpp
engines/director/lingo/lingo-gr.y
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
engines/director/score.h
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 30f18c855c..5dd44ab790 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -520,7 +520,7 @@ void LB::b_value(int nargs) {
Common::String code = "scummvm_returnNumber " + expr;
// Compile the code to an anonymous function and call it
ScriptContext *sc = g_lingo->addCode(code.c_str(), kArchNone, kNoneScript, 0);
- Symbol sym = sc->eventHandlers[kEventNone];
+ Symbol sym = sc->_eventHandlers[kEventNone];
LC::call(sym, 0);
delete sc;
}
@@ -2159,12 +2159,24 @@ void LB::b_field(int nargs) {
void LB::b_script(int nargs) {
Datum d = g_lingo->pop();
+ int castId = g_lingo->castIdFetch(d);
+ Cast *cast = g_director->getCastMember(castId);
- warning("STUB: b_script");
+ if (cast) {
+ ScriptContext *script = nullptr;
- Datum res(0);
- d.type = REFERENCE;
- g_lingo->push(res);
+ if (cast->_type == kCastLingoScript)
+ script = g_lingo->getScriptContext(cast->_score->_lingoArchive, kMovieScript, castId);
+ else
+ script = g_lingo->getScriptContext(cast->_score->_lingoArchive, kCastScript, castId);
+
+ if (script) {
+ g_lingo->push(Datum(script->getObject()));
+ return;
+ }
+ }
+
+ g_lingo->push(Datum());
}
void LB::b_window(int nargs) {
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index e8df264829..25bba8b91e 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -294,7 +294,7 @@ void LC::cb_localcall() {
Datum nargs = g_lingo->pop();
if ((nargs.type == ARGC) || (nargs.type == ARGCNORET)) {
- Symbol sym = g_lingo->_currentScriptContext->functions[functionId];
+ Symbol sym = g_lingo->_currentScriptContext->_functions[functionId];
if (debugChannelSet(3, kDebugLingoExec))
g_lingo->printSTUBWithArglist(sym.name->c_str(), nargs.u.i, "localcall:");
@@ -752,7 +752,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
_assemblyContext = new ScriptContext;
_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
- _assemblyContext->name = !scriptName.empty() ? scriptName : Common::String::format("%d", id);
+ _assemblyContext->_name = !scriptName.empty() ? scriptName : Common::String::format("%d", id);
if (stream.size() < 0x5c) {
warning("Lscr header too small");
@@ -944,7 +944,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
break;
}
- _assemblyContext->constants.push_back(constant);
+ _assemblyContext->_constants.push_back(constant);
}
free(constsStore);
@@ -1092,7 +1092,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
warning("Opcode 0x%02x arg %d not a multiple of 6!", opcode, arg);
}
arg /= 6;
- Datum constant = _assemblyContext->constants[arg];
+ Datum constant = _assemblyContext->_constants[arg];
switch (constant.type) {
case INT:
g_lingo->code1(LC::c_intpush);
@@ -1266,7 +1266,7 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, int archiveIn
out.writeString(Common::String::format("<end code>\n\n"));
}
- _assemblyContext->functions.push_back(sym);
+ _assemblyContext->_functions.push_back(sym);
_currentAssembly = nullptr;
}
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 76b6c284ed..d47114a9bf 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -98,9 +98,9 @@ Symbol Lingo::define(Common::String &name, int nargs, ScriptData *code, Common::
if (!_eventHandlerTypeIds.contains(name)) {
_archives[_assemblyArchive].functionHandlers[name] = sym;
- _assemblyContext->functionHandlers[name] = sym;
+ _assemblyContext->_functionHandlers[name] = sym;
} else {
- _assemblyContext->eventHandlers[_eventHandlerTypeIds[name]] = sym;
+ _assemblyContext->_eventHandlers[_eventHandlerTypeIds[name]] = sym;
}
}
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index afaa93c32c..187e7d95a8 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -161,7 +161,7 @@ void Lingo::registerSpriteEvent(LEvent event, int spriteId) {
}
} else {
ScriptContext *script = getScriptContext(kArchMain, kScoreScript, sprite->_scriptId);
- if (script && script->eventHandlers.contains(event)) {
+ if (script && script->_eventHandlers.contains(event)) {
_eventQueue.push(LingoEvent(event, kArchMain, kScoreScript, sprite->_scriptId, spriteId));
return;
}
@@ -175,7 +175,7 @@ void Lingo::registerSpriteEvent(LEvent event, int spriteId) {
archiveIndex = kArchShared;
script = getScriptContext(archiveIndex, kCastScript, sprite->_castId);
}
- if (script && script->eventHandlers.contains(event)) {
+ if (script && script->_eventHandlers.contains(event)) {
_eventQueue.push(LingoEvent(event, archiveIndex, kCastScript, sprite->_castId, spriteId));
return;
}
@@ -222,14 +222,14 @@ void Lingo::registerMovieEvent(LEvent event) {
// FIXME: shared cast movie scripts could come before main movie ones
for (ScriptContextHash::iterator it = _archives[kArchMain].scriptContexts[kMovieScript].begin();
it != _archives[kArchMain].scriptContexts[kMovieScript].end(); ++it) {
- if (it->_value->eventHandlers.contains(event)) {
+ if (it->_value->_eventHandlers.contains(event)) {
_eventQueue.push(LingoEvent(event, kArchMain, kMovieScript, it->_key));
return;
}
}
for (ScriptContextHash::iterator it = _archives[kArchShared].scriptContexts[kMovieScript].begin();
it != _archives[kArchShared].scriptContexts[kMovieScript].end(); ++it) {
- if (it->_value->eventHandlers.contains(event)) {
+ if (it->_value->_eventHandlers.contains(event)) {
_eventQueue.push(LingoEvent(event, kArchShared, kMovieScript, it->_key));
return;
}
@@ -303,9 +303,9 @@ void Lingo::processEvent(LEvent event, int archiveIndex, ScriptType st, int scri
ScriptContext *script = getScriptContext(archiveIndex, st, scriptId);
- if (script && script->eventHandlers.contains(event)) {
+ if (script && script->_eventHandlers.contains(event)) {
debugC(1, kDebugEvents, "Lingo::processEvent(%s, %d, %s, %d): executing event handler", _eventHandlerTypes[event], archiveIndex, scriptType2str(st), scriptId);
- LC::call(script->eventHandlers[event], 0);
+ LC::call(script->_eventHandlers[event], 0);
execute(_pc);
} else {
debugC(9, kDebugEvents, "Lingo::processEvent(%s, %d, %s, %d): no handler", _eventHandlerTypes[event], archiveIndex, scriptType2str(st), scriptId);
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index bf4bce2c5b..bbd18f8b89 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -898,12 +898,12 @@ static const yytype_int16 yyrline[] =
600, 601, 602, 603, 604, 605, 606, 607, 608, 609,
610, 612, 613, 614, 615, 616, 617, 618, 619, 621,
624, 626, 627, 628, 629, 637, 638, 638, 639, 639,
- 640, 640, 641, 644, 647, 648, 650, 653, 657, 662,
- 668, 671, 682, 683, 684, 685, 689, 693, 698, 699,
- 701, 705, 709, 713, 713, 743, 743, 743, 749, 750,
- 750, 756, 764, 770, 770, 773, 774, 775, 777, 778,
- 779, 781, 783, 791, 792, 793, 795, 796, 798, 800,
- 801, 802, 803, 805, 806, 808, 809, 811, 815
+ 640, 640, 641, 644, 647, 648, 650, 653, 657, 660,
+ 664, 667, 678, 679, 680, 681, 685, 689, 694, 695,
+ 697, 701, 705, 709, 709, 739, 739, 739, 745, 746,
+ 746, 752, 760, 766, 766, 769, 770, 771, 773, 774,
+ 775, 777, 779, 787, 788, 789, 791, 792, 794, 796,
+ 797, 798, 799, 801, 802, 804, 805, 807, 811
};
#endif
@@ -3237,172 +3237,168 @@ yyreduce:
case 128:
#line 657 "engines/director/lingo/lingo-gr.y"
{
- g_lingo->code1(LC::c_property);
- g_lingo->codeString((yyvsp[0].s)->c_str());
mVar((yyvsp[0].s), kVarProperty);
delete (yyvsp[0].s); }
-#line 3245 "engines/director/lingo/lingo-gr.cpp"
+#line 3243 "engines/director/lingo/lingo-gr.cpp"
break;
case 129:
-#line 662 "engines/director/lingo/lingo-gr.y"
+#line 660 "engines/director/lingo/lingo-gr.y"
{
- g_lingo->code1(LC::c_property);
- g_lingo->codeString((yyvsp[0].s)->c_str());
mVar((yyvsp[0].s), kVarProperty);
delete (yyvsp[0].s); }
-#line 3255 "engines/director/lingo/lingo-gr.cpp"
+#line 3251 "engines/director/lingo/lingo-gr.cpp"
break;
case 130:
-#line 668 "engines/director/lingo/lingo-gr.y"
+#line 664 "engines/director/lingo/lingo-gr.y"
{
mVar((yyvsp[0].s), kVarInstance);
delete (yyvsp[0].s); }
-#line 3263 "engines/director/lingo/lingo-gr.cpp"
+#line 3259 "engines/director/lingo/lingo-gr.cpp"
break;
case 131:
-#line 671 "engines/director/lingo/lingo-gr.y"
+#line 667 "engines/director/lingo/lingo-gr.y"
{
mVar((yyvsp[0].s), kVarInstance);
delete (yyvsp[0].s); }
-#line 3271 "engines/director/lingo/lingo-gr.cpp"
+#line 3267 "engines/director/lingo/lingo-gr.cpp"
break;
case 132:
-#line 682 "engines/director/lingo/lingo-gr.y"
+#line 678 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(LC::c_gotoloop); }
-#line 3277 "engines/director/lingo/lingo-gr.cpp"
+#line 3273 "engines/director/lingo/lingo-gr.cpp"
break;
case 133:
-#line 683 "engines/director/lingo/lingo-gr.y"
+#line 679 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(LC::c_gotonext); }
-#line 3283 "engines/director/lingo/lingo-gr.cpp"
+#line 3279 "engines/director/lingo/lingo-gr.cpp"
break;
case 134:
-#line 684 "engines/director/lingo/lingo-gr.y"
+#line 680 "engines/director/lingo/lingo-gr.y"
{ g_lingo->code1(LC::c_gotoprevious); }
-#line 3289 "engines/director/lingo/lingo-gr.cpp"
+#line 3285 "engines/director/lingo/lingo-gr.cpp"
break;
case 135:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 681 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_intpush);
g_lingo->codeInt(1);
g_lingo->code1(LC::c_goto); }
-#line 3298 "engines/director/lingo/lingo-gr.cpp"
+#line 3294 "engines/director/lingo/lingo-gr.cpp"
break;
case 136:
-#line 689 "engines/director/lingo/lingo-gr.y"
+#line 685 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_intpush);
g_lingo->codeInt(3);
g_lingo->code1(LC::c_goto); }
-#line 3307 "engines/director/lingo/lingo-gr.cpp"
+#line 3303 "engines/director/lingo/lingo-gr.cpp"
break;
case 137:
-#line 693 "engines/director/lingo/lingo-gr.y"
+#line 689 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_intpush);
g_lingo->codeInt(2);
g_lingo->code1(LC::c_goto); }
-#line 3316 "engines/director/lingo/lingo-gr.cpp"
+#line 3312 "engines/director/lingo/lingo-gr.cpp"
break;
case 140:
-#line 701 "engines/director/lingo/lingo-gr.y"
+#line 697 "engines/director/lingo/lingo-gr.y"
{ // "play #done" is also caught by this
g_lingo->code1(LC::c_intpush);
g_lingo->codeInt(1);
g_lingo->code1(LC::c_play); }
-#line 3325 "engines/director/lingo/lingo-gr.cpp"
+#line 3321 "engines/director/lingo/lingo-gr.cpp"
break;
case 141:
-#line 705 "engines/director/lingo/lingo-gr.y"
+#line 701 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_intpush);
g_lingo->codeInt(3);
g_lingo->code1(LC::c_play); }
-#line 3334 "engines/director/lingo/lingo-gr.cpp"
+#line 3330 "engines/director/lingo/lingo-gr.cpp"
break;
case 142:
-#line 709 "engines/director/lingo/lingo-gr.y"
+#line 705 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_intpush);
g_lingo->codeInt(2);
g_lingo->code1(LC::c_play); }
-#line 3343 "engines/director/lingo/lingo-gr.cpp"
+#line 3339 "engines/director/lingo/lingo-gr.cpp"
break;
case 143:
-#line 713 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeSetImmediate(true); }
-#line 3349 "engines/director/lingo/lingo-gr.cpp"
+#line 3345 "engines/director/lingo/lingo-gr.cpp"
break;
case 144:
-#line 713 "engines/director/lingo/lingo-gr.y"
+#line 709 "engines/director/lingo/lingo-gr.y"
{
g_lingo->codeSetImmediate(false);
g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
delete (yyvsp[-2].s); }
-#line 3358 "engines/director/lingo/lingo-gr.cpp"
+#line 3354 "engines/director/lingo/lingo-gr.cpp"
break;
case 145:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
{ startDef(); }
-#line 3364 "engines/director/lingo/lingo-gr.cpp"
+#line 3360 "engines/director/lingo/lingo-gr.cpp"
break;
case 146:
-#line 743 "engines/director/lingo/lingo-gr.y"
+#line 739 "engines/director/lingo/lingo-gr.y"
{ g_lingo->_currentFactory = NULL; }
-#line 3370 "engines/director/lingo/lingo-gr.cpp"
+#line 3366 "engines/director/lingo/lingo-gr.cpp"
break;
case 147:
-#line 744 "engines/director/lingo/lingo-gr.y"
+#line 740 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_procret);
g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
endDef();
delete (yyvsp[-6].s); }
-#line 3380 "engines/director/lingo/lingo-gr.cpp"
+#line 3376 "engines/director/lingo/lingo-gr.cpp"
break;
case 148:
-#line 749 "engines/director/lingo/lingo-gr.y"
+#line 745 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3386 "engines/director/lingo/lingo-gr.cpp"
+#line 3382 "engines/director/lingo/lingo-gr.cpp"
break;
case 149:
-#line 750 "engines/director/lingo/lingo-gr.y"
+#line 746 "engines/director/lingo/lingo-gr.y"
{ startDef(); }
-#line 3392 "engines/director/lingo/lingo-gr.cpp"
+#line 3388 "engines/director/lingo/lingo-gr.cpp"
break;
case 150:
-#line 751 "engines/director/lingo/lingo-gr.y"
+#line 747 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_procret);
g_lingo->codeDefine(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg), g_lingo->_currentFactory);
endDef();
delete (yyvsp[-6].s); }
-#line 3402 "engines/director/lingo/lingo-gr.cpp"
+#line 3398 "engines/director/lingo/lingo-gr.cpp"
break;
case 151:
-#line 756 "engines/director/lingo/lingo-gr.y"
+#line 752 "engines/director/lingo/lingo-gr.y"
{ // D3
g_lingo->code1(LC::c_procret);
g_lingo->codeDefine(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3411,70 +3407,70 @@ yyreduce:
checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
delete (yyvsp[-7].s);
delete (yyvsp[-1].s); }
-#line 3415 "engines/director/lingo/lingo-gr.cpp"
+#line 3411 "engines/director/lingo/lingo-gr.cpp"
break;
case 152:
-#line 764 "engines/director/lingo/lingo-gr.y"
+#line 760 "engines/director/lingo/lingo-gr.y"
{ // D4. No 'end' clause
g_lingo->code1(LC::c_procret);
g_lingo->codeDefine(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
endDef();
delete (yyvsp[-5].s); }
-#line 3425 "engines/director/lingo/lingo-gr.cpp"
+#line 3421 "engines/director/lingo/lingo-gr.cpp"
break;
case 153:
-#line 770 "engines/director/lingo/lingo-gr.y"
+#line 766 "engines/director/lingo/lingo-gr.y"
{ startDef(); }
-#line 3431 "engines/director/lingo/lingo-gr.cpp"
+#line 3427 "engines/director/lingo/lingo-gr.cpp"
break;
case 154:
-#line 770 "engines/director/lingo/lingo-gr.y"
+#line 766 "engines/director/lingo/lingo-gr.y"
{
(yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory = NULL; }
-#line 3438 "engines/director/lingo/lingo-gr.cpp"
+#line 3434 "engines/director/lingo/lingo-gr.cpp"
break;
case 155:
-#line 773 "engines/director/lingo/lingo-gr.y"
+#line 769 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 0; }
-#line 3444 "engines/director/lingo/lingo-gr.cpp"
+#line 3440 "engines/director/lingo/lingo-gr.cpp"
break;
case 156:
-#line 774 "engines/director/lingo/lingo-gr.y"
+#line 770 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3450 "engines/director/lingo/lingo-gr.cpp"
+#line 3446 "engines/director/lingo/lingo-gr.cpp"
break;
case 157:
-#line 775 "engines/director/lingo/lingo-gr.y"
+#line 771 "engines/director/lingo/lingo-gr.y"
{ g_lingo->codeArg((yyvsp[0].s)); mVar((yyvsp[0].s), kVarArgument); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3456 "engines/director/lingo/lingo-gr.cpp"
+#line 3452 "engines/director/lingo/lingo-gr.cpp"
break;
case 159:
-#line 778 "engines/director/lingo/lingo-gr.y"
+#line 774 "engines/director/lingo/lingo-gr.y"
{ delete (yyvsp[0].s); }
-#line 3462 "engines/director/lingo/lingo-gr.cpp"
+#line 3458 "engines/director/lingo/lingo-gr.cpp"
break;
case 160:
-#line 779 "engines/director/lingo/lingo-gr.y"
+#line 775 "engines/director/lingo/lingo-gr.y"
{ delete (yyvsp[0].s); }
-#line 3468 "engines/director/lingo/lingo-gr.cpp"
+#line 3464 "engines/director/lingo/lingo-gr.cpp"
break;
case 161:
-#line 781 "engines/director/lingo/lingo-gr.y"
+#line 777 "engines/director/lingo/lingo-gr.y"
{ inDef(); }
-#line 3474 "engines/director/lingo/lingo-gr.cpp"
+#line 3470 "engines/director/lingo/lingo-gr.cpp"
break;
case 162:
-#line 783 "engines/director/lingo/lingo-gr.y"
+#line 779 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_call);
g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3482,113 +3478,113 @@ yyreduce:
WRITE_UINT32(&numpar, (yyvsp[0].narg));
g_lingo->code1(numpar);
delete (yyvsp[-1].s); }
-#line 3486 "engines/director/lingo/lingo-gr.cpp"
+#line 3482 "engines/director/lingo/lingo-gr.cpp"
break;
case 163:
-#line 791 "engines/director/lingo/lingo-gr.y"
+#line 787 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 0; }
-#line 3492 "engines/director/lingo/lingo-gr.cpp"
+#line 3488 "engines/director/lingo/lingo-gr.cpp"
break;
case 164:
-#line 792 "engines/director/lingo/lingo-gr.y"
+#line 788 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 1; }
-#line 3498 "engines/director/lingo/lingo-gr.cpp"
+#line 3494 "engines/director/lingo/lingo-gr.cpp"
break;
case 165:
-#line 793 "engines/director/lingo/lingo-gr.y"
+#line 789 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3504 "engines/director/lingo/lingo-gr.cpp"
+#line 3500 "engines/director/lingo/lingo-gr.cpp"
break;
case 166:
-#line 795 "engines/director/lingo/lingo-gr.y"
+#line 791 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 1; }
-#line 3510 "engines/director/lingo/lingo-gr.cpp"
+#line 3506 "engines/director/lingo/lingo-gr.cpp"
break;
case 167:
-#line 796 "engines/director/lingo/lingo-gr.y"
+#line 792 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3516 "engines/director/lingo/lingo-gr.cpp"
+#line 3512 "engines/director/lingo/lingo-gr.cpp"
break;
case 168:
-#line 798 "engines/director/lingo/lingo-gr.y"
+#line 794 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = (yyvsp[-1].code); }
-#line 3522 "engines/director/lingo/lingo-gr.cpp"
+#line 3518 "engines/director/lingo/lingo-gr.cpp"
break;
case 169:
-#line 800 "engines/director/lingo/lingo-gr.y"
+#line 796 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3528 "engines/director/lingo/lingo-gr.cpp"
+#line 3524 "engines/director/lingo/lingo-gr.cpp"
break;
case 170:
-#line 801 "engines/director/lingo/lingo-gr.y"
+#line 797 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3534 "engines/director/lingo/lingo-gr.cpp"
+#line 3530 "engines/director/lingo/lingo-gr.cpp"
break;
case 171:
-#line 802 "engines/director/lingo/lingo-gr.y"
+#line 798 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3540 "engines/director/lingo/lingo-gr.cpp"
+#line 3536 "engines/director/lingo/lingo-gr.cpp"
break;
case 172:
-#line 803 "engines/director/lingo/lingo-gr.y"
+#line 799 "engines/director/lingo/lingo-gr.y"
{ (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3546 "engines/director/lingo/lingo-gr.cpp"
+#line 3542 "engines/director/lingo/lingo-gr.cpp"
break;
case 173:
-#line 805 "engines/director/lingo/lingo-gr.y"
+#line 801 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 1; }
-#line 3552 "engines/director/lingo/lingo-gr.cpp"
+#line 3548 "engines/director/lingo/lingo-gr.cpp"
break;
case 174:
-#line 806 "engines/director/lingo/lingo-gr.y"
+#line 802 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3558 "engines/director/lingo/lingo-gr.cpp"
+#line 3554 "engines/director/lingo/lingo-gr.cpp"
break;
case 175:
-#line 808 "engines/director/lingo/lingo-gr.y"
+#line 804 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = 1; }
-#line 3564 "engines/director/lingo/lingo-gr.cpp"
+#line 3560 "engines/director/lingo/lingo-gr.cpp"
break;
case 176:
-#line 809 "engines/director/lingo/lingo-gr.y"
+#line 805 "engines/director/lingo/lingo-gr.y"
{ (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3570 "engines/director/lingo/lingo-gr.cpp"
+#line 3566 "engines/director/lingo/lingo-gr.cpp"
break;
case 177:
-#line 811 "engines/director/lingo/lingo-gr.y"
+#line 807 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_symbolpush);
g_lingo->codeString((yyvsp[-2].s)->c_str());
delete (yyvsp[-2].s); }
-#line 3579 "engines/director/lingo/lingo-gr.cpp"
+#line 3575 "engines/director/lingo/lingo-gr.cpp"
break;
case 178:
-#line 815 "engines/director/lingo/lingo-gr.y"
+#line 811 "engines/director/lingo/lingo-gr.y"
{
g_lingo->code1(LC::c_stringpush);
g_lingo->codeString((yyvsp[-2].s)->c_str());
delete (yyvsp[-2].s); }
-#line 3588 "engines/director/lingo/lingo-gr.cpp"
+#line 3584 "engines/director/lingo/lingo-gr.cpp"
break;
-#line 3592 "engines/director/lingo/lingo-gr.cpp"
+#line 3588 "engines/director/lingo/lingo-gr.cpp"
default: break;
}
@@ -3787,7 +3783,7 @@ yyreturn:
return yyresult;
}
-#line 821 "engines/director/lingo/lingo-gr.y"
+#line 817 "engines/director/lingo/lingo-gr.y"
int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index e88581adcb..8a5e4e2331 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -655,13 +655,9 @@ globallist: ID {
delete $ID; }
propertylist: ID {
- g_lingo->code1(LC::c_property);
- g_lingo->codeString($ID->c_str());
mVar($ID, kVarProperty);
delete $ID; }
| propertylist ',' ID {
- g_lingo->code1(LC::c_property);
- g_lingo->codeString($ID->c_str());
mVar($ID, kVarProperty);
delete $ID; }
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 30ec24f2aa..a262e3ca6c 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -271,9 +271,9 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
_archives[_assemblyArchive].scriptContexts[type][id] = _assemblyContext;
if (scriptName && strlen(scriptName) > 0)
- _assemblyContext->name = Common::String(scriptName);
+ _assemblyContext->_name = Common::String(scriptName);
else
- _assemblyContext->name = Common::String::format("%d", id);
+ _assemblyContext->_name = Common::String::format("%d", id);
_methodVars = new Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>();
_linenumber = _colnumber = 1;
@@ -361,7 +361,7 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
currentFunc.type = HANDLER;
currentFunc.u.defn = _currentAssembly;
Common::String typeStr = Common::String(scriptType2str(type));
- currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->name + "]");
+ currentFunc.name = new Common::String("[" + typeStr + " " + _assemblyContext->_name + "]");
currentFunc.ctx = _currentScriptContext;
currentFunc.archiveIndex = _assemblyArchive;
// arg names should be empty, but just in case
@@ -373,6 +373,8 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
for (Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = _methodVars->begin(); it != _methodVars->end(); ++it) {
if (it->_value == kVarLocal)
varNames->push_back(Common::String(it->_key));
+ else if (it->_value == kVarProperty)
+ _assemblyContext->_propNames.push_back(Common::String(it->_key));
}
delete _methodVars;
_methodVars = nullptr;
@@ -393,7 +395,7 @@ ScriptContext *Lingo::addCode(const char *code, int archiveIndex, ScriptType typ
currentFunc.argNames = argNames;
currentFunc.varNames = varNames;
- _assemblyContext->eventHandlers[kEventNone] = currentFunc;
+ _assemblyContext->_eventHandlers[kEventNone] = currentFunc;
_assemblyContext = nullptr;
_currentAssembly = nullptr;
return sc;
@@ -572,7 +574,7 @@ void Lingo::executeScript(ScriptType type, uint16 id) {
debugC(1, kDebugLingoExec, "Executing script type: %s, id: %d", scriptType2str(type), id);
- Symbol sym = sc->eventHandlers[kEventNone];
+ Symbol sym = sc->_eventHandlers[kEventNone];
LC::call(sym, 0);
execute(_pc);
}
@@ -594,8 +596,8 @@ void Lingo::restartLingo(bool keepSharedCast) {
LingoArchive *arch = &_archives[a];
for (int i = 0; i <= kMaxScriptType; i++) {
for (ScriptContextHash::iterator it = arch->scriptContexts[i].begin(); it != arch->scriptContexts[i].end(); ++it) {
- it->_value->eventHandlers.clear();
- it->_value->functionHandlers.clear();
+ it->_value->_eventHandlers.clear();
+ it->_value->_functionHandlers.clear();
delete it->_value;
}
@@ -946,6 +948,22 @@ int Datum::compareTo(Datum &d, bool ignoreCase) {
}
}
+Datum ScriptContext::getObject() {
+ if (_obj.type != OBJECT) {
+ _obj.type = OBJECT;
+ _obj.u.obj = new Object(_name, kScriptObj);
+ for (Common::Array<Common::String>::iterator it = _propNames.begin(); it != _propNames.end(); ++it) {
+ _obj.u.obj->properties[*it] = Datum();
+ }
+ for (SymbolHash::iterator it = _functionHandlers.begin(); it != _functionHandlers.end(); ++it) {
+ Symbol sym = it->_value;
+ sym.targetType = kScriptObj;
+ _obj.u.obj->methods[it->_key] = sym;
+ }
+ }
+ return _obj;
+}
+
void Lingo::parseMenu(const char *code) {
warning("STUB: parseMenu");
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a80e67f88f..3c67e0db71 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -43,7 +43,7 @@ struct TheEntityField;
struct LingoV4Bytecode;
struct LingoV4TheEntity;
struct Object;
-struct ScriptContext;
+class ScriptContext;
class DirectorEngine;
class Frame;
@@ -213,12 +213,19 @@ typedef Common::HashMap<Common::String, Builtin *, Common::IgnoreCase_Hash, Comm
typedef Common::HashMap<Common::String, TheEntity *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityHash;
typedef Common::HashMap<Common::String, TheEntityField *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> TheEntityFieldHash;
-struct ScriptContext {
- Common::String name;
- Common::Array<Symbol> functions; // used only by bytecode
- Common::HashMap<uint32, Symbol> eventHandlers;
- SymbolHash functionHandlers;
- Common::Array<Datum> constants;
+class ScriptContext {
+public:
+ Common::String _name;
+ Common::Array<Symbol> _functions; // used only by bytecode
+ Common::HashMap<uint32, Symbol> _eventHandlers;
+ SymbolHash _functionHandlers;
+ Common::Array<Datum> _constants;
+ Common::Array<Common::String> _propNames;
+
+ Datum getObject();
+
+private:
+ Datum _obj;
};
enum ObjectType {
diff --git a/engines/director/score.h b/engines/director/score.h
index 20a1dcb57a..0c3c5258e4 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -225,6 +225,8 @@ public:
uint16 _framesRan; // used by kDebugFewFramesOnly
+ int _lingoArchive;
+
private:
uint16 _versionMinor;
uint16 _versionMajor;
@@ -242,7 +244,6 @@ private:
uint16 _castArrayEnd;
uint16 _movieScriptCount;
Lingo *_lingo;
- int _lingoArchive;
DirectorSound *_soundManager;
DirectorEngine *_vm;
};
More information about the Scummvm-git-logs
mailing list