From 99321389f27b42982bd173ca857852c4b46430a8 Mon Sep 17 00:00:00 2001 From: Kilakk Date: Thu, 14 Nov 2013 21:45:25 -0500 Subject: [PATCH 01/16] Fixes #3886, ATMs no longer log you in automagically Silly security level 0 ruined everything Added a tiny sanity check as well to avoid runtimes --- code/modules/economy/ATM.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 32dc6cbc9d3..398d311c189 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -97,8 +97,6 @@ log transactions user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." return if(get_dist(src,user) <= 1) - //check to see if the user has low security enabled - scan_user(user) //js replicated from obj/machinery/computer/card var/dat = "

NanoTrasen Automatic Teller Machine

" @@ -223,7 +221,11 @@ log transactions var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0) authenticated_account.security_level = new_sec_level if("attempt_auth") - if(!ticks_left_locked_down) + + // check if they have low security enabled + scan_user(usr) + + if(!ticks_left_locked_down && held_card) var/tried_account_num = text2num(href_list["account_num"]) if(!tried_account_num) tried_account_num = held_card.associated_account_number @@ -363,3 +365,5 @@ log transactions T.date = current_date_string T.time = worldtime2text() authenticated_account.transaction_log.Add(T) + + view_screen = NO_SCREEN \ No newline at end of file From 734d89c669e1f078e40a589b91a8dabd5250ab64 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 15 Nov 2013 01:00:25 -0600 Subject: [PATCH 02/16] BugFix: Cult Ghosts...after a bit of professional advise from chinsky. Problem: Cult members can't use the rune to see ghosts, then beat ghosts over the head. it was being intercepted by _onclick and processed there and only displaying an angry red notice that you hit that ghost. Ghost didn't become visible, it disappeared soon after moving off the rune. Solution: Made an attackby for ghosts to check when they are being beat up by cultist with books, now they appear. Minor feature change: Now if a visible ghost gets hit it will give a different message than the standard "Ghost is pulled through from the other side". --- code/modules/mob/dead/observer/observer.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ae544c43d54..e06d7ed2633 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -63,6 +63,23 @@ real_name = name ..() + +/mob/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/tome)) + var/mob/dead/M = src + if(src.invisibility != 0) + M.invisibility = 0 + user.visible_message( \ + "\red [user] drags ghost, [M], to our plan of reality!", \ + "\red You drag [M] to our plan of reality!" \ + ) + else + user.visible_message ( \ + "\red [user] just tried to smash his book into that ghost! It's not very effective", \ + "\red You get the feeling that the ghost can't become any more visible." \ + ) + + /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 1 /* From 4ccf7d0a08c9429065e6c0512ca61ef96a6fba9f Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 15 Nov 2013 22:01:35 -0600 Subject: [PATCH 03/16] Bugfix (3778) Power cells in exosuits have the same amount of power as a highcap cell Issue: Mechs are created/spawned with a high-capaciter cell that is named "Power cell" and confuses some of the less bright roboticists and their beards. Solution: Shave the roboticist, and also renamed the cell that spawns to properly reflect it's higher capacity. --- code/game/mecha/mecha.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1b47d6f9a90..65284a054d1 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -115,6 +115,7 @@ cell = C return cell = new(src) + cell.name = "high-capacity power cell" cell.charge = 15000 cell.maxcharge = 15000 From ab06251c32a489d5705778e5afc5ada22e534a36 Mon Sep 17 00:00:00 2001 From: Nanai Date: Sat, 16 Nov 2013 02:01:16 -0500 Subject: [PATCH 04/16] Event Rebalance! As per request, events have been rebalanced to be a bit more even and vastly less appendicitis. Event timers have been increased from 15-25 minutes to 20-40 minutes. --- code/modules/events/event_dynamic.dm | 30 ++++++++++++++-------------- code/modules/events/event_manager.dm | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 93142e02614..8a5b3b61b26 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -44,39 +44,39 @@ var/list/event_last_fired = list() //see: // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm - possibleEvents[/datum/event/economic_event] = 200 - possibleEvents[/datum/event/trivial_news] = 300 - possibleEvents[/datum/event/mundane_news] = 200 + possibleEvents[/datum/event/economic_event] = 300 + possibleEvents[/datum/event/trivial_news] = 400 + possibleEvents[/datum/event/mundane_news] = 300 possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50) if(account_hack_attempted) possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200) - possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"] - possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/carp_migration] = 20 + 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/brand_intelligence] = 20 + 25 * active_with_role["Janitor"] - possibleEvents[/datum/event/rogue_drone] = 25 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] - possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/rogue_drone] = 5 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] + possibleEvents[/datum/event/infestation] = 100 + 100 * active_with_role["Janitor"] possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25 possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 - possibleEvents[/datum/event/grid_check] = 25 + 20 * active_with_role["Engineer"] - possibleEvents[/datum/event/electrical_storm] = 10 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/electrical_storm] = 15 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"] if(!spacevines_spawned) - possibleEvents[/datum/event/spacevine] = 5 + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/spacevine] = 10 + 5 * active_with_role["Engineer"] if(minutes_passed >= 30) // Give engineers time to set up engine possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"] - possibleEvents[/datum/event/meteor_shower] = 40 * active_with_role["Engineer"] + possibleEvents[/datum/event/meteor_shower] = 20 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 20 * active_with_role["Engineer"] - possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 100 + possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 15 if(active_with_role["Medical"] > 0) - possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 50 - possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 150 - possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 20 possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50 diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 89347a299d9..52fbc8220a8 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -2,8 +2,8 @@ var/list/allEvents = typesof(/datum/event) - /datum/event var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event //var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation -var/eventTimeLower = 9000 //15 minutes -var/eventTimeUpper = 15000 //25 minutes +var/eventTimeLower = 12000 //20 minutes +var/eventTimeUpper = 24000 //40 minutes var/scheduledEvent = null From 08a3226f0794405984e74c522b67ab0b86d1a675 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sun, 17 Nov 2013 15:03:50 +0000 Subject: [PATCH 05/16] Fix for the config .gitignore. Signed-off-by: Mloc-Argent --- .gitignore | 6 ------ config/.gitignore | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 config/.gitignore diff --git a/.gitignore b/.gitignore index 0dc17248d0c..7daab156185 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,3 @@ *.rsc *.dmb *.lk - -#ignore any files in config/, except those in subdirectories. -/config/* -!/config/*/* - -/baystation12.int diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 00000000000..ec7ed9b452e --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,3 @@ +#ignore everything here, except subdirectories. +* +!*/ From b75380985e273f172653cd9115b77a31e216c62e Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sun, 17 Nov 2013 11:54:43 -0800 Subject: [PATCH 06/16] Using a better method to handle autotransfers. Old method was silly. --- baystation12.dme | 1 + code/controllers/voting.dm | 1 - code/game/gamemodes/gameticker.dm | 14 -------------- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index a5cf03ea1e6..aaf9eab8aff 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -75,6 +75,7 @@ #include "code\ATMOSPHERICS\components\unary\vent_pump.dm" #include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" #include "code\controllers\_DynamicAreaLighting_TG.dm" +#include "code\controllers\autotransfer.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\lighting_controller.dm" diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 452c174b356..92f55a3fd64 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -50,7 +50,6 @@ datum/controller/vote initiate_vote("crew_transfer","the server") log_debug("The server has called an Autotransfer") - proc/reset() initiator = null time_remaining = 0 diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index a03068371f0..ea9fbaec4a7 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -36,8 +36,6 @@ var/global/datum/controller/gameticker/ticker var/triai = 0//Global holder for Triumvirate - var/initialtpass = 0 //holder for inital autotransfer vote timer - /datum/controller/gameticker/proc/pregame() login_music = pick(\ /*'sound/music/halloween/skeletons.ogg',\ @@ -63,17 +61,6 @@ var/global/datum/controller/gameticker/ticker current_state = GAME_STATE_SETTING_UP while (!setup()) -/datum/controller/gameticker/proc/votetimer() - var/timerbuffer = 0 - if (initialtpass == 0) - timerbuffer = config.vote_autotransfer_initial - else - timerbuffer = config.vote_autotransfer_interval - spawn(timerbuffer) - vote.autotransfer() - initialtpass = 1 - votetimer() - /datum/controller/gameticker/proc/setup() //Create and announce mode @@ -166,7 +153,6 @@ var/global/datum/controller/gameticker/ticker spawn(3000) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE - votetimer() return 1 /datum/controller/gameticker From 9936a9251facf2a923c0f5a53984bf6450488f0a Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sun, 17 Nov 2013 11:55:57 -0800 Subject: [PATCH 07/16] Helps to add the actual new file. --- code/controllers/autotransfer.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 code/controllers/autotransfer.dm diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm new file mode 100644 index 00000000000..c69290c7bd8 --- /dev/null +++ b/code/controllers/autotransfer.dm @@ -0,0 +1,13 @@ +var/datum/controller/transfer_controller = new /transfer_controller() +var/timerbuffer = 0 //buffer for time check +/transfer_controller/New() + timerbuffer = config.vote_autotransfer_initial + processing_objects += src + +/transfer_controller/Del() + processing_objects -= src + +/transfer_controller/proc/process() + if (world.time >= timerbuffer - 600) + vote.autotransfer() + timerbuffer = timerbuffer + config.vote_autotransfer_interval \ No newline at end of file From 7be20c098614d02fbdb2332d4a11a39b5bd7b04e Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 19 Nov 2013 05:36:40 -0600 Subject: [PATCH 08/16] AntagHUD's player verbs will now disappear from the players view if disabled by admin or by configuration options. Poor guys won't know what they are missing! Admins/Mods will still have the verb viewable. --- code/modules/admin/verbs/randomverbs.dm | 8 ++++++-- code/modules/mob/dead/observer/observer.dm | 3 +++ code/modules/mob/new_player/new_player.dm | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 812a4b51d65..1f5b3181bfd 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -290,15 +290,19 @@ Ccomp's first proc. var/action="" if(config.antag_hud_allowed) for(var/mob/dead/observer/g in get_ghosts()) + if(!g.client.holder) //Remove the verb from non-admin ghosts + g.verbs -= /mob/dead/observer/verb/toggle_antagHUD if(g.antagHUD) - g.antagHUD = 0 // Disable it on those that have it enabled - g.has_enabled_antagHUD = 2 // We'll allow them to respawn + g.antagHUD = 0 // Disable it on those that have it enabled + g.has_enabled_antagHUD = 2 // We'll allow them to respawn g << "\red The Administrator has disabled AntagHUD " config.antag_hud_allowed = 0 src << "\red AntagHUD usage has been disabled" action = "disabled" else for(var/mob/dead/observer/g in get_ghosts()) + if(!g.client.holder) // Add the verb back for all non-admin ghosts + g.verbs += /mob/dead/observer/verb/toggle_antagHUD g << "\blue The Administrator has enabled AntagHUD " // Notify all observers they can now use AntagHUD config.antag_hud_allowed = 1 action = "enabled" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index a54b8ad96a1..c74a0e0fcc3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -25,6 +25,7 @@ see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 verbs += /mob/dead/observer/proc/dead_tele + stat = DEAD var/turf/T @@ -132,6 +133,8 @@ Works together with spawning an observer, noted above. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = src.timeofdeath //BS12 EDIT ghost.key = key + if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost /* diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 77b4dbd884d..62378036386 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -114,6 +114,7 @@ spawning = 1 src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + observer.started_as_observer = 1 close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") @@ -129,8 +130,11 @@ client.prefs.real_name = random_name(client.prefs.gender) observer.real_name = client.prefs.real_name observer.name = observer.real_name + if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + observer.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key del(src) + return 1 if(href_list["late_join"]) From 46218e71f182a47ea70443c277144509ff7dc879 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 19 Nov 2013 05:44:39 -0600 Subject: [PATCH 09/16] Bugfix: AntagHUD, need to remove verbs from correct object --- code/modules/mob/dead/observer/observer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c74a0e0fcc3..086e7949dbe 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -134,7 +134,7 @@ Works together with spawning an observer, noted above. ghost.timeofdeath = src.timeofdeath //BS12 EDIT ghost.key = key if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost /* From c13f57613cd7b700294fc532fb255776653cf9fa Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 19 Nov 2013 19:23:51 -0800 Subject: [PATCH 10/16] Changes Telescience to Projectile Trajectory! --- baystation12.dme | 1 + code/__HELPERS/game.dm | 38 ++ code/modules/research/designs.dm | 10 + code/modules/telesci/bscrystal.dm | 38 ++ code/modules/telesci/gps.dm | 26 +- code/modules/telesci/telepad.dm | 37 +- code/modules/telesci/telesci_computer.dm | 477 ++++++++++++----------- icons/obj/telescience.dmi | Bin 2080 -> 2171 bytes 8 files changed, 363 insertions(+), 264 deletions(-) create mode 100644 code/modules/telesci/bscrystal.dm diff --git a/baystation12.dme b/baystation12.dme index 35a7237aa16..ab063aadea2 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1241,6 +1241,7 @@ #include "code\modules\surgery\ribcage.dm" #include "code\modules\surgery\robolimbs.dm" #include "code\modules\surgery\surgery.dm" +#include "code\modules\telesci\bscrystal.dm" #include "code\modules\telesci\gps.dm" #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 0b535a44c39..8da220bf671 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -327,3 +327,41 @@ proc/isInSight(var/atom/A, var/atom/B) spawn(delay) for(var/client/C in group) C.screen -= O + +datum/projectile_data + var/src_x + var/src_y + var/time + var/distance + var/power_x + var/power_y + var/dest_x + var/dest_y + +/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ + var/power_x, var/power_y, var/dest_x, var/dest_y) + src.src_x = src_x + src.src_y = src_y + src.time = time + src.distance = distance + src.power_x = power_x + src.power_y = power_y + src.dest_x = dest_x + src.dest_y = dest_y + +/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power) + + // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], + // rotated at [rotation] and with the power of [power] + // Thanks to VistaPOWA for this function + + var/power_x = power * cos(angle) + var/power_y = power * sin(angle) + var/time = 2* power_y / 10 //10 = g + + var/distance = time * power_x + + var/dest_x = src_x + distance*sin(rotation); + var/dest_y = src_y + distance*cos(rotation); + + return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e861826e0f2..f2bd04a785a 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1575,6 +1575,16 @@ datum/design/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." + id = "bluespace_crystal" + req_tech = list("bluespace" = 5, "materials" = 7) + build_type = PROTOLATHE + materials = list("$gold" = 1500, "$diamond" = 3000, "$plasma" = 1500) + reliability_base = 100 + 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..d9e968f4daf --- /dev/null +++ b/code/modules/telesci/bscrystal.dm @@ -0,0 +1,38 @@ +// 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(var/mob/user) + blink_mob(user) + user.drop_item() + user.visible_message("[user] crushes the [src]!") + del(src) + +/obj/item/bluespace_crystal/proc/blink_mob(var/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(isliving(hit_atom)) + blink_mob(hit_atom) + del(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 index 79897c7e6ea..3850d439d21 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -1,5 +1,6 @@ +var/list/GPS_list = list() /obj/item/device/gps - name = "Global Positioning System" + 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" @@ -11,9 +12,15 @@ var/emped = 0 /obj/item/device/gps/New() - name = "Global Positioning System ([gpstag])" + ..() + GPS_list.Add(src) + name = "global positioning system ([gpstag])" overlays += "working" +/obj/item/device/gps/Del() + GPS_list.Remove(src) + ..() + /obj/item/device/gps/emp_act(severity) emped = 1 overlays -= "working" @@ -24,6 +31,7 @@ overlays += "working" /obj/item/device/gps/attack_self(mob/user as mob) + var/obj/item/device/gps/t = "" if(emped) t += "ERROR" @@ -31,7 +39,7 @@ t += "
Set Tag " t += "
Tag: [gpstag]" - for(var/obj/item/device/gps/G in world) + 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 @@ -46,16 +54,14 @@ 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 = copytext(sanitize(a), 1, 20) - if(length(a) != 4) - usr << "\blue The tag must be four letters long!" - return - else + a = uppertext(copytext(sanitize(a), 1, 5)) + if(src.loc == usr) gpstag = a - name = "Global Positioning System ([gpstag])" - return + name = "global positioning system ([gpstag])" + attack_self(usr) /obj/item/device/gps/science icon_state = "gps-s" diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 1ebc1a3572e..c54d079afde 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -8,10 +8,6 @@ use_power = 1 idle_power_usage = 200 active_power_usage = 5000 -/obj/machinery/telepad/New() - ..() -/obj/machinery/telepad/Del() - ..() //CARGO TELEPAD// /obj/machinery/telepad_cargo name = "cargo telepad" @@ -23,39 +19,35 @@ idle_power_usage = 20 active_power_usage = 500 var/stage = 0 -/obj/machinery/telepad_cargo/New() - ..() -/obj/machinery/telepad_cargo/Del() - ..() /obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) anchored = 0 playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(anchored) anchored = 0 - user << "\blue The [src] can now be moved." + user << " The [src] can now be moved." else if(!anchored) anchored = 1 - user << "\blue The [src] is now secured." + 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 << "\blue You unscrew the telepad's tracking beacon." + user << " You unscrew the telepad's tracking beacon." stage = 1 else if(stage == 1) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw in the telepad's tracking beacon." + 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 << "\blue You disassemble the telepad." + user << " You disassemble the telepad." new /obj/item/stack/sheet/metal(get_turf(src)) new /obj/item/stack/sheet/glass(get_turf(src)) del(src) ///TELEPAD CALLER/// /obj/item/device/telepad_beacon - name = "Telepad Beacon" + name = "telepad beacon" desc = "Use to warp in a cargo telepad." icon = 'icons/obj/radio.dmi' icon_state = "beacon" @@ -64,7 +56,7 @@ /obj/item/device/telepad_beacon/attack_self(mob/user as mob) if(user) - user << "\blue Locked In" + user << " Locked In" new /obj/machinery/telepad_cargo(user.loc) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) del(src) @@ -76,9 +68,6 @@ desc = "Use this to send crates and closets to cargo telepads." icon = 'icons/obj/telescience.dmi' icon_state = "rcs" - opacity = 0 - density = 0 - anchored = 0.0 flags = FPRINT | TABLEPASS| CONDUCT force = 10.0 throwforce = 10.0 @@ -94,18 +83,20 @@ var/teleporting = 0 /obj/item/weapon/rcs/New() + ..() processing_objects.Add(src) +/obj/item/weapon/rcs/examine() desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left." + ..() /obj/item/weapon/rcs/Del() processing_objects.Remove(src) - + ..() /obj/item/weapon/rcs/process() if(rcharges > 10) rcharges = 10 if(last_charge == 0) rcharges++ - desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left." last_charge = 30 else last_charge-- @@ -115,11 +106,11 @@ if(mode == 0) mode = 1 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << "\red The telepad locator has become uncalibrated." + user << " The telepad locator has become uncalibrated." else mode = 0 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << "\blue You calibrate the telepad locator." + user << " You calibrate the telepad locator." /obj/item/weapon/rcs/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/card/emag) && emagged == 0) @@ -127,5 +118,5 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - user << "\red You emag the RCS. Click on it to toggle between modes." + user << " You emag the RCS. Click on it to toggle between modes." return \ No newline at end of file diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 471473ed2e9..85232a41068 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -1,20 +1,52 @@ /obj/machinery/computer/telescience - name = "Telepad Control Console" + name = "\improper Telepad Control Console" desc = "Used to teleport objects to and from the telescience telepad." icon_state = "teleport" + 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/x_off // X offset - var/y_off // Y offset - var/x_co // X coordinate - var/y_co // Y coordinate - var/z_co // Z coordinate + var/datum/projectile_data/last_tele_data = null + var/z_co = 1 + var/power_off + var/rotation_off + var/angle_off + + var/rotation = 0 + var/angle = 45 + var/power + + // Based on the power used + var/teleport_cooldown = 0 + var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) // every index requires a bluespace crystal + var/teleporting = 0 + var/starting_crystals = 3 + var/list/crystals = list() /obj/machinery/computer/telescience/New() - teles_left = rand(8,12) - x_off = rand(-10,10) - y_off = rand(-10,10) + ..() + link_telepad() + recalibrate() + +/obj/machinery/computer/telescience/Del() + eject() + ..() + +/obj/machinery/computer/telescience/examine() + ..() + usr << "There are [crystals.len] bluespace crystals in the crystal ports." + +/obj/machinery/computer/telescience/initialize() + ..() + link_telepad() + for(var/i = 1; i <= starting_crystals; i++) + crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals + power = power_options[1] + +/obj/machinery/computer/telescience/proc/link_telepad() + telepad = locate() in range(src, 7) /obj/machinery/computer/telescience/update_icon() if(stat & BROKEN) @@ -28,267 +60,250 @@ stat &= ~NOPOWER /obj/machinery/computer/telescience/attack_paw(mob/user) - usr << "You are too primitive to use this computer." + user << "You are too primitive to use this computer." return +/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/bluespace_crystal)) + if(crystals.len >= power_options.len) + user << "There are not enough crystal ports." + return + user.drop_item() + crystals += W + W.loc = null + user.visible_message("[user] inserts a [W] into the [src]'s crystal port.") + else + ..() + /obj/machinery/computer/telescience/attack_ai(mob/user) - src.attack_hand() + src.attack_hand(user) /obj/machinery/computer/telescience/attack_hand(mob/user) if(..()) return - if(stat & (NOPOWER|BROKEN)) - return - var/t = "" - t += "Set X" - t += "Set Y" - t += "Set Z" - t += "

Current set coordinates:" - t += "([x_co], [y_co], [z_co])" - t += "

Send" + interact(user) + +/obj/machinery/computer/telescience/interact(mob/user) + + var/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 < 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" - var/datum/browser/popup = new(user, "telesci", name, 640, 480) + 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() - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) + if(telepad) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) + s.set_up(5, 1, get_turf(telepad)) s.start() + else + return + /obj/machinery/computer/telescience/proc/telefail() - if(prob(95)) - sparks() - for(var/mob/O in hearers(src, null)) - O.show_message("\red The telepad weakly fizzles.", 2) + 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(prob(5)) - // Irradiate everyone in telescience! - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - sparks() - for(var/mob/living/carbon/human/M in viewers(L, null)) - M.apply_effect((rand(10, 20)), IRRADIATE, 0) - M << "\red You feel strange." + + if(teleporting) + temp_msg = "Telepad is in use.
Please wait." return - if(prob(1)) - // AI CALL SHUTTLE I SAW RUNE, SUPER LOW CHANCE, CAN HARDLY HAPPEN - for(var/mob/living/carbon/O in viewers(src, null)) - var/datum/game_mode/cult/temp = new - O.show_message("\red The telepad flashes with a strange light, and you have a sudden surge of allegiance toward the true dark one!", 2) - O.mind.make_Cultist() - temp.grant_runeword(O) - sparks() - return - if(prob(1)) - // VIVA LA FUCKING REVOLUTION BITCHES, SUPER LOW CHANCE, CAN HARDLY HAPPEN - for(var/mob/living/carbon/O in viewers(src, null)) - O.show_message("\red The telepad flashes with a strange light, and you see all kind of images flash through your mind, of murderous things Nanotrasen has done, and you decide to rebel!", 2) - O.mind.make_Rev() - sparks() - return - if(prob(1)) - // The OH SHIT FUCK GOD DAMN IT LYNCH THE SCIENTISTS event. - for(var/mob/living/carbon/O in viewers(src, null)) - O.show_message("\red The telepad changes colors rapidly, and opens a portal, and you see what your mind seems to think is the very threads that hold the pattern of the universe together, and a eerie sense of paranoia creeps into you.", 2) - spacevine_infestation() - sparks() - return - if(prob(5)) - // HOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONK - for(var/mob/living/carbon/M in hearers(src, null)) - M << sound('sound/items/AirHorn.ogg') - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) - continue - M << "HONK" - M.sleeping = 0 - M.stuttering += 20 - M.ear_deaf += 30 - M.Weaken(3) - if(prob(30)) - M.Stun(10) - M.Paralyse(4) + + if(telepad) + + var/truePower = Clamp(power + power_off, 1, 1000) + var/trueRotation = rotation + rotation_off + var/trueAngle = Clamp(angle + angle_off, 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) + 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 - M.make_jittery(500) - sparks() - return - if(prob(1)) - // They did the mash! (They did the monster mash!) The monster mash! (It was a graveyard smash!) - sparks() - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/giant_spider/nurse) - var/list/hostiles = typesof(/mob/living/simple_animal/hostile) - blocked - playsound(L, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(L, null)) - flick("e_flash", M.flash) - var/chosen = pick(hostiles) - var/mob/living/simple_animal/hostile/H = new chosen - H.loc = L - return - return - return + temp_msg += "Data printed below." + investigate_log("[key_name(usr)]/[user] has teleported with Telescience at [trueX],[trueY],[z_co], in [A ? A.name : "null area"].","telesci") -/obj/machinery/computer/telescience/proc/dosend() - var/trueX = (x_co + x_off) - var/trueY = (y_co + y_off) - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/target = locate(trueX, trueY, z_co) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) - s.start() - flick("pad-beam", E) - usr << "\blue Teleport successful." - 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() - for(var/obj/item/OI in L) - do_teleport(OI, target, 0) - for(var/obj/structure/closet/OC in L) - do_teleport(OC, target, 0) - for(var/mob/living/carbon/MO in L) - do_teleport(MO, target, 0) - for(var/mob/living/simple_animal/SA in L) - do_teleport(SA, target, 0) - return - return + 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() -/obj/machinery/computer/telescience/proc/doreceive() - var/trueX = (x_co + x_off) - var/trueY = (y_co + y_off) - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/T = locate(trueX, trueY, z_co) - var/G = get_turf(T) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) - s.start() - flick("pad-beam", E) - usr << "\blue Teleport successful." - var/sparks = get_turf(T) - var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread - y.set_up(5, 1, sparks) - y.start() - for(var/obj/item/ROI in G) - do_teleport(ROI, E, 0) - for(var/obj/structure/closet/ROC in G) - do_teleport(ROC, E, 0) - for(var/mob/living/carbon/RMO in G) - do_teleport(RMO, E, 0) - for(var/mob/living/simple_animal/RSA in G) - do_teleport(RSA, E, 0) - return - return + var/turf/source = target + var/turf/dest = get_turf(telepad) + if(sending) + source = dest + dest = target -/obj/machinery/computer/telescience/proc/telesend() - if(x_co == "") - usr << "\red Error: set coordinates." + flick("pad-beam", telepad) + playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1) + 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 + else + continue + else if(!isobserver(ROI)) + continue + do_teleport(ROI, dest) + 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(y_co == "") - usr << "\red Error: set coordinates." - return - if(z_co == "") - usr << "\red Error: set coordinates." - return - if(x_co < 1 || x_co > 255) + if(power <= 0) telefail() - usr << "\red Error: X is less than 11 or greater than 245." + temp_msg = "ERROR!
No power selected!" return - if(y_co < 1 || y_co > 255) + if(angle < 1 || angle > 90) telefail() - usr << "\red Error: Y is less than 11 or greater than 245." + temp_msg = "ERROR!
Elevation is less than 1 or greater than 90." return if(z_co == 2 || z_co < 1 || z_co > 6) telefail() - usr << "\red Error: Z is less than 1, greater than 6, or equal to 2." + temp_msg = "ERROR! Sector is less than 1,
greater than 6, or equal to 2." return if(teles_left > 0) - teles_left -= 1 - dosend() + doteleport(user) else - dosend() + telefail() + temp_msg = "ERROR!
Calibration required." return return -/obj/machinery/computer/telescience/proc/telereceive() - // basically the same thing - if(x_co == "") - usr << "\red Error: set coordinates." - return - if(y_co == "") - usr << "\red Error: set coordinates." - return - if(z_co == "") - usr << "\red Error: set coordinates." - return - if(x_co < 1 || x_co > 255) - telefail() - usr << "\red Error: X is less than 11 or greater than 200." - return - if(y_co < 1 || y_co > 255) - telefail() - usr << "\red Error: Y is less than 11 or greater than 200." - return - if(z_co == 2 || z_co < 1 || z_co > 6) - telefail() - usr << "\red Error: Z is less than 1, greater than 6, or equal to 2." - return - if(teles_left > 0) - teles_left -= 1 - doreceive() - else - if(prob(35)) - doreceive() - else - telefail() - 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(href_list["setx"]) - var/a = input("Please input desired X coordinate.", name, x_co) as num - a = copytext(sanitize(a), 1, 20) - x_co = a - x_co = text2num(x_co) - return - if(href_list["sety"]) - var/b = input("Please input desired Y coordinate.", name, y_co) as num - b = copytext(sanitize(b), 1, 20) - y_co = b - y_co = text2num(y_co) - return + 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 >= index) + power = power_options[index] + if(href_list["setz"]) - var/c = input("Please input desired Z coordinate.", name, z_co) as num - c = copytext(sanitize(c), 1, 20) - z_co = c - z_co = text2num(z_co) - return + 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["send"]) - telesend() - return + sending = 1 + teleport(usr) + if(href_list["receive"]) - telereceive() - return + sending = 0 + teleport(usr) + if(href_list["recal"]) - teles_left = rand(9,12) - x_off = rand(-10,10) - y_off = rand(-10,10) - for(var/obj/machinery/telepad/E in machines) - var/L = get_turf(E) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, L) - s.start() - usr << "\blue Calibration successful." - return \ No newline at end of file + 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 diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi index 1f3344f2e489b37a9af7af606c3fbc67b99937b7..4e8251beac3fdf48bf7e083c7ec4e82cea642f1c 100644 GIT binary patch delta 1817 zcmV+!2j=*o5c?327Y@J(0{{R3WdfWv0003su_Y$~C&0kKK5zeKng5y0|5K^|0A~M~ zp4vhH0004WQchCn$AirQryFx>G zq(upTZ;K{Cgpj%HPG%-MO{1a-{&dCjbBj8A(JzRCt{2nu%81Mihp%v~^ok#A1oiCatoOvV-d-A*oYp z473dtT3R<72xu2w5lhvm_(^v)o@ZqXSnM#`R)eb9*<9X(A3x z{wWYkFCzvD4j!;9tpn4<9AG09l)6$(S0a-E6EScDqhs-pIs%h#ngWVRbYl~16a)Hu zjIIJR@pa8uhG}WmF%M5S1g4lqxdb-?R{Ad{Y?ok0Q%Dh^e;M25W%9Mg z}kw*J*fW&)KOfqxC{=~h&KE|LTq6RAj_O6s>=?+)k|sCPW~wyOR#lPv@te|}e` z-*cS%pgn;7z5{29`VW!zvHoQ`6mZ$*EqP0ie0KE26^VWq(I4pa@0T7uMCxPx%XC%( zPI(Df<$(@Yr1}h^&m#I9qGSC_bzXvBgxThZpA`BuqTfSw3(>Lu<+>4EV>rQ=>!uo* zY~5hjJa2iKi_6QN$G%IYi$co`e<8+7Ou8O-vMjw`7MS4;XfzoOwE?cH#I1UZ>#gDpG~0}((m=EQnCS|2t1jy6e+=kzs}`1@ z*XpAfXg_H`&R}5V{QU3>4*vR5Uw^a_c#>%Zg8aMUJ?aSg`HG{_!9al8KvTB}z(9c9 z0FT=Ck^DU9>i2v|eOSZ|cnUQ%i&zUR;ubuGTEmNYkbn29z9v7vgXmD-Vfs!=9~i)% zLYM*RQz*>8KlPq@3;qHef88Bre%_bn?;VNm4D$Dpf##1L_^784WGGPN@Inc(vzT-*No(AK+ks_20>0AgDiNK;+;3h;)7)W=_?Q z!_MP+kh+gG03UbQfS5v!j8mvJWFT999?#zk0}Zi=$2HIri#Tl{f1ZE$k^KBvdgLJE zFQZ!_LrRo?hnb$v=OeH~Hu9^QQFa z@6sC}2!bHW49lr#l8cki?$5h?FDtttMF%n_yWMW5)9H4*B{cx?XEvbC&*!c0cK5ix zr#67L-|n<~%Iq-ce?5>p8odJzAbL-!?{-D@S!qD%%J%U9S^qkNnBHS#GSJf-X!r0D zPzJ#6a1R-QUgi-{-v9&4&*!a!fdI7ur2T?{MZ5=3p*_tao@_>V3QaaJg@XKli46q# z|MD6r`xM#}i+Hc321@_SC_xYeK@bE%5ClOKNTKfsu0u!ifA59sy&m#@0Lj1SuJ?MG z>IeDvOabce5OxQ%j!?nx2eRt~K@bE%5ClOG1VIo4K@chS_xBGD4i1r0h3EH``r$9X zG7b)ZJLH?9K9*g^)8|-rTl?SVn(Xt7qvPLCPX9PQKK}FU_^-2Lxr4&r4={gngD;N$ z7Mz{2?MT(Yf26*l>G%IhpfE7O`TwJrj90Jv{nxMi{l2n|$>#9o8{_Ty`P-u77@wmz z#>KmL7e$9LJ}?3o=jSCh0F-+KfD54L7zlzO2!bF8f*=TjAkw^lUvvc7IQ{T%sU4ht zIJqpfgVU3f%S$p)Af=x|#(yPW#NeRh@e>3=5ClPd7gYQYcJIJT;N>|200000NkvXX Hu0mjfa`k|> delta 1762 zcmV<81|9kP5TFo{7Y?8Z0{{R3ZT6FI0003au_Y$~f4$V|2mk;80d!JMQvg8b*k%9# z0Ks}xSad{Xb7OL8aCB*JZU6vyoP|-#3WG2ZJSSff^s1$`_Sj2Niii3S(QGyNNJv7Z zf8WFwRI12ac88f^C-KQGy=OT|9vOat(p>c9O5(#2qk%J1+vOZ#R0FSS^If!|2JGlb z%EAI@f9GMuxYCw7Vf0kA12b%!5uc=aGJf#~jDv%}*g?&T000Hv zNklB)YYUHH!iLJw{i7nfO{TmSI|&baZEJYK{SkOUFT{>X+*UIeyE5HWv}I7fAR%J_tAS8RC^e@p0}3q9?C-*wZrzp!oT5SXI=m!iHrK6U@I z>4s6MR^);RxUy17oW}!Xfq!LH44HxOxl>uKMCEVPzvxq|Gi*mU0HCkgsVh-De6!bW z={gP1>zVtW&GYn^?u)3hGcW?v2K zCv~iUt!~%cDwAEW=50A!aCBLbs#~)|eKpe8B7G&M-+|+%dl&TeukY6Gx|^WfiRo5U zei1mlKIj&x_dWNXs{SgIPXrx* z{y?Qabeu<^J%;^}180i*PmuPp{$)B8aM|WSO)O zbXEdRc?nqMfeu%s`Wm9IBl-rSWBp5YUV>kQ+2)9!6#6QnKSXp3(XsyJx)EGsIKh|e zrW#mo-C)-|uU_Y3z3zGJyHvU;RA&f(F;-&P^|+I|^mZeB_%)h^k z<=;=@`FWq~uO|8V7c4*TPjn~Le{#IqE3Th7e)c?T{aXm=g#~Of-J8eKrp;pEzbUbAsTYetT-wOjRv54n2a4Z&a+CV&i|L!CC`MLDS zLB?N3k3y!DDE|&KLz|yRbw{e_&LsctBl-FH^!yFvoWIXMe&d$%_j!|l{yuN=&)?@w z>C@k(H$V^sL6jMmQ_&TWe!rv!ApXn-wE6kG^jKBpuPbHmY>gC2Ll0W14#P?1B-Y7PoaTk5id70JcX7Um_kARzr+TD z{C{~3lzj>f#3CM))IjNf86^mUAP9mW2!bGp0x9(Uz#?=c|6aI%J{%(N2ax=G?)q?; zseX`u&lI5k4qj)M6ejvL}5ClOG1VIo4K@bE%5CoCp^z`)X?CcyVRd{}1sh|Jy zE930^w{yNJ>SNhuJbjL3x3&L$uE{>Xz8L-f$De-oFy6i$kKer;kH^Y3mYef8?~M;vS09RwV}35) z8`mE{UKbt4{J;oYUtN{h08s7`0Iq?eV;~5EAP6Ghe`3$G9$@}B!2kdN07*qoM6N<$ Ef*1y3Gynhq From 9015b815b3e2455338aa46ce690aaabc09736d91 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:18:38 +1030 Subject: [PATCH 11/16] Uncommented the original Heist objective code, removed one-of-each testing code. --- code/game/gamemodes/heist/heist.dm | 38 +++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index e98d128559f..a3f44a52020 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -139,10 +139,8 @@ var/global/vox_kills = 0 //Used to check the Inviolate. /datum/game_mode/heist/proc/forge_vox_objectives() - - //Commented out for testing. - /* var/i = 1 - var/max_objectives = pick(2,2,2,3,3) + var/i = 1 + var/max_objectives = pick(2,2,2,2,3,3,3,4) var/list/objs = list() while(i<= max_objectives) var/list/goals = list("kidnap","loot","salvage") @@ -163,13 +161,7 @@ var/global/vox_kills = 0 //Used to check the Inviolate. //-All- vox raids have these two objectives. Failing them loses the game. objs += new /datum/objective/heist/inviolate_crew - objs += new /datum/objective/heist/inviolate_death */ - - raid_objectives += new /datum/objective/heist/kidnap - raid_objectives += new /datum/objective/heist/loot - raid_objectives += new /datum/objective/heist/salvage - raid_objectives += new /datum/objective/heist/inviolate_crew - raid_objectives += new /datum/objective/heist/inviolate_death + objs += new /datum/objective/heist/inviolate_death for(var/datum/objective/heist/O in raid_objectives) O.choose_target() @@ -181,6 +173,7 @@ var/global/vox_kills = 0 //Used to check the Inviolate. raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder, trade or both." raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious." raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!" + raider.current << "\red IF YOU HAVE NOT PLAYED A VOX BEFORE, REVIEW THIS THREAD: http://baystation12.net/forums/viewtopic.php?f=6&t=8657." var/obj_count = 1 for(var/datum/objective/objective in raider.objectives) raider.current << "Objective #[obj_count]: [objective.explanation_text]" @@ -252,6 +245,29 @@ var/global/vox_kills = 0 //Used to check the Inviolate. feedback_add_details("traitor_objective","[objective.type]|FAIL") count++ + var/text = "The vox raiders were:" + + for(var/datum/mind/vox in raiders) + text += "
[vox.key] was [vox.name] (" + if(check_return) + var/obj/stack = raiders[vox] + if(get_area(stack) != locate(/area/shuttle/vox/station)) + text += "left behind)" + continue + if(vox.current) + if(vox.current.stat == DEAD) + text += "died" + else + text += "survived" + if(vox.current.real_name != vox.name) + text += " as [vox.current.real_name]" + else + text += "body destroyed" + text += ")" + + world << text + return 1 + ..() datum/game_mode/proc/auto_declare_completion_heist() From 542104478f1cdf59b9453a2e1b974a16ed2cd01a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:18:55 +1030 Subject: [PATCH 12/16] Commented out the Sec-healing component of sprinkles. --- code/modules/reagents/Chemistry-Reagents.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index bf29dc863ff..e24a0cd03e7 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2177,12 +2177,13 @@ datum on_mob_life(var/mob/living/M as mob) M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) + /*if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) if(!M) M = holder.my_atom M.heal_organ_damage(1,1) M.nutrition += nutriment_factor ..() return + */ ..() /* //removed because of meta bullshit. this is why we can't have nice things. From 32b2009c25743e8ce590549a7eea506b667fe6e8 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:26:55 +1030 Subject: [PATCH 13/16] Diona will take five times as much damage from plant-B-gone as previously. --- code/modules/reagents/Chemistry-Reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index e24a0cd03e7..e512da7d599 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1681,7 +1681,7 @@ datum var/mob/living/carbon/human/H = M if(H.dna) if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage - H.adjustToxLoss(10) + H.adjustToxLoss(50) toxin/stoxin name = "Sleep Toxin" From 249cd0d0699eb1423a5e8614522f5bd366337ec9 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:32:00 +1030 Subject: [PATCH 14/16] Increased REQUIRE_LIGHT min level to 5, removed burn damage from healing from RAD_ABSORB. --- code/modules/mob/living/carbon/human/life.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d9354dccd63..957ed014d4e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -242,7 +242,7 @@ var/rads = radiation/25 radiation -= rads nutrition += rads - heal_overall_damage(rads,rads) + adjustBruteLoss(-(rads)) adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) updatehealth() @@ -887,8 +887,8 @@ if(nutrition > 500) nutrition = 500 - if(light_amount > 2) //if there's enough light, heal - heal_overall_damage(1,1) + if(light_amount > 5) //if there's enough light, heal + adjustBruteLoss(-1) adjustToxLoss(-1) adjustOxyLoss(-1) if(dna && dna.mutantrace == "shadow") From 71416e543e09d46845cdc5f0f76be7b0dd4ecf6b Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:33:39 +1030 Subject: [PATCH 15/16] Changed diona evolution to use nutrition rather than nutriment. --- code/modules/mob/living/carbon/monkey/diona.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm index 1d80763fdc8..442d33e2ace 100644 --- a/code/modules/mob/living/carbon/monkey/diona.dm +++ b/code/modules/mob/living/carbon/monkey/diona.dm @@ -68,7 +68,7 @@ src << "You are not yet ready for your growth..." return - if(reagents.get_reagent_amount("nutriment") < 5) + if(nutrition < 400) src << "You have not yet consumed enough to grow..." return From 222a544d5dcc96e29ab22e4e7742dd1dbf3552c3 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 20 Nov 2013 18:47:37 +1030 Subject: [PATCH 16/16] Raider state display compile fix. --- code/game/gamemodes/heist/heist.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index a3f44a52020..4dfff4fc4cf 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -245,16 +245,15 @@ var/global/vox_kills = 0 //Used to check the Inviolate. feedback_add_details("traitor_objective","[objective.type]|FAIL") count++ - var/text = "The vox raiders were:" + var/text = "The vox raiders were:" for(var/datum/mind/vox in raiders) text += "
[vox.key] was [vox.name] (" - if(check_return) - var/obj/stack = raiders[vox] - if(get_area(stack) != locate(/area/shuttle/vox/station)) - text += "left behind)" - continue - if(vox.current) + var/obj/stack = raiders[vox] + if(get_area(stack) != locate(/area/shuttle/vox/station)) + text += "left behind)" + continue + else if(vox.current) if(vox.current.stat == DEAD) text += "died" else