⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monsterai.pas

📁 RO模拟器!!适合玩仙境传说的玩家们呦~
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{procedure MobSkillCalc(tm:TMap;ts:TMob;Tick:cardinal);

var
        tsAI :TMobAIDB;
        skillSlot :integer;
        k    :integer;

begin
        k := MobAIDB.IndexOf(ts.Data.ID);
        if (ts.Data.ID <> 0) and (k <> -1) then begin
    //for skillSlot := 0 to 10 do begin
                tsAI := MobAIDB.Objects[k] as TMobAIDB;
                MobSkillChance(tm, ts, tsAI, Tick);
        end;
    //end;
end;
//------------------------------------------------------------------------------

procedure MobSkillChance(tm:TMap; ts:TMob; tsAI:TMobAIDB; Tick:cardinal);

var
        //tc:TChara;
        i   :integer;
        //j   :integer;
        //tc  :TChara;

begin
        // Colus, 20030129: Changes random(7) to 8 for that last skill.
        // QUESTION: Why is this outer loop here?  Do you _really_ want to
        // (potentially) fire multiple skills off at once?

        // Darkhelmet, that would be my crappy chance system.  the loop is there
        // to go through each of the nine skills.  it is then randomized to ensure
        // that the chance occurs in a random order.
        //for j := 0 to 7 do begin
                i := Random(8);
                if ts.MSKill <> 0 then begin
                        if tsAI.PercentChance[i] > Random(100) then begin
                                //debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Success');

                                MonsterCastTime(tm, ts, Tick);
                                ts.NowSkill := ts.MSKill;
                                ts.NowSkillLv := ts.MSKill;
                                ts.SkillSlot := i;
                                ts.AI := tsAI;
                                ts.Mode := 3;
                                {MobSkills(tm, ts, tsAI, Tick, i);
                                //if tc.Skill[ts.MSKill].Data.SType = 2 then
                                MobFieldSkills(tm, ts, tsAI, Tick, i);
                                MobStatSkills(tm, ts, tsAI, Tick, i);
                                //Break;
                        end;
                        //end else debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Fail');
                end;
        //end;
end; }

//------------------------------------------------------------------------------

//procedure MobSkills(tm:TMap; ts:TMob; tsAI:TMobAIDB; Tick:cardinal; i:integer);
procedure MobSkills(tm:TMap; ts:TMob; Tick:cardinal);
var
        tl      :TSkillDB;
        b       :integer;
        tc      :TChara;
        bb      :array of byte;
        xy      :TPoint;
        //j       :integer;
begin

        //for i := 0 to 3 do begin
{ChrstphrR 2004/04/26 -- tc is NOT passed, it's not created -- it doesn't exist
the next few lines will -guarantee- an access violation will occur}
{Darkhelmet 2004/04/30 -- tc is defined by the monsters Adata as long as it's AData has
something in it}

        if (assigned(ts.AData)) then begin

        dmg[0] := 0;

        tl := SkillDB.IndexOfObject(ts.MSkill) as TSkillDB;

        if ts.AData <> nil then tc := ts.AData
        else Exit;

        {Darkhelmet, Now why would you do this here... I mean come on, honestly?}
        if tc <> nil then begin
    	 {	  if tc.Stat1 = 2 then j := 21 // Frozen?  Water 1
          else if tc.Stat1 = 1 then j := 22 // Stone?  Earth 1
          else if tc.ArmorElement <> 0 then j := tc.ArmorElement // PC's armor type
    		  else j := 1;  }


        case ts.MSkill of
                //dmg[0] := dmg[0] := dmg[0] * tc.Skill[ts.MSKill].Data.Data1[ts.MSKill];
                5:      {Bash}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * tl.Data1[ts.MLevel] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;

                11,13,14,19,20:
                                { 11  : Napalm Beat
                                  13  : Soul Strike
                                  14  : Cold Bolt
                                  19  : Fire Bolt
                                  20  : Lightning Bolt
                                }
                        begin
                                //dmg[0] := MATK1 + Random(MATK2 - MATK1 + 1) * MATKFix div 100 * tl.Data1[MUseLV] div 100;
                                //dmg[0] := dmg[0] * (100 - ts.Data.MDEF) div 100; //MDEF%
                                //dmg[0] := dmg[0] - ts.Data.Param[3]; //MDEF-
                                {Unsure about magic calculations so just using the attack calc algorithm [Darkhelmet]}
                                MobSkillDamageCalc(tm, tc, ts, Tick);
                                if dmg[0] < 1 then dmg[0] := 1;
                                //dmg[0] := dmg[0] * ElementTable[tl.Element][j] div 100;
                                dmg[0] := dmg[0] * tl.Data2[ts.MLevel];

                                if dmg[0] < 0 then dmg[0] := 0;
                                SendMSkillAttack(tm, tc, ts, Tick, tl.Data2[ts.MLevel]);
                        end;
                15:     {Frost Driver}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);

                        //dmg[0] := MATK1 + Random(MATK2 - MATK1 + 1) * MATKFix div 100 * ( MUseLV + 100 ) div 100;
                        //dmg[0] := dmg[0] * (100 - ts.Data.MDEF) div 100; //MDEF%
                        //dmg[0] := dmg[0] - ts.Data.Param[3]; //MDEF-
                        if dmg[0] < 1 then dmg[0] := 1;
                        //dmg[0] := dmg[0] * ElementTable[tl.Element][j] div 100;
                        if dmg[0] < 0 then dmg[0] := 0; //Negative Damage

                        //Send Packets
			SendMSkillAttack(tm, tc, ts, Tick, 1);
                                        {if (ts.Data.race <> 1) and (ts.Data.MEXP = 0) and (dmg[0] <> 0)then begin
                                                if Random(1000) < tl.Data1[MUseLV] * 10 then begin
                                                        ts.nStat := 2;
                                                        ts.BodyTick := Tick + tc.aMotion;
                                                end;
                                        end;}
					//DamageProcess1(tm, tc, ts, dmg[0], Tick, False);
					//tc.MTick := Tick + 1500;
                end;

                46:     {Double Strafe}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * 2;
                        SendMSkillAttack(tm, tc, ts, Tick, 2);
                end;

                56:     {Pierce}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * tc.Skill[56].Data.Data1[ts.MLevel] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 2);
                end;
                57:     {Brandish Spear}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * tc.Skill[57].Data.Data1[ts.MLevel] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                        if (dmg[0] > 0) then begin
                                SetLength(bb, 6);
                                bb[0] := 6;
                                xy := tc.Point;
                                DirMove(tm, tc.Point, tc.Dir, bb);
                                //Move the Player
                                if (xy.X div 8 <> tc.Point.X div 8) or (xy.Y div 8 <> tc.Point.Y div 8) then begin
                                        with tm.Block[xy.X div 8][xy.Y div 8].Clist do begin
                                                assert(IndexOf(tc.ID) <> -1, 'Player Delete Error');
                                                Delete(IndexOf(tc.ID));
                                        end;
                                        tm.Block[tc.Point.X div 8][tc.Point.Y div 8].Clist.AddObject(tc.ID, tc);
                                end;
                                tc.pcnt := 0;

                                //Send Packets to Update
                                WFIFOW(0, $0088);
                                WFIFOL(2, tc.ID);
                                WFIFOW(6, tc.Point.X);
                                WFIFOW(8, tc.Point.Y);
                                SendBCmd(tm, tc.Point, 10);;
                        end;
                end;
                84: {Jupitel Thunder}
                begin
                  MobSkillDamageCalc(tm, tc, ts, Tick);
                  if dmg[0] < 0 then dmg[0] := 0;
                  dmg[0] := dmg[0] * tc.Skill[84].Data.Data2[ts.MLevel] div 100;
                  SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;

                86: {Water Ball}
                begin
                  MobSkillDamageCalc(tm, tc, ts, Tick);
                  if dmg[0] < 0 then dmg[0] := 0;
                  dmg[0] := dmg[0] * tc.Skill[86].Data.Data1[ts.MLevel] div 100;
                  SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;

                136:    {Sonic Blows}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * 8;
                        SendMSkillAttack(tm, tc, ts, Tick, 8);
                end;

                137:    {Grimtooth}
                begin
                    if (ts.Cloaked) then begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                    end;
                end;

                148:    {Charge Arrow}
                begin

                        xy.X := tc.Point.X - tc.Point.X;
                        xy.Y := tc.Point.Y - tc.Point.Y;
                        if abs(xy.X) > abs(xy.Y) * 3 then begin
                                //Get KnockBack Distance
                                if xy.X > 0 then b := 6 else b := 2;
                        end else if abs(xy.Y) > abs(xy.X) * 3 then begin
								//廲岦偒
                                if xy.Y > 0 then b := 0 else b := 4;
                        end else begin
                                if xy.X > 0 then begin
                                        if xy.Y > 0 then b := 7 else b := 5;
                                end else begin
                                        if xy.Y > 0 then b := 1 else b := 3;
                                end;
                        end;

                        //Damage Calculations
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0; //Negative Damage

                        //Send Attack
                        // Colus, 20040129: Should be an MSkill
                        //SendCSkillAtk1(tm, tc, ts, Tick, dmg[0], 1);
                        SendMSkillAttack(tm, tc, ts, Tick, 1);

                        //Successful Damage
                        if (dmg[0] > 0) then begin
                                SetLength(bb, 6);
                                bb[0] := 6;
                                xy := tc.Point;
                                DirMove(tm, tc.Point, tc.Dir, bb);
                                //Move the Player
                                if (xy.X div 8 <> tc.Point.X div 8) or (xy.Y div 8 <> tc.Point.Y div 8) then begin
                                        with tm.Block[xy.X div 8][xy.Y div 8].Clist do begin
                                                assert(IndexOf(tc.ID) <> -1, 'Player Delete Error');
                                                Delete(IndexOf(tc.ID));
                                        end;
                                        tm.Block[tc.Point.X div 8][tc.Point.Y div 8].Clist.AddObject(tc.ID, tc);
                                end;
                                tc.pcnt := 0;

                                //Send Packets to Update
                                WFIFOW(0, $0088);
                                WFIFOL(2, tc.ID);
                                WFIFOW(6, tc.Point.X);
                                WFIFOW(8, tc.Point.Y);
                                SendBCmd(tm, tc.Point, 10);;
                        end;
                end;

                170:    {Npc- Critical}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * tc.Skill[170].Data.Data1[ts.MLevel] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;

                171:    {Npc-combo hit}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * 3;
                        SendMSkillAttack(tm, tc, ts, Tick, 3);
                end;

                173:    {Self Destruction}
                begin
                        dmg[0] := ts.HP;
                        if dmg[0] < 0 then dmg[0] := 0;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                        ts.HP := 0;
                        WFIFOW( 0, $0080);
	                WFIFOL( 2, ts.ID);
	                WFIFOB( 6, 1);
	                SendBCmd(tm, ts.Point, 7);
                        
                end;

                175:    {Suicide Attack}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -