Example #1
0
/*
 * 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);
}
Example #2
0
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;
		}
	}
}
Example #3
0
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;
}
Example #4
0
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;
		}
	}
}