/* ==========================================================================
* 파    일 : InfluenceObject.h
* 목    적 : 
* 작 성 자 : 박경희
* 작 성 일 : 2007-08-21
* 주의사항 :
*===========================================================================*/
#pragma once

#include "BaseObject_Common.h"

struct sInfluence;

enum eSHOTTYPE;
enum eAURATYPE;

const unsigned long AURA_CHECK_TIME = 1000;

class cInfluenceObject
{

public:

	cInfluenceObject();
	virtual ~cInfluenceObject();

	/// Skillmanager의 메모리풀에서 스킬 공간을 할당받음
	void* operator new( size_t n ); 
	/// 메모리풀에서 할당 받은 효과 객체를을 제거해줌
	void operator delete( void* ptr, size_t n );

	//bool				Init( unsigned long uniqueIdx, unsigned long influenceIdx, sObject mTarget, sObject attacker, 
	//	eAURATYPE auraType, unsigned short auraRange, eAPPLYTYPE auraCopyType, unsigned long auraSkillClassIdx, 
	//	eATTRIBUTETYPE mAttriButeType, bool loop, bool dieDelete, unsigned long* plusTime );

	bool				NormalInit( sObject attacker, sObject target, unsigned long uniqueIdx, unsigned long infClassIdx,
		unsigned long skillClassIdx, unsigned long* plusTime );
	bool				SwitchParentInit( sObject attacker, sObject target, unsigned long uniqueIdx, unsigned long infClassIdx,
		unsigned long skillClassIdx );
	bool				SwitchChildAuraInit( sObject attacker, sObject target, unsigned long uniqueIdx, unsigned long infClassIdx,
		unsigned long skillClassIdx, unsigned long parenUniqueIdx );
	bool				SwitchChildTotemInit( sObject attacker, sObject target, unsigned long uniqueIdx, unsigned long infClassIdx,
		unsigned long skillClassIdx, unsigned long parenUniqueIdx );

	///// 이효과의 주인은 효과를 받은 사람이다
	//void				UpdateAuraChildInit( sObject target, eAURATYPE auraType, unsigned long parentUniqueIdx )	
	//{ mTarget = target; mAuraType = auraType; mParentUniqueIdx = parentUniqueIdx; }
	//void				UpdateTotemInit( sObject target, eAURATYPE auraType, unsigned long totemUniqueIdx )	
	//{ mTarget = target; mAuraType = auraType; mParentUniqueIdx = totemUniqueIdx; mIsTotem = true; }

	bool				Process( unsigned long elapsedTime, unsigned long accumTime );

	void				SavePlayerInfluence( sInfluence* pInfluence );
	bool				RestorePlayerInfluence( unsigned long playerIdx, unsigned long uniqueIdx, sInfluence* pInfluence );


	/// 호출 시점부터 타이머를 가동
	void				ProcessStart();
	void				ProcessStop();


	unsigned long		GetUniqueIdx()	{ return mUniqueIdx; }
	unsigned long		GetInfluenceClassIdx()	{ return mInfluenceClassIdx; }
	bool				GetDieDelete()	{ return mDieDelete; }
	/// 오라 스킬 인덱스
	unsigned long		GetCopySkillClassIdx()	{ return mCopySkillClassIdx; }
	sObject				GetTarget()	{ return mTarget; }
	sObject				GetAttacker()	{ return mAttacker; }
	unsigned long		GetInfluenceRestTime()	{ return mInfluenceRestTime; }
	unsigned long		GetInfluenceEndTime()	{ return mInfluenceCreationTime + mInfluenceRestTime; }
	bool				IsParentEqual( unsigned long uniqueIdx )	{ return uniqueIdx == mParentUniqueIdx; }
	bool				IsTotemEqual( unsigned long uniqueIdx );
	bool				IsSwitchType()	{ return mSwitchType == eSWITCHTYPE_NONE ? false : true; }
	float				GetRange()	{ return mCopyRange; }
	void				NoSendDelMsg()	{ mSendDelMsg = false; }
	bool				IsSendDelMsg()	{ return mSendDelMsg; }
	eSWITCHTYPE			GetSwitchType()	{ return mSwitchType; }
	bool				IsTotemInf()	{ return mIsTotem; }
	bool				IsSleep()		{ return mIsSleep; }

	void				DelReady()	{ mIsDelReady = true; }

	/// 효과 객체 생성후 일정시간 주기로 효과 적용
	void				DotInfluence( eSTATUS_PLUS influenceIndex, long influenceValue );

	/// 오라를 통한 효과 복사
	void				CopyAuraInfluence();

	/// 복사된 오라(자식) 삭제 체크
	bool				DeleteChildAuraInfluence();
	/// 토템이 만들어낸 자식(오라) 삭제 체크
	bool				CheckTotemInfluence();
	/// 토템에 있는 타겟 목록에서 제거
	void				TotemSetEraseTarget();

private:

	bool				mProcessStart;

	/// 삭제시 메세지 발송여부 - 타겟 객체 죽음
    bool				mSendDelMsg;		

	/// 타겟 죽음시 this 효과객체 삭제 여부
	bool				mDieDelete;

	/// 효과 고유 인덱스
	unsigned long		mUniqueIdx;
	/// 효과 DB 고유IDX
	unsigned long		mDBIdx;
	/// 효과 번호
	unsigned long		mInfluenceClassIdx;

	/// 타겟
	sObject				mTarget;
	/// 공격자
	sObject				mAttacker;

	/// 삭제 대기 상태
	bool				mIsDelReady;	

	/// 효과 생성 시점 ( 절대 시간 )
	unsigned long		mInfluenceCreationTime;
	/// 남은 지속(채널링) 시간 (생성 시점기준 이후로 부터)
	unsigned long		mInfluenceRestTime;
	/// 지속효과 시간 ( 절대 시간 )
	/// ※ 0이 아닌 경우 다음번 데미지 계산을 해야 하는 시간
	unsigned long		mTime1;
	unsigned long		mTime2;

	/// 효과 선행 계산
	long				mInfluenceValue1;
	long				mInfluenceValue2;

	eATTRIBUTETYPE		mAttriButeType;

	long				mDistressPoint;

	cRangeCheck			mRangeCheck;

	unsigned long		mItemIdx;

	/// 토템으로 생성된 효과
	bool				mIsTotem;

	bool				mIsSleep;

	/*--------------- 스위치 on/off 형태의 효과 ---------------*/
	/// 오라 형태
	eSWITCHTYPE			mSwitchType;
	/// 부모 효과의 uniqueidx
	unsigned long		mParentUniqueIdx;
	/// 범위
	unsigned short		mCopyRange;
	/// 체크시간
	unsigned long		mCopyCheckTime;
	/// 적용 타입
	eAPPLYTYPE			mCopyApplyType;
	/// 스킬 인덱스
	unsigned long		mCopySkillClassIdx;
};
