📄 objectplayer.cpp
字号:
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 + -