📄 uskills.pas
字号:
begin
Result := TRUE;
if FreezeTick > CurTick then Result := FALSE;
if BasicData.Feature.rFeatureState = wfs_die then Result := FALSE;
end;
function TLifeObject.CommandHited (aattacker: integer; aHitData: THitData; apercent: integer): integer;
var
i, n, lifepercent, declife, exp : integer;
SubData : TSubData;
BO : TBasicObject;
Monster, FirstMonster : TMonster;
tmpAttackSkill : TAttackSkill;
begin
Result := 0;
if DontAttacked then exit;
n := LifeData.avoid + aHitData.ToHit;
n := Random (n);
if n < LifeData.avoid then exit; // 乔沁澜.
if apercent = 100 then begin
declife := aHitData.damageBody - LifeData.armorBody;
end else begin
declife := (aHitData.damageBody * apercent div 100) * aHitData.HitFunctionSkill div 10000 -LifeData.armorBody;
end;
// Monster 唱 NPC 狼 磊眉 规绢仿俊 狼茄 厚啦利 眉仿皑家
if LifeData.HitArmor > 0 then begin
declife := declife - ((declife * LifeData.HitArmor) div 100);
end;
if declife <= 0 then declife := 1;
CurLife := CurLife - declife;
if CurLife <= 0 then CurLife := 0;
FreezeTick := mmAnsTick + LifeData.recovery;
if MaxLife <= 0 then begin
FboAllowDelete := true;
exit;
end;
if MaxLife <= 0 then BasicData.LifePercent := 0
else BasicData.LifePercent := CurLife * 100 div MaxLife;
SubData.Percent := BasicData.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;
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;
SubData.BowType := aMagic.rBowType;
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);
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);
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);
if Result = PROC_TRUE then exit;
case Msg of
FM_BOW :
begin
if BasicData.Feature.rfeaturestate = wfs_die then exit;
if aSubData.TargetId = Basicdata.id then begin
n := CommandHited (SenderInfo.id, aSubData.HitData, 100);
if CurLife <= 0 then CommandChangeCharState (wfs_die);
if n <> 0 then aSubData.HitData.boHited := TRUE;
end;
end;
FM_HIT :
begin
if BasicData.Feature.rfeaturestate = wfs_die then exit;
if isHitedArea (SenderInfo.dir, SenderInfo.x, SenderInfo.y, aSubData.HitData.HitFunction, percent) then begin
n := CommandHited (SenderInfo.id, aSubData.HitData, percent);
if (CurLife <= 0) then CommandChangeCharState (wfs_die);
if n <> 0 then begin
aSubData.HitData.boHited := TRUE;
aSubData.HitData.HitedCount := aSubData.HitData.HitedCount +1;
end;
end;
{
xx := SenderInfo.x; yy := SenderInfo.y;
GetNextPosition (SenderInfo.dir, xx, yy);
if (BasicData.x = xx) and (BasicData.y = yy) then begin
n := CommandHited (SenderInfo.id, aSubData.HitData);
if (CurLife <= 0) then CommandChangeCharState (wfs_die);
if n <> 0 then aSubData.HitData.boHited := TRUE;
end;
}
end;
end;
end;
{
procedure TLifeObject.Update (CurTick: integer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -