📄 svclass.pas
字号:
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 + -