📄 uskills.pas
字号:
SubData.percent := lifepercent;
SubData.attacker := aAttacker;
SubData.HitData.HitType := aHitData.HitType;
SendLocalMessage (NOTARGETPHONE, FM_STRUCTED, BasicData, SubData);
// 版摹 歹窍扁 //
n := MaxLife div declife;
if n > 15 then exp := DEFAULTEXP // 10措捞惑 嘎阑父 窍促搁 1000
else exp := DEFAULTEXP * n * n div (15*15); // 20措 嘎栏搁 磷备档 巢栏搁 10 => 500 n 15 => 750 5=>250
// else exp := DEFAULTEXP * n div 15; // 10措 嘎栏搁 磷备档 巢栏搁 10 => 500 n 15 => 750 5=>250
SubData.ExpData.Exp := exp;
SubData.ExpData.ExpType := 0;
if apercent = 100 then
SendLocalMessage (aAttacker, FM_ADDATTACKEXP, BasicData, SubData);
//////////////////////
BoSysopMessage (IntToStr(declife) + ' : ' + IntTostr(exp), 10);
if SoundStructed.rWavNumber <> 0 then begin
SetWordString (SubData.SayString, IntToStr (SoundStructed.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
if HaveSkill <> -1 then begin
Case HaveSkill of
4 :
begin
if (lifepercent < 50) and (boSkillUsed = false) then begin
boSkillUsed := true;
BasicData.Feature.rHideState := hs_0;
SendLocalMessage (NOTARGETPHONE, FM_CHANGEFEATURE, BasicData, SubData);
end;
end;
5 :
begin
if (lifepercent < 50) and (boSkillUsed = false)
and (FboCopy = false) and (LifeObjectState = los_attack) then begin
boSkillUsed := true;
{
BO := GetViewObjectByID (aAttacker);
if BO = nil then exit;
if BO.BasicData.Feature.rRace <> RACE_HUMAN then exit;
TUser (BO).SetTargetID (0);
}
if CopiedList = nil then begin
CopiedList := TList.Create;
end;
CopiedList.Clear;
// if BasicData.Feature.rrace = RACE_MONSTER then begin
// tmpAttackSkill := TMonster (Self).GetAttackSkill;
// for i := 0 to 3 - 1 do begin
// Monster := TMonsterList (Manager.MonsterList).CopyMonster (BasicData, tmpAttackSkill);
// if Monster <> nil then begin
// Monster.CopyBoss := Self;
// Monster.LifeObjectState := LifeObjectState;
// CopiedList.Add (Monster);
// end;
// end;
{
FirstMonster := TMonsterList (Manager.MonsterList).CopyMonster (BasicData, tmpAttackSkill);
if FirstMonster <> nil then begin
if tmpAttackSkill.Boss <> nil then begin
tmpAttackSkill.NoticeDie;
(TMonster (tmpAttackSkill.Boss).GetAttackSkill).AddGroup (FirstMonster);
end;
if tmpAttackSkill.GroupSkill <> nil then begin
tmpAttackSkill.GroupSkill.ChangeBoss (FirstMonster);
end;
tmpAttackSkill.SetSelf (FirstMonster);
FirstMonster.LifeObjectState := LifeObjectState;
FirstMonster.CopiedList := CopiedList;
FirstMonster.FBoCopy := false;
FirstMonster.HaveSkill := HaveSkill;
FirstMonster.boSkillUsed := true;
boSkillUsed := false;
HaveSkill := 0;
FBoCopy := true;
CopiedList := nil;
CopyBoss := FirstMonster;
FirstMonster.CopiedList.Add (Self);
end;
for i := 0 to 2 - 1 do begin
Monster := TMonsterList (Manager.MonsterList).CopyMonster (BasicData, tmpAttackSkill);
if Monster <> nil then begin
Monster.CopyBoss := FirstMonster;
Monster.LifeObjectState := FirstMonster.LifeObjectState;
FirstMonster.CopiedList.Add (Monster);
end;
end;
}
// end else begin
// end;
end;
end;
6 :
begin
if CurLife <= 0 then begin
ShowEffect (4, lek_none);
SendLocalMessage (NOTARGETPHONE, FM_DEADHIT, BasicData, SubData);
end;
end;
end;
end;
Result := n;
end;
procedure TLifeObject.CommandHit (CurTick: integer);
var
SubData : TSubData;
begin
if not AllowCommand (mmAnsTick) then exit;
if HitedTick + LifeData.AttackSpeed < CurTick then begin
HitedTick := CurTick;
SubData.HitData.damageBody := LifeData.damageBody;
SubData.HitData.damageHead := LifeData.damageHead;
SubData.HitData.damageArm := LifeData.damageArm;
SubData.HitData.damageLeg := LifeData.damageLeg;
// SubData.HitData.ToHit := 100 - LifeData.avoid;
SubData.HitData.ToHit := 75;
SubData.HitData.HitType := 0;
SubData.HitData.HitLevel := 7500;
SubData.HitData.boHited := FALSE;
SubData.HitData.HitFunction := 0;
SendLocalMessage (NOTARGETPHONE, FM_HIT, BasicData, SubData);
if SoundAttack.rWavNumber <> 0 then begin
SetWordString (SubData.SayString, IntToStr (SoundAttack.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
SubData.motion := BasicData.Feature.rhitmotion;
SendLocalMessage ( NOTARGETPHONE, FM_MOTION, BasicData, SubData);
end;
end;
procedure TLifeObject.CommandSay (astr: string);
var
SubData : TSubData;
begin
SetWordString (SubData.SayString, StrPas (@BasicData.Name) + ': '+ astr);
SendLocalMessage (NOTARGETPHONE, FM_SAY, BasicData, SubData);
end;
procedure TLifeObject.CommandTurn (adir: word);
var
SubData : TSubData;
begin
if not AllowCommand (mmAnsTick) then exit;
BasicData.dir := adir;
SendLocalMessage (NOTARGETPHONE, FM_TURN, BasicData, SubData);
end;
procedure TLifeObject.CommandChangeCharState (aFeatureState: TFeatureState);
var
i : Integer;
SubData : TSubData;
BO : TLifeObject;
begin
if aFeatureState = wfs_die then begin
LifeObjectState := los_die;
if BasicData.Feature.rHideState <> hs_100 then begin
BasicData.Feature.rHideState := hs_100;
SendLocalMessage (NOTARGETPHONE, FM_CHANGEFEATURE, BasicData, SubData);
end;
if FboCopy = true then begin
ShowEffect (1, lek_none);
end;
if CopiedList <> nil then begin
for i := 0 to CopiedList.Count - 1 do begin
BO := CopiedList[i];
if BO <> nil then begin
BO.CommandChangeCharState (aFeatureState);
end;
end;
end;
DiedTick := mmAnsTick;
if SoundDie.rWavNumber <> 0 then begin
SetWordString (SubData.SayString, IntToStr (SoundDie.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
end;
BasicData.Feature.rfeaturestate := aFeatureState;
SendLocalMessage (NOTARGETPHONE, FM_CHANGEFEATURE, BasicData, SubData);
end;
procedure TLifeObject.ShowEffect (aEffectNumber : Word; aEffectKind : TLightEffectKind);
var
SubData : TSubData;
begin
BasicData.Feature.rEffectNumber := aEffectNumber;
BasicData.Feature.rEffectKind := aEffectKind;
SendLocalMessage (NOTARGETPHONE, FM_CHANGEFEATURE, BasicData, SubData);
BasicData.Feature.rEffectNumber := 0;
BasicData.Feature.rEffectKind := lek_none;
end;
function TLifeObject.ShootMagic (var aMagic: TMagicData; Bo : TBasicObject) : Boolean;
var
SubData : TSubData;
CurTick : Integer;
begin
Result := false;
CurTick := mmAnsTick;
if not AllowCommand (CurTick) then exit;
if HitedTick + LifeData.AttackSpeed >= CurTick then exit;
HitedTick := mmAnsTick;
if GetViewDirection (BasicData.x, BasicData.y, bo.PosX, bo.posy) <> basicData.dir then
CommandTurn ( GetViewDirection (BasicData.x, BasicData.y, bo.posx, bo.posy));
SubData.motion := BasicData.Feature.rhitmotion;
SendLocalMessage ( NOTARGETPHONE, FM_MOTION, BasicData, SubData);
SubData.HitData.damageBody := aMagic.rLifeData.damageBody;
SubData.HitData.damageHead := aMagic.rLifeData.damageHead;
SubData.HitData.damageArm := aMagic.rLifeData.damageArm;
SubData.HitData.damageLeg := aMagic.rLifeData.damageLeg;
SubData.HitData.ToHit := 75;
SubData.HitData.HitType := 1;
SubData.HitData.HitLevel := 0;
SubData.HitData.HitLevel := aMagic.rcSkillLevel;
SubData.TargetId := Bo.BasicData.id;
SubData.tx := Bo.PosX;
SubData.ty := Bo.PosY;
SubData.BowImage := aMagic.rBowImage;
SubData.BowSpeed := aMagic.rBowSpeed;
SendLocalMessage (NOTARGETPHONE, FM_BOW, BasicData, SubData);
if aMagic.rSoundStrike.rWavNumber <> 0 then begin
SetWordString (SubData.SayString, IntTostr (aMagic.rSoundStrike.rWavNumber) + '.wav');
SendLocalMessage (NOTARGETPHONE, FM_SOUND, BasicData, SubData);
end;
Result := true;
end;
function TLifeObject.GotoXyStandAI (ax, ay : word) : Integer;
var
x, y : Integer;
key : word;
SubData : TSubData;
begin
Result := 2;
x := 0;
y := 0;
if (ax = BasicData.x) and (ay = BasicData.y) then begin
Result := 0;
exit;
end;
SearchPathClass.SetMaper (Maper);
SearchPathClass.GotoPath (BasicData.x, BasicData.y, ax, ay, x, y);
if (x <> 0) and (y <> 0) then begin
key := GetNextDirection (BasicData.x, BasicData.y, x, y);
if BasicData.dir <> key then begin
CommandTurn(key);
Result := 1;
exit;
end;
if Maper.isMoveable (x, y) then begin
BasicData.nx := x;
BasicData.ny := y;
Phone.SendMessage ( NOTARGETPHONE, FM_MOVE, BasicData, SubData);
Maper.MapProc (BasicData.Id, MM_MOVE, BasicData.x, BasicData.y, x, y);
BasicData.x := x; BasicData.y := y;
end;
end;
end;
function TLifeObject.GotoXyStand (ax, ay: word): integer;
function _Gap ( a1, a2: word): integer;
begin
if a1 > a2 then Result := a1-a2
else Result := a2-a1;
end;
var
i : integer;
SubData: TSubData;
key, len : word;
boarr : array [0..8-1] of Boolean;
lenarr : array [0..8-1] of word;
mx, my: word;
begin
Result := 2;
len := _Gap (BasicData.x,ax) + _Gap(BasicData.y,ay);
if (len = 0) then begin Result := 0; exit; end; //档馒
key := GetNextDirection ( BasicData.x, BasicData.y, ax, ay);
// 档馒
mx := BasicData.x;
my := BasicData.y;
GetNextPosition (key, mx, my);
if (mx = ax) and (my = ay) and not Maper.IsMoveable (ax, ay) then begin
if BasicData.dir <> key then CommandTurn (key);
Result := 1;
exit;
end;
for i := 0 to 8-1 do lenarr[i] := 65535;
boarr[0] := Maper.isMoveable ( BasicData.x, BasicData.y-1);
if (OldPos.x = BasicData.x) and (OldPos.y = BasicData.y-1) then boarr[0] := FALSE;
if boarr[0] then lenarr[0] := (BasicData.x-ax)*(BasicData.x-ax) + (BasicData.y-1-ay)*(BasicData.y-1-ay);
boarr[1] := Maper.isMoveable ( BasicData.x+1, BasicData.y-1);
if (OldPos.x = BasicData.x+1) and (OldPos.y = BasicData.y-1) then boarr[1] := FALSE;
if boarr[1] then lenarr[1] := (BasicData.x+1-ax)*(BasicData.x+1-ax) + (BasicData.y-1-ay)*(BasicData.y-1-ay);
boarr[2] := Maper.isMoveable ( BasicData.x+1, BasicData.y);
if (OldPos.x = BasicData.x+1) and (OldPos.y = BasicData.y) then boarr[2] := FALSE;
if boarr[2] then lenarr[2] := (BasicData.x+1-ax)*(BasicData.x+1-ax) + (BasicData.y-ay)*(BasicData.y-ay);
boarr[3] := Maper.isMoveable ( BasicData.x+1, BasicData.y+1);
if (OldPos.x = BasicData.x+1) and (OldPos.y = BasicData.y+1) then boarr[3] := FALSE;
if boarr[3] then lenarr[3] := (BasicData.x+1-ax)*(BasicData.x+1-ax) + (BasicData.y+1-ay)*(BasicData.y+1-ay);
boarr[4] := Maper.isMoveable ( BasicData.x, BasicData.y+1);
if (OldPos.x = BasicData.x) and (OldPos.y = BasicData.y+1) then boarr[4] := FALSE;
if boarr[4] then lenarr[4] := (BasicData.x-ax)*(BasicData.x-ax) + (BasicData.y+1-ay)*(BasicData.y+1-ay);
boarr[5] := Maper.isMoveable ( BasicData.x-1, BasicData.y+1);
if (OldPos.x = BasicData.x-1) and (OldPos.y = BasicData.y+1) then boarr[5] := FALSE;
if boarr[5] then lenarr[5] := (BasicData.x-1-ax)*(BasicData.x-1-ax) + (BasicData.y+1-ay)*(BasicData.y+1-ay);
boarr[6] := Maper.isMoveable ( BasicData.x-1, BasicData.y);
if (OldPos.x = BasicData.x-1) and (OldPos.y = BasicData.y) then boarr[6] := FALSE;
if boarr[6] then lenarr[6] := (BasicData.x-1-ax)*(BasicData.x-1-ax) + (BasicData.y-ay)*(BasicData.y-ay);
boarr[7] := Maper.isMoveable ( BasicData.x-1, BasicData.y-1);
if (OldPos.x = BasicData.x-1) and (OldPos.y = BasicData.y-1) then boarr[7] := FALSE;
if boarr[7] then lenarr[7] := (BasicData.x-1-ax)*(BasicData.x-1-ax) + (BasicData.y-1-ay)*(BasicData.y-1-ay);
len := 65535;
for i := 0 to 8-1 do begin
if len > lenarr[i] then begin
key := i;
len := lenarr[i];
end;
end;
mx := BasicData.x; my := BasicData.y;
GetNextPosition (key, mx, my);
if key <> BasicData.dir then CommandTurn (key)
else begin
if Maper.isMoveable ( mx, my) then begin
OldPos.x := BasicData.x;
Oldpos.y := BasicData.y;
BasicData.dir := key;
BasicData.nx := mx;
BasicData.ny := my;
Phone.SendMessage ( NOTARGETPHONE, FM_MOVE, BasicData, SubData);
Maper.MapProc (BasicData.Id, MM_MOVE, BasicData.x, BasicData.y, mx, my);
BasicData.x := mx; BasicData.y := my;
end else begin
OldPos.x := 0; OldPos.y := 0;
end;
end;
end;
function TLifeObject.FieldProc (hfu: Longint; Msg: word; var SenderInfo: TBasicData; var aSubData: TSubData): Integer;
var
n, percent: integer;
// xx, yy: word;
begin
// Result := PROC_FALSE;
// if isRangeMessage ( hfu, Msg, SenderInfo) = FALSE then exit;
Result := inherited FieldProc (hfu, Msg, Senderinfo, aSubData);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -