diff --git a/code/datums/helper_datums/tension.dm b/code/datums/helper_datums/tension.dm
index 0a5a7a153c6..a10682869d7 100644
--- a/code/datums/helper_datums/tension.dm
+++ b/code/datums/helper_datums/tension.dm
@@ -228,6 +228,9 @@ var/global/datum/tension/tension_master
spawn(6000)
supress = 0
+ else if (href_list["ToggleStatus"])
+ config.Tensioner_Active = !config.Tensioner_Active
+
proc/makeMalfAImode()
@@ -235,7 +238,7 @@ var/global/datum/tension/tension_master
var/mob/living/silicon/malfAI = null
var/datum/mind/themind = null
- for(var/mob/living/silicon/ai in world)
+ for(var/mob/living/silicon/ai/ai in world)
if(ai.client)
AIs += ai
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index f39138fd25c..e7ffe922c50 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -187,7 +187,7 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
if(sent_strike_team&&side=="heel"&&antagonist_list.len)//If a strike team was sent, murder them all like a champ.
for(current_mind in antagonist_list)//Search and destroy. Since we already have an antagonist list, they should appear there.
- if(current_mind.special_role=="Death Commando")
+ if(current_mind && current_mind.special_role=="Death Commando")
commando_list += current_mind
if(commando_list.len)//If there are living commandos still in play.
for(var/mob/living/carbon/human/commando in commando_list)
@@ -232,10 +232,14 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
if(1)//kill
current_mind = pick(hostile_targets)
- var/datum/objective/assassinate/ninja_objective = new
- ninja_objective.owner = ninja_mind
- ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))//If they have a special role, use that instead to find em.
- ninja_mind.objectives += ninja_objective
+ if(current_mind)
+ var/datum/objective/assassinate/ninja_objective = new
+ ninja_objective.owner = ninja_mind
+ ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))//If they have a special role, use that instead to find em.
+ ninja_mind.objectives += ninja_objective
+
+ else
+ i++
hostile_targets -= current_mind//Remove them from the list.
if(2)//Steal
@@ -248,19 +252,29 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
if(3)//Protect. Keeping people alive can be pretty difficult.
current_mind = pick(friendly_targets)
- var/datum/objective/protect/ninja_objective = new
- ninja_objective.owner = ninja_mind
- ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
- ninja_mind.objectives += ninja_objective
+ if(current_mind)
+
+ var/datum/objective/protect/ninja_objective = new
+ ninja_objective.owner = ninja_mind
+ ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
+ ninja_mind.objectives += ninja_objective
+
+ else
+ i++
friendly_targets -= current_mind
if(4)//Debrain
current_mind = pick(hostile_targets)
- var/datum/objective/debrain/ninja_objective = new
- ninja_objective.owner = ninja_mind
- ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
- ninja_mind.objectives += ninja_objective
+ if(current_mind)
+
+ var/datum/objective/debrain/ninja_objective = new
+ ninja_objective.owner = ninja_mind
+ ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
+ ninja_mind.objectives += ninja_objective
+
+ else
+ i++
hostile_targets -= current_mind//Remove them from the list.
if(5)//Download research
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index e6880eb09a7..a4492b2b3d7 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -112,7 +112,7 @@
if (href_list["time"])
var/time = text2num(href_list["time"])
src.timeleft += time
- src.timeleft = min(max(round(src.timeleft), 5), 600)
+ src.timeleft = min(max(round(src.timeleft), 60), 600)
if (href_list["timer"])
if (src.timing == -1.0)
return
@@ -217,9 +217,9 @@
/obj/item/weapon/disk/nuclear/Del()
- if (ticker.mode && ticker.mode.name == "nuclear emergency")
- if(blobstart.len > 0)
- var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
- message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
- log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
- ..()
+// if (ticker.mode && ticker.mode.name == "nuclear emergency")
+ if(blobstart.len > 0)
+ var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
+ message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+ log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+..()
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 47fb555059e..e0dd9ed0544 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -41,6 +41,12 @@
icon_state = "pinonfar"
spawn(5) .()
+ examine()
+ ..()
+ for(var/obj/machinery/nuclearbomb/bomb in world)
+ if(bomb.timing)
+ usr << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
+
/obj/item/weapon/pinpointer/advpinpointer
name = "Advanced Pinpointer"
diff --git a/code/game/turf.dm b/code/game/turf.dm
index 7aa015542db..a5c9b66c80e 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -1269,18 +1269,8 @@ turf/simulated/floor/return_siding_icon_state()
// Okay, so let's make it so that people can travel z levels but not nuke disks!
// if(ticker.mode.name == "nuclear emergency") return
-
- if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels
- return
-
- if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear)))
- if(istype(A, /mob/living))
- var/mob/living/MM = A
- if(MM.client)
- MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
- return
-
- else if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") Sandbox_Spacemove(A)
+ if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox")
+ Sandbox_Spacemove(A)
else
if (src.x <= 2 || A.x >= (world.maxx - 1) || src.y <= 2 || A.y >= (world.maxy - 1))
@@ -1288,6 +1278,18 @@ turf/simulated/floor/return_siding_icon_state()
del(A)
return
+ if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level.
+ return
+
+ if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear)))
+ if(istype(A, /mob/living))
+ var/mob/living/MM = A
+ if(MM.client)
+ MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
+ return
+
+
+
var/move_to_z_str = pickweight(accessable_z_levels)
var/move_to_z = text2num(move_to_z_str)
@@ -1295,8 +1297,11 @@ turf/simulated/floor/return_siding_icon_state()
if(!move_to_z)
return
+
+
A.z = move_to_z
+
if(src.x <= 2)
A.x = world.maxx - 2
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index c8ab5664db1..8868bd5da51 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -205,6 +205,7 @@
verbs += /client/proc/tension_report
verbs += /client/proc/jumptocoord
verbs += /client/proc/deadmin_self
+ verbs += /client/proc/startSinglo
if (holder.level >= 3)//Trial Admin********************************************************************
verbs += /obj/admins/proc/toggleaban //abandon mob
@@ -414,6 +415,7 @@
verbs -= /client/proc/toggle_gravity_off
verbs -= /client/proc/toggle_random_events
verbs -= /client/proc/deadmin_self
+ verbs -= /client/proc/startSinglo
verbs -= /client/proc/jumptocoord
verbs -= /client/proc/everyone_random
verbs -= /client/proc/cmd_switch_radio
@@ -701,6 +703,38 @@
admins.Remove(src.ckey)
usr << "You are now a normal player."
+/client/proc/startSinglo()
+ set name = "Singlo Starter"
+ set category = "Debug"
+ set desc = "Starts a self-sustaining, stable singlo. This artifical singlo does not have a gravitational pull."
+
+ for(var/obj/machinery/emitter/E in world)
+ if(E.anchored)
+ E.active = 1
+
+ for(var/obj/machinery/field_generator/F in world)
+ if(F.anchored)
+ F.Varedit_start = 1
+ spawn(30)
+ for(var/obj/machinery/the_singularitygen/G in world)
+ if(G.anchored)
+ var/obj/machinery/singularity/S = new /obj/machinery/singularity(get_turf(G), 50)
+ spawn(0)
+ del(G)
+ S.energy = 1750
+ S.current_size = 7
+ S.icon = '224x224.dmi'
+ S.icon_state = "singularity_s7"
+ S.pixel_x = -96
+ S.pixel_y = -96
+ S.grav_pull = 0
+ //S.consume_range = 3
+ S.dissipate = 0
+ //S.dissipate_delay = 10
+ //S.dissipate_track = 0
+ //S.dissipate_strength = 10
+
+
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Toggle most admin verb visibility"
set category = "Admin"
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index e2285de931b..f585110bf6c 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -227,6 +227,7 @@
Increase Tension by 50000
Tension per player: [tension_master.score/tension_master.get_num_players()]
Tensioner Debug Data: R1:[tension_master.round1] R2:[tension_master.round2] R3:[tension_master.round3] R4:[tension_master.round4] ES: [tension_master.eversupressed] CD: [tension_master.cooldown]
+Current Tensioner Status: [config.Tensioner_Active]. Toggle?
"
Recommendations: All the modes. All of them. Press all of them.