diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm
index 0bcdf892f47..89f116aee8d 100644
--- a/code/modules/chemical/Chemistry-Recipes.dm
+++ b/code/modules/chemical/Chemistry-Recipes.dm
@@ -608,7 +608,7 @@ datum
name = "Metroid Teleport"
id = "m_tele"
result = null
- required_reagents = list("plasma" = 1, "acid" = 1)
+ required_reagents = list("plasma" = 1, "pacid" = 2, "mutagen" = 3)
result_amount = 1
required_container = /obj/item/metroid_core
required_other = 4
@@ -638,8 +638,9 @@ datum
var/y_distance = TO.y - FROM.y
var/x_distance = TO.x - FROM.x
- for (var/atom/movable/A in range(3, FROM )) // iterate thru list of mobs in the area
- if(A == chosen) continue // don't teleport the actual beacon that's just stupid as fukkkkk
+ for (var/atom/movable/A in range(2, FROM )) // iterate thru list of mobs in the area
+ if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
+ if(A.anchored) continue // don't teleport anchored things (computers, tables, windows, grilles, etc) because this causes problems!
var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
if(!A.Move(newloc)) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
@@ -663,6 +664,8 @@ datum
+
+
metroidchloral
name = "Metroid Chloral"
id = "m_bunch"
diff --git a/code/modules/critters/critter_defenses.dm b/code/modules/critters/critter_defenses.dm
index 5d944e40acb..010b664a83c 100644
--- a/code/modules/critters/critter_defenses.dm
+++ b/code/modules/critters/critter_defenses.dm
@@ -21,23 +21,35 @@ Contains the procs that control attacking critters
if (!src.alive) ..()
if (user.a_intent == "hurt")
TakeDamage(rand(1,2) * brutevuln)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [user] punches [src]!", 1)
- playsound(src.loc, pick('punch1.ogg','punch2.ogg','punch3.ogg','punch4.ogg'), 100, 1)
+
+ if(istype(user, /mob/living/carbon/human))
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [user] has punched [src]!", 1)
+ playsound(src.loc, pick('punch1.ogg','punch2.ogg','punch3.ogg','punch4.ogg'), 100, 1)
+
+ else if(istype(user, /mob/living/carbon/alien/humanoid))
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [user] has slashed at [src]!", 1)
+ playsound(src.loc, 'slice.ogg', 25, 1, -1)
+
+ else
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [user] has bit [src]!", 1)
+
if(src.defensive) Target_Attacker(user)
else
for(var/mob/O in viewers(src, null))
- O.show_message("\red [user] touches [src]!", 1)
+ O.show_message("\blue [user] touches [src]!", 1)
Target_Attacker(var/target)
if(!target) return
src.target = target
src.oldtarget_name = target:name
- if(task != "chasing")
+ if(task != "chasing" || task != "attacking")
for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] [src.angertext] [target:name]!", 1)
- src.task = "chasing"
+ O.show_message("\red [src] [src.angertext] at [target:name]!", 1)
+ src.task = "chasing"
return