📄 monsterai.pas
字号:
{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 + -