Defence conversion: rates above 100% aren't scaled down, and a second target reduces the source base twice

Ouverte
#2,570 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@Azaril y travaille déjà.

Depuis le 25/10/2026.

  • #2572 par @Azaril — ouverte

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
lua
Domaine
backend

Piste de recherche

Start in src/Modules/CalcDefence.lua, around the conversion scaling loop and the per-target base reduction described in the issue. Trace how conversion and gain-as rates are applied to each source, then run the relevant defence calculation tests and compare both reported builds. Done means rates above 100% are proportionally scaled and adding a gain-as target does not reduce the source base twice; linked PR #2572 indicates work is already underway.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Check version
  • I'm running the latest version of Path of Building and I've verified this by checking the changelog
Check for duplicates
  • I've checked for duplicate open and closed issues by using the search function of the issue tracker
Check for support
  • I've checked that the calculation is supposed to be supported. If it isn't please open a feature request instead (Red text is a feature request).
What platform are you running Path of Building on?

Windows

What is the value from the calculation in-game?

Two conversion rules, both already intended by PoB's conversion code:

  • When a source's conversions total more than 100%, each rate is scaled by 100/total. PoB clamps the total to 100 and has a loop to rescale the rates.
  • A "gain as" rate does not reduce the source. Adding "Gain 20% of maximum Energy Shield as extra Armour" should not change the Energy Shield you keep or the Mana converted from it.

Expected values for the two attached builds (Custom Modifiers only):

  • Build A: 50% of Maximum Life Converted to Energy Shield, plus "Convert 1% of maximum Life to twice as much Armour per 1% Chaos Resistance above 0%" at 75% Chaos Resistance, for 125% in total. The rates scale to 40% and 60%, giving Energy Shield 25 and Armour 84 (60% converted + 75% gained).
  • Build B: Tattered Robe with 128 Energy Shield, "Convert 40% of maximum Energy Shield to maximum Mana" and "Gain 20% of maximum Energy Shield as extra Armour". Expected Energy Shield 77, Armour 26, Mana 104, the same Energy Shield and Mana as with the Mana conversion alone.
What is the value from the calculation in Path of Building?
  • Build A: Energy Shield 31 and Armour 93. The rates are not scaled, so 125% of Life is handed out while Life drops to 1.
  • Build B: Energy Shield 46 and Mana 83. The body armour's Energy Shield is reduced twice (36% kept instead of 60%), and the Mana conversion takes its 40% from the already reduced amount.

Cause (src/Modules/CalcDefence.lua on dev bb52d6b):

  1. Line 1375, for name, val in ipairs(source.conversionRate) do. conversionRate is keyed by target name, so ipairs never iterates and the rates are never scaled down.
  2. Line 1413, source.basePerSlot[slot] = source.basePerSlot[slot] * (100 - source.totalConversion) / 100. This runs inside the per-target loop, so every target with a non-zero rate (conversion or gain-as) reduces the slot base again, and later targets take their share from the reduced base. This also happens when the total is below 100%.

The in-game combinations that reach these paths are uncommon, so both builds use Custom Modifiers. I'll open a PR with a fix and regression tests.

How to reproduce the issue
  1. Import Build A. The Calcs tab shows Energy Shield 31 and Armour 93. Removing either conversion line leaves the other's value unchanged, so nothing is scaled.
  2. Import Build B. The Calcs tab shows Energy Shield 46 and Mana 83. Removing the "Gain 20% of maximum Energy Shield as extra Armour" line gives Energy Shield 77 and Mana 104.
PoB for PoE2 build code
Build A:
eNqtW1tz4joSfs78Cpe3ztPWhEBCMjlF5hQBcqlKMixkZnafphS7AW1kySXJJJxff6ol34CYSGSeMFJ_3a3WpS-ye3-9JixYglRU8IuwfXgUBsAjEVM-vwi_P159_hL-9fVTb0z04tvsMqMMezpfPx30zJ-AqAh4PGBEqQeSwEX4IDiEQbQgkkQa5B0sgfUzLe5FDBehlhn2VuQTwucgw4Ah3UXYDoOEUD4V0TPoaymy1LRpIuegfxRqHv1qh8GSwotl-jgZjcKvnw4OemNGViCnmuhAaaIvwv4SJJnDkCRkDmGwJCyDi_DosNNpn3w5OT7rhq2dwMtMKu2PnqYAcQloH542Uo4ljGYziDRdwkBSPVgQHlWyGnFv0LYPOzvJ7zOmacoomjuHdJrob7a4N_N-FJqw4XhaM9Dxaffk5LzT_nL2DkroCtVE-ZPqxSUDiL1lIPJ2zqmGvaBjQZXge49sDdg4MRljlM-daCegQC6JphtKNfIWyRPle9jtnnAyEMphbpByDDICrr0AU4gEj71leCLv6AzcKb3GkQN8tdlvHKOpK5034_0U-kmkB6WXYXOAjzYTMnec5qnImCOlrk7JsyaiIbxWp2_jbrrl2oXVUuDGfl-zR0mfMg0OhHgOjW7GlYqdw7Pzbvfk5OSs3T390uiSFitFI8LuyStNsuSG6kfyDJVmx-fNK3y-0JzyeRO0026CXlEJ_qiBYPEeqAURqgl2etp8DlF-Q3jcj6JMkmhVQs4bp2BI5DMHpVzPdojdEdOUSlqtrPbRO5Tfucxl7IPJ97ALFM-5im5HiBT9iaS3PHo_3EHCtwawi34CkcAo7omBG2Dv0U5gDjwXt3JzBHcA0eKaUD4hLnsZfWBlpaOdRkXaulF3Mn3DqF1HgIeREPi2kTq7IJ5GGnGQ89V0QYFVozluu5AXeg1I6oA0Zq7Dncy9Ls9rxdShnkZBf-pG5akTel3fYSyJqvu4s90GttRutl2SGDYylubVCAzACzGW4v-YozE_2DQFxvwRe0obwowhTODKoHzujHAV0JeJyKqw6Px45_RZaqfZKyIOm2hPIM6itVioeQsXqfMlE9Gz6zhKlLG2F7SvNYmehyKe-02pF2Jdv2mWphIUbgVXBhhMTUDRWqD7uetA_W0Jsn4CHu2Ku9wFVNTOAspI0l3KBsR9LBgNbohpTo1r1M4Syvm8F0tIgGtTHroXDnHMGJ0tj2BCYpqpe9ASqtDwpHFGM8acKgSG0LFSMRYvIAcLrMQpP-p7UqVJjWfGlQT-98qZ_xq5k4ARjzOJ-8dZxibiLTGX2WymgqdsNrujSl-EYRCJ5Ino8l8mFeR_LOKRJsBAqSHRJIjztO8HkZRw3TbVzo3GjmlUQGS0KNhW_64IY08kes7591qmLotPA8IiZUTe8jTTATcF14Sq6Bfqi7XTMFBamlLv6OpqNHi8_THKtaxD1DNl7BfPkicsHdrfas1Orc8JIsEYSRXEF-GMMAVhQOOLcIrYKaCbCQOVPSlLfRH-oPBiOoegCWXKidsNLYuxdV6GT9XnwuknkZGkuArqjEZJiusWYlwFbiqZEuaWMlYTDItwut0sZWvGdVbW2wyI0ibWc-EyMDlhnQm2uA3lNkkJ2zBt3uY81Y-rFKzxto2iVymoFCI6o5G7gWul6DXbFFm4Cw9TPl7H2yYXsC0Dr6PzNiermgL0hlVtm9P6gois1tG2yQVc5grrDMpmwW-oduI0YtCnDJ3Xxsw-CG4WO-XzksCF4T1VkXWMGwy_6QXIoseFU19rWxJTW7unaHeylSlbrJkJW5zGYrLzOtS0uO16urVj8zanaVlLedeOsnqP44m4wWKScRqZZhd8EUKtcTBtjtOYZxdrU2jbnCxR5JZrRsgbnTaaObL7S0Hj7dNms_PDDE3W8Rv0wrziN7ApU0cnXleMqOeN3Za3NcLtzW8T-rumjOrVx5jgfv0YB9y2H-OAoWLihJ5shTGTncFLhSwD2E3Bc1B748tgd28ONiTfG24yBmfXMYQZ5kVv-Y6y62O8pjrjw0yS3buiGtQ7WjmcHe68rKP1Gqjd__ldx_bRZjs-zojy-Y1rvNnIqUyYb4AwvIcX7GMMNy97HKagkReWO7OU8Ljg9s0nym-2ntCK8Nhkb0Msq6oPaTnikKxqfHqtIh3sDQSf0XlA7Dsn5s8UNCZ0Rl7ZYgTYxvV8MMqUFsm9iFWVP3aP_gjELMgNHeBRHAwEX4LUEAdaBDYeCWxA8invCtoGldRRWgT6hUYQEBUkWbQIbBAQpCCR3BRgAhtY4HYKyJNYQnD0x6d_n3X_QPQmhbWjye8jWAgWg8wHMlhgcoo5ltrKa9-in0ZCRgsfwEJEzx70eOdNcQIHQsosxSruQK6mmpjTsmRw1MwhhkTwKyGTLak7QICLpYi_CsCXo9PjdyDG0kVCXuCOv5y6wIpwsYC9px4WETdFnRfvVe1EjXFvlNo5ADZV676rW-1lrBLkgNkynYsgLJT_BGJuiTcnufMeg7zCLhgzL95VyLN3kcVuchdWhuTlGmyfvWcWLEb7TzOivKa5XiF3nmbzLmNtg3Teoy8q0v4DKqFeo9qqmjsPbf0GxkfTvGxVraMdopLyDcRBJiVwvZ6-VkeVE48hnc0AufSTROCExk5n7BsMriVwEsM-PDBK5ID3x8A1W3miTRVy9V3tz4BiPGjqldHzQGRcT4HNakx2TJ-ic8q-zUzcveViCtig8PV0RkGarDUAju9UlHGIppqBySFJxrSNFw4MuPUG2sQYrTLIsKGJ-YePt0kqpA7gFX_GROpVGT1lCq6BgyQa4lsNySO86lwFE-Bgm8qjGnzOY5pALcQLVhuL2Y5AFZpnCux7Zj-BpIIbBKfMxkE5jzwK2hzlTuxBb8qEDqiG5DZG12Yex0_fJ3dYvLfmt7igtLQHJJi-kNQf19kD4ivqBlgC2gNwKeJVUK_zOKGumVgWiY-jGKF96PtJxrzGMaF87jWZBtDxBRz7jBmYzwhM6cJrCBbR8Ub4DMIUWby0sggfrfqe4-57jvoO_JYG0pf8JxkHg5EZh_o3FooJ_VDbdAFSBv9qewBrm--3oH2Utlt4L7FCb-B6rfy0Nu7EeAJ8ehAazA0othZ_esatBNOFeOnHSwxpH4VgqvQzJE2BV0l7DEpTTvJ6NLOFiJ65zyq8TX7HqfPLW-MgriG5s5-0cCGT8mXaev9_MoI1T-s2jJu6gzmJVteQVNoY75Wl6A6vIcHbNXUR9u_uwkDZJnW5Go6nhUdba7zCsGr9MwBbUcj1zV2bLQ_YEeHjowQoRpZCVBYG8E_9e598_doWwqPVLdcgOWHYkX_kg4-d4rnW3cHvfJQGucpvesziFzGOrnt00j3HK270rkSu-usijbW0BKh9DtTN3e73yZ0NPxZap-rPVuvl5eUwJXohZvBKGRxGImmlRCm6hM_mWvszcmr1-_3-5fwWf_o2cik49eynSCpfnljrkTS2q-rgoFfeMRUdQQyvD3YcYUC5Lp-VlsVzzqu1xqzXQvuaqcAJKCYCr8nz2_6ploZRczzztxDFqju2__5rpgif_pen2L3W1rdc_wAeF4mE

Build B:
eNqtW1tz6jgSfk5-hctb-7R1QiD3U2SmCJCEqiSHgeSc3acpxW5AG1nySjIJ8-u3WrKNgRgkMk_YUn_drdalLzLt3z8SFsxBKir4ddg8Og4D4JGIKZ9ehy_Pt98uw99_O2wPiZ79mNxklGFP67fDg7Z5CYiKgMddRpR6Iglch0-CQxhEMyJJpEE-wBxYJ9PiUcRwHWqZYe-SfET4FGQYMKS7DpthkBDKxyJ6A30nRZaaNk3kFPTPQs3jP5thMKfwbpk-j_r98LfDg4P2kJEFyLEmOlCa6OuwMwdJptAjCZlCGMwJy-A6PD5qtZqnl6cnF2dhYyvwJpNK-6PHKUBcAppH57WUQwn9yQQiTefQlVR3Z4RHS1m1uE9om0etreSPGdM0ZRTNnUNadfT3G9zreT8LTVhvOK4Y6OT87PT0qtW8vNiBEnqJqqP8RfXshgHE3jIQOZhyqmEv6FBQJfjeI1sB1k5MxhjlUyfaESiQc6LpmlK1vEXySvkednsknHSFcpgbpByCjIBrL8AYIsFjbxmeyAc6AXdKr3HkAF9t9htHf-xK5814P4V-EelB6WXYHOCjzYhMHad5LDLmSKmXp-RFHVEPPpanb-1uGnDtwmoucGPv1uxZ0tdMgwMhnkP9-2FJeX56dH520Tq7uji9uDy9qnVJs4WiEWGP5IMmWXJP9TN5g6VmzeZJ_RKfzjSnfFqHvTitg95SCf6ormDxHqgZEaoOdnlZfxBRfk943ImiTJJoUUKuauegR-QbB6VcD3eI3RHjlEq6XFrN4x2UL1zmMvbB5JvYBYoH3XLRbQuSou9IO-DR7oAHCT8ZwflWwAgigYHcKwNHxN4DHsEUeC5v4eYMHgCi2R2hfERc9jP6weUqPdlqVqStmnUr00_MWs9-FeBhJAR-bqSTo63SPM3U5yCni_GMAluO5_TchbzQrEtSB6QxdBXuZPBVeV5rpgr1NAp6VTcqT53Q9_oOY05U1dNdbDewpXaz7ZzEsJa31K9HYABeiKEU_8VMjfnBxikw5o_YU1oPJgxhAlcG5VNnhKuAjkxEVkkht-8PS-00e0XcYdPtEcRZ5BYRlQn0DRPRm-s4SpSxthe0ozWJ3noinvpNqRdiVb9xlqYSFG4FVwYYUY1A0Uq4--3MgfrHHGT1BDzeFny5C1hSOwsow0l3KWsQ97FgSLgmxoXYWUA5nY9iDglwbWpEj6JyLB9dXWwpEyngEYxITDP1CFrCMkKsj6kzxpwqBYbQsWIxFO8guzOsyCk_6keyTJdqPf6tBP7Xwpn_CrmTgD6PM4k7yFnGOuIzMTfZZKKC12wyeaBKX4dhEInklejyLZMK8heLeKYJMFCqRzQJ4jz9-0kkJVw3TdVzrbFlGhUQGc0Ktsu3W8LYK4necv7thqnP4lOXsEgZkQOeZjrgpvCaUBX9ifpiDTUMlJam5Nu_ve13nwc_-7mWVYh6o4z9ybPkFUuI9hd1spRj63WCSDBGUgXxdTghTEEY0Pg6HCN2DOhowkBlr8pSX4c_Kbybzh5oQply4nZPy6JslZfhs-xz4fSLyEhSXAVVRv0kxXULMa4CN5VMKXNDGasJBkY43W6WsrXjKivrb7pEaRPtuXDpmtSwygRb3IYySFLC1kybtzlP9fMiBWu8TaPoRQoqhYhOaORu4EpJesU2RTLuwsOUkVfxtskFbMvBq-i8zcmqphC9ZlXb5rS-ICKLVbRtcgGX2cIqg7JZ8HuqnTj1GXQoQ_-1NrNPgpvFTvm0JHBh-EhVZH3jGsMfegay6HHh1NHalsbUxu4p2p1sZaoXK2bCFqexmAy9CjUtbruebuzYvM1pWlaS3pWjrNrjeCKusRhlnEam2QVfBFErHEyb4zTm-cXKFNo2J0sU2eWKEfJGp41mjuzOXNB487RZ7_wyQ5N3_A16YWbxN7Apk0cnXreMqLe13Za31cLtDXAd-kVTRvXia0xwv36NA27br3HAUDFxQo82wpjR1uBliSwD2HXBU1B748tgd28ONiTfG24yBmfX0YMJ5kWf-Y6y62u8xjrjvUyS7btiOagdWjmcHe68rKP1Gqjd__mVx-bRZju-zojy6b1rvFnLqcyZ74EwvI8X7GsM1-98HKaglhcWPLOU8Ljg9sMnyq-3ntCK8Nhkbz0srKovadnnkCwqfNqNIh1sdwWf0GlA7Lcn5mUMGhM6I69sMQJs42o-GGVKi-RRxGqZP3YFn4PUwenxPwMxCRJr8MBGIYENQwItyg48aQ8xBA1a2xBEBfChJQmqkYBJ1SOYCRaDzHXqzjDPxHRJbaSon9GPIyGjmQ9gJqI3D3q8xqY4F10hZZZiSbYrF2NNzMFXMjiu5xBDIvitkMmG1C0gwHkvQqkCcHl8frIDYkpbRW5d4E4uz11gReRXwHaphxXBdVFXxfXcVtQQl3mpnQNgXbWznbpVvq8qQQ6YDdO5CMKq9y8g5t53fZJbuxjk5XLBmPmWbom82ImkSq-OcKewMrou12DzYpdZsLLsP82I8prmarnbeZrN54mVDdLaRV-Ul_0HVEK9RrVRAnce2up1io-meQVquY62iErKjwq7mZTA9WomujyqnHj06GQCyKWTJAInNHY6Yz9hcCeBkxj24YEBHwe8DAau2cITbQqKixe1PwOKoZ0pPUZvXZFxPQY2qTDZMn2KTin7MTEh9IaLKWDdwm3TCQVpEtAAOH4jUYYUmmoGJh0kGdPW9R8YcOMTtAkXGmW8YKMM84aPgyQVUgfwgT9DIvWiDIQyBXfAQRIN8UBD8gwfOlfBxCrYpvIABZ_z8CRQM_GOhcNitiNQheaZAvvp2C8gqeAGwSmzIQ3yqEYzIyKpXnwPXp4Gf7z0D5_gPUCSw2eiNU5BMBKvcLgSiXwPmq3Lwz8ywgzy-NCcICP4Hz4PkpTRiGqFL_9qHh9XI50VNsaWjyI2R3auUiDxBe-Bii9UGqhNqfkyFFufn62jPmiPmdAB1ZAMYnTK5nH4-jJ6wBsEu3AsLijXiAckGL-T1B_X2gPiK-oeWAL6U0DzU8CNiBdrIaaDmDsm5kX25QS4EUL70HeSjNWM43PAiPKp12QaQMsXcOIzZmA-IzD1E68hWETLG-EzCFPp8dLKIny06niOu-M56gfwWxpIX_IfZRwMRmYcqn_4UEzop8qmC5Ay-EfTA1jZfH8L2kdpu4X3Eiv0Gs4e24UjND4Mn56EBnMNi63FS9s4xGA8E--deI7B-LMQTJUekqQp8GXlIAalKSd5UZzZakjbXKoVfjK_aNX5DbJxEHeQPNj_13Ahk_LL3mp_7tGs2zAO9gGmJFrcQbLUxvjdLEVHfgcJXvGp67Dz8BAGyjapm0VvOC588UrjLbq91f8k2LJGrm_u2myNwo4IH58lQDGyFKKyOoEv1T8f5evXthAeLQZcg-SEYUf-jyN8bBXPle4W_ulIaZCL_LrJLH4R4-jOjk_PrvCeHb0rkYvOqkhjLS0BKv9NOsvd7svowQZOM61T9b3ReH9_P0qJnokJfFAGR5FIGilRis7hm7lb_4acGp1Op3MzHeBPx8ZcBae2_V-UypcnFpwkje2qOjholxddRUcQw8eTHUcYUK7LZ6Vl8ZzzaqwwazfQvmYqcAKKicC7-vyTg7GWhlF9JPaXEMWqO7Fv_zZThE__yYsD7cbGH8v-D6XvsSc=
Screenshots

No response

Langage dominant
Lua
Étoiles
1.9k
Forks
461
Merge moyen
1 h 2 min
PR mergées (30 j)
1

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de PathOfBuildingCommunity/PathOfBuilding-PoE2

Toutes les issues de PathOfBuildingCommunity/PathOfBuilding-PoE2

Issues similaires

Plus d'issues Lua

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.