[Scummvm-git-logs] scummvm master -> 9e9fa4810170dbe2d7452d33a92ca870a8457c50
ysj1173886760
42030331+ysj1173886760 at users.noreply.github.com
Wed Jul 28 07:07:24 UTC 2021
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
119253ce3f DIRECTOR: add sorted attribute for array type datum.
50ab7abaab DIRECTOR: keep the order when appending the elements when the list is sorted.
bda38f5c03 DIRECTOR: keep the order when appending the sorted property list
9e9fa48101 DIRECTOR: replace magic numbers by using constants.
Commit: 119253ce3f69b46db5ce60703bf4a86e5b694a2c
https://github.com/scummvm/scummvm/commit/119253ce3f69b46db5ce60703bf4a86e5b694a2c
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-28T14:53:13+08:00
Commit Message:
DIRECTOR: add sorted attribute for array type datum.
Changed paths:
engines/director/director.cpp
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-bytecode.cpp
engines/director/lingo/lingo-code.cpp
engines/director/lingo/lingo-object.cpp
engines/director/lingo/lingo-the.cpp
engines/director/lingo/lingo-utils.h
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 571185b788..7842d1df35 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -73,7 +73,7 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam
_stage = nullptr;
_windowList = new Datum;
_windowList->type = ARRAY;
- _windowList->u.farr = new DatumArray;
+ _windowList->u.farr = new FArray;
_currentWindow = nullptr;
_lingo = nullptr;
_version = getDescriptionVersion();
@@ -198,12 +198,12 @@ Common::Error DirectorEngine::run() {
g_lingo->saveStateToWindow();
if (loop) {
- DatumArray *windowList = g_lingo->_windowList.u.farr;
- for (uint i = 0; i < windowList->size(); i++) {
- if ((*windowList)[i].type != OBJECT || (*windowList)[i].u.obj->getObjType() != kWindowObj)
+ FArray *windowList = g_lingo->_windowList.u.farr;
+ for (uint i = 0; i < windowList->arr.size(); i++) {
+ if (windowList->arr[i].type != OBJECT || windowList->arr[i].u.obj->getObjType() != kWindowObj)
continue;
- _currentWindow = static_cast<Window *>((*windowList)[i].u.obj);
+ _currentWindow = static_cast<Window *>(windowList->arr[i].u.obj);
g_lingo->loadStateFromWindow();
_currentWindow->step();
g_lingo->saveStateToWindow();
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 25edcd51a7..441e9686c8 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -531,12 +531,12 @@ void LB::b_addAt(int nargs) {
int index = indexD.asInt();
TYPECHECK(list, ARRAY);
- int size = list.u.farr->size();
+ int size = list.u.farr->arr.size();
if (index > size) {
for (int i = 0; i < index - size - 1; i++)
- list.u.farr->push_back(Datum(0));
+ list.u.farr->arr.push_back(Datum(0));
}
- list.u.farr->insert_at(index - 1, value);
+ list.u.farr->arr.insert_at(index - 1, value);
}
void LB::b_addProp(int nargs) {
@@ -547,7 +547,7 @@ void LB::b_addProp(int nargs) {
TYPECHECK(list, PARRAY);
PCell cell = PCell(prop, value);
- list.u.parr->push_back(cell);
+ list.u.parr->arr.push_back(cell);
}
void LB::b_append(int nargs) {
@@ -556,7 +556,7 @@ void LB::b_append(int nargs) {
TYPECHECK(list, ARRAY);
- list.u.farr->push_back(value);
+ list.u.farr->arr.push_back(value);
}
void LB::b_count(int nargs) {
@@ -566,10 +566,10 @@ void LB::b_count(int nargs) {
switch (list.type) {
case ARRAY:
- result.u.i = list.u.farr->size();
+ result.u.i = list.u.farr->arr.size();
break;
case PARRAY:
- result.u.i = list.u.parr->size();
+ result.u.i = list.u.parr->arr.size();
break;
default:
TYPECHECK2(list, ARRAY, PARRAY);
@@ -587,10 +587,10 @@ void LB::b_deleteAt(int nargs) {
switch (list.type) {
case ARRAY:
- list.u.farr->remove_at(index - 1);
+ list.u.farr->arr.remove_at(index - 1);
break;
case PARRAY:
- list.u.parr->remove_at(index - 1);
+ list.u.parr->arr.remove_at(index - 1);
break;
default:
break;
@@ -611,7 +611,7 @@ void LB::b_deleteProp(int nargs) {
case PARRAY: {
int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
if (index > 0) {
- list.u.parr->remove_at(index - 1);
+ list.u.parr->arr.remove_at(index - 1);
}
break;
}
@@ -644,8 +644,8 @@ void LB::b_findPosNear(int nargs) {
// FIXME: Integrate with compareTo framework
prop.toLowercase();
- for (uint i = 0; i < list.u.parr->size(); i++) {
- Datum p = list.u.parr->operator[](i).p;
+ for (uint i = 0; i < list.u.parr->arr.size(); i++) {
+ Datum p = list.u.parr->arr[i].p;
Common::String tgt = p.asString();
tgt.toLowercase();
if (tgt.find(prop.c_str()) == 0) {
@@ -671,7 +671,7 @@ void LB::b_getaProp(int nargs) {
Datum d;
int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
if (index > 0) {
- d = list.u.parr->operator[](index - 1).v;
+ d = list.u.parr->arr[index - 1].v;
}
g_lingo->push(d);
break;
@@ -690,11 +690,11 @@ void LB::b_getAt(int nargs) {
switch (list.type) {
case ARRAY:
ARRBOUNDSCHECK(index, list);
- g_lingo->push(list.u.farr->operator[](index - 1));
+ g_lingo->push(list.u.farr->arr[index - 1]);
break;
case PARRAY:
ARRBOUNDSCHECK(index, list);
- g_lingo->push(list.u.parr->operator[](index - 1).v);
+ g_lingo->push(list.u.parr->arr[index - 1].v);
break;
default:
TYPECHECK2(list, ARRAY, PARRAY);
@@ -705,10 +705,10 @@ void LB::b_getLast(int nargs) {
Datum list = g_lingo->pop();
switch (list.type) {
case ARRAY:
- g_lingo->push(list.u.farr->back());
+ g_lingo->push(list.u.farr->arr.back());
break;
case PARRAY:
- g_lingo->push(list.u.parr->back().v);
+ g_lingo->push(list.u.parr->arr.back().v);
break;
default:
TYPECHECK(list, ARRAY);
@@ -729,7 +729,7 @@ void LB::b_getOne(int nargs) {
Datum d;
int index = LC::compareArrays(LC::eqData, list, val, true, true).u.i;
if (index > 0) {
- d = list.u.parr->operator[](index - 1).p;
+ d = list.u.parr->arr[index - 1].p;
}
g_lingo->push(d);
break;
@@ -782,7 +782,7 @@ void LB::b_getProp(int nargs) {
case PARRAY: {
int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
if (index > 0) {
- g_lingo->push(list.u.parr->operator[](index - 1).v);
+ g_lingo->push(list.u.parr->arr[index - 1].v);
} else {
error("b_getProp: Property %s not found", prop.asString().c_str());
}
@@ -800,16 +800,16 @@ void LB::b_getPropAt(int nargs) {
TYPECHECK(list, PARRAY);
int index = indexD.asInt();
- g_lingo->push(list.u.parr->operator[](index - 1).p);
+ g_lingo->push(list.u.parr->arr[index - 1].p);
}
void LB::b_list(int nargs) {
Datum result;
result.type = ARRAY;
- result.u.farr = new DatumArray;
+ result.u.farr = new FArray;
for (int i = 0; i < nargs; i++)
- result.u.farr->insert_at(0, g_lingo->pop());
+ result.u.farr->arr.insert_at(0, g_lingo->pop());
g_lingo->push(result);
}
@@ -831,9 +831,9 @@ void LB::b_max(int nargs) {
if (nargs == 1) {
Datum d = g_lingo->pop();
if (d.type == ARRAY) {
- uint arrsize = d.u.farr->size();
+ uint arrsize = d.u.farr->arr.size();
for (uint i = 0; i < arrsize; i++) {
- Datum item = d.u.farr->operator[](i);
+ Datum item = d.u.farr->arr[i];
if (i == 0 || item.compareTo(max) > 0) {
max = item;
}
@@ -864,9 +864,9 @@ void LB::b_min(int nargs) {
if (nargs == 1) {
Datum d = g_lingo->pop();
if (d.type == ARRAY) {
- uint arrsize = d.u.farr->size();
+ uint arrsize = d.u.farr->arr.size();
for (uint i = 0; i < arrsize; i++) {
- Datum item = d.u.farr->operator[](i);
+ Datum item = d.u.farr->arr[i];
if (i == 0 || item.compareTo(min) < 0) {
min = item;
}
@@ -904,10 +904,10 @@ void LB::b_setaProp(int nargs) {
case PARRAY: {
int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
if (index > 0) {
- list.u.parr->operator[](index - 1).v = value;
+ list.u.parr->arr[index - 1].v = value;
} else {
PCell cell = PCell(prop, value);
- list.u.parr->push_back(cell);
+ list.u.parr->arr.push_back(cell);
}
break;
}
@@ -927,18 +927,18 @@ void LB::b_setAt(int nargs) {
switch (list.type) {
case ARRAY:
- if ((uint)index <= list.u.farr->size()) {
- list.u.farr->operator[](index - 1) = value;
+ if ((uint)index <= list.u.farr->arr.size()) {
+ list.u.farr->arr[index - 1] = value;
} else {
- int inserts = index - list.u.farr->size();
+ int inserts = index - list.u.farr->arr.size();
while (--inserts)
- list.u.farr->push_back(Datum(0));
- list.u.farr->push_back(value);
+ list.u.farr->arr.push_back(Datum(0));
+ list.u.farr->arr.push_back(value);
}
break;
case PARRAY:
ARRBOUNDSCHECK(index, list);
- list.u.parr->operator[](index - 1).v = value;
+ list.u.parr->arr[index - 1].v = value;
break;
default:
break;
@@ -953,7 +953,7 @@ void LB::b_setProp(int nargs) {
int index = LC::compareArrays(LC::eqData, list, prop, true).u.i;
if (index > 0) {
- list.u.parr->operator[](index - 1).v = value;
+ list.u.parr->arr[index - 1].v = value;
} else {
warning("b_setProp: Property not found");
}
@@ -975,10 +975,10 @@ void LB::b_sort(int nargs) {
Datum list = g_lingo->pop();
if (list.type == ARRAY) {
- Common::sort(list.u.farr->begin(), list.u.farr->end(), sortArrayHelper);
+ Common::sort(list.u.farr->arr.begin(), list.u.farr->arr.end(), sortArrayHelper);
} else if (list.type == PARRAY) {
- Common::sort(list.u.parr->begin(), list.u.parr->end(), sortPArrayHelper);
+ Common::sort(list.u.parr->arr.begin(), list.u.parr->arr.end(), sortPArrayHelper);
} else {
warning("LB::b_sort can not handle argument of type %s", list.type2str());
@@ -1565,8 +1565,8 @@ void LB::b_cursor(int nargs) {
Datum d = g_lingo->pop();
if (d.type == ARRAY) {
- Datum sprite = d.u.farr->operator[](0);
- Datum mask = d.u.farr->operator[](1);
+ Datum sprite = d.u.farr->arr[0];
+ Datum mask = d.u.farr->arr[1];
g_lingo->func_cursor(sprite.asMemberID(), mask.asMemberID());
} else {
@@ -2254,10 +2254,10 @@ void LB::b_point(int nargs) {
Datum x(g_lingo->pop().asFloat());
Datum d;
- d.u.farr = new DatumArray;
+ d.u.farr = new FArray;
- d.u.farr->push_back(x);
- d.u.farr->push_back(y);
+ d.u.farr->arr.push_back(x);
+ d.u.farr->arr.push_back(y);
d.type = POINT;
g_lingo->push(d);
@@ -2272,22 +2272,22 @@ void LB::b_rect(int nargs) {
Datum top(g_lingo->pop().asInt());
Datum left(g_lingo->pop().asInt());
- d.u.farr = new DatumArray;
- d.u.farr->push_back(left);
- d.u.farr->push_back(top);
- d.u.farr->push_back(right);
- d.u.farr->push_back(bottom);
+ d.u.farr = new FArray;
+ d.u.farr->arr.push_back(left);
+ d.u.farr->arr.push_back(top);
+ d.u.farr->arr.push_back(right);
+ d.u.farr->arr.push_back(bottom);
d.type = RECT;
} else if (nargs == 2) {
Datum p2 = g_lingo->pop();
Datum p1 = g_lingo->pop();
if (p2.type == POINT && p1.type == POINT) {
- d.u.farr = new DatumArray;
- d.u.farr->push_back(p1.u.farr->operator[](0));
- d.u.farr->push_back(p1.u.farr->operator[](1));
- d.u.farr->push_back(p2.u.farr->operator[](0));
- d.u.farr->push_back(p2.u.farr->operator[](1));
+ d.u.farr = new FArray;
+ d.u.farr->arr.push_back(p1.u.farr->arr[0]);
+ d.u.farr->arr.push_back(p1.u.farr->arr[1]);
+ d.u.farr->arr.push_back(p2.u.farr->arr[0]);
+ d.u.farr->arr.push_back(p2.u.farr->arr[1]);
d.type = RECT;
} else
warning("LB::b_rect: Rect need 2 Point variable as argument");
@@ -2305,8 +2305,8 @@ void LB::b_intersect(int nargs) {
Datum d;
Datum r2 = g_lingo->pop();
Datum r1 = g_lingo->pop();
- Common::Rect rect1(r1.u.farr->operator[](0).asInt(), r1.u.farr->operator[](1).asInt(), r1.u.farr->operator[](2).asInt(), r1.u.farr->operator[](3).asInt());
- Common::Rect rect2(r2.u.farr->operator[](0).asInt(), r2.u.farr->operator[](1).asInt(), r2.u.farr->operator[](2).asInt(), r2.u.farr->operator[](3).asInt());
+ Common::Rect rect1(r1.u.farr->arr[0].asInt(), r1.u.farr->arr[1].asInt(), r1.u.farr->arr[2].asInt(), r1.u.farr->arr[3].asInt());
+ Common::Rect rect2(r2.u.farr->arr[0].asInt(), r2.u.farr->arr[1].asInt(), r2.u.farr->arr[2].asInt(), r2.u.farr->arr[3].asInt());
d.type = INT;
d.u.i = rect1.intersects(rect2);
@@ -2318,8 +2318,8 @@ void LB::b_inside(int nargs) {
Datum d;
Datum r2 = g_lingo->pop();
Datum p1 = g_lingo->pop();
- Common::Rect rect2(r2.u.farr->operator[](0).asInt(), r2.u.farr->operator[](1).asInt(), r2.u.farr->operator[](2).asInt(), r2.u.farr->operator[](3).asInt());
- Common::Point point1(p1.u.farr->operator[](0).asInt(), p1.u.farr->operator[](1).asInt());
+ Common::Rect rect2(r2.u.farr->arr[0].asInt(), r2.u.farr->arr[1].asInt(), r2.u.farr->arr[2].asInt(), r2.u.farr->arr[3].asInt());
+ Common::Point point1(p1.u.farr->arr[0].asInt(), p1.u.farr->arr[1].asInt());
d.type = INT;
d.u.i = rect2.contains(point1);
@@ -2555,13 +2555,13 @@ void LB::b_script(int nargs) {
void LB::b_window(int nargs) {
Datum d = g_lingo->pop();
Common::String windowName = d.asString();
- DatumArray *windowList = g_lingo->_windowList.u.farr;
+ FArray *windowList = g_lingo->_windowList.u.farr;
- for (uint i = 0; i < windowList->size(); i++) {
- if ((*windowList)[i].type != OBJECT || (*windowList)[i].u.obj->getObjType() != kWindowObj)
+ for (uint i = 0; i < windowList->arr.size(); i++) {
+ if (windowList->arr[i].type != OBJECT || windowList->arr[i].u.obj->getObjType() != kWindowObj)
continue;
- Window *window = static_cast<Window *>((*windowList)[i].u.obj);
+ Window *window = static_cast<Window *>(windowList->arr[i].u.obj);
if (window->getName().equalsIgnoreCase(windowName)) {
g_lingo->push(window);
return;
@@ -2575,7 +2575,7 @@ void LB::b_window(int nargs) {
window->resize(1, 1, true);
window->setVisible(false, true);
wm->addWindowInitialized(window);
- windowList->push_back(window);
+ windowList->arr.push_back(window);
g_lingo->push(window);
}
@@ -2630,8 +2630,8 @@ void LB::b_getVolumes(int nargs) {
// for its volume name.
Datum d;
d.type = ARRAY;
- d.u.farr = new DatumArray;
- d.u.farr->push_back(Datum("Buried in Time\252 1"));
+ d.u.farr = new FArray;
+ d.u.farr->arr.push_back(Datum("Buried in Time\252 1"));
g_lingo->push(d);
}
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index e6e855ddea..42d1a7913f 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -502,7 +502,7 @@ void LC::cb_proplist() {
Datum result;
result.type = PARRAY;
- result.u.parr = new PropertyArray;
+ result.u.parr = new PArray;
arraySize /= 2;
for (int i = 0; i < arraySize; i++) {
@@ -510,7 +510,7 @@ void LC::cb_proplist() {
Datum p = g_lingo->pop();
PCell cell = PCell(p, v);
- result.u.parr->insert_at(0, cell);
+ result.u.parr->arr.insert_at(0, cell);
};
if (nargs.u.i % 2)
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index d3119ce797..531395f109 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -451,10 +451,10 @@ void LC::c_arraypush() {
int arraySize = g_lingo->readInt();
d.type = ARRAY;
- d.u.farr = new DatumArray;
+ d.u.farr = new FArray;
for (int i = 0; i < arraySize; i++)
- d.u.farr->insert_at(0, g_lingo->pop());
+ d.u.farr->arr.insert_at(0, g_lingo->pop());
g_lingo->push(d);
}
@@ -464,14 +464,14 @@ void LC::c_proparraypush() {
int arraySize = g_lingo->readInt();
d.type = PARRAY;
- d.u.parr = new PropertyArray;
+ d.u.parr = new PArray;
for (int i = 0; i < arraySize; i++) {
Datum v = g_lingo->pop();
Datum p = g_lingo->pop();
PCell cell = PCell(p, v);
- d.u.parr->insert_at(0, cell);
+ d.u.parr->arr.insert_at(0, cell);
}
g_lingo->push(d);
@@ -626,25 +626,25 @@ Datum LC::mapBinaryOp(Datum (*mapFunc)(Datum &, Datum &), Datum &d1, Datum &d2)
// At least one of d1 and d2 must be an array
uint arraySize;
if (d1.type == ARRAY && d2.type == ARRAY) {
- arraySize = MIN(d1.u.farr->size(), d2.u.farr->size());
+ arraySize = MIN(d1.u.farr->arr.size(), d2.u.farr->arr.size());
} else if (d1.type == ARRAY) {
- arraySize = d1.u.farr->size();
+ arraySize = d1.u.farr->arr.size();
} else {
- arraySize = d2.u.farr->size();
+ arraySize = d2.u.farr->arr.size();
}
Datum res;
res.type = ARRAY;
- res.u.farr = new DatumArray(arraySize);
+ res.u.farr = new FArray(arraySize);
Datum a = d1;
Datum b = d2;
for (uint i = 0; i < arraySize; i++) {
if (d1.type == ARRAY) {
- a = d1.u.farr->operator[](i);
+ a = d1.u.farr->arr[i];
}
if (d2.type == ARRAY) {
- b = d2.u.farr->operator[](i);
+ b = d2.u.farr->arr[i];
}
- res.u.farr->operator[](i) = mapFunc(a, b);
+ res.u.farr->arr[i] = mapFunc(a, b);
}
return res;
}
@@ -779,12 +779,12 @@ void LC::c_mod() {
Datum LC::negateData(Datum &d) {
if (d.type == ARRAY) {
- uint arraySize = d.u.farr->size();
+ uint arraySize = d.u.farr->arr.size();
Datum res;
res.type = ARRAY;
- res.u.farr = new DatumArray(arraySize);
+ res.u.farr = new FArray(arraySize);
for (uint i = 0; i < arraySize; i++) {
- res.u.farr->operator[](i) = LC::negateData(d.u.farr->operator[](i));
+ res.u.farr->arr[i] = LC::negateData(d.u.farr->arr[i]);
}
return res;
}
@@ -1184,17 +1184,17 @@ Datum LC::compareArrays(Datum (*compareFunc)(Datum, Datum), Datum d1, Datum d2,
// At least one of d1 and d2 must be an array
uint arraySize;
if (d1.type == ARRAY && d2.type == ARRAY) {
- arraySize = MIN(d1.u.farr->size(), d2.u.farr->size());
+ arraySize = MIN(d1.u.farr->arr.size(), d2.u.farr->arr.size());
} else if (d1.type == PARRAY && d2.type == PARRAY) {
- arraySize = MIN(d1.u.parr->size(), d2.u.parr->size());
+ arraySize = MIN(d1.u.parr->arr.size(), d2.u.parr->arr.size());
} else if (d1.type == ARRAY) {
- arraySize = d1.u.farr->size();
+ arraySize = d1.u.farr->arr.size();
} else if (d1.type == PARRAY) {
- arraySize = d1.u.parr->size();
+ arraySize = d1.u.parr->arr.size();
} else if (d2.type == ARRAY) {
- arraySize = d2.u.farr->size();
+ arraySize = d2.u.farr->arr.size();
} else if (d2.type == PARRAY) {
- arraySize = d2.u.parr->size();
+ arraySize = d2.u.parr->arr.size();
} else {
warning("LC::compareArrays(): Called with wrong data types: %s and %s", d1.type2str(), d2.type2str());
return Datum(0);
@@ -1207,16 +1207,16 @@ Datum LC::compareArrays(Datum (*compareFunc)(Datum, Datum), Datum d1, Datum d2,
Datum b = d2;
for (uint i = 0; i < arraySize; i++) {
if (d1.type == ARRAY) {
- a = d1.u.farr->operator[](i);
+ a = d1.u.farr->arr[i];
} else if (d1.type == PARRAY) {
- PCell t = d1.u.parr->operator[](i);
+ PCell t = d1.u.parr->arr[i];
a = value ? t.v : t.p;
}
if (d2.type == ARRAY) {
- b = d2.u.farr->operator[](i);
+ b = d2.u.farr->arr[i];
} else if (d2.type == PARRAY) {
- PCell t = d2.u.parr->operator[](i);
+ PCell t = d2.u.parr->arr[i];
b = value ? t.v : t.p;
}
@@ -1239,11 +1239,11 @@ Datum LC::compareArrays(Datum (*compareFunc)(Datum, Datum), Datum d1, Datum d2,
Datum LC::eqData(Datum d1, Datum d2) {
// Lingo doesn't bother checking list equality if the left is longer
if (d1.type == ARRAY && d2.type == ARRAY &&
- d1.u.farr->size() > d2.u.farr->size()) {
+ d1.u.farr->arr.size() > d2.u.farr->arr.size()) {
return Datum(0);
}
if (d1.type == PARRAY && d2.type == PARRAY &&
- d1.u.parr->size() > d2.u.parr->size()) {
+ d1.u.parr->arr.size() > d2.u.parr->arr.size()) {
return Datum(0);
}
if (d1.type == ARRAY || d2.type == ARRAY ||
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 222b1d6e0a..9bebf22403 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -480,27 +480,27 @@ void LM::m_close(int nargs) {
void LM::m_forget(int nargs) {
Window *me = static_cast<Window *>(g_lingo->_currentMe.u.obj);
- DatumArray *windowList = g_lingo->_windowList.u.farr;
+ FArray *windowList = g_lingo->_windowList.u.farr;
uint i;
- for (i = 0; i < windowList->size(); i++) {
- if ((*windowList)[i].type != OBJECT || (*windowList)[i].u.obj->getObjType() != kWindowObj)
+ for (i = 0; i < windowList->arr.size(); i++) {
+ if (windowList->arr[i].type != OBJECT || windowList->arr[i].u.obj->getObjType() != kWindowObj)
continue;
- Window *window = static_cast<Window *>((*windowList)[i].u.obj);
+ Window *window = static_cast<Window *>(windowList->arr[i].u.obj);
if (window == me)
break;
}
- if (i < windowList->size())
- windowList->remove_at(i);
+ if (i < windowList->arr.size())
+ windowList->arr.remove_at(i);
// remove me from global vars
for (DatumHash::iterator it = g_lingo->_globalvars.begin(); it != g_lingo->_globalvars.end(); ++it) {
if (it->_value.type != OBJECT || it->_value.u.obj->getObjType() != kWindowObj)
continue;
- Window *window = static_cast<Window *>((*windowList)[i].u.obj);
+ Window *window = static_cast<Window *>(windowList->arr[i].u.obj);
if (window == me)
g_lingo->_globalvars[it->_key] = 0;
}
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 8462b8d9d3..22405b997e 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -403,10 +403,10 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
d = getTheChunk(id, field);
break;
case kTheClickLoc:
- d.u.farr = new DatumArray;
+ d.u.farr = new FArray;
- d.u.farr->push_back(movie->_lastClickPos.x);
- d.u.farr->push_back(movie->_lastClickPos.y);
+ d.u.farr->arr.push_back(movie->_lastClickPos.x);
+ d.u.farr->arr.push_back(movie->_lastClickPos.y);
d.type = POINT;
break;
case kTheClickOn:
@@ -1158,11 +1158,11 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
d.u.i = channel->_cursor._cursorResId;
} else {
d.type = ARRAY;
- d.u.farr = new DatumArray(2);
+ d.u.farr = new FArray(2);
// TODO: How is this handled with multiple casts in D5?
- d.u.farr->operator[](0) = (int)channel->_cursor._cursorCastId.member;
- d.u.farr->operator[](1) = (int)channel->_cursor._cursorMaskId.member;
+ d.u.farr->arr[0] = (int)channel->_cursor._cursorCastId.member;
+ d.u.farr->arr[1] = (int)channel->_cursor._cursorMaskId.member;
}
break;
case kTheEditableText:
@@ -1188,9 +1188,9 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
break;
case kTheLoc:
d.type = POINT;
- d.u.farr = new DatumArray;
- d.u.farr->push_back(channel->_currentPoint.x);
- d.u.farr->push_back(channel->_currentPoint.y);
+ d.u.farr = new FArray;
+ d.u.farr->arr.push_back(channel->_currentPoint.x);
+ d.u.farr->arr.push_back(channel->_currentPoint.y);
break;
case kTheLocH:
d.u.i = channel->_currentPoint.x;
@@ -1219,11 +1219,11 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
case kTheRect:
// let compiler to optimize this
d.type = RECT;
- d.u.farr = new DatumArray;
- d.u.farr->push_back(channel->getBbox().left);
- d.u.farr->push_back(channel->getBbox().top);
- d.u.farr->push_back(channel->getBbox().right);
- d.u.farr->push_back(channel->getBbox().bottom);
+ d.u.farr = new FArray;
+ d.u.farr->arr.push_back(channel->getBbox().left);
+ d.u.farr->arr.push_back(channel->getBbox().top);
+ d.u.farr->arr.push_back(channel->getBbox().right);
+ d.u.farr->arr.push_back(channel->getBbox().bottom);
break;
case kTheRight:
d.u.i = channel->getBbox().right;
@@ -1360,9 +1360,9 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
if (d.type == INT && channel->_cursor._cursorResId != d.asInt()) {
channel->_cursor.readFromResource(d.asInt());
score->_cursorDirty = true;
- } else if (d.type == ARRAY && d.u.farr->size() == 2) {
- CastMemberID cursorId = d.u.farr->operator[](0).asMemberID();
- CastMemberID maskId = d.u.farr->operator[](1).asMemberID();
+ } else if (d.type == ARRAY && d.u.farr->arr.size() == 2) {
+ CastMemberID cursorId = d.u.farr->arr[0].asMemberID();
+ CastMemberID maskId = d.u.farr->arr[1].asMemberID();
if (cursorId == channel->_cursor._cursorCastId &&
maskId == channel->_cursor._cursorMaskId)
@@ -1744,7 +1744,7 @@ void Lingo::getObjectProp(Datum &obj, Common::String &propName) {
if (obj.type == PARRAY) {
int index = LC::compareArrays(LC::eqData, obj, propName, true).u.i;
if (index > 0) {
- d = obj.u.parr->operator[](index - 1).v;
+ d = obj.u.parr->arr[index - 1].v;
}
g_lingo->push(d);
return;
@@ -1796,10 +1796,10 @@ void Lingo::setObjectProp(Datum &obj, Common::String &propName, Datum &val) {
} else if (obj.type == PARRAY) {
int index = LC::compareArrays(LC::eqData, obj, propName, true).u.i;
if (index > 0) {
- obj.u.parr->operator[](index - 1).v = val;
+ obj.u.parr->arr[index - 1].v = val;
} else {
PCell cell = PCell(propName, val);
- obj.u.parr->push_back(cell);
+ obj.u.parr->arr.push_back(cell);
}
} else if (obj.type == CASTREF) {
Movie *movie = _vm->getCurrentMovie();
diff --git a/engines/director/lingo/lingo-utils.h b/engines/director/lingo/lingo-utils.h
index 2ff02a8219..0ef36a2708 100644
--- a/engines/director/lingo/lingo-utils.h
+++ b/engines/director/lingo/lingo-utils.h
@@ -49,8 +49,8 @@
}
#define ARRBOUNDSCHECK(idx,array) \
- if ((idx)-1 < 0 || (idx) > (int)(array).u.farr->size()) { \
- warning("%s: index out of bounds (%d of %d)", __FUNCTION__, (idx), (array).u.farr->size()); \
+ if ((idx)-1 < 0 || (idx) > (int)(array).u.farr->arr.size()) { \
+ warning("%s: index out of bounds (%d of %d)", __FUNCTION__, (idx), (array).u.farr->arr.size()); \
return; \
}
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 3e51d9e185..c0b3e3f577 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -170,7 +170,7 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
_perFrameHook = Datum();
_windowList.type = ARRAY;
- _windowList.u.farr = new DatumArray;
+ _windowList.u.farr = new FArray;
_compiler = new LingoCompiler;
@@ -635,11 +635,11 @@ Datum::Datum(const CastMemberID &val) {
Datum::Datum(const Common::Rect &rect) {
type = RECT;
- u.farr = new DatumArray;
- u.farr->push_back(Datum(rect.left));
- u.farr->push_back(Datum(rect.top));
- u.farr->push_back(Datum(rect.right));
- u.farr->push_back(Datum(rect.bottom));
+ u.farr = new FArray;
+ u.farr->arr.push_back(Datum(rect.left));
+ u.farr->arr.push_back(Datum(rect.top));
+ u.farr->arr.push_back(Datum(rect.right));
+ u.farr->arr.push_back(Datum(rect.bottom));
}
void Datum::reset() {
@@ -853,10 +853,10 @@ Common::String Datum::asString(bool printonly) const {
case ARRAY:
s += "[";
- for (uint i = 0; i < u.farr->size(); i++) {
+ for (uint i = 0; i < u.farr->arr.size(); i++) {
if (i > 0)
s += ", ";
- Datum d = u.farr->operator[](i);
+ Datum d = u.farr->arr[i];
s += d.asString(printonly);
}
@@ -864,13 +864,13 @@ Common::String Datum::asString(bool printonly) const {
break;
case PARRAY:
s = "[";
- if (u.parr->size() == 0)
+ if (u.parr->arr.size() == 0)
s += ":";
- for (uint i = 0; i < u.parr->size(); i++) {
+ for (uint i = 0; i < u.parr->arr.size(); i++) {
if (i > 0)
s += ", ";
- Datum p = u.parr->operator[](i).p;
- Datum v = u.parr->operator[](i).v;
+ Datum p = u.parr->arr[i].p;
+ Datum v = u.parr->arr[i].v;
s += Common::String::format("%s:%s", p.asString(printonly).c_str(), v.asString(printonly).c_str());
}
@@ -878,20 +878,20 @@ Common::String Datum::asString(bool printonly) const {
break;
case POINT:
s = "point(";
- for (uint i = 0; i < u.farr->size(); i++) {
+ for (uint i = 0; i < u.farr->arr.size(); i++) {
if (i > 0)
s += ", ";
- s += Common::String::format("%d", u.farr->operator[](i).asInt());
+ s += Common::String::format("%d", u.farr->arr[i].asInt());
}
s += ")";
break;
case RECT:
s = "rect(";
- for (uint i = 0; i < u.farr->size(); i++) {
+ for (uint i = 0; i < u.farr->arr.size(); i++) {
if (i > 0)
s += ", ";
- s += Common::String::format("%d", u.farr->operator[](i).asInt());
+ s += Common::String::format("%d", u.farr->arr[i].asInt());
}
s += ")";
@@ -916,7 +916,7 @@ Common::Point Datum::asPoint() const {
return Common::Point(0, 0);
}
- return Common::Point(u.farr->operator[](0).asInt(), u.farr->operator[](1).asInt());
+ return Common::Point(u.farr->arr[0].asInt(), u.farr->arr[1].asInt());
}
bool Datum::isRef() const {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 569662504e..ff42f08239 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -109,6 +109,25 @@ struct Symbol { /* symbol table entry */
~Symbol();
};
+struct PArray {
+ bool _sorted;
+ PropertyArray arr;
+
+ PArray() : _sorted(false) {}
+
+ PArray(int size) : _sorted(false), arr(size) {}
+};
+
+struct FArray {
+ bool _sorted;
+ DatumArray arr;
+
+ FArray() : _sorted(false) {}
+
+ FArray(int size) : _sorted(false), arr(size) {}
+};
+
+
struct Datum { /* interpreter stack type */
DatumType type;
@@ -116,8 +135,8 @@ struct Datum { /* interpreter stack type */
int i; /* INT, ARGC, ARGCNORET */
double f; /* FLOAT */
Common::String *s; /* STRING, VARREF, OBJECT */
- DatumArray *farr; /* ARRAY, POINT, RECT */
- PropertyArray *parr; /* PARRAY */
+ FArray *farr; /* ARRAY, POINT, RECT */
+ PArray *parr; /* PARRAY */
AbstractObject *obj; /* OBJECT */
ChunkReference *cref; /* CHUNKREF */
CastMemberID *cast; /* CASTREF, FIELDREF */
Commit: 50ab7abaabb38a9f1efc3ffba806ea9b7ea224d2
https://github.com/scummvm/scummvm/commit/50ab7abaabb38a9f1efc3ffba806ea9b7ea224d2
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-28T14:53:13+08:00
Commit Message:
DIRECTOR: keep the order when appending the elements when the list is sorted.
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 441e9686c8..aa98aa73a3 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -556,7 +556,22 @@ void LB::b_append(int nargs) {
TYPECHECK(list, ARRAY);
- list.u.farr->arr.push_back(value);
+ if (list.u.farr->_sorted) {
+ if (list.u.farr->arr.empty())
+ list.u.farr->arr.push_back(value);
+ else {
+ uint pos = list.u.farr->arr.size();
+ for (uint i = 0; i < list.u.farr->arr.size(); i++) {
+ if (list.u.farr->arr[i].asInt() > value.asInt()) {
+ pos = i;
+ break;
+ }
+ }
+ list.u.farr->arr.insert_at(pos, value);
+ }
+ } else {
+ list.u.farr->arr.push_back(value);
+ }
}
void LB::b_count(int nargs) {
@@ -976,9 +991,11 @@ void LB::b_sort(int nargs) {
if (list.type == ARRAY) {
Common::sort(list.u.farr->arr.begin(), list.u.farr->arr.end(), sortArrayHelper);
+ list.u.farr->_sorted = true;
} else if (list.type == PARRAY) {
Common::sort(list.u.parr->arr.begin(), list.u.parr->arr.end(), sortPArrayHelper);
+ list.u.parr->_sorted = true;
} else {
warning("LB::b_sort can not handle argument of type %s", list.type2str());
Commit: bda38f5c03e5294d07d42009dc32b6d86ca51dd9
https://github.com/scummvm/scummvm/commit/bda38f5c03e5294d07d42009dc32b6d86ca51dd9
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-28T14:53:13+08:00
Commit Message:
DIRECTOR: keep the order when appending the sorted property list
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index aa98aa73a3..c83e588f45 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -548,6 +548,23 @@ void LB::b_addProp(int nargs) {
PCell cell = PCell(prop, value);
list.u.parr->arr.push_back(cell);
+
+ if (list.u.parr->_sorted) {
+ if (list.u.parr->arr.empty())
+ list.u.parr->arr.push_back(cell);
+ else {
+ uint pos = list.u.parr->arr.size();
+ for (uint i = 0; i < list.u.parr->arr.size(); i++) {
+ if (list.u.parr->arr[i].p.asString() > cell.p.asString()) {
+ pos = i;
+ break;
+ }
+ }
+ list.u.parr->arr.insert_at(pos, cell);
+ }
+ } else {
+ list.u.parr->arr.push_back(cell);
+ }
}
void LB::b_append(int nargs) {
Commit: 9e9fa4810170dbe2d7452d33a92ca870a8457c50
https://github.com/scummvm/scummvm/commit/9e9fa4810170dbe2d7452d33a92ca870a8457c50
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-28T15:06:52+08:00
Commit Message:
DIRECTOR: replace magic numbers by using constants.
Changed paths:
engines/director/score.cpp
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 09658daea5..5a1875472e 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -712,7 +712,7 @@ void Score::playSoundChannel(uint16 frameId) {
if (sound->isChannelPuppet(1)) {
sound->playPuppetSound(1);
- } else if (frame->_soundType1 >= 10 && frame->_soundType1 <= 15) { // 0x0f represent sample sound
+ } else if (frame->_soundType1 >= kMinSampledMenu && frame->_soundType1 <= kMaxSampledMenu) {
sound->playExternalSound(frame->_soundType1, frame->_sound1.member, 1);
} else {
sound->playCastMember(frame->_sound1, 1, false);
@@ -720,7 +720,7 @@ void Score::playSoundChannel(uint16 frameId) {
if (sound->isChannelPuppet(2)) {
sound->playPuppetSound(2);
- } else if (frame->_soundType2 >= 10 && frame->_soundType2 <= 15) {
+ } else if (frame->_soundType2 >= kMinSampledMenu && frame->_soundType2 <= kMaxSampledMenu) {
sound->playExternalSound(frame->_soundType2, frame->_sound2.member, 2);
} else {
sound->playCastMember(frame->_sound2, 2, false);
More information about the Scummvm-git-logs
mailing list