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