Files
2022-10-26 12:25:11 +08:00

137 lines
4.5 KiB
C++

#include "stdafx.h"
#include "./SCLottoInfo.h"
#include "BitStream.hpp"
#include "SCItemSlot.h"
#include "LotteryInfoParser.h"
//==================================================================================================
//
const SCLottoInfo::MiniSlot
SCLottoInfo::NullMiniSlot = { 0, };
void
SCLottoInfo::SetInfo(nsSlot::SerializeItemOption::sLottery* src, const BASE_ITEMINFO* item_info)
{
__UNUSED(item_info);
Clear();
SLOT_BITBOUND_SET(src->Index, SCLottoInfo::NumberOfBits_LotteryIndex);
SLOT_BITBOUND_SET(src->Identity, SCLottoInfo::NumberOfBits_IdentityStatus);
SLOT_BITBOUND_SET(src->Count, SCLottoInfo::NumberOfBits_NumberOfMiniSlots);
lottery_index_ = WORD(src->Index);
identity_status_ = BOOLEAN(src->Identity);
number_of_minislots_ = static_cast<uint8_t>(src->Count);
for(int i = 0; i < _countof(mini_slots_); ++i) {
SLOT_BITBOUND_SET(src->Slots[i].Random, NumberOfBits_MiniSlot_IsRandom);
SLOT_BITBOUND_SET(src->Slots[i].Exist, NumberOfBits_MiniSlot_ExistItem);
SLOT_BITBOUND_SET(src->Slots[i].Position, NumberOfBits_MiniSlot_InfoPos);
SCLottoInfo::MiniSlot& dest = mini_slots_[i];
dest.Random = BOOLEAN(src->Slots[i].Random);
dest.ExistItem = BOOLEAN(src->Slots[i].Exist);
dest.InfoPos = BYTE(src->Slots[i].Position);
}
}
void
SCLottoInfo::GetInfo(nsSlot::SerializeItemOption::sLottery* dest)
{
SLOT_BITBOUND_SET(lottery_index_, NumberOfBits_LotteryIndex);
SLOT_BITBOUND_SET(identity_status_, NumberOfBits_IdentityStatus);
SLOT_BITBOUND_SET(number_of_minislots_, NumberOfBits_NumberOfMiniSlots);
dest->Index = lottery_index_;
dest->Identity = identity_status_;
dest->Count = number_of_minislots_;
for(int i = 0; i < _countof(mini_slots_); ++i) {
SCLottoInfo::MiniSlot& src = mini_slots_[i];
SLOT_BITBOUND_SET_1B(src.Random , NumberOfBits_MiniSlot_IsRandom);
SLOT_BITBOUND_SET_1B(src.ExistItem , NumberOfBits_MiniSlot_ExistItem);
SLOT_BITBOUND_SET_1B(src.InfoPos , NumberOfBits_MiniSlot_InfoPos);
dest->Slots[i].Random = src.Random;
dest->Slots[i].Exist = src.ExistItem;
dest->Slots[i].Position = src.InfoPos;
}
}
void
SCLottoInfo::ClearMiniSlot(POSTYPE pos)
{
if(!FlowControl::FCAssert(number_of_minislots_ && ValidPosition(pos)))
return;
ZeroMemory(&mini_slots_[pos], sizeof(mini_slots_[pos]));
if(number_of_minislots_)
--number_of_minislots_;
}
void
SCLottoInfo::Move(POSTYPE from, POSTYPE to)
{
if(FlowControl::FCAssert(ValidPosition(from) && ValidPosition(to))) {
const MiniSlot temp = mini_slots_[from];
mini_slots_[from] = mini_slots_[to];
mini_slots_[to] = temp;
}
}
// 스크립트에서 m_LottoIndex에 해당하는 정보를 랜덤으로
// minislot에 설정한다.
BOOLEAN
SCLottoInfo::Identity()
{
if(identity_status_)
return false;
// DONE: f110610.2L, waverix, 관련 로직을 파악할 필요 있다.
// 일단 동일한 동작으로 처리하고, 문제점을 파악하자.
//minislot_count 사용이 필요할 듯 한데, 로직이 좀 더 분석될 필요 있음.
LotteryInfoParser* pLotteryInfoParser = LotteryInfoParser::Instance();
const LotteryIndexGroup* lottery_index_group =
pLotteryInfoParser->GetLotteryIndexGroup(lottery_index_);
if(lottery_index_group != 0)
{
number_of_minislots_ = lottery_index_group->GetMiniSlotCount();
ASSERT(0 < number_of_minislots_ && number_of_minislots_ <= MAX_PANDORA_SLOT_NUM);
number_of_minislots_ = min(number_of_minislots_, MAX_PANDORA_SLOT_NUM);
for(int i = 0; i < number_of_minislots_; ++i)
{
const MiniSlotInfo* mini_slot_info = lottery_index_group->GetMiniSlotInfo(i);
assert(mini_slot_info != NULL);
if (MiniSlot* dest = &mini_slots_[i])
{
dest->InfoPos = static_cast<uint8_t>(i);
dest->ExistItem = true;
dest->Random = mini_slot_info->Random != false;
};
}
identity_status_ = true;
}
else
{
SUNLOG(eCRITICAL_LOG, _T("|[%s]|can't find lottery info(%d)|"),
__FUNCTION__, lottery_index_);
return FALSE;
}
return TRUE;
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//