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

📄 objectplayer.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					case _SKILL_FIREBALL2:
					case _SKILL_FIREBALL:
					case _SKILL_BIGCLOAK:
					case _SKILL_CLOAK:
						AddRefMsg(RM_SPELL2, pMagicInfo->sEffect, nTargetX, nTargetY, pMagicInfo->nIndex, NULL);
						break;
					case _SKILL_MOOTEBO:
						DoMotaebo();
						return TRUE;
					default:
						AddRefMsg(RM_SPELL, pMagicInfo->sEffect, nTargetX, nTargetY, pMagicInfo->nIndex, NULL);
						break;
				}

				return DoSpell(lptMagicRcd, nTargetX, nTargetY, (CCharObject*)nTargetObj);
			}
		} // if (pMagicInfo)
	}

	return FALSE;	
}

BOOL CPlayerObject::DoSpell(_LPTHUMANMAGICRCD	lptMagicRcd, int TargetX, int TargetY, CCharObject* pTargetObject)
{
	BOOL fTrain = FALSE;

	CMagicInfo*	pMagicInfo	= GetMagicInfo(lptMagicRcd->btMagicID);

	if (!pMagicInfo) return FALSE;

	switch (lptMagicRcd->btMagicID)
	{
		case _SKILL_SHOWHP:			// 沤扁颇楷
		{
			if (!DoShowHP(pTargetObject, pMagicInfo, lptMagicRcd->btLevel))
				return FALSE;
		
			break;
		}
		case _SKILL_HEALLING:		// 雀汗贱
		{
			if (!pTargetObject)
			{
				pTargetObject = (CCharObject*)this;

				TargetX = m_nCurrX;
				TargetY = m_nCurrY;
			}

			int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow() + LOBYTE(m_WAbility.SC) * 2, lptMagicRcd->btLevel), 
										(HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) * 2 + 1);

			if (pTargetObject->m_WAbility.HP < pTargetObject->m_WAbility.MaxHP)
			{
				pTargetObject->AddDelayProcess(this, RM_MAGHEALING, 0, nPwr, 0, 0, NULL, 800);
#ifdef _DEBUG
				char szMsg[64];

				sprintf(szMsg, "%s 雀汗矫糯 - PW:%d HP:%d", pTargetObject->m_szName, nPwr, pTargetObject->m_WAbility.HP);
				SysMsg(szMsg, 0);
#endif
			}

			break;
		}
		case _SKILL_BIGHEALLING:	// 措雀汗贱
		{
			int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow() + LOBYTE(m_WAbility.SC) * 2, lptMagicRcd->btLevel), 
										(HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) * 2 + 1);
			
			if (MagBigHealing(nPwr, TargetX, TargetY))
				fTrain = TRUE;
			
			break;
		}
		case _SKILL_LIGHTENING:		// 碍拜
		{
			if (IsProperTarget(pTargetObject))
			{
				if (pTargetObject->m_btAntiMagic <= (rand() % 10))
				{
					int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC), 
												HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

					if (pTargetObject->m_wObjectType & _OBJECT_ANIMAL)
					{
						fTrain = TRUE;

						if (((CMonsterObject*)pTargetObject)->m_btLifeAttrib == LA_UNDEAD)
							nPwr = ROUND(nPwr * 1.5);
					}

					AddDelayProcess(this, RM_DELAYMAGIC, nPwr, MAKELONG(TargetX, TargetY), 2, (int)pTargetObject, NULL, 1400);
				}
				else
					pTargetObject = NULL;
			}

			break;
		}
		case _SKILL_FIREBALL:		// 拳堪厘
		case _SKILL_FIREBALL2:		// 陛碍拳堪厘 
		{
			int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC), 
										HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

			AddDelayProcess(this, RM_DELAYMAGIC, nPwr, MAKELONG(TargetX, TargetY), 2, (int)pTargetObject, NULL, 900);
/*         if user.MagCanHitTarget (user.CX, user.CY, target) then begin
    if user.IsProperTarget (target) then begin
       if (target.AntiMagic <= Random(10)) and (abs(target.CX-xx) <= 1) and (abs(target.CY-yy) <= 1) then begin
          with user do begin
             pwr := GetAttackPower (
                         GetPower (MPow(pum)) + Lobyte(WAbil.MC),
                         ShortInt(Hibyte(WAbil.MC)-Lobyte(WAbil.MC)) + 1
                      );
             //pwr := GetPower (MPow(pum)) + (Lobyte(WAbil.MC) + Random(Hibyte(WAbil.MC)-Lobyte(WAbil.MC) + 1));
             //鸥百 嘎澜, 饶俊 瓤苞唱鸥巢
             //target.SendDelayMsg (user, RM_MAGSTRUCK, 0, pwr, 0, 0, '', 1200 + _MAX(Abs(CX-xx),Abs(CY-yy)) * 50 );
          end;
          //rm-delaymagic俊辑 selecttarget阑 贸府茄促.
          user.SendDelayMsg (user, RM_DELAYMAGIC, pwr, MakeLong(xx, yy), 2, integer(target), '', 600);
          if (target.RaceServer >= RC_ANIMAL) then train := TRUE;
       end else
          target := nil;
    end else
       target := nil;
 end else
    target := nil; */
			break;
		}
		case _SKILL_FIREWIND:		// 拳堪浅
		{
			if (MagPushArround(3) > 0) fTrain = TRUE;

			break;
		}
		case _SKILL_FIRE:			// 堪荤厘
		{
			int nX = 0, nY = 0;

			int nDir = GetNextDirection(TargetX, TargetY);

			if (GetNextPosition(nDir, 1, nX, nY))
			{
				GetNextPosition(nDir, 5, TargetX, TargetY);

				int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC), 
											HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);
				
				if (MagPassThroughMagic(nX, nY, TargetX, TargetY, nDir, nPwr, FALSE) > 0)
					fTrain = TRUE;
			}

			break;
		}
		case _SKILL_SHOOTLIGHTEN:	// 汾牢厘
		{
			int nX = 0, nY = 0;

			int nDir = GetNextDirection(TargetX, TargetY);

			if (GetNextPosition(nDir, 1, nX, nY))
			{
				GetNextPosition(nDir, 8, TargetX, TargetY);

				int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC), 
											HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);
				
				if (MagPassThroughMagic(nX, nY, TargetX, TargetY, nDir, nPwr, TRUE) > 0)
					fTrain = TRUE;
			}

			break;
		}
		case _SKILL_SHIELD:		// 林贱狼阜
		{
			if (MagBubbleDefenceUp(lptMagicRcd->btLevel, pMagicInfo->GetPower(15 + GetRPow(m_WAbility.MC), lptMagicRcd->btLevel)))
				fTrain = TRUE;

			break;
		}
		case _SKILL_EATTHFIRE:	// 瘤堪贱
		{
			int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC), 
										HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

			if (MagMakeFireCross(nPwr, pMagicInfo->GetPower(10, lptMagicRcd->btLevel) + GetRPow(m_WAbility.MC) / 2, TargetX, TargetY))
				fTrain = TRUE;

			break;
		}
		case _SKILL_FIREBOOM:	// 气凯颇
		case _SKILL_SNOWWIND:	// 葫汲浅
		{
			if (MagBigExplosion(GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC), 
												HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1), 
								TargetX, TargetY, 1))
				fTrain = TRUE;

			break;
		}
		case _SKILL_AMYOUNSUL:
		case _SKILL_HANGMAJINBUB:
		case _SKILL_DEJIWONHO:
		case _SKILL_CLOAK:
		case _SKILL_FIRECHARM:
		case _SKILL_HOLYSHIELD:
		case _SKILL_BIGCLOAK:
		case _SKILL_SKELLETON:
		{
			if (_LPTGENERALITEMRCD lptItem = m_pUserInfo->CanUseBujuk())
			{
				if (lptItem->nDura >= 1)
				{
					lptItem->nDura--;

					AddProcess(this, RM_DURACHANGE, U_ARMRINGL, lptItem->nDura, lptItem->nDuraMax, 0);

					switch (lptMagicRcd->btMagicID)
					{
						case _SKILL_HANGMAJINBUB:	// 亲付柳过
						{
							int nPwr = GetAttackPower(pMagicInfo->GetPower13(60, lptMagicRcd->btLevel) + 5 * LOBYTE(m_WAbility.SC),
														5 * (HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) + 1);

							if (MagMakeDefenceArea(TargetX, TargetY, 3, nPwr, STATE_MAGDEFENCEUP))
								fTrain = TRUE;

							break;
						}
						case _SKILL_DEJIWONHO:		// 措瘤盔龋
						{
							int nPwr = GetAttackPower(pMagicInfo->GetPower13(60, lptMagicRcd->btLevel) + 5 * LOBYTE(m_WAbility.SC),
														5 * (HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) + 1);

							if (MagMakeDefenceArea(TargetX, TargetY, 3, nPwr, STATE_DEFENCEUP))
								fTrain = TRUE;

							break;
						}
						case _SKILL_CLOAK:			// 篮脚贱
						{
							if (MagMakePrivateTransparent(pMagicInfo->GetPower13(30, lptMagicRcd->btLevel) + 3 * GetRPow(m_WAbility.SC)))
								fTrain = TRUE;

							break;
						}
						case _SKILL_BIGCLOAK:		// 措篮脚贱
						{
							if (MagMakeGroupTransparent(TargetX, TargetY, pMagicInfo->GetPower13(30, lptMagicRcd->btLevel) + 3 * GetRPow(m_WAbility.SC)))
								fTrain = TRUE;

							break;
						}
						case _SKILL_FIRECHARM:		// 气混拌
						{
							int nPwr = GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.SC), 
														HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC) + 1);

							AddDelayProcess(this, RM_DELAYMAGIC, nPwr, MAKELONG(TargetX, TargetY), 2, (int)pTargetObject, NULL, 900);

							break;
						}
						case _SKILL_HOLYSHIELD:		// 搬拌
						{
							if (MagMakeHolyCurtain(pMagicInfo->GetPower13(40, lptMagicRcd->btLevel) + 3 * GetRPow(m_WAbility.SC), TargetX, TargetY) > 0)
								fTrain = TRUE;

							break;
						}
						case _SKILL_SKELLETON:		// 归榜家券贱
						{
							int nX, nY;

							GetFrontPosition(nX, nY);

							if (MakeSlave(94, nX, nY, lptMagicRcd->btLevel, 1, 48 * 60 * 60))
								fTrain = TRUE;

							break;
						}
					}
				}
				else
					return FALSE;
			}
			else
				return FALSE;

			break;
		}
		case _SKILL_SINSU:			// 脚荐家券
		{
			if (_LPTGENERALITEMRCD lptItem = m_pUserInfo->CanUseBujuk())
			{
				if (lptItem->nDura >= 5)
				{
					lptItem->nDura -= 5;

					AddProcess(this, RM_DURACHANGE, U_ARMRINGL, lptItem->nDura, lptItem->nDuraMax, 0);

					if (GetAvailablePosition(m_pMap, TargetX, TargetY, 3))
					{
						AddDelayProcess(this, RM_MAKESLAVE, 161, TargetX, TargetY, lptMagicRcd->btLevel, NULL, 1200);
						fTrain = TRUE;
					}
					else
						return FALSE;
				}
				else
					return FALSE;
			}
			else
				return FALSE;

			break;
		}
		case _SKILL_KILLUNDEAD:
		{
			if (pTargetObject)
			{
				if (IsProperTarget(pTargetObject))
				{
	//				if (MagTurnUnDead(pTargetObject, TargetX, TargetY, lptMagicRcd->btLevel))
					MagTurnUndead(pTargetObject, TargetX, TargetY, lptMagicRcd->btLevel);
						fTrain = TRUE;
				}
			}

			break;
		}
		case _SKILL_TAMMING:
			break;
		case _SKILL_LIGHTFLOWER:
		{
			if (MagElecBlizzard(GetAttackPower(pMagicInfo->GetPower(pMagicInfo->MPow(), lptMagicRcd->btLevel) + LOBYTE(m_WAbility.MC),
										(HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC)) + 1)))
				fTrain = TRUE;

			break;
		}
	}

/*   if not nofire then begin
      with user do begin
         if needfire then
            SendRefMsg (RM_MAGICFIRE, 0, MakeWord(pum.pDef.EffectType, pum.pDef.Effect), MakeLong(xx, yy), integer(target), '');
         //嘎篮 惑措
         if (pum.Level < 3) and train then
            if Abil.Level >= pum.pDef.NeedLevel[pum.Level] then begin
               //荐访饭骇俊 档崔茄 版快
               user.TrainSkill (pum, 1 + Random(3));
               if not CheckMagicLevelup (pum) then
                  SendDelayMsg (user, RM_MAGIC_LVEXP, 0, pum.pDef.MagicId, pum.Level, pum.CurTrain, '', 1000);
            end;
      end;
      Result := TRUE;
   end; */

	AddRefMsg(RM_MAGICFIRE, 0, lptMagicRcd->btMagicID, MAKELONG(TargetX, TargetY), (LONG)pTargetObject, NULL);

	if (lptMagicRcd->btLevel < 3)
	{
		if (m_Ability.Level >= pMagicInfo->sNeed[lptMagicRcd->btLevel])
			TrainSkill(lptMagicRcd, 1 + (rand() % 3));
	}

	return TRUE;
}

void CPlayerObject::TrainSkill(_LPTHUMANMAGICRCD lptMagicRcd, int nTrain)
{
	if (m_fFastTrain)
		lptMagicRcd->nCurrTrain += (nTrain * 3);
	else
		lptMagicRcd->nCurrTrain += nTrain;
}

BOOL CPlayerObject::MakeSlave(int nMonRace, int nX, int nY, int nLevel, int nMax, DWORD dwRoyaltySec)
{
	CMonRaceInfo* pMonRaceInfo = &g_pMonRaceInfo[nMonRace];

	if (pMonRaceInfo)
	{
		CMonsterObject* pMonsterObject = (CMonsterObject*)AddCreatureSysop(nX, nY, pMonRaceInfo, FALSE);

		if (pMonsterObject)
		{
			pMonsterObject->m_pMasterObject = this;
		
			m_xSlaveObjList.AddNewNode(pMonsterObject);
/*         mon.MasterRoyaltyTime := GetTickCount + longword(royaltysec) * 1000;
         mon.SlaveMakeLevel := slevel;
         mon.SlaveExpLevel := slevel;
         mon.RecalcAbilitys; //ApplySlaveLevelAbilitys;
         if mon.WAbil.HP < mon.WAbil.MaxHP then begin
            mon.WAbil.HP := mon.WAbil.HP + (mon.WAbil.MaxHP - mon.WAbil.HP) div 2;
         end;
         mon.ChangeNameColor;
         SlaveList.Add (mon);
         Result := mon;
 */
			return TRUE;
		}
	}

	return FALSE;
}

void CPlayerObject::Operate()
{
	if (!m_pUserInfo) return;

	if (m_pUserInfo->m_fFireHitSkill)
	{
		if (GetTickCount() - m_pUserInfo->m_dwLatestFireHitTime > 20 * 1000)
		{
			TCHAR	szText[64];
			char	szMsg[64];

			m_pUserInfo->m_fFireHitSkill = FALSE;

			LoadString(g_hInst, IDS_TIMEOUT_FIREHIT, szText, sizeof(szText)/sizeof(TCHAR));
			WideCharToMultiByte(CP_ACP, 0, szText, -1, szMsg, sizeof(szMsg), NULL, NULL);
			SysMsg(szMsg, 0);

⌨️ 快捷键说明

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