[Scummvm-git-logs] scummvm master -> e0810084ab625a29c95a1bd24fa49fcbd1568525
sev-
sev at scummvm.org
Sun Jan 19 00:41:47 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
e0810084ab DIRECTOR: LINGO: Implement c_nextRepeat()
Commit: e0810084ab625a29c95a1bd24fa49fcbd1568525
https://github.com/scummvm/scummvm/commit/e0810084ab625a29c95a1bd24fa49fcbd1568525
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-01-19T01:41:36+01:00
Commit Message:
DIRECTOR: LINGO: Implement c_nextRepeat()
Changed paths:
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo-codegen.cpp
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index f0a1a05..1644615 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -103,6 +103,7 @@ static struct FuncDescr {
{ LC::c_namepush, "c_namepush", "i" },
{ LC::c_negate, "c_negate", "" },
{ LC::c_neq, "c_neq", "" },
+ { LC::c_nextRepeat, "c_nextRepeat", "" },
{ LC::c_not, "c_not", "" },
{ LC::c_objectfieldassign,"c_objectfieldassign","sF" },
{ LC::c_objectfieldpush,"c_objectfieldpush","sF" }, // object, field
@@ -968,6 +969,8 @@ void LC::c_repeatwhilecode(void) {
while (d.u.i) {
g_lingo->execute(body + savepc - 1); /* body */
+ g_lingo->_nextRepeat = false;
+
if (g_lingo->_returning)
break;
@@ -1009,6 +1012,8 @@ void LC::c_repeatwithcode(void) {
while (true) {
g_lingo->execute(body + savepc - 1); /* body */
+ g_lingo->_nextRepeat = false;
+
if (g_lingo->_returning)
break;
@@ -1031,7 +1036,9 @@ void LC::c_repeatwithcode(void) {
}
void LC::c_nextRepeat(void) {
- warning("STUB: c_nextRepeat");
+ // loop body is a single instruction chunk which ends with
+ // STOP. Now we simulate end of execution of this chunk
+ g_lingo->_nextRepeat = true;
}
void LC::c_exitRepeat(void) {
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 0ff965f..704f20a 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -53,7 +53,7 @@
namespace Director {
void Lingo::execute(uint pc) {
- for (_pc = pc; !_returning && (*_currentScript)[_pc] != STOP;) {
+ for (_pc = pc; !_returning && (*_currentScript)[_pc] != STOP && !_nextRepeat;) {
Common::String instr = decodeInstruction(_currentScript, _pc);
uint current = _pc;
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index c7c8822..791bdee 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -52,6 +52,7 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
_currentEntityId = 0;
_pc = 0;
_returning = false;
+ _nextRepeat = false;
_indef = kStateNone;
_ignoreMe = false;
_immediateMode = false;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 59dec88..44ea261 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -83,7 +83,7 @@ struct Symbol { /* symbol table entry */
int nargs; /* number of arguments */
int maxArgs; /* maximal number of arguments, for builtins */
bool parens; /* whether parens required or not, for builitins */
-
+
bool global;
ScriptContext *ctx; /* optional script context to execute with */
@@ -285,6 +285,7 @@ public:
uint16 _currentScriptFunction;
ScriptData *_currentScript;
bool _returning;
+ bool _nextRepeat;
LexerDefineState _indef;
bool _ignoreMe;
bool _immediateMode;
More information about the Scummvm-git-logs
mailing list