From c4377353cb264898a5bee0a89b7a9da91ac36fb9 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 19 Feb 2017 00:03:52 -0500 Subject: [PATCH 1/3] Adds telescience machines and comptuers to the game. * Code somewhat ported from /tg, but enhanced with nanoui and /vg's area shielding. * Telepad - Teleports stuff under control of telescience console * Telescience Console - Controls the telepad * Bluespace crystals and GPSs * Circuits and research designs for all. --- code/__defines/misc.dm | 3 + code/modules/telesci/bscyrstal.dm | 46 +++ code/modules/telesci/construction.dm | 53 ++++ code/modules/telesci/gps_advanced.dm | 78 +++++ code/modules/telesci/telepad.dm | 47 +++ code/modules/telesci/telesci_computer.dm | 354 +++++++++++++++++++++++ icons/obj/telescience.dmi | Bin 0 -> 3608 bytes nano/templates/telescience_console.tmpl | 69 ++++- vorestation.dme | 5 + 9 files changed, 641 insertions(+), 14 deletions(-) create mode 100644 code/modules/telesci/bscyrstal.dm create mode 100644 code/modules/telesci/construction.dm create mode 100644 code/modules/telesci/gps_advanced.dm create mode 100644 code/modules/telesci/telepad.dm create mode 100644 code/modules/telesci/telesci_computer.dm create mode 100644 icons/obj/telescience.dmi diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 6a009677e1..4199a28bba 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -109,6 +109,9 @@ //Area flags, possibly more to come #define RAD_SHIELDED 1 //shielded from radiation, clearly +// VOREStation Edit Begin +#define BLUE_SHIELDED 2 // shield from bluespace teleportation (telescience) +// VOREStation Edit End // Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc. #define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm new file mode 100644 index 0000000000..083cf56462 --- /dev/null +++ b/code/modules/telesci/bscyrstal.dm @@ -0,0 +1,46 @@ +// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. + +/obj/item/weapon/ore/bluespace_crystal + name = "bluespace crystal" + desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." + icon = 'icons/obj/telescience.dmi' + icon_state = "bluespace_crystal" + w_class = ITEMSIZE_TINY + origin_tech = list(TECH_BLUESPACE = 6, TECH_MATERIAL = 3) + var/blink_range = 8 // The teleport range when crushed/thrown at someone. + +/obj/item/weapon/ore/bluespace_crystal/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + +/obj/item/weapon/ore/bluespace_crystal/attack_self(mob/user) + user.visible_message("[user] crushes [src]!", "You crush [src]!") + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + s.set_up(5, 1, get_turf(src)) + s.start() + blink_mob(user) + user.unEquip(src) + qdel(src) + +/obj/item/weapon/ore/bluespace_crystal/proc/blink_mob(mob/living/L) + do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') + +/obj/item/weapon/ore/bluespace_crystal/throw_impact(atom/hit_atom) + if(!..()) // not caught in mid-air + visible_message("[src] fizzles and disappears upon impact!") + var/turf/T = get_turf(hit_atom) + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + s.set_up(5, 1, T) + s.start() + if(isliving(hit_atom)) + blink_mob(hit_atom) + qdel(src) + +// Artifical bluespace crystal, doesn't give you much research. + +/obj/item/weapon/ore/bluespace_crystal/artificial + name = "artificial bluespace crystal" + desc = "An artificially made bluespace crystal, it looks delicate." + origin_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) + blink_range = 4 // Not as good as the organic stuff! diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm new file mode 100644 index 0000000000..df19a82f5b --- /dev/null +++ b/code/modules/telesci/construction.dm @@ -0,0 +1,53 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +// The circuit boards + +/obj/item/weapon/circuitboard/telesci_console + name = T_BOARD("Telepad Control Console") + build_path = /obj/machinery/computer/telescience + origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) + +/obj/item/weapon/circuitboard/telesci_pad + name = T_BOARD("Telepad") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/telepad + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 1, + /obj/item/weapon/stock_parts/capacitor = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/console_screen = 1) + +// The Designs + +/datum/design/circuit/telesci_console + name = "Telepad Control Console" + id = "telesci_console" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) + build_path = /obj/item/weapon/circuitboard/telesci_console + sort_string = "HAAEA" + +/datum/design/circuit/telesci_pad + name = "Telepad" + id = "telesci_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/telesci_pad + sort_string = "HAAEB" + +/datum/design/item/telesci_gps + name = "AR sunglasses" + id = "telesci_gps" + req_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1000) + build_path = /obj/item/device/gps/advanced + sort_string = "HAAEB" + +/datum/design/item/bluespace_crystal + name = "Artificial Bluespace Crystal" + id = "bluespace_crystal" + req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) + materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500) + build_path = /obj/item/weapon/ore/bluespace_crystal/artificial + sort_string = "HAAEC" diff --git a/code/modules/telesci/gps_advanced.dm b/code/modules/telesci/gps_advanced.dm new file mode 100644 index 0000000000..7953b674d3 --- /dev/null +++ b/code/modules/telesci/gps_advanced.dm @@ -0,0 +1,78 @@ +var/global/list/GPS_list = list() + +// These are distinguished from the ordinary "Relay Position Devices" that just print your location +// In that they are also all networked with each other to show each other's locations. +/obj/item/device/gps/advanced + name = "global positioning system" + desc = "Helping lost spacemen find their way through the planets since 1995." + icon = 'icons/obj/telescience.dmi' + icon_state = "gps-c" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + var/gpstag = "COM0" + var/emped = 0 + +/obj/item/device/gps/advanced/New() + ..() + GPS_list.Add(src) + name = "global positioning system ([gpstag])" + overlays += "working" + +/obj/item/device/gps/advanced/Del() + GPS_list.Remove(src) + ..() + +/obj/item/device/gps/advanced/emp_act(severity) + emped = 1 + overlays -= "working" + overlays += "emp" + spawn(300) + emped = 0 + overlays -= "emp" + overlays += "working" + +/obj/item/device/gps/advanced/attack_self(mob/user as mob) + + var/obj/item/device/gps/advanced/t = "" + if(emped) + t += "ERROR" + else + t += "
Set Tag " + t += "
Tag: [gpstag]" + + for(var/obj/item/device/gps/advanced/G in GPS_list) + var/turf/pos = get_turf(G) + var/area/gps_area = get_area(G) + var/tracked_gpstag = G.gpstag + if(G.emped == 1) + t += "
[tracked_gpstag]: ERROR" + else + t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" + + var/datum/browser/popup = new(user, "GPS", name, 600, 450) + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/item/device/gps/advanced/Topic(href, href_list) + ..() + if(href_list["tag"] ) + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + if(src.loc == usr) + gpstag = a + name = "global positioning system ([gpstag])" + attack_self(usr) + +/obj/item/device/gps/advanced/science + icon_state = "gps-s" + gpstag = "SCI0" + +/obj/item/device/gps/advanced/engineering + icon_state = "gps-e" + gpstag = "ENG0" + +/obj/item/device/gps/advanced/security + icon_state = "gps-sec" + gpstag = "SEC0" diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm new file mode 100644 index 0000000000..1440482241 --- /dev/null +++ b/code/modules/telesci/telepad.dm @@ -0,0 +1,47 @@ +///SCI TELEPAD/// +/obj/machinery/telepad + name = "telepad" + desc = "A bluespace telepad used for teleporting objects to and from a location." + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + anchored = 1 + use_power = 1 + circuit = /obj/item/weapon/circuitboard/telesci_pad + idle_power_usage = 200 + active_power_usage = 5000 + var/efficiency + +/obj/machinery/telepad/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/ore/bluespace_crystal(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/stack/cable_coil(src, 5) + RefreshParts() + update_icon() + +/obj/machinery/telepad/RefreshParts() + var/E + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + E += C.rating + efficiency = E + +/obj/machinery/telepad/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + if(panel_open) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + M.connectable = src + user << "You save the data in the [M.name]'s buffer." + return 1 + + return ..() diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm new file mode 100644 index 0000000000..bc4c92b611 --- /dev/null +++ b/code/modules/telesci/telesci_computer.dm @@ -0,0 +1,354 @@ +/obj/machinery/computer/telescience + name = "\improper Telepad Control Console" + desc = "Used to teleport objects to and from the telescience telepad." + icon_screen = "teleport" + icon_keyboard = "teleport_key" + circuit = /obj/item/weapon/circuitboard/telesci_console + var/sending = 1 + var/obj/machinery/telepad/telepad = null + var/temp_msg = "Telescience control console initialized.
Welcome." + + // VARIABLES // + var/teles_left // How many teleports left until it becomes uncalibrated + var/datum/projectile_data/last_tele_data = null + var/z_co = 1 + var/power_off + var/rotation_off + var/last_target + + var/rotation = 0 + var/angle = 45 + var/power = 5 + + // Based on the power used + var/teleport_cooldown = 0 // every index requires a bluespace crystal + var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) + var/teleporting = 0 + var/starting_crystals = 2 + var/max_crystals = 4 + var/list/crystals = list() + var/obj/item/device/gps/inserted_gps + +/obj/machinery/computer/telescience/New() + ..() + recalibrate() + +/obj/machinery/computer/telescience/Destroy() + eject() + if(inserted_gps) + inserted_gps.forceMove(loc) + inserted_gps = null + return ..() + +/obj/machinery/computer/telescience/examine(mob/user) + ..() + user << "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots." + +/obj/machinery/computer/telescience/initialize() + ..() + for(var/i = 1; i <= starting_crystals; i++) + crystals += new /obj/item/weapon/ore/bluespace_crystal/artificial(src) // starting crystals + +/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/weapon/ore/bluespace_crystal)) + if(crystals.len >= max_crystals) + user << "There are not enough crystal slots." + return + if(!user.drop_item()) + return + crystals += W + W.forceMove(src) + user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "You insert [W] into \the [src]'s crystal slot.") + updateDialog() + else if(istype(W, /obj/item/device/gps)) + if(!inserted_gps) + inserted_gps = W + user.unEquip(W) + W.forceMove(src) + user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", "You insert [W] into \the [src]'s GPS device slot.") + else if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + if(M.connectable && istype(M.connectable, /obj/machinery/telepad)) + telepad = M.connectable + M.connectable = null + user << "You upload the data from the [W.name]'s buffer." + else + return ..() + +/obj/machinery/computer/telescience/attack_ai(mob/user) + src.attack_hand(user) + +/obj/machinery/computer/telescience/attack_hand(mob/user) + if(..()) + return + ui_interact(user) + +/obj/machinery/computer/telescience/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + var/data[0] + + if(!telepad) + in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console + data["noTelepad"] = 1 + else + data["insertedGps"] = inserted_gps + data["tempMsg"] = temp_msg + data["rotation"] = rotation + data["angle"] = angle + data["power"] = power + data["currentZ"] = z_co + data["lastTeleData"] = list() + + data["powerOptions"] = new/list(power_options.len) + for(var/i = 1; i <= power_options.len; i++) + var/enabled = (crystals.len + telepad.efficiency >= i); + data["powerOptions"][i] = list("power" = power_options[i], "enabled" = enabled) + + data["sectorOptions"] = list() + for(var/z in config.player_levels) + data["sectorOptions"] += z + + if(last_tele_data) + data["lastTeleData"]["src_x"] = last_tele_data.src_x + data["lastTeleData"]["src_y"] = last_tele_data.src_y + data["lastTeleData"]["distance"] = last_tele_data.distance + data["lastTeleData"]["time"] = last_tele_data.time + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "telescience_console.tmpl", src.name, 400, 450) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(5) + +/obj/machinery/computer/telescience/proc/sparks() + if(telepad) + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + s.set_up(5, 1, get_turf(telepad)) + s.start() + else + return + +/obj/machinery/computer/telescience/proc/telefail() + sparks() + visible_message("The telepad weakly fizzles.") + return + +/obj/machinery/computer/telescience/proc/doteleport(mob/user) + + if(teleport_cooldown > world.time) + temp_msg = "Telepad is recharging power.
Please wait [round((teleport_cooldown - world.time) / 10)] seconds." + return + + if(teleporting) + temp_msg = "Telepad is in use.
Please wait." + return + + if(telepad) + var/truePower = Clamp(power + power_off, 1, 1000) + var/trueRotation = rotation + rotation_off + var/trueAngle = Clamp(angle, 1, 90) + + var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower) + last_tele_data = proj_data + + var/trueX = Clamp(round(proj_data.dest_x, 1), 1, world.maxx) + var/trueY = Clamp(round(proj_data.dest_y, 1), 1, world.maxy) + var/spawn_time = round(proj_data.time) * 10 + + var/turf/target = locate(trueX, trueY, z_co) + last_target = target + var/area/A = get_area(target) + flick("pad-beam", telepad) + + if(spawn_time > 15) // 1.5 seconds + playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1) + // Wait depending on the time the projectile took to get there + teleporting = 1 + temp_msg = "Powering up bluespace crystals.
Please wait." + + + spawn(round(proj_data.time) * 10) // in seconds + if(!telepad) + return + if(telepad.stat & NOPOWER) + return + teleporting = 0 + teleport_cooldown = world.time + (power * 2) + teles_left -= 1 + + // use a lot of power + use_power(power * 10) + + var/datum/effect/effect/system/spark_spread/S = PoolOrNew(/datum/effect/effect/system/spark_spread) + S.set_up(5, 1, get_turf(telepad)) + S.start() + + if(!A || (A.flags & BLUE_SHIELDED)) + telefail() + temp_msg = "ERROR!
Target is shielded from bluespace intersection!" + return + + temp_msg = "Teleport successful.
" + if(teles_left < 10) + temp_msg += "
Calibration required soon." + else + temp_msg += "Data printed below." + + var/sparks = get_turf(target) + var/datum/effect/effect/system/spark_spread/Y = PoolOrNew(/datum/effect/effect/system/spark_spread) + Y.set_up(5, 1, sparks) + Y.start() + + var/turf/source = target + var/turf/dest = get_turf(telepad) + var/log_msg = "" + log_msg += ": [key_name(user)] has teleported " + + if(sending) + source = dest + dest = target + + flick("pad-beam", telepad) + playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + for(var/atom/movable/ROI in source) + // if is anchored, don't let through + if(ROI.anchored) + if(isliving(ROI)) + var/mob/living/L = ROI + if(L.buckled) + // TP people on office chairs + if(L.buckled.anchored) + continue + + log_msg += "[key_name(L)] (on a chair), " + else + continue + else if(!isobserver(ROI)) + continue + if(ismob(ROI)) + var/mob/T = ROI + log_msg += "[key_name(T)], " + else + log_msg += "[ROI.name]" + if (istype(ROI, /obj/structure/closet)) + var/obj/structure/closet/C = ROI + log_msg += " (" + for(var/atom/movable/Q as mob|obj in C) + if(ismob(Q)) + log_msg += "[key_name(Q)], " + else + log_msg += "[Q.name], " + if (dd_hassuffix(log_msg, "(")) + log_msg += "empty)" + else + log_msg += ")" + log_msg += ", " + do_teleport(ROI, dest) + + if (!dd_hassuffix(log_msg, ", ")) + log_msg += "nothing" + log_msg += " [sending ? "to" : "from"] [trueX], [trueY], [z_co] ([A ? A.name : "null area"])" + investigate_log(log_msg, "telesci") + updateDialog() + +/obj/machinery/computer/telescience/proc/teleport(mob/user) + if(rotation == null || angle == null || z_co == null) + temp_msg = "ERROR!
Set a angle, rotation and sector." + return + if(power <= 0) + telefail() + temp_msg = "ERROR!
No power selected!" + return + if(angle < 1 || angle > 90) + telefail() + temp_msg = "ERROR!
Elevation is less than 1 or greater than 90." + return + if(!(z_co in config.player_levels)) + telefail() + temp_msg = "ERROR! Sector is outside known time and space!" + return + if(teles_left > 0) + doteleport(user) + else + telefail() + temp_msg = "ERROR!
Calibration required." + return + return + +/obj/machinery/computer/telescience/proc/eject() + for(var/obj/item/I in crystals) + I.forceMove(src.loc) + crystals -= I + power = 0 + +/obj/machinery/computer/telescience/Topic(href, href_list) + if(..()) + return + if(!telepad) + updateDialog() + return + if(telepad.panel_open) + temp_msg = "Telepad undergoing physical maintenance operations." + + if(href_list["setrotation"]) + var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num + if(..()) // Check after we input a value, as they could've moved after they entered something + return + rotation = Clamp(new_rot, -900, 900) + rotation = round(rotation, 0.01) + + if(href_list["setangle"]) + var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num + if(..()) + return + angle = Clamp(round(new_angle, 0.1), 1, 9999) + + if(href_list["setpower"]) + var/index = href_list["setpower"] + index = text2num(index) + if(index != null && power_options[index]) + if(crystals.len + telepad.efficiency >= index) + power = power_options[index] + + if(href_list["setz"]) + var/new_z = text2num(href_list["setz"]) + if(new_z in config.player_levels) + z_co = new_z + + if(href_list["ejectGPS"]) + if(inserted_gps) + inserted_gps.forceMove(loc) + inserted_gps = null + + if(href_list["setMemory"]) + if(last_target && inserted_gps) + // TODO - What was this even supposed to do?? + //inserted_gps.locked_location = last_target + temp_msg = "Location saved." + else + temp_msg = "ERROR!
No data was stored." + + if(href_list["send"]) + sending = 1 + teleport(usr) + + if(href_list["receive"]) + sending = 0 + teleport(usr) + + if(href_list["recal"]) + recalibrate() + sparks() + temp_msg = "NOTICE:
Calibration successful." + + if(href_list["eject"]) + eject() + temp_msg = "NOTICE:
Bluespace crystals ejected." + + updateDialog() + +/obj/machinery/computer/telescience/proc/recalibrate() + teles_left = rand(40, 50) + power_off = rand(-4, 4) + rotation_off = rand(-10, 10) diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi new file mode 100644 index 0000000000000000000000000000000000000000..34d42f100f609c207b8acc7270177ce47c660274 GIT binary patch literal 3608 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 SzQz1J0EW7zI#pV(vHt;YstW`F literal 0 HcmV?d00001 diff --git a/nano/templates/telescience_console.tmpl b/nano/templates/telescience_console.tmpl index 4f88267510..80cf58a3df 100644 --- a/nano/templates/telescience_console.tmpl +++ b/nano/templates/telescience_console.tmpl @@ -2,19 +2,60 @@ Title: Telescience Control UI Used In File(s): \code\modules\telesci\telesci_computer.dm --> -
-
Coordinates:
-
- {{:helper.link('X: ' + data.coordx, 'gear', {'setx': 1})}} - {{:helper.link('Y: ' + data.coordy, 'gear', {'sety': 1})}} - {{:helper.link('Z: ' + data.coordz, 'gear', {'setz': 1})}} +{{if data.noTelepad == 1}} +
No telepad located.
Please add telepad data.

+{{else}} +
{{:helper.link('Eject GPS', 'eject', {'ejectGPS' : 1}, null, (data.insertedGps ? '' : 'disabled'))}}
+
{{:helper.link('Set GPS Memory', 'disk', {'setMemory' : 1}, null, (data.insertedGps ? '' : 'disabled'))}}
+
{{:data.tempMsg}}
+
+ +
+
Bearing:
+
{{:helper.link(data.rotation + '°', 'pencil', {'setrotation' : 1})}}
-
-
-
Controls:
-
- {{:helper.link('Send', 'gear', {'send': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}} - {{:helper.link('Receive', 'gear', {'receive': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}} - {{:helper.link('Recalibrate', 'gear', {'recal': 1})}} +
+
Elevation:
+
{{:helper.link(data.angle + '°', 'pencil', {'setangle' : 1})}}
-
+
+
Power:
+
+ {{for data.powerOptions}} + {{:helper.link(value.power, null, {'setpower' : index+1}, null, + value.enabled ? (value.power == data.power ? 'selected' : null) : 'disabled')}} + {{/for}} +
+
+
Sector:
+
+ {{for data.sectorOptions}} + {{:helper.link(value, 'gear', {'setz' : value}, null, value == data.currentZ ? 'selected' : null)}} + {{/for}} +
+
+
Controls:
+
+ {{:helper.link('Send', 'arrowreturnthick-1-n', {'send' : 1})}} + {{:helper.link('Receive', 'arrowreturnthick-1-s', {'receive' : 1})}} + {{:helper.link('Recalibrate', 'gear', {'recal' : 1})}} +
+
+ + {{if !data.lastTeleData}} +
No teleport data found.
+ {{else}} +
+
Telepad Location:
+
{{:data.lastTeleData.src_x}}, {{:data.lastTeleData.src_y}}
+
+
+
Distance:
+
{{:helper.fixed(data.lastTeleData.distance)}}m
+
+
+
Transit Time:
+
{{:helper.fixed(data.lastTeleData.time)}} secs
+
+ {{/if}} +{{/if}} diff --git a/vorestation.dme b/vorestation.dme index 46163e6593..e04ad5e057 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2200,6 +2200,11 @@ #include "code\modules\tables\rack.dm" #include "code\modules\tables\tables.dm" #include "code\modules\tables\update_triggers.dm" +#include "code\modules\telesci\bscyrstal.dm" +#include "code\modules\telesci\construction.dm" +#include "code\modules\telesci\gps_advanced.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" #include "code\modules\vehicles\cargo_train.dm" #include "code\modules\vehicles\rover_vr.dm" #include "code\modules\vehicles\train.dm" From eb92df28c2203fdaf00cf0e630a62681868e3401 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 21 Feb 2017 09:34:06 -0500 Subject: [PATCH 2/3] Updates to areas to make them be protected from telesci --- code/game/area/Space Station 13 areas_vr.dm | 34 +++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index 0e639737ae..476cb6bd61 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -1,44 +1,54 @@ /area/crew_quarters/sleep/vistor_room_1 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_2 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_3 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_4 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_5 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_6 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_7 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_8 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_9 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_10 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_11 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_12 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/teleporter/departing name = "\improper Long-Range Teleporter" icon_state = "teleporter" music = "signal" +// Override telescience shielding on some areas +/area/security/armoury + flags = BLUE_SHIELDED + +/area/security/tactical + flags = BLUE_SHIELDED + +/area/security/nuke_storage + flags = BLUE_SHIELDED + // New shuttles /area/shuttle/administration/transit name = "Deep Space (AS)" From 8df2f50f09250ddf18627637e2abc0af6efda82c Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 21 Feb 2017 14:13:55 -0500 Subject: [PATCH 3/3] Fix resources required to build bluecrystals, used wrong constants. --- code/modules/telesci/construction.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm index df19a82f5b..fdb66857a5 100644 --- a/code/modules/telesci/construction.dm +++ b/code/modules/telesci/construction.dm @@ -48,6 +48,6 @@ name = "Artificial Bluespace Crystal" id = "bluespace_crystal" req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) - materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500) + materials = list("diamond" = 1500, "phoron" = 1500) build_path = /obj/item/weapon/ore/bluespace_crystal/artificial sort_string = "HAAEC"