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