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