#include "stdafx.h" #include "PacketStruct_DW.h" #include "ServerSession.h" #include "ServerSessionManager.h" #include "../Lotto.h" #include "InitialState.h" // implemented by __NA_001359_20090619_HEIM_LOTTO_SYSTEM void LottoInitialState::OnEnter() { SUNLOG(eFULL_LOG, "[´óÀÖ͸] ½øÈë³õʼ״̬"); initRetryTimer_.SetTimer(0); // ÃÖÃÊ 1ȸ´Â °­Á¦·Î Expired »óÅ·ΠinitRetryTimer_.EnableCheckTime(); lotto_.winners_.clear(); page_ = 1; // ´ç÷ÀÚ ¸ñ·Ï ÆäÀÌÁö ¼ö ÃʱâÈ­ } void LottoInitialState::OnExit() { SUNLOG(eFULL_LOG, "[´óÀÖ͸] ÕýÔÚÍ˳ö³õʼ״̬"); initRetryTimer_.DisableCheckTime(); } void LottoInitialState::OnTick() { // ÃʱâÈ­ ½Ãµµ if (initRetryTimer_.IsExpired()) { SUNLOG(eFULL_LOG, "[´óÀÖ͸] ´óÀÖ͸³õʼ»¯ : ¼ÓÔØÖÐ..."); RequestLoad(); // ÃʱâÈ­ Àç½Ãµµ ŸÀÌ¸Ó ¸®¼Â if (initRetryTimer_.GetBaseIntervalTime() > 0) { initRetryTimer_.Reset(); } else { initRetryTimer_.SetTimer(60 * 1000); } } } void LottoInitialState::OnLoad(MSG_BASE* packet) { MSG_DW_LOTTO_LOAD_ACK* pRecvMsg = static_cast(packet); lotto_.numResults_ = pRecvMsg->bNumResultRecords; int currentDrawNum = pRecvMsg->wCurrentDrawNum; for (int i = 0; i < lotto_.numResults_; ++i) { LottoResult* result = lotto_.GetResult(i); ASSERT(result != NULL); if (result == NULL) { continue; } result->Reset(); ServerLottoResult& record = pRecvMsg->results[i]; result->drawNum = record.wDrawNum; if ( (currentDrawNum > 0) && (record.wDrawNum == currentDrawNum) ) { // ÁøÇà ÁßÀÎ ÇöÀç ȸÂ÷ÀÇ °æ¿ì ÃÑ Àû¸³¾×À» ÀоîµéÀδ٠result->totalAccum = pRecvMsg->i64TotalAccum; } else { // ÇöÀç ȸÂ÷ ÀüÀÇ °¡Àå ³ôÀº ȸÂ÷ ¹øÈ£¸¦ ÃÖÁ¾ Ãß÷ ȸÂ÷·Î ¼±Åà if (lotto_.lastDrawNum_ == 0) { lotto_.lastDrawNum_ = result->drawNum; } } result->numWinners = record.iNumWinners; result->jackpot = record.i64Jackpot; for (int j = 0; j < LottoConfig::NUM_PICKS; ++j) { result->winningNum[j] = record.bWinningNum[j]; } } // ÇöÀç ÁøÇà ÁßÀΠȸÂ÷°¡ ÀÖ´Ù¸é if (lotto_.numResults_ > 0) { SUNLOG(eFULL_LOG, "[´óÀÖ͸] ÒѼÓÔØ %d ½á¹û(s). µ±Ç°»æÖÆ # = %d, ×ܼÆÀÛ¼Æ = %I64d", lotto_.numResults_, lotto_.GetCurrentDrawNum(), lotto_.GetCurrentTotalAccum()); lotto_.TransitState(Lotto::ACTIVE_STATE); // Ȱ¼ºÈ­Çϱâ Àü¿¡ Á÷Àü ȸÂ÷ º¸»óÀÌ ¿Ï·áµÇ¾ú´ÂÁö Á¡°ËÇØ¾ß ÇÑ´Ù //RequestWinnerList(page_); } else { SUNLOG(eFULL_LOG, "[´óÀÖ͸] ³õʼ»¯µÚÒ»´Î»æÍ¼..."); // ÃÖÃÊ 1ȸÂ÷¸¦ ÃʱâÈ­ÇÑ´Ù. lotto_.PickRandomNumbers(nextWinningNum_); RequestRollOver(0, 0, 0, 0, 0, nextWinningNum_); } } void LottoInitialState::OnWinnerList(MSG_BASE* packet) { MSG_DW_LOTTO_WINNER_LIST_ACK* pRecvMsg = static_cast(packet); int page = pRecvMsg->iPage; int maxPage = pRecvMsg->iMaxPage; int numRecs = pRecvMsg->iNumRecords; ASSERT(numRecs <= LOTTO_NUM_WINNERS_PER_PAGE); if (numRecs > LOTTO_NUM_WINNERS_PER_PAGE) { numRecs = LOTTO_NUM_WINNERS_PER_PAGE; } for (int i = 0; i < numRecs; ++i) { LottoWinner winner; winner.idx = pRecvMsg->winners[i].i64Idx; winner.charGuid = pRecvMsg->winners[i].iCharGuid; winner.status = pRecvMsg->winners[i].bStatus; lotto_.winners_.push_back(winner); ASSERT(0 < winner.status && winner.status <= lotto_.config_.GetNumPrizes()); ++lotto_.numWinners_[winner.status - 1]; SUNLOG(eFULL_LOG, "[´óÀÖ͸] Ó®¼Ò [%d] : %d", winner.charGuid, winner.status); } if (page < maxPage) { RequestWinnerList(++page_); return; } if (lotto_.winners_.empty()) { lotto_.TransitState(Lotto::ACTIVE_STATE); } else { lotto_.TransitState(Lotto::INACTIVE_STATE); } } void LottoInitialState::OnRollOver(MSG_BASE* packet) { MSG_DW_LOTTO_ROLLOVER_ACK* pRecvMsg = static_cast(packet); if (pRecvMsg->iResult != 0) { SUNLOG(eCRITICAL_LOG, "[´óÀÖ͸] ¹ö¶¯Ê§°Ü!"); RequestRollOver(0, 0, 0, 0, 0, nextWinningNum_); // Àç½Ãµµ return; } lotto_.RollOver(nextWinningNum_); lotto_.TransitState(Lotto::ACTIVE_STATE); }