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]")