📄 itmunit.pas
字号:
unit ItmUnit;
interface
uses
Windows, Classes, SysUtils, Grobal2, MudUtil, SDK;
type
TItemUnit = class
public
m_ItemNameList: TGList;
constructor Create();
destructor Destroy; override;
function LoadCustomItemName(): Boolean;
function SaveCustomItemName(): Boolean;
function AddCustomItemName(nMakeIndex, nItemIndex: Integer; sItemName: string): Boolean;
function DelCustomItemName(nMakeIndex, nItemIndex: Integer): Boolean;
function GetCustomItemName(nMakeIndex, nItemIndex: Integer): string;
procedure Lock();
procedure UnLock();
end;
TItem = class
public
ItemType: Byte;
Name: string[20];
StdMode: Byte;
Shape: Byte;
Weight: Byte;
AniCount: Byte;
Source: ShortInt;
Reserved: Byte;
NeedIdentify: Byte;
Looks: Word;
DuraMax: dword;
AC, AC2: Word;
MAC, MAC2: Word;
DC, DC2: Word;
MC, MC2: Word;
SC, SC2: Word;
Need: dword;
NeedLevel: dword;
Price: UINT;
stock: UINT;
//New Fields
Undead: ShortInt;
Light: Boolean;
Unique: Boolean;
private
function GetRandomRange(nCount, nRate: Integer): Integer;
public
constructor Create();
destructor Destroy; override;
procedure GetStandardItem(var StdItem: TStdItem);
procedure GetItemAddValue(UserItem: pTUserItem; var StdItem: TStdItem);
//function GetCustomName(UserItem:pTUserItem):String;
procedure ApplyItemParameters(var AddAbility: TAddAbility);
procedure RandomUpgradeItem(UserItem: pTUserItem);
procedure RandomUpgradeUnknownItem(UserItem: pTUserItem);
end;
function GetItemName(UserItem: pTUserItem): string;
implementation
uses HUtil32, M2Share;
{ TItem }
constructor TItem.Create;
begin
inherited;
end;
destructor TItem.Destroy;
begin
inherited;
end;
function TItem.GetRandomRange(nCount, nRate: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to nCount - 1 do
if Random(nRate) = 0 then Inc(Result);
end;
procedure TItem.GetStandardItem(var StdItem: TStdItem);
begin
StdItem.Name := FilterShowName(Name);
StdItem.StdMode := StdMode;
StdItem.Shape := Shape;
StdItem.Weight := Weight;
StdItem.AniCount := AniCount;
StdItem.Reserved := Reserved;
StdItem.Source := Source;
StdItem.NeedIdentify := NeedIdentify;
StdItem.Looks := Looks;
StdItem.DuraMax := DuraMax;
StdItem.Need := Need;
StdItem.NeedLevel := NeedLevel;
StdItem.Price := Price;
end;
procedure TItem.GetItemAddValue(UserItem: pTUserItem; var StdItem: TStdItem);
begin
case ItemType of
ITEM_WEAPON:
begin
StdItem.DC := MakeLong(DC, DC2 + UserItem.btValue[0]);
StdItem.MC := MakeLong(MC, MC2 + UserItem.btValue[1]);
StdItem.SC := MakeLong(SC, SC2 + UserItem.btValue[2]);
StdItem.AC := MakeLong(AC + UserItem.btValue[3], AC2 + UserItem.btValue[5]);
StdItem.MAC := MakeLong(MAC + UserItem.btValue[4], MAC2 + UserItem.btValue[6]);
if Byte(UserItem.btValue[7] - 1) < 10 then
begin //Holy
StdItem.Source := UserItem.btValue[7];
end;
if UserItem.btValue[10] <> 0 then
StdItem.Reserved := StdItem.Reserved or 1;
end;
ITEM_ARMOR:
begin
StdItem.AC := MakeLong(AC, AC2 + UserItem.btValue[0]);
StdItem.MAC := MakeLong(MAC, MAC2 + UserItem.btValue[1]);
StdItem.DC := MakeLong(DC, DC2 + UserItem.btValue[2]);
StdItem.MC := MakeLong(MC, MC2 + UserItem.btValue[3]);
StdItem.SC := MakeLong(SC, SC2 + UserItem.btValue[4]);
end;
ITEM_ACCESSORY:
begin
StdItem.AC := MakeLong(AC, AC2 + UserItem.btValue[0]);
StdItem.MAC := MakeLong(MAC, MAC2 + UserItem.btValue[1]);
StdItem.DC := MakeLong(DC, DC2 + UserItem.btValue[2]);
StdItem.MC := MakeLong(MC, MC2 + UserItem.btValue[3]);
StdItem.SC := MakeLong(SC, SC2 + UserItem.btValue[4]);
if UserItem.btValue[5] > 0 then
begin
StdItem.Need := UserItem.btValue[5];
end;
if UserItem.btValue[6] > 0 then
begin
StdItem.NeedLevel := UserItem.btValue[6];
end;
end;
else
begin
StdItem.AC := 0;
StdItem.MAC := 0;
StdItem.DC := 0;
StdItem.MC := 0;
StdItem.SC := 0;
StdItem.Source := 0;
StdItem.Reserved := 0;
end;
end;
end;
{function TItem.GetCustomName(UserItem:pTUserItem):String;
begin
if (UserItem<>nil) then begin
if (UserItem.sCustomName<>'') then Result:=UserItem.sCustomName;
end else
Result := Name;
end;}
procedure TItem.RandomUpgradeItem(UserItem: pTUserItem);
var
nUpgrade, nIncp, nVal: Integer;
begin
case ItemType of
ITEM_WEAPON:
begin
nUpgrade := GetRandomRange(g_Config.nWeaponDCAddValueMaxLimit {12}, g_Config.nWeaponDCAddValueRate {15});
if Random(15) = 0 then UserItem.btValue[0] := nUpgrade + 1;
nUpgrade := GetRandomRange(12, 15);
if Random(20) = 0 then
begin
nIncp := (nUpgrade + 1) div 3;
if nIncp > 0 then
begin
if Random(3) <> 0 then
begin
UserItem.btValue[6] := nIncp;
end else
begin
UserItem.btValue[6] := nIncp + 10;
end;
end;
end;
nUpgrade := GetRandomRange(12, 15);
if Random(15) = 0 then UserItem.btValue[1] := nUpgrade + 1;
nUpgrade := GetRandomRange(12, 15);
if Random(15) = 0 then UserItem.btValue[2] := nUpgrade + 1;
nUpgrade := GetRandomRange(12, 15);
if Random(24) = 0 then
begin
UserItem.btValue[5] := nUpgrade div 2 + 1;
end;
nUpgrade := GetRandomRange(12, 12);
if Random(3) < 2 then
begin
nVal := (nUpgrade + 1) * 2000;
UserItem.DuraMax := _MIN(65000, UserItem.DuraMax + nVal);
UserItem.Dura := _MIN(65000, UserItem.Dura + nVal);
end;
nUpgrade := GetRandomRange(12, 15);
if Random(10) = 0 then
begin
UserItem.btValue[7] := nUpgrade div 2 + 1;
end;
end;
ITEM_ARMOR:
begin
nUpgrade := GetRandomRange(6, 15);
if Random(30) = 0 then UserItem.btValue[0] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 15);
if Random(30) = 0 then UserItem.btValue[1] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nDressDCAddValueMaxLimit {6}, g_Config.nDressDCAddValueRate {20});
if Random(g_Config.nDressDCAddRate {40}) = 0 then UserItem.btValue[2] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nDressMCAddValueMaxLimit {6}, g_Config.nDressMCAddValueRate {20});
if Random(g_Config.nDressMCAddRate {40}) = 0 then UserItem.btValue[3] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nDressSCAddValueMaxLimit {6}, g_Config.nDressSCAddValueRate {20});
if Random(g_Config.nDressSCAddRate {40}) = 0 then UserItem.btValue[4] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 10);
if Random(8) < 6 then
begin
nVal := (nUpgrade + 1) * 2000;
UserItem.DuraMax := _MIN(65000, UserItem.DuraMax + nVal);
UserItem.Dura := _MIN(65000, UserItem.Dura + nVal);
end;
end;
ITEM_ACCESSORY:
begin
case StdMode of
20, 21, 24:
begin
nUpgrade := GetRandomRange(6, 30);
if Random(60) = 0 then UserItem.btValue[0] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 30);
if Random(60) = 0 then UserItem.btValue[1] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nNeckLace202124DCAddValueMaxLimit {6}, g_Config.nNeckLace202124DCAddValueRate {20});
if Random(g_Config.nNeckLace202124DCAddRate {30}) = 0 then UserItem.btValue[2] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nNeckLace202124MCAddValueMaxLimit {6}, g_Config.nNeckLace202124MCAddValueRate {20});
if Random(g_Config.nNeckLace202124MCAddRate {30}) = 0 then UserItem.btValue[3] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nNeckLace202124SCAddValueMaxLimit {6}, g_Config.nNeckLace202124SCAddValueRate {20});
if Random(g_Config.nNeckLace202124SCAddRate {30}) = 0 then UserItem.btValue[4] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 12);
if Random(20) < 15 then
begin
nVal := (nUpgrade + 1) * 1000;
UserItem.DuraMax := _MIN(65000, UserItem.DuraMax + nVal);
UserItem.Dura := _MIN(65000, UserItem.Dura + nVal);
end;
end;
26:
begin
nUpgrade := GetRandomRange(6, 20);
if Random(20) = 0 then UserItem.btValue[0] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 20);
if Random(20) = 0 then UserItem.btValue[1] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nArmRing26DCAddValueMaxLimit {6}, g_Config.nArmRing26DCAddValueRate {20});
if Random(g_Config.nArmRing26DCAddRate {30}) = 0 then UserItem.btValue[2] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nArmRing26MCAddValueMaxLimit {6}, g_Config.nArmRing26MCAddValueRate {20});
if Random(g_Config.nArmRing26MCAddRate {30}) = 0 then UserItem.btValue[3] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nArmRing26SCAddValueMaxLimit {6}, g_Config.nArmRing26SCAddValueRate {20});
if Random(g_Config.nArmRing26SCAddRate {30}) = 0 then UserItem.btValue[4] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 12);
if Random(20) < 15 then
begin
nVal := (nUpgrade + 1) * 1000;
UserItem.DuraMax := _MIN(65000, UserItem.DuraMax + nVal);
UserItem.Dura := _MIN(65000, UserItem.Dura + nVal);
end;
end;
19:
begin
nUpgrade := GetRandomRange(6, 20);
if Random(40) = 0 then UserItem.btValue[0] := nUpgrade + 1;
nUpgrade := GetRandomRange(6, 20);
if Random(40) = 0 then UserItem.btValue[1] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nNeckLace19DCAddValueMaxLimit {6}, g_Config.nNeckLace19DCAddValueRate {20});
if Random(g_Config.nNeckLace19DCAddRate {30}) = 0 then UserItem.btValue[2] := nUpgrade + 1;
nUpgrade := GetRandomRange(g_Config.nNeckLace19MCAddValueMaxLimit {6}, g_Config.nNeckLace19MCAddValueRate {20});
if Random(g_Config.nNeckLace19MCAddRate {30}) = 0 then UserItem.btValue[3] := nUpgrade + 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -