diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 66d33b5bead..0822256a695 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -630,7 +630,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if (alert(src, "Are you sure you want to do this? It will laaag.", "Confirmation", "Yes", "No") == "No")
return
- explosion (O, devastation, heavy, light, flash)
+ explosion(O, devastation, heavy, light, flash)
log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])", 1)
feedback_add_details("admin_verb","EXPL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 10ebd1e2a8b..5fe835c7ba3 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -101,80 +101,6 @@ I kind of like the right click only--the window version can get a little confusi
src << "\green Target is too far away."
return
-/mob/living/carbon/alien/humanoid/verb/ventcrawl() // -- TLE
- set name = "Crawl through Vent"
- set desc = "Enter an air vent and crawl through the pipes."
- set category = "Alien"
-// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
-// return
-
- if(powerc())
- var/obj/machinery/atmospherics/unary/vent_pump/vent_found
- for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
- if(!v.welded)
- vent_found = v
- else
- src << "\red That vent is welded."
- if(vent_found)
- var/list/vents = list()
- if(vent_found.network&&vent_found.network.normal_members.len)
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
- if(temp_vent.loc == loc)
- continue
- if(temp_vent.welded)
- continue
- vents.Add(temp_vent)
- var/list/choices = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
- if(vent.loc.z != loc.z)
- continue
- if(vent.welded)
- continue
- var/atom/a = get_turf_loc(vent)
- choices.Add(a.loc)
- var/turf/startloc = loc
- var/obj/selection = input("Select a destination.", "Duct System") in sortAtom(choices)
- var/selection_position = choices.Find(selection)
- if(loc==startloc)
-
- // Hacky way of hopefully preventing a runtime error from happening
- if(vents.len < selection_position)
- vents.len = selection_position//What the fuck is this I dont even, Right will likely have to fix this later
-
- var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position]
- if(target_vent)
- for(var/mob/O in viewers(src, null))
- O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
- // var/list/huggers = list()
- // for(var/obj/effect/alien/facehugger/F in view(3, src))
- // if(istype(F, /obj/effect/alien/facehugger))
- // huggers.Add(F)
- loc = vent_found
-
- // for(var/obj/effect/alien/facehugger/F in huggers)
- // F.loc = vent_found
- var/travel_time = get_dist(loc, target_vent.loc)
-
- spawn(round(travel_time/2))//give sound warning to anyone near the target vent
- if(!target_vent.welded)
- for(var/mob/O in hearers(target_vent, null))
- O.show_message("You hear something crawling through the ventilation pipes.",2)
-
- spawn(travel_time)
- if(target_vent.welded)//the vent can be welded while alien scrolled through the list or travelled.
- target_vent = vent_found //travel back. No additional time required.
- src << "\red The vent you were heading to appears to be welded."
- loc = target_vent.loc
-// for(var/obj/effect/alien/facehugger/F in huggers)
-// F.loc = loc
-
- else
- src << "\green You need to remain still while entering a vent."
- else
- src << "\green This vent is not connected to anything."
- else
- src << "\green You must be standing on or beside an open air vent to enter it."
- return
/mob/living/carbon/alien/humanoid/proc/neurotoxin(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 91a93d498a0..fd040971307 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -13,19 +13,20 @@
real_name = src.name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin)
- verbs -= /mob/living/carbon/alien/humanoid/verb/ventcrawl
+ verbs -= /mob/living/carbon/alien/verb/ventcrawl
/mob/living/carbon/alien/humanoid/queen
updatehealth()
- if (src.nodamage == 0)
- //oxyloss is only used for suicide
- //toxloss isn't used for aliens, its actually used as alien powers!!
- src.health = 250 - src.getOxyLoss() - src.getFireLoss() - src.getBruteLoss()
- else
+ if (src.nodamage)
src.health = 250
src.stat = 0
+ else
+ //oxyloss is only used for suicide
+ //toxloss isn't used for aliens, its actually used as alien powers!!
+ src.health = 250 - src.getOxyLoss() - src.getFireLoss() - src.getBruteLoss()
+
handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index 97a44f39787..15c02bfb393 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -1,47 +1,3 @@
-/mob/living/carbon/alien/larva/verb/ventcrawl() // -- TLE
- set name = "Crawl through Vent"
- set desc = "Enter an air vent and crawl through the pipe system."
- set category = "Alien"
-
-// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
-// return
- if(powerc())
- var/obj/machinery/atmospherics/unary/vent_pump/vent_found
- for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
- if(!v.welded)
- vent_found = v
- else
- src << "\red That vent is welded."
- if(vent_found)
- if(vent_found.network&&vent_found.network.normal_members.len)
- var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
- if(temp_vent.loc == loc)
- continue
- vents.Add(temp_vent)
- var/list/choices = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
- if(vent.loc.z != loc.z)
- continue
- var/atom/a = get_turf_loc(vent)
- choices.Add(a.loc)
- var/turf/startloc = loc
- var/obj/selection = input("Select a destination.", "Duct System") in sortAtom(choices)
- var/selection_position = choices.Find(selection)
- if(loc==startloc)
- var/obj/target_vent = vents[selection_position]
- if(target_vent)
- for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
- loc = target_vent.loc
- else
- src << "\green You need to remain still while entering a vent."
- else
- src << "\green This vent is not connected to anything."
- else
- src << "\green You must be standing on or beside an air vent to enter it."
- return
/mob/living/carbon/alien/larva/verb/hide()
set name = "Hide"
diff --git a/code/modules/mob/living/carbon/alien/powers.dm b/code/modules/mob/living/carbon/alien/powers.dm
new file mode 100644
index 00000000000..47059c78e32
--- /dev/null
+++ b/code/modules/mob/living/carbon/alien/powers.dm
@@ -0,0 +1,5 @@
+/mob/living/carbon/alien/verb/ventcrawl() // -- TLE
+ set name = "Crawl through Vent"
+ set desc = "Enter an air vent and crawl through the pipe system."
+ set category = "Alien"
+ handle_ventcrawl()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 6ba7f7506e9..652e2e3eb7f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -245,3 +245,80 @@
dna = newDNA
// ++++ROCKDTBEN++++ MOB PROCS //END
+
+/mob/living/carbon/proc/handle_ventcrawl() // -- TLE -- Merged by Carn
+
+ if(!stat)
+ if(!lying)
+
+ var/obj/machinery/atmospherics/unary/vent_pump/vent_found
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
+ if(!v.welded)
+ vent_found = v
+ else
+ src << "\red That vent is welded."
+
+ if(vent_found)
+ if(vent_found.network&&vent_found.network.normal_members.len)
+ var/list/vents[0]
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
+ if(temp_vent.loc == loc)
+ continue
+ var/turf/T = get_turf(temp_vent)
+
+ if(!T || T.z != loc.z)
+ continue
+
+ var/i = 1
+ var/index = "[T.loc.name]\[[i]\]"
+ while(index in vents)
+ i++
+ index = "[T.loc.name]\[[i]\]"
+ vents[index] = temp_vent
+
+ var/turf/startloc = loc
+ var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortList(vents)
+ if(!selection) return
+ if(loc==startloc)
+ if(contents.len)
+ for(var/obj/item/carried_item in contents)//If the monkey got on objects.
+ if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger
+ src << "\red You can't be carrying items or have items equipped when vent crawling!"
+ return
+ var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection]
+ if(target_vent)
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
+ loc = target_vent
+
+ var/travel_time = round(get_dist(loc, target_vent.loc) / 2)
+
+ spawn(travel_time)
+
+ if(!target_vent) return
+ for(var/mob/O in hearers(target_vent,null))
+ O.show_message("You hear something squeezing through the ventilation ducts.",2)
+
+ sleep(travel_time)
+
+ if(!target_vent) return
+ if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled.
+ target_vent = vent_found //travel back. No additional time required.
+ src << "\red The vent you were heading to appears to be welded."
+ loc = target_vent.loc
+
+ else
+ src << "You need to remain still while entering a vent."
+ else
+ src << "This vent is not connected to anything."
+
+ else
+ src << "You must be standing on or beside an air vent to enter it."
+
+ else
+ src << "You can't vent crawl while you're stunned!"
+
+ else
+ src << "You must be conscious to do this!"
+ return
+
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index 4ad92a47e17..1712d5bf766 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -6,13 +6,16 @@
name = text("baby metroid ([rand(1, 1000)])")
else
name = text("adult metroid ([rand(1,1000)])")
-
real_name = name
spawn (1)
regenerate_icons()
src << "\blue Your icons have been generated!"
..()
+/mob/living/carbon/metroid/adult/New()
+ verbs.Remove(/mob/living/carbon/metroid/verb/ventcrawl)
+ ..()
+
/mob/living/carbon/metroid/proc/mind_initialize(mob/G)
mind = new
mind.current = src
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index e7011c0f8a6..38ccf90ae3d 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -232,56 +232,5 @@
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Metroid"
-
-
- if(istype(src, /mob/living/carbon/metroid/adult))
- src << "I am much too big to fit in this small vent..."
- return
-
- if(!stat)
-
- if(Victim)
- src << "Not while I am a feeding..."
- return
- var/obj/machinery/atmospherics/unary/vent_pump/vent_found
- for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
- if(!v.welded)
- vent_found = v
- else
- src << "\red That vent is welded..."
- if(vent_found)
- if(vent_found.network&&vent_found.network.normal_members.len)
- var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
- if(temp_vent.loc == loc)
- continue
- vents.Add(temp_vent)
- var/list/choices = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
- if(vent.loc.z != loc.z)
- continue
- var/atom/a = get_turf_loc(vent)
- choices.Add(a.loc)
- var/turf/startloc = loc
- var/obj/selection = input("Select a destination.", "Duct System") in sortAtom(choices)
- var/selection_position = choices.Find(selection)
- if(loc==startloc)
- var/obj/target_vent = vents[selection_position]
- if(target_vent)
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
- loc = target_vent.loc
- else
- src << "I must remain still while entering a vent..."
- else
- src << "This vent is not connected to anything..."
- else
- src << "I must be standing on or beside an air vent to enter it..."
- else
- src << "I must be conscious to do this..."
- return
-
-
-
-
+ if(Victim) return
+ handle_ventcrawl()
diff --git a/code/modules/mob/living/carbon/monkey/powers.dm b/code/modules/mob/living/carbon/monkey/powers.dm
index 873c35dcc38..e7c6937cda2 100644
--- a/code/modules/mob/living/carbon/monkey/powers.dm
+++ b/code/modules/mob/living/carbon/monkey/powers.dm
@@ -2,51 +2,4 @@
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Monkey"
-
- if(stat == CONSCIOUS)
- if(!lying)
- var/obj/machinery/atmospherics/unary/vent_pump/vent_found
- for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
- if(!v.welded)
- vent_found = v
- else
- src << "\red That vent is welded."
- if(vent_found)
- if(vent_found.network&&vent_found.network.normal_members.len)
- var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
- if(temp_vent.loc == loc)
- continue
- vents.Add(temp_vent)
- var/list/choices = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
- if(vent.loc.z != loc.z)
- continue
- var/atom/a = get_turf_loc(vent)
- choices.Add(a.loc)
- var/turf/startloc = loc
- var/obj/selection = input("Select a destination.", "Duct System") in sortAtom(choices)
- var/selection_position = choices.Find(selection)
- if(loc==startloc)
- if(contents.len)
- for(var/obj/item/carried_item in contents)//If the monkey got on objects.
- if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant.
- src << "\red You can't be carrying items or have items equipped when vent crawling!"
- return
- var/obj/target_vent = vents[selection_position]
- if(target_vent)
- for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
- loc = target_vent.loc
- else
- src << "You need to remain still while entering a vent."
- else
- src << "This vent is not connected to anything."
- else
- src << "You must be standing on or beside an air vent to enter it."
- else
- src << "You can't vent crawl while you're stunned!"
- else
- src << "You must be conscious to do this!"
- return
\ No newline at end of file
+ handle_ventcrawl()
diff --git a/tgstation.dme b/tgstation.dme
index 3b486e968f5..c63d6205387 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -743,6 +743,7 @@
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
+#include "code\modules\mob\living\carbon\alien\powers.dm"
#include "code\modules\mob\living\carbon\alien\say.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"