aboutsummaryrefslogtreecommitdiff
path: root/engines/director/lingo/lingo-code.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/director/lingo/lingo-code.cpp')
-rw-r--r--engines/director/lingo/lingo-code.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 85da696a40..e0ec7e8471 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -247,7 +247,7 @@ void Lingo::c_le() {
g_lingo->push(d1);
}
-void Lingo::c_whilecode(void) {
+void Lingo::c_repeatwhilecode(void) {
Datum d;
int savepc = g_lingo->_pc;
@@ -270,6 +270,32 @@ void Lingo::c_whilecode(void) {
g_lingo->_pc = end; /* next stmt */
}
+void Lingo::c_repeatwithcode(void) {
+ Datum d;
+ int savepc = g_lingo->_pc;
+
+ int init = READ_LE_UINT32(&(*g_lingo->_currentScript)[savepc]);
+ int finish = READ_LE_UINT32(&(*g_lingo->_currentScript)[savepc + 2]);
+ int body = READ_LE_UINT32(&(*g_lingo->_currentScript)[savepc + 3]);
+ int end = READ_LE_UINT32(&(*g_lingo->_currentScript)[savepc + 4]);
+ Common::String counter((char *)&(*g_lingo->_currentScript)[savepc + 5]);
+
+ g_lingo->execute(init); /* condition */
+ d = g_lingo->pop();
+
+ while (d.val) {
+ g_lingo->execute(body); /* body */
+ if (0 /* returning */)
+ break;
+
+ g_lingo->execute(finish); /* condition */
+ d = g_lingo->pop();
+ }
+
+ //if (!returning)
+ g_lingo->_pc = end; /* next stmt */
+}
+
void Lingo::c_ifcode() {
Datum d;
int savepc = g_lingo->_pc; /* then part */