diff --git a/code/modules/mechs/components/arms.dm b/code/modules/mechs/components/arms.dm
index 5956576aa5f67..1511d2110e6e2 100644
--- a/code/modules/mechs/components/arms.dm
+++ b/code/modules/mechs/components/arms.dm
@@ -80,6 +80,7 @@
name = "combat arms"
exosuit_desc_string = "flexible, advanced manipulators"
icon_state = "combat_arms"
- melee_damage = 5
+ melee_damage = 15
action_delay = 10
+ max_damage = 45
power_use = 50
diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm
index 18623fccf5ca8..4aa743fb6ed93 100644
--- a/code/modules/mechs/components/body.dm
+++ b/code/modules/mechs/components/body.dm
@@ -336,6 +336,8 @@
pilot_coverage = 100
exosuit_desc_string = "an armoured chassis"
icon_state = "combat_body"
+ max_damage = 120
+ mech_health = 250
power_use = 40
/obj/item/mech_component/chassis/combat/prebuild()
diff --git a/code/modules/mechs/components/legs.dm b/code/modules/mechs/components/legs.dm
index 2dacc9dbc55e9..6d56869b60bcd 100644
--- a/code/modules/mechs/components/legs.dm
+++ b/code/modules/mechs/components/legs.dm
@@ -102,7 +102,7 @@
desc = "A classic brought back. The Hephaestus' Landmaster class tracks are impervious to most damage and can maintain top speed regardless of load. Watch out for corners."
icon_state = "tracks"
max_damage = 150
- move_delay = 2 //It´s fast
+ move_delay = 1 //It´s fast
turn_delay = 7
power_use = 150
@@ -120,6 +120,7 @@
name = "combat legs"
exosuit_desc_string = "sleek hydraulic legs"
icon_state = "combat_legs"
- move_delay = 3
- turn_delay = 3
+ move_delay = 4
+ turn_delay = 4
+ max_damage = 130
power_use = 20
diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm
index 1797a930a97fb..2d9e1018dbfbf 100644
--- a/code/modules/mechs/equipment/combat.dm
+++ b/code/modules/mechs/equipment/combat.dm
@@ -606,3 +606,75 @@
if(owner)
owner.update_icon()
+
+//PRX MECH BALLISTIC
+
+/obj/item/gun/energy/mech_minigun/mounted
+ name = "mech machingegun"
+ desc = "You shouldn't see this!"
+ icon = 'proxima/icons/obj/guns/guns.dmi'
+ icon_state = "minigun"
+ force = 10
+ projectile_type = /obj/item/projectile/bullet/rifle/military
+ max_shots = 100
+ multi_aim = 1
+ fire_delay=0
+ autofire_enabled=1
+ burst = 5
+ accuracy = 3
+ bulk = GUN_BULK_RIFLE
+ w_class = ITEM_SIZE_HUGE
+ one_hand_penalty= 0
+
+ self_recharge = TRUE
+ recharge_time = 3
+ use_external_power = TRUE
+ has_safety = FALSE
+
+/obj/item/mech_equipment/mounted_system/taser/minigun
+ name = "mounted gatling gun"
+ desc = "An exosuit-mounted gatling gun.You will need 12 thousand tallers to shoot 4 seconds from this cannon."
+ icon_state = "mech_ballistic2"
+ holding_type = /obj/item/gun/energy/mech_minigun/mounted
+ restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND)
+ restricted_software = list(MECH_SOFTWARE_WEAPONS)
+
+/obj/item/gun/energy/rocket_launcher/mounted
+ name = "rocket launcher"
+ desc = "You shouldn't see this!"
+ icon = 'proxima/icons/obj/guns/guns.dmi'
+ icon_state = "syndie_mgl"
+ force = 10
+ projectile_type = /obj/item/projectile/rocket_le
+ max_shots = 6
+ multi_aim = 1
+ fire_delay=0
+ autofire_enabled=1
+ burst = 1
+ accuracy = -1
+ bulk = GUN_BULK_RIFLE
+ w_class = ITEM_SIZE_HUGE
+ one_hand_penalty= 0
+
+ self_recharge = TRUE
+ recharge_time = 6
+ use_external_power = TRUE
+ has_safety = FALSE
+
+/obj/item/mech_equipment/mounted_system/taser/rocket_launcher
+ name = "mounted rocket launcher"
+ desc = "An exosuit-mounted rocket laucher.Do you see why I have one eye? BECAUSE IF I WERE A BAD DEMOMAN, I WOULDN'T SHOW YOU THAT EYE."
+ icon_state = "mech_resin"
+ holding_type = /obj/item/gun/energy/rocket_launcher/mounted
+ restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND)
+ restricted_software = list(MECH_SOFTWARE_WEAPONS)
+
+
+/obj/item/projectile/rocket_le
+ name = "minirocket"
+ fire_sound = 'sound/effects/Explosion1.ogg'
+
+/obj/item/projectile/rocket_le/on_hit(var/atom/target, var/blocked = 0)
+ if(isturf(target))
+ explosion(target, 3, 5, 8, 1)
+ ..()
diff --git a/code/modules/overmap/contacts/_contact.dm b/code/modules/overmap/contacts/_contact.dm
deleted file mode 100644
index 37add6643e8d2..0000000000000
--- a/code/modules/overmap/contacts/_contact.dm
+++ /dev/null
@@ -1,140 +0,0 @@
-var/list/phonetic_alphabet_prefix = list("ALPHA", "BRAVO", "CHARLIE", "DELTA", "ECHO", "FOXTROT", "GOLF", "HOTEL", "INDIA",
- "JULIETT", "KILO", "LIMA", "MIKE", "NOVEMBER", "OSCAR", "PAPA", "QUEBEC", "ROMEO", "SIERRA", "TANGO",
- "UNIFORM", "VICTOR", "WHISKEY", "XRAY", "YANKEE", "ZULU")
-var/list/phonetic_alphabet_suffix = list("ALPHA", "BETA", "GAMMA", "DELTA", "EPSILON", "ZETA", "ETA", "THETA", "IOTA", "KAPPA",
- "LAMBDA", "MU", "NU", "XI", "OMICRON", "PI", "RHO", "SIGMA", "TAU", "UPSILON", "PHI", "CHI", "PSI", "OMEGA")
-#define SENSOR_TIME_DELAY 0.2 SECONDS
-/datum/overmap_contact
-
- var/name = "Unknown" // Contact name.
- var/temp_designation = "Unknown" // Temporary designation given by the computer to this object.
- var/class = "UNKWN" // Class of the ship
- var/class_long = "Unknown" // Human-readable name of the class.
- var/information = "Unknown" // Any information we have on the contact.
- var/identified = FALSE // Have we identified it?
- var/identification_progress // Progress towards identification, increased by identification_amount of the ship effect.
- var/seen // Have we seen this recently?
- var/image/marker // Image overlay attached to the contact.
- var/is_overmap_event = FALSE // Pretty much used to skip a bunch of stuff so we can ues the same system for overmap effects.
- var/pinged = FALSE // Used to animate overmap effects.
- var/list/images = list() // Our list of images to cast to users.
-
- // The sensor console holding this data.
- var/obj/machinery/computer/ship/sensors/owner
-
- // The actual overmap effect associated with this.
- var/obj/effect/overmap/visitable/ship/effect
-
-/datum/overmap_contact/proc/handle_being_identified()
- if(!identified)
- hide()
- identified = TRUE
- identification_progress = effect.identification_difficulty
- marker.icon = effect.icon
- marker.appearance_flags |= RESET_COLOR
- marker.icon_state = effect.contact_icon_state || "ship"
- marker.color = effect.color
- show()
-
-/datum/overmap_contact/New(var/obj/machinery/computer/ship/sensors/creator, var/obj/effect/overmap/source, var/is_event = FALSE)
- is_overmap_event = is_event
- // Update local tracking information.
- owner = creator
- effect = source
- name = effect.scanner_name
- owner.contact_datums[effect] = src
-
- if(!is_overmap_event)
- var/obj/effect/overmap/visitable/ship/source_ship = source
- information = source_ship.desc
- temp_designation = "[pick(global.phonetic_alphabet_prefix)]-[pick(global.phonetic_alphabet_suffix)]-[random_id(type, 1, 999)]"
- marker = image(loc = source_ship, icon = 'icons/obj/overmap.dmi', icon_state = "unidentified_ship")
-
- if(source_ship.transponder_active)
- handle_being_identified()
- else
- identified = TRUE
- var/obj/effect/overmap/event/source_event = source
- marker = image(loc = source_event, icon = 'icons/obj/overmap.dmi', icon_state = source_event.overmap_effect_state)
- marker.color = source_event.color
- marker.filters = filter(type="drop_shadow", color = marker.color + "F0", size = 2, offset = 1,x = 0, y = 0)
- marker.alpha = 0
-
- images += marker
-
-/datum/overmap_contact/proc/update_marker_icon(var/range = 0)
- if(identified)
- marker.icon_state = effect.contact_icon_state
-
- marker.overlays.Cut()
-
- if(check_effect_shield())
- var/image/shield_image = image(icon = 'icons/obj/overmap.dmi', icon_state = "shield")
- shield_image.pixel_x = 8
- marker.overlays += shield_image
-
- if(range > 1)
- var/image/radar
-
- for(var/image/I in images)
- if(I.tag == "radar")
- radar = I
- if(radar)
- return
-
- radar = image(loc = effect, icon = 'icons/obj/overmap.dmi', icon_state = "sensor_range")
- radar.pixel_x = -2
- radar.tag = "radar"
- radar.filters = filter(type="blur", size = 0.5)
- images += radar
-
- var/matrix/M = matrix()
- M.Scale(range*2.6)
- animate(radar, transform = M, alpha = 0, time = (0.25 SECONDS*range), 1, SINE_EASING)
- addtimer(CALLBACK(src, .proc/reset_radar, radar), (0.25 SECONDS *range+0.1))
- QDEL_IN(radar, (0.25 SECONDS *range+0.3))
-
-/datum/overmap_contact/proc/reset_radar(var/image/radar)
- images -= radar
-
-/datum/overmap_contact/proc/show()
- for(var/weakref/W in owner?.viewers)
- var/mob/M = W.resolve()
- if(istype(M))
- M.client?.images |= images
-
-/datum/overmap_contact/proc/hide()
- for(var/weakref/W in owner?.viewers)
- var/mob/M = W.resolve()
- if(istype(M))
- M.client?.images -= images
-
-/datum/overmap_contact/proc/ping()
- if(pinged)
- return
- pinged = TRUE
- show()
- animate(marker, alpha=255, 0.5 SECOND, 1, LINEAR_EASING)
- addtimer(CALLBACK(src, .proc/unping), 1 SECOND)
-
-
-/datum/overmap_contact/proc/unping()
- animate(marker, alpha=230, 2 SECOND, 1, LINEAR_EASING)
-
-/datum/overmap_contact/proc/check_effect_shield()
- var/shield_active = FALSE
- for(var/obj/machinery/power/shield_generator/S in SSmachines.machinery)
- if(S.z in effect.map_z)
- if(S.running == SHIELD_RUNNING)
- shield_active = TRUE
- return shield_active
-
-/datum/overmap_contact/Destroy()
- if(owner)
- hide()
- if(effect)
- owner.contact_datums[effect] = null
- owner.contact_datums -= null
- owner = null
- effect = null
- . = ..()
diff --git a/code/modules/overmap/contacts/_contacts.dm b/code/modules/overmap/contacts/_contacts.dm
deleted file mode 100644
index f9e22ee42875f..0000000000000
--- a/code/modules/overmap/contacts/_contacts.dm
+++ /dev/null
@@ -1,141 +0,0 @@
-var/list/phonetic_alphabet_prefix = list("ALPHA", "BRAVO", "CHARLIE", "DELTA", "ECHO", "FOXTROT", "GOLF", "HOTEL", "INDIA",
- "JULIETT", "KILO", "LIMA", "MIKE", "NOVEMBER", "OSCAR", "PAPA", "QUEBEC", "ROMEO", "SIERRA", "TANGO",
- "UNIFORM", "VICTOR", "WHISKEY", "XRAY", "YANKEE", "ZULU")
-var/list/phonetic_alphabet_suffix = list("ALPHA", "BETA", "GAMMA", "DELTA", "EPSILON", "ZETA", "ETA", "THETA", "IOTA", "KAPPA",
- "LAMBDA", "MU", "NU", "XI", "OMICRON", "PI", "RHO", "SIGMA", "TAU", "UPSILON", "PHI", "CHI", "PSI", "OMEGA")
-#define SENSOR_TIME_DELAY 0.2 SECONDS
-
-/datum/overmap_contact
-
- var/name = "Unknown" // Contact name.
- var/temp_designation = "Unknown" // Temporary designation given by the computer to this object.
- var/class = "UNKWN" // Class of the ship
- var/class_long = "Unknown" // Human-readable name of the class.
- var/information = "Unknown" // Any information we have on the contact.
- var/identified = FALSE // Have we identified it?
- var/identification_progress // Progress towards identification, increased by identification_amount of the ship effect.
- var/seen // Have we seen this recently?
- var/image/marker // Image overlay attached to the contact.
- var/is_overmap_event = FALSE // Pretty much used to skip a bunch of stuff so we can ues the same system for overmap effects.
- var/pinged = FALSE // Used to animate overmap effects.
- var/list/images = list() // Our list of images to cast to users.
-
- // The sensor console holding this data.
- var/obj/machinery/computer/ship/sensors/owner
-
- // The actual overmap effect associated with this.
- var/obj/effect/overmap/visitable/ship/effect
-
-/datum/overmap_contact/proc/handle_being_identified()
- if(!identified)
- hide()
- identified = TRUE
- identification_progress = effect.identification_difficulty
- marker.icon = effect.icon
- marker.appearance_flags |= RESET_COLOR
- marker.icon_state = effect.contact_icon_state || "ship"
- marker.color = effect.color
- show()
-
-/datum/overmap_contact/New(var/obj/machinery/computer/ship/sensors/creator, var/obj/effect/overmap/source, var/is_event = FALSE)
- is_overmap_event = is_event
- // Update local tracking information.
- owner = creator
- effect = source
- name = effect.scanner_name
- owner.contact_datums[effect] = src
-
- if(!is_overmap_event)
- var/obj/effect/overmap/visitable/ship/source_ship = source
- information = source_ship.desc
- temp_designation = "[pick(global.phonetic_alphabet_prefix)]-[pick(global.phonetic_alphabet_suffix)]-[random_id(type, 1, 999)]"
- marker = image(loc = source_ship, icon = 'icons/obj/overmap.dmi', icon_state = "unidentified_ship")
-
- if(source_ship.transponder_active)
- handle_being_identified()
- else
- identified = TRUE
- var/obj/effect/overmap/event/source_event = source
- marker = image(loc = source_event, icon = 'icons/obj/overmap.dmi', icon_state = source_event.overmap_effect_state)
- marker.color = source_event.color
- marker.filters = filter(type="drop_shadow", color = marker.color + "F0", size = 2, offset = 1,x = 0, y = 0)
- marker.alpha = 0
-
- images += marker
-
-/datum/overmap_contact/proc/update_marker_icon(var/range = 0)
- if(identified)
- marker.icon_state = effect.contact_icon_state
-
- marker.overlays.Cut()
-
- if(check_effect_shield())
- var/image/shield_image = image(icon = 'icons/obj/overmap.dmi', icon_state = "shield")
- shield_image.pixel_x = 8
- marker.overlays += shield_image
-
- if(range > 1)
- var/image/radar
-
- for(var/image/I in images)
- if(I.tag == "radar")
- radar = I
- if(radar)
- return
-
- radar = image(loc = effect, icon = 'icons/obj/overmap.dmi', icon_state = "sensor_range")
- radar.pixel_x = -2
- radar.tag = "radar"
- radar.filters = filter(type="blur", size = 0.5)
- images += radar
-
- var/matrix/M = matrix()
- M.Scale(range*2.6)
- animate(radar, transform = M, alpha = 0, time = (0.25 SECONDS*range), 1, SINE_EASING)
- addtimer(CALLBACK(src, .proc/reset_radar, radar), (0.25 SECONDS *range+0.1))
- QDEL_IN(radar, (0.25 SECONDS *range+0.3))
-
-/datum/overmap_contact/proc/reset_radar(var/image/radar)
- images -= radar
-
-/datum/overmap_contact/proc/show()
- for(var/weakref/W in owner?.viewers)
- var/mob/M = W.resolve()
- if(istype(M))
- M.client?.images |= images
-
-/datum/overmap_contact/proc/hide()
- for(var/weakref/W in owner?.viewers)
- var/mob/M = W.resolve()
- if(istype(M))
- M.client?.images -= images
-
-/datum/overmap_contact/proc/ping()
- if(pinged)
- return
- pinged = TRUE
- show()
- animate(marker, alpha=255, 0.5 SECOND, 1, LINEAR_EASING)
- addtimer(CALLBACK(src, .proc/unping), 1 SECOND)
-
-
-/datum/overmap_contact/proc/unping()
- animate(marker, alpha=230, 2 SECOND, 1, LINEAR_EASING)
-
-/datum/overmap_contact/proc/check_effect_shield()
- var/shield_active = FALSE
- for(var/obj/machinery/power/shield_generator/S in SSmachines.machinery)
- if(S.z in effect.map_z)
- if(S.running == SHIELD_RUNNING)
- shield_active = TRUE
- return shield_active
-
-/datum/overmap_contact/Destroy()
- if(owner)
- hide()
- if(effect)
- owner.contact_datums[effect] = null
- owner.contact_datums -= null
- owner = null
- effect = null
- . = ..()
diff --git a/code/modules/overmap/contacts/contact_class.dm b/code/modules/overmap/contacts/contact_class.dm
deleted file mode 100644
index 2079bb94e29c5..0000000000000
--- a/code/modules/overmap/contacts/contact_class.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-/obj/effect/overmap/visitable/ship
- var/contact_class = /decl/ship_contact_class
-
-/decl/ship_contact_class
- var/class_short = "Ship"
- var/class_long = "Unknown Ship Class"
- var/min_ship_mass = 0
- var/max_ship_mass = INFINITY
-
-/decl/ship_contact_class/ship
- class_short = "SH"
- class_long = "Ship"
- max_ship_mass = 10000
-
-/decl/ship_contact_class/shuttle
- class_short = "SHUTTLE"
- class_long = "Shuttle"
- max_ship_mass = 10000
-
-/decl/ship_contact_class/destroyer_escort
- class_short = "DE"
- class_long = "Destroyer Escort"
- min_ship_mass = 10000
- max_ship_mass = 50000
-
-/decl/ship_contact_class/destroyer
- class_short = "DD"
- class_long = "Destroyer"
- min_ship_mass = 50000
- max_ship_mass = 100000
-
-/decl/ship_contact_class/cruiser
- class_short = "CA"
- class_long = "Cruiser"
- min_ship_mass = 100000
- max_ship_mass = 250000
-
-/decl/ship_contact_class/capital_ship
- class_short = "CAP"
- class_long = "Capital Ship"
- min_ship_mass = 250000
diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm
deleted file mode 100644
index 0c3d59d5e12a0..0000000000000
--- a/code/modules/overmap/contacts/contact_sensors.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-/obj/machinery/computer/ship/sensors
- var/list/objects_in_view = list()
- var/list/contact_datums = list()
-
-/obj/machinery/computer/ship/sensors/Destroy()
- objects_in_view.Cut()
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- qdel(record)
- contact_datums.Cut()
- . = ..()
-
-/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector)
- . = ..()
- if(. && linked && !contact_datums[linked])
- var/datum/overmap_contact/record = new(src, linked)
- record.handle_being_identified()
-
-/obj/machinery/computer/ship/sensors/proc/reveal_contacts(var/mob/user)
- if(user && user.client)
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- if(record)
- user.client.images |= record.marker
-
-/obj/machinery/computer/ship/sensors/proc/hide_contacts(var/mob/user)
- if(user && user.client)
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- if(record)
- user.client.images -= record.marker
-
-/obj/machinery/computer/ship/sensors/Process()
- ..()
- update_sound()
- if(!linked)
- return
-
- // Update our 'sensor range' (ie. overmap lighting)
- if(!sensors || !sensors.use_power || !sensors.powered())
- linked.set_light(0)
- // TODO move to on_power_change()?
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- if(record.effect == linked)
- continue
- animate(record.marker, alpha=0, 1 SECOND, 1, LINEAR_EASING)
- record.hide()
-
- objects_in_view.Cut()
- return
-
- var/sensor_range = round(sensors.range,1)
- linked.set_light(1, sensor_range, sensor_range+1)
-
- // What can we see?
- var/list/new_objects_in_view = list()
- var/list/objects_in_current_view = list()
- for(var/obj/effect/overmap/contact in view(sensor_range, linked)-linked)
- objects_in_current_view[contact] = TRUE
- if(!objects_in_view[contact])
- new_objects_in_view[contact] = TRUE
-
- // Fade out and remove anything that is out of range.
- for(var/obj/effect/overmap/contact in objects_in_view)
- if(!QDELETED(contact) && objects_in_current_view[contact])
- continue
- var/datum/overmap_contact/record = contact_datums[contact]
- var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
- if(bearing < 0)
- bearing += 360
- if(record)
- animate(record.marker, alpha=0, 2 SECOND, 1, LINEAR_EASING)
- addtimer(CALLBACK(record, /datum/overmap_contact/proc/hide), 2 SECOND)
- if(record && !record.is_overmap_event)
- if(record.identified)
- visible_message(SPAN_NOTICE("[src] states, 'Contact lost with [record.name], bearing [bearing].'"))
- else
- visible_message(SPAN_NOTICE("[src] states, 'Contact lost with [record.temp_designation], bearing [bearing].'"))
- playsound(loc, "sound/machines/sensors/contact_lost.ogg", 30, 1)
- objects_in_view -= contact
- // Refresh or update contacts and markers for anything new.
- objects_in_view |= new_objects_in_view
-
- for(var/obj/effect/overmap/contact in new_objects_in_view)
- var/datum/overmap_contact/record = contact_datums[contact]
- var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
- if(bearing < 0)
- bearing += 360
- if(record)
- if(!record.is_overmap_event)
- if(record.identified)
- visible_message(SPAN_NOTICE("[src] states, 'Contact regained with [record.name], bearing [bearing].'"))
- else
- visible_message(SPAN_NOTICE("[src] states, 'Contact regained with [record.temp_designation], bearing [bearing].'"))
- playsound(loc, "sound/machines/sensors/contact_regained.ogg", 30, 1)
- record.show()
- if(record.is_overmap_event)
- animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
- continue
- animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
-
- for(var/obj/effect/overmap/visitable/ship/contact in objects_in_view) //Update everything.
- // Have we seen this ship before?
- var/datum/overmap_contact/record = contact_datums[contact]
- // Generate contact information for this overmap object.
- var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
- if(bearing < 0)
- bearing += 360
- if(!record)
- record = new /datum/overmap_contact(src, contact)
- if(record.effect.type in linked.known_ships)
- record.handle_being_identified()
- visible_message(SPAN_NOTICE("\The [src] states, \"Known contact registered, [record.name].\""))
- else
- playsound(loc, "sound/machines/sensors/newcontact.ogg", 30, 1)
- visible_message(SPAN_NOTICE("\The [src] states, \"New contact detected, temporary designation [record.temp_designation], bearing [bearing]. Identification in progress.\""))
-
- // Update identification information for this record.
- if(prob(record.effect.sensor_visiblity))
- record.update_marker_icon()
- if(!record.identified)
- if(record.identification_progress < record.effect.identification_difficulty)
- record.identification_progress += 5
- if(record.identification_progress == record.effect.identification_difficulty)
- record.handle_being_identified()
- playsound(loc, "sound/machines/sensors/contact_identified.ogg", 30, 1)
- var/decl/ship_contact_class/class = decls_repository.get_decl(record.effect.contact_class)
- visible_message(SPAN_NOTICE("[src] states, 'Contact [record.temp_designation] identified as [record.name], [class.class_long], bearing [bearing].'"))
-
- for(var/obj/effect/overmap/event in objects_in_view)
- var/datum/overmap_contact/record = contact_datums[event]
- if(!record)
- record = new /datum/overmap_contact(src, event, TRUE)
- var/time_delay = max((SENSOR_TIME_DELAY * get_dist(linked, event)),1)
- if(!record.pinged)
- addtimer(CALLBACK(record, .proc/ping), time_delay)
-
-
- //Update our own marker icon.
- var/datum/overmap_contact/self_record = contact_datums[linked]
- self_record.update_marker_icon(sensor_range)
- self_record.show()
diff --git a/code/modules/overmap/contacts/contacts_class.dm b/code/modules/overmap/contacts/contacts_class.dm
deleted file mode 100644
index e9f5d67359b1c..0000000000000
--- a/code/modules/overmap/contacts/contacts_class.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-/obj/effect/overmap/visitable/ship
- var/contact_class = /decl/ship_contact_class
-
-/decl/ship_contact_class
- var/class_short = "Ship"
- var/class_long = "Unknown Ship Class"
- var/min_ship_mass = 0
- var/max_ship_mass = INFINITY
-
-/decl/ship_contact_class/ship
- class_short = "SH"
- class_long = "Ship"
- max_ship_mass = 10000
-
-/decl/ship_contact_class/shuttle
- class_short = "SHUTTLE"
- class_long = "Shuttle"
- max_ship_mass = 10000
-
-/decl/ship_contact_class/destroyer_escort
- class_short = "DE"
- class_long = "Destroyer Escort"
- min_ship_mass = 10000
- max_ship_mass = 50000
-
-/decl/ship_contact_class/destroyer
- class_short = "DD"
- class_long = "Destroyer"
- min_ship_mass = 50000
- max_ship_mass = 100000
-
-/decl/ship_contact_class/cruiser
- class_short = "CA"
- class_long = "Cruiser"
- min_ship_mass = 100000
- max_ship_mass = 250000
-
-/decl/ship_contact_class/capital_ship
- class_short = "CAP"
- class_long = "Capital Ship"
- min_ship_mass = 250000
diff --git a/code/modules/overmap/contacts/contacts_sensors.dm b/code/modules/overmap/contacts/contacts_sensors.dm
deleted file mode 100644
index 0c3d59d5e12a0..0000000000000
--- a/code/modules/overmap/contacts/contacts_sensors.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-/obj/machinery/computer/ship/sensors
- var/list/objects_in_view = list()
- var/list/contact_datums = list()
-
-/obj/machinery/computer/ship/sensors/Destroy()
- objects_in_view.Cut()
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- qdel(record)
- contact_datums.Cut()
- . = ..()
-
-/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector)
- . = ..()
- if(. && linked && !contact_datums[linked])
- var/datum/overmap_contact/record = new(src, linked)
- record.handle_being_identified()
-
-/obj/machinery/computer/ship/sensors/proc/reveal_contacts(var/mob/user)
- if(user && user.client)
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- if(record)
- user.client.images |= record.marker
-
-/obj/machinery/computer/ship/sensors/proc/hide_contacts(var/mob/user)
- if(user && user.client)
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- if(record)
- user.client.images -= record.marker
-
-/obj/machinery/computer/ship/sensors/Process()
- ..()
- update_sound()
- if(!linked)
- return
-
- // Update our 'sensor range' (ie. overmap lighting)
- if(!sensors || !sensors.use_power || !sensors.powered())
- linked.set_light(0)
- // TODO move to on_power_change()?
- for(var/key in contact_datums)
- var/datum/overmap_contact/record = contact_datums[key]
- if(record.effect == linked)
- continue
- animate(record.marker, alpha=0, 1 SECOND, 1, LINEAR_EASING)
- record.hide()
-
- objects_in_view.Cut()
- return
-
- var/sensor_range = round(sensors.range,1)
- linked.set_light(1, sensor_range, sensor_range+1)
-
- // What can we see?
- var/list/new_objects_in_view = list()
- var/list/objects_in_current_view = list()
- for(var/obj/effect/overmap/contact in view(sensor_range, linked)-linked)
- objects_in_current_view[contact] = TRUE
- if(!objects_in_view[contact])
- new_objects_in_view[contact] = TRUE
-
- // Fade out and remove anything that is out of range.
- for(var/obj/effect/overmap/contact in objects_in_view)
- if(!QDELETED(contact) && objects_in_current_view[contact])
- continue
- var/datum/overmap_contact/record = contact_datums[contact]
- var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
- if(bearing < 0)
- bearing += 360
- if(record)
- animate(record.marker, alpha=0, 2 SECOND, 1, LINEAR_EASING)
- addtimer(CALLBACK(record, /datum/overmap_contact/proc/hide), 2 SECOND)
- if(record && !record.is_overmap_event)
- if(record.identified)
- visible_message(SPAN_NOTICE("[src] states, 'Contact lost with [record.name], bearing [bearing].'"))
- else
- visible_message(SPAN_NOTICE("[src] states, 'Contact lost with [record.temp_designation], bearing [bearing].'"))
- playsound(loc, "sound/machines/sensors/contact_lost.ogg", 30, 1)
- objects_in_view -= contact
- // Refresh or update contacts and markers for anything new.
- objects_in_view |= new_objects_in_view
-
- for(var/obj/effect/overmap/contact in new_objects_in_view)
- var/datum/overmap_contact/record = contact_datums[contact]
- var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
- if(bearing < 0)
- bearing += 360
- if(record)
- if(!record.is_overmap_event)
- if(record.identified)
- visible_message(SPAN_NOTICE("[src] states, 'Contact regained with [record.name], bearing [bearing].'"))
- else
- visible_message(SPAN_NOTICE("[src] states, 'Contact regained with [record.temp_designation], bearing [bearing].'"))
- playsound(loc, "sound/machines/sensors/contact_regained.ogg", 30, 1)
- record.show()
- if(record.is_overmap_event)
- animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
- continue
- animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
-
- for(var/obj/effect/overmap/visitable/ship/contact in objects_in_view) //Update everything.
- // Have we seen this ship before?
- var/datum/overmap_contact/record = contact_datums[contact]
- // Generate contact information for this overmap object.
- var/bearing = round(90 - Atan2(contact.x - linked.x, contact.y - linked.y),5)
- if(bearing < 0)
- bearing += 360
- if(!record)
- record = new /datum/overmap_contact(src, contact)
- if(record.effect.type in linked.known_ships)
- record.handle_being_identified()
- visible_message(SPAN_NOTICE("\The [src] states, \"Known contact registered, [record.name].\""))
- else
- playsound(loc, "sound/machines/sensors/newcontact.ogg", 30, 1)
- visible_message(SPAN_NOTICE("\The [src] states, \"New contact detected, temporary designation [record.temp_designation], bearing [bearing]. Identification in progress.\""))
-
- // Update identification information for this record.
- if(prob(record.effect.sensor_visiblity))
- record.update_marker_icon()
- if(!record.identified)
- if(record.identification_progress < record.effect.identification_difficulty)
- record.identification_progress += 5
- if(record.identification_progress == record.effect.identification_difficulty)
- record.handle_being_identified()
- playsound(loc, "sound/machines/sensors/contact_identified.ogg", 30, 1)
- var/decl/ship_contact_class/class = decls_repository.get_decl(record.effect.contact_class)
- visible_message(SPAN_NOTICE("[src] states, 'Contact [record.temp_designation] identified as [record.name], [class.class_long], bearing [bearing].'"))
-
- for(var/obj/effect/overmap/event in objects_in_view)
- var/datum/overmap_contact/record = contact_datums[event]
- if(!record)
- record = new /datum/overmap_contact(src, event, TRUE)
- var/time_delay = max((SENSOR_TIME_DELAY * get_dist(linked, event)),1)
- if(!record.pinged)
- addtimer(CALLBACK(record, .proc/ping), time_delay)
-
-
- //Update our own marker icon.
- var/datum/overmap_contact/self_record = contact_datums[linked]
- self_record.update_marker_icon(sensor_range)
- self_record.show()
diff --git a/code/modules/overmap/disperser/disperser_charge.dm b/code/modules/overmap/disperser/disperser_charge.dm
index 516ba6a15bf95..7a62918212285 100644
--- a/code/modules/overmap/disperser/disperser_charge.dm
+++ b/code/modules/overmap/disperser/disperser_charge.dm
@@ -62,3 +62,11 @@
/obj/structure/ship_munition/disperser_charge/explosive/fire(turf/target, strength, range)
explosion(target,max(1,strength * range / 10),strength * range / 7.5,strength * range / 5)
+
+/obj/structure/closet/odst
+ name = "OFD droppod"
+ desc = "A crude droppod allowing the OFD to safely fire itself, with a living creature at a target. Oxygen not included. Designed to fit a single rifleman, but may be used to drop two soldiers in a pinch."
+ icon = 'icons/obj/closets/bases/odst.dmi'
+ closet_appearance = null
+ storage_capacity = (MOB_MEDIUM * 2)
+ var/chargedesc = "ODST"
diff --git a/code/modules/overmap/radio_beacon.dm b/code/modules/overmap/radio_beacon.dm
deleted file mode 100644
index d00ca713a6ba2..0000000000000
--- a/code/modules/overmap/radio_beacon.dm
+++ /dev/null
@@ -1,187 +0,0 @@
-/obj/effect/overmap/radio
- name = "radio signal"
- scanner_name = "radio signal"
- icon_state = "radio"
- scannable = TRUE
- color = COLOR_AMBER
- var/message
- var/obj/effect/overmap/source
-
-/obj/effect/overmap/radio/get_scan_data(mob/user)
- return "Радиосигнал, передаваемый [source].
\
- ---НАЧАЛО ПЕРЕДАЧИ---
\
- [message] \
-
---КОНЕЦ ПЕРЕДАЧИ---"
-
-/obj/effect/overmap/radio/proc/set_origin(obj/effect/overmap/origin)
- GLOB.moved_event.register(origin, src, /obj/effect/overmap/radio/proc/follow)
- GLOB.destroyed_event.register(origin, src, /datum/proc/qdel_self)
- forceMove(origin.loc)
- source = origin
- pixel_x = -(origin.bound_width - 6)
- pixel_y = origin.bound_height - 6
-
-/obj/effect/overmap/radio/proc/follow(var/atom/movable/am, var/old_loc, var/new_loc)
- forceMove(new_loc)
-
-/obj/effect/overmap/radio/Destroy()
- GLOB.destroyed_event.unregister(source, src)
- GLOB.moved_event.unregister(source, src)
- source = null
- . = ..()
-
-/obj/item/radio_beacon
- name = "radio beacon"
- desc = "Device capable of continuously broadcasting a signal that can be picked up by ship sensors."
- icon = 'icons/obj/radio.dmi'
- icon_state = "walkietalkie"
- var/obj/effect/overmap/radio/signal
-
-/obj/item/radio_beacon/attack_self(mob/user)
- var/obj/effect/overmap/visitable/O = map_sectors["[get_z(src)]"]
- if(!O)
- to_chat(user, SPAN_WARNING("Вы не можете развернуть [src] здесь."))
- return
- var/message = sanitize(input("Что следует передать?") as message|null)
-
- if(!signal)
- signal = new()
-
- signal.message = message
- signal.set_origin(O)
-
-
-
-
-
-/obj/item/device/subspaceradio
- name = "subspace radio"
- desc = "This long range communications device has the ability to send and recieve transmissions from anywhere."
- icon = 'icons/obj/structures/decor.dmi'
- icon_state = "random_radio"
- w_class = ITEM_SIZE_LARGE
- action_button_name = "Remove/Replace Handset"
- var/obj/item/subspacehandset/handset
-
-/obj/item/device/subspaceradio/Initialize()
- . = ..()
- if(ispath(handset))
- handset = new handset(src, src)
- else
- handset = new(src, src)
-
-/obj/item/device/subspaceradio/Destroy()
- . = ..()
- QDEL_NULL(handset)
-
-/obj/item/device/subspaceradio/ui_action_click()
- toggle_handset()
-
-/obj/item/device/subspaceradio/attack_hand(mob/user)
- if(loc == user)
- toggle_handset()
- else
- ..()
-
-/obj/item/device/subspaceradio/MouseDrop()
- if(ismob(loc))
- if(!CanMouseDrop(src))
- return
- var/mob/M = loc
- if(!M.unEquip(src))
- return
- src.add_fingerprint(usr)
- M.put_in_any_hand_if_possible(src)
-
-/obj/item/device/subspaceradio/attackby(obj/item/W, mob/user, params)
- if(W == handset)
- reattach_handset(user)
- else
- return ..()
-
-/obj/item/device/subspaceradio/AltClick(mob/user as mob)
- toggle_handset()
-
-/obj/item/device/subspaceradio/verb/toggle_handset()
-
- var/mob/living/carbon/human/user = usr
- if(!handset)
- to_chat(user, SPAN_WARNING("The handset is missing!"))
- return
-
- if(handset.loc != src)
- reattach_handset(user) //Remove from their hands and back onto the defib unit
- return
-
- else
- if(!usr.put_in_hands(handset)) //Detach the handset into the user's hands
- to_chat(user, SPAN_WARNING("You need a free hand to hold the handset!"))
- update_icon() //success
-
-//checks that the base unit is in the correct slot to be used
-/obj/item/device/subspaceradio/proc/slot_check()
- var/mob/M = loc
- if(!istype(M))
- return FALSE //not equipped
-
- if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
- return TRUE
- if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src)
- return TRUE
-
- return FALSE
-
-/obj/item/device/subspaceradio/dropped(mob/user)
- ..()
- reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit
-
-/obj/item/device/subspaceradio/proc/reattach_handset(mob/user)
- if(!handset) return
-
- if(ismob(handset.loc))
- var/mob/M = handset.loc
- if(M.drop_from_inventory(handset, src))
- to_chat(user, SPAN_NOTICE("\The [handset] snaps back into the main unit."))
- else
- handset.forceMove(src)
-
-//Subspace Radio Handset
-/obj/item/subspacehandset
- name = "radio beacon"
- desc = "Device capable of continuously broadcasting a signal that can be picked up by ship sensors."
- icon = 'icons/obj/radio.dmi'
- icon_state = "walkietalkie"
- var/obj/effect/overmap/radio/signal
-
-/obj/item/subspacehandset/attack_self(mob/user)
- var/obj/effect/overmap/visitable/O = map_sectors["[get_z(src)]"]
- if(!O)
- to_chat(user, SPAN_WARNING("Вы не можете развернуть [src] здесь."))
- return
- var/message = sanitize(input("Что следует передать?") as message|null)
-
- if(!signal)
- signal = new()
-
- signal.message = message
- signal.set_origin(O)
-
-/obj/item/subspacehandset/linked
- var/obj/item/device/subspaceradio/base_unit
-
-/obj/item/subspacehandset/linked/New(newloc, obj/item/device/subspaceradio/radio)
- base_unit = radio
- ..(newloc)
-
-/obj/item/subspacehandset/linked/Destroy()
- if(base_unit)
- //ensure the base unit's icon updates
- if(base_unit.handset == src)
- base_unit.handset = null
- base_unit = null
- return ..()
-
-/obj/item/subspacehandset/linked/dropped(mob/user)
- ..() //update twohanding
- if(base_unit)
- base_unit.reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit
diff --git a/code/modules/research/designs/designs_mechfab.dm b/code/modules/research/designs/designs_mechfab.dm
index 4fe924596c1af..a27c1dd658578 100644
--- a/code/modules/research/designs/designs_mechfab.dm
+++ b/code/modules/research/designs/designs_mechfab.dm
@@ -424,6 +424,18 @@
req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 4)
build_path = /obj/item/mech_equipment/mounted_system/taser/laser
+/datum/design/item/exosuit/weapon/minigun
+ name = "mounted gatling gun"
+ id = "mech_minigun"
+ req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_DATA = 5, TECH_ENGINEERING = 4)
+ build_path = /obj/item/mech_equipment/mounted_system/taser/minigun
+
+/datum/design/item/exosuit/weapon/rocket_launcher
+ name = "mounted rocket"
+ id = "mech_rocket"
+ req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_PHORON = 4)
+ build_path = /obj/item/mech_equipment/mounted_system/taser/rocket_launcher
+
/datum/design/item/exosuit/weapon/machete
name = "Mechete"
id = "mech_machete"
diff --git a/icons/mecha/mech_equipment.dmi b/icons/mecha/mech_equipment.dmi
index f9f8c181f85b2..60715d4117210 100644
Binary files a/icons/mecha/mech_equipment.dmi and b/icons/mecha/mech_equipment.dmi differ
diff --git a/proxima/icons/obj/guns/guns.dmi b/proxima/icons/obj/guns/guns.dmi
index 415a6fc3adab3..94b0a00542cb9 100644
Binary files a/proxima/icons/obj/guns/guns.dmi and b/proxima/icons/obj/guns/guns.dmi differ