[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