diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index 0cbba32b96..20c68c015b 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -35,7 +35,6 @@
#define MEDAL_HOT_DAMN "Hot Damn!"
#define MEDAL_CAYENNE_DISK "Very Important Piscis"
#define MEDAL_TRAM_SURFER "Tram Surfer"
-#define MEDAL_SPRINGLOCK "The Man Inside the Modsuit"
//Skill medal hub IDs
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index cd2c735e09..2b9fa902e9 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -474,8 +474,6 @@
#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_ALT_AFTERATTACK "item_alt_afterattack" //from base of obj/item/altafterattack(): (atom/target, mob/user, proximity, params)
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
-/// A mob has just unequipped an item.
-#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item"
// Do not grant actions on equip.
#define COMPONENT_NO_GRANT_ACTIONS 1
#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm
deleted file mode 100644
index be1e9b31c8..0000000000
--- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/// from base of atom/movable/Process_Spacemove(): (movement_dir)
-#define COMSIG_MOVABLE_SPACEMOVE "spacemove"
- #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0)
diff --git a/code/__DEFINES/dcs/signals/signals_medical.dm b/code/__DEFINES/dcs/signals/signals_medical.dm
deleted file mode 100644
index 801eb6b41b..0000000000
--- a/code/__DEFINES/dcs/signals/signals_medical.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/// From /datum/surgery/New(): (datum/surgery/surgery, surgery_location (body zone), obj/item/bodypart/targeted_limb)
-#define COMSIG_MOB_SURGERY_STARTED "mob_surgery_started"
-
-/// From /datum/surgery_step/success(): (datum/surgery_step/step, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
-#define COMSIG_MOB_SURGERY_STEP_SUCCESS "mob_surgery_step_success"
-
-/// From /obj/item/shockpaddles/proc/do_success(): (obj/item/shockpaddles/source)
-#define COMSIG_DEFIBRILLATOR_SUCCESS "defib_success"
- #define COMPONENT_DEFIB_STOP (1<<0)
-
-/// From /datum/surgery/can_start(): (mob/source, datum/surgery/surgery, mob/living/patient)
-#define COMSIG_SURGERY_STARTING "surgery_starting"
- #define COMPONENT_CANCEL_SURGERY (1<<0)
- #define COMPONENT_FORCE_SURGERY (1<<1)
diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm
deleted file mode 100644
index 2533b69852..0000000000
--- a/code/__DEFINES/dcs/signals/signals_mod.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-//MODsuit signals
-/// Called when a module is selected to be the active one from on_select(obj/item/mod/module/module)
-#define COMSIG_MOD_MODULE_SELECTED "mod_module_selected"
-/// Called when a MOD deploys one or more of its parts.
-#define COMSIG_MOD_DEPLOYED "mod_deployed"
-/// Called when a MOD retracts one or more of its parts.
-#define COMSIG_MOD_RETRACTED "mod_retracted"
-/// Called when a MOD is finished toggling itself.
-#define COMSIG_MOD_TOGGLED "mod_toggled"
-/// Called when a MOD activation is called from toggle_activate(mob/user)
-#define COMSIG_MOD_ACTIVATE "mod_activate"
- /// Cancels the suit's activation
- #define MOD_CANCEL_ACTIVATE (1 << 0)
-/// Called when a MOD finishes having a module removed from it.
-#define COMSIG_MOD_MODULE_REMOVED "mod_module_removed"
-/// Called when a MOD finishes having a module added to it.
-#define COMSIG_MOD_MODULE_ADDED "mod_module_added"
-/// Called when a MOD is having modules removed from crowbar_act(mob/user, obj/crowbar)
-#define COMSIG_MOD_MODULE_REMOVAL "mod_module_removal"
- /// Cancels the removal of modules
- #define MOD_CANCEL_REMOVAL (1 << 0)
-/// Called when a module attempts to activate, however it does. At the end of checks so you can add some yourself, or work on trigger behavior (mob/user)
-#define COMSIG_MODULE_TRIGGERED "mod_module_triggered"
- /// Cancels activation, with no message. Include feedback on your cancel.
- #define MOD_ABORT_USE (1<<0)
-/// Called when a module activates, after all checks have passed and cooldown started.
-#define COMSIG_MODULE_ACTIVATED "mod_module_activated"
-/// Called when a module deactivates, after all checks have passed.
-#define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated"
-/// Called when a module is used, after all checks have passed and cooldown started.
-#define COMSIG_MODULE_USED "mod_module_used"
-/// Called when the MODsuit wearer is set.
-#define COMSIG_MOD_WEARER_SET "mod_wearer_set"
-/// Called when the MODsuit wearer is unset.
-#define COMSIG_MOD_WEARER_UNSET "mod_wearer_unset"
diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm
deleted file mode 100644
index 848458f91c..0000000000
--- a/code/__DEFINES/dcs/signals/signals_reagent.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-///Sent by /datum/reagents/proc/reaction, used for /obj/item/mod/module/springlock
-#define COMSIG_ATOM_EXPOSE_REAGENTS "atom_expose_reagents"
diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm
deleted file mode 100644
index 0e380f9e95..0000000000
--- a/code/__DEFINES/mod.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/// Default value for the max_complexity var on MODsuits
-#define DEFAULT_MAX_COMPLEXITY 15
-
-/// Default cell drain per process on MODsuits
-#define DEFAULT_CHARGE_DRAIN 5
-
-/// Default time for a part to seal
-#define MOD_ACTIVATION_STEP_TIME (2 SECONDS)
-
-/// Passive module, just acts when put in naturally.
-#define MODULE_PASSIVE 0
-/// Usable module, does something when you press a button.
-#define MODULE_USABLE 1
-/// Toggle module, you turn it on/off and it does stuff.
-#define MODULE_TOGGLE 2
-/// Actively usable module, you may only have one selected at a time.
-#define MODULE_ACTIVE 3
-
-//Defines used by the theme for clothing flags and similar
-#define CONTROL_LAYER "control_layer"
-#define HELMET_FLAGS "helmet_flags"
-#define CHESTPLATE_FLAGS "chestplate_flags"
-#define GAUNTLETS_FLAGS "gauntlets_flags"
-#define BOOTS_FLAGS "boots_flags"
-
-#define UNSEALED_LAYER "unsealed_layer"
-#define UNSEALED_CLOTHING "unsealed_clothing"
-#define SEALED_CLOTHING "sealed_clothing"
-#define UNSEALED_INVISIBILITY "unsealed_invisibility"
-#define SEALED_INVISIBILITY "sealed_invisibility"
-#define UNSEALED_COVER "unsealed_cover"
-#define SEALED_COVER "sealed_cover"
-#define CAN_OVERSLOT "can_overslot"
-
-//Defines used to override MOD clothing's icon and worn icon files in the skin.
-#define MOD_ICON_OVERRIDE "mod_icon_override"
-#define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override"
-
-/// Global list of all /datum/mod_theme
-GLOBAL_LIST_INIT(mod_themes, setup_mod_themes())
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index eda8089a5b..4e97723676 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -158,18 +158,6 @@
#define TRAIT_CALCIUM_HEALER "calcium_healer"
#define TRAIT_MAGIC_CHOKE "magic_choke"
#define TRAIT_CAPTAIN_METABOLISM "captain-metabolism"
-/// Like antimagic, but doesn't block the user from casting
-#define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock"
-/// Gives us turf, mob and object vision through walls
-#define TRAIT_XRAY_VISION "xray_vision"
-/// Gives us mob vision through walls and slight night vision
-#define TRAIT_THERMAL_VISION "thermal_vision"
-/// Gives us turf vision through walls and slight night vision
-#define TRAIT_MESON_VISION "meson_vision"
-/// Gives us Night vision
-#define TRAIT_TRUE_NIGHT_VISION "true_night_vision"
-/// Lets us scan reagents
-#define TRAIT_REAGENT_SCANNER "reagent_scanner"
#define TRAIT_ABDUCTOR_TRAINING "abductor-training"
#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training"
#define TRAIT_SURGEON "surgeon"
@@ -225,6 +213,8 @@
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
#define TRAIT_FREESPRINT "free_sprinting"
+#define TRAIT_XRAY_VISION "xray_vision"
+#define TRAIT_THERMAL_VISION "thermal_vision"
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
#define TRAIT_NO_INTERNALS "no-internals"
#define TRAIT_TOXIC_ALCOHOL "alcohol_intolerance"
@@ -389,5 +379,3 @@
#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint"
#define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint"
#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched"
-/// Trait applied by MODsuits.
-#define MOD_TRAIT "mod"
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 53366d23a6..b41b7356a8 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -51,8 +51,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/airlock_painter = 1,
/obj/item/stack/cable_coil/random = 4,
/obj/item/stack/cable_coil/random/five = 6,
- /obj/item/mod/construction/broken_core = 5,
- /obj/item/mod/module/springlock = 1,
/obj/item/stack/medical/suture = 1,
/obj/item/stack/rods/ten = 9,
/obj/item/stack/rods/twentyfive = 1,
diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm
index b438afaec8..935379b721 100644
--- a/code/_onclick/hud/radial.dm
+++ b/code/_onclick/hud/radial.dm
@@ -91,8 +91,6 @@ GLOBAL_LIST_EMPTY(radial_menus)
else
py_shift = 32
restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth.
- else if(hudfix_method && AM.loc)
- anchor = get_atom_on_turf(anchor)
//Sets defaults
//These assume 45 deg min_angle
diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm
index ace74c13a8..5ad337445b 100644
--- a/code/datums/achievements/misc_achievements.dm
+++ b/code/datums/achievements/misc_achievements.dm
@@ -171,9 +171,3 @@
desc = "Lights out, guerilla radio!"
database_id = MEDAL_TRAM_SURFER
icon = "tram_surfer"
-
-/datum/award/achievement/misc/springlock
- name = "The Man Inside the MODsuit"
- desc = "Ignore the warning label on a springlock MODsuit."
- database_id = MEDAL_SPRINGLOCK
- icon = "springlock"
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index fd72964505..ad37f770ed 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -554,19 +554,6 @@
subcategory = CAT_MISCELLANEOUS
category = CAT_MISCELLANEOUS
-/datum/crafting_recipe/mod_core
- name = "MOD core"
- result = /obj/item/mod/construction/core
- tools = list(TOOL_SCREWDRIVER)
- time = 10 SECONDS
- reqs = list(/obj/item/stack/cable_coil = 5,
- /obj/item/stack/rods = 2,
- /obj/item/stack/sheet/glass = 1,
- /obj/item/organ/heart = 1
- )
- subcategory = CAT_MISCELLANEOUS
- category = CAT_MISCELLANEOUS
-
//////////////
//Banners/////
//////////////
diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm
deleted file mode 100644
index b5805557ea..0000000000
--- a/code/datums/wires/mod.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/datum/wires/mod
- holder_type = /obj/item/mod/control
- proper_name = "MOD control unit"
-
-/datum/wires/mod/New(atom/holder)
- wires = list(WIRE_HACK, WIRE_DISABLE, WIRE_SHOCK, WIRE_INTERFACE)
- add_duds(2)
- ..()
-
-/datum/wires/mod/interactable(mob/user)
- if(!..())
- return FALSE
- var/obj/item/mod/control/mod = holder
- return mod.open
-
-/datum/wires/mod/get_status()
- var/obj/item/mod/control/mod = holder
- var/list/status = list()
- status += "The orange light is [mod.seconds_electrified ? "on" : "off"]."
- status += "The red light is [mod.malfunctioning ? "off" : "blinking"]."
- status += "The green light is [mod.locked ? "on" : "off"]."
- status += "The yellow light is [mod.interface_break ? "off" : "on"]."
- return status
-
-/datum/wires/mod/on_pulse(wire)
- var/obj/item/mod/control/mod = holder
- switch(wire)
- if(WIRE_HACK)
- mod.locked = !mod.locked
- if(WIRE_DISABLE)
- mod.malfunctioning = TRUE
- if(WIRE_SHOCK)
- mod.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME
- if(WIRE_INTERFACE)
- mod.interface_break = !mod.interface_break
-
-/datum/wires/mod/on_cut(wire, mend)
- var/obj/item/mod/control/mod = holder
- switch(wire)
- if(WIRE_HACK)
- if(!mend)
- mod.req_access = list()
- if(WIRE_DISABLE)
- mod.malfunctioning = !mend
- if(WIRE_SHOCK)
- if(mend)
- mod.seconds_electrified = MACHINE_NOT_ELECTRIFIED
- else
- mod.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT
- if(WIRE_INTERFACE)
- mod.interface_break = !mend
-
-/datum/wires/mod/ui_act(action, params)
- var/obj/item/mod/control/mod = holder
- if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr))
- return FALSE
- return ..()
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 1bd795e4f1..11ae19f7fa 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -1,6 +1,6 @@
/obj/machinery/recharge_station
- name = "recharging station"
- desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users."
+ name = "cyborg recharging station"
+ desc = "This device recharges cyborgs and resupplies them with materials."
icon = 'icons/obj/objects.dmi'
icon_state = "borgcharger0"
density = FALSE
@@ -10,7 +10,7 @@
req_access = list(ACCESS_ROBOTICS)
state_open = TRUE
circuit = /obj/item/circuitboard/machine/cyborgrecharger
- occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human)
+ occupant_typecache = list(/mob/living/silicon/robot)
var/recharge_speed
var/repairs
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index ca57e8457a..74a05a1e7b 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -10,15 +10,11 @@
var/obj/item/clothing/suit/space/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
var/obj/item/clothing/mask/mask = null
- var/obj/item/mod/control/mod = null
var/obj/item/storage = null
var/suit_type = null
var/helmet_type = null
var/mask_type = null
- /// What type of MOD the unit starts with when spawned.
- var/mod_type = null
- /// What type of additional item the unit starts with when spawned.
var/storage_type = null
state_open = FALSE
@@ -31,8 +27,6 @@
var/uv_cycles = 6
var/message_cooldown
var/breakout_time = 300
- /// How fast it charges cells in a suit
- var/charge_rate = 250
/obj/machinery/suit_storage_unit/standard_unit
suit_type = /obj/item/clothing/suit/space/eva
@@ -44,50 +38,21 @@
mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/tank/jetpack/oxygen/captain
-/obj/machinery/suit_storage_unit/captainmod
- mask_type = /obj/item/clothing/mask/gas/sechailer
- storage_type = /obj/item/tank/jetpack/oxygen/captain
- mod_type = /obj/item/mod/control/pre_equipped/magnate
-
/obj/machinery/suit_storage_unit/engine
suit_type = /obj/item/clothing/suit/space/hardsuit/engine
mask_type = /obj/item/clothing/mask/breath
storage_type= /obj/item/clothing/shoes/magboots
-/obj/machinery/suit_storage_unit/enginemod
- mask_type = /obj/item/clothing/mask/breath
- mod_type = /obj/item/mod/control/pre_equipped/engineering
-
-/obj/machinery/suit_storage_unit/atmos
- suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
- mask_type = /obj/item/clothing/mask/breath
- storage_type = /obj/item/watertank/atmos
-
-/obj/machinery/suit_storage_unit/atmosmod
- mask_type = /obj/item/clothing/mask/breath
- storage_type = /obj/item/watertank/atmos
- mod_type = /obj/item/mod/control/pre_equipped/atmospheric
-
/obj/machinery/suit_storage_unit/ce
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite
mask_type = /obj/item/clothing/mask/breath
storage_type= /obj/item/clothing/shoes/magboots/advance
-/obj/machinery/suit_storage_unit/cemod
- mask_type = /obj/item/clothing/mask/breath
- storage_type = /obj/item/clothing/shoes/magboots/advance
- mod_type = /obj/item/mod/control/pre_equipped/advanced
-
/obj/machinery/suit_storage_unit/security
suit_type = /obj/item/clothing/suit/space/hardsuit/security
mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/tank/jetpack/oxygen/security
-/obj/machinery/suit_storage_unit/securitymod
- mask_type = /obj/item/clothing/mask/gas/sechailer
- mod_type = /obj/item/mod/control/pre_equipped/security
-
-
/obj/machinery/suit_storage_unit/hos
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
mask_type = /obj/item/clothing/mask/gas/sechailer
@@ -98,11 +63,6 @@
mask_type = /obj/item/clothing/mask/gas
storage_type = /obj/item/watertank/atmos
-/obj/machinery/suit_storage_unit/hosmod
- mask_type = /obj/item/clothing/mask/gas/sechailer
- storage_type = /obj/item/tank/internals/oxygen
- mod_type = /obj/item/mod/control/pre_equipped/safeguard
-
/obj/machinery/suit_storage_unit/mining
suit_type = /obj/item/clothing/suit/hooded/explorer/standard
mask_type = /obj/item/clothing/mask/gas/explorer
@@ -111,16 +71,6 @@
suit_type = /obj/item/clothing/suit/space/hardsuit/mining
mask_type = /obj/item/clothing/mask/breath
-/obj/machinery/suit_storage_unit/mining/evahos
- suit_type = null
- mask_type = /obj/item/clothing/mask/breath
- mod_type = /obj/item/mod/control/pre_equipped/mining
-
-/obj/machinery/suit_storage_unit/medicalmod
- mask_type = /obj/item/clothing/mask/breath/medical
- storage_type = /obj/item/tank/internals/oxygen
- mod_type = /obj/item/mod/control/pre_equipped/medical
-
/obj/machinery/suit_storage_unit/cmo
suit_type = /obj/item/clothing/suit/space/hardsuit/medical
mask_type = /obj/item/clothing/mask/breath
@@ -131,29 +81,15 @@
helmet_type = /obj/item/clothing/head/helmet/space/eva/paramedic
mask_type = /obj/item/clothing/mask/breath
-/obj/machinery/suit_storage_unit/cmomod
- mask_type = /obj/item/clothing/mask/breath/medical
- storage_type = /obj/item/tank/internals/oxygen
- mod_type = /obj/item/mod/control/pre_equipped/rescue
-
/obj/machinery/suit_storage_unit/rd
suit_type = /obj/item/clothing/suit/space/hardsuit/rd
mask_type = /obj/item/clothing/mask/breath
-/obj/machinery/suit_storage_unit/rdmod
- mask_type = /obj/item/clothing/mask/breath
- mod_type = /obj/item/mod/control/pre_equipped/research
-
/obj/machinery/suit_storage_unit/syndicate
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
mask_type = /obj/item/clothing/mask/gas/syndicate
storage_type = /obj/item/tank/jetpack/oxygen/harness
-/obj/machinery/suit_storage_unit/syndicatemod
- mask_type = /obj/item/clothing/mask/gas/syndicate
- storage_type = /obj/item/tank/jetpack/oxygen/harness
- mod_type = /obj/item/mod/control/pre_equipped/nuclear
-
/obj/machinery/suit_storage_unit/ert/command
suit_type = /obj/item/clothing/suit/space/hardsuit/ert
mask_type = /obj/item/clothing/mask/breath
@@ -193,8 +129,6 @@
helmet = new helmet_type(src)
if(mask_type)
mask = new mask_type(src)
- if(mod_type)
- mod = new mod_type(src)
if(storage_type)
storage = new storage_type(src)
update_icon()
@@ -203,7 +137,6 @@
QDEL_NULL(suit)
QDEL_NULL(helmet)
QDEL_NULL(mask)
- QDEL_NULL(mod)
QDEL_NULL(storage)
return ..()
@@ -221,7 +154,7 @@
. += "broken"
else
. += "open"
- if(suit || mod)
+ if(suit)
. += "suit"
if(helmet)
. += "helm"
@@ -242,7 +175,6 @@
helmet = null
suit = null
mask = null
- mod = null
storage = null
occupant = null
@@ -309,8 +241,6 @@
qdel(suit) // Delete everything but the occupant.
mask = null
qdel(mask)
- mod = null
- qdel(mod)
storage = null
qdel(storage)
// The wires get damaged too.
@@ -332,9 +262,6 @@
if(mask)
things_to_clear += mask
things_to_clear += mask.GetAllContents()
- if(mod)
- things_to_clear += mod
- things_to_clear += mod.GetAllContents()
if(storage)
things_to_clear += storage
things_to_clear += storage.GetAllContents()
@@ -352,20 +279,6 @@
if(occupant)
dump_contents()
-/obj/machinery/suit_storage_unit/process(delta_time)
- var/obj/item/stock_parts/cell/cell
- if(mod)
- if(!istype(mod))
- return
- if(!mod.cell)
- return
- cell = mod.cell
- else
- return
-
- use_power(charge_rate * delta_time)
- cell.give(charge_rate * delta_time)
-
/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb)
if(!prob(prb))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
@@ -440,13 +353,6 @@
if(!user.transferItemToLoc(I, src))
return
mask = I
- else if(istype(I, /obj/item/mod/control))
- if(mod)
- to_chat(user, span_warning("The unit already contains a MOD!"))
- return
- if(!user.transferItemToLoc(I, src))
- return
- mod = I
else
if(storage)
to_chat(user, "The auxiliary storage compartment is full!")
@@ -499,10 +405,6 @@
data["mask"] = mask.name
else
data["mask"] = null
- if(mod)
- data["mod"] = mod.name
- else
- data["mod"] = null
if(storage)
data["storage"] = storage.name
else
@@ -533,7 +435,7 @@
if("uv")
if(occupant && safeties)
return
- else if(!helmet && !mask && !mod && !suit && !storage && !occupant)
+ else if(!helmet && !mask && !suit && !storage && !occupant)
return
else
if(occupant)
@@ -545,7 +447,7 @@
if(!state_open)
return
- var/static/list/valid_items = list("helmet", "suit", "mask", "mod", "storage")
+ var/static/list/valid_items = list("helmet", "suit", "mask", "storage")
var/item_name = params["item"]
if(item_name in valid_items)
var/obj/item/I = vars[item_name]
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 7a953089a5..0dcc23f3aa 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
- if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(I = src))
+ if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
return
. = FALSE
@@ -428,7 +428,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
- if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
+ if(!user.temporarilyRemoveItemFromInventory(src))
return
pickup(user)
@@ -1271,7 +1271,3 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE)
for(var/datum/action/current_action as anything in actions)
current_action.UpdateButtonIcon(status_only, force)
-
-/// Special stuff you want to do when an outfit equips this item.
-/obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
- return
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index aea961860d..f680d0034b 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -461,8 +461,6 @@
cooldown = TRUE
busy = FALSE
update_icon()
- if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP)
- return
if(req_defib)
defib.cooldowncheck(user)
else
@@ -516,8 +514,6 @@
cooldown = TRUE
busy = FALSE
update_icon()
- if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP)
- return
if(!req_defib)
recharge(60)
if(req_defib && (defib.cooldowncheck(user)))
@@ -636,8 +632,6 @@
defib.deductcharge(revivecost)
cooldown = 1
update_icon()
- if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP)
- return
if(req_defib)
defib.cooldowncheck(user)
else
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index 642dc79076..dfd53b3a0d 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -23,21 +23,6 @@
QDEL_NULL(ion_trail)
return ..()
-/obj/item/tank/jetpack/item_action_slot_check(slot)
- if(slot == ITEM_SLOT_BACK)
- return TRUE
-
-/obj/item/tank/jetpack/equipped(mob/user, slot, initial)
- . = ..()
- if(on && slot != ITEM_SLOT_BACK)
- turn_off(user)
-
-/obj/item/tank/jetpack/dropped(mob/user, silent)
- . = ..()
- if(on)
- turn_off(user)
-
-
/obj/item/tank/jetpack/populate_gas()
if(gas_type)
air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)))
@@ -72,7 +57,6 @@
icon_state = "[initial(icon_state)]-on"
ion_trail.start()
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react)
- RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react)
if(full_speed)
user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
else
@@ -110,13 +94,6 @@
else
..()
-/obj/item/tank/jetpack/proc/spacemove_react(mob/user, movement_dir)
- SIGNAL_HANDLER
-
- if(on && (movement_dir || stabilizers))
- return COMSIG_MOVABLE_STOP_SPACEMOVE
-
-
/obj/item/tank/jetpack/improvised
name = "improvised jetpack"
desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
@@ -262,13 +239,9 @@
return
/mob/living/carbon/get_jetpack()
- var/obj/item/I = back
- if(istype(I, /obj/item/tank/jetpack))
- return I
- else if(istype(I, /obj/item/mod/control))
- var/obj/item/mod/control/C = I
- for(var/obj/item/mod/module/jetpack/J in C.modules)
- return J
+ var/obj/item/tank/jetpack/J = back
+ if(istype(J))
+ return J
/mob/living/carbon/human/get_jetpack()
var/obj/item/tank/jetpack/J = ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 289599efb9..4b405ae64a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -32,8 +32,6 @@
new /obj/item/clothing/head/beret/ce/white(src)
new /obj/item/storage/bag/construction(src)
new /obj/item/storage/bag/material(src)
- new /obj/item/mod/construction/armor/advanced(src)
- new /obj/item/mod/module/rad_protection(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 234750ea43..babb047c8d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -64,8 +64,6 @@
new /obj/item/clothing/glasses/hud/health(src)
new /obj/item/pinpointer/crew(src)
new /obj/item/sensor_device(src)
- new /obj/item/mod/construction/armor/rescue(src)
- new /obj/item/mod/module/health_analyzer(src)
return
/obj/structure/closet/secure_closet/CMO
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index a7b0153ef0..135e0685c1 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -31,4 +31,4 @@
new /obj/item/circuitboard/machine/techfab/department/science(src)
new /obj/item/storage/photo_album/RD(src)
new /obj/item/clothing/suit/hooded/wintercoat/rd(src)
- new /obj/item/mod/construction/armor/research(src)
+
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 4a19dcdb8f..d96ad3b0d6 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -17,8 +17,6 @@
new /obj/item/gun/energy/e_gun(src)
new /obj/item/door_remote/captain(src)
new /obj/item/storage/photo_album/Captain(src)
- new /obj/item/mod/construction/armor/magnate(src)
- new /obj/item/mod/module/holster(src)
/obj/structure/closet/secure_closet/hop
name = "\proper head of personnel's locker"
diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm
index 96d9a97b5f..125bfe2034 100644
--- a/code/modules/cargo/packs/science.dm
+++ b/code/modules/cargo/packs/science.dm
@@ -238,14 +238,3 @@
contains = list(/obj/item/raw_anomaly_core/pyro)
crate_name = "raw pyro anomaly"
crate_type = /obj/structure/closet/crate/secure/science
-
-/datum/supply_pack/science/mod_core
- name = "MOD core Crate"
- desc = "Three cores, perfect for any MODsuit construction! Naturally harvested™, of course."
- cost = CARGO_CRATE_VALUE * 3
- access = ACCESS_ROBOTICS
- contains = list(/obj/item/mod/construction/core,
- /obj/item/mod/construction/core,
- /obj/item/mod/construction/core)
- crate_name = "MOD core crate"
- crate_type = /obj/structure/closet/crate/secure/science
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 51659a2904..203c578c2c 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -337,7 +337,6 @@
on_item_dropped(I)
if(I.dropped(src) == ITEM_RELOCATED_BY_DROPPED)
return FALSE
- SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent)
return TRUE
//This is a SAFE proc. Use this instead of equip_to_slot()!
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index daedb7a2b3..e12a28d01a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -27,8 +27,8 @@
if(prob(40))
if(prob(25))
audible_message("You hear something rumbling inside [src]'s stomach...", \
- "You hear something rumbling.", 4,\
- "Something is rumbling inside your stomach!")
+ "You hear something rumbling.", 4,\
+ "Something is rumbling inside your stomach!")
var/obj/item/I = user.get_active_held_item()
if(I && I.force)
var/d = rand(round(I.force / 4), I.force)
@@ -624,21 +624,12 @@
if(M.name == XRAY)
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_in_dark = max(see_in_dark, 8)
-
- if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION))
- lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
- see_in_dark = max(see_in_dark, 8)
-
- if(HAS_TRAIT(src, TRAIT_MESON_VISION))
- sight |= SEE_TURFS
- lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
-
if(HAS_TRAIT(src, TRAIT_THERMAL_VISION))
- sight |= SEE_MOBS
+ sight |= (SEE_MOBS)
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
if(HAS_TRAIT(src, TRAIT_XRAY_VISION))
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
+ sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_in_dark = max(see_in_dark, 8)
if(see_override)
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index e70b1bcc92..ffb8523a9e 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -16,15 +16,9 @@
if(istype(T) && movement_dir && T.allow_thrust(0.01))
return 1
- var/obj/item/I = get_jetpack()
- if(istype(I, /obj/item/tank/jetpack))
- var/obj/item/tank/jetpack/J = I
- if((movement_dir || J.stabilizers) && J.allow_thrust(0.01, src))
- return 1
- else if(istype(I, /obj/item/mod/module/jetpack))
- var/obj/item/mod/module/jetpack/J = I
- if((movement_dir || J.stabilizers) && J.allow_thrust())
- return 1
+ var/obj/item/tank/jetpack/J = get_jetpack()
+ if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src))
+ return 1
/mob/living/carbon/Moved()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 85bef76d98..4c30a1d742 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -304,14 +304,7 @@
if(equip_to_slot_if_possible(thing, ITEM_SLOT_BACK))
update_inv_hands()
return
- var/datum/component/storage/storage = equipped_back.GetComponent(/datum/component/storage)
- if(istype(equipped_back, /obj/item/mod/control))
- var/obj/item/mod/control/C = equipped_back
- for(var/obj/item/mod/module/storage/S in C.modules)
- if(S.stored)
- equipped_back = S.stored
- storage = S.stored.GetComponent(/datum/component/storage)
- if(!storage)
+ if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item
if(!thing)
equipped_back.attack_hand(src)
else
@@ -321,11 +314,10 @@
if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, src))
to_chat(src, "You can't fit anything in!")
return
- var/atom/real_location = storage.real_location()
- if(!real_location.contents.len) // nothing to take out
- to_chat(src, "There's nothing in your [equipped_back.name] to take out!")
+ if(!equipped_back.contents.len) // nothing to take out
+ to_chat(src, "There's nothing in your backpack to take out!")
return
- var/obj/item/stored = real_location.contents[real_location.contents.len]
+ var/obj/item/stored = equipped_back.contents[equipped_back.contents.len]
if(!stored || stored.on_found(src))
return
stored.attack_hand(src) // take out thing from backpack
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 08098b818f..2e9030765a 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -38,8 +38,8 @@
var/can_be_carded = TRUE
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
var/viewalerts = 0
- var/icon/holo_icon //Female is assigned when AI is created.
- var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye.
+ var/icon/holo_icon//Female is assigned when AI is created.
+ var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
var/obj/item/pda/ai/aiPDA
@@ -99,13 +99,6 @@
var/display_icon_override
var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it.
- var/datum/robot_control/robot_control
- /// Station alert datum for showing alerts UI
- var/datum/station_alert/alert_control
- ///remember AI's last location
- var/atom/lastloc
- interaction_range = INFINITY
-
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
. = ..()
if(!target_ai) //If there is no player/brain inside.
@@ -180,21 +173,10 @@
GLOB.ai_list -= src
GLOB.shuttle_caller_list -= src
SSshuttle.autoEvac()
- QDEL_NULL(eyeobj) // No AI, no Eye
- QDEL_NULL(spark_system)
- QDEL_NULL(malf_picker)
- QDEL_NULL(doomsday_device)
- // TODO: Why these no work?
- // QDEL_NULL(robot_control)
- QDEL_NULL(aiMulti)
- // QDEL_NULL(alert_control)
+ qdel(eyeobj) // No AI, no Eye
malfhack = null
- current = null
- Bot = null
- controlled_equipment = null
- linked_core = null
- apc_override = null
- return ..()
+
+ . = ..()
/mob/living/silicon/ai/IgniteMob()
fire_stacks = 0
@@ -428,7 +410,7 @@
if (href_list["ai_take_control"]) //Mech domination
var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"])
- if(controlled_equipment)
+ if(controlled_mech)
to_chat(src, "You are already loaded into an onboard computer!")
return
if(!GLOB.cameranet.checkCameraVis(M))
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 1a7747ce89..d18014f4d6 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -200,13 +200,6 @@
/mob/living/silicon/pai/restrained(ignore_grab)
. = FALSE
-/mob/living/silicon/pai/can_interact_with(atom/target)
- if(istype(target, /obj/item/mod/control)) // A poor workaround for enabling MODsuit control
- var/obj/item/mod/control/C = target
- if(C.ai == src)
- return TRUE
- return ..()
-
// See software.dm for Topic()
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index baa4d87075..507a94b613 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -722,7 +722,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
return pick(protection_sources)
else
return src
- if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (!self && magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC_NO_SELFBLOCK)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
+ if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
return src
//You can buckle on mobs if you're next to them since most are dense
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index cdad94cf3f..90a7aae95e 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -585,7 +585,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
//Can the mob see reagents inside of containers?
/mob/proc/can_see_reagents()
- return stat == DEAD || silicon_privileges || HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and silicons can always see reagents
+ return stat == DEAD || silicon_privileges //Dead guys and silicons can always see reagents
/mob/proc/is_blind()
SHOULD_BE_PURE(TRUE)
diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm
deleted file mode 100644
index ee28771ef1..0000000000
--- a/code/modules/mod/mod_actions.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-/datum/action/item_action/mod
- background_icon_state = "bg_tech_blue"
- icon_icon = 'icons/mob/actions/actions_mod.dmi'
- check_flags = AB_CHECK_CONSCIOUS
- var/obj/item/mod/control/mod
- /// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently.
- var/ai_action = FALSE
-
-/datum/action/item_action/mod/New(Target)
- ..()
- if(!istype(Target, /obj/item/mod/control))
- qdel(src)
- return
- if(ai_action)
- background_icon_state = "bg_tech"
-
-/datum/action/item_action/mod/Grant(mob/user)
- mod = target
- if(ai_action && user != mod.ai)
- return
- else if(!ai_action && user == mod.ai)
- return
- return ..()
-
-/datum/action/item_action/mod/Remove(mob/user)
- if(ai_action && mod && user != mod.ai)
- return
- else if(!ai_action && mod && user == mod.ai)
- return
- return ..()
-
-/datum/action/item_action/mod/Trigger(trigger_flags)
- if(!IsAvailable())
- return FALSE
- if(mod.malfunctioning && prob(75))
- mod.balloon_alert(usr, "button malfunctions!")
- return FALSE
- return TRUE
-
-/datum/action/item_action/mod/deploy
- name = "Deploy MODsuit"
- desc = "Deploy/Conceal a part of the MODsuit."
- button_icon_state = "deploy"
-
-/datum/action/item_action/mod/deploy/Trigger()
- if(!IsAvailable())
- return FALSE
- mod.choose_deploy(usr)
- return TRUE
-
-/datum/action/item_action/mod/deploy/ai
- ai_action = TRUE
-
-/datum/action/item_action/mod/activate
- name = "Activate MODsuit"
- desc = "Activate/Deactivate the MODsuit."
- button_icon_state = "activate"
-
-/datum/action/item_action/mod/activate/Trigger()
- if(!IsAvailable())
- return FALSE
- mod.toggle_activate(usr)
- return TRUE
-
-/datum/action/item_action/mod/activate/ai
- ai_action = TRUE
-
-/datum/action/item_action/mod/module
- name = "Toggle Module"
- desc = "Toggle a MODsuit module."
- button_icon_state = "module"
-
-/datum/action/item_action/mod/module/Trigger()
- if(!IsAvailable())
- return FALSE
- mod.quick_module(usr)
- return TRUE
-
-/datum/action/item_action/mod/module/ai
- ai_action = TRUE
-
-/datum/action/item_action/mod/panel
- name = "MODsuit Panel"
- desc = "Open the MODsuit's panel."
- button_icon_state = "panel"
-
-/datum/action/item_action/mod/panel/Trigger()
- if(!IsAvailable())
- return FALSE
- mod.ui_interact(usr)
- return TRUE
-
-/datum/action/item_action/mod/panel/ai
- ai_action = TRUE
diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm
deleted file mode 100644
index 660f0311d1..0000000000
--- a/code/modules/mod/mod_activation.dm
+++ /dev/null
@@ -1,246 +0,0 @@
-/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted.
-/obj/item/mod/control/proc/choose_deploy(mob/user)
- if(!length(mod_parts))
- return
- var/list/display_names = list()
- var/list/items = list()
- for(var/obj/item/piece as anything in mod_parts)
- display_names[piece.name] = REF(piece)
- var/image/piece_image = image(icon = piece.icon, icon_state = piece.icon_state)
- items += list(piece.name = piece_image)
- var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
- if(!pick)
- return
- var/part_reference = display_names[pick]
- var/obj/item/part = locate(part_reference) in mod_parts
- if(!istype(part) || user.incapacitated())
- return
- if(active || activating)
- balloon_alert(user, "deactivate the suit first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return
- var/parts_to_check = mod_parts - part
- if(part.loc == src)
- deploy(user, part)
- for(var/obj/item/piece as anything in parts_to_check)
- if(piece.loc != src)
- continue
- choose_deploy(user)
- break
- else
- conceal(user, part)
- for(var/obj/item/piece as anything in parts_to_check)
- if(piece.loc == src)
- continue
- choose_deploy(user)
- break
-
-/// Deploys a part of the suit onto the user.
-/obj/item/mod/control/proc/deploy(mob/user, part)
- var/obj/item/piece = part
- if(piece == gauntlets && wearer.gloves)
- gauntlets.overslot = wearer.gloves
- wearer.transferItemToLoc(gauntlets.overslot, gauntlets, force = TRUE)
- if(piece == boots && wearer.shoes)
- boots.overslot = wearer.shoes
- wearer.transferItemToLoc(boots.overslot, boots, force = TRUE)
- if(wearer.equip_to_slot_if_possible(piece, piece.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
- ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT)
- if(!user)
- return TRUE
- wearer.visible_message(span_notice("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss."),
- span_notice("[piece] deploy[piece.p_s()] with a mechanical hiss."),
- span_hear("You hear a mechanical hiss."))
- playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- return TRUE
- else if(piece.loc != src)
- if(!user)
- return FALSE
- balloon_alert(user, "[piece] already deployed!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- else
- if(!user)
- return FALSE
- balloon_alert(user, "bodypart clothed!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
-
-/// Retract a part of the suit from the user
-/obj/item/mod/control/proc/conceal(mob/user, part)
- var/obj/item/piece = part
- REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT)
- if(wearer)
- wearer.transferItemToLoc(piece, src, force = TRUE)
- if(piece == gauntlets)
- gauntlets.show_overslot()
- if(piece == boots)
- boots.show_overslot()
- if(!user)
- return
- wearer.visible_message(span_notice("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss."),
- span_notice("[piece] retract[piece.p_s()] back into [src] with a mechanical hiss."),
- span_hear("You hear a mechanical hiss."))
- playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
-
-/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on
-/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE)
- if(!wearer)
- if(!force_deactivate)
- balloon_alert(user, "put suit on back!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE))
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- for(var/obj/item/part as anything in mod_parts)
- if(!force_deactivate && part.loc == src)
- balloon_alert(user, "deploy all parts first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(locked && !active && !allowed(user) && !force_deactivate)
- balloon_alert(user, "access insufficient!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(!cell?.charge && !force_deactivate)
- balloon_alert(user, "suit not powered!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(open && !force_deactivate)
- balloon_alert(user, "close the suit panel!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(activating)
- if(!force_deactivate)
- balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- for(var/obj/item/mod/module/module as anything in modules)
- if(!module.active || module.allowed_inactive)
- continue
- module.on_deactivation()
- activating = TRUE
- to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
- if(ai)
- to_chat(ai, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
-
- if(force_deactivate)
- seal_part(boots, seal = FALSE)
- seal_part(gauntlets, seal = FALSE)
- seal_part(chestplate,seal = FALSE)
- seal_part(helmet, seal = FALSE)
- finish_activation(on = FALSE)
- activating = FALSE
- to_chat(wearer, span_notice("Systems shut down. Parts unsealed. Goodbye, [wearer]."))
- if(ai)
- to_chat(ai, span_notice("SYSTEMS DEACTIVATED. GOODBYE: \"[ai]\""))
- playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
- return TRUE
-
- if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
- to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"]."))
- playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- seal_part(boots, seal = !active)
- else
- return toggle_activate_fail()
- if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
- to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"]."))
- playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- seal_part(gauntlets, seal = !active)
- else
- return toggle_activate_fail()
- if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
- to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"]."))
- playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- seal_part(chestplate,seal = !active)
- else
- return toggle_activate_fail()
- if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
- to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"]."))
- playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- seal_part(helmet, seal = !active)
- else
- return toggle_activate_fail()
- if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
- to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
- if(ai)
- to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\""))
- finish_activation(on = !active)
- if(active)
- playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
- SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50))
- else
- playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
- else
- return toggle_activate_fail()
- activating = FALSE
- return TRUE
-
-/obj/item/mod/control/proc/toggle_activate_fail()
- seal_part(boots, seal = active)
- seal_part(gauntlets, seal = active)
- seal_part(chestplate,seal = active)
- seal_part(helmet, seal = active)
- to_chat(wearer, span_warning("[active ? "Shut down" : "Start up"] cancelled."))
- finish_activation(on = active)
- activating = FALSE
- return FALSE
-
-///Seals or unseals the given part
-/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal)
- if(seal)
- part.clothing_flags |= part.visor_flags
- part.flags_inv |= part.visor_flags_inv
- part.flags_cover |= part.visor_flags_cover
- part.heat_protection = initial(part.heat_protection)
- part.cold_protection = initial(part.cold_protection)
- else
- part.flags_cover &= ~part.visor_flags_cover
- part.flags_inv &= ~part.visor_flags_inv
- part.clothing_flags &= ~part.visor_flags
- part.heat_protection = NONE
- part.cold_protection = NONE
- part.icon_state = "[skin]-[initial(part.icon_state)][seal ? "-sealed" : ""]"
- part.item_state = "[skin]-[initial(part.item_state)][seal ? "-sealed" : ""]"
- if(part == boots)
- wearer.update_inv_shoes()
- if(part == gauntlets)
- wearer.update_inv_gloves()
- if(part == chestplate)
- wearer.update_inv_wear_suit()
- wearer.update_inv_w_uniform()
- if(part == helmet)
- if(seal)
- helmet.alternate_worn_layer = null
- else
- helmet.alternate_worn_layer = helmet.alternate_layer
- wearer.update_inv_head()
- wearer.update_inv_wear_mask()
- wearer.update_hair()
-
-/// Finishes the suit's activation, starts processing
-/obj/item/mod/control/proc/finish_activation(on)
- icon_state = "[skin]-control[on ? "-sealed" : ""]"
- slowdown = on ? slowdown_active : slowdown_inactive
- if(on)
- for(var/obj/item/mod/module/module as anything in modules)
- module.on_suit_activation()
- START_PROCESSING(SSobj, src)
- else
- for(var/obj/item/mod/module/module as anything in modules)
- module.on_suit_deactivation()
- STOP_PROCESSING(SSobj, src)
- wearer.update_equipment_speed_mods()
- active = on
- wearer.update_inv_back()
-
-/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits.
-/obj/item/mod/control/proc/quick_activation()
- var/seal = TRUE
- for(var/obj/item/part in mod_parts)
- if(!deploy(null, part))
- seal = FALSE
- if(!seal)
- return
- for(var/obj/item/part in mod_parts)
- seal_part(part, seal = TRUE)
- finish_activation(on = TRUE)
diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm
deleted file mode 100644
index 8bc431146b..0000000000
--- a/code/modules/mod/mod_ai.dm
+++ /dev/null
@@ -1,198 +0,0 @@
-/obj/item/mod/control/transfer_ai(interaction, mob/user, mob/living/silicon/ai/intAI, obj/item/aicard/card)
- . = ..()
- if(!.)
- return
- if(!open) //mod must be open
- balloon_alert(user, "suit must be open to transfer!")
- return
- switch(interaction)
- if(AI_TRANS_TO_CARD)
- if(!ai)
- balloon_alert(user, "no AI in suit!")
- return
- if(!isAI(ai))
- balloon_alert(user, "onboard AI cannot fit in this card!")
- return
- balloon_alert(user, "transferring to card...")
- if(!do_after(user, 5 SECONDS, target = src))
- balloon_alert(user, "interrupted!")
- return
- if(!ai)
- return
- intAI = ai
- intAI.ai_restore_power()//So the AI initially has power.
- intAI.control_disabled = TRUE
- intAI.radio_enabled = FALSE
- intAI.disconnect_shell()
- intAI.forceMove(card)
- card.AI = intAI
- for(var/datum/action/action as anything in actions)
- action.Remove(intAI)
- intAI.controlled_equipment = null
- intAI.remote_control = null
- balloon_alert(intAI, "transferred to a card")
- balloon_alert(user, "AI transferred to card")
- ai = null
-
- if(AI_TRANS_FROM_CARD) //Using an AI card to upload to the suit.
- intAI = card.AI
- if(!intAI)
- balloon_alert(user, "no AI in card!")
- return
- if(ai)
- balloon_alert(user, "already has AI!")
- return
- if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client
- intAI.disconnect_shell()
- if(intAI.stat || !intAI.client)
- balloon_alert(user, "AI unresponsive!")
- return
- balloon_alert(user, "transferring to suit...")
- if(!do_after(user, 5 SECONDS, target = src))
- balloon_alert(user, "interrupted!")
- return
- if(ai)
- return
- balloon_alert(user, "AI transferred to suit")
- ai_enter_mod(intAI)
- card.AI = null
-
-/obj/item/mod/control/proc/ai_enter_mod(mob/living/silicon/ai/new_ai)
- new_ai.control_disabled = FALSE
- new_ai.radio_enabled = TRUE
- new_ai.ai_restore_power()
- new_ai.cancel_camera()
- new_ai.controlled_equipment = src
- new_ai.remote_control = src
- new_ai.forceMove(src)
- ai = new_ai
- balloon_alert(new_ai, "transferred to a suit")
- for(var/datum/action/action as anything in actions)
- action.Grant(ai)
-
-/**
- * Simple proc to insert the pAI into the MODsuit.
- *
- * user - The person trying to put the pAI into the MODsuit.
- * card - The pAI card we're slotting in the MODsuit.
- */
-
-/obj/item/mod/control/proc/insert_pai(mob/user, obj/item/paicard/card)
- if(ai)
- balloon_alert(user, "AI already installed!")
- return
- if(!card.pai || !card.pai.mind)
- balloon_alert(user, "pAI unresponsive!")
- return
- balloon_alert(user, "transferring to suit...")
- if(!do_after(user, 5 SECONDS, target = src))
- balloon_alert(user, "interrupted!")
- return FALSE
- if(!user.transferItemToLoc(card, src))
- return
-
- card.pai.canholo = FALSE
- ai = card.pai
- balloon_alert(user, "pAI transferred to suit")
- balloon_alert(ai, "transferred to a suit")
- ai.remote_control = src
- for(var/datum/action/action as anything in actions)
- action.Grant(ai)
- return TRUE
-
-/**
- * Simple proc to extract the pAI from the MODsuit. It's the proc to call if you want to take it out,
- * remove_pai() is there so atom_destruction() doesn't have any risk of sleeping.
- *
- * user - The person trying to take out the pAI from the MODsuit.
- * forced - Whether or not we skip the checks and just eject the pAI. Defaults to FALSE.
- * feedback - Whether to give feedback via balloon alerts or not. Defaults to TRUE.
- */
-/obj/item/mod/control/proc/extract_pai(mob/user, forced = FALSE, feedback = TRUE)
- if(!ai)
- if(user && feedback)
- balloon_alert(user, "no pAI to remove!")
- return
- if(!ispAI(ai))
- if(user && feedback)
- balloon_alert(user, "onboard AI cannot fit in this card!")
- return
- if(!forced)
- if(!open)
- if(user && feedback)
- balloon_alert(user, "open the suit panel!")
- return FALSE
- if(!do_after(user, 5 SECONDS, target = src))
- if(user && feedback)
- balloon_alert(user, "interrupted!")
- return FALSE
-
- remove_pai(feedback)
-
- if(feedback && user)
- balloon_alert(user, "pAI removed from the suit")
-
-/**
- * Simple proc that handles the safe removal of the pAI from a MOD control unit.
- *
- * Arguments:
- * * feedback - Whether or not we want to give balloon alert feedback to the ai. Defaults to FALSE.
- */
-/obj/item/mod/control/proc/remove_pai(feedback = FALSE)
- if(!ispAI(ai))
- return
- var/mob/living/silicon/pai/pai = ai
- var/turf/drop_off = get_turf(src)
- if(drop_off) // In case there's no drop_off, the pAI will simply get deleted.
- pai.card.forceMove(drop_off)
-
- for(var/datum/action/action as anything in actions)
- if(action.owner == pai)
- action.Remove(pai)
-
- if(feedback)
- balloon_alert(pai, "removed from a suit")
- pai.remote_control = null
- pai.canholo = TRUE
- pai = null
-
-#define MOVE_DELAY 2
-#define WEARER_DELAY 1
-#define LONE_DELAY 5
-#define CELL_PER_STEP (DEFAULT_CHARGE_DRAIN * 2.5)
-#define AI_FALL_TIME (1 SECONDS)
-
-/obj/item/mod/control/relaymove(mob/user, direction)
- if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE))
- return FALSE
- var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY)
- if(wearer && !wearer.Process_Spacemove(direction))
- return FALSE
- else if(!wearer && (!has_gravity() || !isturf(loc)))
- return FALSE
- COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown)
- cell.charge = max(0, cell.charge - CELL_PER_STEP)
- playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE)
- if(ismovable(wearer?.loc))
- return wearer.loc.relaymove(wearer, direction)
- else if(wearer)
- ADD_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT)
- addtimer(CALLBACK(src, .proc/ai_fall), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE)
- var/atom/movable/mover = wearer || src
- return step(mover, direction)
-
-#undef MOVE_DELAY
-#undef WEARER_DELAY
-#undef LONE_DELAY
-#undef CELL_PER_STEP
-#undef AI_FALL_TIME
-
-/obj/item/mod/control/proc/ai_fall()
- if(!wearer)
- return
- REMOVE_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT)
-
-/obj/item/mod/control/ui_state(mob/user)
- if(user == ai)
- return GLOB.contained_state
- return ..()
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
deleted file mode 100644
index 1c50b1926a..0000000000
--- a/code/modules/mod/mod_clothes.dm
+++ /dev/null
@@ -1,138 +0,0 @@
-/obj/item/clothing/head/helmet/space/mod
- name = "MOD helmet"
- desc = "A helmet for a MODsuit."
- icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
- mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
- anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing_anthro.dmi'
- icon_state = "helmet"
- item_state = "helmet"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
- body_parts_covered = HEAD
- heat_protection = HEAD
- cold_protection = HEAD
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- clothing_flags = THICKMATERIAL
- resistance_flags = NONE
- flash_protect = 0
- clothing_flags = NONE
- flags_inv = HIDEFACIALHAIR
- flags_cover = NONE
- visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE
- visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
- visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES
- var/alternate_layer = NECK_LAYER
- var/obj/item/mod/control/mod
- mutantrace_variation = STYLE_MUZZLE
-
-/obj/item/clothing/head/helmet/space/mod/Destroy()
- if(!QDELETED(mod))
- mod.helmet = null
- mod.mod_parts -= src
- QDEL_NULL(mod)
- return ..()
-
-/obj/item/clothing/suit/armor/mod
- name = "MOD chestplate"
- desc = "A chestplate for a MODsuit."
- icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
- mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
- anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing_anthro.dmi'
- icon_state = "chestplate"
- item_state = "chestplate"
- blood_overlay_type = "armor"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
- body_parts_covered = CHEST|GROIN
- heat_protection = CHEST|GROIN
- cold_protection = CHEST|GROIN
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- clothing_flags = THICKMATERIAL
- flags_inv = HIDETAUR
- visor_flags = STOPSPRESSUREDAMAGE
- visor_flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
- resistance_flags = NONE
- var/obj/item/mod/control/mod
- mutantrace_variation = STYLE_DIGITIGRADE
-
-/obj/item/clothing/suit/armor/mod/Destroy()
- if(!QDELETED(mod))
- mod.chestplate = null
- mod.mod_parts -= src
- QDEL_NULL(mod)
- return ..()
-
-/obj/item/clothing/gloves/mod
- name = "MOD gauntlets"
- desc = "A pair of gauntlets for a MODsuit."
- icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
- mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
- icon_state = "gauntlets"
- item_state = "gauntlets"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
- body_parts_covered = HANDS|ARMS
- heat_protection = HANDS|ARMS
- cold_protection = HANDS|ARMS
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- clothing_flags = THICKMATERIAL
- resistance_flags = NONE
- var/obj/item/mod/control/mod
- var/obj/item/clothing/overslot
- mutantrace_variation = STYLE_NO_ANTHRO_ICON
-
-/obj/item/clothing/gloves/mod/Destroy()
- if(!QDELETED(mod))
- mod.gauntlets = null
- mod.mod_parts -= src
- QDEL_NULL(mod)
- return ..()
-
-/// Replaces these gloves on the wearer with the overslot ones
-
-/obj/item/clothing/gloves/mod/proc/show_overslot()
- if(!overslot)
- return
- if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
- mod.wearer.dropItemToGround(overslot, force = TRUE)
- overslot = null
-
-/obj/item/clothing/shoes/mod
- name = "MOD boots"
- desc = "A pair of boots for a MODsuit."
- icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
- mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
- anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing_anthro.dmi'
- icon_state = "boots"
- item_state = "boots"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10)
- body_parts_covered = FEET|LEGS
- heat_protection = FEET|LEGS
- cold_protection = FEET|LEGS
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- clothing_flags = THICKMATERIAL
- resistance_flags = NONE
- item_flags = NONE
- var/obj/item/mod/control/mod
- var/obj/item/clothing/overslot
- mutantrace_variation = STYLE_DIGITIGRADE
-
-/obj/item/clothing/shoes/mod/Destroy()
- if(!QDELETED(mod))
- mod.boots = null
- mod.mod_parts -= src
- QDEL_NULL(mod)
- return ..()
-
-/// Replaces these shoes on the wearer with the overslot ones
-/obj/item/clothing/shoes/mod/proc/show_overslot()
- if(!overslot)
- return
- if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
- mod.wearer.dropItemToGround(overslot, force = TRUE)
- overslot = null
-
-/obj/item/clothing/shoes/mod/negates_gravity()
- return clothing_flags & NOSLIP
diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm
deleted file mode 100644
index 3fc8464b6b..0000000000
--- a/code/modules/mod/mod_construction.dm
+++ /dev/null
@@ -1,291 +0,0 @@
-/obj/item/mod/construction
- desc = "A part used in MOD construction."
- icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
- item_state = "rack_parts"
-
-/obj/item/mod/construction/helmet
- name = "MOD helmet"
- icon_state = "helmet"
-
-/obj/item/mod/construction/chestplate
- name = "MOD chestplate"
- icon_state = "chestplate"
-
-/obj/item/mod/construction/gauntlets
- name = "MOD gauntlets"
- icon_state = "gauntlets"
-
-/obj/item/mod/construction/boots
- name = "MOD boots"
- icon_state = "boots"
-
-/obj/item/mod/construction/core
- name = "MOD core"
- icon_state = "mod-core-standard"
- desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \
- These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \
- owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\
- Which one you have in your suit is unclear, but either way, \
- it's been repurposed to be an internal power source for a Modular Outerwear Device."
-
-/obj/item/mod/construction/broken_core
- name = "broken MOD core"
- icon_state = "mod-core"
- desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though."
-
-/obj/item/mod/construction/broken_core/examine(mob/user)
- . = ..()
- . += span_notice("You could repair it with a screwdriver...")
-
-/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool)
- . = ..()
- if(!tool.use_tool(src, user, 5 SECONDS, volume = 30))
- return
- new /obj/item/mod/construction/core(drop_location())
- qdel(src)
-
-/obj/item/mod/construction/armor
- name = "MOD armor plates"
- desc = "Armor plates used to finish a MOD."
- icon_state = "standard-plating"
- var/datum/mod_theme/theme = /datum/mod_theme
-
-/obj/item/mod/construction/armor/Initialize(mapload)
- . = ..()
- var/datum/mod_theme/used_theme = GLOB.mod_themes[theme]
- name = "MOD [used_theme.name] armor plates"
- desc = "[desc] [used_theme.desc]"
- icon_state = "[used_theme.default_skin]-plating"
-
-/obj/item/mod/construction/armor/engineering
- theme = /datum/mod_theme/engineering
-
-/obj/item/mod/construction/armor/atmospheric
- theme = /datum/mod_theme/atmospheric
-
-/obj/item/mod/construction/armor/advanced
- theme = /datum/mod_theme/advanced
-
-/obj/item/mod/construction/armor/mining
- theme = /datum/mod_theme/mining
-
-/obj/item/mod/construction/armor/medical
- theme = /datum/mod_theme/medical
-
-/obj/item/mod/construction/armor/rescue
- theme = /datum/mod_theme/rescue
-
-/obj/item/mod/construction/armor/security
- theme = /datum/mod_theme/security
-
-/obj/item/mod/construction/armor/research
- theme = /datum/mod_theme/research
-
-/obj/item/mod/construction/armor/cosmohonk
- theme = /datum/mod_theme/cosmohonk
-
-/obj/item/mod/construction/armor/magnate
- theme = /datum/mod_theme/magnate
-
-/obj/item/mod/paint
- name = "MOD paint kit"
- desc = "This kit will repaint your MODsuit to something unique."
- icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
- icon_state = "paintkit"
-
-#define START_STEP "start"
-#define CORE_STEP "core"
-#define SCREWED_CORE_STEP "screwed_core"
-#define HELMET_STEP "helmet"
-#define CHESTPLATE_STEP "chestplate"
-#define GAUNTLETS_STEP "gauntlets"
-#define BOOTS_STEP "boots"
-#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly"
-#define SCREWED_ASSEMBLY_STEP "screwed_assembly"
-
-/obj/item/mod/construction/shell
- name = "MOD shell"
- icon_state = "mod-construction_start"
- desc = "A MOD shell."
- var/obj/item/core
- var/obj/item/helmet
- var/obj/item/chestplate
- var/obj/item/gauntlets
- var/obj/item/boots
- var/step = START_STEP
-
-/obj/item/mod/construction/shell/examine(mob/user)
- . = ..()
- var/display_text
- switch(step)
- if(START_STEP)
- display_text = "It looks like it's missing a MOD core..."
- if(CORE_STEP)
- display_text = "The core seems loose..."
- if(SCREWED_CORE_STEP)
- display_text = "It looks like it's missing a helmet..."
- if(HELMET_STEP)
- display_text = "It looks like it's missing a chestplate..."
- if(CHESTPLATE_STEP)
- display_text = "It looks like it's missing gauntlets..."
- if(GAUNTLETS_STEP)
- display_text = "It looks like it's missing boots..."
- if(BOOTS_STEP)
- display_text = "The assembly seems unsecured..."
- if(WRENCHED_ASSEMBLY_STEP)
- display_text = "The assembly seems loose..."
- if(SCREWED_ASSEMBLY_STEP)
- display_text = "All it's missing is external armor..."
- . += span_notice(display_text)
-
-/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params)
- . = ..()
- switch(step)
- if(START_STEP)
- if(!istype(part, /obj/item/mod/construction/core))
- return
- if(!user.transferItemToLoc(part, src))
- balloon_alert(user, "core stuck to your hand!")
- return
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- balloon_alert(user, "core inserted")
- core = part
- step = CORE_STEP
- if(CORE_STEP)
- if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
- if(part.use_tool(src, user, 0, volume=30))
- balloon_alert(user, "core screwed")
- step = SCREWED_CORE_STEP
- else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- core.forceMove(drop_location())
- balloon_alert(user, "core taken out")
- step = START_STEP
- if(SCREWED_CORE_STEP)
- if(istype(part, /obj/item/mod/construction/helmet)) //Construct
- if(!user.transferItemToLoc(part, src))
- balloon_alert(user, "helmet stuck to your hand!")
- return
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- balloon_alert(user, "helmet added")
- helmet = part
- step = HELMET_STEP
- else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- balloon_alert(user, "core unscrewed")
- step = CORE_STEP
- if(HELMET_STEP)
- if(istype(part, /obj/item/mod/construction/chestplate)) //Construct
- if(!user.transferItemToLoc(part, src))
- balloon_alert(user, "chestplate stuck to your hand!")
- return
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- balloon_alert(user, "chestplate added")
- chestplate = part
- step = CHESTPLATE_STEP
- else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- helmet.forceMove(drop_location())
- balloon_alert(user, "helmet removed")
- helmet = null
- step = SCREWED_CORE_STEP
- if(CHESTPLATE_STEP)
- if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct
- if(!user.transferItemToLoc(part, src))
- balloon_alert(user, "gauntlets stuck to your hand!")
- return
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- balloon_alert(user, "gauntlets added")
- gauntlets = part
- step = GAUNTLETS_STEP
- else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- chestplate.forceMove(drop_location())
- balloon_alert(user, "chestplate removed")
- chestplate = null
- step = HELMET_STEP
- if(GAUNTLETS_STEP)
- if(istype(part, /obj/item/mod/construction/boots)) //Construct
- if(!user.transferItemToLoc(part, src))
- balloon_alert(user, "boots added")
- return
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- balloon_alert(user, "You fit [part] onto [src].")
- boots = part
- step = BOOTS_STEP
- else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- gauntlets.forceMove(drop_location())
- balloon_alert(user, "gauntlets removed")
- gauntlets = null
- step = CHESTPLATE_STEP
- if(BOOTS_STEP)
- if(part.tool_behaviour == TOOL_WRENCH) //Construct
- if(part.use_tool(src, user, 0, volume=30))
- balloon_alert(user, "assembly secured")
- step = WRENCHED_ASSEMBLY_STEP
- else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- boots.forceMove(drop_location())
- balloon_alert(user, "boots removed")
- boots = null
- step = GAUNTLETS_STEP
- if(WRENCHED_ASSEMBLY_STEP)
- if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
- if(part.use_tool(src, user, 0, volume=30))
- balloon_alert(user, "assembly screwed")
- step = SCREWED_ASSEMBLY_STEP
- else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct
- if(part.use_tool(src, user, 0, volume=30))
- balloon_alert(user, "assembly unsecured")
- step = BOOTS_STEP
- if(SCREWED_ASSEMBLY_STEP)
- if(istype(part, /obj/item/mod/construction/armor)) //Construct
- var/obj/item/mod/construction/armor/external_armor = part
- if(!user.transferItemToLoc(part, src))
- return
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- balloon_alert(user, "suit finished")
- var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme)
- qdel(src)
- user.put_in_hands(modsuit)
- else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
- if(part.use_tool(src, user, 0, volume=30))
- balloon_alert(user, "assembly unscrewed")
- step = SCREWED_ASSEMBLY_STEP
- update_icon_state()
-
-/obj/item/mod/construction/shell/update_icon_state()
- . = ..()
- icon_state = "mod-construction_[step]"
-
-/obj/item/mod/construction/shell/Destroy()
- QDEL_NULL(core)
- QDEL_NULL(helmet)
- QDEL_NULL(chestplate)
- QDEL_NULL(gauntlets)
- QDEL_NULL(boots)
- return ..()
-
-/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom)
- if(deleted_atom == core)
- core = null
- if(deleted_atom == helmet)
- helmet = null
- if(deleted_atom == chestplate)
- chestplate = null
- if(deleted_atom == gauntlets)
- gauntlets = null
- if(deleted_atom == boots)
- boots = null
- return ..()
-
-#undef START_STEP
-#undef CORE_STEP
-#undef SCREWED_CORE_STEP
-#undef HELMET_STEP
-#undef CHESTPLATE_STEP
-#undef GAUNTLETS_STEP
-#undef BOOTS_STEP
-#undef WRENCHED_ASSEMBLY_STEP
-#undef SCREWED_ASSEMBLY_STEP
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
deleted file mode 100644
index d30b8a235e..0000000000
--- a/code/modules/mod/mod_control.dm
+++ /dev/null
@@ -1,588 +0,0 @@
-/// MODsuits, trade-off between armor and utility
-/obj/item/mod
- name = "Base MOD"
- desc = "You should not see this, yell at a coder!"
- icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
- mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
- icon_state = "standard-control"
- item_state = "standard-control"
- mutantrace_variation = STYLE_NO_ANTHRO_ICON
-
-/obj/item/mod/control
- name = "MOD control unit"
- desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments."
- icon_state = "control"
- item_state = "control"
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- strip_delay = 10 SECONDS
- slowdown = 2
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 0)
- actions_types = list(
- /datum/action/item_action/mod/deploy,
- /datum/action/item_action/mod/activate,
- /datum/action/item_action/mod/module,
- /datum/action/item_action/mod/panel,
- /datum/action/item_action/mod/deploy/ai,
- /datum/action/item_action/mod/activate/ai,
- /datum/action/item_action/mod/module/ai,
- /datum/action/item_action/mod/panel/ai,
- )
- resistance_flags = NONE
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- permeability_coefficient = 0.01
- siemens_coefficient = 0.5
- alternate_worn_layer = BODY_FRONT_LAYER
- /// The MOD's theme, decides on some stuff like armor and statistics.
- var/datum/mod_theme/theme = /datum/mod_theme
- /// Looks of the MOD.
- var/skin = "standard"
- /// Theme of the MOD TGUI
- var/ui_theme = "ntos"
- /// If the suit is deployed and turned on.
- var/active = FALSE
- /// If the suit wire/module hatch is open.
- var/open = FALSE
- /// If the suit is ID locked.
- var/locked = FALSE
- /// If the suit is malfunctioning.
- var/malfunctioning = FALSE
- /// If the suit is currently activating/deactivating.
- var/activating = FALSE
- /// How long the MOD is electrified for.
- var/seconds_electrified = MACHINE_NOT_ELECTRIFIED
- /// If the suit interface is broken.
- var/interface_break = FALSE
- /// How much module complexity can this MOD carry.
- var/complexity_max = DEFAULT_MAX_COMPLEXITY
- /// How much module complexity this MOD is carrying.
- var/complexity = 0
- /// Power usage of the MOD.
- var/cell_drain = DEFAULT_CHARGE_DRAIN
- /// Slowdown of the MOD when not active.
- var/slowdown_inactive = 2
- /// Slowdown of the MOD when active.
- var/slowdown_active = 1
- /// How long this MOD takes each part to seal.
- var/activation_step_time = MOD_ACTIVATION_STEP_TIME
- /// MOD cell.
- var/obj/item/stock_parts/cell/cell
- /// MOD helmet.
- var/obj/item/clothing/head/helmet/space/mod/helmet
- /// MOD chestplate.
- var/obj/item/clothing/suit/armor/mod/chestplate
- /// MOD gauntlets.
- var/obj/item/clothing/gloves/mod/gauntlets
- /// MOD boots.
- var/obj/item/clothing/shoes/mod/boots
- /// List of parts (helmet, chestplate, gauntlets, boots).
- var/list/mod_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.
- var/obj/item/mod/module/selected_module
- /// AI/pAI mob inhabiting the MOD.
- var/mob/living/silicon/ai
- /// Delay between moves as AI.
- var/movedelay = 0
- /// Cooldown for AI moves.
- COOLDOWN_DECLARE(cooldown_mod_move)
- /// Person wearing the MODsuit.
- var/mob/living/carbon/human/wearer
-
-/obj/item/mod/control/Initialize(mapload, new_theme, new_skin)
- . = ..()
- if(new_theme)
- theme = new_theme
- theme = GLOB.mod_themes[theme]
- slowdown_inactive = theme.slowdown_inactive
- slowdown_active = theme.slowdown_active
- slowdown = slowdown_inactive
- complexity_max = theme.complexity_max
- skin = new_skin || theme.default_skin
- ui_theme = theme.ui_theme
- cell_drain = theme.cell_drain
- initial_modules += theme.inbuilt_modules
- wires = new /datum/wires/mod(src)
- if(length(req_access))
- locked = TRUE
- if(ispath(cell))
- cell = new cell(src)
- helmet = new /obj/item/clothing/head/helmet/space/mod(src)
- helmet.mod = src
- mod_parts += helmet
- chestplate = new /obj/item/clothing/suit/armor/mod(src)
- chestplate.mod = src
- mod_parts += chestplate
- gauntlets = new /obj/item/clothing/gloves/mod(src)
- gauntlets.mod = src
- mod_parts += gauntlets
- boots = new /obj/item/clothing/shoes/mod(src)
- boots.mod = src
- mod_parts += boots
- var/list/all_parts = mod_parts.Copy() + src
- for(var/obj/item/piece as anything in all_parts)
- piece.name = "[theme.name] [piece.name]"
- piece.desc = "[piece.desc] [theme.desc]"
- piece.armor = getArmor(arglist(theme.armor))
- piece.resistance_flags = theme.resistance_flags
- piece.heat_protection = NONE
- piece.cold_protection = NONE
- piece.max_heat_protection_temperature = theme.max_heat_protection_temperature
- piece.min_cold_protection_temperature = theme.min_cold_protection_temperature
- piece.permeability_coefficient = theme.permeability_coefficient
- piece.siemens_coefficient = theme.siemens_coefficient
- piece.icon_state = "[skin]-[initial(piece.icon_state)]"
- piece.item_state = "[skin]-[initial(piece.item_state)]"
- update_flags()
- for(var/obj/item/mod/module/module as anything in initial_modules)
- module = new module(src)
- install(module)
- RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit)
- movedelay = CONFIG_GET(number/movedelay/run_delay)
-
-/obj/item/mod/control/Destroy()
- if(active)
- STOP_PROCESSING(SSobj, src)
- var/atom/deleting_atom
- if(!QDELETED(helmet))
- deleting_atom = helmet
- helmet.mod = null
- helmet = null
- mod_parts -= deleting_atom
- qdel(deleting_atom)
- if(!QDELETED(chestplate))
- deleting_atom = chestplate
- chestplate.mod = null
- chestplate = null
- mod_parts -= deleting_atom
- qdel(deleting_atom)
- if(!QDELETED(gauntlets))
- deleting_atom = gauntlets
- gauntlets.mod = null
- gauntlets = null
- mod_parts -= deleting_atom
- qdel(deleting_atom)
- if(!QDELETED(boots))
- deleting_atom = boots
- boots.mod = null
- boots = null
- mod_parts -= deleting_atom
- qdel(deleting_atom)
- for(var/obj/item/mod/module/module as anything in modules)
- module.mod = null
- modules -= module
- QDEL_NULL(ai)
- QDEL_NULL(wires)
- QDEL_NULL(cell)
- return ..()
-
-/obj/item/mod/control/process(delta_time)
- if(seconds_electrified > MACHINE_NOT_ELECTRIFIED)
- seconds_electrified--
- if((!cell || !cell.charge) && active && !activating)
- power_off()
- return PROCESS_KILL
- var/malfunctioning_charge_drain = 0
- if(malfunctioning)
- malfunctioning_charge_drain = rand(1,20)
- cell.charge = max(0, cell.charge - (cell_drain + malfunctioning_charge_drain)*delta_time)
- update_cell_alert()
- for(var/obj/item/mod/module/module as anything in modules)
- if(malfunctioning && module.active && DT_PROB(5, delta_time))
- module.on_deactivation()
- module.on_process(delta_time)
-
-/obj/item/mod/control/equipped(mob/user, slot)
- ..()
- if(slot == ITEM_SLOT_BACK)
- set_wearer(user)
- else if(wearer)
- unset_wearer()
-
-/obj/item/mod/control/dropped(mob/user)
- . = ..()
- if(wearer)
- unset_wearer()
-
-/obj/item/mod/control/item_action_slot_check(slot)
- if(slot == ITEM_SLOT_BACK)
- return TRUE
-
-/obj/item/mod/control/allow_attack_hand_drop(mob/user)
- var/mob/living/carbon/carbon_user = user
- if(!istype(carbon_user) || src != carbon_user.back)
- return ..()
- for(var/obj/item/part in mod_parts)
- if(part.loc != src)
- balloon_alert(carbon_user, "retract parts first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- return ..()
-
-/obj/item/mod/control/MouseDrop(atom/over_object)
- if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand))
- return ..()
- for(var/obj/item/part in mod_parts)
- if(part.loc != src)
- balloon_alert(wearer, "retract parts first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
- return
- if(!wearer.incapacitated())
- var/atom/movable/screen/inventory/hand/ui_hand = over_object
- if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index))
- add_fingerprint(usr)
- return ..()
-
-/obj/item/mod/control/attack_hand(mob/user)
- if(seconds_electrified && cell?.charge)
- if(shock(user))
- return
- if(open && loc == user)
- if(!cell)
- balloon_alert(user, "no cell!")
- return
- balloon_alert(user, "removing cell...")
- if(!do_after(user, 1.5 SECONDS, target = src))
- balloon_alert(user, "interrupted!")
- return
- balloon_alert(user, "cell removed")
- playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
- if(!user.put_in_hands(cell))
- cell.forceMove(drop_location())
- update_cell_alert()
- return
- return ..()
-
-/obj/item/mod/control/AltClick(mob/user)
- if(seconds_electrified && cell?.charge)
- if(shock(user))
- return
- if(!open)
- for(var/obj/item/mod/module/storage/S in modules)
- if(S.stored)
- playsound(user, "rustle", 50, 1, -5)
- SEND_SIGNAL(S.stored, COMSIG_TRY_STORAGE_SHOW, wearer, TRUE)
- return
- . = ..()
-
-/obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver)
- . = ..()
- if(.)
- return TRUE
- if(active || activating)
- balloon_alert(user, "deactivate suit first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- balloon_alert(user, "[open ? "closing" : "opening"] panel...")
- screwdriver.play_tool_sound(src, 100)
- if(screwdriver.use_tool(src, user, 1 SECONDS))
- if(active || activating)
- balloon_alert(user, "deactivate suit first!")
- screwdriver.play_tool_sound(src, 100)
- balloon_alert(user, "panel [open ? "closed" : "opened"]")
- open = !open
- else
- balloon_alert(user, "interrupted!")
- return TRUE
-
-/obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar)
- . = ..()
- if(!open)
- balloon_alert(user, "open the panel first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(!allowed(user))
- balloon_alert(user, "insufficient access!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return
- if(length(modules))
- var/list/removable_modules = list()
- for(var/obj/item/mod/module/module as anything in modules)
- if(!module.removable)
- continue
- removable_modules += module
- var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules)
- if(!module_to_remove?.mod)
- return FALSE
- uninstall(module_to_remove)
- module_to_remove.forceMove(drop_location())
- crowbar.play_tool_sound(src, 100)
- return TRUE
- balloon_alert(user, "no modules!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
-
-/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params)
- if(istype(attacking_item, /obj/item/paicard))
- if(!open) //mod must be open
- balloon_alert(user, "suit must be open to transfer!")
- return FALSE
- insert_pai(user, attacking_item)
- return TRUE
- if(istype(attacking_item, /obj/item/mod/module))
- if(!open)
- balloon_alert(user, "open the panel first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- install(attacking_item, user)
- return TRUE
- else if(istype(attacking_item, /obj/item/stock_parts/cell))
- if(!open)
- balloon_alert(user, "open the panel first!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- if(cell)
- balloon_alert(user, "cell already installed!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
- attacking_item.forceMove(src)
- cell = attacking_item
- balloon_alert(user, "cell installed")
- playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
- update_cell_alert()
- return TRUE
- else if(is_wire_tool(attacking_item) && open)
- wires.interact(user)
- return TRUE
- else if(istype(attacking_item, /obj/item/mod/paint))
- if(active || activating)
- balloon_alert(user, "suit is active!")
- else if(paint(user, attacking_item))
- balloon_alert(user, "suit painted")
- else
- balloon_alert(user, "not painted!")
- return TRUE
- else if(open && attacking_item.GetID())
- update_access(user, attacking_item)
- return TRUE
- return ..()
-
-/obj/item/mod/control/get_cell()
- if(open)
- return cell
-
-/obj/item/mod/control/emag_act(mob/user)
- locked = !locked
- balloon_alert(user, "[locked ? "locked" : "unlocked"]")
-
-/obj/item/mod/control/emp_act(severity)
- . = ..()
- to_chat(wearer, span_notice("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!"))
- if(!active || !wearer || . & EMP_PROTECT_CONTENTS)
- return
- selected_module = null
- wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE)
- to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly."))
- if (wearer.stat < UNCONSCIOUS && prob(10))
- wearer.emote("scream")
-
-/obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
- if(visuals_only)
- set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped
- quick_activation()
-
-/obj/item/mod/control/doStrip(mob/stripper, mob/owner)
- if(active && !toggle_activate(stripper, force_deactivate = TRUE))
- return
- for(var/obj/item/part in mod_parts)
- conceal(null, part)
- return ..()
-
-/obj/item/mod/control/worn_overlays(isinhands = FALSE, icon_file)
- . = ..()
- if(!active)
- return
- for(var/obj/item/mod/module/module as anything in modules)
- var/list/module_icons = module.generate_worn_overlay()
- if(!length(module_icons))
- continue
- . += module_icons
-
-/obj/item/mod/control/proc/set_wearer(mob/user)
- wearer = user
- RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit)
- RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge)
- update_cell_alert()
- for(var/obj/item/mod/module/module as anything in modules)
- module.on_equip()
-
-/obj/item/mod/control/proc/unset_wearer()
- for(var/obj/item/mod/module/module as anything in modules)
- module.on_unequip()
- UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT))
- wearer.clear_alert("mod_charge")
- wearer = null
-
-/obj/item/mod/control/proc/update_flags()
- var/list/used_skin = theme.skins[skin]
- for(var/obj/item/clothing/part as anything in mod_parts)
- var/used_category
- if(part == helmet)
- used_category = HELMET_FLAGS
- helmet.alternate_worn_layer = used_skin["HELMET_LAYER"]
- helmet.alternate_layer = used_skin["HELMET_LAYER"]
- if(part == chestplate)
- used_category = CHESTPLATE_FLAGS
- if(part == gauntlets)
- used_category = GAUNTLETS_FLAGS
- if(part == boots)
- used_category = BOOTS_FLAGS
- var/list/category = used_skin[used_category]
- part.clothing_flags = category[UNSEALED_CLOTHING] || NONE
- part.visor_flags = category[SEALED_CLOTHING] || NONE
- part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE
- part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE
- part.flags_cover = category[UNSEALED_COVER] || NONE
- part.visor_flags_cover = category[SEALED_COVER] || NONE
-
-/obj/item/mod/control/proc/quick_module(mob/user)
- if(!length(modules))
- return
- var/list/display_names = list()
- var/list/items = list()
- for(var/obj/item/mod/module/module as anything in modules)
- if(module.module_type == MODULE_PASSIVE)
- continue
- display_names[module.name] = REF(module)
- var/image/module_image = image(icon = module.icon, icon_state = module.icon_state)
- items += list(module.name = module_image)
- if(!length(items))
- return
- var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE)
- if(!pick)
- return
- var/module_reference = display_names[pick]
- var/obj/item/mod/module/selected_module = locate(module_reference) in modules
- if(!istype(selected_module) || user.incapacitated())
- return
- selected_module.on_select()
-
-/obj/item/mod/control/proc/paint(mob/user, obj/item/paint)
- if(length(theme.skins) <= 1)
- return FALSE
- var/list/skins = list()
- for(var/mod_skin in theme.skins)
- skins[mod_skin] = image(icon = icon, icon_state = "[mod_skin]-control")
- var/pick = show_radial_menu(user, src, skins, custom_check = FALSE, require_near = TRUE)
- if(!pick || !user.is_holding(paint))
- return FALSE
- skin = pick
- var/list/skin_updating = mod_parts.Copy() + src
- for(var/obj/item/piece as anything in skin_updating)
- piece.icon_state = "[skin]-[initial(piece.icon_state)]"
- update_flags()
- wearer?.regenerate_icons()
- return TRUE
-
-/obj/item/mod/control/proc/shock(mob/living/user)
- if(!istype(user) || cell?.charge < 1)
- return FALSE
- do_sparks(5, TRUE, src)
- var/check_range = TRUE
- return electrocute_mob(user, cell, src, 0.7, check_range)
-
-/obj/item/mod/control/proc/install(module, mob/user)
- var/obj/item/mod/module/new_module = module
- for(var/obj/item/mod/module/old_module as anything in modules)
- if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules))
- if(user)
- 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(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)
- if(user)
- balloon_alert(user, "[new_module] would make [src] too complex!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return
- new_module.forceMove(src)
- modules += new_module
- complexity += new_module.complexity
- new_module.mod = src
- new_module.on_install()
- if(wearer)
- new_module.on_equip()
- if(user)
- balloon_alert(user, "[new_module] added")
- playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
-
-/obj/item/mod/control/proc/uninstall(module)
- var/obj/item/mod/module/old_module = module
- modules -= old_module
- complexity -= old_module.complexity
- if(active)
- old_module.on_suit_deactivation()
- if(old_module.active)
- old_module.on_deactivation()
- if(wearer)
- old_module.on_unequip()
- old_module.on_uninstall()
- old_module.mod = null
-
-/obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card)
- if(!allowed(user))
- balloon_alert(user, "insufficient access!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return
- req_access = card.access.Copy()
- balloon_alert(user, "access updated")
-
-/obj/item/mod/control/proc/update_cell_alert()
- if(!wearer)
- return
- if(!cell)
- wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell)
- return
- var/remaining_cell = cell.charge/cell.maxcharge
- switch(remaining_cell)
- if(0.75 to INFINITY)
- wearer.clear_alert("mod_charge")
- if(0.5 to 0.75)
- wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1)
- if(0.25 to 0.5)
- wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2)
- if(0.01 to 0.25)
- wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3)
- else
- wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell)
-
-/obj/item/mod/control/proc/power_off()
- balloon_alert(wearer, "no power!")
- toggle_activate(wearer, force_deactivate = TRUE)
-
-/obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction)
- SIGNAL_HANDLER
-
- if(part.loc == src)
- return
- if(part == cell)
- cell = null
- update_cell_alert()
- return
- if(part.loc == wearer)
- return
- if(modules.Find(part))
- uninstall(part)
- return
- if(mod_parts.Find(part))
- conceal(wearer, part)
- if(active)
- INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE)
- return
-
-/obj/item/mod/control/proc/on_borg_charge(datum/source, amount)
- SIGNAL_HANDLER
-
- if(!cell)
- return
- cell.give(amount)
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
deleted file mode 100644
index 135cef31b7..0000000000
--- a/code/modules/mod/mod_theme.dm
+++ /dev/null
@@ -1,854 +0,0 @@
-/// Global proc that sets up all MOD themes as singletons in a list and returns it.
-/proc/setup_mod_themes()
- . = list()
- for(var/path in typesof(/datum/mod_theme))
- var/datum/mod_theme/new_theme = new path()
- .[path] = new_theme
-
-/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics.
-/datum/mod_theme
- /// Theme name for the MOD.
- var/name = "standard"
- /// Description added to the MOD.
- var/desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement."
- /// Default skin of the MOD.
- var/default_skin = "standard"
- /// Armor shared across the MOD pieces.
- var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 0)
- /// Resistance flags shared across the MOD pieces.
- var/resistance_flags = NONE
- /// Max heat protection shared across the MOD pieces.
- var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- /// Max cold protection shared across the MOD pieces.
- var/min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- /// Permeability shared across the MOD pieces.
- var/permeability_coefficient = 0.01
- /// Siemens shared across the MOD pieces.
- var/siemens_coefficient = 0.5
- /// How much modules can the MOD carry without malfunctioning.
- var/complexity_max = DEFAULT_MAX_COMPLEXITY
- /// How much battery power the MOD uses by just being on
- var/cell_drain = DEFAULT_CHARGE_DRAIN
- /// Slowdown of the MOD when not active.
- var/slowdown_inactive = 1.25
- /// Slowdown of the MOD when active.
- var/slowdown_active = 0.75
- /// Theme used by the MOD TGUI.
- 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()
- /// List of skins with their appropriate clothing flags.
- var/list/skins = list(
- "standard" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- "civilian" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/engineering
- name = "engineering"
- desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic."
- default_skin = "engineering"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10, RAD = 20)
- resistance_flags = FIRE_PROOF
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- slowdown_inactive = 1.5
- slowdown_active = 1
- skins = list(
- "engineering" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/atmospheric
- name = "atmospheric"
- desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit."
- default_skin = "atmospheric"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10, RAD = 0)
- resistance_flags = FIRE_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- slowdown_inactive = 1.5
- slowdown_active = 1
- skins = list(
- "atmospheric" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR,
- UNSEALED_COVER = HEADCOVERSMOUTH,
- SEALED_COVER = HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/advanced
- name = "advanced"
- desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish."
- default_skin = "advanced"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10, RAD = 35)
- resistance_flags = FIRE_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- slowdown_inactive = 1
- slowdown_active = 0.5
- inbuilt_modules = list(/obj/item/mod/module/magboot/advanced)
- skins = list(
- "advanced" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/mining
- name = "mining"
- desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain."
- default_skin = "mining"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15, RAD = 0)
- resistance_flags = FIRE_PROOF
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- cell_drain = DEFAULT_CHARGE_DRAIN * 2
- complexity_max = DEFAULT_MAX_COMPLEXITY + 5
- skins = list(
- "mining" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/medical
- name = "medical"
- desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement."
- default_skin = "medical"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10, RAD = 0)
- cell_drain = DEFAULT_CHARGE_DRAIN * 1.5
- slowdown_inactive = 1
- slowdown_active = 0.5
- skins = list(
- "medical" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- "corpsman" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/rescue
- name = "rescue"
- desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments."
- default_skin = "rescue"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- cell_drain = DEFAULT_CHARGE_DRAIN * 1.5
- slowdown_inactive = 0.75
- slowdown_active = 0.25
- inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced)
- skins = list(
- "rescue" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/research
- name = "research"
- desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive."
- default_skin = "research"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- complexity_max = DEFAULT_MAX_COMPLEXITY + 5
- slowdown_inactive = 2
- slowdown_active = 1.5
- inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced)
- skins = list(
- "research" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/security
- name = "security"
- desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity."
- default_skin = "security"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20, RAD = 0)
- siemens_coefficient = 0
- complexity_max = DEFAULT_MAX_COMPLEXITY - 5
- slowdown_inactive = 1
- slowdown_active = 0.5
- skins = list(
- "security" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
- UNSEALED_COVER = HEADCOVERSMOUTH,
- SEALED_COVER = HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/safeguard
- name = "safeguard"
- desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model."
- default_skin = "safeguard"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25, RAD = 0)
- resistance_flags = FIRE_PROOF
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- complexity_max = DEFAULT_MAX_COMPLEXITY - 5
- slowdown_inactive = 0.75
- slowdown_active = 0.25
- skins = list(
- "safeguard" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/magnate
- name = "magnate"
- desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed."
- default_skin = "magnate"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- complexity_max = DEFAULT_MAX_COMPLEXITY + 5
- slowdown_inactive = 0.75
- slowdown_active = 0.25
- skins = list(
- "magnate" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/cosmohonk
- name = "cosmohonk"
- desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost."
- default_skin = "cosmohonk"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5, RAD = 0)
- cell_drain = DEFAULT_CHARGE_DRAIN * 0.25
- slowdown_inactive = 1.75
- slowdown_active = 1.25
- skins = list(
- "cosmohonk" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
- SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/syndicate
- name = "syndicate"
- desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar."
- default_skin = "syndicate"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25, RAD = 0)
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- slowdown_inactive = 1
- slowdown_active = 0.5
- ui_theme = "syndicate"
- inbuilt_modules = list()
- skins = list(
- "syndicate" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/elite
- name = "elite"
- desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values."
- default_skin = "elite"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- slowdown_inactive = 0.75
- slowdown_active = 0.25
- ui_theme = "syndicate"
- inbuilt_modules = list()
- skins = list(
- "elite" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/enchanted
- name = "enchanted"
- desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though."
- default_skin = "enchanted"
- armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- complexity_max = DEFAULT_MAX_COMPLEXITY - 5
- slowdown_inactive = 0.75
- slowdown_active = 0.25
- ui_theme = "wizard"
- inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard)
- skins = list(
- "enchanted" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/prototype
- name = "prototype"
- desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient."
- default_skin = "prototype"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5, RAD = 0)
- resistance_flags = FIRE_PROOF
- complexity_max = DEFAULT_MAX_COMPLEXITY + 10
- slowdown_inactive = 2.5
- slowdown_active = 2
- ui_theme = "hackerman"
- inbuilt_modules = list(/obj/item/mod/module/kinesis)
- skins = list(
- "prototype" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/responsory
- name = "responsory"
- desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams."
- default_skin = "responsory"
- armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15, RAD = 0)
- resistance_flags = FIRE_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- slowdown_inactive = 0.5
- slowdown_active = 0
- skins = list(
- "responsory" = list(
- HELMET_LAYER = NECK_LAYER,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = NONE,
- SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- "inquisitory" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/apocryphal
- name = "apocryphal"
- desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies."
- default_skin = "apocryphal"
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- complexity_max = DEFAULT_MAX_COMPLEXITY + 10
- skins = list(
- "apocryphal" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
- SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/corporate
- name = "corporate"
- desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers."
- default_skin = "corporate"
- armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 0)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0
- slowdown_inactive = 0.5
- slowdown_active = 0
- skins = list(
- "corporate" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
- SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/debug
- name = "debug"
- desc = "Strangely nostalgic."
- default_skin = "debug"
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0, RAD = 25)
- resistance_flags = FIRE_PROOF|ACID_PROOF
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- complexity_max = 50
- slowdown_inactive = 0.5
- slowdown_active = 0
- skins = list(
- "debug" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE,
- UNSEALED_COVER = HEADCOVERSMOUTH,
- SEALED_COVER = HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL,
- SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
- ),
- ),
- )
-
-/datum/mod_theme/administrative
- name = "administrative"
- desc = "A suit made of adminium. Who comes up with these stupid mineral names?"
- default_skin = "debug"
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100, RAD = 35)
- resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- complexity_max = 1000
- cell_drain = DEFAULT_CHARGE_DRAIN * 0
- slowdown_inactive = 0
- slowdown_active = 0
- skins = list(
- "debug" = list(
- HELMET_LAYER = null,
- HELMET_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
- SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE,
- UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES,
- ),
- CHESTPLATE_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- SEALED_INVISIBILITY = HIDEJUMPSUIT,
- ),
- GAUNTLETS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- ),
- BOOTS_FLAGS = list(
- UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
- ),
- ),
- )
diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm
deleted file mode 100644
index 565dcdc2f8..0000000000
--- a/code/modules/mod/mod_types.dm
+++ /dev/null
@@ -1,273 +0,0 @@
-/obj/item/mod/control/pre_equipped
- cell = /obj/item/stock_parts/cell/high
- var/applied_skin
-
-/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin)
- new_skin = applied_skin
- return ..()
-
-/obj/item/mod/control/pre_equipped/standard
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/flashlight,
- )
-
-/obj/item/mod/control/pre_equipped/engineering
- theme = /datum/mod_theme/engineering
- initial_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/magboot,
- )
-
-/obj/item/mod/control/pre_equipped/atmospheric
- theme = /datum/mod_theme/atmospheric
- initial_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/t_ray,
- )
-
-/obj/item/mod/control/pre_equipped/advanced
- theme = /datum/mod_theme/advanced
- cell = /obj/item/stock_parts/cell/super
- initial_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/jetpack,
- )
-
-/obj/item/mod/control/pre_equipped/mining
- theme = /datum/mod_theme/mining
- cell = /obj/item/stock_parts/cell/high/plus
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/orebag,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/magboot,
- /obj/item/mod/module/drill,
- )
-
-/obj/item/mod/control/pre_equipped/medical
- theme = /datum/mod_theme/medical
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/health_analyzer,
- /obj/item/mod/module/quick_carry,
- )
-
-/obj/item/mod/control/pre_equipped/rescue
- theme = /datum/mod_theme/rescue
- cell = /obj/item/stock_parts/cell/super
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/health_analyzer,
- )
-
-/obj/item/mod/control/pre_equipped/research
- theme = /datum/mod_theme/research
- cell = /obj/item/stock_parts/cell/super
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/t_ray,
- )
-
-/obj/item/mod/control/pre_equipped/security
- theme = /datum/mod_theme/security
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/holster,
- )
-
-/obj/item/mod/control/pre_equipped/safeguard
- theme = /datum/mod_theme/safeguard
- cell = /obj/item/stock_parts/cell/super
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/jetpack,
- /obj/item/mod/module/holster,
- )
-
-/obj/item/mod/control/pre_equipped/magnate
- theme = /datum/mod_theme/magnate
- cell = /obj/item/stock_parts/cell/hyper
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/holster,
- /obj/item/mod/module/jetpack/advanced,
- )
-
-/obj/item/mod/control/pre_equipped/traitor
- theme = /datum/mod_theme/syndicate
- cell = /obj/item/stock_parts/cell/super
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/dna_lock,
- /obj/item/mod/module/jetpack,
- )
-
-/obj/item/mod/control/pre_equipped/nuclear
- theme = /datum/mod_theme/syndicate
- cell = /obj/item/stock_parts/cell/hyper
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/visor/thermal,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/jetpack/advanced,
- /obj/item/mod/module/holster,
- )
-
-/obj/item/mod/control/pre_equipped/elite
- theme = /datum/mod_theme/elite
- cell = /obj/item/stock_parts/cell/bluespace
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/emp_shield,
- /obj/item/mod/module/visor/thermal,
- /obj/item/mod/module/jetpack/advanced,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/holster,
- )
-
-/obj/item/mod/control/pre_equipped/prototype
- theme = /datum/mod_theme/prototype
- cell = /obj/item/stock_parts/cell/high/plus
- initial_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,
- )
-
-/obj/item/mod/control/pre_equipped/responsory
- theme = /datum/mod_theme/responsory
- cell = /obj/item/stock_parts/cell/hyper
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/emp_shield,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/holster,
- )
- var/insignia_type = /obj/item/mod/module/insignia
-
-/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin)
- initial_modules.Insert(1, insignia_type)
- return ..()
-
-/obj/item/mod/control/pre_equipped/responsory/commander
- insignia_type = /obj/item/mod/module/insignia/commander
-
-/obj/item/mod/control/pre_equipped/responsory/security
- insignia_type = /obj/item/mod/module/insignia/security
-
-/obj/item/mod/control/pre_equipped/responsory/engineer
- insignia_type = /obj/item/mod/module/insignia/engineer
-
-/obj/item/mod/control/pre_equipped/responsory/medic
- insignia_type = /obj/item/mod/module/insignia/medic
-
-/obj/item/mod/control/pre_equipped/responsory/janitor
- insignia_type = /obj/item/mod/module/insignia/janitor
-
-/obj/item/mod/control/pre_equipped/responsory/clown
- insignia_type = /obj/item/mod/module/insignia/clown
-
-/obj/item/mod/control/pre_equipped/responsory/chaplain
- insignia_type = /obj/item/mod/module/insignia/chaplain
-
-/obj/item/mod/control/pre_equipped/responsory/inquisitory
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/anti_magic,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/emp_shield,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/holster,
- )
- applied_skin = "inquisitory"
-
-/obj/item/mod/control/pre_equipped/responsory/inquisitory/commander
- insignia_type = /obj/item/mod/module/insignia/commander
-
-/obj/item/mod/control/pre_equipped/responsory/inquisitory/security
- insignia_type = /obj/item/mod/module/insignia/security
-
-/obj/item/mod/control/pre_equipped/responsory/inquisitory/medic
- insignia_type = /obj/item/mod/module/insignia/medic
-
-/obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain
- insignia_type = /obj/item/mod/module/insignia/chaplain
-
-/obj/item/mod/control/pre_equipped/apocryphal
- theme = /datum/mod_theme/apocryphal
- cell = /obj/item/stock_parts/cell/bluespace
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/emp_shield,
- /obj/item/mod/module/holster,
- /obj/item/mod/module/jetpack,
- )
-
-/obj/item/mod/control/pre_equipped/corporate
- theme = /datum/mod_theme/corporate
- cell = /obj/item/stock_parts/cell/bluespace
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/holster,
- )
-
-/obj/item/mod/control/pre_equipped/debug
- theme = /datum/mod_theme/debug
- cell = /obj/item/stock_parts/cell/bluespace
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/flashlight,
- /obj/item/mod/module/bikehorn,
- /obj/item/mod/module/rad_protection,
- /obj/item/mod/module/tether,
- ) //one of every type of module, for testing if they all work correctly
-
-/obj/item/mod/control/pre_equipped/administrative
- theme = /datum/mod_theme/administrative
- cell = /obj/item/stock_parts/cell/infinite/abductor
- initial_modules = list(
- /obj/item/mod/module/storage,
- /obj/item/mod/module/welding,
- /obj/item/mod/module/quick_carry/advanced,
- /obj/item/mod/module/magboot/advanced,
- /obj/item/mod/module/jetpack/advanced,
- )
-
-//these exist for the prefs menu
-/obj/item/mod/control/pre_equipped/syndicate_empty
- theme = /datum/mod_theme/syndicate
-
-/obj/item/mod/control/pre_equipped/syndicate_empty/elite
- theme = /datum/mod_theme/elite
-
-INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty)
diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm
deleted file mode 100644
index f119a895b3..0000000000
--- a/code/modules/mod/mod_ui.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-/obj/item/mod/control/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "MODsuit", name)
- ui.open()
-
-/obj/item/mod/control/ui_data(mob/user)
- var/data = list()
- data["interface_break"] = interface_break
- data["malfunctioning"] = malfunctioning
- data["open"] = open
- data["active"] = active
- data["locked"] = locked
- data["complexity"] = complexity
- data["selected_module"] = selected_module?.name
- data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant"
- data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job"
- data["AI"] = ai?.name
- data["is_pAI"] = ai ? ispAI(ai) : FALSE
- data["is_user_AI"] = ai ? user == ai : FALSE
- data["cell"] = cell?.name
- data["charge"] = cell ? round(cell.percent(), 1) : 0
- data["modules"] = list()
- for(var/obj/item/mod/module/module as anything in modules)
- var/list/module_data = list(
- name = module.name,
- description = module.desc,
- module_type = module.module_type,
- active = module.active,
- idle_power = module.idle_power_cost,
- active_power = module.active_power_cost,
- use_power = module.use_power_cost,
- complexity = module.complexity,
- cooldown_time = module.cooldown_time,
- cooldown = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS),
- id = module.tgui_id,
- ref = REF(module),
- configuration_data = module.get_configuration()
- )
- module_data += module.add_ui_data()
- data["modules"] += list(module_data)
- return data
-
-/obj/item/mod/control/ui_static_data(mob/user)
- var/data = list()
- data["ui_theme"] = ui_theme
- data["control"] = name
- data["complexity_max"] = complexity_max
- data["helmet"] = helmet?.name
- data["chestplate"] = chestplate?.name
- data["gauntlets"] = gauntlets?.name
- data["boots"] = boots?.name
- return data
-
-/obj/item/mod/control/ui_act(action, params)
- . = ..()
- if(.)
- return
- if((!allowed(usr) || !ispAI(usr)) && locked)
- balloon_alert(usr, "insufficient access!")
- playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return
- if(malfunctioning && prob(75))
- balloon_alert(usr, "button malfunctions!")
- return
- switch(action)
- if("lock")
- locked = !locked
- balloon_alert(usr, "[locked ? "locked" : "unlocked"]!")
- if("activate")
- toggle_activate(usr)
- if("select")
- var/obj/item/mod/module/module = locate(params["ref"]) in modules
- if(!module)
- return
- module.on_select()
- if("configure")
- var/obj/item/mod/module/module = locate(params["ref"]) in modules
- if(!module)
- return
- module.configure_edit(params["key"], params["value"])
- if("remove_pai")
- if(ishuman(usr)) // Only the MODsuit's wearer should be removing the pAI.
- var/mob/user = usr
- extract_pai(user)
- return TRUE
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
deleted file mode 100644
index 2d008cad1c..0000000000
--- a/code/modules/mod/modules/_module.dm
+++ /dev/null
@@ -1,357 +0,0 @@
-/obj/item/mod/module
- name = "MOD module"
- icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
- icon_state = "module"
- /// If it can be removed
- var/removable = TRUE
- /// If it's passive, togglable, usable or active
- var/module_type = MODULE_PASSIVE
- /// Is the module active
- var/active = FALSE
- /// How much space it takes up in the MOD
- var/complexity = 0
- /// Power use when idle
- var/idle_power_cost = DEFAULT_CHARGE_DRAIN * 0
- /// Power use when active
- var/active_power_cost = DEFAULT_CHARGE_DRAIN * 0
- /// Power use when used, we call it manually
- var/use_power_cost = DEFAULT_CHARGE_DRAIN * 0
- /// ID used by their TGUI
- var/tgui_id
- /// Linked MODsuit
- var/obj/item/mod/control/mod
- /// If we're an active module, what item are we?
- var/obj/item/device
- /// Overlay given to the user when the module is inactive
- var/overlay_state_inactive
- /// Overlay given to the user when the module is active
- var/overlay_state_active
- /// Overlay given to the user when the module is used, lasts until cooldown finishes
- var/overlay_state_use
- /// Icon file for the overlay.
- var/overlay_icon_file = 'icons/mob/clothing/modsuit/mod_modules.dmi'
- /// Does the overlay use the control unit's colors?
- var/use_mod_colors = FALSE
- /// What modules are we incompatible with?
- var/list/incompatible_modules = list()
- /// Cooldown after use
- var/cooldown_time = 0
- /// The mouse button needed to use this module
- var/used_signal
- /// If we're allowed to use this module while phased out.
- var/allowed_in_phaseout = FALSE
- /// If we're allowed to use this module while the suit is disabled.
- var/allowed_inactive = FALSE
- /// Timer for the cooldown
- COOLDOWN_DECLARE(cooldown_timer)
-
-/obj/item/mod/module/Initialize(mapload)
- . = ..()
- if(module_type != MODULE_ACTIVE)
- return
- if(ispath(device))
- device = new device(src)
- ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT)
- RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion)
- RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit)
-
-/obj/item/mod/module/Destroy()
- mod?.uninstall(src)
- if(device)
- UnregisterSignal(device, COMSIG_PARENT_PREQDELETED)
- QDEL_NULL(device)
- return ..()
-
-/obj/item/mod/module/examine(mob/user)
- . = ..()
- if(user.hud_list[DIAG_HUD] && user.client.images & user.hud_list[DIAG_HUD])
- . += span_notice("Complexity level: [complexity]")
-
-/// Called from MODsuit's install() proc, so when the module is installed.
-/obj/item/mod/module/proc/on_install()
- return
-
-/// Called from MODsuit's uninstall() proc, so when the module is uninstalled.
-/obj/item/mod/module/proc/on_uninstall()
- return
-
-/// Called when the MODsuit is activated
-/obj/item/mod/module/proc/on_suit_activation()
- return
-
-/// Called when the MODsuit is deactivated
-/obj/item/mod/module/proc/on_suit_deactivation()
- return
-
-/// Called when the MODsuit is equipped
-/obj/item/mod/module/proc/on_equip()
- return
-
-/// Called when the MODsuit is unequipped
-/obj/item/mod/module/proc/on_unequip()
- return
-
-/// Called when the module is selected from the TGUI
-/obj/item/mod/module/proc/on_select()
- if(((!mod.active || mod.activating) && !allowed_inactive) || module_type == MODULE_PASSIVE)
- if(mod.wearer)
- balloon_alert(mod.wearer, "not active!")
- return
- if(module_type != MODULE_USABLE)
- if(active)
- on_deactivation()
- else
- on_activation()
- else
- on_use()
- SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src)
-
-/// Called when the module is activated
-/obj/item/mod/module/proc/on_activation()
- if(!COOLDOWN_FINISHED(src, cooldown_timer))
- balloon_alert(mod.wearer, "on cooldown!")
- return FALSE
- if(!mod.active || mod.activating || !mod.cell?.charge)
- balloon_alert(mod.wearer, "unpowered!")
- return FALSE
- if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob))
- //specifically a to_chat because the user is phased out.
- to_chat(mod.wearer, span_warning("You cannot activate this right now."))
- return FALSE
- if(module_type == MODULE_ACTIVE)
- if(mod.selected_module && !mod.selected_module.on_deactivation())
- return
- mod.selected_module = src
- if(device)
- if(mod.wearer.put_in_hands(device))
- balloon_alert(mod.wearer, "[device] extended")
- RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit)
- else
- balloon_alert(mod.wearer, "can't extend [device]!")
- return
- else
- update_signal()
- balloon_alert(mod.wearer, "[src] activated, alt-click to use")
- active = TRUE
- mod.wearer.update_inv_back()
- return TRUE
-
-/// Called when the module is deactivated
-/obj/item/mod/module/proc/on_deactivation()
- active = FALSE
- if(module_type == MODULE_ACTIVE)
- mod.selected_module = null
- if(device)
- mod.wearer.transferItemToLoc(device, src, TRUE)
- balloon_alert(mod.wearer, "[device] retracted")
- UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED)
- else
- balloon_alert(mod.wearer, "[src] deactivated")
- UnregisterSignal(mod.wearer, used_signal)
- used_signal = null
- mod.wearer.update_inv_back()
- return TRUE
-
-/// Called when the module is used
-/obj/item/mod/module/proc/on_use()
- if(!COOLDOWN_FINISHED(src, cooldown_timer))
- return FALSE
- if(!check_power(use_power_cost))
- return FALSE
- if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob))
- //specifically a to_chat because the user is phased out.
- to_chat(mod.wearer, span_warning("You cannot activate this right now."))
- return FALSE
- COOLDOWN_START(src, cooldown_timer, cooldown_time)
- addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time)
- mod.wearer.update_inv_back()
- return TRUE
-
-/// Called when an activated module without a device is used
-/obj/item/mod/module/proc/on_select_use(atom/target)
- if(mod.wearer.incapacitated(ignore_grab = TRUE))
- return FALSE
- mod.wearer.face_atom(target)
- if(!on_use())
- return FALSE
- return TRUE
-
-/// Called when an activated module without a device is active and the user alt/middle-clicks
-/obj/item/mod/module/proc/on_special_click(mob/source, atom/target)
- SIGNAL_HANDLER
- on_select_use(target)
- return COMSIG_MOB_CANCEL_CLICKON
-
-/// Called on the MODsuit's process
-/obj/item/mod/module/proc/on_process(delta_time)
- if(active)
- if(!drain_power(active_power_cost * delta_time))
- on_deactivation()
- return FALSE
- on_active_process(delta_time)
- else
- drain_power(idle_power_cost * delta_time)
- return TRUE
-
-/// Called on the MODsuit's process if it is an active module
-/obj/item/mod/module/proc/on_active_process(delta_time)
- return
-
-/// Drains power from the suit cell
-/obj/item/mod/module/proc/drain_power(amount)
- if(!check_power(amount))
- return FALSE
- mod.cell.charge = max(0, mod.cell.charge - amount)
- return TRUE
-
-/obj/item/mod/module/proc/check_power(amount)
- if(!mod.cell || (mod.cell.charge < amount))
- return FALSE
- return TRUE
-
-/// Adds additional things to the MODsuit ui_data()
-/obj/item/mod/module/proc/add_ui_data()
- return list()
-
-/// Creates a list of configuring options for this module
-/obj/item/mod/module/proc/get_configuration()
- return list()
-
-/// Generates an element of the get_configuration list with a display name, type and value
-/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values)
- return list("display_name" = display_name, "type" = type, "value" = value, "values" = values)
-
-/// Receives configure edits from the TGUI and edits the vars
-/obj/item/mod/module/proc/configure_edit(key, value)
- return
-
-/// Called when the device moves to a different place on active modules
-/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction)
- SIGNAL_HANDLER
-
- if(!active)
- return
- if(part.loc == src)
- return
- if(part.loc == mod.wearer)
- return
- if(part == device)
- on_deactivation()
-
-/// Called when the device gets deleted on active modules
-/obj/item/mod/module/proc/on_device_deletion(datum/source)
- SIGNAL_HANDLER
-
- if(source == device)
- device = null
- qdel(src)
-
-/// Generates an icon to be used for the suit's worn overlays
-/obj/item/mod/module/proc/generate_worn_overlay()
- . = list()
- if(!mod.active)
- return
- var/used_overlay
- if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer))
- used_overlay = overlay_state_use
- else if(overlay_state_active && active)
- used_overlay = overlay_state_active
- else if(overlay_state_inactive)
- used_overlay = overlay_state_inactive
- else
- return
- var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay)
- if(!use_mod_colors)
- module_icon.appearance_flags |= RESET_COLOR
- . += module_icon
-
-/// Updates the signal used by active modules to be activated
-/obj/item/mod/module/proc/update_signal()
- mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON
- RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click)
-
-/obj/item/mod/module/anomaly_locked
- name = "MOD anomaly locked module"
- desc = "A form of a module, locked behind an anomalous core to function."
- incompatible_modules = list(/obj/item/mod/module/anomaly_locked)
- /// The core item the module runs off.
- var/obj/item/assembly/signaler/anomaly/core
- /// Accepted types of anomaly cores.
- var/list/accepted_anomalies = list(/obj/item/assembly/signaler/anomaly)
- /// If this one starts with a core in.
- var/prebuilt = FALSE
-
-/obj/item/mod/module/anomaly_locked/Initialize(mapload)
- . = ..()
- if(!prebuilt || !length(accepted_anomalies))
- return
- var/core_path = pick(accepted_anomalies)
- core = new core_path(src)
- update_icon_state()
-
-/obj/item/mod/module/anomaly_locked/Destroy()
- QDEL_NULL(core)
- return ..()
-
-/obj/item/mod/module/anomaly_locked/examine(mob/user)
- . = ..()
- if(!length(accepted_anomalies))
- return
- if(core)
- . += span_notice("There is a [core.name] installed in it. You could remove it with a screwdriver...")
- else
- var/list/core_list = list()
- for(var/path in accepted_anomalies)
- var/atom/core_path = path
- core_list += initial(core_path.name)
- . += span_notice("You need to insert \a [english_list(core_list, and_text = " or ")] for this module to function.")
-
-/obj/item/mod/module/anomaly_locked/on_select()
- if(!core)
- balloon_alert(mod.wearer, "no core!")
- return
- return ..()
-
-/obj/item/mod/module/anomaly_locked/on_process(delta_time)
- . = ..()
- if(!core)
- return FALSE
-
-/obj/item/mod/module/anomaly_locked/on_active_process(delta_time)
- if(!core)
- return FALSE
- return TRUE
-
-/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, params)
- if(item.type in accepted_anomalies)
- if(core)
- balloon_alert(user, "core already in!")
- return
- if(!user.transferItemToLoc(item, src))
- return
- core = item
- balloon_alert(user, "core installed")
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
- update_icon_state()
- else
- return ..()
-
-/obj/item/mod/module/anomaly_locked/screwdriver_act(mob/living/user, obj/item/tool)
- . = ..()
- if(!core)
- balloon_alert(user, "no core!")
- return
- balloon_alert(user, "removing core...")
- if(!do_after(user, 3 SECONDS, target = src))
- balloon_alert(user, "interrupted!")
- return
- balloon_alert(user, "core removed")
- core.forceMove(drop_location())
- if(Adjacent(user) && !issilicon(user))
- user.put_in_hands(core)
- core = null
- update_icon_state()
-
-/obj/item/mod/module/anomaly_locked/update_icon_state()
- icon_state = initial(icon_state) + (core ? "-core" : "")
- return ..()
diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm
deleted file mode 100644
index 0e0da3572b..0000000000
--- a/code/modules/mod/modules/modules.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-/obj/item/mod/module/anti_magic/on_suit_activation()
- ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT)
- ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT)
-
-/obj/item/mod/module/anti_magic/on_suit_deactivation()
- REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT)
- REMOVE_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT)
-
-/obj/item/mod/module/anti_magic/wizard
- name = "MOD magic neutralizer module"
- desc = "The caster wielding this spell gains an invisible barrier around them, channeling arcane power through \
- specialized runes engraved onto the surface of the suit to generate anti-magic field. \
- The field will neutralize all magic that comes into contact with the user. \
- It will not protect the caster from social ridicule."
- icon_state = "magic_neutralizer"
-
-/obj/item/mod/module/anti_magic/wizard/on_suit_activation()
- ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT)
-
-/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation()
- REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT)
-
-/obj/item/mod/module/kinesis //TODO POST-MERGE MAKE NOT SUCK ASS, MAKE BALLER AS FUCK
- name = "MOD kinesis module"
- desc = "A modular plug-in to the forearm, this module was presumed lost for many years, \
- despite the suits it used to be mounted on still seeing some circulation. \
- This piece of technology allows the user to generate precise anti-gravity fields, \
- letting them move objects as small as a titanium rod to as large as industrial machinery. \
- Oddly enough, it doesn't seem to work on living creatures."
- icon_state = "kinesis"
-// module_type = MODULE_ACTIVE
- module_type = MODULE_TOGGLE
-// complexity = 3
- complexity = 0
- active_power_cost = DEFAULT_CHARGE_DRAIN*0.75
-// use_power_cost = DEFAULT_CHARGE_DRAIN*3
- removable = FALSE
- incompatible_modules = list(/obj/item/mod/module/kinesis)
- cooldown_time = 0.5 SECONDS
- var/has_tk = FALSE
-
-/obj/item/mod/module/kinesis/on_activation()
- . = ..()
- if(!.)
- return
- if(mod.wearer.dna.check_mutation(TK))
- has_tk = TRUE
- else
- mod.wearer.dna.add_mutation(TK)
-
-/obj/item/mod/module/kinesis/on_deactivation()
- . = ..()
- if(!.)
- return
- if(has_tk)
- has_tk = FALSE
- return
- mod.wearer.dna.remove_mutation(TK)
-
-/obj/item/mod/module/insignia
- name = "MOD insignia module"
- desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \
- the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \
- they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \
- color patterns to and from the suit."
- icon_state = "insignia"
- removable = FALSE
- incompatible_modules = list(/obj/item/mod/module/insignia)
- overlay_state_inactive = "insignia"
-
-/obj/item/mod/module/insignia/generate_worn_overlay()
- overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]"
- . = ..()
- for(var/mutable_appearance/appearance as anything in .)
- appearance.color = color
-
-/obj/item/mod/module/insignia/commander
- color = "#4980a5"
-
-/obj/item/mod/module/insignia/security
- color = "#b30d1e"
-
-/obj/item/mod/module/insignia/engineer
- color = "#e9c80e"
-
-/obj/item/mod/module/insignia/medic
- color = "#ebebf5"
-
-/obj/item/mod/module/insignia/janitor
- color = "#7925c7"
-
-/obj/item/mod/module/insignia/clown
- color = "#ff1fc7"
-
-/obj/item/mod/module/insignia/chaplain
- color = "#f0a00c"
diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm
deleted file mode 100644
index cc0a6812f1..0000000000
--- a/code/modules/mod/modules/modules_engineering.dm
+++ /dev/null
@@ -1,215 +0,0 @@
-//Engineering modules for MODsuits
-
-///Welding Protection - Makes the helmet protect from flashes and welding.
-/obj/item/mod/module/welding
- name = "MOD welding protection module"
- desc = "A module installed into the visor of the suit, this projects a \
- polarized, holographic overlay in front of the user's eyes. It's rated high enough for \
- immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights."
- icon_state = "welding"
- complexity = 1
- incompatible_modules = list(/obj/item/mod/module/welding)
- overlay_state_inactive = "module_welding"
-
-/obj/item/mod/module/welding/on_suit_activation()
- mod.helmet.flash_protect = 2
-
-/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE)
- if(deleting)
- return
- mod.helmet.flash_protect = initial(mod.helmet.flash_protect)
-
-///T-Ray Scan - Scans the terrain for undertile objects.
-/obj/item/mod/module/t_ray
- name = "MOD t-ray scan module"
- desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \
- to essentially echolocate things beneath the floor, mostly cables and pipes. \
- A staple of atmospherics work, and counter-smuggling work."
- icon_state = "tray"
- module_type = MODULE_TOGGLE
- complexity = 1
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
- incompatible_modules = list(/obj/item/mod/module/t_ray)
- cooldown_time = 0.5 SECONDS
- /// T-ray scan range.
- var/range = 4
-
-/obj/item/mod/module/t_ray/on_active_process(delta_time)
- t_ray_scan(mod.wearer, 0.8 SECONDS, range)
-
-///Magnetic Stability - Gives the user a slowdown but makes them negate gravity and be immune to slips.
-/obj/item/mod/module/magboot
- name = "MOD magnetic stability module"
- desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \
- excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \
- However, these basic models do not feature computerized systems to automatically toggle them on and off, \
- so numerous users report a certain stickiness to their steps."
- icon_state = "magnet"
- module_type = MODULE_TOGGLE
- complexity = 2
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
- incompatible_modules = list(/obj/item/mod/module/magboot)
- cooldown_time = 0.5 SECONDS
- /// Slowdown added onto the suit.
- var/slowdown_active = 2
-
-/obj/item/mod/module/magboot/on_activation()
- . = ..()
- if(!.)
- return
- mod.boots.clothing_flags |= NOSLIP
- ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT)
- mod.slowdown += slowdown_active
- mod.wearer.update_gravity(mod.wearer.has_gravity())
- mod.wearer.update_equipment_speed_mods()
-
-/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- mod.boots.clothing_flags &= ~NOSLIP
- REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT)
- mod.slowdown -= slowdown_active
- mod.wearer.update_gravity(mod.wearer.has_gravity())
- mod.wearer.update_equipment_speed_mods()
-
-/obj/item/mod/module/magboot/advanced
- name = "MOD advanced magnetic stability module"
- removable = FALSE
- complexity = 0
- slowdown_active = 0
-
-///Emergency Tether - Shoots a grappling hook projectile in 0g that throws the user towards it.
-/obj/item/mod/module/tether
- name = "MOD emergency tether module"
- desc = "A custom-built grappling-hook powered by a winch capable of hauling the user. \
- While some older models of cargo-oriented grapples have capacities of a few tons, \
- these are only capable of working in zero-gravity environments, a blessing to some Engineers."
- icon_state = "tether"
- module_type = MODULE_ACTIVE
- complexity = 3
- use_power_cost = DEFAULT_CHARGE_DRAIN
- incompatible_modules = list(/obj/item/mod/module/tether)
- cooldown_time = 1.5 SECONDS
-
-/obj/item/mod/module/tether/on_use()
- if(mod.wearer.has_gravity(get_turf(src)))
- balloon_alert(mod.wearer, "too much gravity!")
- playsound(src, "gun_dry_fire", 25, TRUE)
- return FALSE
- return ..()
-
-/obj/item/mod/module/tether/on_select_use(atom/target)
- . = ..()
- if(!.)
- return
- var/obj/item/projectile/tether = new /obj/item/projectile/tether(mod.wearer.loc)
- tether.preparePixelProjectile(target, mod.wearer)
- tether.firer = mod.wearer
- playsound(src, 'sound/weapons/batonextend.ogg', 25, TRUE)
- INVOKE_ASYNC(tether, /obj/item/projectile.proc/fire)
- drain_power(use_power_cost)
-
-/obj/item/projectile/tether
- name = "tether"
- icon_state = "tether_projectile"
- icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
- damage = 0
- nodamage = TRUE
- range = 10
- hitsound = 'sound/weapons/batonextend.ogg'
- hitsound_wall = 'sound/weapons/batonextend.ogg'
- suppressed = SUPPRESSED_VERY
- hit_threshhold = LATTICE_LAYER
- /// Reference to the beam following the projectile.
- var/line
-
-/obj/item/projectile/tether/fire(setAngle)
- if(firer)
- line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi')
- ..()
-
-/obj/item/projectile/tether/on_hit(atom/target)
- . = ..()
- if(firer)
- firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE)
-
-/obj/item/projectile/tether/Destroy()
- QDEL_NULL(line)
- return ..()
-
-///Radiation Protection - Protects the user from radiation, gives them a geiger counter and rad info in the panel.
-/obj/item/mod/module/rad_protection
- name = "MOD radiation protection module"
- desc = "A module utilizing polymers and reflective shielding to protect the user against ionizing radiation."
- icon_state = "radshield"
- complexity = 2
- idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- incompatible_modules = list(/obj/item/mod/module/rad_protection)
-
-/obj/item/mod/module/rad_protection/on_suit_activation()
- mod.armor = mod.armor.modifyRating(rad = 65)
- mod.rad_flags = RAD_PROTECT_CONTENTS|RAD_NO_CONTAMINATE
- for(var/obj/item/part in mod.mod_parts)
- part.armor = mod.armor
- part.rad_flags = mod.rad_flags
-
-/obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE)
- mod.armor = mod.armor.modifyRating(rad = -65)
- mod.rad_flags = NONE
- for(var/obj/item/part in mod.mod_parts)
- part.armor = mod.armor
- part.rad_flags = mod.rad_flags
-
-///Constructor - Lets you build quicker and create RCD holograms.
-/obj/item/mod/module/constructor
- name = "MOD constructor module"
- desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \
- advanced arm servos meant to carry crewmembers. However, it contains the \
- latest engineering schematics combined with inbuilt memory to help the user build walls."
- icon_state = "constructor"
- module_type = MODULE_USABLE
- complexity = 2
- idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
- use_power_cost = DEFAULT_CHARGE_DRAIN * 2
- incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry)
- cooldown_time = 11 SECONDS
-
-/obj/item/mod/module/constructor/on_suit_activation()
- ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT)
-
-/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE)
- REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT)
-
-///Mister - Sprays water over an area.
-/obj/item/mod/module/mister
- name = "MOD water mister module"
- desc = "A module containing a mister, able to spray it over areas."
- icon_state = "mister"
- module_type = MODULE_ACTIVE
- complexity = 2
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- device = /obj/item/reagent_containers/spray/mister
- incompatible_modules = list(/obj/item/mod/module/mister)
- cooldown_time = 0.5 SECONDS
- /// Volume of our reagent holder.
- var/volume = 500
-
-/obj/item/mod/module/mister/Initialize(mapload)
- create_reagents(volume, OPENCONTAINER)
- return ..()
-
-///Resin Mister - Sprays resin over an area.
-/obj/item/mod/module/mister/atmos
- name = "MOD resin mister module"
- desc = "An atmospheric resin mister, able to fix up areas quickly."
- device = /obj/item/extinguisher/mini/nozzle/mod
- volume = 250
-
-/obj/item/mod/module/mister/atmos/Initialize(mapload)
- . = ..()
- reagents.add_reagent(/datum/reagent/water, volume)
-
-/obj/item/extinguisher/mini/nozzle/mod
- name = "MOD atmospheric mister"
- desc = "An atmospheric resin mister with three modes, mounted as a module."
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
deleted file mode 100644
index f2713d4c9c..0000000000
--- a/code/modules/mod/modules/modules_general.dm
+++ /dev/null
@@ -1,402 +0,0 @@
-//General modules for MODsuits
-
-///Storage - Adds a storage component to the suit.
-/obj/item/mod/module/storage
- name = "MOD storage containment module"
- desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \
- the surface of the suit, useful for storing various bits, and or bobs."
- icon_state = "storage"
- complexity = 3
- incompatible_modules = list(/obj/item/mod/module/storage)
- module_type = MODULE_USABLE
- cooldown_time = 0.5 SECONDS
- allowed_inactive = TRUE
- /// Bag we have stored.
- var/obj/item/storage/backpack/stored
-
-/obj/item/mod/module/storage/attackby(obj/item/I, mob/user, params)
- if(!istype(I, /obj/item/storage/backpack))
- return ..()
- var/obj/item/storage/backpack/B = I
- if(stored)
- balloon_alert(user, "backpack already installed!")
- return
- if(!user.transferItemToLoc(B, src))
- return
- stored = B
- balloon_alert(user, "backpack installed")
- playsound(src, 'sound/machines/click.ogg', 30, TRUE)
-
-/obj/item/mod/module/storage/screwdriver_act(mob/living/user, obj/item/tool)
- . = ..()
- if(!stored)
- balloon_alert(user, "no backpack!")
- return
- balloon_alert(user, "removing backpack...")
- if(!do_after(user, 3 SECONDS, target = src))
- balloon_alert(user, "interrupted!")
- return
- balloon_alert(user, "backpack removed")
- stored.forceMove(drop_location())
- if(Adjacent(user) && !issilicon(user))
- user.put_in_hands(stored)
- stored = null
-
-/obj/item/mod/module/storage/on_use()
- . = ..()
- if(!.)
- return
- if(!stored)
- var/obj/item/storage/backpack/holding = mod.wearer.get_active_held_item()
- if(!holding)
- balloon_alert(mod.wearer, "no backpack installed!")
- return
- if(!istype(holding))
- balloon_alert(mod.wearer, "it doesn't fit!")
- return
- if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE))
- stored = holding
- balloon_alert(mod.wearer, "backpack stored")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE))
- balloon_alert(mod.wearer, "backpack retrieved")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else
- balloon_alert(mod.wearer, "backpack storage full!")
-
-/obj/item/mod/module/storage/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone == stored)
- stored = null
-
-/obj/item/mod/module/storage/Destroy()
- QDEL_NULL(stored)
- return ..()
-
-///Ion Jetpack - Lets the user fly freely through space using battery charge.
-/obj/item/mod/module/jetpack
- name = "MOD ion jetpack module"
- desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \
- Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \
- charge from the suit's charge. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits."
- icon_state = "jetpack"
- module_type = MODULE_TOGGLE
- complexity = 3
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
- use_power_cost = DEFAULT_CHARGE_DRAIN
- incompatible_modules = list(/obj/item/mod/module/jetpack)
- cooldown_time = 0.5 SECONDS
- overlay_state_inactive = "module_jetpack"
- overlay_state_active = "module_jetpack_on"
- /// Do we stop the wearer from gliding in space.
- var/stabilizers = FALSE
- /// Do we give the wearer a speed buff.
- var/full_speed = FALSE
- var/datum/effect_system/trail_follow/ion/ion_trail
-
-/obj/item/mod/module/jetpack/Initialize(mapload)
- . = ..()
- ion_trail = new
- ion_trail.set_up(src)
-
-/obj/item/mod/module/jetpack/Destroy()
- QDEL_NULL(ion_trail)
- return ..()
-
-/obj/item/mod/module/jetpack/on_activation()
- . = ..()
- if(!.)
- return
- ion_trail.start()
- RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/move_react)
- RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react, override = TRUE)
- if(full_speed)
- mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
- else
- mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack)
-
-/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- stabilizers = FALSE
- ion_trail.stop()
- UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
- mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
- mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack)
-
-/obj/item/mod/module/jetpack/get_configuration()
- . = ..()
- .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers)
-
-/obj/item/mod/module/jetpack/configure_edit(key, value)
- switch(key)
- if("stabilizers")
- stabilizers = text2num(value)
-
-/obj/item/mod/module/jetpack/proc/move_react(mob/user)
- allow_thrust()
-
-/obj/item/mod/module/jetpack/proc/allow_thrust(use_fuel = TRUE)
- if(!active)
- return FALSE
- if(!use_fuel)
- return check_power(use_power_cost)
- if(!drain_power(use_power_cost))
- return FALSE
- return TRUE
-
-/obj/item/mod/module/jetpack/proc/spacemove_react(mob/user, movement_dir)
- SIGNAL_HANDLER
-
- if(active && (movement_dir || stabilizers))
- return COMSIG_MOVABLE_STOP_SPACEMOVE
-
-/obj/item/mod/module/jetpack/advanced
- name = "MOD advanced ion jetpack module"
- desc = "An improvement on the previous model of electric thrusters. This one achieves higher speeds through \
- mounting of more jets and a red paint applied on it."
- icon_state = "jetpack_advanced"
- overlay_state_inactive = "module_jetpackadv"
- overlay_state_active = "module_jetpackadv_on"
- full_speed = TRUE
-
-///Eating Apparatus - Lets the user eat/drink with the suit on.
-/obj/item/mod/module/mouthhole
- name = "MOD eating apparatus module"
- desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \
- to allow eating and drinking while retaining protection and atmosphere. However, it won't free you from masks, \
- lets pepper spray pass through and it will do nothing to improve the taste of a goliath steak."
- icon_state = "apparatus"
- complexity = 1
- incompatible_modules = list(/obj/item/mod/module/mouthhole)
- overlay_state_inactive = "module_apparatus"
- /// Former flags of the helmet.
- var/former_flags = NONE
- /// Former visor flags of the helmet.
- var/former_visor_flags = NONE
-
-/obj/item/mod/module/mouthhole/on_install()
- former_flags = mod.helmet.flags_cover
- former_visor_flags = mod.helmet.visor_flags_cover
- mod.helmet.flags_cover &= ~HEADCOVERSMOUTH
- mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH
-
-/obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE)
- if(deleting)
- return
- mod.helmet.flags_cover |= former_flags
- mod.helmet.visor_flags_cover |= former_visor_flags
-
-///EMP Shield - Protects the suit from EMPs.
-/obj/item/mod/module/emp_shield
- name = "MOD EMP shield module"
- desc = "A field inhibitor installed into the suit, protecting it against feedback such as \
- electromagnetic pulses that would otherwise damage the electronic systems of the suit or it's modules. \
- However, it will take from the suit's power to do so."
- icon_state = "empshield"
- complexity = 1
- idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- incompatible_modules = list(/obj/item/mod/module/emp_shield)
-
-/obj/item/mod/module/emp_shield/on_install()
- mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS)
-
-/obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE)
- mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS)
-
-/obj/item/mod/module/emp_shield/advanced
- name = "MOD advanced EMP shield module"
- desc = "An advanced field inhibitor installed into the suit, protecting it against feedback such as \
- electromagnetic pulses that would otherwise damage the electronic systems of the suit or electronic devices on the wearer, \
- including augmentations. However, it will take from the suit's power to do so."
- complexity = 2
-
-/obj/item/mod/module/emp_shield/advanced/on_suit_activation()
- mod.wearer.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS)
-
-/obj/item/mod/module/emp_shield/advanced/on_suit_deactivation(deleting)
- mod.wearer.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS)
-
-///Flashlight - Gives the suit a customizable flashlight.
-/obj/item/mod/module/flashlight
- name = "MOD flashlight module"
- desc = "A simple pair of configurable flashlights installed on the left and right sides of the helmet, \
- useful for providing light in a variety of ranges and colors. \
- Some survivalists prefer the color green for their illumination, for reasons unknown."
- icon_state = "flashlight"
- module_type = MODULE_TOGGLE
- complexity = 1
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- incompatible_modules = list(/obj/item/mod/module/flashlight)
- cooldown_time = 0.5 SECONDS
- overlay_state_inactive = "module_light"
- light_color = COLOR_WHITE
- light_range = 4
- light_power = 1
- /// Charge drain per range amount.
- var/base_power = DEFAULT_CHARGE_DRAIN * 0.1
- /// Minimum range we can set.
- var/min_range = 2
- /// Maximum range we can set.
- var/max_range = 5
-
-/obj/item/mod/module/flashlight/on_activation()
- . = ..()
- if(!.)
- return
- mod.set_light(light_range, light_power, light_color)
- active_power_cost = base_power * light_range
-
-/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- mod.set_light(0, 0)
-
-/obj/item/mod/module/flashlight/on_process(delta_time)
- active_power_cost = base_power * light_range
- return ..()
-
-/obj/item/mod/module/flashlight/generate_worn_overlay()
- . = ..()
- if(!active)
- return
- var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on")
- light_icon.appearance_flags = RESET_COLOR
- light_icon.color = light_color
- . += light_icon
-
-/obj/item/mod/module/flashlight/get_configuration()
- . = ..()
- .["light_color"] = add_ui_configuration("Light Color", "color", light_color)
- .["light_range"] = add_ui_configuration("Light Range", "number", light_range)
-
-/obj/item/mod/module/flashlight/configure_edit(key, value)
- switch(key)
- if("light_color")
- value = input(usr, "Pick new light color", "Flashlight Color") as color|null
- if(!value)
- return
- var/list/hsl = rgb2hsl(hex2num(copytext(value,2,4)),hex2num(copytext(value,4,6)),hex2num(copytext(value,6,8)))
- if(hsl[3] < 0.5)
- balloon_alert(mod.wearer, "too dark!")
- return
- mod.set_light_color(value)
- mod.wearer.regenerate_icons()
- light_color = value
- if("light_range")
- mod.set_light_range(clamp(value, min_range, max_range))
- light_range = clamp(value, min_range, max_range)
-
-///Dispenser - Dispenses an item after a time passes.
-/obj/item/mod/module/dispenser
- name = "MOD burger dispenser module"
- desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \
- This can draw incredible amounts of power from the suit's charge to create edible organic matter in the \
- palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \
- Notably, all attempts to get it to dispense Earl Grey tea have failed."
- icon_state = "dispenser"
- module_type = MODULE_USABLE
- complexity = 3
- use_power_cost = DEFAULT_CHARGE_DRAIN * 2
- incompatible_modules = list(/obj/item/mod/module/dispenser)
- cooldown_time = 5 SECONDS
- /// Path we dispense.
- var/dispense_type = /obj/item/reagent_containers/food/snacks/burger/plain
- /// Time it takes for us to dispense.
- var/dispense_time = 0 SECONDS
-
-/obj/item/mod/module/dispenser/on_use()
- . = ..()
- if(!.)
- return
- if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod))
- balloon_alert(mod.wearer, "interrupted!")
- return FALSE
- var/obj/item/dispensed = new dispense_type(mod.wearer.loc)
- mod.wearer.put_in_hands(dispensed)
- balloon_alert(mod.wearer, "[dispensed] dispensed")
- playsound(src, 'sound/machines/click.ogg', 100, TRUE)
- drain_power(use_power_cost)
- return dispensed
-
-///Longfall
-
-///Thermal Regulator - Naw.
-
-///DNA Lock - Prevents people without the set DNA from activating the suit.
-/obj/item/mod/module/dna_lock
- name = "MOD DNA lock module"
- desc = "A module which engages with the various locks and seals tied to the suit's systems, \
- enabling it to only be worn by someone corresponding with the user's exact DNA profile; \
- however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed."
- icon_state = "dnalock"
- module_type = MODULE_USABLE
- complexity = 2
- use_power_cost = DEFAULT_CHARGE_DRAIN * 3
- incompatible_modules = list(/obj/item/mod/module/dna_lock)
- cooldown_time = 0.5 SECONDS
- /// The DNA we lock with.
- var/dna = null
-
-/obj/item/mod/module/dna_lock/on_install()
- RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation)
- RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, .proc/on_mod_removal)
- RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
- RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, .proc/on_emag)
-
-/obj/item/mod/module/dna_lock/on_uninstall(deleting = FALSE)
- UnregisterSignal(mod, COMSIG_MOD_ACTIVATE)
- UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL)
- UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT)
- UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT)
-
-/obj/item/mod/module/dna_lock/on_use()
- . = ..()
- if(!.)
- return
- dna = mod.wearer.dna.unique_enzymes
- balloon_alert(mod.wearer, "dna updated")
- drain_power(use_power_cost)
-
-/obj/item/mod/module/dna_lock/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- on_emp(src, severity)
-
-/obj/item/mod/module/dna_lock/emag_act(mob/user, obj/item/card/emag/emag_card)
- . = ..()
- on_emag(src, user, emag_card)
-
-/obj/item/mod/module/dna_lock/proc/dna_check(mob/user)
- if(!iscarbon(user))
- return FALSE
- var/mob/living/carbon/carbon_user = user
- if(!dna || (carbon_user.has_dna() && carbon_user.dna.unique_enzymes == dna))
- return TRUE
- balloon_alert(user, "dna locked!")
- return FALSE
-
-/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity)
- SIGNAL_HANDLER
-
- dna = null
-
-/obj/item/mod/module/dna_lock/proc/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card)
- SIGNAL_HANDLER
-
- dna = null
-
-/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source, mob/user)
- SIGNAL_HANDLER
-
- if(!dna_check(user))
- return MOD_CANCEL_ACTIVATE
-
-/obj/item/mod/module/dna_lock/proc/on_mod_removal(datum/source, mob/user)
- SIGNAL_HANDLER
-
- if(!dna_check(user))
- return MOD_CANCEL_REMOVAL
-
-///Sign Language Translator - I want, but no
diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm
deleted file mode 100644
index f73969d625..0000000000
--- a/code/modules/mod/modules/modules_maint.dm
+++ /dev/null
@@ -1,157 +0,0 @@
-//Maint modules for MODsuits
-
-///Springlock Mechanism - allows your modsuit to activate faster, but reagents are very dangerous.
-/obj/item/mod/module/springlock
- name = "MOD springlock module"
- desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \
- This mechanical exoskeleton pushes out of the way when the user enters and it helps in booting \
- up, but was taken out of modern suits because of the springlock's tendency to \"snap\" back \
- into place when exposed to humidity. You know what it's like to have an entire exoskeleton enter you?"
- icon_state = "springlock"
- complexity = 3 // it is inside every part of your suit, so
- incompatible_modules = list(/obj/item/mod/module/springlock)
-
-/obj/item/mod/module/springlock/on_install()
- mod.activation_step_time *= 0.5
-
-/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE)
- mod.activation_step_time *= 2
-
-/obj/item/mod/module/springlock/on_suit_activation()
- RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, .proc/on_wearer_exposed)
-
-/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE)
- UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS)
-
-///Signal fired when wearer is exposed to reagents
-/obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message, from_gas)
- SIGNAL_HANDLER
-
- if(!reagents.len)
- return
- if(!(methods & (VAPOR|PATCH|TOUCH)))
- return //remove non-touch reagent exposure
- to_chat(mod.wearer, span_danger("[src] makes an ominous click sound..."))
- playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE)
- addtimer(CALLBACK(src, .proc/snap_shut), rand(3 SECONDS, 5 SECONDS))
- RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_activate_spring_block)
-
-///Signal fired when wearer attempts to activate/deactivate suits
-/obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user)
- SIGNAL_HANDLER
-
- balloon_alert(user, "springlocks aren't responding...?")
- return MOD_CANCEL_ACTIVATE
-
-///Delayed death proc of the suit after the wearer is exposed to reagents
-/obj/item/mod/module/springlock/proc/snap_shut()
- UnregisterSignal(mod, COMSIG_MOD_ACTIVATE)
- if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc
- return
- mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*"))
- mod.wearer.emote("scream")
- playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
- playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
- mod.wearer.client?.give_award(/datum/award/achievement/misc/springlock, mod.wearer)
- mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc
- if(!HAS_TRAIT(mod.wearer, TRAIT_NODEATH))
- mod.wearer.death() //just in case, for some reason, they're still alive
- flash_color(mod.wearer, flash_color = "#FF0000", flash_time = 10 SECONDS)
-
-///Rave Visor - Pointless
-
-///Tanner - Maybe another time
-
-///Balloon Blower - Blows a balloon.
-/obj/item/mod/module/balloon
- name = "MOD balloon blower module"
- desc = "A strange module invented years ago by some ingenious mimes. It blows balloons."
- icon_state = "bloon"
- module_type = MODULE_USABLE
- complexity = 1
- use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
- incompatible_modules = list(/obj/item/mod/module/balloon)
- cooldown_time = 15 SECONDS
-
-/obj/item/mod/module/balloon/on_use()
- . = ..()
- if(!.)
- return
- if(!do_after(mod.wearer, 10 SECONDS, target = mod))
- return FALSE
- mod.wearer.adjustOxyLoss(20)
- playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE)
- var/obj/item/toy/balloon/balloon = new(get_turf(src))
- mod.wearer.put_in_hands(balloon)
- drain_power(use_power_cost)
-
-///Paper Dispenser - Dispenses (sometimes burning) paper sheets.
-/obj/item/mod/module/paper_dispenser
- name = "MOD paper dispenser module"
- desc = "A simple module designed by the bureaucrats of Torch Bay. \
- It dispenses 'warm, clean, and crisp sheets of paper' onto a nearby table. Usually."
- icon_state = "paper_maker"
- module_type = MODULE_USABLE
- complexity = 1
- use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
- incompatible_modules = list(/obj/item/mod/module/paper_dispenser)
- cooldown_time = 5 SECONDS
- /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire.
- var/num_sheets_dispensed = 0
-
-/obj/item/mod/module/paper_dispenser/on_use()
- . = ..()
- if(!.)
- return
- if(!do_after(mod.wearer, 1 SECONDS, target = mod))
- return FALSE
-
- var/obj/item/paper/crisp_paper = new(get_turf(src))
- crisp_paper.desc = "It's crisp and warm to the touch. Must be fresh."
-
- var/obj/structure/table/nearby_table = locate() in range(1, mod.wearer)
- playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
- balloon_alert(mod.wearer, "dispensed paper[nearby_table ? " onto table":""]")
-
- mod.wearer.put_in_hands(crisp_paper)
- if(nearby_table)
- mod.wearer.transferItemToLoc(crisp_paper, nearby_table.drop_location(), silent = FALSE)
-
- // Up to a 30% chance to set the sheet on fire, +2% per sheet made
- if(prob(min(num_sheets_dispensed * 2, 30)))
- if(crisp_paper in mod.wearer.held_items)
- mod.wearer.dropItemToGround(crisp_paper, force = TRUE)
- crisp_paper.balloon_alert(mod.wearer, "PC LOAD LETTER!")
- crisp_paper.visible_message(span_warning("[crisp_paper] bursts into flames, it's too crisp!"))
- crisp_paper.fire_act(1000, 100)
-
- drain_power(use_power_cost)
- num_sheets_dispensed++
-
-
-///Stamper - Extends a stamp that can switch between accept/deny modes.
-/obj/item/mod/module/stamp
- name = "MOD stamper module"
- desc = "A module installed into the wrist of the suit, this functions as a high-power stamp, \
- able to switch between accept and deny modes."
- icon_state = "stamp"
- module_type = MODULE_ACTIVE
- complexity = 1
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- device = /obj/item/stamp/mod
- incompatible_modules = list(/obj/item/mod/module/stamp)
- cooldown_time = 0.5 SECONDS
-
-/obj/item/stamp/mod
- name = "MOD electronic stamp"
- desc = "A high-power stamp, able to switch between accept and deny mode when used."
-
-/obj/item/stamp/mod/attack_self(mob/user, modifiers)
- . = ..()
- if(icon_state == "stamp-ok")
- icon_state = "stamp-deny"
- else
- icon_state = "stamp-ok"
- balloon_alert(user, "switched mode")
-
-///Atrocinator - Perhaps another time
diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm
deleted file mode 100644
index c7e1510152..0000000000
--- a/code/modules/mod/modules/modules_medical.dm
+++ /dev/null
@@ -1,189 +0,0 @@
-//Medical modules for MODsuits
-
-#define HEALTH_SCAN "Health"
-#define WOUND_SCAN "Wound"
-#define CHEM_SCAN "Chemical"
-
-///Health Analyzer - Gives the user a ranged health analyzer and their health status in the panel.
-/obj/item/mod/module/health_analyzer
- name = "MOD health analyzer module"
- desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \
- allowing the user indepth information on the vitals and injuries of others even at a distance, \
- all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \
- but it's up to you to do something with it."
- icon_state = "health"
- module_type = MODULE_ACTIVE
- complexity = 2
- use_power_cost = DEFAULT_CHARGE_DRAIN
- incompatible_modules = list(/obj/item/mod/module/health_analyzer)
- cooldown_time = 0.5 SECONDS
- tgui_id = "health_analyzer"
- /// Scanning mode, changes how we scan something.
- var/mode = HEALTH_SCAN
- /// List of all scanning modes.
- var/static/list/modes = list(HEALTH_SCAN, WOUND_SCAN, CHEM_SCAN)
-
-/obj/item/mod/module/health_analyzer/add_ui_data()
- . = ..()
- .["userhealth"] = mod.wearer?.health || 0
- .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0
- .["userbrute"] = mod.wearer?.getBruteLoss() || 0
- .["userburn"] = mod.wearer?.getFireLoss() || 0
- .["usertoxin"] = mod.wearer?.getToxLoss() || 0
- .["useroxy"] = mod.wearer?.getOxyLoss() || 0
-
-/obj/item/mod/module/health_analyzer/on_select_use(atom/target)
- . = ..()
- if(!.)
- return
- if(!isliving(target) || !mod.wearer.can_read(src))
- return
- switch(mode)
- if(HEALTH_SCAN)
- healthscan(mod.wearer, target)
- if(WOUND_SCAN)
- woundscan(mod.wearer, target)
- if(CHEM_SCAN)
- chemscan(mod.wearer, target)
- drain_power(use_power_cost)
-
-/obj/item/mod/module/health_analyzer/get_configuration()
- . = ..()
- .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes)
-
-/obj/item/mod/module/health_analyzer/configure_edit(key, value)
- switch(key)
- if("mode")
- mode = value
-
-#undef HEALTH_SCAN
-#undef WOUND_SCAN
-#undef CHEM_SCAN
-
-///Quick Carry - Lets the user carry bodies quicker.
-/obj/item/mod/module/quick_carry
- name = "MOD quick carry module"
- desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \
- or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat."
- icon_state = "carry"
- complexity = 1
- idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor)
-
-/obj/item/mod/module/quick_carry/on_suit_activation()
- ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT)
-
-/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE)
- REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT)
-
-/obj/item/mod/module/quick_carry/advanced
- name = "MOD advanced quick carry module"
- removable = FALSE
- complexity = 0
-
-///Injector - No piercing syringes, replace another time
-
-///Organ Thrower
-
-///Patrient Transport
-
-///Defibrillator - Gives the suit an extendable pair of shock paddles.
-/obj/item/mod/module/defibrillator
- name = "MOD defibrillator module"
- desc = "A module built into the gauntlets of the suit; commonly known as the 'Healing Hands' by medical professionals. \
- The user places their palms above the patient. Onboard computers in the suit calculate the necessary voltage, \
- and a modded targeting computer determines the best position for the user to push. \
- Twenty five pounds of force are applied to the patient's skin. Shocks travel from the suit's gloves \
- and counter-shock the heart, and the wearer returns to Medical a hero. Don't you even think about using it as a weapon; \
- regulations on manufacture and software locks expressly forbid it."
- icon_state = "defibrillator"
- module_type = MODULE_ACTIVE
- complexity = 2
- use_power_cost = DEFAULT_CHARGE_DRAIN * 25
- device = /obj/item/shockpaddles/mod
- overlay_state_inactive = "module_defibrillator"
- overlay_state_active = "module_defibrillator_active"
- incompatible_modules = list(/obj/item/mod/module/defibrillator)
- cooldown_time = 0.5 SECONDS
- var/defib_cooldown = 5 SECONDS
-
-/obj/item/mod/module/defibrillator/Initialize(mapload)
- . = ..()
- RegisterSignal(device, COMSIG_DEFIBRILLATOR_SUCCESS, .proc/on_defib_success)
-
-/obj/item/mod/module/defibrillator/Destroy()
- UnregisterSignal(device, COMSIG_DEFIBRILLATOR_SUCCESS)
- . = ..()
-
-/obj/item/mod/module/defibrillator/proc/on_defib_success(obj/item/shockpaddles/source)
- drain_power(use_power_cost)
- source.recharge(defib_cooldown)
- return COMPONENT_DEFIB_STOP
-
-/obj/item/shockpaddles/mod
- name = "MOD defibrillator gauntlets"
- req_defib = FALSE
- icon_state = "defibgauntlets0"
- item_state = "defibgauntlets0"
- base_icon_state = "defibgauntlets"
-
-/obj/item/mod/module/defibrillator/combat
- name = "MOD combat defibrillator module"
- desc = "A module built into the gauntlets of the suit; commonly known as the 'Healing Hands' by medical professionals. \
- The user places their palms above the patient. Onboard computers in the suit calculate the necessary voltage, \
- and a modded targeting computer determines the best position for the user to push. \
- Twenty five pounds of force are applied to the patient's skin. Shocks travel from the suit's gloves \
- and counter-shock the heart, and the wearer returns to Medical a hero. \
- Interdyne Pharmaceutics marketed the domestic version of the Healing Hands as foolproof and unusable as a weapon. \
- But when it came time to provide their operatives with usable medical equipment, they didn't hesitate to remove \
- those in-built safeties. Operatives in the field can benefit from what they dub as 'Stun Gloves', able to apply shocks \
- straight to a victims heart to disable them, or maybe even outright stop their heart with enough power."
- complexity = 1
- module_type = MODULE_ACTIVE
- overlay_state_inactive = "module_defibrillator_combat"
- overlay_state_active = "module_defibrillator_combat_active"
- device = /obj/item/shockpaddles/syndicate/mod
- defib_cooldown = 2.5 SECONDS
-
-/obj/item/shockpaddles/syndicate/mod
- name = "MOD combat defibrillator gauntlets"
- req_defib = FALSE
- icon_state = "syndiegauntlets0"
- item_state = "syndiegauntlets0"
- base_icon_state = "syndiegauntlets"
-
-///Thread Ripper
-
-///Surgical Processor - Lets you do advanced surgeries portably.
-/obj/item/mod/module/surgical_processor
- name = "MOD surgical processor module"
- desc = "A module using an onboard surgical computer which can be connected to other computers to download and \
- perform advanced surgeries on the go."
- icon_state = "surgical_processor"
- module_type = MODULE_ACTIVE
- complexity = 2
- active_power_cost = DEFAULT_CHARGE_DRAIN
- device = /obj/item/surgical_processor/mod
- incompatible_modules = list(/obj/item/mod/module/surgical_processor)
- cooldown_time = 0.5 SECONDS
-
-/obj/item/surgical_processor/mod
- name = "MOD surgical processor"
-
-/obj/item/mod/module/surgical_processor/preloaded
- desc = "A module using an onboard surgical computer which can be connected to other computers to download and \
- perform advanced surgeries on the go. This one came pre-loaded with some advanced surgeries."
- device = /obj/item/surgical_processor/mod/preloaded
-
-/obj/item/surgical_processor/mod/preloaded
- advanced_surgeries = list(
- /datum/surgery/advanced/pacify,
- /datum/surgery/healing/combo/upgraded/femto,
- /datum/surgery/advanced/brainwashing,
- /datum/surgery/advanced/bioware/nerve_splicing,
- /datum/surgery/advanced/bioware/nerve_grounding,
- /datum/surgery/advanced/bioware/vein_threading,
- /datum/surgery/advanced/bioware/muscled_veins,
- /datum/surgery/advanced/bioware/ligament_hook,
- /datum/surgery/advanced/bioware/ligament_reinforcement
- )
diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm
deleted file mode 100644
index 7208210b76..0000000000
--- a/code/modules/mod/modules/modules_science.dm
+++ /dev/null
@@ -1,135 +0,0 @@
-//Science modules for MODsuits
-
-///Reagent Scanner - Lets the user scan reagents.
-/obj/item/mod/module/reagent_scanner
- name = "MOD reagent scanner module"
- desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \
- containers and projecting the information in an easy-to-read format on the wearer's display. \
- It cannot detect flavors, so that's up to you."
- icon_state = "scanner"
- module_type = MODULE_TOGGLE
- complexity = 1
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
- incompatible_modules = list(/obj/item/mod/module/reagent_scanner)
- cooldown_time = 0.5 SECONDS
-
-/obj/item/mod/module/reagent_scanner/on_activation()
- . = ..()
- if(!.)
- return
- ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT)
-
-/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT)
-
-/obj/item/mod/module/reagent_scanner/advanced
- name = "MOD advanced reagent scanner module"
- complexity = 0
- removable = FALSE
- var/explosion_detection_dist = 21
- var/had_research_scanner = FALSE
-
-/obj/item/mod/module/reagent_scanner/advanced/on_activation()
- . = ..()
- if(!.)
- return
- had_research_scanner = mod.wearer.research_scanner
- mod.wearer.research_scanner = TRUE
- RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion)
-
-/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- mod.wearer.research_scanner = had_research_scanner
- had_research_scanner = FALSE
- UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION)
-
-/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter,
- devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
- SIGNAL_HANDLER
- var/turf/wearer_turf = get_turf(mod.wearer)
- if(wearer_turf.z == epicenter.z)
- return
- if(get_dist(epicenter, wearer_turf) > explosion_detection_dist)
- return
- to_chat(mod.wearer, span_notice("Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]"))
-
-///Anti-Gravity - Makes the user weightless.
-/obj/item/mod/module/anomaly_locked/antigrav
- name = "MOD anti-gravity module"
- desc = "A module that uses a gravitational core to make the user completely weightless."
- icon_state = "antigrav"
- module_type = MODULE_TOGGLE
- complexity = 3
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.7
- incompatible_modules = list(/obj/item/mod/module/anomaly_locked)
- cooldown_time = 0.5 SECONDS
- accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav)
-
-/obj/item/mod/module/anomaly_locked/antigrav/on_activation()
- . = ..()
- if(!.)
- return
- if(mod.wearer.has_gravity())
- new /obj/effect/temp_visual/mook_dust(get_turf(src))
- mod.wearer.AddElement(/datum/element/forced_gravity, 0)
- mod.wearer.update_gravity(mod.wearer.has_gravity())
- playsound(src, 'sound/effects/gravhit.ogg', 50)
-
-/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- mod.wearer.RemoveElement(/datum/element/forced_gravity, 0)
- mod.wearer.update_gravity(mod.wearer.has_gravity())
- if(deleting)
- return
- if(mod.wearer.has_gravity())
- new /obj/effect/temp_visual/mook_dust(get_turf(src))
- playsound(src, 'sound/effects/gravhit.ogg', 50)
-
-/obj/item/mod/module/anomaly_locked/antigrav/prebuilt
- prebuilt = TRUE
-
-///Teleporter - Lets the user teleport to a nearby location.
-/obj/item/mod/module/anomaly_locked/teleporter
- name = "MOD teleporter module"
- desc = "A module that uses a bluespace core to let the user transport their particles elsewhere."
- icon_state = "teleporter"
- module_type = MODULE_ACTIVE
- complexity = 3
- use_power_cost = DEFAULT_CHARGE_DRAIN * 5
- cooldown_time = 5 SECONDS
- accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace)
- /// Time it takes to teleport
- var/teleport_time = 3 SECONDS
-
-/obj/item/mod/module/anomaly_locked/teleporter/on_select_use(atom/target)
- . = ..()
- if(!.)
- return
- var/turf/open/target_turf = get_turf(target)
- if(!istype(target_turf) || is_blocked_turf(target_turf) || !(target_turf in view(mod.wearer)))
- balloon_alert(mod.wearer, "invalid target!")
- return
- balloon_alert(mod.wearer, "teleporting...")
- var/matrix/pre_matrix = matrix()
- pre_matrix.Scale(4, 0.25)
- var/matrix/post_matrix = matrix()
- post_matrix.Scale(0.25, 4)
- animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = pre_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT)
- if(!do_after(mod.wearer, teleport_time, target = mod))
- balloon_alert(mod.wearer, "interrupted!")
- animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN)
- return
- animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN)
- if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg'))
- return
- drain_power(use_power_cost)
-
-/obj/item/mod/module/anomaly_locked/teleporter/prebuilt
- prebuilt = TRUE
diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm
deleted file mode 100644
index 098abf8015..0000000000
--- a/code/modules/mod/modules/modules_security.dm
+++ /dev/null
@@ -1,207 +0,0 @@
-//Security modules for MODsuits
-
-///Cloaking - Lowers the user's visibility, can be interrupted by being touched or attacked.
-/obj/item/mod/module/stealth
- name = "MOD prototype cloaking module"
- desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \
- to bend light around the user, as well as mimetic materials to make the surface of the suit match the \
- surroundings based off sensor data. For some reason, this tech is rarely seen."
- icon_state = "cloak"
- module_type = MODULE_TOGGLE
- complexity = 4
- active_power_cost = DEFAULT_CHARGE_DRAIN * 2
- use_power_cost = DEFAULT_CHARGE_DRAIN * 10
- incompatible_modules = list(/obj/item/mod/module/stealth)
- cooldown_time = 5 SECONDS
- /// Whether or not the cloak turns off on bumping.
- var/bumpoff = TRUE
- /// The alpha applied when the cloak is on.
- var/stealth_alpha = 50
-
-/obj/item/mod/module/stealth/on_activation()
- . = ..()
- if(!.)
- return
- if(bumpoff)
- RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth)
- RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack)
- RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act)
- RegisterSignal(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW), .proc/unstealth)
- animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS)
- drain_power(use_power_cost)
-
-/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- if(bumpoff)
- UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP)
- UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW))
- animate(mod.wearer, alpha = 255, time = 1.5 SECONDS)
-
-/obj/item/mod/module/stealth/proc/unstealth(datum/source)
- SIGNAL_HANDLER
-
- to_chat(mod.wearer, span_warning("[src] gets discharged from contact!"))
- do_sparks(2, TRUE, src)
- drain_power(use_power_cost)
- on_deactivation(display_message = TRUE, deleting = FALSE)
-
-/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target)
- SIGNAL_HANDLER
-
- if(!isliving(target))
- return
- unstealth(source)
-
-/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/item/projectile/projectile)
- SIGNAL_HANDLER
-
- if(projectile.nodamage)
- return
- unstealth(source)
-
-///Magnetic Harness - Automatically puts guns in your suit storage when you drop them.
-/obj/item/mod/module/magnetic_harness
- name = "MOD magnetic harness module"
- desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer."
- icon_state = "mag_harness"
- complexity = 2
- use_power_cost = DEFAULT_CHARGE_DRAIN
- incompatible_modules = list(/obj/item/mod/module/magnetic_harness)
- /// Time before we activate the magnet.
- var/magnet_delay = 0.8 SECONDS
- /// The typecache of all guns we allow.
- var/static/list/guns_typecache
- /// The guns already allowed by the modsuit chestplate.
- var/list/already_allowed_guns = list()
-
-/obj/item/mod/module/magnetic_harness/Initialize(mapload)
- . = ..()
- if(!guns_typecache)
- guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe))
-
-/obj/item/mod/module/magnetic_harness/on_install()
- already_allowed_guns = guns_typecache & mod.chestplate.allowed
- mod.chestplate.allowed |= guns_typecache
-
-/obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE)
- if(deleting)
- return
- mod.chestplate.allowed -= (guns_typecache - already_allowed_guns)
-
-/obj/item/mod/module/magnetic_harness/on_suit_activation()
- RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, .proc/check_dropped_item)
-
-/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE)
- UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM)
-
-/obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location)
- SIGNAL_HANDLER
-
- if(!is_type_in_typecache(dropped_item, guns_typecache))
- return
- if(new_location != get_turf(src))
- return
- addtimer(CALLBACK(src, .proc/pick_up_item, dropped_item), magnet_delay)
-
-/obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item)
- if(!isturf(item.loc) || !item.Adjacent(mod.wearer))
- return
- if(!mod.wearer.equip_to_slot_if_possible(item, ITEM_SLOT_SUITSTORE, qdel_on_fail = FALSE, disable_warning = TRUE))
- return
- playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE)
- balloon_alert(mod.wearer, "[item] reattached")
- drain_power(use_power_cost)
-
-///Pepper Shoulders
-
-///Holster - Instantly holsters any not huge gun.
-/obj/item/mod/module/holster
- name = "MOD holster module"
- desc = "Based off typical storage compartments, this system allows the suit to holster a \
- standard firearm across its surface and allow for extremely quick retrieval. \
- While some users prefer the chest, others the forearm for quick deployment, \
- some law enforcement prefer the holster to extend from the thigh."
- icon_state = "holster"
- module_type = MODULE_USABLE
- complexity = 2
- incompatible_modules = list(/obj/item/mod/module/holster)
- cooldown_time = 0.5 SECONDS
- allowed_inactive = TRUE
- /// Gun we have holstered.
- var/obj/item/gun/holstered
-
-/obj/item/mod/module/holster/on_use()
- . = ..()
- if(!.)
- return
- if(!holstered)
- var/obj/item/gun/holding = mod.wearer.get_active_held_item()
- if(!holding)
- balloon_alert(mod.wearer, "nothing to holster!")
- return
- if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY)
- balloon_alert(mod.wearer, "it doesn't fit!")
- return
- if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE))
- holstered = holding
- balloon_alert(mod.wearer, "weapon holstered")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else if(mod.wearer.put_in_active_hand(holstered, forced = FALSE, ignore_animation = TRUE))
- balloon_alert(mod.wearer, "weapon drawn")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else
- balloon_alert(mod.wearer, "holster full!")
-
-/obj/item/mod/module/holster/on_uninstall(deleting = FALSE)
- if(holstered)
- holstered.forceMove(drop_location())
-
-/obj/item/mod/module/holster/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone == holstered)
- holstered = null
-
-/obj/item/mod/module/holster/Destroy()
- QDEL_NULL(holstered)
- return ..()
-
-///Megaphone - Lets you speak loud.
-/obj/item/mod/module/megaphone
- name = "MOD megaphone module"
- desc = "A microchip megaphone linked to a MODsuit, for very important purposes, like: loudness."
- icon_state = "megaphone"
- module_type = MODULE_TOGGLE
- complexity = 1
- use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
- incompatible_modules = list(/obj/item/mod/module/megaphone)
- cooldown_time = 0.5 SECONDS
- /// List of spans we add to the speaker.
- var/list/voicespan = list(SPAN_COMMAND)
-
-/obj/item/mod/module/megaphone/on_activation()
- . = ..()
- if(!.)
- return
- RegisterSignal(mod.wearer, COMSIG_MOB_SAY, .proc/handle_speech)
-
-/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- UnregisterSignal(mod.wearer, COMSIG_MOB_SAY)
-
-/obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args)
- SIGNAL_HANDLER
-
- speech_args[SPEECH_SPANS] |= voicespan
- drain_power(use_power_cost)
-
-///Criminal Capture
-
-///Mirage grenade dispenser
-
-///Projectile Dampener
-
-///Active Sonar
diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm
deleted file mode 100644
index 85ebfea132..0000000000
--- a/code/modules/mod/modules/modules_service.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-//Service modules for MODsuits
-
-///Bike Horn - Plays a bike horn sound.
-/obj/item/mod/module/bikehorn
- name = "MOD bike horn module"
- desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \
- precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound."
- icon_state = "bikehorn"
- module_type = MODULE_USABLE
- complexity = 1
- use_power_cost = DEFAULT_CHARGE_DRAIN
- incompatible_modules = list(/obj/item/mod/module/bikehorn)
- cooldown_time = 1 SECONDS
-
-/obj/item/mod/module/bikehorn/on_use()
- . = ..()
- if(!.)
- return
- playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE)
- drain_power(use_power_cost)
-
-///Microwave Beam - Microwaves items instantly.
-/obj/item/mod/module/microwave_beam
- name = "MOD microwave beam module"
- desc = "An oddly domestic device, this module is installed into the user's palm, \
- hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \
- allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes."
- icon_state = "microwave_beam"
- module_type = MODULE_ACTIVE
- complexity = 2
- use_power_cost = DEFAULT_CHARGE_DRAIN * 5
- incompatible_modules = list(/obj/item/mod/module/microwave_beam)
- cooldown_time = 10 SECONDS
- var/obj/machinery/microwave/microwave
-
-/obj/item/mod/module/microwave_beam/Initialize(mapload)
- microwave = new()
- . = ..()
-
-/obj/item/mod/module/microwave_beam/Destroy()
- QDEL_NULL(microwave)
- . = ..()
-
-/obj/item/mod/module/microwave_beam/on_select_use(atom/target)
- . = ..()
- if(!.)
- return
- if(!isitem(target))
- return
- if(!isturf(target.loc))
- balloon_alert(mod.wearer, "must be on the floor!")
- return
- var/obj/item/microwave_target = target
- var/turf/microwave_target_loc = target.loc
- var/datum/effect_system/spark_spread/spark_effect = new()
- spark_effect.set_up(2, 1, mod.wearer)
- spark_effect.start()
- mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5)
- if(microwave_target.microwave_act(microwave))
- playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE)
- else
- balloon_alert(mod.wearer, "can't be microwaved!")
- var/datum/effect_system/spark_spread/spark_effect_two = new()
- spark_effect_two.set_up(2, 1, microwave_target_loc)
- spark_effect_two.start()
- drain_power(use_power_cost)
diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm
deleted file mode 100644
index e3c70fa570..0000000000
--- a/code/modules/mod/modules/modules_supply.dm
+++ /dev/null
@@ -1,229 +0,0 @@
-//Supply modules for MODsuits
-
-///Internal GPS - Extends a GPS you can use.
-/obj/item/mod/module/gps
- name = "MOD internal GPS module"
- desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \
- down to the exact coordinates. This information is fed to a central database viewable from the device itself, \
- though using it to help people is up to you."
- icon_state = "gps"
- module_type = MODULE_USABLE
- complexity = 1
- use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
- incompatible_modules = list(/obj/item/mod/module/gps)
- cooldown_time = 0.5 SECONDS
- allowed_inactive = TRUE
-
-/obj/item/mod/module/gps/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/gps/item, "MOD0", state = GLOB.deep_inventory_state, overlay_state = FALSE)
-
-/obj/item/mod/module/gps/on_use()
- . = ..()
- if(!.)
- return
- attack_self(mod.wearer)
-
-///Hydraulic Clamp - Lets you pick up and drop crates.
-/obj/item/mod/module/clamp
- name = "MOD hydraulic clamp module"
- desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \
- However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \
- A lot of people would say that loading cargo is a dull job, but you could not disagree more."
- icon_state = "clamp"
- module_type = MODULE_ACTIVE
- complexity = 3
- use_power_cost = DEFAULT_CHARGE_DRAIN
- incompatible_modules = list(/obj/item/mod/module/clamp)
- cooldown_time = 0.5 SECONDS
- overlay_state_inactive = "module_clamp"
- overlay_state_active = "module_clamp_on"
- /// Time it takes to load a crate.
- var/load_time = 3 SECONDS
- /// The max amount of crates you can carry.
- var/max_crates = 3
- /// The crates stored in the module.
- var/list/stored_crates = list()
-
-/obj/item/mod/module/clamp/on_select_use(atom/target)
- . = ..()
- if(!.)
- return
- if(!mod.wearer.Adjacent(target))
- return
- if(istype(target, /obj/structure/closet) || istype(target, /obj/structure/bigDelivery))
- var/atom/movable/picked_crate = target
- if(!check_crate_pickup(picked_crate))
- return
- playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE)
- if(!do_after(mod.wearer, load_time, target = target))
- balloon_alert(mod.wearer, "interrupted!")
- return
- if(!check_crate_pickup(picked_crate))
- return
- stored_crates += picked_crate
- picked_crate.forceMove(src)
- balloon_alert(mod.wearer, "picked up [picked_crate]")
- drain_power(use_power_cost)
- else if(length(stored_crates))
- var/turf/target_turf = get_turf(target)
- if(is_blocked_turf(target_turf))
- return
- playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE)
- if(!do_after(mod.wearer, load_time, target = target))
- balloon_alert(mod.wearer, "interrupted!")
- return
- if(is_blocked_turf(target_turf))
- return
- var/atom/movable/dropped_crate = pop(stored_crates)
- dropped_crate.forceMove(target_turf)
- balloon_alert(mod.wearer, "dropped [dropped_crate]")
- drain_power(use_power_cost)
- else
- balloon_alert(mod.wearer, "invalid target!")
-
-/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE)
- if(deleting)
- return
- for(var/atom/movable/crate as anything in stored_crates)
- crate.forceMove(drop_location())
- stored_crates -= crate
-
-/obj/item/mod/module/clamp/proc/check_crate_pickup(atom/movable/target)
- if(length(stored_crates) >= max_crates)
- balloon_alert(mod.wearer, "too many crates!")
- return FALSE
- for(var/mob/living/mob in target.GetAllContents())
- if(mob.mob_size < MOB_SIZE_HUMAN)
- continue
- balloon_alert(mod.wearer, "crate too heavy!")
- return FALSE
- return TRUE
-
-/obj/item/mod/module/clamp/loader
- name = "MOD loader hydraulic clamp module"
- icon_state = "clamp_loader"
- complexity = 0
- removable = FALSE
- overlay_state_inactive = null
- overlay_state_active = "module_clamp_loader"
- load_time = 1 SECONDS
- max_crates = 5
- use_mod_colors = TRUE
-
-///Drill - Lets you dig through rock and basalt.
-/obj/item/mod/module/drill // TODO: Would be cooler with a built-in drill, but meh
- name = "MOD pickaxe/drill storage module"
- desc = "Provides a convenient storage compartment for pickaxes and drills."
- icon_state = "drill"
- complexity = 2
- incompatible_modules = list(/obj/item/mod/module/drill)
- cooldown_time = 0.5 SECONDS
- allowed_inactive = TRUE
- module_type = MODULE_USABLE
- /// Pickaxe we have stored.
- var/obj/item/pickaxe/stored
-
-/obj/item/mod/module/drill/on_use()
- . = ..()
- if(!.)
- return
- if(!stored)
- var/obj/item/pickaxe/holding = mod.wearer.get_active_held_item()
- if(!holding)
- balloon_alert(mod.wearer, "nothing to store!")
- return
- if(!istype(holding))
- balloon_alert(mod.wearer, "it doesn't fit!")
- return
- if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE))
- stored = holding
- balloon_alert(mod.wearer, "mining instrument stored")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE))
- balloon_alert(mod.wearer, "mining instrument retrieved")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else
- balloon_alert(mod.wearer, "mining instrument storage full!")
-
-/obj/item/mod/module/drill/on_uninstall(deleting = FALSE)
- if(stored)
- stored.forceMove(drop_location())
-
-/obj/item/mod/module/drill/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone == stored)
- stored = null
-
-/obj/item/mod/module/drill/Destroy()
- QDEL_NULL(stored)
- return ..()
-
-/obj/item/mod/module/orebag // TODO
- name = "MOD mining satchel storage module"
- desc = "Provides a convenient storage department for a mining satchel."
- icon_state = "ore"
- module_type = MODULE_USABLE
- complexity = 1
- use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
- incompatible_modules = list(/obj/item/mod/module/orebag)
- cooldown_time = 0.5 SECONDS
- allowed_inactive = TRUE
- /// Pickaxe we have stored.
- var/obj/item/storage/bag/ore/stored
-
-/obj/item/mod/module/orebag/on_use()
- . = ..()
- if(!.)
- return
- if(!stored)
- var/obj/item/storage/bag/ore/holding = mod.wearer.get_active_held_item()
- if(!holding)
- balloon_alert(mod.wearer, "nothing to store!")
- return
- if(!istype(holding))
- balloon_alert(mod.wearer, "it doesn't fit!")
- return
- if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE))
- stored = holding
- balloon_alert(mod.wearer, "mining satchel stored")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores)
- else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE))
- UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
- balloon_alert(mod.wearer, "mining satchel retrieved")
- playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE)
- else
- balloon_alert(mod.wearer, "mining satchel storage full!")
-
-/obj/item/mod/module/orebag/on_uninstall(deleting = FALSE)
- if(stored)
- UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
- stored.forceMove(drop_location())
-
-/obj/item/mod/module/orebag/on_equip()
- if(stored)
- RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores)
-
-/obj/item/mod/module/orebag/on_unequip()
- if(stored)
- UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
-
-/obj/item/mod/module/orebag/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone == stored)
- UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
- stored = null
-
-/obj/item/mod/module/orebag/Destroy()
- if(stored)
- UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
- QDEL_NULL(stored)
- return ..()
-
-/obj/item/mod/module/orebag/proc/Pickup_ores()
- if(stored)
- stored.Pickup_ores(mod.wearer)
-
-// Ash accretion looks cool, but can't be arsed to implement
-// Same with sphere transformation
diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm
deleted file mode 100644
index 0e44900a46..0000000000
--- a/code/modules/mod/modules/modules_visor.dm
+++ /dev/null
@@ -1,91 +0,0 @@
-//Visor modules for MODsuits
-
-///Base Visor - Adds a specific HUD and traits to you.
-/obj/item/mod/module/visor
- name = "MOD visor module"
- desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you."
- module_type = MODULE_TOGGLE
- complexity = 2
- active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
- incompatible_modules = list(/obj/item/mod/module/visor)
- cooldown_time = 0.5 SECONDS
- /// The HUD type given by the visor.
- var/hud_type
- /// The traits given by the visor.
- var/list/visor_traits = list()
-
-/obj/item/mod/module/visor/on_activation()
- . = ..()
- if(!.)
- return
- if(hud_type)
- var/datum/atom_hud/hud = GLOB.huds[hud_type]
- hud.add_hud_to(mod.wearer)
- for(var/trait in visor_traits)
- ADD_TRAIT(mod.wearer, trait, MOD_TRAIT)
- mod.wearer.update_sight()
-
-/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE)
- . = ..()
- if(!.)
- return
- if(hud_type)
- var/datum/atom_hud/hud = GLOB.huds[hud_type]
- hud.remove_hud_from(mod.wearer)
- for(var/trait in visor_traits)
- REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT)
- mod.wearer.update_sight()
-
-//Medical Visor - Gives you a medical HUD.
-/obj/item/mod/module/visor/medhud
- name = "MOD medical visor module"
- desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \
- biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \
- access data such as patient files in a convenient readout. They say these also let you see behind you."
- icon_state = "medhud_visor"
- hud_type = DATA_HUD_MEDICAL_ADVANCED
-
-//Diagnostic Visor - Gives you a diagnostic HUD.
-/obj/item/mod/module/visor/diaghud
- name = "MOD diagnostic visor module"
- desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \
- from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \
- and integrity of such. They say these also let you see behind you."
- icon_state = "diaghud_visor"
- hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED
-
-//Security Visor - Gives you a security HUD.
-/obj/item/mod/module/visor/sechud
- name = "MOD security visor module"
- desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \
- plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \
- and generally know who to shoot. They say these also let you see behind you."
- icon_state = "sechud_visor"
- hud_type = DATA_HUD_SECURITY_ADVANCED
-
-//Meson Visor - Gives you meson vision.
-/obj/item/mod/module/visor/meson
- name = "MOD meson visor module"
- desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \
- technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \
- through walls, regardless of lighting conditions. They say these also let you see behind you."
- icon_state = "meson_visor"
- visor_traits = list(TRAIT_MESON_VISION)
-
-//Thermal Visor - Gives you thermal vision.
-/obj/item/mod/module/visor/thermal
- name = "MOD thermal visor module"
- desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \
- the thermal radiation output of objects near the user. While it can detect the heat output of even something as \
- small as a rodent, it still produces irritating red overlay. They say these also let you see behind you."
- icon_state = "thermal_visor"
- visor_traits = list(TRAIT_THERMAL_VISION)
-
-//Night Visor - Gives you night vision.
-/obj/item/mod/module/visor/night
- name = "MOD night visor module"
- desc = "A heads-up display installed into the visor of the suit. Typical for both civilian and military applications, \
- this allows the user to perceive their surroundings while in complete darkness, enhancing the view by tenfold; \
- yet brightening everything into a spooky green glow. They say these also let you see behind you."
- icon_state = "night_visor"
- visor_traits = list(TRAIT_TRUE_NIGHT_VISION)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 0aee51bb84..6c6733627f 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -69,8 +69,6 @@
var/projectile_piercing = NONE
/// number of times we've pierced something. Incremented BEFORE bullet_act and on_hit proc!
var/pierces = 0
- /// If objects are below this layer, we pass through them
- var/hit_threshhold = PROJECTILE_HIT_THRESHHOLD_LAYER
/// "leftover" pixels for Range() calculation as pixel_move() was moved to simulated semi-pixel movement and Range() is in tiles.
var/pixels_range_leftover = 0
/// "leftover" tick pixels and stuff yeah, so we don't round off things and introducing tracing inaccuracy.
@@ -521,7 +519,7 @@
if(!isliving(target))
if(isturf(target)) // non dense turfs
return FALSE
- if(target.layer < hit_threshhold)
+ if(target.layer < PROJECTILE_HIT_THRESHHOLD_LAYER)
return FALSE
else if(!direct_target) // non dense objects do not get hit unless specifically clicked
return FALSE
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 77d713047a..d233866f80 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -890,7 +890,6 @@
R.reaction_turf(A, R.volume * volume_modifier, show_message, from_gas)
if("OBJ")
R.reaction_obj(A, R.volume * volume_modifier, show_message)
- SEND_SIGNAL(A, COMSIG_ATOM_EXPOSE_REAGENTS, cached_reagents, src, method, volume_modifier, show_message, from_gas)
/datum/reagents/proc/holder_full()
if(total_volume >= maximum_volume)
diff --git a/code/modules/research/designs/mod_designs.dm b/code/modules/research/designs/mod_designs.dm
deleted file mode 100644
index 8ceadeb8fb..0000000000
--- a/code/modules/research/designs/mod_designs.dm
+++ /dev/null
@@ -1,372 +0,0 @@
-//MODsuit construction
-
-/datum/design/mod_shell
- name = "MOD Shell"
- desc = "A 'Nakamura Engineering' designed shell for a Modular Suit."
- id = "mod_shell"
- build_type = MECHFAB
- materials = list(/datum/material/iron = 10000, /datum/material/plasma = 5000)
- construction_time = 25 SECONDS
- build_path = /obj/item/mod/construction/shell
- category = list("MODsuit Chassis")
-
-/datum/design/mod_helmet
- name = "MOD Helmet"
- desc = "A 'Nakamura Engineering' designed helmet for a Modular Suit."
- id = "mod_helmet"
- build_type = MECHFAB
- materials = list(/datum/material/iron = 5000)
- construction_time = 10 SECONDS
- build_path = /obj/item/mod/construction/helmet
- category = list("MODsuit Chassis")
-
-/datum/design/mod_chestplate
- name = "MOD Chestplate"
- desc = "A 'Nakamura Engineering' designed chestplate for a Modular Suit."
- id = "mod_chestplate"
- build_type = MECHFAB
- materials = list(/datum/material/iron = 5000)
- construction_time = 10 SECONDS
- build_path = /obj/item/mod/construction/chestplate
- category = list("MODsuit Chassis")
-
-/datum/design/mod_gauntlets
- name = "MOD Gauntlets"
- desc = "'Nakamura Engineering' designed gauntlets for a Modular Suit."
- id = "mod_gauntlets"
- build_type = MECHFAB
- materials = list(/datum/material/iron = 5000)
- construction_time = 10 SECONDS
- build_path = /obj/item/mod/construction/gauntlets
- category = list("MODsuit Chassis")
-
-/datum/design/mod_boots
- name = "MOD Boots"
- desc = "'Nakamura Engineering' designed boots for a Modular Suit."
- id = "mod_boots"
- build_type = MECHFAB
- materials = list(/datum/material/iron = 5000)
- construction_time = 10 SECONDS
- build_path = /obj/item/mod/construction/boots
- category = list("MODsuit Chassis")
-
-/datum/design/mod_plating
- name = "MOD External Plating"
- desc = "External plating for a MODsuit."
- id = "mod_plating_standard"
- build_type = PROTOLATHE | MECHFAB
- materials = list(/datum/material/iron = 6000, /datum/material/glass = 3000, /datum/material/plasma = 1000)
- construction_time = 15 SECONDS
- build_path = /obj/item/mod/construction/armor
- category = list("MODsuit Chassis", "MODsuit Designs")
- departmental_flags = DEPARTMENTAL_FLAG_ALL
- research_icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
- research_icon_state = "standard-plating"
-
-/datum/design/mod_plating/New()
- . = ..()
- var/obj/item/mod/construction/armor/armor_type = build_path
- var/datum/mod_theme/theme = GLOB.mod_themes[initial(armor_type.theme)]
- desc = "External plating for a MODsuit. [theme.desc]"
-
-/datum/design/mod_plating/engineering
- name = "MOD Engineering Plating"
- id = "mod_plating_engineering"
- build_path = /obj/item/mod/construction/armor/engineering
- materials = list(/datum/material/iron = 6000, /datum/material/gold = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
- research_icon_state = "engineering-plating"
-
-/datum/design/mod_plating/atmospheric
- name = "MOD Atmospheric Plating"
- id = "mod_plating_atmospheric"
- build_path = /obj/item/mod/construction/armor/atmospheric
- materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
- research_icon_state = "atmospheric-plating"
-
-/datum/design/mod_plating/mining
- name = "MOD Mining Plating"
- id = "mod_plating_mining"
- build_path = /obj/item/mod/construction/armor/mining
- materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
- departmental_flags = DEPARTMENTAL_FLAG_CARGO
- research_icon_state = "atmospheric-mining"
-
-/datum/design/mod_plating/medical
- name = "MOD Medical Plating"
- id = "mod_plating_medical"
- build_path = /obj/item/mod/construction/armor/medical
- materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
- research_icon_state = "medical-plating"
-
-/datum/design/mod_plating/security
- name = "MOD Security Plating"
- id = "mod_plating_security"
- build_path = /obj/item/mod/construction/armor/security
- materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
- research_icon_state = "security-plating"
-
-/datum/design/mod_plating/cosmohonk
- name = "MOD Cosmohonk Plating"
- id = "mod_plating_cosmohonk"
- build_path = /obj/item/mod/construction/armor/cosmohonk
- materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000)
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
- research_icon_state = "cosmohonk-plating"
-
-/datum/design/mod_paint_kit
- name = "MOD Paint Kit"
- desc = "A paint kit for Modular Suits."
- id = "mod_paint_kit"
- build_type = MECHFAB
- materials = list(/datum/material/iron = 1000, /datum/material/plastic = 500)
- construction_time = 5 SECONDS
- build_path = /obj/item/mod/paint
- category = list("MODsuit Modules", "MODsuit Designs")
-
-//MODsuit modules
-
-/datum/design/module
- name = "MOD Module"
- build_type = PROTOLATHE | MECHFAB
- construction_time = 1 SECONDS
- materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module
- category = list("MODsuit Modules", "MODsuit Designs")
- departmental_flags = DEPARTMENTAL_FLAG_ALL
-
-/datum/design/module/New()
- . = ..()
- var/obj/item/mod/module/module = build_path
- desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity."
-
-/datum/design/module/mod_storage
- name = "Storage Module"
- id = "mod_storage"
- materials = list(/datum/material/iron = 2500, /datum/material/glass = 500)
- build_path = /obj/item/mod/module/storage
-
-/datum/design/module/mod_visor_medhud
- name = "Medical Visor Module"
- id = "mod_visor_medhud"
- materials = list(/datum/material/silver = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/visor/medhud
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/module/mod_visor_diaghud
- name = "Diagnostic Visor Module"
- id = "mod_visor_diaghud"
- materials = list(/datum/material/gold = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/visor/diaghud
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/module/mod_visor_sechud
- name = "Security Visor Module"
- id = "mod_visor_sechud"
- materials = list(/datum/material/titanium = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/visor/sechud
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/module/mod_visor_meson
- name = "Meson Visor Module"
- id = "mod_visor_meson"
- materials = list(/datum/material/uranium = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/visor/meson
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_visor_welding
- name = "Welding Protection Module"
- id = "mod_welding"
- materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/welding
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_t_ray
- name = "T-Ray Scanner Module"
- id = "mod_t_ray"
- materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/t_ray
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_health_analyzer
- name = "Health Analyzer Module"
- id = "mod_health_analyzer"
- materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/health_analyzer
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/module/mod_stealth
- name = "Cloak Module"
- id = "mod_stealth"
- materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500)
- build_path = /obj/item/mod/module/stealth
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/module/mod_jetpack
- name = "Ion Jetpack Module"
- id = "mod_jetpack"
- materials = list(/datum/material/iron = 1500, /datum/material/plasma = 1000)
- build_path = /obj/item/mod/module/jetpack
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_magboot
- name = "Magnetic Stabilizator Module"
- id = "mod_magboot"
- materials = list(/datum/material/iron = 1000, /datum/material/gold = 500)
- build_path = /obj/item/mod/module/magboot
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_mag_harness
- name = "Magnetic Harness Module"
- id = "mod_mag_harness"
- materials = list(/datum/material/iron = 1500, /datum/material/silver = 500)
- build_path = /obj/item/mod/module/magnetic_harness
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/module/mod_tether
- name = "Emergency Tether Module"
- id = "mod_tether"
- materials = list(/datum/material/iron = 1000, /datum/material/silver = 500)
- build_path = /obj/item/mod/module/tether
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_mouthhole
- name = "Eating Apparatus Module"
- id = "mod_mouthhole"
- materials = list(/datum/material/iron = 1500)
- build_path = /obj/item/mod/module/mouthhole
-
-/datum/design/module/mod_rad_protection
- name = "Radiation Protection Module"
- id = "mod_rad_protection"
- materials = list(/datum/material/iron = 1000, /datum/material/uranium = 1000)
- build_path = /obj/item/mod/module/rad_protection
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_emp_shield
- name = "EMP Shield Module"
- id = "mod_emp_shield"
- materials = list(/datum/material/iron = 1000, /datum/material/plasma = 1000)
- build_path = /obj/item/mod/module/emp_shield
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/module/mod_flashlight
- name = "Flashlight Module"
- id = "mod_flashlight"
- materials = list(/datum/material/iron = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/flashlight
-
-/datum/design/module/mod_reagent_scanner
- name = "Reagent Scanner Module"
- id = "mod_reagent_scanner"
- materials = list(/datum/material/glass = 1000)
- build_path = /obj/item/mod/module/reagent_scanner
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/module/mod_gps
- name = "Internal GPS Module"
- id = "mod_gps"
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/mod/module/gps
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/module/mod_constructor
- name = "Constructor Module"
- id = "mod_constructor"
- materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500)
- build_path = /obj/item/mod/module/constructor
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_quick_carry
- name = "Quick Carry Module"
- id = "mod_quick_carry"
- materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500)
- build_path = /obj/item/mod/module/quick_carry
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/module/mod_bikehorn
- name = "Bike Horn Module"
- id = "mod_bikehorn"
- materials = list(/datum/material/plastic = 500, /datum/material/iron = 500)
- build_path = /obj/item/mod/module/bikehorn
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/module/mod_microwave_beam
- name = "Microwave Beam Module"
- id = "mod_microwave_beam"
- materials = list(/datum/material/iron = 1000, /datum/material/uranium = 500)
- build_path = /obj/item/mod/module/microwave_beam
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/module/mod_clamp
- name = "Crate Clamp Module"
- id = "mod_clamp"
- materials = list(/datum/material/iron = 2000)
- build_path = /obj/item/mod/module/clamp
- departmental_flags = DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/module/mod_drill
- name = "Drill Module"
- id = "mod_drill"
- materials = list(/datum/material/silver = 1000, /datum/material/iron = 2000)
- build_path = /obj/item/mod/module/drill
- departmental_flags = DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/module/mod_orebag
- name = "Ore Bag Module"
- id = "mod_orebag"
- materials = list(/datum/material/iron = 1500)
- build_path = /obj/item/mod/module/orebag
- departmental_flags = DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/module/mod_dna_lock
- name = "DNA Lock Module"
- id = "mod_dna_lock"
- materials = list(/datum/material/diamond = 500, /datum/material/glass = 1000)
- build_path = /obj/item/mod/module/dna_lock
-
-/datum/design/module/mister_atmos
- name = "Resin Mister Module"
- id = "mod_mister_atmos"
- materials = list(/datum/material/glass = 1000, /datum/material/titanium = 1500)
- build_path = /obj/item/mod/module/mister/atmos
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/module/mod_holster
- name = "Holster Module"
- id = "mod_holster"
- materials = list(/datum/material/iron = 1500, /datum/material/glass = 500)
- build_path = /obj/item/mod/module/holster
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/module/surgicalprocessor
- name = "Surgical Processor Module"
- id = "mod_surgicalprocessor"
- materials = list(/datum/material/titanium = 250, /datum/material/glass = 1000, /datum/material/silver = 1500)
- build_path = /obj/item/mod/module/surgical_processor
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/module/defibrillator
- name = "Defibrillator Module"
- id = "mod_defib"
- materials = list(/datum/material/titanium = 250, /datum/material/diamond = 1000, /datum/material/silver = 1500)
- build_path = /obj/item/mod/module/defibrillator
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-//MODsuit anomalock modules
-/datum/design/module/mod_antigrav
- name = "Anti-Gravity Module"
- id = "mod_antigrav"
- materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/uranium = 2000)
- build_path = /obj/item/mod/module/anomaly_locked/antigrav
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/module/mod_teleporter
- name = "Teleporter Module"
- id = "mod_teleporter"
- materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/bluespace = 2000)
- build_path = /obj/item/mod/module/anomaly_locked/teleporter
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm
index 4057503e09..684f27ccad 100644
--- a/code/modules/research/machinery/protolathe.dm
+++ b/code/modules/research/machinery/protolathe.dm
@@ -15,8 +15,7 @@
"Weapons",
"Ammo",
"Firing Pins",
- "Computer Parts",
- "MODsuit Designs"
+ "Computer Parts"
)
production_animation = "protolathe_n"
allowed_buildtypes = PROTOLATHE
diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm
index 110b6c037c..f93560ed10 100644
--- a/code/modules/research/machinery/techfab.dm
+++ b/code/modules/research/machinery/techfab.dm
@@ -26,8 +26,7 @@
"Subspace Telecomms",
"Research Machinery",
"Misc. Machinery",
- "Computer Parts",
- "MODsuit Designs"
+ "Computer Parts"
)
console_link = FALSE
production_animation = "protolathe_n"
diff --git a/code/modules/research/techweb/nodes/mod_nodes.dm b/code/modules/research/techweb/nodes/mod_nodes.dm
deleted file mode 100644
index 9cad736db0..0000000000
--- a/code/modules/research/techweb/nodes/mod_nodes.dm
+++ /dev/null
@@ -1,124 +0,0 @@
-/datum/techweb_node/mod_basic
- id = "mod"
- starting_node = TRUE
- display_name = "Basic Modular Suits"
- description = "Specialized back mounted power suits with various different modules."
- design_ids = list(
- "mod_shell",
- "mod_helmet",
- "mod_chestplate",
- "mod_gauntlets",
- "mod_boots",
- "mod_plating_standard",
- "mod_storage",
- "mod_welding",
- "mod_mouthhole",
- "mod_flashlight",
- )
-
-/datum/techweb_node/mod_advanced
- id = "mod_advanced"
- display_name = "Advanced Modular Suits"
- description = "More advanced modules, to improve modular suits."
- prereq_ids = list("mod", "robotics")
- design_ids = list(
- "mod_plating_mining",
- "mod_visor_diaghud",
- "mod_gps",
- "mod_reagent_scanner",
- "mod_clamp",
- "mod_drill",
- "mod_orebag",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/datum/techweb_node/mod_engineering
- id = "mod_engineering"
- display_name = "Engineering Modular Suits"
- description = "Engineering suits, for powered engineers."
- prereq_ids = list("mod_advanced", "engineering")
- design_ids = list(
- "mod_plating_engineering",
- "mod_visor_meson",
- "mod_t_ray",
- "mod_magboot",
- "mod_tether",
- "mod_constructor",
- "mod_mister_atmos",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/datum/techweb_node/mod_advanced_engineering
- id = "mod_advanced_engineering"
- display_name = "Advanced Engineering Modular Suits"
- description = "Advanced Engineering suits, for advanced powered engineers."
- prereq_ids = list("mod_engineering", "adv_engi")
- design_ids = list(
- "mod_plating_atmospheric",
- "mod_jetpack",
- "mod_rad_protection",
- "mod_emp_shield",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
-
-/datum/techweb_node/mod_medical
- id = "mod_medical"
- display_name = "Medical Modular Suits"
- description = "Medical suits for quick rescue purposes."
- prereq_ids = list("mod_advanced", "biotech")
- design_ids = list(
- "mod_plating_medical",
- "mod_visor_medhud",
- "mod_health_analyzer",
- "mod_quick_carry",
- "mod_dna_lock",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/datum/techweb_node/mod_advanced_medical
- id = "mod_advanced_medical"
- display_name = "Advanced Medical Modular Suits"
- description = "Advanced medical suits for quicker rescue purposes."
- prereq_ids = list("mod_medical", "adv_biotech")
- design_ids = list(
- "mod_defib",
- "mod_surgicalprocessor",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
-
-/datum/techweb_node/mod_security
- id = "mod_security"
- display_name = "Security Modular Suits"
- description = "Security suits for space crime handling."
- prereq_ids = list("mod_advanced", "sec_basic")
- design_ids = list(
- "mod_plating_security",
- "mod_visor_sechud",
- "mod_stealth",
- "mod_mag_harness",
- "mod_holster",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/datum/techweb_node/mod_entertainment
- id = "mod_entertainment"
- display_name = "Entertainment Modular Suits"
- description = "Powered suits for protection against low-humor environments."
- prereq_ids = list("mod_advanced", "clown")
- design_ids = list(
- "mod_plating_cosmohonk",
- "mod_bikehorn",
- "mod_microwave_beam",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/datum/techweb_node/mod_anomaly
- id = "mod_anomaly"
- display_name = "Anomalock Modular Suits"
- description = "Modules for modular suits that require anomaly cores to function."
- prereq_ids = list("mod_advanced", "anomaly_research")
- design_ids = list(
- "mod_antigrav",
- "mod_teleporter",
- )
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 9e39ec58e8..a4eafc4b01 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -68,15 +68,6 @@
var/obj/item/surgical_processor/SP = locate() in R.module.modules
if(SP)
advanced_surgeries |= SP.advanced_surgeries
- else
- var/obj/item/surgical_processor/SP
- for(var/obj/item/surgical_processor/processor in user.held_items)
- SP = processor
- break
- if(!SP)
- SP = locate(/obj/item/surgical_processor) in get_turf(user)
- if(SP)
- advanced_surgeries |= SP.advanced_surgeries
var/turf/T = get_turf(patient)
var/obj/structure/table/optable/table = locate(/obj/structure/table/optable, T)
diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm
index f4ffda302e..de5628dc05 100644
--- a/code/modules/vehicles/mecha/_mecha.dm
+++ b/code/modules/vehicles/mecha/_mecha.dm
@@ -817,7 +817,7 @@
mecha_flags &= ~SILICON_PILOT
AI.forceMove(card)
card.AI = AI
- AI.controlled_equipment = null
+ AI.controlled_mech = null
AI.remote_control = null
to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.")
to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.")
@@ -856,7 +856,7 @@
mecha_flags |= SILICON_PILOT
moved_inside(AI)
AI.cancel_camera()
- AI.controlled_equipment = src
+ AI.controlled_mech = src
AI.remote_control = src
AI.mobility_flags = ALL //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
if(interaction == AI_MECH_HACK)
@@ -1083,7 +1083,7 @@
AI.linked_core = null
return
to_chat(AI, "Returning to core...")
- AI.controlled_equipment = null
+ AI.controlled_mech = null
AI.remote_control = null
mob_container = AI
newloc = get_turf(AI.linked_core)
diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm
index 29cc88a563..bbbfa7f1bd 100644
--- a/code/modules/vehicles/mecha/mech_fabricator.dm
+++ b/code/modules/vehicles/mecha/mech_fabricator.dm
@@ -57,8 +57,6 @@
"Exosuit Equipment",
"Exosuit Ammunition",
"Cyborg Upgrade Modules",
- "MODsuit Chassis",
- "MODsuit Modules",
"Cybernetics",
"Implants",
"Control Interfaces",
diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm
index 70c543fbde..b9f299731a 100644
--- a/code/modules/vehicles/mecha/mecha_wreckage.dm
+++ b/code/modules/vehicles/mecha/mecha_wreckage.dm
@@ -35,7 +35,7 @@
AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
AI.forceMove(src) //Put the dead AI inside the wreckage for recovery
add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon
- AI.controlled_equipment = null
+ AI.controlled_mech = null
AI.remote_control = null
/obj/structure/mecha_wreckage/Destroy()
diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi
deleted file mode 100644
index 84fcbc00db..0000000000
Binary files a/icons/mob/actions/actions_mod.dmi and /dev/null differ
diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi
deleted file mode 100644
index f8dba0a006..0000000000
Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and /dev/null differ
diff --git a/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi b/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi
deleted file mode 100644
index a18800875c..0000000000
Binary files a/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi and /dev/null differ
diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi
deleted file mode 100644
index 1001ae77d2..0000000000
Binary files a/icons/mob/clothing/modsuit/mod_modules.dmi and /dev/null differ
diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi
deleted file mode 100644
index 41ebc1a2ba..0000000000
Binary files a/icons/obj/clothing/modsuit/mod_clothing.dmi and /dev/null differ
diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi
deleted file mode 100644
index 5e46b5f85c..0000000000
Binary files a/icons/obj/clothing/modsuit/mod_construction.dmi and /dev/null differ
diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi
deleted file mode 100644
index 037e7fe696..0000000000
Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and /dev/null differ
diff --git a/icons/obj/defibrillators.dmi b/icons/obj/defibrillators.dmi
index 8871d5b049..a4dc9e65e3 100644
Binary files a/icons/obj/defibrillators.dmi and b/icons/obj/defibrillators.dmi differ
diff --git a/sound/items/modsuit/atrocinator_step.ogg b/sound/items/modsuit/atrocinator_step.ogg
deleted file mode 100644
index deda85ac35..0000000000
Binary files a/sound/items/modsuit/atrocinator_step.ogg and /dev/null differ
diff --git a/sound/items/modsuit/ballin.ogg b/sound/items/modsuit/ballin.ogg
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/sound/items/modsuit/ballout.ogg b/sound/items/modsuit/ballout.ogg
deleted file mode 100644
index f911f1a6a6..0000000000
Binary files a/sound/items/modsuit/ballout.ogg and /dev/null differ
diff --git a/sound/items/modsuit/flamethrower.ogg b/sound/items/modsuit/flamethrower.ogg
deleted file mode 100644
index 447245d50b..0000000000
Binary files a/sound/items/modsuit/flamethrower.ogg and /dev/null differ
diff --git a/sound/items/modsuit/inflate_bloon.ogg b/sound/items/modsuit/inflate_bloon.ogg
deleted file mode 100644
index 9b030d66ce..0000000000
Binary files a/sound/items/modsuit/inflate_bloon.ogg and /dev/null differ
diff --git a/sound/items/modsuit/loader_charge.ogg b/sound/items/modsuit/loader_charge.ogg
deleted file mode 100644
index 61d5531f72..0000000000
Binary files a/sound/items/modsuit/loader_charge.ogg and /dev/null differ
diff --git a/sound/items/modsuit/loader_launch.ogg b/sound/items/modsuit/loader_launch.ogg
deleted file mode 100644
index 513118f3c6..0000000000
Binary files a/sound/items/modsuit/loader_launch.ogg and /dev/null differ
diff --git a/sound/items/modsuit/magnetic_harness.ogg b/sound/items/modsuit/magnetic_harness.ogg
deleted file mode 100644
index 3d19fccc56..0000000000
Binary files a/sound/items/modsuit/magnetic_harness.ogg and /dev/null differ
diff --git a/sound/items/modsuit/rewinder.ogg b/sound/items/modsuit/rewinder.ogg
deleted file mode 100644
index 2587562dc1..0000000000
Binary files a/sound/items/modsuit/rewinder.ogg and /dev/null differ
diff --git a/sound/items/modsuit/springlock.ogg b/sound/items/modsuit/springlock.ogg
deleted file mode 100644
index 8d0013d263..0000000000
Binary files a/sound/items/modsuit/springlock.ogg and /dev/null differ
diff --git a/sound/items/modsuit/tem_shot.ogg b/sound/items/modsuit/tem_shot.ogg
deleted file mode 100644
index 50905b95f1..0000000000
Binary files a/sound/items/modsuit/tem_shot.ogg and /dev/null differ
diff --git a/sound/items/modsuit/time_anchor_set.ogg b/sound/items/modsuit/time_anchor_set.ogg
deleted file mode 100644
index 457f8e6dba..0000000000
Binary files a/sound/items/modsuit/time_anchor_set.ogg and /dev/null differ
diff --git a/sound/mecha/hydraulic.ogg b/sound/mecha/hydraulic.ogg
deleted file mode 100644
index 3281ed2dc0..0000000000
Binary files a/sound/mecha/hydraulic.ogg and /dev/null differ
diff --git a/sound/weapons/revolverempty.ogg b/sound/weapons/revolverempty.ogg
deleted file mode 100644
index 81ddb1e2e0..0000000000
Binary files a/sound/weapons/revolverempty.ogg and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index 43bab0253b..a3ec7c7238 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -80,7 +80,6 @@
#include "code\__DEFINES\menu.dm"
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm"
-#include "code\__DEFINES\mod.dm"
#include "code\__DEFINES\monkeys.dm"
#include "code\__DEFINES\move_force.dm"
#include "code\__DEFINES\movement.dm"
@@ -157,11 +156,7 @@
#include "code\__DEFINES\dcs\flags.dm"
#include "code\__DEFINES\dcs\helpers.dm"
#include "code\__DEFINES\dcs\signals.dm"
-#include "code\__DEFINES\dcs\signals\signals_medical.dm"
-#include "code\__DEFINES\dcs\signals\signals_mod.dm"
-#include "code\__DEFINES\dcs\signals\signals_reagent.dm"
#include "code\__DEFINES\dcs\signals\signals_subsystem.dm"
-#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movable.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm"
#include "code\__DEFINES\mapping\maploader.dm"
@@ -815,7 +810,6 @@
#include "code\datums\wires\emitter.dm"
#include "code\datums\wires\explosive.dm"
#include "code\datums\wires\microwave.dm"
-#include "code\datums\wires\mod.dm"
#include "code\datums\wires\mulebot.dm"
#include "code\datums\wires\particle_accelerator.dm"
#include "code\datums\wires\r_n_d.dm"
@@ -2959,26 +2953,6 @@
#include "code\modules\mob\living\simple_animal\slime\slime.dm"
#include "code\modules\mob\living\simple_animal\slime\slime_mobility.dm"
#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
-#include "code\modules\mod\mod_actions.dm"
-#include "code\modules\mod\mod_activation.dm"
-#include "code\modules\mod\mod_ai.dm"
-#include "code\modules\mod\mod_clothes.dm"
-#include "code\modules\mod\mod_construction.dm"
-#include "code\modules\mod\mod_control.dm"
-#include "code\modules\mod\mod_theme.dm"
-#include "code\modules\mod\mod_types.dm"
-#include "code\modules\mod\mod_ui.dm"
-#include "code\modules\mod\modules\_module.dm"
-#include "code\modules\mod\modules\modules.dm"
-#include "code\modules\mod\modules\modules_engineering.dm"
-#include "code\modules\mod\modules\modules_general.dm"
-#include "code\modules\mod\modules\modules_maint.dm"
-#include "code\modules\mod\modules\modules_medical.dm"
-#include "code\modules\mod\modules\modules_science.dm"
-#include "code\modules\mod\modules\modules_security.dm"
-#include "code\modules\mod\modules\modules_service.dm"
-#include "code\modules\mod\modules\modules_supply.dm"
-#include "code\modules\mod\modules\modules_visor.dm"
#include "code\modules\modular_computers\laptop_vendor.dm"
#include "code\modules\modular_computers\computers\_modular_computer_shared.dm"
#include "code\modules\modular_computers\computers\item\computer.dm"
@@ -3392,7 +3366,6 @@
#include "code\modules\research\designs\medical_designs.dm"
#include "code\modules\research\designs\mining_designs.dm"
#include "code\modules\research\designs\misc_designs.dm"
-#include "code\modules\research\designs\mod_designs.dm"
#include "code\modules\research\designs\nanite_designs.dm"
#include "code\modules\research\designs\power_designs.dm"
#include "code\modules\research\designs\smelting_designs.dm"
@@ -3462,7 +3435,6 @@
#include "code\modules\research\techweb\nodes\mecha_nodes.dm"
#include "code\modules\research\techweb\nodes\medical_nodes.dm"
#include "code\modules\research\techweb\nodes\misc_nodes.dm"
-#include "code\modules\research\techweb\nodes\mod_nodes.dm"
#include "code\modules\research\techweb\nodes\nanites_nodes.dm"
#include "code\modules\research\techweb\nodes\robotics_nodes.dm"
#include "code\modules\research\techweb\nodes\syndicate_nodes.dm"
diff --git a/tgui/packages/tgui/interfaces/MODpaint.js b/tgui/packages/tgui/interfaces/MODpaint.js
deleted file mode 100644
index 9a329688eb..0000000000
--- a/tgui/packages/tgui/interfaces/MODpaint.js
+++ /dev/null
@@ -1,151 +0,0 @@
-import { useBackend } from '../backend';
-import { Box, Stack, Section, ByondUi, Slider, Flex, Button } from '../components';
-import { Window } from '../layouts';
-import { capitalize } from 'common/string';
-
-const colorToMatrix = (param) => {
- switch (param) {
- case 'red':
- return [
- 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0.25, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- ];
- case 'yellow':
- return [
- 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0.25, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0,
- 0,
- ];
- case 'green':
- return [
- 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- ];
- case 'teal':
- return [
- 0.25, 0.25, 0.25, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 0, 0,
- 0, 0,
- ];
- case 'blue':
- return [
- 0.25, 0, 0.25, 0, 0, 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- ];
- case 'purple':
- return [
- 0.5, 0, 0.5, 0, 0.25, 0.5, 0.25, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0,
- 0,
- ];
- }
-};
-
-const displayText = (param) => {
- switch (param) {
- case 'r':
- return 'Red';
- case 'g':
- return 'Green';
- case 'b':
- return 'Blue';
- }
-};
-
-export const MODpaint = (props, context) => {
- const { act, data } = useBackend(context);
- const { mapRef, currentColor } = data;
- const [
- [rr, rg, rb, ra],
- [gr, gg, gb, ga],
- [br, bg, bb, ba],
- [ar, ag, ab, aa],
- [cr, cg, cb, ca],
- ] = currentColor;
- const presets = ['red', 'yellow', 'green', 'teal', 'blue', 'purple'];
- const prefixes = ['r', 'g', 'b'];
- return (
-
-
-
-
- {[0, 1, 2].map((row) => (
-
- {[0, 1, 2].map((col) => (
-
-
-
- {`${displayText(prefixes[col])}:`}
-
-
-
- `${value}%`}
- onDrag={(e, value) => {
- let retColor = currentColor;
- retColor[row * 4 + col] = value / 100;
- act('transition_color', { color: retColor });
- }}
- />
-
-
- ))}
-
- ))}
-
-
-
-
- {presets.map((preset) => (
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js
deleted file mode 100644
index 81e604c579..0000000000
--- a/tgui/packages/tgui/interfaces/MODsuit.js
+++ /dev/null
@@ -1,766 +0,0 @@
-import { useBackend, useLocalState } from '../backend';
-import { Button, ColorBox, LabeledList, ProgressBar, Section, Collapsible, Box, Icon, Stack, Table, Dimmer, NumberInput, Flex, AnimatedNumber, Dropdown } from '../components';
-import { Window } from '../layouts';
-
-const ConfigureNumberEntry = (props, context) => {
- const { name, value, module_ref } = props;
- const { act } = useBackend(context);
- return (
-
- act('configure', {
- 'key': name,
- 'value': value,
- 'ref': module_ref,
- })}
- />
- );
-};
-
-const ConfigureBoolEntry = (props, context) => {
- const { name, value, module_ref } = props;
- const { act } = useBackend(context);
- return (
-
- act('configure', {
- 'key': name,
- 'value': !value,
- 'ref': module_ref,
- })}
- />
- );
-};
-
-const ConfigureColorEntry = (props, context) => {
- const { name, value, module_ref } = props;
- const { act } = useBackend(context);
- return (
- <>
-