From a078774f6807d930dcbdb6f5dde17dbf1acafcdf Mon Sep 17 00:00:00 2001 From: jodli Date: Tue, 30 Jun 2026 23:57:48 +0200 Subject: [PATCH] feat: add Super Quality Module and let the super-beacon broadcast quality Add a super_quality_module (category = "quality", effect = { quality = 1.0 }) granted by the Creative-tools sweep and stocked by the Creative Provider Chest, giving a guaranteed at-least-+1 quality upgrade on a machine's output. Add "quality" to super_beacon.allowed_effects so a single beacon can distribute the effect, and align its distribution effectivity with the vanilla beacon (1.5 baseline + 0.2 per quality level). Cover both with verify.py behavior assertions. Deliberate data-stage no-ops (labs, empty-ingredient recipes, roboport quality flag) are documented inline. Co-Authored-By: Claude Opus 4.8 --- changelog.txt | 3 ++ defines.lua | 6 ++++ graphics/icons/super-quality-module.png | Bin 0 -> 1959 bytes locale/en/base.cfg | 2 ++ prototypes/entity.lua | 13 +++++++-- prototypes/equipment.lua | 4 +++ prototypes/item.lua | 16 +++++++++++ prototypes/recipe.lua | 12 ++++++++ verify.py | 35 ++++++++++++++++++++++++ 9 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 graphics/icons/super-quality-module.png diff --git a/changelog.txt b/changelog.txt index 02f3166..dbef263 100644 --- a/changelog.txt +++ b/changelog.txt @@ -10,8 +10,11 @@ Date: 2026-06-29 - Add an "Asteroid spawning rate" input to the Game Settings cheats (Space Age only): a global multiplier for how often asteroids spawn around space platforms. Default is 1 (vanilla); set it to 0 to stop asteroids spawning entirely. Applies game-wide, not per surface. - "Create Surface → Blank surface" now creates a genuinely flat, empty test surface (no resources, water, cliffs, trees, decoratives, or enemies; always day) with a floor dropdown: Lab tiles, Concrete, or Refined concrete. - Add an "Ignore surface conditions" on/off Surface Cheat that lets planet-gated buildings be placed and planet-gated recipes crafted on the selected surface(s). + - Add a Super Quality Module: a creative module that guarantees the produced item is upgraded by at least one quality level (the engine's fixed cascade can still push it to +2/+3). It is granted by the normal Creative tools' recipe sweep and stocked by the Creative Provider Chest, alongside the other super modules. + - The Super Beacon now broadcasts the quality effect, so a single beacon fitted with the Super Quality Module can distribute the guaranteed quality upgrade to every nearby crafting machine. Changes: - Move the Surface Cheats menu from the Cheats tab into the Surface tab, grouping it with the surface-creation tools. + - The Super Beacon's distribution effectivity is raised from 0.5 to 1.5 and now scales with quality (+0.2 per level), mirroring the vanilla beacon so a legendary beacon reaches 2.5. Bugfixes: - Fix a crash that broke every fluid feature (Super Boiler, Super Cooler, Configurable Super Boiler, Fluid Void, and the Matter Source/Duplicator on fluid entities) once they held fluid. - Fix a non-recoverable crash ("'inventory index': real number expected got nil") in on_tick when a Matter Source with no filter set faces an assembling machine, rocket silo, or furnace: Factorio 2.0 folded the assembling-machine and furnace input/output inventories into crafter_input/crafter_output, so the mod's references to the removed assembling_machine_input/_output and furnace_result defines resolved to nil. The Matter Void's output-slot path was hit by the same removed defines. diff --git a/defines.lua b/defines.lua index ac46eb8..9a6f3ea 100644 --- a/defines.lua +++ b/defines.lua @@ -220,6 +220,7 @@ creative_mode_defines.names.items = { super_slow_module = creative_mode_defines.name_prefix .. "super-slow-module", super_consumption_module = creative_mode_defines.name_prefix .. "super-consumption-module", super_pollution_module = creative_mode_defines.name_prefix .. "super-pollution-module", + super_quality_module = creative_mode_defines.name_prefix .. "super-quality-module", belt_immunity_equipment = "belt-immunity-equipment", super_fusion_reactor_equipment = creative_mode_defines.name_prefix .. "super-fusion-reactor-equipment", super_personal_roboport_equipment = creative_mode_defines.name_prefix .. "super-personal-roboport-equipment", @@ -307,6 +308,7 @@ creative_mode_defines.names.recipes = { super_slow_module = creative_mode_defines.name_prefix .. "super-slow-module", super_consumption_module = creative_mode_defines.name_prefix .. "super-consumption-module", super_pollution_module = creative_mode_defines.name_prefix .. "super-pollution-module", + super_quality_module = creative_mode_defines.name_prefix .. "super-quality-module", belt_immunity_equipment = creative_mode_defines.name_prefix .. "belt-immunity-equipment", super_fusion_reactor_equipment = creative_mode_defines.name_prefix .. "super-fusion-reactor-equipment", super_personal_roboport_equipment = creative_mode_defines.name_prefix .. "super-personal-roboport-equipment", @@ -1726,6 +1728,10 @@ table.insert( creative_mode_defines.values.creative_provider_chest_additional_content_names, creative_mode_defines.names.items.super_pollution_module ) +table.insert( + creative_mode_defines.values.creative_provider_chest_additional_content_names, + creative_mode_defines.names.items.super_quality_module +) table.insert( creative_mode_defines.values.creative_provider_chest_additional_content_names, diff --git a/graphics/icons/super-quality-module.png b/graphics/icons/super-quality-module.png new file mode 100644 index 0000000000000000000000000000000000000000..0097a5d60e22289ddeddad6fcb9934f3383b6424 GIT binary patch literal 1959 zcmV;Y2Uz%tP)1?Q#sL4m1N6iL{lo|T#sL4r0RFiG?V=O6t_#($1>eR1|Hc6Sn<#RGAW_Bu|HCle z%6yBb3CnaDM#Ey7xMZZhFX^W>v1$x%o*;{&7o(#Lz-tpVVJJw3JB7tU;?0?wXe&L% zG0=-LUAi9N(y?s33-QKQu(y7Ry=;@ocCg1a<>RO5&RWkt2PlfLnxU=&%?Yv+U#XQ4e>W+7XxB(|}FX^0S|QUG178O_OdkGPUj zu$G&(GvLN(m3JHgA_oE;0RS-v0sqqg|H1<*3k63F09hv!eH{X09tScJ0RFlI|IY!s zRy}PP0Xh>5KMMuGYFAMf2DVKwI0peX9u^V=08twizhqJW$pN-fIVu7Ix?M+dFAvCl zb4Mo?bx1Nw76f5MIF(N_(XXYiM=X*m356s9PYVEUCI!D>NwQ{3crYP38U$Jy2Y+M? zV=oOR6AVi#C>DiIUapHC{QH_Y*Gr-yADH#Yqf|bLT45^Ef0%!VNnqf___;j zOjweDefQ^*P8mB=jr)p59SyY2j z061F+W419$g%vta72UlusiQCd|HS^~YuwbJqG&|%z76Q7JMLf^e`hmfR#Kpii)3{s zp@DX8M_`nLl>3wfzqFU<(cWSwWNct>+Qhqil34%u_qDKHk+wVQ00016bW%=J0QOn5 z>pAh}{?d;INcyJ~DR|@D59yrAAiwC{;o@U~5O+v~|faAY#g zp2X(A|L*QLa8wrT!hv8Djpci8vf_gjFRyp@`|cGSIPhNE#*K~Vd9WuL4*{M{@+#^s z8Yn1;3y+HnU&w0zPbZab3_r8=MLxoWOTZF6Q}hW#NlAKrQsJfF+gGly>HgJ8r@p%~ zxn&Oy06LTUSPHC;gP`y;ZTxTR&DXRSwA!g_KTQAP&jx^jL!VA52oDdh3AcTvi`U88 z)^9gyW!k2n>VKa1M**N0U3d1K43{zPEsLiKG( z`TFzW3%gG@H)+4rN#oB}ipxbJqf%9MZWj@7T&aFptIKfR(r-%Fr?m0$vWf24K4nCD zM1EdMp1M#<4-D}5Z`WDy}A@HlWB)1D!bIN%Bu7ziAbEM8e6?M`xX(n z5Cd8>Z;dX=WU{lR<*kM0^e9-~k(1N8koDv2n?wNDxLCD#Yi7K6)Kr&Q6&4khDDKG3 zIh0V-pLKrHn+j;iz9FGHb8aS8ZH|yg!o;w7&Y|oCeRxCG{AL0PkVxBZW+);?`a9up zv0NldtiF?-9hs1j)L_eajY|WVT@CVzlDv}IZV5ack*3tznUoM2nV^sBzgV$_>I$fy z?TxWjYK74#7L`|iDlQ$JE!0OwW)Iw5IN#_;KA0*BV#$axdwysc%}HHNpw^bT{~1$c-S~ypRw72&j60Cndbatl}czk z9%K19MsrM)m^_v_Qk&M8YJ3U7Z2}HEGt))#e4(LvFy`bZV(T$^Vuva>x4Js{i2Nyp zw+Rp(+tcP!lZC?OLD5GRQE#s}Q6a3(Pd4XwML&U%>43OnB~6(wS1Ogo8jDH(VVOKi zk)IqBtyFg<2BJ(lVC@(vvlc6aLZLyej!-Bh5{c$WSw==`S@Gje7%T_ixUUw)_Nfg* zxK7nQW`MFRZCq1q40Isj?En*XdiJ?jd_oT%?CI$VgHb5*I!aQln)KKZE{_4f4UJ16 zI6HZVI0gr~xw*ST8GGi8F;y9{-5K?u!*4-xbaev+61qug#EINbY t!X)!(ID7cRSttfY9%uw(@3P4b{15VLj4o=$Ql