From 46c53be6f1494fabd9ee07635964a45f4f3dad19 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 20 Feb 2015 00:50:28 +0100 Subject: [PATCH] Part 2 of saycode/language/species port from Bay. Also includes bugfixes. --- code/controllers/communications.dm | 2 +- code/controllers/configuration.dm | 2 +- code/game/area/Space Station 13 areas.dm | 1 + code/game/gamemodes/changeling/changeling.dm | 11 +- .../gamemodes/changeling/evolution_menu.dm | 17 +- .../gamemodes/changeling/powers/absorb.dm | 2 +- .../gamemodes/changeling/powers/humanform.dm | 2 +- .../gamemodes/changeling/powers/lesserform.dm | 2 +- .../gamemodes/changeling/powers/transform.dm | 2 + code/game/gamemodes/nuclear/nuclear.dm | 32 ++ code/game/gamemodes/nuclear/nuclearbomb.dm | 8 +- code/game/machinery/bots/bots.dm | 9 +- code/game/machinery/bots/cleanbot.dm | 1 - code/game/machinery/bots/ed209bot.dm | 3 +- code/game/machinery/bots/floorbot.dm | 3 +- code/game/machinery/bots/medbot.dm | 3 +- code/game/machinery/bots/mulebot.dm | 12 +- code/game/machinery/bots/secbot.dm | 4 +- .../objects/items/devices/radio/headset.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 4 +- .../objects/items/devices/transfer_valve.dm | 4 + .../objects/items/robot/robot_upgrades.dm | 4 +- code/game/objects/structures/girders.dm | 429 +++++++++--------- code/modules/awaymissions/corpse.dm | 1 - .../awaymissions/mission_code/academy.dm | 1 + .../mission_code/blackmarketpackers.dm | 2 +- .../awaymissions/mission_code/centcomAway.dm | 3 +- .../awaymissions/mission_code/challenge.dm | 5 + .../awaymissions/mission_code/clownplanet.dm | 1 + .../awaymissions/mission_code/spacebattle.dm | 1 + .../mission_code/stationCollision.dm | 3 + code/modules/client/preferences_toggles.dm | 2 +- code/modules/mining/laborcamp/laborstacker.dm | 24 +- code/modules/mob/language.dm | 23 +- .../mob/living/carbon/alien/diona/diona.dm | 34 -- .../carbon/alien/diona/diona_attacks.dm | 16 - .../living/carbon/alien/diona/diona_powers.dm | 66 --- .../mob/living/carbon/alien/diona/life.dm | 20 - .../living/carbon/alien/diona/progression.dm | 19 - .../carbon/alien/diona/say_understands.dm | 6 - .../living/carbon/alien/diona/update_icons.dm | 8 - .../living/carbon/alien/humanoid/humanoid.dm | 2 + .../mob/living/carbon/alien/larva/larva.dm | 2 + code/modules/mob/living/carbon/alien/say.dm | 93 +--- code/modules/mob/living/carbon/brain/say.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 9 +- code/modules/mob/living/carbon/human/say.dm | 10 +- .../mob/living/carbon/human/update_icons.dm | 9 +- code/modules/mob/living/carbon/metroid/say.dm | 13 + code/modules/mob/living/carbon/species.dm | 62 ++- code/modules/mob/living/say.dm | 10 +- code/modules/mob/living/silicon/ai/ai.dm | 10 +- code/modules/mob/living/silicon/pai/pai.dm | 6 +- .../mob/living/silicon/pai/software.dm | 12 +- .../mob/living/silicon/robot/drone/drone.dm | 3 + .../modules/mob/living/silicon/robot/robot.dm | 17 + .../mob/living/silicon/robot/robot_modules.dm | 18 +- code/modules/mob/living/silicon/silicon.dm | 35 ++ .../modules/mob/living/simple_animal/borer.dm | 44 -- code/modules/organs/organ_alien.dm | 229 ---------- code/modules/organs/organ_objects.dm | 270 ----------- code/modules/paperwork/faxmachine.dm | 6 +- .../research/designs/machine_designs.dm | 2 +- config/example/config.txt | 2 +- maps/cyberiad.dmm | 2 +- 65 files changed, 530 insertions(+), 1132 deletions(-) delete mode 100644 code/modules/mob/living/carbon/alien/diona/diona.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/diona_attacks.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/diona_powers.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/life.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/progression.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/say_understands.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/update_icons.dm delete mode 100644 code/modules/organs/organ_alien.dm delete mode 100644 code/modules/organs/organ_objects.dm diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 0a1593b9270..523cc7055b9 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -148,7 +148,7 @@ var/list/radiochannels = list( "Security" = SEC_FREQ, "Response Team" = ERT_FREQ, "Special Ops" = DTH_FREQ, - "Mercenary" = SYND_FREQ, + "Syndicate" = SYND_FREQ, "Supply" = SUP_FREQ, "Service" = SRV_FREQ, "AI Private" = AI_FREQ diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 160137a2e5b..062a650c9ba 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -138,7 +138,7 @@ var/list/station_levels = list(1) // Defines which Z-levels the station exists on. var/list/admin_levels= list(2) // Defines which Z-levels which are for admin functionality, for example including such areas as Central Command and the Syndicate Shuttle var/list/contact_levels = list(1, 5) // Defines which Z-levels which, for example, a Code Red announcement may affect - var/list/player_levels = list(1, 3, 4, 5, 6) // Defines all Z-levels a character can typically reach + var/list/player_levels = list(1, 3, 4, 5, 6, 7) // Defines all Z-levels a character can typically reach var/const/minutes_to_ticks = 60 * 10 // Event settings diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 43c52ec018c..7d5547f3c45 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -2268,6 +2268,7 @@ area/security/podbay /area/awaycontent name = "space" + report_alerts = 0 /area/awaycontent/a1 icon_state = "awaycontent1" diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 76d198d796f..d981da20efe 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -310,13 +310,4 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" user << "We already have this DNA in storage!" return 1 - -//More snowflake stuff, but for languages. -/datum/changeling/proc/changeling_update_languages(var/updated_languages, var/mob/living/carbon/user) - if(!istype(user) || !user) - return - user.languages = list() - for(var/language in updated_languages) - user.languages += language - - return \ No newline at end of file + \ No newline at end of file diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 370a65d42a0..077a83db213 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -360,10 +360,11 @@ var/list/sting_paths sting_paths = init_subtypes(/obj/effect/proc_holder/changeling) if(mind.changeling.purchasedpowers) remove_changeling_powers(1) + + add_language("Changeling") for(var/language in languages) - if(!(language in mind.changeling.absorbed_languages)) - mind.changeling.absorbed_languages += language + mind.changeling.absorbed_languages |= language // purchase free powers. for(var/obj/effect/proc_holder/changeling/path in sting_paths) @@ -376,6 +377,18 @@ var/list/sting_paths var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste mind.changeling.absorbed_dna |= C.dna return 1 + +//Used to dump the languages from the changeling datum into the actual mob. +/mob/proc/changeling_update_languages(var/updated_languages) + + languages = list() + for(var/language in updated_languages) + languages += language + + //This isn't strictly necessary but just to be safe... + add_language("Changeling") + + return /datum/changeling/proc/reset() chosen_sting = null diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 6acb6e5a66d..bb9785286dc 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -94,7 +94,7 @@ for(var/language in T.languages) if(!(language in absorbed_languages)) absorbed_languages += language - changeling_update_languages(absorbed_languages, user) + T.changeling_update_languages(absorbed_languages) absorbedcount++ store_dna(new_dna, user) diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index b50c23197c4..67d46aacb63 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -65,7 +65,7 @@ I.implanted = O user.mind.transfer_to(O) - O.mind.changeling.changeling_update_languages(changeling.absorbed_languages) + O.changeling_update_languages(changeling.absorbed_languages) O.mind.changeling.purchasedpowers -= src //O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/lesserform(null) feedback_add_details("changeling_powers","LFT") diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 0069b7cbfd2..ab68b2d3ae2 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -60,7 +60,7 @@ C.mind.transfer_to(O) O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) - O.mind.changeling.changeling_update_languages(changeling.absorbed_languages) + O.changeling_update_languages(changeling.absorbed_languages) feedback_add_details("changeling_powers","LF") qdel(C) diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index b6a9cf0af30..f1ff51a42a2 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -21,6 +21,8 @@ user.set_species() user.UpdateAppearance() domutcheck(user, null) + + user.changeling_update_languages(changeling.absorbed_languages) feedback_add_details("changeling_powers","TR") return 1 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index de7bc051054..6deb483f0fa 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -132,6 +132,7 @@ proc/issyndicate(mob/living/M as mob) synd_mind.current.loc = synd_spawn[spawnpos] forge_syndicate_objectives(synd_mind) + create_syndicate(synd_mind) greet_syndicate(synd_mind) equip_syndicate(synd_mind.current) @@ -162,7 +163,38 @@ proc/issyndicate(mob/living/M as mob) spawn (rand(waittime_l, waittime_h)) send_intercept() return ..() + +/datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human + var/mob/living/carbon/human/M = synd_mind.current + M.set_species("Human",1) + M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics + var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde + var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue + var/skin_tone = pick(35, 60, 75, 90, 105, 120, 135, 150) // Caucasian - black + var/hair_style = "Bald" + var/facial_hair_style = "Shaved" + if(M.gender == MALE) + hair_style = pick(hair_styles_male_list) + facial_hair_style = pick(facial_hair_styles_list) + else + hair_style = pick(hair_styles_female_list) + if(prob(5)) + facial_hair_style = pick(facial_hair_styles_list) + + M.r_facial = hex2num(copytext(hair_c, 2, 4)) + M.g_facial = hex2num(copytext(hair_c, 4, 6)) + M.b_facial = hex2num(copytext(hair_c, 6, 8)) + M.r_hair = hex2num(copytext(hair_c, 2, 4)) + M.g_hair = hex2num(copytext(hair_c, 4, 6)) + M.b_hair = hex2num(copytext(hair_c, 6, 8)) + M.r_eyes = hex2num(copytext(eye_c, 2, 4)) + M.g_eyes = hex2num(copytext(eye_c, 4, 6)) + M.b_eyes = hex2num(copytext(eye_c, 6, 8)) + M.s_tone = skin_tone + 35 + M.s_tone = -M.s_tone + 35 + M.h_style = hair_style + M.f_style = facial_hair_style /datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code) var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index f7abb6475cf..fe3062a194c 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -23,10 +23,6 @@ var/bomb_set var/timing_wire var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. var/lastentered - var/data[0] - var/uiwidth - var/uiheight - var/uititle flags = FPRINT use_power = 0 unacidable = 1 @@ -189,6 +185,10 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) ui_interact(user) /obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/uiwidth + var/uiheight + var/uititle if(!src.opened) data["hacking"] = 0 data["auth"] = src.auth diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 8cf8c77c66c..e676f69c130 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -29,7 +29,6 @@ var/remote_disabled = 0 //If enabled, the AI cannot *Remotely* control a bot. It can still control it through cameras. var/mob/living/silicon/ai/calling_ai //Links a bot to the AI calling it. var/obj/item/device/radio/Radio //The bot's radio, for speaking to people. - var/radio_frequency //The bot's default radio speaking freqency. Recommended to be on a department frequency. var/radio_name = "Common" //var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots var/auto_patrol = 0// set to make bot automatically patrol @@ -339,11 +338,9 @@ /obj/machinery/bot/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/bot/proc/speak(var/message, freq, var/freqname = null) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio. +/obj/machinery/bot/proc/speak(var/message, var/freqname = null) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio. if((!on) || (!message)) return - if(freq) - Radio.set_frequency(radio_frequency) if(freqname) Radio.autosay(message, src.name, freqname, list(src.z)) else @@ -654,7 +651,7 @@ obj/machinery/bot/proc/start_patrol() botcard.access = user_access + prev_access //Adds the user's access, if any. mode = BOT_SUMMON calc_summon_path() - speak("Responding.", radio_frequency, radio_name) + speak("Responding.", radio_name) return // receive response from beacon @@ -741,7 +738,7 @@ obj/machinery/bot/proc/bot_summon() check_bot_access() path = AStar(loc, summon_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 150, id=botcard, exclude=avoid) if(!path || tries >= 5) //Cannot reach target. Give up and announce the issue. - speak("Summon command failed, destination unreachable.", radio_frequency, radio_name) + speak("Summon command failed, destination unreachable.", radio_name) bot_reset() /obj/machinery/bot/proc/summon_step() diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index 5c4d3bf9200..128a4c397f5 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -38,7 +38,6 @@ var/failed_steps var/next_dest var/next_dest_loc - radio_frequency = SRV_FREQ //Service radio_name = "Service" bot_type = CLEAN_BOT bot_type_name = "Cleanbot" diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 089b7261515..fba612c7142 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -33,7 +33,6 @@ var/arrest_type = 0 //If true, don't handcuff var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type var/shoot_sound = 'sound/weapons/Taser.ogg' - radio_frequency = SEC_FREQ radio_name = "Security" bot_type = SEC_BOT bot_type_name = "ED-209" @@ -269,7 +268,7 @@ Auto Patrol[]"}, if(declare_arrests) var/area/location = get_area(src) - speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].",radio_frequency, radio_name) + speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].", radio_name) target.visible_message("[target] has been stunned by [src]!",\ "[target] has been stunned by [src]!") diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index eede1892d76..a941981dfaa 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -49,7 +49,6 @@ var/oldloc = null req_one_access = list(access_construction, access_robotics) var/targetdirection - radio_frequency = ENG_FREQ //Engineering channel radio_name = "Engineering" bot_type = FLOOR_BOT bot_type_name = "Floorbot" @@ -318,7 +317,7 @@ /obj/machinery/bot/floorbot/proc/nag() //Annoy everyone on the channel to refill us! if(!nagged) var/area/location = get_area(src) - speak("Requesting refill at [location]!", radio_frequency, radio_name) + speak("Requesting refill at [location]!", radio_name) nagged = 1 /obj/machinery/bot/floorbot/proc/is_hull_breach(var/turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas. diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index c77a5477e13..2258ccfad38 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -30,7 +30,6 @@ var/declare_crit = 1 //If active, the bot will transmit a critical patient alert to MedHUD users. var/declare_cooldown = 0 //Prevents spam of critical patient alerts. var/stationary_mode = 0 //If enabled, the Medibot will not move automatically. - radio_frequency = MED_FREQ //Medical frequency radio_name = "Medical" //Setting which reagents to use to treat what by default. By id. var/treatment_brute = "tricordrazine" @@ -533,7 +532,7 @@ if((skin == "bezerk")) return var/area/location = get_area(src) - speak("Medical emergency! [crit_patient ? "[crit_patient]" : "A patient"] is in critical condition at [location]!",radio_frequency, radio_name) + speak("Medical emergency! [crit_patient ? "[crit_patient]" : "A patient"] is in critical condition at [location]!", radio_name) declare_cooldown = 1 spawn(200) //Twenty seconds declare_cooldown = 0 diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 7095d04a1b0..ac28b903947 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -71,7 +71,7 @@ var/global/mulebot_count = 0 cell.charge = 2000 cell.maxcharge = 2000 - spawn(5) // must wait for map loading to finish + spawn(50) // must wait for map loading to finish add_to_beacons(bot_filter) mulebot_count += 1 @@ -238,7 +238,7 @@ var/global/mulebot_count = 0 //user << browse("M.U.L.E. Mk. III [suffix ? "([suffix])" : ""][dat]", "window=mulebot;size=350x500") //onclose(user, "mulebot") - var/datum/browser/popup = new(user, "mulebot", "M.U.L.E. Mk. V [suffix ? "([suffix])" : ""]", 350, 535) + var/datum/browser/popup = new(user, "mulebot", "M.U.L.E. Mk. V [suffix ? "([suffix])" : ""]", 350, 620) popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() @@ -313,6 +313,8 @@ var/global/mulebot_count = 0 updateDialog() if("destination") + if(!delivery_beacons.len) + post_signal(beacon_freq, "findbeacon", "delivery") refresh=0 var/new_dest = input("Select M.U.L.E. Destination", "Mulebot [suffix ? "([suffix])" : ""]", destination) as null|anything in delivery_beacons refresh=1 @@ -683,7 +685,6 @@ var/global/mulebot_count = 0 // called when bot reaches current target /obj/machinery/bot/mulebot/proc/at_target() if(!reached_target) - radio_frequency = SUP_FREQ //Supply channel radio_name = "Supply" Radio.config(list("[radio_name]" = 0)) visible_message("[src] makes a chiming sound!", "You hear a chime.") @@ -696,12 +697,11 @@ var/global/mulebot_count = 0 calling_ai << "\icon[src] [src] wirelessly plays a chiming sound!" playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null - radio_frequency = AI_FREQ //Report on AI Private instead if the AI is controlling us. radio_name = "AI Private" Radio.config(list("[radio_name]" = 0)) if(load) // if loaded, unload at target - speak("Destination [destination] reached. Unloading [load].", radio_frequency, radio_name) + speak("Destination [destination] reached. Unloading [load].", radio_name) unload(loaddir) else // not loaded @@ -717,7 +717,7 @@ var/global/mulebot_count = 0 if(AM) load(AM) if(report_delivery) - speak("Now loading [load] at [get_area(src)].", radio_frequency, radio_name) + speak("Now loading [load] at [get_area(src)].", radio_name) // whatever happened, check to see if we return home if(auto_return && destination != home_destination) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 5daad21735d..45fdad3c68e 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -25,7 +25,6 @@ var/arrest_type = 0 //If true, don't handcuff var/harmbaton = 0 var/base_icon = "secbot" - radio_frequency = SEC_FREQ //Security channel radio_name = "Security" bot_type = SEC_BOT bot_type_name = "Secbot" @@ -50,7 +49,6 @@ /obj/machinery/bot/secbot/pingsky name = "Officer Pingsky" desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." - radio_frequency = AI_FREQ radio_name = "AI Private" /obj/machinery/bot/secbot/ofitser @@ -256,7 +254,7 @@ Auto Patrol: []"}, if(declare_arrests) var/area/location = get_area(src) - speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].",radio_frequency, radio_name) + speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].", radio_name) target.visible_message("[target] has been [harmbaton ? "beaten" : "stunned"] by [src]!",\ "[target] has been [harmbaton ? "beaten" : "stunned"] by [src]!") diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 32bf7da3c7a..29854facc67 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -127,7 +127,7 @@ /obj/item/device/radio/headset/heads/captain/alt name = "\proper the captain's bowman headset" - desc = "The headset of the boss. Protects ears from flashbangs. \nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science." + desc = "The headset of the boss. Protects ears from flashbangs. \nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :zz - service, :m - medical, :n - science." flags = EARBANGPROTECT icon_state = "com_headset_alt" item_state = "com_headset_alt" diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index b83dcfef95a..503fc2b5041 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -170,7 +170,7 @@ updateDialog() add_fingerprint(usr) -/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT +/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/zlevel = config.contact_levels) //BS12 EDIT var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) if (channel == "department") @@ -189,7 +189,7 @@ Broadcast_Message(connection, A, 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", - 4, 0, list(1), PUB_FREQ) + 4, 0, zlevel, connection.frequency) del(A) return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index a3e0d2f7b78..1dc2142d31a 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -63,6 +63,10 @@ attached_device.HasProximity(AM) return +/obj/item/device/transfer_valve/hear_talk(mob/living/M as mob, msg) + ..() + for(var/obj/O in contents) + O.hear_talk(M, msg) /obj/item/device/transfer_valve/attack_self(mob/user as mob) ui_interact(user) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 23bed41262c..41520fabb93 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -32,9 +32,11 @@ R.icon_state = "robot" del(R.module) R.module = null - R.camera.network.Remove(list("Engineering","Medical","MINE")) + R.camera.network.Remove(list("Engineering","Medical","Mining Outpost")) R.updatename("Default") R.status_flags |= CANPUSH + R.languages = list() + R.speech_synthesizer_langs = list() R.notify_ai(2) R.updateicon() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d8e22940639..7bf35f6c6e0 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -4,151 +4,83 @@ density = 1 layer = 2 var/state = 0 + var/health = 200 - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/wrench) && state == 0) - if(anchored && !istype(src,/obj/structure/girder/displaced)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue Now disassembling the girder" - if(do_after(user,40)) - if(!src) return - user << "\blue You dissasembled the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) - else if(!anchored) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue Now securing the girder" - if(get_turf(user, 40)) - user << "\blue You secured the girder!" - new/obj/structure/girder( src.loc ) - del(src) - - else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "\blue Now slicing apart the girder" - if(do_after(user,30)) +/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wrench) && state == 0) + if(anchored && !istype(src,/obj/structure/girder/displaced)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "\blue Now disassembling the girder" + if(do_after(user,40)) if(!src) return - user << "\blue You slice apart the girder!" + user << "\blue You dissasembled the girder!" new /obj/item/stack/sheet/metal(get_turf(src)) del(src) - - else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - user << "\blue You drill through the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) - - else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue Now unsecuring support struts" - if(do_after(user,40)) - if(!src) return - user << "\blue You unsecured the support struts!" - state = 1 - - else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user << "\blue Now removing support struts" - if(do_after(user,40)) - if(!src) return - user << "\blue You removed the support struts!" + else if(!anchored) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "\blue Now securing the girder" + if(get_turf(user, 40)) + user << "\blue You secured the girder!" new/obj/structure/girder( src.loc ) del(src) - else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user << "\blue Now dislodging the girder" - if(do_after(user, 40)) - if(!src) return - user << "\blue You dislodged the girder!" - new/obj/structure/girder/displaced( src.loc ) - del(src) + else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + user << "\blue Now slicing apart the girder" + if(do_after(user,30)) + if(!src) return + user << "\blue You slice apart the girder!" + new /obj/item/stack/sheet/metal(get_turf(src)) + del(src) - else if(istype(W, /obj/item/stack/sheet)) + else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + user << "\blue You drill through the girder!" + new /obj/item/stack/sheet/metal(get_turf(src)) + del(src) - var/obj/item/stack/sheet/S = W - switch(S.type) + else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + user << "\blue Now unsecuring support struts" + if(do_after(user,40)) + if(!src) return + user << "\blue You unsecured the support struts!" + state = 1 - if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg) - if(!anchored) - if(S.amount < 2) return - var/pdiff=performWallPressureCheck(src.loc) - if(!pdiff) - S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." - new /obj/structure/falsewall (src.loc) - del(src) - else - user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." - message_admins("Attempted false wall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") - log_admin("Attempted false wall made by [user.real_name] (user.ckey) at [loc] had a pressure difference of [pdiff]!") - return - else - if(S.amount < 2) return ..() - user << "\blue Now adding plating..." - if (do_after(user,40)) - if(!src || !S || S.amount < 2) return - S.use(2) - user << "\blue You added the plating!" - var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(/turf/simulated/wall) - for(var/turf/simulated/wall/X in Tsrc.loc) - if(X) X.add_hiddenprint(usr) - del(src) - return + else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + user << "\blue Now removing support struts" + if(do_after(user,40)) + if(!src) return + user << "\blue You removed the support struts!" + new/obj/structure/girder( src.loc ) + del(src) - if(/obj/item/stack/sheet/plasteel) - if(!anchored) - if(S.amount < 2) return - var/pdiff=performWallPressureCheck(src.loc) - if(!pdiff) - S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." - new /obj/structure/falsewall/reinforced (src.loc) - del(src) - else - user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." - message_admins("Attempted false rwall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") - log_admin("Attempted false rwall made by [user.real_name] ([user.ckey]) at [loc] had a pressure difference of [pdiff]!") - return - else - if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... - if(S.amount < 1) return ..() - user << "\blue Now finalising reinforced wall." - if(do_after(user, 50)) - if(!src || !S || S.amount < 1) return - S.use(1) - user << "\blue Wall fully reinforced!" - var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) - for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) - if(X) X.add_hiddenprint(usr) - del(src) - return - else - if(S.amount < 1) return ..() - user << "\blue Now reinforcing girders" - if (do_after(user,60)) - if(!src || !S || S.amount < 1) return - S.use(1) - user << "\blue Girders reinforced!" - new/obj/structure/girder/reinforced( src.loc ) - del(src) - return + else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + user << "\blue Now dislodging the girder" + if(do_after(user, 40)) + if(!src) return + user << "\blue You dislodged the girder!" + new/obj/structure/girder/displaced( src.loc ) + del(src) - if(S.sheettype) - var/M = S.sheettype + else if(istype(W, /obj/item/stack/sheet)) + + var/obj/item/stack/sheet/S = W + switch(S.type) + + if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg) if(!anchored) if(S.amount < 2) return var/pdiff=performWallPressureCheck(src.loc) if(!pdiff) S.use(2) user << "\blue You create a false wall! Push on it to open or close the passage." - var/F = text2path("/obj/structure/falsewall/[M]") - new F (src.loc) + new /obj/structure/falsewall (src.loc) del(src) else user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." - message_admins("Attempted false [M] wall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") - log_admin("Attempted false [M] wall made by [user.real_name] ([user.ckey]) at [loc] had a pressure difference of [pdiff]!") + message_admins("Attempted false wall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") + log_admin("Attempted false wall made by [user.real_name] (user.ckey) at [loc] had a pressure difference of [pdiff]!") return else if(S.amount < 2) return ..() @@ -158,67 +90,138 @@ S.use(2) user << "\blue You added the plating!" var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) - for(var/turf/simulated/wall/mineral/X in Tsrc.loc) + Tsrc.ChangeTurf(/turf/simulated/wall) + for(var/turf/simulated/wall/X in Tsrc.loc) if(X) X.add_hiddenprint(usr) del(src) return - add_hiddenprint(usr) + if(/obj/item/stack/sheet/plasteel) + if(!anchored) + if(S.amount < 2) return + var/pdiff=performWallPressureCheck(src.loc) + if(!pdiff) + S.use(2) + user << "\blue You create a false wall! Push on it to open or close the passage." + new /obj/structure/falsewall/reinforced (src.loc) + del(src) + else + user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." + message_admins("Attempted false rwall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") + log_admin("Attempted false rwall made by [user.real_name] ([user.ckey]) at [loc] had a pressure difference of [pdiff]!") + return + else + if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... + if(S.amount < 1) return ..() + user << "\blue Now finalising reinforced wall." + if(do_after(user, 50)) + if(!src || !S || S.amount < 1) return + S.use(1) + user << "\blue Wall fully reinforced!" + var/turf/Tsrc = get_turf(src) + Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) + for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) + if(X) X.add_hiddenprint(usr) + del(src) + return + else + if(S.amount < 1) return ..() + user << "\blue Now reinforcing girders" + if (do_after(user,60)) + if(!src || !S || S.amount < 1) return + S.use(1) + user << "\blue Girders reinforced!" + new/obj/structure/girder/reinforced( src.loc ) + del(src) + return - else if(istype(W, /obj/item/pipe)) - var/obj/item/pipe/P = W - if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. - user.drop_item() - P.loc = src.loc - user << "\blue You fit the pipe into the [src]!" - else - ..() - - - bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/beam/pulse)) - src.ex_act(2) - ..() - return 0 - - blob_act() - if(prob(40)) - del(src) - - bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/beam/pulse)) - src.ex_act(2) - ..() - return 0 - - ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if (prob(75)) - var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) - new remains(loc) - qdel(src) - return - if(3.0) - if (prob(30)) - var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) - new remains(loc) - qdel(src) - return + if(S.sheettype) + var/M = S.sheettype + if(!anchored) + if(S.amount < 2) return + var/pdiff=performWallPressureCheck(src.loc) + if(!pdiff) + S.use(2) + user << "\blue You create a false wall! Push on it to open or close the passage." + var/F = text2path("/obj/structure/falsewall/[M]") + new F (src.loc) + del(src) + else + user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." + message_admins("Attempted false [M] wall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") + log_admin("Attempted false [M] wall made by [user.real_name] ([user.ckey]) at [loc] had a pressure difference of [pdiff]!") + return else - return + if(S.amount < 2) return ..() + user << "\blue Now adding plating..." + if (do_after(user,40)) + if(!src || !S || S.amount < 2) return + S.use(2) + user << "\blue You added the plating!" + var/turf/Tsrc = get_turf(src) + Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) + for(var/turf/simulated/wall/mineral/X in Tsrc.loc) + if(X) X.add_hiddenprint(usr) + del(src) + return + + add_hiddenprint(usr) + + else if(istype(W, /obj/item/pipe)) + var/obj/item/pipe/P = W + if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. + user.drop_item() + P.loc = src.loc + user << "\blue You fit the pipe into the [src]!" + else + ..() + +/obj/structure/girder/blob_act() + if(prob(40)) + del(src) + +/obj/structure/girder/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj, /obj/item/projectile/beam)) + health -= Proj.damage + ..() + if(health <= 0) + new /obj/item/stack/sheet/metal(get_turf(src)) + del(src) + + if(istype(Proj ,/obj/item/projectile/beam/pulse)) + src.ex_act(2) + ..() + return 0 + +/obj/structure/girder/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(75)) + var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) + new remains(loc) + qdel(src) + return + if(3.0) + if (prob(30)) + var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) + new remains(loc) + qdel(src) + return + else + return /obj/structure/girder/displaced icon_state = "displaced" anchored = 0 + health = 50 /obj/structure/girder/reinforced icon_state = "reinforced" state = 2 + health = 500 /obj/structure/cultgirder icon= 'icons/obj/cult.dmi' @@ -226,47 +229,55 @@ anchored = 1 density = 1 layer = 2 + var/health = 250 - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue Now disassembling the girder" - if(do_after(user,40)) - user << "\blue You dissasembled the girder!" - new /obj/effect/decal/remains/human(get_turf(src)) - del(src) +/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "\blue Now disassembling the girder" + if(do_after(user,40)) + user << "\blue You dissasembled the girder!" + dismantle() - else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "\blue Now slicing apart the girder" - if(do_after(user,30)) - user << "\blue You slice apart the girder!" - new /obj/effect/decal/remains/human(get_turf(src)) - del(src) + else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + user << "\blue Now slicing apart the girder" + if(do_after(user,30)) + user << "\blue You slice apart the girder!" + dismantle() - else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - user << "\blue You drill through the girder!" - new /obj/effect/decal/remains/human(get_turf(src)) - del(src) + else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + user << "\blue You drill through the girder!" + dismantle() + +/obj/structure/cultgirder/proc/dismantle() + new /obj/effect/decal/remains/human(get_turf(src)) + qdel(src) - blob_act() - if(prob(40)) - del(src) +/obj/structure/cultgirder/blob_act() + if(prob(40)) + dismantle() + +/obj/structure/cultgirder/bullet_act(var/obj/item/projectile/Proj) //No beam check- How else will you destroy the cult girder with silver bullets????? + health -= Proj.damage + ..() + if(health <= 0) + dismantle() + return - - ex_act(severity) - switch(severity) - if(1.0) +/obj/structure/cultgirder/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(30)) + new /obj/effect/decal/remains/human(loc) qdel(src) - return - if(2.0) - if (prob(30)) - new /obj/effect/decal/remains/human(loc) - qdel(src) - return - if(3.0) - if (prob(5)) - new /obj/effect/decal/remains/human(loc) - qdel(src) - return - else - return \ No newline at end of file + return + if(3.0) + if (prob(5)) + new /obj/effect/decal/remains/human(loc) + qdel(src) + return + else + return \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index f62cef10073..7fa81ce358e 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -35,7 +35,6 @@ /obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it. var/mob/living/carbon/human/human/M = new /mob/living/carbon/human/human (src.loc) - M.dna.mutantrace = mutantrace M.real_name = src.name M.death(1) //Kills the new mob M.timeofdeath = timeofdeath diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index 997276e74b8..16af3141647 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -3,6 +3,7 @@ /area/awaymission/academy name = "\improper Academy Asteroids" icon_state = "away" + report_alerts = 0 /area/awaymission/academy/headmaster name = "\improper Academy Fore Block" diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index d2d215053af..468863f3026 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -4,7 +4,7 @@ name = "\improper BMP Asteroids" icon_state = "away" luminosity = 0 - + report_alerts = 0 /area/awaymission/BMPship/Aft name = "\improper Aft Block" diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 70be2fa7202..06f36c5bf44 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -4,7 +4,8 @@ name = "XCC-P5831" icon_state = "away" requires_power = 0 - + report_alerts = 0 + /area/awaymission/centcomAway/general name = "XCC-P5831" music = "music/ambigen3.ogg" diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index f7aa861eb80..966ce6053f6 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -1,5 +1,10 @@ //Challenge Areas +/area/awaymission/challenge + name = "Challenge" + icon_state = "away" + report_alerts = 0 + /area/awaymission/challenge/start name = "Where Am I?" icon_state = "away" diff --git a/code/modules/awaymissions/mission_code/clownplanet.dm b/code/modules/awaymissions/mission_code/clownplanet.dm index 45b0dc1c7de..359037ada0a 100644 --- a/code/modules/awaymissions/mission_code/clownplanet.dm +++ b/code/modules/awaymissions/mission_code/clownplanet.dm @@ -6,6 +6,7 @@ luminosity = 1 lighting_use_dynamic = 0 requires_power = 0 + report_alerts = 0 /area/awaymission/clownplanet/miningtown name = "\improper Clown Planet - Bananium-o-Rama" diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index dc86365f4ee..3f9c9925772 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -4,6 +4,7 @@ name = "\improper Space Battle" icon_state = "away" requires_power = 0 + report_alerts = 0 /area/awaymission/spacebattle/cruiser name = "\improper Nanotrasen Cruiser" diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index fdfd016e40a..dee5ae20af6 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -19,6 +19,9 @@ * Areas */ //Gateroom gets its own APC specifically for the gate + /area/awaymission + report_alerts = 0 + /area/awaymission/gateroom //Library, medbay, storage room diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 06c82bfc529..2960f159546 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -33,7 +33,7 @@ if(!holder) return prefs.toggles ^= CHAT_RADIO prefs.save_preferences(src) - usr << "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers" + usr << "You will [(prefs.toggles & CHAT_RADIO) ? "no longer" : "now"] see radio chatter from radios or speakers" feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggleadminhelpsound() diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index ed588a76482..facaf65c5da 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -12,14 +12,15 @@ var/obj/item/weapon/card/id/prisoner/inserted_id var/obj/machinery/door/airlock/release_door var/door_tag = "prisonshuttle" - var/obj/item/device/radio/Radio //needed to send messages to sec radio var/use_release_door = 0 + var/obj/item/device/radio/intercom/announcer /obj/machinery/mineral/labor_claim_console/New() ..() - Radio = new/obj/item/device/radio(src) - Radio.listening = 0 + announcer = new /obj/item/device/radio/intercom(null) + announcer.config(list("Security" = 0)) + spawn(7) src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) var/t @@ -103,8 +104,8 @@ else if(shuttle.location == 1) if (shuttle.moving_status == SHUTTLE_IDLE) - Radio.set_frequency(SEC_FREQ) - Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", SEC_FREQ) + var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." + announcer.autosay(message, "Labor Camp Controller", "Security") usr << "Shuttle received message and will be sent shortly." shuttle.launch() else @@ -131,7 +132,7 @@ /obj/machinery/mineral/stacking_machine/laborstacker var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50)) + var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("iron" = 3), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50)) /obj/machinery/mineral/stacking_machine/laborstacker/proc/get_ore_values() var/dat = "" @@ -155,6 +156,17 @@ S.loc = output.loc else O.loc = output.loc + + //Output amounts that are past stack_amt. + for(var/sheet in stack_storage) + if(stack_storage[sheet] >= stack_amt) + var/stacktype = stack_paths[sheet] + var/obj/item/stack/sheet/S = new stacktype (get_turf(output)) + S.amount = stack_amt + stack_storage[sheet] -= stack_amt + + console.updateUsrDialog() + return /**********************Point Lookup Console**************************/ diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 32a36acf2ea..3b4f1cc6f39 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -141,7 +141,7 @@ exclaim_verb = "roars" colour = "soghun" key = "o" - flags = RESTRICTED | WHITELISTED + flags = RESTRICTED syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh") /datum/language/unathi/get_random_name() @@ -159,7 +159,7 @@ exclaim_verb = "yowls" colour = "tajaran" key = "j" - flags = RESTRICTED | WHITELISTED + flags = RESTRICTED syllables = list("rr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", \ "mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r", \ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \ @@ -182,7 +182,7 @@ exclaim_verb = "warbles" colour = "skrell" key = "k" - flags = RESTRICTED | WHITELISTED + flags = RESTRICTED syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!") /datum/language/vox @@ -192,7 +192,7 @@ ask_verb = "creels" exclaim_verb = "SHRIEKS" colour = "vox" - key = "5" + key = "v" flags = RESTRICTED | WHITELISTED syllables = list("ti","ti","ti","hi","hi","ki","ki","ki","ki","ya","ta","ha","ka","ya","chi","cha","kah", \ "SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA") @@ -219,13 +219,13 @@ /datum/language/trinary name = "Trinary" desc = "A modification of binary to allow fuzzy logic. 0 is no, 1 is maybe, 2 is yes. Credited with giving Machine People the ability to think creatively." - speech_verb = "shrieks" + speech_verb = "states" ask_verb = "queries" exclaim_verb = "exclaims" colour = "trinary" key = "5" - flags = RESTRICTED - syllables = list("11111","01222","10110","11210","22212","02211","21222","2022","2001","0002","0012","0012","000","120","121","201","220","10","11","0") + flags = RESTRICTED | WHITELISTED + syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0") /datum/language/kidan name = "Chittin" @@ -235,18 +235,18 @@ exclaim_verb = "rubs its antennae together" colour = "kidan" key = "4" - flags = RESTRICTED + flags = RESTRICTED | WHITELISTED syllables = list("click","clack") /datum/language/slime name = "Bubblish" - desc = "Language of slimes, a mixture of bubbling noises and pops. Almost impossible to speak without mechanical aid for humans." + desc = "The language of slimes. It's a mixture of bubbling noises and pops. Very difficult to speak without mechanical aid for humans." speech_verb = "bubbles and pops" ask_verb = "bubbles and pops" exclaim_verb = "bubbles and pops" colour = "slime" key = "f" - flags = RESTRICTED + flags = RESTRICTED | WHITELISTED syllables = list("blob","plop","pop","bop","boop") /datum/language/common @@ -317,7 +317,7 @@ speech_verb = "hisses" ask_verb = "hisses" exclaim_verb = "hisses" - key = "4" + key = "6" flags = RESTRICTED syllables = list("sss","sSs","SSS") @@ -332,7 +332,6 @@ flags = RESTRICTED | HIVEMIND /datum/language/xenos/check_special_condition(var/mob/other) - var/mob/living/carbon/M = other if(!istype(M)) return 1 diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm deleted file mode 100644 index 5faeadbdcc3..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ /dev/null @@ -1,34 +0,0 @@ -/mob/living/carbon/alien/diona - name = "diona nymph" - voice_name = "diona nymph" - adult_form = /mob/living/carbon/human - speak_emote = list("chirrups") - icon_state = "nymph" - language = "Rootspeak" - - universal_understand = 1 - universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. - holder_type = /obj/item/weapon/holder/diona - -/mob/living/carbon/alien/diona/New() - - ..() - species = all_species["Diona"] - verbs += /mob/living/carbon/alien/diona/proc/merge - -/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) - //TODO: Collapse these checks into one proc (see pai and drone) - if(istype(AM,/obj/item)) - var/obj/item/O = AM - if(O.w_class > 2) - src << "You are too small to pull that." - return - else - ..() - else - src << "You are too small to pull that." - return - -/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. - W.loc = get_turf(src) - return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm deleted file mode 100644 index a379af21c76..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ /dev/null @@ -1,16 +0,0 @@ -/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob) - - if(istype(M)) - //Let people pick the little buggers up. - if(M.a_intent == "help") - if(M.species && M.species.name == "Diona") - M << "You feel your being twine with that of [src] as it merges with your biomass." - src << "You feel your being twine with that of [M] as you merge with its biomass." - src.verbs += /mob/living/carbon/alien/diona/proc/split - src.verbs -= /mob/living/carbon/alien/diona/proc/merge - src.loc = M - else - get_scooped(M) - return - - ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm deleted file mode 100644 index 65e1f6b1c00..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ /dev/null @@ -1,66 +0,0 @@ -//Verbs after this point. -/mob/living/carbon/alien/diona/proc/merge() - - set category = "Abilities" - set name = "Merge with gestalt" - set desc = "Merge with another diona." - - if(stat == DEAD || paralysis || weakened || stunned || restrained()) - return - - if(istype(src.loc,/mob/living/carbon)) - src.verbs -= /mob/living/carbon/alien/diona/proc/merge - return - - var/list/choices = list() - for(var/mob/living/carbon/C in view(1,src)) - - if(!(src.Adjacent(C)) || !(C.client)) continue - - if(istype(C,/mob/living/carbon/human)) - var/mob/living/carbon/human/D = C - if(D.species && D.species.name == "Diona") - choices += C - - var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices - - if(!M || !src || !(src.Adjacent(M))) return - - if(istype(M,/mob/living/carbon/human)) - M << "You feel your being twine with that of [src] as it merges with your biomass." - M.status_flags |= PASSEMOTES - - src << "You feel your being twine with that of [M] as you merge with its biomass." - src.loc = M - src.verbs += /mob/living/carbon/alien/diona/proc/split - src.verbs -= /mob/living/carbon/alien/diona/proc/merge - else - return - -/mob/living/carbon/alien/diona/proc/split() - - set category = "Abilities" - set name = "Split from gestalt" - set desc = "Split away from your gestalt as a lone nymph." - - if(stat == DEAD || paralysis || weakened || stunned || restrained()) - return - - if(!(istype(src.loc,/mob/living/carbon))) - src.verbs -= /mob/living/carbon/alien/diona/proc/split - return - - src.loc << "You feel a pang of loss as [src] splits away from your biomass." - src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." - - var/mob/living/M = src.loc - - src.loc = get_turf(src) - src.verbs -= /mob/living/carbon/alien/diona/proc/split - src.verbs += /mob/living/carbon/alien/diona/proc/merge - - if(istype(M)) - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) - return - M.status_flags &= ~PASSEMOTES \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm deleted file mode 100644 index 5a82e3f373c..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/life.dm +++ /dev/null @@ -1,20 +0,0 @@ -//Dionaea regenerate health and nutrition in light. -/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment) - - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(loc)) //else, there's considered to be no light - var/turf/T = loc - var/area/A = T.loc - if(A) - if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights - else light_amount = 5 - - nutrition += light_amount - - if(nutrition > 500) - nutrition = 500 - if(light_amount > 2) //if there's enough light, heal - adjustBruteLoss(-1) - adjustFireLoss(-1) - adjustToxLoss(-1) - adjustOxyLoss(-1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm deleted file mode 100644 index fa567cbb443..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ /dev/null @@ -1,19 +0,0 @@ -/mob/living/carbon/alien/diona/confirm_evolution() - - if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist) - src << alert("You are currently not whitelisted to play as a full diona.") - return null - - if(amount_grown < max_grown) - src << "You are not yet ready for your growth..." - return null - - src.split() - - if(istype(loc,/obj/item/weapon/holder/diona)) - var/obj/item/weapon/holder/diona/L = loc - src.loc = L.loc - del(L) - - src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") - return "Diona" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/say_understands.dm b/code/modules/mob/living/carbon/alien/diona/say_understands.dm deleted file mode 100644 index 3f68a44cffb..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/say_understands.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/living/carbon/alien/diona/say_understands(var/mob/other,var/datum/language/speaking = null) - - if (istype(other, /mob/living/carbon/human) && !speaking) - if(languages.len >= 2) // They have sucked down some blood. - return 1 - return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm deleted file mode 100644 index b39972cdad3..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/update_icons.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/carbon/alien/diona/update_icons() - - if(stat == DEAD) - icon_state = "[initial(icon_state)]_dead" - else if(lying || resting || stunned) - icon_state = "[initial(icon_state)]_sleep" - else - icon_state = "[initial(icon_state)]" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 0eb6fe764ee..721c2a4b3fb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -21,6 +21,8 @@ if(name == "alien") name = text("alien ([rand(1, 1000)])") real_name = name + add_language("Xenomorph") + add_language("Hivemind") ..() //This is fine, works the same as a human diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 5515c951514..a918e069bb7 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -23,6 +23,8 @@ name = "alien larva ([rand(1, 1000)])" real_name = name regenerate_icons() + add_language("Xenomorph") + add_language("Hivemind") ..() //This is fine, works the same as a human diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 0e6c9cebe6c..8b4177470a4 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,83 +1,28 @@ -// To-do - convert to language system /mob/living/carbon/alien/say(var/message) + var/verb = "says" + var/message_range = world.view - if (silent) - return + if(client) + if(client.prefs.muted & MUTE_IC) + src << "\red You cannot speak in IC (Muted)." + return - if (length(message) >= 2) - if (department_radio_keys[copytext(message, 1, 3)] == "alientalk") - message = copytext(message, 3) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - if (stat == 2) - return say_dead(message) - else - alien_talk(message) - else - if (copytext(message, 1, 2) != "*" && !stat) - playsound(loc, "hiss", 25, 1, 1)//So aliens can hiss while they hiss yo/N - return ..(message) - else + message = trim_strip_html_properly(message) -/mob/living/proc/alien_talk(var/message) + if(stat == 2) + return say_dead(message) + + if(copytext(message,1,2) == "*") + return emote(copytext(message,2)) + + var/datum/language/speaking = parse_language(message) + + if(speaking) + message = copytext(message, 2+length(speaking.key)) - log_say("[key_name(src)] : [message]") message = trim(message) - if (!message) + if(!message || stat) return - var/message_a = say_quote(message) - var/rendered = "Hivemind, [name] [message_a]" - for (var/mob/living/S in player_list) - if(!S.stat) - if(S.alien_talk_understand) - if(S.alien_talk_understand == alien_talk_understand) - S.show_message(rendered, 2) - else if (S.hivecheck()) - S.show_message(rendered, 2) - - var/list/listening = hearers(1, src) - listening -= src - listening += src - - var/list/heard = list() - for (var/mob/M in listening) - if(!istype(M, /mob/living/carbon/alien) && !M.alien_talk_understand) - heard += M - - - if (length(heard)) - var/message_b - - message_b = "hsssss" - message_b = say_quote(message_b) - message_b = "[message_b]" - - rendered = "[voice_name] [message_b]" - - for (var/mob/M in heard) - M.show_message(rendered, 2) - - message = say_quote(message) - - rendered = "Hivemind, [name] [message_a]" - var/rendered2 = null - for (var/mob/M in player_list) - if (istype(M, /mob/new_player)) - continue - if (M.stat > 1 && istype(M, /mob/dead/observer)) - rendered2 = "Hivemind, [name] (Follow) [message_a]" - M.show_message(rendered2, 2) - -/mob/living/proc/hivecheck() - if (isalien(src)) return 1 - if (!ishuman(src)) return - var/mob/living/carbon/human/H = src - if (H.l_ear || H.r_ear) - var/obj/item/device/radio/headset/dongle - if(istype(H.l_ear,/obj/item/device/radio/headset)) - dongle = H.l_ear - else - dongle = H.r_ear - if(!istype(dongle)) return - if(dongle.translate_hive) return 1 \ No newline at end of file + ..(message, speaking, verb, null, null, message_range, null) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index ca01e5527c0..26dc7b30f3f 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -6,7 +6,7 @@ if (stat == 2) // Dead. return say_dead(message) - if(!(container && istype(container, /obj/item/device/mmi))) + if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/mmi/posibrain)))) return //No MMI, can't speak, bucko./N else var/datum/language/speaking = parse_language(message) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a960baffd03..908f9d1d0b0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1300,6 +1300,7 @@ /mob/living/carbon/human/proc/set_species(var/new_species, var/force_organs, var/default_colour) + var/datum/species/oldspecies = species if(!dna) if(!new_species) new_species = "Human" @@ -1317,9 +1318,13 @@ remove_language(species.language) if(species.default_language) - remove_language(species.default_language) - + remove_language(species.default_language) + species = all_species[new_species] + + if(oldspecies) + if(oldspecies.default_genes.len) + oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species if(force_organs || !organs || !organs.len) species.create_organs(src) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 4139fcc2726..4cc61b36290 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -255,9 +255,9 @@ verb = speaking.get_spoken_verb(ending) else if(ending == "!") - verb=pick("exclaims","shouts","yells") + verb = "exclaims" else if(ending == "?") - verb="asks" + verb = "asks" return verb @@ -292,11 +292,11 @@ handled = 1 if(slurring) message = slur(message) - verb = pick("slobbers","slurs") + verb = "slurs" handled = 1 if(stuttering) message = stutter(message) - verb = pick("stammers","stutters") + verb = "stammers" handled = 1 var/braindam = getBrainLoss() @@ -304,7 +304,7 @@ handled = 1 if(prob(braindam/4)) message = stutter(message) - verb = pick("gibbers") + verb = "gibbers" if(prob(braindam)) message = uppertext(message) verb = "yells loudly" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5745751e219..bddd80c3775 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -290,11 +290,12 @@ proc/get_damage_icon_part(damage_state, body_part) //Robotic limbs are handled in get_icon() so all we worry about are missing or dead limbs. //No icon stored, so we need to start with a basic one. var/datum/organ/external/chest = get_organ("chest") - base_icon = chest.get_icon(g,fat) + if(chest) + base_icon = chest.get_icon(g,fat) - if(chest.status & ORGAN_DEAD) - base_icon.ColorTone(necrosis_color_mod) - base_icon.SetIntensity(0.7) + if(chest.status & ORGAN_DEAD) + base_icon.ColorTone(necrosis_color_mod) + base_icon.SetIntensity(0.7) for(var/datum/organ/external/part in organs) diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/metroid/say.dm index 89708595da4..f4de10ceb74 100644 --- a/code/modules/mob/living/carbon/metroid/say.dm +++ b/code/modules/mob/living/carbon/metroid/say.dm @@ -21,3 +21,16 @@ return 1 return ..() +/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) + if (speaker in Friends) + speech_buffer = list() + speech_buffer.Add(speaker) + speech_buffer.Add(lowertext(html_decode(message))) + ..() + +/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") + if (speaker in Friends) + speech_buffer = list() + speech_buffer.Add(speaker) + speech_buffer.Add(lowertext(html_decode(message))) + ..() diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 92f317e6c8b..02587d04994 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -256,7 +256,7 @@ handle_dna(C) return -/datum/species/proc/handle_dna(var/mob/living/carbon/C) //Handles DNA mutations, as that doesn't work at init. +/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. return // Used for species-specific names (Vox, etc) @@ -297,8 +297,8 @@ icobase = 'icons/mob/human_races/r_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi' path = /mob/living/carbon/human/unathi - default_language = "Sinta'unathi" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Sinta'unathi" tail = "sogtail" unarmed_type = /datum/unarmed_attack/claws primitive = /mob/living/carbon/monkey/unathi @@ -331,8 +331,8 @@ icobase = 'icons/mob/human_races/r_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi' path = /mob/living/carbon/human/tajaran - default_language = "Siik'tajr" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Siik'tajr" tail = "tajtail" unarmed_type = /datum/unarmed_attack/claws darksight = 8 @@ -364,8 +364,8 @@ icobase = 'icons/mob/human_races/r_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi' path = /mob/living/carbon/human/skrell - default_language = "Skrellian" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Skrellian" primitive = /mob/living/carbon/monkey/skrell unarmed_type = /datum/unarmed_attack/punch @@ -389,8 +389,8 @@ deform = 'icons/mob/human_races/r_def_vox.dmi' path = /mob/living/carbon/human/vox - default_language = "Vox-pidgin" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Vox-pidgin" speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 @@ -505,13 +505,11 @@ icobase = 'icons/mob/human_races/r_kidan.dmi' deform = 'icons/mob/human_races/r_def_kidan.dmi' path = /mob/living/carbon/human/kidan - default_language = "Chittin" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Chittin" unarmed_type = /datum/unarmed_attack/claws brute_mod = 0.8 - - blurb = "Kidan." flags = IS_WHITELISTED bloodflags = BLOOD_GREEN @@ -519,13 +517,11 @@ /datum/species/slime name = "Slime People" - default_language = "Bubblish" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Bubblish" path = /mob/living/carbon/human/slime primitive = /mob/living/carbon/slime unarmed_type = /datum/unarmed_attack/punch - - blurb = "Slime." flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN bloodflags = BLOOD_SLIME @@ -538,12 +534,12 @@ ..() -/datum/species/grey // /vg/ +/datum/species/grey name = "Grey" icobase = 'icons/mob/human_races/r_grey.dmi' deform = 'icons/mob/human_races/r_def_grey.dmi' - default_language = "Grey" - language = "Galactic Common" + default_language = "Galactic Common" + //language = "Grey" // Perhaps if they ever get a hivemind unarmed_type = /datum/unarmed_attack/punch darksight = 5 // BOOSTED from 2 eyes = "grey_eyes_s" @@ -551,19 +547,21 @@ brute_mod = 1.25 //greys are fragile default_genes = list(M_REMOTE_TALK) - - blurb = "Grey." primitive = /mob/living/carbon/monkey // TODO flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT -/datum/species/grey/handle_dna(var/mob/living/carbon/C) - C.dna.SetSEState(REMOTETALKBLOCK,1,1) - C.mutations |= M_REMOTE_TALK - genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) +/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove) + if(!remove) + C.dna.SetSEState(REMOTETALKBLOCK,1,1) + C.mutations |= M_REMOTE_TALK + genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) + else + C.dna.SetSEState(REMOTETALKBLOCK,0,1) + C.mutations -= M_REMOTE_TALK + genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) C.update_mutations() - ..() /datum/species/diona @@ -571,8 +569,8 @@ icobase = 'icons/mob/human_races/r_diona.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi' path = /mob/living/carbon/human/diona - default_language = "Rootspeak" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Rootspeak" unarmed_type = /datum/unarmed_attack/diona primitive = /mob/living/carbon/monkey/diona @@ -638,15 +636,13 @@ icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' path = /mob/living/carbon/human/machine - default_language = "Trinary" - language = "Galactic Common" + default_language = "Galactic Common" + language = "Trinary" unarmed_type = /datum/unarmed_attack/punch eyes = "blank_eyes" brute_mod = 1.5 burn_mod = 1.5 - - blurb = "Machine." cold_level_1 = 50 cold_level_2 = -1 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e85bd50c769..51988feaf22 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -10,9 +10,9 @@ var/list/department_radio_keys = list( ":e" = "Engineering", "#e" = "Engineering", ".e" = "Engineering", ":s" = "Security", "#s" = "Security", ".s" = "Security", ":w" = "whisper", "#w" = "whisper", ".w" = "whisper", - ":t" = "Mercenary", "#t" = "Mercenary", ".t" = "Mercenary", + ":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate", ":u" = "Supply", "#u" = "Supply", ".u" = "Supply", - ":v" = "Service", "#v" = "Service", ".v" = "Service", + ":z" = "Service", "#z" = "Service", ".z" = "Service", ":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private", ":R" = "right ear", "#R" = "right ear", ".R" = "right ear", @@ -25,9 +25,9 @@ var/list/department_radio_keys = list( ":E" = "Engineering", "#E" = "Engineering", ".E" = "Engineering", ":S" = "Security", "#S" = "Security", ".S" = "Security", ":W" = "whisper", "#W" = "whisper", ".W" = "whisper", - ":T" = "Mercenary", "#T" = "Mercenary", ".T" = "Mercenary", + ":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate", ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", - ":V" = "Service", "#V" = "Service", ".V" = "Service", + ":Z" = "Service", "#Z" = "Service", ".Z" = "Service", ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private" ) @@ -105,8 +105,6 @@ proc/get_radio_key_from_channel(var/channel) var/obj/O = I hearturfs += O.locs[1] listening_obj |= O - for(var/obj/Ob in O.contents) - listening_obj |= Ob for(var/mob/M in player_list) if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b0e11caa1a4..2136ce8b92c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -114,12 +114,16 @@ var/list/ai_list = list() //Languages add_language("Robot Talk", 1) - add_language("Galactic Common", 1) - add_language("Sol Common", 0) + add_language("Sol Common", 1) + add_language("Tradeband", 1) add_language("Sinta'unathi", 0) add_language("Siik'tajr", 0) add_language("Skrellian", 0) - add_language("Tradeband", 1) + add_language("Vox-pidgin", 0) + add_language("Rootspeak", 0) + add_language("Trinary", 1) + add_language("Chittin", 0) + add_language("Bubblish", 0) add_language("Gutter", 0) if(!safety)//Only used by AIize() to successfully spawn an AI. diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index f34ce9e7b2f..d62c5f544d4 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -86,7 +86,8 @@ //Default languages without universal translator software add_language("Sol Common", 1) add_language("Tradeband", 1) - add_language("Gutter", 1) + add_language("Gutter", 1) + add_language("Trinary", 1) //Verbs for pAI mobile form, chassis and Say flavor text verbs += /mob/living/silicon/pai/proc/choose_chassis @@ -511,3 +512,6 @@ close_up() return 2 +// No binary for pAIs. +/mob/living/silicon/pai/binarycheck() + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index f4cb6e71929..ff9b343a7b1 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -691,7 +691,7 @@ /mob/living/silicon/pai/proc/translator_toggle() - // Sol Common, Tradeband and Gutter are added with New() and are therefore the current default, always active languages + // Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages if(translator_on) translator_on = 0 @@ -699,6 +699,11 @@ remove_language("Sinta'unathi") remove_language("Siik'tajr") remove_language("Skrellian") + remove_language("Vox-pidgin") + remove_language("Rootspeak") + remove_language("Trinary") + remove_language("Chittin") + remove_language("Bubblish") src << "\blue Translator Module toggled OFF." @@ -708,5 +713,10 @@ add_language("Sinta'unathi") add_language("Siik'tajr") add_language("Skrellian") + add_language("Vox-pidgin") + add_language("Rootspeak") + add_language("Trinary") + add_language("Chittin") + add_language("Bubblish") src << "\blue Translator Module toggled ON." \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 88ddc4e8556..e83298a68eb 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -30,6 +30,9 @@ /mob/living/silicon/robot/drone/New() ..() + + remove_language("Robot Talk") + add_language("Drone Talk", 1) if(camera && "Robots" in camera.network) camera.network.Add("Engineering") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a0815664a7c..ae42fbc4697 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -176,6 +176,13 @@ rbPDA.set_name_and_job(custom_name,braintype) if(hiddenborg) rbPDA.hidden = 1 + +/mob/living/silicon/robot/binarycheck() + if(is_component_functioning("comms")) + var/datum/robot_component/RC = get_component("comms") + use_power(RC.energy_consumption) + return 1 + return 0 //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //Improved /N @@ -1471,6 +1478,16 @@ laws = new /datum/ai_laws/syndicate_override() Namepick() + +/mob/living/silicon/robot/syndicate/canUseTopic(atom/movable/M) + if(stat || lockcharge || stunned || weakened) + return + if(z in config.admin_levels) + return 1 + /*if(istype(M, /obj/machinery)) + var/obj/machinery/Machine = M + return Machine.emagged*/ + return 1 /mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname) if(!connected_ai) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index f38319e2129..5775c60da7a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -64,6 +64,11 @@ R.add_language("Sinta'unathi", 0) R.add_language("Siik'tajr", 0) R.add_language("Skrellian", 0) + R.add_language("Vox-pidgin", 0) + R.add_language("Rootspeak", 0) + R.add_language("Trinary", 1) + R.add_language("Chittin", 0) + R.add_language("Bubblish", 0) R.add_language("Gutter", 0) /obj/item/weapon/robot_module/standard @@ -262,12 +267,15 @@ /obj/item/weapon/robot_module/butler/add_languages(var/mob/living/silicon/robot/R) //full set of languages R.add_language("Sol Common", 1) - R.add_language("Sinta'unathi", 1) - R.add_language("Siik'maas", 1) - R.add_language("Siik'tajr", 0) - R.add_language("Skrellian", 1) - R.add_language("Rootspeak", 1) R.add_language("Tradeband", 1) + R.add_language("Sinta'unathi", 1) + R.add_language("Siik'tajr", 1) + R.add_language("Skrellian", 1) + R.add_language("Vox-pidgin", 1) + R.add_language("Rootspeak", 1) + R.add_language("Trinary", 1) + R.add_language("Chittin", 1) + R.add_language("Bubblish", 1) R.add_language("Gutter", 1) /* diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index fe1d9490e45..86da14df0e7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -8,6 +8,7 @@ var/list/alarms_to_clear = list() immune_to_ssd = 1 var/list/hud_list[10] + var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/designation = "" @@ -206,6 +207,37 @@ show_emergency_shuttle_eta() show_system_integrity() show_malf_ai() + +//Silicon mob language procs + +/mob/living/silicon/can_speak(datum/language/speaking) + return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language + +/mob/living/silicon/add_language(var/language, var/can_speak=1) + if (..(language) && can_speak) + speech_synthesizer_langs.Add(all_languages[language]) + return 1 + +/mob/living/silicon/remove_language(var/rem_language) + ..(rem_language) + + for (var/datum/language/L in speech_synthesizer_langs) + if (L.name == rem_language) + speech_synthesizer_langs -= L + +/mob/living/silicon/check_languages() + set name = "Check Known Languages" + set category = "IC" + set src = usr + + var/dat = "Known Languages

" + + for(var/datum/language/L in languages) + if(!(L.flags & NONGLOBAL)) + dat += "[L.name] (:[L.key])
Speech Synthesizer: [(L in speech_synthesizer_langs)? "YES":"NOT SUPPORTED"]
[L.desc]

" + + src << browse(dat, "window=checklanguage") + return // this function displays the stations manifest in a separate window /mob/living/silicon/proc/show_station_manifest() @@ -258,6 +290,9 @@ set category = "IC" flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1) + +/mob/living/silicon/binarycheck() + return 1 /mob/living/silicon/proc/toggle_sensor_mode() var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical","Disable") diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 3b199250101..50334dbdf27 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -106,50 +106,6 @@ if(!by_gamemode) request_player() - -/mob/living/simple_animal/borer/say(var/message) - - message = trim_strip_html_properly(message) - message = capitalize(message) - - if(!message) - return - - if (stat == 2) - return say_dead(message) - - if (stat) - return - - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - - if (copytext(message, 1, 2) == "*") - return emote(copytext(message, 2)) - - var/datum/language/L = parse_language(message) - if(L && L.flags & HIVEMIND) - L.broadcast(src,trim(copytext(message,3)),src.truename) - return - - if(!host) - //TODO: have this pick a random mob within 3 tiles to speak for the borer. - src << "You have no host to speak to." - return //No host, no audible speech. - - src << "You drop words into [host]'s mind: \"[message]\"" - host << "Your own thoughts speak: \"[message]\"" - - for (var/mob/M in player_list) - if (istype(M, /mob/new_player)) - continue - else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) - M << "[src.truename] whispers to [host], \"[message]\"" - /mob/living/simple_animal/borer/Stat() ..() statpanel("Status") diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm deleted file mode 100644 index 0024865acf0..00000000000 --- a/code/modules/organs/organ_alien.dm +++ /dev/null @@ -1,229 +0,0 @@ -//DIONA ORGANS. -/datum/organ/internal/diona - removed_type = /obj/item/organ/diona - -/datum/organ/internal/diona/process() - return - -/datum/organ/internal/diona/strata - name = "neural strata" - parent_organ = "chest" - -/datum/organ/internal/diona/bladder - name = "gas bladder" - parent_organ = "head" - -/datum/organ/internal/diona/polyp - name = "polyp segment" - parent_organ = "groin" - -/datum/organ/internal/diona/ligament - name = "anchoring ligament" - parent_organ = "groin" - -/datum/organ/internal/diona/node - name = "receptor node" - parent_organ = "head" - removed_type = /obj/item/organ/diona/node - -/datum/organ/internal/diona/nutrients - name = "nutrient vessel" - parent_organ = "chest" - removed_type = /obj/item/organ/diona/nutrients - -/obj/item/organ/diona - name = "diona nymph" - icon = 'icons/obj/objects.dmi' - icon_state = "nymph" - organ_tag = "special" // Turns into a nymph instantly, no transplanting possible. - -/obj/item/organ/diona/removed(var/mob/living/target,var/mob/living/user) - - ..() - var/mob/living/carbon/human/H = target - if(!istype(target)) - del(src) - - if(!H.internal_organs.len) - H.death() - - //This is a terrible hack and I should be ashamed. - var/datum/seed/diona = seed_types["diona"] - if(!diona) - del(src) - - spawn(1) // So it has time to be thrown about by the gib() proc. - var/mob/living/carbon/alien/diona/D = new(get_turf(src)) - diona.request_player(D) - del(src) - -// These are different to the standard diona organs as they have a purpose in other -// species (absorbing radiation and light respectively) -/obj/item/organ/diona/nutrients - name = "nutrient vessel" - organ_tag = "nutrient vessel" - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - -/obj/item/organ/diona/nutrients/removed() - return - -/obj/item/organ/diona/node - name = "receptor node" - organ_tag = "receptor node" - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - -/obj/item/organ/diona/node/removed() - return - -//CORTICAL BORER ORGANS. -/datum/organ/internal/borer - name = "cortical borer" - parent_organ = "head" - removed_type = /obj/item/organ/borer - vital = 1 - -/datum/organ/internal/borer/process() - - // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss. - for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine")) - if(owner.reagents.get_reagent_amount(chem) < 3) - owner.reagents.add_reagent(chem, 5) - - // They're also super gross and ooze ichor. - if(prob(5)) - var/mob/living/carbon/human/H = owner - if(!istype(H)) - return - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list - blood_splatter(H,B,1) - var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) - if(goo) - goo.name = "husk ichor" - goo.desc = "It's thick and stinks of decay." - goo.basecolor = "#412464" - goo.update_icon() - -/obj/item/organ/borer - name = "cortical borer" - icon = 'icons/obj/objects.dmi' - icon_state = "borer" - organ_tag = "brain" - desc = "A disgusting space slug." - -/obj/item/organ/borer/removed(var/mob/living/target,var/mob/living/user) - - ..() - - var/mob/living/simple_animal/borer/B = target.has_brain_worms() - if(B) - B.leave_host() - B.ckey = target.ckey - - spawn(0) - del(src) - -//XENOMORPH ORGANS -/datum/organ/internal/xenos/eggsac - name = "egg sac" - parent_organ = "groin" - removed_type = /obj/item/organ/xenos/eggsac - -/datum/organ/internal/xenos/plasmavessel - name = "plasma vessel" - parent_organ = "chest" - removed_type = /obj/item/organ/xenos/plasmavessel - var/stored_plasma = 0 - var/max_plasma = 500 - -/datum/organ/internal/xenos/plasmavessel/queen - name = "bloated plasma vessel" - stored_plasma = 200 - max_plasma = 500 - -/datum/organ/internal/xenos/plasmavessel/sentinel - stored_plasma = 100 - max_plasma = 250 - -/datum/organ/internal/xenos/plasmavessel/hunter - name = "tiny plasma vessel" - stored_plasma = 100 - max_plasma = 150 - -/datum/organ/internal/xenos/acidgland - name = "acid gland" - parent_organ = "head" - removed_type = /obj/item/organ/xenos/acidgland - -/datum/organ/internal/xenos/hivenode - name = "hive node" - parent_organ = "chest" - removed_type = /obj/item/organ/xenos/hivenode - -/datum/organ/internal/xenos/resinspinner - name = "resin spinner" - parent_organ = "head" - removed_type = /obj/item/organ/xenos/resinspinner - -/obj/item/organ/xenos - name = "xeno organ" - icon = 'icons/effects/blood.dmi' - desc = "It smells like an accident in a chemical factory." - -/obj/item/organ/xenos/eggsac - name = "egg sac" - icon_state = "xgibmid1" - organ_tag = "egg sac" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - icon_state = "xgibdown1" - organ_tag = "plasma vessel" - -/obj/item/organ/xenos/acidgland - name = "acid gland" - icon_state = "xgibtorso" - organ_tag = "acid gland" - -/obj/item/organ/xenos/hivenode - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "hive node" - -/obj/item/organ/xenos/resinspinner - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "resin spinner" - -//VOX ORGANS. -/datum/organ/internal/stack - name = "cortical stack" - removed_type = /obj/item/organ/stack - parent_organ = "head" - robotic = 2 - vital = 1 - var/backup_time = 0 - var/datum/mind/backup - -/datum/organ/internal/stack/process() - if(owner && owner.stat != 2 && !is_broken()) - backup_time = world.time - if(owner.mind) backup = owner.mind - -/datum/organ/internal/stack/vox - removed_type = /obj/item/organ/stack/vox - -/datum/organ/internal/stack/vox/stack - -/obj/item/organ/stack - name = "cortical stack" - icon_state = "brain-prosthetic" - organ_tag = "stack" - robotic = 2 - prosthetic_name = null - prosthetic_icon = null - -/obj/item/organ/stack/vox - name = "vox cortical stack" \ No newline at end of file diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm deleted file mode 100644 index fad2dc243fc..00000000000 --- a/code/modules/organs/organ_objects.dm +++ /dev/null @@ -1,270 +0,0 @@ -/obj/item/organ - name = "organ" - desc = "It looks like it probably just plopped out." - icon = 'icons/obj/surgery.dmi' - icon_state = "appendix" - - health = 100 // Process() ticks before death. - - var/fresh = 3 // Squirts of blood left in it. - var/dead_icon // Icon used when the organ dies. - var/robotic // Is the limb prosthetic? - var/organ_tag // What slot does it go in? - var/organ_type = /datum/organ/internal // Used to spawn the relevant organ data when produced via a machine or spawn(). - var/datum/organ/internal/organ_data // Stores info when removed. - var/prosthetic_name = "prosthetic organ" // Flavour string for robotic organ. - var/prosthetic_icon // Icon for robotic organ. - -/obj/item/organ/attack_self(mob/user as mob) - - // Convert it to an edible form, yum yum. - if(!robotic && user.a_intent == "help" && user.zone_sel.selecting == "mouth") - bitten(user) - return - -/obj/item/organ/New() - ..() - create_reagents(5) - if(!robotic) - processing_objects += src - spawn(1) - update() - -/obj/item/organ/Del() - if(!robotic) processing_objects -= src - ..() - -/obj/item/organ/process() - - if(robotic) - processing_objects -= src - return - - // Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature? - if(istype(loc,/obj/item/device/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer)) - return - - if(fresh && prob(40)) - fresh-- - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list - blood_splatter(src,B,1) - - health -= rand(1,3) - if(health <= 0) - die() - -/obj/item/organ/proc/die() - name = "dead [initial(name)]" - if(dead_icon) icon_state = dead_icon - health = 0 - processing_objects -= src - //TODO: Grey out the icon state. - //TODO: Inject an organ with peridaxon to make it alive again. - -/obj/item/organ/proc/roboticize() - - robotic = (organ_data && organ_data.robotic) ? organ_data.robotic : 1 - - if(prosthetic_name) - name = prosthetic_name - - if(prosthetic_icon) - icon_state = prosthetic_icon - else - //TODO: convert to greyscale. - -/obj/item/organ/proc/update() - - if(!organ_data) - organ_data = new /datum/organ/internal() - - if(robotic) - organ_data.robotic = robotic - - if(organ_data.robotic >= 2) - roboticize() - -// Brain is defined in brain_item.dm. -/obj/item/organ/heart - name = "heart" - icon_state = "heart-on" - prosthetic_name = "circulatory pump" - prosthetic_icon = "heart-prosthetic" - organ_tag = "heart" - fresh = 6 // Juicy. - dead_icon = "heart-off" - -/obj/item/organ/lungs - name = "lungs" - icon_state = "lungs" - gender = PLURAL - prosthetic_name = "gas exchange system" - prosthetic_icon = "lungs-prosthetic" - organ_tag = "lungs" - -/obj/item/organ/kidneys - name = "kidneys" - icon_state = "kidneys" - gender = PLURAL - prosthetic_name = "prosthetic kidneys" - prosthetic_icon = "kidneys-prosthetic" - organ_tag = "kidneys" - -/obj/item/organ/eyes - name = "eyeballs" - icon_state = "eyes" - gender = PLURAL - prosthetic_name = "visual prosthesis" - prosthetic_icon = "eyes-prosthetic" - organ_tag = "eyes" - - var/eye_colour - -/obj/item/organ/liver - name = "liver" - icon_state = "liver" - prosthetic_name = "toxin filter" - prosthetic_icon = "liver-prosthetic" - organ_tag = "liver" - -/obj/item/organ/appendix - name = "appendix" - icon_state = "appendix" - organ_tag = "appendix" - -//These are here so they can be printed out via the fabricator. -/obj/item/organ/heart/prosthetic - robotic = 2 - -/obj/item/organ/lungs/prosthetic - robotic = 2 - -/obj/item/organ/kidneys/prosthetic - robotic = 2 - -/obj/item/organ/eyes/prosthetic - robotic = 2 - -/obj/item/organ/liver/prosthetic - robotic = 2 - -/obj/item/organ/appendix - name = "appendix" - -/obj/item/organ/proc/removed(var/mob/living/carbon/human/target,var/mob/living/user) - - if(!istype(target) || !organ_data) - return - - target.internal_organs_by_name[organ_tag] = null - target.internal_organs_by_name -= organ_tag - target.internal_organs -= organ_data - - var/datum/organ/external/affected = target.get_organ(organ_data.parent_organ) - affected.internal_organs -= organ_data - - loc = target.loc - organ_data.rejecting = null - var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list - if(!organ_blood || !organ_blood.data["blood_DNA"]) - target.vessel.trans_to(src, 5, 1, 1) - - if(target && user && organ_data.vital) - user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)])" - target.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])" - msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") - target.death() - -/obj/item/organ/appendix/removed(var/mob/living/target,var/mob/living/user) - - ..() - - var/inflamed = 0 - /* for(var/datum/disease/appendicitis/appendicitis in target.viruses) - inflamed = 1 - appendicitis.cure() - target.resistances += appendicitis */ - - if(inflamed) - icon_state = "appendixinflamed" - name = "inflamed appendix" - -/obj/item/organ/eyes/removed(var/mob/living/target,var/mob/living/user) - - if(!eye_colour) - eye_colour = list(0,0,0) - - ..() //Make sure target is set so we can steal their eye colour for later. - var/mob/living/carbon/human/H = target - if(istype(H)) - eye_colour = list( - H.r_eyes ? H.r_eyes : 0, - H.g_eyes ? H.g_eyes : 0, - H.b_eyes ? H.b_eyes : 0 - ) - - // Leave bloody red pits behind! - H.r_eyes = 128 - H.g_eyes = 0 - H.b_eyes = 0 - H.update_body() - -/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/datum/organ/external/affected) - - if(!istype(target)) return - - var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list - if(!transplant_blood) - organ_data.transplant_data = list() - organ_data.transplant_data["species"] = target.species.name - organ_data.transplant_data["blood_type"] = target.dna.b_type - organ_data.transplant_data["blood_DNA"] = target.dna.unique_enzymes - else - organ_data.transplant_data = list() - organ_data.transplant_data["species"] = transplant_blood.data["species"] - organ_data.transplant_data["blood_type"] = transplant_blood.data["blood_type"] - organ_data.transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"] - - organ_data.organ_holder = null - organ_data.owner = target - target.internal_organs |= organ_data - affected.internal_organs |= organ_data - target.internal_organs_by_name[organ_tag] = organ_data - organ_data.status |= ORGAN_CUT_AWAY - - del(src) - -/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target) - - // Apply our eye colour to the target. - if(istype(target) && eye_colour) - target.r_eyes = eye_colour[1] - target.g_eyes = eye_colour[2] - target.b_eyes = eye_colour[3] - target.update_body() - ..() - -/obj/item/organ/proc/bitten(mob/user) - - if(robotic) - return - - user << "\blue You take an experimental bite out of \the [src]." - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list - blood_splatter(src,B,1) - - - user.drop_from_inventory(src) - var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src)) - O.name = name - O.icon_state = dead_icon ? dead_icon : icon_state - - // Pass over the blood. - reagents.trans_to(O, reagents.total_volume) - - if(fingerprints) O.fingerprints = fingerprints.Copy() - if(fingerprintshidden) O.fingerprintshidden = fingerprintshidden.Copy() - if(fingerprintslast) O.fingerprintslast = fingerprintslast - - user.put_in_active_hand(O) - del(src) \ No newline at end of file diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 98726004ea4..7beff751760 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -21,8 +21,6 @@ var/list/alldepartments = list() var/department = "Unknown" // our department var/destination = "Central Command" // the department we're sending to - - var/data[0] /obj/machinery/photocopier/faxmachine/New() ..() @@ -51,6 +49,7 @@ var/list/alldepartments = list() user << "You swipe the card through [src], but nothing happens." /obj/machinery/photocopier/faxmachine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] if(scan) data["scan_name"] = scan.name else @@ -142,8 +141,7 @@ var/list/alldepartments = list() else if(istype(copyitem, /obj/item/weapon/photo)) copyitem.name = "[(n_name ? text("[n_name]") : "photo")]" else if(istype(copyitem, /obj/item/weapon/paper_bundle)) - copyitem.name = "[(n_name ? text("[n_name]") : "paper")]" - data["name"] = copyitem.name + copyitem.name = "[(n_name ? text("[n_name]") : "paper")]" nanomanager.update_uis(src) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 4567d00bfde..ab5653e0d1a 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -62,7 +62,7 @@ build_path = /obj/item/weapon/circuitboard/bodyscanner category = list("Medical Machinery") -/datum/design/sleep_console +/datum/design/bodyscanner_console name = "Machine Board (Body Scanner Console)" desc = "Allows for the construction of circuit boards used to build a Body Scanner Console." id = "bodyscanner_console" diff --git a/config/example/config.txt b/config/example/config.txt index a26aa4575d6..454dcca2d0c 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -256,7 +256,7 @@ ADMIN_LEVELS 2 CONTACT_LEVELS 1;5 ## Defines all Z-levels a character can typically reach -PLAYER_LEVELS 1;3;4;5;6 +PLAYER_LEVELS 1;3;4;5;6;7 ## Expected round length in minutes EXPECTED_ROUND_LENGTH 120 diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm index 75a770d8900..77c8ce078cd 100644 --- a/maps/cyberiad.dmm +++ b/maps/cyberiad.dmm @@ -10987,7 +10987,7 @@ "edo" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "labor_camp_north_outer"; locked = 1; name = "Labor Camp Airlock"; opacity = 1; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "edp" = (/obj/machinery/light/small{dir = 1},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "labor_camp_north_sensor"; pixel_x = -8; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "labor_camp_north_pump"},/obj/machinery/door_control{id = "Labor"; name = "Labor Camp Lockdown"; pixel_x = 0; pixel_y = -28; req_access_txt = "2"},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{id_tag = "labor_camp_north_airlock"; master_tag = "labor_camp_dock"; pixel_y = 30; req_access_txt = "2"; req_one_access_txt = "0"; tag_airpump = "labor_camp_north_pump"; tag_chamber_sensor = "labor_camp_north_sensor"; tag_exterior_door = "labor_camp_north_outer"; tag_interior_door = "labor_camp_north_inner"},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "edq" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "labor_camp_north_inner"; locked = 1; name = "Labor Camp Airlock"; opacity = 1; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) -"edr" = (/obj/machinery/door/poddoor/preopen{id = "Labor"; name = "labor camp blast door"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "labor_camp_north_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) +"edr" = (/obj/machinery/door/poddoor/preopen{id = "Labor"; name = "labor camp blast door"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "labor_camp_north_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/machinery/door/airlock/glass_security{name = "Labor Camp Shuttle Cockpit"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "eds" = (/turf/simulated/floor,/area/mine/laborcamp) "edt" = (/obj/machinery/mineral/processing_unit_console{machinedir = 6},/turf/simulated/wall,/area/mine/laborcamp) "edu" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 2; id = "gulag"},/obj/machinery/mineral/input,/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)