From 46813b285ed702c3050359de5abc82cda831f51f Mon Sep 17 00:00:00 2001 From: Markolie Date: Sat, 7 Jan 2017 23:43:32 +0100 Subject: [PATCH] Adds the Voice of God, fix up font-size CSS --- code/__HELPERS/game.dm | 4 +- code/__HELPERS/text.dm | 14 + code/game/machinery/portable_turret.dm | 5 +- code/modules/mob/living/carbon/human/emote.dm | 16 +- code/modules/mob/living/carbon/human/say.dm | 4 +- code/modules/mob/living/say.dm | 31 +- .../hostile/megafauna/colossus.dm | 2 +- .../research/designs/autolathe_designs.dm | 26 +- code/modules/surgery/organs/vocal_cords.dm | 453 ++++++++++++++++++ goon/browserassets/css/browserOutput.css | 16 +- icons/obj/surgery.dmi | Bin 32996 -> 33676 bytes paradise.dme | 1 + 12 files changed, 537 insertions(+), 35 deletions(-) create mode 100644 code/modules/surgery/organs/vocal_cords.dm diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 883856cc9b7..753a953b8f9 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -151,7 +151,7 @@ // The old system would loop through lists for a total of 5000 per function call, in an empty server. // This new system will loop at around 1000 in an empty server. -/proc/get_mobs_in_view(var/R, var/atom/source) +/proc/get_mobs_in_view(var/R, var/atom/source, var/include_clientless = FALSE) // Returns a list of mobs in range of R from source. Used in radio and say code. var/turf/T = get_turf(source) @@ -165,7 +165,7 @@ for(var/atom/A in range) if(ismob(A)) var/mob/M = A - if(M.client) + if(M.client || include_clientless) hear += M //log_to_dd("Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])") else if(istype(A, /obj/item/device/radio)) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index d5b75eb4c7c..4c6abbd7d0b 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -431,3 +431,17 @@ proc/checkhtml(var/t) text = copytext(text, 1, index) + repl_chars[char] + copytext(text, index+keylength) index = findtext(text, char) return text + +//Checks if any of a given list of needles is in the haystack +/proc/text_in_list(haystack, list/needle_list, start=1, end=0) + for(var/needle in needle_list) + if(findtext(haystack, needle, start, end)) + return 1 + return 0 + +//Like above, but case sensitive +/proc/text_in_list_case(haystack, list/needle_list, start=1, end=0) + for(var/needle in needle_list) + if(findtextEx(haystack, needle, start, end)) + return 1 + return 0 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index d5b789e7523..28b3cfe7132 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -449,7 +449,7 @@ var/list/turret_icons return health -= force - if(force > 5 && prob(45)) + if(force > 5 && prob(45) && spark_system) spark_system.start() if(health <= 0) die() //the death process :( @@ -504,7 +504,8 @@ var/list/turret_icons /obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0 health = 0 stat |= BROKEN //enables the BROKEN bit - spark_system.start() //creates some sparks because they look cool + if(spark_system) + spark_system.start() //creates some sparks because they look cool update_icon() /obj/machinery/porta_turret/process() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 558a6f8e9de..4876aa60b7b 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -221,6 +221,16 @@ if(!src.restrained()) message = "[src] is strumming the air and headbanging like a safari chimp." m_type = 1 + + if("dance") + if(!src.restrained()) + message = "[src] dances around happily." + m_type = 1 + + if("jump") + if(!src.restrained()) + message = "[src] jumps!" + m_type = 1 if("blink", "blinks") message = "[src] blinks." @@ -841,9 +851,9 @@ M.reagents.add_reagent("jenkem", 1) if("help") - var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \ - + " deathgasp(s), drool(s), eyebrow,fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), handshake-mob, hug(s)-(none)/mob," \ - + " glare(s)-(none)/mob, grin(s), johnny, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \ + var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dance, dap(s)(none)/mob," \ + + " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \ + + " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \ + " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \ + " wag(s), wave(s), whimper(s), wink(s), yawn(s)" if(species.name == "Machine") diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 26ca4af83e8..7384ccc6796 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,10 +1,10 @@ -/mob/living/carbon/human/say(var/message) +/mob/living/carbon/human/say(var/message, var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) var/alt_name = "" if(name != GetVoice()) alt_name = " (as [get_id_name("Unknown")])" - ..(message, alt_name = alt_name) //ohgod we should really be passing a datum here. + ..(message, alt_name = alt_name, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here. /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index d5a1580ded9..44db25814c9 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -14,6 +14,7 @@ var/list/department_radio_keys = list( ":u" = "Supply", "#u" = "Supply", ".u" = "Supply", ":z" = "Service", "#z" = "Service", ".z" = "Service", ":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private", + ":x" = "cords", "#x" = "cords", ".x" = "cords", ":R" = "right ear", "#R" = "right ear", ".R" = "right ear", ":L" = "left ear", "#L" = "left ear", ".L" = "left ear", @@ -30,7 +31,8 @@ var/list/department_radio_keys = list( ":Z" = "Service", "#Z" = "Service", ".Z" = "Service", ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private", ":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops", - ":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam" + ":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam", + ":X" = "cords", "#X" = "cords", ".X" = "cords" ) @@ -106,13 +108,14 @@ proc/get_radio_key_from_channel(var/channel) return returns -/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="") +/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name = "", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") return - message = trim_strip_html_properly(message) + if(sanitize) + message = trim_strip_html_properly(message) if(stat) if(stat == DEAD) @@ -146,6 +149,15 @@ proc/get_radio_key_from_channel(var/channel) if(speaking && (speaking.flags & HIVEMIND)) speaking.broadcast(src,trim(message)) return 1 + + if(message_mode == "cords") + if(iscarbon(src)) + var/mob/living/carbon/C = src + var/obj/item/organ/internal/vocal_cords/V = C.get_int_organ(/obj/item/organ/internal/vocal_cords) + if(V && V.can_speak_with()) + C.say(V.handle_speech(message), sanitize = FALSE, ignore_speech_problems = TRUE, ignore_atmospherics = TRUE) + V.speak_with(message) //words come before actions + return 1 verb = say_quote(message, speaking) @@ -162,7 +174,7 @@ proc/get_radio_key_from_channel(var/channel) message = handle_autohiss(message, speaking) - if(speaking && !(speaking.flags & NO_STUTTER)) + if(!ignore_speech_problems && (speaking && !(speaking.flags & NO_STUTTER))) var/list/handle_s = handle_speech_problems(message, verb) message = handle_s[1] verb = handle_s[2] @@ -217,12 +229,13 @@ proc/get_radio_key_from_channel(var/channel) //make sure the air can transmit speech - speaker's side var/datum/gas_mixture/environment = T.return_air() var/pressure = environment ? environment.return_pressure() : 0 - if(pressure < SOUND_MINIMUM_PRESSURE) - message_range = 1 + if(!ignore_atmospherics) + if(pressure < SOUND_MINIMUM_PRESSURE) + message_range = 1 - if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet - italics = 1 - sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact + if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet + italics = 1 + sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact var/list/hear = hear(message_range, T) var/list/hearturfs = list() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 132655bc923..b0a81e4444c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -46,7 +46,7 @@ Difficulty: Very Hard del_on_death = 1 medal_type = MEDAL_PREFIX score_type = COLOSSUS_SCORE - loot = list(/obj/machinery/anomalous_crystal/random) + loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/internal/vocal_cords/colossus) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) deathmessage = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/misc/demon_dies.ogg' diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index f34d9797124..5ac16d095e5 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -162,6 +162,14 @@ materials = list(MAT_METAL = 50, MAT_GLASS = 50) build_path = /obj/item/weapon/firealarm_electronics category = list("initial", "Electronics") + +/datum/design/earmuffs + name = "Earmuffs" + id = "earmuffs" + build_type = AUTOLATHE + materials = list(MAT_METAL = 500, MAT_GLASS = 500) + build_path = /obj/item/clothing/ears/earmuffs + category = list("initial", "Miscellaneous") /datum/design/igniter name = "Igniter" @@ -188,7 +196,7 @@ category = list("initial", "Medical") /datum/design/kitchen_knife - name = "Kitchen knife" + name = "Kitchen Knife" id = "kitchen_knife" build_type = AUTOLATHE materials = list(MAT_METAL = 12000) @@ -196,7 +204,7 @@ category = list("initial","Miscellaneous") /datum/design/minihoe - name = "Mini hoe" + name = "Mini Hoe" id = "mini_hoe" build_type = AUTOLATHE materials = list(MAT_METAL = 50) @@ -204,7 +212,7 @@ category = list("initial","Miscellaneous") /datum/design/plant_analyzer - name = "Plant analyzer" + name = "Plant Analyzer" id = "plant_analyzer" build_type = AUTOLATHE materials = list(MAT_METAL = 30, MAT_GLASS = 20) @@ -324,12 +332,12 @@ category = list("initial", "Miscellaneous") /datum/design/foambox - name = "Box of Foam Force darts" - id = "foamforce" - build_type = AUTOLATHE - materials = list(MAT_METAL = 2000) - build_path = /obj/item/ammo_box/foambox - category = list("initial", "Miscellaneous") + name = "Box of Foam Force darts" + id = "foamforce" + build_type = AUTOLATHE + materials = list(MAT_METAL = 2000) + build_path = /obj/item/ammo_box/foambox + category = list("initial", "Miscellaneous") /datum/design/canvas/twentythreeXtwentythree name = "23px by 23px Canvas" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm new file mode 100644 index 00000000000..99a152da957 --- /dev/null +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -0,0 +1,453 @@ +var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") +var/static/regex/weaken_words = regex("drop|fall|trip") +var/static/regex/sleep_words = regex("sleep|slumber") +var/static/regex/vomit_words = regex("vomit|throw up") +var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush") +var/static/regex/hallucinate_words = regex("see the truth|hallucinate") +var/static/regex/wakeup_words = regex("wake up|awaken") +var/static/regex/heal_words = regex("live|heal|survive|mend|heroes never die") +var/static/regex/hurt_words = regex("die|suffer") +var/static/regex/bleed_words = regex("bleed") +var/static/regex/burn_words = regex("burn|ignite") +var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah") +var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify") +var/static/regex/saymyname_words = regex("say my name") +var/static/regex/knockknock_words = regex("knock knock") +var/static/regex/statelaws_words = regex("state laws|state your laws") +var/static/regex/move_words = regex("move") +var/static/regex/walk_words = regex("walk|slow down") +var/static/regex/run_words = regex("run") +var/static/regex/helpintent_words = regex("help") +var/static/regex/disarmintent_words = regex("disarm") +var/static/regex/grabintent_words = regex("grab") +var/static/regex/harmintent_words = regex("harm|fight") +var/static/regex/throwmode_words = regex("throw|catch") +var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault") +var/static/regex/rest_words = regex("rest") +var/static/regex/getup_words = regex("get up") +var/static/regex/sit_words = regex("sit") +var/static/regex/stand_words = regex("stand") +var/static/regex/dance_words = regex("dance") +var/static/regex/jump_words = regex("jump") +var/static/regex/salute_words = regex("salute") +var/static/regex/deathgasp_words = regex("play dead") +var/static/regex/clap_words = regex("clap|applaud") +var/static/regex/honk_words = regex("ho+nk") //hooooooonk +var/static/regex/multispin_words = regex("like a record baby") + +/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel + name = "vocal cords" + icon_state = "appendix" + zone = "mouth" + slot = "vocal_cords" + parent_organ = "mouth" + var/spans = null + +/obj/item/organ/internal/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords + return TRUE + +/obj/item/organ/internal/vocal_cords/proc/speak_with(message) //do what the organ does + return + +/obj/item/organ/internal/vocal_cords/proc/handle_speech(message) //change the message + return message + +//Colossus drop, forces the listeners to obey certain commands +/obj/item/organ/internal/vocal_cords/colossus + name = "divine vocal cords" + desc = "They carry the voice of an ancient god." + icon_state = "voice_of_god" + actions_types = list(/datum/action/item_action/organ_action/colossus) + var/next_command = 0 + var/cooldown_stun = 1200 + var/cooldown_damage = 600 + var/cooldown_meme = 300 + var/cooldown_none = 150 + var/base_multiplier = 1 + spans = "colossus yell" + +/datum/action/item_action/organ_action/colossus + name = "Voice of God" + var/obj/item/organ/internal/vocal_cords/colossus/cords = null + +/datum/action/item_action/organ_action/colossus/New() + ..() + cords = target + +/datum/action/item_action/organ_action/colossus/IsAvailable() + if(world.time < cords.next_command) + return FALSE + if(!owner) + return FALSE + if(!owner.can_speak()) + return FALSE + if(check_flags & AB_CHECK_CONSCIOUS) + if(owner.stat) + return FALSE + return TRUE + +/datum/action/item_action/organ_action/colossus/Trigger() + . = ..() + if(!IsAvailable()) + if(world.time < cords.next_command) + to_chat(owner, "You must wait [(cords.next_command - world.time)/10] seconds before Speaking again.") + return + var/command = input(owner, "Speak with the Voice of God", "Command") + if(!command) + return + owner.say(".x[command]") + +/obj/item/organ/internal/vocal_cords/colossus/can_speak_with() + if(world.time < next_command) + to_chat(owner, "You must wait [(next_command - world.time)/10] seconds before Speaking again.") + return FALSE + if(!owner) + return FALSE + if(!owner.can_speak()) + to_chat(owner, "You are unable to speak!") + return FALSE + if(owner.stat) + return FALSE + return TRUE + +/obj/item/organ/internal/vocal_cords/colossus/handle_speech(message) + spans = "colossus yell" //reset spans, just in case someone gets deculted or the cords change owner + if(iscultist(owner)) + spans += " narsiesmall" + return "[uppertext(message)]" + +/obj/item/organ/internal/vocal_cords/colossus/speak_with(message) + var/log_message = uppertext(message) + message = lowertext(message) + playsound(get_turf(owner), 'sound/magic/invoke_general.ogg', 300, 1, 5) + + var/mob/living/list/listeners = list() + for(var/mob/living/L in get_mobs_in_view(8, owner, TRUE)) + if(!L.ear_deaf && !L.null_rod_check() && L != owner && L.stat != DEAD) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + continue + listeners += L + + if(!listeners.len) + next_command = world.time + cooldown_none + return + + var/power_multiplier = base_multiplier + + if(owner.mind) + //Chaplains are very good at speaking with the voice of god + if(owner.mind.assigned_role == "Chaplain") + power_multiplier *= 2 + //Command staff has authority + if(owner.mind.assigned_role in command_positions) + power_multiplier *= 1.4 + //Why are you speaking + if(owner.mind.assigned_role == "Mime") + power_multiplier *= 0.5 + + //Cultists are closer to their gods and are more powerful, but they'll give themselves away + if(iscultist(owner)) + power_multiplier *= 2 + + //Try to check if the speaker specified a name or a job to focus on + var/list/specific_listeners = list() + var/found_string = null + + for(var/V in listeners) + var/mob/living/L = V + /*if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename)) + var/start = findtext(message, L.mind.devilinfo.truename) + listeners = list(L) //let's be honest you're never going to find two devils with the same name + power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up + //Cut out the name so it doesn't trigger commands + message = copytext(message, 0, start)+copytext(message, start + length(L.mind.devilinfo.truename), length(message) + 1) + break*/ + if(findtext(message, L.real_name) == 1) + specific_listeners += L //focus on those with the specified name + //Cut out the name so it doesn't trigger commands + found_string = L.real_name + + else if(L.mind && findtext(message, L.mind.assigned_role) == 1) + specific_listeners += L //focus on those with the specified job + //Cut out the job so it doesn't trigger commands + found_string = L.mind.assigned_role + + if(specific_listeners.len) + listeners = specific_listeners + power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on + message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) + + //STUN + if(findtext(message, stun_words)) + for(var/V in listeners) + var/mob/living/L = V + L.Stun(3 * power_multiplier) + next_command = world.time + cooldown_stun + + //WEAKEN + else if(findtext(message, weaken_words)) + for(var/V in listeners) + var/mob/living/L = V + L.Weaken(3 * power_multiplier) + next_command = world.time + cooldown_stun + + //SLEEP + else if((findtext(message, sleep_words))) + for(var/V in listeners) + var/mob/living/L = V + L.Sleeping(2 * power_multiplier) + next_command = world.time + cooldown_stun + + //VOMIT + else if((findtext(message, vomit_words))) + for(var/mob/living/carbon/C in listeners) + C.vomit(10 * power_multiplier) + next_command = world.time + cooldown_stun + + //SILENCE + else if((findtext(message, silence_words))) + for(var/mob/living/carbon/C in listeners) + if(owner.mind && (owner.mind.assigned_role == "Librarian" || owner.mind.assigned_role == "Mime")) + power_multiplier *= 3 + C.silent += (10 * power_multiplier) + next_command = world.time + cooldown_stun + + //HALLUCINATE + else if((findtext(message, hallucinate_words))) + for(var/V in listeners) + var/mob/living/L = V + new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0) + next_command = world.time + cooldown_meme + + //WAKE UP + else if((findtext(message, wakeup_words))) + for(var/V in listeners) + var/mob/living/L = V + L.SetSleeping(0) + next_command = world.time + cooldown_damage + + //HEAL + else if((findtext(message, heal_words))) + for(var/V in listeners) + var/mob/living/L = V + L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, 0) + next_command = world.time + cooldown_damage + + //BRUTE DAMAGE + else if((findtext(message, hurt_words))) + for(var/V in listeners) + var/mob/living/L = V + L.apply_damage(15 * power_multiplier, def_zone = "chest") + next_command = world.time + cooldown_damage + + //BLEED + else if((findtext(message, bleed_words))) + for(var/mob/living/carbon/human/H in listeners) + H.drip(100 * power_multiplier) + next_command = world.time + cooldown_damage + + //FIRE + else if((findtext(message, burn_words))) + for(var/V in listeners) + var/mob/living/L = V + L.adjust_fire_stacks(1 * power_multiplier) + L.IgniteMob() + next_command = world.time + cooldown_damage + + //REPULSE + else if((findtext(message, repulse_words))) + for(var/V in listeners) + var/mob/living/L = V + var/throwtarget = get_edge_target_turf(owner, get_dir(owner, get_step_away(L, owner))) + L.throw_at(throwtarget, 3 * power_multiplier, 1) + next_command = world.time + cooldown_damage + + //WHO ARE YOU? + else if((findtext(message, whoareyou_words))) + for(var/V in listeners) + var/mob/living/L = V + /*if(L.mind && L.mind.devilinfo) + L.say("[L.mind.devilinfo.truename]") + else*/ + L.say("[L.real_name]") + next_command = world.time + cooldown_meme + + //SAY MY NAME + else if((findtext(message, saymyname_words))) + for(var/V in listeners) + var/mob/living/L = V + L.say("[owner.name]!") //"Unknown!" + next_command = world.time + cooldown_meme + + //KNOCK KNOCK + else if((findtext(message, knockknock_words))) + for(var/V in listeners) + var/mob/living/L = V + L.say("Who's there?") + next_command = world.time + cooldown_meme + + //STATE LAWS + else if((findtext(message, statelaws_words))) + for(var/mob/living/silicon/S in listeners) + S.statelaws(S.laws) + next_command = world.time + cooldown_stun + + //MOVE + else if((findtext(message, move_words))) + for(var/V in listeners) + var/mob/living/L = V + step(L, pick(cardinal)) + next_command = world.time + cooldown_meme + + //WALK + else if((findtext(message, walk_words))) + for(var/V in listeners) + var/mob/living/L = V + if(L.m_intent != "walk") + L.m_intent = "walk" + L.hud_used.move_intent.icon_state = "walking" + next_command = world.time + cooldown_meme + + //RUN + else if((findtext(message, run_words))) + for(var/V in listeners) + var/mob/living/L = V + if(L.m_intent != "run") + L.m_intent = "run" + L.hud_used.move_intent.icon_state = "running" + next_command = world.time + cooldown_meme + + //HELP INTENT + else if((findtext(message, helpintent_words))) + for(var/mob/living/carbon/human/H in listeners) + H.a_intent_change(I_HELP) + next_command = world.time + cooldown_meme + + //DISARM INTENT + else if((findtext(message, disarmintent_words))) + for(var/mob/living/carbon/human/H in listeners) + H.a_intent_change(I_DISARM) + next_command = world.time + cooldown_meme + + //GRAB INTENT + else if((findtext(message, grabintent_words))) + for(var/mob/living/carbon/human/H in listeners) + H.a_intent_change(I_GRAB) + next_command = world.time + cooldown_meme + + //HARM INTENT + else if((findtext(message, harmintent_words))) + for(var/mob/living/carbon/human/H in listeners) + H.a_intent_change(I_HARM) + next_command = world.time + cooldown_meme + + //THROW/CATCH + else if((findtext(message, throwmode_words))) + for(var/mob/living/carbon/C in listeners) + C.throw_mode_on() + next_command = world.time + cooldown_meme + + //FLIP + else if((findtext(message, flip_words))) + for(var/V in listeners) + var/mob/living/L = V + L.emote("flip") + next_command = world.time + cooldown_meme + + //REST + else if((findtext(message, rest_words))) + for(var/V in listeners) + var/mob/living/L = V + if(!L.resting) + L.lay_down() + next_command = world.time + cooldown_meme + + //GET UP + else if((findtext(message, getup_words))) + for(var/V in listeners) + var/mob/living/L = V + if(L.resting) + L.lay_down() //aka get up + L.SetStunned(0) + L.SetWeakened(0) + L.SetParalysis(0) //i said get up i don't care if you're being tazed + next_command = world.time + cooldown_damage + + //SIT + else if((findtext(message, sit_words))) + for(var/V in listeners) + var/mob/living/L = V + for(var/obj/structure/stool/bed/chair/chair in get_turf(L)) + chair.buckle_mob(L) + break + next_command = world.time + cooldown_meme + + //STAND UP + else if((findtext(message, stand_words))) + for(var/V in listeners) + var/mob/living/L = V + if(L.buckled && istype(L.buckled, /obj/structure/stool/bed/chair)) + L.buckled.unbuckle_mob(L) + next_command = world.time + cooldown_meme + + //DANCE + else if((findtext(message, dance_words))) + for(var/V in listeners) + var/mob/living/L = V + L.emote("dance") + next_command = world.time + cooldown_meme + + //JUMP + else if((findtext(message, jump_words))) + for(var/V in listeners) + var/mob/living/L = V + L.say("HOW HIGH?!!") + L.emote("jump") + next_command = world.time + cooldown_meme + + //SALUTE + else if((findtext(message, salute_words))) + for(var/V in listeners) + var/mob/living/L = V + L.emote("salute") + next_command = world.time + cooldown_meme + + //PLAY DEAD + else if((findtext(message, deathgasp_words))) + for(var/V in listeners) + var/mob/living/L = V + L.emote("deathgasp") + next_command = world.time + cooldown_meme + + //PLEASE CLAP + else if((findtext(message, clap_words))) + for(var/V in listeners) + var/mob/living/L = V + L.emote("clap") + next_command = world.time + cooldown_meme + + //HONK + else if((findtext(message, honk_words))) + spawn(25) + playsound(get_turf(owner), "sound/items/bikehorn.ogg", 300, 1) + if(owner.mind && owner.mind.assigned_role == "Clown") + for(var/mob/living/carbon/C in listeners) + C.slip(0,7 * power_multiplier) + next_command = world.time + cooldown_stun + else + next_command = world.time + cooldown_meme + + //RIGHT ROUND + else if((findtext(message, multispin_words))) + for(var/V in listeners) + var/mob/living/L = V + L.SpinAnimation(speed = 10, loops = 5) + next_command = world.time + cooldown_meme + + else + next_command = world.time + cooldown_none + + message_admins("[key_name_admin(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") \ No newline at end of file diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index d1669591f82..cce2a515d7b 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -239,6 +239,7 @@ em {font-style: normal; font-weight: bold;} .playerreply {color: #8800bb; font-weight: bold;} .name { font-weight: bold;} .say {} +.yell { font-weight: bold;} .siliconsay {font-family: 'Courier New', Courier, monospace;} .deadsay {color: #5c00e6;} .radio {color: #008000;} @@ -323,8 +324,9 @@ h1.alert, h2.alert {color: #000000;} .cult {color: #800080; font-weight: bold; font-style: italic;} .cultspeech {color: #7F0000; font-style: italic;} .cultitalic {color: #960000; font-style: italic;} -.cultlarge {color: #960000; font-weight: bold; font-size: 3;} -.narsie {color: #960000; font-weight: bold; font-size: 15;} +.cultlarge {color: #960000; font-weight: bold; font-size: 120%;} +.narsie {color: #960000; font-weight: bold; font-size: 300%;} +.narsiesmall {color: #960000; font-weight: bold; font-size: 200%;} .interface {color: #330033;} .big {font-size: 150%;} .reallybig {font-size: 175%;} @@ -341,10 +343,10 @@ h1.alert, h2.alert {color: #000000;} .revennotice {color: #1d2953;} .revenboldnotice {color: #1d2953; font-weight: bold;} -.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;} +.revenbignotice {color: #1d2953; font-weight: bold; font-size: 120%;} .revenminor {color: #823abb} .revenwarning {color: #760fbb; font-style: italic;} -.revendanger {color: #760fbb; font-weight: bold; font-size: 3;} +.revendanger {color: #760fbb; font-weight: bold; font-size: 120%;} /* /vg/ */ .good {color: green;} @@ -358,7 +360,7 @@ h1.alert, h2.alert {color: #000000;} "} .memo {color: #638500; text-align: center;} -.memoedit {text-align: center; font-size: 2;} +.memoedit {text-align: center; font-size: 75%;} .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} @@ -369,6 +371,6 @@ h1.alert, h2.alert {color: #000000;} .hidden {display: none; visibility: hidden;} /* MEGAFAUNA */ -.colossus {color: #7F282A; font-size: 5;} -.hierophant {color: #660099; font-weight: bold; font-size: 4;} +.colossus {color: #7F282A; font-size: 175%;} +.hierophant {color: #660099; font-weight: bold; font-size: 150%;} .hierophant_warning {color: #660099; font-weight: bold; font-style: italic;} \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 033446d49d39df2334b5a1ce1d124a0f667212b9..a5638d1db1bc044b62536b37e979c0991940801a 100644 GIT binary patch delta 14681 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 Sfc}9Jkp3VqUMi*^@P7d)@%F<2 delta 13996 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 KWVyJ$|NjNnAo;%l diff --git a/paradise.dme b/paradise.dme index d9b5b155bb0..0f96de59c40 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2068,6 +2068,7 @@ #include "code\modules\surgery\organs\parasites.dm" #include "code\modules\surgery\organs\robolimbs.dm" #include "code\modules\surgery\organs\skeleton.dm" +#include "code\modules\surgery\organs\vocal_cords.dm" #include "code\modules\surgery\organs\wound.dm" #include "code\modules\surgery\organs\subtypes\diona.dm" #include "code\modules\surgery\organs\subtypes\drask.dm"