From 1a92ff92cf476bfb82c1a8773c6a680f4085c5af Mon Sep 17 00:00:00 2001 From: skull132 Date: Thu, 17 Sep 2015 13:55:54 +0300 Subject: [PATCH 1/3] Module import --- code/modules/research/designs.dm | 16 +- code/modules/telesci/bscrystal.dm | 46 +++ code/modules/telesci/gps.dm | 81 +++++ code/modules/telesci/telepad.dm | 148 +++++++++ code/modules/telesci/telesci_computer.dm | 368 +++++++++++++++++++++++ 5 files changed, 656 insertions(+), 3 deletions(-) create mode 100644 code/modules/telesci/bscrystal.dm create mode 100644 code/modules/telesci/gps.dm create mode 100644 code/modules/telesci/telepad.dm create mode 100644 code/modules/telesci/telesci_computer.dm diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 3ddb262453a..fdcd0e67ed5 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -309,6 +309,18 @@ datum/design/circuit/aifixer req_tech = list("programming" = 3, "biotech" = 2) build_path = /obj/item/weapon/circuitboard/aifixer +datum/design/circuit/telesci_console + name = "telepad control console" + id = "telesci_console" + req_tech = list("programming" = 3, "bluespace" = 2) + build_path = /obj/item/weapon/circuitboard/telesci_console + +datum/design/circuit/telepad + name = "telepad board" + id = "telepad" + req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3) + build_path = /obj/item/weapon/circuitboard/telesci_pad + /////////////////////////////////// /////////Shield Generators///////// /////////////////////////////////// @@ -1434,7 +1446,6 @@ datum/design/item/bag_holding reliability_base = 80 build_path = /obj/item/weapon/storage/backpack/holding -/* datum/design/bluespace_crystal name = "Artificial bluespace crystal" desc = "A small blue crystal with mystical properties." @@ -1443,8 +1454,7 @@ datum/design/bluespace_crystal build_type = PROTOLATHE materials = list("$gold" = 1500, "$diamond" = 3000, "$phoron" = 1500) reliability_base = 100 - build_path = /obj/item/bluespace_crystal/artificial" -*/ + build_path = /obj/item/bluespace_crystal/artificial ///////////////////////////////////////// /////////////////HUDs//////////////////// diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm new file mode 100644 index 00000000000..14eb5569590 --- /dev/null +++ b/code/modules/telesci/bscrystal.dm @@ -0,0 +1,46 @@ +// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. + +/obj/item/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 = 1 + origin_tech = "bluespace=4;materials=3" + var/blink_range = 8 // The teleport range when crushed/thrown at someone. + + +/obj/item/bluespace_crystal/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + + +/obj/item/bluespace_crystal/attack_self(mob/user) + user.visible_message("[user] crushes [src]!", "You crush [src]!") + PoolOrNew(/obj/effect/effect/sparks, loc) + playsound(src.loc, "sparks", 50, 1) + blink_mob(user) + user.unEquip(src) + qdel(src) + +/obj/item/bluespace_crystal/proc/blink_mob(mob/living/L) + do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') + +/obj/item/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) + PoolOrNew(/obj/effect/effect/sparks, T) + playsound(src.loc, "sparks", 50, 1) + if(isliving(hit_atom)) + blink_mob(hit_atom) + qdel(src) + +// Artifical bluespace crystal, doesn't give you much research. + +/obj/item/bluespace_crystal/artificial + name = "artificial bluespace crystal" + desc = "An artificially made bluespace crystal, it looks delicate." + origin_tech = "bluespace=2" + blink_range = 4 // Not as good as the organic stuff! \ No newline at end of file diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm new file mode 100644 index 00000000000..6271a79a6dd --- /dev/null +++ b/code/modules/telesci/gps.dm @@ -0,0 +1,81 @@ +var/list/GPS_list = list() +/obj/item/device/gps + name = "global positioning system" + desc = "Helping lost spacemen find their way through the planets since 2016." + icon = 'icons/obj/telescience.dmi' + icon_state = "gps-c" + w_class = 2 + slot_flags = SLOT_BELT + origin_tech = "programming=2;engineering=2" + var/gpstag = "COM0" + var/emped = 0 + var/turf/locked_location + +/obj/item/device/gps/New() + ..() + GPS_list.Add(src) + name = "global positioning system ([gpstag])" + overlays += "working" + +/obj/item/device/gps/Destroy() + GPS_list.Remove(src) + return ..() + +/obj/item/device/gps/emp_act(severity) + emped = 1 + overlays -= "working" + overlays += "emp" + spawn(300) + emped = 0 + overlays -= "emp" + overlays += "working" + +/obj/item/device/gps/attack_self(mob/user) + + var/obj/item/device/gps/t = "" + var/gps_window_height = 110 + GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show + if(emped) + t += "ERROR" + else + t += "
Set Tag " + t += "
Tag: [gpstag]" + if(locked_location && locked_location.loc) + t += "
Bluespace coordinates saved: [locked_location.loc]" + gps_window_height += 20 + + for(var/obj/item/device/gps/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, 360, min(gps_window_height, 800)) + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/item/device/gps/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/science + icon_state = "gps-s" + gpstag = "SCI0" + +/obj/item/device/gps/engineering + icon_state = "gps-e" + gpstag = "ENG0" + +/obj/item/device/gps/mining + icon_state = "gps-m" + gpstag = "MINE0" + desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm new file mode 100644 index 00000000000..5e921a6466d --- /dev/null +++ b/code/modules/telesci/telepad.dm @@ -0,0 +1,148 @@ +///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 + idle_power_usage = 200 + active_power_usage = 5000 + var/efficiency + +/obj/machinery/telepad/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telesci_pad(null) + component_parts += new /obj/item/bluespace_crystal/artificial(null) + component_parts += new /obj/item/bluespace_crystal/artificial(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + +/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/I, mob/user, params) + if(default_deconstruction_screwdriver(user, "pad-idle-o", "pad-idle", I)) + return + + if(panel_open) + if(istype(I, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = I + M.buffer = src + user << "You save the data in the [I.name]'s buffer." + + default_deconstruction_crowbar(I) + + +//CARGO TELEPAD// +/obj/machinery/telepad_cargo + name = "cargo telepad" + desc = "A telepad used by the Rapid Crate Sender." + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + anchored = 1 + use_power = 1 + idle_power_usage = 20 + active_power_usage = 500 + var/stage = 0 + +/obj/machinery/telepad_cargo/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/wrench)) + anchored = 0 + playsound(src, 'sound/items/Ratchet.ogg', 50, 1) + if(anchored) + anchored = 0 + user << "\The [src] can now be moved." + else if(!anchored) + anchored = 1 + user << "\The [src] is now secured." + if(istype(W, /obj/item/weapon/screwdriver)) + if(stage == 0) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You unscrew the telepad's tracking beacon." + stage = 1 + else if(stage == 1) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You screw in the telepad's tracking beacon." + stage = 0 + if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) + playsound(src, 'sound/items/Welder.ogg', 50, 1) + user << "You disassemble the telepad." + new /obj/item/stack/material/steel(get_turf(src)) + new /obj/item/stack/material/glass(get_turf(src)) + qdel(src) + +///TELEPAD CALLER/// +/obj/item/device/telepad_beacon + name = "telepad beacon" + desc = "Use to warp in a cargo telepad." + icon = 'icons/obj/radio.dmi' + icon_state = "beacon" + item_state = "signaler" + origin_tech = "bluespace=3" + +/obj/item/device/telepad_beacon/attack_self(mob/user) + if(user) + user << "Locked In" + new /obj/machinery/telepad_cargo(user.loc) + playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) + qdel(src) + return + +///HANDHELD TELEPAD USER/// +/obj/item/weapon/rcs + name = "rapid-crate-sender (RCS)" + desc = "Use this to send crates and closets to cargo telepads." + icon = 'icons/obj/telescience.dmi' + icon_state = "rcs" + flags = CONDUCT + force = 10 + throwforce = 10 + throw_speed = 2 + throw_range = 5 + var/rcharges = 10 + var/obj/machinery/pad = null + var/last_charge = 30 + var/mode = 0 + var/rand_x = 0 + var/rand_y = 0 + var/emagged = 0 + var/teleporting = 0 + +/obj/item/weapon/rcs/examine(mob/user) + ..() + user << "There are [rcharges] charge\s left." + +/obj/item/weapon/rcs/process() + if(rcharges > 10) + rcharges = 10 + if(last_charge == 0) + rcharges++ + last_charge = 30 + else + last_charge-- + +/obj/item/weapon/rcs/attack_self(mob/user) + if(emagged) + if(mode == 0) + mode = 1 + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + user << "The telepad locator has become uncalibrated." + else + mode = 0 + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + user << "You calibrate the telepad locator." + +/obj/item/weapon/rcs/attackby(var/obj/item/O, var/mob/user) + if (istype(O, /obj/item/weapon/card/emag) && !emagged) + emagged = 1 + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + user << "You emag the RCS. Click on it to toggle between modes." diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm new file mode 100644 index 00000000000..db1c7b335a8 --- /dev/null +++ b/code/modules/telesci/telesci_computer.dm @@ -0,0 +1,368 @@ +/obj/machinery/computer/telescience + name = "\improper Telepad Control Console" + desc = "Used to teleport objects to and from the telescience telepad." + icon_state = "teleport" + 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/angle_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 = 3 + 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.loc = 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/bluespace_crystal/artificial(null) // starting crystals + +/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/bluespace_crystal)) + if(crystals.len >= max_crystals) + user << "There are not enough crystal slots." + return + if(!user.drop_item()) + return + crystals += W + W.loc = null + 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.loc = 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.buffer && istype(M.buffer, /obj/machinery/telepad)) + telepad = M.buffer + M.buffer = null + user << "You upload the data from the [W.name]'s buffer." + else + ..() + +/obj/machinery/computer/telescience/attack_ai(mob/user) + src.attack_hand(user) + +/obj/machinery/computer/telescience/attack_hand(mob/user) + if(..()) + return + interact(user) + +/obj/machinery/computer/telescience/interact(mob/user) + var/t + if(!telepad) + in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console + t += "
No telepad located.
Please add telepad data.

" + else + if(inserted_gps) + t += "Eject GPS" + t += "Set GPS memory" + else + t += "Eject GPS" + t += "Set GPS memory" + t += "
[temp_msg]

" + t += "Set Bearing" + t += "
[rotation]°
" + t += "Set Elevation" + t += "
[angle]°
" + t += "Set Power" + t += "
" + + for(var/i = 1; i <= power_options.len; i++) + if(crystals.len + telepad.efficiency < i) + t += "[power_options[i]]" + continue + if(power == power_options[i]) + t += "[power_options[i]]" + continue + t += "[power_options[i]]" + t += "
" + + t += "Set Sector" + t += "
[z_co ? z_co : "NULL"]
" + + t += "
Send" + t += " Receive" + t += "
Recalibrate Crystals Eject Crystals" + + // Information about the last teleport + t += "
" + if(!last_tele_data) + t += "No teleport data found." + else + t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])
" + //t += "Distance: [round(last_tele_data.distance, 0.1)]m
" + t += "Time: [round(last_tele_data.time, 0.1)] secs
" + t += "
" + + var/datum/browser/popup = new(user, "telesci", name, 300, 500) + popup.set_content(t) + popup.open() + return + +/obj/machinery/computer/telescience/proc/sparks() + if(telepad) + var/datum/effect/effect/system/spark_spread/s = new /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 = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, get_turf(telepad)) + s.start() + + 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 = new /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 = dd_limittext(log_msg, length(log_msg) - 2) + log_msg += ")" + log_msg += ", " + do_teleport(ROI, dest) + + if (dd_hassuffix(log_msg, ", ")) + log_msg = dd_limittext(log_msg, length(log_msg) - 2) + else + 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 == 2 || z_co < 1 || z_co > 6) + telefail() + temp_msg = "ERROR! Sector is less than 1,
greater than 6, or equal to 2." + 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.loc = 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 = input("Please input desired sector.", name, z_co) as num + if(..()) + return + z_co = Clamp(round(new_z), 1, 10) + + if(href_list["ejectGPS"]) + if(inserted_gps) + inserted_gps.loc = loc + inserted_gps = null + + if(href_list["setMemory"]) + if(last_target && inserted_gps) + 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(30, 40) + //angle_off = rand(-25, 25) + power_off = rand(-4, 0) + rotation_off = rand(-10, 10) \ No newline at end of file From 50fa97c01ba56a560f48e8417ef69cead44aadd1 Mon Sep 17 00:00:00 2001 From: skull132 Date: Thu, 17 Sep 2015 13:56:04 +0300 Subject: [PATCH 2/3] File modification --- code/__HELPERS/text.dm | 8 ++++++++ .../weapons/circuitboards/computer/computer.dm | 11 ++++++++--- .../weapons/circuitboards/machinery/research.dm | 13 ++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index dcc231295d4..dad2492e4d1 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -138,6 +138,14 @@ /proc/sanitize_old(var/t,var/list/repl_chars = list("\n"="#","\t"="#")) return html_encode(replace_characters(t,repl_chars)) +// Truncates text to limit if necessary. +/proc/dd_limittext(message, length) + var/size = length(message) + if (size <= length) + return message + else + return copytext(message, 1, length + 1) + /* * Text searches */ diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index d71e2dcb074..bbb9d42730b 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif /obj/item/weapon/circuitboard/message_monitor @@ -60,11 +60,11 @@ /obj/item/weapon/circuitboard/stationalert_engineering name = T_BOARD("station alert console (engineering)") build_path = /obj/machinery/computer/station_alert - + /obj/item/weapon/circuitboard/stationalert_security name = T_BOARD("station alert console (security)") build_path = /obj/machinery/computer/station_alert - + /obj/item/weapon/circuitboard/stationalert_all name = T_BOARD("station alert console (all)") build_path = /obj/machinery/computer/station_alert/all @@ -196,3 +196,8 @@ name = T_BOARD("RCON remote control console") build_path = /obj/machinery/computer/rcon origin_tech = "programming=4;engineering=3;powerstorage=5" + +/obj/item/weapon/circuitboard/telesci_console + name = T_BOARD("Telescience Console") + build_path = /obj/machinery/computer/telescience + origin_tech = "programming=3;bluespace=2" \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 0ab0822e4bb..2faeafa1b79 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif obj/item/weapon/circuitboard/rdserver @@ -62,3 +62,14 @@ obj/item/weapon/circuitboard/rdserver "/obj/item/weapon/stock_parts/manipulator" = 1, "/obj/item/weapon/stock_parts/micro_laser" = 1, "/obj/item/weapon/stock_parts/console_screen" = 1) + +/obj/item/weapon/circuitboard/telesci_pad + name = T_BOARD("telepad") + build_path = "/obj/machinery/telepad" + board_type = "machine" + origin_tech = "programming=4;engineering=3;materials=3;bluespace=4" + req_components = list( + "/obj/item/bluespace_crystal" = 2, + "/obj/item/weapon/stock_parts/capacitor" = 1, + "/obj/item/stack/cable_coil" = 1, + "/obj/item/weapon/stock_parts/console_screen" = 1) \ No newline at end of file From c52de3e890076fd8906fac3de094ef46bc01feb2 Mon Sep 17 00:00:00 2001 From: skull132 Date: Thu, 17 Sep 2015 13:56:13 +0300 Subject: [PATCH 3/3] Icon import --- icons/obj/telescience.dmi | Bin 0 -> 2414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/obj/telescience.dmi diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a0491827924d04279883b5ac0802aa2ed5b23166 GIT binary patch literal 2414 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 literal 0 HcmV?d00001