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

📄 objectmonster.cpp

📁 真正的传奇源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "stdafx.h"

BYTE g_SpitMap[8][5][5] = {
							{	{0, 0, 1, 0, 0},     //DR_UP
								{0, 0, 1, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0} },

							{	{0, 0, 0, 0, 1},     //DR_UPRIGHT
								{0, 0, 0, 1, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0} },

							{	{0, 0, 0, 0, 0},     //DR_RIGHT
								{0, 0, 0, 0, 0},
								{0, 0, 0, 1, 1},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0} },

							{	{0, 0, 0, 0, 0},     //DR_DOWNRIGHT
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 1, 0},
								{0, 0, 0, 0, 1} },

							{	{0, 0, 0, 0, 0},     //DR_DOWN
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 1, 0, 0},
								{0, 0, 1, 0, 0} },

							{	{0, 0, 0, 0, 0},     //DR_DOWNLEFT
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 1, 0, 0, 0},
								{1, 0, 0, 0, 0} },

							{	{0, 0, 0, 0, 0},     //DR_LEFT
								{0, 0, 0, 0, 0},
								{1, 1, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0} },

							{	{1, 0, 0, 0, 0},     //DR_UPLEFT
								{0, 1, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0},
								{0, 0, 0, 0, 0} }
};

CMonsterObject::CMonsterObject()
{
	m_dwRunNextTick		= 250;
	m_dwSearchTick		= 3000 + rand() % 2000;

	m_nDirection		= 4;

	m_pTargetObject		= NULL;
	m_btTargetDir		= 0;
	m_pExpHitterObject	= NULL;

	m_dwHitTime			= 0;

	m_fIsDead			= FALSE;
	m_fHideMode			= FALSE;

	m_btLight			= 0;
	
	m_fDupMode			= FALSE;
	m_fRunAwayMode		= FALSE;
	m_fNoAttackMode		= FALSE;
	m_fHasMission		= FALSE;
	m_fBoHolySeize		= FALSE;

	m_dwSearchEnemyTime	= GetTickCount();
	m_dwThinkTime		= GetTickCount();

	m_wObjectType		= _OBJECT_MONSTER;

	m_btAntiMagic		= 0;

	m_dwGold			= 0;
}

void CMonsterObject::KickException()
{
	m_fIsDead		= TRUE;
	m_dwDeathTime	= GetTickCount();

	MakeGhost();
}
/*procedure  TCreature.KickException;
var
   hum: TUserHuman;
begin
   if RaceServer = RC_USERHUMAN then begin
      MapName := HomeMap;
      CX := HomeX;
      CY := HomeY;
      hum := TUserHuman(self);
      hum.EmergencyClose := TRUE;
   end else begin  //
      Death := TRUE;
      DeathTime := GetTickCount;
      MakeGhost;
   end;
end; */

CMonsterObject* CMonsterObject::MakeClone(int nMonRace)
{
	CMonRaceInfo* pMonRaceInfo = &g_pMonRaceInfo[nMonRace];

	if (pMonRaceInfo)
	{
		CMonsterObject* pMonsterObject = (CMonsterObject*)AddCreatureSysop(m_nCurrX, m_nCurrY, pMonRaceInfo, FALSE);

		if (pMonsterObject)
		{
			pMonsterObject->m_pMasterObject = m_pMasterObject;
//      mon.MasterRoyaltyTime := src.MasterRoyaltyTime;
//      mon.SlaveMakeLevel := src.SlaveMakeLevel;
//      mon.SlaveExpLevel := src.SlaveExpLevel;
//      mon.RecalcAbilitys; //ApplySlaveLevelAbilitys;
//      mon.ChangeNameColor;
			if (m_pMasterObject)
			{
				CPlayerObject* pPlayerObject = dynamic_cast<CPlayerObject*>(m_pMasterObject);

				if (pPlayerObject)
					pPlayerObject->m_xSlaveObjList.AddNewNode(pMonsterObject);
			}

			pMonsterObject->m_WAbility			= m_WAbility;
			memcpy(pMonsterObject->m_wStatusArr, m_wStatusArr, sizeof(m_wStatusArr));
			pMonsterObject->m_pTargetObject		= m_pTargetObject;
			pMonsterObject->m_dwTargetFocusTime	= m_dwTargetFocusTime;
			pMonsterObject->m_pLastHitterObject	= m_pLastHitterObject;
			pMonsterObject->m_dwLastHitTime		= m_dwLastHitTime;
			pMonsterObject->m_nDirection		= m_nDirection;

			return pMonsterObject;
		}
	}

	return NULL;
}

BOOL CMonsterObject::IsProperTarget(CCharObject* pTargetObject)
{
	BOOL fFlag = FALSE;

	if (pTargetObject == this || !pTargetObject) return fFlag;

	if (pTargetObject->m_wObjectType & _OBJECT_HUMAN)
	{
		CPlayerObject *pPlayerObject = dynamic_cast<CPlayerObject*>(pTargetObject);

		if (pPlayerObject)
		{
			if (pPlayerObject->IsEmpty())
				return fFlag;
		}
	}

//	if (pTargetMonsterObject)
//	{
	if (m_pMasterObject)
	{
		if (m_pMasterObject->m_pTargetObject == pTargetObject)
			fFlag = TRUE;

		if (pTargetObject->m_pTargetObject)
		{
			if ((pTargetObject->m_pTargetObject == m_pMasterObject) || 
				(pTargetObject->m_pTargetObject->m_pMasterObject == m_pMasterObject))
				fFlag = TRUE;
		}
/*			if (
         //林牢捞 乐绰 各
         //if (target.RaceServer >= RC_ANIMAL) and (target.Master = nil) then
         //   Result := TRUE;
         if (Master.LastHiter = target) or (Master.ExpHiter = target) or (Master.TargetCret = target) then
            Result := TRUE;
         if target.TargetCret <> nil then begin
            if (target.TargetCret = Master) or  //林牢阑 傍拜
               (target.TargetCret.Master = Master) and (target.RaceServer <> 0) //悼丰甫 傍拜, 荤恩牢版快 力寇
            then
               Result := TRUE;
         end; */
		if (pTargetObject->m_pTargetObject == this)
			fFlag = TRUE;
/*         if (target.TargetCret = self) and (target.RaceServer >= RC_ANIMAL) then  //各捞搁辑 磊脚阑 傍拜窍绰 磊
            Result := TRUE;
         if target.Master <> nil then begin  //惑措啊 家券各
            if (target.Master = Master.LastHiter) or (target.Master = Master.TargetCret) then
               Result := TRUE;
         end;
         if target.Master = Master then Result := FALSE;  //林牢捞 鞍栏搁 傍拜救窃
         if target.BoHolySeize then Result := FALSE;  //搬拌俊 吧妨 乐栏搁 傍拜救窃
         if Master.BoSlaveRelax then Result := FALSE;
         if target.RaceServer = RC_USERHUMAN then begin  //惑措啊 荤恩牢 版快
            if (Master.InSafeZone) or (target.InSafeZone) then begin  //林牢捞 救傈瘤措俊 乐芭唱, 惑措啊 救傈瘤措俊 乐绰 版快
               Result := FALSE;
            end;
         end;
         BreakCrazyMode;  //林牢乐绰 各.. */
	}
	else
	{
		if (pTargetObject->m_wObjectType & _OBJECT_HUMAN)
			fFlag = TRUE;
		
		if (pTargetObject->m_pMasterObject)
			fFlag = TRUE;

/*         if target.RaceServer = RC_USERHUMAN then
            Result := TRUE;
         if (RaceServer > RC_PEACENPC) and (RaceServer < RC_ANIMAL) then begin //傍拜仿阑 啊柳 NPC绰 酒公唱 傍拜茄促.
            Result := TRUE;
         end;
         if target.Master <> nil then
            Result := TRUE; */

//		if BoCrazyMode then  //固魔, 酒公唱 傍拜, 利 救啊覆... (家券各俊霸档 烹茄促.)
  //       Result := TRUE;
	}

	return fFlag;
}

void CMonsterObject::GetCharName(char *pszCharName)
{
	strcpy(pszCharName, m_szName);

	if (m_pMasterObject)
	{
		char szMasterName[32];

		m_pMasterObject->GetCharName(szMasterName);

		strcat(pszCharName, " (");
		strcat(pszCharName, szMasterName);
		strcat(pszCharName, ")");
	}
}

void CMonsterObject::MakeHolySeize(DWORD dwHTime)
{
	m_fBoHolySeize		= TRUE;
	m_dwHolySeizeStart	= GetTickCount();
	m_dwHolySeizeTime	= dwHTime;
	
	AddRefMsg(RM_CHANGENAMECOLOR, 0, 0, 0, 0, NULL);
}

void CMonsterObject::BreakHolySeize()
{
	if (m_fBoHolySeize)
	{
		m_fBoHolySeize		= FALSE;
		AddRefMsg(RM_CHANGENAMECOLOR, 0, 0, 0, 0, NULL);
	}
}

BOOL CMonsterObject::WalkTo(int nDir)
{
	int nX, nY;

	if (m_fBoHolySeize)
		return FALSE;

	WalkNextPos(nDir, nX, nY);

	if (m_wEscape)
	{
		if (!m_pMap->CanSafeWalk(nX, nY))
			return FALSE;
	}

	return WalkXY(nX, nY, nDir);
}

void CMonsterObject::Die()
{
	CPlayerObject*	pPlayerObject = NULL;
	CMonsterObject* pMonsterObject = NULL;

	if (m_pExpHitterObject)
	{
		pPlayerObject = dynamic_cast<CPlayerObject*>(m_pExpHitterObject);

		if (pPlayerObject)
		{
			int nExp = pPlayerObject->CalcGetExp(m_Ability.Level, m_nFightExp);
			pPlayerObject->GainExp(nExp);
		}
		else
		{
			pMonsterObject = dynamic_cast<CMonsterObject*>(m_pExpHitterObject);

			if (pMonsterObject)
			{
				if (pMonsterObject->m_pMasterObject)
				{
					pPlayerObject = dynamic_cast<CPlayerObject*>(pMonsterObject->m_pMasterObject);

					int nExp = pPlayerObject->CalcGetExp(m_Ability.Level, m_nFightExp);
					pPlayerObject->GainExp(nExp);
				}
			}
		}
	}

//	MonGetRandomItems();
	ScatterBagItems();
	
	m_pMasterObject = NULL;

	CCharObject::Die();
/*   try
      //各阑 磷牢 版快.  版氰摹甫 掘绰促.
      if (RaceServer <> RC_USERHUMAN) and (LastHiter <> nil) then begin
         //付瘤阜 锭赴磊啊 荤恩捞绢具 窃.
         if ExpHiter <> nil then begin //版氰摹甫 冈绰 荤恩.. 刚历 锭府扁 矫累茄 荤恩
            if ExpHiter.RaceServer = RC_USERHUMAN then begin
               //弥措 眉仿 父怒, 惑措狼 饭骇俊 厚肥秦辑 版氰摹甫 掘绰促.
               exp := ExpHiter.CalcGetExp (self.Abil.Level, self.FightExp);
               if not BoVentureServer then begin
                  ExpHiter.GainExp (exp);
               end else begin
                  //葛氰辑滚俊辑绰 痢荐啊 棵扼埃促.
               end;
            end else begin
               if ExpHiter.Master <> nil then begin //锭赴仇捞 家券各
                  //何窍档 版氰摹甫 冈澜
                  ExpHiter.GainSlaveExp (self.Abil.Level);  //惑措狼 饭骇父怒 版氰阑 冈澜
                  //林牢捞 版氰摹甫 冈绰促.
                  exp := ExpHiter.Master.CalcGetExp (self.Abil.Level, self.FightExp);
                  if not BoVentureServer then begin
                     ExpHiter.Master.GainExp (exp); //家券荐甫 何府绰 荤恩捞 冈绰促.
                  end else begin
                     //葛氰辑滚俊辑绰 痢荐啊 棵扼埃促.
                  end;
               end;
            end;
         end else
            if LastHiter.RaceServer = RC_USERHUMAN then begin
               //弥措 眉仿 父怒, 惑措狼 饭骇俊 厚肥秦辑 版氰摹甫 掘绰促.
               exp := LastHiter.CalcGetExp (self.Abil.Level, self.FightExp);
               if not BoVentureServer then begin
                  LastHiter.GainExp (exp);
               end else begin
                  //
               end;
            end;
      end;
      Master := nil;
   except
      MainOutMessage ('[Exception] TCreature.Die 1');
   end;	  */
}

void CMonsterObject::ScatterBagItems()
{
	_LPTUSERITEMRCD lptUserItemRcd = NULL;

	if (m_xTItemRcd.GetCount())
	{
		PLISTNODE pListNode = m_xTItemRcd.GetHead();

		while (pListNode)
		{
			lptUserItemRcd = m_xTItemRcd.GetData(pListNode);

			if (lptUserItemRcd)
				DropItemDown(lptUserItemRcd, 3, FALSE);

			pListNode = m_xTItemRcd.RemoveNode(pListNode);
		}
	}
}
/*
procedure TCreature.ScatterBagItems;    //磷绢辑 啊规俊 酒捞袍阑 汝覆.. 傈何 汝赴促.
var
   i, dropwide: integer;
   pu: PTUserItem;
   dellist: TStringList;
   boDropall: Boolean;
begin
   dellist := nil;

   boDropall := TRUE;
   if RaceServer = RC_USERHUMAN then begin
      dropwide := 2;
      if PKLevel < 2 then boDropall := FALSE; //荤恩篮 1/3犬伏肺 冻焙促.
      //弧盎捞绰 促 冻焙促.
   end else
      dropwide := 3;

   try
      for i:=ItemList.Count-1 downto 0 do begin
         if (Random(3) = 0) or boDropall then begin
            if DropItemDown (PTUserItem(ItemList[i])^, dropwide, TRUE) then begin
               pu := PTUserItem(ItemList[i]);
               if RaceServer = RC_USERHUMAN then begin
                  if dellist = nil then dellist := TStringList.Create;
                  //冻绢哆赴 酒捞袍阑 努扼捞攫飘俊 舅覆.
                  dellist.AddObject(UserEngine.GetStdItemName (pu.Index), TObject(pu.MakeIndex));
               end;
               Dispose(PTUserItem(ItemList[i]));
               ItemList.Delete (i);
            end;
         end;
      end;
      if dellist <> nil then begin
         SendMsg (self, RM_DELITEMS, 0, integer(dellist), 0, 0, '');
         //dellist绰 rm_delitem俊辑 free 矫难具 茄促.
      end;
   except
      MainOutMessage ('[Exception] TCreature.ScatterBagItems');
   end;
end;
*/
void CMonsterObject::Initialize()
{
	memcpy(m_szName, g_pMonRaceInfo[g_pMonRaceInfo[m_nRace].wRaceIndex].szMonName, memlen(g_pMonRaceInfo[g_pMonRaceInfo[m_nRace].wRaceIndex].szMonName));

	MonGetRandomItems();

//	cret.RaceImage := pm.RaceImg;
//	cret.Appearance := pm.Appr;
//	cret.LifeAttrib := pm.LifeAttrib;
	m_btLifeAttrib		= g_pMonRaceInfo[m_nRace].btUndead;

	m_Ability.Level		= g_pMonRaceInfo[m_nRace].Level;
	m_Ability.HP		= g_pMonRaceInfo[m_nRace].HP;
	m_Ability.MaxHP		= g_pMonRaceInfo[m_nRace].HP;
	m_Ability.MP		= g_pMonRaceInfo[m_nRace].MP;
	m_Ability.MaxMP		= g_pMonRaceInfo[m_nRace].MP;
	m_Ability.AC		= g_pMonRaceInfo[m_nRace].AC;
	m_Ability.MAC		= g_pMonRaceInfo[m_nRace].MAC;
	m_Ability.DC		= g_pMonRaceInfo[m_nRace].DC;
	m_Ability.MC		= 0;
	m_Ability.SC		= 0;
	m_Ability.m_wWater	= g_pMonRaceInfo[m_nRace].m_wWater;
	m_Ability.m_wFire	= g_pMonRaceInfo[m_nRace].m_wFire;
	m_Ability.m_wWind	= g_pMonRaceInfo[m_nRace].m_wWind;
	m_Ability.m_wLight	= g_pMonRaceInfo[m_nRace].m_wLight;
	m_Ability.m_wEarth	= g_pMonRaceInfo[m_nRace].m_wEarth;

	m_nFightExp			= g_pMonRaceInfo[m_nRace].Exp;

	m_WAbility			= m_Ability;

	m_btSpeedPoint		= (BYTE)g_pMonRaceInfo[m_nRace].Speed;
	m_btHitPoint		= (BYTE)g_pMonRaceInfo[m_nRace].Hit;

	m_dwNextWalkTime	= g_pMonRaceInfo[m_nRace].dwWalkSpeed;
	m_dwNextHitTime		= g_pMonRaceInfo[m_nRace].dwAttackSpeed;

	m_wEscape			= g_pMonRaceInfo[m_nRace].wEscape;

	m_nViewRange		= (4 * g_pMonRaceInfo[m_nRace].ViewRange) * (g_pMonRaceInfo[m_nRace].ViewRange + 1); 

	m_tFeature.btGender	= 3;
	m_tFeature.btWear	= g_pMonRaceInfo[m_nRace].nAppear;
	m_tFeature.btHair	= 0;
	m_tFeature.btWeapon	= 0;
}

void CMonsterObject::MakeGenItem(_LPTGENERALITEMRCD lptGenItemRcd)
{
	_TGENITEMRCD		GenItemRcd;

	sprintf(GenItemRcd.szItem, "G%03d%04d%04d", lptGenItemRcd->nStdIndex, lptGenItemRcd->nDura, lptGenItemRcd->nDuraMax);

	memcpy(lptGenItemRcd->szMakeIndex, GenItemRcd.szItem, 12);

	m_xTGenItemRcd.AddNewNode(lptGenItemRcd);
}

void CMonsterObject::MonGetRandomItems()
{
	CMonItem*			pMonItem = NULL;
	CMonRaceInfo*		pMonRaceInfo = &g_pMonRaceInfo[m_nRace];

//	_TMAKEITEMRCD		MakeItemRcd;

	if (pMonRaceInfo)
	{
		if (pMonRaceInfo->m_xMonItemList.GetCount())
		{
			PLISTNODE pListNode = pMonRaceInfo->m_xMonItemList.GetHead();

			while (pListNode)
			{
				pMonItem = pMonRaceInfo->m_xMonItemList.GetData(pListNode);

				if (pMonItem)
				{
//					if (1 >= rand() % pMonItem->m_nPoint)
//					{
						_LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD;

						switch (pMonItem->m_btItemType)
						{
							case _ITEM_GOLD:
								m_dwGold = (pMonItem->m_wCount / 2) + (rand() % pMonItem->m_wCount);
								break;
							case _ITEM_WEAPON:
							case _ITEM_ARMOR:
							case _ITEM_ACCESSORY:
							{
								ZeroMemory(lpTItemRcd->szPrefixName, sizeof(lpTItemRcd->szPrefixName));
								ZeroMemory(lpTItemRcd->btValue, sizeof(lpTItemRcd->btValue));

								lpTItemRcd->nStdIndex = pMonItem->m_wItemIndex;
								
								switch (pMonItem->m_btItemType)
								{
									case 0:
										memcpy(lpTItemRcd->szMakeIndex, "A00000000000", 12);
										break;
									case 1:
										memcpy(lpTItemRcd->szMakeIndex, "B00000000000", 12);
										break;
									case 2:
										memcpy(lpTItemRcd->szMakeIndex, "C00000000000", 12);
										break;
								}

								lpTItemRcd->nDura		= g_pStdItemSpecial[pMonItem->m_wItemIndex].wDuraMax;
								lpTItemRcd->nDuraMax	= g_pStdItemSpecial[pMonItem->m_wItemIndex].wDuraMax;

								if (rand() % 10 == 0)
									g_pStdItemSpecial[pMonItem->m_wItemIndex].UpgradeRandomItem(lpTItemRcd->btValue, lpTItemRcd->nDura, lpTItemRcd->nDuraMax);

								m_xTItemRcd.AddNewNode(lpTItemRcd);
//								MakeItemToDB(&MakeItemRcd);

								break;
							}
							case _ITEM_ETC:
							{
								_LPTGENERALITEMRCD	lptGenItemRcd = new _TGENERALITEMRCD;

								if (lptGenItemRcd)
								{
									lptGenItemRcd->nStdIndex	= pMonItem->m_wItemIndex;
									lptGenItemRcd->nDura		= g_pStdItemEtc[pMonItem->m_wItemIndex].wDuraMax;
									lptGenItemRcd->nDuraMax		= g_pStdItemEtc[pMonItem->m_wItemIndex].dwRSource;

									MakeGenItem(lptGenItemRcd);
								}

								break;
							}
						}
//					}
				}

				pListNode = pMonRaceInfo->m_xMonItemList.GetNext(pListNode);
			}
		}
	}
}
/*
function  TUserEngine.MonGetRandomItems (mon: TCreature): integer;
var
   i, numb: integer;
   list: TList;
   iname: string;
   pmi: PTMonItemInfo;
   pu: PTUserItem;
   pstd: PTStdItem;
begin
   list := nil;
   for i:=0 to MonDefList.Count-1 do begin
      if CompareText (PTMonsterInfo(MonDefList[i]).Name, mon.UserName) = 0 then begin
         list := PTMonsterInfo(MonDefList[i]).Itemlist;
         break;
      end;
   end;
   if list <> nil then begin
      for i:=0 to list.Count-1 do begin
         pmi := PTMonItemInfo(list[i]);
         if pmi.SelPoint >= Random(pmi.MaxPoint) then begin
            if CompareText(pmi.ItemName, '捣') = 0 then begin
               mon.Gold := (pmi.Count div 2) + Random(pmi.Count);
            end else begin
               //蜡聪农 酒捞袍 捞亥飘....
               iname := '';
               ////if (BoUniqueItemEvent) and (not mon.BoAnimal) then begin
               ////   if GetUniqueEvnetItemName (iname, numb) then begin
                     //numb; //iname
               ////   end;
               ////end;
               if iname = '' then
                  iname := pmi.ItemName;

               new (pu);
               if CopyToUserItemFromName (iname, pu^) then begin
                  //郴备己捞 函版登绢 乐澜..
                  pu.Dura := Round ((pu.DuraMax / 100) * (20+Random(80)));

                  pstd := GetStdItem (pu.Index);
                  ////if pstd <> nil then
                  ////   if pstd.StdMode = 50 then begin  //惑前鼻
                  ////      pu.Dura := numb;
                  ////   end;

                  //撤篮 犬伏肺
                  //酒捞袍狼 诀弊贰捞靛等 郴侩 利侩
                  if Random(10) = 0 then
                     RandomUpgradeItem (pu);

                  mon.ItemList.Add (pu)
               end else
                  Dispose (pu);
            end;
         end;

⌨️ 快捷键说明

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