[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