From 0151eb46b92e649cddaa47f3af770dfeae16ae49 Mon Sep 17 00:00:00 2001 From: Fikou <23585223+Fikou@users.noreply.github.com> Date: Wed, 28 Dec 2022 13:37:36 +0100 Subject: [PATCH] some modsuits now have some modules pinned by default (#72258) ## About The Pull Request cleans up some modsuit code i dont like about their modules removes mod theme blacklists, they are unused and weve not needed them at all so far adds support for premade suits to have modules they pin by default the default pins currently are: advanced suit: jetpack loader suit: clamp, magnet, hydraulic arms mining suit: sphere transformation safeguard suit: jetpack magnate suit: advanced jetpack traitor suit: armor booster, jetpack elite traitor suit: armor booster, advanced jetpack nukie suit: armor booster, advanced jetpack elite nukie suit: armor booster, advanced jetpack spetsnaz pyro suit: armor booster, advanced jetpack, flamethrower prototype suit: tether, kinesis apocryphal suit: jetpack chrono suit: timestopper, rewinder, timeline jumper, kinesis plus, timeline eradication ninja suit: advanced stealth, star dispenser, emp pulse, weapon recall, adrenaline boost, energy net ## Why It's Good For The Game quickens some stuff up ## Changelog :cl: qol: some modsuits now have some modules pinned by default /:cl: --- code/modules/mod/mod_control.dm | 19 ++-- code/modules/mod/mod_theme.dm | 2 - code/modules/mod/mod_types.dm | 148 ++++++++++++++++++++++------- code/modules/mod/mod_ui.dm | 2 +- code/modules/ninja/outfit.dm | 2 - code/modules/unit_tests/modsuit.dm | 5 +- 6 files changed, 125 insertions(+), 53 deletions(-) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 87555132083..5cf5126f57a 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -78,8 +78,6 @@ var/list/mod_parts = list() /// Associated list of parts that can overslot to their overslot (overslot means the part can cover another layer of clothing). var/list/overslotting_parts = list() - /// Modules the MOD should spawn with. - var/list/initial_modules = list() /// Modules the MOD currently possesses. var/list/modules = list() /// Currently used module. @@ -87,7 +85,7 @@ /// AI mob inhabiting the MOD. var/mob/living/silicon/ai/ai /// Delay between moves as AI. - var/movedelay = 0 + var/static/movedelay = 0 /// Cooldown for AI moves. COOLDOWN_DECLARE(cooldown_mod_move) /// Person wearing the MODsuit. @@ -95,6 +93,8 @@ /obj/item/mod/control/Initialize(mapload, datum/mod_theme/new_theme, new_skin, obj/item/mod/core/new_core) . = ..() + if(!movedelay) + movedelay = CONFIG_GET(number/movedelay/run_delay) if(new_theme) theme = new_theme theme = GLOB.mod_themes[theme] @@ -105,7 +105,6 @@ complexity_max = theme.complexity_max ui_theme = theme.ui_theme charge_drain = theme.charge_drain - initial_modules += theme.inbuilt_modules wires = new /datum/wires/mod(src) if(length(req_access)) locked = TRUE @@ -136,12 +135,11 @@ RegisterSignal(part, COMSIG_PARENT_QDELETING, PROC_REF(on_part_deletion)) set_mod_skin(new_skin || theme.default_skin) update_speed() - for(var/obj/item/mod/module/module as anything in initial_modules) - module = new module(src) - install(module) RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) RegisterSignal(src, COMSIG_SPEED_POTION_APPLIED, PROC_REF(on_potion)) - movedelay = CONFIG_GET(number/movedelay/run_delay) + for(var/obj/item/mod/module/module as anything in theme.inbuilt_modules) + module = new module(src) + install(module) /obj/item/mod/control/Destroy() if(active) @@ -533,11 +531,6 @@ balloon_alert(user, "[new_module] incompatible with [old_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return - if(is_type_in_list(new_module, theme.module_blacklist)) - if(user) - balloon_alert(user, "[src] doesn't accept [new_module]!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return var/complexity_with_module = complexity complexity_with_module += new_module.complexity if(complexity_with_module > complexity_max) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 6525ad9cb5f..b77a2def819 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -45,8 +45,6 @@ var/ui_theme = "ntos" /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity. var/list/inbuilt_modules = list() - /// Modules blacklisted from the MOD. - var/list/module_blacklist = list() /// Allowed items in the chestplate's suit storage. var/list/allowed_suit_storage = list() /// List of skins with their appropriate clothing flags. diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index bab16b544d3..e1bc5985e44 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -5,17 +5,41 @@ var/applied_core = /obj/item/mod/core/standard /// The cell we apply to the core. Only applies to standard core suits. var/applied_cell = /obj/item/stock_parts/cell/high + /// List of modules we spawn with. + var/list/applied_modules = list() + /// Modules that we pin when the suit is installed for the first time, for convenience, can be applied or theme inbuilt modules. + var/list/default_pins = list() /obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin, new_core) + for(var/module_to_pin in default_pins) + default_pins[module_to_pin] = list() new_skin = applied_skin new_core = new applied_core(src) if(istype(new_core, /obj/item/mod/core/standard)) var/obj/item/mod/core/standard/cell_core = new_core cell_core.cell = new applied_cell() - return ..() + . = ..() + for(var/obj/item/mod/module/module as anything in applied_modules) + module = new module(src) + install(module) + +/obj/item/mod/control/pre_equipped/set_wearer(mob/living/carbon/human/user) + . = ..() + for(var/obj/item/mod/module/module as anything in modules) + if(!default_pins[module.type]) //this module isnt meant to be pinned by default + continue + if(REF(wearer) in default_pins[module.type]) //if we already had pinned once to this user, don care anymore + continue + default_pins[module.type] += REF(wearer) + module.pin(wearer) + +/obj/item/mod/control/pre_equipped/uninstall(obj/item/mod/module/old_module, deleting) + . = ..() + if(default_pins[old_module.type]) + default_pins -= old_module /obj/item/mod/control/pre_equipped/standard - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, @@ -23,7 +47,7 @@ /obj/item/mod/control/pre_equipped/engineering theme = /datum/mod_theme/engineering - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, @@ -33,7 +57,7 @@ /obj/item/mod/control/pre_equipped/atmospheric theme = /datum/mod_theme/atmospheric - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, @@ -44,37 +68,48 @@ /obj/item/mod/control/pre_equipped/advanced theme = /datum/mod_theme/advanced applied_cell = /obj/item/stock_parts/cell/super - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, ) + default_pins = list( + /obj/item/mod/module/jetpack, + ) /obj/item/mod/control/pre_equipped/loader theme = /datum/mod_theme/loader - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/paper_dispenser, /obj/item/mod/module/stamp, ) + default_pins = list( + /obj/item/mod/module/clamp/loader, + /obj/item/mod/module/magnet, + /obj/item/mod/module/hydraulic, + ) /obj/item/mod/control/pre_equipped/mining theme = /datum/mod_theme/mining applied_core = /obj/item/mod/core/plasma - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/gps, /obj/item/mod/module/orebag, /obj/item/mod/module/clamp, /obj/item/mod/module/drill, ) + default_pins = list( + /obj/item/mod/module/sphere_transform, + ) /obj/item/mod/control/pre_equipped/medical theme = /datum/mod_theme/medical - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, @@ -84,7 +119,7 @@ /obj/item/mod/control/pre_equipped/rescue theme = /datum/mod_theme/rescue applied_cell = /obj/item/stock_parts/cell/super - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, @@ -94,7 +129,7 @@ /obj/item/mod/control/pre_equipped/research theme = /datum/mod_theme/research applied_cell = /obj/item/stock_parts/cell/super - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, @@ -104,7 +139,7 @@ /obj/item/mod/control/pre_equipped/security theme = /datum/mod_theme/security - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, @@ -116,7 +151,7 @@ /obj/item/mod/control/pre_equipped/safeguard theme = /datum/mod_theme/safeguard applied_cell = /obj/item/stock_parts/cell/super - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, @@ -125,21 +160,27 @@ /obj/item/mod/module/projectile_dampener, /obj/item/mod/module/pepper_shoulders, ) + default_pins = list( + /obj/item/mod/module/jetpack, + ) /obj/item/mod/control/pre_equipped/magnate theme = /datum/mod_theme/magnate applied_cell = /obj/item/stock_parts/cell/hyper - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/hat_stabilizer, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/pathfinder, ) + default_pins = list( + /obj/item/mod/module/jetpack/advanced, + ) /obj/item/mod/control/pre_equipped/cosmohonk theme = /datum/mod_theme/cosmohonk - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/waddle, /obj/item/mod/module/bikehorn, @@ -148,7 +189,7 @@ /obj/item/mod/control/pre_equipped/traitor theme = /datum/mod_theme/syndicate applied_cell = /obj/item/stock_parts/cell/super - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, @@ -157,11 +198,15 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, ) + default_pins = list( + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/jetpack, + ) /obj/item/mod/control/pre_equipped/traitor_elite theme = /datum/mod_theme/elite applied_cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, @@ -169,33 +214,45 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, ) + default_pins = list( + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/jetpack/advanced, + ) /obj/item/mod/control/pre_equipped/nuclear theme = /datum/mod_theme/syndicate applied_cell = /obj/item/stock_parts/cell/hyper req_access = list(ACCESS_SYNDICATE) - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, ) + default_pins = list( + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/jetpack/advanced, + ) /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite applied_cell = /obj/item/stock_parts/cell/bluespace req_access = list(ACCESS_SYNDICATE) - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, ) + default_pins = list( + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/jetpack/advanced, + ) /obj/item/mod/control/pre_equipped/elite/flamethrower - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, @@ -204,11 +261,16 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/flamethrower, ) + default_pins = list( + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/flamethrower, + ) /obj/item/mod/control/pre_equipped/infiltrator theme = /datum/mod_theme/infiltrator applied_cell = /obj/item/stock_parts/cell/super - initial_modules = list( + applied_modules = list( /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/quick_carry, @@ -218,7 +280,7 @@ /obj/item/mod/control/pre_equipped/enchanted theme = /datum/mod_theme/enchanted applied_core = /obj/item/mod/core/infinite - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield/advanced, @@ -227,7 +289,7 @@ /obj/item/mod/control/pre_equipped/ninja theme = /datum/mod_theme/ninja applied_cell = /obj/item/stock_parts/cell/ninja - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/noslip, /obj/item/mod/module/status_readout, @@ -236,23 +298,35 @@ /obj/item/mod/module/dna_lock/reinforced, /obj/item/mod/module/emp_shield/pulse, ) + default_pins = list( + /obj/item/mod/module/stealth/ninja, + /obj/item/mod/module/dispenser/ninja, + /obj/item/mod/module/emp_shield/pulse, + /obj/item/mod/module/weapon_recall, + /obj/item/mod/module/adrenaline_boost, + /obj/item/mod/module/energy_net, + ) /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype req_access = list(ACCESS_AWAY_GENERAL) - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/tether, ) + default_pins = list( + /obj/item/mod/module/tether, + /obj/item/mod/module/anomaly_locked/kinesis/prebuilt/prototype, + ) /obj/item/mod/control/pre_equipped/responsory theme = /datum/mod_theme/responsory applied_cell = /obj/item/stock_parts/cell/hyper req_access = list(ACCESS_CENT_GENERAL) - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, @@ -265,8 +339,8 @@ var/additional_module = /obj/item/mod/module /obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin, new_core) - initial_modules.Insert(1, insignia_type) - initial_modules.Add(additional_module) + applied_modules.Insert(1, insignia_type) + applied_modules.Add(additional_module) return ..() /obj/item/mod/control/pre_equipped/responsory/commander @@ -299,7 +373,7 @@ /obj/item/mod/control/pre_equipped/responsory/inquisitory applied_skin = "inquisitory" - initial_modules = list( + applied_modules = list( /obj/item/mod/module/anti_magic, /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, @@ -328,19 +402,22 @@ theme = /datum/mod_theme/apocryphal applied_cell = /obj/item/stock_parts/cell/bluespace req_access = list(ACCESS_CENT_SPECOPS) - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, ) + default_pins = list( + /obj/item/mod/module/jetpack, + ) /obj/item/mod/control/pre_equipped/corporate theme = /datum/mod_theme/corporate applied_core = /obj/item/mod/core/infinite req_access = list(ACCESS_CENT_SPECOPS) - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/hat_stabilizer, /obj/item/mod/module/magnetic_harness, @@ -350,7 +427,7 @@ /obj/item/mod/control/pre_equipped/chrono theme = /datum/mod_theme/chrono applied_core = /obj/item/mod/core/infinite - initial_modules = list( + applied_modules = list( /obj/item/mod/module/eradication_lock, /obj/item/mod/module/emp_shield, /obj/item/mod/module/timeline_jumper, @@ -359,11 +436,18 @@ /obj/item/mod/module/tem, /obj/item/mod/module/anomaly_locked/kinesis/plus, ) + default_pins = list( + /obj/item/mod/module/timestopper, + /obj/item/mod/module/timeline_jumper, + /obj/item/mod/module/rewinder, + /obj/item/mod/module/tem, + /obj/item/mod/module/anomaly_locked/kinesis/plus, + ) /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug applied_core = /obj/item/mod/core/infinite - initial_modules = list( //one of every type of module, for testing if they all work correctly + applied_modules = list( //one of every type of module, for testing if they all work correctly /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, @@ -376,7 +460,7 @@ /obj/item/mod/control/pre_equipped/administrative theme = /datum/mod_theme/administrative applied_core = /obj/item/mod/core/infinite - initial_modules = list( + applied_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/welding, diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index eda05225a85..1c35cd4c2ea 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -25,7 +25,7 @@ "description" = module.desc, "module_type" = module.module_type, "module_active" = module.active, - "pinned" = module.pinned_to[user], + "pinned" = module.pinned_to[REF(user)], "idle_power" = module.idle_power_cost, "active_power" = module.active_power_cost, "use_power" = module.use_power_cost, diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index 16d8c4627c7..f91f660a3e8 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -26,8 +26,6 @@ if(!istype(weapon, recall.accepted_type)) return recall.set_weapon(weapon) - for(var/obj/item/mod/module/module as anything in mod.modules) - module.pin(ninja) /datum/outfit/ninja_preview name = "Space Ninja (Preview only)" diff --git a/code/modules/unit_tests/modsuit.dm b/code/modules/unit_tests/modsuit.dm index 42c464e6d6c..0dfc9815117 100644 --- a/code/modules/unit_tests/modsuit.dm +++ b/code/modules/unit_tests/modsuit.dm @@ -5,7 +5,7 @@ var/list/paths = typesof(/obj/item/mod/control/pre_equipped) for(var/modpath in paths) - var/obj/item/mod/control/mod = new modpath() + var/obj/item/mod/control/pre_equipped/mod = new modpath() TEST_ASSERT(mod.theme, "[modpath] spawned without a theme.") TEST_ASSERT(mod.helmet, "[modpath] spawned without a helmet.") TEST_ASSERT(mod.chestplate, "[modpath] spawned without a chestplate.") @@ -14,11 +14,10 @@ var/list/modules = list() var/complexity_max = mod.complexity_max var/complexity = 0 - for(var/obj/item/mod/module/module as anything in mod.initial_modules) + for(var/obj/item/mod/module/module as anything in mod.applied_modules + mod.theme.inbuilt_modules) module = new module() complexity += module.complexity TEST_ASSERT(complexity <= complexity_max, "[modpath] starting modules reach above max complexity.") - TEST_ASSERT(!is_type_in_list(module, mod.theme.module_blacklist), "[modpath] starting modules are in [mod.theme.type] blacklist.") for(var/obj/item/mod/module/module_to_check as anything in modules) TEST_ASSERT(!is_type_in_list(module, module_to_check.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]") TEST_ASSERT(!is_type_in_list(module_to_check, module.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]")