📄 itmunit.pas
字号:
unit ItmUnit;
interface
uses
svn, 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;
Color :Integer;
//New Fields
Undead:Shortint;
Light:Byte;
Unique:Boolean;
Tox:Word;
ToxAvoid:Word;
SlowDown:Word;
MagAvoid:Word;
HpAdd:Word;
MpAdd:Word;
//New Booleans
boCanTrade:Boolean;
boCanDrop:Boolean;
boCanDeathDrop:Boolean;
boCanRepair:Boolean;
boCanSpecialRepair:Boolean;
boCanStore:Boolean;
boCanSell:Boolean;
boVanishDrop: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;
function GetDecoName(Appr:integer):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 := 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;
StdItem.Tox := Tox;
StdItem.ToxAvoid := ToxAvoid;
StdItem.SlowDown := SlowDown;
StdItem.MagAvoid := MagAvoid;
StdItem.HpAdd := HpAdd;
StdItem.MpAdd := MpAdd;
StdItem.DC := MakeLong(DC,DC2);
StdItem.MC := MakeLong(MC,MC2);
StdItem.SC := MakeLong(SC,SC2);
StdItem.AC := MakeLong(AC,AC2);
StdItem.MAC := MakeLong(MAC,MAC2);
end;
procedure TItem.GetItemAddValue(UserItem:pTUserItem; var StdItem:TStdItem);
begin
if (UserItem.btValue[0] <> 0) or
(UserItem.btValue[1] <> 0) or
(UserItem.btValue[2] <> 0) or
(UserItem.btValue[3] <> 0) or
(UserItem.btValue[4] <> 0) or
(UserItem.btValue[5] <> 0) or
(UserItem.btValue[6] <> 0) or
(UserItem.btValue[7] <> 0) or
(UserItem.btValue[8] <> 0) or
(UserItem.btValue[9] <> 0) or
(UserItem.btValue[10] <> 0) or
(UserItem.btValue[11] <> 0) or
(UserItem.btValue[12] <> 0) or
(UserItem.btValue[13] <> 0) or
(UserItem.btValue[14] <> 0) or
(UserItem.btValue[15] <> 0) or
(UserItem.btValue[16] <> 0) or
(UserItem.btValue[17] <> 0)
then
StdItem.Color := $F0CAA6 //clSkyBlue
else
StdItem.Color:=$FFFFFF;
//all items have dc/mc/sc so 0-1-2 = dc/mc/sc for every item from now on
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.Tox := Tox;
StdItem.ToxAvoid := ToxAvoid;
StdItem.SlowDown := SlowDown;
StdItem.MagAvoid := MagAvoid;
StdItem.HpAdd := HpAdd;
StdItem.MpAdd := MpAdd;
StdItem.Source := Source;
case ItemType of
ITEM_WEAPON: begin
StdItem.AC:=MakeLong(AC + UserItem.btValue[3],AC2);
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;
StdItem.Tox:=MakeWord(LoByte(Tox) + UserItem.btValue[9],HiByte(Tox));
StdItem.SlowDown:= MakeWord(LoByte(SlowDown) + UserItem.btValue[14],HiByte(SlowDown) + UserItem.btValue[5]);
StdItem.ToxAvoid:=MakeWord(LoByte(ToxAvoid) + UserItem.btValue[11],HiByte(ToxAvoid));
StdItem.MagAvoid:=MakeWord(LoByte(MagAvoid) + UserItem.btValue[12],HiByte(MagAvoid));
end;
ITEM_ARMOR: begin
StdItem.AC := MakeLong(AC,AC2 + UserItem.btValue[3]);
StdItem.MAC := MakeLong(MAC,MAC2 + UserItem.btValue[4]);
StdItem.Tox := MakeWord(LoByte(Tox),HiByte(Tox) + UserItem.btValue[6]);
StdItem.SlowDown := MakeWord(LoByte(SlowDown),HiByte(SlowDown) + UserItem.btValue[9]);
StdItem.ToxAvoid:=MakeWord(LoByte(ToxAvoid) + UserItem.btValue[11],HiByte(ToxAvoid));
StdItem.MagAvoid:=MakeWord(LoByte(MagAvoid) + UserItem.btValue[12],HiByte(MagAvoid));
end;
ITEM_ACCESSORY: begin
StdItem.AC :=MakeLong(AC + UserItem.btValue[17],AC2 + UserItem.btValue[3]);
StdItem.MAC :=MakeLong(MAC,MAC2 + 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;
StdItem.Tox:=MakeWord(LoByte(Tox) + UserItem.btValue[9],HiByte(Tox) + UserItem.btValue[16]);
StdItem.SlowDown:= MakeWord(LoByte(SlowDown) + UserItem.btValue[14],HiByte(SlowDown) + UserItem.btValue[15]);
StdItem.ToxAvoid:=MakeWord(LoByte(ToxAvoid) + UserItem.btValue[11],HiByte(ToxAvoid) );
StdItem.MagAvoid:=MakeWord(LoByte(MagAvoid) + UserItem.btValue[12],HiByte(MagAvoid) );
end;
else begin
StdItem.AC := MakeLong(AC,AC2);
StdItem.MAC :=MakeLong(MAC,MAC2);
StdItem.DC :=MakeLong(DC,DC2);
StdItem.MC :=MakeLong(MC,MC2);
StdItem.SC :=MakeLong(SC,SC2);
StdItem.Reserved := Reserved;
StdItem.Tox := Tox;
StdItem.ToxAvoid := ToxAvoid;
StdItem.SlowDown := SlowDown;
StdItem.MagAvoid := MagAvoid;
StdItem.HpAdd := HpAdd;
StdItem.MpAdd := MpAdd;
StdItem.Source := Source;
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[3]:=nUpgrade + 1;
nUpgrade:=GetRandomRange(6,15);
if Random(30) = 0 then UserItem.btValue[4]:=nUpgrade + 1;
nUpgrade:=GetRandomRange(g_Config.nDressDCAddValueMaxLimit{6},g_Config.nDressDCAddValueRate{20});
if Random(g_Config.nDressDCAddRate{40}) = 0 then UserItem.btValue[0]:=nUpgrade + 1;
nUpgrade:=GetRandomRange(g_Config.nDressMCAddValueMaxLimit{6},g_Config.nDressMCAddValueRate{20});
if Random(g_Config.nDressMCAddRate{40}) = 0 then UserItem.btValue[1]:=nUpgrade + 1;
nUpgrade:=GetRandomRange(g_Config.nDressSCAddValueMaxLimit{6},g_Config.nDressSCAddValueRate{20});
if Random(g_Config.nDressSCAddRate{40}) = 0 then UserItem.btValue[2]:=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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -