/* * level_disasm() */ static void level_disasm(uint8_t dunno, uint8_t levno) { uint32_t i; b3level_t *level; FILE *fp; uint16_t offset; rangeSkipList = gl_list_create_empty(GL_ARRAY_LIST, NULL, NULL, range_free, 1); level = readMap(duns[dunno].levels[levno]); currentLevel.dataStartOffset = level->dataBaseOffset; currentLevel.monsterIndex = level->monIndex; if ((dunno == 11) && (levno == 0)) currentLevel.codeStartOffset = 4; else currentLevel.codeStartOffset = 0; fp = xfopen(mkCodePath("%s-%d.code", duns[dunno].name, levno), "wb"); #undef DUMP_CODE #ifdef DUMP_CODE dump_btstring(bts_sprintf("%s-%d.dump", duns[dunno].name, levno), level->codeBuf, 0); #endif for (i = 0; i < level->dataCount; i++) { offset = level->dataList[i].offset; fprintf(fp, "(%3d, %3d) offset: %04x\n", level->dataList[i].sqE, level->dataList[i].sqN, offset ); } fprintf(fp, "=====================================\n"); disasmCode(fp, level->codeBuf, level->dataBaseOffset); gl_list_free(rangeSkipList); rangeSkipList = NULL; fclose(fp); freeLevel(level); }
void LevelManager::freeLevel(LevelLayer* levelLayer, bool freeData) { if (levelLayer == NULL) { return; } for (LEVEL_MAP::iterator itor = mLevelList.begin(); itor != mLevelList.end(); ++itor) { if (levelLayer == (*itor).second->levelLayer) { freeLevel((*itor).first, freeData); break; } } }
void LevelManager::deactiveCurrentLevel(bool free, bool freeData) { SpriteSeer* player = GameManager::Get()->getHero(); if(player != NULL) { CCTargetedTouchDelegate* target = dynamic_cast<CCTargetedTouchDelegate*>(player); if (target) { CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(target); } } // Note: 清空Npc实例及数据 std::map<int,SpriteNPC *> * pNpcTypeAndSprites = BoneNPCManager::getInstance()->GetNpcTypeIdAndSprites(); if (pNpcTypeAndSprites) { for (std::map<int,SpriteNPC *>::iterator iter = pNpcTypeAndSprites->begin(); iter != pNpcTypeAndSprites->end();iter++) { SpriteNPC *pNpc = (*iter).second; CCTargetedTouchDelegate* target = dynamic_cast<CCTargetedTouchDelegate*>(pNpc); if (target) { CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(target); } } pNpcTypeAndSprites->clear(); } // Note: 清空精灵数据 SpriteElfManager::Get()->RemoveAllElfInstance(); //remove from parent node removeLevelFromParent(mCurrentLevel); //free level or data if (free == true && mCurrentLevel) { freeLevel(mCurrentLevel, freeData); } //CCTextureCache::sharedTextureCache()->removeUnusedTextures(); //reset current active level mCurrentLevel = NULL; }
void LevelManager::freeAllLevels(bool freeData) { for (LEVEL_MAP::iterator itor = mLevelList.begin(); itor != mLevelList.end();) { freeLevel((*itor).first, freeData); if (freeData) { itor = mLevelList.begin(); } else { ++itor; } } }