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

106 lines
2.6 KiB
C++

#include "stdafx.h"
#include "./SCSkillSlot.h"
#include <limits.h>
#include <SkillInfoParser.h>
//==================================================================================================
// (CHANGES) (f100307.3) add const null stream
BOOST_STATIC_ASSERT(sizeof(SkillScriptInfo) >= sizeof(BASE_STYLEINFO));
static const char kEmptyStream_static[sizeof(SkillScriptInfo)] = { 0, };
const SkillScriptInfo& SCSkillSlot::Null_SkillInfo = \
*reinterpret_cast<const SkillScriptInfo*>(kEmptyStream_static);
//--------------------------------------------------------------------------------------------------
SCSkillSlot::SCSkillSlot(void)
: root_skill_info_(NULL)
{
Clear();
}
SCSkillSlot::~SCSkillSlot(void)
{
}
void
SCSkillSlot::SetCode(SLOTCODE code)
{
//ASSERT(code <= USHRT_MAX); (f100307.2) removes meaningless assertion checker
// (NOTE) must be partial initialization, \
// because custom coding have a precede action previous 'SetCode' call
ZeroMemory(&skill_stream_, sizeof(skill_stream_));
root_skill_info_ = NULL;
// set
skill_stream_.Part.wCode = code;
_SetSkillInfo();
}
void
SCSkillSlot::_SetSkillInfo()
{
SLOTCODE skill_code = GetCode();
assert(skill_code != 0);
root_skill_info_ = SkillInfoParser::Instance()->GetInfo(skill_code);
if (FlowControl::FCAssert(root_skill_info_ != NULL) == false)
{
#ifdef _SERVER
SUNLOG(eCRITICAL_LOG, _T("|[%s]|can't find skill info(%d)|"),
__FUNCTION__, skill_code);
#endif
// desired occurred fault if routine has invalid access
root_skill_info_ = &Null_SkillInfo;
return;
}
#if _DEBUG
// add checker
char is_skill = root_skill_info_->IsSkill();
char is_style = root_skill_info_->IsStyle();
ASSERT((is_skill ^ is_style) == 1);
#endif
}
bool
SCSkillSlot::IsStyle() const
{
if (IsContainValidInfo()) {
return root_skill_info_->IsStyle();
}
return false;
}
bool
SCSkillSlot::IsSKill() const
{
if (IsContainValidInfo()) {
return root_skill_info_->IsSkill();
}
return false;
}
const BASE_STYLEINFO*
SCSkillSlot::GetStyleInfo() const
{
if (FlowControl::FCAssert(IsContainValidInfo()))
{
if (root_skill_info_->IsStyle()) {
return static_cast<const BASE_STYLEINFO*>(root_skill_info_);
}
}
return NULL;
}
const SkillScriptInfo*
SCSkillSlot::GetSkillInfo() const
{
if (FlowControl::FCAssert(IsContainValidInfo()))
{
if (root_skill_info_->IsSkill()) {
return static_cast<const SkillScriptInfo*>(root_skill_info_);
}
}
return NULL;
}