⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magic.h

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 H
字号:
// Magic.h: interface for the CMagic class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MAGIC_H__B2689767_419D_487F_B0F9_FBB04C4619AA__INCLUDED_)
#define AFX_MAGIC_H__B2689767_419D_487F_B0F9_FBB04C4619AA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "define.h"
#include "GameObj.h"
#include "GameData.h"
#include "UserTable.h"
#include "MagicType.h"
#include "T_SingleObjSet2.h"
#include "Myheap.h"
#include "MagicData.h"

#pragma warning(disable:4786)
#include <vector>



char	szMagicTable[];

//////////////////////////////////////////////////////////////////////
enum {
		MAGICSORT_ATTACK			= 1,
		MAGICSORT_RECRUIT			= 2,			// support auto active.
		MAGICSORT_CROSS				= 3,
		MAGICSORT_FAN				= 4,			// support auto active(random).
		MAGICSORT_BOMB				= 5,
		MAGICSORT_ATTACHSTATUS		= 6,
		MAGICSORT_DETACHSTATUS		= 7,
		MAGICSORT_SQUARE			= 8,
		MAGICSORT_JUMPATTACK		= 9,			// move, a-lock
		MAGICSORT_RANDOMTRANS		= 10,			// move, a-lock
		MAGICSORT_DISPATCHXP		= 11,
		MAGICSORT_COLLIDE			= 12,			// move, a-lock & b-synchro
		MAGICSORT_SERIALCUT			= 13,			// auto active only.
		MAGICSORT_LINE				= 14,			// support auto active(random).
		MAGICSORT_ATKRANGE			= 15,			// auto active only, forever active.
		MAGICSORT_ATKSTATUS			= 16,			// support auto active, random active.
		MAGICSORT_CALLTEAMMEMBER	= 17,
		MAGICSORT_RECORDTRANSSPELL	= 18,
		MAGICSORT_TRANSFORM			= 19,
		MAGICSORT_ADDMANA			= 20,			// support self target only.
		MAGICSORT_LAYTRAP			= 21,
		MAGICSORT_DANCE				= 22,			// 跳舞(only use for client)
		MAGICSORT_CALLPET			= 23,			// 召唤兽
		MAGICSORT_VAMPIRE			= 24,			// 吸血,power is percent award. use for call pet
		MAGICSORT_INSTEAD			= 25,			// 替身. use for call pet
		MAGICSORT_DECLIFE			= 26,			// 扣血(当前血的比例)
		MAGICSORT_GROUNDSTING		= 27,			// 地刺
		MAGICSORT_REBORN			= 28,			// 复活 -- zlong 2004.5.14
		MAGICSORT_TEAM_MAGIC		= 29,			// 界结魔法—— 与MAGICSORT_ATTACHSTATUS相同处理,
													//				这里独立分类只是为了方便客户端识别
		MAGICSORT_BOMB_LOCKALL		= 30,			// 与MAGICSORT_BOMB处理相同,只是锁定全部目标
		MAGICSORT_SORB_SOUL			= 31,			// 吸魂魔法
		MAGICSORT_STEAL				= 32,			// 偷盗,随机从目标身上偷取power个物品
		MAGICSORT_LINE_PENETRABLE	= 33,			// 攻击者轨迹可以穿人的线性攻击

		//////////////////////////////////////////////
		// 新增幻兽魔法类型
		MAGICSORT_BLAST_THUNDER			= 34,			// 魔雷
		MAGICSORT_MULTI_ATTACHSTATUS	= 35,			// 群体施加状态
		MAGICSORT_MULTI_DETACHSTATUS	= 36,			// 群体解除状态
		MAGICSORT_MULTI_CURE			= 37,			// 群体补血
		MAGICSORT_STEAL_MONEY			= 38,			// 偷钱
		MAGICSORT_KO					= 39,			// 必杀技,目标血小于15%自动触发
		MAGICSORT_ESCAPE				= 40,			// 逃跑/救助
//		MAGICSORT_FLASH_ATTACK			= 41,			// 移形换位		
};

//////////////////////////////////////////////////////////////////////
const int	WEAPONMAGIC_OFFSET				= 10000;	// 武器上带的魔法的最低ID值,同时是ITEMTYPE中MAGICx字段加此偏移等于MAGICTYPE的ID
const int	WEAPONMAGIC_MIN					= WEAPONMAGIC_OFFSET;
const int	WEAPONMAGIC_MAX					= WEAPONMAGIC_OFFSET+256;
const int	WEAPONMAGIC_LEVEL	= 0;					// 缺省的武器魔法等级
const int	WEAPONR_MAGICID		= 4200000001;			// 右手武器的魔法ID
const int	WEAPONL_MAGICID		= 4200000002;			// 左手武器的魔法ID

//////////////////////////////////////////////////////////////////////
const int	MAGICDAMAGE_ALT					= 26;		// 法术效果的高差限制
const int	AUTOLEVELUP_EXP					= -1;		// 自动升级的标志
const int	DISABLELEVELUP_EXP				= 0;		// 不升级的标志
const int	AUTOMAGICLEVEL_PER_USERLEVEL	= 10;		// 每10级,法术等级加一级
const int	USERLEVELS_PER_MAGICLEVEL		= 10;		// 玩家等级必须是法术等级的10倍

const int	KILLBONUS_PERCENT				= 5;		// 杀死怪物的额外EXP奖励
const int	HAVETUTORBONUS_PERCENT			= 10;		// 有导师的情况下额外EXP奖励
const int	WITHTUTORBONUS_PERCENT			= 20;		// 和导师一起练的情况下EXP奖励

const int	MAGIC_DELAY						= 1000;		// 魔法DELAY
const int	MAGIC_DECDELAY_PER_LEVEL		= 100;		// 每个“法术等级”减少的魔法DELAY
const int	RANDOMTRANS_TRY_TIMES			= 10;		// 随机瞬移的尝试次数
const int	DISPATCHXP_NUMBER				= 20;		// 加XP的数量
const int	COLLIDE_POWER_PERCENT			= 80;		// 冲撞增加攻击力的百分比
const int	COLLIDE_SHIELD_DURABILITY		= 3;		// 冲撞要减少的盾牌寿命
const int	LINE_WEAPON_DURABILITY			= 2;		// 直线攻击要减少的武器寿命
const int	MAX_SERIALCUTSIZE				= 10;		// 顺势斩的数量
const int	AWARDEXP_BY_TIMES				= 1;		// 按次数加经验值
const int	AUTO_MAGIC_DELAY_PERCENT		= 150;		// 连续魔法攻击时增加的DELAY
const int	BOW_SUBTYPE						= 500;		// 弓的SUBTYPE
const int	POISON_MAGIC_TYPE				= 1501;		// use for more status
const int	DEFAULT_MAGIC_FAN				= 120;		// 
//const int	STUDENTBONUS_PERCENT			= 5;		// 导师杀死一只怪物徒弟得到的经验百分比

const int	MAGIC_KO_LIFE_PERCENT			= 15;		// 必杀技能去血上限
const int	MAGIC_ESCAPE_LIFE_PERCENT		= 15;		// 逃跑技能有效的生命上限

//////////////////////////////////////////////////////////////////////
typedef	CGameData<MAGICDATA, szMagicTable, szID>	CMagicDataBase;
class	CMagicData : public IMagicData
{
protected:
	CMagicData()			{ m_pData = NULL; }
	virtual ~CMagicData();
public: // overload
	static IMagicData* CreateNew()		{ return new CMagicData; }
	virtual void	ReleaseByOwner()	{ delete this; }
	virtual bool	Create(IRecordset* pRecordset);
	virtual bool	Create(IRecordset* pDefaultRecord, OBJID idNewKey);
	virtual bool	Create(ST_MAGIC_DATA* pMagicData);
	virtual int		GetInt(MAGICDATA nDataName);
	virtual void	SetInt(MAGICDATA idx, int nData);
	virtual bool	FindType();		//? 创建后,需要调用此函数手工同步

	virtual OBJID	GetID()				{ CHECKF(m_pData); return m_pData->GetID(); }
	virtual bool	Update()			{ CHECKF(m_pData); return m_pData->Update(); }
	virtual void	ClearUpdateFlags()	{ CHECK(m_pData); m_pData->ClearUpdateFlags(); }
	virtual OBJID	InsertRecord()		{ CHECKF(m_pData); return m_pData->InsertRecord(); }
	virtual bool	DeleteRecord()		{ CHECKF(m_pData); return m_pData->DeleteRecord(); }
		
protected:
	CMagicDataBase*	m_pData;

protected: // ctrl
	MYHEAP_DECLARATION(s_heap)
};

//////////////////////////////////////////////////////////////////////
typedef	ISingleObjSet2<IMagicData>		IMagicSet;
typedef	CSingleObjSet2<IMagicData>		CMagicSet;

//////////////////////////////////////////////////////////////////////
struct MagicInfoStruct
{
	OBJID	id;
	OBJID	idOwner;
	int		nType;
	int		nLevel;
	DWORD	dwExp;
};

////////////////////////////////////////////////////////////////
enum
{
	TYPE_MAGIC		= 0, // 魔法
	TYPE_XPSKILL	= 1, // xp技
	TYPE_KONGFU		= 2, // 武功招式
};

//////////////////////////////////////////////////////////////////////
enum
{
	MAGICSTATE_NONE		= 0,		// 无状态
	MAGICSTATE_INTONE	= 1,		// 吟唱状态
	MAGICSTATE_LAUNCH	= 2,		// 施展状态
	MAGICSTATE_DELAY	= 3,		// 延迟状态
};

//////////////////////////////////////////////////////////////////////
enum AUTO_ACTIVE{
	AUTOACTIVE_KILL			= 0x01,
	AUTOACTIVE_FOREVER		= 0x02,
	AUTOACTIVE_RANDOM		= 0x04,
	AUTOACTIVE_HIDDEN		= 0x08,		// 包含此掩码的魔法不显示在客户端
	AUTOACTIVE_EXPDISABLE	= 0x10,		// 包含此掩码的魔法使用过程中不能得到经验
};

//////////////////////////////////////////////////////////////////////
enum THROW_WEAPON{
	THROW_WERPONR_TARGET			= 1,
};

//////////////////////////////////////////////////////////////////////
inline bool		IsWeaponMagic(int nType)			{ return nType >= WEAPONMAGIC_MIN && nType < WEAPONMAGIC_MAX; }
inline int		MagicType(int idx)					{ int nType = idx + WEAPONMAGIC_OFFSET; CHECKF(IsWeaponMagic(nType)); return nType; }
inline OBJID	POSITION2MAGIC_ID(int nPosition)	{ if(nPosition == ITEMPOSITION_WEAPONR) return WEAPONR_MAGICID; else return WEAPONL_MAGICID; }
void	DDALine(int x0, int y0, int x1, int y1, int nRange, vector<POINT>& vctPoint);

//////////////////////////////////////////////////////////////////////
class CMagic  
{
protected:
	CMagic(PROCESS_ID idProcess, IRole* pRole);
	virtual ~CMagic();

private:
	CMagic() { m_bAutoAttack = false;}

public:
	static CMagic* CreateNew(PROCESS_ID idProcess, IRole* pRole);
	ULONG	ReleaseByOwner()	{ delete this; return 0; }
	void	OnTimer(DWORD tCurr);

public: // login
	bool	CreateAll();
	bool	SendInfoToClient();

public: // MapGroup
	bool	SaveInfo();
	bool	GetInfoByIndex(MagicInfoStruct* pInfo, int idx);
	bool	AppendMagic(const MagicInfoStruct* pInfo);

public: // application
	IMagicSet*	QuerySet()		{ CHECKF(m_setData); return m_setData; }
	bool		MagicAttack(int nType, OBJID idTarget, int x, int y, UCHAR ucAutoActive = 0);		// return false: NO BROADCAST
	bool		AbortMagic(bool bSynchro=false);
	void		OwnerUpLevel(int nOwnerLev);

	bool		AutoLearnMagic();
	
	void		UserWeaponSkillUpLevel(int nWeaponSkillType, int nWeaponSkillLevel);
	bool		AutoLearnWeaponSkill(int nWeaponSkillType, int nWeaponSkillLevel, int nWeaponSkillExp=0);
	bool		UserKillTarget(IRole* pTarget);
	bool		AutoAttackTarget(IRole* pTarget);
	IMagicData*	FindMagic(int nType);
	int			GetExtendAtkRange	(CItem* pWeaponR, CItem* pWeaponL);
	bool		AwardExp(int nType, int nBattleExp, int nExp);
	bool		AwardExp(int nBattleExp, int nExp = AWARDEXP_BY_TIMES, bool bIgnoreFlag=false);		// 同时支持外调用,但bAddBattleExp应该为0。用于变身法术
	void		BreakAutoAttack();
	void		DebugReloadAll(){
					for(int i = 0; i < m_setData->GetAmount(); i++)
						m_setData->GetObjByIndex(i)->FindType();
				}

	bool		IsIntone()		{ return m_nMagicState == MAGICSTATE_INTONE; }	//return (m_tIntone.IsActive() && !m_tIntone.IsTimeOut()); }
	bool		IsInLaunch()	{ return m_nMagicState == MAGICSTATE_LAUNCH; }	//return (m_tApply.IsActive() && !m_tApply.IsTimeOut()); }
	bool		IsActive()		{ return (m_nMagicState != MAGICSTATE_NONE); }

public: // static
	static CMagicTypeData*	FindMagicType(int nType, int nLevel);
	static int 	CalcMagicPower(IRole* pAtker, IRole* pTarget, int* pAdjustAtk=0);

protected:
	bool		AwardExpOfLife(IRole* pRole, int nLoseLife, BOOL bMagicRecruit=false);
	void		ShowMiss();
	int			Attack(int nType, IRole* pRole);		// return lose life
	int			Attack(int nType, int x, int y);		// return lose life
	int			Launch();
	bool		UpLevel(bool bSynchro = true);
	bool		CheckCondition(IMagicData* pData, OBJID idTarget, int x, int y);
	bool		CheckCrime(const vector<IRole*>* pSet);
	bool		CheckCrime(IRole* pRole);

	bool		LockTarget(bool bLock);
//	bool		AdjustUserPos();
//	bool		AdjustTargetPos();
	bool		AdjustPosByTrack(int nStepIndex, bool bAtkerPenetrable=false, bool bTargetPenetrable=false);

	bool		CheckProfession(DWORD dwProf, DWORD dwNeedProf);

protected: // calc magic fight
	bool		CheckAwardExpEnable(DWORD dwProf);
	void		OtherMemberAwardExp(IRole* pTarget, int nRawExp);

public: // const
	enum { HIT_BY_MAGIC, HIT_BY_WEAPON, HIT_BY_ITEM };
	bool		IsImmunity(IRole* pRole);
	int			HitByMagic();
	bool		HitByWeapon();
	int			GetDieMode();
	bool		IsKeepBow()						{ return false; }	//m_pMagic && m_pMagic->GetInt(MAGICDATA_SORT) == MAGICSORT_ATTACHSTATUS && m_pMagic->GetInt(MAGICDATA_STATUS) == STATUS_KEEPBOW; }
	int			GetPower(int nStepIndex = -1);
//	int			GetApplyMS(int nStepIndex = -1);
	
public: // task
	bool		CheckType(int nType);
	bool		CheckLevel(int nType, int nLevel);
	bool		UpLevelByTask(int nType);

public: // create
	void		ResetDelay();
	OBJID		LearnMagic(int nType, int nLevel=0, bool bSaveMagic=true);
	bool		UnlearnMagic(int nType, bool bDrop);
	bool		EquipWeaponMagic(OBJID idMagic, int nType, int nLevel);
	bool		UnequipWeaponMagic(OBJID idMagic);

protected: // process
	bool		ProcessAttack();
	bool		ProcessAtkStatus();
	bool		ProcessRecruit();
	bool		ProcessCross();
	bool		ProcessLine();
	bool		ProcessFan();
	bool		ProcessBomb();
	bool		ProcessBombLockAll();
	bool		ProcessSquare();
	bool		ProcessAttach();
	bool		ProcessDetach();
	bool		ProcessJumpAttackFaild(int x, int y);
	bool		ProcessJumpAtk();
	bool		ProcessRandomTrans();
	bool		ProcessDispatchXP();
	bool		ProcessCollideFail(int x, int y, int nDir);
	bool		ProcessCollide();
	bool		ProcessSerialCut();
	bool		ProcessCallTeamMember();
	bool		ProcessRecordTransSpell();
	bool		ProcessTransform();
	bool		ProcessAddMana();
	bool		ProcessLayTrap();
	bool		ProcessCallPet();
	bool		ProcessDecLife();
	bool		ProcessGroundSting();
	bool		ProcessReborn();
	bool		ProcessSorbSoul();
	bool		ProcessSteal();

	////////////////////////////////////////////////////////
	// 新增幻兽魔法类型
	bool		ProcessBlastThunder();
	bool		ProcessMultiAttach();
	bool		ProcessMultiDetach();
	bool		ProcessMultiCure();
	bool		ProcessStealMoney();
	bool		ProcessKO();
	bool		ProcessEscape();
//	bool		ProcessFlashAttack();


	typedef std::vector<IRole*>	ROLE_SET;
	enum { LOCK_NONE, LOCK_ONE, LOCK_ALL };
	bool		CollectTargetSet_Bomb(ROLE_SET& setRole, POINT& pos, int nLockType=LOCK_NONE);
	bool		CollectTargetSet_Team(ROLE_SET& setRole);

protected: // spawn id
	static OBJID	SpawnMagicID()						{ return InterlockedIncrement(&m_lockNextID); }

protected: // data
	IMagicSet*		m_setData;

protected: // intone
	IMagicData*		m_pMagic;
	OBJID			m_idTarget;
	POINT			m_pos;
	int				m_nData;
	bool			m_bAutoAttack;
	int				m_nRawDelay;		// fast delay for trans map
	int				m_nDelay;			// normal delay

	int				m_nMagicState;		// 魔法状态	-- zlong 2004-11-30

	CTimeOutMS		m_tIntone;			// 吟唱延时
	CTimeOutMS		m_tApply;			// 每次效果延时
	int				m_nApplyTimes;		// 作用效果次数
	CTimeOutMS		m_tDelay;			// 施展结束延时

	vector<OBJID>	m_setTargetLocked;	// 魔法锁定,有轨迹的目标集
	bool			m_bTargetLocked;

private: // cheat --------
	OBJID			m_cheatTargetID;
	int				m_cheatCount;

// XP add by arhun
public:
	BOOL HaveXpMagic();	// 是否学会XP技能

protected: // ctrl
	PROCESS_ID		m_idProcess;
	IRole*			m_pOwner;
	static long		m_lockNextID;
	MYHEAP_DECLARATION(s_heap)
};

#endif // !defined(AFX_MAGIC_H__B2689767_419D_487F_B0F9_FBB04C4619AA__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -