#include "StdAfx.h" #ifdef _NA_1419_20100121_ACCUMULATE_POINT #include ".\AccumulatePoint.h" #include ".\Player.h" #include #include #define ONE_SECOND 1000 class TempTimer : public util::Timer { public: TempTimer(uint interval_time) { SetTimer(interval_time); } ~TempTimer() {} uint Update() { uint progress_time = GetProcessTime() / GetIntervalTime(); IsExpired(TRUE); return progress_time; } }; struct GlobalData { GlobalData(): year(0), dayofweek(0), increase_second(0), event_time(false) { } ushort year; ushort dayofweek; bool event_time; uint increase_second; }; GlobalData global_data; void AccumulatePoint::SyncMatchDate(ushort year, ushort dayofweek, uint secondofday) { global_data.year = year; global_data.dayofweek = dayofweek; global_data.event_time = false; #ifdef _NA_0_20100528_ACCUMULATE_POINT_EVENT const AccumulatePointParser::RewardGroup& reward_group = AccumulatePointParser::Instance()->get_reward_group(global_data.dayofweek); const AccumulatePointParser::RewardGroup::RewardEvent& reward_event = reward_group.reward_event; if ((reward_event.start_time == 0) && (reward_event.end_time == 0)) { global_data.event_time = false; } else { uint second = secondofday; if ((reward_event.start_time <= second) && (reward_event.end_time > second)) global_data.event_time = true; else global_data.event_time = false; } #endif } // ÇöÀç ³âµµ ¹× Ç÷¹À̾îÀÇ °ÔÀÓ Ç÷¹ÀÌ Áõ°¡ ½Ã°£(ÃÊ ´ÜÀ§)À» ¼³Á¤ ÇÑ´Ù. // ¼­¹ö°¡ ½ÇÇàµÇ´Â µ¿¾È ÇØ´ç ³âµµ°¡ ¹Ù²ð ¼ö Àֱ⠶§¹®¿¡ Update µ¿¾È È£ÃâÇÑ´Ù. // ³âµµ ¹× Ç÷¹À̾îÀÇ Áõ°¡ ½Ã°£Àº ¿©·¯ AccumulatePoint °´Ã¼°¡ °øÅëÀ¸·Î »ç¿ë Çϱ⿡ Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù. // ¸Å Update¸¶´Ù ƽ Ä«¿îÆ®¸¦ ´©ÀûÇØ 1ÃÊ ÀÌ»óÀÎ °æ¿ì AccumulatePoint::increase_second_¿¡ ¼³Á¤. // °¢ Ç÷¹À̾îÀÇ ½Ã°£ °è»êÀ» Àü¿ªÀûÀ¸·Î 1¹ø¸¸ Çϱâ À§ÇÑ ¹æÆíÀÌ´Ù. void AccumulatePoint::Calculate_Current_Year(uint delta_tick_count) { static TempTimer second_timer(ONE_SECOND); // ´©ÀûµÈ ÃʰªÀ» Àü¿ªÀûÀ¸·Î ÀúÀåÇØ³õ´Â´Ù. Ç÷¹ÀÌ¾î ´ç ¸Å¹ø °è»êÇÏ´Â °Í º¸´Ù ¾î´À Á¤µµÀÇ ¿ÀÂ÷¸¦ // Çã¿ëÇϹǷΠÀü¿ªÀûÀ¸·Î °è»êÀ» 1¹ø ÇÏ´Â°Ô ³´´Ù. global_data.increase_second = second_timer.Update(); } AccumulatePoint::AccumulatePoint(Player* player) : player_(player), playerinfo_(NULL) { ASSERT(player_); } AccumulatePoint::~AccumulatePoint() { } // Player ¸Þ¸ð¸® Ç®¿¡¼­ »ý¼ºÀÚ¹× ¼Ò¸êÀÚ¸¦ È£ÃâÀÌ ÀϾÁö ¾Ê¾Æ ÃʱâÈ­ ºÎºÐÀ» Á¤ÀÇÇÔ. void AccumulatePoint::Init(Player* player) { ASSERT(player); if (player == NULL) return; ASSERT(player->GetCharInfo()); if (player->GetCharInfo() == NULL) return; const AccumulatePointParser::RewardGroup& reward_group = AccumulatePointParser::Instance()->get_reward_group(global_data.dayofweek); player_ = player; playerinfo_ = player->GetCharInfo(); generated_ = false; reserved_data_.dayofweek = global_data.dayofweek; reserved_data_.event_time = global_data.event_time; reserved_data_.require_point = reward_group.require_point; reserved_data_.reward_code = 0; current_data_ = reserved_data_; } void AccumulatePoint::Release() { player_ = NULL; playerinfo_ = NULL; } // Player::Update() ³»ºÎ¿¡¼­ È£ÃâµÈ´Ù. // PlayerÀÇ Á¢¼Ó½Ã°£À» (ÃÊ ´ÜÀ§)·Î Áõ°¡ ½Ã۸ç, ƯÁ¤ ½Ã°£ ¸¶´Ù ¸¶Àϸ®Áö ÄÚÀÎÀ» 1 Áõ°¡ ½ÃŲ´Ù. // ¸¸¾à, ¸Å³â 1¿ù 1ÀÏ(Áï ÇØ´ç ¿¬µµ°¡ ¹Ù²ð °æ¿ì)À϶§ Àû¸³½Ã°£À» ÃʱâÈ­ ½Ã۸ç ÄÚÀÎÀº ±×´ë·Î À¯ÁöÇÑ´Ù. void AccumulatePoint::Update() { // Ç÷¹À̾ ZONE ¿¡ Á¸Àç ÇÏÁö ¾Ê´Â °æ¿ì Update()¸¦ ½ÇÇàÇÏÁö ¾Ê´Â´Ù. // ZONE ¿¡ Á¸Àç À¯¹« ÆÇº°Àº class PlayerManager::Update() ¿¡¼­ üũÇϰíÀÖ´Ù. // ¸¸¾à, ZONEÀÇ ÆÇº°À» Á÷Á¢Ã³¸® ÇØ¾ßÇÒ °æ¿ì ¾Æ·¡ÀÇ ±¸¹®À» »ç¿ëÇÑ´Ù. //GameZone* pEnterZone = NULL; //MAPCODE EnterFieldCode = 0; //const eZONE_STATE eRoomState = pPlayer->GetGameZone( pEnterZone, EnterFieldCode ); //if ( !(eRoomState & ePRS_AT_ZONE) ) // return; // ¾ÆÁ÷ EnterField ÀüÀ̸é Update¸¦ ½ÇÇàÇÏÁö ¾Ê´Â´Ù. // EnterField ÆÇº°¹®Àº class Player::Update() ½ÃÀ۽à üũÇϰíÀÖ´Ù. // ¸¸¾à, EnterFieldÀÇ ÆÇº°À» Á÷Á¢Ã³¸® ÇØ¾ßÇÒ °æ¿ì ¾Æ·¡ÀÇ ±¸¹®À» »ç¿ëÇÑ´Ù. //GameField* pField = player_pointer_->GetField(); //if ( !(pField && pField->IsReady()) ) // return; ASSERT(player_ && playerinfo_); if (player_ == NULL || playerinfo_ == NULL) return; static MSG_CG_CHARINFO_ACCUMULATE_POINT_CMD send_message; // ÃÊ ´ÜÀ§·Î Áõ°¡µÈ °ªÀÌ Á¸ÀçÇÒ¶§¸¸ üũÇÑ´Ù. if (global_data.increase_second == 0) return; const AccumulatePointParser::RewardGroup& reward_group = AccumulatePointParser::Instance()->get_reward_group(global_data.dayofweek); // 0À¸·Î ³ª´©±â ¿À·ù ÇÇÇϱâ // ÇØ´ç °ªÀ» 0À¸·Î ¼¼ÆÃÇÏ´Â ±¹°¡¿¡ ´ë·®À¸·Î ·Î±×°¡ ³²´Â °æ¿ì°¡ Á¸ÀçÇÏ¿© ÁÖ¼® ó¸®ÇÔ. // ASSERT(reward_group.generate_time); if (reward_group.generate_time == 0) return; // ³âµµ°¡ ¹Ù²ï°æ¿ì Àû¸³½Ã°£À» ÃʱâÈ­ ½ÃŲ´Ù. if (global_data.year != playerinfo_->m_wAccumulateYear) { playerinfo_->m_wAccumulateYear = global_data.year; playerinfo_->m_dwAccumulateTime = 0; GAMELOG->LogAccumulatePoint(ACCUM_CHANGE_YEAR, player_, 0, 0); send_message.m_dwReason = RC::RC_ACCUMULATE_POINT_INITIALIZE; send_message.m_dwAccumulateTime = playerinfo_->m_dwAccumulateTime; send_message.m_wAccumulatePoint = playerinfo_->m_wAccumulatePoint; send_message.m_byRequirePoint = reward_group.require_point; player_->SendPacket(&send_message, sizeof(send_message)); } // º¸»ó¿¡ ÇÊ¿äÇÑ ¿ä±¸ ÄÚÀÎÀÌ º¯°æµÈ °æ¿ì. if (reward_group.require_point != reserved_data_.require_point) { reserved_data_.require_point = reward_group.require_point; send_message.m_dwReason = RC::RC_ACCUMULATE_POINT_CHANGE_REQUIRE_POINT; send_message.m_dwAccumulateTime = playerinfo_->m_dwAccumulateTime; send_message.m_wAccumulatePoint = playerinfo_->m_wAccumulatePoint; send_message.m_byRequirePoint = reward_group.require_point; player_->SendPacket(&send_message, sizeof(send_message)); } // ÇöÀçÀÇ ¿äÀÏÀÌ º¯°æµÈ °æ¿ì reserved_data_.dayofweek = global_data.dayofweek; // À̺¥Æ® ½Ã°£ÀÌ º¯°æµÈ °æ¿ì reserved_data_.event_time = global_data.event_time; // ¸¶Àϸ®Áö ½Ã°£À» ´©Àû½ÃŲ´Ù.(ÃÊ ´ÜÀ§) // ½Ã°£ º¯È­ : Áõ°¡ Àü ½Ã°£ - Áõ°¡ ÈÄ ½Ã°£ int before_second = playerinfo_->m_dwAccumulateTime / reward_group.generate_time; playerinfo_->m_dwAccumulateTime += global_data.increase_second; if ((playerinfo_->m_dwAccumulateTime / reward_group.generate_time) - before_second) { if (PlusAccumulatePoint(reward_group.generate_point)) { GAMELOG->LogAccumulatePoint(ACCUM_ACQUISITION_TIME, player_, reward_group.generate_point, 0); send_message.m_dwReason = RC::RC_ACCUMULATE_POINT_SUCCESS; send_message.m_dwAccumulateTime = playerinfo_->m_dwAccumulateTime; send_message.m_wAccumulatePoint = playerinfo_->m_wAccumulatePoint; send_message.m_byRequirePoint = reward_group.require_point; player_->SendPacket(&send_message, sizeof(send_message)); } } } bool AccumulatePoint::GenerateReward(bool first) { bool change_data = false; // À̺¥Æ®°¡ º¯°æµÇ¾úÀ» °æ¿ì. if (current_data_.event_time != reserved_data_.event_time) change_data = true; // ¿äÀÏÀÌ º¯°æµÇ¾úÀ» °æ¿ì. if (current_data_.dayofweek != reserved_data_.dayofweek) change_data = true; if (first) { if (!generated_) change_data = true; } if (change_data) { current_data_ = reserved_data_; generated_ = false; } if (!generated_) { const AccumulatePointParser::RewardGroup& reward_group = AccumulatePointParser::Instance()->get_reward_group(current_data_.dayofweek); #ifdef _NA_0_20100528_ACCUMULATE_POINT_EVENT if (current_data_.event_time) { current_data_.reward_code = reward_group.reward_event.reward_code; current_data_.require_point = reward_group.require_point; } else #endif { uint seed = random(0, (AccumulatePointParser::RewardGroup::Max_Reward - 1)); current_data_.reward_code = reward_group.reward_array[seed].reward_code; current_data_.require_point = reward_group.require_point; } } generated_ = ((current_data_.reward_code > 0) && (current_data_.require_point > 0)) ? true : false; return generated_; } void AccumulatePoint::ResetReward() { generated_ = false; } void AccumulatePoint::SendPacketAccumulatePoint() { ASSERT(player_ && playerinfo_); if (player_ == NULL || playerinfo_ == NULL) return; MSG_CG_CHARINFO_ACCUMULATE_POINT_CMD send_message; send_message.m_dwReason = RC::RC_ACCUMULATE_POINT_SUCCESS; send_message.m_dwAccumulateTime = playerinfo_->m_dwAccumulateTime; send_message.m_wAccumulatePoint = playerinfo_->m_wAccumulatePoint; send_message.m_byRequirePoint = current_data_.require_point; player_->SendPacket(&send_message, sizeof(send_message)); } bool AccumulatePoint::PlusAccumulatePoint(ushort accumulate_point) { ASSERT(player_ && playerinfo_); if (player_ == NULL || playerinfo_ == NULL) return false; uint max_point = 65000; uint next_point = playerinfo_->m_wAccumulatePoint + accumulate_point; #ifdef _NA_0_20101011_ACCUMULATE_POINT_LIMIT_OPTION const AccumulatePointParser::RewardGroup& reward_group = AccumulatePointParser::Instance()->get_reward_group(global_data.dayofweek); // Àû¸³Æ÷ÀÎÆ®¸¦ ¹Þ±âÀ§ÇÑ ÃÖ¼Ò ·¹º§º¸´Ù ÀÛÀº °æ¿ì( 0ÀÎ °æ¿ì ÃÖ¼Ò ·¹º§ Á¦ÇѾøÀ½) if ((reward_group.limit_option.receptible_min_level != 0) && (playerinfo_->m_LV < reward_group.limit_option.receptible_min_level)) return false; // Àû¸³Æ÷ÀÎÆ®¸¦ ¹Þ±âÀ§ÇÑ ÃÖ´ë ·¹º§º¸´Ù ÀÛÀº °æ¿ì( 0ÀÎ °æ¿ì ÃÖ´ë ·¹º§ Á¦ÇѾøÀ½) if ((reward_group.limit_option.receptible_max_level != 0) && (playerinfo_->m_LV > reward_group.limit_option.receptible_max_level)) return false; // Àû¸³Æ÷ÀÎÆ® ÃÖ´ëÄ¡ ¼³Á¤ if (reward_group.limit_option.limit_max_point != 0) max_point = reward_group.limit_option.limit_max_point; #endif playerinfo_->m_wAccumulatePoint = min(next_point, max_point); return (next_point <= max_point) ? true : false; } void AccumulatePoint::MinusAccumulatePoint(ushort accumulate_point) { ASSERT(player_ && playerinfo_); if (player_ == NULL || playerinfo_ == NULL) return; playerinfo_->m_wAccumulatePoint = max((playerinfo_->m_wAccumulatePoint - accumulate_point), 0); } ushort AccumulatePoint::get_accumulate_point() const { ASSERT(player_ && playerinfo_); if (player_ == NULL || playerinfo_ == NULL) return 0; return playerinfo_->m_wAccumulatePoint; } uint AccumulatePoint::get_accumulate_time() const { ASSERT(player_ && playerinfo_); if (player_ == NULL || playerinfo_ == NULL) return 0; return playerinfo_->m_dwAccumulateTime; } #endif //_NA_1419_20100121_ACCUMULATE_POINT