diff --git a/baystation12.dme b/baystation12.dme
index 039c82f9d38..f4ec3ef49a1 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -395,6 +395,7 @@
#include "code\game\events\EventProcs\ninja_abilities.dm"
#include "code\game\events\EventProcs\ninja_equipment.dm"
#include "code\game\events\EventProcs\space_ninja.dm"
+#include "code\game\events\EventProcs\spacevines.dm"
#include "code\game\events\Events\AlienInfestation.dm"
#include "code\game\events\Events\Appendicitis.dm"
#include "code\game\events\Events\ElectricalStorm.dm"
diff --git a/code/game/events/EventProcs/miniblob.dm b/code/game/events/EventProcs/miniblob.dm
index ed390a2148f..f81fda88197 100644
--- a/code/game/events/EventProcs/miniblob.dm
+++ b/code/game/events/EventProcs/miniblob.dm
@@ -6,7 +6,7 @@
for(var/atom/A in T)
if(A.density)
del(A)
- 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/events/EventProcs/kudzu.dm b/code/game/events/EventProcs/spacevines.dm
similarity index 51%
rename from code/game/events/EventProcs/kudzu.dm
rename to code/game/events/EventProcs/spacevines.dm
index 17d2215eb85..8f279d51f04 100644
--- a/code/game/events/EventProcs/kudzu.dm
+++ b/code/game/events/EventProcs/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,65 @@
..()
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
+// if(/obj/item/weapon/hatchet) del src
+ if(/obj/item/weapon/melee/energy) 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 +86,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 +114,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 +203,23 @@
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/areapath in typesof(/area/hallway))
+ var/area/hallway/A = locate(areapath)
+ 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/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm
index d8862fd976a..c392932ff22 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"))
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 769dd0d59f3..163ca0e9dd1 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1724,6 +1724,11 @@ var/global/BSACooldown = 0
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)
@@ -2260,6 +2265,7 @@ var/global/BSACooldown = 0
Spawn an Immovable Rod
Toggle a "lights out" event
Spawn an Ion Storm
+Spawn Space-Vines
Fun Secrets
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 03bda28715b..41425cf2c04 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -190,7 +190,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 a6522dc2a14..0f65c3a370a 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -133,7 +133,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 6efbd7c08ef..149218e5720 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/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 469395cd2b6..f9785682fd9 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -56,6 +56,7 @@
mmi.brainmob.key = key
else//If the brain does have a mind. Also shouldn't happen but who knows.
mmi.brainmob.key = key
+
mmi = null
..()
@@ -67,13 +68,16 @@
return
switch(mod)
if("Standard")
+ updatename()
module = new /obj/item/weapon/robot_module/standard(src)
hands.icon_state = "standard"
icon_state = "robot"
modtype = "Stand"
+ //feedback_inc("cyborg_standard",1)
channels = list()
if("Service")
+ updatename(mod)
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")
@@ -88,17 +92,21 @@
else
icon_state = "Service2"
modtype = "Butler"
+ //feedback_inc("cyborg_service",1)
channels = list()
if("Miner")
+ updatename(mod)
module = new /obj/item/weapon/robot_module/miner(src)
hands.icon_state = "miner"
icon_state = "Miner"
modtype = "Miner"
+ //feedback_inc("cyborg_miner",1)
channels = list("Mining" = 1)
if("Medical")
var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid")
+ updatename(mod)
module = new /obj/item/weapon/robot_module/medical(src)
hands.icon_state = "medical"
if (sprite == "Humanoid")
@@ -107,10 +115,12 @@
src.icon_state = "surgeon"
modtype = "Med"
nopush = 1
+ //feedback_inc("cyborg_medical",1)
channels = list("Medical" = 1)
if("Security")
var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid")
+ updatename(mod)
module = new /obj/item/weapon/robot_module/security(src)
hands.icon_state = "security"
if (sprite == "Humanoid")
@@ -119,8 +129,10 @@
src.icon_state = "bloodhound"
modtype = "Sec"
channels = list("Security" = 1)
+ //feedback_inc("cyborg_security",1)
if("Engineering")
+ updatename(mod)
var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid")
module = new /obj/item/weapon/robot_module/engineering(src)
hands.icon_state = "engineer"
@@ -129,9 +141,11 @@
if (sprite == "Non-Humanoid")
src.icon_state = "landmate"
modtype = "Eng"
+ //feedback_inc("cyborg_engineering",1)
channels = list("Engineering" = 1)
if("Janitor")
+ updatename(mod)
var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid")
module = new /obj/item/weapon/robot_module/janitor(src)
hands.icon_state = "janitor"
@@ -140,12 +154,22 @@
if (sprite == "Non-Humanoid")
src.icon_state = "mopgearrex"
modtype = "Jan"
+ //feedback_inc("cyborg_janitor",1)
channels = list()
overlays -= "eyes" //Takes off the eyes that it started with
radio.config(channels)
updateicon()
+/mob/living/silicon/robot/proc/updatename(var/prefix as text)
+ if( length(real_name) < 7 || !prefix ) return
+ //not really necessary but just to avoid annoying people with
+ //unique names seeming as nobody could give me a straight answer as
+ //to whether to remove custom borg names completely.
+ if(copytext(real_name, 1, 7) == "Cyborg")
+ real_name = "[prefix] [real_name]"
+ name = real_name
+
/mob/living/silicon/robot/verb/cmd_robot_alerts()
set category = "Robot Commands"
set name = "Show Alerts"
@@ -352,6 +376,9 @@
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
+ return
+
if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
if(getBruteLoss() == 0)
user << "There are no dents to fix here!"
@@ -492,6 +519,41 @@
spark_system.start()
return ..()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
@@ -1044,5 +1106,6 @@ Frequency:
del(module)
/mob/living/silicon/robot/proc/self_destruct()
- gib(1)
+ gib()
+ return
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 e358be33532..af29baf48f3 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]."
@@ -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
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index fa68830205f..c6acb29eb54 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -191,7 +191,6 @@ field_generator power level display
src.cleanup()
update_icon()
-
turn_on()
active = 1
warming_up = 1
@@ -351,3 +350,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/singularity.dm b/code/modules/power/singularity/singularity.dm
index 01f9160cec1..9c98d192c99 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -30,8 +30,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 2806c862c25..d9606bcd987 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -73,6 +73,10 @@
icon_state = "heavylaser"
damage = 60
+/obj/item/projectile/beam/emitter
+ name = "emitter beam"
+ icon_state = "emitter"
+
diff --git a/icons/effects/kudzu.dmi b/icons/effects/kudzu.dmi
deleted file mode 100644
index 5d00a913f38..00000000000
Binary files a/icons/effects/kudzu.dmi and /dev/null differ
diff --git a/icons/effects/spacevines.dmi b/icons/effects/spacevines.dmi
new file mode 100644
index 00000000000..7087416ae70
Binary files /dev/null and b/icons/effects/spacevines.dmi differ