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

📄 uskills.pas

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