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

📄 uusersub.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 5 页
字号:
   AttribData.Dark     := aCharData^.Dark;
   AttribData.Age      := AttribData.Light + AttribData.Dark;

   Calculate;
end;

procedure TAttribClass.Calculate;
begin
   AttribData.cEnergy   := GetLevel (AttribData.Energy) + 500;     // 扁夯盔扁 = 5.00
   AttribData.cInPower  := GetLevel (AttribData.InPower) + 1000;   // 扁夯郴傍 = 10.00
   AttribData.cOutPower := GetLevel (AttribData.OutPower) + 1000;  // 扁夯寇傍 = 10.00
   AttribData.cMagic    := GetLevel (AttribData.Magic) + 500;      // 扁夯公傍 = 5.00
   AttribData.cLife     := GetLevel (AttribData.Life) + 2000;      // 扁夯劝仿 = 20.00

   AttribData.cAge   := GetLevel (AttribData.Age);
   AttribData.cLight := GetLevel (AttribData.Light + 664);    // 剧沥扁
   AttribData.cDark  := GetLevel (AttribData.Dark + 664);     // 澜沥扁

   // 盔扁 = 扁夯盔扁(5) + 唱捞(50) + 距(20) + 畴仿(25);
   AttribData.cEnergy := AttribData.cEnergy + (AttribData.cAge div 2);
   // 郴傍 = 扁夯郴傍 (10) + 唱捞(50) + ...
   AttribData.cInPower := AttribData.cInPower + (AttribData.cAge div 2);
   // 寇傍 = 扁夯寇傍 (10) + 唱捞(50) + ...
   AttribData.cOutPower := AttribData.cOutPower + (AttribData.cAge div 2);
   // 公傍 = 扁夯公傍 (10) + 唱捞(50) + ...
   AttribData.cMagic := AttribData.cMagic + (AttribData.cAge div 2);
   // 劝仿 = 扁夯劝仿(20) + 唱捞(100) + 流诀劝仿 + ...
   AttribData.cLife := AttribData.cLife + AttribData.cAge;

   with AttribData do begin
      cTalent := GetLevel (Talent) + (AttribData.cAge div 2);
      cGoodChar := GetLevel (GoodChar);
      cBadChar := GetLevel (BadChar);
//      clucky := GetLevel (lucky);
      clucky := lucky;
      cadaptive := GetLevel (adaptive);
      crevival := GetLevel (revival);
      cimmunity := GetLevel (immunity);
      cvirtue := GetLevel (virtue);

      cHeadSeak := cLife;
      cArmSeak := cLife;
      cLegSeak := cLife;

      cHealth := cLife;
      cSatiety := cLife;
      cPoisoning := cLife;
   end;
   SetLifeData;
end;

function  TAttribClass.AddItemDrug (aDrugName: string): Boolean;
var
   i : integer;
   ItemDrugData : TItemDrugData;
begin
   Result := FALSE;

   ItemDrugClass.GetItemDrugData (aDrugName, ItemDrugData);
   if ItemDrugData.rName[0] = 0 then exit;

   for i := 0 to DRUGARR_SIZE -1 do begin
      if ItemDrugArr[i].rName[0] = 0 then begin
         ItemDrugArr[i] := ItemDrugData;
         ItemDrugArr[i].rUsedCount := 0;
         Result := TRUE;
         CurAttribData.CurPoisoning := CurAttribData.CurPoisoning - CurAttribData.CurPoisoning div 10;
         exit;
      end;
   end;
end;

procedure TAttribClass.Update (CurTick : integer);
   function AddLimitValue (var curvalue: integer; maxvalue, addvalue: integer): Boolean;
   begin
      Result := FALSE;
      if curvalue = maxvalue then exit;
      curvalue := curvalue + addvalue;
      if curvalue > maxvalue then curvalue := maxvalue;
      if curvalue < 0 then curvalue := 0;
      Result := TRUE;
   end;
var
   n, i : integer;
begin

   if CheckRevival  then Calculate;
   if CheckEnegy    then Calculate;
   if CheckInpower  then Calculate;
   if CheckOutpower then Calculate;
   if CheckMagic    then Calculate;

   if CurTick > CheckDrugTick + 100 then begin
      CheckDrugTick := CurTick;
      for i := 0 to DRUGARR_SIZE-1 do begin
         if ItemDrugArr[i].rName[0] = 0 then continue;

         CurAttribData.CurHeadSeak  := CurAttribData.CurHeadSeak + ItemDrugArr[i].rEventHeadLife;
         CurAttribData.CurArmSeak   := CurAttribData.CurArmSeak + ItemDrugArr[i].rEventArmLife;
         CurAttribData.CurLegSeak   := CurAttribData.CurLegSeak + ItemDrugArr[i].rEventLegLife;
         if CurAttribData.CurHeadSeak  > AttribData.cHeadSeak then CurAttribData.CurHeadSeak := AttribData.cHeadSeak;
         if CurAttribData.CurArmSeak   > AttribData.cArmSeak then CurAttribData.CurArmSeak := AttribData.cArmSeak;
         if CurAttribData.CurLegSeak   > AttribData.cLegSeak then CurAttribData.CurLegSeak := AttribData.cLegSeak;

         inc (CurAttribData.CurEnergy, ItemDrugArr[i].rEventEnergy);
         inc (CurAttribData.CurInPower, ItemDrugArr[i].rEventInPower);
         inc (CurAttribData.CurOutPower, ItemDrugArr[i].rEventOutPower);
         inc (CurAttribData.CurMagic, ItemDrugArr[i].rEventMagic);
         inc (CurAttribData.CurLife, ItemDrugArr[i].rEventLife);

         with CurAttribData do begin
            if CurEnergy > AttribData.cEnergy then CurEnergy := AttribData.cEnergy;
            if CurInPower > AttribData.cInPower then CurEnergy := AttribData.cInPower;
            if CurOutPower > AttribData.cOutPower then CurEnergy := AttribData.cOutPower;
            if CurMagic > AttribData.cMagic then CurEnergy := AttribData.cMagic;
            if CurLife > AttribData.cLife then CurEnergy := AttribData.cLife;
         end;

         boSendBase := TRUE;
         boSendValues := TRUE;
         if ItemDrugArr[i].rUsedCount >= 10 then begin 
            FillChar (ItemDrugArr[i], sizeof(TItemDrugData), 0);
         end else inc (ItemDrugArr[i].rUsedCount);
      end;
   end;

   if CurTick > CheckIncreaseTick + 900 then begin
      CheckIncreaseTick := CurTick;
      boSendBase := FALSE;

      n := GetLevel ( (AttribData.Age+(CurTick-StartTick) div 100) );
      if AttribData.cAge <> n then begin
         if (AttribData.cAge div 100) <> (n div 100) then begin
            Calculate;
            FSendClass.SendChatMessage (format ('唱捞啊 %d技啊 登菌嚼聪促.',[n div 100]), SAY_COLOR_SYSTEM);
         end;
         AttribData.cAge := n;
         boSendBase := TRUE;
      end;

      if GrobalLightDark = gld_light then begin
         n := GetLevel (AttribData.Light+664+(CurTick-StartTick) div 100);
         if AttribData.cLight <> n then begin
            AttribData.cLight := n;
            FSendClass.SendEventString ('剧扁');
            boSendBase := TRUE;
         end;
      end else begin
         n := GetLevel (AttribData.Dark+664+(CurTick-StartTick) div 100);
         if AttribData.cDark <> n then begin
            AttribData.cDark := n;
            FSendClass.SendEventString ('澜扁');
            boSendBase := TRUE;
         end;
      end;

      case FFeatureState of
         wfs_normal   : n := 80;
         wfs_care     : n := 10;
         wfs_sitdown  : n := 150;
         wfs_die      : n := 300;
         else n :=50;
      end;
      n := n + n * AttribData.crevival div 10000;

      CurAttribData.Curhealth    := CurAttribData.Curhealth + n;
      CurAttribData.Cursatiety   := CurAttribData.Cursatiety + n;
      CurAttribData.Curpoisoning := CurAttribData.Curpoisoning + n;
      CurAttribData.CurHeadSeak  := CurAttribData.CurHeadSeak + n;
      CurAttribData.CurArmSeak   := CurAttribData.CurArmSeak + n;
      CurAttribData.CurLegSeak   := CurAttribData.CurLegSeak + n;
      if CurAttribData.Curhealth    > AttribData.cHealth then CurAttribData.Curhealth := AttribData.cHealth;
      if CurAttribData.Cursatiety   > AttribData.cSatiety then CurAttribData.Cursatiety := AttribData.cSatiety;
      if CurAttribData.Curpoisoning > AttribData.cPoisoning then CurAttribData.Curpoisoning := AttribData.cPoisoning;
      if CurAttribData.CurHeadSeak  > AttribData.cHeadSeak then CurAttribData.CurHeadSeak := AttribData.cHeadSeak;
      if CurAttribData.CurArmSeak   > AttribData.cArmSeak then CurAttribData.CurArmSeak := AttribData.cArmSeak;
      if CurAttribData.CurLegSeak   > AttribData.cLegSeak then CurAttribData.CurLegSeak := AttribData.cLegSeak;
      boSendValues := TRUE;

      case FFeatureState of
         wfs_normal   : n := 50;
         wfs_care     : n := 20;
         wfs_sitdown  : n := 70;
         wfs_die      : n := 100;
         else n :=50;
      end;
      n := n + n * AttribData.crevival div 10000;

      if AddLimitValue (CurAttribData.CurEnergy, Attribdata.cEnergy, n div 4) then boSendBase := TRUE;
      if AddLimitValue (CurAttribData.CurInPower, Attribdata.cInPower, n) then boSendBase := TRUE;
      if AddLimitValue (CurAttribData.CurOutPower, Attribdata.cOutPower, n) then boSendBase := TRUE;
      if AddLimitValue (CurAttribData.CurMagic, Attribdata.cMagic, n div 2) then boSendBase := TRUE;
      if AddLimitValue (CurAttribData.CurLife, Attribdata.cLife, n) then boSendBase := TRUE;

      boSendBase := TRUE;
   end;

   if boSendBase then FSendClass.SendAttribBase (AttribData, CurAttribData);
   if boSendValues then FSendClass.SendAttribValues (AttribData, CurAttribData);
   boSendBase := FALSE;
   boSendValues := FALSE;
end;




///////////////////////////////////
//         THaveItemClass
///////////////////////////////////

constructor THaveItemClass.Create (aSendClass: TSendClass; aAttribClass: TAttribClass);
begin
   boLocked := false;
   ReQuestPlaySoundNumber := 0;
   FSendClass := aSendClass;
   FAttribClass := aAttribClass;
   FUserName := '';
end;

destructor THaveItemClass.Destroy;
begin
   inherited destroy;
end;

procedure THaveItemClass.Update (CurTick : integer);
begin

end;

procedure THaveItemClass.LoadFromSdb (aCharData : PTDBRecord);
var
   i, j : integer;
   ItemData : TItemData;
   str : String;
begin
   boLocked := false;
   ReQuestPlaySoundNumber := 0;
   
   FUserName := StrPas (@aCharData^.PrimaryKey);
   for i := 0 to HAVEITEMSIZE-1 do begin
      str := StrPas (@aCharData^.HaveItemArr[i].Name) + ':' + IntToStr (aCharData^.HaveItemArr[i].Color) + ':' + IntToStr (aCharData^.HaveItemArr[i].Count);
      ItemClass.GetWearItemData (str, HaveItemArr[i]);
   end;

   for i := 0 to HAVEITEMSIZE-1 do begin
      if HaveItemArr[i].rName[0] <> 0 then begin
         if HaveItemArr[i].rboDouble = true then begin
            if HaveItemArr[i].rKind = 1 then begin
               ItemClass.GetItemData (StrPas(@HaveItemArr[i].rName), ItemData);
               if StrPas(@ItemData.rName) = StrPas (@HaveItemArr[i].rName) then begin
                  if HaveItemArr[i].rColor <> ItemData.rcolor then begin
                     HaveItemArr[i].rColor := ItemData.rColor;
                  end;
               end;
            end;
         end;
      end;
   end;

   for i := 0 to HAVEITEMSIZE-1 do begin
      if HaveItemArr[i].rName[0] <> 0 then begin
         if HaveItemArr[i].rboDouble = true then begin
            for j := i + 1 to HAVEITEMSIZE - 1 do begin
               if StrPas(@HaveItemArr[i].rName) = StrPas(@HaveItemArr[j].rName) then begin
                  if HaveItemArr[i].rColor = HaveItemArr[j].rColor then begin
                     HaveItemArr[i].rCount := HaveItemArr[i].rCount + HaveItemArr[j].rCount;
                     FillChar (HaveItemArr[j], SizeOf (TItemData), 0);
                  end;
               end;
            end;
         end else begin
            {
            if HaveItemArr[i].rCount >= 10 then begin
               frmMain.WriteLogInfo (format ('HaveItemInfo %s, %s, %d', [aName, StrPas(@HaveItemArr[i].rName), HaveItemArr[i].rCount]));
            end;
            }
            for j := 0 to HAVEITEMSIZE - 1 do begin
               if HaveItemArr[i].rCount <= 1 then break;
               if HaveItemArr[j].rName[0] = 0 then begin
                  HaveItemArr[i].rCount := HaveItemArr[i].rCount - 1;
                  Move (HaveItemArr[i], HaveItemArr[j], SizeOf (TItemData));
                  HaveItemArr[j].rCount := 1;
               end;
            end;
         end;
      end;
   end;

   for i := 0 to HAVEITEMSIZE-1 do begin
      FSendClass.SendHaveItem (i, HaveItemArr[i]);
   end;
end;

procedure THaveItemClass.CopyFromHaveItemClass (aHaveItemClass : THaveItemClass);
var
   i, j : Integer;
   ItemData : TItemData;
   OldItemArr, NewItemArr : array [0..HAVEITEMSIZE - 1] of TItemData;
   Name : String;
   Color, Count : Integer;
begin
   if FAttribClass <> nil then begin
      CopyFromHaveItem (@OldItemArr);
      aHaveItemClass.CopyFromHaveItem (@NewItemArr);
      for i := 0 to HAVEITEMSIZE - 1 do begin
         if OldItemArr[i].rName[0] <> 0 then begin
            for j := 0 to HAVEITEMSIZE - 1 do begin
               if NewItemArr[j].rName[0] <> 0 then begin
                  if StrPas (@OldItemArr[i].rName) = StrPas (@NewItemArr[j].rName) then begin
                     if OldItemArr[i].rColor = NewItemArr[j].rColor then begin
                        if OldItemArr[i].rCount = NewItemArr[j].rCount then begin
                           OldItemArr[i].rName[0] := 0;
                           OldItemArr[i].rColor := 0;
                           OldItemArr[i].rCount := 0;
                           NewItemArr[j].rName[0] := 0;
                           NewItemArr[j].rColor := 0;
                           NewItemArr[j].rCount := 0;
                           break;
                        end else if OldItemArr[i].rCount < NewItemArr[j].rCount then begin
                           NewItemArr[j].rCount := NewItemArr[j].rCount - OldItemArr[i].rCount;
                           OldItemArr[i].rName[0] := 0;
                           OldItemArr[i].rColor := 0;
                           OldItemArr[i].rCount := 0;
                           break;
                        end else begin
                           OldItemArr[i].rCount := OldItemArr[i].rCount - NewItemArr[j].rCount;
                           NewItemArr[j].rName[0] := 0;
                           NewItemArr[j].rColor := 0;
                           NewItemArr[j].rCount := 0;
                        end;
                     end;
                  end;
               end;
            end;
         end;
      end;
      for i := 0 to HAVEITEMSIZE - 1 do begin
         if NewItemArr[i].rName[0] <> 0 then begin
            for j := 0 to HAVEITEMSIZE - 1 do begin
               if OldItemArr[j].rName[0] <> 0 then begin
                  if StrPas (@NewItemArr[i].rName) = StrPas (@OldItemArr[j].rName) then begin
                     if NewItemArr[i].rColor = OldItemArr[j].rColor then begin
                        if NewItemArr[i].rCount = OldItemArr[j].rCount then begin
                           NewItemArr[i].rName[0] := 0;
                           NewItemArr[i].rColor := 0;
                           NewItemArr[i].rCount := 0;
                           OldItemArr[j].rName[0] := 0;
                           OldItemArr[j].rColor := 0;
                           OldItemArr[j].rCount := 0;
                           break;
                        end else if NewItemArr[i].rCount < OldItemArr[j].rCount then begin
                           OldItemArr[j].rCount := OldItemArr[j].rCount - NewItemArr[i].rCount;
                           NewItemArr[i].rName[0] := 0;

⌨️ 快捷键说明

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