Implement reverse otb items table

master
Eduardo Bart 12 years ago
parent 0af783b5cf
commit b349ff2620

@ -159,10 +159,6 @@ void Painter::setAlphaWriting(bool enable)
void Painter::setResolution(const Size& resolution) void Painter::setResolution(const Size& resolution)
{ {
if(m_resolution == resolution)
return;
// The projection matrix converts from Painter's coordinate system to GL's coordinate system // The projection matrix converts from Painter's coordinate system to GL's coordinate system
// * GL's viewport is 2x2, Painter's is width x height // * GL's viewport is 2x2, Painter's is width x height
// * GL has +y -> -y going from bottom -> top, Painter is the other way round // * GL has +y -> -y going from bottom -> top, Painter is the other way round

@ -702,14 +702,17 @@ LRESULT WIN32Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
break; break;
} }
case WM_SIZE: { case WM_SIZE: {
bool forceResize = false;
switch(wParam) { switch(wParam) {
case SIZE_MAXIMIZED: case SIZE_MAXIMIZED:
m_maximized = true; m_maximized = true;
m_visible = true; m_visible = true;
forceResize = true;
break; break;
case SIZE_RESTORED: case SIZE_RESTORED:
m_maximized = false; m_maximized = false;
m_visible = true; m_visible = true;
forceResize = true;
break; break;
case SIZE_MINIMIZED: case SIZE_MINIMIZED:
m_visible = false; m_visible = false;
@ -723,7 +726,7 @@ LRESULT WIN32Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
size.setWidth(std::max(std::min((int)LOWORD(lParam), 7680), m_minimumSize.width())); size.setWidth(std::max(std::min((int)LOWORD(lParam), 7680), m_minimumSize.width()));
size.setHeight(std::max(std::min((int)HIWORD(lParam), 4320), m_minimumSize.height())); size.setHeight(std::max(std::min((int)HIWORD(lParam), 4320), m_minimumSize.height()));
if(m_visible && m_size != size) { if(m_visible && (forceResize || m_size != size)) {
m_size = size; m_size = size;
m_onResize(m_size); m_onResize(m_size);
} }

@ -793,6 +793,7 @@ void X11Window::poll()
} }
case MapNotify: case MapNotify:
m_visible = true; m_visible = true;
needsResizeUpdate = true;
break; break;
case UnmapNotify: case UnmapNotify:
m_visible = false; m_visible = false;

@ -38,8 +38,8 @@
#include <framework/core/binarytree.h> #include <framework/core/binarytree.h>
Item::Item() : Item::Item() :
m_id(0), m_clientId(0),
m_otbId(0), m_serverId(0),
m_countOrSubType(1) m_countOrSubType(1)
{ {
} }
@ -60,7 +60,7 @@ ItemPtr Item::createFromOtb(int id)
void Item::draw(const Point& dest, float scaleFactor, bool animate) void Item::draw(const Point& dest, float scaleFactor, bool animate)
{ {
if(m_id == 0) if(m_clientId == 0)
return; return;
// determine animation phase // determine animation phase
@ -179,9 +179,8 @@ void Item::setId(uint32 id)
{ {
if(!g_things.isValidDatId(id, ThingCategoryItem)) if(!g_things.isValidDatId(id, ThingCategoryItem))
id = 0; id = 0;
//m_otbId = g_things.findItemTypeByClientId(id)->getServerId(); m_serverId = g_things.findItemTypeByClientId(id)->getServerId();
m_id = id; m_clientId = id;
m_otbId = 0;
} }
void Item::setOtbId(uint16 id) void Item::setOtbId(uint16 id)
@ -189,17 +188,17 @@ void Item::setOtbId(uint16 id)
if(!g_things.isValidOtbId(id)) if(!g_things.isValidOtbId(id))
id = 0; id = 0;
auto itemType = g_things.getItemType(id); auto itemType = g_things.getItemType(id);
m_otbId = id; m_serverId = id;
id = itemType->getClientId(); id = itemType->getClientId();
if(!g_things.isValidDatId(id, ThingCategoryItem)) if(!g_things.isValidDatId(id, ThingCategoryItem))
id = 0; id = 0;
m_id = id; m_clientId = id;
} }
bool Item::isValid() bool Item::isValid()
{ {
return g_things.isValidDatId(m_id, ThingCategoryItem); return g_things.isValidDatId(m_clientId, ThingCategoryItem);
} }
void Item::unserializeItem(const BinaryTreePtr &in) void Item::unserializeItem(const BinaryTreePtr &in)
@ -344,10 +343,10 @@ ItemPtr Item::clone()
const ThingTypePtr& Item::getThingType() const ThingTypePtr& Item::getThingType()
{ {
return g_things.getThingType(m_id, ThingCategoryItem); return g_things.getThingType(m_clientId, ThingCategoryItem);
} }
ThingType* Item::rawGetThingType() ThingType* Item::rawGetThingType()
{ {
return g_things.rawGetThingType(m_id, ThingCategoryItem); return g_things.rawGetThingType(m_clientId, ThingCategoryItem);
} }

@ -92,8 +92,9 @@ public:
int getCountOrSubType() { return m_countOrSubType; } int getCountOrSubType() { return m_countOrSubType; }
int getSubType(); int getSubType();
int getCount(); int getCount();
uint32 getId() { return m_id; } uint32 getId() { return m_clientId; }
uint16 getServerId() { return m_otbId; } uint16 getClientId() { return m_clientId; }
uint16 getServerId() { return m_serverId; }
bool isValid(); bool isValid();
ItemPtr clone(); ItemPtr clone();
@ -127,8 +128,8 @@ public:
ThingType *rawGetThingType(); ThingType *rawGetThingType();
private: private:
uint16 m_id; uint16 m_clientId;
uint16 m_otbId; uint16 m_serverId;
uint8 m_countOrSubType; uint8 m_countOrSubType;
stdext::packed_storage<uint8> m_attribs; stdext::packed_storage<uint8> m_attribs;
std::vector<ItemPtr> m_containerItems; std::vector<ItemPtr> m_containerItems;

@ -49,18 +49,13 @@ void Map::loadOtbm(const std::string& fileName)
stdext::throw_exception("could not read root property!"); stdext::throw_exception("could not read root property!");
uint32 headerVersion = root->getU32(); uint32 headerVersion = root->getU32();
if(!headerVersion || headerVersion > 3) if(headerVersion > 3)
stdext::throw_exception(stdext::format("Unknown OTBM version detected: %u.", headerVersion)); stdext::throw_exception(stdext::format("Unknown OTBM version detected: %u.", headerVersion));
setWidth(root->getU16()); setWidth(root->getU16());
setHeight(root->getU16()); setHeight(root->getU16());
uint32 headerMajorItems = root->getU8(); uint32 headerMajorItems = root->getU8();
if(headerMajorItems < 3) {
stdext::throw_exception(stdext::format("This map needs to be upgraded. read %d what it's supposed to be: %u",
headerMajorItems, g_things.getOtbMajorVersion()));
}
if(headerMajorItems > g_things.getOtbMajorVersion()) { if(headerMajorItems > g_things.getOtbMajorVersion()) {
stdext::throw_exception(stdext::format("This map was saved with different OTB version. read %d what it's supposed to be: %d", stdext::throw_exception(stdext::format("This map was saved with different OTB version. read %d what it's supposed to be: %d",
headerMajorItems, g_things.getOtbMajorVersion())); headerMajorItems, g_things.getOtbMajorVersion()));
@ -213,7 +208,7 @@ void Map::loadOtbm(const std::string& fileName)
g_logger.debug("OTBM read successfully."); g_logger.debug("OTBM read successfully.");
fin->close(); fin->close();
loadSpawns(getSpawnFile()); //loadSpawns(getSpawnFile());
// m_houses.load(getHouseFile()); // m_houses.load(getHouseFile());
} }
@ -223,6 +218,7 @@ void Map::saveOtbm(const std::string &fileName)
if(!fin) if(!fin)
stdext::throw_exception(stdext::format("failed to open file '%s' for write", fileName)); stdext::throw_exception(stdext::format("failed to open file '%s' for write", fileName));
fin->cache();
std::string dir; std::string dir;
if(fileName.find_last_of('/') == std::string::npos) if(fileName.find_last_of('/') == std::string::npos)
dir = g_resources.getWorkDir(); dir = g_resources.getWorkDir();
@ -568,10 +564,7 @@ void Map::saveOtcm(const std::string& fileName)
fin->addU16(pos.y); fin->addU16(pos.y);
fin->addU8(pos.z); fin->addU8(pos.z);
const auto& list = tile->getThings(); for(const ThingPtr& thing : tile->getThings()) {
auto first = std::find_if(list.begin(), list.end(), [](const ThingPtr& thing) { return thing->isItem(); });
for(auto it = first, end = list.end(); it != end; ++it) {
const ThingPtr& thing = *it;
if(thing->isItem()) { if(thing->isItem()) {
ItemPtr item = thing->static_self_cast<Item>(); ItemPtr item = thing->static_self_cast<Item>();
fin->addU16(item->getId()); fin->addU16(item->getId());

@ -55,6 +55,7 @@ void ThingTypeManager::terminate()
for(int i = 0; i < ThingLastCategory; ++i) for(int i = 0; i < ThingLastCategory; ++i)
m_thingTypes[i].clear(); m_thingTypes[i].clear();
m_itemTypes.clear(); m_itemTypes.clear();
m_reverseItemTypes.clear();
m_nullThingType = nullptr; m_nullThingType = nullptr;
m_nullItemType = nullptr; m_nullItemType = nullptr;
} }
@ -115,11 +116,18 @@ void ThingTypeManager::loadOtb(const std::string& file)
root->getU32(); // build number root->getU32(); // build number
root->skip(128); // description root->skip(128); // description
m_reverseItemTypes.clear();
m_itemTypes.resize(root->getChildren().size(), m_nullItemType); m_itemTypes.resize(root->getChildren().size(), m_nullItemType);
for(const BinaryTreePtr& node : root->getChildren()) { for(const BinaryTreePtr& node : root->getChildren()) {
ItemTypePtr itemType(new ItemType); ItemTypePtr itemType(new ItemType);
itemType->unserialize(node); itemType->unserialize(node);
addItemType(itemType); addItemType(itemType);
uint16 clientId = itemType->getClientId();
if(clientId >= m_reverseItemTypes.size())
m_reverseItemTypes.resize(clientId+1);
m_reverseItemTypes[clientId] = itemType;
} }
m_otbLoaded = true; m_otbLoaded = true;
@ -237,15 +245,13 @@ void ThingTypeManager::addItemType(const ItemTypePtr& itemType)
const ItemTypePtr& ThingTypeManager::findItemTypeByClientId(uint16 id) const ItemTypePtr& ThingTypeManager::findItemTypeByClientId(uint16 id)
{ {
if(m_itemTypes.empty()) if(id == 0 || id >= m_reverseItemTypes.size())
return m_nullItemType; return m_nullItemType;
for(const ItemTypePtr& itemType : m_itemTypes) { if(m_reverseItemTypes[id])
if(itemType->getClientId() == id) return m_reverseItemTypes[id];
return itemType; else
} return m_nullItemType;
return m_nullItemType;
} }
const ThingTypePtr& ThingTypeManager::getThingType(uint16 id, ThingCategory category) const ThingTypePtr& ThingTypeManager::getThingType(uint16 id, ThingCategory category)

@ -71,6 +71,7 @@ public:
private: private:
ThingTypeList m_thingTypes[ThingLastCategory]; ThingTypeList m_thingTypes[ThingLastCategory];
ItemTypeList m_reverseItemTypes;
ItemTypeList m_itemTypes; ItemTypeList m_itemTypes;
ThingTypePtr m_nullThingType; ThingTypePtr m_nullThingType;

Loading…
Cancel
Save