diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 9342e0b5e9..077c12c451 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -8,7 +8,7 @@
idle_power_usage = 250
active_power_usage = 500
circuit = /obj/item/weapon/circuitboard/crew
- var/datum/nano_module/crew_monitor/crew_monitor
+ var/datum/nano_module/program/crew_monitor/crew_monitor
/obj/machinery/computer/crew/New()
crew_monitor = new(src)
diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm
index 3dd1f0fbaf..44082e8606 100644
--- a/code/modules/clothing/glasses/hud_vr.dm
+++ b/code/modules/clothing/glasses/hud_vr.dm
@@ -71,7 +71,7 @@
These have been upgraded with medical records access and virus database integration."
mode = "med"
action_button_name = "AR Console (Crew Monitor)"
- arscreen_path = /datum/nano_module/crew_monitor
+ arscreen_path = /datum/nano_module/program/crew_monitor
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED)
ar_interact(var/mob/living/carbon/human/user)
diff --git a/code/modules/mob/living/silicon/subystems.dm b/code/modules/mob/living/silicon/subystems.dm
index ac10167c2d..b03ab5eeb2 100644
--- a/code/modules/mob/living/silicon/subystems.dm
+++ b/code/modules/mob/living/silicon/subystems.dm
@@ -2,7 +2,7 @@
var/register_alarms = 1
var/datum/nano_module/alarm_monitor/all/alarm_monitor
var/datum/nano_module/atmos_control/atmos_control
- var/datum/nano_module/crew_monitor/crew_monitor
+ var/datum/nano_module/program/crew_monitor/crew_monitor
var/datum/nano_module/law_manager/law_manager
var/datum/nano_module/power_monitor/power_monitor
var/datum/nano_module/rcon/rcon
diff --git a/code/modules/modular_computers/computers/subtypes/dev_console.dm b/code/modules/modular_computers/computers/subtypes/dev_console.dm
index 32f24b6001..d7dbeed75d 100644
--- a/code/modules/modular_computers/computers/subtypes/dev_console.dm
+++ b/code/modules/modular_computers/computers/subtypes/dev_console.dm
@@ -1,7 +1,7 @@
/obj/item/modular_computer/console
name = "console"
desc = "A stationary computer."
- icon = 'icons/obj/modular_console_vr.dmi' //VOREStation Edit
+ icon = 'icons/obj/modular_console.dmi'
icon_state = "console"
icon_state_unpowered = "console"
icon_state_screensaver = "standby"
diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm
index 846759c8ad..156d67525b 100644
--- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm
+++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm
@@ -4,7 +4,7 @@
desc = "A portable computer."
hardware_flag = PROGRAM_LAPTOP
icon_state_unpowered = "laptop-open"
- icon = 'icons/obj/modular_laptop_vr.dmi' //VOREStation Edit
+ icon = 'icons/obj/modular_laptop.dmi'
icon_state = "laptop-open"
icon_state_screensaver = "standby"
base_idle_power_usage = 25
diff --git a/code/modules/modular_computers/computers/subtypes/preset_tablet_vr.dm b/code/modules/modular_computers/computers/subtypes/preset_tablet_vr.dm
index 3bbc7a396b..9a87928618 100644
--- a/code/modules/modular_computers/computers/subtypes/preset_tablet_vr.dm
+++ b/code/modules/modular_computers/computers/subtypes/preset_tablet_vr.dm
@@ -1,7 +1,7 @@
/obj/item/modular_computer/tablet/preset/custom_loadout/rugged
name = "rugged tablet computer"
desc = "A rugged tablet computer."
- icon = 'icons/obj/modular_tablet_vr.dmi'
+ icon = 'icons/obj/modular_tablet.dmi'
icon_state = "rugged"
icon_state_unpowered = "rugged"
max_damage = 300
@@ -19,7 +19,7 @@
/obj/item/modular_computer/tablet/preset/custom_loadout/elite
name = "elite tablet computer"
desc = "A more expensive tablet computer."
- icon = 'icons/obj/modular_tablet_vr.dmi'
+ icon = 'icons/obj/modular_tablet.dmi'
icon_state = "elite"
icon_state_unpowered = "elite"
@@ -37,7 +37,7 @@
/obj/item/modular_computer/tablet/preset/custom_loadout/hybrid
name = "hybrid tablet computer"
desc = "A human/alien hybrid tech tablet computer."
- icon = 'icons/obj/modular_tablet_vr.dmi'
+ icon = 'icons/obj/modular_tablet.dmi'
icon_state = "hybrid"
icon_state_unpowered = "hybrid"
diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm
index bf8fe50909..2b25951926 100644
--- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm
+++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm
@@ -1,7 +1,7 @@
/datum/computer_file/program/suit_sensors
filename = "sensormonitor"
filedesc = "Suit Sensors Monitoring"
- nanomodule_path = /datum/nano_module/crew_monitor
+ nanomodule_path = /datum/nano_module/program/crew_monitor
program_icon_state = "crew"
program_key_state = "med_key"
program_menu_icon = "heart"
@@ -12,13 +12,10 @@
size = 11
-
-
-
-/datum/nano_module/crew_monitor
+/datum/nano_module/program/crew_monitor
name = "Crew monitor"
-/datum/nano_module/crew_monitor/Topic(href, href_list)
+/datum/nano_module/program/crew_monitor/Topic(href, href_list)
if(..()) return 1
var/turf/T = get_turf(nano_host()) // TODO: Allow setting any using_map.contact_levels from the interface.
if (!T || !(T.z in using_map.player_levels))
@@ -32,7 +29,7 @@
AI.ai_actual_track(H)
return 1
-/datum/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
+/datum/nano_module/program/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
var/list/data = host.initial_data()
data["isAI"] = isAI(user)
@@ -47,7 +44,9 @@
if(!data["map_levels"].len)
to_chat(user, "The crew monitor doesn't seem like it'll work here.")
- if(ui)
+ if(program)
+ program.kill_program()
+ else if(ui)
ui.close()
return
@@ -68,7 +67,7 @@
// should make the UI auto-update; doesn't seem to?
ui.set_auto_update(1)
-/*/datum/nano_module/crew_monitor/proc/scan()
+/*/datum/nano_module/program/crew_monitor/proc/scan()
for(var/mob/living/carbon/human/H in mob_list)
if(istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/C = H.w_uniform
diff --git a/code/modules/modular_computers/file_system/programs/ships/navigation.dm b/code/modules/modular_computers/file_system/programs/ships/navigation.dm
new file mode 100644
index 0000000000..dbe7aed5de
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/ships/navigation.dm
@@ -0,0 +1,63 @@
+/datum/computer_file/program/ship_nav
+ filename = "navviewer"
+ filedesc = "Ship Navigational Screen"
+ nanomodule_path = /datum/nano_module/program/ship/nav
+ program_icon_state = "helm"
+ program_key_state = "generic_key"
+ program_menu_icon = "search"
+ extended_desc = "Displays a ship's location in the sector."
+ required_access = null
+ requires_ntnet = 1
+ network_destination = "ship position sensors"
+ size = 4
+
+/datum/nano_module/program/ship/nav
+ name = "Navigation Display"
+
+/datum/nano_module/program/ship/nav/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
+ if(!linked)
+ to_chat(user, "You don't appear to be on a spaceship...")
+ if(program)
+ program.kill_program()
+ else if(ui)
+ ui.close()
+ return
+
+ var/list/data = list()
+ if(program)
+ data = program.get_header_data()
+
+ var/turf/T = get_turf(linked)
+ var/obj/effect/overmap/visitable/sector/current_sector = locate() in T
+
+ data["sector"] = current_sector ? current_sector.name : "Deep Space"
+ data["sector_info"] = current_sector ? current_sector.desc : "Not Available"
+ data["s_x"] = linked.x
+ data["s_y"] = linked.y
+ data["speed"] = round(linked.get_speed()*1000, 0.01)
+ data["accel"] = round(linked.get_acceleration()*1000, 0.01)
+ data["heading"] = linked.get_heading_degrees()
+ data["viewing"] = viewing_overmap(user)
+
+ if(linked.get_speed())
+ data["ETAnext"] = "[round(linked.ETA()/10)] seconds"
+ else
+ data["ETAnext"] = "N/A"
+
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "nav.tmpl", "[linked.name] Navigation Screen", 380, 530, state = state)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+/datum/nano_module/program/ship/nav/OnTopic(var/mob/user, var/list/href_list)
+ if(..())
+ return TOPIC_HANDLED
+
+ if (!linked)
+ return TOPIC_NOACTION
+
+ if (href_list["viewing"])
+ viewing_overmap(user) ? unlook(user) : look(user)
+ return TOPIC_REFRESH
diff --git a/code/modules/modular_computers/file_system/programs/ships/ship.dm b/code/modules/modular_computers/file_system/programs/ships/ship.dm
new file mode 100644
index 0000000000..1db653153b
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/ships/ship.dm
@@ -0,0 +1,87 @@
+/datum/nano_module/program/ship
+ var/obj/effect/overmap/visitable/ship/linked
+ var/list/viewers
+ var/extra_view = 0
+
+/datum/nano_module/program/ship/New()
+ ..()
+ sync_linked()
+ if(linked)
+ name = "[linked.name] [name]"
+
+/datum/nano_module/program/ship/Destroy()
+ if(LAZYLEN(viewers))
+ for(var/weakref/W in viewers)
+ var/M = W.resolve()
+ if(M)
+ unlook(M)
+ . = ..()
+
+/datum/nano_module/program/ship/proc/sync_linked()
+ var/obj/effect/overmap/visitable/ship/sector = get_overmap_sector(get_z(nano_host()))
+ if(!sector)
+ return
+ return attempt_hook_up_recursive(sector)
+
+/datum/nano_module/program/ship/proc/attempt_hook_up_recursive(obj/effect/overmap/visitable/ship/sector)
+ if(attempt_hook_up(sector))
+ return sector
+ for(var/obj/effect/overmap/visitable/ship/candidate in sector)
+ if((. = .(candidate)))
+ return
+
+/datum/nano_module/program/ship/proc/attempt_hook_up(obj/effect/overmap/visitable/ship/sector)
+ if(!istype(sector))
+ return
+ if(sector.check_ownership(nano_host()))
+ linked = sector
+ return 1
+
+/datum/nano_module/program/ship/proc/look(var/mob/user)
+ if(linked)
+ user.machine = nano_host()
+ user.reset_view(linked)
+ user.set_viewsize(world.view + extra_view)
+ GLOB.moved_event.register(user, src, /datum/nano_module/program/ship/proc/unlook)
+ LAZYDISTINCTADD(viewers, weakref(user))
+
+/datum/nano_module/program/ship/proc/unlook(var/mob/user)
+ user.reset_view()
+ user.set_viewsize() // reset to default
+ GLOB.moved_event.unregister(user, src, /datum/nano_module/program/ship/proc/unlook)
+ LAZYREMOVE(viewers, weakref(user))
+
+/datum/nano_module/program/ship/proc/viewing_overmap(mob/user)
+ return (weakref(user) in viewers)
+
+/datum/nano_module/program/ship/proc/DefaultTopicState()
+ return global.default_state
+
+/datum/nano_module/program/ship/Topic(var/href, var/href_list = list(), var/datum/topic_state/state)
+ if((. = ..()))
+ return
+ state = state || DefaultTopicState() || global.default_state
+ if(CanUseTopic(usr, state, href_list) == STATUS_INTERACTIVE)
+ CouldUseTopic(usr)
+ return OnTopic(usr, href_list, state)
+ CouldNotUseTopic(usr)
+ return TRUE
+
+/datum/nano_module/program/ship/proc/OnTopic(var/mob/user, var/href_list, var/datum/topic_state/state)
+ return TOPIC_NOACTION
+
+/datum/nano_module/program/ship/proc/CouldNotUseTopic(mob/user)
+ . = ..()
+ unlook(user)
+
+/datum/nano_module/program/ship/proc/CouldUseTopic(mob/user)
+ . = ..()
+ if(viewing_overmap(user))
+ look(user)
+
+/datum/nano_module/program/ship/check_eye(var/mob/user)
+ if (!get_dist(user, nano_host()) > 1 || user.blinded || !linked )
+ unlook(user)
+ return -1
+ else
+ return 0
\ No newline at end of file
diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm
index f437874609..9c3408eabf 100644
--- a/code/modules/overmap/sectors.dm
+++ b/code/modules/overmap/sectors.dm
@@ -82,7 +82,7 @@
//Helper for init.
/obj/effect/overmap/visitable/proc/check_ownership(obj/object)
- if((object.z in map_z) && !(get_area(object) in SSshuttles.shuttle_areas))
+ if((get_z(object) in map_z) && !(get_area(object) in SSshuttles.shuttle_areas))
return 1
//If shuttle_name is false, will add to generic waypoints; otherwise will add to restricted. Does not do checks.
diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi
index 125711410d..544f7341d1 100644
Binary files a/icons/obj/modular_console.dmi and b/icons/obj/modular_console.dmi differ
diff --git a/icons/obj/modular_console_vr.dmi b/icons/obj/modular_console_vr.dmi
deleted file mode 100644
index 125711410d..0000000000
Binary files a/icons/obj/modular_console_vr.dmi and /dev/null differ
diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi
index 4294fa4370..d4d750630d 100644
Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ
diff --git a/icons/obj/modular_laptop_vr.dmi b/icons/obj/modular_laptop_vr.dmi
deleted file mode 100644
index 4294fa4370..0000000000
Binary files a/icons/obj/modular_laptop_vr.dmi and /dev/null differ
diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi
index 33ca98c940..d15ebc0cdc 100644
Binary files a/icons/obj/modular_tablet.dmi and b/icons/obj/modular_tablet.dmi differ
diff --git a/icons/obj/modular_tablet_vr.dmi b/icons/obj/modular_tablet_vr.dmi
deleted file mode 100644
index 33ca98c940..0000000000
Binary files a/icons/obj/modular_tablet_vr.dmi and /dev/null differ
diff --git a/vorestation.dme b/vorestation.dme
index 248ecf5688..f7e97cc339 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2781,6 +2781,8 @@
#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm"
#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm"
#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm"
+#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm"
+#include "code\modules\modular_computers\file_system\programs\ships\ship.dm"
#include "code\modules\modular_computers\hardware\_hardware.dm"
#include "code\modules\modular_computers\hardware\battery_module.dm"
#include "code\modules\modular_computers\hardware\card_slot.dm"