Camera not connected to wall at [ADMIN_VERBOSEJMP(C1)] Network: [json_encode(C1.network)]
"
+ output += "
Camera not connected to wall at [ADMIN_VERBOSEJMP(C1)] Network: [json_encode(C1.network)]
"
output += ""
usr << browse(output,"window=airreport;size=1000x500")
@@ -550,41 +542,3 @@ GLOBAL_VAR_INIT(say_disabled, FALSE)
to_chat(usr, "Atmos control frequency check passed without encountering problems.", confidential=TRUE)
else
to_chat(usr, "Total errors: [invalid_machine + invalid_tag + tagless + duplicate_tag + not_heard + not_told]", confidential=TRUE)
-
-/client/proc/find_bad_access()
- set name = "Find Bad Access"
- set category = "Mapping"
-
- var/list/zlevel_cache = new /list(world.maxz)
- for(var/zlevel in SSmapping.get_zstack(get_random_station_turf(), FALSE))
- zlevel_cache[zlevel] = TRUE
-
- var/doors = 0
- for(var/obj/machinery/door/D as anything in INSTANCES_OF(/obj/machinery/door))
- if(!zlevel_cache[D.z])
- continue
-
- doors++
-
- var/list/bad_access = list()
- var/list/bad_one_access = list()
-
- D.gen_access()
-
- for(var/access_num in D.req_access)
- if(!SSid_access.desc_by_access["[access_num]"])
- bad_access += num2text(access_num)
-
- for(var/access_num in D.req_one_access)
- if(!SSid_access.desc_by_access["[access_num]"])
- bad_one_access += num2text(access_num)
-
-
- if(length(bad_access) && length(bad_one_access))
- to_chat(src, "[ADMIN_COORDJMP(D)] VV Bad Access: [jointext(bad_access, ",")] | Bad One Access: [jointext(bad_one_access, ",")]")
- else if(length(bad_access))
- to_chat(src, "[ADMIN_COORDJMP(D)] VV Bad Access: [jointext(bad_access, ",")]")
- else if(length(bad_one_access))
- to_chat(src, "[ADMIN_COORDJMP(D)] VV Bad One Access: [jointext(bad_one_access, ",")]")
-
- to_chat(src, span_debug("Searched [doors] doors."))
diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm
index f798828dc8c..b4fe018c4c2 100644
--- a/code/modules/admin/verbs/secrets.dm
+++ b/code/modules/admin/verbs/secrets.dm
@@ -70,19 +70,10 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller)
if("maint_access_engiebrig")
if(!is_debugger)
return
- for(var/obj/machinery/door/airlock/maintenance/M in INSTANCES_OF(/obj/machinery/door))
- M.check_access()
- if (ACCESS_MAINT_TUNNELS in M.req_access)
- M.req_access = list()
- M.req_one_access = list(ACCESS_SECURITY, ACCESS_ENGINEERING)
message_admins("[key_name_admin(holder)] made all maint doors engineering and brig access-only.")
if("maint_access_brig")
if(!is_debugger)
return
- for(var/obj/machinery/door/airlock/maintenance/M in INSTANCES_OF(/obj/machinery/door))
- M.check_access()
- if (ACCESS_MAINT_TUNNELS in M.req_access)
- M.req_access = list(ACCESS_SECURITY)
message_admins("[key_name_admin(holder)] made all maint doors brig access-only.")
if("infinite_sec")
if(!is_debugger)
@@ -291,14 +282,6 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller)
summon_events(holder)
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Activate"))
- if("eagles")
- if(!is_funmin)
- return
- SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Egalitarian Station"))
- for(var/obj/machinery/door/airlock/W in INSTANCES_OF(/obj/machinery/door))
- if(is_station_level(W.z) && !istype(get_area(W), /area/station/command) && !istype(get_area(W), /area/station/commons) && !istype(get_area(W), /area/station/service) && !istype(get_area(W), /area/station/command/heads_quarters) && !istype(get_area(W), /area/station/security/prison)) W.req_access = list()
- message_admins("[key_name_admin(holder)] activated Egalitarian Station mode")
- priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.")
if("ancap")
if(!is_funmin)
return
diff --git a/code/modules/admin/view_variables/mass_edit_variables.dm b/code/modules/admin/view_variables/mass_edit_variables.dm
index 02acca95496..251c2797716 100644
--- a/code/modules/admin/view_variables/mass_edit_variables.dm
+++ b/code/modules/admin/view_variables/mass_edit_variables.dm
@@ -213,12 +213,6 @@
. += thing
CHECK_TICK
- else if (ispath(T, /obj/machinery/door))
- for(var/obj/machinery/door/thing in world)
- if (typecache[thing.type])
- . += thing
- CHECK_TICK
-
else if (ispath(T, /obj/machinery))
for(var/obj/machinery/thing in world)
if (typecache[thing.type])
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index db5fcec405a..adf5779122f 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -855,13 +855,6 @@ TYPEINFO_DEF(/obj/structure/table/abductor)
door_anim_time = 0
material_drop = /obj/item/stack/sheet/mineral/abductor
-/obj/structure/door_assembly/door_assembly_abductor
- name = "alien airlock assembly"
- base_name = "alien airlock"
- airlock_type = /obj/machinery/door/airlock/abductor
- material_type = /obj/item/stack/sheet/mineral/abductor
- noglass = TRUE
-
TYPEINFO_DEF(/obj/item/clothing/under/abductor)
default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, FIRE = 0, ACID = 0)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index a9df2d5676d..29beb8dc881 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -184,26 +184,6 @@
var/obj/machinery/computer/C = target
C.attack_alien(user) //muh copypasta
- else if(istype(target, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/A = target
-
- if((!A.requiresID() || A.allowed(user)) && A.hasPower()) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message, power requirement is so this doesn't stop unpowered doors from being pried open if you have access
- return
- if(A.locked)
- to_chat(user, span_warning("The airlock's bolts prevent it from being forced!"))
- return
-
- if(A.hasPower())
- user.visible_message(span_warning("[user] jams [src] into the airlock and starts prying it open!"), span_warning("We start forcing the [A] open."), \
- span_hear("You hear a metal screeching sound."))
- playsound(A, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE)
- if(!do_after(user, A, 100))
- return
- //user.say("Heeeeeeeeeerrre's Johnny!")
- user.visible_message(span_warning("[user] forces the airlock to open with [user.p_their()] [src]!"), span_warning("We force the [A] to open."), \
- span_hear("You hear a metal screeching sound."))
- A.open(2)
-
/obj/item/melee/arm_blade/unequipped(mob/user)
..()
if(can_drop)
diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm
index eb52498879d..6e13937ea64 100644
--- a/code/modules/antagonists/heretic/magic/mirror_walk.dm
+++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm
@@ -17,7 +17,6 @@
var/phase_in_time = 2 SECONDS
/// Static typecache of types that are counted as reflective.
var/static/list/special_reflective_surfaces = typecacheof(list(
- /obj/structure/window,
/obj/structure/mirror,
))
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index 0fd48c64f82..621ed374943 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -296,10 +296,6 @@
corpseholder.open()
for(var/obj/machinery/dna_scannernew/dna in victim)
dna.open_machine()
- for(var/obj/structure/window/window in victim)
- window.take_damage(rand(30, 80))
- if(window?.fulltile)
- new /obj/effect/temp_visual/revenant/cracks(window.loc)
for(var/obj/machinery/light/light in victim)
light.flicker(20) //spooky
diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
index d6aac590dbb..e3eae3e4371 100644
--- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
+++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
@@ -353,12 +353,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
uses = 1
/datum/action/innate/ai/lockdown/Activate()
- for(var/obj/machinery/door/D in INSTANCES_OF(/obj/machinery/door))
- if(!is_station_level(D.z))
- continue
- INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door, hostile_lockdown), owner)
- addtimer(CALLBACK(D, TYPE_PROC_REF(/obj/machinery/door, disable_lockdown)), 900)
-
var/obj/machinery/computer/communications/C = locate() in INSTANCES_OF(/obj/machinery/computer/communications)
if(C)
C.post_status("alert", "lockdown")
@@ -421,31 +415,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(to_animate), to_animate, invoker, TRUE)
-/// Destroy RCDs: Detonates all non-cyborg RCDs on the station.
-/datum/ai_module/destructive/destroy_rcd
- name = "Destroy RCDs"
- description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Construction Devices on the station."
- cost = 25
- one_purchase = TRUE
- power_type = /datum/action/innate/ai/destroy_rcds
- unlock_text = "After some improvisation, you rig your onboard radio to be able to send a signal to detonate all RCDs."
- unlock_sound = 'sound/items/timer.ogg'
-
-/datum/action/innate/ai/destroy_rcds
- name = "Destroy RCDs"
- desc = "Detonate all non-cyborg RCDs on the station."
- button_icon_state = "detonate_rcds"
- uses = 1
- cooldown_period = 100
-
-/datum/action/innate/ai/destroy_rcds/Activate()
- for(var/I in INSTANCES_OF(TRACKING_KEY_RCD))
- if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
- var/obj/item/construction/rcd/RCD = I
- RCD.detonate_pulse()
- to_chat(owner, span_danger("RCD detonation pulse emitted."))
- owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0)
-
/// Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase.
/datum/ai_module/destructive/overload_machine
name = "Machine Overload"
@@ -665,37 +634,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
to_chat(owner, span_notice("All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode."))
owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0)
-/// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job.
-/datum/ai_module/utility/break_fire_alarms
- name = "Thermal Sensor Override"
- description = "Gives you the ability to override the thermal sensors on all fire alarms. This will remove their ability to scan for fire and thus their ability to alert."
- one_purchase = TRUE
- cost = 25
- power_type = /datum/action/innate/ai/break_fire_alarms
- unlock_text = "You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will."
- unlock_sound = 'sound/machines/FireAlarm1.ogg'
-
-/datum/action/innate/ai/break_fire_alarms
- name = "Override Thermal Sensors"
- desc = "Disables the automatic temperature sensing on all fire alarms, making them effectively useless."
- button_icon_state = "break_fire_alarms"
- uses = 1
-
-/datum/action/innate/ai/break_fire_alarms/Activate()
- for(var/obj/machinery/firealarm/bellman as anything in INSTANCES_OF(/obj/machinery/firealarm))
- if(!is_station_level(bellman.z))
- continue
- bellman.obj_flags |= EMAGGED
- bellman.update_appearance()
-
- for(var/obj/machinery/door/firedoor/firelock in INSTANCES_OF(/obj/machinery/door))
- if(!is_station_level(firelock.z))
- continue
-
- firelock.emag_act(owner_AI, src)
- to_chat(owner, span_notice("All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized."))
- owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0)
-
/// Disable Emergency Lights
/datum/ai_module/utility/emergency_lights
name = "Disable Emergency Lights"
diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm
index 5e5d199fb9a..7a7a3879f1f 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm
@@ -36,10 +36,3 @@
item_path = /obj/item/warpwhistle
category = "Mobility"
cost = 1
-
-/datum/spellbook_entry/item/staffdoor
- name = "Staff of Door Creation"
- desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass."
- item_path = /obj/item/gun/magic/staff/door
- cost = 1
- category = "Mobility"
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
deleted file mode 100644
index 34b8c70caeb..00000000000
--- a/code/modules/assembly/doorcontrol.dm
+++ /dev/null
@@ -1,286 +0,0 @@
-/obj/item/assembly/control
- name = "blast door controller"
- desc = "A small electronic device able to control a blast door remotely."
- icon_state = "control"
- attachable = TRUE
- var/id = null
- var/can_change_id = 0
- var/cooldown = FALSE //Door cooldowns
- var/sync_doors = TRUE
-
-/obj/item/assembly/control/examine(mob/user)
- . = ..()
- if(id)
- . += span_notice("Its channel ID is '[id]'.")
-
-/obj/item/assembly/control/multitool_act(mob/living/user)
- var/change_id = tgui_input_number(user, "Set the door controllers ID", "Door ID", id, 100)
- if(!change_id || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK))
- return
- id = change_id
- to_chat(user, span_notice("You change the ID to [id]."))
-
-/obj/item/assembly/control/activate()
- var/openclose
- if(cooldown)
- return
- cooldown = TRUE
- for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door))
- if(M.id == src.id)
- if(openclose == null || !sync_doors)
- openclose = M.density
- INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close))
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
-
-/obj/item/assembly/control/curtain
- name = "curtain controller"
- desc = "A small electronic device able to control a mechanical curtain remotely."
-
-/obj/item/assembly/control/curtain/examine(mob/user)
- . = ..()
- if(id)
- . += span_notice("Its channel ID is '[id]'.")
-
-/obj/item/assembly/control/curtain/activate()
- var/openclose
- if(cooldown)
- return
- cooldown = TRUE
- for(var/obj/structure/curtain/cloth/fancy/mechanical/M as anything in INSTANCES_OF(/obj/structure/curtain/cloth/fancy/mechanical))
- if(M.id == src.id)
- if(openclose == null || !sync_doors)
- openclose = M.density
- INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/structure/curtain/cloth/fancy/mechanical, open) : TYPE_PROC_REF(/obj/structure/curtain/cloth/fancy/mechanical, close))
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 5)
-
-
-/obj/item/assembly/control/airlock
- name = "airlock controller"
- desc = "A small electronic device able to control an airlock remotely."
- id = "badmin" // Set it to null for MEGAFUN.
- var/specialfunctions = OPEN
- /*
- Bitflag, 1= open (OPEN)
- 2= idscan (IDSCAN)
- 4= bolts (BOLTS)
- 8= shock (SHOCK)
- 16= door safties (SAFE)
- */
-
-/obj/item/assembly/control/airlock/activate()
- if(cooldown)
- return
- cooldown = TRUE
- var/doors_need_closing = FALSE
- var/list/obj/machinery/door/airlock/open_or_close = list()
- for(var/obj/machinery/door/airlock/D in INSTANCES_OF(/obj/machinery/door))
- if(D.id_tag == src.id)
- if(specialfunctions & OPEN)
- open_or_close += D
- if(!D.density)
- doors_need_closing = TRUE
- if(specialfunctions & IDSCAN)
- D.aiDisabledIdScanner = !D.aiDisabledIdScanner
- if(specialfunctions & BOLTS)
- if(!D.wires.is_cut(WIRE_BOLTS) && D.hasPower())
- D.locked = !D.locked
- D.update_appearance()
- if(specialfunctions & SHOCK)
- if(D.secondsElectrified)
- D.set_electrified(MACHINE_ELECTRIFIED_PERMANENT, usr)
- else
- D.set_electrified(MACHINE_NOT_ELECTRIFIED, usr)
- if(specialfunctions & SAFE)
- D.dont_close_on_dense_objects = !D.dont_close_on_dense_objects
-
- for(var/D in open_or_close)
- INVOKE_ASYNC(D, doors_need_closing ? TYPE_PROC_REF(/obj/machinery/door/airlock, close) : TYPE_PROC_REF(/obj/machinery/door/airlock, open))
-
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
-
-
-/obj/item/assembly/control/massdriver
- name = "mass driver controller"
- desc = "A small electronic device able to control a mass driver."
-
-/obj/item/assembly/control/massdriver/activate()
- if(cooldown)
- return
- cooldown = TRUE
- for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door))
- if (M.id == src.id)
- INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, open))
-
- sleep(10)
-
- for(var/obj/machinery/mass_driver/M as anything in INSTANCES_OF(/obj/machinery/mass_driver))
- if(M.id == src.id)
- M.drive()
-
- sleep(60)
-
- for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door))
- if (M.id == src.id)
- INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, close))
-
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
-
-
-/obj/item/assembly/control/igniter
- name = "ignition controller"
- desc = "A remote controller for a mounted igniter."
-
-/obj/item/assembly/control/igniter/activate()
- if(cooldown)
- return
-
- cooldown = TRUE
-
- for(var/obj/machinery/sparker/M as anything in INSTANCES_OF(/obj/machinery/sparker))
- if (M.id == src.id)
- INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/sparker, ignite))
-
- for(var/obj/machinery/igniter/M as anything in INSTANCES_OF(/obj/machinery/igniter))
- if(M.id == src.id)
- M.use_power(50)
- M.on = !M.on
- M.icon_state = "igniter[M.on]"
-
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 30)
-
-/obj/item/assembly/control/flasher
- name = "flasher controller"
- desc = "A remote controller for a mounted flasher."
-
-/obj/item/assembly/control/flasher/activate()
- if(cooldown)
- return
- cooldown = TRUE
- for(var/obj/machinery/flasher/M as anything in INSTANCES_OF(/obj/machinery/flasher))
- if(M.id == src.id)
- INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/flasher, flash))
-
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
-
-/obj/item/assembly/control/crematorium
- name = "crematorium controller"
- desc = "An evil-looking remote controller for a crematorium."
-
-/obj/item/assembly/control/crematorium/activate()
- if(cooldown)
- return
- cooldown = TRUE
- for (var/obj/structure/bodycontainer/crematorium/C in GLOB.crematoriums)
- if (C.id == id)
- C.cremate(usr)
-
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
-
-//how long it spends on each floor when moving somewhere, so it'd take 4 seconds to reach you if it had to travel up 2 floors
-#define FLOOR_TRAVEL_TIME 2 SECONDS
-/obj/item/assembly/control/elevator
- name = "elevator controller"
- desc = "A small device used to call elevators to the current floor."
-
-/obj/item/assembly/control/elevator/activate()
- if(cooldown)
- return
- cooldown = TRUE
- var/datum/lift_master/lift
- for(var/datum/lift_master/possible_match as anything in GLOB.active_lifts_by_type[BASIC_LIFT_ID])
- if(possible_match.specific_lift_id != id || !check_z(possible_match) || possible_match.controls_locked)
- continue
-
- lift = possible_match
- break
-
- if(!lift)
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS)
- return
-
- var/obj/structure/industrial_lift/target = lift.lift_platforms[1]
- var/target_z = target.z
-
- lift.set_controls(LIFT_PLATFORM_LOCKED)
- ///The z level to which the elevator should travel
- var/targetZ = (abs(loc.z)) //The target Z (where the elevator should move to) is not our z level (we are just some assembly in nullspace) but actually the Z level of whatever we are contained in (e.g. elevator button)
- ///The amount of z levels between the our and targetZ
- var/difference = abs(targetZ - target_z)
- ///Direction (up/down) needed to go to reach targetZ
- var/direction = target_z < targetZ ? UP : DOWN
- ///How long it will/should take us to reach the target Z level
- var/travel_duration = FLOOR_TRAVEL_TIME * difference //100 / 2 floors up = 50 seconds on every floor, will always reach destination in the same time
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), travel_duration)
-
- for(var/i in 1 to difference)
- sleep(FLOOR_TRAVEL_TIME)//hey this should be alright... right?
- if(QDELETED(lift) || QDELETED(src))//elevator control or button gone = don't go up anymore
- return
- lift.MoveLift(direction, null)
- lift.set_controls(LIFT_PLATFORM_UNLOCKED)
-
-///check if any of the lift platforms are already here
-/obj/item/assembly/control/elevator/proc/check_z(datum/lift_master/lift)
- for(var/obj/structure/industrial_lift/platform as anything in lift.lift_platforms)
- if(platform.z == loc.z)
- return FALSE
-
- return TRUE
-
-#undef FLOOR_TRAVEL_TIME
-
-/obj/item/assembly/control/tram
- name = "tram call button"
- desc = "A small device used to bring trams to you."
- ///for finding the landmark initially - should be the exact same as the landmark's destination id.
- var/initial_id
- ///ID to link to allow us to link to one specific tram in the world
- var/specific_lift_id = MAIN_STATION_TRAM
- ///this is our destination's landmark, so we only have to find it the first time.
- var/datum/weakref/to_where
-
-/obj/item/assembly/control/tram/Initialize(mapload)
- ..()
- return INITIALIZE_HINT_LATELOAD
-
-/obj/item/assembly/control/tram/LateInitialize()
- . = ..()
- //find where the tram needs to go to (our destination). only needs to happen the first time
- for(var/obj/effect/landmark/tram/our_destination as anything in GLOB.tram_landmarks[specific_lift_id])
- if(our_destination.destination_id == initial_id)
- to_where = WEAKREF(our_destination)
- break
-
-/obj/item/assembly/control/tram/Destroy()
- to_where = null
- return ..()
-
-/obj/item/assembly/control/tram/activate()
- if(cooldown)
- return
- cooldown = TRUE
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS)
-
- var/datum/lift_master/tram/tram
- for(var/datum/lift_master/tram/possible_match as anything in GLOB.active_lifts_by_type[TRAM_LIFT_ID])
- if(possible_match.specific_lift_id == specific_lift_id)
- tram = possible_match
- break
-
- if(!tram)
- say("The tram is not responding to call signals. Please send a technician to repair the internals of the tram.")
- return
- if(tram.travelling) //in use
- say("The tram is already travelling to [tram.from_where].")
- return
- if(!to_where)
- return
- var/obj/effect/landmark/tram/current_location = to_where.resolve()
- if(!current_location)
- return
- if(tram.from_where == current_location) //already here
- say("The tram is already here. Please board the tram and select a destination.")
- return
-
- say("The tram has been called to [current_location.name]. Please wait for its arrival.")
- tram.tram_travel(current_location)
diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm
index b97dbf3a379..9a0cf8b54fd 100644
--- a/code/modules/atmospherics/ZAS/Airflow.dm
+++ b/code/modules/atmospherics/ZAS/Airflow.dm
@@ -103,7 +103,6 @@ This entire system is an absolute mess.
///The typecache of objects airflow can't push objects into the same tile of
GLOBAL_LIST_INIT(airflow_step_blacklist, typecacheof(list(
/obj/structure,
- /obj/machinery/door
)))
/atom/movable/Bump(atom/A)
diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm
index 958d2c04d24..442057f925b 100644
--- a/code/modules/atmospherics/ZAS/Fire.dm
+++ b/code/modules/atmospherics/ZAS/Fire.dm
@@ -415,23 +415,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
/turf/open/space/apply_fire_protection()
return
-/turf/fire_act(exposed_temperature, exposed_volume, turf/adjacent)
- return
-
-/turf/open/floor/fire_act(exposed_temperature, exposed_volume, turf/adjacent)
- if(!adjacent)
- return
-
- var/dir_to = get_dir(src, adjacent)
-
- for(var/obj/structure/window/W in src)
- if(W.dir == dir_to || W.fulltile) //Same direction or diagonal (full tile)
- W.fire_act(exposed_temperature, exposed_volume, adjacent)
-
- for(var/obj/machinery/door/window/door in src)
- if(door.dir == dir_to) //Same direction or diagonal (full tile)
- door.fire_act(exposed_temperature, exposed_volume, adjacent)
-
/turf/closed/constructed_wall/fire_act(exposed_temperature, exposed_volume, turf/adjacent)
if(!uses_integrity)
burn(exposed_temperature)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 6fd6dfdcdbb..36f83b34106 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -104,8 +104,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm)
var/alert_type = FIRE_CLEAR
///A reference to the area we are in
var/area/my_area
- ///The loopingsound for when there's shit fucky
- var/datum/looping_sound/firealarm/soundloop
var/locked = TRUE
var/aidisabled = 0
@@ -167,7 +165,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm)
name = "[get_area_name(src)] Air Alarm"
alarm_manager = new(src)
- soundloop = new(src, FALSE)
RegisterSignal(src, COMSIG_FIRE_ALERT, PROC_REF(handle_alert))
update_appearance()
@@ -190,7 +187,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm)
SSairmachines.stop_processing_machine(src)
QDEL_NULL(wires)
QDEL_NULL(alarm_manager)
- QDEL_NULL(soundloop)
return ..()
/obj/machinery/airalarm/Moved(atom/OldLoc, Dir, list/old_locs, momentum_change = TRUE)
@@ -467,10 +463,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm)
post_alert(0)
usr.animate_interact(src)
. = TRUE
- if("fire_alarm")
- my_area.communicate_fire_alert(alert_type ? FIRE_CLEAR : FIRE_RAISED_GENERIC)
- usr.animate_interact(src)
- . = TRUE
update_appearance()
@@ -773,22 +765,8 @@ TYPEINFO_DEF(/obj/machinery/airalarm)
current_tlv = cached_tlv[gas_id]
gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(environment.gas[gas_id]))
- var/old_danger_level = danger_level
danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
- if(old_danger_level != danger_level)
- INVOKE_ASYNC(src, PROC_REF(apply_danger_level))
- if(alert_type)
- if(!danger_level)
- my_area.communicate_fire_alert(FIRE_CLEAR)
- else if(danger_level)
- if(temperature_dangerlevel > 1)
- my_area.communicate_fire_alert(environment.temperature >= cached_tlv["temperature"].hazard_max ? FIRE_RAISED_HOT : FIRE_RAISED_COLD)
- else if(pressure_dangerlevel > 1)
- my_area.communicate_fire_alert(FIRE_RAISED_PRESSURE)
- else
- my_area.communicate_fire_alert(FIRE_RAISED_GENERIC)
-
if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
mode = AALARM_MODE_SCRUBBING
INVOKE_ASYNC(src, PROC_REF(apply_mode), src)
@@ -943,21 +921,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm)
togglelock(user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
- if((buildstage == AIRALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS))
- return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
- return FALSE
-
-/obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
- switch(passed_mode)
- if(RCD_UPGRADE_SIMPLE_CIRCUITS)
- user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \
- span_notice("You adapt an air alarm circuit and slot it into the assembly."))
- buildstage = AIRALARM_BUILD_NO_WIRES
- update_appearance()
- return TRUE
- return FALSE
-
/obj/machinery/airalarm/proc/togglelock(mob/living/user)
if(machine_stat & (NOPOWER|BROKEN))
to_chat(user, span_warning("It does nothing!"))
@@ -1124,10 +1087,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 21)
if(code)
alarm_manager.send_alarm(ALARM_FIRE)
- soundloop.start()
else
alarm_manager.clear_alarm(ALARM_FIRE)
- soundloop.stop()
alert_type = code
diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm
index 6ff8bf0531c..7364a659744 100644
--- a/code/modules/buildmode/submodes/basic.dm
+++ b/code/modules/buildmode/submodes/basic.dm
@@ -42,14 +42,3 @@
else if(isobj(object))
qdel(object)
return
- else if(istype(object,/turf) && alt_click && left_click)
- log_admin("Build Mode: [key_name(c)] built an airlock at [AREACOORD(object)]")
- new/obj/machinery/door/airlock(get_turf(object))
- else if(istype(object,/turf) && ctrl_click && left_click)
- var/obj/structure/window/reinforced/window
- if(BM.build_dir in GLOB.diagonals)
- window = new /obj/structure/window/reinforced/fulltile(get_turf(object))
- else
- window = new /obj/structure/window/reinforced(get_turf(object))
- window.setDir(BM.build_dir)
- log_admin("Build Mode: [key_name(c)] built a window at [AREACOORD(object)]")
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index 51c64efef3e..d521a8b73ca 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -50,12 +50,6 @@
contents_cost = CARGO_CRATE_VALUE * 3.5
export_types = list(/obj/structure/reagent_dispensers/beerkeg)
-
-/datum/export/large/pipedispenser
- cost = CARGO_CRATE_VALUE * 2.5
- unit_name = "pipe dispenser"
- export_types = list(/obj/machinery/pipedispenser)
-
/datum/export/large/emitter
cost = CARGO_CRATE_VALUE * 2.75
unit_name = "emitter"
diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm
index 4714099a8af..9037eff4c1c 100644
--- a/code/modules/cargo/exports/tools.dm
+++ b/code/modules/cargo/exports/tools.dm
@@ -93,7 +93,6 @@
cost = CARGO_CRATE_VALUE * 0.025
unit_name = "radio"
export_types = list(/obj/item/radio)
- exclude_types = list(/obj/item/radio/mech)
//Advanced/Power Tools.
/datum/export/weldingtool/experimental
@@ -111,31 +110,6 @@
unit_name = "hand drill"
export_types = list(/obj/item/screwdriver/power)
-/datum/export/rld_mini
- cost = CARGO_CRATE_VALUE * 0.75
- unit_name = "mini rapid lighting device"
- export_types = list(/obj/item/construction/rld/mini)
-
-/datum/export/rsf
- cost = CARGO_CRATE_VALUE * 0.5
- unit_name = "rapid service fabricator"
- export_types = list(/obj/item/rsf)
-
-/datum/export/rcd
- cost = CARGO_CRATE_VALUE * 0.5
- unit_name = "rapid construction device"
- export_types = list(/obj/item/construction/rcd)
-
-/datum/export/rcd_ammo
- cost = CARGO_CRATE_VALUE * 0.3
- unit_name = "compressed matter cardridge"
- export_types = list(/obj/item/rcd_ammo)
-
-/datum/export/rpd
- cost = CARGO_CRATE_VALUE * 0.5
- unit_name = "rapid pipe dispenser"
- export_types = list(/obj/item/pipe_dispenser)
-
//artisanal exports for the mom and pops
/datum/export/soap
cost = CARGO_CRATE_VALUE * 0.375
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 04d12ee0c48..b98a094d21b 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -424,16 +424,6 @@
/obj/item/melee/baton/security/loaded)
crate_name = "stun baton crate"
-/datum/supply_pack/security/wall_flash
- name = "Wall-Mounted Flash Crate"
- desc = "Contains four wall-mounted flashes. Requires Security access to open."
- cost = CARGO_CRATE_VALUE * 2
- contains = list(/obj/item/storage/box/wall_flash,
- /obj/item/storage/box/wall_flash,
- /obj/item/storage/box/wall_flash,
- /obj/item/storage/box/wall_flash)
- crate_name = "wall-mounted flash crate"
-
/datum/supply_pack/security/constable
name = "Traditional Equipment Crate"
desc = "Spare equipment found in a warehouse."
@@ -654,25 +644,6 @@
/obj/machinery/shieldgen)
crate_name = "anti-breach shield projector crate"
-/datum/supply_pack/engineering/ripley
- name = "APLU MK-I Crate"
- desc = "A do-it-yourself kit for building an ALPU MK-I \"Ripley\", designed for lifting and carrying heavy equipment, and other station tasks. Batteries not included."
- cost = CARGO_CRATE_VALUE * 10
- access_view = ACCESS_ROBOTICS
- contains = list(/obj/item/mecha_parts/chassis/ripley,
- /obj/item/mecha_parts/part/ripley_torso,
- /obj/item/mecha_parts/part/ripley_right_arm,
- /obj/item/mecha_parts/part/ripley_left_arm,
- /obj/item/mecha_parts/part/ripley_right_leg,
- /obj/item/mecha_parts/part/ripley_left_leg,
- /obj/item/stock_parts/capacitor,
- /obj/item/stock_parts/scanning_module,
- /obj/item/circuitboard/mecha/ripley/main,
- /obj/item/circuitboard/mecha/ripley/peripherals,
- /obj/item/mecha_parts/mecha_equipment/drill,
- /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp)
- crate_name= "\improper APLU MK-I kit"
-
/datum/supply_pack/engineering/conveyor
name = "Conveyor Assembly Crate"
desc = "Keep production moving along with thirty conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book."
@@ -1044,16 +1015,6 @@
contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
crate_name = "wood planks crate"
-/datum/supply_pack/materials/rcd_ammo
- name = "RCD Ammo"
- desc = "Contains four raw material cartridges that can be used to quickly recharge any RCD."
- cost = CARGO_CRATE_VALUE * 8.5
- contains = list(/obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo/large,
- /obj/item/rcd_ammo/large,)
- crate_name = "rcd ammo crate"
-
/datum/supply_pack/materials/foamtank
name = "Firefighting Foam Tank Crate"
desc = "Contains a tank of firefighting foam."
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index b37bf0bcce9..1121292e0c1 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -150,14 +150,11 @@
back = /obj/item/mod/control/pre_equipped/responsory/engineer
l_hand = /obj/item/gun/energy/e_gun
backpack_contents = list(
- /obj/item/construction/rcd/loaded/upgraded = 1,
/obj/item/melee/baton/security/loaded = 1,
- /obj/item/pipe_dispenser = 1,
/obj/item/storage/box/survival/engineer = 1,
)
belt = /obj/item/storage/belt/utility/full/powertools
glasses = /obj/item/clothing/glasses/meson/engine
- l_pocket = /obj/item/rcd_ammo/large
/datum/outfit/centcom/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -173,10 +170,8 @@
name = "ERT Engineer - High Alert"
backpack_contents = list(
- /obj/item/construction/rcd/combat = 1,
/obj/item/gun/energy/pulse/pistol = 1,
/obj/item/melee/baton/security/loaded = 1,
- /obj/item/pipe_dispenser = 1,
/obj/item/storage/box/survival/engineer = 1,
)
@@ -230,7 +225,6 @@
suit_store = /obj/item/tank/internals/oxygen
back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/security
backpack_contents = list(
- /obj/item/construction/rcd/loaded = 1,
/obj/item/melee/baton/security/loaded = 1,
/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/survival/engineer = 1,
@@ -449,7 +443,6 @@
suit_store = null
back = /obj/item/storage/backpack/ert/engineer
backpack_contents = list(
- /obj/item/construction/rcd/loaded = 1,
/obj/item/etherealballdeployer = 1,
/obj/item/stack/light_w = 30,
/obj/item/stack/sheet/glass/fifty = 1,
diff --git a/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm b/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm
index 305dbc276d7..27326c0385a 100644
--- a/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm
+++ b/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm
@@ -12,7 +12,7 @@ TYPEINFO_DEF(/obj/item/clothing/suit/space/hardsuit)
icon_state = "hardsuit-engineering"
inhand_icon_state = "eng_hardsuit"
max_integrity = 300
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner)
siemens_coefficient = 0
actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle_helmet)
supports_variations_flags = CLOTHING_TESHARI_VARIATION
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 40791f5f42f..d5ed27601fe 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -371,8 +371,6 @@ TYPEINFO_DEF(/obj/item/clothing/suit/hooded/wintercoat/engineering)
zmm_flags = ZMM_MANGLE_PLANES
allowed = list(
/obj/item/analyzer,
- /obj/item/construction/rcd,
- /obj/item/pipe_dispenser,
/obj/item/t_scanner,
/obj/item/storage/bag/construction,
)
diff --git a/code/modules/codex/entries/items.dm b/code/modules/codex/entries/items.dm
index 5efbe8b3d24..1b97793dbb7 100644
--- a/code/modules/codex/entries/items.dm
+++ b/code/modules/codex/entries/items.dm
@@ -17,11 +17,3 @@
name = "Reagent Cartridge"
associated_paths = list(/obj/item/reagent_containers/chem_cartridge)
controls_text = "Use Pen - Change label."
-
-/datum/codex_entry/item/pipe_dispenser
- name = "Rapid Pipe Dispenser"
- associated_paths = list(/obj/item/pipe_dispenser)
- controls_text = {"
- Right Click on Pipe - Set color and layer.
- Scroll Wheel - Cycle pipe layer.
- "}
diff --git a/code/modules/codex/entries/machinery.dm b/code/modules/codex/entries/machinery.dm
index d7f162e8c3a..8a2b0002275 100644
--- a/code/modules/codex/entries/machinery.dm
+++ b/code/modules/codex/entries/machinery.dm
@@ -7,13 +7,6 @@
. = ..()
GLOB.machine_codex_entries += src
-/datum/codex_entry/machine/airlock
- name = "Airlock"
- associated_paths = list(/obj/machinery/door/airlock)
- mechanics_text = " An airtight mechanical door. Most airlocks require an ID to open (wearing it on your ID slot is enough), and many have special access requirements to be on your ID. You can open an airlock by clicking on one, or simply walking into it, and clicking on an open airlock will close it. If the lights on the door flash red, you don't have the required access to open the airlock, and if they're consistently red, the door is bolted. Airlocks also require power to operate. In a situation without power, a crowbar can be used to force it open.
Airlocks can also be hacked. Airlock hacking information: * Door bolts will lock the door, preventing it from being opened by any means until the bolts are raised again. Pulsing the correct wire will toggle the bolts, but cutting it will only drop them. * IDscan light indicates the door can scan ID cards. If the wire for this is pulsed it will cause the door to flash red, and cutting it will cause doors with restricted access to be unable to scan ID, essentially locking it. * The AI control light shows whether or not AI and robots can control the door. Pulsing is only temporary, while cutting is more permanent. * The test light shows whether the door has power or not. When turned off, the door can be opened with a crowbar. * If the door sparks, it is electrified. Pulsing the corresponding wire causes this to happen for 30 seconds, and cutting it electrifies the door until mended. * The check wiring light will turn on if the safety is turned off. This causes the airlock to close even when someone is standing on it, crushing them. * If the Check Timing Mechanism light is on then the door will close much faster than normal. Dangerous in conjuction with the Check Wiring light.
Deconstruction To pull apart an airlock, you must open the maintenance panel, disable the power via hacking (or any other means), weld the door shut, and crowbar the electroncs out, cut the wires with a wirecutter, unsecure the whole assembly with a wrench, and then cut it into metal sheets with a welding tool."
- antag_text = " Electrifying a door makes for a good trap, hurting and stunning whoever touches it. The same goes for a combination of disabling the safety and timing mechanisms. Bolting a door can also help ensure privacy, or slow down those in search of you. It's also a good idea to disable AI interaction when needed."
- disambiguator = "machine"
-
/datum/codex_entry/machine/asteroid_magnet
name = "Asteroid Magnet"
associated_paths = list(/obj/machinery/asteroid_magnet)
diff --git a/code/modules/construction/girder.dm b/code/modules/construction/girder.dm
index d0826c7d478..8b56095b8fc 100644
--- a/code/modules/construction/girder.dm
+++ b/code/modules/construction/girder.dm
@@ -14,7 +14,7 @@
density = FALSE
can_atmos_pass = CANPASS_ALWAYS
smoothing_groups = SMOOTH_GROUP_WALLS
- smoothing_groups_with = SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS
+ smoothing_groups_with = SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WALLS
uses_integrity = TRUE
max_integrity = /datum/material/steel::wall_integrity * 0.5
/// The material that the girder walls are made of.
@@ -51,7 +51,7 @@
'icons/construction/wall/girder_reinforced/wall/wall_2.dmi',
)
var/integrity_pct = atom_integrity / max_integrity
- var/wanted_state = MAP(integrity_pct, 0, 1, 0, 2)
+ var/wanted_state = round(MAP(integrity_pct, 0, 1, 0, 2))
if(material_reinforcement)
icon = reinforced_icons[wanted_state]
// icon_state should be set by smoothing
diff --git a/code/modules/construction/grille.dm b/code/modules/construction/grille.dm
index 5650d8d141c..31d14545c6e 100644
--- a/code/modules/construction/grille.dm
+++ b/code/modules/construction/grille.dm
@@ -56,10 +56,6 @@
/obj/structure/grillen/screwdriver_act(mob/living/user, obj/item/tool)
if(!Adjacent(user))
return ..()
- var/obj/structure/window/window = locate() in get_turf(src)
- if(!isnull(window))
- balloon_alert(user, "cannot reach!")
- return TRUE
if(shock(user, 75))
return TRUE
balloon_alert_to_viewers("adjusting anchors...")
@@ -117,36 +113,6 @@
return
. = ..()
-/obj/structure/grillen/attackby(obj/item/attacking_item, mob/user, params)
- if(!istype(attacking_item, /obj/item/stack/sheet))
- return ..()
- if(atom_integrity < (max_integrity * 0.7))
- balloon_alert(user, "grille is too damaged to attach a window!")
- return TRUE
- var/obj/item/stack/sheet/sheet = attacking_item
- var/datum/material/material_instance = GET_MATERIAL_REF(sheet.material_type)
- if(!material_instance)
- stack_trace("null material_type: [sheet.material_type]")
- return
- var/obj/structure/window/window_type = material_instance.window_type
- if(!window_type)
- balloon_alert(user, "This cannot make a window!")
- return TRUE
- if(!isfloorturf(loc))
- balloon_alert(user, "what floor?")
- return TRUE
- for(var/atom/movable/other in loc)
- if(other == src)
- continue
- if(other.density)
- balloon_alert(user, "no room!")
- return TRUE
- var/obj/structure/window/window = new window_type(loc)
- window.anchored = TRUE
- window.state = WINDOW_OUT_OF_FRAME
- window.setDir(dir)
- return TRUE
-
/obj/structure/grillen/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(.)
diff --git a/code/modules/construction/wall/wall_actual.dm b/code/modules/construction/wall/wall_actual.dm
index 0b4d5acc3e6..61d813a1670 100644
--- a/code/modules/construction/wall/wall_actual.dm
+++ b/code/modules/construction/wall/wall_actual.dm
@@ -6,7 +6,7 @@
smoothing_flags = SMOOTH_BITMASK|SMOOTH_OBJ
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
- smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS
+ smoothing_groups_with = SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WALLS
uses_integrity = TRUE
max_integrity = /datum/material/steel::wall_integrity
baseturfs = /turf/open/floor/plating
@@ -35,6 +35,18 @@
QUEUE_SMOOTH(src)
QUEUE_SMOOTH_NEIGHBORS(src)
+/turf/closed/constructed_wall/ex_act(severity, target)
+ // TODO: ARMOR REFACTOR TO ACTUALLY MATTER FOR WALLS. kthx bai
+ if(!isnull(target))
+ CRASH("I DIDNT TRAIN FOR THIS AT THE ACADEMY.")
+ switch(severity)
+ if(EXPLODE_DEVASTATE)
+ take_damage(max_integrity)
+ if(EXPLODE_HEAVY)
+ take_damage(max(FLOOR(max_integrity * 0.50, 1), 30))
+ if(EXPLODE_LIGHT)
+ take_damage(FLOOR(max_integrity * 0.10, 1))
+
/turf/closed/constructed_wall/proc/update_material_resistances()
var/new_heat_resistance = material_plating.heat_resistance
var/new_max_integrity = material_plating.wall_integrity
@@ -58,6 +70,8 @@
visible_message(span_warning("\The [src] seems to warp slightly!"))
/turf/closed/constructed_wall/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armor_penetration)
+ if(material_plating == /datum/material/centcomnium)
+ return 0 // dont feel like it champ
last_damage = damage_amount
return ..()
diff --git a/code/modules/debris/debris_obj.dm b/code/modules/debris/debris_obj.dm
index ad1b76a8cf3..a0f598e1205 100644
--- a/code/modules/debris/debris_obj.dm
+++ b/code/modules/debris/debris_obj.dm
@@ -7,8 +7,3 @@
debris_icon_state = DEBRIS_SPARKS
debris_velocity = -10
debris_amount = 5
-
-/obj/structure/window
- debris_icon_state = DEBRIS_SPARKS
- debris_velocity = -10
- debris_amount = 5
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index 1487fca5d03..128ceb9fc5f 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -11,8 +11,6 @@
/// 'normal' sound keys, index by them to get the friendly name.
var/list/sound_pool = list(
- "airlock" = "Door",
- "airlock_pry" = "Door Prying",
"console" = "Computer",
"explosion" = "Explosion",
"far_explosion" = "Distant Explosion",
@@ -21,7 +19,6 @@
"alarm" = "Alarm",
"beepsky" = "Securiton",
"wall_decon" = "Wall Deconstruction",
- "door_hack" = "Door Hacking",
"tesla" = "Tesla Ball"
)
/// 'Weird' sound keys, index by them to get the friendly name.
@@ -45,7 +42,6 @@
)
/// Pool for generic hallucinations. Types can't key lists, so we need to invert the accesses.
var/list/generic_pool = list(
- "Fake bolted airlocks" = /datum/hallucination/bolts,
"Imagined messages" = /datum/hallucination/chat,
"Fake minor message" = /datum/hallucination/message,
"Fake gas flood" = /datum/hallucination/fake_flood,
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
deleted file mode 100644
index bab3e3185f6..00000000000
--- a/code/modules/events/prison_break.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/datum/round_event_control/grey_tide
- name = "Grey Tide"
- typepath = /datum/round_event/grey_tide
- max_occurrences = 1
- min_players = 5
-
-/datum/round_event/grey_tide
- announceWhen = 50
- endWhen = 20
- var/list/area/areasToOpen = list()
- var/list/potential_areas = list(/area/station/command,
- /area/station/engineering,
- /area/station/medical,
- /area/station/security,
- /area/station/cargo,
- /area/station/science)
- var/severity = 1
-
-
-/datum/round_event/grey_tide/setup()
- announceWhen = rand(50, 60)
- endWhen = rand(20, 30)
- severity = rand(1,3)
- for(var/i in 1 to severity)
- var/picked_area = pick_n_take(potential_areas)
- for(var/area/A in GLOB.areas)
- if(istype(A, picked_area))
- areasToOpen += A
-
-
-/datum/round_event/grey_tide/announce(fake)
- if(areasToOpen && areasToOpen.len > 0)
- priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.")
- else
- log_world("ERROR: Could not initiate grey-tide. No areas in the list!")
- kill()
-
-
-/datum/round_event/grey_tide/start()
- for(var/area/A in areasToOpen)
- for(var/obj/machinery/light/L in A)
- L.flicker(10)
-
-/datum/round_event/grey_tide/end()
- for(var/area/A in areasToOpen)
- for(var/obj/O in A)
- if(istype(O, /obj/structure/closet/secure_closet))
- var/obj/structure/closet/secure_closet/temp = O
- temp.locked = FALSE
- temp.update_appearance()
- else if(istype(O, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/temp = O
- if(temp.critical_machine) //Skip doors in critical positions, such as the SM chamber.
- continue
- temp.prison_open()
- else if(istype(O, /obj/machinery/door_timer))
- var/obj/machinery/door_timer/temp = O
- temp.timer_end(forced = TRUE)
-
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
index 772a387baba..b525242c6cf 100644
--- a/code/modules/events/wizard/magicarp.dm
+++ b/code/modules/events/wizard/magicarp.dm
@@ -40,7 +40,7 @@
random_color = FALSE
var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/fireball,
+ /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/fireball,
/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
/mob/living/simple_animal/hostile/carp/ranged/Initialize(mapload)
@@ -62,9 +62,9 @@
/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool
gold_core_spawnable = HOSTILE_SPAWN
allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport,
- /obj/projectile/magic/door, /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) //thanks Lett1
+ /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) //thanks Lett1
/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology
gold_core_spawnable = HOSTILE_SPAWN
allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport,
- /obj/projectile/magic/door, /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
+ /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 071ba630777..e476c8e86ca 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -13,7 +13,6 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/stationmessage = 7,
/datum/hallucination/fake_flood = 7,
/datum/hallucination/stray_bullet = 7,
- /datum/hallucination/bolts = 7,
/datum/hallucination/items_other = 7,
/datum/hallucination/husks = 7,
/datum/hallucination/items = 4,
@@ -722,89 +721,6 @@ GLOBAL_LIST_INIT(hallucination_list, list(
target.client.images.Remove(delusion)
return ..()
-/datum/hallucination/bolts
- var/list/airlocks_to_hit
- var/list/locks
- var/next_action = 0
- var/locking = TRUE
-
-/datum/hallucination/bolts/New(mob/living/carbon/C, forced, door_number)
- set waitfor = FALSE
- ..()
- if(!door_number)
- door_number = rand(0,4) //if 0 bolts all visible doors
- var/count = 0
- feedback_details += "Door amount: [door_number]"
-
- for(var/obj/machinery/door/airlock/A in range(7, target))
- if(count>door_number && door_number>0)
- break
- if(!A.density)
- continue
- count++
- LAZYADD(airlocks_to_hit, A)
-
- if(!LAZYLEN(airlocks_to_hit)) //no valid airlocks in sight
- qdel(src)
- return
-
- START_PROCESSING(SSfastprocess, src)
-
-/datum/hallucination/bolts/process(delta_time)
- next_action -= (delta_time * 10)
- if (next_action > 0)
- return
-
- if (locking)
- var/atom/next_airlock = pop(airlocks_to_hit)
- if (next_airlock)
- var/obj/effect/hallucination/fake_door_lock/lock = new(get_turf(next_airlock))
- lock.target = target
- lock.airlock = next_airlock
- LAZYADD(locks, lock)
-
- if (!LAZYLEN(airlocks_to_hit))
- locking = FALSE
- next_action = 10 SECONDS
- return
- else
- var/obj/effect/hallucination/fake_door_lock/next_unlock = popleft(locks)
- if (next_unlock)
- next_unlock.unlock()
- else
- qdel(src)
- return
-
- next_action = rand(4, 12)
-
-/datum/hallucination/bolts/Destroy()
- . = ..()
- QDEL_LIST(locks)
- STOP_PROCESSING(SSfastprocess, src)
-
-/obj/effect/hallucination/fake_door_lock
- layer = CLOSED_DOOR_LAYER + 1 //for Bump priority
- plane = GAME_PLANE
- var/image/bolt_light
- var/obj/machinery/door/airlock/airlock
-
-/obj/effect/hallucination/fake_door_lock/proc/lock()
- bolt_light = image(airlock.overlays_file, get_turf(airlock), "lights_bolts",layer=airlock.layer+0.1)
- if(target.client)
- target.client.images |= bolt_light
- target.playsound_local(get_turf(airlock), 'sound/machines/boltsdown.ogg',30,0,3)
-
-/obj/effect/hallucination/fake_door_lock/proc/unlock()
- if(target.client)
- target.client.images.Remove(bolt_light)
- target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3)
- qdel(src)
-
-/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, border_dir)
- . = ..()
- if(mover == target && airlock.density)
- return FALSE
-
/datum/hallucination/chat
/datum/hallucination/chat/New(mob/living/carbon/C, forced = TRUE, force_radio, specific_message)
diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm
index 4c53b7469e9..93d76b7b87c 100644
--- a/code/modules/holodeck/area_copy.dm
+++ b/code/modules/holodeck/area_copy.dm
@@ -41,9 +41,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
if(ismachinery(O))
var/obj/machinery/M = O
M.power_change()
- if(istype(O, /obj/machinery/button))
- var/obj/machinery/button/B = O
- B.setup_device()
if(holoitem)
O.flags_1 |= HOLOGRAM_1
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 4c42d8dbe33..f7ded843571 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -304,10 +304,6 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf
holo_machine.flags_1 |= NODECONSTRUCT_1
holo_machine.power_change()
- if(istype(holo_machine, /obj/machinery/button))
- var/obj/machinery/button/holo_button = holo_machine
- holo_button.setup_device()
-
spawning_simulation = FALSE
///this qdels holoitems that should no longer exist for whatever reason
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 4a95da05f48..584c6d9cec8 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -186,10 +186,6 @@
eventstarted = TRUE
- for(var/obj/structure/window/W in currentarea)
- if(W.flags_1&NODECONSTRUCT_1) // Just in case: only holo-windows
- qdel(W)
-
for(var/mob/M in currentarea)
to_chat(M, span_userdanger("FIGHT!"))
diff --git a/code/modules/industrial_lift/tram_override_objects.dm b/code/modules/industrial_lift/tram_override_objects.dm
index 4dc2240a70c..5b83516eebe 100644
--- a/code/modules/industrial_lift/tram_override_objects.dm
+++ b/code/modules/industrial_lift/tram_override_objects.dm
@@ -1,39 +1,4 @@
-/**
- * the tram has a few objects mapped onto it at roundstart, by default many of those objects have unwanted properties
- * for example grilles and windows have the atmos_sensitive element applied to them, which makes them register to
- * themselves moving to re register signals onto the turf via connect_loc. this is bad and dumb since it makes the tram
- * more expensive to move.
- *
- * if you map something on to the tram, make SURE if possible that it doesnt have anythign reacting to its own movement
- * it will make the tram more expensive to move and we dont want that because we dont want to return to the days where
- * the tram took a third of the tick per movement when its just carrying its default mapped in objects
- */
-/obj/structure/grille/tram/Initialize(mapload)
- . = ..()
- //RemoveElement(/datum/element/atmos_sensitive, mapload)
- //atmos_sensitive applies connect_loc which 1. reacts to movement in order to 2. unregister and register signals to
- //the old and new locs. we dont want that, pretend these grilles and windows are plastic or something idk
-
-/obj/structure/window/reinforced/shuttle/tram/Initialize(mapload, direct)
- . = ..()
- //RemoveElement(/datum/element/atmos_sensitive, mapload)
-
/obj/structure/shuttle/engine/propulsion/in_wall/tram
//if this has opacity, then every movement of the tram causes lighting updates
//DO NOT put something on the tram roundstart that has opacity, it WILL overload SSlighting
opacity = FALSE
-
-/obj/machinery/door/window/left/tram
-/obj/machinery/door/window/right/tram
-
-/obj/machinery/door/window/left/tram/Initialize(mapload, set_dir, unres_sides)
- . = ..()
- //RemoveElement(/datum/element/atmos_sensitive, mapload)
-
-/obj/machinery/door/window/right/tram/Initialize(mapload, set_dir, unres_sides)
- . = ..()
- //RemoveElement(/datum/element/atmos_sensitive, mapload)
-
-MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/left/tram, 0)
-MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/right/tram, 0)
-
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index f78633cc1c3..ab82180d546 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -254,7 +254,6 @@ GLOBAL_LIST_INIT(job_display_order, list(
if(pinpad_key)
var/pin = SSid_access.get_static_pincode(pinpad_key)
- spawned.mind.set_note(NOTES_DOOR_CODES, "The pin to your doors is [pin]")
to_chat(player_client, span_obviousnotice("You remember the pin to your doors: [pin]"))
/datum/job/proc/announce_job(mob/living/joining_mob)
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index befd60d93ac..c8f91e71d98 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -31,10 +31,6 @@
family_heirlooms = list(/obj/item/lighter, /obj/item/lighter/greyscale, /obj/item/storage/box/matches)
- mail_goodies = list(
- /obj/item/rpd_upgrade/unwrench = 30,
- )
-
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
rpg_title = "Aeromancer"
diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm
index 0c74c4c3960..808ee7382aa 100644
--- a/code/modules/mafia/controller.dm
+++ b/code/modules/mafia/controller.dm
@@ -405,13 +405,6 @@
* * close: boolean, the state you want the curtains in.
*/
/datum/mafia_controller/proc/toggle_night_curtains(close)
- for(var/obj/machinery/door/poddoor/D in INSTANCES_OF(/obj/machinery/door)) //I really dislike pathing of these
- if(D.id != "mafia") //so as to not trigger shutters on station, lol
- continue
- if(close)
- INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, close))
- else
- INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, open))
/**
* The actual start of night for players. Mostly info is given at the start of the night as the end of the night is when votes and actions are submitted and tried.
diff --git a/code/modules/mapfluff/centcom/nuke_ops.dm b/code/modules/mapfluff/centcom/nuke_ops.dm
index 02bf8a50f8e..3765b6f178d 100644
--- a/code/modules/mapfluff/centcom/nuke_ops.dm
+++ b/code/modules/mapfluff/centcom/nuke_ops.dm
@@ -22,24 +22,3 @@
desc = "A grey keycard with Lopez's Information on it. This is your ticket into the Fridge in Firebase Balthazord."
color = "#636363"
puzzle_id = "syndicate_fridge"
-
-//keycard doors
-/obj/machinery/door/puzzle/keycard/syndicate_bomb
- name = "Syndicate Ordinance Laboratory"
- desc = "Locked. Looks like you'll need a special access key to get in."
- puzzle_id = "syndicate_bomb"
-
-/obj/machinery/door/puzzle/keycard/syndicate_bio
- name = "Syndicate Bio-Weapon Laboratory"
- desc = "Locked. Looks like you'll need a special access key to get in."
- puzzle_id = "syndicate_bio"
-
-/obj/machinery/door/puzzle/keycard/syndicate_chem
- name = "Syndicate Chemical Manufacturing Plant"
- desc = "Locked. Looks like you'll need a special access key to get in"
- puzzle_id = "syndicate_chem"
-
-/obj/machinery/door/puzzle/keycard/syndicate_fridge
- name = "The Walk-In Fridge"
- desc = "Locked. Lopez sure runs a tight galley."
- puzzle_id = "syndicate_fridge"
diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm
deleted file mode 100644
index dac5534a62c..00000000000
--- a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm
+++ /dev/null
@@ -1,431 +0,0 @@
-//The necropolis gate is used to call forth Legion from the Necropolis.
-/obj/structure/necropolis_gate
- name = "necropolis gate"
- desc = "A massive stone gateway."
- icon = 'icons/effects/96x96.dmi'
- icon_state = "gate_full"
- flags_1 = ON_BORDER_1
- appearance_flags = 0
- layer = TABLE_LAYER
- anchored = TRUE
- density = TRUE
- pixel_x = -32
- pixel_y = -32
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- light_outer_range = 8
- light_color = LIGHT_COLOR_LAVA
- var/open = FALSE
- var/changing_openness = FALSE
- var/locked = FALSE
- var/static/mutable_appearance/top_overlay
- var/static/mutable_appearance/door_overlay
- var/static/mutable_appearance/dais_overlay
- var/obj/structure/opacity_blocker/sight_blocker
- var/sight_blocker_distance = 1
-
-/obj/structure/necropolis_gate/Initialize(mapload)
- . = ..()
- setDir(SOUTH)
- var/turf/sight_blocker_turf = get_turf(src)
- if(sight_blocker_distance)
- for(var/i in 1 to sight_blocker_distance)
- if(!sight_blocker_turf)
- break
- sight_blocker_turf = get_step(sight_blocker_turf, NORTH)
- if(sight_blocker_turf)
- sight_blocker = new (sight_blocker_turf) //we need to block sight in a different spot than most things do
- sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance)
- icon_state = "gate_bottom"
- top_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_top")
- top_overlay.layer = EDGED_TURF_LAYER
- add_overlay(top_overlay)
- door_overlay = mutable_appearance('icons/effects/96x96.dmi', "door")
- door_overlay.layer = EDGED_TURF_LAYER
- add_overlay(door_overlay)
- dais_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_dais")
- dais_overlay.layer = CLOSED_TURF_LAYER
- add_overlay(dais_overlay)
-
- var/static/list/loc_connections = list(
- COMSIG_ATOM_EXIT = PROC_REF(on_exit),
- )
-
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/necropolis_gate/Destroy(force)
- if(force)
- qdel(sight_blocker, TRUE)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
-/obj/structure/necropolis_gate/singularity_pull()
- return 0
-
-/obj/structure/necropolis_gate/CanAllowThrough(atom/movable/mover, border_dir)
- . = ..()
- if(border_dir != dir)
- return TRUE
-
-/obj/structure/necropolis_gate/proc/on_exit(datum/source, atom/movable/leaving, direction)
- SIGNAL_HANDLER
-
- if(leaving.movement_type & PHASING)
- return
-
- if(leaving == src)
- return // Let's not block ourselves.
-
- if (direction == dir && density)
- leaving.Bump(src)
- return COMPONENT_ATOM_BLOCK_EXIT
-
-/obj/structure/opacity_blocker
- icon = 'icons/effects/96x96.dmi'
- icon_state = "gate_blocker"
- layer = EDGED_TURF_LAYER
- pixel_x = -32
- pixel_y = -32
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- opacity = TRUE
- anchored = TRUE
-
-/obj/structure/opacity_blocker/singularity_pull()
- return 0
-
-/obj/structure/opacity_blocker/Destroy(force)
- if(force)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/necropolis_gate/attack_hand(mob/user, list/modifiers)
- if(locked)
- to_chat(user, span_boldannounce("It's [open ? "stuck open":"locked"]."))
- return
- toggle_the_gate(user)
- return ..()
-
-/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user, legion_damaged)
- if(changing_openness)
- return
- changing_openness = TRUE
- var/turf/T = get_turf(src)
- if(open)
- new /obj/effect/temp_visual/necropolis(T)
- visible_message(span_boldwarning("The door slams closed!"))
- sleep(1)
- playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 80000)
- sleep(1)
- set_density(TRUE)
- sleep(1)
- var/turf/sight_blocker_turf = get_turf(src)
- if(sight_blocker_distance)
- for(var/i in 1 to sight_blocker_distance)
- if(!sight_blocker_turf)
- break
- sight_blocker_turf = get_step(sight_blocker_turf, NORTH)
- if(sight_blocker_turf)
- sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance)
- sight_blocker.forceMove(sight_blocker_turf)
- sleep(2.5)
- playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, TRUE, frequency = 15000)
- add_overlay(door_overlay)
- open = FALSE
- else
- cut_overlay(door_overlay)
- new /obj/effect/temp_visual/necropolis/open(T)
- sleep(2)
- visible_message(span_warning("The door starts to grind open..."))
- playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 20000)
- sleep(22)
- sight_blocker.forceMove(src)
- sleep(5)
- set_density(FALSE)
- sleep(5)
- open = TRUE
- changing_openness = FALSE
- return TRUE
-
-/obj/structure/necropolis_gate/locked
- locked = TRUE
-
-GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
-/obj/structure/necropolis_gate/legion_gate
- desc = "A tremendous, impossibly large gateway, set into a massive tower of stone."
- sight_blocker_distance = 2
-
-/obj/structure/necropolis_gate/legion_gate/Initialize(mapload)
- . = ..()
- GLOB.necropolis_gate = src
-
-/obj/structure/necropolis_gate/legion_gate/Destroy(force)
- if(force)
- if(GLOB.necropolis_gate == src)
- GLOB.necropolis_gate = null
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user, list/modifiers)
- if(!open && !changing_openness)
- var/safety = tgui_alert(user, "You think this might be a bad idea...", "Knock on the door?", list("Proceed", "Abort"))
- if(safety == "Abort" || !in_range(src, user) || !src || open || changing_openness || user.incapacitated())
- return
- user.visible_message(span_warning("[user] knocks on [src]..."), span_boldannounce("You tentatively knock on [src]..."))
- playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, TRUE)
- sleep(50)
- return ..()
-
-/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user, legion_damaged)
- if(open)
- return
- . = ..()
- if(.)
- locked = TRUE
- var/turf/T = get_turf(src)
- visible_message(span_userdanger("Something horrible emerges from the Necropolis!"))
- if(legion_damaged)
- message_admins("Legion took damage while the necropolis gate was closed, and has released itself!")
- log_game("Legion took damage while the necropolis gate was closed and released itself.")
- else
- message_admins("[user ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!")
- log_game("[user ? key_name(user) : "Unknown"] released Legion.")
-
- var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg')
- for(var/mob/M in GLOB.player_list)
- if(M.z == z)
- to_chat(M, span_userdanger("Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released."))
- M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, sound_to_use = legion_sound)
- flash_color(M, flash_color = "#FF0000", flash_time = 50)
- var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor")
- notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP, flashwindow = FALSE)
-
-/obj/effect/temp_visual/necropolis
- icon = 'icons/effects/96x96.dmi'
- icon_state = "door_closing"
- appearance_flags = 0
- duration = 6
- layer = EDGED_TURF_LAYER
- pixel_x = -32
- pixel_y = -32
-
-/obj/effect/temp_visual/necropolis/open
- icon_state = "door_opening"
- duration = 38
-
-/obj/structure/necropolis_arch
- name = "necropolis arch"
- desc = "A massive arch over the necropolis gate, set into a massive tower of stone."
- icon = 'icons/effects/160x160.dmi'
- icon_state = "arch_full"
- appearance_flags = 0
- layer = TABLE_LAYER
- anchored = TRUE
- pixel_x = -64
- pixel_y = -40
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- var/open = FALSE
- var/static/mutable_appearance/top_overlay
-
-/obj/structure/necropolis_arch/Initialize(mapload)
- . = ..()
- icon_state = "arch_bottom"
- top_overlay = mutable_appearance('icons/effects/160x160.dmi', "arch_top")
- top_overlay.layer = EDGED_TURF_LAYER
- add_overlay(top_overlay)
-
-/obj/structure/necropolis_arch/singularity_pull()
- return 0
-
-/obj/structure/necropolis_arch/Destroy(force)
- if(force)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
-#define STABLE 0 //The tile is stable and won't collapse/sink when crossed.
-#define COLLAPSE_ON_CROSS 1 //The tile is unstable and will temporary become unusable when crossed.
-#define DESTROY_ON_CROSS 2 //The tile is nearly broken and will permanently become unusable when crossed.
-#define UNIQUE_EFFECT 3 //The tile has some sort of unique effect when crossed.
-//stone tiles for boss arenas
-/obj/structure/stone_tile
- name = "stone tile"
- icon = 'icons/turf/boss_floors.dmi'
- icon_state = "pristine_tile1"
- layer = ABOVE_OPEN_TURF_LAYER
- anchored = TRUE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- var/tile_key = "pristine_tile"
- var/tile_random_sprite_max = 24
- var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed
- var/fallen = FALSE //If the tile is unusable
- var/falling = FALSE //If the tile is falling
-
-/obj/structure/stone_tile/Initialize(mapload)
- . = ..()
- icon_state = "[tile_key][rand(1, tile_random_sprite_max)]"
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/stone_tile/Destroy(force)
- if(force || fallen)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
-/obj/structure/stone_tile/singularity_pull()
- return
-
-/obj/structure/stone_tile/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(AM == src)
- return
- if(falling || fallen)
- return
- var/turf/T = get_turf(src)
- if(!islava(T) && !ischasm(T)) //nothing to sink or fall into
- return
- var/obj/item/I
- if(istype(AM, /obj/item))
- I = AM
- var/mob/living/L
- if(isliving(AM))
- L = AM
- switch(fall_on_cross)
- if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS)
- if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.movement_type & FLYING) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah!
- INVOKE_ASYNC(src, PROC_REF(collapse))
- if(UNIQUE_EFFECT)
- crossed_effect(AM)
-
-/obj/structure/stone_tile/proc/collapse()
- falling = TRUE
- var/break_that_sucker = fall_on_cross == DESTROY_ON_CROSS
- playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE)
- Shake(-1, -1, 25)
- sleep(5)
- if(break_that_sucker)
- playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE)
- else
- playsound(src, 'sound/mecha/mechmove04.ogg', 50, TRUE)
- animate(src, alpha = 0, pixel_y = pixel_y - 3, time = 5)
- fallen = TRUE
- if(break_that_sucker)
- QDEL_IN(src, 10)
- else
- addtimer(CALLBACK(src, PROC_REF(rebuild)), 55)
-
-/obj/structure/stone_tile/proc/rebuild()
- pixel_x = initial(pixel_x)
- pixel_y = initial(pixel_y) - 5
- animate(src, alpha = initial(alpha), pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 30)
- sleep(30)
- falling = FALSE
- fallen = FALSE
-
-/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM)
- return
-
-/obj/structure/stone_tile/block
- name = "stone block"
- icon_state = "pristine_block1"
- tile_key = "pristine_block"
- tile_random_sprite_max = 4
-
-/obj/structure/stone_tile/slab
- name = "stone slab"
- icon_state = "pristine_slab1"
- tile_key = "pristine_slab"
- tile_random_sprite_max = 4
-
-/obj/structure/stone_tile/center
- name = "stone center tile"
- icon_state = "pristine_center1"
- tile_key = "pristine_center"
- tile_random_sprite_max = 4
-
-/obj/structure/stone_tile/surrounding
- name = "stone surrounding slab"
- icon_state = "pristine_surrounding1"
- tile_key = "pristine_surrounding"
- tile_random_sprite_max = 2
-
-/obj/structure/stone_tile/surrounding_tile
- name = "stone surrounding tile"
- icon_state = "pristine_surrounding_tile1"
- tile_key = "pristine_surrounding_tile"
- tile_random_sprite_max = 2
-
-//cracked stone tiles
-/obj/structure/stone_tile/cracked
- name = "cracked stone tile"
- icon_state = "cracked_tile1"
- tile_key = "cracked_tile"
-
-/obj/structure/stone_tile/block/cracked
- name = "cracked stone block"
- icon_state = "cracked_block1"
- tile_key = "cracked_block"
-
-/obj/structure/stone_tile/slab/cracked
- name = "cracked stone slab"
- icon_state = "cracked_slab1"
- tile_key = "cracked_slab"
- tile_random_sprite_max = 1
-
-/obj/structure/stone_tile/center/cracked
- name = "cracked stone center tile"
- icon_state = "cracked_center1"
- tile_key = "cracked_center"
-
-/obj/structure/stone_tile/surrounding/cracked
- name = "cracked stone surrounding slab"
- icon_state = "cracked_surrounding1"
- tile_key = "cracked_surrounding"
- tile_random_sprite_max = 1
-
-/obj/structure/stone_tile/surrounding_tile/cracked
- name = "cracked stone surrounding tile"
- icon_state = "cracked_surrounding_tile1"
- tile_key = "cracked_surrounding_tile"
-
-//burnt stone tiles
-/obj/structure/stone_tile/burnt
- name = "burnt stone tile"
- icon_state = "burnt_tile1"
- tile_key = "burnt_tile"
-
-/obj/structure/stone_tile/block/burnt
- name = "burnt stone block"
- icon_state = "burnt_block1"
- tile_key = "burnt_block"
-
-/obj/structure/stone_tile/slab/burnt
- name = "burnt stone slab"
- icon_state = "burnt_slab1"
- tile_key = "burnt_slab"
-
-/obj/structure/stone_tile/center/burnt
- name = "burnt stone center tile"
- icon_state = "burnt_center1"
- tile_key = "burnt_center"
-
-/obj/structure/stone_tile/surrounding/burnt
- name = "burnt stone surrounding slab"
- icon_state = "burnt_surrounding1"
- tile_key = "burnt_surrounding"
-
-/obj/structure/stone_tile/surrounding_tile/burnt
- name = "burnt stone surrounding tile"
- icon_state = "burnt_surrounding_tile1"
- tile_key = "burnt_surrounding_tile"
-
-#undef STABLE
-#undef COLLAPSE_ON_CROSS
-#undef DESTROY_ON_CROSS
-#undef UNIQUE_EFFECT
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm
index 4050b87abcb..a4aef82d057 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm
@@ -20,136 +20,10 @@
name = "Vault Raider Objectives"
info = "Objectives #1: Find out what is hidden in Kosmicheskaya Stantsiya 13s Vault"
-/// Vault controller for use on the derelict/KS13.
-/obj/machinery/computer/vaultcontroller
- name = "vault controller"
- desc = "It seems to be powering and controlling the vault locks."
- icon_screen = "power"
- icon_keyboard = "power_key"
- light_color = LIGHT_COLOR_DIM_YELLOW
- use_power = NO_POWER_USE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
-
- var/obj/structure/cable/attached_cable
- var/obj/machinery/door/airlock/vault/derelict/door1
- var/obj/machinery/door/airlock/vault/derelict/door2
- var/locked = TRUE
- var/siphoned_power = 0
- var/siphon_max = 1e7
-
/obj/machinery/computer/monitor/examine(mob/user)
. = ..()
. += span_notice("It appears to be powered via a cable connector.")
-//Checks for cable connection, charges if possible.
-/obj/machinery/computer/vaultcontroller/process()
- if(siphoned_power >= siphon_max)
- return
- update_cable()
- if(attached_cable)
- attempt_siphon()
-
-///Looks for a cable connection beneath the machine.
-/obj/machinery/computer/vaultcontroller/proc/update_cable()
- var/turf/T = get_turf(src)
- attached_cable = locate(/obj/structure/cable) in T
-
-///Initializes airlock links.
-/obj/machinery/computer/vaultcontroller/proc/find_airlocks()
- for(var/obj/machinery/door/airlock/A in INSTANCES_OF(/obj/machinery/door))
- if(A.id_tag == "derelictvault")
- if(!door1)
- door1 = A
- continue
- if(door1 && !door2)
- door2 = A
- break
-
-///Tries to charge from powernet excess, no upper limit except max charge.
-/obj/machinery/computer/vaultcontroller/proc/attempt_siphon()
- var/surpluspower = clamp(attached_cable.surplus(), 0, (siphon_max - siphoned_power))
- if(surpluspower)
- attached_cable.add_load(surpluspower)
- siphoned_power += surpluspower
-
-///Handles the doors closing
-/obj/machinery/computer/vaultcontroller/proc/cycle_close(obj/machinery/door/airlock/A)
- A.dont_close_on_dense_objects = FALSE //Make sure its forced closed, always
- A.unbolt()
- A.close()
- A.bolt()
-
-///Handles the doors opening
-/obj/machinery/computer/vaultcontroller/proc/cycle_open(obj/machinery/door/airlock/A)
- A.unbolt()
- A.open()
- A.bolt()
-
-///Attempts to lock the vault doors
-/obj/machinery/computer/vaultcontroller/proc/lock_vault()
- if(door1 && !door1.density)
- cycle_close(door1)
- if(door2 && !door2.density)
- cycle_close(door2)
- if(door1.density && door1.locked && door2.density && door2.locked)
- locked = TRUE
-
-///Attempts to unlock the vault doors
-/obj/machinery/computer/vaultcontroller/proc/unlock_vault()
- if(door1?.density)
- cycle_open(door1)
- if(door2?.density)
- cycle_open(door2)
- if(!door1.density && door1.locked && !door2.density && door2.locked)
- locked = FALSE
-
-///Attempts to lock/unlock vault doors, if machine is charged.
-/obj/machinery/computer/vaultcontroller/proc/activate_lock()
- if(siphoned_power < siphon_max)
- return
- if(!door1 || !door2)
- find_airlocks()
- if(locked)
- unlock_vault()
- else
- lock_vault()
-
-/obj/machinery/computer/vaultcontroller/ui_interact(mob/user, datum/tgui/ui)
- . = ..()
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "VaultController", name)
- ui.open()
-
-/obj/machinery/computer/vaultcontroller/ui_act(action, params)
- . = ..()
- if(.)
- return
- switch(action)
- if("togglelock")
- activate_lock()
-
-/obj/machinery/computer/vaultcontroller/ui_data()
- var/list/data = list()
- data["stored"] = siphoned_power
- data["max"] = siphon_max
- data["doorstatus"] = locked
- return data
-
-///Airlock that can't be deconstructed, broken or hacked.
-/obj/machinery/door/airlock/vault/derelict
- locked = TRUE
- move_resist = INFINITY
- use_power = NO_POWER_USE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- id_tag = "derelictvault"
-
-///Overrides screwdriver attack to prevent all deconstruction and hacking.
-/obj/machinery/door/airlock/vault/derelict/attackby(obj/item/C, mob/user, params)
- if(C.tool_behaviour == TOOL_SCREWDRIVER)
- return
- ..()
-
/obj/structure/fluff/oldturret
name = "broken turret"
desc = "An obsolete model of turret, long non-functional."
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm
deleted file mode 100644
index f056c27d2d8..00000000000
--- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm
+++ /dev/null
@@ -1,640 +0,0 @@
-GLOBAL_VAR_INIT(hhStorageTurf, null)
-GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999))
-
-/obj/item/hilbertshotel
- name = "Hilbert's Hotel"
- desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface."
- icon_state = "hilbertshotel"
- w_class = WEIGHT_CLASS_SMALL
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- var/datum/map_template/hilbertshotel/hotelRoomTemp
- var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty
- var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore
- var/list/activeRooms = list()
- var/list/storedRooms = list()
- var/storageTurf
- //Lore Stuff
- var/ruinSpawned = FALSE
-
-/obj/item/hilbertshotel/Initialize(mapload)
- . = ..()
- //Load templates
- INVOKE_ASYNC(src, PROC_REF(prepare_rooms))
-
-/obj/item/hilbertshotel/proc/prepare_rooms()
- hotelRoomTemp = new()
- hotelRoomTempEmpty = new()
- hotelRoomTempLore = new()
- var/area/currentArea = get_area(src)
- if(currentArea.type == /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom)
- ruinSpawned = TRUE
-
-/obj/item/hilbertshotel/Destroy()
- ejectRooms()
- return ..()
-
-/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user)
- if(M.mind)
- to_chat(user, span_notice("You invite [M] to the hotel."))
- promptAndCheckIn(user, M)
- else
- to_chat(user, span_warning("[M] is not intelligent enough to understand how to use this device!"))
-
-/obj/item/hilbertshotel/attack_self(mob/user)
- . = ..()
- promptAndCheckIn(user, user)
-
-/obj/item/hilbertshotel/attack_tk(mob/user)
- to_chat(user, span_notice("\The [src] actively rejects your mind as the bluespace energies surrounding it disrupt your telekinesis."))
- return COMPONENT_CANCEL_ATTACK_CHAIN
-
-/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user, mob/target)
- var/chosenRoomNumber
-
- // Input text changes depending on if you're using this in yourself or someone else.
- if(user == target)
- chosenRoomNumber = input(target, "What number room will you be checking into?", "Room Number") as null|num
- else
- chosenRoomNumber = input(target, "[user] is inviting you to enter \the [src]. What number room will you be checking into?", "Room Number") as null|num
-
- if(!chosenRoomNumber)
- return
- if(chosenRoomNumber > SHORT_REAL_LIMIT)
- to_chat(target, span_warning("You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!"))
- return
- if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber)))
- to_chat(target, span_warning("That is not a valid room number!"))
- return
-
- // Orb is not adjacent to the target. No teleporties.
- if(!src.Adjacent(target))
- to_chat(target, span_warning("You too far away from \the [src] to enter it!"))
-
- // If the target is incapacitated after selecting a room, they're not allowed to teleport.
- if(target.incapacitated())
- to_chat(target, span_warning("You aren't able to activate \the [src] anymore!"))
-
- // Has the user thrown it away or otherwise disposed of it such that it's no longer in their hands or in some storage connected to them?
- if(!(get_atom_on_turf(src, /mob) == user))
- if(user == target)
- to_chat(user, span_warning("\The [src] is no longer in your possession!"))
- else
- to_chat(target, span_warning("\The [src] is no longer in the possession of [user]!"))
- return
-
- // If the player is using it on themselves, we've got some logic to deal with.
- // The user should drop the item before teleporting, but we're not going to force the item to be dropped if it can't be done normally...
- if(user == target)
- // The item should be on the user or in the user's inventory somewhere.
- // However, if they're not holding it, it may be in a pocket? In a backpack? Who knows! Still, they can't just drop it to the floor anymore...
- if(!user.get_held_index_of_item(src))
- to_chat(user, span_warning("You try to drop \the [src], but it's too late! It's no longer in your hands! Prepare for unforeseen consequences..."))
- // Okay, so they HAVE to be holding it here, because it's in their hand from the above check. Try to drop the item and if it fails, oh dear...
- else if(!user.dropItemToGround(src))
- to_chat(user, span_warning("You can't seem to drop \the [src]! It must be stuck to your hand somehow! Prepare for unforeseen consequences..."))
-
- if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize
- if(!GLOB.hhStorageTurf)
- var/datum/map_template/hilbertshotelstorage/storageTemp = new()
- var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3)
- storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3]))
- GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3])
- else
- storageTurf = GLOB.hhStorageTurf
- if(tryActiveRoom(chosenRoomNumber, target))
- return
- if(tryStoredRoom(chosenRoomNumber, target))
- return
- sendToNewRoom(chosenRoomNumber, target)
-
-/obj/item/hilbertshotel/proc/tryActiveRoom(roomNumber, mob/user)
- if(activeRooms["[roomNumber]"])
- var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"]
- do_sparks(3, FALSE, get_turf(user))
- user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
- return TRUE
- return FALSE
-
-/obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user)
- if(storedRooms["[roomNumber]"])
- var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
- hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
- var/turfNumber = 1
- for(var/x in 0 to hotelRoomTemp.width-1)
- for(var/y in 0 to hotelRoomTemp.height-1)
- for(var/atom/movable/A in storedRooms["[roomNumber]"][turfNumber])
- if(istype(A.loc, /obj/item/abstracthotelstorage))//Don't want to recall something thats been moved
- A.forceMove(locate(roomReservation.bottom_left_coords[1] + x, roomReservation.bottom_left_coords[2] + y, roomReservation.bottom_left_coords[3]))
- turfNumber++
- for(var/obj/item/abstracthotelstorage/S in storageTurf)
- if((S.roomNumber == roomNumber) && (S.parentSphere == src))
- qdel(S)
- storedRooms -= "[roomNumber]"
- activeRooms["[roomNumber]"] = roomReservation
- linkTurfs(roomReservation, roomNumber)
- do_sparks(3, FALSE, get_turf(user))
- user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
- return TRUE
- return FALSE
-
-/obj/item/hilbertshotel/proc/sendToNewRoom(roomNumber, mob/user)
- var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
- if(ruinSpawned && roomNumber == GLOB.hhMysteryRoomNumber)
- hotelRoomTempLore.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
- else
- hotelRoomTemp.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
- activeRooms["[roomNumber]"] = roomReservation
- linkTurfs(roomReservation, roomNumber)
- do_sparks(3, FALSE, get_turf(user))
- user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
-
-/obj/item/hilbertshotel/proc/linkTurfs(datum/turf_reservation/currentReservation, currentRoomnumber)
- var/area/misc/hilbertshotel/currentArea = get_area(locate(currentReservation.bottom_left_coords[1], currentReservation.bottom_left_coords[2], currentReservation.bottom_left_coords[3]))
- currentArea.name = "Hilbert's Hotel Room [currentRoomnumber]"
- currentArea.parentSphere = src
- currentArea.storageTurf = storageTurf
- currentArea.roomnumber = currentRoomnumber
- currentArea.reservation = currentReservation
- for(var/turf/closed/indestructible/hoteldoor/door in currentArea)
- door.parentSphere = src
- door.desc = "The door to this hotel room. The placard reads 'Room [currentRoomnumber]'. Strangely, this door doesn't even seem openable. The doorknob, however, seems to buzz with unusual energy... [span_info("Alt-Click to look through the peephole.")]"
- for(var/turf/open/space/bluespace/BSturf in currentArea)
- BSturf.parentSphere = src
-
-/obj/item/hilbertshotel/proc/ejectRooms()
- if(activeRooms.len)
- for(var/x in activeRooms)
- var/datum/turf_reservation/room = activeRooms[x]
- for(var/i in 0 to hotelRoomTemp.width-1)
- for(var/j in 0 to hotelRoomTemp.height-1)
- for(var/atom/movable/A in locate(room.bottom_left_coords[1] + i, room.bottom_left_coords[2] + j, room.bottom_left_coords[3]))
- if(ismob(A))
- var/mob/M = A
- if(M.mind)
- to_chat(M, span_warning("As the sphere breaks apart, you're suddenly ejected into the depths of space!"))
- var/max = world.maxx-TRANSITIONEDGE
- var/min = 1+TRANSITIONEDGE
- var/list/possible_transtitons = list()
- for(var/AZ in SSmapping.z_list)
- var/datum/space_level/D = AZ
- if (D.linkage == CROSSLINKED)
- possible_transtitons += D.z_value
- var/_z = pick(possible_transtitons)
- var/_x = rand(min,max)
- var/_y = rand(min,max)
- var/turf/T = locate(_x, _y, _z)
- A.forceMove(T)
- qdel(room)
-
- if(storedRooms.len)
- for(var/x in storedRooms)
- var/list/atomList = storedRooms[x]
- for(var/atom/movable/A in atomList)
- var/max = world.maxx-TRANSITIONEDGE
- var/min = 1+TRANSITIONEDGE
- var/list/possible_transtitons = list()
- for(var/AZ in SSmapping.z_list)
- var/datum/space_level/D = AZ
- if (D.linkage == CROSSLINKED)
- possible_transtitons += D.z_value
- var/_z = pick(possible_transtitons)
- var/_x = rand(min,max)
- var/_y = rand(min,max)
- var/turf/T = locate(_x, _y, _z)
- A.forceMove(T)
-
-//Template Stuff
-/datum/map_template/hilbertshotel
- name = "Hilbert's Hotel Room"
- mappath = "_maps/templates/hilbertshotel.dmm"
- var/landingZoneRelativeX = 2
- var/landingZoneRelativeY = 8
-
-/datum/map_template/hilbertshotel/empty
- name = "Empty Hilbert's Hotel Room"
- mappath = "_maps/templates/hilbertshotelempty.dmm"
-
-/datum/map_template/hilbertshotel/lore
- name = "Doctor Hilbert's Deathbed"
- mappath = "_maps/templates/hilbertshotellore.dmm"
-
-/datum/map_template/hilbertshotelstorage
- name = "Hilbert's Hotel Storage"
- mappath = "_maps/templates/hilbertshotelstorage.dmm"
-
-
-//Turfs and Areas
-/turf/closed/indestructible/hotelwall
- name = "hotel wall"
- desc = "A wall designed to protect the security of the hotel's guests."
- icon_state = "hotelwall"
- smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_HOTEL_WALLS
- smoothing_groups_with = SMOOTH_GROUP_HOTEL_WALLS
- explosion_block = INFINITY
-
-/turf/open/indestructible/hotelwood
- desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering."
- icon_state = "wood"
- footstep = FOOTSTEP_WOOD
- tiled_dirt = FALSE
-
-/turf/open/indestructible/hoteltile
- desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering."
- icon_state = "showroomfloor"
- footstep = FOOTSTEP_FLOOR
- tiled_dirt = FALSE
-
-/turf/open/space/bluespace
- name = "\proper bluespace hyperzone"
- icon_state = "bluespace"
- base_icon_state = "bluespace"
- baseturfs = /turf/open/space/bluespace
- flags_1 = NOJAUNT
- explosion_block = INFINITY
- var/obj/item/hilbertshotel/parentSphere
-
-/turf/open/space/bluespace/Initialize(mapload)
- . = ..()
- update_icon_state()
-
-/turf/open/space/bluespace/update_icon_state()
- icon_state = base_icon_state
- return ..()
-
-/turf/open/space/bluespace/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
- . = ..()
- if(parentSphere && arrived.forceMove(get_turf(parentSphere)))
- do_sparks(3, FALSE, get_turf(arrived))
-
-/turf/closed/indestructible/hoteldoor
- name = "Hotel Door"
- icon_state = "hoteldoor"
- explosion_block = INFINITY
- var/obj/item/hilbertshotel/parentSphere
-
-/turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user)
- if(!isliving(user))
- return
- if(!user.mind)
- return
- if(!parentSphere)
- to_chat(user, span_warning("The door seems to be malfunctioning and refuses to operate!"))
- return
- if(tgui_alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", list("Leave", "Stay")) == "Leave")
- if(HAS_TRAIT(user, TRAIT_IMMOBILIZED) || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt.
- return
- user.forceMove(get_turf(parentSphere))
- do_sparks(3, FALSE, get_turf(user))
-
-/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user)
- if(!isobserver(user) || !parentSphere)
- return ..()
- user.forceMove(get_turf(parentSphere))
-
-//If only this could be simplified...
-/turf/closed/indestructible/hoteldoor/attack_tk(mob/user)
- return //need to be close.
-
-/turf/closed/indestructible/hoteldoor/attack_hand(mob/user, list/modifiers)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/attack_animal(mob/user, list/modifiers)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/attack_paw(mob/user, list/modifiers)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/attack_larva(mob/user)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/attack_slime(mob/user)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/attack_robot(mob/user)
- if(get_dist(get_turf(src), get_turf(user)) <= 1)
- promptExit(user)
-
-/turf/closed/indestructible/hoteldoor/AltClick(mob/user)
- . = ..()
- if(get_dist(get_turf(src), get_turf(user)) <= 1)
- to_chat(user, span_notice("You peak through the door's bluespace peephole..."))
- user.reset_perspective(parentSphere)
- var/datum/action/peephole_cancel/PHC = new
- user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1)
- PHC.Grant(user)
- RegisterSignal(user, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/atom, check_eye), user)
-
-/turf/closed/indestructible/hoteldoor/check_eye(mob/user)
- if(get_dist(get_turf(src), get_turf(user)) >= 2)
- for(var/datum/action/peephole_cancel/PHC in user.actions)
- INVOKE_ASYNC(PHC, TYPE_PROC_REF(/datum/action/peephole_cancel, Trigger))
-
-/datum/action/peephole_cancel
- name = "Cancel View"
- desc = "Stop looking through the bluespace peephole."
- button_icon_state = "cancel_peephole"
-
-/datum/action/peephole_cancel/Trigger(trigger_flags)
- . = ..()
- to_chat(owner, span_warning("You move away from the peephole."))
- owner.reset_perspective()
- owner.clear_fullscreen("remote_view", 0)
- UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
- qdel(src)
-
-/area/misc/hilbertshotel
- name = "Hilbert's Hotel Room"
- icon_state = "hilbertshotel"
- requires_power = FALSE
- has_gravity = TRUE
- area_flags = NOTELEPORT | HIDDEN_AREA
- area_lighting = AREA_LIGHTING_DYNAMIC
- ambientsounds = list('sound/ambience/servicebell.ogg')
- var/roomnumber = 0
- var/obj/item/hilbertshotel/parentSphere
- var/datum/turf_reservation/reservation
- var/turf/storageTurf
-
-/area/misc/hilbertshotel/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
- . = ..()
- if(istype(arrived, /obj/item/hilbertshotel))
- relocate(arrived)
- var/list/obj/item/hilbertshotel/hotels = arrived.get_all_contents_type(/obj/item/hilbertshotel)
- for(var/obj/item/hilbertshotel/H in hotels)
- if(parentSphere == H)
- relocate(H)
-
-/area/misc/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H)
- if(prob(0.135685)) //Because screw you
- qdel(H)
- return
-
- // Prepare for...
- var/mob/living/unforeseen_consequences = get_atom_on_turf(H, /mob/living)
-
- // Turns out giving anyone who grabs a Hilbert's Hotel a free, complementary warp whistle is probably bad.
- // Let's gib the last person to have selected a room number in it.
- if(unforeseen_consequences)
- to_chat(unforeseen_consequences, span_warning("\The [H] starts to resonate. Forcing it to enter itself induces a bluespace paradox, violently tearing your body apart."))
- unforeseen_consequences.gib()
-
- var/turf/targetturf = find_safe_turf()
- if(!targetturf)
- if(GLOB.blobstart.len > 0)
- targetturf = get_turf(pick(GLOB.blobstart))
- else
- CRASH("Unable to find a blobstart landmark")
- var/turf/T = get_turf(H)
- var/area/A = T.loc
- log_game("[H] entered itself. Moving it to [loc_name(targetturf)].")
- message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].")
- for(var/mob/M in A)
- to_chat(M, span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!"))
- H.forceMove(targetturf)
-
-/area/misc/hilbertshotel/Exited(atom/movable/gone, direction)
- . = ..()
- if(ismob(gone))
- var/mob/M = gone
- if(M.mind)
- var/stillPopulated = FALSE
- var/list/currentLivingMobs = get_all_contents_type(/mob/living) //Got to catch anyone hiding in anything
- for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left.
- if(L.mind)
- stillPopulated = TRUE
- break
- if(!stillPopulated)
- storeRoom()
-
-/area/misc/hilbertshotel/proc/storeRoom()
- var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1)
- var/storage[roomSize]
- var/turfNumber = 1
- var/obj/item/abstracthotelstorage/storageObj = new(storageTurf)
- storageObj.roomNumber = roomnumber
- storageObj.parentSphere = parentSphere
- storageObj.name = "Room [roomnumber] Storage"
- for(var/x in 0 to parentSphere.hotelRoomTemp.width-1)
- for(var/y in 0 to parentSphere.hotelRoomTemp.height-1)
- var/list/turfContents = list()
- for(var/atom/movable/A in locate(reservation.bottom_left_coords[1] + x, reservation.bottom_left_coords[2] + y, reservation.bottom_left_coords[3]))
- if(ismob(A) && !isliving(A))
- continue //Don't want to store ghosts
- turfContents += A
- A.forceMove(storageObj)
- storage[turfNumber] = turfContents
- turfNumber++
- parentSphere.storedRooms["[roomnumber]"] = storage
- parentSphere.activeRooms -= "[roomnumber]"
- qdel(reservation)
-
-/area/misc/hilbertshotelstorage
- name = "Hilbert's Hotel Storage Room"
- icon_state = "hilbertshotel"
- requires_power = FALSE
- area_flags = HIDDEN_AREA | NOTELEPORT | UNIQUE_AREA
- has_gravity = TRUE
-
-/obj/item/abstracthotelstorage
- anchored = TRUE
- invisibility = INVISIBILITY_ABSTRACT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- item_flags = ABSTRACT
- var/roomNumber
- var/obj/item/hilbertshotel/parentSphere
-
-/obj/item/abstracthotelstorage/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
- . = ..()
- if(ismob(arrived))
- var/mob/M = arrived
- M.notransform = TRUE
-
-/obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction)
- . = ..()
- if(ismob(gone))
- var/mob/M = gone
- M.notransform = FALSE
-
-//Space Ruin stuff
-/area/ruin/space/has_grav/powered/hilbertresearchfacility
- name = "Hilbert Research Facility"
-
-/area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom
- area_flags = UNIQUE_AREA | NOTELEPORT | HIDDEN_AREA
-
-/obj/item/analyzer/hilbertsanalyzer
- name = "custom rigged analyzer"
- desc = "A hand-held environmental scanner which reports current gas levels. This one seems custom rigged to additionally be able to analyze some sort of bluespace device."
- icon_state = "hilbertsanalyzer"
- worn_icon_state = "analyzer"
-
-/obj/item/analyzer/hilbertsanalyzer/afterattack(atom/target, mob/user, proximity)
- . = ..()
- if(istype(target, /obj/item/hilbertshotel))
- if(!proximity)
- to_chat(user, span_warning("It's to far away to scan!"))
- return
- var/obj/item/hilbertshotel/sphere = target
- if(sphere.activeRooms.len)
- to_chat(user, "Currently Occupied Rooms:")
- for(var/roomnumber in sphere.activeRooms)
- to_chat(user, roomnumber)
- else
- to_chat(user, "No currenty occupied rooms.")
- if(sphere.storedRooms.len)
- to_chat(user, "Vacated Rooms:")
- for(var/roomnumber in sphere.storedRooms)
- to_chat(user, roomnumber)
- else
- to_chat(user, "No vacated rooms.")
-
-/obj/effect/landmark/lift_id/hilbert
- specific_lift_id = HILBERT_TRAM
-
-/obj/effect/landmark/tram/left_part/hilbert
- specific_lift_id = HILBERT_TRAM
- destination_id = "left_part_hilbert"
- tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask")
-
-/obj/effect/landmark/tram/middle_part/hilbert
- specific_lift_id = HILBERT_TRAM
- destination_id = "middle_part_hilbert"
- tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw")
-
-/obj/effect/landmark/tram/right_part/hilbert
- specific_lift_id = HILBERT_TRAM
- destination_id = "right_part_hilbert"
- tgui_icons = list("Ordnance" = "bullseye", "Office" = "user", "Dormitories" = "bed")
-
-/obj/item/keycard/hilbert
- name = "Hilbert's office keycard"
- desc = "A keycard with an engraving on it. The engraving reads: \"Hilbert\"."
- color = "#aa00cc"
- puzzle_id = "hilbert_office"
-
-/obj/machinery/door/puzzle/keycard/hilbert
- name = "secure airlock"
- puzzle_id = "hilbert_office"
-
-/datum/outfit/doctorhilbert
- id = /obj/item/card/id/advanced/silver
- uniform = /obj/item/clothing/under/rank/rnd/research_director/doctor_hilbert
- shoes = /obj/item/clothing/shoes/sneakers/brown
- back = /obj/item/storage/backpack/satchel/leather
- suit = /obj/item/clothing/suit/toggle/labcoat
- id_template = /datum/access_template/away/hilbert
-
-/datum/outfit/doctorhilbert/pre_equip(mob/living/carbon/human/hilbert, visualsOnly)
- . = ..()
- if(!visualsOnly)
- hilbert.gender = MALE
- hilbert.update_body()
-
-/obj/item/paper/crumpled/ruins/note_institute
- name = "note to the institute"
-
-/obj/item/paper/crumpled/ruins/note_institute/Initialize(mapload)
- . = ..()
- info = {"Note to the Institute
- If you're reading this, I hope you're from the Institute. First things first, I should apologise. I won't be coming back to teach in the new semester.
- We've made some powerful enemies. Very powerful. More powerful than any of you can imagine, and so we can't come back.
- So, we've made the decision to vanish. Perhaps more literally than you might think. Do not try to find us- for your own safety.
- I've left some of our effects in the Hotel. Room number [uppertext(num2hex(GLOB.hhMysteryRoomNumber, 0))]. To anyone who should know, that should make sense.
- Best of luck with the research. From all of us in the Hilbert Group, it's been a pleasure working with you.
- - David, Phil, Fiona and Jen"}
-
-/obj/item/paper/crumpled/ruins/postdocs_memo
- name = "memo to the postdocs"
- info = {"Memo to the Postdocs
- Remember, if you're going in to retrieve the prototype for any reason (not that you should be without my supervision), that the security systems are always live- they have no shutoff.
- Instead, remember: what you can't see can't hurt you.
- Take care of the lab during my vacation. See you all in June.
- - David"}
-
-/obj/item/paper/crumpled/ruins/hotel_note
- name = "hotel note"
- info = {"Hotel Note
- Well, you figured out the puzzle. Looks like someone's done their homework on my research.
- I suppose you deserve to know some more about our situation. Our research has attracted some undue attention and so, for our own safety, we've taken to the Bluespace.
- Yes, you did read that correctly. I'm sure the physics and maths would bore you, but in layman's terms, the manifested link to the Bluespace the crystals provide can be exploited. With the correct technology, one can "surf" the Bluespace, as Jen likes to call it.
- What's more, the space-time continuum is in full effect here. By correctly manipulating the bluespace, one can go anywhere: time or space. I'll confess to not having figured that one out myself. Check the closet- consider it a prize for solving the puzzle. Just be careful with its use- you might find yourself dealing with the same pursuers we've picked up.
- They deal in "time crimes", whatever their definition of those are.
- Anyway, I'm beginning to ramble. We must be going now. Make sure any posthumous Nobel prizes are made out to the department.
- - David"}
-
-/obj/item/paper/fluff/ruins/docslabnotes
- name = "lab notebook page"
- info = {"Laboratory Notebook
- PROPERTY OF DOCTOR D. HILBERT
- May 10th, 2555
- Finally, my new facility is complete, and not a moment too soon!
- My disagreements with Greenham have become too much to bear, so some time away from the campus will do me well. It's not like my students understand my work, anyway. Teaching never was my passion.
- Anyway, I'm getting off track. It is quite amazing what a few million in grants will buy you. This station is state of the art, perfect for my studies.
- Since the Zhang Incident of 2459, we have been quite aware of the properties of bluespace crystals. Their space-warping properties are well-documented, but poorly understood. However, I theorise that it may be possible to harness them in new ways.
- To this end, I've procured a small team of postdoctorate students from the institute to assist with my research. Some administrative help wouldn't go amiss, either- perhaps I should hire a secretary...
- *Following this is a long series of pages detailing failures, grievances with the institute, and more scientific equations than anyone can reasonably chew through.*
-
Breakthrough
- January 8th, 2557
- My theories have held up adequately. Today, we had our first successful test of the "Hilbert Pocket", as we've taken to calling it. By exploiting the ability of bluespace crystals to create a localised dilation in space, with precise application of force according to geometric calculus, we have successfully "folded" space into a pocket. We had Phil throw one of his analysers into it from across the room, and what we saw was incredible.
- A pocket of infinite space, within a finite area. Simply revolutionary!
- I've set the postdocs to paper writing while I work out the specifics. The technology is successful, but we have no way to harness it. Unless...
- *Many more pages dedicated to equations, engineering drawings, and ramblings continue. Hilbert clearly loves the sight of his own handwriting.*
-
A New Device
- September 21st, 2557
- We've submitted the first draft of the paper on Hilbert Pockets to the journals. Now, I suppose, we wait.
- In the meantime, I've taken to assembling the first prototype of the device. By exploiting the pocket's ability to create an infinite region of space within a finite area, I've made... well, I suppose it could be called a "Pocket Dimension". Within, I've created a nifty system that recursively produces subspace rooms, spatially linking them to any of the infinite points on the pocket's surface. Fiona says it's akin to a hotel, and I'm inclined to agree.
- Hilbert's Hotel. I like the sound of that. "}
-
-/obj/item/paper/fluff/ruins/romans_emails
- name = "e-mail readout - 14.05.2558"
- info = {"Logs of Roman P.
-
New Job
- Sent to: natalya_petroyenko@kosmokomm.net
- Hello sis! Figured I should update you on what's going on with the career change.
- First day on the new job. It's a pretty boring position, but hey- it's not like I was finding anything in New Vladimir. I'm just glad to have something to pay the bills.
- Suppose I should say what's involved: I'm essentially playing housekeeper for some scientist and his cohort of student assistants. Far above my pay grade to understand what they do, but they seem excited enough. Talking about "pockets", for whatever reason. Maybe they're designing the next innovation in clothes?
- Anyway, that's pretty much it. I'm living on their station for pretty much the duration, so I'm not sure if I'll be able to make it to Mama's birthday. Sorry about that- I'll do my best to make it up to her (and you) when I get some leave.
- Hope to see you soon,
- Little Brother Roman
-
-
Visitors
- Sent to: david_hilbert@physics.mit.edu
- Morning Doctor. Sorry to email you when you're on holiday, but you did tell me to update you on anything suspicious.
- There's been a ship that's been hanging around the facility for a few days. Figured that was odd enough, given how far from anything important we are, but it got stranger when one of them finally came over to talk.
- I know I'm not a native speaker, but I couldn't make out his accent. Wasn't like anything I've heard before, anyway.
- He kept asking where you were, and if he could come in to speak to you. Of course, I turned him away- even if you had been around I'd have been hesitant to let him in.
- As an aside, the postdocs told me to pass on a message. Apparently they've made a breakthrough, which sounds good and all.
- Regards,
- Roman
-
-
Weird Times
- Sent to: natalya_petroyenko@kosmokomm.net
- Hi sis! How was Christmas? Are Mama and Papa doing well? I'm really sorry I couldn't be there, but I've been working my fingers to the bone at work.
- I figure I should tell you a bit about how it's been going here. I know, I know, you keep calling me a workaholic, but it's really... strange, I guess?
- I keep getting little glimpses into the research that's happening. They're messing around with bluespace- you know, the tech that makes FTL engines work? I'm not sure what exactly they're doing with it, but they're talking more and more about pockets every day now.
- Not only that, but I'm starting to hear strange noises from the labs I'm not allowed into. Nothing super terrifying, you know, we're not talking xenomorphs, but more like industrial sounds. Crashes, bangs, occasional high-pitched whining, you know the sort. Like a broken vacuum cleaner.
- I know it's not the instruments or I'd have heard it before, so it must be something new they've been working on. Exciting, I suppose, but I'm starting to wonder if I'm in over my head working here. Maybe I should start looking for a new job, somewhere closer to home.
- Hope to see you at Papa's birthday. I've requested leave for it, and I'm just waiting on the Doc's response.
- See you soon,
- Little Brother Roman
-
-
End of Leave
- Sent to: david_hilbert@physics.mit.edu
- Morning Doctor. Where is everyone? I got back from leave and the station was empty. Have you all went on holiday without telling me?
- And what the hell happened to the ordnance lab? I couldn't even open the door to get in, it was fused shut!
- Look, I don't feel safe staying on the station with it in this state, so I'm calling an engineer and heading home until I hear back from you.
- Regards,
- Roman
-
-
Looking for a New Job
- Sent to: natalya_petroyenko@kosmokomm.net
- Hi sis. First things first, sorry for missing your engagement party. There's been a... situation at work.
- In fact, that's most of why I'm writing this. I have absolutely no idea what happened, but the Doctor and the students are gone. Just up and left. The facility's abandoned.
- But like, it's clear they left in a hurry. Hell, there's still coffee in the cups. I'd question it further, but they were always kinda... odd, I guess? The whole thing gives me chills and I don't think I want to dig any deeper.
- I dropped his university an email and called in the authorities. All that's left now, I guess, is to find a new job. Would your boss happen to be hiring?
- See you soon,
- Little Brother Roman
- "}
diff --git a/code/modules/mapping/access_helpers/airlock_all_access.dm b/code/modules/mapping/access_helpers/airlock_all_access.dm
deleted file mode 100644
index 43b074d8e36..00000000000
--- a/code/modules/mapping/access_helpers/airlock_all_access.dm
+++ /dev/null
@@ -1,209 +0,0 @@
-#define MAKE_REAL_FOR_AIRLOCK(BaseType, Access_Define) ##BaseType/airlock { search_type = /obj/machinery/door/airlock };
-
-#define MAKE_REAL_FOR_WINDOOR(BaseType, Access_Define) ##BaseType/windoor { search_type = /obj/machinery/door/window };
-
-#define MAKE_REAL_FOR_CONTROLLER(BaseType, Access_Define) ##BaseType/embedded_controller { search_type = /obj/machinery/c4_embedded_controller };
-
-// This coerces it to be a list which is technically hacky and bad but honestly GFY. Rewrite my macros.
-#define MAKE_REAL_BASE(BaseType, Access_Define) ##BaseType { granted_access = list(Access_Define) };
-
-#define MAKE_ABSTRACT_IMPL(BaseType, State) ##BaseType { icon_state = State; abstract_type = ##BaseType };
-
-
-#define MAKE_REAL_FOR_ALL(Slug, Access_Define) \
- MAKE_REAL_BASE(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) \
- MAKE_REAL_FOR_AIRLOCK(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) \
- MAKE_REAL_FOR_WINDOOR(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) \
- MAKE_REAL_FOR_CONTROLLER(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define)
-
-#define MAKE_REAL_FOR_ANY(Slug, Access_Define) \
- MAKE_REAL_BASE(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) \
- MAKE_REAL_FOR_AIRLOCK(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) \
- MAKE_REAL_FOR_WINDOOR(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) \
- MAKE_REAL_FOR_CONTROLLER(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define)
-
-/// Make a REAL access helper.
-#define MAKE_REAL(Slug, Access_Define) \
- MAKE_REAL_FOR_ALL(Slug, Access_Define) \
- MAKE_REAL_FOR_ANY(Slug, Access_Define)
-
-/// Make an abstract access helper, Used for setting icon_state.
-#define MAKE_ABSTRACT(Slug, State) \
- MAKE_ABSTRACT_IMPL(/obj/effect/mapping_helpers/access/all/##Slug, State) \
- MAKE_ABSTRACT_IMPL(/obj/effect/mapping_helpers/access/any/##Slug, State)
-
-
-// -------------------- Command access helpers
-MAKE_ABSTRACT(command, "access_helper_com")
-
-MAKE_REAL(command/general, ACCESS_MANAGEMENT)
-
-MAKE_REAL(command/ai_upload, ACCESS_AI_UPLOAD)
-
-MAKE_REAL(command/teleporter, ACCESS_TELEPORTER)
-
-MAKE_REAL(command/eva, ACCESS_EVA)
-
-MAKE_REAL(command/hop, ACCESS_DELEGATE)
-
-MAKE_REAL(command/captain, ACCESS_CAPTAIN)
-
-// -------------------- Engineering access helpers
-MAKE_ABSTRACT(engineering, "access_helper_eng")
-
-MAKE_REAL(engineering/general, ACCESS_ENGINEERING)
-
-MAKE_REAL(engineering/engine_equipment, ACCESS_ENGINE_EQUIP)
-
-MAKE_REAL(engineering/aux_base, ACCESS_AUX_BASE)
-
-MAKE_REAL(engineering/maintenance, ACCESS_MAINT_TUNNELS)
-
-MAKE_REAL(engineering/external, ACCESS_EXTERNAL_AIRLOCKS)
-
-MAKE_REAL(engineering/secure, ACCESS_SECURE_ENGINEERING)
-
-MAKE_REAL(engineering/atmos, ACCESS_ATMOSPHERICS)
-
-
-MAKE_REAL(engineering/ce, ACCESS_CE)
-
-// -------------------- Medical access helpers
-MAKE_ABSTRACT(medical, "access_helper_med")
-
-MAKE_REAL(medical/general, ACCESS_MEDICAL)
-
-MAKE_REAL(medical/chemistry, ACCESS_PHARMACY)
-
-MAKE_REAL(medical/cmo, ACCESS_CMO)
-
-MAKE_REAL(medical/pharmacy, ACCESS_PHARMACY)
-
-// -------------------- Science access helpers
-MAKE_ABSTRACT(science, "access_helper_sci")
-
-MAKE_REAL(science/general, ACCESS_RND)
-
-MAKE_REAL(science/research, ACCESS_RESEARCH)
-
-MAKE_REAL(science/ordnance, ACCESS_ORDNANCE)
-
-MAKE_REAL(science/ordnance_storage, ACCESS_ORDNANCE_STORAGE)
-
-MAKE_REAL(science/genetics, ACCESS_GENETICS)
-
-MAKE_REAL(science/robotics, ACCESS_ROBOTICS)
-
-MAKE_REAL(science/xenobio, ACCESS_XENOBIOLOGY)
-
-MAKE_REAL(science/rd, ACCESS_RD)
-
-// -------------------- Security access helpers
-MAKE_ABSTRACT(security, "access_helper_sec")
-
-MAKE_REAL(security/general, ACCESS_SECURITY)
-
-MAKE_REAL(security/armory, ACCESS_ARMORY)
-
-MAKE_REAL(security/detective, ACCESS_FORENSICS)
-
-MAKE_REAL(security/court, ACCESS_COURT)
-
-MAKE_REAL(security/hos, ACCESS_HOS)
-
-// -------------------- Service access helpers
-MAKE_ABSTRACT(service, "access_helper_serv")
-
-MAKE_REAL(service/general, ACCESS_SERVICE)
-
-MAKE_REAL(service/kitchen, ACCESS_KITCHEN)
-
-MAKE_REAL(service/bar, ACCESS_BAR)
-
-MAKE_REAL(service/hydroponics, ACCESS_HYDROPONICS)
-
-MAKE_REAL(service/janitor, ACCESS_JANITOR)
-
-MAKE_REAL(service/chapel_office, ACCESS_CHAPEL_OFFICE)
-
-MAKE_REAL(service/library, ACCESS_LIBRARY)
-
-MAKE_REAL(service/theatre, ACCESS_THEATRE)
-
-MAKE_REAL(service/lawyer, ACCESS_LAWYER)
-
-// -------------------- Supply access helpers
-MAKE_ABSTRACT(supply, "access_helper_sup")
-
-MAKE_REAL(supply/general, ACCESS_CARGO)
-
-MAKE_REAL(supply/mineral_storage, ACCESS_MINERAL_STOREROOM)
-
-MAKE_REAL(supply/qm, ACCESS_QM)
-
-MAKE_REAL(supply/vault, ACCESS_VAULT)
-
-// -------------------- Syndicate access helpers
-MAKE_ABSTRACT(syndicate, "access_helper_syn")
-
-MAKE_REAL(syndicate/general, ACCESS_SYNDICATE)
-
-MAKE_REAL(syndicate/leader, ACCESS_SYNDICATE_LEADER)
-
-// -------------------- Away access helpers
-MAKE_ABSTRACT(away, "access_helper_awy")
-
-MAKE_REAL(away/general, ACCESS_AWAY_GENERAL)
-
-MAKE_REAL(away/command, ACCESS_AWAY_COMMAND)
-
-MAKE_REAL(away/security, ACCESS_AWAY_SEC)
-
-MAKE_REAL(away/engineering, ACCESS_AWAY_ENGINE)
-
-MAKE_REAL(away/medical, ACCESS_AWAY_MED)
-
-MAKE_REAL(away/supply, ACCESS_AWAY_SUPPLY)
-
-MAKE_REAL(away/science, ACCESS_AWAY_SCIENCE)
-
-MAKE_REAL(away/maintenance, ACCESS_AWAY_MAINT)
-
-MAKE_REAL(away/generic1, ACCESS_AWAY_GENERIC1)
-
-MAKE_REAL(away/generic2, ACCESS_AWAY_GENERIC2)
-
-MAKE_REAL(away/generic3, ACCESS_AWAY_GENERIC3)
-
-MAKE_REAL(away/generic4, ACCESS_AWAY_GENERIC4)
-
-// -------------------- Admin access helpers
-MAKE_ABSTRACT(admin, "access_helper_adm")
-
-MAKE_REAL(admin/general, ACCESS_CENT_GENERAL)
-
-MAKE_REAL(admin/thunderdome, ACCESS_CENT_THUNDER)
-
-MAKE_REAL(admin/medical, ACCESS_CENT_MEDICAL)
-
-MAKE_REAL(admin/living, ACCESS_CENT_LIVING)
-
-MAKE_REAL(admin/storage, ACCESS_CENT_STORAGE)
-
-MAKE_REAL(admin/teleporter, ACCESS_CENT_TELEPORTER)
-
-MAKE_REAL(admin/captain, ACCESS_CENT_CAPTAIN)
-
-MAKE_REAL(admin/bar, ACCESS_CENT_BAR)
-
-
-#undef MAKE_REAL_BASE
-#undef MAKE_REAL_FOR_AIRLOCK
-#undef MAKE_REAL_FOR_WINDOOR
-//#undef MAKE_FOR_CONTROLLER
-#undef MAKE_REAL_FOR_ALL
-#undef MAKE_REAL_FOR_ANY
-#undef MAKE_REAL
-
-#undef MAKE_ABSTRACT_IMPL
-#undef MAKE_ABSTRACT
diff --git a/code/modules/mapping/embedded_controller/door_control_linker.dm b/code/modules/mapping/embedded_controller/door_control_linker.dm
deleted file mode 100644
index 7f7a50e1367..00000000000
--- a/code/modules/mapping/embedded_controller/door_control_linker.dm
+++ /dev/null
@@ -1,85 +0,0 @@
-/obj/effect/mapping_helpers/door_control_linker
- icon = 'icons/effects/mapping_helpers_96x96.dmi'
- icon_state = "pincode_helper"
- layer = DOOR_HELPER_LAYER - 0.01 // This helper is huge so render under similar ones.
- pixel_x = -32
- pixel_y = -32
-
- /// The ID used to link everything together.
- var/linker_id
-
-/obj/effect/mapping_helpers/door_control_linker/Initialize(mapload)
- . = ..()
- if(!mapload)
- log_mapping("[src] spawned outside of mapload!")
- return
-
- link_machines()
-
-/obj/effect/mapping_helpers/door_control_linker/proc/link_machines()
- var/obj/machinery/door/airlock/airlock = locate() in loc
- if(!airlock)
- log_mapping("DCL: ([src]) at [AREACOORD(src)]| Door linker not placed on a door.")
- return
-
- // Make sure the door is actually radio-enabled.
- new /obj/effect/mapping_helpers/airlock/frequency/airlock_control(loc)
-
- var/list/nearby = orange(1, airlock.loc)
-
- var/obj/machinery/c4_embedded_controller/master_controller
- var/obj/machinery/c4_embedded_controller/slave/slave_controller
-
- for(var/obj/machinery/c4_embedded_controller/controller in nearby)
- if(istype(controller, /obj/machinery/c4_embedded_controller/slave))
- if(slave_controller)
- log_mapping("DCL: ([src]) at [AREACOORD(src)]| Multiple slave controllers affected by door linker.")
- continue
-
- slave_controller = controller
- continue
-
- if(!controller.autolink_capable)
- log_mapping("DCL: ([src]) at [AREACOORD(src)]| Incompatible controller type [controller.type] affected by door linker.")
- continue
-
- if(master_controller)
- log_mapping("DCL: ([src]) at [AREACOORD(src)]| Multiple master controllers affected by door linker.")
- continue
-
- master_controller = controller
-
- // Link up controllers
- var/slave_id = "[linker_id]_slave"
- airlock.id_tag = linker_id
- slave_controller?.id_tag = slave_id
-
- if(master_controller)
- if(istype(master_controller, /obj/machinery/c4_embedded_controller/airlock_pinpad))
- var/obj/machinery/c4_embedded_controller/airlock_pinpad/pinpad = master_controller
- pinpad.tag_target = linker_id
- pinpad.tag_slave = slave_id
-
- else if (istype(master_controller, /obj/machinery/c4_embedded_controller/airlock_access))
- var/obj/machinery/c4_embedded_controller/airlock_access/pinpad = master_controller
- pinpad.tag_target = linker_id
- pinpad.tag_slave = slave_id
- else
- CRASH("Embedded Controller of type [master_controller.type] is marked as DCL capable but is not handled!")
- else
- log_mapping("DCL: ([src]) at [AREACOORD(src)]| Door linker with no master controller[slave_controller ? "." : " or slave controller."]")
-
-/// Generates a random ID instead of a manual one. Saves on mapping time if you don't care about the IDs.
-/obj/effect/mapping_helpers/door_control_linker/random_id
- /// Juuuuuust in case.
- var/static/list/consumed_ids = list()
-
-/obj/effect/mapping_helpers/door_control_linker/random_id/Initialize(mapload)
- do
- linker_id = "[world.timeofday][rand(1, 100)][rand(1, 100)]"
- while(consumed_ids[linker_id])
-
- consumed_ids[linker_id] = TRUE
-
- . = ..()
-
diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm
index f70a36afb44..54d54a2fddb 100644
--- a/code/modules/mapping/mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers.dm
@@ -114,169 +114,6 @@
..()
return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL
-//airlock helpers
-/obj/effect/mapping_helpers/airlock
- layer = DOOR_HELPER_LAYER
- late = TRUE
-
-/obj/effect/mapping_helpers/airlock/Initialize(mapload)
- . = ..()
- if(!mapload)
- log_mapping("[src] spawned outside of mapload!")
- return
-
- var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
- if(!airlock)
- log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
- else
- payload(airlock)
-
-/obj/effect/mapping_helpers/airlock/LateInitialize()
- . = ..()
- var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
- if(!airlock)
- qdel(src)
- return
- if(airlock.cyclelinkeddir)
- airlock.cyclelinkairlock()
- if(airlock.closeOtherId)
- airlock.update_other_id()
- if(airlock.abandoned)
- var/outcome = rand(1,100)
- switch(outcome)
- if(1 to 9)
- var/turf/here = get_turf(src)
- for(var/turf/closed/T in range(2, src))
- here.PlaceOnTop(T.type)
- qdel(src)
- return
- here.PlaceOnTop(/turf/closed/constructed_wall)
- qdel(src)
- return
- if(9 to 11)
- airlock.lights = FALSE
- airlock.locked = TRUE
- if(12 to 15)
- airlock.locked = TRUE
- if(16 to 23)
- airlock.welded = TRUE
- if(24 to 30)
- airlock.panel_open = TRUE
- if(airlock.cutAiWire)
- wires.cut(WIRE_AI)
- if(airlock.autoname)
- name = get_area_name(src, TRUE)
- update_appearance()
- qdel(src)
-
-/obj/effect/mapping_helpers/airlock/proc/payload(obj/machinery/door/airlock/payload)
- return
-
-/obj/effect/mapping_helpers/airlock/cyclelink_helper
- name = "airlock cyclelink helper"
- icon_state = "airlock_cyclelink_helper"
-
-/obj/effect/mapping_helpers/airlock/cyclelink_helper/payload(obj/machinery/door/airlock/airlock)
- if(airlock.cyclelinkeddir)
- log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!")
- else
- airlock.cyclelinkeddir = dir
-
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi
- name = "airlock multi-cyclelink helper"
- icon_state = "airlock_multicyclelink_helper"
- var/cycle_id
-
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi/payload(obj/machinery/door/airlock/airlock)
- if(airlock.closeOtherId)
- log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] closeOtherId, but it's already set!")
- else
- airlock.closeOtherId = cycle_id
-
-/obj/effect/mapping_helpers/airlock/locked
- name = "airlock lock helper"
- icon_state = "airlock_locked_helper"
-
-/obj/effect/mapping_helpers/airlock/locked/payload(obj/machinery/door/airlock/airlock)
- if(airlock.locked)
- log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!")
- else
- airlock.locked = TRUE
-
-
-/obj/effect/mapping_helpers/airlock/unres
- name = "airlock unresctricted side helper"
- icon_state = "airlock_unres_helper"
-
-/obj/effect/mapping_helpers/airlock/unres/payload(obj/machinery/door/airlock/airlock)
- airlock.unres_sides ^= dir
-
-/obj/effect/mapping_helpers/airlock/abandoned
- name = "airlock abandoned helper"
- icon_state = "airlock_abandoned"
-
-/obj/effect/mapping_helpers/airlock/abandoned/payload(obj/machinery/door/airlock/airlock)
- if(airlock.abandoned)
- log_mapping("[src] at [AREACOORD(src)] tried to make [airlock] abandoned but it's already abandoned!")
- else
- airlock.abandoned = TRUE
-
-/obj/effect/mapping_helpers/airlock/cutaiwire
- name = "airlock cut ai wire helper"
- icon_state = "airlock_cutaiwire"
-
-/obj/effect/mapping_helpers/airlock/cutaiwire/payload(obj/machinery/door/airlock/airlock)
- if(airlock.cutAiWire)
- log_mapping("[src] at [AREACOORD(src)] tried to cut the ai wire on [airlock] but it's already cut!")
- else
- airlock.cutAiWire = TRUE
-
-/obj/effect/mapping_helpers/airlock/autoname
- name = "airlock autoname helper"
- icon_state = "airlock_autoname"
-
-/obj/effect/mapping_helpers/airlock/autoname/payload(obj/machinery/door/airlock/airlock)
- if(airlock.autoname)
- log_mapping("[src] at [AREACOORD(src)] tried to autoname the [airlock] but it's already autonamed!")
- else
- airlock.autoname = TRUE
-
-/obj/effect/mapping_helpers/airlock/frequency
- name = "airlock radio frequency helper"
- icon_state = "airlock_radio"
-
- var/frequency_to_set
-
-/obj/effect/mapping_helpers/airlock/frequency/payload(obj/machinery/door/airlock/airlock)
- if(airlock.frequency)
- log_mapping("[src] at [AREACOORD(src)] tried to set frequency for the [airlock] but it's already set!")
- else
- airlock.set_frequency(frequency_to_set)
-
-/obj/effect/mapping_helpers/airlock/frequency/airlock_control
- frequency_to_set = FREQ_AIRLOCK_CONTROL
-
-// Windoors
-/obj/effect/mapping_helpers/windoor
- layer = WINDOW_HELPER_LAYER
- late = TRUE
-
-/obj/effect/mapping_helpers/windoor/Initialize(mapload)
- . = ..()
- if(!mapload)
- log_mapping("[src] spawned outside of mapload!")
- return
-
- var/obj/machinery/door/window/windoor = locate() in loc
- if(!windoor)
- log_mapping("[src] failed to find a windoor at [AREACOORD(src)]")
- else
- payload(windoor)
- return INITIALIZE_HINT_QDEL
-
-/obj/effect/mapping_helpers/windoor/proc/payload(obj/machinery/door/window/windoor)
- return
-
//needs to do its thing before spawn_rivers() is called
INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
@@ -643,44 +480,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
matchbox.pixel_x -= 3
new /obj/item/storage/box/fireworks/dangerous(fireworks_turf) //dangerous version for extra holiday memes.
-//lets mappers place notes on airlocks with custom info or a pre-made note from a path
-/obj/effect/mapping_helpers/airlock_note_placer
- name = "Airlock Note Placer"
- late = TRUE
- icon_state = "airlocknoteplacer"
- var/note_info //for writing out custom notes without creating an extra paper subtype
- var/note_name //custom note name
- var/note_path //if you already have something wrote up in a paper subtype, put the path here
-
-/obj/effect/mapping_helpers/airlock_note_placer/LateInitialize()
- var/turf/turf = get_turf(src)
- if(note_path && !istype(note_path, /obj/item/paper)) //don't put non-paper in the paper slot thank you
- log_mapping("[src] at [x],[y] had an improper note_path path, could not place paper note.")
- qdel(src)
- return
- if(locate(/obj/machinery/door/airlock) in turf)
- var/obj/machinery/door/airlock/found_airlock = locate(/obj/machinery/door/airlock) in turf
- if(note_path)
- found_airlock.note = note_path
- found_airlock.update_appearance()
- qdel(src)
- return
- if(note_info)
- var/obj/item/paper/paper = new /obj/item/paper(src)
- if(note_name)
- paper.name = note_name
- paper.info = "[note_info]"
- found_airlock.note = paper
- paper.forceMove(found_airlock)
- found_airlock.update_appearance()
- qdel(src)
- return
- log_mapping("[src] at [x],[y] had no note_path or note_info, cannot place paper note.")
- qdel(src)
- return
- log_mapping("[src] at [x],[y] could not find an airlock on current turf, cannot place paper note.")
- qdel(src)
-
/**
* ## trapdoor placer!
*
@@ -924,9 +723,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
var/obj/machinery/power/terminal/terminal = locate() in my_turf
if(terminal)
return TRUE
- var/obj/structure/grille/grille = locate() in my_turf
- if(grille)
- return TRUE
var/obj/machinery/power/smes/smes = locate() in my_turf
if(smes)
return TRUE
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 5b3076b06c9..b78f5804c74 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -81,52 +81,6 @@
//Pod objects
-//Window
-/obj/structure/window/reinforced/shuttle/survival_pod
- name = "pod window"
- icon = 'icons/obj/smooth_structures/pod_window.dmi'
- icon_state = "pod_window-0"
- base_icon_state = "pod_window"
- smoothing_flags = SMOOTH_BITMASK
- smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD
- smoothing_groups_with = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD
-
-/obj/structure/window/reinforced/shuttle/survival_pod/spawner/north
- dir = NORTH
-
-/obj/structure/window/reinforced/shuttle/survival_pod/spawner/east
- dir = EAST
-
-/obj/structure/window/reinforced/shuttle/survival_pod/spawner/west
- dir = WEST
-
-/obj/structure/window/reinforced/survival_pod
- name = "pod window"
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "pwindow"
-
-//Door
-/obj/machinery/door/airlock/survival_pod
- name = "airlock"
- assemblytype = /obj/structure/door_assembly/door_assembly_pod
- smoothing_groups = SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD
-
-/obj/machinery/door/airlock/survival_pod/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/structure/door_assembly/door_assembly_pod
- name = "pod airlock assembly"
- base_name = "pod airlock"
- airlock_type = /obj/machinery/door/airlock/survival_pod
- glass_type = /obj/machinery/door/airlock/survival_pod/glass
-
-//Windoor
-/obj/machinery/door/window/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "windoor"
- base_state = "windoor"
-
//Table
/obj/structure/table/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm
index d2aa307b8fc..19a9dfa1494 100644
--- a/code/modules/mining/machine_silo.dm
+++ b/code/modules/mining/machine_silo.dm
@@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
return
if(I.item_flags & ABSTRACT)
return
- if(!istype(I) || (I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION))
+ if(!istype(I) || (I.flags_1 & HOLOGRAM_1))
to_chat(user, span_warning("[M] won't accept [I]!"))
return
var/item_mats = materials.get_item_material_amount(I, breakdown_flags)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 56951800cbf..ec59f16e9cd 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -339,7 +339,6 @@ TYPEINFO_DEF(/obj/item/coin)
var/cooldown = 0
var/value
var/coinflip
- item_flags = NO_MAT_REDEMPTION //You know, it's kind of a problem that money is worth more extrinsicly than intrinsically in this universe.
/obj/item/coin/Initialize(mapload)
. = ..()
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index 29d6a099490..c637a7c7db2 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -54,7 +54,6 @@
/datum/map_template/shelter/alpha/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/closed/mineral)
- banned_objects = typecacheof(/obj/structure/stone_tile)
/datum/map_template/shelter/beta
name = "Shelter Beta"
@@ -69,7 +68,6 @@
/datum/map_template/shelter/beta/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/closed/mineral)
- banned_objects = typecacheof(/obj/structure/stone_tile)
/datum/map_template/shelter/charlie
name = "Shelter Charlie"
@@ -84,4 +82,3 @@
/datum/map_template/shelter/charlie/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/closed/mineral)
- banned_objects = typecacheof(/obj/structure/stone_tile)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index a41a97941db..006518589b9 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -151,11 +151,9 @@ GLOBAL_VAR_INIT(fresh_ghost_adjectives, __fresh_ghost_adjectives())
var/static/list/powers = list(
/datum/action/cooldown/ghost_whisper = SPOOK_LEVEL_WEAK_POWERS,
/datum/action/cooldown/flicker = SPOOK_LEVEL_WEAK_POWERS,
- /datum/action/cooldown/knock_sound = SPOOK_LEVEL_WEAK_POWERS,
/datum/action/cooldown/ghost_light = SPOOK_LEVEL_MEDIUM_POWERS,
/datum/action/cooldown/chilling_presence = SPOOK_LEVEL_MEDIUM_POWERS,
/datum/action/cooldown/shatter_light = SPOOK_LEVEL_DESTRUCTIVE_POWERS,
- /datum/action/cooldown/shatter_glass = SPOOK_LEVEL_DESTRUCTIVE_POWERS,
)
AddComponent(/datum/component/spooky_powers, powers)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 407b2a59cf4..fa7ae4f684b 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -303,13 +303,6 @@
now_pushing = FALSE
return
- if(istype(AM, /obj/structure/window))
- var/obj/structure/window/W = AM
- if(W.fulltile)
- for(var/obj/structure/window/win in get_step(W, dir_to_target))
- now_pushing = FALSE
- return
-
release_grabs(AM)
var/current_dir
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 5345dbafa42..4486ba7a24c 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -496,32 +496,6 @@
else
to_chat(src, "Target is not on or near any active cameras on the station.")
return
- if (href_list["ai_take_control"]) //Mech domination
- var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in INSTANCES_OF(/obj/vehicle/sealed/mecha)
- if (!M)
- return
-
- var/mech_has_controlbeacon = FALSE
- for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in M.trackers)
- mech_has_controlbeacon = TRUE
- break
- if(!can_dominate_mechs && !mech_has_controlbeacon)
- message_admins("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
- log_game("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
- return
-
- if(controlled_equipment)
- to_chat(src, span_warning("You are already loaded into an onboard computer!"))
- return
- if(!GLOB.cameranet.checkCameraVis(M))
- to_chat(src, span_warning("Exosuit is no longer near active cameras."))
- return
- if(!isturf(loc))
- to_chat(src, span_warning("You aren't in your core!"))
- return
- if(M)
- M.transfer_ai(AI_MECH_HACK, src, usr) //Called om the mech itself.
-
/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C)
if(QDELETED(C))
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index c6287a30c98..c64cb10934d 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -86,14 +86,6 @@
return FALSE
if("crew_manifest")
show_crew_manifest(src)
- if("door_jack")
- if(params["jack"] == "jack")
- if(hacking_cable?.machine)
- hack_door()
- if(params["jack"] == "cancel")
- QDEL_NULL(hacking_cable)
- if(params["jack"] == "cable")
- extendcable()
if("encryption_keys")
to_chat(src, span_notice("You have [!encryptmod ? "enabled" : "disabled"] encrypted radio frequencies."))
encryptmod = !encryptmod
@@ -216,38 +208,6 @@
hacking_cable.forceMove(drop_location())
hacking_cable.visible_message(span_warning("A port on [src] opens to reveal \a [hacking_cable], which promptly falls to the floor."), span_hear("You hear the soft click of something light and hard falling to the ground."))
-/**
- * Door jacking supporting proc
- *
- * This will, after alerting any AIs on station, begin to hack open a door.
- * After a 10 second timer, the door will crack open, provided they don't move out of the way.
- */
-
-/mob/living/silicon/pai/proc/hack_door()
- var/turf/turf = get_turf(src)
- playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, TRUE)
- to_chat(usr, span_boldnotice("You begin overriding the airlock security protocols."))
- for(var/mob/living/silicon/ai/all_ais in GLOB.player_list)
- if(!all_ais.stat)
- continue
- if(turf.loc)
- to_chat(all_ais, span_boldannounce("Network Alert: Brute-force security override in progress in [turf.loc]."))
- else
- to_chat(all_ais, span_boldannounce("Network Alert: Brute-force security override in progress. Unable to pinpoint location."))
- //Now begin hacking
- if(!do_after(src, hacking_cable.machine, 10 SECONDS, timed_action_flags = NONE, progress = TRUE))
- to_chat(src, span_notice("Door Jack: Connection to airlock has been lost. Hack aborted."))
- hacking_cable.visible_message(
- span_warning("[hacking_cable] rapidly retracts back into its spool."),\
- span_hear("You hear a click and the sound of wire spooling rapidly."))
- QDEL_NULL(hacking_cable)
- if(!QDELETED(card))
- card.update_appearance()
- return
- var/obj/machinery/door/door = hacking_cable.machine
- door.open()
- QDEL_NULL(hacking_cable)
-
/**
* Proc that switches whether a pAI can refresh
* the records window again.
diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm
index c20062048ba..48060cc3330 100644
--- a/code/modules/mob/living/silicon/robot/robot_model.dm
+++ b/code/modules/mob/living/silicon/robot/robot_model.dm
@@ -312,8 +312,6 @@
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/borg/sight/meson,
- /obj/item/construction/rcd/borg,
- /obj/item/pipe_dispenser,
/obj/item/extinguisher,
/obj/item/weldingtool/largetank/cyborg,
/obj/item/screwdriver/cyborg,
@@ -654,7 +652,6 @@
name = "Peacekeeper"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
- /obj/item/rsf/cookiesynth,
/obj/item/harmalarm,
/obj/item/reagent_containers/borghypo/peace,
/obj/item/holosign_creator/cyborg,
@@ -715,7 +712,6 @@
/obj/item/extinguisher/mini,
/obj/item/hand_labeler/borg,
/obj/item/razor,
- /obj/item/rsf,
/obj/item/instrument/guitar,
/obj/item/instrument/piano_synth,
/obj/item/reagent_containers/dropper,
@@ -802,8 +798,6 @@
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/borg/sight/thermal,
- /obj/item/construction/rcd/borg/syndicate,
- /obj/item/pipe_dispenser,
/obj/item/restraints/handcuffs/cable/zipties,
/obj/item/extinguisher,
/obj/item/weldingtool/largetank/cyborg,
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 522d16cf8b0..ef10ca5e041 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -882,14 +882,6 @@ Pass a positive integer as an argument to override a bot's default speed.
calc_summon_path()
tries = 0
-/mob/living/simple_animal/bot/Bump(atom/A) //Leave no door unopened!
- . = ..()
- if((istype(A, /obj/machinery/door/airlock) || istype(A, /obj/machinery/door/window)) && (!isnull(access_card)))
- var/obj/machinery/door/D = A
- if(D.check_access(access_card))
- D.open()
- frustration = 0
-
/mob/living/simple_animal/bot/ui_data(mob/user)
var/list/data = list()
data["can_hack"] = (issilicon(user) || isAdminGhostAI(user))
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index a1324161e14..843d4933e3f 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -137,7 +137,6 @@
)
/// whitelisted drone items, recursive/includes descendants
var/list/drone_item_whitelist_recursive = list(
- /obj/item/airlock_painter,
/obj/item/circuitboard,
/obj/item/conveyor_switch_construct,
/obj/item/electronics,
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm
index abbe179ef4d..1d0808d9dda 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm
@@ -44,7 +44,6 @@
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "crowbar_cyborg"
inhand_icon_state = "crowbar"
- item_flags = NO_MAT_REDEMPTION
/obj/item/screwdriver/drone
name = "built-in screwdriver"
@@ -52,7 +51,6 @@
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "screwdriver_cyborg"
inhand_icon_state = "screwdriver"
- item_flags = NO_MAT_REDEMPTION
random_color = FALSE
@@ -71,14 +69,12 @@
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "wrench_cyborg"
inhand_icon_state = "wrench"
- item_flags = NO_MAT_REDEMPTION
/obj/item/weldingtool/drone
name = "built-in welding tool"
desc = "A welding tool built into your chassis."
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "indwelder_cyborg"
- item_flags = NO_MAT_REDEMPTION
/obj/item/wirecutters/drone
name = "built-in wirecutters"
@@ -86,6 +82,4 @@
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "wirecutters_cyborg"
inhand_icon_state = "cutters"
- item_flags = NO_MAT_REDEMPTION
random_color = FALSE
-
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index f1e3798b61e..5698a96e771 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -36,7 +36,7 @@
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
. = ..()
if(.)
- if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
+ if(toggle && (isliving(target)))
ToggleMode(1)
/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
deleted file mode 100644
index 692e5255b11..00000000000
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ /dev/null
@@ -1,295 +0,0 @@
-
-/**
- * Mecha Pilots!
- * By Remie Richards
- *
- * Mecha pilot mobs are able to pilot Mecha to a rudimentary level
- * this allows for certain mobs to be more of a threat (Because they're in a MECH)
- *
- * Mecha Pilots can either spawn with one, or steal one!
- *
- * Inherits from syndicate just to avoid copy-paste)
- *
- * Featuring:
- * * Mecha piloting skills
- * * Uses Mecha equipment
- * * Uses Mecha special abilities in specific situations
- * * Pure Evil Incarnate
- */
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot
- name = "Syndicate Mecha Pilot"
- desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour."
- wanted_objects = list()
- search_objects = 0
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
-
- var/spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded
- var/obj/vehicle/sealed/mecha/mecha //Ref to pilot's mecha instance
- var/required_mecha_charge = 7500 //If the pilot doesn't have a mecha, what charge does a potential Grand Theft Mecha need? (Defaults to half a battery)
- var/mecha_charge_evacuate = 50 //Amount of charge at which the pilot tries to abandon the mecha
-
- //Vars that control when the pilot uses their mecha's abilities (if the mecha has that ability)
- var/threat_use_mecha_smoke = 5 //5 mobs is enough to engage crowd control
- var/defense_mode_chance = 35 //Chance to engage Defense mode when damaged
- var/smoke_chance = 20 //Chance to deploy smoke for crowd control
- var/retreat_chance = 40 //Chance to run away
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech
- spawn_mecha_type = null
- search_objects = 2
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize(mapload)
- . = ..()
- wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE)
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
- name = "\improper Nanotrasen Mecha Pilot"
- desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
- icon_living = "nanotrasen"
- icon_state = "nanotrasen"
- faction = list("nanotrasen")
- spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/loaded
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen
- name = "\improper Nanotrasen Mecha Pilot"
- desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
- icon_living = "nanotrasen"
- icon_state = "nanotrasen"
- faction = list("nanotrasen")
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize(mapload)
- . = ..()
- if(spawn_mecha_type)
- var/obj/vehicle/sealed/mecha/M = new spawn_mecha_type (get_turf(src))
- if(istype(M))
- INVOKE_ASYNC(src, PROC_REF(enter_mecha), M)
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M)
- if(!M)
- return 0
- LoseTarget() //Target was our mecha, so null it out
- M.aimob_enter_mech(src)
- targets_from = WEAKREF(M)
- allow_movement_on_non_turfs = TRUE //duh
- var/do_ranged = 0
- for(var/equip in mecha.flat_equipment)
- var/obj/item/mecha_parts/mecha_equipment/ME = equip
- if(ME.range & MECHA_RANGED)
- do_ranged = 1
- break
- if(do_ranged)
- minimum_distance = 5
- ranged = 1
- else
- minimum_distance = 1
- ranged = 0
- wanted_objects = list()
- search_objects = 0
- if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode)
- var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
- action.Trigger(forced_state = TRUE)
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M)
- if(!M)
- return 0
-
- mecha.aimob_exit_mech(src)
- allow_movement_on_non_turfs = FALSE
- targets_from = null
-
- //Find a new mecha
- wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE)
- var/search_aggressiveness = 2
- for(var/obj/vehicle/sealed/mecha/combat/C in range(vision_range,src))
- if(is_valid_mecha(C))
- GiveTarget(C)
- search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS!
- break
- search_objects = search_aggressiveness
- ranged = 0
- minimum_distance = 1
-
- SSmove_manager.stop_looping(src)//end any lingering movement loops, to prevent the haunted mecha bug
-
-//Checks if a mecha is valid for theft
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/vehicle/sealed/mecha/M)
- if(!M)
- return FALSE
- if(LAZYLEN(M.occupants))
- return FALSE
- if(!M.has_charge(required_mecha_charge))
- return FALSE
- if(M.get_integrity() < M.max_integrity*0.5)
- return FALSE
- return TRUE
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
- if(mecha)
- var/dirto = get_dir(mecha,A)
- if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises
- mecha.vehicle_move(dirto, TRUE)
-
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_reload()
- if(mecha)
- for(var/equip in mecha.flat_equipment)
- var/obj/item/mecha_parts/mecha_equipment/ME = equip
- if(ME.needs_rearm())
- ME.rearm()
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
- . = list()
- if(mecha)
- for(var/equip in mecha.flat_equipment)
- var/obj/item/mecha_parts/mecha_equipment/ME = equip
- if((ME.range & flag) && ME.action_checks(ME)) //this looks weird, but action_checks() just needs any atom, so I spoofed it here
- . += ME
-
-
-
-//Pick a ranged weapon/tool
-//Fire it
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/OpenFire(atom/A)
- if(mecha)
- mecha_reload()
- mecha_face_target(A)
- var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED)
- if(possible_weapons.len)
- var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever
- if(ME.action(src,A))
- return
-
- else
- ..()
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget()
- if(mecha)
- var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE)
- if(possible_weapons.len)
- var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons)
- mecha_face_target(target)
- if(ME.action(src,target))
- return
-
- if(!TIMER_COOLDOWN_CHECK(mecha, COOLDOWN_MECHA_MELEE_ATTACK))
- mecha_face_target(target)
- target.mech_melee_attack(mecha, src)
- else
- if(ismecha(target))
- var/obj/vehicle/sealed/mecha/M = target
- if(is_valid_mecha(M))
- enter_mecha(M)
- return
- else
- if(!CanAttack(M))
- LoseTarget()
- return
-
- return target.attack_animal(src)
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
- . = ..()
- if(!.)
- return
- if(!mecha)
- for(var/obj/vehicle/sealed/mecha/combat/mecha_in_range in range(src,vision_range))
- if(is_valid_mecha(mecha_in_range))
- GiveTarget(mecha_in_range) //Let's nab it!
- minimum_distance = 1
- ranged = 0
- break
- if(mecha)
- var/list/L = PossibleThreats()
- var/threat_count = L.len
-
- //Low Charge - Eject
- if(!mecha.has_charge(mecha_charge_evacuate))
- exit_mecha(mecha)
- return
-
- //Too Much Damage - Eject
- if(mecha.get_integrity() < mecha.max_integrity*0.1)
- exit_mecha(mecha)
- return
-
- //Smoke if there's too many targets - Smoke Power
- if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance))
- if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges)
- var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke]
- action.Trigger()
-
- //Heavy damage - Defense Power or Retreat
- if(mecha.get_integrity() < mecha.max_integrity*0.25)
- if(prob(defense_mode_chance))
- if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode)
- var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
- action.Trigger(forced_state = TRUE)
- addtimer(CALLBACK(action, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/mech_defense_mode, Trigger), FALSE), 100) //10 seconds of defense, then toggle off
-
- else if(prob(retreat_chance))
- //Speed boost if possible
- if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode)
- var/datum/action/vehicle/sealed/mecha/mech_overload_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode]
- mecha.leg_overload_mode = FALSE
- action.Trigger(forced_state = TRUE)
- addtimer(CALLBACK(action, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/mech_overload_mode, Trigger), FALSE), 100) //10 seconds of speeeeed, then toggle off
-
- retreat_distance = 50
- addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS)
-
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/death(gibbed, cause_of_death = "Unknown")
- if(mecha)
- mecha.aimob_exit_mech(src)
- ..()
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/gib()
- if(mecha)
- mecha.aimob_exit_mech(src)
- ..()
-
-
-//Yes they actually try and pull this shit
-//~simple animals~
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target)
- if(ismecha(the_target))
- var/obj/vehicle/sealed/mecha/M = the_target
- if(mecha)
- if(M == mecha) //Dont kill yourself
- return FALSE
- else //we're not in a mecha, so we check if we can steal it instead.
- if(is_valid_mecha(M))
- return TRUE
- for(var/occupant in M.occupants)
- if(CanAttack(occupant))
- return TRUE
- return FALSE
-
- . = ..()
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement()
- if(mecha && loc == mecha)
- return 0
- ..()
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0)
- if(mecha && loc == mecha)
- return mecha.relaymove(src, Dir)
- return ..()
-
-
-/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
- if(mecha)
- SSmove_manager.move_to(mecha, target, minimum_distance, mecha.movedelay)
- else
- ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 3a79da08c80..d7093bbd18e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -99,7 +99,7 @@
..()
/// Mimics can't be made out of these objects
-GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/structure/blob))
+GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cable, /obj/structure/blob))
/mob/living/simple_animal/hostile/mimic/copy
health = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
index f8715221c91..0de4a5ed399 100644
--- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
@@ -128,10 +128,6 @@
return
if (QDELETED(target))
return
- if(istype(target, /obj/machinery/door/airlock) && !opening_airlock)
- pry_door(target)
- return
-
if (target.reagents && target.is_injectable(src, allowmobs = TRUE) && !istype(target, /obj/item/food/cheese))
src.visible_message(span_warning("[src] starts licking [target] passionately!"),span_notice("You start licking [target]..."))
if (do_after(src, target, 2 SECONDS, interaction_key = REGALRAT_INTERACTION))
@@ -160,35 +156,6 @@
else
to_chat(src, span_warning("You feel fine, no need to eat anything!"))
-/**
- * Allows rat king to pry open an airlock if it isn't locked.
- *
- * A proc used for letting the rat king pry open airlocks instead of just attacking them.
- * This allows the rat king to traverse the station when there is a lack of vents or
- * accessible doors, something which is common in certain rat king spawn points.
- */
-/mob/living/simple_animal/hostile/regalrat/proc/pry_door(target)
- var/obj/machinery/door/airlock/prying_door = target
- if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal)
- return FALSE
- opening_airlock = TRUE
- visible_message(
- span_warning("[src] begins prying open the airlock..."),
- span_notice("You begin digging your claws into the airlock..."),
- span_warning("You hear groaning metal..."),
- )
- var/time_to_open = 0.5 SECONDS
- if(prying_door.hasPower())
- time_to_open = 5 SECONDS
- playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE)
- if(do_after(src, time_to_open, prying_door))
- opening_airlock = FALSE
- if(prying_door.density && !prying_door.open(2))
- to_chat(src, span_warning("Despite your efforts, the airlock managed to resist your attempts to open it!"))
- return FALSE
- prying_door.open()
- return FALSE
- opening_airlock = FALSE
/mob/living/simple_animal/hostile/regalrat/controlled/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
index 9f2715c90ef..938c3a3831f 100644
--- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
@@ -307,11 +307,6 @@
for(var/turf/T in turfs)
if(istype(T, /turf/closed))
return
- for(var/obj/structure/window/W in T.contents)
- return
- for(var/obj/machinery/door/D in T.contents)
- if(D.density)
- return
delayFire += 1.5
addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T), delayFire)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 11e3a36b8f8..12fb3d35a40 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -168,30 +168,6 @@
if(mod)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, slowdown = mod)
-/mob/living/simple_animal/slime/ObjBump(obj/O)
- if(!client && powerlevel > 0)
- var/probab = 10
- switch(powerlevel)
- if(1 to 2)
- probab = 20
- if(3 to 4)
- probab = 30
- if(5 to 6)
- probab = 40
- if(7 to 8)
- probab = 60
- if(9)
- probab = 70
- if(10)
- probab = 95
- if(prob(probab))
- if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
- if(nutrition <= get_hunger_nutrition() && !Atkcool)
- if (is_adult || prob(5))
- O.attack_slime(src)
- Atkcool = TRUE
- addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS)
-
/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 2
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
index 2affea270fc..b4bdf74bb6a 100644
--- a/code/modules/mod/mod_theme.dm
+++ b/code/modules/mod/mod_theme.dm
@@ -233,7 +233,6 @@
allowed_suit_storage = list(
/obj/item/flashlight,
/obj/item/tank/internals,
- /obj/item/construction/rcd,
/obj/item/storage/bag/construction,
)
variants = list(
@@ -289,7 +288,6 @@
/obj/item/tank/internals,
/obj/item/analyzer,
/obj/item/t_scanner,
- /obj/item/pipe_dispenser,
)
variants = list(
"atmospheric" = list(
@@ -347,8 +345,6 @@
/obj/item/tank/internals,
/obj/item/analyzer,
/obj/item/t_scanner,
- /obj/item/pipe_dispenser,
- /obj/item/construction/rcd,
/obj/item/storage/bag/construction,
)
variants = list(
@@ -1266,8 +1262,6 @@
/obj/item/tank/internals,
/obj/item/analyzer,
/obj/item/t_scanner,
- /obj/item/pipe_dispenser,
- /obj/item/construction/rcd,
)
variants = list(
"prototype" = list(
@@ -1676,4 +1670,3 @@
),
),
)
-
diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm
index c0b5371662b..be276544236 100644
--- a/code/modules/mod/modules/modules_engineering.dm
+++ b/code/modules/mod/modules/modules_engineering.dm
@@ -181,32 +181,6 @@
perceived_threat_level = get_perceived_radiation_danger(pulse_information, insulation_to_target)
addtimer(VARSET_CALLBACK(src, perceived_threat_level, null), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE)
-///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 functions as an \
- extremely advanced construction hologram scanner, as well as containing 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
- required_slots = list(ITEM_SLOT_GLOVES)
-
-/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)
-
-/obj/item/mod/module/constructor/on_use()
- rcd_scan(src, fade_time = 10 SECONDS)
- drain_power(use_power_cost)
-
///Mister - Sprays water over an area.
/obj/item/mod/module/mister
name = "MOD water mister module"
diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm
index 97709bf7ecd..39bbc3cd205 100644
--- a/code/modules/mod/modules/modules_medical.dm
+++ b/code/modules/mod/modules/modules_medical.dm
@@ -65,7 +65,7 @@
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)
+ incompatible_modules = list(/obj/item/mod/module/quick_carry)
required_slots = list(ITEM_SLOT_GLOVES)
/obj/item/mod/module/quick_carry/on_suit_activation()
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 564c6407e54..6591ce71638 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -127,16 +127,6 @@
//COMMUNICATIONS CONSOLE//
/obj/machinery/computer/communications/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
-
-//AIRLOCK//
-/obj/machinery/door/airlock/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
- if(!ninja_suit || !ninja || !ninja_gloves)
- return INVALID_DRAIN
-
- if(!operating && density && hasPower() && !(obj_flags & EMAGGED))
- emag_act()
- ninja_gloves.door_hack_counter++
-
//WIRE//
/obj/structure/cable/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
if(!ninja_suit || !ninja || !ninja_gloves)
@@ -175,35 +165,6 @@
return drain_total
-//MECH//
-/obj/vehicle/sealed/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
- if(!ninja_suit || !ninja || !ninja_gloves)
- return INVALID_DRAIN
-
- var/maxcapacity = FALSE //Safety check
- var/drain = 0 //Drain amount
- var/drain_total = 0
-
- to_chat(occupants, "[icon2html(src, occupants)][span_danger("Warning: Unauthorized access through sub-route 4, block H, detected.")]")
- if(get_charge())
- while(cell.charge > 0 && !maxcapacity)
- drain = rand(ninja_gloves.mindrain, ninja_gloves.maxdrain)
- if(cell.charge < drain)
- drain = cell.charge
- if(ninja_suit.cell.charge + drain > ninja_suit.cell.maxcharge)
- drain = ninja_suit.cell.maxcharge - ninja_suit.cell.charge
- maxcapacity = TRUE
- if (do_after(ninja, src, 10))
- spark_system.start()
- playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- cell.use(drain)
- ninja_suit.cell.give(drain)
- drain_total += drain
- else
- break
-
- return drain_total
-
//BORG//
/mob/living/silicon/robot/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves)
if(!ninja_suit || !ninja || !ninja_gloves || (ROLE_SPACE_NINJA in faction))
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index ca27d503f10..e4dea7088cc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -192,15 +192,6 @@
// .. or if you cannot read
if(!user.can_read(src))
return UI_CLOSE
- if(in_contents_of(/obj/machinery/door/airlock) || in_contents_of(/obj/item/clipboard))
- return UI_INTERACTIVE
- return ..()
-
-
-
-/obj/item/paper/can_interact(mob/user)
- if(in_contents_of(/obj/machinery/door/airlock))
- return TRUE
return ..()
diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm
deleted file mode 100644
index 4c86a6658a4..00000000000
--- a/code/modules/paperwork/ticketmachine.dm
+++ /dev/null
@@ -1,207 +0,0 @@
-//Bureaucracy machine!
-//Simply set this up in the hopline and you can serve people based on ticket numbers
-
-/obj/machinery/ticket_machine
- name = "ticket machine"
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "ticketmachine"
- base_icon_state = "ticketmachine"
- desc = "A marvel of bureaucratic engineering encased in an efficient plastic shell. It can be refilled with a hand labeler refill roll and linked to buttons with a multitool."
- density = FALSE
- maptext_height = 26
- maptext_width = 32
- maptext_x = 7
- maptext_y = 10
- layer = HIGH_OBJ_LAYER
- var/ticket_number = 0 //Increment the ticket number whenever the HOP presses his button
- var/current_number = 0 //What ticket number are we currently serving?
- var/max_number = 100 //At this point, you need to refill it.
- var/cooldown = 50
- var/ready = TRUE
- var/id = "ticket_machine_default" //For buttons
-
-/obj/machinery/ticket_machine/Initialize(mapload)
- . = ..()
- update_appearance()
- AddComponent(/datum/component/wall_mounted, CALLBACK(src, PROC_REF(deconstruct), FALSE))
- SET_TRACKING(__TYPE__)
-
-/obj/machinery/ticket_machine/Destroy()
- UNSET_TRACKING(__TYPE__)
- return ..()
-
-MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32)
-
-/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I)
- if(!multitool_check_buffer(user, I)) //make sure it has a data buffer
- return
- var/obj/item/multitool/M = I
- M.buffer = src
- to_chat(user, span_notice("You store linkage information in [I]'s buffer."))
- return TRUE
-
-/obj/machinery/ticket_machine/emag_act(mob/user) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind.
- if(obj_flags & EMAGGED)
- return
- to_chat(user, span_warning("You overload [src]'s bureaucratic logic circuitry to its MAXIMUM setting."))
- ticket_number = rand(0,max_number)
- current_number = ticket_number
- obj_flags |= EMAGGED
- update_appearance()
-
-/obj/machinery/ticket_machine/proc/increment()
- if(current_number > ticket_number)
- return
- if(current_number < ticket_number)
- current_number ++ //Increment the one we're serving.
- playsound(src, 'sound/misc/announce_dig.ogg', 50, FALSE)
- say("Now serving ticket #[current_number]!")
- update_appearance()
-
-/obj/machinery/button/ticket_machine
- name = "increment ticket counter"
- desc = "Use this button after you've served someone to tell the next person to come forward."
- device_type = /obj/item/assembly/control/ticket_machine
- req_access = list()
- id = "ticket_machine_default"
-
-/obj/machinery/button/ticket_machine/Initialize(mapload)
- . = ..()
- if(device)
- var/obj/item/assembly/control/ticket_machine/ours = device
- ours.id = id
-
-/obj/machinery/button/ticket_machine/multitool_act(mob/living/user, obj/item/I)
- . = ..()
- if(I.tool_behaviour == TOOL_MULTITOOL)
- var/obj/item/multitool/M = I
- if(M.buffer && !istype(M.buffer, /obj/machinery/ticket_machine))
- return
- var/obj/item/assembly/control/ticket_machine/controller = device
- controller.linked = WEAKREF(M.buffer)
- id = null
- controller.id = null
- to_chat(user, span_warning("You've linked [src] to [M.buffer]."))
-
-/obj/item/assembly/control/ticket_machine
- name = "ticket machine controller"
- desc = "A remote controller for the HoP's ticket machine."
- var/datum/weakref/linked //To whom are we linked?
-
-/obj/item/assembly/control/ticket_machine/Initialize(mapload)
- ..()
- return INITIALIZE_HINT_LATELOAD
-
-/obj/item/assembly/control/ticket_machine/LateInitialize()
- find_machine()
-
-/obj/item/assembly/control/ticket_machine/proc/find_machine() //Locate the one to which we're linked
- for(var/obj/machinery/ticket_machine/ticketsplease as anything in INSTANCES_OF(/obj/machinery/ticket_machine))
- if(ticketsplease.id == id)
- linked = WEAKREF(ticketsplease)
- if(linked)
- return TRUE
- else
- return FALSE
-
-/obj/item/assembly/control/ticket_machine/activate()
- if(cooldown)
- return
- if(!linked)
- return
- var/obj/machinery/ticket_machine/machine = linked.resolve()
- if(!machine)
- return
- cooldown = TRUE
- machine.increment()
- addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
-
-/obj/machinery/ticket_machine/update_icon()
- . = ..()
- handle_maptext()
-
-/obj/machinery/ticket_machine/update_icon_state()
- switch(ticket_number) //Gives you an idea of how many tickets are left
- if(0 to 49)
- icon_state = "[base_icon_state]_100"
- if(50 to 99)
- icon_state = "[base_icon_state]_50"
- if(100)
- icon_state = "[base_icon_state]_0"
- return ..()
-
-/obj/machinery/ticket_machine/proc/handle_maptext()
- switch(current_number) //This is here to handle maptext offsets so that the numbers align.
- if(0 to 9)
- maptext_x = 13
- if(10 to 99)
- maptext_x = 10
- if(100)
- maptext_x = 8
- maptext = MAPTEXT(current_number) //Finally, apply the maptext
-
-/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params)
- ..()
- if(istype(I, /obj/item/hand_labeler_refill))
- if(!(ticket_number >= max_number))
- if(tgui_alert(user, "[src] still has [max_number-ticket_number] ticket[max_number-ticket_number==1 ? null : "s"] left, are you sure you want to refill it?", "Tactical Refill", list("Refill", "Cancel")) != "Refill")
- return //If the user still wants to refill it...
- to_chat(user, span_notice("You start to refill [src]'s ticket holder."))
- if(do_after(user, src, 30))
- to_chat(user, span_notice("You insert [I] into [src] as it whirs nondescriptly."))
- qdel(I)
- ticket_number = 0
- current_number = 0
- update_appearance()
- return
-
-/obj/machinery/ticket_machine/proc/reset_cooldown()
- ready = TRUE
-
-/obj/machinery/ticket_machine/attack_hand(mob/living/carbon/user, list/modifiers)
- . = ..()
- if(!ready)
- to_chat(user,span_warning("You press the button, but nothing happens..."))
- return
- if(ticket_number >= max_number)
- to_chat(user,span_warning("Ticket supply depleted, please refill this unit with a hand labeller refill cartridge!"))
- return
-
- playsound(src, 'sound/machines/terminal_insert_disc.ogg', 100, FALSE)
- ticket_number++
- to_chat(user, span_notice("You take a ticket from [src], looks like you're ticket number #[ticket_number]..."))
- var/obj/item/ticket_machine_ticket/theirticket = new /obj/item/ticket_machine_ticket(get_turf(src))
- theirticket.name = "Ticket #[ticket_number]"
- theirticket.maptext = MAPTEXT(ticket_number)
- theirticket.saved_maptext = MAPTEXT(ticket_number)
- user.put_in_hands(theirticket)
- update_appearance()
- if(obj_flags & EMAGGED) //Emag the machine to destroy the HOP's life.
- ready = FALSE
- addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown)//Small cooldown to prevent piles of flaming tickets
- theirticket.fire_act()
- user.dropItemToGround(theirticket)
- user.adjust_fire_stacks(1)
- user.ignite_mob()
- return
-
-/obj/item/ticket_machine_ticket
- name = "Ticket"
- desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper®. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "ticket"
- maptext_x = 7
- maptext_y = 10
- w_class = WEIGHT_CLASS_TINY
- resistance_flags = FLAMMABLE
- max_integrity = 50
- var/saved_maptext = null
-
-/obj/item/ticket_machine_ticket/attack_hand(mob/user, list/modifiers)
- . = ..()
- maptext = saved_maptext //For some reason, storage code removes all maptext off objs, this stops its number from being wiped off when taken out of storage.
-
-/obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode
- if(burn_paper_product_attackby_check(P, user))
- return
- return ..()
diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm
index 1daf0cac847..f0af27b4f4a 100644
--- a/code/modules/power/apc/apc_tool_act.dm
+++ b/code/modules/power/apc/apc_tool_act.dm
@@ -120,54 +120,6 @@
qdel(src)
return TRUE
-/obj/machinery/power/apc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
- if(!(the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS))
- return FALSE
-
- if(!has_electronics)
- if(machine_stat & BROKEN)
- to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit."))
- return FALSE
- return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
-
- if(!cell)
- if(machine_stat & MAINT)
- to_chat(user, span_warning("There's no connector for a power cell."))
- return FALSE
- return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 50, "cost" = 10) //16 for a wall
-
- to_chat(user, span_warning("[src] has both electronics and a cell."))
- return FALSE
-
-/obj/machinery/power/apc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
- if(!(passed_mode & RCD_UPGRADE_SIMPLE_CIRCUITS))
- return FALSE
- if(!has_electronics)
- if(machine_stat & BROKEN)
- to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit."))
- return
- user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \
- span_notice("You adapt a power control board and click it into place in [src]'s guts."))
- has_electronics = TRUE
- locked = TRUE
- return TRUE
-
- if(!cell)
- if(machine_stat & MAINT)
- to_chat(user, span_warning("There's no connector for a power cell."))
- return FALSE
- var/obj/item/stock_parts/cell/crap/empty/C = new(src)
- C.forceMove(src)
- cell = C
- chargecount = 0
- user.visible_message(span_notice("[user] fabricates a weak power cell and places it into [src]."), \
- span_warning("Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!"))
- update_appearance()
- return TRUE
-
- to_chat(user, span_warning("[src] has both electronics and a cell."))
- return FALSE
-
/obj/machinery/power/apc/emag_act(mob/user)
if((obj_flags & EMAGGED) || malfhack)
return
diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm
index 54aea3184b5..8dff2f1c05c 100644
--- a/code/modules/power/lighting/light.dm
+++ b/code/modules/power/lighting/light.dm
@@ -74,8 +74,6 @@ DEFINE_INTERACTABLE(/obj/machinery/light)
var/constant_flickering = FALSE
var/flicker_timer = null
var/roundstart_flicker = FALSE
- /// Should this turn red when a firealarm is on in the area?
- var/firealarm = FALSE
var/maploaded = FALSE
/obj/machinery/light/Move()
@@ -130,7 +128,7 @@ DEFINE_INTERACTABLE(/obj/machinery/light)
/obj/machinery/light/update_icon_state()
switch(status) // set icon_states
if(LIGHT_OK)
- if(emergency_mode || firealarm)
+ if(emergency_mode)
icon_state = "[base_state]_emergency"
else
icon_state = "[base_state]"
@@ -150,7 +148,7 @@ DEFINE_INTERACTABLE(/obj/machinery/light)
if(!overlay_icon)
return
- if(emergency_mode || firealarm)
+ if(emergency_mode)
. += mutable_appearance(overlay_icon, "[base_state]_emergency")
return
. += mutable_appearance(overlay_icon, base_state)
@@ -513,8 +511,6 @@ DEFINE_INTERACTABLE(/obj/machinery/light)
var/FC = bulb_falloff
if(color)
CO = color
- if (firealarm)
- CO = bulb_emergency_colour
var/matching = light && OR == light.light_outer_range && IR == light.light_inner_range && PO == light.light_power && CO == light.light_color && FC == light.light_falloff_curve
if(!matching)
@@ -570,18 +566,6 @@ DEFINE_INTERACTABLE(/obj/machinery/light)
alter_flicker(FALSE)
flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_on)), rand(5, 50), TIMER_STOPPABLE|TIMER_DELETE_ME)
-/obj/machinery/light/proc/firealarm_on()
- SIGNAL_HANDLER
-
- firealarm = TRUE
- update()
-
-/obj/machinery/light/proc/firealarm_off()
- SIGNAL_HANDLER
-
- firealarm = FALSE
- update()
-
// ai attack - make lights flicker, because why not
/obj/machinery/light/attack_ai(mob/user)
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 8ea413b852e..8e51a9ae3b2 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -233,7 +233,6 @@
/obj/machinery/disposal/delivery_chute = FALSE,
/obj/structure/sign = FALSE,
/obj/structure/lattice = FALSE,
- /obj/structure/grille = FALSE,
/obj/structure/frame/machine = FALSE,
))
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index a9b5e388679..c2e9730e99e 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -28,10 +28,6 @@
projectile_type = /obj/projectile/magic/safety
harmful = FALSE
-/obj/item/ammo_casing/magic/door
- projectile_type = /obj/projectile/magic/door
- harmful = FALSE
-
/obj/item/ammo_casing/magic/fireball
projectile_type = /obj/projectile/magic/fireball
diff --git a/code/modules/projectiles/ammunition/special/syringe.dm b/code/modules/projectiles/ammunition/special/syringe.dm
index 59f5f3b3177..a73be5adf4f 100644
--- a/code/modules/projectiles/ammunition/special/syringe.dm
+++ b/code/modules/projectiles/ammunition/special/syringe.dm
@@ -21,15 +21,6 @@
D.inject_flags = S.inject_flags
SG.syringes.Remove(S)
qdel(S)
- else if(istype(loc, /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun))
- var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/syringe_gun = loc
- var/obj/item/reagent_containers/syringe/loaded_syringe = syringe_gun.syringes[1]
- var/obj/projectile/bullet/dart/shot_dart = loaded_projectile
- syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transfered_by = user)
- shot_dart.name = loaded_syringe.name
- shot_dart.inject_flags = loaded_syringe.inject_flags
- LAZYREMOVE(syringe_gun.syringes, loaded_syringe)
- qdel(loaded_syringe)
return ..()
/obj/item/ammo_casing/chemgun
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index f4e545e521b..69220a7e202 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -5,7 +5,6 @@
ammo_type = /obj/item/ammo_casing/a357
max_ammo = 7
multiple_sprites = AMMO_BOX_PER_BULLET
- item_flags = NO_MAT_REDEMPTION
/obj/item/ammo_box/a357/match
name = "speed loader (.357 Match)"
diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm
index e160e40ead7..e30ea289a6c 100644
--- a/code/modules/projectiles/guns/energy/beam_rifle.dm
+++ b/code/modules/projectiles/guns/energy/beam_rifle.dm
@@ -473,10 +473,6 @@ TYPEINFO_DEF(/obj/item/gun/energy/beam_rifle)
return ..()
/obj/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target)
- if(istype(target, /obj/machinery/door))
- return 0.4
- if(istype(target, /obj/structure/window))
- return 0.5
return 1
/obj/projectile/beam/beam_rifle/proc/handle_impact(atom/target)
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index 8f935be4000..878bddf3104 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -5,7 +5,7 @@
icon_state = "staff"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
- item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION
+ item_flags = NEEDS_PERMIT
var/allow_intruder_use = FALSE
/obj/item/gun/magic/staff/proc/is_wizard_or_friend(mob/user)
@@ -114,7 +114,7 @@
no_den_usage = 1
school = SCHOOL_FORBIDDEN //this staff is evil. okay? it just is. look at this projectile type list. this is wrong.
var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection,
- /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/fireball,
+ /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/fireball,
/obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying,
/obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping,
/obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe)
@@ -138,18 +138,6 @@
do_fire_gun(user, user, FALSE)
return FALSE
-/obj/item/gun/magic/staff/door
- name = "staff of door creation"
- desc = "An artefact that spits bolts of transformative magic that can create doors in walls."
- fire_sound = 'sound/magic/staff_door.ogg'
- ammo_type = /obj/item/ammo_casing/magic/door
- icon_state = "staffofdoor"
- inhand_icon_state = "staffofdoor"
- max_charges = 10
- recharge_rate = 2
- no_den_usage = 1
- school = SCHOOL_TRANSMUTATION
-
/obj/item/gun/magic/staff/honk
name = "staff of the honkmother"
desc = "Honk."
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index cab75740930..c701811b2ca 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -204,27 +204,6 @@
can_charge = TRUE
recharge_rate = 1
-
-/////////////////////////////////////
-//WAND OF DOOR CREATION
-/////////////////////////////////////
-
-/obj/item/gun/magic/wand/door
- name = "wand of door creation"
- desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
- school = SCHOOL_TRANSMUTATION
- ammo_type = /obj/item/ammo_casing/magic/door
- icon_state = "doorwand"
- base_icon_state = "doorwand"
- fire_sound = 'sound/magic/staff_door.ogg'
- max_charges = 20 //20, 10, 10, 7
- no_den_usage = 1
-
-/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
- to_chat(user, span_notice("You feel vaguely more open with your feelings."))
- charges--
- ..()
-
/////////////////////////////////////
//WAND OF FIREBALL
/////////////////////////////////////
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 6374b95b391..e9ba2001b31 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -102,35 +102,6 @@
smoke.set_up(0, location = t)
smoke.start()
-/obj/projectile/magic/door
- name = "bolt of door creation"
- icon_state = "energy"
- damage = 0
- damage_type = OXY
- nodamage = TRUE
- var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond)
-
-/obj/projectile/magic/door/on_hit(atom/target)
- . = ..()
- if(istype(target, /obj/machinery/door))
- OpenDoor(target)
- else
- var/turf/T = get_turf(target)
- if(isclosedturf(T) && !isindestructiblewall(T))
- CreateDoor(T)
-
-/obj/projectile/magic/door/proc/CreateDoor(turf/T)
- var/door_type = pick(door_types)
- var/obj/structure/mineral_door/D = new door_type(T)
- T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- D.Open()
-
-/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D)
- if(istype(D, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/A = D
- A.locked = FALSE
- D.open()
-
/obj/projectile/magic/change
name = "bolt of change"
icon_state = "ice_1"
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index c2d04ad8cb7..acec7aba27c 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -81,10 +81,6 @@
shrapnel_type = null
var/sturdy = list(
/turf/closed,
- /obj/vehicle/sealed/mecha,
- /obj/machinery/door,
- /obj/structure/window,
- /obj/structure/grille
)
/obj/item/broken_missile
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 36d6dfe11c6..8aff6e0a4a3 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -165,24 +165,6 @@
category = list( "Electronics")
mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI
-/datum/design/airlock_board
- name = "Airlock Electronics"
- id = "airlock_board"
- build_type = AUTOLATHE | FABRICATOR
- materials = list(/datum/material/steel = 50, /datum/material/glass = 50)
- build_path = /obj/item/electronics/airlock
- category = list( "Electronics")
- mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI
-
-/datum/design/firelock_board
- name = "Firelock Circuitry"
- id = "firelock_board"
- build_type = AUTOLATHE | FABRICATOR
- materials = list(/datum/material/steel = 50, /datum/material/glass = 50)
- build_path = /obj/item/electronics/firelock
- category = list( "Electronics")
- mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI
-
/datum/design/airalarm_electronics
name = "Air Alarm Electronics"
id = "airalarm_electronics"
@@ -192,42 +174,6 @@
category = list( "Electronics")
mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI
-/datum/design/firealarm_electronics
- name = "Fire Alarm Electronics"
- id = "firealarm_electronics"
- build_type = AUTOLATHE | FABRICATOR
- materials = list(/datum/material/steel = 50, /datum/material/glass = 50)
- build_path = /obj/item/electronics/firealarm
- category = list( "Electronics")
- mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI
-
-/datum/design/airlock_painter
- name = "Airlock Painter"
- id = "airlock_painter"
- build_type = AUTOLATHE | FABRICATOR
- materials = list(/datum/material/steel = 50, /datum/material/glass = 50)
- build_path = /obj/item/airlock_painter
- category = list(DCAT_PAINTER)
- mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI
-
-/datum/design/airlock_painter/decal
- name = "Decal Painter"
- id = "decal_painter"
- build_type = AUTOLATHE | FABRICATOR
- materials = list(/datum/material/steel = 50, /datum/material/glass = 50)
- build_path = /obj/item/airlock_painter/decal
- category = list(DCAT_PAINTER)
- mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI
-
-/datum/design/airlock_painter/decal/tile
- name = "Tile Sprayer"
- id = "tile_sprayer"
- build_type = AUTOLATHE | FABRICATOR
- materials = list(/datum/material/steel = 50, /datum/material/glass = 50)
- build_path = /obj/item/airlock_painter/decal/tile
- category = list(DCAT_PAINTER)
- mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI
-
/datum/design/paint_sprayer
name = "Paint Sprayer"
id = "paint_sprayer"
@@ -996,14 +942,6 @@
build_path = /obj/item/chisel
category = list(DCAT_MISC_TOOL)
-/datum/design/control
- name = "Blast Door Controller"
- id = "blast"
- build_type = AUTOLATHE
- materials = list(/datum/material/steel = 100, /datum/material/glass = 50)
- build_path = /obj/item/assembly/control
- category = list(DCAT_ASSEMBLY)
-
/datum/design/razor
name = "Electric Razor"
id = "razor"
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 3e2e12c0209..f9556fdbd96 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -126,17 +126,6 @@
desc = "Allows for the construction of circuit boards used to build a prisoner management console."
id = "prisonmanage"
build_path = /obj/item/circuitboard/computer/prisoner
-/datum/design/board/mechacontrol
- name = "Circuit Board (Exosuit Control Console)"
- desc = "Allows for the construction of circuit boards used to build an exosuit control console."
- id = "mechacontrol"
- build_path = /obj/item/circuitboard/computer/mecha_control
-
-/datum/design/board/mechapower
- name = "Circuit Board (Mech Bay Power Control Console)"
- desc = "Allows for the construction of circuit boards used to build a mech bay power control console."
- id = "mechapower"
- build_path = /obj/item/circuitboard/computer/mech_bay_power_console
/datum/design/board/cargo
name = "Circuit Board (Supply Console)"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 9e470b2be66..184e508f3b9 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -214,13 +214,6 @@
build_path = /obj/item/circuitboard/machine/cyborgrecharger
mapload_design_flags = DESIGN_IMPRINTER
-/datum/design/board/mech_recharger
- name = "Machine Board (Mechbay Recharger Board)"
- desc = "The circuit board for a Mechbay Recharger."
- id = "mech_recharger"
- build_path = /obj/item/circuitboard/machine/mech_recharger
- mapload_design_flags = DESIGN_IMPRINTER
-
// /datum/design/board/dnascanner
// name = "Machine Board (DNA Scanner)"
// desc = "The circuit board for a DNA Scanner."
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
deleted file mode 100644
index 0687035ef37..00000000000
--- a/code/modules/research/designs/mecha_designs.dm
+++ /dev/null
@@ -1,490 +0,0 @@
-///////////////////////////////////
-//////////Mecha Module Disks///////
-///////////////////////////////////
-
-/datum/design/board/ripley_main
- name = "APLU \"Ripley\" Central Control module"
- desc = "Allows for the construction of a \"Ripley\" Central Control module."
- id = "ripley_main"
- build_path = /obj/item/circuitboard/mecha/ripley/main
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/ripley_peri
- name = "APLU \"Ripley\" Peripherals Control module"
- desc = "Allows for the construction of a \"Ripley\" Peripheral Control module."
- id = "ripley_peri"
- build_path = /obj/item/circuitboard/mecha/ripley/peripherals
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/odysseus_main
- name = "\"Odysseus\" Central Control module"
- desc = "Allows for the construction of a \"Odysseus\" Central Control module."
- id = "odysseus_main"
- build_path = /obj/item/circuitboard/mecha/odysseus/main
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/odysseus_peri
- name = "\"Odysseus\" Peripherals Control module"
- desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module."
- id = "odysseus_peri"
- build_path = /obj/item/circuitboard/mecha/odysseus/peripherals
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/gygax_main
- name = "\"Gygax\" Central Control module"
- desc = "Allows for the construction of a \"Gygax\" Central Control module."
- id = "gygax_main"
- build_path = /obj/item/circuitboard/mecha/gygax/main
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/gygax_peri
- name = "\"Gygax\" Peripherals Control module"
- desc = "Allows for the construction of a \"Gygax\" Peripheral Control module."
- id = "gygax_peri"
- build_path = /obj/item/circuitboard/mecha/gygax/peripherals
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/gygax_targ
- name = "\"Gygax\" Weapons & Targeting Control module"
- desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module."
- id = "gygax_targ"
- build_path = /obj/item/circuitboard/mecha/gygax/targeting
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/durand_main
- name = "\"Durand\" Central Control module"
- desc = "Allows for the construction of a \"Durand\" Central Control module."
- id = "durand_main"
- build_path = /obj/item/circuitboard/mecha/durand/main
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/durand_peri
- name = "\"Durand\" Peripherals Control module"
- desc = "Allows for the construction of a \"Durand\" Peripheral Control module."
- id = "durand_peri"
- build_path = /obj/item/circuitboard/mecha/durand/peripherals
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/durand_targ
- name = "\"Durand\" Weapons & Targeting Control module"
- desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module."
- id = "durand_targ"
- build_path = /obj/item/circuitboard/mecha/durand/targeting
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/honker_main
- name = "\"H.O.N.K\" Central Control module"
- desc = "Allows for the construction of a \"H.O.N.K\" Central Control module."
- id = "honker_main"
- build_path = /obj/item/circuitboard/mecha/honker/main
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/honker_peri
- name = "\"H.O.N.K\" Peripherals Control module"
- desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module."
- id = "honker_peri"
- build_path = /obj/item/circuitboard/mecha/honker/peripherals
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/honker_targ
- name = "\"H.O.N.K\" Weapons & Targeting Control module"
- desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module."
- id = "honker_targ"
- build_path = /obj/item/circuitboard/mecha/honker/targeting
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/phazon_main
- name = "\"Phazon\" Central Control module"
- desc = "Allows for the construction of a \"Phazon\" Central Control module."
- id = "phazon_main"
- materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100)
- build_path = /obj/item/circuitboard/mecha/phazon/main
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/phazon_peri
- name = "\"Phazon\" Peripherals Control module"
- desc = "Allows for the construction of a \"Phazon\" Peripheral Control module."
- id = "phazon_peri"
- materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100)
- build_path = /obj/item/circuitboard/mecha/phazon/peripherals
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/phazon_targ
- name = "\"Phazon\" Weapons & Targeting Control module"
- desc = "Allows for the construction of a \"Phazon\" Weapons & Targeting Control module."
- id = "phazon_targ"
- materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100)
- build_path = /obj/item/circuitboard/mecha/phazon/targeting
- category = list(DCAT_EXOSUIT_MOD)
- mapload_design_flags = NONE
-
-/datum/design/board/clarke_main
- name = "\"Clarke\" Central Control module"
- desc = "Allows for the construction of a \"Clarke\" Central Control module."
- id = "clarke_main"
- build_path = /obj/item/circuitboard/mecha/clarke/main
- category = list(DCAT_EXOSUIT_MOD)
-
-/datum/design/board/clarke_peri
- name = "\"Clarke\" Peripherals Control module"
- desc = "Allows for the construction of a \"Clarke\" Peripheral Control module."
- id = "clarke_peri"
- build_path = /obj/item/circuitboard/mecha/clarke/peripherals
- category = list(DCAT_EXOSUIT_MOD)
-
-/datum/design/board/savannah_ivanov_main
- name = "\"Savannah-Ivanov\" Central Control module"
- desc = "Allows for the construction of a \"Savannah-Ivanov\" Central Control module."
- id = "savannah_ivanov_main"
- build_path = /obj/item/circuitboard/mecha/savannah_ivanov/main
- category = list(DCAT_EXOSUIT_MOD)
-
-/datum/design/board/savannah_ivanov_peri
- name = "\"Savannah-Ivanov\" Peripherals Control module"
- desc = "Allows for the construction of a \"Savannah-Ivanov\" Peripheral Control module."
- id = "savannah_ivanov_peri"
- build_path = /obj/item/circuitboard/mecha/savannah_ivanov/peripherals
- category = list(DCAT_EXOSUIT_MOD)
-
-/datum/design/board/savannah_ivanov_targ
- name = "\"Savannah-Ivanov\" Weapons & Targeting Control module"
- desc = "Allows for the construction of a \"Savannah-Ivanov\" Weapons & Targeting Control module."
- id = "savannah_ivanov_targ"
- build_path = /obj/item/circuitboard/mecha/savannah_ivanov/targeting
- category = list(DCAT_EXOSUIT_MOD)
-
-////////////////////////////////////////
-/////////// Mecha Equpment /////////////
-////////////////////////////////////////
-
-/datum/design/mech_scattershot
- name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")"
- desc = "Allows for the construction of LBX AC 10."
- id = "mech_scattershot"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_scattershot_ammo
- name = "LBX AC 10 Scattershot Ammunition"
- desc = "Ammunition for the LBX AC 10 exosuit weapon."
- id = "mech_scattershot_ammo"
- build_type = FABRICATOR | MECHFAB
- build_path = /obj/item/mecha_ammo/scattershot
- materials = list(/datum/material/steel=6000)
- construction_time = 20
- category = list(DCAT_AMMO)
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/mech_carbine
- name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
- desc = "Allows for the construction of FNX-99 \"Hades\" Carbine."
- id = "mech_carbine"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_carbine_ammo
- name = "FNX-99 Carbine Ammunition"
- desc = "Ammunition for the FNX-99 \"Hades\" Carbine."
- id = "mech_carbine_ammo"
- build_type = FABRICATOR | MECHFAB
- build_path = /obj/item/mecha_ammo/incendiary
- materials = list(/datum/material/steel=6000)
- construction_time = 20
- category = list(DCAT_AMMO)
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/mech_ion
- name = "Exosuit Weapon (MKIV Ion Heavy Cannon)"
- desc = "Allows for the construction of MKIV Ion Heavy Cannon."
- id = "mech_ion"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
- materials = list(/datum/material/steel=20000,/datum/material/silver=6000,/datum/material/uranium=2000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
-
-/datum/design/mech_tesla
- name = "Exosuit Weapon (MKI Tesla Cannon)"
- desc = "Allows for the construction of MKI Tesla Cannon."
- id = "mech_tesla"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
- materials = list(/datum/material/steel=20000,/datum/material/silver=8000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
-
-/datum/design/mech_laser
- name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)"
- desc = "Allows for the construction of CH-PS Laser."
- id = "mech_laser"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_laser_heavy
- name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)"
- desc = "Allows for the construction of CH-LC Laser Cannon."
- id = "mech_laser_heavy"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_disabler
- name = "Exosuit Weapon (CH-DS \"Peacemaker\" Disabler)"
- desc = "Allows for the construction of CH-DS Disabler."
- id = "mech_disabler"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_grenade_launcher
- name = "Exosuit Weapon (SGL-6 Grenade Launcher)"
- desc = "Allows for the construction of SGL-6 Grenade Launcher."
- id = "mech_grenade_launcher"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang
- materials = list(/datum/material/steel=22000,/datum/material/gold=6000,/datum/material/silver=8000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_grenade_launcher_ammo
- name = "SGL-6 Grenade Launcher Ammunition"
- desc = "Ammunition for the SGL-6 Grenade Launcher."
- id = "mech_grenade_launcher_ammo"
- build_type = FABRICATOR | MECHFAB
- build_path = /obj/item/mecha_ammo/flashbang
- materials = list(/datum/material/steel=4000,/datum/material/gold=500,/datum/material/steel=500)
- construction_time = 20
- category = list(DCAT_AMMO)
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/mech_missile_rack
- name = "Exosuit Weapon (BRM-6 Missile Rack)"
- desc = "Allows for the construction of an BRM-6 Breaching Missile Rack."
- id = "mech_missile_rack"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
- materials = list(/datum/material/steel=22000,/datum/material/gold=6000,/datum/material/silver=8000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_missile_rack_ammo
- name = "SRM-8 Missile Rack Ammunition"
- desc = "Ammunition for the SRM-8 Missile Rack."
- id = "mech_missile_rack_ammo"
- build_type = FABRICATOR | MECHFAB
- build_path = /obj/item/mecha_ammo/missiles_br
- materials = list(/datum/material/steel=8000,/datum/material/gold=500,/datum/material/steel=500)
- construction_time = 20
- category = list(DCAT_AMMO)
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/clusterbang_launcher
- name = "Exosuit Weapon (SOB-3 Clusterbang Launcher)"
- desc = "A weapon that violates the Geneva Convention at 3 rounds per minute"
- id = "clusterbang_launcher"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang
- materials = list(/datum/material/steel=20000,/datum/material/gold=10000,/datum/material/uranium=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/clusterbang_launcher_ammo
- name = "SOB-3 Clusterbang Launcher Ammunition"
- desc = "Ammunition for the SOB-3 Clusterbang Launcher"
- id = "clusterbang_launcher_ammo"
- build_type = FABRICATOR | MECHFAB
- build_path = /obj/item/mecha_ammo/clusterbang
- materials = list(/datum/material/steel=6000,/datum/material/gold=1500,/datum/material/uranium=1500)
- construction_time = 20
- category = list(DCAT_AMMO)
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/mech_teleporter
- name = "Exosuit Module (Teleporter Module)"
- desc = "An exosuit module that allows exosuits to teleport to any position in view."
- id = "mech_teleporter"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
- materials = list(/datum/material/steel=10000,/datum/material/diamond=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_rcd
- name = "Exosuit Module (RCD Module)"
- desc = "An exosuit-mounted Rapid Construction Device."
- id = "mech_rcd"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/rcd
- materials = list(/datum/material/steel=30000,/datum/material/gold=20000,/datum/material/plasma=25000,/datum/material/silver=20000)
- construction_time = 1200
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_thrusters
- name = "Exosuit Module (RCS Thruster Package)"
- desc = "A thruster package for exosuits. Expells gas from the internal life-support air tank to generate thrust."
- id = "mech_thrusters"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas
- materials = list(/datum/material/steel=25000,/datum/material/titanium=5000,/datum/material/silver=3000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_gravcatapult
- name = "Exosuit Module (Gravitational Catapult Module)"
- desc = "An exosuit mounted Gravitational Catapult."
- id = "mech_gravcatapult"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_repair_droid
- name = "Exosuit Module (Repair Droid Module)"
- desc = "Automated Repair Droid. BEEP BOOP"
- id = "mech_repair_droid"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
- materials = list(/datum/material/steel=10000,/datum/material/glass = 5000,/datum/material/gold=1000,/datum/material/silver=2000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_ccw_armor
- name = "Exosuit Module (Reactive Armor Booster Module)"
- desc = "Exosuit-mounted melee armor booster."
- id = "mech_ccw_armor"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster
- materials = list(/datum/material/steel=20000,/datum/material/silver=5000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_proj_armor
- name = "Exosuit Module (Reflective Armor Booster Module)"
- desc = "Exosuit-mounted ranged armor booster."
- id = "mech_proj_armor"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster
- materials = list(/datum/material/steel=20000,/datum/material/gold=5000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_diamond_drill
- name = "Exosuit Mining (Diamond Mining Drill)"
- desc = "An upgraded version of the standard drill."
- id = "mech_diamond_drill"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
- materials = list(/datum/material/steel=10000,/datum/material/diamond=6500)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_plasma_cutter
- name = "Exosuit Mining (217-D Heavy Plasma Cutter)"
- desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
- id = "mech_plasma_cutter"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
- materials = list(/datum/material/steel = 8000, /datum/material/glass = 1000, /datum/material/plasma = 2000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_lmg
- name = "Exosuit Weapon (\"Ultra AC 2\" LMG)"
- desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst."
- id = "mech_lmg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_lmg_ammo
- name = "Ultra AC 2 Ammunition"
- desc = "Ammunition for the Ultra AC 2 LMG"
- id = "mech_lmg_ammo"
- build_type = FABRICATOR | MECHFAB
- build_path = /obj/item/mecha_ammo/lmg
- materials = list(/datum/material/steel=4000)
- construction_time = 20
- category = list(DCAT_AMMO)
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/mech_sleeper
- name = "Exosuit Medical (Mounted Sleeper)"
- desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
- id = "mech_sleeper"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper
- materials = list(/datum/material/steel=5000, /datum/material/glass = 10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_syringe_gun
- name = "Exosuit Medical (Syringe Gun)"
- desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur."
- id = "mech_syringe_gun"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun
- materials = list(/datum/material/steel=3000, /datum/material/glass = 2000)
- construction_time = 200
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_medical_beamgun
- name = "Exosuit Medical (Medical Beamgun)"
- desc = "Equipment for medical exosuits. A mounted medical nanite projector which will treat patients with a focused beam."
- id = "mech_medi_beam"
- build_type = MECHFAB
- materials = list(/datum/material/steel = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000)
- construction_time = 250
- build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 0095bd4ea74..963422bdeb7 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -131,717 +131,6 @@
category = list(DCAT_CYBORG)
mapload_design_flags = DESIGN_FAB_ROBOTICS
-//Ripley
-/datum/design/ripley_chassis
- name = "Exosuit Chassis (APLU \"Ripley\")"
- id = "ripley_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/ripley
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_RIPLEY)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/ripley_torso
- name = "Exosuit Torso (APLU \"Ripley\")"
- id = "ripley_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/ripley_torso
- materials = list(/datum/material/steel=20000,/datum/material/glass = 7500)
- construction_time = 200
- category = list(DCAT_RIPLEY)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/ripley_left_arm
- name = "Exosuit Left Arm (APLU \"Ripley\")"
- id = "ripley_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/ripley_left_arm
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_RIPLEY)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/ripley_right_arm
- name = "Exosuit Right Arm (APLU \"Ripley\")"
- id = "ripley_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/ripley_right_arm
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_RIPLEY)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/ripley_left_leg
- name = "Exosuit Left Leg (APLU \"Ripley\")"
- id = "ripley_left_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/ripley_left_leg
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_RIPLEY)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/ripley_right_leg
- name = "Exosuit Right Leg (APLU \"Ripley\")"
- id = "ripley_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/ripley_right_leg
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_RIPLEY)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-//Odysseus
-/datum/design/odysseus_chassis
- name = "Exosuit Chassis (\"Odysseus\")"
- id = "odysseus_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/odysseus
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/odysseus_torso
- name = "Exosuit Torso (\"Odysseus\")"
- id = "odysseus_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/odysseus_torso
- materials = list(/datum/material/steel=12000)
- construction_time = 180
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/odysseus_head
- name = "Exosuit Head (\"Odysseus\")"
- id = "odysseus_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/odysseus_head
- materials = list(/datum/material/steel=6000,/datum/material/glass = 10000)
- construction_time = 100
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/odysseus_left_arm
- name = "Exosuit Left Arm (\"Odysseus\")"
- id = "odysseus_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/odysseus_left_arm
- materials = list(/datum/material/steel=6000)
- construction_time = 120
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/odysseus_right_arm
- name = "Exosuit Right Arm (\"Odysseus\")"
- id = "odysseus_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/odysseus_right_arm
- materials = list(/datum/material/steel=6000)
- construction_time = 120
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/odysseus_left_leg
- name = "Exosuit Left Leg (\"Odysseus\")"
- id = "odysseus_left_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/odysseus_left_leg
- materials = list(/datum/material/steel=7000)
- construction_time = 130
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/odysseus_right_leg
- name = "Exosuit Right Leg (\"Odysseus\")"
- id = "odysseus_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/odysseus_right_leg
- materials = list(/datum/material/steel=7000)
- construction_time = 130
- category = list(DCAT_ODYSSEUS)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-//Gygax
-/datum/design/gygax_chassis
- name = "Exosuit Chassis (\"Gygax\")"
- id = "gygax_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/gygax
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_torso
- name = "Exosuit Torso (\"Gygax\")"
- id = "gygax_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_torso
- materials = list(/datum/material/steel=20000,/datum/material/glass = 10000,/datum/material/gold=2000, /datum/material/silver=2000)
- construction_time = 300
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_head
- name = "Exosuit Head (\"Gygax\")"
- id = "gygax_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_head
- materials = list(/datum/material/steel=10000,/datum/material/glass = 5000, /datum/material/gold=2000, /datum/material/silver=2000)
- construction_time = 200
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_left_arm
- name = "Exosuit Left Arm (\"Gygax\")"
- id = "gygax_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_left_arm
- materials = list(/datum/material/steel=15000, /datum/material/gold=1000, /datum/material/silver=1000)
- construction_time = 200
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_right_arm
- name = "Exosuit Right Arm (\"Gygax\")"
- id = "gygax_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_right_arm
- materials = list(/datum/material/steel=15000, /datum/material/gold=1000, /datum/material/silver=1000)
- construction_time = 200
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_left_leg
- name = "Exosuit Left Leg (\"Gygax\")"
- id = "gygax_left_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_left_leg
- materials = list(/datum/material/steel=15000, /datum/material/gold=2000, /datum/material/silver=2000)
- construction_time = 200
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_right_leg
- name = "Exosuit Right Leg (\"Gygax\")"
- id = "gygax_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_right_leg
- materials = list(/datum/material/steel=15000, /datum/material/gold=2000, /datum/material/silver=2000)
- construction_time = 200
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/gygax_armor
- name = "Exosuit Armor (\"Gygax\")"
- id = "gygax_armor"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/gygax_armor
- materials = list(/datum/material/steel=15000,/datum/material/gold=10000, /datum/material/silver=10000, /datum/material/titanium=10000)
- construction_time = 600
- category = list(DCAT_GYGAX)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-//Durand
-/datum/design/durand_chassis
- name = "Exosuit Chassis (\"Durand\")"
- id = "durand_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/durand
- materials = list(/datum/material/steel=25000)
- construction_time = 100
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_torso
- name = "Exosuit Torso (\"Durand\")"
- id = "durand_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_torso
- materials = list(/datum/material/steel=25000, /datum/material/glass = 10000,/datum/material/silver=10000)
- construction_time = 300
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_head
- name = "Exosuit Head (\"Durand\")"
- id = "durand_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_head
- materials = list(/datum/material/steel=10000,/datum/material/glass = 15000,/datum/material/silver=2000)
- construction_time = 200
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_left_arm
- name = "Exosuit Left Arm (\"Durand\")"
- id = "durand_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_left_arm
- materials = list(/datum/material/steel=10000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_right_arm
- name = "Exosuit Right Arm (\"Durand\")"
- id = "durand_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_right_arm
- materials = list(/datum/material/steel=10000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_left_leg
- name = "Exosuit Left Leg (\"Durand\")"
- id = "durand_left_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_left_leg
- materials = list(/datum/material/steel=15000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_right_leg
- name = "Exosuit Right Leg (\"Durand\")"
- id = "durand_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_right_leg
- materials = list(/datum/material/steel=15000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/durand_armor
- name = "Exosuit Armor (\"Durand\")"
- id = "durand_armor"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/durand_armor
- materials = list(/datum/material/steel=30000,/datum/material/uranium=25000,/datum/material/titanium=20000)
- construction_time = 600
- category = list(DCAT_DURAND)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-//H.O.N.K
-/datum/design/honk_chassis
- name = "Exosuit Chassis (\"H.O.N.K\")"
- id = "honk_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/honker
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/honk_torso
- name = "Exosuit Torso (\"H.O.N.K\")"
- id = "honk_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/honker_torso
- materials = list(/datum/material/steel=20000,/datum/material/glass = 10000,/datum/material/bananium=10000)
- construction_time = 300
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/honk_head
- name = "Exosuit Head (\"H.O.N.K\")"
- id = "honk_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/honker_head
- materials = list(/datum/material/steel=10000,/datum/material/glass = 5000,/datum/material/bananium=5000)
- construction_time = 200
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/honk_left_arm
- name = "Exosuit Left Arm (\"H.O.N.K\")"
- id = "honk_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/honker_left_arm
- materials = list(/datum/material/steel=15000,/datum/material/bananium=5000)
- construction_time = 200
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/honk_right_arm
- name = "Exosuit Right Arm (\"H.O.N.K\")"
- id = "honk_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/honker_right_arm
- materials = list(/datum/material/steel=15000,/datum/material/bananium=5000)
- construction_time = 200
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/honk_left_leg
- name = "Exosuit Left Leg (\"H.O.N.K\")"
- id = "honk_left_leg"
- build_type = MECHFAB
- build_path =/obj/item/mecha_parts/part/honker_left_leg
- materials = list(/datum/material/steel=20000,/datum/material/bananium=5000)
- construction_time = 200
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/honk_right_leg
- name = "Exosuit Right Leg (\"H.O.N.K\")"
- id = "honk_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/honker_right_leg
- materials = list(/datum/material/steel=20000,/datum/material/bananium=5000)
- construction_time = 200
- category = list(DCAT_HONK)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-
-//Phazon
-/datum/design/phazon_chassis
- name = "Exosuit Chassis (\"Phazon\")"
- id = "phazon_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/phazon
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_torso
- name = "Exosuit Torso (\"Phazon\")"
- id = "phazon_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_torso
- materials = list(/datum/material/steel=35000,/datum/material/glass = 10000,/datum/material/plasma=20000)
- construction_time = 300
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_head
- name = "Exosuit Head (\"Phazon\")"
- id = "phazon_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_head
- materials = list(/datum/material/steel=15000,/datum/material/glass = 5000,/datum/material/plasma=10000)
- construction_time = 200
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_left_arm
- name = "Exosuit Left Arm (\"Phazon\")"
- id = "phazon_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_left_arm
- materials = list(/datum/material/steel=20000,/datum/material/plasma=10000)
- construction_time = 200
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_right_arm
- name = "Exosuit Right Arm (\"Phazon\")"
- id = "phazon_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_right_arm
- materials = list(/datum/material/steel=20000,/datum/material/plasma=10000)
- construction_time = 200
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_left_leg
- name = "Exosuit Left Leg (\"Phazon\")"
- id = "phazon_left_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_left_leg
- materials = list(/datum/material/steel=20000,/datum/material/plasma=10000)
- construction_time = 200
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_right_leg
- name = "Exosuit Right Leg (\"Phazon\")"
- id = "phazon_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_right_leg
- materials = list(/datum/material/steel=20000,/datum/material/plasma=10000)
- construction_time = 200
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/phazon_armor
- name = "Exosuit Armor (\"Phazon\")"
- id = "phazon_armor"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/phazon_armor
- materials = list(/datum/material/steel=25000,/datum/material/plasma=20000,/datum/material/titanium=20000)
- construction_time = 300
- category = list(DCAT_PHAZON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-//Savannah-Ivanov
-/datum/design/savannah_ivanov_chassis
- name = "Exosuit Chassis (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/savannah_ivanov
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_torso
- name = "Exosuit Torso (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_torso
- materials = list(/datum/material/steel=20000,/datum/material/glass = 7500)
- construction_time = 200
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_head
- name = "Exosuit Head (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_head
- materials = list(/datum/material/steel=6000,/datum/material/glass = 10000)
- construction_time = 100
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_left_arm
- name = "Exosuit Left Arm (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_arm
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_right_arm
- name = "Exosuit Right Arm (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_arm
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_chassis
- name = "Exosuit Chassis (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/savannah_ivanov
- materials = list(/datum/material/steel=25000)
- construction_time = 100
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_torso
- name = "Exosuit Torso (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_torso
- materials = list(/datum/material/steel=25000, /datum/material/glass = 10000,/datum/material/silver=10000)
- construction_time = 300
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_head
- name = "Exosuit Head (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_head
- materials = list(/datum/material/steel=10000,/datum/material/glass = 15000,/datum/material/silver=2000)
- construction_time = 200
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_left_arm
- name = "Exosuit Left Arm (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_arm
- materials = list(/datum/material/steel=10000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_right_arm
- name = "Exosuit Right Arm (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_arm
- materials = list(/datum/material/steel=10000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_left_leg
- name = "Exosuit Left Leg (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_left_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_leg
- materials = list(/datum/material/steel=15000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_right_leg
- name = "Exosuit Right Leg (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_right_leg"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_leg
- materials = list(/datum/material/steel=15000,/datum/material/silver=4000)
- construction_time = 200
- category = list(DCAT_SAVANNAH)
-
-/datum/design/savannah_ivanov_armor
- name = "Exosuit Armor (\"Savannah-Ivanov\")"
- id = "savannah_ivanov_armor"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/savannah_ivanov_armor
- materials = list(/datum/material/steel=30000,/datum/material/uranium=25000,/datum/material/titanium=20000)
- construction_time = 600
- category = list(DCAT_SAVANNAH)
-
-//Clarke
-/datum/design/clarke_chassis
- name = "Exosuit Chassis (\"Clarke\")"
- id = "clarke_chassis"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/clarke
- materials = list(/datum/material/steel=20000)
- construction_time = 100
- category = list(DCAT_CLARKE)
-
-/datum/design/clarke_torso
- name = "Exosuit Torso (\"Clarke\")"
- id = "clarke_torso"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/clarke_torso
- materials = list(/datum/material/steel=20000,/datum/material/glass = 7500)
- construction_time = 200
- category = list(DCAT_CLARKE)
-
-/datum/design/clarke_head
- name = "Exosuit Head (\"Clarke\")"
- id = "clarke_head"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/clarke_head
- materials = list(/datum/material/steel=6000,/datum/material/glass = 10000)
- construction_time = 100
- category = list(DCAT_CLARKE)
-
-/datum/design/clarke_left_arm
- name = "Exosuit Left Arm (\"Clarke\")"
- id = "clarke_left_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/clarke_left_arm
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_CLARKE)
-
-/datum/design/clarke_right_arm
- name = "Exosuit Right Arm (\"Clarke\")"
- id = "clarke_right_arm"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/clarke_right_arm
- materials = list(/datum/material/steel=15000)
- construction_time = 150
- category = list(DCAT_CLARKE)
-
-//Exosuit Equipment
-/datum/design/ripleyupgrade
- name = "Ripley MK-I to MK-II conversion kit"
- id = "ripleyupgrade"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/ripleyupgrade
- materials = list(/datum/material/steel=10000,/datum/material/plasma=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_hydraulic_clamp
- name = "Exosuit Engineering (Hydraulic Clamp)"
- id = "mech_hydraulic_clamp"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_drill
- name = "Exosuit Mining (Mining Drill)"
- id = "mech_drill"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/drill
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_mining_scanner
- name = "Exosuit Engineering (Mining Scanner)"
- id = "mech_mscanner"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner
- materials = list(/datum/material/steel=5000,/datum/material/glass = 2500)
- construction_time = 50
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_extinguisher
- name = "Exosuit Engineering (Extinguisher)"
- id = "mech_extinguisher"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher
- materials = list(/datum/material/steel=10000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_generator
- name = "Exosuit Module (Plasma Generator)"
- id = "mech_generator"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/generator
- materials = list(/datum/material/steel=10000,/datum/material/glass = 1000,/datum/material/silver=2000,/datum/material/plasma=5000)
- construction_time = 100
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_mousetrap_mortar
- name = "H.O.N.K Weapon (Mousetrap Mortar)"
- id = "mech_mousetrap_mortar"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar
- materials = list(/datum/material/steel=20000,/datum/material/bananium=5000)
- construction_time = 300
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_banana_mortar
- name = "H.O.N.K Weapon (Banana Mortar)"
- id = "mech_banana_mortar"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar
- materials = list(/datum/material/steel=20000,/datum/material/bananium=5000)
- construction_time = 300
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_honker
- name = "H.O.N.K Weapon (HoNkER BlAsT 5000)"
- id = "mech_honker"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker
- materials = list(/datum/material/steel=20000,/datum/material/bananium=10000)
- construction_time = 500
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mech_punching_glove
- name = "H.O.N.K Weapon (Oingo Boingo Punch-face)"
- id = "mech_punching_face"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove
- materials = list(/datum/material/steel=20000,/datum/material/bananium=7500)
- construction_time = 400
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
/////////////////////////////////////////
//////////////Borg Upgrades//////////////
@@ -1079,25 +368,6 @@
mapload_design_flags = DESIGN_FAB_ROBOTICS
//Misc
-/datum/design/mecha_tracking
- name = "Exosuit Tracker (Exosuit Tracking Beacon)"
- id = "mecha_tracking"
- build_type = MECHFAB
- build_path =/obj/item/mecha_parts/mecha_tracking
- materials = list(/datum/material/steel=500)
- construction_time = 50
- category = list(DCAT_MECHA_OBJ)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
-
-/datum/design/mecha_tracking_ai_control
- name = "AI Control Beacon"
- id = "mecha_tracking_ai_control"
- build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_tracking/ai_control
- materials = list(/datum/material/steel = 1000, /datum/material/glass = 500, /datum/material/silver = 200)
- construction_time = 50
- category = list(DCAT_SILICON)
- mapload_design_flags = DESIGN_FAB_ROBOTICS
/datum/design/synthetic_flash
name = "Flash"
@@ -1371,13 +641,6 @@
build_path = /obj/item/mod/module/gps
department_type = MODULE_SUPPLY
-/datum/design/module/mod_constructor
- name = "MOD Module: Constructor"
- id = "mod_constructor"
- materials = list(/datum/material/steel = 1000, /datum/material/titanium = 500)
- build_path = /obj/item/mod/module/constructor
- department_type = MODULE_ENGINEERING
-
/datum/design/module/mod_quick_carry
name = "MOD Module: Quick Carry"
id = "mod_quick_carry"
diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm
index 7c5d5de4ea7..986e6f901b6 100644
--- a/code/modules/research/designs/tool_designs.dm
+++ b/code/modules/research/designs/tool_designs.dm
@@ -33,15 +33,6 @@
category = list(DCAT_BASIC_TOOL)
mapload_design_flags = DESIGN_FAB_ENGINEERING
-/datum/design/rpd
- name = "Rapid Pipe Dispenser (RPD)"
- id = "rpd_loaded"
- build_type = FABRICATOR
- materials = list(/datum/material/steel = 75000, /datum/material/glass = 37500)
- build_path = /obj/item/pipe_dispenser
- category = list(DCAT_CONSTRUCTION)
- mapload_design_flags = DESIGN_FAB_ENGINEERING
-
/datum/design/wirebrush
name = "Wirebrush"
desc = "A tool to remove rust from walls."
diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm
index 7d078111e6f..8e6b0319436 100644
--- a/code/modules/research/designs/wiremod_designs.dm
+++ b/code/modules/research/designs/wiremod_designs.dm
@@ -486,18 +486,6 @@
build_type = FABRICATOR | COMPONENT_PRINTER
category = list(DCAT_WIREMOD, "Shells")
-/datum/design/airlock_shell
- name = "Airlock Shell"
- desc = "A door shell that cannot be moved around when assembled."
- id = "door_shell"
- materials = list(
- /datum/material/glass = 5000,
- /datum/material/steel = 15000,
- )
- build_path = /obj/item/shell/airlock
- build_type = FABRICATOR | COMPONENT_PRINTER
- category = list(DCAT_WIREMOD, "Shells")
-
/datum/design/dispenser_shell
name = "Dispenser Shell"
desc = "A dispenser shell that can dispense items."
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index c33905ca8f4..6f10641f2bc 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -304,17 +304,3 @@ Chilling extracts:
user.visible_message(span_notice("[src] blooms into a beautiful flower!"))
new /obj/item/clothing/head/peaceflower(get_turf(user))
..()
-
-/obj/item/slimecross/chilling/rainbow
- colour = "rainbow"
- effect_desc = "Makes an unpassable wall in every door in the area."
-
-/obj/item/slimecross/chilling/rainbow/do_effect(mob/user)
- var/area/area = get_area(user)
- if(area.outdoors)
- to_chat(user, span_warning("[src] can't affect such a large area."))
- return
- user.visible_message(span_warning("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!"))
- for(var/obj/machinery/door/airlock/door in area)
- new /obj/effect/forcefield/slimewall/rainbow(door.loc)
- return ..()
diff --git a/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm b/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm
index db81d763b5f..a8dd7e4ec15 100644
--- a/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm
+++ b/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm
@@ -29,14 +29,6 @@
/datum/keycard_auth_action/red_alert/trigger()
set_security_level(SEC_LEVEL_RED)
-/datum/keycard_auth_action/emergency_maintenance
- name = "Emergency Maintenance Access"
- ui_icon = "wrench"
-
-/datum/keycard_auth_action/emergency_maintenance/trigger()
- make_maint_all_access()
-
-
/datum/keycard_auth_action/bsa_firing_toggle
name = "Bluespace Artillery Unlock"
ui_icon = "meteor"
@@ -48,4 +40,3 @@
GLOB.bsa_unlock = !GLOB.bsa_unlock
minor_announce("Bluespace Artillery firing protocols have been [GLOB.bsa_unlock? "unlocked" : "locked"]", "Weapons Systems Update:")
SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("bluespace artillery", GLOB.bsa_unlock? "unlocked" : "locked"))
-
diff --git a/code/modules/security_levels/keycard_auth/keycard_authentication.dm b/code/modules/security_levels/keycard_auth/keycard_authentication.dm
index d60f25d4553..213865adcd9 100644
--- a/code/modules/security_levels/keycard_auth/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_auth/keycard_authentication.dm
@@ -62,7 +62,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26)
data["waiting"] = waiting
data["auth_required"] = event_source ? event_source.event : 0
data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0
- data["emergency_maint"] = GLOB.emergency_access
data["bsa_unlock"] = GLOB.bsa_unlock
return data
@@ -144,29 +143,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26)
deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer, message_type=DEADCHAT_ANNOUNCEMENT)
event.trigger()
-GLOBAL_VAR_INIT(emergency_access, FALSE)
-/proc/make_maint_all_access()
- for(var/area/station/maintenance/A in GLOB.areas)
- for(var/turf/in_area as anything in A.get_contained_turfs())
- for(var/obj/machinery/door/airlock/D in in_area)
- D.emergency = TRUE
- D.update_icon(ALL, 0)
-
- minor_announce("Access restrictions on maintenance and external airlocks have been lifted.", "Attention! Station-wide emergency declared!",1)
- GLOB.emergency_access = TRUE
- SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled"))
-
-/proc/revoke_maint_all_access()
- for(var/area/station/maintenance/A in GLOB.areas)
- for(var/turf/in_area as anything in A.get_contained_turfs())
- for(var/obj/machinery/door/airlock/D in in_area)
- D.emergency = FALSE
- D.update_icon(ALL, 0)
- minor_announce("Access restrictions in maintenance areas have been restored.", "Attention! Station-wide emergency rescinded:")
- GLOB.emergency_access = FALSE
- SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled"))
-
-
#undef KEYCARD_RED_ALERT
#undef KEYCARD_EMERGENCY_MAINTENANCE_ACCESS
#undef KEYCARD_BSA_UNLOCK
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 6f8523837eb..259eeb675e7 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -170,30 +170,6 @@ All ShuttleMove procs go here
/************************************Machinery move procs************************************/
-/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
- . = ..()
- for(var/obj/machinery/door/airlock/other_airlock in range(2, src)) // includes src, extended because some escape pods have 1 plating turf exposed to space
- other_airlock.shuttledocked = FALSE
- other_airlock.air_tight = TRUE
- spawn(-1)
- if((other_airlock.close(FALSE, TRUE) || other_airlock.density) && other_airlock == src && moving_dock.bolt_doors) // force crush
- if(locate(/turf/open/space) in orange(1, other_airlock))
- other_airlock.bolt()
-
-/obj/machinery/door/airlock/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock)
- . = ..()
- if(istype(old_dock, /obj/docking_port/stationary/transit) && locked && moving_dock.bolt_doors)
- unbolt()
-
-/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
- . = ..()
- var/current_area = get_area(src)
- for(var/obj/machinery/door/airlock/other_airlock in orange(2, src)) // does not include src, extended because some escape pods have 1 plating turf exposed to space
- if(get_area(other_airlock) != current_area) // does not include double-wide airlocks unless actually docked
- // Cycle linking is only disabled if we are actually adjacent to another airlock
- shuttledocked = TRUE
- other_airlock.shuttledocked = TRUE
-
/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
@@ -204,10 +180,6 @@ All ShuttleMove procs go here
. = ..()
GLOB.cameranet.addCamera(src)
-/obj/machinery/mech_bay_recharge_port/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
- . = ..()
- recharging_turf = get_step(loc, dir)
-
/obj/machinery/computer/auxiliary_base/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(is_mining_level(z)) //Avoids double logging and landing on other Z-levels due to badminnery
@@ -306,11 +278,6 @@ All ShuttleMove procs go here
/************************************Structure move procs************************************/
-/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
- . = ..()
- if(. & MOVE_AREA)
- . |= MOVE_CONTENTS
-
/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
. = ..()
if(. & MOVE_AREA)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 24d46ac05fe..9a4d048dcbd 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -678,8 +678,6 @@
return ripple_turfs
/obj/docking_port/mobile/proc/check_poddoors()
- for(var/obj/machinery/door/poddoor/shuttledock/pod in INSTANCES_OF(/obj/machinery/door))
- pod.check()
/obj/docking_port/mobile/proc/dock_id(id)
var/port = SSshuttle.getDock(id)
@@ -934,11 +932,6 @@
if(engines.len > 0)
distant_source = engines[1]
- else
- for(var/A in areas)
- distant_source = locate(/obj/machinery/door) in A
- if(distant_source)
- break
if(distant_source)
for(var/mob/M in SSmobs.clients_by_zlevel[z])
diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm
index 26e92d00bc3..00561c9a883 100644
--- a/code/modules/shuttle/shuttle_rotate.dm
+++ b/code/modules/shuttle/shuttle_rotate.dm
@@ -106,14 +106,6 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
params = NONE
return ..()
-/obj/machinery/door/airlock/shuttleRotate(rotation, params)
- . = ..()
- if(cyclelinkeddir && (params & ROTATE_DIR))
- cyclelinkeddir = angle2dir(rotation+dir2angle(cyclelinkeddir))
- // If we update the linked airlock here, the partner airlock might
- // not be present yet, so don't do that. Just assume we're still
- // partnered with the same airlock as before.
-
/obj/machinery/porta_turret/shuttleRotate(rotation, params)
. = ..()
if(wall_turret_direction && (params & ROTATE_DIR))
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 1aceac6b349..0c1f725656e 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/obj/effect/portal,
/obj/structure/extraction_point,
/obj/machinery/syndicatebomb,
- /obj/item/hilbertshotel,
/obj/item/swapper,
/obj/docking_port,
/obj/machinery/launchpad,
diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm
index 80baa734ade..8908a5b0ec0 100644
--- a/code/modules/spells/spell_types/right_and_wrong.dm
+++ b/code/modules/spells/spell_types/right_and_wrong.dm
@@ -70,10 +70,8 @@ GLOBAL_LIST_INIT(summoned_magic, list(
/obj/item/gun/magic/wand/resurrection,
/obj/item/gun/magic/wand/polymorph,
/obj/item/gun/magic/wand/teleport,
- /obj/item/gun/magic/wand/door,
/obj/item/gun/magic/wand/fireball,
/obj/item/gun/magic/staff/healing,
- /obj/item/gun/magic/staff/door,
/obj/item/scrying,
/obj/item/warpwhistle))
diff --git a/code/modules/spooky/abilities/knock_on_window_or_door.dm b/code/modules/spooky/abilities/knock_on_window_or_door.dm
deleted file mode 100644
index dd948953d12..00000000000
--- a/code/modules/spooky/abilities/knock_on_window_or_door.dm
+++ /dev/null
@@ -1,24 +0,0 @@
-/datum/action/cooldown/knock_sound
- name = "Knock"
- desc = "Create an audio phenomena centered on a door or window."
-
- click_to_activate = TRUE
- cooldown_time = 120 SECONDS
- write_log = TRUE
- ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi'
-
-/datum/action/cooldown/knock_sound/is_valid_target(atom/cast_on)
- return istype(cast_on, /obj/structure/window) || istype(cast_on, /obj/machinery/door)
-
-/datum/action/cooldown/knock_sound/Activate(atom/target)
- . = ..()
- if(istype(target, /obj/machinery/door))
- var/obj/machinery/door/D = target
- D.knock_on()
-
- else if(istype(target, /obj/structure/window))
- var/obj/structure/window/W = target
- W.knock_on()
-
- RECORD_GHOST_POWER(src)
-
diff --git a/code/modules/spooky/abilities/shatter_glass.dm b/code/modules/spooky/abilities/shatter_glass.dm
deleted file mode 100644
index b56c7da3024..00000000000
--- a/code/modules/spooky/abilities/shatter_glass.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/datum/action/cooldown/shatter_glass
- name = "Resonance"
- desc = "Vibrate a nearby glass object enough to cause integrity failure."
-
- click_to_activate = TRUE
- cooldown_time = 30 MINUTES
- write_log = TRUE
- ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi'
-
-/datum/action/cooldown/shatter_glass/is_valid_target(atom/cast_on)
- if(istype(target, /obj/structure/window))
- var/obj/structure/window/W = target
- if(W.reinf)
- to_chat(owner, span_warning("I cannot shatter that, it is too strong."))
- return FALSE
- return TRUE
-
- return istype(target, /obj/structure/table/glass)
-
-/datum/action/cooldown/shatter_glass/Activate(atom/target)
- . = ..()
- var/obj/structure/S = target
- S.deconstruct()
-
- RECORD_GHOST_POWER(src)
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index 2926e00a4f3..266d63cb2ce 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -514,20 +514,6 @@ TYPEINFO_DEF(/obj/structure/table)
new framestack(T, framestackamount)
qdel(src)
-/obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
- switch(the_rcd.mode)
- if(RCD_DECONSTRUCT)
- return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16)
- return FALSE
-
-/obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
- switch(passed_mode)
- if(RCD_DECONSTRUCT)
- to_chat(user, span_notice("You deconstruct the table."))
- qdel(src)
- return TRUE
- return FALSE
-
/obj/structure/table/proc/table_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked)
SIGNAL_HANDLER
if(!shove_blocked)
diff --git a/code/modules/unit_tests/__unit_tests.dm b/code/modules/unit_tests/__unit_tests.dm
index e8c23a48d9b..2cd9a2e4ced 100644
--- a/code/modules/unit_tests/__unit_tests.dm
+++ b/code/modules/unit_tests/__unit_tests.dm
@@ -161,7 +161,6 @@
#include "preferences.dm"
#include "projectiles.dm"
#include "quirks.dm"
-#include "rcd.dm"
#include "resist.dm"
#include "say.dm"
#include "serving_tray.dm"
diff --git a/code/modules/unit_tests/combat/__include.dm b/code/modules/unit_tests/combat/__include.dm
index d18859ac5cb..4b8a19d67ba 100644
--- a/code/modules/unit_tests/combat/__include.dm
+++ b/code/modules/unit_tests/combat/__include.dm
@@ -3,7 +3,6 @@
#include "combat.dm"
#include "combat_blocking.dm"
#include "combat_cuffs.dm"
-#include "combat_door_click.dm"
#include "combat_emp_flashlight.dm"
#include "combat_evidencebag.dm"
#include "combat_flash.dm"
diff --git a/code/modules/unit_tests/combat/combat_door_click.dm b/code/modules/unit_tests/combat/combat_door_click.dm
deleted file mode 100644
index 886d07ce8fb..00000000000
--- a/code/modules/unit_tests/combat/combat_door_click.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/// Tests that airlocks can be closed by clicking on the floor, as [/datum/component/redirect_attack_hand_from_turf ] dictates
-/datum/unit_test/combat/door_click
- name = "COMBAT/INTERACTION: Doors Shall Open and Close On Click."
-
-/datum/unit_test/combat/door_click/Run()
- var/mob/living/carbon/human/consistent/tider = ALLOCATE_BOTTOM_LEFT()
- var/obj/machinery/door/airlock/public/glass/door = ALLOCATE_BOTTOM_LEFT()
-
- tider.forceMove(locate(door.x + 1, door.y, door.z))
- door.open() // this sleeps we just have to cope
- TEST_ASSERT(!door.operating, "Airlock was operating after being opened.")
- TEST_ASSERT(!door.density, "Airlock was not open after being opened.")
- click_wrapper(tider, get_turf(door))
- TEST_ASSERT(door.operating, "Airlock was not closing after clicking the turf below, as per /datum/component/redirect_attack_hand_from_turf.")
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index dcaff3938fb..d6e36ff7d80 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -67,8 +67,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
ignore += typesof(/mob/living/simple_animal/pet/gondola/gondolapod)
//No heart to give
ignore += typesof(/obj/structure/ethereal_crystal)
- //No linked console
- ignore += typesof(/mob/camera/ai_eye/remote/base_construction)
//See above
ignore += typesof(/mob/camera/ai_eye/remote/shuttle_docker)
//Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky
@@ -77,8 +75,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
ignore += typesof(/obj/effect/timestop)
//Invoke async in init, skippppp
ignore += typesof(/mob/living/silicon/robot/model)
- //This lad also sleeps
- ignore += typesof(/obj/item/hilbertshotel)
//Stacks baseturfs, can't be tested here
ignore += typesof(/obj/effect/landmark/ctf)
//Our system doesn't support it without warning spam from unregister calls on things that never registered
@@ -87,8 +83,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
ignore += typesof(/obj/item/pinpointer/shuttle)
//This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK
ignore += typesof(/obj/structure/alien/resin/flower_bud)
- //Needs a linked mecha
- ignore += typesof(/obj/effect/skyfall_landingzone)
//Expects a mob to holderize, we have nothing to give
ignore += typesof(/obj/item/mob_holder)
//Needs cards passed into the initilazation args
diff --git a/code/modules/unit_tests/mapping_standards/__include.dm b/code/modules/unit_tests/mapping_standards/__include.dm
index 1a3d9e961bc..b4d24ad5293 100644
--- a/code/modules/unit_tests/mapping_standards/__include.dm
+++ b/code/modules/unit_tests/mapping_standards/__include.dm
@@ -7,4 +7,3 @@
#include "enforce_count\_enforce_count.dm"
#include "enforce_count\lights.dm"
-#include "enforce_count\doors.dm"
diff --git a/code/modules/unit_tests/mapping_standards/enforce_count/doors.dm b/code/modules/unit_tests/mapping_standards/enforce_count/doors.dm
deleted file mode 100644
index 38d2c2d27de..00000000000
--- a/code/modules/unit_tests/mapping_standards/enforce_count/doors.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/datum/unit_test/mapping_standards/enforce_count/doors
- abstract_type = /datum/unit_test/mapping_standards/enforce_count/doors
-
-/datum/unit_test/mapping_standards/enforce_count/doors/get_collection()
- return INSTANCES_OF(/obj/machinery/door)
-
-/datum/unit_test/mapping_standards/enforce_count/doors/airlock
- name = "MAPSTANDARDS: Tiles Must Have At Most 1 Airlock"
- checked_type = /obj/machinery/door/airlock
- failed_name = "Airlocks"
-
-/datum/unit_test/mapping_standards/enforce_count/doors/firedoor
- name = "MAPSTANDARDS: Tiles Must Have At Most 1 Firedoor"
- checked_type = /obj/machinery/door/firedoor
- failed_name = "Firedoors"
-
-/datum/unit_test/mapping_standards/enforce_count/doors/blastdoor
- name = "MAPSTANDARDS: Tiles Must Have At Most 1 Blast Door"
- checked_type = /obj/machinery/door/poddoor
- failed_name = "Blast Doors"
diff --git a/code/modules/unit_tests/rcd.dm b/code/modules/unit_tests/rcd.dm
deleted file mode 100644
index b65d02312a7..00000000000
--- a/code/modules/unit_tests/rcd.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Simple unit test to ensure there's no regression in behaviour where machine frames should not be stacked.
- *
- * We attempt to use the RCD to build multiple stacked machine frames on a turf. If we end up with any number that
- * is not equal to 1, this means we've either built no machine frames (bad) or built more than one (regression).
- *
- * If this is successful, we attempt to spawn in some no-density machines that result in machine frames and we run
- * the test again on our turf containing our single frame, deconstructing the machines! This should also not spawn
- * any stacked machine frames.
- */
-/datum/unit_test/frame_stacking/Run()
- // First test - RCDs stacking frames.
- var/obj/item/construction/rcd/rcd = allocate(/obj/item/construction/rcd/combat/admin)
- var/mob/living/carbon/human/engineer = allocate(/mob/living/carbon/human)
-
- engineer.put_in_hands(rcd, forced = TRUE)
-
- rcd.mode = RCD_MACHINE
-
- var/list/adjacent_turfs = get_adjacent_open_turfs(engineer)
-
- TEST_ASSERT(length(adjacent_turfs), "RCD Test failed - Lack of adjacent open turfs. This may be an issue with the unit test.")
-
- var/turf/adjacent_turf = adjacent_turfs[1]
-
- for(var/i in 1 to 10)
- adjacent_turf.rcd_act(engineer, rcd, rcd.mode)
-
- var/frame_count = 0
- for(var/obj/structure/frame/machine_frame in adjacent_turf.contents)
- frame_count++
-
- TEST_ASSERT_EQUAL(frame_count, 1, "Expected RCD machine frame stacking test to end up with exactly 1 machine frame.")
-
- // Second test - Deconstructing stacked machines to stack frames. We'll recycle our old turf to accomplish this.
- for(var/i in 1 to 10)
- // This should be a type path to a machine with no density, that can be wrenched on a turf with another machine of the same type.
- var/obj/machinery/new_machine = new /obj/machinery/recharger(adjacent_turf)
- new_machine.deconstruct(TRUE)
-
- frame_count = 0
- for(var/obj/structure/frame/machine_frame in adjacent_turf.contents)
- frame_count++
-
- TEST_ASSERT_EQUAL(frame_count, 1, "Expected no density machine deconstruction frame stacking test to end up with exactly 1 machine frame.")
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index 9001396e157..27260999295 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -82,13 +82,6 @@
item = /obj/item/storage/belt/military
cost = 1
-/datum/uplink_item/device_tools/doorjack
- name = "Airlock Authentication Override Card"
- desc = "A specialized cryptographic sequencer specifically designed to override station airlock access codes. \
- After hacking a certain number of airlocks, the device will require some time to recharge."
- item = /obj/item/card/emag/doorjack
- cost = 3
-
/datum/uplink_item/device_tools/fakenucleardisk
name = "Decoy Nuclear Authentication Disk"
desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \
diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm
index f5e5955a20d..db3470eeced 100644
--- a/code/modules/uplink/uplink_items/nukeops.dm
+++ b/code/modules/uplink/uplink_items/nukeops.dm
@@ -407,20 +407,6 @@
purchasable_from = UPLINK_NUKE_OPS
illegal_tech = FALSE
-/datum/uplink_item/ammo/mech/bag
- name = "Mech Support Kit Bag"
- desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer."
- item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech
- cost = 4
- purchasable_from = UPLINK_NUKE_OPS
-
-/datum/uplink_item/ammo/mauler/bag
- name = "Mauler Ammo Bag"
- desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit."
- item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler
- cost = 6
- purchasable_from = UPLINK_NUKE_OPS
-
/datum/uplink_item/explosives/bioterrorfoam
name = "Bioterror Foam Grenade"
desc = "A powerful chemical foam grenade which creates a deadly torrent of foam that will mute, blind, confuse, \
@@ -565,27 +551,6 @@
cost = 35
restricted = TRUE
-/datum/uplink_item/support/gygax
- name = "Dark Gygax Exosuit"
- desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \
- for hit-and-run style attacks. Features a scattershot shotgun, armor boosters against melee and ranged attacks, ion thrusters and a Tesla energy array."
- item = /obj/vehicle/sealed/mecha/combat/gygax/dark/loaded
- cost = 80
-
-/datum/uplink_item/support/honker
- name = "Dark H.O.N.K."
- desc = "A clown combat mech equipped with bombanana peel and tearstache grenade launchers, as well as the ubiquitous HoNkER BlAsT 5000."
- item = /obj/vehicle/sealed/mecha/combat/honker/dark/loaded
- cost = 80
- purchasable_from = UPLINK_CLOWN_OPS
-
-/datum/uplink_item/support/mauler
- name = "Mauler Exosuit"
- desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \
- and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array."
- item = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded
- cost = 140
-
/datum/uplink_item/support/turretbox
name = "Disposable Sentry Gun"
desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality."
diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm
deleted file mode 100644
index 6ef845bb14c..00000000000
--- a/code/modules/vehicles/mecha/_mecha.dm
+++ /dev/null
@@ -1,1319 +0,0 @@
-/***************** WELCOME TO MECHA.DM, ENJOY YOUR STAY *****************/
-
-/**
- * Mechs are now (finally) vehicles, this means you can make them multicrew
- * They can also grant select ability buttons based on occupant bitflags
- *
- * Movement is handled through vehicle_move() which is called by relaymove
- * Clicking is done by way of signals registering to the entering mob
- * NOTE: MMIS are NOT mobs but instead contain a brain that is, so you need special checks
- * AI also has special checks becaus it gets in and out of the mech differently
- * Always call remove_occupant(mob) when leaving the mech so the mob is removed properly
- *
- * For multi-crew, you need to set how the occupants recieve ability bitflags corresponding to their status on the vehicle(i.e: driver, gunner etc)
- * Abilities can then be set to only apply for certain bitflags and are assigned as such automatically
- *
- * Clicks are wither translated into mech_melee_attack (see mech_melee_attack.dm)
- * Or are used to call action() on equipped gear
- * Cooldown for gear is on the mech because exploits
- */
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha)
- default_armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha
- name = "mecha"
- desc = "Exosuit"
- icon = 'icons/mecha/mecha.dmi'
- resistance_flags = FIRE_PROOF | ACID_PROOF
- max_integrity = 300
- force = 5
- movedelay = 1 SECONDS
- move_force = MOVE_FORCE_VERY_STRONG
- move_resist = MOVE_FORCE_EXTREMELY_STRONG
- COOLDOWN_DECLARE(mecha_bump_smash)
- light_system = OVERLAY_LIGHT_DIRECTIONAL
- light_on = FALSE
- light_outer_range = 8
- generic_canpass = FALSE
- hud_possible = list(
- DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi',
- DIAG_BATT_HUD = 'icons/mob/huds/hud.dmi',
- DIAG_MECH_HUD = 'icons/mob/huds/hud.dmi',
- DIAG_TRACK_HUD = 'icons/mob/huds/hud.dmi'
- )
- ///What direction will the mech face when entered/powered on? Defaults to South.
- var/dir_in = SOUTH
- ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain.
- var/normal_step_energy_drain = 10
- ///How much energy the mech will consume each time it moves. this is the current active energy consumed
- var/step_energy_drain = 10
- ///How much energy we drain each time we mechpunch someone
- var/melee_energy_drain = 15
- ///The minimum amount of energy charge consumed by leg overload
- var/overload_step_energy_drain_min = 100
- ///Modifiers for directional damage reduction
- var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 0.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 1.5)
- ///if we cant use our equipment(such as due to EMP)
- var/equipment_disabled = FALSE
- /// Keeps track of the mech's cell
- var/obj/item/stock_parts/cell/cell
- /// Keeps track of the mech's scanning module
- var/obj/item/stock_parts/scanning_module/scanmod
- /// Keeps track of the mech's capacitor
- var/obj/item/stock_parts/capacitor/capacitor
- ///Whether the mechs maintenance protocols are on or off
- var/construction_state = MECHA_LOCKED
- ///Contains flags for the mecha
- var/mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
- ///Stores the DNA enzymes of a carbon so tht only they can access the mech
- var/dna_lock
- ///Spark effects are handled by this datum
- var/datum/effect_system/spark_spread/spark_system = new
- ///How powerful our lights are
- var/lights_power = 6
- ///Just stop the mech from doing anything
- var/completely_disabled = FALSE
- ///Whether this mech is allowed to move diagonally
- var/allow_diagonal_movement = FALSE
- ///Whether or not the mech destroys walls by running into it.
- var/bumpsmash = FALSE
-
- ///////////ATMOS
- ///Whether we are currrently drawing from the internal tank
- var/use_internal_tank = FALSE
- ///The setting of the valve on the internal tank
- var/internal_tank_valve = ONE_ATMOSPHERE
- ///The internal air tank obj of the mech
- var/obj/machinery/portable_atmospherics/canister/air/internal_tank
- ///Internal air mix datum
- var/datum/gas_mixture/cabin_air
- ///The connected air port, if we have one
- var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port
-
- ///Special version of the radio, which is unsellable
- var/obj/item/radio/mech/radio
- var/list/trackers = list()
-
- var/max_temperature = 25000
-
- ///Bitflags for internal damage
- var/internal_damage = NONE
- /// damage amount above which we can take internal damages
- var/internal_damage_threshold = 15
- /// % chance for internal damage to occur
- var/internal_damage_probability = 20
- /// list of possibly dealt internal damage for this mech type
- var/possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT
- /// damage threshold above which we take component damage
- var/component_damage_threshold = 10
-
- ///required access level for mecha operation
- var/list/operation_req_access = list()
- ///required access to change internal components
- var/list/internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE)
-
- ///Typepath for the wreckage it spawns when destroyed
- var/wreckage
-
- ///assoc list: key-typepathlist before init, key-equipmentlist after
- var/list/equip_by_category = list(
- MECHA_L_ARM = null,
- MECHA_R_ARM = null,
- MECHA_UTILITY = list(),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(),
- )
- ///assoc list: max equips for non-arm modules key-count
- var/list/max_equip_by_category = list(
- MECHA_UTILITY = 0,
- MECHA_POWER = 1,
- MECHA_ARMOR = 0,
- )
- ///flat equipment for iteration
- var/list/flat_equipment
-
- ///Whether our steps are silent due to no gravity
- var/step_silent = FALSE
- ///Sound played when the mech moves
- var/stepsound = 'sound/mecha/mechstep.ogg'
- ///Sound played when the mech walks
- var/turnsound = 'sound/mecha/mechturn.ogg'
-
- ///Cooldown duration between melee punches
- var/melee_cooldown = 10
-
- ///TIme taken to leave the mech
- var/exit_delay = 2 SECONDS
- ///Time you get slept for if you get forcible ejected by the mech exploding
- var/destruction_sleep_duration = 2 SECONDS
- ///Whether outside viewers can see the pilot inside
- var/enclosed = TRUE
- ///In case theres a different iconstate for AI/MMI pilot(currently only used for ripley)
- var/silbutton_icon_state = null
- ///Currently ejecting, and unable to do things
- var/is_currently_ejecting = FALSE
-
- var/datum/effect_system/fluid_spread/smoke/smoke_system = new
-
- ////Action vars
- ///Ref to any active thrusters we might have
- var/obj/item/mecha_parts/mecha_equipment/thrusters/active_thrusters
-
- ///Bool for energy shield on/off
- var/defense_mode = FALSE
-
- ///Bool for leg overload on/off
- var/leg_overload_mode = FALSE
- ///Energy use modifier for leg overload
- var/leg_overload_coeff = 100
-
- //Bool for zoom on/off
- var/zoom_mode = FALSE
-
- ///Remaining smoke charges
- var/smoke_charges = 5
- ///Cooldown between using smoke
- var/smoke_cooldown = 10 SECONDS
-
- ///check for phasing, if it is set to text (to describe how it is phasing: "flying", "phasing") it will let the mech walk through walls.
- var/phasing = ""
- ///Power we use every time we phaze through something
- var/phasing_energy_drain = 200
- ///icon_state for flick() when phazing
- var/phase_state = ""
-
- ///Wether we are strafing
- var/strafe = FALSE
-
- ///Cooldown length between bumpsmashes
- var/smashcooldown = 3
-
- /// Ui size, so you can make the UI bigger if you let it load a lot of stuff
- var/ui_x = 1100
- /// Ui size, so you can make the UI bigger if you let it load a lot of stuff
- var/ui_y = 600
- /// ref to screen object that displays in the middle of the UI
- var/atom/movable/screen/mech_view/ui_view
-
-/obj/item/radio/mech //this has to go somewhere
- subspace_transmission = TRUE
- canhear_range = 0
-
-/obj/vehicle/sealed/mecha/Initialize(mapload)
- . = ..()
- ui_view = new(null, src)
- if(enclosed)
- internal_tank = new (src)
- RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE , PROC_REF(disconnect_air))
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(play_stepsound))
- RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater))
-
- spark_system.set_up(2, 0, src)
- spark_system.attach(src)
-
- smoke_system.set_up(3, src)
- smoke_system.attach(src)
-
- radio = new(src)
- radio.name = "[src] radio"
-
- cabin_air = new
- cabin_air.volume = 200
- cabin_air.temperature = T20C
- cabin_air.adjustMultipleGases(GAS_OXYGEN, (O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)), GAS_NITROGEN, (N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)))
-
- add_cell()
- add_scanmod()
- add_capacitor()
- START_PROCESSING(SSobj, src)
- SSpoints_of_interest.make_point_of_interest(src)
- log_message("[src.name] created.", LOG_MECHA)
- SET_TRACKING(__TYPE__)
- prepare_huds()
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.add_atom_to_hud(src)
- diag_hud_set_mechhealth()
- diag_hud_set_mechcell()
- diag_hud_set_mechstat()
- update_appearance()
-
- become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT)
- become_atmos_sensitive()
- ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, ROUNDSTART_TRAIT) //protects pilots from ashstorms.
- for(var/key in equip_by_category)
- if(key == MECHA_L_ARM || key == MECHA_R_ARM)
- var/path = equip_by_category[key]
- if(!path)
- continue
- var/obj/item/mecha_parts/mecha_equipment/thing = new path
- thing.attach(src, key == MECHA_R_ARM)
- continue
- for(var/path in equip_by_category[key])
- var/obj/item/mecha_parts/mecha_equipment/thing = new path
- thing.attach(src, FALSE)
- equip_by_category[key] -= path
-
-/obj/vehicle/sealed/mecha/Destroy()
- for(var/ejectee in occupants)
- mob_exit(ejectee, TRUE, TRUE)
-
- if(LAZYLEN(flat_equipment))
- for(var/obj/item/mecha_parts/mecha_equipment/equip as anything in flat_equipment)
- equip.detach(loc)
- qdel(equip)
- radio = null
-
- STOP_PROCESSING(SSobj, src)
- LAZYCLEARLIST(flat_equipment)
-
- QDEL_NULL(cell)
- QDEL_NULL(scanmod)
- QDEL_NULL(capacitor)
- QDEL_NULL(internal_tank)
- QDEL_NULL(cabin_air)
- QDEL_NULL(spark_system)
- QDEL_NULL(smoke_system)
- QDEL_NULL(ui_view)
-
- UNSET_TRACKING(__TYPE__)
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.remove_atom_from_hud(src) //YEET
- lose_atmos_sensitivity()
- return ..()
-
-/obj/vehicle/sealed/mecha/atom_destruction()
- loc.assume_air(cabin_air)
- for(var/mob/living/occupant as anything in occupants)
- if(isAI(occupant))
- occupant.gib() //No wreck, no AI to recover
- continue
- mob_exit(occupant, FALSE, TRUE)
- occupant.SetSleeping(destruction_sleep_duration)
- return ..()
-
-
-/obj/vehicle/sealed/mecha/update_icon_state()
- icon_state = get_mecha_occupancy_state()
- return ..()
-
-//override this proc if you need to split up mecha control between multiple people (see savannah_ivanov.dm)
-/obj/vehicle/sealed/mecha/auto_assign_occupant_flags(mob/M)
- if(driver_amount() < max_drivers)
- add_control_flags(M, FULL_MECHA_CONTROL)
-
-/obj/vehicle/sealed/mecha/generate_actions()
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject)
- initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS)
- initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS)
- initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS)
- initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE)
-
-/obj/vehicle/sealed/mecha/proc/get_mecha_occupancy_state()
- if((mecha_flags & SILICON_PILOT) && silbutton_icon_state)
- return silbutton_icon_state
- if(LAZYLEN(occupants))
- return base_icon_state
- return "[base_icon_state]-open"
-
-/obj/vehicle/sealed/mecha/CanPassThrough(atom/blocker, movement_dir, blocker_opinion)
- if(!phasing || get_charge() <= phasing_energy_drain || throwing)
- return ..()
- if(phase_state)
- z_flick(phase_state, src)
- var/turf/destination_turf = get_step(loc, movement_dir)
- var/area/destination_area = destination_turf.loc
- if(destination_area.area_flags & NOTELEPORT || SSmapping.level_trait(destination_turf.z, ZTRAIT_NOPHASE))
- return FALSE
- return TRUE
-
-/obj/vehicle/sealed/mecha/get_cell()
- return cell
-
-/obj/vehicle/sealed/mecha/rust_heretic_act()
- take_damage(500, BRUTE)
-
-/obj/vehicle/sealed/mecha/proc/restore_equipment()
- equipment_disabled = FALSE
- for(var/occupant in occupants)
- var/mob/mob_occupant = occupant
- SEND_SOUND(mob_occupant, sound('sound/items/timer.ogg', volume=50))
- to_chat(mob_occupant, span_notice("Equipment control unit has been rebooted successfully."))
- mob_occupant.update_mouse_pointer()
-
-/obj/vehicle/sealed/mecha/CheckParts(list/parts_list)
- . = ..()
- cell = locate(/obj/item/stock_parts/cell) in contents
- scanmod = locate(/obj/item/stock_parts/scanning_module) in contents
- capacitor = locate(/obj/item/stock_parts/capacitor) in contents
- update_part_values()
-
-/obj/vehicle/sealed/mecha/proc/update_part_values() ///Updates the values given by scanning module and capacitor tier, called when a part is removed or inserted.
- if(scanmod)
- normal_step_energy_drain = 20 - (5 * scanmod.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
- step_energy_drain = normal_step_energy_drain
- else
- normal_step_energy_drain = 500
- step_energy_drain = normal_step_energy_drain
- if(capacitor)
- setArmor(returnArmor().modifyRating(energy = (capacitor.rating * 5))) //Each level of capacitor protects the mech against emp by 5%
- else //because we can still be hit without a cap, even if we can't move
- setArmor(returnArmor().setRating(energy = 0))
-
-////////////////////////
-////// Helpers /////////
-////////////////////////
-
-///Adds a cell, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this.
-/obj/vehicle/sealed/mecha/proc/add_cell(obj/item/stock_parts/cell/C=null)
- QDEL_NULL(cell)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new /obj/item/stock_parts/cell/high(src)
-
-///Adds a scanning module, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this.
-/obj/vehicle/sealed/mecha/proc/add_scanmod(obj/item/stock_parts/scanning_module/sm=null)
- QDEL_NULL(scanmod)
- if(sm)
- sm.forceMove(src)
- scanmod = sm
- return
- scanmod = new /obj/item/stock_parts/scanning_module(src)
-
-///Adds a capacitor, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this.
-/obj/vehicle/sealed/mecha/proc/add_capacitor(obj/item/stock_parts/capacitor/cap=null)
- QDEL_NULL(capacitor)
- if(cap)
- cap.forceMove(src)
- capacitor = cap
- else
- capacitor = new /obj/item/stock_parts/capacitor(src)
-
-////////////////////////////////////////////////////////////////////////////////
-
-/obj/vehicle/sealed/mecha/examine(mob/user)
- . = ..()
- var/integrity = atom_integrity*100/max_integrity
- switch(integrity)
- if(85 to 100)
- . += "It's fully intact."
- if(65 to 85)
- . += "It's slightly damaged."
- if(45 to 65)
- . += "It's badly damaged."
- if(25 to 45)
- . += "It's heavily damaged."
- else
- . += "It's falling apart."
- if(LAZYLEN(flat_equipment))
- . += "It's equipped with:"
- for(var/obj/item/mecha_parts/mecha_equipment/ME as anything in flat_equipment)
- . += "[icon2html(ME, user)] \A [ME]."
- if(enclosed)
- return
- if(mecha_flags & SILICON_PILOT)
- . += "[src] appears to be piloting itself..."
- else
- for(var/occupante in occupants)
- . += "You can see [occupante] inside."
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- for(var/held_item in H.held_items)
- if(!isgun(held_item))
- continue
- . += span_warning("It looks like you can hit the pilot directly if you target the center or above.")
- break //in case user is holding two guns
-
-//processing internal damage, temperature, air regulation, alert updates, lights power use.
-/obj/vehicle/sealed/mecha/process(delta_time)
- if(internal_damage)
- if(internal_damage & MECHA_INT_FIRE)
- if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && DT_PROB(2.5, delta_time))
- clear_internal_damage(MECHA_INT_FIRE)
- if(internal_tank)
- var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
- if(int_tank_air.returnPressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH))
- set_internal_damage(MECHA_INT_TANK_BREACH)
- if(int_tank_air && int_tank_air.get_volume() > 0) //heat the air_contents
- int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(5,7.5)*delta_time)
- if(cabin_air && cabin_air.get_volume()>0)
- cabin_air.temperature = min(6000+T0C, cabin_air.temperature+rand(5,7.5)*delta_time)
- if(cabin_air.temperature > max_temperature/2)
- take_damage(delta_time*2/round(max_temperature/cabin_air.temperature,0.1), BURN, 0, 0)
-
-
- if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank
- if(internal_tank)
- var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
- var/datum/gas_mixture/leaked_gas = int_tank_air.removeRatio(DT_PROB_RATE(0.05, delta_time))
- if(loc)
- loc.assume_air(leaked_gas)
- else
- qdel(leaked_gas)
-
- if(internal_damage & MECHA_INT_SHORT_CIRCUIT)
- if(get_charge())
- spark_system.start()
- cell.charge -= min(10 * delta_time, cell.charge)
- cell.maxcharge -= min(10 * delta_time, cell.maxcharge)
-
- if(!(internal_damage & MECHA_INT_TEMP_CONTROL))
- if(cabin_air && cabin_air.get_volume() > 0)
- var/delta = cabin_air.temperature - T20C
- cabin_air.temperature -= clamp(round(delta / 8, 0.1), -5, 5) * delta_time
-
- if(internal_tank)
- var/datum/gas_mixture/tank_air = internal_tank.return_air()
-
- var/release_pressure = internal_tank_valve
- var/cabin_pressure = cabin_air.returnPressure()
- var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.returnPressure() - cabin_pressure)/2)
- var/transfer_moles = 0
- if(pressure_delta > 0) //cabin pressure lower than release pressure
- if(tank_air.temperature > 0)
- transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION)
- var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
- cabin_air.merge(removed)
- else if(pressure_delta < 0) //cabin pressure higher than release pressure
- var/datum/gas_mixture/t_air = return_air()
- pressure_delta = cabin_pressure - release_pressure
- if(t_air)
- pressure_delta = min(cabin_pressure - t_air.returnPressure(), pressure_delta)
- if(pressure_delta > 0) //if location pressure is lower than cabin pressure
- transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION)
- var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles)
- if(t_air)
- t_air.merge(removed)
- else //just delete the cabin gas, we're in space or some shit
- qdel(removed)
-
- for(var/mob/living/occupant as anything in occupants)
- if(!enclosed && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated.
- visible_message(span_warning("[occupant] tumbles out of the cockpit!"))
- mob_exit(occupant) //bye bye
- continue
- if(cell)
- var/cellcharge = cell.charge/cell.maxcharge
- switch(cellcharge)
- if(0.75 to INFINITY)
- occupant.clear_alert(ALERT_CHARGE)
- if(0.5 to 0.75)
- occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 1)
- if(0.25 to 0.5)
- occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 2)
- if(0.01 to 0.25)
- occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 3)
- else
- occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/emptycell/mech)
-
- var/integrity = atom_integrity/max_integrity*100
- switch(integrity)
- if(30 to 45)
- occupant.throw_alert(ALERT_MECH_DAMAGE, /atom/movable/screen/alert/low_mech_integrity, 1)
- if(15 to 35)
- occupant.throw_alert(ALERT_MECH_DAMAGE, /atom/movable/screen/alert/low_mech_integrity, 2)
- if(-INFINITY to 15)
- occupant.throw_alert(ALERT_MECH_DAMAGE, /atom/movable/screen/alert/low_mech_integrity, 3)
- else
- occupant.clear_alert(ALERT_MECH_DAMAGE)
- var/atom/checking = occupant.loc
- // recursive check to handle all cases regarding very nested occupants,
- // such as brainmob inside brainitem inside MMI inside mecha
- while(!isnull(checking))
- if(isturf(checking))
- // hit a turf before hitting the mecha, seems like they have been moved out
- occupant.clear_alert(ALERT_CHARGE)
- occupant.clear_alert(ALERT_MECH_DAMAGE)
- occupant = null
- break
- else if (checking == src)
- break // all good
- checking = checking.loc
-
- if(mecha_flags & LIGHTS_ON)
- use_power(2*delta_time)
-
-//Diagnostic HUD updates
- diag_hud_set_mechhealth()
- diag_hud_set_mechcell()
- diag_hud_set_mechstat()
-
-/obj/vehicle/sealed/mecha/fire_act() //Check if we should ignite the pilot of an open-canopy mech
- . = ..()
- if(enclosed || mecha_flags & SILICON_PILOT)
- return
- for(var/mob/living/cookedalive as anything in occupants)
- if(cookedalive.fire_stacks < 5)
- cookedalive.adjust_fire_stacks(1)
- cookedalive.ignite_mob()
-
-///Displays a special speech bubble when someone inside the mecha speaks
-/obj/vehicle/sealed/mecha/proc/display_speech_bubble(datum/source, list/speech_args)
- SIGNAL_HANDLER
- var/list/speech_bubble_recipients = get_hearers_in_view(7,src)
- for(var/mob/M in speech_bubble_recipients)
- if(M.client)
- speech_bubble_recipients.Add(M.client)
- INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), image('icons/mob/talk.dmi', src, "machine[say_test(speech_args[SPEECH_MESSAGE])]",MOB_LAYER+1), speech_bubble_recipients, 30)
-
-////////////////////////////
-///// Action processing ////
-////////////////////////////
-
-///Called when a driver clicks somewhere. Handles everything like equipment, punches, etc.
-/obj/vehicle/sealed/mecha/proc/on_mouseclick(mob/user, atom/target, list/modifiers)
- SIGNAL_HANDLER
- if(modifiers[SHIFT_CLICK]) //Allows things to be examined.
- return
- if(!isturf(target) && !isturf(target.loc)) // Prevents inventory from being drilled
- return
- if(completely_disabled || is_currently_ejecting || (mecha_flags & CANNOT_INTERACT))
- return
- if(isAI(user) == !LAZYACCESS(modifiers, MIDDLE_CLICK))//BASICALLY if a human uses MMB, or an AI doesn't, then do nothing.
- return
- if(phasing)
- balloon_alert(user, "not while [phasing]!")
- return
- if(user.incapacitated())
- return
- if(construction_state)
- balloon_alert(user, "end maintenance first!")
- return
- if(!get_charge())
- return
- if(src == target)
- return
- var/dir_to_target = get_dir(src,target)
- if(!(mecha_flags & OMNIDIRECTIONAL_ATTACKS) && dir_to_target && !(dir_to_target & dir))//wrong direction
- return
- if(internal_damage & MECHA_INT_CONTROL_LOST)
- target = pick(view(3,target))
- var/mob/living/livinguser = user
- if(!(livinguser in return_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT)))
- balloon_alert(user, "wrong seat for equipment!")
- return
- var/obj/item/mecha_parts/mecha_equipment/selected
- if(LAZYACCESS(modifiers, RIGHT_CLICK))
- selected = equip_by_category[MECHA_R_ARM]
- else
- selected = equip_by_category[MECHA_L_ARM]
- if(!selected)
- return
- if(!Adjacent(target) && (selected.range & MECHA_RANGED))
- if(HAS_TRAIT(livinguser, TRAIT_PACIFISM) && selected.harmful)
- to_chat(livinguser, span_warning("You don't want to harm other living beings!"))
- return
- if(SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_CLICK, livinguser, target) & COMPONENT_CANCEL_EQUIPMENT_CLICK)
- return
- INVOKE_ASYNC(selected, TYPE_PROC_REF(/obj/item/mecha_parts/mecha_equipment, action), user, target, modifiers)
- return
- if((selected.range & MECHA_MELEE) && Adjacent(target))
- if(isliving(target) && selected.harmful && HAS_TRAIT(livinguser, TRAIT_PACIFISM))
- to_chat(livinguser, span_warning("You don't want to harm other living beings!"))
- return
- if(SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_CLICK, livinguser, target) & COMPONENT_CANCEL_EQUIPMENT_CLICK)
- return
- INVOKE_ASYNC(selected, TYPE_PROC_REF(/obj/item/mecha_parts/mecha_equipment, action), user, target, modifiers)
- return
- if(!(livinguser in return_controllers_with_flag(VEHICLE_CONTROL_MELEE)))
- to_chat(livinguser, span_warning("You're in the wrong seat to interact with your hands."))
- return
- var/on_cooldown = TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MELEE_ATTACK)
- var/adjacent = Adjacent(target)
- if(SEND_SIGNAL(src, COMSIG_MECHA_MELEE_CLICK, livinguser, target, on_cooldown, adjacent) & COMPONENT_CANCEL_MELEE_CLICK)
- return
- if(on_cooldown || !adjacent)
- return
- if(internal_damage & MECHA_INT_CONTROL_LOST)
- target = pick(oview(1,src))
-
- if(!has_charge(melee_energy_drain))
- return
- use_power(melee_energy_drain)
-
- if(force)
- target.mech_melee_attack(src, user)
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown)
-
-/obj/vehicle/sealed/mecha/proc/on_middlemouseclick(mob/user, atom/target, params)
- SIGNAL_HANDLER
- if(isAI(user))
- on_mouseclick(user, target, params)
-
-//////////////////////////////////
-//////// Movement procs ////////
-//////////////////////////////////
-
-///Plays the mech step sound effect. Split from movement procs so that other mechs (HONK) can override this one specific part.
-/obj/vehicle/sealed/mecha/proc/play_stepsound()
- SIGNAL_HANDLER
- if(mecha_flags & QUIET_STEPS)
- return
- playsound(src, stepsound, 40, TRUE)
-
-///Disconnects air tank- air port connection on mecha move
-/obj/vehicle/sealed/mecha/proc/disconnect_air()
- SIGNAL_HANDLER
- if(internal_tank.disconnect()) // Something moved us and broke connection
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("Air port connection has been severed!")]")
- log_message("Lost connection to gas port.", LOG_MECHA)
-
-// Do whatever you do to mobs to these fuckers too
-/obj/vehicle/sealed/mecha/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
- . = ..()
- if(.)
- return TRUE
-
- var/atom/movable/backup = get_spacemove_backup(movement_dir, continuous_move)
- if(backup)
- if(!istype(backup) || !movement_dir || backup.anchored || continuous_move) //get_spacemove_backup() already checks if a returned turf is solid, so we can just go
- return TRUE
- last_pushoff = world.time
- if(backup.newtonian_move(turn(movement_dir, 180), instant = TRUE))
- backup.last_pushoff = world.time
- step_silent = TRUE
- if(return_drivers())
- to_chat(occupants, "[icon2html(src, occupants)][span_info("The [src] push off [backup] to propel yourself.")]")
- return TRUE
-
- if(active_thrusters?.thrust(movement_dir))
- step_silent = TRUE
- return TRUE
- return FALSE
-
-/obj/vehicle/sealed/mecha/relaymove(mob/living/user, direction)
- . = TRUE
- if(!canmove || !(user in return_drivers()))
- return
- vehicle_move(direction)
-
-/obj/vehicle/sealed/mecha/vehicle_move(direction, forcerotate = FALSE)
- if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move))
- return FALSE
- COOLDOWN_START(src, cooldown_vehicle_move, movedelay)
- if(completely_disabled)
- return FALSE
- if(!direction)
- return FALSE
- if(internal_tank?.connected_port)
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE))
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while connected to the air system port!")]")
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS)
- return FALSE
- if(construction_state)
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE))
- to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect.")]")
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS)
- return FALSE
-
- if(!Process_Spacemove(direction))
- return FALSE
- if(zoom_mode)
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE))
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while in zoom mode!")]")
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS)
- return FALSE
- if(!cell)
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE))
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing power cell.")]")
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS)
- return FALSE
- if(!scanmod || !capacitor)
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE))
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [scanmod? "capacitor" : "scanning module"].")]")
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS)
- return FALSE
- if(!use_power(step_energy_drain))
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE))
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("Insufficient power to move!")]")
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS)
- return FALSE
-
- var/olddir = dir
-
- if(internal_damage & MECHA_INT_CONTROL_LOST)
- direction = pick(GLOB.alldirs)
-
- //only mechs with diagonal movement may move diagonally
- if(!allow_diagonal_movement && ISDIAGONALDIR(direction))
- return TRUE
-
- var/keyheld = FALSE
- if(strafe)
- for(var/mob/driver as anything in return_drivers())
- if(driver.client?.keys_held["Alt"])
- keyheld = TRUE
- break
-
- //if we're not facing the way we're going rotate us
- if(dir != direction && !strafe || forcerotate || keyheld)
- if(dir != direction && !(mecha_flags & QUIET_TURNS) && !step_silent)
- playsound(src,turnsound,40,TRUE)
- setDir(direction)
- return TRUE
-
- set_glide_size(DELAY_TO_GLIDE_SIZE(movedelay))
- //Otherwise just walk normally
- . = step(src,direction, dir)
- if(phasing)
- use_power(phasing_energy_drain)
- if(strafe)
- setDir(olddir)
-
-
-/obj/vehicle/sealed/mecha/Bump(atom/obstacle)
- . = ..()
- if(phasing) //Theres only one cause for phasing canpass fails
- to_chat(occupants, "[icon2html(src, occupants)][span_warning("A dull, universal force is preventing you from [phasing] here!")]")
- spark_system.start()
- return
- if(.) //mech was thrown/door/whatever
- return
- if(bumpsmash) //Need a pilot to push the PUNCH button.
- if(COOLDOWN_FINISHED(src, mecha_bump_smash))
- var/list/mob/mobster = return_drivers()
- obstacle.mech_melee_attack(src, mobster[1])
- COOLDOWN_START(src, mecha_bump_smash, smashcooldown)
- if(!obstacle || obstacle.CanPass(src, get_dir(obstacle, src) || dir)) // The else is in case the obstacle is in the same turf.
- step(src,dir)
- if(isobj(obstacle))
- var/obj/obj_obstacle = obstacle
- if(!obj_obstacle.anchored && obj_obstacle.move_resist <= move_force)
- step(obstacle, dir)
- else if(ismob(obstacle))
- var/mob/mob_obstacle = obstacle
- if(mob_obstacle.move_resist <= move_force)
- step(obstacle, dir)
-
-
-
-
-
-///////////////////////////////////
-//////// Internal damage ////////
-///////////////////////////////////
-
-/// tries to repair any internal damage and plays fluff for it
-/obj/vehicle/sealed/mecha/proc/try_repair_int_damage(mob/user, flag_to_heal)
- balloon_alert(user, get_int_repair_fluff_start(flag_to_heal))
- log_message("[key_name(user)] starting internal damage repair for flag [flag_to_heal]", LOG_MECHA)
- if(!do_after(user, src, 10 SECONDS))
- balloon_alert(user, get_int_repair_fluff_fail(flag_to_heal))
- log_message("Internal damage repair for flag [flag_to_heal] failed.", LOG_MECHA, color="red")
- return
- clear_internal_damage(flag_to_heal)
- balloon_alert(user, get_int_repair_fluff_end(flag_to_heal))
- log_message("Finished internal damage repair for flag [flag_to_heal]", LOG_MECHA)
-
-///gets the starting balloon alert flufftext
-/obj/vehicle/sealed/mecha/proc/get_int_repair_fluff_start(flag)
- switch(flag)
- if(MECHA_INT_FIRE)
- return "activating internal fire supression..."
- if(MECHA_INT_TEMP_CONTROL)
- return "resetting temperature module..."
- if(MECHA_INT_TANK_BREACH)
- return "activating tank sealant..."
- if(MECHA_INT_CONTROL_LOST)
- return "recalibrating coordination system..."
-
-///gets the successful finish balloon alert flufftext
-/obj/vehicle/sealed/mecha/proc/get_int_repair_fluff_end(flag)
- switch(flag)
- if(MECHA_INT_FIRE)
- return "internal fire supressed"
- if(MECHA_INT_TEMP_CONTROL)
- return "temperature chip reactivated"
- if(MECHA_INT_TANK_BREACH)
- return "air tank sealed"
- if(MECHA_INT_CONTROL_LOST)
- return "coordination re-established"
-
-///gets the on-fail balloon alert flufftext
-/obj/vehicle/sealed/mecha/proc/get_int_repair_fluff_fail(flag)
- switch(flag)
- if(MECHA_INT_FIRE)
- return "fire supression canceled"
- if(MECHA_INT_TEMP_CONTROL)
- return "reset aborted"
- if(MECHA_INT_TANK_BREACH)
- return "sealant deactivated"
- if(MECHA_INT_CONTROL_LOST)
- return "recalibration failed"
-
-/obj/vehicle/sealed/mecha/proc/set_internal_damage(int_dam_flag)
- internal_damage |= int_dam_flag
- log_message("Internal damage of type [int_dam_flag].", LOG_MECHA)
- SEND_SOUND(occupants, sound('sound/machines/warning-buzzer.ogg',wait=0))
- diag_hud_set_mechstat()
-
-/obj/vehicle/sealed/mecha/proc/clear_internal_damage(int_dam_flag)
- if(internal_damage & int_dam_flag)
- switch(int_dam_flag)
- if(MECHA_INT_TEMP_CONTROL)
- to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Life support system reactivated.")]")
- if(MECHA_INT_FIRE)
- to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Internal fire extinguished.")]")
- if(MECHA_INT_TANK_BREACH)
- to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Damaged internal tank has been sealed.")]")
- internal_damage &= ~int_dam_flag
- diag_hud_set_mechstat()
-
-/////////////////////////////////////
-//////////// AI piloting ////////////
-/////////////////////////////////////
-
-/obj/vehicle/sealed/mecha/attack_ai(mob/living/silicon/ai/user)
- if(!isAI(user))
- return
- //Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot.
- if(user.can_dominate_mechs)
- user.run_examinate(src) //Get diagnostic information!
- for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)
- to_chat(user, span_danger("Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:"))
- to_chat(user, "[B.get_mecha_info()]")
- break
- //Nothing like a big, red link to make the player feel powerful!
- to_chat(user, "[span_userdanger("ASSUME DIRECT CONTROL?")] ")
- return
-
- user.run_examinate(src)
-
- if(length(return_drivers()) > 0)
- to_chat(user, span_warning("This exosuit has a pilot and cannot be controlled."))
- return
- var/can_control_mech = FALSE
- for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers)
- can_control_mech = TRUE
- to_chat(user, "[span_notice("[icon2html(src, user)] Status of [name]:")]\n[A.get_mecha_info()]")
- break
- if(!can_control_mech)
- to_chat(user, span_warning("You cannot control exosuits without AI control beacons installed."))
- return
- to_chat(user, "[span_boldnotice("Take control of exosuit?")] ")
-
-/obj/vehicle/sealed/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card)
- . = ..()
- if(!.)
- return
-
- //Transfer from core or card to mech. Proc is called by mech.
- switch(interaction)
- if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card.
- if(!construction_state) //Mech must be in maint mode to allow carding.
- to_chat(user, span_warning("[name] must have maintenance protocols active in order to allow a transfer."))
- return
- var/list/ai_pilots = list()
- for(var/mob/living/silicon/ai/aipilot in occupants)
- ai_pilots += aipilot
- if(!length(ai_pilots)) //Mech does not have an AI for a pilot
- to_chat(user, span_warning("No AI detected in the [name] onboard computer."))
- return
- if(length(ai_pilots) > 1) //Input box for multiple AIs, but if there's only one we'll default to them.
- AI = tgui_input_list(user, "Which AI do you wish to card?", "AI Selection", sort_list(ai_pilots))
- else
- AI = ai_pilots[1]
- if(isnull(AI))
- return
- if(!(AI in occupants) || !user.Adjacent(src))
- return //User sat on the selection window and things changed.
-
- AI.ai_restore_power()//So the AI initially has power.
- AI.control_disabled = TRUE
- AI.radio_enabled = FALSE
- AI.disconnect_shell()
- remove_occupant(AI)
- mecha_flags &= ~SILICON_PILOT
- AI.forceMove(card)
- card.AI = AI
- AI.controlled_equipment = null
- AI.remote_control = null
- to_chat(AI, span_notice("You have been downloaded to a mobile storage device. Wireless connection offline."))
- to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.")
- return
-
- if(AI_MECH_HACK) //Called by AIs on the mech
- AI.linked_core = new /obj/structure/ai_core/deactivated(AI.loc)
- if(AI.can_dominate_mechs && LAZYLEN(occupants)) //Oh, I am sorry, were you using that?
- to_chat(AI, span_warning("Occupants detected! Forced ejection initiated!"))
- to_chat(occupants, span_danger("You have been forcibly ejected!"))
- for(var/ejectee in occupants)
- mob_exit(ejectee, TRUE, TRUE) //IT IS MINE, NOW. SUCK IT, RD!
- AI.can_shunt = FALSE //ONE AI ENTERS. NO AI LEAVES.
-
- if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech.
- AI = card.AI
- if(!AI)
- to_chat(user, span_warning("There is no AI currently installed on this device."))
- return
- if(AI.deployed_shell) //Recall AI if shelled so it can be checked for a client
- AI.disconnect_shell()
- if(AI.stat || !AI.client)
- to_chat(user, span_warning("[AI.name] is currently unresponsive, and cannot be uploaded."))
- return
- if((LAZYLEN(occupants) >= max_occupants) || dna_lock) //Normal AIs cannot steal mechs!
- to_chat(user, span_warning("Access denied. [name] is [LAZYLEN(occupants) >= max_occupants ? "currently fully occupied" : "secured with a DNA lock"]."))
- return
- AI.control_disabled = FALSE
- AI.radio_enabled = TRUE
- to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.")
- card.AI = null
- ai_enter_mech(AI)
-
-///Hack and From Card interactions share some code, so leave that here for both to use.
-/obj/vehicle/sealed/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI)
- AI.ai_restore_power()
- mecha_flags |= SILICON_PILOT
- moved_inside(AI)
- AI.cancel_camera()
- AI.controlled_equipment = src
- AI.remote_control = src
- to_chat(AI, AI.can_dominate_mechs ? span_greenannounce("Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!") :\
- span_notice("You have been uploaded to a mech's onboard computer."))
- to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.")
-
-
-///Handles an actual AI (simple_animal mecha pilot) entering the mech
-/obj/vehicle/sealed/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
- if(!pilot_mob?.Adjacent(src))
- return
- if(LAZYLEN(occupants))
- return
- LAZYSET(occupants, pilot_mob, NONE)
- pilot_mob.mecha = src
- pilot_mob.forceMove(src)
- update_appearance()
-
-///Handles an actual AI (simple_animal mecha pilot) exiting the mech
-/obj/vehicle/sealed/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
- LAZYREMOVE(occupants, pilot_mob)
- if(pilot_mob.mecha == src)
- pilot_mob.mecha = null
- pilot_mob.forceMove(get_turf(src))
- update_appearance()
-
-/obj/vehicle/sealed/mecha/mob_try_enter(mob/M)
- if(!ishuman(M)) // no silicons or drones in mechas.
- return
- if(HAS_TRAIT(M, TRAIT_PRIMITIVE)) //no lavalizards either.
- to_chat(M, span_warning("The knowledge to use this device eludes you!"))
- return
- log_message("[M] tries to move into [src].", LOG_MECHA)
- if(dna_lock && M.has_dna())
- var/mob/living/carbon/entering_carbon = M
- if(entering_carbon.dna.unique_enzymes != dna_lock)
- to_chat(M, span_warning("Access denied. [name] is secured with a DNA lock."))
- log_message("Permission denied (DNA LOCK).", LOG_MECHA)
- return
- if(!operation_allowed(M))
- to_chat(M, span_warning("Access denied. Insufficient operation keycodes."))
- log_message("Permission denied (No keycode).", LOG_MECHA)
- return
- . = ..()
- if(.)
- moved_inside(M)
-
-/obj/vehicle/sealed/mecha/enter_checks(mob/M)
- if(atom_integrity <= 0)
- to_chat(M, span_warning("You cannot get in the [src], it has been destroyed!"))
- return FALSE
- if(M.buckled)
- to_chat(M, span_warning("You can't enter the exosuit while buckled."))
- log_message("Permission denied (Buckled).", LOG_MECHA)
- return FALSE
- if(M.has_buckled_mobs())
- to_chat(M, span_warning("You can't enter the exosuit with other creatures attached to you!"))
- log_message("Permission denied (Attached mobs).", LOG_MECHA)
- return FALSE
- return ..()
-
-
-/obj/vehicle/sealed/mecha/proc/moved_inside(mob/living/newoccupant)
- if(!(newoccupant?.client))
- return FALSE
- if(ishuman(newoccupant) && !Adjacent(newoccupant))
- return FALSE
- add_occupant(newoccupant)
- newoccupant.forceMove(src)
- newoccupant.update_mouse_pointer()
- add_fingerprint(newoccupant)
- log_message("[newoccupant] moved in as pilot.", LOG_MECHA)
- setDir(dir_in)
- playsound(src, 'sound/machines/windowdoor.ogg', 50, TRUE)
- if(!internal_damage)
- SEND_SOUND(newoccupant, sound('sound/mecha/nominal.ogg',volume=50))
- return TRUE
-
-/obj/vehicle/sealed/mecha/proc/mmi_move_inside(obj/item/mmi/brain_obj, mob/user)
- if(!(mecha_flags & MMI_COMPATIBLE))
- to_chat(user, span_warning("This mecha is not compatible with MMIs!"))
- return FALSE
- if(!brain_obj.brain_check(user))
- return FALSE
- var/mob/living/brain/brain_mob = brain_obj.brainmob
- if(LAZYLEN(occupants) >= max_occupants)
- to_chat(user, span_warning("It's full!"))
- return FALSE
- if(dna_lock && (!brain_mob.stored_dna || (dna_lock != brain_mob.stored_dna.unique_enzymes)))
- to_chat(user, span_warning("Access denied. [name] is secured with a DNA lock."))
- return FALSE
-
- visible_message(span_notice("[user] starts to insert an MMI into [name]."))
-
- if(!do_after(user, src, 4 SECONDS))
- to_chat(user, span_notice("You stop inserting the MMI."))
- return FALSE
- if(LAZYLEN(occupants) < max_occupants)
- return mmi_moved_inside(brain_obj, user)
- to_chat(user, span_warning("Maximum occupants exceeded!"))
- return FALSE
-
-/obj/vehicle/sealed/mecha/proc/mmi_moved_inside(obj/item/mmi/brain_obj, mob/user)
- if(!(Adjacent(brain_obj) && Adjacent(user)))
- return FALSE
- if(!brain_obj.brain_check(user))
- return FALSE
-
- var/mob/living/brain/brain_mob = brain_obj.brainmob
- if(!user.transferItemToLoc(brain_obj, src))
- to_chat(user, span_warning("[brain_obj] is stuck to your hand, you cannot put it in [src]!"))
- return FALSE
-
- brain_obj.set_mecha(src)
- add_occupant(brain_mob)//Note this forcemoves the brain into the mech to allow relaymove
- mecha_flags |= SILICON_PILOT
- brain_mob.reset_perspective(src)
- brain_mob.remote_control = src
- brain_mob.update_mouse_pointer()
- setDir(dir_in)
- log_message("[brain_obj] moved in as pilot.", LOG_MECHA)
- if(!internal_damage)
- SEND_SOUND(brain_obj, sound('sound/mecha/nominal.ogg',volume=50))
- log_game("[key_name(user)] has put the organ/posibrain of [key_name(brain_mob)] into [src] at [AREACOORD(src)]")
- return TRUE
-
-/obj/vehicle/sealed/mecha/container_resist_act(mob/living/user)
- if(isAI(user))
- var/mob/living/silicon/ai/AI = user
- if(!AI.can_shunt)
- to_chat(AI, span_notice("You can't leave a mech after dominating it!."))
- return FALSE
- to_chat(user, span_notice("You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting."))
- is_currently_ejecting = TRUE
- if(do_after(user, src, has_gravity() ? exit_delay : 0))
- to_chat(user, span_notice("You exit the mech."))
- mob_exit(user, TRUE)
- else
- to_chat(user, span_notice("You stop exiting the mech. Weapons are enabled again."))
- is_currently_ejecting = FALSE
-
-
-/obj/vehicle/sealed/mecha/mob_exit(mob/M, silent, forced)
- var/atom/movable/mob_container
- var/turf/newloc = get_turf(src)
- if(ishuman(M))
- mob_container = M
- else if(isbrain(M))
- var/mob/living/brain/brain = M
- mob_container = brain.container
- else if(isAI(M))
- var/mob/living/silicon/ai/AI = M
- if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf.
- AI.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced.
- AI = null
- mecha_flags &= ~SILICON_PILOT
- return
- else
- if(!AI.linked_core)
- if(!silent)
- to_chat(AI, span_userdanger("Inactive core destroyed. Unable to return."))
- AI.linked_core = null
- return
- if(!silent)
- to_chat(AI, span_notice("Returning to core..."))
- AI.controlled_equipment = null
- AI.remote_control = null
- mob_container = AI
- newloc = get_turf(AI.linked_core)
- qdel(AI.linked_core)
- else
- return ..()
- var/mob/living/ejector = M
- mecha_flags &= ~SILICON_PILOT
- mob_container.forceMove(newloc)//ejecting mob container
- log_message("[mob_container] moved out.", LOG_MECHA)
- SStgui.close_user_uis(M, src)
- if(istype(mob_container, /obj/item/mmi))
- var/obj/item/mmi/mmi = mob_container
- if(mmi.brainmob)
- ejector.forceMove(mmi)
- ejector.reset_perspective()
- remove_occupant(ejector)
- mmi.set_mecha(null)
- mmi.update_appearance()
- setDir(dir_in)
- return ..()
-
-
-/obj/vehicle/sealed/mecha/add_occupant(mob/M, control_flags)
- . = ..()
- if(!.)
- return
-
- RegisterSignal(M, COMSIG_LIVING_DEATH, PROC_REF(mob_exit))
- RegisterSignal(M, COMSIG_MOB_CLICKON, PROC_REF(on_mouseclick))
- RegisterSignal(M, COMSIG_MOB_MIDDLECLICKON, PROC_REF(on_middlemouseclick)) //For AIs
- RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(display_speech_bubble))
- update_appearance()
-
-/obj/vehicle/sealed/mecha/remove_occupant(mob/M)
- UnregisterSignal(M, COMSIG_LIVING_DEATH)
- UnregisterSignal(M, COMSIG_MOB_CLICKON)
- UnregisterSignal(M, COMSIG_MOB_MIDDLECLICKON)
- UnregisterSignal(M, COMSIG_MOB_SAY)
- M.clear_alert(ALERT_CHARGE)
- M.clear_alert(ALERT_MECH_DAMAGE)
- if(M.client)
- M.update_mouse_pointer()
- M.client.view_size.resetToDefault()
- zoom_mode = FALSE
- . = ..()
- update_appearance()
-
-/////////////////////////
-////// Access stuff /////
-/////////////////////////
-
-/obj/vehicle/sealed/mecha/proc/operation_allowed(mob/M)
- req_access = operation_req_access
- req_one_access = list()
- return allowed(M)
-
-/obj/vehicle/sealed/mecha/proc/internals_access_allowed(mob/M)
- req_one_access = internals_req_access
- req_access = list()
- return allowed(M)
-
-
-///////////////////////
-///// Power stuff /////
-///////////////////////
-
-/obj/vehicle/sealed/mecha/proc/has_charge(amount)
- return (get_charge()>=amount)
-
-/obj/vehicle/sealed/mecha/proc/get_charge()
- return cell?.charge
-
-/obj/vehicle/sealed/mecha/proc/use_power(amount)
- return (get_charge() && cell.use(amount))
-
-/obj/vehicle/sealed/mecha/proc/give_power(amount)
- if(!isnull(get_charge()))
- cell.give(amount)
- return TRUE
- return FALSE
-
-
-
-/////////////////////////////////////
-//////// Atmospheric stuff ////////
-/////////////////////////////////////
-
-/obj/vehicle/sealed/mecha/remove_air(amount)
- if(use_internal_tank)
- return cabin_air.remove(amount)
- return ..()
-
-/obj/vehicle/sealed/mecha/return_air()
- if(use_internal_tank)
- return cabin_air
- return ..()
-
-/obj/vehicle/sealed/mecha/return_analyzable_air()
- return cabin_air
-
-///fetches pressure of the gas mixture we are using
-/obj/vehicle/sealed/mecha/proc/returnPressure()
- var/datum/gas_mixture/air = return_air()
- return air?.returnPressure()
-
-///fetches temp of the gas mixture we are using
-/obj/vehicle/sealed/mecha/return_temperature()
- var/datum/gas_mixture/air = return_air()
- return air?.temperature
-
-
-
-///////////////////////
-////// Ammo stuff /////
-///////////////////////
-
-/obj/vehicle/sealed/mecha/proc/ammo_resupply(obj/item/mecha_ammo/A, mob/user,fail_chat_override = FALSE)
- if(!A.rounds)
- if(!fail_chat_override)
- to_chat(user, span_warning("This box of ammo is empty!"))
- return FALSE
- var/ammo_needed
- var/found_gun
- for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in flat_equipment)
- ammo_needed = 0
-
- if(!istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type)
- continue
- found_gun = TRUE
- if(A.direct_load)
- ammo_needed = initial(gun.projectiles) - gun.projectiles
- else
- ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache
-
- if(!ammo_needed)
- continue
- if(ammo_needed < A.rounds)
- if(A.direct_load)
- gun.projectiles = gun.projectiles + ammo_needed
- else
- gun.projectiles_cache = gun.projectiles_cache + ammo_needed
- playsound(get_turf(user),A.load_audio,50,TRUE)
- to_chat(user, span_notice("You add [ammo_needed] [A.ammo_type][ammo_needed > 1?"s":""] to the [gun.name]"))
- A.rounds = A.rounds - ammo_needed
- if(A.custom_materials)
- A.set_custom_materials(A.custom_materials, A.rounds / initial(A.rounds))
- A.update_appearance(UPDATE_NAME)
- return TRUE
-
- if(A.direct_load)
- gun.projectiles = gun.projectiles + A.rounds
- else
- gun.projectiles_cache = gun.projectiles_cache + A.rounds
- playsound(get_turf(user),A.load_audio,50,TRUE)
- to_chat(user, span_notice("You add [A.rounds] [A.ammo_type][A.rounds > 1?"s":""] to the [gun.name]"))
- A.rounds = 0
- A.set_custom_materials(list(/datum/material/steel=2000))
- A.update_appearance(UPDATE_NAME)
- return TRUE
- if(!fail_chat_override)
- if(found_gun)
- to_chat(user, span_notice("You can't fit any more ammo of this type!"))
- else
- to_chat(user, span_notice("None of the equipment on this exosuit can use this ammo!"))
- return FALSE
-
-
-/// Special light eater handling
-/obj/vehicle/sealed/mecha/proc/on_light_eater(obj/vehicle/sealed/source, datum/light_eater)
- SIGNAL_HANDLER
- if(mecha_flags & HAS_LIGHTS)
- visible_message(span_danger("[src]'s lights burn out!"))
- mecha_flags &= ~HAS_LIGHTS
- set_light_on(FALSE)
- for(var/occupant in occupants)
- remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant)
- return COMPONENT_BLOCK_LIGHT_EATER
-
-/// Sets the direction of the mecha and all of its occcupents, required for FOV. Alternatively one could make a recursive contents registration and register topmost direction changes in the fov component
-/obj/vehicle/sealed/mecha/setDir(newdir)
- . = ..()
- for(var/mob/living/occupant as anything in occupants)
- occupant.setDir(newdir)
diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm
deleted file mode 100644
index ee81174dc99..00000000000
--- a/code/modules/vehicles/mecha/combat/combat.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat)
- default_armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat
- force = 30
- internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY)
- mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi'
- destruction_sleep_duration = 40
- exit_delay = 40
-
-/obj/vehicle/sealed/mecha/combat/restore_equipment()
- mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi'
- return ..()
-
-/obj/vehicle/sealed/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this
- for(var/obj/item/I as anything in flat_equipment)
- if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic))
- var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I
- gun.projectiles_cache = gun.projectiles_cache_max
diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm
deleted file mode 100644
index 4da9883c67d..00000000000
--- a/code/modules/vehicles/mecha/combat/durand.dm
+++ /dev/null
@@ -1,262 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/durand)
- default_armor = list(BLUNT = 40, PUNCTURE = 35, SLASH = 0, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/durand
- desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
- name = "\improper Durand"
- icon_state = "durand"
- base_icon_state = "durand"
- movedelay = 4
- dir_in = 1 //Facing North.
- max_integrity = 400
- max_temperature = 30000
- force = 40
- wreckage = /obj/structure/mecha_wreckage/durand
- max_equip_by_category = list(
- MECHA_UTILITY = 1,
- MECHA_POWER = 1,
- MECHA_ARMOR = 3,
- )
- var/obj/durand_shield/shield
-
-
-/obj/vehicle/sealed/mecha/combat/durand/Initialize(mapload)
- . = ..()
- shield = new /obj/durand_shield(loc, src, layer, dir)
- RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, PROC_REF(relay))
- RegisterSignal(src, COMSIG_PROJECTILE_PREHIT, PROC_REF(prehit))
-
-
-/obj/vehicle/sealed/mecha/combat/durand/Destroy()
- if(shield)
- QDEL_NULL(shield)
- return ..()
-
-
-/obj/vehicle/sealed/mecha/combat/durand/generate_actions()
- . = ..()
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_defense_mode)
-
-/obj/vehicle/sealed/mecha/combat/durand/process()
- . = ..()
- if(defense_mode && !use_power(100)) //Defence mode can only be on with a occupant so we check if one of them can toggle it and toggle
- for(var/O in occupants)
- var/mob/living/occupant = O
- var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode)
- if(action)
- action.Trigger()
- break
-
-/obj/vehicle/sealed/mecha/combat/durand/Move(direction)
- . = ..()
- if(shield)
- shield.forceMove(loc)
- shield.setDir(dir)
-
-/obj/vehicle/sealed/mecha/combat/durand/forceMove(turf/T)
- . = ..()
- shield.forceMove(T)
-
-/obj/vehicle/sealed/mecha/combat/durand/mob_exit(mob/M, silent, randomstep, forced)
- if(defense_mode)
- var/datum/action/action = LAZYACCESSASSOC(occupant_actions, M, /datum/action/vehicle/sealed/mecha/mech_defense_mode)
- if(action)
- INVOKE_ASYNC(action, TYPE_PROC_REF(/datum/action, Trigger), FALSE)
- return ..()
-
-///Relays the signal from the action button to the shield, and creates a new shield if the old one is MIA.
-/obj/vehicle/sealed/mecha/combat/durand/proc/relay(datum/source, mob/owner, list/signal_args)
- SIGNAL_HANDLER
- if(!shield) //if the shield somehow got deleted
- stack_trace("Durand triggered relay without a shield")
- shield = new /obj/durand_shield(loc, src, layer)
- shield.setDir(dir)
- SEND_SIGNAL(shield, COMSIG_MECHA_ACTION_TRIGGER, owner, signal_args)
-
-//Redirects projectiles to the shield if defense_check decides they should be blocked and returns true.
-/obj/vehicle/sealed/mecha/combat/durand/proc/prehit(obj/projectile/source, list/signal_args)
- SIGNAL_HANDLER
- if(defense_check(source.loc) && shield)
- signal_args[2] = shield
-
-/**Checks if defense mode is enabled, and if the attacker is standing in an area covered by the shield.
-Expects a turf. Returns true if the attack should be blocked, false if not.*/
-/obj/vehicle/sealed/mecha/combat/durand/proc/defense_check(turf/aloc)
- if (!defense_mode || !shield || shield.switching)
- return FALSE
- . = FALSE
- switch(dir)
- if (1)
- if(abs(x - aloc.x) <= (y - aloc.y) * -2)
- . = TRUE
- if (2)
- if(abs(x - aloc.x) <= (y - aloc.y) * 2)
- . = TRUE
- if (4)
- if(abs(y - aloc.y) <= (x - aloc.x) * -2)
- . = TRUE
- if (8)
- if(abs(y - aloc.y) <= (x - aloc.x) * 2)
- . = TRUE
- return
-
-/obj/vehicle/sealed/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0)
- if(defense_check(user.loc))
- log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange")
- shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration)
- else
- . = ..()
-
-/obj/vehicle/sealed/mecha/combat/durand/blob_act(obj/structure/blob/B)
- if(defense_check(B.loc))
- log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red")
- log_message("Attack absorbed by defense field.", LOG_MECHA, color="orange")
- shield.blob_act(B)
- else
- . = ..()
-
-/obj/vehicle/sealed/mecha/combat/durand/attackby(obj/item/W as obj, mob/user as mob, params)
- if(defense_check(user.loc))
- log_message("Attack absorbed by defense field. Attacker - [user], with [W]", LOG_MECHA, color="orange")
- shield.attackby(W, user, params)
- else
- . = ..()
-
-/obj/vehicle/sealed/mecha/combat/durand/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
- if(defense_check(AM.loc))
- log_message("Impact with [AM] absorbed by defense field.", LOG_MECHA, color="orange")
- shield.hitby(AM, skipcatch, hitpush, blocked, throwingdatum)
- else
- . = ..()
-
-/datum/action/vehicle/sealed/mecha/mech_defense_mode
- name = "Toggle an energy shield that blocks all attacks from the faced direction at a heavy power cost."
- button_icon_state = "mech_defense_mode_off"
-
-/datum/action/vehicle/sealed/mecha/mech_defense_mode/Trigger(trigger_flags, forced_state = FALSE)
- SEND_SIGNAL(chassis, COMSIG_MECHA_ACTION_TRIGGER, owner, args) //Signal sent to the mech, to be handed to the shield. See durand.dm for more details
-
-////////////////////////////
-///// Shield processing ////
-////////////////////////////
-
-/**An object to take the hit for us when using the Durand's defense mode.
-It is spawned in during the durand's initilization, and always stays on the same tile.
-Normally invisible, until defense mode is actvated. When the durand detects an attack that should be blocked, the
-attack is passed to the shield. The shield takes the damage, uses it to calculate charge cost, and then sets its
-own integrity back to max. Shield is automatically dropped if we run out of power or the user gets out.*/
-
-/obj/durand_shield //projectiles get passed to this when defense mode is enabled
- name = "defense grid"
- icon = 'icons/mecha/durand_shield.dmi'
- icon_state = "shield_null"
- invisibility = INVISIBILITY_MAXIMUM //no showing on right-click
- pixel_y = 4
- max_integrity = 10000
- anchored = TRUE
- light_system = OVERLAY_LIGHT
- light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE
- light_power = 5
- light_color = LIGHT_COLOR_ELECTRIC_CYAN
- light_on = FALSE
- ///Our link back to the durand
- var/obj/vehicle/sealed/mecha/combat/durand/chassis
- ///To keep track of things during the animation
- var/switching = FALSE
- var/currentuser
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF //The shield should not take damage from fire, lava, or acid; that's the mech's job.
-
-
-/obj/durand_shield/Initialize(mapload, _chassis, _layer, _dir)
- . = ..()
- chassis = _chassis
- layer = _layer
- setDir(_dir)
- RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, PROC_REF(activate))
-
-
-/obj/durand_shield/Destroy()
- if(chassis)
- chassis.shield = null
- chassis = null
- return ..()
-
-/**
- * Handles activating and deactivating the shield.
- *
- * This proc is called by a signal sent from the mech's action button and
- * relayed by the mech itself. The "forced" variable, `signal_args[1]`, will
- * skip the to-pilot text and is meant for when the shield is disabled by
- * means other than the action button (like running out of power).
- *
- * Arguments:
- * * source: the shield
- * * owner: mob that activated the shield
- * * signal_args: whether it's forced
- */
-/obj/durand_shield/proc/activate(datum/source, mob/owner, list/signal_args)
- SIGNAL_HANDLER
- currentuser = owner
- if(!LAZYLEN(chassis?.occupants))
- return
- if(switching && !signal_args[1])
- return
- if(!chassis.defense_mode && (!chassis.cell || chassis.cell.charge < 100)) //If it's off, and we have less than 100 units of power
- chassis.balloon_alert(owner, "insufficient power")
- return
- switching = TRUE
- chassis.defense_mode = !chassis.defense_mode
- if(!signal_args[1])
- chassis.balloon_alert(owner, "shield [chassis.defense_mode?"enabled":"disabled"]")
- chassis.log_message("User has toggled defense mode -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA)
- else
- chassis.log_message("defense mode state changed -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA)
- for(var/occupant in chassis.occupants)
- var/datum/action/button = chassis.occupant_actions[occupant][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
- button.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]"
- button.build_all_button_icons()
-
- set_light_on(chassis.defense_mode)
-
- if(chassis.defense_mode)
- invisibility = 0
- flick("shield_raise", src)
- playsound(src, 'sound/mecha/mech_shield_raise.ogg', 50, FALSE)
- set_light(l_outer_range = MINIMUM_USEFUL_LIGHT_RANGE , l_power = 5, l_color = "#00FFFF")
- icon_state = "shield"
- RegisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE, PROC_REF(resetdir))
- else
- flick("shield_drop", src)
- playsound(src, 'sound/mecha/mech_shield_drop.ogg', 50, FALSE)
- set_light(0)
- icon_state = "shield_null"
- invisibility = INVISIBILITY_MAXIMUM //no showing on right-click
- UnregisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE)
- switching = FALSE
-
-/obj/durand_shield/proc/resetdir(datum/source, olddir, newdir)
- SIGNAL_HANDLER
- setDir(newdir)
-
-/obj/durand_shield/take_damage()
- if(!chassis)
- qdel(src)
- return
- if(!chassis.defense_mode) //if defense mode is disabled, we're taking damage that we shouldn't be taking
- return
- . = ..()
- flick("shield_impact", src)
- if(!chassis.use_power((max_integrity - atom_integrity) * 100))
- chassis.cell?.charge = 0
- for(var/O in chassis.occupants)
- var/mob/living/occupant = O
- var/datum/action/action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode)
- action.Trigger()
- atom_integrity = 10000
-
-/obj/durand_shield/play_attack_sound()
- playsound(src, 'sound/mecha/mech_shield_deflect.ogg', 100, TRUE)
-
-/obj/durand_shield/bullet_act()
- play_attack_sound()
- . = ..()
diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm
deleted file mode 100644
index cc928969d88..00000000000
--- a/code/modules/vehicles/mecha/combat/gygax.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/gygax)
- default_armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/gygax
- desc = "A lightweight, security exosuit. Popular among private and corporate security."
- name = "\improper Gygax"
- icon_state = "gygax"
- base_icon_state = "gygax"
- allow_diagonal_movement = TRUE
- movedelay = 3
- dir_in = 1 //Facing North.
- max_integrity = 250
- max_temperature = 25000
- leg_overload_coeff = 80
- force = 25
- wreckage = /obj/structure/mecha_wreckage/gygax
- max_equip_by_category = list(
- MECHA_UTILITY = 1,
- MECHA_POWER = 1,
- MECHA_ARMOR = 2,
- )
- step_energy_drain = 3
-
-/obj/vehicle/sealed/mecha/combat/gygax/generate_actions()
- . = ..()
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overload_mode)
-
-/datum/action/vehicle/sealed/mecha/mech_overload_mode
- name = "Toggle leg actuators overload"
- button_icon_state = "mech_overload_off"
-
-/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(trigger_flags, forced_state = null)
- if(!owner || !chassis || !(owner in chassis.occupants))
- return
- if(!isnull(forced_state))
- chassis.leg_overload_mode = forced_state
- else
- chassis.leg_overload_mode = !chassis.leg_overload_mode
- button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]"
- chassis.log_message("Toggled leg actuators overload.", LOG_MECHA)
- if(chassis.leg_overload_mode)
- chassis.movedelay = min(1, round(chassis.movedelay * 0.5))
- chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff)
- chassis.balloon_alert(owner,"leg actuators overloaded")
- else
- chassis.movedelay = initial(chassis.movedelay)
- chassis.step_energy_drain = chassis.normal_step_energy_drain
- chassis.balloon_alert(owner, "you disable the overload")
- build_all_button_icons()
-
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/gygax/dark)
- default_armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/gygax/dark
- desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
- name = "\improper Dark Gygax"
- icon_state = "darkgygax"
- base_icon_state = "darkgygax"
- max_integrity = 300
- max_temperature = 35000
- leg_overload_coeff = 70
- force = 30
- operation_req_access = list(ACCESS_SYNDICATE)
- internals_req_access = list(ACCESS_SYNDICATE)
- wreckage = /obj/structure/mecha_wreckage/gygax/dark
- max_equip_by_category = list(
- MECHA_UTILITY = 2,
- MECHA_POWER = 1,
- MECHA_ARMOR = 3,
- )
- equip_by_category = list(
- MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot,
- MECHA_R_ARM = null,
- MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster),
- )
- destruction_sleep_duration = 20
-
-/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize(mapload)
- . = ..()
- max_ammo()
-
-/obj/vehicle/sealed/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new /obj/item/stock_parts/cell/bluespace(src)
diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm
deleted file mode 100644
index 5b33a65cf47..00000000000
--- a/code/modules/vehicles/mecha/combat/honker.dm
+++ /dev/null
@@ -1,67 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/honker)
- default_armor = list(BLUNT = -20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/honker
- desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!"
- name = "\improper H.O.N.K"
- icon_state = "honker"
- base_icon_state = "honker"
- movedelay = 3
- max_integrity = 140
- max_temperature = 25000
- operation_req_access = list(ACCESS_THEATRE)
- internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE)
- wreckage = /obj/structure/mecha_wreckage/honker
- mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
- max_equip_by_category = list(
- MECHA_UTILITY = 2,
- MECHA_POWER = 1,
- MECHA_ARMOR = 0,
- )
- var/squeak = TRUE
-
-/obj/vehicle/sealed/mecha/combat/honker/play_stepsound()
- if(squeak)
- playsound(src, SFX_CLOWN_STEP, 70, 1)
- squeak = !squeak
-
-
-//DARK H.O.N.K.
-
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/honker/dark)
- default_armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/honker/dark
- desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. This one has been painted black for maximum fun. HONK!"
- name = "\improper Dark H.O.N.K"
- icon_state = "darkhonker"
- max_integrity = 300
- max_temperature = 35000
- operation_req_access = list(ACCESS_SYNDICATE)
- internals_req_access = list(ACCESS_SYNDICATE)
- wreckage = /obj/structure/mecha_wreckage/honker/dark
- max_equip_by_category = list(
- MECHA_UTILITY = 1,
- MECHA_POWER = 1,
- MECHA_ARMOR = 3,
- )
-
-/obj/vehicle/sealed/mecha/combat/honker/dark/loaded
- equip_by_category = list(
- MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/honker,
- MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana,
- MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(),
- )
-
-/obj/vehicle/sealed/mecha/combat/honker/dark/add_cell(obj/item/stock_parts/cell/C)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new /obj/item/stock_parts/cell/hyper(src)
-
-/obj/structure/mecha_wreckage/honker/dark
- name = "\improper Dark H.O.N.K wreckage"
- icon_state = "darkhonker-broken"
diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm
deleted file mode 100644
index c030cad9985..00000000000
--- a/code/modules/vehicles/mecha/combat/marauder.dm
+++ /dev/null
@@ -1,130 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/marauder)
- default_armor = list(BLUNT = 50, PUNCTURE = 55, SLASH = 0, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/marauder
- desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
- name = "\improper Marauder"
- icon_state = "marauder"
- base_icon_state = "marauder"
- movedelay = 5
- max_integrity = 500
- max_temperature = 60000
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- operation_req_access = list(ACCESS_CENT_SPECOPS)
- internals_req_access = list(ACCESS_CENT_SPECOPS)
- wreckage = /obj/structure/mecha_wreckage/marauder
- mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
- force = 45
- max_equip_by_category = list(
- MECHA_UTILITY = 3,
- MECHA_POWER = 2,
- MECHA_ARMOR = 3,
- )
- bumpsmash = TRUE
-
-/obj/vehicle/sealed/mecha/combat/marauder/generate_actions()
- . = ..()
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_smoke)
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_zoom)
-
-/obj/vehicle/sealed/mecha/combat/marauder/loaded
- equip_by_category = list(
- MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse,
- MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack,
- MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster),
- )
-
-/obj/vehicle/sealed/mecha/combat/marauder/add_cell(obj/item/stock_parts/cell/C=null)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new /obj/item/stock_parts/cell/bluespace(src)
-
-/datum/action/vehicle/sealed/mecha/mech_smoke
- name = "Smoke"
- button_icon_state = "mech_smoke"
-
-/datum/action/vehicle/sealed/mecha/mech_smoke/Trigger(trigger_flags)
- if(!owner || !chassis || !(owner in chassis.occupants))
- return
- if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_SMOKE) && chassis.smoke_charges>0)
- chassis.smoke_system.start()
- chassis.smoke_charges--
- TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_SMOKE, chassis.smoke_cooldown)
-
-/datum/action/vehicle/sealed/mecha/mech_zoom
- name = "Zoom"
- button_icon_state = "mech_zoom_off"
-
-/datum/action/vehicle/sealed/mecha/mech_zoom/Trigger(trigger_flags)
- if(!owner?.client || !chassis || !(owner in chassis.occupants))
- return
- chassis.zoom_mode = !chassis.zoom_mode
- button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]"
- chassis.log_message("Toggled zoom mode.", LOG_MECHA)
- to_chat(owner, "[icon2html(chassis, owner)]Zoom mode [chassis.zoom_mode?"en":"dis"]abled.")
- if(chassis.zoom_mode)
- owner.client.view_size.setTo(4.5)
- SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg', volume=50))
- else
- owner.client.view_size.resetToDefault()
- build_all_button_icons()
-
-/obj/vehicle/sealed/mecha/combat/marauder/seraph
- desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
- name = "\improper Seraph"
- icon_state = "seraph"
- base_icon_state = "seraph"
- operation_req_access = list(ACCESS_CENT_SPECOPS)
- internals_req_access = list(ACCESS_CENT_SPECOPS)
- movedelay = 3
- max_integrity = 550
- wreckage = /obj/structure/mecha_wreckage/seraph
- force = 55
- max_equip_by_category = list(
- MECHA_UTILITY = 3,
- MECHA_POWER = 2,
- MECHA_ARMOR = 3,
- )
- equip_by_category = list(
- MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse,
- MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack,
- MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster),
- )
-
-/obj/vehicle/sealed/mecha/combat/marauder/mauler
- desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
- name = "\improper Mauler"
- icon_state = "mauler"
- base_icon_state = "mauler"
- operation_req_access = list(ACCESS_SYNDICATE)
- internals_req_access = list(ACCESS_SYNDICATE)
- wreckage = /obj/structure/mecha_wreckage/mauler
- max_equip_by_category = list(
- MECHA_UTILITY = 3,
- MECHA_POWER = 2,
- MECHA_ARMOR = 4,
- )
- equip_by_category = list(
- MECHA_L_ARM = null,
- MECHA_R_ARM = null,
- MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(),
- )
- destruction_sleep_duration = 20
-
-/obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded
- equip_by_category = list(
- MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
- MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack,
- MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster),
- )
-
diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm
deleted file mode 100644
index 6cfc83f5855..00000000000
--- a/code/modules/vehicles/mecha/combat/phazon.dm
+++ /dev/null
@@ -1,61 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/phazon)
- default_armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/phazon
- desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials."
- name = "\improper Phazon"
- icon_state = "phazon"
- base_icon_state = "phazon"
- movedelay = 2
- dir_in = 2 //Facing South.
- step_energy_drain = 3
- max_integrity = 200
- max_temperature = 25000
- wreckage = /obj/structure/mecha_wreckage/phazon
- force = 15
- max_equip_by_category = list(
- MECHA_UTILITY = 1,
- MECHA_POWER = 1,
- MECHA_ARMOR = 2,
- )
- phase_state = "phazon-phase"
-
-/obj/vehicle/sealed/mecha/combat/phazon/generate_actions()
- . = ..()
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_phasing)
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_switch_damtype)
-
-/datum/action/vehicle/sealed/mecha/mech_switch_damtype
- name = "Reconfigure arm microtool arrays"
- button_icon_state = "mech_damtype_brute"
-
-/datum/action/vehicle/sealed/mecha/mech_switch_damtype/Trigger(trigger_flags)
- if(!owner || !chassis || !(owner in chassis.occupants))
- return
- var/new_damtype
- switch(chassis.damtype)
- if(TOX)
- new_damtype = BRUTE
- chassis.balloon_alert(owner, "your punches will now deal brute damage")
- if(BRUTE)
- new_damtype = BURN
- chassis.balloon_alert(owner, "your punches will now deal burn damage")
- if(BURN)
- new_damtype = TOX
- chassis.balloon_alert(owner,"your punches will now deal toxin damage")
- chassis.damtype = new_damtype
- button_icon_state = "mech_damtype_[new_damtype]"
- playsound(chassis, 'sound/mecha/mechmove01.ogg', 50, TRUE)
- build_all_button_icons()
-
-/datum/action/vehicle/sealed/mecha/mech_toggle_phasing
- name = "Toggle Phasing"
- button_icon_state = "mech_phasing_off"
-
-/datum/action/vehicle/sealed/mecha/mech_toggle_phasing/Trigger(trigger_flags)
- if(!owner || !chassis || !(owner in chassis.occupants))
- return
- chassis.phasing = chassis.phasing ? "" : "phasing"
- button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]"
- chassis.balloon_alert(owner, "[chassis.phasing ? "enabled" : "disabled"] phasing")
- build_all_button_icons()
diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm
deleted file mode 100644
index aea5c7c5122..00000000000
--- a/code/modules/vehicles/mecha/combat/reticence.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/reticence)
- default_armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/reticence
- desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
- name = "\improper reticence"
- icon_state = "reticence"
- base_icon_state = "reticence"
- movedelay = 2
- dir_in = 1 //Facing North.
- max_integrity = 100
- max_temperature = 15000
- wreckage = /obj/structure/mecha_wreckage/reticence
- operation_req_access = list(ACCESS_THEATRE)
- internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE)
- mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE
- max_equip_by_category = list(
- MECHA_UTILITY = 1,
- MECHA_POWER = 1,
- MECHA_ARMOR = 1,
- )
- step_energy_drain = 3
- color = "#87878715"
-
-/obj/vehicle/sealed/mecha/combat/reticence/loaded
- equip_by_category = list(
- MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced,
- MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/rcd,
- MECHA_UTILITY = list(),
- MECHA_POWER = list(),
- MECHA_ARMOR = list(),
- )
diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm
deleted file mode 100644
index baff31224bd..00000000000
--- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm
+++ /dev/null
@@ -1,366 +0,0 @@
-///how much time between charge_level going up by 1
-#define SKYFALL_SINGLE_CHARGE_TIME 2 SECONDS
-///enough charge level to take off, basically done charging
-#define SKYFALL_CHARGELEVEL_LAUNCH 5
-
-///how much time you're in the air
-#define TOTAL_SKYFALL_LEAP_TIME 3 SECONDS
-
-/**
- * ## Savannah-Ivanov!
- *
- * A two person mecha that delegates moving to the driver and shooting to the pilot.
- * ...Hilarious, right?
- */
-TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/savannah_ivanov)
- default_armor = list(BLUNT = 45, PUNCTURE = 40, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100)
-
-/obj/vehicle/sealed/mecha/combat/savannah_ivanov
- name = "\improper Savannah-Ivanov"
- desc = "An insanely overbulked mecha that handily crushes single-pilot opponents. The price is that you need two pilots to use it."
- icon = 'icons/mecha/coop_mech.dmi'
- base_icon_state = "savannah_ivanov"
- icon_state = "savannah_ivanov_0_0"
- //does not include mmi compatibility
- mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS
- movedelay = 3
- max_integrity = 450 //really tanky, like damn
- max_temperature = 30000
- wreckage = /obj/structure/mecha_wreckage/savannah_ivanov
- max_occupants = 2
- max_equip_by_category = list(
- MECHA_UTILITY = 1,
- MECHA_POWER = 1,
- MECHA_ARMOR = 3,
- )
- //no tax on flying, since the power cost is in the leap itself.
- phasing_energy_drain = 0
-
-/obj/vehicle/sealed/mecha/combat/savannah_ivanov/get_mecha_occupancy_state()
- var/driver_present = driver_amount() != 0
- var/gunner_present = return_amount_of_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT) > 0
- var/list/mob/drivers = return_drivers()
- var/leap_state
- if(length(drivers))
- var/datum/action/vehicle/sealed/mecha/skyfall/action = LAZYACCESSASSOC(occupant_actions, drivers[1], /datum/action/vehicle/sealed/mecha/skyfall)
- leap_state = action.skyfall_charge_level > 2 ? "leap_" : ""
- return "[base_icon_state]_[leap_state][gunner_present]_[driver_present]"
-
-/obj/vehicle/sealed/mecha/combat/savannah_ivanov/auto_assign_occupant_flags(mob/new_occupant)
- if(driver_amount() < max_drivers) //movement
- add_control_flags(new_occupant, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS)
- else //weapons
- add_control_flags(new_occupant, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT)
-
-/obj/vehicle/sealed/mecha/combat/savannah_ivanov/generate_actions()
- initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/swap_seat)
- . = ..()
- initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/skyfall, VEHICLE_CONTROL_DRIVE)
- initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/ivanov_strike, VEHICLE_CONTROL_EQUIPMENT)
-
-///Savannah Skyfall
-/datum/action/vehicle/sealed/mecha/skyfall
- name = "Savannah Skyfall"
- button_icon_state = "mech_savannah"
- ///cooldown time between skyfall uses
- var/skyfall_cooldown_time = 1 MINUTES
- ///skyfall builds up in charges every 2 seconds, when it reaches 5 charges the ability actually starts
- var/skyfall_charge_level = 0
-
-/datum/action/vehicle/sealed/mecha/skyfall/Trigger(trigger_flags)
- if(!owner || !chassis || !(owner in chassis.occupants))
- return
- if(chassis.phasing)
- to_chat(owner, span_warning("You're already airborne!"))
- return
- if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_SKYFALL))
- var/timeleft = S_TIMER_COOLDOWN_TIMELEFT(chassis, COOLDOWN_MECHA_SKYFALL)
- to_chat(owner, span_warning("You need to wait [DisplayTimeText(timeleft, 1)] before attempting to Skyfall."))
- return
- if(skyfall_charge_level)
- abort_skyfall()
- return
- chassis.balloon_alert(owner, "charging skyfall...")
- INVOKE_ASYNC(src, PROC_REF(skyfall_charge_loop))
-
-/**
- * ## skyfall_charge_loop
- *
- * The actual skyfall loop itself. Repeatedly calls itself after a do_after, so any interruptions will call abort_skyfall and end the loop
- * the other way the loop ends is if charge level (var it's ticking up) gets to SKYFALL_CHARGELEVEL_LAUNCH, in which case it ends the loop and does the ability.
- */
-/datum/action/vehicle/sealed/mecha/skyfall/proc/skyfall_charge_loop()
- if(!do_after(owner, chassis, SKYFALL_SINGLE_CHARGE_TIME))
- abort_skyfall()
- return
- skyfall_charge_level++
- switch(skyfall_charge_level)
- if(1)
- chassis.visible_message(span_warning("[chassis] clicks and whirrs for a moment, with a low hum emerging from the legs."))
- playsound(chassis, 'sound/items/rped.ogg', 50, TRUE)
- if(2)
- chassis.visible_message(span_warning("[chassis] begins to shake, the sounds of electricity growing louder."))
- chassis.Shake(1, 1, SKYFALL_SINGLE_CHARGE_TIME-1) // -1 gives space between the animates, so they don't interrupt eachother
- if(3)
- chassis.visible_message(span_warning("[chassis] assumes a pose as it rattles violently."))
- chassis.Shake(2, 2, SKYFALL_SINGLE_CHARGE_TIME-1) // -1 gives space between the animates, so they don't interrupt eachother
- chassis.spark_system.start()
- chassis.update_appearance(UPDATE_ICON_STATE)
- if(4)
- chassis.visible_message(span_warning("[chassis] sparks and shutters as it finalizes preparation."))
- playsound(chassis, 'sound/mecha/skyfall_power_up.ogg', 50, TRUE)
- chassis.Shake(3, 3, SKYFALL_SINGLE_CHARGE_TIME-1) // -1 gives space between the animates, so they don't interrupt eachother
- chassis.spark_system.start()
- if(SKYFALL_CHARGELEVEL_LAUNCH)
- chassis.visible_message(span_danger("[chassis] leaps into the air!"))
- playsound(chassis, 'sound/weapons/gun/general/rocket_launch.ogg', 50, TRUE)
- if(skyfall_charge_level != SKYFALL_CHARGELEVEL_LAUNCH)
- skyfall_charge_loop()
- return
- S_TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_SKYFALL, skyfall_cooldown_time)
- button_icon_state = "mech_savannah_cooldown"
- build_all_button_icons()
- addtimer(CALLBACK(src, PROC_REF(reset_button_icon)), skyfall_cooldown_time)
- for(var/mob/living/shaken in range(7, chassis))
- shake_camera(shaken, 3, 3)
-
- var/turf/launch_turf = get_turf(chassis)
- //new /obj/effect/hotspot(launch_turf)
- launch_turf.create_fire(1, 10)
- launch_turf.hotspot_expose(700, 50, 1)
- new /obj/effect/skyfall_landingzone(launch_turf, chassis)
- chassis.resistance_flags |= INDESTRUCTIBLE //not while jumping at least
- chassis.mecha_flags |= QUIET_STEPS|QUIET_TURNS|CANNOT_INTERACT
- chassis.phasing = "flying"
- chassis.movedelay = 1
- chassis.density = FALSE
- chassis.layer = ABOVE_ALL_MOB_LAYER
- animate(chassis, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL)
- animate(chassis, pixel_z = 400, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) //Animate our rising mech (just like pods hehe)
- addtimer(CALLBACK(src, PROC_REF(begin_landing)), 2 SECONDS)
-
-/**
- * ## begin_landing
- *
- * Called by skyfall_charge_loop after some time if it reaches full charge level.
- * it's just the animations of the mecha coming down + another timer for the final landing effect
- */
-/datum/action/vehicle/sealed/mecha/skyfall/proc/begin_landing()
- animate(chassis, pixel_z = 0, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL)
- animate(chassis, alpha = 255, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL)
- addtimer(CALLBACK(src, PROC_REF(land)), 1 SECONDS)
-
-/**
- * ## land
- *
- * Called by skyfall_charge_loop after some time if it reaches full charge level.
- * it's just the animations of the mecha coming down + another timer for the final landing effect
- */
-/datum/action/vehicle/sealed/mecha/skyfall/proc/land()
- chassis.visible_message(span_danger("[chassis] lands from above!"))
- playsound(chassis, 'sound/effects/explosion1.ogg', 50, 1)
- chassis.resistance_flags &= ~INDESTRUCTIBLE
- chassis.mecha_flags &= ~(QUIET_STEPS|QUIET_TURNS|CANNOT_INTERACT)
- chassis.phasing = initial(chassis.phasing)
- chassis.movedelay = initial(chassis.movedelay)
- chassis.density = TRUE
- chassis.layer = initial(chassis.layer)
- skyfall_charge_level = 0
- chassis.update_appearance(UPDATE_ICON_STATE)
- for(var/mob/living/shaken in range(7, chassis))
- shake_camera(shaken, 5, 5)
- var/turf/landed_on = get_turf(chassis)
- for(var/thing in range(1, chassis))
- if(isopenturf(thing))
- var/turf/open/floor/crushed_tile = thing
- crushed_tile.break_tile()
- continue
- if(isclosedturf(thing) && thing == landed_on)
- var/turf/closed/crushed_wall = thing
- crushed_wall.ScrapeAway()
- continue
- if(isobj(thing))
- var/obj/crushed_object = thing
- if(crushed_object == chassis || crushed_object.loc == chassis)
- continue
- crushed_object.take_damage(150) //same as a hulk punch, makes sense to me
- continue
- if(isliving(thing))
- var/mob/living/crushed_victim = thing
- if(crushed_victim in chassis.occupants)
- continue
- if(!(crushed_victim in landed_on))
- to_chat(crushed_victim, span_userdanger("The tremors from [chassis] landing sends you flying!"))
- var/fly_away_direction = get_dir(chassis, crushed_victim)
- crushed_victim.throw_at(get_edge_target_turf(crushed_victim, fly_away_direction), 4, 3)
- crushed_victim.adjustBruteLoss(15)
- continue
- to_chat(crushed_victim, span_userdanger("[chassis] crashes down on you from above!"))
- if(crushed_victim.stat != CONSCIOUS)
- crushed_victim.gib(FALSE, FALSE, FALSE)
- continue
- crushed_victim.adjustBruteLoss(80)
-
-/**
- * ## abort_skyfall
- *
- * Called by skyfall_charge_loop if the charging is interrupted.
- * Applies cooldown and resets charge level
- */
-/datum/action/vehicle/sealed/mecha/skyfall/proc/abort_skyfall()
- chassis.balloon_alert(owner, "skyfall aborted")
- S_TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_MISSILE_STRIKE, skyfall_charge_level * 10 SECONDS) //so aborting skyfall later in the process imposes a longer cooldown
- skyfall_charge_level = 0
- chassis.update_appearance(UPDATE_ICON_STATE)
-
-/**
- * ## reset_button_icon
- *
- * called after an addtimer when the cooldown is finished with the skyfall, resets the icon
- */
-/datum/action/vehicle/sealed/mecha/skyfall/proc/reset_button_icon()
- button_icon_state = "mech_savannah"
- build_all_button_icons()
-
-/datum/action/vehicle/sealed/mecha/ivanov_strike
- name = "Ivanov Strike"
- button_icon_state = "mech_ivanov"
- ///cooldown time between strike uses
- var/strike_cooldown_time = 40 SECONDS
- ///how many rockets can we send with ivanov strike
- var/rockets_left = 0
- var/aiming_missile = FALSE
-
-/datum/action/vehicle/sealed/mecha/ivanov_strike/Destroy()
- if(aiming_missile)
- end_missile_targeting()
- return ..()
-
-/datum/action/vehicle/sealed/mecha/ivanov_strike/Trigger(trigger_flags)
- if(!owner || !chassis || !(owner in chassis.occupants))
- return
- if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_MISSILE_STRIKE))
- var/timeleft = S_TIMER_COOLDOWN_TIMELEFT(chassis, COOLDOWN_MECHA_MISSILE_STRIKE)
- to_chat(owner, span_warning("You need to wait [DisplayTimeText(timeleft, 1)] before firing another Ivanov Strike."))
- return
- if(aiming_missile)
- end_missile_targeting()
- else
- start_missile_targeting()
-
-/**
- * ## reset_button_icon
- *
- * called after an addtimer when the cooldown is finished with the ivanov strike, resets the icon
- */
-/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/reset_button_icon()
- button_icon_state = "mech_ivanov"
- build_all_button_icons()
-
-/**
- * ## start_missile_targeting
- *
- * Called by the ivanov strike datum action, hooks signals into clicking to call drop_missile
- * Plus other flavor like the overlay
- */
-/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/start_missile_targeting()
- chassis.balloon_alert(owner, "missile mode on (click to target)")
- aiming_missile = TRUE
- rockets_left = 3
- RegisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK, PROC_REF(on_melee_click))
- RegisterSignal(chassis, COMSIG_MECHA_EQUIPMENT_CLICK, PROC_REF(on_equipment_click))
- owner.client.mouse_override_icon = 'icons/effects/mouse_pointers/supplypod_down_target.dmi'
- owner.update_mouse_pointer()
- owner.overlay_fullscreen("ivanov", /atom/movable/screen/fullscreen/ivanov_display, 1)
- SEND_SOUND(owner, 'sound/machines/terminal_on.ogg') //spammable so I don't want to make it audible to anyone else
-
-/**
- * ## end_missile_targeting
- *
- * Called by the ivanov strike datum action or other actions that would end targetting
- * Unhooks signals into clicking to call drop_missile plus other flavor like the overlay
- */
-/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/end_missile_targeting()
- aiming_missile = FALSE
- rockets_left = 0
- UnregisterSignal(chassis, list(COMSIG_MECHA_MELEE_CLICK, COMSIG_MECHA_EQUIPMENT_CLICK))
- owner.client.mouse_override_icon = null
- owner.update_mouse_pointer()
- owner.clear_fullscreen("ivanov")
-
-///signal called from clicking with no equipment
-/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/on_melee_click(datum/source, mob/living/pilot, atom/target, on_cooldown, is_adjacent)
- SIGNAL_HANDLER
- if(!target)
- return
- drop_missile(get_turf(target))
-
-///signal called from clicking with equipment
-/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/on_equipment_click(datum/source, mob/living/pilot, atom/target)
- SIGNAL_HANDLER
- if(!target)
- return
- drop_missile(get_turf(target))
-
-/**
- * ## drop_missile
- *
- * Called via intercepted clicks when the missile ability is active
- * Spawns a droppod and starts the cooldown of the missile strike ability
- * arguments:
- * * target_turf: turf of the atom that was clicked on
- */
-/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/drop_missile(turf/target_turf)
- rockets_left--
- if(rockets_left <= 0)
- end_missile_targeting()
- SEND_SOUND(owner, 'sound/machines/triple_beep.ogg')
- S_TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_MISSILE_STRIKE, strike_cooldown_time)
- podspawn(list(
- "target" = target_turf,
- "style" = STYLE_MISSILE,
- "effectMissile" = TRUE,
- "explosionSize" = list(0,0,1,2)
- ))
- button_icon_state = "mech_ivanov_cooldown"
- build_all_button_icons()
- addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/ivanov_strike, reset_button_icon)), strike_cooldown_time)
-
-//misc effects
-
-///a simple indicator of where the skyfall is going to land.
-/obj/effect/skyfall_landingzone
- name = "Landing Zone Indicator"
- desc = "A holographic projection designating the landing zone of something. It's probably best to stand back."
- icon = 'icons/mob/telegraphing/telegraph_96x96.dmi'
- icon_state = "target_largebox"
- layer = BELOW_MOB_LAYER
- pixel_x = -32
- pixel_y = -32
- alpha = 0
- ///reference to mecha following
- var/obj/vehicle/sealed/mecha/combat/mecha
-
-/obj/effect/skyfall_landingzone/Initialize(mapload, obj/vehicle/sealed/mecha/combat/mecha)
- . = ..()
- if(!mecha)
- stack_trace("Skyfall landing zone created without mecha")
- return INITIALIZE_HINT_QDEL
- src.mecha = mecha
- animate(src, alpha = 255, TOTAL_SKYFALL_LEAP_TIME/2, easing = CIRCULAR_EASING|EASE_OUT)
- RegisterSignal(mecha, COMSIG_MOVABLE_MOVED, PROC_REF(follow))
- QDEL_IN(src, TOTAL_SKYFALL_LEAP_TIME) //when the animations land
-
-/obj/effect/skyfall_landingzone/Destroy(force)
- mecha = null
- return ..()
-
-///called when the mecha moves
-/obj/effect/skyfall_landingzone/proc/follow(datum/source_mecha)
- SIGNAL_HANDLER
- forceMove(get_turf(source_mecha))
-
-#undef SKYFALL_SINGLE_CHARGE_TIME
-#undef SKYFALL_CHARGELEVEL_LAUNCH
-
-#undef TOTAL_SKYFALL_LEAP_TIME
diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm
deleted file mode 100644
index 81553175040..00000000000
--- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * Mecha Equipment
- * All mech equippables are currently childs of this
- */
-/obj/item/mecha_parts/mecha_equipment
- name = "mecha equipment"
- icon = 'icons/mecha/mecha_equipment.dmi'
- icon_state = "mecha_equip"
- force = 5
- max_integrity = 300
- /// Determines what "slot" this attachment will try to attach to on a mech
- var/equipment_slot = MECHA_WEAPON
- ///Cooldown in ticks required between activations of the equipment
- var/equip_cooldown = 0
- ///used for equipment that can be turned on/off, boolean
- var/activated = TRUE
- ///Chassis power cell quantity used on activation
- var/energy_drain = 0
- ///Reference to mecha that this equipment is currently attached to
- var/obj/vehicle/sealed/mecha/chassis
- ///Bitflag. Determines the range of the equipment.
- var/range = MECHA_MELEE
- /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this.
- var/mech_flags = NONE
- ///boolean: FALSE if this equipment can not be removed/salvaged
- var/detachable = TRUE
- ///Boolean: whether a pacifist can use this equipment
- var/harmful = FALSE
- ///Sound file: Sound to play when this equipment is destroyed while still attached to the mech
- var/destroy_sound = 'sound/mecha/critdestr.ogg'
-
-/obj/item/mecha_parts/mecha_equipment/Destroy()
- if(chassis)
- detach(get_turf(src))
- log_message("[src] is destroyed.", LOG_MECHA)
- if(LAZYLEN(chassis.occupants))
- to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_danger("[src] is destroyed!")]")
- playsound(chassis, destroy_sound, 50)
- chassis = null
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE)
- if(can_attach(M, attach_right))
- if(!user.temporarilyRemoveItemFromInventory(src))
- return FALSE
- attach(M, attach_right)
- user.visible_message(span_notice("[user] attaches [src] to [M]."), span_notice("You attach [src] to [M]."))
- return TRUE
- to_chat(user, span_warning("You are unable to attach [src] to [M]!"))
- return FALSE
-
-/obj/item/mecha_parts/mecha_equipment/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
- . = ..()
- switch(action)
- if("detach")
- detach(get_turf(src))
- return TRUE
- if("toggle")
- activated = !activated
- return TRUE
- if("repair")
- ui.close() // allow watching for baddies and the ingame effects
- chassis.balloon_alert(usr, "starting repair")
- while(do_after(usr, chassis, 1 SECONDS) && get_integrity() < max_integrity)
- repair_damage(30)
- if(get_integrity() == max_integrity)
- balloon_alert(usr, "repair complete")
- return FALSE
-
-/**
- * Checks whether this mecha equipment can be activated
- * Returns a bool
- * Arguments:
- * * target: atom we are activating/clicked on
- */
-/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target)
- if(!target)
- return FALSE
- if(!chassis)
- return FALSE
- if(!activated)
- return FALSE
- if(energy_drain && !chassis?.has_charge(energy_drain))
- return FALSE
- if(chassis.is_currently_ejecting)
- return FALSE
- if(chassis.equipment_disabled)
- to_chat(chassis.occupants, span_warning("Error -- Equipment control unit is unresponsive."))
- return FALSE
- if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_EQUIPMENT(type)))
- return FALSE
- return TRUE
-
-/obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, list/modifiers)
- TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment
- chassis.use_power(energy_drain)
- return TRUE
-
-/**
- * Cooldown proc variant for using do_afters between activations instead of timers
- * Example of usage is mech drills, rcds
- * arguments:
- * * target: targetted atom for action activation
- * * user: occupant to display do after for
- * * interaction_key: interaction key to pass to [/proc/do_after]
- */
-/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key)
- if(!chassis)
- return FALSE
- chassis.use_power(energy_drain)
- return do_after(user, target, equip_cooldown, extra_checks = CALLBACK(src, PROC_REF(do_after_checks), target), interaction_key = interaction_key)
-
-///Do after wrapper for mecha equipment
-/obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, mob/user, delay)
- return do_after(user, target, delay, extra_checks = CALLBACK(src, PROC_REF(do_after_checks), target))
-
-/// do after checks for the mecha equipment do afters
-/obj/item/mecha_parts/mecha_equipment/proc/do_after_checks(atom/target)
- return chassis && (get_dir(chassis, target) & chassis.dir)
-
-/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE)
- return default_can_attach(M, attach_right)
-
-/obj/item/mecha_parts/mecha_equipment/proc/default_can_attach(obj/vehicle/sealed/mecha/mech, attach_right = FALSE)
- if(equipment_slot == MECHA_WEAPON)
- if(attach_right)
- if(mech.equip_by_category[MECHA_R_ARM])
- return FALSE
- else
- if(mech.equip_by_category[MECHA_L_ARM])
- return FALSE
- return TRUE
- return length(mech.equip_by_category[equipment_slot]) < mech.max_equip_by_category[equipment_slot]
-
-/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE)
- LAZYADD(M.flat_equipment, src)
- var/to_equip_slot = equipment_slot
- if(equipment_slot == MECHA_WEAPON)
- if(attach_right)
- to_equip_slot = MECHA_R_ARM
- else
- to_equip_slot = MECHA_L_ARM
- if(islist(M.equip_by_category[to_equip_slot]))
- M.equip_by_category[to_equip_slot] += src
- else
- M.equip_by_category[to_equip_slot] = src
- chassis = M
- forceMove(M)
- log_message("[src] initialized.", LOG_MECHA)
-
-/**
- * called to detach this equipment
- * Args:
- * * moveto: optional target to move this equipment to
- */
-/obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto)
- moveto = moveto || get_turf(chassis)
- forceMove(moveto)
- LAZYREMOVE(chassis.flat_equipment, src)
- var/to_unequip_slot = equipment_slot
- if(equipment_slot == MECHA_WEAPON)
- if(chassis.equip_by_category[MECHA_R_ARM] == src)
- to_unequip_slot = MECHA_R_ARM
- else
- to_unequip_slot = MECHA_L_ARM
- if(islist(chassis.equip_by_category[to_unequip_slot]))
- chassis.equip_by_category[to_unequip_slot] -= src
- else
- chassis.equip_by_category[to_unequip_slot] = null
- log_message("[src] removed from equipment.", LOG_MECHA)
- chassis = null
-
-/obj/item/mecha_parts/mecha_equipment/log_message(message, message_type=LOG_GAME, color=null, log_globally)
- if(chassis)
- return chassis.log_message("ATTACHMENT: [src] [message]", message_type, color)
- return ..()
-
-/**
- * ## get_snowflake_data
- * handles the returning of snowflake data required by the UI of the mecha
- * not the prettiest of procs honeslty
- * returns:
- * * an assoc list
- * * must include an list("snowflake_id" = snowflake_id)
- */
-/obj/item/mecha_parts/mecha_equipment/proc/get_snowflake_data()
- return list()
-
-/**
- * Proc for reloading weapons from HTML UI or by AI
- * note that this is old and likely broken code
- */
-/obj/item/mecha_parts/mecha_equipment/proc/rearm()
- return FALSE
-
-/// AI mech pilot: returns TRUE if the Ai should try to reload the mecha
-/obj/item/mecha_parts/mecha_equipment/proc/needs_rearm()
- return FALSE
diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm
deleted file mode 100644
index 4d1002f5567..00000000000
--- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm
+++ /dev/null
@@ -1,538 +0,0 @@
-// Sleeper, Medical Beam, and Syringe gun
-
-/obj/item/mecha_parts/mecha_equipment/medical
- mech_flags = EXOSUIT_MODULE_MEDICAL
-
-/obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE)
- . = ..()
- if(!ismedicalmecha(M))
- return FALSE
-
-
-/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/M)
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/mecha_parts/mecha_equipment/medical/process()
- if(!chassis)
- return PROCESS_KILL
-
-/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/detach()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper
- name = "mounted sleeper"
- desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper"
- energy_drain = 20
- range = MECHA_MELEE
- equip_cooldown = 20
- ///ref to the patient loaded in the sleeper
- var/mob/living/carbon/patient
- /// amount of chems to inject into patient from other hands syringe gun
- var/inject_amount = 10
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Destroy()
- for(var/atom/movable/content as anything in src)
- content.forceMove(get_turf(src))
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/get_snowflake_data()
- var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_SLEEPER)
- if(!patient)
- return data
- data["patient"] = list(
- "patientname" = patient.name,
- "is_dead" = patient.stat == DEAD,
- "patient_health" = patient.health/patient.maxHealth,
- )
- return data
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/ui_act(action, list/params)
- . = ..()
- if(.)
- return
- switch(action)
- if("eject")
- go_out()
- return TRUE
- if("view_stats")
- usr << browse(get_patient_stats(),"window=msleeper")
- onclose(usr, "msleeper")
- return FALSE
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, atom/atomtarget, list/modifiers)
- if(!action_checks(atomtarget))
- return
- if(!iscarbon(atomtarget))
- return
- var/mob/living/carbon/target = atomtarget
- if(!patient_insertion_check(target))
- return
- to_chat(source, "[icon2html(src, source)][span_notice("You start putting [target] into [src]...")]")
- chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src]."))
- if(!do_after(source, target, equip_cooldown, extra_checks=CALLBACK(src, PROC_REF(patient_insertion_check), target, source)))
- return
- if(!chassis || !(get_dir(chassis, target) & chassis.dir))
- return
- target.forceMove(src)
- patient = target
- START_PROCESSING(SSobj, src)
- to_chat(source, "[icon2html(src, source)][span_notice("[target] successfully loaded into [src]. Life support functions engaged.")]")
- chassis.visible_message(span_warning("[chassis] loads [target] into [src]."))
- log_message("[target] loaded. Life support functions engaged.", LOG_MECHA)
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/patient_insertion_check(mob/living/carbon/target, mob/user)
- if(target.buckled)
- to_chat(user, "[icon2html(src, user)][span_warning("[target] will not fit into the sleeper because [target.p_theyre()] buckled to [target.buckled]!")]")
- return FALSE
- if(target.has_buckled_mobs())
- to_chat(user, "[icon2html(src, user)][span_warning("[target] will not fit into the sleeper because of the creatures attached to it!")]")
- return FALSE
- if(patient)
- to_chat(user, "[icon2html(src, user)][span_warning("The sleeper is already occupied!")]")
- return FALSE
- return TRUE
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/go_out()
- if(!patient)
- return
- patient.forceMove(get_turf(src))
- to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("[patient] ejected. Life support functions disabled.")]")
- log_message("[patient] ejected. Life support functions disabled.", LOG_MECHA)
- STOP_PROCESSING(SSobj, src)
- patient = null
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/detach()
- if(patient)
- to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Unable to detach [src] - equipment occupied!")]")
- return
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Topic(href,href_list)
- . = ..()
- if(.)
- return
- if(!(usr in chassis.occupants))
- return
- if(href_list["inject"])
- var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate() in chassis
- var/datum/reagent/R = locate(href_list["inject"]) in SG.reagents.reagent_list
- if(istype(R))
- inject_reagent(R, SG)
-
-/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats()
- if(!patient)
- return
- return {"
-
-
- [patient] statistics
-
-
-
-
-