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

📄 itmunit.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -