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

📄 svclass.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                  pd^.rCallNpc[j].rName := StrPas (@NpcData.rName);
                  mStr := GetValidStr3 (mStr, sStr, ':');
                  pd^.rCallNpc[j].rCount := _StrToInt (sStr);
               end;
            end;
         end;

         mStr := CreateDynamicObject.GetFieldValueString (iname, 'X');
         for j := 0 to 5 - 1 do begin
            mStr := GetValidStr3 (mStr, sStr, ':');
            if sStr = '' then break;
            pd^.rX[j] := _StrToInt (sStr);
         end;
         mStr := CreateDynamicObject.GetFieldValueString (iname, 'Y');
         for j := 0 to 5 - 1 do begin
            mStr := GetValidStr3 (mStr, sStr, ':');
            if sStr = '' then break;
            pd^.rY[j] := _StrToInt (sStr);
         end;

         pd^.rDropX := CreateDynamicObject.GetFieldValueInteger (iName, 'DropX');
         pd^.rDropY := CreateDynamicObject.GetFieldValueInteger (iName, 'DropY');

         List.Add (pd);
      end;
   end;
   CreateDynamicObject.Free;
end;

function  GetServerIdPointer (aServerId, atype: integer): Pointer;
begin
   Result := nil;
end;

procedure StrToEffectData (var effectdata: TEffectData; astr: string);
var
   str, rdstr : string;
begin
   str := astr;
   str := GetValidStr3 (str, rdstr, ':');
   effectdata.rWavNumber := _StrToInt (rdstr);
   str := GetValidStr3 (str, rdstr, ':');
   effectdata.rPercent := _StrToInt (rdstr);
end;

///////////////////////////////////
//         TRandomClass
///////////////////////////////////

constructor TRandomClass.Create;
begin
   DataList := nil;
   DataList := TList.Create;
end;

destructor TRandomClass.Destroy;
begin
   Clear;
   if DataList <> nil then DataList.Free;
end;

procedure TRandomClass.Clear;
var
   i : Integer;
   pd : PTRandomData;
begin
   for i := 0 to DataList.Count - 1 do begin
      pd := DataList.Items[i];
      if pd <> nil then Dispose (pd);
   end;
   DataList.Clear;
end;

procedure TRandomClass.AddData (aItemName, aObjName : String; aCount : Integer);
var
   pd : PTRandomData;
begin
   if (aItemName = '') or (aObjName = '') then exit;

   New (pd);
   pd^.rItemName := aItemName;
   pd^.rObjName := aObjName;
   if aCount < 1 then pd^.rCount := 1
   else pd^.rCount := aCount;
   pd^.rIndex := Random (pd^.rCount);
   pd^.rCurIndex := 0;

   DataList.Add (pd);
end;

function  TRandomClass.GetChance (aItemName, aObjName : String) : Boolean;
var
   i : Integer;
   pd : PTRandomData;
begin
   Result := true;
   for i := 0 to DataList.Count - 1 do begin
      pd := DataList.Items [i];
      if pd <> nil then begin
         if pd^.rItemName = aItemName then begin
            if pd^.rObjName = aObjName then begin
               Result := false;
               if pd^.rCurIndex = pd^.rIndex then Result := true;
               
               Inc (pd^.rCurIndex);
               if pd^.rCurIndex >= pd^.rCount then begin
                  pd^.rCurIndex := 0;
                  pd^.rIndex := Random (pd^.rCount);
               end;
               exit;
            end;
         end;
      end;
   end;
end;

///////////////////////////////////
//         TSysopClass
///////////////////////////////////

constructor TSysopClass.Create;
begin
   SysopDb := TUserStringDb.Create;
   ReLoadFromFile;
end;

destructor TSysopClass.Destroy;
begin
   SysopDb.Free;
   inherited destroy;
end;

procedure  TSysopClass.ReLoadFromFile;
begin
   if not FileExists ('.\Sysop.SDB') then exit;
   SysopDb.LoadFromFile ('.\Sysop.SDB');
end;

function   TSysopClass.GetSysopScope (aName: string): integer;
begin
   if SysopDb.Count > 0 then Result := SysopDb.GetFieldValueInteger (aName, 'SysopScope')
   else Result := 0;
end;

///////////////////////////////////
//         TMagicClass
///////////////////////////////////


constructor TMagicClass.Create;
begin
   DataList := TList.Create;
   AnsIndexClass := TAnsIndexClass.Create ('MagicClass', 20, TRUE);
   MagicDb := TUserStringDb.Create;
   MagicForGuildDb := TUserStringDb.Create;
   ReLoadFromFile;
end;

destructor TMagicClass.Destroy;
begin
   Clear;
   MagicForGuildDb.Free;
   MagicDb.Free;
   DataList.Free;
   AnsIndexClass.Free;
   inherited destroy;
end;

procedure TMagicClass.Clear;
var i : integer;
begin
   FillChar (SkillAddDamageArr, sizeof(SkillAddDamageArr) , 0);
   FillChar (SkillAddArmorArr, sizeof(SkillAddArmorArr), 0);
   for i := 0 to DataList.Count -1 do dispose (DataList[i]);
   DataList.Clear;
   AnsIndexClass.Clear;
end;

procedure TMagicClass.Calculate_cLifeData (pMagicData: PTMagicData);
begin
   if pMagicData = nil then exit;
   if pMagicData^.rName[0] = 0 then exit;

   with pMagicData^ do begin
      rcLifeData.DamageBody   := rLifeData.damageBody  + rLifeData.damageBody * rcSkillLevel div INI_SKILL_DIV_DAMAGE;
      rcLifeData.DamageHead   := rLifeData.DamageHead  + rLifeData.damageHead * rcSkillLevel div INI_SKILL_DIV_DAMAGE;
      rcLifeData.DamageArm    := rLifeData.DamageArm   + rLifeData.damageArm  * rcSkillLevel div INI_SKILL_DIV_DAMAGE;
      rcLifeData.DamageLeg    := rLifeData.DamageLeg   + rLifeData.damageLeg  * rcSkillLevel div INI_SKILL_DIV_DAMAGE;
      rcLifeData.AttackSpeed  := rLifeData.AttackSpeed - rLifeData.AttackSpeed * rcSkillLevel div INI_SKILL_DIV_ATTACKSPEED;
      rcLifeData.avoid        := rLifeData.avoid   ;//    + rLifeData.avoid;
      rcLifeData.recovery     := rLifeData.recovery;//    + rLifeData.recovery;
      rcLifeData.armorBody    := rLifeData.armorBody   + rLifeData.armorBody * rcSkillLevel div INI_SKILL_DIV_ARMOR;
      rcLifeData.armorHead    := rLifeData.armorHead   + rLifeData.armorHead * rcSkillLevel div INI_SKILL_DIV_ARMOR;
      rcLifeData.armorArm     := rLifeData.armorArm    + rLifeData.armorArm  * rcSkillLevel div INI_SKILL_DIV_ARMOR;
      rcLifeData.armorLeg     := rLifeData.armorLeg    + rLifeData.armorLeg  * rcSkillLevel div INI_SKILL_DIV_ARMOR;
   end;

   with pMagicData^ do begin
      rcLifeData.Damagebody := rcLifeData.Damagebody + rcLifeData.DamageBody * MagicClass.GetSkillDamageBody (rcSkillLevel) div 100;
      if rMagicType = MAGICTYPE_PROTECTING then
         rcLifeData.Armorbody := rcLifeData.Armorbody + rcLifeData.ArmorBody * MagicClass.GetSkillArmorBody (rcSkillLevel) div 100;
   end;
end;

procedure TMagicClass.ReLoadFromFile;
var
   i, idx, sn, en : integer;
   iname, mname : string;
   pmd : PTMagicData;
   TempDb : TUserStringDb;
begin
   if FileExists ('.\Init\AddDamage.SDB') then begin
      Clear;
      TempDb := TUserStringDb.Create;
      TempDb.LoadFromFile ('.\Init\AddDamage.SDB');
      for idx := 0 to TempDb.Count -1 do begin
         iname := TempDb.GetIndexName (idx);
         sn := TempDb.GetFieldValueInteger (iname,'StartSkill');
         en := TempDb.GetFieldValueInteger (iname,'EndSkill');
         if sn <= 0 then sn := 0;
         if en >= 10000 then en := 10000;
         for i := sn to en do begin
            SkillAddDamageArr[i].rdamagebody := TempDb.GetFieldValueInteger (iname,'DamageBody');
            SkillAddDamageArr[i].rdamagehead := TempDb.GetFieldValueInteger (iname,'DamageHead');
            SkillAddDamageArr[i].rdamagearm := TempDb.GetFieldValueInteger (iname,'DamageArm');
            SkillAddDamageArr[i].rdamageleg := TempDb.GetFieldValueInteger (iname,'DamageLeg');
         end;
      end;
      TempDb.Free;
   end;

   if FileExists ('.\Init\AddArmor.SDB') then begin
      // 2000.10.05 眠啊规绢仿 AddArmor.sdb 颇老狼 肺靛
      TempDb := TUserStringDb.Create;
      TempDb.LoadFromFile ('.\Init\AddArmor.SDB');
      for idx := 0 to TempDb.Count -1 do begin
         iname := TempDb.GetIndexName (idx);
         sn := TempDb.GetFieldValueInteger (iname,'StartSkill');
         en := TempDb.GetFieldValueInteger (iname,'EndSkill');
         if sn <= 0 then sn := 0;
         if en >= 10000 then en := 10000;
         for i := sn to en do begin
            SkillAddArmorArr[i].rarmorbody := TempDb.GetFieldValueInteger (iname,'ArmorBody');
            SkillAddArmorArr[i].rarmorhead := TempDb.GetFieldValueInteger (iname,'ArmorHead');
            SkillAddArmorArr[i].rarmorarm := TempDb.GetFieldValueInteger (iname,'ArmorArm');
            SkillAddArmorArr[i].rarmorleg := TempDb.GetFieldValueInteger (iname,'ArmorLeg');
         end;
      end;
      TempDb.Free;
   end;

   if FileExists ('.\Init\Magic.SDB') then begin
      MagicDb.LoadFromFile ('.\Init\Magic.SDB');
      for i := 0 to MagicDb.Count - 1 do begin
         mname := MagicDb.GetIndexName (i);
         new (pmd);
         LoadMagicData (mname, pmd^, MagicDb);
         DataList.Add (pmd);
         AnsIndexClass.Insert (Integer(pmd), mname);
      end;
   end;

   if FileExists ('.\MagicForGuild.SDB') then begin
      MagicForGuildDb.LoadFromFile ('.\MagicForGuild.SDB');
      for i := 0 to MagicForGuildDb.Count -1 do begin
         mname := MagicForGuildDb.GetIndexName (i);
         new (pmd);
         LoadMagicData (mname, pmd^, MagicForGuildDb);
         pmd^.rGuildMagictype := 1;
         DataList.Add (pmd);
         AnsIndexClass.Insert (Integer(pmd), mname);
      end;
   end;
end;

function  TMagicClass.GetSkillDamageBody (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddDamageArr[askill].rdamagebody;
end;

function  TMagicClass.GetSkillDamageHead (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddDamageArr[askill].rdamagehead;
end;

function  TMagicClass.GetSkillDamageArm  (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddDamageArr[askill].rdamagearm;
end;

function  TMagicClass.GetSkillDamageLeg  (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddDamageArr[askill].rdamageleg;
end;

// 2000.10.05 个 眠啊规绢仿 备窍绰 Method
function  TMagicClass.GetSkillArmorBody (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddArmorArr[askill].rarmorbody;
end;

// 2000.10.05 赣府 眠啊规绢仿 备窍绰 Method
function  TMagicClass.GetSkillArmorHead (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddArmorArr[askill].rarmorhead;
end;

// 2000.10.05 迫 眠啊规绢仿 备窍绰 Method
function  TMagicClass.GetSkillArmorArm  (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddArmorArr[askill].rarmorarm;
end;

// 2000.10.05 促府 眠啊规绢仿 备窍绰 Method
function  TMagicClass.GetSkillArmorLeg  (askill: integer): integer;
begin
   Result := 0;
   if (askill <= 0) or (askill >= 10000) then exit;
   Result := SkillAddArmorArr[askill].rarmorleg;
end;

function TMagicClass.GetMagicData (aMagicName: string; var MagicData: TMagicData; aexp: integer): Boolean;
var
   n : integer;
begin
   Result := FALSE;

   n := AnsIndexClass.Select (aMagicName);
   if (n = 0) or (n = -1) then begin
      FillChar (MagicData, sizeof(MagicData), 0);
      exit;
   end;
   MagicData := PTMagicData (n)^;

   MagicData.rSkillExp := aexp;
   MagicData.rcSkillLevel := GetLevel (aexp);
   Result := TRUE;
end;

function TMagicClass.CheckMagicData (var MagicData: TMagicData; var aRetStr : String) : Boolean;
var
   i : Integer;
   iName : String;
   tmpMagicData : TMagicData;
begin
   Result := false;
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -