[Scummvm-git-logs] scummvm master -> 2985bc6b1086c4b0bc9fd173b9ca86a00adb1a30

dreammaster paulfgilbert at gmail.com
Sat Apr 25 18:39:19 UTC 2020


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

Summary:
74f3873529 ULTIMA4: Move tile rules from being global
b54b918ce6 ULTIMA4: Move tile sets from being global
2985bc6b10 ULTIMA4: Refactor tile map from being a global


Commit: 74f3873529aa990b7c032c6118bd06a85cd997fd
    https://github.com/scummvm/scummvm/commit/74f3873529aa990b7c032c6118bd06a85cd997fd
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-25T09:58:19-07:00

Commit Message:
ULTIMA4: Move tile rules from being global

Changed paths:
    engines/ultima/ultima4/map/tile.cpp
    engines/ultima/ultima4/map/tileset.cpp
    engines/ultima/ultima4/map/tileset.h
    engines/ultima/ultima4/ultima4.cpp
    engines/ultima/ultima4/ultima4.h


diff --git a/engines/ultima/ultima4/map/tile.cpp b/engines/ultima/ultima4/map/tile.cpp
index e54b64cde8..45f339504c 100644
--- a/engines/ultima/ultima4/map/tile.cpp
+++ b/engines/ultima/ultima4/map/tile.cpp
@@ -80,10 +80,10 @@ void Tile::loadProperties(const ConfigElement &conf) {
 	/* find the rule that applies to the current tile, if there is one.
 	   if there is no rule specified, it defaults to the "default" rule */
 	if (conf.exists("rule")) {
-		rule = TileRule::findByName(conf.getString("rule"));
+		rule = g_tileRules->findByName(conf.getString("rule"));
 		if (rule == nullptr)
-			rule = TileRule::findByName("default");
-	} else rule = TileRule::findByName("default");
+			rule = g_tileRules->findByName("default");
+	} else rule = g_tileRules->findByName("default");
 
 	// Get the number of frames the tile has
 	_frames = conf.getInt("frames", 1);
diff --git a/engines/ultima/ultima4/map/tileset.cpp b/engines/ultima/ultima4/map/tileset.cpp
index 49f32a2698..8a272e7fb7 100644
--- a/engines/ultima/ultima4/map/tileset.cpp
+++ b/engines/ultima/ultima4/map/tileset.cpp
@@ -30,32 +30,43 @@
 namespace Ultima {
 namespace Ultima4 {
 
-/**
- * TileRule Class Implementation
- */
-TileRuleMap TileRule::_rules;
+TileRules *g_tileRules;
 
-TileRule *TileRule::findByName(const Common::String &name) {
-	TileRuleMap::iterator i = _rules.find(name);
-	if (i != _rules.end())
-		return i->_value;
-	return nullptr;
+TileRules::TileRules() {
+	g_tileRules = this;
+}
+
+TileRules::~TileRules() {
+	g_tileRules = nullptr;
 }
 
-void TileRule::load() {
+void TileRules::load() {
 	const Config *config = Config::getInstance();
 	Std::vector<ConfigElement> rules = config->getElement("tileRules").getChildren();
 
 	for (Std::vector<ConfigElement>::iterator i = rules.begin(); i != rules.end(); i++) {
 		TileRule *rule = new TileRule();
 		rule->initFromConf(*i);
-		TileRule::_rules[rule->_name] = rule;
+		(*this)[rule->_name] = rule;
 	}
 
-	if (TileRule::findByName("default") == nullptr)
+	if (findByName("default") == nullptr)
 		error("no 'default' rule found in tile rules");
 }
 
+TileRule *TileRules::findByName(const Common::String &name) {
+	TileRuleMap::iterator i = find(name);
+	if (i != end())
+		return i->_value;
+	return nullptr;
+}
+
+
+/*-------------------------------------------------------------------*/
+
+// Static member variables
+Tileset::TilesetMap Tileset::tilesets;
+
 bool TileRule::initFromConf(const ConfigElement &conf) {
 	uint i;
 
@@ -147,11 +158,6 @@ bool TileRule::initFromConf(const ConfigElement &conf) {
 	return true;
 }
 
-/*-------------------------------------------------------------------*/
-
-// Static member variables
-Tileset::TilesetMap Tileset::tilesets;
-
 void Tileset::loadAll() {
 	const Config *config = Config::getInstance();
 	Std::vector<ConfigElement> conf;
@@ -162,8 +168,8 @@ void Tileset::loadAll() {
 	conf = config->getElement("tilesets").getChildren();
 
 	// Load tile rules
-	if (!TileRule::_rules.size())
-		TileRule::load();
+	if (g_tileRules->empty())
+		g_tileRules->load();
 
 	// Load all of the tilesets
 	for (Std::vector<ConfigElement>::iterator i = conf.begin(); i != conf.end(); i++) {
diff --git a/engines/ultima/ultima4/map/tileset.h b/engines/ultima/ultima4/map/tileset.h
index ec1622a0bf..83ff43c05a 100644
--- a/engines/ultima/ultima4/map/tileset.h
+++ b/engines/ultima/ultima4/map/tileset.h
@@ -35,21 +35,38 @@ class Tile;
 typedef Common::HashMap<Common::String, class TileRule *> TileRuleMap;
 
 /**
- * TileRule class
+ * Tile rules
  */
-class TileRule {
+class TileRules : public TileRuleMap {
 public:
 	/**
-	 * Returns the tile rule with the given name, or nullptr if none could be found
+	 * Constructor
 	 */
-	static TileRule *findByName(const Common::String &name);
+	TileRules();
+
+	/**
+	 * Destructor
+	 */
+	~TileRules();
 
 	/**
 	 * Load tile information from xml.
 	 */
-	static void load();
-	static TileRuleMap _rules;   // A map of rule names to rules
+	void load();
 
+	/**
+	 * Returns the tile rule with the given name, or nullptr if none could be found
+	 */
+	TileRule *findByName(const Common::String &name);
+};
+
+extern TileRules *g_tileRules;
+
+/**
+ * TileRule class
+ */
+class TileRule {
+public:
 	/**
 	 * Load properties for the current rule node
 	 */
diff --git a/engines/ultima/ultima4/ultima4.cpp b/engines/ultima/ultima4/ultima4.cpp
index e2241e9335..a8e4da074b 100644
--- a/engines/ultima/ultima4/ultima4.cpp
+++ b/engines/ultima/ultima4/ultima4.cpp
@@ -49,11 +49,12 @@ Ultima4Engine *g_ultima;
 Ultima4Engine::Ultima4Engine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc) :
 		Shared::UltimaEngine(syst, gameDesc), _saveSlotToLoad(-1), _config(nullptr),
 		_context(nullptr), _dialogueLoaders(nullptr), _game(nullptr), _music(nullptr),
-		_imageLoaders(nullptr), _saveGame(nullptr), _screen(nullptr) {
+		_imageLoaders(nullptr), _saveGame(nullptr), _screen(nullptr), _tileRules(nullptr) {
 	g_ultima = this;
 	g_context = nullptr;
 	g_game = nullptr;
 	g_screen = nullptr;
+	g_tileRules = nullptr;
 }
 
 Ultima4Engine::~Ultima4Engine() {
@@ -65,6 +66,7 @@ Ultima4Engine::~Ultima4Engine() {
 	delete _music;
 	delete _saveGame;
 	delete _screen;
+	delete _tileRules;
 
 	Tileset::unloadAll();
 	ImageMgr::destroy();
@@ -87,13 +89,13 @@ bool Ultima4Engine::initialize() {
 	_imageLoaders = new ImageLoaders();
 	_music = new Music();
 	_saveGame = new SaveGame();
+	_tileRules = new TileRules();
 
 	setDebugger(new Debugger());
 	soundInit();
 	Tileset::loadAll();
 	creatureMgr->getInstance();
 
-
 	_saveSlotToLoad = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
 
 
diff --git a/engines/ultima/ultima4/ultima4.h b/engines/ultima/ultima4/ultima4.h
index 7595737a90..789275b65a 100644
--- a/engines/ultima/ultima4/ultima4.h
+++ b/engines/ultima/ultima4/ultima4.h
@@ -36,6 +36,7 @@ class GameController;
 class Music;
 struct SaveGame;
 class Screen;
+class TileRules;
 
 class Ultima4Engine : public Shared::UltimaEngine {
 private:
@@ -61,6 +62,7 @@ public:
 	Music *_music;
 	SaveGame *_saveGame;
 	Screen *_screen;
+	TileRules *_tileRules;
 public:
 	Ultima4Engine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc);
 	~Ultima4Engine() override;


Commit: b54b918ce6a0dcb1e1cf9e0e45369233aabce75b
    https://github.com/scummvm/scummvm/commit/b54b918ce6a0dcb1e1cf9e0e45369233aabce75b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-25T11:12:05-07:00

Commit Message:
ULTIMA4: Move tile sets from being global

Changed paths:
    engines/ultima/ultima4/controllers/combat_controller.cpp
    engines/ultima/ultima4/controllers/intro_controller.cpp
    engines/ultima/ultima4/game/creature.cpp
    engines/ultima/ultima4/game/player.cpp
    engines/ultima/ultima4/game/script.cpp
    engines/ultima/ultima4/gfx/screen.cpp
    engines/ultima/ultima4/map/map_tile.cpp
    engines/ultima/ultima4/map/maploader.cpp
    engines/ultima/ultima4/map/mapmgr.cpp
    engines/ultima/ultima4/map/tilemap.cpp
    engines/ultima/ultima4/map/tileset.cpp
    engines/ultima/ultima4/map/tileset.h
    engines/ultima/ultima4/map/tileview.cpp
    engines/ultima/ultima4/ultima4.cpp
    engines/ultima/ultima4/ultima4.h


diff --git a/engines/ultima/ultima4/controllers/combat_controller.cpp b/engines/ultima/ultima4/controllers/combat_controller.cpp
index e6767af11d..d7f451bf52 100644
--- a/engines/ultima/ultima4/controllers/combat_controller.cpp
+++ b/engines/ultima/ultima4/controllers/combat_controller.cpp
@@ -662,7 +662,7 @@ bool CombatController::rangedAttack(const Coords &coords, Creature *attacker) {
 	default:
 		/* show the appropriate 'hit' message */
 		// soundPlay(SOUND_PC_STRUCK, false);
-		if (hittile == Tileset::findTileByName("magic_flash")->getId())
+		if (hittile == g_tileSets->findTileByName("magic_flash")->getId())
 			g_screen->screenMessage("\n%s %cMagical Hit%c!\n", target->getName().c_str(), FG_BLUE, FG_WHITE);
 		else g_screen->screenMessage("\n%s Hit!\n", target->getName().c_str());
 		attacker->dealDamage(target, attacker->getDamage());
@@ -1185,37 +1185,37 @@ MapId CombatMap::mapForTile(const Tile *groundTile, const Tile *transport, Objec
 
 	static Std::map<const Tile *, MapId, Std::PointerHash> tileMap;
 	if (!tileMap.size()) {
-		tileMap[Tileset::get("base")->getByName("horse")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("swamp")] = MAP_MARSH_CON;
-		tileMap[Tileset::get("base")->getByName("grass")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("brush")] = MAP_BRUSH_CON;
-		tileMap[Tileset::get("base")->getByName("forest")] = MAP_FOREST_CON;
-		tileMap[Tileset::get("base")->getByName("hills")] = MAP_HILL_CON;
-		tileMap[Tileset::get("base")->getByName("dungeon")] = MAP_DUNGEON_CON;
-		tileMap[Tileset::get("base")->getByName("city")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("castle")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("town")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("lcb_entrance")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("bridge")] = MAP_BRIDGE_CON;
-		tileMap[Tileset::get("base")->getByName("balloon")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("bridge_pieces")] = MAP_BRIDGE_CON;
-		tileMap[Tileset::get("base")->getByName("shrine")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("chest")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("brick_floor")] = MAP_BRICK_CON;
-		tileMap[Tileset::get("base")->getByName("moongate")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("moongate_opening")] = MAP_GRASS_CON;
-		tileMap[Tileset::get("base")->getByName("dungeon_floor")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("horse")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("swamp")] = MAP_MARSH_CON;
+		tileMap[g_tileSets->get("base")->getByName("grass")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("brush")] = MAP_BRUSH_CON;
+		tileMap[g_tileSets->get("base")->getByName("forest")] = MAP_FOREST_CON;
+		tileMap[g_tileSets->get("base")->getByName("hills")] = MAP_HILL_CON;
+		tileMap[g_tileSets->get("base")->getByName("dungeon")] = MAP_DUNGEON_CON;
+		tileMap[g_tileSets->get("base")->getByName("city")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("castle")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("town")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("lcb_entrance")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("bridge")] = MAP_BRIDGE_CON;
+		tileMap[g_tileSets->get("base")->getByName("balloon")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("bridge_pieces")] = MAP_BRIDGE_CON;
+		tileMap[g_tileSets->get("base")->getByName("shrine")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("chest")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("brick_floor")] = MAP_BRICK_CON;
+		tileMap[g_tileSets->get("base")->getByName("moongate")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("moongate_opening")] = MAP_GRASS_CON;
+		tileMap[g_tileSets->get("base")->getByName("dungeon_floor")] = MAP_GRASS_CON;
 	}
 	static Std::map<const Tile *, MapId, Std::PointerHash> dungeontileMap;
 	if (!dungeontileMap.size()) {
-		dungeontileMap[Tileset::get("dungeon")->getByName("brick_floor")] = MAP_DNG0_CON;
-		dungeontileMap[Tileset::get("dungeon")->getByName("up_ladder")] = MAP_DNG1_CON;
-		dungeontileMap[Tileset::get("dungeon")->getByName("down_ladder")] = MAP_DNG2_CON;
-		dungeontileMap[Tileset::get("dungeon")->getByName("up_down_ladder")] = MAP_DNG3_CON;
-		// dungeontileMap[Tileset::get("dungeon")->getByName("chest")] = MAP_DNG4_CON;
+		dungeontileMap[g_tileSets->get("dungeon")->getByName("brick_floor")] = MAP_DNG0_CON;
+		dungeontileMap[g_tileSets->get("dungeon")->getByName("up_ladder")] = MAP_DNG1_CON;
+		dungeontileMap[g_tileSets->get("dungeon")->getByName("down_ladder")] = MAP_DNG2_CON;
+		dungeontileMap[g_tileSets->get("dungeon")->getByName("up_down_ladder")] = MAP_DNG3_CON;
+		// dungeontileMap[g_tileSets->get("dungeon")->getByName("chest")] = MAP_DNG4_CON;
 		// chest tile doesn't work that well
-		dungeontileMap[Tileset::get("dungeon")->getByName("dungeon_door")] = MAP_DNG5_CON;
-		dungeontileMap[Tileset::get("dungeon")->getByName("secret_door")] = MAP_DNG6_CON;
+		dungeontileMap[g_tileSets->get("dungeon")->getByName("dungeon_door")] = MAP_DNG5_CON;
+		dungeontileMap[g_tileSets->get("dungeon")->getByName("secret_door")] = MAP_DNG6_CON;
 	}
 
 	if (g_context->_location->_context & CTX_DUNGEON) {
diff --git a/engines/ultima/ultima4/controllers/intro_controller.cpp b/engines/ultima/ultima4/controllers/intro_controller.cpp
index 70aa2458d8..51f5c399a7 100644
--- a/engines/ultima/ultima4/controllers/intro_controller.cpp
+++ b/engines/ultima/ultima4/controllers/intro_controller.cpp
@@ -157,7 +157,7 @@ bool IntroBinData::load() {
 	_baseTileTable = new Tile*[INTRO_BASETILE_TABLE_SIZE];
 	for (i = 0; i < INTRO_BASETILE_TABLE_SIZE; i++) {
 		MapTile tile = TileMap::get("base")->translate(u4fgetc(title));
-		_baseTileTable[i] = Tileset::get("base")->get(tile._id);
+		_baseTileTable[i] = g_tileSets->get("base")->get(tile._id);
 	}
 
 	/* --------------------------
diff --git a/engines/ultima/ultima4/game/creature.cpp b/engines/ultima/ultima4/game/creature.cpp
index a8b9de8216..5bb2a6c82f 100644
--- a/engines/ultima/ultima4/game/creature.cpp
+++ b/engines/ultima/ultima4/game/creature.cpp
@@ -133,7 +133,7 @@ void Creature::load(const ConfigElement &conf) {
 
 	_xp = static_cast<unsigned short>(conf.getInt("exp"));
 	_ranged = conf.getBool("ranged");
-	setTile(Tileset::findTileByName(conf.getString("tile")));
+	setTile(g_tileSets->findTileByName(conf.getString("tile")));
 
 	setHitTile("hit_flash");
 	setMissTile("miss_flash");
diff --git a/engines/ultima/ultima4/game/player.cpp b/engines/ultima/ultima4/game/player.cpp
index 70b21e08a8..0f1e5092b0 100644
--- a/engines/ultima/ultima4/game/player.cpp
+++ b/engines/ultima/ultima4/game/player.cpp
@@ -413,7 +413,7 @@ bool PartyMember::applyDamage(int damage, bool) {
 	if (isCombatMap(g_context->_location->_map) && getStatus() == STAT_DEAD) {
 		Coords p = getCoords();
 		Map *map = getMap();
-		map->_annotations->add(p, Tileset::findTileByName("corpse")->getId())->setTTL(_party->size() * 2);
+		map->_annotations->add(p, g_tileSets->findTileByName("corpse")->getId())->setTTL(_party->size() * 2);
 
 		if (_party) {
 			_party->setChanged();
@@ -498,7 +498,7 @@ void PartyMember::putToSleep() {
 	if (getStatus() != STAT_DEAD) {
 		soundPlay(SOUND_SLEEP, false);
 		addStatus(STAT_SLEEPING);
-		setTile(Tileset::findTileByName("corpse")->getId());
+		setTile(g_tileSets->findTileByName("corpse")->getId());
 	}
 }
 
@@ -539,7 +539,7 @@ MapTile PartyMember::tileForClass(int klass) {
 		error("invalid class %d in tileForClass", klass);
 	}
 
-	const Tile *tile = Tileset::get("base")->getByName(name);
+	const Tile *tile = g_tileSets->get("base")->getByName(name);
 	ASSERT(tile, "no tile found for class %d", klass);
 	return tile->getId();
 }
@@ -1043,7 +1043,7 @@ void Party::reviveParty() {
 		_saveGame->_weapons[i] = 0;
 	_saveGame->_food = 20099;
 	_saveGame->_gold = 200;
-	setTransport(Tileset::findTileByName("avatar")->getId());
+	setTransport(g_tileSets->findTileByName("avatar")->getId());
 	setChanged();
 	PartyEvent event(PartyEvent::PARTY_REVIVED, 0);
 	notifyObservers(event);
diff --git a/engines/ultima/ultima4/game/script.cpp b/engines/ultima/ultima4/game/script.cpp
index c0b73cb422..d3cb708b85 100644
--- a/engines/ultima/ultima4/game/script.cpp
+++ b/engines/ultima/ultima4/game/script.cpp
@@ -1132,7 +1132,7 @@ Script::ReturnCode Script::add(Shared::XMLNode *script, Shared::XMLNode *current
 		quant *= 100;
 		g_context->_party->adjustFood(quant);
 	} else if (type == "horse")
-		g_context->_party->setTransport(Tileset::findTileByName("horse")->getId());
+		g_context->_party->setTransport(g_tileSets->findTileByName("horse")->getId());
 	else if (type == "torch") {
 		AdjustValueMax(g_ultima->_saveGame->_torches, quant, 99);
 		g_context->_party->notifyOfChange(0, PartyEvent::INVENTORY_ADDED);
diff --git a/engines/ultima/ultima4/gfx/screen.cpp b/engines/ultima/ultima4/gfx/screen.cpp
index b80d6dfa29..02386689b7 100644
--- a/engines/ultima/ultima4/gfx/screen.cpp
+++ b/engines/ultima/ultima4/gfx/screen.cpp
@@ -220,8 +220,8 @@ MouseCursorSurface *Screen::loadMouseCursor(Shared::File &src) {
 }
 
 void Screen::screenReInit() {
-	g_intro->deleteIntro();      // delete intro stuff
-	Tileset::unloadAllImages();  // unload tilesets, which will be reloaded lazily as needed
+	g_intro->deleteIntro();			// delete intro stuff
+	g_tileSets->unloadAllImages();	// unload tilesets, which will be reloaded lazily as needed
 	ImageMgr::destroy();
 	_tileAnims = nullptr;
 	clear();
diff --git a/engines/ultima/ultima4/map/map_tile.cpp b/engines/ultima/ultima4/map/map_tile.cpp
index e3cea51885..7b47bbf8e3 100644
--- a/engines/ultima/ultima4/map/map_tile.cpp
+++ b/engines/ultima/ultima4/map/map_tile.cpp
@@ -45,7 +45,7 @@ bool MapTile::setDirection(Direction d) {
 }
 
 const Tile *MapTile::getTileType() const {
-	return Tileset::findTileById(_id);
+	return g_tileSets->findTileById(_id);
 }
 
 } // End of namespace Ultima4
diff --git a/engines/ultima/ultima4/map/maploader.cpp b/engines/ultima/ultima4/map/maploader.cpp
index a4fe545d28..850b8b8e70 100644
--- a/engines/ultima/ultima4/map/maploader.cpp
+++ b/engines/ultima/ultima4/map/maploader.cpp
@@ -432,7 +432,7 @@ void DngMapLoader::initDungeonRoom(Dungeon *dng, int room) {
 	dng->_roomMaps[room]->_music = Music::COMBAT;
 	dng->_roomMaps[room]->_type = Map::COMBAT;
 	dng->_roomMaps[room]->_flags |= NO_LINE_OF_SIGHT;
-	dng->_roomMaps[room]->_tileSet = Tileset::get("base");
+	dng->_roomMaps[room]->_tileSet = g_tileSets->get("base");
 }
 
 bool WorldMapLoader::load(Map *map) {
diff --git a/engines/ultima/ultima4/map/mapmgr.cpp b/engines/ultima/ultima4/map/mapmgr.cpp
index 573689c364..6a17e1bf48 100644
--- a/engines/ultima/ultima4/map/mapmgr.cpp
+++ b/engines/ultima/ultima4/map/mapmgr.cpp
@@ -184,7 +184,7 @@ Map *MapMgr::initMapFromConf(const ConfigElement &mapConf) {
 		map->_flags |= FIRST_PERSON;
 
 	map->_music = static_cast<Music::Type>(mapConf.getInt("music"));
-	map->_tileSet = Tileset::get(mapConf.getString("tileset"));
+	map->_tileSet = g_tileSets->get(mapConf.getString("tileset"));
 	map->_tileMap = TileMap::get(mapConf.getString("tilemap"));
 
 	vector<ConfigElement> children = mapConf.getChildren();
diff --git a/engines/ultima/ultima4/map/tilemap.cpp b/engines/ultima/ultima4/map/tilemap.cpp
index c854852afb..e4dd5b790b 100644
--- a/engines/ultima/ultima4/map/tilemap.cpp
+++ b/engines/ultima/ultima4/map/tilemap.cpp
@@ -85,7 +85,7 @@ void TileMap::load(const ConfigElement &tilemapConf) {
 		Common::String tile = i->getString("tile");
 
 		// Find the tile this references
-		Tile *t = Tileset::get(tileset)->getByName(tile);
+		Tile *t = g_tileSets->get(tileset)->getByName(tile);
 		if (!t)
 			error("Error: tile '%s' from '%s' was not found in tileset %s", tile.c_str(), name.c_str(), tileset.c_str());
 
diff --git a/engines/ultima/ultima4/map/tileset.cpp b/engines/ultima/ultima4/map/tileset.cpp
index 8a272e7fb7..4023617f15 100644
--- a/engines/ultima/ultima4/map/tileset.cpp
+++ b/engines/ultima/ultima4/map/tileset.cpp
@@ -31,6 +31,7 @@ namespace Ultima {
 namespace Ultima4 {
 
 TileRules *g_tileRules;
+TileSets *g_tileSets;
 
 TileRules::TileRules() {
 	g_tileRules = this;
@@ -61,11 +62,101 @@ TileRule *TileRules::findByName(const Common::String &name) {
 	return nullptr;
 }
 
-
 /*-------------------------------------------------------------------*/
 
-// Static member variables
-Tileset::TilesetMap Tileset::tilesets;
+TileSets::TileSets() {
+	g_tileSets = this;
+	loadAll();
+}
+
+TileSets::~TileSets() {
+	unloadAll();
+	g_tileSets = nullptr;
+}
+
+void TileSets::loadAll() {
+	const Config *config = Config::getInstance();
+	Std::vector<ConfigElement> conf;
+
+	unloadAll();
+
+	// Get the config element for all tilesets
+	conf = config->getElement("tilesets").getChildren();
+
+	// Load tile rules
+	if (g_tileRules->empty())
+		g_tileRules->load();
+
+	// Load all of the tilesets
+	for (Std::vector<ConfigElement>::iterator i = conf.begin(); i != conf.end(); i++) {
+		if (i->getName() == "tileset") {
+
+			Tileset *tileset = new Tileset();
+			tileset->load(*i);
+
+			(*this)[tileset->_name] = tileset;
+		}
+	}
+
+	// Load tile maps, including translations from index to id
+	TileMap::loadAll();
+}
+
+void TileSets::unloadAll() {
+	iterator i;
+
+	// Unload all tilemaps
+	TileMap::unloadAll();
+
+	for (i = begin(); i != end(); i++) {
+		i->_value->unload();
+		delete i->_value;
+	}
+	clear();
+
+	Tile::resetNextId();
+}
+
+void TileSets::unloadAllImages() {
+	iterator i;
+
+	for (i = begin(); i != end(); i++) {
+		i->_value->unloadImages();
+	}
+
+	Tile::resetNextId();
+}
+
+Tileset *TileSets::get(const Common::String &name) {
+	if (find(name) != end())
+		return (*this)[name];
+	else return nullptr;
+}
+
+Tile *TileSets::findTileByName(const Common::String &name) {
+	iterator i;
+	for (i = begin(); i != end(); i++) {
+		Tile *t = i->_value->getByName(name);
+		if (t)
+			return t;
+	}
+
+	return nullptr;
+}
+
+Tile *TileSets::findTileById(TileId id) {
+	iterator i;
+	for (i = begin(); i != end(); i++) {
+		Tile *t = i->_value->get(id);
+		if (t)
+			return t;
+	}
+
+	return nullptr;
+}
+
+
+/*-------------------------------------------------------------------*/
 
 bool TileRule::initFromConf(const ConfigElement &conf) {
 	uint i;
@@ -158,93 +249,12 @@ bool TileRule::initFromConf(const ConfigElement &conf) {
 	return true;
 }
 
-void Tileset::loadAll() {
-	const Config *config = Config::getInstance();
-	Std::vector<ConfigElement> conf;
-
-	unloadAll();
-
-	// Get the config element for all tilesets
-	conf = config->getElement("tilesets").getChildren();
-
-	// Load tile rules
-	if (g_tileRules->empty())
-		g_tileRules->load();
-
-	// Load all of the tilesets
-	for (Std::vector<ConfigElement>::iterator i = conf.begin(); i != conf.end(); i++) {
-		if (i->getName() == "tileset") {
-
-			Tileset *tileset = new Tileset();
-			tileset->load(*i);
-
-			tilesets[tileset->_name] = tileset;
-		}
-	}
-
-	// Load tile maps, including translations from index to id
-	TileMap::loadAll();
-}
-
-void Tileset::unloadAll() {
-	TilesetMap::iterator i;
-
-	// Unload all tilemaps
-	TileMap::unloadAll();
-
-	for (i = tilesets.begin(); i != tilesets.end(); i++) {
-		i->_value->unload();
-		delete i->_value;
-	}
-	tilesets.clear();
-
-	Tile::resetNextId();
-}
-
-void Tileset::unloadAllImages() {
-	TilesetMap::iterator i;
-
-	for (i = tilesets.begin(); i != tilesets.end(); i++) {
-		i->_value->unloadImages();
-	}
-
-	Tile::resetNextId();
-}
-
-Tileset *Tileset::get(const Common::String &name) {
-	if (tilesets.find(name) != tilesets.end())
-		return tilesets[name];
-	else return nullptr;
-}
-
-Tile *Tileset::findTileByName(const Common::String &name) {
-	TilesetMap::iterator i;
-	for (i = tilesets.begin(); i != tilesets.end(); i++) {
-		Tile *t = i->_value->getByName(name);
-		if (t)
-			return t;
-	}
-
-	return nullptr;
-}
-
-Tile *Tileset::findTileById(TileId id) {
-	TilesetMap::iterator i;
-	for (i = tilesets.begin(); i != tilesets.end(); i++) {
-		Tile *t = i->_value->get(id);
-		if (t)
-			return t;
-	}
-
-	return nullptr;
-}
-
 void Tileset::load(const ConfigElement &tilesetConf) {
 	_name = tilesetConf.getString("name");
 	if (tilesetConf.exists("imageName"))
 		_imageName = tilesetConf.getString("imageName");
 	if (tilesetConf.exists("extends"))
-		_extends = Tileset::get(tilesetConf.getString("extends"));
+		_extends = g_tileSets->get(tilesetConf.getString("extends"));
 	else _extends = nullptr;
 
 	int index = 0;
diff --git a/engines/ultima/ultima4/map/tileset.h b/engines/ultima/ultima4/map/tileset.h
index 83ff43c05a..337589f0e2 100644
--- a/engines/ultima/ultima4/map/tileset.h
+++ b/engines/ultima/ultima4/map/tileset.h
@@ -31,37 +31,10 @@ namespace Ultima4 {
 
 class ConfigElement;
 class Tile;
+class TileSets;
 
 typedef Common::HashMap<Common::String, class TileRule *> TileRuleMap;
 
-/**
- * Tile rules
- */
-class TileRules : public TileRuleMap {
-public:
-	/**
-	 * Constructor
-	 */
-	TileRules();
-
-	/**
-	 * Destructor
-	 */
-	~TileRules();
-
-	/**
-	 * Load tile information from xml.
-	 */
-	void load();
-
-	/**
-	 * Returns the tile rule with the given name, or nullptr if none could be found
-	 */
-	TileRule *findByName(const Common::String &name);
-};
-
-extern TileRules *g_tileRules;
-
 /**
  * TileRule class
  */
@@ -85,38 +58,10 @@ public:
  * Tileset class
  */
 class Tileset {
+	friend class TileSets;
 public:
-	typedef Common::HashMap<Common::String, Tileset *> TilesetMap;
 	typedef Common::HashMap<TileId, Tile *> TileIdMap;
 	typedef Common::HashMap<Common::String, Tile *> TileStrMap;
-
-	/**
-	 * Loads all tilesets using the filename
-	 * indicated by 'filename' as a definition
-	 */
-	static void loadAll();
-
-	/**
-	 * Delete all tilesets
-	 */
-	static void unloadAll();
-
-	/**
-	 * Delete all tileset images
-	 */
-	static void unloadAllImages();
-
-	/**
-	 * Returns the tileset with the given name, if it exists
-	 */
-	static Tileset *get(const Common::String &name);
-
-	/**
-	 * Returns the tile that has the given name from any tileset, if there is one
-	 */
-	static Tile *findTileByName(const Common::String &name);
-	static Tile *findTileById(TileId id);
-
 public:
 	/**
 	 * Loads a tileset.
@@ -155,8 +100,6 @@ public:
 	uint numFrames() const;
 
 private:
-	static TilesetMap tilesets;
-
 	Common::String _name;
 	TileIdMap _tiles;
 	uint _totalFrames;
@@ -166,6 +109,79 @@ private:
 	TileStrMap _nameMap;
 };
 
+
+/**
+ * Tile rules container
+ */
+class TileRules : public TileRuleMap {
+public:
+	/**
+	 * Constructor
+	 */
+	TileRules();
+
+	/**
+	 * Destructor
+	 */
+	~TileRules();
+
+	/**
+	 * Load tile information from xml.
+	 */
+	void load();
+
+	/**
+	 * Returns the tile rule with the given name, or nullptr if none could be found
+	 */
+	TileRule *findByName(const Common::String &name);
+};
+
+/**
+ * Tile sets container
+ */
+class TileSets : public Common::HashMap<Common::String, Tileset *> {
+public:
+	/**
+	 * Constructor
+	 */
+	TileSets();
+
+	/**
+	 * Destructor
+	 */
+	~TileSets();
+
+	/**
+	 * Loads all tilesets using the filename
+	 * indicated by 'filename' as a definition
+	 */
+	void loadAll();
+
+	/**
+	 * Delete all tilesets
+	 */
+	void unloadAll();
+
+	/**
+	 * Delete all tileset images
+	 */
+	void unloadAllImages();
+
+	/**
+	 * Returns the tileset with the given name, if it exists
+	 */
+	Tileset *get(const Common::String &name);
+
+	/**
+	 * Returns the tile that has the given name from any tileset, if there is one
+	 */
+	Tile *findTileByName(const Common::String &name);
+	Tile *findTileById(TileId id);
+};
+
+extern TileRules *g_tileRules;
+extern TileSets *g_tileSets;
+
 } // End of namespace Ultima4
 } // End of namespace Ultima
 
diff --git a/engines/ultima/ultima4/map/tileview.cpp b/engines/ultima/ultima4/map/tileview.cpp
index 39ccd63df4..9b37285b6f 100644
--- a/engines/ultima/ultima4/map/tileview.cpp
+++ b/engines/ultima/ultima4/map/tileview.cpp
@@ -40,7 +40,7 @@ TileView::TileView(int x, int y, int columns, int rows) : View(x, y, columns * T
 	_rows = rows;
 	_tileWidth = TILE_WIDTH;
 	_tileHeight = TILE_HEIGHT;
-	_tileSet = Tileset::get("base");
+	_tileSet = g_tileSets->get("base");
 	_animated = Image::create(SCALED(_tileWidth), SCALED(_tileHeight), false, Image::HARDWARE);
 }
 
@@ -50,7 +50,7 @@ TileView::TileView(int x, int y, int columns, int rows, const Common::String &ti
 	_rows = rows;
 	_tileWidth = TILE_WIDTH;
 	_tileHeight = TILE_HEIGHT;
-	_tileSet = Tileset::get(tileset);
+	_tileSet = g_tileSets->get(tileset);
 	_animated = Image::create(SCALED(_tileWidth), SCALED(_tileHeight), false, Image::HARDWARE);
 }
 
@@ -60,7 +60,7 @@ TileView::~TileView() {
 
 void TileView::reinit() {
 	View::reinit();
-	_tileSet = Tileset::get("base");
+	_tileSet = g_tileSets->get("base");
 
 	// Scratchpad needs to be re-inited if we rescale...
 	if (_animated) {
diff --git a/engines/ultima/ultima4/ultima4.cpp b/engines/ultima/ultima4/ultima4.cpp
index a8e4da074b..545a306231 100644
--- a/engines/ultima/ultima4/ultima4.cpp
+++ b/engines/ultima/ultima4/ultima4.cpp
@@ -49,12 +49,14 @@ Ultima4Engine *g_ultima;
 Ultima4Engine::Ultima4Engine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc) :
 		Shared::UltimaEngine(syst, gameDesc), _saveSlotToLoad(-1), _config(nullptr),
 		_context(nullptr), _dialogueLoaders(nullptr), _game(nullptr), _music(nullptr),
-		_imageLoaders(nullptr), _saveGame(nullptr), _screen(nullptr), _tileRules(nullptr) {
+		_imageLoaders(nullptr), _saveGame(nullptr), _screen(nullptr), _tileRules(nullptr),
+		_tileSets(nullptr) {
 	g_ultima = this;
 	g_context = nullptr;
 	g_game = nullptr;
 	g_screen = nullptr;
 	g_tileRules = nullptr;
+	g_tileSets = nullptr;
 }
 
 Ultima4Engine::~Ultima4Engine() {
@@ -67,8 +69,8 @@ Ultima4Engine::~Ultima4Engine() {
 	delete _saveGame;
 	delete _screen;
 	delete _tileRules;
+	delete _tileSets;
 
-	Tileset::unloadAll();
 	ImageMgr::destroy();
 
 	//delete g_music;
@@ -85,15 +87,15 @@ bool Ultima4Engine::initialize() {
 	_dialogueLoaders = new DialogueLoaders();
 	_screen = new Screen();
 	_screen->init();
+	_tileRules = new TileRules();
+	_tileSets = new TileSets();
 	_game = new GameController();
 	_imageLoaders = new ImageLoaders();
 	_music = new Music();
 	_saveGame = new SaveGame();
-	_tileRules = new TileRules();
 
 	setDebugger(new Debugger());
 	soundInit();
-	Tileset::loadAll();
 	creatureMgr->getInstance();
 
 	_saveSlotToLoad = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
@@ -106,7 +108,6 @@ void Ultima4Engine::startup() {
 	bool skipInfo = _saveSlotToLoad != -1;
 
 	soundInit();
-	Tileset::loadAll();
 
 	if (!skipInfo) {
 		// do the intro
diff --git a/engines/ultima/ultima4/ultima4.h b/engines/ultima/ultima4/ultima4.h
index 789275b65a..7594ca5010 100644
--- a/engines/ultima/ultima4/ultima4.h
+++ b/engines/ultima/ultima4/ultima4.h
@@ -37,6 +37,7 @@ class Music;
 struct SaveGame;
 class Screen;
 class TileRules;
+class TileSets;
 
 class Ultima4Engine : public Shared::UltimaEngine {
 private:
@@ -63,6 +64,7 @@ public:
 	SaveGame *_saveGame;
 	Screen *_screen;
 	TileRules *_tileRules;
+	TileSets *_tileSets;
 public:
 	Ultima4Engine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc);
 	~Ultima4Engine() override;


Commit: 2985bc6b1086c4b0bc9fd173b9ca86a00adb1a30
    https://github.com/scummvm/scummvm/commit/2985bc6b1086c4b0bc9fd173b9ca86a00adb1a30
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-25T11:34:06-07:00

Commit Message:
ULTIMA4: Refactor tile map from being a global

Changed paths:
    engines/ultima/ultima4/controllers/intro_controller.cpp
    engines/ultima/ultima4/game/game.cpp
    engines/ultima/ultima4/game/player.cpp
    engines/ultima/ultima4/map/maploader.cpp
    engines/ultima/ultima4/map/mapmgr.cpp
    engines/ultima/ultima4/map/tilemap.cpp
    engines/ultima/ultima4/map/tilemap.h
    engines/ultima/ultima4/map/tileset.cpp
    engines/ultima/ultima4/ultima4.cpp
    engines/ultima/ultima4/ultima4.h


diff --git a/engines/ultima/ultima4/controllers/intro_controller.cpp b/engines/ultima/ultima4/controllers/intro_controller.cpp
index 51f5c399a7..fef26946c1 100644
--- a/engines/ultima/ultima4/controllers/intro_controller.cpp
+++ b/engines/ultima/ultima4/controllers/intro_controller.cpp
@@ -146,7 +146,7 @@ bool IntroBinData::load() {
 	_introMap.clear();
 	_introMap.resize(INTRO_MAP_WIDTH * INTRO_MAP_HEIGHT);
 	for (i = 0; i < INTRO_MAP_HEIGHT * INTRO_MAP_WIDTH; i++)
-		_introMap[i] = TileMap::get("base")->translate(u4fgetc(title));
+		_introMap[i] = g_tileMaps->get("base")->translate(u4fgetc(title));
 
 	u4fseek(title, INTRO_SCRIPT_TABLE_OFFSET, SEEK_SET);
 	_scriptTable = new byte[INTRO_SCRIPT_TABLE_SIZE];
@@ -156,7 +156,7 @@ bool IntroBinData::load() {
 	u4fseek(title, INTRO_BASETILE_TABLE_OFFSET, SEEK_SET);
 	_baseTileTable = new Tile*[INTRO_BASETILE_TABLE_SIZE];
 	for (i = 0; i < INTRO_BASETILE_TABLE_SIZE; i++) {
-		MapTile tile = TileMap::get("base")->translate(u4fgetc(title));
+		MapTile tile = g_tileMaps->get("base")->translate(u4fgetc(title));
 		_baseTileTable[i] = g_tileSets->get("base")->get(tile._id);
 	}
 
diff --git a/engines/ultima/ultima4/game/game.cpp b/engines/ultima/ultima4/game/game.cpp
index f850dc12ee..4e6762aecc 100644
--- a/engines/ultima/ultima4/game/game.cpp
+++ b/engines/ultima/ultima4/game/game.cpp
@@ -408,8 +408,8 @@ void gameFixupObjects(Map *map) {
 			Coords coords(monster->_x, monster->_y);
 
 			// tile values stored in monsters.sav hardcoded to index into base tilemap
-			MapTile tile = TileMap::get("base")->translate(monster->_tile),
-			        oldTile = TileMap::get("base")->translate(monster->_prevTile);
+			MapTile tile = g_tileMaps->get("base")->translate(monster->_tile),
+			        oldTile = g_tileMaps->get("base")->translate(monster->_prevTile);
 
 			if (i < MONSTERTABLE_CREATURES_SIZE) {
 				const Creature *creature = creatureMgr->getByTile(tile);
diff --git a/engines/ultima/ultima4/game/player.cpp b/engines/ultima/ultima4/game/player.cpp
index 0f1e5092b0..e883f05bee 100644
--- a/engines/ultima/ultima4/game/player.cpp
+++ b/engines/ultima/ultima4/game/player.cpp
@@ -556,7 +556,7 @@ Party::Party(SaveGame *s) : _saveGame(s), _transport(0), _torchDuration(0), _act
 
 	// set the party's transport (transport value stored in savegame
 	// hardcoded to index into base tilemap)
-	setTransport(TileMap::get("base")->translate(_saveGame->_transport));
+	setTransport(g_tileMaps->get("base")->translate(_saveGame->_transport));
 }
 
 Party::~Party() {
@@ -1055,7 +1055,7 @@ MapTile Party::getTransport() const {
 
 void Party::setTransport(MapTile tile) {
 	// transport value stored in savegame hardcoded to index into base tilemap
-	_saveGame->_transport = TileMap::get("base")->untranslate(tile);
+	_saveGame->_transport = g_tileMaps->get("base")->untranslate(tile);
 	ASSERT(_saveGame->_transport != 0, "could not generate valid savegame transport for tile with id %d\n", tile._id);
 
 	_transport = tile;
diff --git a/engines/ultima/ultima4/map/maploader.cpp b/engines/ultima/ultima4/map/maploader.cpp
index 850b8b8e70..1a9fff25da 100644
--- a/engines/ultima/ultima4/map/maploader.cpp
+++ b/engines/ultima/ultima4/map/maploader.cpp
@@ -313,7 +313,7 @@ bool DngMapLoader::load(Map *map) {
 		for (j = 0; j < DNGROOM_NTRIGGERS; j++) {
 			int tmp;
 
-			dungeon->_rooms[i]._triggers[j]._tile = TileMap::get("base")->translate(u4fgetc(dng))._id;
+			dungeon->_rooms[i]._triggers[j]._tile = g_tileMaps->get("base")->translate(u4fgetc(dng))._id;
 
 			tmp = u4fgetc(dng);
 			if (tmp == EOF)
@@ -350,11 +350,11 @@ bool DngMapLoader::load(Map *map) {
 
 		// Translate each creature tile to a tile id
 		for (j = 0; j < sizeof(dungeon->_rooms[i]._creatureTiles); j++)
-			dungeon->_rooms[i]._creatureTiles[j] = TileMap::get("base")->translate(dungeon->_rooms[i]._creatureTiles[j])._id;
+			dungeon->_rooms[i]._creatureTiles[j] = g_tileMaps->get("base")->translate(dungeon->_rooms[i]._creatureTiles[j])._id;
 
 		// Translate each map tile to a tile id
 		for (j = 0; j < sizeof(room_tiles); j++)
-			dungeon->_rooms[i]._mapData.push_back(TileMap::get("base")->translate(room_tiles[j]));
+			dungeon->_rooms[i]._mapData.push_back(g_tileMaps->get("base")->translate(room_tiles[j]));
 
 		//
 		// dungeon room fixup
@@ -408,7 +408,7 @@ bool DngMapLoader::load(Map *map) {
 
 				for (j = 0; j < int(sizeof(tile) / sizeof(Coords)); j++) {
 					const int index = (tile[j].y * CON_WIDTH) + tile[j].x;
-					dungeon->_rooms[i]._mapData[index] = TileMap::get("base")->translate(tile[j].z);
+					dungeon->_rooms[i]._mapData[index] = g_tileMaps->get("base")->translate(tile[j].z);
 				}
 			}
 		}
diff --git a/engines/ultima/ultima4/map/mapmgr.cpp b/engines/ultima/ultima4/map/mapmgr.cpp
index 6a17e1bf48..78c6be1fda 100644
--- a/engines/ultima/ultima4/map/mapmgr.cpp
+++ b/engines/ultima/ultima4/map/mapmgr.cpp
@@ -185,7 +185,7 @@ Map *MapMgr::initMapFromConf(const ConfigElement &mapConf) {
 
 	map->_music = static_cast<Music::Type>(mapConf.getInt("music"));
 	map->_tileSet = g_tileSets->get(mapConf.getString("tileset"));
-	map->_tileMap = TileMap::get(mapConf.getString("tilemap"));
+	map->_tileMap = g_tileMaps->get(mapConf.getString("tilemap"));
 
 	vector<ConfigElement> children = mapConf.getChildren();
 	for (Std::vector<ConfigElement>::iterator i = children.begin(); i != children.end(); i++) {
diff --git a/engines/ultima/ultima4/map/tilemap.cpp b/engines/ultima/ultima4/map/tilemap.cpp
index e4dd5b790b..b38c2052f3 100644
--- a/engines/ultima/ultima4/map/tilemap.cpp
+++ b/engines/ultima/ultima4/map/tilemap.cpp
@@ -28,16 +28,21 @@
 namespace Ultima {
 namespace Ultima4 {
 
-using Std::vector;
+TileMaps *g_tileMaps;
 
-/**
- * Static variables
- */
-TileMap::TileIndexMapMap TileMap::_tileMaps;
+TileMaps::TileMaps() {
+	g_tileMaps = this;
+	loadAll();
+}
+
+TileMaps::~TileMaps() {
+	unloadAll();
+	g_tileMaps = nullptr;
+}
 
-void TileMap::loadAll() {
+void TileMaps::loadAll() {
 	const Config *config = Config::getInstance();
-	vector<ConfigElement> conf;
+	Std::vector<ConfigElement> conf;
 
 	// FIXME: make sure tilesets are loaded by now
 	unloadAll();
@@ -55,18 +60,18 @@ void TileMap::loadAll() {
 	}
 }
 
-void TileMap::unloadAll() {
-	TileIndexMapMap::iterator map;
+void TileMaps::unloadAll() {
+	iterator map;
 
 	// Free all the memory for the tile maps
-	for (map = _tileMaps.begin(); map != _tileMaps.end(); map++)
+	for (map = begin(); map != end(); map++)
 		delete map->_value;
 
 	// Clear the map so we don't attempt to delete the memory again next time
-	_tileMaps.clear();
+	clear();
 }
 
-void TileMap::load(const ConfigElement &tilemapConf) {
+void TileMaps::load(const ConfigElement &tilemapConf) {
 	TileMap *tm = new TileMap();
 
 	Common::String name = tilemapConf.getString("name");
@@ -74,7 +79,7 @@ void TileMap::load(const ConfigElement &tilemapConf) {
 	Common::String tileset = tilemapConf.getString("tileset");
 
 	int index = 0;
-	vector<ConfigElement> children = tilemapConf.getChildren();
+	Std::vector<ConfigElement> children = tilemapConf.getChildren();
 	for (Std::vector<ConfigElement>::iterator i = children.begin(); i != children.end(); i++) {
 		if (i->getName() != "mapping")
 			continue;
@@ -107,15 +112,17 @@ void TileMap::load(const ConfigElement &tilemapConf) {
 	}
 
 	// Add the tilemap to our list
-	_tileMaps[name] = tm;
+	(*this)[name] = tm;
 }
 
-TileMap *TileMap::get(Common::String name) {
-	if (_tileMaps.find(name) != _tileMaps.end())
-		return _tileMaps[name];
+TileMap *TileMaps::get(Common::String name) {
+	if (find(name) != end())
+		return (*this)[name];
 	else return nullptr;
 }
 
+/*-------------------------------------------------------------------*/
+
 MapTile TileMap::translate(uint index) {
 	return _tileMap[index];
 }
diff --git a/engines/ultima/ultima4/map/tilemap.h b/engines/ultima/ultima4/map/tilemap.h
index fac999c58a..3d217331ef 100644
--- a/engines/ultima/ultima4/map/tilemap.h
+++ b/engines/ultima/ultima4/map/tilemap.h
@@ -31,47 +31,61 @@ namespace Ultima {
 namespace Ultima4 {
 
 class ConfigElement;
+class TileMaps;
 
 /**
  * A tilemap maps the raw bytes in a map file to MapTiles.
  */
 class TileMap {
+	friend class TileMaps;
+private:
+	Std::map<uint, MapTile> _tileMap;
 public:
-	typedef Std::map<Common::String, TileMap *> TileIndexMapMap;
-
 	/**
 	 * Translates a raw index to a MapTile.
 	 */
 	MapTile translate(uint index);
+
 	uint untranslate(MapTile &tile);
+};
 
+class TileMaps : public Std::map<Common::String, TileMap *> {
+private:
 	/**
-	 * Load all tilemaps from the specified xml file
+	 * Loads a tile map which translates between tile indices and tile
+	 * names.  Tile maps are useful to translate from dos tile indices to
+	 * xu4 tile ids.
+	 */
+	void load(const ConfigElement &tilemapConf);
+public:
+	/**
+	 * Constructor
 	 */
-	static void loadAll();
+	TileMaps();
 
 	/**
-	 * Delete all tilemaps
+	 * Destructor
 	 */
-	static void unloadAll();
+	~TileMaps();
 
 	/**
-	 * Returns the Tile index map with the specified name
+	 * Load all tilemaps from the specified xml file
 	 */
-	static TileMap *get(Common::String name);
+	void loadAll();
 
-private:
 	/**
-	 * Loads a tile map which translates between tile indices and tile
-	 * names.  Tile maps are useful to translate from dos tile indices to
-	 * xu4 tile ids.
+	 * Delete all tilemaps
 	 */
-	static void load(const ConfigElement &tilemapConf);
-	static TileIndexMapMap _tileMaps;
+	void unloadAll();
 
-	Std::map<uint, MapTile> _tileMap;
+	/**
+	 * Returns the Tile index map with the specified name
+	 */
+	TileMap *get(Common::String name);
 };
 
+extern TileMaps *g_tileMaps;
+
 } // End of namespace Ultima4
 } // End of namespace Ultima
 
diff --git a/engines/ultima/ultima4/map/tileset.cpp b/engines/ultima/ultima4/map/tileset.cpp
index 4023617f15..53861b32cb 100644
--- a/engines/ultima/ultima4/map/tileset.cpp
+++ b/engines/ultima/ultima4/map/tileset.cpp
@@ -97,17 +97,11 @@ void TileSets::loadAll() {
 			(*this)[tileset->_name] = tileset;
 		}
 	}
-
-	// Load tile maps, including translations from index to id
-	TileMap::loadAll();
 }
 
 void TileSets::unloadAll() {
 	iterator i;
 
-	// Unload all tilemaps
-	TileMap::unloadAll();
-
 	for (i = begin(); i != end(); i++) {
 		i->_value->unload();
 		delete i->_value;
diff --git a/engines/ultima/ultima4/ultima4.cpp b/engines/ultima/ultima4/ultima4.cpp
index 545a306231..1067424164 100644
--- a/engines/ultima/ultima4/ultima4.cpp
+++ b/engines/ultima/ultima4/ultima4.cpp
@@ -35,6 +35,7 @@
 #include "ultima/ultima4/gfx/screen.h"
 #include "ultima/ultima4/gfx/imageloader.h"
 #include "ultima/ultima4/gfx/imagemgr.h"
+#include "ultima/ultima4/map/tilemap.h"
 #include "ultima/ultima4/map/tileset.h"
 #include "ultima/ultima4/sound/music.h"
 #include "ultima/ultima4/sound/sound.h"
@@ -49,12 +50,13 @@ Ultima4Engine *g_ultima;
 Ultima4Engine::Ultima4Engine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc) :
 		Shared::UltimaEngine(syst, gameDesc), _saveSlotToLoad(-1), _config(nullptr),
 		_context(nullptr), _dialogueLoaders(nullptr), _game(nullptr), _music(nullptr),
-		_imageLoaders(nullptr), _saveGame(nullptr), _screen(nullptr), _tileRules(nullptr),
-		_tileSets(nullptr) {
+		_imageLoaders(nullptr), _saveGame(nullptr), _screen(nullptr), _tileMaps(nullptr),
+		_tileRules(nullptr), _tileSets(nullptr) {
 	g_ultima = this;
 	g_context = nullptr;
 	g_game = nullptr;
 	g_screen = nullptr;
+	g_tileMaps = nullptr;
 	g_tileRules = nullptr;
 	g_tileSets = nullptr;
 }
@@ -68,6 +70,7 @@ Ultima4Engine::~Ultima4Engine() {
 	delete _music;
 	delete _saveGame;
 	delete _screen;
+	delete _tileMaps;
 	delete _tileRules;
 	delete _tileSets;
 
@@ -89,6 +92,7 @@ bool Ultima4Engine::initialize() {
 	_screen->init();
 	_tileRules = new TileRules();
 	_tileSets = new TileSets();
+	_tileMaps = new TileMaps();
 	_game = new GameController();
 	_imageLoaders = new ImageLoaders();
 	_music = new Music();
diff --git a/engines/ultima/ultima4/ultima4.h b/engines/ultima/ultima4/ultima4.h
index 7594ca5010..df2df21e16 100644
--- a/engines/ultima/ultima4/ultima4.h
+++ b/engines/ultima/ultima4/ultima4.h
@@ -36,6 +36,7 @@ class GameController;
 class Music;
 struct SaveGame;
 class Screen;
+class TileMaps;
 class TileRules;
 class TileSets;
 
@@ -63,6 +64,7 @@ public:
 	Music *_music;
 	SaveGame *_saveGame;
 	Screen *_screen;
+	TileMaps *_tileMaps;
 	TileRules *_tileRules;
 	TileSets *_tileSets;
 public:




More information about the Scummvm-git-logs mailing list