📄 objectengine.cpp
字号:
AddRefMsg(RM_TURN, nDir, m_nCurrX, m_nCurrY, 0, m_szName);
m_nDirection = nDir;
return TRUE;
}
return FALSE;
}
void CCharObject::WalkNextPos(int nDir, int& nX, int& nY)
{
switch (nDir)
{
case DR_UP:
nX = m_nCurrX;
nY = m_nCurrY - 1;
break;
case DR_UPRIGHT:
nX = m_nCurrX + 1;
nY = m_nCurrY - 1;
break;
case DR_RIGHT:
nX = m_nCurrX + 1;
nY = m_nCurrY;
break;
case DR_DOWNRIGHT:
nX = m_nCurrX + 1;
nY = m_nCurrY + 1;
break;
case DR_DOWN:
nX = m_nCurrX;
nY = m_nCurrY + 1;
break;
case DR_DOWNLEFT:
nX = m_nCurrX - 1;
nY = m_nCurrY + 1;
break;
case DR_LEFT:
nX = m_nCurrX - 1;
nY = m_nCurrY;
break;
case DR_UPLEFT:
nX = m_nCurrX - 1;
nY = m_nCurrY - 1;
break;
}
}
BOOL CCharObject::WalkTo(int nDir)
{
int nX, nY;
WalkNextPos(nDir, nX, nY);
BOOL fResult = WalkXY(nX, nY, nDir);
if (fResult)
{
if (m_fFixedHideMode)
{
if (m_fHumHideMode)
m_wStatusArr[STATE_TRANSPARENT] = 1;
}
}
return fResult;
}
BOOL CCharObject::RunTo(int nDir)
{
int nX = m_nCurrX, nY = m_nCurrY;
int nWalk = 2;
if (m_tFeatureEx.btHorse)
nWalk = 3;
for (int i = 0; i < nWalk; i++)
{
switch (nDir)
{
case DR_UP:
nY--;
break;
case DR_UPRIGHT:
nX++;
nY--;
break;
case DR_RIGHT:
nX++;
break;
case DR_DOWNRIGHT:
nX++;
nY++;
break;
case DR_DOWN:
nY++;
break;
case DR_DOWNLEFT:
nX--;
nY++;
break;
case DR_LEFT:
nX--;
break;
case DR_UPLEFT:
nX--;
nY--;
break;
}
if (m_pMap->CanMove(nX, nY) == FALSE)
return FALSE;
}
return RunXY(nX, nY, nDir);
}
BOOL CCharObject::WalkXY(int nX, int nY, int nDir)
{
int nFlag = m_pMap->CheckDoorEvent(nX, nY, m_nEvent);
if (nFlag)
{
if (nFlag == _DOOR_OPEN)
AddRefMsg(RM_DOOROPEN, 1, m_nEvent, 0, 0, NULL);
}
if (m_pMap->CanMove(nX, nY))
{
if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nX, nY, this))
{
//#ifdef _DEBUG
// _RPT4(_CRT_WARN, "WALK:%d, %d -> %d, %d", m_nCurrX, m_nCurrY, nX, nY);
// _RPT1(_CRT_WARN, " [%d]\n", nDir);
//#endif
AddRefMsg(RM_WALK, nDir, m_nCurrX, m_nCurrY, 0, NULL);
m_nCurrX = nX;
m_nCurrY = nY;
m_nDirection = nDir;
m_dwHealthTick -= 20;
return TRUE;
}
}
return FALSE;
}
BOOL CCharObject::RunXY(int nX, int nY, int nDir)
{
if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nX, nY, this))
{
//#ifdef _DEBUG
// _RPT4(_CRT_WARN, "RUN:%d, %d -> %d, %d", m_nCurrX, m_nCurrY, nX, nY);
// _RPT1(_CRT_WARN, " [%d]\n", nDir);
//#endif
AddRefMsg(RM_RUN, nDir, m_nCurrX, m_nCurrY, 0, NULL);
m_nCurrX = nX;
m_nCurrY = nY;
m_nDirection = nDir;
m_dwHealthTick -= 150;
m_dwSpellTick -= 10;
m_dwSpellTick = _MAX(0, m_dwSpellTick);
m_btPerHealth--;
m_btPerSpell--;
return TRUE;
}
return FALSE;
}
void CCharObject::IncHealthSpell(int nHP, int nMP)
{
if (nHP >= 0)
{
if (m_WAbility.HP + nHP < m_WAbility.MaxHP)
m_WAbility.HP += nHP;
else
m_WAbility.HP = m_WAbility.MaxHP;
}
if (nMP >= 0)
{
if (m_WAbility.MP + nMP < m_WAbility.MaxMP)
m_WAbility.MP += nMP;
else
m_WAbility.MP = m_WAbility.MaxMP;
}
HealthSpellChanged();
}
//val : (+) dec spell
// (-) inc spell
void CCharObject::DamageSpell(int nVal)
{
if (nVal > 0)
{
if (m_WAbility.MP - nVal > 0)
m_WAbility.MP = m_WAbility.MP - nVal;
else
m_WAbility.MP = 0;
}
else
{
if (m_WAbility.MP - nVal < m_WAbility.MaxMP)
m_WAbility.MP = m_WAbility.MP - nVal;
else
m_WAbility.MP = m_WAbility.MaxMP;
}
}
//nDamage : if (+) damage health
// if (-) healing health
void CCharObject::DamageHealth(int nDamage)
{
/* 焊龋狼馆瘤
if BoMagicShield and (damage > 0) and (WAbil.MP > 0) then begin
spdam := Round (damage * 1.5);
if integer(WAbil.MP) >= spdam then begin
WAbil.MP := WAbil.MP - spdam;
spdam := 0;
end else begin
spdam := spdam - WAbil.MP;
WAbil.MP := 0;
end;
damage := Round (spdam / 1.5);
HealthSpellChanged;
end;*/
if (nDamage > 0)
{
if (m_WAbility.HP - nDamage > 0)
m_WAbility.HP = m_WAbility.HP - nDamage;
else
m_WAbility.HP = 0;
}
else
{
if (m_WAbility.HP - nDamage < m_WAbility.MaxHP)
m_WAbility.HP = m_WAbility.HP - nDamage;
else
m_WAbility.HP = m_WAbility.MaxHP;
}
}
int CCharObject::GetMagStruckDamage(int nDamage)
{
int nArmor = 0;
if ((HIBYTE(m_WAbility.MAC) - LOBYTE(m_WAbility.MAC) + 1) > 0)
nArmor = LOBYTE(m_WAbility.MAC) + (rand() % (HIBYTE(m_WAbility.MAC) - LOBYTE(m_WAbility.MAC) + 1));
else
nArmor = LOBYTE(m_WAbility.MAC);
nDamage = _MAX(0, nDamage - nArmor);
if (nDamage > 0)
{
if (m_fAbilMagBubbleDefence) // 林贱狼阜
{
nDamage = ROUND(nDamage / 100 * (m_btMagBubbleDefenceLevel + 2) * 8);
DamageBubbleDefence();
}
}
return nDamage;
}
void CCharObject::StruckDamage(int nDamage)
{
if (nDamage > 0)
{
BOOL fReCalc = FALSE;
int wDam = (rand() % 10) + 5;
if (m_wStatusArr[POISON_DAMAGEARMOR] > 0)
{
wDam = ROUND(wDam * 1.2);
nDamage = ROUND(nDamage * 1.2);
}
if (m_pUserInfo)
{
_LPTUSERITEMRCD lptDress = m_pUserInfo->GetDress();
if (lptDress)
{
int nDura = lptDress->nDura;
int nOldDura = ROUND(nDura / 1000);
nDura -= wDam;
if (nDura <= 0) // 粹酒 绝绢咙
{
lptDress->nDura = nDura = 0;
// hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
m_pUserInfo->SetEmptyDress();
AddProcess(this, RM_DURACHANGE, U_DRESS, nDura, lptDress->nDuraMax, 0);
AddProcess(this, RM_FEATURECHANGED, 0, GetFeatureToLong(), 0, 0);
fReCalc = TRUE;
}
else
lptDress->nDura = nDura;
if (nOldDura != ROUND(nDura / 1000))
AddProcess(this, RM_DURACHANGE, U_DRESS, lptDress->nDura, lptDress->nDuraMax, 0);
}
_LPTUSERITEMRCD lptUseItem;
for (int i = 0; i < 8; i++)
{
lptUseItem = m_pUserInfo->GetUseItem(i);
if (lptUseItem && (rand() % 8) == 0)
{
int nDura = lptUseItem->nDura;
int nOldDura = ROUND(nDura / 1000);
nDura -= wDam;
if (nDura <= 0) // 粹酒 绝绢咙
{
lptUseItem->nDura = nDura = 0;
// hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
m_pUserInfo->SetEmptyUseItem(i);
AddProcess(this, RM_DURACHANGE, i, nDura, lptUseItem->nDuraMax, 0);
AddProcess(this, RM_FEATURECHANGED, 0, GetFeatureToLong(), 0, 0);
fReCalc = TRUE;
}
else
lptUseItem->nDura = nDura;
if (nOldDura != ROUND(nDura / 1000))
AddProcess(this, RM_DURACHANGE, i, lptUseItem->nDura, lptUseItem->nDuraMax, 0);
}
}
}
if (fReCalc && m_pUserInfo)
((CPlayerObject*)this)->RecalcAbilitys();
DamageHealth(nDamage);
}
}
int CCharObject::GetHitStruckDamage(int nDamage)
{
int nArmor;
int nRnd = ((HIBYTE(m_WAbility.AC) - LOBYTE(m_WAbility.AC)) + 1);
if (nRnd > 0)
nArmor = LOBYTE(m_WAbility.AC) + (rand() % nRnd);
else
nArmor = LOBYTE(m_WAbility.AC);
nDamage = _MAX(0, nDamage - nArmor);
if (nDamage > 0)
{
if (m_fAbilMagBubbleDefence) // 林贱狼阜
{
nDamage = ROUND(nDamage / 100 * (m_btMagBubbleDefenceLevel + 2) * 8);
DamageBubbleDefence();
}
}
return nDamage;
}
int CCharObject::GetAttackPower(int nDamage, int nVal)
{
int nPower = 0;
if (nVal < 0) nVal = 0;
// if (Lucky > 0)
// {
// }
// else
// {
nPower = nDamage + (rand() % (nVal + 1));
// }
return nPower;
/*var
v1, v2: integer;
begin
if val < 0 then val := 0;
if Luck > 0 then begin
if Random(10 - _MIN(9,Luck)) = 0 then Result := damage + val //青款牢版快
else Result := damage + Random(val + 1);
end else begin
Result := damage + Random(val + 1);
if Luck < 0 then begin
if Random(10 - _MAX(0,-Luck)) = 0 then Result := damage; //阂款牢版快
end;
end; */
}
void CCharObject::DoDamageWeapon(int nDamage)
{
if (m_pUserInfo)
{
_LPTUSERITEMRCD lptWeapon = m_pUserInfo->GetWeapon();
if (lptWeapon)
{
int nDura = lptWeapon->nDura;
int nOldDura = ROUND(nDura / 1000);
nDura -= nDamage;
if (nDura <= 0) // 粹酒 绝绢咙
{
lptWeapon->nDura = nDura = 0;
// hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
((CPlayerObject*)this)->RecalcAbilitys();
m_pUserInfo->SetEmptyWeapon();
AddProcess(this, RM_DURACHANGE, U_WEAPON, nDura, lptWeapon->nDuraMax, 0);
}
else
lptWeapon->nDura = nDura;
if (nOldDura != ROUND(nDura / 1000))
AddProcess(this, RM_DURACHANGE, U_WEAPON, lptWeapon->nDura, lptWeapon->nDuraMax, 0);
}
}
}
BOOL CCharObject::_Attack(WORD wHitMode, CCharObject* pObject)
{
int nPower = GetAttackPower(LOBYTE(m_WAbility.DC), (HIBYTE(m_WAbility.DC) - LOBYTE(m_WAbility.DC)));
int nSecPwr = 0;
int nWeaponDamage;
if (pObject)
{
if (wHitMode == CM_POWERHIT && m_pUserInfo->m_fPowerHitSkill)
{
m_pUserInfo->m_fPowerHitSkill = FALSE;
nPower += m_btHitPlus;
}
if (wHitMode == CM_FIREHIT && m_pUserInfo->m_fFireHitSkill)
{
m_pUserInfo->m_fFireHitSkill = FALSE;
nPower += ROUND(nPower / 100 * (m_nHitDouble * 10));
}
}
else
{
if (wHitMode == CM_POWERHIT && m_pUserInfo->m_fPowerHitSkill)
{
m_pUserInfo->m_fPowerHitSkill = FALSE;
nPower += m_btHitPlus;
}
}
if (wHitMode == CM_LONGHIT)
{
nSecPwr = 0;
if (m_pUserInfo->m_lpTMagicErgumSkill)
nSecPwr = ROUND(nPower / (3/*MaxTrainLevel*/ + 2) * (m_pUserInfo->m_lpTMagicErgumSkill->btLevel + 2));
else
nSecPwr = nPower;
if (nSecPwr > 0)
SwordLongAttack(nSecPwr);
}
if (wHitMode == CM_WIDEHIT)
{
nSecPwr = 0;
if (m_pUserInfo->m_lpTMagicBanwolSkill)
nSecPwr = ROUND(nPower / (3/*MaxTrainLevel*/ + 10) * (m_pUserInfo->m_lpTMagicBanwolSkill->btLevel + 2));
else
nSecPwr = nPower;
if (nSecPwr > 0)
SwordWideAttack(nSecPwr);
}
if (pObject)
{
if (IsProperTarget(pObject))
{
if (pObject->m_btHitPoint > 0)
{
if (m_btHitPoint < rand() % pObject->m_btSpeedPoint)
nPower = 0;
}
}
else
nPower = 0;
}
if (nPower > 0)
{
nPower = pObject->GetHitStruckDamage(nPower);
nWeaponDamage = (rand() % 5) + 2 - m_AddAbility.WeaponStrong;
/* if (m_wObjectType & _OBJECT_HUMAN)
{
case CM_FIREHIT:
{
if (m_pUserInfo->m_lpTMagicFireSwordSkill)
nSecPwr = _ROUND(nPwr / (3 + 2) * (m_pUserInfo->m_lpTMagicFireSwordSkill->btLevel + 2));
else
nSecPwr = nPower;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -