在好例子网,分享、交流、成长!
您当前所在位置:首页Pascal 开发实例Delphi图形界面编程 → Mir200原始可编译源码

Mir200原始可编译源码

Delphi图形界面编程

下载此实例
  • 开发语言:Pascal
  • 实例大小:0.29M
  • 下载次数:14
  • 浏览次数:499
  • 发布时间:2019-08-03
  • 实例类别:Delphi图形界面编程
  • 发 布 人:delude
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 火炬 传奇 mir2

实例介绍

【实例简介】
【实例截图】
【核心代码】unit ObjAxeMon;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
  ScktComp, syncobjs, MudUtil, HUtil32, Grobal2, Envir, EdCode, ObjBase,
  M2Share, ObjMon;


type
   TDualAxeMonster = class(TMonster)
   private
   protected
      RunDone: Boolean;
      ChainShot: integer;
      ChainShotCount: integer;
      procedure FlyAxeAttack (targ: TCreature);
      function  AttackTarget: Boolean; override;
   public
      constructor Create;
      destructor Destroy; override;
      procedure Run; override;
   end;

   TThornDarkMonster = class (TDualAxeMonster)
   public
      constructor Create;
   end;

   TArcherMonster = class (TDualAxeMonster)
   public
      constructor Create;
   end;



implementation


constructor TDualAxeMonster.Create;
begin
   inherited Create;
   RunDone := FALSE;
   ViewRange := 5;
   RunNextTick := 250;
   SearchRate := 3000;
   ChainShot := 0;
   ChainShotCount := 2;
   SearchTime := GetTickCount;
   RaceServer := RC_DUALAXESKELETON;
end;

destructor TDualAxeMonster.Destroy;
begin
   inherited Destroy;
end;

procedure TDualAxeMonster.FlyAxeAttack (targ: TCreature); //반드시 target <> nil
var
   dam, armor: integer;
begin
   if PEnvir.CanFly (CX, CY, targ.CX, targ.CY) then begin //도끼가 날아갈수 있는지.
      Dir := GetNextDirection (CX, CY, targ.CX, targ.CY);
      with WAbil do
         dam := Lobyte(DC) Random(ShortInt(Hibyte(DC)-Lobyte(DC)) 1);
      if dam > 0 then begin
         //armor := (Lobyte(targ.WAbil.AC) Random(ShortInt(Hibyte(targ.WAbil.AC)-Lobyte(targ.WAbil.AC)) 1));
         //dam := dam - armor;
         //if dam <= 0 then
         //   if dam > -10 then dam := 1;
         dam := targ.GetHitStruckDamage (self, dam);
      end;
      if dam > 0 then begin
         targ.StruckDamage (dam, self);
         targ.SendDelayMsg (TCreature(RM_STRUCK), RM_REFMESSAGE, dam{wparam},
                  targ.WAbil.HP{lparam1}, targ.WAbil.MaxHP{lparam2}, Longint(self){hiter}, '', 600 _MAX(Abs(CX-targ.CX),Abs(CY-targ.CY)) * 50);
      end;
      SendRefMsg (RM_FLYAXE, Dir, CX, CY, Integer(targ), '');
   end;
end;

function  TDualAxeMonster.AttackTarget: Boolean;
var
   targdir: byte;
begin
   Result := FALSE;
   if TargetCret <> nil then begin
      if GetCurrentTime - HitTime > NextHitTime then begin
         HitTime := GetCurrentTime;
         if (abs(CX-TargetCret.CX) <= 7) and (abs(CY-TargetCret.CY) <= 7) then begin
            if ChainShot < ChainShotCount-1 then begin
               Inc (ChainShot);
               TargetFocusTime := GetTickCount;
               FlyAxeAttack (TargetCret);
            end else begin
               if Random(5) = 0 then
                  ChainShot := 0;
            end;
            Result := TRUE;
         end else begin
            if TargetCret.MapName = self.MapName then begin
               if (abs(CX-TargetCret.CX) <= 11) and (abs(CY-TargetCret.CY) <= 11) then begin
                  //약간 떨어진 경우 따라간다.
                  SetTargetXY (TargetCret.CX, TargetCret.CY)
               end;
            end else
               LoseTarget;  //<!!주의> TargetCret := nil로 바뀜
         end;
      end;
   end;
end;

procedure TDualAxeMonster.Run;
var
   i, dis, d: integer;
   cret, nearcret: TCreature;
begin
   dis := 9999;
   nearcret := nil;
   if not Death and not RunDone and not BoGhost and (StatusArr[POISON_STONE] = 0) then begin
      if GetTickCount - SearchEnemyTime > 5000 then begin
         SearchEnemyTime := GetTickCount;
         //상속받은 run 에서 HitTime 재설정함.
         for i:=0 to VisibleActors.Count-1 do begin
            cret := TCreature (PTVisibleActor(VisibleActors[i]).cret);
            if (not cret.Death) and (IsProperTarget(cret)) and (not cret.BoHumHideMode or BoViewFixedHide) then begin
               d := abs(CX-cret.CX) abs(CY-cret.CY);
               if d < dis then begin
                  dis := d;
                  nearcret := cret;
               end;
            end;
         end;
         if nearcret <> nil then
            SelectTarget (nearcret);
      end;
      if GetCurrentTime - WalkTime > NextWalkTime then begin
         //상속받은 run에서 WalkTime 재설정함
         if TargetCret <> nil then
            if (abs(CX-TargetCret.CX) <= 4) and (abs(CY-TargetCret.CY) <= 4) then begin
               if (abs(CX-TargetCret.CX) <= 2) and (abs(CY-TargetCret.CY) <= 2) then begin
                  //너무 가까우면, 잘 도망 안감.
                  if Random(5) = 0 then begin
                     //도망감.
                     GetBackPosition (self, TargetX, TargetY);
                  end;
               end else begin
                  //도망감.
                  GetBackPosition (self, TargetX, TargetY);
               end;
            end;
      end;
   end;
   inherited Run;
end;


{----------------------------------------------------}

// TThornDarkMonster


constructor  TThornDarkMonster.Create;
begin
   inherited Create;
   ChainShotCount := 3;
   RaceServer := RC_THORNDARK;
end;


{----------------------------------------------------}

// TArcherMonster


constructor  TArcherMonster.Create;
begin
   inherited Create;
   ChainShotCount := 6;
   RaceServer := RC_ARCHERMON;
end;


end.


标签: 火炬 传奇 mir2

实例下载地址

Mir200原始可编译源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 番茄你个西红柿 发表于: 2021-07-15 11:19 38
谢谢楼主!

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警