Files
2026-06-01 12:46:52 +02:00

299 lines
9.7 KiB
C++

#pragma once
#include <Windows.h>
#include "SGameMessage.h"
#include <map>
#include "SGameUIMgr.h"
class SSkillSlotMgr;
//////////////////////////////////////////////////////////////////////////
//SSkillSlot
class SSkillSlot
{
public:
/// 생성자
SSkillSlot();
/// 소멸자
virtual ~SSkillSlot(); // sonador #2.1.2.4.3
/// 스킬 정보 설정
void SetSkill( SMSG_SKILL_LIST::SkillInfo & skill_data );
void SetSkill( SMSG_SKILL_LIST::SkillInfo & skill_data, AR_TIME totalCoolTime );
/// 스킬 정보 획득
const SMSG_SKILL_LIST::SkillInfo GetSkill() { return m_SkillData; }
/// 스킬 틱 처리 Cool Time 처리 // sonador #2.1.2.4.3
virtual void Process( DWORD dwTime );
/// 초기화
void ReInit();
/// 사용 상태 설정
void SetUse( BOOL bUse );
/// 이미 사용중인지 여부 확인
BOOL IsUse() { return m_bUse; }
//
// 인터페이스에서 필요로 하는 정보
//
/// 스킬 아이디 획득
const int GetSkillID() const { return m_SkillData.skill_id; }
/// 스킬 소유자 핸들 획득
const AR_HANDLE GetTarget() const { return m_hTarget; }
/// 스킬 소유자 핸들 설정
void SetTarget( AR_HANDLE hTarget ) { m_hTarget = hTarget; }
/// 사용 Lv 설정
void SetUseLevel( int nLevel ) { m_nUseLevel = nLevel; }
///
//void ResetAddedLevel() { m_nAddedLevel = 0; }
void SetAddedLevel( int nAddedLevel ) { m_nAddedLevel = nAddedLevel; }
/// 사용 Lv 획득
const int GetUseLevel() const { return m_nUseLevel; }
const int GetAddedLevel() const { return m_nAddedLevel; }
void SetCurLevel( int nLevel ) { m_SkillData.current_skill_level = nLevel; }
void SetBaseLevel( int nLevel ) { m_SkillData.base_skill_level = nLevel; }
const int GetCurLevel() const { return m_SkillData.current_skill_level; }
const int GetBaseLevel() const { return m_SkillData.base_skill_level; }
void SetRemainTime( AR_TIME time ) { m_SkillData.remain_cool_time = time; }
const AR_HANDLE GetSkillCard() const { return m_hSkillCard; }
void SetSkillCard( AR_HANDLE hItem ) { m_hSkillCard = hItem; }
void SetCasting( bool bCasting ) { m_bCasting = bCasting; }
void SetFire( bool bFire ) { m_bFire = bFire; }
const bool IsCasting() const { return m_bCasting; }
const bool IsFire() const { return m_bFire; }
/// TODO : 스킬 슬롯 손 봐야 한다.
void SetBeginTime( DWORD dwTime ) { m_dwBeginTime = dwTime; m_dwStartTime = dwTime; }
/// 2012.02.28 SetBeginTime 할 때, total cool time과 remain cool time이 고려가 되야 되는데, SetBeginTime는 고려가 안되는 실수를 할 수 있어서 함수를 따로 만듬
void setBeginTime(DWORD dwTime, AR_TIME totalCoolTime, AR_TIME remainCoolTime);
const DWORD GetBeginTime() { return m_dwBeginTime; }
const AR_TIME GetRemainTime() { return m_SkillData.remain_cool_time; }
/// 쿨타임을 얻어온다.
const DWORD GetCoolingTime();
public:
SMSG_SKILL_LIST::SkillInfo m_SkillData; ///< 스킬 정보
//
// 인터페이스에서 필요로 하는 정보
//
AR_HANDLE m_hTarget; ///< 스킬 소유자의 핸들, 크리처일 경우
AR_HANDLE m_hSkillCard; ///< 적용된 스킬 카드 핸들
DWORD m_dwBeginTime;
bool m_bCasting;
bool m_bFire;
int m_nUseLevel;
int m_nAddedLevel;
BOOL m_bUse; ///< 사용되고 있는 스킬의 정보
DWORD m_dwCoolTime;
DWORD m_dwStartTime;
private:
};
//SAddedSkillInfo
class SAddedSkillInfo
{
public:
/// 생성자
SAddedSkillInfo();
/// 소멸자
virtual ~SAddedSkillInfo();
/// 스킬 소유자 핸들 획득
const AR_HANDLE GetTarget() const { return m_hTarget; }
/// 스킬 소유자 핸들 설정
void SetTarget( AR_HANDLE hTarget ) { m_hTarget = hTarget; }
/// 스킬 정보 설정
void SetAddedSkill( SMSG_ADDED_SKILL_LIST::AddedSkillInfo & skill_data );
int GetLevel(int SkillId, AR_HANDLE target);
AR_HANDLE m_hTarget; ///< 스킬 소유자의 핸들, 크리처일 경우
SMSG_ADDED_SKILL_LIST::AddedSkillInfo m_SkillData; ///< 스킬 정보
};
//////////////////////////////////////////////////////////////////////////
//SSkillSlotMgr
// MJ 2005/04/01
typedef std::vector<SSkillSlot*> SKILL_VECTOR;
typedef std::vector<SAddedSkillInfo*> ADDED_SKILL_VECTOR;
/// 플레이어 스킬 매니저
class SSkillSlotMgr : public SGameUIMgr
{
public:
SSkillSlotMgr();
virtual ~SSkillSlotMgr();
virtual void ResetSkill();
virtual void ResetAddedSkill();
/// Cool Time 처리
virtual void Process( DWORD dwTime );
virtual void AddSkill( DWORD dwTime, SMSG_SKILL_LIST::SkillInfo & skill_data, AR_HANDLE hTarget = NULL, int modificationType = 0 ); ///< 스킬 추가
virtual void DelSkill( int nSkillCode, AR_HANDLE hTarget = NULL ); ///< 스킬 삭제
virtual BOOL UseSkill( int nSkillCode, int nLevel ); ///< 스킬 사용
virtual void AddAddedSkill(SMSG_ADDED_SKILL_LIST::AddedSkillInfo & skill_data, AR_HANDLE hTarget);
virtual void SetCurSkill( int nSkill_ID = -1 );
virtual void AddCooling( int nSkill_ID, AR_HANDLE hTarget = NULL ); ///< Cooling 등록
virtual void DelCooling( int nSkill_ID, AR_HANDLE hTarget = NULL ); ///< Cooling 삭제
/// 인터페이스에서 필요로 하는 정보 관리
virtual const SKILL_VECTOR & GetSkillList() { return m_vecSkillSlotList; };
virtual const ADDED_SKILL_VECTOR & GetAddedSkillList() { return m_vecAddedSkillList; };
virtual void SetSkillCard( int nSkillID, AR_HANDLE hItem );
bool SetCastingSkill( int nSkillID, bool bCasting, AR_HANDLE hTarget = NULL );
bool SetFireSkill( int nSkillID, bool bFire, AR_HANDLE hTarget = NULL );
bool SetCastingCancelSkill( int nSkillID, AR_HANDLE hTarget = NULL );
virtual const int GetBaseSkillLevel( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const int GetCurrentSkillLevel( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const int GetUseSkillLevel( int nSkillID ) const;
virtual const int GetUseSkillLevel( int nSkillID, AR_HANDLE hTarget ) const;
virtual const DWORD GetSkillMaxTime( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const DWORD GetSkillCurTime( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const AR_HANDLE GetSkillCard( int nSkillID ) const;
virtual const bool IsExistSkill( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const bool IsCastingSkill( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const bool IsFireSkill( int nSkillID, AR_HANDLE hTarget = NULL ) const;
virtual const bool IsEnableCreatureSkill() const;
virtual const bool IsExistSkillLevel( int nSkillID, int nSkillLevel, AR_HANDLE hTarget = NULL ) const;
virtual SSkillSlot* GetSkillSlot( int nSkillID );
void GetIdenticalCoolTimeGroup( int nSkill_ID, std::vector<int>& vecSkillList ) const;
AR_TIME GetLastTimeUsed() { return tLastTimeUsed; };
void SetLastTimeUsed(AR_TIME time) { tLastTimeUsed = time; };
/// 스킬이 쿨타임 중인지 체크한다
BOOL CheckCoolTime( int nSkillID );
virtual void ResetInfo();
protected:
virtual void Init();
virtual void Destroy();
SKILL_VECTOR m_vecSkillSlotList;
ADDED_SKILL_VECTOR m_vecAddedSkillList;
DWORD m_dwTime;
int m_nCurUseSkill; ///< 현재 사용 중인 스킬
std::vector< int > m_nCoolingSkill; ///< 쿨링 중인 스킬들
AR_TIME tLastTimeUsed;
private:
};
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/// 소환수 스킬
struct QUICK_SKILL
{
int m_nSkillID;
int m_nUseLevel;
int m_nQuickSlotNum;
AR_HANDLE m_hCreature;
enum STATE_QUICK_SLOT
{
STATE_NONE = 0, ///< 상태 없음
STATE_CASTING, ///< 캐스팅
STATE_FIRE, ///< 화이어
STATE_CANCEL, ///< 취소
STATE_TOGGLE_ON, ///< 토글 On
STATE_TOGGLE_OFF, ///< 토글 Off
STATE_TOGGLE_ON_BY_USER, //
STATE_TOGGLE_OFF_BY_USER, //
};
STATE_QUICK_SLOT m_nStateQuickSlot;
QUICK_SKILL( int nSkillID, int nUseLevel, int nQuickSlotNum, AR_HANDLE hCreature, int nState )
{
m_nSkillID = nSkillID;
m_nUseLevel = nUseLevel;
m_nQuickSlotNum = nQuickSlotNum;
m_hCreature = hCreature;
m_nStateQuickSlot = STATE_NONE;
m_nStateQuickSlot = (STATE_QUICK_SLOT)nState;
}
STATE_QUICK_SLOT GetStateQuickSlot() { return m_nStateQuickSlot; }
void SetStateQuickSlot( STATE_QUICK_SLOT nState ) { m_nStateQuickSlot = nState; }
};
class SCreatureSkillSlotMgr : public SSkillSlotMgr
{
public:
SCreatureSkillSlotMgr();
virtual ~SCreatureSkillSlotMgr();
virtual void ResetCreatureSkill( AR_HANDLE hTarget );
virtual void AddSkill( DWORD dwTime, SMSG_SKILL_LIST::SkillInfo & skill_data, AR_HANDLE hTarget = NULL, int modificationType = 0 ); ///< 스킬 추가
virtual BOOL UseSkill( int nSkillCode, int nLevel ); ///< 스킬 사용
virtual void SetCurSkill( int nSkill_ID = -1 );
virtual void AddCooling( int nSkill_ID, AR_HANDLE hTarget = NULL ); ///< Cooling 등록
virtual void DelCooling( int nSkill_ID, AR_HANDLE hTarget = NULL ); ///< Cooling 삭제
// skill quick slot
void InitQuickSlot();
void AddQuickSlot( AR_HANDLE hCreature, int nSkillID, int nLevel, int nState, int nQuickSlotNum, int nDragIndex=-1 );
bool ChangeQuickSlot( AR_HANDLE hCreature, int nQuickSlotNum, int nDragIndex );
void DelQuickSlot( AR_HANDLE hCreature, int nQuickSlotNum );
QUICK_SKILL* FindQuickSlot( AR_HANDLE hCreature, int nQuickSlotNum );
void GetQuickslotID( AR_HANDLE hCreature, int nSkillID, std::vector<int>& rIdList );
BOOL IsUseSkill( AR_HANDLE hCreature, int nSkillID );
virtual const bool IsExistSkill( int nSkillID, AR_HANDLE hTarget = NULL ) const;
const bool AbleLearnSkill( int nSkillID, int nLv, AR_HANDLE hTarget ) const;
BOOL CheckCoolTime( int nSkillID, AR_HANDLE hCaster ); ///< 스킬이 쿨타임 중인지 체크한다
void ResetInfo();
protected:
std::vector<QUICK_SKILL> m_vecQuickSlotList;
};