📄 monsterkillquest.cpp
字号:
//--------------------------------------------------------------------------------// MonsterKillQuest.cpp//--------------------------------------------------------------------------------#ifdef __QUEST_TEST__ #include "FakeMonsterInfo.h"#else #include "MonsterInfo.h"#endif#include "MonsterKillQuest.h"#include "QuestPriceReward.h"#include "QuestPricePenalty.h"#include "QuestEventMonsterKill.h"#include "Assert.h"#include "DB.h"const int maxMonsterTypeInfo = 10;const int levelToMonsterTypeDivider = 10;//--------------------------------------------------------------------------------// static//--------------------------------------------------------------------------------MonsterKillQuestFactory::MonsterTypeInfos MonsterKillQuestFactory::m_MonsterTypeInfos;//--------------------------------------------------------------------------------// create//--------------------------------------------------------------------------------void MonsterKillQuest::create() throw (Error){ __BEGIN_TRY Statement* pStmt = NULL; Turn_t currentYearTime; getCurrentYearTime(currentYearTime); BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery( "INSERT INTO SimpleQuest (OwnerID, QuestType, Objective, Reward, Penalty, YearTime, DayTime) Values ('%s', %d, '%s', '%s', '%s', %d, %d)", m_pOwner->getName().c_str(), (int)getQuestType(), getObjectiveToString().c_str(), getRewardToString().c_str(), getPenaltyToString().c_str(), currentYearTime, m_Deadline.tv_sec); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}//--------------------------------------------------------------------------------// save//--------------------------------------------------------------------------------void MonsterKillQuest::save() throw (Error){ __BEGIN_TRY Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("-_-"); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}//--------------------------------------------------------------------------------// check Success//--------------------------------------------------------------------------------bool MonsterKillQuest::checkSuccess(const QuestEvent* pQuestEvent) throw (Error){ __BEGIN_TRY if (getState()==STATE_ACTIVE) { if (pQuestEvent->getQuestEventType()==QuestEvent::QUEST_EVENT_MONSTER_KILL) { const QuestEventMonsterKill* pQuestEventMonsterKill = dynamic_cast<const QuestEventMonsterKill*>(pQuestEvent); if (*this==*pQuestEventMonsterKill) { // 茄 付府 临牢促. decreaseNumber(); // 促 磷看栏搁.. 肯丰 if (getNumber()==0) { setState( STATE_COMPLETE ); return true; } return false; } } } __END_CATCH return false;}//--------------------------------------------------------------------------------// check Complete//--------------------------------------------------------------------------------bool MonsterKillQuest::checkComplete() throw (Error){ __BEGIN_TRY __END_CATCH return true;}//--------------------------------------------------------------------------------// create//--------------------------------------------------------------------------------Quest* MonsterKillQuestFactory::create(const QuestCreateInfo* qcInfo) const throw (Error){ __BEGIN_TRY Assert(!m_MonsterTypeInfos.empty()); if (qcInfo==NULL) { return new MonsterKillQuest(m_MonsterTypeInfos[0]); } int total = m_MonsterTypeInfos.size(); int level = qcInfo->getLevel(); int index = total * level / 100; index = max(0, min(index, total)); MonsterKillQuest* pQuest = new MonsterKillQuest(m_MonsterTypeInfos[index]); Assert(pQuest!=NULL); // deadline int availableMinute = (rand()%6)*10+10; // 10盒~60盒 int goldReward = (level+(60-availableMinute)*2)*1000; int rankExpReward = (level+(60-availableMinute)*2)*1000; int goldPenalty = getPercentValue(goldReward, 20); int rankExpPenalty = getPercentValue(rankExpReward, 30); QuestPrice* pReward = new QuestPriceReward(goldReward, rankExpReward); QuestPrice* pPenalty = new QuestPricePenalty(goldPenalty, rankExpPenalty); pQuest->addReward( pReward ); pQuest->addPenalty( pPenalty ); pQuest->setAvailableSecond( availableMinute*60 ); // 盒阑 檬肺 return pQuest; __END_CATCH}//--------------------------------------------------------------------------------// init MonsterTypeInfos//--------------------------------------------------------------------------------void MonsterKillQuestFactory::initMonsterTypeInfos(){ __BEGIN_TRY m_MonsterTypeInfos.clear(); MonsterType_t monsterType = 0; SpriteType_t spriteType = 0; int maxMonsterInfo = g_pMonsterInfoManager->getMaxMonsterType(); for (int i=0; i<maxMonsterInfo; i++) { try { const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( i ); if (pMonsterInfo!=NULL) { if (!pMonsterInfo->isMaster()) { if (pMonsterInfo->isNormalRegen()) { monsterType = 0; spriteType = pMonsterInfo->getSpriteType(); } else { monsterType = i; spriteType = 0; } MonsterSelector mtc(monsterType, spriteType, 1); m_MonsterTypeInfos.push_back( mtc ); } } } catch (NoSuchElementException& ) { } } __END_CATCH}stringMonsterKillQuest::toString() const throw (Error){ __BEGIN_TRY StringStream msg; msg << "阁胶磐 磷捞扁(" << getObjectiveToString() << "), " << "己傍(" << getRewardToString() << ") : " << "角菩(" << getPenaltyToString() << ")"; switch (getState()) { case Quest::STATE_NULL : case Quest::STATE_WAIT : { msg << ", 荐青矫埃(" << (m_AvailableSecond/60) << ")盒"; } break; case Quest::STATE_COMPLETE : case Quest::STATE_END : msg << ", 肯丰"; break; default : { msg << ", 巢篮矫埃(" << (getRemainDuration()/600) << ")盒"; } } return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -