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

📄 uskills.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -