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)