?? objhero.pas
字號:
m_sCharName + #9 +
'0' + #9 +
'0' + #9 +
'1' + #9 +
'0'); }
IncHealthSpell(2000, 2000);
end;
end;
function THeroObject.RunToTargetXY(nTargetX, nTargetY: Integer): Boolean;
var
nDir: Integer;
n10: Integer;
n14: Integer;
begin
Result := False;
n10 := nTargetX;
n14 := nTargetY;
dwTick3F4 := GetTickCount();
nDir := DR_DOWN;
if n10 > m_nCurrX then begin
nDir := DR_RIGHT;
if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
if n14 < m_nCurrY then nDir := DR_UPRIGHT;
end else begin
if n10 < m_nCurrX then begin
nDir := DR_LEFT;
if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
if n14 < m_nCurrY then nDir := DR_UPLEFT;
end else begin
if n14 > m_nCurrY then nDir := DR_DOWN
else if n14 < m_nCurrY then nDir := DR_UP;
end;
end;
if not RunTo(nDir, False, nTargetX, nTargetY) then begin
Result := WalkToTargetXY(nTargetX, nTargetY);
end else begin
if (abs(nTargetX - m_nCurrX) <= 1) and (abs(nTargetY - m_nCurrY) <= 1) then begin
Result := True;
end;
end;
end;
function THeroObject.WalkToTargetXY(nTargetX, nTargetY: Integer): Boolean;
var
I: Integer;
nDir: Integer;
n10: Integer;
n14: Integer;
n20: Integer;
nOldX: Integer;
nOldY: Integer;
n16: Integer;
begin
Result := False;
if (abs(nTargetX - m_nCurrX) > 1) or (abs(nTargetY - m_nCurrY) > 1) then begin
n10 := nTargetX;
n14 := nTargetY;
dwTick3F4 := GetTickCount();
nDir := DR_DOWN;
if n10 > m_nCurrX then begin
nDir := DR_RIGHT;
if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
if n14 < m_nCurrY then nDir := DR_UPRIGHT;
end else begin
if n10 < m_nCurrX then begin
nDir := DR_LEFT;
if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
if n14 < m_nCurrY then nDir := DR_UPLEFT;
end else begin
if n14 > m_nCurrY then nDir := DR_DOWN
else if n14 < m_nCurrY then nDir := DR_UP;
end;
end;
nOldX := m_nCurrX;
nOldY := m_nCurrY;
WalkTo(nDir, False);
if (abs(nTargetX - m_nCurrX) <= 1) and (abs(nTargetY - m_nCurrY) <= 1) then Result := True;
if not Result then begin
n20 := Random(3);
for I := DR_UP to DR_UPLEFT do begin
if (nOldX = m_nCurrX) and (nOldY = m_nCurrY) then begin
if n20 <> 0 then Inc(nDir)
else if nDir > 0 then Dec(nDir)
else nDir := DR_UPLEFT;
if (nDir > DR_UPLEFT) then nDir := DR_UP;
WalkTo(nDir, False);
if (abs(nTargetX - m_nCurrX) <= 1) and (abs(nTargetY - m_nCurrY) <= 1) then begin
Result := True;
Break;
end;
end;
end;
end;
end;
end;
function THeroObject.WalkToTargetXY2(nTargetX, nTargetY: Integer): Boolean;
var
I: Integer;
nDir: Integer;
n10: Integer;
n14: Integer;
n20: Integer;
nOldX: Integer;
nOldY: Integer;
n16: Integer;
begin
Result := False;
if (nTargetX <> m_nCurrX) or (nTargetY <> m_nCurrY) then begin
n10 := nTargetX;
n14 := nTargetY;
dwTick3F4 := GetTickCount();
nDir := DR_DOWN;
if n10 > m_nCurrX then begin
nDir := DR_RIGHT;
if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
if n14 < m_nCurrY then nDir := DR_UPRIGHT;
end else begin
if n10 < m_nCurrX then begin
nDir := DR_LEFT;
if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
if n14 < m_nCurrY then nDir := DR_UPLEFT;
end else begin
if n14 > m_nCurrY then nDir := DR_DOWN
else if n14 < m_nCurrY then nDir := DR_UP;
end;
end;
nOldX := m_nCurrX;
nOldY := m_nCurrY;
WalkTo(nDir, False);
if (nTargetX = m_nCurrX) and (nTargetY = m_nCurrY) then Result := True;
if not Result then begin
n20 := Random(3);
for I := DR_UP to DR_UPLEFT do begin
if (nOldX = m_nCurrX) and (nOldY = m_nCurrY) then begin
if n20 <> 0 then Inc(nDir)
else if nDir > 0 then Dec(nDir)
else nDir := DR_UPLEFT;
if (nDir > DR_UPLEFT) then nDir := DR_UP;
WalkTo(nDir, False);
if (nTargetX = m_nCurrX) and (nTargetY = m_nCurrY) then begin
Result := True;
Break;
end;
end;
end;
end;
end;
end;
function THeroObject.GotoTargetXY(nTargetX, nTargetY: Integer): Boolean;
begin
if (abs(m_nCurrX - nTargetX) >= 3) or (abs(m_nCurrY - nTargetY) >= 3) then begin
Result := RunToTargetXY(nTargetX, nTargetY);
end else begin
Result := WalkToTargetXY2(nTargetX, nTargetY);
end;
end;
function THeroObject.Operate(ProcessMsg: pTProcessMessage): Boolean;
begin
// Result:=False;
case ProcessMsg.wIdent of
RM_STRUCK: begin
if (ProcessMsg.BaseObject = Self) and (TBaseObject(ProcessMsg.nParam3 {AttackBaseObject}) <> nil) then begin
SetLastHiter(TBaseObject(ProcessMsg.nParam3 {AttackBaseObject}));
Struck(TBaseObject(ProcessMsg.nParam3 {AttackBaseObject})); {0FFEC}
BreakHolySeizeMode();
if (m_Master <> nil) and
(TBaseObject(ProcessMsg.nParam3) <> m_Master) and
(TBaseObject(ProcessMsg.nParam3).m_btRaceServer = RC_PLAYOBJECT) then begin
m_Master.SetPKFlag(TBaseObject(ProcessMsg.nParam3));
end;
if g_Config.boMonSayMsg then MonsterSayMsg(TBaseObject(ProcessMsg.nParam3), s_UnderFire);
end;
Result := True;
end;
else begin
Result := inherited Operate(ProcessMsg);
end;
end;
end;
function THeroObject.CompareHP(BaseObject1, BaseObject2: TBaseObject): Boolean;
var
HP1, HP2: Integer;
begin
HP1 := BaseObject1.m_WAbil.HP * 100 div BaseObject1.m_WAbil.MaxHP;
HP2 := BaseObject2.m_WAbil.HP * 100 div BaseObject2.m_WAbil.MaxHP;
Result := HP1 > HP2;
end;
function THeroObject.CompareLevel(BaseObject1, BaseObject2: TBaseObject): Boolean;
begin
Result := BaseObject1.m_WAbil.Level < BaseObject2.m_WAbil.Level;
end;
function THeroObject.CompareXY(BaseObject1, BaseObject2: TBaseObject): Boolean;
var
nXY1, nXY2: Integer;
begin
nXY1 := abs(BaseObject1.m_nCurrX - m_nCurrX) + abs(BaseObject1.m_nCurrY - m_nCurrY);
nXY2 := abs(BaseObject2.m_nCurrX - m_nCurrX) + abs(BaseObject2.m_nCurrY - m_nCurrY);
Result := nXY1 > nXY2;
end;
procedure THeroObject.Struck(hiter: TBaseObject);
var
btDir: Byte;
begin
if not m_boTarget then begin
m_dwStruckTick := GetTickCount;
if hiter <> nil then begin
if (m_TargetCret = nil) or GetAttackDir(m_TargetCret, btDir) or (Random(6) = 0) then begin
if IsProperTarget(hiter) then
SetTargetCreat(hiter);
end;
end;
if m_boAnimal then begin
m_nMeatQuality := m_nMeatQuality - Random(300);
if m_nMeatQuality < 0 then m_nMeatQuality := 0;
end;
end;
m_dwHitTick := m_dwHitTick + LongWord(150 - _MIN(130, m_Abil.Level * 4));
end;
procedure THeroObject.Attack(TargeTBaseObject: TBaseObject; nDir: Integer);
begin
inherited AttackDir(TargeTBaseObject, m_wHitMode, nDir);
end;
procedure THeroObject.DelTargetCreat;
begin
inherited;
m_nTargetX := -1;
m_nTargetY := -1;
end;
procedure THeroObject.SearchTarget;
var
BaseObject, BaseObject18: TBaseObject;
I, nC, n10: Integer;
begin
if (m_TargetCret = nil) and m_boTarget then m_boTarget := False;
if (m_TargetCret <> nil) and m_TargetCret.m_boDeath and m_boTarget then m_boTarget := False;
if (m_btStatus = 1) and not m_boProtectStatus and not m_boTarget then begin
BaseObject18 := nil;
n10 := 9999;
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject <> nil then begin
if not BaseObject.m_boDeath then begin
if IsProperTarget(BaseObject) and
(not BaseObject.m_boHideMode or m_boCoolEye) then begin
nC := abs(m_nCurrX - BaseObject.m_nCurrX) + abs(m_nCurrY - BaseObject.m_nCurrY);
if nC < n10 then begin
n10 := nC;
BaseObject18 := BaseObject;
end;
end;
end;
end;
end;
if BaseObject18 <> nil then begin
SetTargetCreat(BaseObject18);
{if (m_TargetCret <> nil) and (m_TargetCret.m_boDeath) then m_TargetCret := nil;
if m_TargetCret <> nil then begin
if CompareHP(m_TargetCret, BaseObject18) and CompareLevel(m_TargetCret, BaseObject18) and CompareXY(m_TargetCret, BaseObject18) then begin
SetTargetCreat(BaseObject18);
end;
end else SetTargetCreat(BaseObject18); }
end;
end;
end;
procedure THeroObject.SetTargetXY(nX, nY: Integer);
begin
m_nTargetX := nX;
m_nTargetY := nY;
end;
procedure THeroObject.Wondering;
begin
if (Random(10) = 0) then
if (Random(4) = 1) then TurnTo(Random(8))
else WalkTo(m_btDirection, False);
end;
function THeroObject.IsAllowUseMagic(wMagIdx: Word): Boolean;
var
UserMagic: pTUserMagic;
begin
Result := False;
UserMagic := CheckUserMagic(wMagIdx);
if UserMagic <> nil then begin
if GetSpellPoint(UserMagic) < m_WAbil.MP then Result := True;
end;
end;
function THeroObject.SelectMagic(): Integer;
var
wHitMode: Word;
UserMagic: pTUserMagic;
begin
Result := 0;
case m_btJob of
0: begin //戰士
if IsAllowUseMagic(26) and (not m_boFireHitSkill) and ((GetTickCount - m_dwLatestFireHitTick) > 10 * 1000) then begin {烈火}
AllowFireHitSkill;
Result := 26;
Exit;
end;
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 2) >= 4 then begin //被怪物包圍
if IsAllowUseMagic(41) and (GetTickCount - m_SkillUseTick[41] > 1000 * 10) then begin
m_SkillUseTick[41] := GetTickCount; //獅子吼
Result := 41;
Exit;
end else
if IsAllowUseMagic(39) and (GetTickCount - m_SkillUseTick[39] > 1000 * 10) then begin
m_SkillUseTick[39] := GetTickCount; //英雄徹地釘
Result := 39;
Exit;
end else
if IsAllowUseMagic(40) then begin //英雄抱月刀法
if not m_boCrsHitkill then begin
SkillCrsOnOff(True);
end;
Result := 40;
Exit;
end else begin
if (m_wLastHP - m_WAbil.HP) > (m_WAbil.MaxHP div 5) then begin
if IsAllowUseMagic(12) then begin //英雄刺殺劍術
if not m_boUseThrusting then begin
ThrustingOnOff(True);
end;
Result := 12;
end else
if IsAllowUseMagic(25) then begin
if not m_boUseHalfMoon then begin
HalfMoonOnOff(True);
end;
Result := 25;
end else
if IsAllowUseMagic(40) then begin //英雄抱月刀法
if not m_boCrsHitkill then begin
SkillCrsOnOff(True);
end;
Result := 40;
end else
if IsAllowUseMagic(39) and (GetTickCount - m_SkillUseTick[39] > 1000 * 10) then begin
m_SkillUseTick[39] := GetTickCount; //英雄徹地釘
Result := 39;
Exit;
end;
m_wLastHP := m_WAbil.HP;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -