diff --git a/code/defines/mob/living/silicon/robot.dm b/code/defines/mob/living/silicon/robot.dm
index ebcf1457b69..41256bd2de6 100644
--- a/code/defines/mob/living/silicon/robot.dm
+++ b/code/defines/mob/living/silicon/robot.dm
@@ -3,6 +3,7 @@
icon = 'robots.dmi'//
icon_state = "robot"
health = 300
+ canmove = 0
#define BORGMESON 1
#define BORGTHERM 2
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 3cf33b28c45..ec058932b43 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -13,11 +13,10 @@
/proc/event()
event = 1
- var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13) //so ninjas don't cause "empty" events.
+ var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13,14) //so ninjas don't cause "empty" events.
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
eventNumbersToPickFrom += 3
-
switch(pick(eventNumbersToPickFrom))
if(1)
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
@@ -83,7 +82,8 @@
appendicitis()
if(13)
IonStorm()
-
+ if(14)
+ spacevine_infestation()
/proc/power_failure()
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
diff --git a/code/game/gamemodes/events/miniblob.dm b/code/game/gamemodes/events/miniblob.dm
index 5827f9cabed..84c3598cef7 100644
--- a/code/game/gamemodes/events/miniblob.dm
+++ b/code/game/gamemodes/events/miniblob.dm
@@ -1,7 +1,7 @@
/proc/mini_blob_event()
var/turf/T = pick(blobstart)
- var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 )
+ var/obj/effect/blob/bl = new /obj/effect/blob( T, 30 )
spawn(0)
bl.Life()
bl.Life()
diff --git a/code/game/gamemodes/events/kudzu.dm b/code/game/gamemodes/events/spacevines.dm
similarity index 51%
rename from code/game/gamemodes/events/kudzu.dm
rename to code/game/gamemodes/events/spacevines.dm
index 5281f43cf57..85426583467 100644
--- a/code/game/gamemodes/events/kudzu.dm
+++ b/code/game/gamemodes/events/spacevines.dm
@@ -1,19 +1,17 @@
-// SPACE VINE OR KUDZU
-
+// SPACE VINES
/obj/effect/spacevine
- name = "Space Kudzu"
+ name = "space vines"
desc = "An extremely expansionistic species of vine."
- icon = 'kudzu.dmi'
+ icon = 'spacevines.dmi'
icon_state = "Light1"
anchored = 1
density = 0
- var/energy = 0 //Energy sounds like an arbitrary-enough variable name.
+ pass_flags = PASSTABLE | PASSGRILLE
+ var/energy = 0
var/obj/effect/spacevine_controller/master = null
New()
- if(istype(src.loc, /turf/space))
- del(src)
- return
+ return
Del()
if(master)
@@ -22,37 +20,63 @@
..()
attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (!W) return
- if (!user) return
- if (istype(W, /obj/item/weapon/circular_saw)) del src
- if (istype(W, /obj/item/weapon/kitchen/utensil/knife)) del src
- if (istype(W, /obj/item/weapon/scalpel)) del src
- if (istype(W, /obj/item/weapon/screwdriver)) del src
- if (istype(W, /obj/item/weapon/shard)) del src
- if (istype(W, /obj/item/weapon/weldingtool)) del src
- if (istype(W, /obj/item/weapon/wirecutters)) del src
+ if (!W || !user || !W.type) return
+ switch(W.type)
+ if(/obj/item/weapon/circular_saw) del src
+ if(/obj/item/weapon/kitchen/utensil/knife) del src
+ if(/obj/item/weapon/scalpel) del src
+ if(/obj/item/weapon/fireaxe) del src
+
+ //less effective weapons
+ if(/obj/item/weapon/wirecutters)
+ if(prob(25)) del src
+ if(/obj/item/weapon/shard)
+ if(prob(25)) del src
+
+ else //weapons with subtypes
+ if(istype(W, /obj/item/weapon/melee/energy/sword)) del src
+ else if(istype(W, /obj/item/weapon/weldingtool))
+ if(W:welding) del src
+ //TODO: add plant-b-gone
..()
+ attack_hand(mob/user as mob)
+ for(var/mob/M in src.loc)
+ if(M.buckled == src)
+ if(prob(50))
+ if(M == user)
+ user << "\red You break free from the vines!"
+ else
+ user << "\red You rip away at the vines and free [M]!"
+ M << "\red [user] frees you from the vines!"
+ M.buckled = null
+ else
+ user << "\red You rip away at the vines..."
+ break //only process one captured mob.
+
+ attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
/obj/effect/spacevine_controller
var/list/obj/effect/spacevine/vines = list()
var/list/growth_queue = list()
var/reached_collapse_size
var/reached_slowdown_size
//What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0,
- //meaning if you get the kudzu's size to something less than 20 plots, it won't grow anymore.
+ //meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
New()
if(!istype(src.loc,/turf/simulated/floor))
del(src)
- spawn_kudzu_piece(src.loc)
+ spawn_spacevine_piece(src.loc)
processing_objects.Add(src)
Del()
processing_objects.Remove(src)
..()
- proc/spawn_kudzu_piece(var/turf/location)
+ proc/spawn_spacevine_piece(var/turf/location)
var/obj/effect/spacevine/SV = new(location)
growth_queue += SV
vines += SV
@@ -60,7 +84,7 @@
process()
if(!vines)
- del(src) //Kudzu exterminated
+ del(src) //space vines exterminated. Remove the controller
return
if(!growth_queue)
del(src) //Sanity check
@@ -88,39 +112,47 @@
i++
queue_end += SV
growth_queue -= SV
- if(SV.energy < 2)
- if(prob(10))
+ if(SV.energy < 2) //If tile isn't fully grown
+ if(prob(20))
SV.grow()
+ else //If tile is fully grown
+ SV.grab()
+
//if(prob(25))
SV.spread()
if(i >= length)
break
growth_queue = growth_queue + queue_end
-
//sleep(5)
//src.process()
/obj/effect/spacevine/proc/grow()
- switch(energy)
- if (0)
- src.icon_state = pick("Med1", "Med2", "Med3")
- energy = 1
- src.opacity = 1
- if (1)
- src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
- energy = 2
- src.density = 1
+ if(!energy)
+ src.icon_state = pick("Med1", "Med2", "Med3")
+ energy = 1
+ src.opacity = 1
+ layer = 5
+ else
+ src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
+ energy = 2
+
+/obj/effect/spacevine/proc/grab()
+ for(var/mob/living/carbon/V in src.loc)
+ if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured
+ V.buckled = src
+ V << "\red The vines [pick("wind", "tangle")] around you!"
+ break //only capture one mob at a time.
/obj/effect/spacevine/proc/spread()
var/direction = pick(cardinal)
- if(istype(get_step(src,direction),/turf/simulated/floor))
- var/turf/simulated/floor/F = get_step(src,direction)
+ var/step = get_step(src,direction)
+ if(istype(step,/turf/simulated/floor))
+ var/turf/simulated/floor/F = step
if(!locate(/obj/effect/spacevine,F))
if(F.Enter(src))
if(master)
- master.spawn_kudzu_piece( F )
-
+ master.spawn_spacevine_piece( F )
/*
/obj/effect/spacevine/proc/Life()
@@ -169,8 +201,22 @@
if (prob(50))
del(src)
return
- else
return
-/obj/effect/spacevine/temperature_expose(null, temp, volume)
- del src
\ No newline at end of file
+/obj/effect/spacevine/temperature_expose(null, temp, volume) //hotspots kill vines
+ del src
+
+//Carn: Spacevines random event.
+/proc/spacevine_infestation()
+
+ spawn() //to stop the secrets panel hanging
+ var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
+ for(var/area/hallway/A)
+ for(var/turf/simulated/floor/F in A)
+ if(!F.contents.len)
+ turfs += F
+
+ if(turfs.len) //Pick a turf to spawn at if we can
+ var/turf/simulated/floor/T = pick(turfs)
+ new/obj/effect/spacevine_controller(T) //spawn a controller at turf
+ message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 0f456ca82ca..efe8eb5b863 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -112,7 +112,7 @@
attackby(obj/item/I as obj, mob/user as mob)
- if(src.operating) return
+ if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
src.add_fingerprint(user)
if(!src.requiresID())
user = null
diff --git a/code/game/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm
index adb586fcc59..1d4a2ab63f2 100644
--- a/code/game/objects/items/robot_parts.dm
+++ b/code/game/objects/items/robot_parts.dm
@@ -169,7 +169,7 @@
return
if(M.brainmob.mind in ticker.mode.head_revolutionaries)
- user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI."
+ user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI."
return
if(jobban_isbanned(M.brainmob, "Cyborg"))
@@ -202,8 +202,8 @@
O << "You are playing a Robot. The Robot can interact with most electronic objects in its view point."
O << "You must follow the laws that the AI has. You are the AI's assistant to the station basically."
- O << "To use something, simply double-click it."
- O << {"Use say ":s to speak to fellow cyborgs and the AI through binary."}
+ O << "To use something, simply click it."
+ O << {"Use say ":b to speak to fellow cyborgs and the AI through binary."}
O.job = "Cyborg"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index f2f32357d05..9da10040d34 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1626,6 +1626,11 @@
else
alert("You cannot perform this action. You must be of a higher administrative rank!")
return
+ if("spacevines")
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","K")
+ spacevine_infestation()
+ message_admins("[key_name_admin(usr)] has spawned spacevines", 1)
if (usr)
log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
if (ok)
@@ -2047,6 +2052,7 @@
Spawn an Immovable Rod
Toggle a "lights out" event
Spawn an Ion Storm
+Spawn Space-Vines
Fun Secrets
@@ -2529,7 +2535,6 @@
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
-
else
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
return
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index ff18e6aba82..bdd520a3b95 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -1,7 +1,7 @@
/**********************Mineral processing unit console**************************/
/obj/machinery/mineral/processing_unit_console
- name = "Produciton machine console"
+ name = "production machine console"
icon = 'mining_machines.dmi'
icon_state = "console"
density = 1
@@ -189,7 +189,7 @@
/obj/machinery/mineral/processing_unit
- name = "Furnace"
+ name = "furnace"
icon = 'mining_machines.dmi'
icon_state = "furnace"
density = 1
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index 301a2264ef9..ca56bde61ae 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -1,7 +1,7 @@
/**********************Mineral stacking unit console**************************/
/obj/machinery/mineral/stacking_unit_console
- name = "Stacking machine console"
+ name = "stacking machine console"
icon = 'mining_machines.dmi'
icon_state = "console"
density = 1
@@ -132,7 +132,7 @@
/obj/machinery/mineral/stacking_machine
- name = "Stacking machine"
+ name = "stacking machine"
icon = 'mining_machines.dmi'
icon_state = "stacker"
density = 1
diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm
index df524dfb650..66a84db5210 100644
--- a/code/modules/mining/machine_unloading.dm
+++ b/code/modules/mining/machine_unloading.dm
@@ -2,7 +2,7 @@
/obj/machinery/mineral/unloading_machine
- name = "Unloading machine"
+ name = "unloading machine"
icon = 'mining_machines.dmi'
icon_state = "unloader"
density = 1
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 2ee69c5746e..783eef7b8dd 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -20,7 +20,8 @@
use_power()
process_killswitch()
process_locks()
- update_canmove()
+ if(modtype != "robot") //only update canmove if we've selected a module
+ update_canmove()
update_mind()
diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm
index 428e78d6c27..2e46cec1ca5 100644
--- a/code/modules/mob/living/silicon/robot/login.dm
+++ b/code/modules/mob/living/silicon/robot/login.dm
@@ -8,10 +8,6 @@
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
src.verbs += /mob/proc/ghost
- if(src.real_name == "Cyborg")
- src.real_name += " "
- src.real_name += "-[rand(1, 999)]"
- src.name = src.real_name
if(!src.connected_ai)
for(var/mob/living/silicon/ai/A in world)
src.connected_ai = A
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index a0209ededd8..61b0324a9d7 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -9,9 +9,6 @@
modtype = "robot"
updateicon()
// syndicate = syndie
- if(real_name == "Cyborg")
- real_name += " [pick(rand(1, 999))]"
- name = real_name
spawn (4)
if (client)
connected_ai = activeais()
@@ -67,6 +64,7 @@
return
switch(mod)
if("Standard")
+ updatename("Cy")
module = new /obj/item/weapon/robot_module/standard(src)
hands.icon_state = "standard"
icon_state = "robot"
@@ -74,6 +72,7 @@
feedback_inc("cyborg_standard",1)
if("Service")
+ updatename("Servi")
module = new /obj/item/weapon/robot_module/butler(src)
hands.icon_state = "service"
var/icontype = input("Select an icon!", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich")
@@ -91,6 +90,7 @@
feedback_inc("cyborg_service",1)
if("Miner")
+ updatename("Digger")
module = new /obj/item/weapon/robot_module/miner(src)
hands.icon_state = "miner"
icon_state = "Miner"
@@ -98,6 +98,7 @@
feedback_inc("cyborg_miner",1)
if("Medical")
+ updatename("Medi")
module = new /obj/item/weapon/robot_module/medical(src)
hands.icon_state = "medical"
icon_state = "surgeon"
@@ -106,6 +107,7 @@
feedback_inc("cyborg_medical",1)
if("Security")
+ updatename("Securi")
module = new /obj/item/weapon/robot_module/security(src)
hands.icon_state = "security"
icon_state = "bloodhound"
@@ -113,6 +115,7 @@
feedback_inc("cyborg_security",1)
if("Engineering")
+ updatename("Engi")
module = new /obj/item/weapon/robot_module/engineering(src)
hands.icon_state = "engineer"
icon_state = "landmate"
@@ -120,6 +123,7 @@
feedback_inc("cyborg_engineering",1)
if("Janitor")
+ updatename("Jani")
module = new /obj/item/weapon/robot_module/janitor(src)
hands.icon_state = "janitor"
icon_state = "mopgearrex"
@@ -129,6 +133,18 @@
overlays -= "eyes" //Takes off the eyes that it started with
updateicon()
+/mob/living/silicon/robot/verb/updatename(var/prefix as text)
+ if(real_name == "Cyborg")
+ var/defaultname = "[prefix]borg -[rand(1,999)]"
+ var/newname = input("Please input a name", "Name selection", defaultname, null)
+ newname = copytext(sanitize(newname), 1, MAX_MESSAGE_LEN) //Sanitize the name
+
+ if(!newname)
+ newname = "[defaultname]"
+
+ real_name = newname
+ name = real_name
+
/mob/living/silicon/robot/verb/cmd_robot_alerts()
set category = "Robot Commands"
set name = "Show Alerts"
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index b729ec0e374..94b761882b4 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -7,6 +7,7 @@
anchored = 0
density = 1
directwired = 1
+ req_access = list(access_engine)
// use_power = 0
var
obj/item/weapon/tank/plasma/P = null
@@ -26,15 +27,14 @@
attack_hand(mob/user as mob)
if(anchored)
- if(!src.locked || istype(user, /mob/living/silicon))
+ if(!src.locked)
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"You turn the [src.name] [active? "on":"off"].")
return
else
- if(src.locked)
- user << "\red The controls are locked."
- return
+ user << "\red The controls are locked!"
+ return
..()
@@ -44,10 +44,10 @@
return 1
else if(istype(W, /obj/item/weapon/tank/plasma))
if(!src.anchored)
- user << "The [src] needs to be secured to the floor first."
+ user << "\red The [src] needs to be secured to the floor first."
return 1
if(src.P)
- user << "\red There appears to already be a plasma tank loaded!"
+ user << "\red There's already a plasma tank loaded."
return 1
src.P = W
W.loc = src
@@ -56,28 +56,32 @@
user.u_equip(W)
updateicon()
else if(istype(W, /obj/item/weapon/crowbar))
- if(P)
+ if(P && !src.locked)
eject()
return 1
else if(istype(W, /obj/item/weapon/wrench))
if(P)
- user << "\red Remove the plasma tank first."
+ user << "\blue Remove the plasma tank first."
return 1
playsound(src.loc, 'Ratchet.ogg', 75, 1)
src.anchored = !src.anchored
user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \
"You [anchored? "secure":"undo"] the external bolts.", \
- "You hear ratchet")
+ "You hear a ratchet")
if(anchored)
connect_to_network()
else
disconnect_from_network()
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if (src.allowed(user))
- src.locked = !src.locked
- user << "Controls are now [src.locked ? "locked." : "unlocked."]"
+ if(active)
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ src.locked = 0 //just in case it somehow gets locked
+ user << "\red The controls can only be locked when the [src] is active"
else
- user << "\red Access denied."
+ user << "\red Access denied!"
return 1
else
..()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index c794fcbbbee..7d69701c710 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -47,7 +47,7 @@
attack_hand(mob/user as mob)
src.add_fingerprint(user)
if(state == 2)
- if(!src.locked || istype(user, /mob/living/silicon))
+ if(!src.locked)
if(src.active==1)
src.active = 0
user << "You turn off the [src]."
@@ -60,9 +60,9 @@
src.use_power = 2
update_icon()
else
- user << "The controls are locked!"
+ user << "\red The controls are locked!"
else
- user << "The [src] needs to be firmly secured to the floor first."
+ user << "\red The [src] needs to be firmly secured to the floor first."
return 1
@@ -90,8 +90,7 @@
src.fire_delay = rand(20,100)
src.shot_number = 0
use_power(1000)
- var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
- A.icon_state = "emitter"
+ var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
playsound(src.loc, 'emitter.ogg', 25, 1)
if(prob(35))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
@@ -128,14 +127,14 @@
playsound(src.loc, 'Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
- "You hear ratchet")
+ "You hear a ratchet")
src.anchored = 1
if(1)
state = 0
playsound(src.loc, 'Ratchet.ogg', 75, 1)
user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
- "You hear ratchet")
+ "You hear a ratchet")
src.anchored = 0
if(2)
user << "\red The [src.name] needs to be unwelded from the floor."
@@ -160,7 +159,7 @@
user << "You weld the [src] to the floor."
W:welding = 1
else
- user << "\blue You need more welding fuel to complete this task."
+ user << "\red You need more welding fuel to complete this task."
if(2)
if (W:remove_fuel(0,user))
W:welding = 2
@@ -173,16 +172,20 @@
user << "You cut the [src] free from the floor."
W:welding = 1
else
- user << "\blue You need more welding fuel to complete this task."
+ user << "\red You need more welding fuel to complete this task."
return
- if(istype(W, /obj/item/weapon/card/id))//The slot is too small for PDAs
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
if(emagged)
user << "\red The lock seems to be broken"
return
if(src.allowed(user))
- src.locked = !src.locked
- user << "Controls are now [src.locked ? "locked." : "unlocked."]"
+ if(active)
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ src.locked = 0 //just in case it somehow gets locked
+ user << "\red The controls can only be locked when the [src] is online"
else
user << "\red Access denied."
return
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 1dfb4e694e5..034269b94f3 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -190,7 +190,6 @@ field_generator power level display
src.cleanup()
update_icon()
-
turn_on()
active = 1
warming_up = 1
@@ -342,3 +341,15 @@ field_generator power level display
connected_gens.Remove(FG)
connected_gens = list()
clean_up = 0
+
+ //This is here to help fight the "hurr durr, release singulo cos nobody will notice before the
+ //singulo eats the evidence". It's not fool-proof but better than nothing.
+ //I want to avoid using global variables.
+ spawn(1)
+ var/temp = 1 //stops spam
+ for(var/obj/machinery/singularity/O in world)
+ if(O.last_warning && temp)
+ if((world.time - O.last_warning) > 50) //to stop message-spam
+ temp = 0
+ message_admins("A singulo exists and a containment field has failed.",1)
+ O.last_warning = world.time
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index a88aed835c4..9cf20a8f394 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -42,11 +42,11 @@
if(anchored)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
- "You hear ratchet")
+ "You hear a ratchet")
else
user.visible_message("[user.name] unsecures [src.name] from the floor.", \
"You unsecure the [src.name] from the floor.", \
- "You hear ratchet")
+ "You hear a ratchet")
return
return ..()
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 8690e9fcb2c..7093fe95e68 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -29,8 +29,17 @@ var/global/list/uneatable = list(
target = null //its target. moves towards the target if it has one
last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
teleport_del = 0
+ last_warning
New(loc, var/starting_energy = 50, var/temp = 0)
+ //CARN: admin-alert for chuckle-fuckery.
+ last_warning = world.time
+ var/count = 0
+ for(var/obj/machinery/containment_field/CF in world)
+ count = 1
+ break
+ if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1)
+
src.energy = starting_energy
if(temp)
spawn(temp)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 24f24d39751..343841f0f3c 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -34,6 +34,9 @@
icon_state = "heavylaser"
damage = 60
+/obj/item/projectile/beam/emitter
+ name = "emitter beam"
+ icon_state = "emitter"
diff --git a/html/changelog.html b/html/changelog.html
index ff7a7cb6ff3..4b77c119211 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -92,6 +92,16 @@ should be listed in the changelog upon commit tho. Thanks. -->
+