Overmap sensors overhaul (#15666)

This commit is contained in:
Fluffy
2023-02-03 23:39:18 +01:00
committed by GitHub
parent 9b197fde5b
commit 14d41d1e84
23 changed files with 673 additions and 25 deletions

View File

@@ -9,6 +9,16 @@
circuit = /obj/item/circuitboard/ship/sensors
linked_type = /obj/effect/overmap/visitable
var/working_sound = 'sound/machines/sensors/dradis.ogg'
var/datum/sound_token/sound_token
var/sound_id
var/datum/weakref/sensor_ref
var/list/last_scan
/obj/machinery/computer/ship/sensors/proc/get_sensors()
return sensors
/obj/machinery/computer/ship/sensors/attempt_hook_up(var/obj/effect/overmap/visitable/sector)
. = ..()
if(!.)
@@ -27,6 +37,21 @@
identification = IB
break
/obj/machinery/computer/ship/sensors/proc/update_sound()
if(!working_sound)
return
if(!sound_id)
sound_id = "[type]_[sequential_id(/obj/machinery/computer/ship/sensors)]"
var/obj/machinery/shipsensors/sensors = get_sensors()
if(linked && sensors?.use_power && !(sensors.stat & NOPOWER))
var/volume = 10
if(!sound_token)
sound_token = sound_player.PlayLoopingSound(src, sound_id, working_sound, volume = volume, range = 10)
sound_token.SetVolume(volume)
else if(sound_token)
QDEL_NULL(sound_token)
/obj/machinery/computer/ship/sensors/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!linked)
display_reconnect_dialog(user, "sensors")
@@ -35,6 +60,7 @@
var/data[0]
data["viewing"] = viewing_overmap(user)
data["muted"] = muted
if(sensors)
data["on"] = sensors.use_power
data["range"] = sensors.range
@@ -62,8 +88,22 @@
distress_beacons.Add(list(list("caller" = vessel.name, "sender" = "[job_string][H.name]", "bearing" = bearing)))
if(length(distress_beacons))
data["distress_beacons"] = distress_beacons
var/list/contacts = list()
for(var/obj/effect/overmap/O in view(7,linked))
var/list/potential_contacts = list()
for(var/obj/effect/overmap/nearby in view(7,linked))
if(nearby.requires_contact) // Some ships require.
continue
potential_contacts |= nearby
// Effects that require contact are only added to the contacts if they have been identified.
// Allows for coord tracking out of range of the player's view.
for(var/obj/effect/overmap/visitable/identified_contact in contact_datums)
potential_contacts |= identified_contact
for(var/obj/effect/overmap/O in potential_contacts)
if(linked == O)
continue
if(!O.scannable)
@@ -74,6 +114,21 @@
contacts.Add(list(list("name"=O.name, "ref"="\ref[O]", "bearing"=bearing)))
if(length(contacts))
data["contacts"] = contacts
// Add datalink requests
if(length(connected.datalink_requests))
var/list/local_datalink_requests = list()
for(var/obj/effect/overmap/visitable/requestor in connected.datalink_requests)
local_datalink_requests.Add(list(list("name"=requestor.name, "ref"="\ref[requestor]")))
data["datalink_requests"] = local_datalink_requests
if(length(connected.datalinked))
var/list/local_datalinked = list()
for(var/obj/effect/overmap/visitable/datalinked_ship in connected.datalinked)
local_datalinked.Add(list(list("name"=datalinked_ship.name, "ref"="\ref[datalinked_ship]")))
data["datalinked"] = local_datalinked
data["last_scan"] = last_scan
else
data["status"] = "MISSING"
data["range"] = "N/A"
@@ -168,11 +223,43 @@
if (href_list["scan"])
var/obj/effect/overmap/O = locate(href_list["scan"])
if(istype(O) && !QDELETED(O) && (O in view(7,linked)))
playsound(loc, "sound/machines/dotprinter.ogg", 30, 1)
new/obj/item/paper/(get_turf(src), O.get_scan_data(usr), "paper (Sensor Scan - [O])")
if(istype(O) && !QDELETED(O))
if((O in view(7,linked))|| (O in contact_datums))
playsound(loc, "sound/machines/dotprinter.ogg", 30, 1)
LAZYSET(last_scan, "data", O.get_scan_data(usr))
LAZYSET(last_scan, "location", "[O.x],[O.y]")
LAZYSET(last_scan, "name", "[O]")
to_chat(usr, SPAN_NOTICE("Successfully scanned [O]."))
new/obj/item/paper/(get_turf(src), O.get_scan_data(usr), "paper (Sensor Scan - [O])")
return TOPIC_HANDLED
if (href_list["request_datalink"])
var/obj/effect/overmap/visitable/O = locate(href_list["request_datalink"])
if(istype(O) && !QDELETED(O))
if((O in view(7,linked)) || (O in contact_datums))
for(var/obj/machinery/computer/ship/sensors/sensor_console in O.consoles)
sensor_console.connected.datalink_requests |= src.connected
return TOPIC_HANDLED
if (href_list["accept_datalink_requests"])
var/obj/effect/overmap/visitable/O = locate(href_list["accept_datalink_requests"])
for(var/obj/machinery/computer/ship/sensors/sensor_console in src.connected.consoles)
sensor_console.datalink_add_ship_datalink(O)
break
src.connected.datalink_requests -= O // Remove the request
return TOPIC_HANDLED
if (href_list["decline_datalink_requests"])
var/obj/effect/overmap/visitable/O = locate(href_list["decline_datalink_requests"])
src.connected.datalink_requests -= O // Remove the request
if (href_list["remove_datalink"])
var/obj/effect/overmap/visitable/O = locate(href_list["remove_datalink"])
for(var/obj/machinery/computer/ship/sensors/rescinder_sensor_console in src.connected.consoles) // Get sensor console from the rescinder
rescinder_sensor_console.datalink_remove_ship_datalink(O)
return TOPIC_HANDLED
if (href_list["play_message"])
var/caller = href_list["play_message"]
var/datum/distress_beacon/beacon = SSdistress.active_distress_beacons[caller]
@@ -192,18 +279,6 @@
security_announcement.Announce("No fire is incoming at the current moment, resume damage control.", "Space clear!", sound('sound/misc/announcements/security_level_old.ogg'), 0)
return TOPIC_HANDLED
/obj/machinery/computer/ship/sensors/process()
..()
if(!linked)
return
if(sensors && sensors.use_power && sensors.powered())
var/sensor_range = round(sensors.range*1.5) + 1
linked.set_light(sensor_range, sensor_range+1, light_color)
linked.handle_sensor_state_change(TRUE)
else
linked.set_light(0)
linked.handle_sensor_state_change(FALSE)
/obj/machinery/shipsensors
name = "sensors suite"
desc = "Long range gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum BS elements."
@@ -216,6 +291,7 @@
var/heat_reduction = 0.5 // mitigates this much heat per tick - can sustain range 2
var/heat = 0
var/range = 1
var/sensor_strength = 5//used for detecting ships via contacts
idle_power_usage = 5000
var/base_icon_state

View File

@@ -56,6 +56,8 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov
if(user.eyeobj)
moved_event.register(user.eyeobj, src, PROC_REF(unlook))
LAZYDISTINCTADD(viewers, WEAKREF(user))
if(linked)
LAZYDISTINCTADD(linked.navigation_viewers, WEAKREF(user))
/obj/machinery/computer/ship/proc/unlook(var/mob/user)
user.reset_view()
@@ -78,9 +80,15 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov
moved_event.unregister(E.owner, src, PROC_REF(unlook))
LAZYREMOVE(viewers, WEAKREF(E.owner))
LAZYREMOVE(viewers, WEAKREF(user))
if(linked)
LAZYREMOVE(linked.navigation_viewers, WEAKREF(user))
if(linked)
for(var/obj/machinery/computer/ship/sensors/sensor in linked.consoles)
sensor.hide_contacts(user)
/obj/machinery/computer/ship/proc/viewing_overmap(mob/user)
return (WEAKREF(user) in viewers)
return (WEAKREF(user) in viewers) || (linked && (WEAKREF(user) in linked.navigation_viewers))
/obj/machinery/computer/ship/CouldNotUseTopic(mob/user)
. = ..()
@@ -102,6 +110,8 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov
return 0
/obj/machinery/computer/ship/Destroy()
if(linked)
linked = null
if(connected)
LAZYREMOVE(connected.consoles, src)
. = ..()
@@ -114,6 +124,8 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov
var/M = W.resolve()
if(M)
unlook(M)
if(linked)
LAZYREMOVE(linked.navigation_viewers, W)
. = ..()
/obj/machinery/computer/ship/on_user_login(mob/M)

View File

@@ -14,10 +14,14 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
name = "generic ship"
desc = "Space faring vessel."
icon_state = "ship"
requires_contact = TRUE
obfuscated_name = "unidentified vessel"
var/moving_state = "ship_moving"
var/vessel_mass = 10000 //tonnes, arbitrary number, affects acceleration provided by engines
var/list/known_ships = list() //List of ships known at roundstart - put types here.
var/base_sensor_visibility
vessel_mass = 10000 //tonnes, arbitrary number, affects acceleration provided by engines
var/vessel_size = SHIP_SIZE_LARGE //arbitrary number, affects how likely are we to evade meteors
var/max_speed = 1/(1 SECOND) //"speed of light" for the ship, in turfs/tick.
var/min_speed = 1/(2 MINUTES) // Below this, we round speed to 0 to avoid math errors.
@@ -35,8 +39,6 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
var/thrust_limit = 1 //global thrust limit for all engines, 0..1
var/halted = 0 //admin halt or other stop.
var/list/consoles
comms_support = TRUE
/obj/effect/overmap/visitable/ship/Initialize()
@@ -44,6 +46,7 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
glide_size = world.icon_size
min_speed = round(min_speed, SHIP_MOVE_RESOLUTION)
max_speed = round(max_speed, SHIP_MOVE_RESOLUTION)
base_sensor_visibility = round((vessel_mass/SENSOR_COEFFICENT),1)
SSshuttle.ships += src
/obj/effect/overmap/visitable/ship/find_z_levels(var/fore_direction)
@@ -68,8 +71,11 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
/obj/effect/overmap/visitable/ship/get_scan_data(mob/user)
. = ..()
. += "<br>Mass: [vessel_mass] tons."
if(!is_still())
. += "<br>Heading: [dir2angle(get_heading())], speed [get_speed() * 1000]"
if(instant_contact)
. += "<br>It is broadcasting a distress signal."
//Projected acceleration based on information from engines
/obj/effect/overmap/visitable/ship/proc/get_acceleration()
@@ -165,6 +171,7 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
if(newloc && loc != newloc)
Move(newloc)
handle_wraparound()
sensor_visibility = min(round(base_sensor_visibility + get_speed_sensor_increase(), 1), 100)
/obj/effect/overmap/visitable/ship/update_icon()
pixel_x = position[1] * (world.icon_size/2)
@@ -306,6 +313,9 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
for(var/obj/machinery/computer/ship/targeting/TR in consoles)
TR.visible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(TR)))] Hit confirmed on [hit_data["target_name"]] in [hit_data["target_area"]] at coordinates [hit_data["coordinates"]]."), range = 2)
/obj/effect/overmap/visitable/ship/proc/get_speed_sensor_increase()
return min(get_speed() * 1000, 50) //Engines should never increase sensor visibility by more than 50.
#undef MOVING
#undef SANITIZE_SPEED
#undef CHANGE_SPEED_BY