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