[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