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

📄 monsterai.pas

📁 RO模拟器!!适合玩仙境传说的玩家们呦~
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                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;

                176:    {Posion Attack}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        //dmg[0] := dmg[0] * tc.Skill[176].Data.Data1[ts.MSKill] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                        tc.isPoisoned := True;
                        tc.PoisonTick := tick + 15000;
                        tc.Stat2 := 1;
                        UpdateStatus(tm, tc, Tick);
                end;

                177:    {Blind Attack}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;

                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                        tc.isBlind := True;
                        tc.Stat2 := 16;
                        tc.BlindTick := tick + 15000;
                        UpdateStatus(tm, tc, Tick);
                        //BlindCharacter(tm, tc, Tick);
                end;

                178:    {Silence Attack}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;

                        SendMSkillAttack(tm, tc, ts , Tick, 1);

                        tc.isSilenced := True;
                        tc.SilencedTick := Tick + 15000;
                        SilenceCharacter(tm, tc, Tick);
                end;

                // Colus, 20040129: Updated elemental attacks.  Added
                // water, earth, poison, holy, shadow attacks.
                // NOTE: I put the elements in the skill DB.  We don't want
                // to change their elements back to their defaults.  The reason
                // is that if we later implement attribute change, these skills
                // would change them back.

                184,185,186,187,188,189,190:    {Elemental Attacks}
                begin
                        //ts.Element := 1;  // Water
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        //dmg[0] := dmg[0] * ElementTable[tl.Element][j] div 100;
                        if dmg[0] < 0 then dmg[0] := 0;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                        //ts.Element := ts.Data.Element;
                end;

                191:    {Telekenesis Attack}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        //dmg[0] := dmg[0] * tc.Skill[191].Data.Data1[ts.MSKill] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;


                192:    {Magical Attack}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] + tc.DEF1 + tc.DEF2;
                        dmg[0] := dmg[0] - tc.MDEF1 - tc.MDEF2;
                        dmg[0] := dmg[0] * tc.Skill[192].Data.Data1[ts.MLevel] div 100;
                        if dmg[0] < 0 then dmg[0] := 0;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;

                199:    {Blood Drain}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * 2;
                        ts.HP := ts.HP + dmg[0];
                        if ts.HP > integer(ts.Data.HP) then ts.HP := ts.Data.HP;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;

                200:    {Energy Drain}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        //dmg[0] := dmg[0] * tc.Skill[200].Data.Data1[ts.MSKill] div 100;
                        if dmg[0] > 0 then begin
                                tc.SP := tc.SP - (dmg[0] div 4);
                                if tc.SP < 0 then tc.SP := 0;
                        end;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);

                end;

                202:    {Dark Breath}
                begin
                        MobSkillDamageCalc(tm, tc, ts, Tick);
                        if dmg[0] < 0 then dmg[0] := 0;
                        dmg[0] := dmg[0] * tc.Skill[202].Data.Data1[ts.MLevel] div 100;
                        SendMSkillAttack(tm, tc, ts, Tick, 1);
                end;
                else //debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Skill ' + IntToStr(ts.MSkill) + ' Is not coded')
            end;
        end;

        end;
        //Debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Skill ' + IntToStr(ts.MSkill) + ' Deals ' + IntToStr(dmg[0]) + ' Damage');
	{ChrstphrR - 2004/04/26 ensure that the dyn array is unset}
	bb := NIL;
end;//proc MobSkills()

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

procedure MobFieldSkills(tm:TMap; ts:TMob; Tick:cardinal);
var
        //tl  :TSkillDB;
        //sl  :TStringList;
        //tc  :TChara;
        j   :integer;
        AttackData :TChara;
        xy  :TPoint;
	//bb  :array of byte;
        tn  :TNPC;

begin

        //for i := 0 to 3 do begin
                if ts.AData <> nil then
                    AttackData := ts.AData
                else
                    Exit;
                  //AttackData := ts;

                case ts.MSKill of
                  //18: {Fire Wall}
                  //  begin

                  //  end;
                        83:     {Meteor}
                        begin
                                //AttackData := ts.AData;

                                xy.X := AttackData.Point.X;
                                xy.Y := AttackData.Point.Y;

                                //Place the Effect
                                ts.IsCasting := true;
                                tn := SetSkillUnit(tm, ts.ID, xy, Tick, $88, 0, 3000, nil, ts);

                                tn.MSkill := ts.MSkill;
                                tn.MUseLV := ts.MLevel;

                                for j := 1 to AttackData.Skill[83].Data.Data2[ts.MLevel] do begin;
                                        WFIFOW( 0, $0117);
                                        WFIFOW( 2, ts.MSKill);
                                        WFIFOL( 4, ts.ID);
                                        WFIFOW( 8, ts.MLevel);
                                        WFIFOW(10, (AttackData.Point.X - 4 + Random(12)));
                                        WFIFOW(12, (AttackData.Point.Y - 4 + Random(12)));
                                        WFIFOL(14, 1);
                                        SendBCmd(tm, xy, 18);
                                end;

                        end;

                        85:     {Lord of Vermillion}
                          begin
                                //AttackData := ts.AData;
                                //Cast Point
                                xy.X := AttackData.Point.X;
                                xy.Y := AttackData.Point.Y;

                                ts.IsCasting := true;

                                //Create Graphics and Set NPC
                                tn := SetSkillUnit(tm, ts.ID, xy, Tick, $86, 0, 3000, nil, ts);

                                tn.MSkill := ts.MSKill;
                                tn.MUseLV := ts.MLevel;

                                WFIFOW( 0, $0117);
                                WFIFOW( 2, ts.MSKill);
                                WFIFOL( 4, ts.ID);
                                WFIFOW( 8, ts.MLevel);
                                WFIFOW(10, (AttackData.Point.X));
                                WFIFOW(12, (AttackData.Point.Y));
                                WFIFOL(14, 1);
                                SendBCmd(tm, xy, 18);
                          end;

                        {140:   //Venom Dust
                        begin
                          // Create Location
                          xy.X := (AttackData.Point.X);
					                xy.Y := (AttackData.Point.Y) + 1;
                          tn := SetSkillUnit(tm, ts.ID, xy, Tick, $92, 0, AttackData.Skill[140].Data.Data1[ts.MLevel] * 1000, nil, ts);

					                xy.X := (AttackData.Point.X) + 1;
                          xy.Y := (AttackData.Point.Y);

                          tn := SetSkillUnit(tm, ts.ID, xy, Tick, $92, 0, AttackData.Skill[140].Data.Data1[ts.MLevel] * 1000, nil, ts);

					                xy.X := (AttackData.Point.X) - 1;
					                xy.Y := (AttackData.Point.Y);

					                tn := SetSkillUnit(tm, ts.ID, xy, Tick, $92, 0, AttackData.Skill[140].Data.Data1[ts.MLevel] * 1000, nil, ts);

					                xy.X := (AttackData.Point.X);
					                xy.Y := (AttackData.Point.Y) - 1;

					                tn := SetSkillUnit(tm, ts.ID, xy, Tick, $92, 0, AttackData.Skill[140].Data.Data1[ts.MLevel] * 1000, nil, ts);
					                tn.MSkill := ts.MSkill;
                          tn.MUseLV := ts.MLevel;
                          debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Venom Dust')
                        end; }

                        else //debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Skill ' + IntToStr(ts.MSkill) + ' Is not coded')
                end;  //end case
        //end;
end;
//------------------------------------------------------------------------------
procedure MobStatSkills(tm:TMap; ts:TMob; Tick:cardinal);

var
    ProcessType     :Byte;
    j,i1,j1 :integer;
    //mi  :MapTbl;
    xy  :TPoint;
begin

with ts do begin
        ProcessType := 0;
        case ts.MSKill of
          8:  {Endure}
            begin

            end;
          26: {Teleport}
                begin
                  // Colus, 20040506: Was this even tested?
                  // When a monster doesn't have a target and tries to do this,
                  // it crashes.  Every single time.  It's plainly obvious.  As
                  // long as you don't summon the monster (making you the target)
                  // it happens almost always.
                  //
                  // Going to try to fix it like a flywing, so you see the disappear
                  // effect and the monster is moved.
                  SendMonsterRelocation(tm, ts);

									{i := MapInfo.IndexOf(ts.Map);
									j := -1;
									if (i <> -1) then begin
										mi := MapInfo.Objects[i] as MapTbl;
										if (mi.noTele = true) then j := 0;
									end;
									if (j <> 0) then begin
                    if (Common.Map.IndexOf(ts.Map) <> - 1) then begin
            				  tm := Common.Map.Objects[Common.Map.IndexOf(ts.Map)] as TMap;

                      j := 0;

  									  repeat
  										  xy.X := Random(tm.Size.X - 2) + 1;
  										  xy.Y := Random(tm.Size.Y - 2) + 1;
  										  Inc(j);
  									  until ( ((tm.gat[xy.X, xy.Y] <> 1) and (tm.gat[xy.X, xy.Y] <> 5)) or (j = 100) );

  									  if j <> 100 then begin
                        ts.ATarget := 0;
                        ts.AData := nil;
                        ts.AMode := 0;
                        ts.Status := 'IDLE_ST';
                        //ts.pcnt := 0;
                        UpdateLivingLocation(tm, ts);
                        SendLivingDisappear(tm, ts, 3);
                        with tm.Block[ts.Point.X div 8][ts.Point.Y div 8].Mob do begin
                  				Assert(IndexOf(ts.ID) <> -1, 'Mob Delete Error');
                          Delete(IndexOf(ts.ID));
                        end;

  										  ts.Point := xy;
                        UpdateLivingLocation(tm, ts);
                        tm.Block[ts.Point.X div 8][ts.Point.Y div 8].Mob.AddObject(ts.ID, ts);
                      end;
									  end;
                  end; }

                end;
          28:     {Heal}
                begin
                  dmg[0] := (ts.Data.LV * 2 + 10);

⌨️ 快捷键说明

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