static int l_path_depersist(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata<pathfinder>(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); pPathfinder->depersist(pReader); luaT_getenvfield(L, 2, "map"); pPathfinder->set_default_map(reinterpret_cast<level_map*>(lua_touserdata(L, -1))); return 0; }
static int l_path_depersist(lua_State *L) { THPathfinder* pPathfinder = luaT_testuserdata<THPathfinder>(L); lua_settop(L, 2); lua_insert(L, 1); LuaPersistReader* pReader = (LuaPersistReader*)lua_touserdata(L, 1); pPathfinder->depersist(pReader); luaT_getenvfield(L, 2, "map"); pPathfinder->setDefaultMap(reinterpret_cast<THMap*>(lua_touserdata(L, -1))); return 0; }
static int l_map_depersist(lua_State *L) { THMap* pMap = luaT_testuserdata<THMap>(L); lua_settop(L, 2); lua_insert(L, 1); LuaPersistReader* pReader = (LuaPersistReader*)lua_touserdata(L, 1); pMap->depersist(pReader); luaT_getenvfield(L, 2, "sprites"); pMap->setBlockSheet((THSpriteSheet*)lua_touserdata(L, -1)); lua_pop(L, 1); return 0; }
static int l_map_depersist(lua_State *L) { level_map* pMap = luaT_testuserdata<level_map>(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); pMap->depersist(pReader); luaT_getenvfield(L, 2, "sprites"); pMap->set_block_sheet((sprite_sheet*)lua_touserdata(L, -1)); lua_pop(L, 1); return 0; }
static int l_bitmap_font_get_spritesheet(lua_State *L) { luaT_testuserdata<THBitmapFont>(L); luaT_getenvfield(L, 1, "sprites"); return 1; }
void THAnimation::depersist(LuaPersistReader *pReader) { lua_State *L = pReader->getStack(); do { // Read the chain if(!pReader->readStackObject()) break; m_pNext = reinterpret_cast<THLinkList*>(lua_touserdata(L, -1)); if(m_pNext) m_pNext->m_pPrev = this; lua_pop(L, 1); // Read THDrawable fields if(!pReader->readVUInt(m_iFlags)) break; int iFunctionSet; if(!pReader->readVUInt(iFunctionSet)) break; switch(iFunctionSet) { case 3: // 3 should be the morph set, but the actual morph target is // missing, so settle for a graphical bug rather than a segfault // by reverting to the normal function set. case 1: m_fnDraw = THAnimation_Draw; m_fnHitTest = THAnimation_HitTest; break; case 2: m_fnDraw = THAnimation_DrawChild; m_fnHitTest = THAnimation_HitTestChild; break; case 4: m_fnDraw = THAnimation_DrawMorph; m_fnHitTest = THAnimation_HitTestMorph; pReader->readStackObject(); m_pMorphTarget = reinterpret_cast<THAnimation*>(lua_touserdata(L, -1)); lua_pop(L, 1); break; default: pReader->setError(lua_pushfstring(L, "Unknown animation function set #%i", iFunctionSet)); return; } // Read the simple fields if(!pReader->readVUInt(m_iAnimation)) break; if(!pReader->readVUInt(m_iFrame)) break; if(!pReader->readVInt(m_iX)) break; if(!pReader->readVInt(m_iY)) break; int iDummy; if(!pReader->readVInt(iDummy)) break; if(iDummy >= 0) m_iSoundToPlay = (unsigned int)iDummy; if(!pReader->readVInt(iDummy)) break; if(m_iFlags & THDF_Crop) { if(!pReader->readVInt(m_iCropColumn)) break; } else m_iCropColumn = 0; // Read the unioned fields if(m_fnDraw != THAnimation_DrawChild) { if(!pReader->readVInt(m_iSpeedX)) break; if(!pReader->readVInt(m_iSpeedY)) break; } else { if(!pReader->readStackObject()) break; m_pParent = (THAnimation*)lua_touserdata(L, -1); lua_pop(L, 1); } // Read the layers memset(m_oLayers.iLayerContents, 0, sizeof(m_oLayers.iLayerContents)); int iNumLayers; if(!pReader->readVUInt(iNumLayers)) break; if(iNumLayers > 13) { if(!pReader->readByteStream(m_oLayers.iLayerContents, 13)) break; if(!pReader->readByteStream(NULL, iNumLayers - 13)) break; } else { if(!pReader->readByteStream(m_oLayers.iLayerContents, iNumLayers)) break; } // Fix the m_pAnimator field luaT_getenvfield(L, 2, "animator"); m_pManager = (THAnimationManager*)lua_touserdata(L, -1); lua_pop(L, 1); return; } while(false); pReader->setError("Cannot depersist THAnimation instance"); }
void THSpriteRenderList::depersist(LuaPersistReader *pReader) { lua_State *L = pReader->getStack(); if(!pReader->readVUInt(m_iNumSprites)) return; m_iBufferSize = m_iNumSprites; delete[] m_pSprites; m_pSprites = new _sprite_t[m_iBufferSize]; if(!pReader->readVUInt(m_iFlags)) return; if(!pReader->readVInt(m_iX)) return; if(!pReader->readVInt(m_iY)) return; if(!pReader->readVInt(m_iSpeedX)) return; if(!pReader->readVInt(m_iSpeedY)) return; if(!pReader->readVInt(m_iLifetime)) return; for(_sprite_t *pSprite = m_pSprites, *pLast = m_pSprites + m_iNumSprites; pSprite != pLast; ++pSprite) { if(!pReader->readVUInt(pSprite->iSprite)) return; if(!pReader->readVInt(pSprite->iX)) return; if(!pReader->readVInt(pSprite->iY)) return; } // Read the layers memset(m_oLayers.iLayerContents, 0, sizeof(m_oLayers.iLayerContents)); int iNumLayers; if(!pReader->readVUInt(iNumLayers)) return; if(iNumLayers > 13) { if(!pReader->readByteStream(m_oLayers.iLayerContents, 13)) return; if(!pReader->readByteStream(NULL, iNumLayers - 13)) return; } else { if(!pReader->readByteStream(m_oLayers.iLayerContents, iNumLayers)) return; } // Read the chain if(!pReader->readStackObject()) return; m_pNext = reinterpret_cast<THLinkList*>(lua_touserdata(L, -1)); if(m_pNext) m_pNext->m_pPrev = this; lua_pop(L, 1); // Fix the m_pSpriteSheet field luaT_getenvfield(L, 2, "sheet"); m_pSpriteSheet = (THSpriteSheet*)lua_touserdata(L, -1); lua_pop(L, 1); }