Skip to content

Conversation

@Wires77
Copy link
Member

@Wires77 Wires77 commented Jul 18, 2025

Fixes #8860 .

Description of the problem being solved:

The way scaling mods on items seems to work in game is that the mod is scaled, rounded towards 0, then added to the existing mod. i.e. mod + truncate(mod * scale) vs. truncate(mod * (1 + scale))

This is really only seen when the scalar is below 1, which only happens for Runegraft of the Bound (that I could tell)

Steps taken to verify a working solution:

  • Example A comes from the issue. 1 Endurance charge + truncate(1 Endurance charge * -20%) = 1 Endurance charge
  • Example B comes from the comment on that issue. 26% Fire res + truncate(-5.2% Fire res) = 21% Fire res
  • Example C uses Widowhail to show that it works fine for other scaling items as-is: 35% fire res quiver + truncate(35 * 197% bow) = 103% fire res

Note that I only fixed this for Runegraft of the Bound, because this seems to only apply for scaling item effects. I also tested Mistress of Sacrifice with 25% Bone Offering and it gave 12% block in game. That doesn't match our formula above, so I didn't change the ScaleAddMod itself.

Link to a build that showcases this PR:

eNrtPWlz20ayn8NfgVLVvi-mrLkx8LN3izqtRLJlSrITf0kNgIEIGwRkAJSsbO1_354BSIIUQFKHs3lHUqUQmO6e7p6ePuZAXv_j-zhxbnRexFn6Zgu_RFuOToMsjNOrN1uXF4fbcusff--9PlPl6H20O4kT0_L33k-v7W8n0Tc6ebMl5JZTqvxKlx-npOjvQOpapeVIZ-mp-pLlR1n4Zutdluotx1dpGJfTpyBRRfFOjfWbrf2JTuKi3HJUEeg03Ju3HCUqjFWZ5QA_UrkKSp2fmN4HkzI7zUIAiVRSALmxitPzLPiqy6M8m1yDVFvOTaxvK6Dj07P3w4sGa3HaZA1E--n1WaLudH5eqtIp4M-brb1s7MepDvfPzoGWSiZACG3ttAOfl_kMiFDSBTbU35qQmIouyH39fQ4m-QqCTUjR2fNxWs7pkVUMNiE91M3fTVbCoK9XzUVWquTg7dkM0uWIvsTClQwx7LpdeGejuyIOVHKqvsfjyfhtXF6or3reIcO8U3sn8dWoTMFqu5AxI26nEg7jXHcjStQp6l6WhJ2IhEnZiThSWdGFSVA34kkc6Tmgh2ingV7r4JWBPk6DOU8IryJ8mea60PmNDjfqwqAMdZCBZ1F-ojfGmXdzpnPwAA1D7VZ11dmVTuse7-bdueSl14V2qlI1g-TCXakuA9xUF1pFtU1Zkm6GsSw38156GEssOEyS1UTadeB1a-Ag1fnV3fko1knYcERsE_hpP3vqehNUq8Qm_kbKXOywTbpO1E8qD9dDDdWV3gyqvXv2snNEDm5U0XSKDPHVyqngm3ohneo81YnWgBFqcBdpsIEMZ3n2RQdlnDwMbZCPs0neCCpypRAV-GYyTJ36vhpb_YaTYCGKkG67jSIjyo3eTSDOL4myHgs4TZI21E4POChLFXzdz8KrjRVnO3kQxiJ_55Pra_AJxiSWuXRXBauhLmwCNQ2wYj3wezDpxWmMV0W15R42AF7uAa0N1sud8A0xlnsieGWcXepmm3obgG8szWxET8FrjMGrw8jqEPLQuapfrhjNCRjQJgmnBczKjWDPsltgfmRy9eJh0JCSzBA6nd5hrtM_7jamvwC-UQcHaTjJzXRY7kNsitHsZop0EY_BoRbFviqVE9bp7EeVx1AkEFtAFFrlwegERv9QJYkP3uDNVvOtfbJFx2GcQGmyD-9Mp0b4ZYp46mle79gqyvw6Hl9neelAvVMOgiCbpOVbVYygpvFDz_O5qzSNFA8IZjqSLAxdHgYyohGRzPXC0N-yqEOtkjEM2171uDctlCpaofCRr4TmlIqAEYZDFTIRCI6wK6LQCxBCWmkCJeB3w82Zysu7aVll-bVvQJyijFNV2jpvkCRbzvkoux2EN0bgiyxLilktpq6voYxboHGRa-2oqaMLjC7sGJgHqN0KYPeumjhA5p8UMdKnwCz5V_-fmGDh9SkhnJsnITHqc0SIhCeCKWF9xhGCB0ldaCECMXjg0iWyzz1mHgThUvaZKyxBAqLjPsWSkH8t1JzHwDPoIYWSEbgg3AMChLp9S5gRyMj6gjLq9RnzCOlzQSm8pwzTPoRI4NGlRACn1IW_LpesD-xxYNaTok8Yp7JfcUKJC5gARmifIuFhaPUwA5EZQn3MPGituIQcENE-1EocUIGFPuYMOMJIcmAGE0H6TBIJbyDTEMAYQW5fcAx_mUsNT4hK6EowUBPQ8oxEwC51ifnLPNQXCHMKmvJAX1hSBBQ5FuaNFKJf61sSF_cZ8oAuF9L85YKBIqhAIA6DWg7-IiBPBDd6t9qvRoczTIAbYdiDSkb0OYXU1hAWZiA9GFzmGd2A2AxkxS7ogElmtEU9go3IoCGweGCNEBf0ASMJchjFeMjYBsVGMcjAEkJB154HShIUpIDsmfaJy2C8JMNGH2BaWCIYF9C86_WlACzBQT_AHOWgQqNmwuChX5ke58A3COYCjjSAFDOjDUwRgINEIB2lLjOeIcjSUOV3g0WjSmOYLiVMgcZCCRH1GogBYHY2_PT6cnhif_w0Ksvr4tXOzu3t7ctrVY6ySH-HLO5lkI13rgEJ5tF28TVOkm1DdmcA_-xefdj79TYbH769vCq-6ciT2ze6vP3l2-fL375-fvs-SuNzNLgsf_VyFP18QsPtd6PL7PPV--TnUYEU3c1u_qAX39_9Mj67ucjvoneTuMh_5xeTISb5gMnJNroMoi_59uDk27bOfhtScau2U_VB5V9S_vsJ1dHn39T1byOqDsgnfcU_jS4u3r27Ofiy9_Vz4W1_CP94exQc7d2eyLI8QWTbP5BXbqE__SJ36e7w4jxFp94f38oT-R3J4Rf_YHKYv433v-xt_3ykfo1-HWA8yA4Pv-S_YX1wt_0zefs9-3x-eKUn26NPn7e_fPvEBnunWB6f_CKOboYyOuCjQn5AH1T26_v3H7ODz8OLi-Nf94Ce9zvgW4XvTDX-ulo8Kir110_WFVivYAZ_y4lLPTaPdXpxH87a-hyuXmCAbprUX5tUIo_BydREps9OCJYxnKT6KldR6WSRY0IUkAusz83LHbJv_p6bgT-Gl8XUFoqdQQm2ZLxssWMoHBkKkB8ZKOy9vE6vtmZMWh-0VXvjyukem2S82cXlsX1V7BynR2qsdz5Cj_Bsae_VtM-qvnePLPlKlp8I-ptZqoOY4ERZ7lhWC6fMoPfSMSxPxhAInD0IGGF2mzpZ6kwKXeGexGPQXGigsXNPD5WudqbKWqu7cqSdXYip4ZMVSBf1Zz3zj9Rfbqoi0IOfpaCbwrlSZhnSifJs7Bx8m8QQXkMQLSuLOU6cBrlWxTqsowSS0mKdumeqa9P5_NHaL9g2xHCb1xjtmR_vsrJqMy-nD69rUyggxzjS42L3DlLXQ1PjL6201lmCgT7XZZWHNXHebJX5RJv8KlKTxLz_MFFJbJIW1Hx7Uq1Sp1k-nq0hAilIWkyVVVG8uLs2oX5wclK1DJKyJma6m2YwVaZSM-TE4TR7qV_atefBnOs9lQSF5RsGJZmA0aR1Vl9HgkT5hjOz6G7WycKpREWSgby7WXjnTCvwJdKznn96DQzW-DCmvkrIlHglNlQYzlXlhU51qULIcXeOwS0VO0ayagbAr486vdLTQtPmqQZjL58UI7DQQ1sm2Thz__W3htbr3wZovxqArQXm8FTEJYltzlsznsI8qXLDaT-O7WhnQ4H5aoFnY37w_VrnkDSXwLKarj3MRK_hWoBmaugG-XEqqTpzmr09t16Mst9Hn1Tepg_TmFWNy3poNP04-U0nxjOZbjYVnG0o-McsAY0aZtskb7Yui95s-3GyN3rZVHSxoeh2RXFxSa5NB61gy8poBfpxWrHdOdP-nLrDZ1JQ7R33IEPQQa4gSpq90EUfudw2d5PLLT_QU867cmxfs3zTMLM-Rllyj4pSb3Uy1mVLgDK4awbBauo0TsGLLQXMhw3P-WQ8ztIhpNZHWaLHS5Zr2s7LDFK5qrFhr61NDYYsLz9u1CoGHMuBc5-FKYAOGzzuPGvYP5vky-6uevU-OkjsomXRUNj9ph-nm6ov4-pnvf1pNv1Jq2sYF-yc35qF3seY9gP9y12Q2MMQTb8yfTf3J9M3P9CP1F38T1S1u2GsqzZULrJdiBthW5SrAMopwHJ8W8L_gYNRlc9QllVd_WmDUhWHTxsNtHnZEU2SvXzRCS28nw3AwtsfmGfV3Timnz9N6baOf5LOyUYqtzsiUFQtq3zh_UzlC29_YFlTd9Ou8vonFN12eaFaQDA_rdItxHF6PSktwTdb47gIfvcnUWTOfIEsZW7Psx0cHh7sXRx_PKi3fZooVt7f08nY11C-VP-d7wifa7s37RQTv6h-gpHE-tYysg-6jpPCSJYk6rrQsw0Pu0JQc54A3gpqFuptXE7T5XZac4BuSgffoT4EeaFACvJYd_I1a1_DVNWhOfdQrUG2U9vPVklXbaDvmS0qyFA7NXU9c3KtVPYgIegUxzSuwD0eX6uks-e6dY0mSrNGBNYaR3FgdhhXD7lZUaqgVuglCCa5Cu5WjHe9-99No45C7QQacaMV-SyLC7Ne0Y5dt67Q6lUad49n3dqNvq8D1Sl71diNfKJ1MDoCZ5mloKYuKjOoFZTeZak1cpg0gzipE9t2cpCKzkC6Cb4vRzqvNzG7KJ2Cj5qCrJw4eexPyu5p3IBYoSt7NrBDQ6atG7U6Jtchg2lb4YkWzpd1KLQJ002qOs7V6chWoVaHNjr1Vx8BWTEE9QJsh_qr1hVKmJ4D65C_bl4xSaz_HdxkcVgtz3ZMlyWwVQ4D6uSnk7GHm55OZvm009MpHiaq-No53nVrN_pltcLWQqXKXzYiYibV0yiYufU0CheQhZaTXD-awHA5E5njDlfnILPTOR2xum5e5TrqUzuPJ1EdLurgfz26Pfv0aGwbASAt1iDCyhAwg1kxQ8pJug_aKFfMjg1JWbbaXclcugfRqoJhq6QPplhN8frE-yovUIGsIQTR_O2KfHEzSrMjfG-1SsrRWZYlTyN472T_U4iZ88iTa5WGU3Lv27L0-ThsqD0oQ4GmPZu2b449P1WHqR7ftRDq5uv1zrSus8fFTKVVn7U7L3NTP_-RZePf3mxRzl4S7lHpSoGQrN7Xu7203uGFDHw_hlHMrfVNezWAv77Z2mbyJRVYMOExV7rVWeXXtmaud5_N79nmcze9SaHP7ZGfajnLYjS2jA2V5nbxUJm1zVfOcDA86B2NsknigIHlZQ-qmDGk3M7P-lYnvcs0_jbRzvH-K4e6LnVZ4AvhS465QIFSPhM44IT5WrAAKymFz0JfUIJU4PkSKRyiQPrM5RHrWRasbl45ruhBxZPEAcyPVw7q8eapgXFloY4JYb0XmPzNrD-Z08JOlSoZz9HDCwcN5ofL690XW75D8T1U6ZV2cvP3zRZ6ybdqJdQFficEWQsxPSFqFzgWdUxadHx-HcOTc36t8q_dSg6RD9qSimmuGSEyZK4Q2hPmP4SGmIYe4z5Snhf6oGIAUSzErvRDylCI3EUlk0Ulv5BGkSpJnHnK3sO4qcdqJ6tWods5KP9J5dJF5b57PzwdnPQ-TOLgaxEn4H4cm1Y0tao11h4JzRE-oXjgCukjV_sB04HLBWWBQioCjetQCXPCjzCKkaJB4BLJKRhbU6usVx_LMCq174b6m3m9oOt23lmLYRyqUjt7WR72hpOijAPnXBWjJvcejDPV2mc-ijwsFeaRxyIttAu2IiUmgoqQS4-7IcEh8cEwpCZSK4YIYIQL3HPa5Bk1mcY9wpojXi2iLW9r2ok3PRVkHatj0gPnYgR53ihLwt4Lio2dTQ2mqq-cqsCC6YzcZms1xym3c3x2lH5hoi_4Bju2ThUUnWlO8qfZ4woIthaCr4UQ3VbPFy3n8t3xh8uD3oXyJ4lyhqpQvfMYhhJcZObrpvUIjoJABDTyA8yop1DoIcKErxUPvYDxkCvfQ65kmvkekYQgwcGEIghoDCskFqxH0qbx1wcJXzmftmf_bjILRKssR2A74BbBPJXJ65w9dd2ra1OQAk9_74IZ1FfUwNtDJy95U1yCgWlPRsxXiniuEipA1A1CgaX0A4kVdWEOIe6D-K7ymNLUlRHxCOIuCXy56EDdVnGPnOH2rnO05Fyp9a41lzAkZgV0KUpVEpsNxSrAR_Zc2wuK_jZ1zPVGI8y2-QwoekMdmcXbwmHLs9HgVT67WuDUefEXmgxtg-8uDv7p4Oh4r2fODoCspXPPjRtlnZeQ7qRQnC9GSs0DJKmPia-R8ELtuQjB4CrKFLg9GN8o9IkA86aMBCFHEiOtIqbcSGnNFwaabuTTsWgOZlWCOdMbeT2-0GqXOBxIYivvOIVy6j2GyoH9wCgp29RszlGCLiHX249v4lRb7zvXM-jAnnVrqjkCnwGJhSIB_JU-zJGIhoojn0pzsJ0gDWkveI9QihD7wtNuCEFVeb5LpYjCxaxPkHY9C7Q0l4iNEXWlUmu66B2B_DAJjsfjSWrmEYBUC7z2eC9G9Zn3wokjkw6Hzu3IJIQVDIRXPTZ7inae7U5yG2duR9oe-g3_oymN15rS3Buj5rhwFnLf9bj2MOXKlRpDCigj6UYChgETGkU4UtiXPjRiTH0XXD6BZF0zJSCJf9S4tHOPUZutnSuYCpBQqlTNLewAKoxlC1MqwL5PmOtDgcGxjHwFGQ31qR9qDr45gLntcxxGUeBJKiAj8ynxZAClhwuYS8kZapeELtUbLaZ0PjIz1liS7DAkC7GhqbQqCrcGvlOV3yU61f8FdVvx34Vj7nep4K53oq7jwhmMJ4kumwpDOOImFUQMAjRoxPUIYRwqBo6h3oqYVFAgYC0iosDX-ZHn-VozUzNALYaCxSkpeWc-SHr_DMwpbB3-a5CAO4M8tYBCS0MFY2KZLq7NiS-YrMjOxLTUSRJfmaIUKg37brq5NI2GLwiVNtTVqaXZMbPBDIrq-Kt2TidJGUP_OgcKtC2ckqaPtekiNIXxpOgxCKLmBt09otX2VW_pdeGM1A00ToBn8APVy_9leeQKCHcthFxhx2317YG6ginyS5qVvcFYl5CmwNAsTXWIzqFmkoZ-JMAtkQDqW4EY5GNuFCjGXI-iQPhKK-lSLbHAHqVCRgDiMTf0lqvbhuXKxUrmBcHW0Oyl2WY18QLb4gTGW6dX5QgASYudARS5X6WQhXfGs0Hu5rWuTsxmzgtTU3WVNv_XzK3VmGiLMZ2NMp3G342Owary3s8q1M5bVQajRVeooGD3oax3PaWwdDnyaCRECNalFfJZJBhYmOYRJ66iJvlnhFITIjVkMJKjBYPCpDXbH5p8vxkUl3KVylJmBsXlwrrUUvE8CCGqWAukjrmd3rrUUqXyjj2M8BfP5jFrDWmf4jC7Hak4Abc7Cc0FntuFpBIrYiszQXzsstBTgUAh5X4ooVjDAUMBUpIzTKlGnjCVqm9cQySxdlUklpcSW4u07aPt4VL-7rkbX06CQgTy9ceHet62zKrAQ-5CTdA7zUzBY47cLrtIST0dRV4ICTf4R-FDpsM5FOxYM4_4hHDwoRhLU9JLH3leAGkecTULIb1zqVh0kUKudJFsxTINkavWcNq8I2vxjqZiWlnZvqCVe7RzodV_YjoHMOVUmyMt_t-Thvagb9tcPFSB9sHkv4I5g5dS1rxP47Is5ssrjHYvr4APxb0FAwDrQb3msYkWJCHcpln75s68dj0dcJPdBzCXOQm4qzgNcARlo_LAQ9uC3eOQDmjiIk96kMEyoXy5NOP5fMaTxpTfhX_NpJ_bPF521vVSy_r8c-0qp-dBhjHO8nv3PpzbuBw5l6nKx7MF9cqjg8K_wwA4V4D1V_frbqstDXXoJyYWX-TKrDbmRW-QBjGMu3MEJmauc1bHUYxJifr3fetg4NUW1igDKFq8KNBIRZhHKOIe8wNwhThigtNQQ9RmTIfgEn3mh4GGapF4KkIe9jGiSxUNaw_j28MF02BiyR3i5pLDbPd_tvhgIzc3MLJtEW46wmKN2WB3Yb-l0lDvhUAt6aZoTS3Jwnr49MMudbYAZmdXlkx4u5utcpjPEELU2cvyfHJd_qWSiv-gu2xdIjvL4zEM7CDPs9s6CZjeQj4EbaqlzSAIuI3McMmkyEK6MQ-ATT8xzfXseeLZRsjymD_PeC1pwVwg7t41XrxbnGSl_ZLAmX85PDH732n9TczqlP7sYwSzEenCmF62aOCwdTj2WLoz8O-Kwvjq6jMHjU8goLUEdFIu45MH4FfrV3SOQTcV094pWe6aPaDrGaEniF_TIM9Ao10g8QwCiWcQ6FE02gTCbYRs03EIVJa_sVFRtJv5TuOzG9MeH2Pe9BlUSp5LHQ8x2Ooy5kYKfcBsFU_mgDyYwhxBPK5L-lz6589gDPgZ5hd-Bj7YAy1hDs6e5KMeMv6tM5I9gwIfHnSaX_p5mpOmT1UAeeIcfhgDsw-PPMUIq_zkKRTaZzZ_MgXxXLEXP5eTebhtNrqWj9MCe_JY8ucxqocIX-3INeYlfqwvpM_gUugTZyV7Ij5-ngF4dKx8sNU2BHY3w2gYh7cpbw3zkI9RK3-qt36mcWHP5V6eLTenj_WcjSFZW7-ZZfmFQSSPc09kw0Ki_qhfs5BofOdv40KicxifLdw8R93JHmeacyy-0fA11xj444bvmVIW_uQw9_RAKR7qUBracx_lge73WC1AVXfozcUKFepze6nikza7OkV188KejbRX67M0iq_qaxDVQ30RwuLP3jhlXCa68RGA5tJV84r9pND3P9_sZ1miVVrfo6gFPUtUoM2Crc5rXG1Wc6v74bPL-S5CaxAWvvE9RaPrsGZ7XNO7-FNMQhhe12M-u7E9Q-NrcJqfbZ_hrBUN3jyCP9PXI9DsKuscQ7Ju-PFsF-dTbE4Sm28Xmbv_5vDjuU6ixscV-AYyPlgxs9E7M7erZoO-KdbDB8LY2LJKpSfWoM2uBc-0gTCjG1jXcld0E0vZVBfnQWYvWZnNlHtfwejsof4_OGRJYhfAmzN0DeY0tEwRBPak141TxFdx8j6yVzOBSetANmVy-Xt0D5w0G2vQnFLsUODrnZnTrC652ae_917vLP__tf4NPhCV4g==

Before screenshot:

image

After screenshot:

image

@Wires77 Wires77 added the bug: calculation Numerical differences label Jul 18, 2025
end

function ModListClass:MergeMod(mod)
if mod.type == "BASE" or mod.type == "INC" then
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I felt this was safe because the only places we merge mods are places that don't even have MORE modifiers, let alone multiple. If we end up being able to scale an item that has 2+ more multipliers of the same type though, we should revisit this to make sure it's accurate

Comment on lines +1059 to +1064
local scaledList = new("ModList")
scaledList:ScaleAddList(combinedList, scale)
for _, mod in ipairs(scaledList) do
combinedList:MergeMod(mod)
end
env.itemModDB:AddList(combinedList)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I duplicated this logic for the gloves even though it's not technically necessary. We should have this logic for all item scaling too for future proofing, most likely

@LocalIdentity LocalIdentity merged commit 0ed1dd8 into PathOfBuildingCommunity:dev Jul 21, 2025
2 checks passed
@LocalIdentity LocalIdentity added the pob2 Label for features that should be ported over to PoB-PoE2 label Aug 29, 2025
LocalIdentity added a commit to PathOfBuildingCommunity/PathOfBuilding-PoE2 that referenced this pull request Aug 29, 2025
Paliak added a commit to Paliak/PathOfBuilding that referenced this pull request Aug 31, 2025
Paliak added a commit to Paliak/PathOfBuilding that referenced this pull request Aug 31, 2025
Wires77 pushed a commit that referenced this pull request Sep 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug: calculation Numerical differences pob2 Label for features that should be ported over to PoB-PoE2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Runecraft of the Bound incorrectly scaling maximum charges

2 participants