Implemented a function to save .spr file
This commit is contained in:
parent
67c2453c82
commit
53803b2218
|
@ -94,6 +94,7 @@ void Client::registerLuaFunctions()
|
||||||
|
|
||||||
g_lua.registerSingletonClass("g_sprites");
|
g_lua.registerSingletonClass("g_sprites");
|
||||||
g_lua.bindSingletonFunction("g_sprites", "loadSpr", &SpriteManager::loadSpr, &g_sprites);
|
g_lua.bindSingletonFunction("g_sprites", "loadSpr", &SpriteManager::loadSpr, &g_sprites);
|
||||||
|
g_lua.bindSingletonFunction("g_sprites", "saveSpr", &SpriteManager::saveSpr, &g_sprites);
|
||||||
g_lua.bindSingletonFunction("g_sprites", "unload", &SpriteManager::unload, &g_sprites);
|
g_lua.bindSingletonFunction("g_sprites", "unload", &SpriteManager::unload, &g_sprites);
|
||||||
g_lua.bindSingletonFunction("g_sprites", "isLoaded", &SpriteManager::isLoaded, &g_sprites);
|
g_lua.bindSingletonFunction("g_sprites", "isLoaded", &SpriteManager::isLoaded, &g_sprites);
|
||||||
g_lua.bindSingletonFunction("g_sprites", "getSprSignature", &SpriteManager::getSignature, &g_sprites);
|
g_lua.bindSingletonFunction("g_sprites", "getSprSignature", &SpriteManager::getSignature, &g_sprites);
|
||||||
|
|
|
@ -63,6 +63,60 @@ bool SpriteManager::loadSpr(std::string file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpriteManager::saveSpr(std::string fileName)
|
||||||
|
{
|
||||||
|
if(!m_loaded)
|
||||||
|
stdext::throw_exception("failed to save, spr is not loaded");
|
||||||
|
|
||||||
|
try {
|
||||||
|
FileStreamPtr fin = g_resources.createFile(fileName);
|
||||||
|
if(!fin)
|
||||||
|
stdext::throw_exception(stdext::format("failed to open file '%s' for write", fileName));
|
||||||
|
|
||||||
|
fin->cache();
|
||||||
|
|
||||||
|
fin->addU32(m_signature);
|
||||||
|
if(g_game.getFeature(Otc::GameSpritesU32))
|
||||||
|
fin->addU32(m_spritesCount);
|
||||||
|
else
|
||||||
|
fin->addU16(m_spritesCount);
|
||||||
|
|
||||||
|
uint32 offset = fin->tell();
|
||||||
|
uint32 spriteAddress = offset + 4 * m_spritesCount;
|
||||||
|
for(int i = 1; i <= m_spritesCount; i++)
|
||||||
|
fin->addU32(0);
|
||||||
|
|
||||||
|
for(int i = 1; i <= m_spritesCount; i++) {
|
||||||
|
m_spritesFile->seek((i - 1) * 4 + m_spritesOffset);
|
||||||
|
uint32 fromAdress = m_spritesFile->getU32();
|
||||||
|
if(fromAdress != 0) {
|
||||||
|
fin->seek(offset + (i - 1) * 4);
|
||||||
|
fin->addU32(spriteAddress);
|
||||||
|
fin->seek(spriteAddress);
|
||||||
|
|
||||||
|
m_spritesFile->seek(fromAdress);
|
||||||
|
fin->addU8(m_spritesFile->getU8());
|
||||||
|
fin->addU8(m_spritesFile->getU8());
|
||||||
|
fin->addU8(m_spritesFile->getU8());
|
||||||
|
|
||||||
|
uint16 dataSize = m_spritesFile->getU16();
|
||||||
|
char spriteData[dataSize];
|
||||||
|
fin->addU16(dataSize);
|
||||||
|
m_spritesFile->read(spriteData, dataSize);
|
||||||
|
fin->write(spriteData, dataSize);
|
||||||
|
|
||||||
|
spriteAddress = fin->tell();
|
||||||
|
}
|
||||||
|
//TODO: Check for overwritten sprites.
|
||||||
|
}
|
||||||
|
|
||||||
|
fin->flush();
|
||||||
|
fin->close();
|
||||||
|
} catch(std::exception& e) {
|
||||||
|
g_logger.error(stdext::format("Failed to save '%s': %s", fileName, e.what()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SpriteManager::unload()
|
void SpriteManager::unload()
|
||||||
{
|
{
|
||||||
m_spritesCount = 0;
|
m_spritesCount = 0;
|
||||||
|
|
|
@ -37,6 +37,8 @@ public:
|
||||||
bool loadSpr(std::string file);
|
bool loadSpr(std::string file);
|
||||||
void unload();
|
void unload();
|
||||||
|
|
||||||
|
void saveSpr(std::string fileName);
|
||||||
|
|
||||||
uint32 getSignature() { return m_signature; }
|
uint32 getSignature() { return m_signature; }
|
||||||
int getSpritesCount() { return m_spritesCount; }
|
int getSpritesCount() { return m_spritesCount; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue