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

100 lines
3.0 KiB
C++

#pragma once
#include "ClientSingleton.h"
#include "SkillData.h"
class Player;
class SkillMain
: public Client::Singleton<SkillMain>
{
private:
// 클라이언트(Hero) 고유의 스킬데이터
SkillDataSet m_SkillDataSet;
// 스킬창을 위한 데이터 사본
SkillDataSet m_SkillDataSetForTree;
// 스킬 포인트 (트리용)
int m_RemainSkillPointForTree;
// 히어로
Player* m_pHero;
public:
SkillMain();
~SkillMain();
void SetHero( Player* hero ) { m_pHero = hero; }
void ClearSkillData() { m_SkillDataSet.clear(); }
void AddSkillData( const SkillData& skill_data ) { m_SkillDataSet.push_back(skill_data); }
int AddNewSkillCode( CODETYPE skill_code ); // 새로운 스킬을 배울떄
// basic
size_t GetSkillDataCount() { return m_SkillDataSet.size(); }
SkillData& GetSkillData( size_t index ) { return m_SkillDataSet[index]; }
SkillDataSet& GetSkillDataSet() { return m_SkillDataSet; } // 실제 플레이어가 가지고 있는 스킬의 목록
const SkillDataSet& GetSkillDataSet() const { return m_SkillDataSet; }
void SetRemainSkillPoint( int remain_point );
int GetRemainSkillPoint();
int GetHeroLevel();
// find
int FindPosBySkillClassCode(int skill_class_code) { return m_SkillDataSet.FindPosBySkillClassCode( skill_class_code ); }
int FindPosBySkillCode(SLOTCODE skill_code );
SkillData* GetSkillDataBySkillClassCode(CODETYPE skill_class) { return m_SkillDataSet.GetSkillDataBySkillClassCode( skill_class ); }
SkillData* GetSkillDataBySkillCode(CODETYPE skill_code) { return m_SkillDataSet.GetSkillDataBySkillCode( skill_code ); }
SkillData* GetSkillDataBySlotPosition(int position) { return m_SkillDataSet.GetSkillDataBySlotPosition( position ); }
void BlockSkill(DWORD char_class);
void UnBlockSkill();
// 스킬의 습득여부를 검사
bool CheckSkillLevel(DWORD skill_class, int skill_level, DWORD* skill_name_code);
// 스킬이 레벨업가능여부를 갱신
void RefreshLevelupCondition();
// 실제 보유중인 스킬레벨에 해당하는 코드를 가져온다
int GetRealSkillCode( int skill_code );
// 트리용 데이터 리셋
void ResetTreeData();
// 사용가능한 포인트
int GetRemainUseablePoint() { return m_RemainSkillPointForTree; }
SkillDataSet& GetSkillDataSetForTree() { return m_SkillDataSetForTree; } // 스킬 트리에 표시되고 있는 스킬의 목록 (시뮬레이터중일경우 플레이어의 스킬과 다름)
bool LevelupSkill( SkillData* skill_data );
void RefreshActiveSkill( SkillDataSet& skill_set );
// 스킬 시뮬레이트중인가
bool IsSkillSimulated();
// 트리의 데이터와 원본의 데이터를 비교해 새롭게 습득한 스킬의 코드목록을 구한다.
bool MakeNewSkillCodeArray( std::vector<int>& code_array );
// 배울 수 있는 최대 스킬레벨의 스킬목록을 만든다
bool MakeMaxSkillCodeArray( std::vector<int>& code_array );
public:
static int SkillCode2SkillClassCode( int skill_code );
};
#define xGetSkillData() SkillMain::Instance()
#define SKILLCODE2SKILLCLASSCODE(_code) SkillMain::SkillCode2SkillClassCode(_code)