(* TUserHuman SumOfOptions - 11/10/2009 ------------------------------------- *) function TUserHuman.SumOfOptions (puSeedItem: PTUserItem; psSeedItem: PTStdItem) : Integer; begin Result := 0; case psSeedItem.StdMode of 5, 6: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[2] + puSeedItem.Desc[5] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; Result := Result + _MAX( 0, ItemMan.RealAttackSpeed( puSeedItem.Desc[6] ) ); end; 10, 11, 15: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[11] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; end; 19: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4] + puSeedItem.Desc[11] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; if puSeedItem.Desc[9] > 0 then Result := Result + puSeedItem.Desc[9]; end; 20: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4] + puSeedItem.Desc[11] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; if puSeedItem.Desc[9] > 0 then Result := Result + puSeedItem.Desc[9]; end; 21: begin Result := puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4] + puSeedItem.Desc[7] + puSeedItem.Desc[11] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; if puSeedItem.Desc[9] > 0 then Result := Result + puSeedItem.Desc[9]; end; 22: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; if puSeedItem.Desc[9] > 0 then Result := Result + puSeedItem.Desc[9]; end; 23: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4] + puSeedItem.Desc[12] + puSeedItem.Desc[13]; if puSeedItem.Desc[9] > 0 then Result := Result + puSeedItem.Desc[9]; end; 24: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4]; end; 26: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[4] + puSeedItem.Desc[11] + puSeedItem.Desc[12]; end; 52: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[3]; end; 54: begin Result := puSeedItem.Desc[0] + puSeedItem.Desc[1] + puSeedItem.Desc[2] + puSeedItem.Desc[3] + puSeedItem.Desc[13]; end; end; Result := Result + _MAX( 0, Round( (puSeedItem.DuraMax - psSeedItem.DuraMax) / 2000 ) ); end; (* TUserHuman CalcUpgradeProbability - 11/10/2009 --------------------------- *) function TUserHuman.CalcUpgradeProbability(puSeedItem, puJewelryItem: PTUserItem; psSeedItem, psJewelryItem: PTStdItem; iExecCount: Integer; var iRetSum: Integer; var fRetProb: Double) : Integer; var iSucceed, iFail: Integer; iSum, iRandom: Integer; UpProb: array [0..10] of TUpgradeProb; i, testSucceed, testNoChange, testFail: Integer; procedure InitProbability; begin with UpProb[0] do begin iBase := 10000; iValue[0] := 5000; iValue[1] := 5000; iValue[2] := 5000; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[1] do begin iBase := 10000; iValue[0] := 4500; iValue[1] := 3000; iValue[2] := 4000; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[2] do begin iBase := 10000; iValue[0] := 4000; iValue[1] := 1000; iValue[2] := 3000; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[3] do begin iBase := 10000; iValue[0] := 3500; iValue[1] := 500; iValue[2] := 1000; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[4] do begin iBase := 10000; iValue[0] := 3000; iValue[1] := 100; iValue[2] := 500; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[5] do begin iBase := 10000; iValue[0] := 1500; iValue[1] := 25; iValue[2] := 100; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[6] do begin iBase := 10000; iValue[0] := 400; iValue[1] := 5; iValue[2] := 25; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[7] do begin iBase := 10000; iValue[0] := 100; iValue[1] := 5; iValue[2] := 5; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[8] do begin iBase := 10000; iValue[0] := 25; iValue[1] := 5; iValue[2] := 5; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[9] do begin iBase := 10000; iValue[0] := 5; iValue[1] := 5; iValue[2] := 5; iValue[3] := Integer(iValue[0] * 2); iValue[4] := Integer(iValue[1] * 2); iValue[5] := Integer(iValue[2] * 2); end; with UpProb[10] do begin iBase := 10000; iValue[0] := 0; iValue[1] := 0; iValue[2] := 0; iValue[3] := 0; iValue[4] := 0; iValue[5] := 0; end; end; begin Result := 2; iSum := _MIN( 10, _MAX(0, SumOfOptions(puSeedItem, psSeedItem)) ); iRetSum := iSum; InitProbability; testSucceed := 0; testNoChange := 0; testFail := 0; iSucceed := 0; iFail := 0; iRandom := 0; if iExecCount < 1 then iExecCount := 1; for i := 0 to iExecCount - 1 do begin iRandom := Random( UpProb[iSum].iBase ); if psJewelryItem.StdMode = 60 then begin if psSeedItem.StdMode in [5,6] then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[0] * ABS( (29 + BodyLuckLevel + (LOBYTE(psSeedItem.AC) + puSeedItem.Desc[3] - LOBYTE(psSeedItem.MAC) - puSeedItem.Desc[4]) / 2 ) / 30 ) ) ); end else if psSeedItem.StdMode in [10,11] then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[0] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end else if psSeedItem.StdMode in [24,26,52] then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[1] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end else if psSeedItem.StdMode = 19 then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[2] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end else begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[2] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end; if psJewelryItem.Shape = 9 then begin iSucceed := (iSucceed * 60) div 100; end; iFail := Round( (UpProb[iSum].iBase - iSucceed) * 0.7 ); if (iRandom >= 0) and (iRandom < iSucceed) then Result := 2 else if (iRandom >= iSucceed) and (iRandom < iSucceed + iFail) then Result := 1 else Result := 0; end else if psJewelryItem.StdMode = 61 then begin if psSeedItem.StdMode in [5,6] then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[3] * ABS( (29 + BodyLuckLevel + (LOBYTE(psSeedItem.AC) + puSeedItem.Desc[3] - LOBYTE(psSeedItem.MAC) - puSeedItem.Desc[4]) / 2 ) / 30 ) ) ); end else if psSeedItem.StdMode in [10,11] then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[3] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end else if psSeedItem.StdMode in [24,26,52] then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[4] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end else if psSeedItem.StdMode = 19 then begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[5] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end else begin iSucceed := _MIN( UpProb[iSum].iBase, Round( UpProb[iSum].iValue[5] * ABS( (29 + BodyLuckLevel) / 30 ) ) ); end; if psJewelryItem.Shape = 9 then begin iSucceed := (iSucceed * 60) div 100; end; iFail := Integer( Round( 0.7 * (UpProb[iSum].iBase - iSucceed) ) ); if (iRandom >= 0) and (iRandom < iSucceed) then Result := 2 else Result := 1; end; fRetProb := iSucceed / UpProb[iSum].iBase; if Result = 2 then Inc(testSucceed) else if Result = 1 then Inc(testNoChange) else if Result = 0 then Inc(testFail); end; end;