/* * Lotto.h */ #ifndef _LOTTO_H_ #define _LOTTO_H_ #if _MSC_VER > 1000 #pragma once #endif #ifndef _LOTTO_STATE_H_ #include "LottoState.h" #endif #ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET struct TicketActivationXactionInfo { SLOTIDX index; POSTYPE pos; }; class TicketActivationXactions { public: TicketActivationXactions() {} void Add(CHARGUID char_guid, SLOTIDX index, POSTYPE pos); void Remove(CHARGUID char_guid); void Clear(); const TicketActivationXactionInfo* Find(CHARGUID char_guid) const; private: typedef stdext::hash_map XactionInfoMap; XactionInfoMap map_; }; #endif // _NA_20101011_HEIM_LOTTO_CASH_TICKET // ÇÏÀÓ ·Î¶Ç Ŭ·¡½º class Lotto { public: ~Lotto(); // ¼­¹ö ¸ÞÀÎ ·çÇÁ·ÎºÎÅÍ È£ÃâµÇ´Â OnTick() ÇÔ¼ö void Update() { currentState_->OnTick(); } // Ç÷¹À̾î ij¸¯ÅÍ Á¢¼Ó/ÇØÁ¦ Çڵ鷯 void OnPlayerJoin(CHARGUID charGuid) { currentState_->OnPlayerJoin(charGuid); } void OnPlayerLeave(CHARGUID charGuid) { currentState_->OnPlayerLeave(charGuid); } // Ŭ¶óÀÌ¾ðÆ® ¼ö½Å ÆÐŶ Çڵ鷯 // // [IN] MSG_CW_LOTTO_INFO_SYN void OnInfoRequest(CHARGUID charGuid, const MSG_CW_LOTTO_INFO_SYN* packet) { currentState_->OnInfoRequest(charGuid, packet); } // [IN] MSG_CW_LOTTO_ENTRY_SYN void OnEntryRequest(CHARGUID charGuid, const MSG_CW_LOTTO_ENTRY_SYN* packet) { currentState_->OnEntryRequest(charGuid, packet); } // [IN] MSG_CW_LOTTO_NOTICE_LIST_SYN void OnNoticeRequest(CHARGUID charGuid, const MSG_CW_LOTTO_NOTICE_LIST_SYN* packet) { currentState_->OnNoticeRequest(charGuid, packet); } // [IN] MSG_CW_LOTTO_NOTICE_CONFIRM void OnNoticeConfirm(CHARGUID charGuid, const MSG_CW_LOTTO_NOTICE_CONFIRM* packet) { currentState_->OnNoticeConfirm(charGuid, packet); } // ¼­¹ö ¼ö½Å ÆÐŶ Çڵ鷯 // // [IN] MSG_DW_LOTTO_LOAD_ENTRY_ACK void OnEntryLoad(const MSG_DW_LOTTO_LOAD_ENTRY_ACK* packet) { currentState_->OnEntryLoad(packet); } // [IN] MSG_DW_LOTTO_LOAD_ACK void OnLoad(const MSG_DW_LOTTO_LOAD_ACK* packet) { currentState_->OnLoad(packet); } // [IN] MSG_DW_LOTTO_SAVE_ENTRY_ACK void OnEntrySave(const MSG_DW_LOTTO_SAVE_ENTRY_ACK* packet) { currentState_->OnEntrySave(packet); } // [IN] MSG_DW_LOTTO_WINNER_LIST_ACK void OnWinnerList(const MSG_DW_LOTTO_WINNER_LIST_ACK* packet) { currentState_->OnWinnerList(packet); } // [IN] MSG_DW_LOTTO_ROLLOVER_ACK void OnRollOver(const MSG_DW_LOTTO_ROLLOVER_ACK* packet) { currentState_->OnRollOver(packet); } // [IN] MSG_DW_LOTTO_ADD_TICKET_ACK void OnTicketAcquisition(const MSG_DW_LOTTO_ADD_TICKET_ACK* packet) { currentState_->OnTicketAcquisition(packet); } // [IN] MSG_DW_LOTTO_REWARD_ACK void OnReward(const MSG_DW_LOTTO_REWARD_ACK* packet) { currentState_->OnReward(packet); } // [IN] MSG_DW_LOTTO_NOTICE_LIST_ACK void OnNoticeList(const MSG_DW_LOTTO_NOTICE_LIST_ACK* packet) { currentState_->OnNoticeList(packet); } // [IN] MSG_DW_LOTTO_NOTICE_DEL_ACK void OnNoticeDelete(const MSG_DW_LOTTO_NOTICE_DEL_ACK* packet) { currentState_->OnNoticeDelete(packet); } // [IN] MSG_AW_USER_STATUS_HEIM_CONSUMPTION_NTF void OnHeimConsumption(const MSG_AW_USER_STATUS_HEIM_CONSUMPTION_NTF* packet) { currentState_->OnHeimConsumption(packet); } // [IN] MSG_AW_USER_LOTTO_REWARD_ACK void OnActualReward(const MSG_AW_USER_LOTTO_REWARD_ACK* packet) { currentState_->OnActualReward(packet); } #ifdef _NA_0_20100115_HEIM_LOTTO_TICKET_PURCHASE // [IN] MSG_AW_USER_LOTTO_TICKET_PURCHASE_ACK void OnTicketPurchase(const MSG_AW_USER_LOTTO_TICKET_PURCHASE_ACK* packet) { currentState_->OnTicketPurchase(packet); } #endif // _NA_0_20100115_HEIM_LOTTO_TICKET_PURCHASE #ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET // [IN] MSG_AW_ITEM_USE_HEIM_LOTTO_TICKET_SYN void OnTicketActivation(const MSG_AW_ITEM_USE_HEIM_LOTTO_TICKET_SYN* packet) { currentState_->OnTicketActivation(packet); } #endif // void OnTotalAccumChange(INT64 delta) { currentState_->OnTotalAccumChange(delta); } // ÇöÀç ÁøÇà ÁßÀΠȸÂ÷ ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù int GetCurrentDrawNum() const { return (numResults_ > 0 ? results_[0].drawNum : 0); } // ÇöÀç ÁøÇà ÁßÀΠȸÂ÷ÀÇ ´ç÷ ¹øÈ£¸¦ ä¿î´Ù (GM ±â´É) void GetCurrentWinningNum(BYTE* numbers) const; // °­Á¦·Î Ãß÷ »óÅ·Π³Ñ¾î°£´Ù (GM ±â´É) void ForceRollOver(); // Lotto ÀνºÅϽº ÂüÁ¶¸¦ ¸®ÅÏÇÑ´Ù static Lotto& GetInstance() { return instance_; } // Á¾·á »óÅ·ΠÀüȯÇÑ´Ù void Shutdown() { TransitState(Lotto::FINAL_STATE); } #ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET TicketActivationXactions& GetTicketActivationXactions() { return ticket_activation_xactions_; } #endif // _NA_20101011_HEIM_LOTTO_CASH_TICKET private: enum State { INITIAL_STATE = 0 // Ãʱ⠻óÅ , ACTIVE_STATE // Ȱ¼ºÈ­ (Àû¸³, º¹±Ç ¿ëÁö ¹ß±Þ ¹× ÀÀ¸ð °¡´É) , DRAWING_STATE // Ãß÷Áß , INACTIVE_STATE // ºñȰ¼ºÈ­ (Ãß÷ Á÷ÈÄ Â÷ȸ ½ÃÀÛ Àü±îÁö, º¸»ó Áö±Þ) , FINAL_STATE // Á¾·áÁß , NUM_STATES // »óÅÂÀÇ °³¼ö }; // Á÷Á¢ ÀνºÅϽºÈ­ ±ÝÁö Lotto(); // ÇöÀç ÁøÇà ÁßÀΠȸÂ÷ÀÇ ÃÑ Àû¸³¾×À» ¸®ÅÏÇÑ´Ù INT64 GetCurrentTotalAccum() const { return (numResults_ > 0 ? results_[0].totalAccum : 0); } // ÇöÀç ÁøÇà ÁßÀΠȸÂ÷ÀÇ ÃÑ Àû¸³¾×¿¡ ÁÖ¾îÁø ±Ý¾×À» ´õÇØ °á°ú¸¦ ¸®ÅÏÇÑ´Ù INT64 AddCurrentTotalAccum(INT64 delta); // ÁÖ¾îÁø À妽º À§Ä¡ÀÇ LottoResult °´Ã¼ Æ÷ÀÎÅ͸¦, À妽º°¡ À¯È¿ÇÏÁö ¾ÊÀ¸¸é NULL ¸®ÅÏ LottoResult* GetResult(int index); // ÀÀ¸ð °ÇÀ» ó¸®ÇÑ´Ù bool ProcessTicket(CHARGUID charGuid, int drawNum, bool isAuto, BYTE* pickedNum, int* status, int* errorCode); // ÀÀ¸ð ³»¿ªÀ» Ãß°¡ÇÑ´Ù void EnterTicket(CHARGUID charGuid, int drawNum, int status, const BYTE* pickedNum); // ÁÖ¾îÁø ij¸¯ÅÍÀÇ ÀÀ¸ð ³»¿ªÀ» °Ë»öÇØ ¸®ÅÏÇÑ´Ù. ¾øÀ¸¸é NULLÀ» ¸®ÅÏÇÑ´Ù. LottoEntry* FindEntry(CHARGUID charGuid); // ÁÖ¾îÁø ij¸¯ÅÍ¿¡ ´ëÇØ ºó ÀÀ¸ð ³»¿ª ij½Ã Ç׸ñÀ» »ý¼ºÇØ ¸®ÅÏÇÑ´Ù. LottoEntry* NewEntry(CHARGUID charGuid); // ÁÖ¾îÁø ij¸¯ÅÍÀÇ ÀÀ¸ð ³»¿ª ij½Ã¸¦ ÇØÁ¦ÇÑ´Ù void ReleaseEntry(CHARGUID charGuid); // ij¸¯ÅÍÀÇ ÇÏÀÓ ¼Òºñ¿¡ ´ëÇÑ Ã³¸® // ¸®ÅÏ °ªÀÌ 0º¸´Ù ÀÛÀ¸¸é ¼ÒÀ¯ÇÑ º¹±Ç ¿ëÁö ¼ö¿¡ º¯È­ ¾øÀ½À» ÀǹÌÇϰí, 0 ÀÌ»óÀÌ¸é ³²Àº ¿ëÁö ¼ö int OnHeimConsumption(CHARGUID charGuid, eHEIM_CONSUMPTION_TYPE type, INT64 amount, int percentage); // Â÷ȸ ´ç÷ ¹øÈ£¸¦ ÁöÁ¤ÇØ Ãß÷/ÀÌ¿ù 󸮸¦ ¿Ï·áÇÑ´Ù void RollOver(BYTE* nextWinningNum); // ´ç÷±Ý °è»ê void CalculatePrizes(); // »óÅ ÀüÀÌ ÇÔ¼ö void TransitState(Lotto::State newState); // ÁÖ¾îÁø ¹ÙÀÌÆ® ¹è¿­ÀÌ ÇöÀç ȸÂ÷ÀÇ ´ç÷ ¹øÈ£¿Í ¸î °³°¡ ÀÏÄ¡ÇÏ´ÂÁö °Ë»ç int CheckMatches(BYTE* numbers) const; // ÁÖ¾îÁø ¹ÙÀÌÆ® ¹è¿­À» ÀÚµ¿ ¼±Åà ³­¼ö·Î ä¿î´Ù static void PickRandomNumbers(BYTE* numbers); // ÁÖ¾îÁø ¹ÙÀÌÆ® ¹è¿­À» ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄÇÑ´Ù static void Sort(BYTE* numbers); // ÁÖ¾îÁø ¹ÙÀÌÆ® ¹è¿­ÀÌ À¯È¿ÇÑ ÀÀ¸ð ¹øÈ£ÀÎÁö °Ë»ç static bool AreValidPicks(BYTE* numbers); friend class LottoState; // ±¸Ã¼ÀûÀÎ »óÅ Ŭ·¡½ºµéÀ» friend·Î ¼±¾ð friend class LottoInitialState; friend class LottoActiveState; friend class LottoDrawingState; friend class LottoInactiveState; int numResults_; // °ü¸®µÇ´Â Ãß÷ °á°úÀÇ ¼ö LottoResult results_[LottoConfig::NUM_RECENT_DRAWS]; // ÇöÀç¿Í Áö³­ ȸÂ÷ Ãß÷ °á°ú LottoEntryMap entries_; // ij¸¯Åͺ° ÀÀ¸ð ³»¿ª int lastDrawNum_; // ÃÖ±Ù Ãß÷ ȸÂ÷ ¹øÈ£ int* numWinners_; // µîÀ§º° ´ç÷ÀÚ ¼ö INT64* prizes_; // µîÀ§º° ´ç÷±Ý LottoWinnerList winners_; // ´ç÷ÀÚ ¸ñ·Ï LottoConfig config_; // ÇÏÀÓ ·Î¶Ç ¼³Á¤ °´Ã¼ LottoState* currentState_; // ÇöÀç »óÅ °´Ã¼ Æ÷ÀÎÅÍ LottoState* states_[Lotto::NUM_STATES]; // »óÅ °´Ã¼ Æ÷ÀÎÅÍ ¹è¿­ #ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET TicketActivationXactions ticket_activation_xactions_; #endif // _NA_20101011_HEIM_LOTTO_CASH_TICKET static Lotto instance_; // Singleton ÀνºÅϽº }; #endif // _LOTTO_H_