diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index b69081b0df..d5d67badc0 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -97,8 +97,11 @@
/proc/communications_blackout(var/silent = 1)
- //Uncomment below if you want communication blackouts to have a warning.
- if(!silent) command_alert("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT")
+ if(!silent)
+ command_alert("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT")
+ else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
+ for(var/mob/living/silicon/ai/A in player_list)
+ A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT"
for(var/obj/machinery/telecomms/T in telecomms_list)
T.emp_act(1)
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 7109f932aa..830ffd47ab 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -20,15 +20,21 @@
var/planted = 0 // Is it occupied?
var/harvest = 0 //Ready to harvest?
var/obj/item/seeds/myseed = null // The currently planted seed
- New()
+
+/obj/machinery/hydroponics/bullet_act(var/obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
+ if(istype(Proj ,/obj/item/projectile/energy/floramut))
+ if(src.planted)
+ src.mutate()
+ else if(istype(Proj ,/obj/item/projectile/energy/florayield))
+ if(src.planted && src.myseed.yield == 0)//Oh god don't divide by zero you'll doom us all.
+ src.myseed.yield += 1
+ //world << "Yield increased by 1, from 0, to a total of [src.myseed.yield]"
+ else if (src.planted && (prob(1/(src.myseed.yield * src.myseed.yield) *100)))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
+ src.myseed.yield += 1
+ //world << "Yield increased by 1, to a total of [src.myseed.yield]"
+ else
..()
- bullet_act(var/obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
- if(istype(Proj ,/obj/item/projectile/energy/floramut))
- if(src.planted)
- src.mutate()
- else if(istype(Proj ,/obj/item/projectile/energy/florayield))
- if(src.planted && src.myseed.yield < 2)
- src.myseed.yield += 1
+ return
/obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 521565eb22..8063c39ced 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -210,7 +210,8 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(prob(100/severity))
if(!(stat & EMPED))
stat |= EMPED
- spawn(1600/severity)
+ var/duration = (300 * 10)/severity
+ spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
stat &= ~EMPED
..()
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 466125addb..61435c7569 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -723,7 +723,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(signal)
if(signal.data["done"])
useTC = 1
- if(P.loc.z in signal.data["level"])
+ var/turf/pos = get_turf(P)
+ if(pos.z in signal.data["level"])
useTC = 2
//Let's make this barely readable
if(signal.data["compression"] > 0)
diff --git a/code/game/objects/structures/stool_chair_bed.dm b/code/game/objects/structures/stool_chair_bed.dm
index 448c4829ab..6946f2a9fd 100644
--- a/code/game/objects/structures/stool_chair_bed.dm
+++ b/code/game/objects/structures/stool_chair_bed.dm
@@ -76,7 +76,7 @@
if(buckled_mob != user)
buckled_mob.visible_message(\
"\blue [buckled_mob.name] was unbuckled by [user.name]!",\
- "You unbuckled from [src] by [user.name].",\
+ "You were unbuckled from [src] by [user.name].",\
"You hear metal clanking")
else
buckled_mob.visible_message(\
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index ccb9dab50f..33a841e88e 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -15,6 +15,10 @@
return ..()
+/turf/Click()
+ if(!isAI(usr))
+ ..()
+
/turf/New()
..()
for(var/atom/movable/AM as mob|obj in src)
@@ -987,7 +991,7 @@
new /obj/structure/girder(src)
src.ReplaceWithFloor()
for(var/turf/simulated/floor/target_tile in range(0,src))
- //skytodo:
+ //skytodo
/*if(target_tile.parent && target_tile.parent.group_processing)
target_tile.parent.suspend_group_processing()*/
var/datum/gas_mixture/napalm = new
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 39fd0e2286..1b87ab61ac 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -298,7 +298,6 @@
switchCamera(locate(href_list["switchcamera"])) in cameranet.cameras
if (href_list["showalerts"])
ai_alerts()
-
//Carn: holopad requests
if (href_list["jumptoholopad"])
var/obj/machinery/hologram/holopad/H = locate(href_list["jumptoholopad"])
@@ -474,18 +473,18 @@
L[A.name] = list(A, (C) ? C : O, list(alarmsource))
if (O)
if (C && C.can_use())
- src << "--- [class] alarm detected in [A.name]! ([C.c_tag])"
+ queueAlarm("--- [class] alarm detected in [A.name]! ([C.c_tag])", class)
else if (CL && CL.len)
var/foo = 0
var/dat2 = ""
for (var/obj/machinery/camera/I in CL)
dat2 += text("[][]", (!foo) ? "" : " | ", src, I, I.c_tag) //I'm not fixing this shit...
foo = 1
- src << text ("--- [] alarm detected in []! ([])", class, A.name, dat2)
+ queueAlarm(text ("--- [] alarm detected in []! ([])", class, A.name, dat2), class)
else
- src << text("--- [] alarm detected in []! (No Camera)", class, A.name)
+ queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, A.name), class)
else
- src << text("--- [] alarm detected in []! (No Camera)", class, A.name)
+ queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, A.name), class)
if (viewalerts) ai_alerts()
return 1
@@ -502,7 +501,7 @@
cleared = 1
L -= I
if (cleared)
- src << text("--- [] alarm in [] has been cleared.", class, A.name)
+ queueAlarm(text("--- [] alarm in [] has been cleared.", class, A.name), class, 0)
if (viewalerts) ai_alerts()
return !cleared
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index b72c39c0c6..4e0551c7b9 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -65,6 +65,12 @@
del(eyeobj) // No AI, no Eye
..()
+/atom/proc/move_camera_by_click()
+ if(istype(usr, /mob/living/silicon/ai))
+ var/mob/living/silicon/ai/AI = usr
+ if(AI.client.eye == AI.eyeobj)
+ AI.eyeobj.setLoc(src)
+
// This will move the AIEye. It will also cause lights near the eye to light up, if toggled.
// This is handled in the proc below this one.
diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
index f921cdecd5..03429b3420 100644
--- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
@@ -8,13 +8,6 @@
/turf/proc/visibilityChanged()
cameranet.updateVisibility(src)
-/atom/proc/move_camera_by_click()
- if(istype(usr, /mob/living/silicon/ai))
- var/mob/living/silicon/ai/AI = usr
- if(AI.client.eye == AI.eyeobj)
- AI.eyeobj.setLoc(src)
-
-/*
/turf/simulated/Del()
visibilityChanged()
..()
@@ -23,6 +16,8 @@
..()
visibilityChanged()
+/*
+
// STRUCTURES
/obj/structure/Del()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 0830eb361d..7a885d8bb5 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -345,7 +345,7 @@
else if (O && istype(O, /obj/machinery/camera))
C = O
L[A.name] = list(A, (C) ? C : O, list(alarmsource))
- src << text("--- [class] alarm detected in [A.name]!")
+ queueAlarm(text("--- [class] alarm detected in [A.name]!"), class)
// if (viewalerts) robot_alerts()
return 1
@@ -363,7 +363,7 @@
cleared = 1
L -= I
if (cleared)
- src << text("--- [class] alarm in [A.name] has been cleared.")
+ queueAlarm(text("--- [class] alarm in [A.name] has been cleared."), class, 0)
// if (viewalerts) robot_alerts()
return !cleared
@@ -813,6 +813,10 @@
src << browse(null, t1)
return
+ if (href_list["showalerts"])
+ robot_alerts()
+ return
+
if (href_list["mod"])
var/obj/item/O = locate(href_list["mod"])
O.attack_self(src)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 81db1563ba..fd3ce047c3 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -4,6 +4,12 @@
voice_name = "synthesized voice"
var/syndicate = 0
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
+ var/list/alarms_to_show = list()
+ var/list/alarms_to_clear = list()
+
+
+ var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
+ var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
/mob/living/silicon/proc/cancelAlarm()
return
@@ -14,6 +20,68 @@
/mob/living/silicon/proc/show_laws()
return
+/mob/living/silicon/proc/queueAlarm(var/message, var/type, var/incoming = 1)
+ var/in_cooldown = (alarms_to_show.len > 0 || alarms_to_clear.len > 0)
+ if(incoming)
+ alarms_to_show += message
+ alarm_types_show[type] += 1
+ else
+ alarms_to_clear += message
+ alarm_types_clear[type] += 1
+
+ if(!in_cooldown)
+ spawn(10 * 10) // 10 seconds
+
+ if(alarms_to_show.len < 5)
+ for(var/msg in alarms_to_show)
+ src << msg
+ else if(alarms_to_show.len)
+
+ var/msg = "--- "
+
+ if(alarm_types_show["Motion"])
+ msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - "
+
+ if(alarm_types_show["Fire"])
+ msg += "FIRE: [alarm_types_show["Fire"]] Fire alarms detected. - "
+
+ if(alarm_types_show["Atmosphere"])
+ msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - "
+
+ if(alarm_types_show["Power"])
+ msg += "POWER: [alarm_types_show["Power"]] alarms detected. - "
+
+ msg += "\[Show Alerts\]"
+ src << msg
+
+ if(alarms_to_clear.len < 3)
+ for(var/msg in alarms_to_clear)
+ src << msg
+
+ else if(alarms_to_clear.len)
+ var/msg = "--- "
+
+ if(alarm_types_clear["Motion"])
+ msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - "
+
+ if(alarm_types_clear["Fire"])
+ msg += "FIRE: [alarm_types_clear["Fire"]] Fire alarms cleared. - "
+
+ if(alarm_types_clear["Atmosphere"])
+ msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - "
+
+ if(alarm_types_clear["Power"])
+ msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - "
+
+ msg += "\[Show Alerts\]"
+ src << msg
+
+
+ alarms_to_show = list()
+ alarms_to_clear = list()
+ alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
+ alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
+
/mob/living/silicon/drop_item()
return
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 22a0571c04..c7dee0e2c1 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -108,7 +108,7 @@
if ((killing == 2 && state == 3))
if(assailant.loc != kill_loc)
for(var/mob/O in viewers(assailant, null))
- O.show_message(text("\red [] lost his tightened grip on []'s neck!", assailant, affecting), 1)
+ O.show_message(text("\red [] lost \his tightened grip on []'s neck!", assailant, affecting), 1)
killing = 0
hud1.icon_state = "disarm/kill"
return
@@ -134,7 +134,7 @@
if (state >= 3)
if (!( killing ))
for(var/mob/O in viewers(assailant, null))
- O.show_message(text("\red [] has temporarily tightened his grip on []!", assailant, affecting), 1)
+ O.show_message(text("\red [] has temporarily tightened \his grip on []!", assailant, affecting), 1)
//Foreach goto(97)
assailant.next_move = world.time + 10
//affecting.stunned = max(2, affecting.stunned)
@@ -198,7 +198,7 @@
return
for(var/mob/O in viewers(assailant, null))
- O.show_message(text("\red [] has reinforced his grip on [] (now neck)!", assailant, affecting), 1)
+ O.show_message(text("\red [] has reinforced \his grip on [] (now neck)!", assailant, affecting), 1)
state = 3
icon_state = "grabbed+1"
@@ -212,7 +212,7 @@
else
if (state >= 3 && !killing)
for(var/mob/O in viewers(assailant, null))
- O.show_message(text("\red [] starts to tighten his grip on []'s neck!", assailant, affecting), 1)
+ O.show_message(text("\red [] starts to tighten \his grip on []'s neck!", assailant, affecting), 1)
hud1.icon_state = "disarm/kill1"
killing = 1
if(do_after(assailant, 50))
@@ -227,7 +227,7 @@
killing = 2
kill_loc = assailant.loc
for(var/mob/O in viewers(assailant, null))
- O.show_message(text("\red [] has tightened his grip on []'s neck!", assailant, affecting), 1)
+ O.show_message(text("\red [] has tightened \his grip on []'s neck!", assailant, affecting), 1)
affecting.attack_log += text("\[[time_stamp()]\] Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])")
assailant.attack_log += text("\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])")
log_attack("[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])")
@@ -236,7 +236,7 @@
affecting.losebreath += 1
else
for(var/mob/O in viewers(assailant, null))
- O.show_message(text("\red [] was unable to tighten his grip on []'s neck!", assailant, affecting), 1)
+ O.show_message(text("\red [] was unable to tighten \his grip on []'s neck!", assailant, affecting), 1)
killing = 0
hud1.icon_state = "disarm/kill"
return
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 5e12670cc2..7225b022cf 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -80,10 +80,9 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays.
- var/mob/living/L = target
if(prob(15))
- L.apply_effect((rand(30,80)),IRRADIATE)
- L.Weaken(5)
+ M.apply_effect((rand(30,80)),IRRADIATE)
+ M.Weaken(5)
for (var/mob/V in viewers(src))
V.show_message("\red [M] writhes in pain as \his vacuoles boil.", 3, "\red You hear the crunching of leaves.", 2)
if(prob(35))
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index dab5c460ec..a9a052506c 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1095,8 +1095,8 @@ datum
name = "The Doctor's Delight"
id = "doctordelight"
result = "doctorsdelight"
- required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1)
- result_amount = 4
+ required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "tricordrazine" = 1)
+ result_amount = 5
irish_cream
name = "Irish Cream"
diff --git a/maps/tgstation.2.0.9.dmm b/maps/tgstation.2.0.9.dmm
index 79f650c74a..f36b7b9a9f 100755
--- a/maps/tgstation.2.0.9.dmm
+++ b/maps/tgstation.2.0.9.dmm
@@ -6359,7 +6359,7 @@
"cso" = (/obj/machinery/mech_bay_recharge_port,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad)
"csp" = (/obj/mecha/combat/marauder/mauler,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership)
"csq" = (/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership)
-"csr" = (/turf/space,/area/start)
+"csr" = (/turf/unsimulated/wall{icon = 'icons/misc/fullscreen.dmi'; icon_state = "title"},/area/start)
"css" = (/obj/structure/closet/acloset,/turf/unsimulated/floor{icon_state = "floor5"},/area/alien)
"cst" = (/turf/unsimulated/wall{icon_state = "plasma2"},/area/alien)
"csu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad)