[Scummvm-git-logs] scummvm master -> 33975b60bd8d59f91d42e27e3112fec5b17adf66

mduggan mgithub at guarana.org
Sat Apr 25 08:43:46 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
43c1688321 ULTIMA8: Initialize callback data in midi player
33975b60bd ULTIMA8: JANITORIAL: Many small cleanups for CurrentMap


Commit: 43c16883217b768851d2ed6c04f586b2bae94620
    https://github.com/scummvm/scummvm/commit/43c16883217b768851d2ed6c04f586b2bae94620
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-25T17:38:06+09:00

Commit Message:
ULTIMA8: Initialize callback data in midi player

Changed paths:
    engines/ultima/ultima8/audio/midi_player.cpp


diff --git a/engines/ultima/ultima8/audio/midi_player.cpp b/engines/ultima/ultima8/audio/midi_player.cpp
index 857e19144a..939c69d362 100644
--- a/engines/ultima/ultima8/audio/midi_player.cpp
+++ b/engines/ultima/ultima8/audio/midi_player.cpp
@@ -33,6 +33,8 @@ MidiPlayer::MidiPlayer() {
 	MidiPlayer::createDriver();
 	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
 	_isFMSynth = MidiDriver::getMusicType(dev) == MT_ADLIB;
+	_callbackData[0] = 0;
+	_callbackData[1] = 0;
 
 	if (_driver) {
 		int retValue = _driver->open();


Commit: 33975b60bd8d59f91d42e27e3112fec5b17adf66
    https://github.com/scummvm/scummvm/commit/33975b60bd8d59f91d42e27e3112fec5b17adf66
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-25T17:43:28+09:00

Commit Message:
ULTIMA8: JANITORIAL: Many small cleanups for CurrentMap

Changed paths:
    engines/ultima/ultima8/gumps/minimap_gump.cpp
    engines/ultima/ultima8/world/current_map.cpp
    engines/ultima/ultima8/world/current_map.h


diff --git a/engines/ultima/ultima8/gumps/minimap_gump.cpp b/engines/ultima/ultima8/gumps/minimap_gump.cpp
index 5251cba7aa..4ac718eca3 100644
--- a/engines/ultima/ultima8/gumps/minimap_gump.cpp
+++ b/engines/ultima/ultima8/gumps/minimap_gump.cpp
@@ -144,7 +144,7 @@ void MiniMapGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled)
 }
 
 uint32 MiniMapGump::sampleAtPoint(int x, int y, CurrentMap *currentmap) {
-	Item *item = currentmap->traceTopItem(x, y, 1 << 15, -1, 0, ShapeInfo::SI_ROOF | ShapeInfo::SI_OCCL | ShapeInfo::SI_LAND | ShapeInfo::SI_SEA);
+	const Item *item = currentmap->traceTopItem(x, y, 1 << 15, -1, 0, ShapeInfo::SI_ROOF | ShapeInfo::SI_OCCL | ShapeInfo::SI_LAND | ShapeInfo::SI_SEA);
 
 	if (item) {
 		int32 ix, iy, iz, idx, idy, idz;
diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index 4a4857145d..ba3864ca8a 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -45,10 +45,9 @@
 namespace Ultima {
 namespace Ultima8 {
 
-using Std::list; // too messy otherwise
-typedef list<Item *> item_list;
+typedef Std::list<Item *> item_list;
 
-const int INT_MAX_VALUE = 0x7fffffff;
+static const int INT_MAX_VALUE = 0x7fffffff;
 
 CurrentMap::CurrentMap() : _currentMap(0), _eggHatcher(0),
 	  _fastXMin(-1), _fastYMin(-1), _fastXMax(-1), _fastYMax(-1) {
@@ -155,7 +154,7 @@ void CurrentMap::writeback() {
 	_eggHatcher = 0;
 }
 
-void CurrentMap::loadItems(list<Item *> itemlist, bool callCacheIn) {
+void CurrentMap::loadItems(Std::list<Item *> itemlist, bool callCacheIn) {
 	item_list::iterator iter;
 	for (iter = itemlist.begin(); iter != itemlist.end(); ++iter) {
 		Item *item = *iter;
@@ -438,6 +437,13 @@ void CurrentMap::unsetChunkFast(int32 cx, int32 cy) {
 	}
 }
 
+void CurrentMap::clipMapChunks(int &minx, int &maxx, int &miny, int &maxy) const {
+	CLIP(minx, 0, MAP_NUM_CHUNKS - 1);
+	CLIP(maxx, 0, MAP_NUM_CHUNKS - 1);
+	CLIP(miny, 0, MAP_NUM_CHUNKS - 1);
+	CLIP(maxy, 0, MAP_NUM_CHUNKS - 1);
+}
+
 void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
                             uint32 scriptsize, const Item *check, uint16 range,
                             bool recurse, int32 x, int32 y) {
@@ -451,22 +457,13 @@ void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
 		check->getFootpadWorld(xd, yd, zd);
 	}
 
-	Rect searchrange(x - xd - range, y - yd - range, 2 * range + xd, 2 * range + yd);
+	const Rect searchrange(x - xd - range, y - yd - range, 2 * range + xd, 2 * range + yd);
 
-	int minx, miny, maxx, maxy;
-
-	minx = ((x - xd - range) / _mapChunkSize) - 1;
-	maxx = ((x + range) / _mapChunkSize) + 1;
-	miny = ((y - yd - range) / _mapChunkSize) - 1;
-	maxy = ((y + range) / _mapChunkSize) + 1;
-	if (minx < 0)
-		minx = 0;
-	if (maxx >= MAP_NUM_CHUNKS)
-		maxx = MAP_NUM_CHUNKS - 1;
-	if (miny < 0)
-		miny = 0;
-	if (maxy >= MAP_NUM_CHUNKS)
-		maxy = MAP_NUM_CHUNKS - 1;
+	int minx = ((x - xd - range) / _mapChunkSize) - 1;
+	int maxx = ((x + range) / _mapChunkSize) + 1;
+	int miny = ((y - yd - range) / _mapChunkSize) - 1;
+	int maxy = ((y + range) / _mapChunkSize) + 1;
+	clipMapChunks(minx, maxx, miny, maxy);
 
 	for (int cx = minx; cx <= maxx; cx++) {
 		for (int cy = miny; cy <= maxy; cy++) {
@@ -483,17 +480,8 @@ void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
 				int32 ix, iy, iz;
 				item->getLocation(ix, iy, iz);
 
-				const ShapeInfo *info = item->getShapeInfo();
-				int32 ixd, iyd;
-
-				//!! constants
-				if (item->hasFlags(Item::FLG_FLIPPED)) {
-					ixd = 32 * info->_y;
-					iyd = 32 * info->_x;
-				} else {
-					ixd = 32 * info->_x;
-					iyd = 32 * info->_y;
-				}
+				int32 ixd, iyd, izd;
+				item->getFootpadWorld(ixd, iyd, izd);
 
 				Rect itemrect(ix - ixd, iy - iyd, ixd, iyd);
 
@@ -537,31 +525,22 @@ void CurrentMap::surfaceSearch(UCList *itemlist, const uint8 *loopscript,
                                uint32 scriptsize, ObjId check,
                                int32 origin[3], int32 dims[3],
                                bool above, bool below, bool recurse) {
-	Rect searchrange(origin[0] - dims[0], origin[1] - dims[1],
+	const Rect searchrange(origin[0] - dims[0], origin[1] - dims[1],
 	                 dims[0], dims[1]);
 
-	int32 minx, miny, maxx, maxy;
-
-	minx = ((origin[0] - dims[0]) / _mapChunkSize) - 1;
-	maxx = ((origin[0]) / _mapChunkSize) + 1;
-	miny = ((origin[1] - dims[1]) / _mapChunkSize) - 1;
-	maxy = ((origin[1]) / _mapChunkSize) + 1;
-	if (minx < 0)
-		minx = 0;
-	if (maxx >= MAP_NUM_CHUNKS)
-		maxx = MAP_NUM_CHUNKS - 1;
-	if (miny < 0)
-		miny = 0;
-	if (maxy >= MAP_NUM_CHUNKS)
-		maxy = MAP_NUM_CHUNKS - 1;
+	int32 minx = ((origin[0] - dims[0]) / _mapChunkSize) - 1;
+	int32 maxx = ((origin[0]) / _mapChunkSize) + 1;
+	int32 miny = ((origin[1] - dims[1]) / _mapChunkSize) - 1;
+	int32 maxy = ((origin[1]) / _mapChunkSize) + 1;
+	clipMapChunks(minx, maxx, miny, maxy);
 
 	for (int32 cx = minx; cx <= maxx; cx++) {
 		for (int32 cy = miny; cy <= maxy; cy++) {
-			item_list::iterator iter;
+			item_list::const_iterator iter;
 			for (iter = _items[cx][cy].begin();
 			        iter != _items[cx][cy].end(); ++iter) {
 
-				Item *item = *iter;
+				const Item *item = *iter;
 
 				if (item->getObjId() == check)
 					continue;
@@ -574,7 +553,7 @@ void CurrentMap::surfaceSearch(UCList *itemlist, const uint8 *loopscript,
 				int32 ixd, iyd, izd;
 				item->getFootpadWorld(ixd, iyd, izd);
 
-				Rect itemrect(ix - ixd, iy - iyd, ixd, iyd);
+				const Rect itemrect(ix - ixd, iy - iyd, ixd, iyd);
 
 				if (!itemrect.Overlaps(searchrange))
 					continue;
@@ -640,13 +619,11 @@ bool CurrentMap::isValidPosition(int32 x, int32 y, int32 z,
                                  uint32 shape,
                                  ObjId item, const Item **support,
                                  ObjId *roof) const {
-	int xd, yd, zd;
 	const ShapeInfo *si = GameData::get_instance()->
 	                getMainShapes()->getShapeInfo(shape);
-	//!! constants
-	xd = si->_x * 32;
-	yd = si->_y * 32;
-	zd = si->_z * 8;
+	int xd, yd, zd;
+	// Note: this assumes the shape to be placed is not flipped
+	si->getFootpadWorld(xd, yd, zd, 0);
 
 	return isValidPosition(x, y, z,
 	                       INT_MAX_VALUE / 2, INT_MAX_VALUE / 2, INT_MAX_VALUE / 2,
@@ -679,22 +656,13 @@ bool CurrentMap::isValidPosition(int32 x, int32 y, int32 z,
 	bool valid = true;
 	const Item *support = nullptr;
 	ObjId roof = 0;
-	int32 roofz = 1 << 24; //!! semi-constant
-
-	int minx, miny, maxx, maxy;
-
-	minx = ((x - xd) / _mapChunkSize) - 1;
-	maxx = (x / _mapChunkSize) + 1;
-	miny = ((y - yd) / _mapChunkSize) - 1;
-	maxy = (y / _mapChunkSize) + 1;
-	if (minx < 0)
-		minx = 0;
-	if (maxx >= MAP_NUM_CHUNKS)
-		maxx = MAP_NUM_CHUNKS - 1;
-	if (miny < 0)
-		miny = 0;
-	if (maxy >= MAP_NUM_CHUNKS)
-		maxy = MAP_NUM_CHUNKS - 1;
+	int32 roofz = INT_MAX_VALUE;
+
+	int minx = ((x - xd) / _mapChunkSize) - 1;
+	int maxx = (x / _mapChunkSize) + 1;
+	int miny = ((y - yd) / _mapChunkSize) - 1;
+	int maxy = (y / _mapChunkSize) + 1;
+	clipMapChunks(minx, maxx, miny, maxy);
 
 	for (int cx = minx; cx <= maxx; cx++) {
 		for (int cy = miny; cy <= maxy; cy++) {
@@ -774,10 +742,9 @@ bool CurrentMap::scanForValidPosition(int32 x, int32 y, int32 z, Item *item,
                                       int32 &tx, int32 &ty, int32 &tz) {
 	// TODO: clean this up. Currently the mask arrays are filled with more
 	// data than is actually used.
-
-	uint32 blockflagmask = (ShapeInfo::SI_SOLID | ShapeInfo::SI_DAMAGING);
 	static uint32 validmask[17];
 	static uint32 supportmask[17];
+	const uint32 blockflagmask = (ShapeInfo::SI_SOLID | ShapeInfo::SI_DAMAGING) & item->getShapeInfo()->_flags;
 
 	int searchdir = (movedir + 2) % 4;
 
@@ -790,8 +757,6 @@ bool CurrentMap::scanForValidPosition(int32 x, int32 y, int32 z, Item *item,
 		supportmask[i] = 0;
 	}
 
-	blockflagmask &= item->getShapeInfo()->_flags;
-
 	int32 xd, yd, zd;
 	item->getFootpadWorld(xd, yd, zd);
 
@@ -805,27 +770,18 @@ bool CurrentMap::scanForValidPosition(int32 x, int32 y, int32 z, Item *item,
 	// next, we'll loop over all objects in the area, and mark the areas
 	// overlapped and supported by each object
 
-	int minx, miny, maxx, maxy;
-
-	minx = ((x - xd) / _mapChunkSize) - 1;
-	maxx = (x / _mapChunkSize) + 1;
-	miny = ((y - yd) / _mapChunkSize) - 1;
-	maxy = (y / _mapChunkSize) + 1;
-	if (minx < 0)
-		minx = 0;
-	if (maxx >= MAP_NUM_CHUNKS)
-		maxx = MAP_NUM_CHUNKS - 1;
-	if (miny < 0)
-		miny = 0;
-	if (maxy >= MAP_NUM_CHUNKS)
-		maxy = MAP_NUM_CHUNKS - 1;
+	int minx = ((x - xd) / _mapChunkSize) - 1;
+	int maxx = (x / _mapChunkSize) + 1;
+	int miny = ((y - yd) / _mapChunkSize) - 1;
+	int maxy = (y / _mapChunkSize) + 1;
+	clipMapChunks(minx, maxx, miny, maxy);
 
 	for (int cx = minx; cx <= maxx; cx++) {
 		for (int cy = miny; cy <= maxy; cy++) {
-			item_list::iterator iter;
+			item_list::const_iterator iter;
 			for (iter = _items[cx][cy].begin();
 			        iter != _items[cx][cy].end(); ++iter) {
-				Item *citem = *iter;
+				const Item *citem = *iter;
 				if (citem->getObjId() == item->getObjId())
 					continue;
 				if (citem->hasExtFlags(Item::EXT_SPRITE))
@@ -952,20 +908,16 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
                            Std::list<SweepItem> *hit) {
 	const uint32 blockflagmask = (ShapeInfo::SI_SOLID | ShapeInfo::SI_DAMAGING);
 
-	int i;
-
-	int minx, miny, maxx, maxy;
-	minx = ((start[0] - dims[0]) / _mapChunkSize) - 1;
-	maxx = (start[0] / _mapChunkSize) + 1;
-	miny = ((start[1] - dims[1]) / _mapChunkSize) - 1;
-	maxy = (start[1] / _mapChunkSize) + 1;
+	int minx = ((start[0] - dims[0]) / _mapChunkSize) - 1;
+	int maxx = (start[0] / _mapChunkSize) + 1;
+	int miny = ((start[1] - dims[1]) / _mapChunkSize) - 1;
+	int maxy = (start[1] / _mapChunkSize) + 1;
 
 	{
-		int dminx, dminy, dmaxx, dmaxy;
-		dminx = ((end[0] - dims[0]) / _mapChunkSize) - 1;
-		dmaxx = (end[0] / _mapChunkSize) + 1;
-		dminy = ((end[1] - dims[1]) / _mapChunkSize) - 1;
-		dmaxy = (end[1] / _mapChunkSize) + 1;
+		int dminx = ((end[0] - dims[0]) / _mapChunkSize) - 1;
+		int dmaxx = (end[0] / _mapChunkSize) + 1;
+		int dminy = ((end[1] - dims[1]) / _mapChunkSize) - 1;
+		int dmaxy = (end[1] / _mapChunkSize) + 1;
 		if (dminx < minx)
 			minx = dminx;
 		if (dmaxx > maxx)
@@ -976,29 +928,18 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
 			maxy = dmaxy;
 	}
 
-	if (minx < 0)
-		minx = 0;
-	if (maxx >= MAP_NUM_CHUNKS)
-		maxx = MAP_NUM_CHUNKS - 1;
-	if (miny < 0)
-		miny = 0;
-	if (maxy >= MAP_NUM_CHUNKS)
-		maxy = MAP_NUM_CHUNKS - 1;
+	clipMapChunks(minx, maxx, miny, maxy);
 
-	// Get velocity of item
+	// Get velocity, extents, and centre of item
 	int32 vel[3];
 	int32 ext[3];
-	for (i = 0; i < 3; i++) {
+	int32 centre[3];
+	for (int i = 0; i < 3; i++) {
 		vel[i] = end[i] - start[i];
 		ext[i] = dims[i] / 2;
+		centre[i] = start[i] - ext[i];
 	}
 
-	// Centre of object
-	int32 centre[3];
-	centre[0] = start[0] - ext[0];
-	centre[1] = start[1] - ext[1];
-	centre[2] = start[2] + ext[2];
-
 //	pout << "Sweeping from (" << -ext[0] << ", " << -ext[1] << ", " << -ext[2] << ")" << Std::endl;
 //	pout << "              (" << ext[0] << ", " << ext[1] << ", " << ext[2] << ")" << Std::endl;
 //	pout << "Sweeping to   (" << vel[0]-ext[0] << ", " << vel[1]-ext[1] << ", " << vel[2]-ext[2] << ")" << Std::endl;
@@ -1009,10 +950,10 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
 
 	for (int cx = minx; cx <= maxx; cx++) {
 		for (int cy = miny; cy <= maxy; cy++) {
-			item_list::iterator iter;
+			item_list::const_iterator iter;
 			for (iter = _items[cx][cy].begin();
 			        iter != _items[cx][cy].end(); ++iter) {
-				Item *other_item = *iter;
+				const Item *other_item = *iter;
 				if (other_item->getObjId() == item)
 					continue;
 				if (other_item->hasExtFlags(Item::EXT_SPRITE))
@@ -1070,7 +1011,7 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
 
 				//find the possible first and last times
 				//of overlap along each axis
-				for (i = 0 ; i < 3; i++) {
+				for (int i = 0 ; i < 3; i++) {
 					int32 A_max = ext[i];
 					int32 A_min = -ext[i];
 					int32 B_max = other[i] + oext[i];
@@ -1134,7 +1075,7 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
 
 				// store directions in which we're being blocked
 				uint8 dirs = 0;
-				for (i = 0; i <= 2; ++i) {
+				for (int i = 0; i <= 2; ++i) {
 					if (first == u_0[i])
 						dirs |= (1 << i);
 				}
@@ -1182,8 +1123,8 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
 }
 
 
-Item *CurrentMap::traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId ignore, uint32 shflags) {
-	Item *top = nullptr;
+const Item *CurrentMap::traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId ignore, uint32 shflags) {
+	const Item *top = nullptr;
 
 	if (ztop < zbot) {
 		int32 temp = ztop;
@@ -1191,32 +1132,24 @@ Item *CurrentMap::traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId i
 		zbot = temp;
 	}
 
-	int minx, miny, maxx, maxy;
-	minx = (x / _mapChunkSize);
-	maxx = (x / _mapChunkSize) + 1;
-	miny = (y / _mapChunkSize);
-	maxy = (y / _mapChunkSize) + 1;
-	if (minx < 0)
-		minx = 0;
-	if (maxx >= MAP_NUM_CHUNKS)
-		maxx = MAP_NUM_CHUNKS - 1;
-	if (miny < 0)
-		miny = 0;
-	if (maxy >= MAP_NUM_CHUNKS)
-		maxy = MAP_NUM_CHUNKS - 1;
+	int minx = (x / _mapChunkSize);
+	int maxx = (x / _mapChunkSize) + 1;
+	int miny = (y / _mapChunkSize);
+	int maxy = (y / _mapChunkSize) + 1;
+	clipMapChunks(minx, maxx, miny, maxy);
 
 	for (int cx = minx; cx <= maxx; cx++) {
 		for (int cy = miny; cy <= maxy; cy++) {
-			item_list::iterator iter;
+			item_list::const_iterator iter;
 			for (iter = _items[cx][cy].begin();
 			        iter != _items[cx][cy].end(); ++iter) {
-				Item *item = *iter;
+				const Item *item = *iter;
 				if (item->getObjId() == ignore)
 					continue;
 				if (item->hasExtFlags(Item::EXT_SPRITE))
 					continue;
 
-				ShapeInfo *si = item->getShapeInfo();
+				const ShapeInfo *si = item->getShapeInfo();
 				if (!(si->_flags & shflags) || si->is_editor() || si->is_translucent()) continue;
 
 				int32 ix, iy, iz, ixd, iyd, izd;
@@ -1248,7 +1181,8 @@ Item *CurrentMap::traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId i
 void CurrentMap::setWholeMapFast() {
 	for (unsigned int i = 0; i < MAP_NUM_CHUNKS; ++i) {
 		for (unsigned int j = 0; j < MAP_NUM_CHUNKS; ++j) {
-			if (!isChunkFast(j, i)) setChunkFast(j, i);
+			if (!isChunkFast(j, i))
+				setChunkFast(j, i);
 		}
 	}
 }
@@ -1286,7 +1220,7 @@ uint32 CurrentMap::I_canExistAt(const uint8 *args, unsigned int /*argsize*/) {
 	ARG_UINT16(unk2); // looks like it could be an objid
 	ARG_UINT16(unk3); // always zero
 
-	CurrentMap *cm = World::get_instance()->getCurrentMap();
+	const CurrentMap *cm = World::get_instance()->getCurrentMap();
 	bool valid = cm->isValidPosition(x, y, z, shape, 0, 0, 0);
 
 	if (valid)
diff --git a/engines/ultima/ultima8/world/current_map.h b/engines/ultima/ultima8/world/current_map.h
index e14676c88d..dde70d16be 100644
--- a/engines/ultima/ultima8/world/current_map.h
+++ b/engines/ultima/ultima8/world/current_map.h
@@ -193,7 +193,7 @@ public:
 	}
 
 	// A simple trace to find the top item at a specific xy point
-	Item *traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId ignore, uint32 shflags);
+	const Item *traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId ignore, uint32 shflags);
 
 	// Set the entire map as being 'fast'
 	void setWholeMapFast();
@@ -207,6 +207,9 @@ private:
 	void loadItems(Std::list<Item *> itemlist, bool callCacheIn);
 	void createEggHatcher();
 
+	//! clip the given map chunk numbers to iterate over them safely
+	void clipMapChunks(int &minx, int &maxx, int &miny, int &maxy) const;
+
 	Map *_currentMap;
 
 	// item lists. Lots of them :-)




More information about the Scummvm-git-logs mailing list