📄 monsterinfo.cpp
字号:
TreasureList* pVampireTreasureList = new TreasureList; const vector<MonsterType_t>& MTypeVector = getMonsterTypeBySprite(SType); for (uint i=0; i<MTypeVector.size(); i++) { int MType = MTypeVector[i]; MonsterInfo* pMonsterInfo = (MonsterInfo*)getMonsterInfo(MType); if (i == 0) { pMonsterInfo->setSlayerTreasureList(pSlayerTreasureList); pMonsterInfo->setVampireTreasureList(pVampireTreasureList); pMonsterInfo->parseSlayerTreasureString(slayer_treasure); pMonsterInfo->parseVampireTreasureString(vampire_treasure); // 颇老俊促 敬促. //saveTreasure((string)(hname + ".slayer"), pSlayerTreasureList); //saveTreasure((string)(hname + ".vampire"), pVampireTreasureList); } else { pMonsterInfo->setSlayerTreasureList(pSlayerTreasureList); pMonsterInfo->setVampireTreasureList(pVampireTreasureList); } // 八刘茄促. cout << "MonsterType:" << pMonsterInfo->getMonsterType() << ",MonsterName:" << pMonsterInfo->getEName() << ",SlayerTreasure:" << pMonsterInfo->getSlayerTreasureList()->getTreasures().size() << ",VampireTreasure:" << pMonsterInfo->getVampireTreasureList()->getTreasures().size() << endl; } slayer_treasure.clear(); vampire_treasure.clear(); } */ SAFE_DELETE(pStmt); } END_DB(pStmt) hash_map<int, vector<SpriteType_t> >::iterator itr = m_MonsterClassMap.begin(); hash_map<int, vector<SpriteType_t> >::iterator endItr = m_MonsterClassMap.end(); for ( ; itr != endItr ; ++itr ) { cout << "Class[" << itr->first << "] : "; copy( itr->second.begin(), itr->second.end(), ostream_iterator<SpriteType_t>( cout, ", " ) ); cout << endl; } __END_DEBUG __END_CATCH}void MonsterInfoManager::reload (MonsterType_t monsterType) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG bool bLoadAll = (monsterType==0); Statement* pStmt = NULL; Result* pResult = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT MAX(MType) FROM MonsterInfo"); StringStream sql; sql << "SELECT MType, SType, HName, EName, Level, STR, DEX, INTE, BSize, Exp, MColor, SColor, Align, AOrder, Moral, Delay, ADelay, Sight, MeleeRange, MissileRange, RegenPortal, RegenInvisible, RegenBat, MMode, AIType, Enhance, UnburrowChance, Master, ClanType, MonsterSummonInfo, DefaultEffects, NormalRegen " << " FROM MonsterInfo"; // 傈何 促 loading窍绰霸 酒聪扼搁 漂沥 MonsterType阑 汲沥茄促. if (!bLoadAll) { sql << " WHERE MType=" << monsterType; } pResult = pStmt->executeQuery( sql.toString().c_str() ); while (pResult->next()) { int i = 0; int MType = pResult->getInt(++i); MonsterInfo* pMonsterInfo = (MonsterInfo*)getMonsterInfo(MType); if (pMonsterInfo!=NULL) { pMonsterInfo->setSpriteType(pResult->getInt(++i)); pMonsterInfo->setHName(pResult->getString(++i)); pMonsterInfo->setEName(pResult->getString(++i)); pMonsterInfo->setLevel(pResult->getInt(++i)); pMonsterInfo->setSTR(pResult->getInt(++i)); pMonsterInfo->setDEX(pResult->getInt(++i)); pMonsterInfo->setINT(pResult->getInt(++i)); pMonsterInfo->setBodySize(pResult->getInt(++i)); pMonsterInfo->setExp(pResult->getInt(++i)); pMonsterInfo->setMainColor(pResult->getInt(++i)); pMonsterInfo->setSubColor(pResult->getInt(++i)); pMonsterInfo->setAlignment((MAlignment)pResult->getInt(++i)); pMonsterInfo->setAttackOrder((AttackOrder)pResult->getInt(++i)); pMonsterInfo->setMoral(pResult->getInt(++i)); pMonsterInfo->setDelay(pResult->getInt(++i)); pMonsterInfo->setAttackDelay(pResult->getInt(++i)); pMonsterInfo->setSight(pResult->getInt(++i)); pMonsterInfo->setMeleeRange(pResult->getInt(++i)); pMonsterInfo->setMissileRange(pResult->getInt(++i)); int nPortal = pResult->getInt(++i); int nInvisible = pResult->getInt(++i); int nBat = pResult->getInt(++i); pMonsterInfo->setRegenType(REGENTYPE_PORTAL, nPortal); pMonsterInfo->setRegenType(REGENTYPE_INVISIBLE, nInvisible); pMonsterInfo->setRegenType(REGENTYPE_BAT, nBat); pMonsterInfo->setMoveMode(pResult->getString(++i)); pMonsterInfo->setAIType(pResult->getInt(++i)); pMonsterInfo->parseEnhanceAttr(pResult->getString(++i)); pMonsterInfo->setUnburrowChance(pResult->getInt(++i)); pMonsterInfo->setMaster(pResult->getInt(++i)!=0); pMonsterInfo->setClanType(pResult->getInt(++i)); pMonsterInfo->setMonsterSummonInfo(pResult->getString(++i)); pMonsterInfo->setDefaultEffects(pResult->getString(++i)); pMonsterInfo->setNormalRegen(pResult->getInt(++i)!=0); } } int startType = 0; int endType = m_MaxMonsterType; // 傈何 促 loading窍绰霸 酒聪扼搁 漂沥 MonsterType阑 汲沥茄促. if (!bLoadAll) { startType = monsterType; endType = monsterType+1; } clearTreasures(); for (int i=startType; i<endType; i++) { MonsterInfo* pInfo = m_MonsterInfos[i]; if (pInfo != NULL) { if (pInfo->hasTreasure()) { string slayer_filename = g_pConfig->getProperty("HomePath") + "/data/" + pInfo->getHName() + ".slayer.bin"; string vampire_filename = g_pConfig->getProperty("HomePath") + "/data/" + pInfo->getHName() + ".vampire.bin"; string ousters_filename = g_pConfig->getProperty("HomePath") + "/data/" + pInfo->getHName() + ".ousters.bin"; TreasureList* pSlayerTreasureList = m_SlayerTreasureLists.getTreasure( slayer_filename ); TreasureList* pVampireTreasureList = m_VampireTreasureLists.getTreasure( vampire_filename ); TreasureList* pOustersTreasureList = m_OustersTreasureLists.getTreasure( ousters_filename ); if (pSlayerTreasureList==NULL) { printf("Load - slayer_filename:%s\n", slayer_filename.c_str()); pSlayerTreasureList = m_SlayerTreasureLists.loadTreasure( slayer_filename ); Assert(pSlayerTreasureList!=NULL); } if (pVampireTreasureList==NULL) { printf("Load - vampire_filename:%s\n", vampire_filename.c_str()); pVampireTreasureList = m_VampireTreasureLists.loadTreasure( vampire_filename ); Assert(pVampireTreasureList!=NULL); } if (pOustersTreasureList==NULL) { printf("Load - ousters_filename:%s\n", ousters_filename.c_str()); pOustersTreasureList = m_OustersTreasureLists.loadTreasure( ousters_filename ); Assert(pOustersTreasureList!=NULL); } pInfo->setSlayerTreasureList(pSlayerTreasureList); pInfo->setVampireTreasureList(pVampireTreasureList); pInfo->setOustersTreasureList(pOustersTreasureList); // 八刘茄促. /* cout << "MonsterType:" << pInfo->getMonsterType() << ",MonsterName:" << pInfo->getEName() << ",SlayerTreasure:" << pInfo->getSlayerTreasureList()->getTreasures().size() << ",VampireTreasure:" << pInfo->getVampireTreasureList()->getTreasures().size() << endl; */ } } } SAFE_DELETE(pStmt); } END_DB(pStmt) __END_DEBUG __END_CATCH}void MonsterInfoManager::addMonsterInfo (MonsterType_t monsterType , MonsterInfo* pMonsterInfo) throw (DuplicatedException , OutOfBoundException , Error){ __BEGIN_TRY if (monsterType >= m_MaxMonsterType) { cerr << "MonsterInfoManager::addMonsterInfo() : Out of bounds" << endl; throw OutOfBoundException(); } if (m_MonsterInfos[monsterType] != NULL) { cerr << "MonsterInfoManager::addMonsterInfo() : Duplicated Exception" << endl; throw DuplicatedException(); } m_MonsterInfos[monsterType] = pMonsterInfo; if (pMonsterInfo->isNormalRegen()) { m_MonsterSpriteSet[pMonsterInfo->getSpriteType()].push_back(monsterType); } m_MonsterSpriteTypes[pMonsterInfo->getHName()] = pMonsterInfo->getSpriteType(); if (pMonsterInfo->isChief()) { m_ChiefMonster[pMonsterInfo->getHName()] = pMonsterInfo->getMonsterType(); } if ( pMonsterInfo->getMonsterClass() != 0 && pMonsterInfo->isNormalRegen() ) { vector<SpriteType_t>& mList = m_MonsterClassMap[pMonsterInfo->getMonsterClass()]; vector<SpriteType_t>::iterator itr = find_if( mList.begin(), mList.end(), bind2nd( greater_equal<int>(), pMonsterInfo->getSpriteType() ) ); if ( itr == mList.end() || *itr != pMonsterInfo->getSpriteType() ) mList.insert( itr, pMonsterInfo->getSpriteType() ); } __END_CATCH}const MonsterInfo* MonsterInfoManager::getMonsterInfo (MonsterType_t monsterType) const throw (NoSuchElementException , OutOfBoundException , Error){ __BEGIN_TRY if (monsterType >= m_MaxMonsterType) { cerr << "MonsterInfoManager::getMonsterInfo() : Out of bounds" << endl; throw OutOfBoundException(); } if (m_MonsterInfos[monsterType] == NULL) { cerr << "MonsterInfoManager::getMonsterInfo() : No Such Element Exception" << endl; throw NoSuchElementException(); } // 老窜 困俊辑 茄锅 眉农啊 登搁 [] 甫 结档 等促. return m_MonsterInfos[monsterType]; __END_CATCH}const vector<MonsterType_t>& MonsterInfoManager::getMonsterTypeBySprite(SpriteType_t spriteType) const throw (NoSuchElementException , OutOfBoundException , Error){ __BEGIN_TRY if (m_MonsterSpriteSet[spriteType].empty()) { cerr << "MonsterInfoManager::getMonsterTypeBySprite() : no such element exception" << (int)spriteType << endl; throw NoSuchElementException(); } if (spriteType >= MAX_SPRITE_TYPE) { cerr << "MonsterInfoManager::getMonsterTypeBySprite() : out of bounds" << endl; throw OutOfBoundException(); } return m_MonsterSpriteSet[spriteType]; __END_CATCH}SpriteType_t MonsterInfoManager::getSpriteTypeByName(const string& monsterName) const throw (NoSuchElementException , Error){ __BEGIN_TRY hash_map<string, SpriteType_t>::const_iterator itr = m_MonsterSpriteTypes.find( monsterName ); if (itr==m_MonsterSpriteTypes.end()) { //cerr << "MonsterInfoManager::getMonsterTypeBySprite() : no such element exception" << endl; //throw NoSuchElementException(); return 0; } return itr->second; __END_CATCH}MonsterType_t MonsterInfoManager::getChiefMonsterTypeByName(const string& monsterName) const throw (NoSuchElementException , Error){ __BEGIN_TRY hash_map<string, SpriteType_t>::const_iterator itr = m_ChiefMonster.find( monsterName ); if (itr==m_ChiefMonster.end()) { //cerr << "MonsterInfoManager::getMonsterTypeBySprite() : no such element exception" << endl; //throw NoSuchElementException(); return 0; } return itr->second; __END_CATCH}MonsterType_t MonsterInfoManager::getRandomMonsterByClass( int minClass, int maxClass ){ int totalCand = 0; for ( int i = minClass; i <= maxClass; ++i ) { totalCand += m_MonsterClassMap[i].size(); } int value = rand()%totalCand; SpriteType_t Target; int index = minClass; while ( true ) { vector<SpriteType_t>& sList = m_MonsterClassMap[index]; if ( value >= sList.size() ) { value -= sList.size(); ++index; } else { Target = sList[value]; break; } } return getMonsterTypeBySprite(Target).front();}string MonsterInfoManager::toString () const throw (){ __BEGIN_TRY StringStream msg; msg << "MonsterInfoManager("; for (uint i = 0 ; i < m_MaxMonsterType ; i ++) { if (m_MonsterInfos[i] == NULL) msg << "NULL"; else msg << m_MonsterInfos[i]->toString(); } msg << ")"; return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -