diff --git a/code/WorkInProgress/Railgun.dm b/code/WorkInProgress/Railgun.dm index 4b35ff0a..f8b4e9bf 100644 --- a/code/WorkInProgress/Railgun.dm +++ b/code/WorkInProgress/Railgun.dm @@ -404,8 +404,6 @@ proc/line_ReturnEfficDir(Angle) ReturnedDir = WEST return ReturnedDir - - //This returns the tangent reciprocal of x, for use with East and West straights. proc/tanR(x) return (cos(x)/sin(x)) diff --git a/code/datums/randomevents/sleeperagent.dm b/code/datums/randomevents/sleeperagent.dm new file mode 100644 index 00000000..e03820c5 --- /dev/null +++ b/code/datums/randomevents/sleeperagent.dm @@ -0,0 +1,235 @@ +/datum/random_event/major/sleeper_agent + name = "Awaken Sleeper Agents" + required_elapsed_round_time = 16000 // 30m + customization_available = 1 + announce_to_admins = 0 // Doing it manually. + centcom_headline = "Enemy Signal Detected" + centcom_message = "A Syndicate radio station temporarily hijacked our communications. Be wary of individuals acting strangely." + message_delay = 50// 5s + var/num_agents = 0 + var/lock = 0 + var/admin_override = 0 + var/signal_intro = 'sound/misc/sleeper_agent_hello.ogg' + var/frequency = 1459 + var/sound_channel = 174 + var/list/numbers = list(0,0,0,0,0,0) + var/list/listeners = list() + var/list/candidates = list() + + admin_call(var/source) + if (..()) + return + + if (src.lock != 0) + message_admins("Setup of previous sleeper agents hasn't finished yet, aborting.") + return + + var/agents = input(usr, "How many sleeper agents to awaken?", "Sleeper Agents", 0) as num + if (!agents) + return + else + src.num_agents = agents + + src.admin_override = 1 + src.event_effect(source) + return + + event_effect(var/source) + if(src.lock) + return + if (src.admin_override != 1) + if (!source && (!ticker.mode || ticker.mode.latejoin_antag_compatible == 0 || late_traitors == 0)) + message_admins("Sleeper Agents are disabled in this game mode, aborting.") + return + spawn(0) + src.lock = 1 + do_event() + src.lock = 0 + + proc/do_event() + gen_numbers() + gather_listeners() + if (!listeners.len) + return + spawn (10) + broadcast_sound(signal_intro) + play_all_numbers() + broadcast_sound(signal_intro) + + if(!src.admin_override) + var/temp = rand(0,99) + if(temp < 50) + num_agents = 1 + else if (temp < 75) + num_agents = 2 + else + num_agents = 0 + if(!num_agents) + return + + sleep(300) //30s to let the signal play + var/mob/living/carbon/human/H = null + num_agents = min(num_agents,candidates.len) + for(var/i = 0, iYou have awakened as a syndicate sleeper agent!", "red") + H.mind.special_role = "hard-mode traitor" + H << browse(grabResource("html/traitorTips/traitorhardTips.html"),"window=antagTips;titlebar=1;size=600x400;can_minimize=0;can_resize=0") + if(!H.mind in ticker.mode.traitors) + ticker.mode.traitors += H.mind + if (H.mind.current) + H.mind.current.antagonist_overlay_refresh(1, 0) + var/obj_count = 1 + for(var/datum/objective/OBJ in H.mind.objectives) + boutput(H, "Objective #[obj_count]: [OBJ.explanation_text]") + obj_count++ + + proc/gen_numbers() + var/num_numbers = numbers.len + numbers.len = 0 + for(var/i = 0, i < num_numbers, i++) + numbers += rand(1,99) + + proc/gather_listeners() + listeners = list() + for (var/mob/living/carbon/human/H in world) + for (var/obj/item/device/radio/Hs in H) + if (Hs.frequency == frequency) + listeners += H + boutput(H, "A peculiar noise intrudes upon the radio frequency of your [Hs].") + if(H.client && !checktraitor(H) && H.client.preferences.be_traitor) + candidates += H + break + for (var/mob/living/silicon/robot/R in world) + if (istype(R.radio, /obj/item/device/radio)) + var/obj/item/device/radio/Hs = R.radio + if (Hs.frequency == frequency) + listeners += R + boutput(R, "A peculiar noise intrudes upon your radio frequency.") + + proc/broadcast_sound(var/soundfile) + for (var/mob/M in listeners) + if (M.client) + M << sound(soundfile, volume = 100, channel = sound_channel, wait = 1) + + + proc/play_all_numbers() + var/batch = 0 + var/period = get_vox_by_string(".") + for (var/number in numbers) + play_number(number) + broadcast_sound(period) + batch++ + if (batch >= 3) + sleep(1) + + proc/get_tens(var/n) + if (n >= 20) + var/tens = round(n / 10) + switch (tens) + if (2) + return "twenty" + if (3) + return "thirty" + if (4) + return "fourty" + if (5) + return "fifty" + if (6) + return "sixty" + if (7) + return "seventy" + if (8) + return "eighty" + if (9) + return "ninety" + return null + + proc/get_ones(var/n) + if (n == 0) + return "zero" + if (n >= 10 && n < 20) + switch (n) + if (10) + return "ten" + if (11) + return "eleven" + if (12) + return "twelve" + if (13) + return "thirteen" + if (14) + return "fourteen" + if (15) + return "fifteen" + if (16) + return "sixteen" + if (17) + return "seventeen" + if (18) + return "eighteen" + if (19) + return "nineteen" + else + var/ones = n % 10 + switch (ones) + if (1) + return "one" + if (2) + return "two" + if (3) + return "three" + if (4) + return "four" + if (5) + return "five" + if (6) + return "six" + if (7) + return "seven" + if (8) + return "eight" + if (9) + return "nine" + return null + + proc/get_vox_by_string(var/vt) + if (!vt) + return null + var/datum/VOXsound/vs = voxsounds[vt] + if (!vs) + return null + return vs.ogg + + proc/play_number(var/n) + var/stens = get_tens(n) + var/ogg = get_vox_by_string(stens) + if (ogg) + broadcast_sound(ogg) + var/sones = get_ones(n) + ogg = get_vox_by_string(sones) + if (ogg) + broadcast_sound(ogg) \ No newline at end of file diff --git a/goonstation.dme b/goonstation.dme index c49da5f1..a0fe82cf 100644 --- a/goonstation.dme +++ b/goonstation.dme @@ -489,6 +489,7 @@ var/datum/preMapLoad/preMapLoad = new #include "code\datums\randomevents\meteor_shower.dm" #include "code\datums\randomevents\radiation.dm" #include "code\datums\randomevents\random_event.dm" +#include "code\datums\randomevents\sleeperagent.dm" #include "code\datums\randomevents\solar_flare.dm" #include "code\datums\randomevents\spatial_tear.dm" #include "code\datums\randomevents\virus.dm" diff --git a/goonstation.int b/goonstation.int index 1930186e..1f173b02 100644 --- a/goonstation.int +++ b/goonstation.int @@ -1,5 +1,6 @@ // BEGIN_INTERNALS /* +MAP_ZOOM: 1.000 LAST_COMPILE_TIME: 1457219709 DIR: code code\chui\example code\datums\buildmodes code\datums\buildmodes\adventure code\datums\buildmodes\adventure\elements code\datums\chemistry code\datums\chemistry\tools code\datums\critter_mobs\health code\datums\gamemodes code\datums\genetics AUTO_FILE_DIR: OFF diff --git a/sound/misc/sleeper_agent_hello.ogg b/sound/misc/sleeper_agent_hello.ogg new file mode 100644 index 00000000..9317ea39 Binary files /dev/null and b/sound/misc/sleeper_agent_hello.ogg differ