diff --git a/code/WorkInProgress/Chemistry-Recipes.dm b/code/WorkInProgress/Chemistry-Recipes.dm
index f9a8415f0fd..13466596e72 100644
--- a/code/WorkInProgress/Chemistry-Recipes.dm
+++ b/code/WorkInProgress/Chemistry-Recipes.dm
@@ -6,6 +6,11 @@ datum
var/result = null
var/list/required_reagents = new/list()
var/list/required_catalysts = new/list()
+
+ // Both of these variables are mostly going to be used with Metroid cores - but if you want to, you can use them for other things
+ var/atom/required_container = null // the container required for the reaction to happen
+ var/required_other = 0 // an integer required for the reaction to happen
+
var/result_amount = 0
proc
@@ -495,6 +500,14 @@ datum
result_amount = 5
+/////////////////////////////////////METROID CORE REACTIONS ///////////////////////////////
+
+
+ // TODO
+
+
+
+
//////////////////////////////////////////FOOD MIXTURES////////////////////////////////////
tofu
diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm
index 0b655db2ef1..70c6280d864 100644
--- a/code/WorkInProgress/Chemistry-Tools.dm
+++ b/code/WorkInProgress/Chemistry-Tools.dm
@@ -828,7 +828,7 @@
user << "\red [target] is empty."
return
- if(!target.is_open_container() && !istype(target,/obj/reagent_dispensers))
+ if(!target.is_open_container() && !istype(target,/obj/reagent_dispensers) && !istype(target,/obj/item/metroid_core))
user << "\red You cannot directly remove reagents from this object."
return
@@ -845,13 +845,18 @@
return
if(istype(target, /obj/item/weapon/implantcase/chem))
return
- if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food))
+
+ if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/metroid_core))
user << "\red You cannot directly fill this object."
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "\red [target] is full."
return
+ if(istype(target, /obj/item/metroid_core))
+ var/obj/item/metroid_core/core = target
+ core.Flush = 30
+
if(ismob(target) && target != user)
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red [] is trying to inject []!", user, target), 1)
diff --git a/code/defines/mob/living/carbon/metroid.dm b/code/defines/mob/living/carbon/metroid.dm
index cd99033c2c2..6f1f4610c5d 100644
--- a/code/defines/mob/living/carbon/metroid.dm
+++ b/code/defines/mob/living/carbon/metroid.dm
@@ -27,6 +27,8 @@
var/attacked = 0 // determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
+ var/cores = 3 // the number of /obj/item/metroid_core's the metroid has left inside
+
/mob/living/carbon/metroid/adult
name = "adult metroid"
icon = 'mob.dmi'
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 6af2c8159e0..dc8b665d5b1 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -1056,6 +1056,46 @@
//END BRAINS=====================================================
+
+
+// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere
+/obj/item/metroid_core
+ name = "metroid core"
+ desc = "A very slimy and tender part of a Metroid. They also legended to have \"magical powers\"."
+ icon = 'surgery.dmi'
+ icon_state = "metroid core"
+ flags = TABLEPASS
+ force = 1.0
+ w_class = 1.0
+ throwforce = 1.0
+ throw_speed = 3
+ throw_range = 6
+ origin_tech = "biotech=4"
+ var/POWERFLAG = 0 // sshhhhhhh
+ var/Flush = 30
+
+ New()
+ ..()
+ var/datum/reagents/R = new/datum/reagents(100)
+ reagents = R
+ R.my_atom = src
+ POWERFLAG = rand(-5,15)
+ //flags |= NOREACT
+
+ spawn()
+ Life()
+
+ proc/Life()
+ while(src)
+ sleep(10)
+ Flush--
+ if(Flush <= 0)
+ reagents.clear_reagents()
+ Flush = 30
+
+
+
+
/obj/noticeboard
name = "Notice Board"
icon = 'stationobjs.dmi'
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 2dd9fef652a..0117086e53f 100644
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -235,6 +235,7 @@
if(istype(Metroid, /mob/living/carbon/metroid/adult))
if(prob(5 + round(power/2)))
Metroid.Victim = null
+ Metroid.anchored = 0
spawn(0)
Metroid.canmove = 0
step_away(Metroid, user)
@@ -246,6 +247,7 @@
else
if(prob(10 + power*2))
Metroid.Victim = null
+ Metroid.anchored = 0
spawn(0)
step_away(Metroid, user)
Metroid.canmove = 0
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 182945dfafb..bb03ecb0ce2 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -37,7 +37,7 @@ CIRCULAR SAW
user << "\red You're going to need to remove that mask/helmet/glasses first."
return
- if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
+ if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
user << "\red You cannot locate any eyes on this creature!"
return
@@ -230,6 +230,15 @@ CIRCULAR SAW
switch(M:brain_op_stage)
if(0.0)
+ if(istype(M, /mob/living/carbon/metroid))
+ if(M.stat == 2)
+ for(var/mob/O in (viewers(M) - user - M))
+ O.show_message("\red [M.name] is beginning to have its flesh cut open with [src] by [user].", 1)
+ M << "\red [user] begins to cut open your flesh with [src]!"
+ user << "\red You cut [M]'s flesh open with [src]!"
+ M:brain_op_stage = 1.0
+ return
+
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1)
@@ -257,7 +266,25 @@ CIRCULAR SAW
M.updatehealth()
M:brain_op_stage = 1.0
+
+ if(1)
+ if(istype(M, /mob/living/carbon/metroid))
+ if(M.stat == 2)
+ for(var/mob/O in (viewers(M) - user - M))
+ O.show_message("\red [M.name] is having its silky inndards cut apart with [src] by [user].", 1)
+ M << "\red [user] begins to cut apart your innards with [src]!"
+ user << "\red You cut [M]'s silky innards apart with [src]!"
+ M:brain_op_stage = 2.0
+ return
if(2.0)
+ if(istype(M, /mob/living/carbon/metroid))
+ if(M.stat == 2)
+ var/mob/living/carbon/metroid/Metroid = M
+ if(Metroid.cores > 0)
+ if(istype(M, /mob/living/carbon/metroid))
+ user << "\red You attempt to remove [M]'s core, but your [src] is ineffective!"
+ return
+
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1)
@@ -307,7 +334,7 @@ CIRCULAR SAW
user << "\red You're going to need to remove that mask/helmet/glasses first."
return
- if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
+ if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
user << "\red You cannot locate any eyes on this creature!"
return
@@ -380,6 +407,8 @@ CIRCULAR SAW
switch(M:brain_op_stage)
if(1.0)
+ if(istype(M, /mob/living/carbon/metroid))
+ return
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1)
@@ -408,6 +437,25 @@ CIRCULAR SAW
M.updatehealth()
M:brain_op_stage = 2.0
+ if(2.0)
+ if(istype(M, /mob/living/carbon/metroid))
+ if(M.stat == 2)
+ var/mob/living/carbon/metroid/Metroid = M
+ if(Metroid.cores > 0)
+ for(var/mob/O in (viewers(M) - user - M))
+ O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1)
+
+ Metroid.cores--
+ M << "\red [user] begins to remove one of your cores with [src]! ([Metroid.cores] cores remaining)"
+ user << "\red You cut one of [M]'s cores out with [src]! ([Metroid.cores] cores remaining)"
+
+ new/obj/item/metroid_core(M.loc)
+
+ if(Metroid.cores <= 0)
+ M.icon_state = "baby metroid dead-nocore"
+
+ return
+
if(3.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b1645214403..eb29d6c043d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -82,6 +82,10 @@
loc = tmob.loc
tmob.loc = oldloc
now_pushing = 0
+ for(var/mob/living/carbon/metroid/Metroid in view(1,tmob))
+ if(Metroid.Victim == tmob)
+ Metroid.UpdateFeed()
+
return
if(istype(equipped(), /obj/item/weapon/melee/baton)) // add any other item paths you think are necessary
if(loc:sd_lumcount < 3 || blinded)
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index aeca9e4c7c6..c2b715523fd 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -431,7 +431,7 @@
if(Victim)
if(Victim == M)
- if(prob(90))
+ if(prob(60))
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("\red [M] attempts to wrestle \the [name] off!", 1)
@@ -444,12 +444,13 @@
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
Victim = null
+ anchored = 0
step_away(src,M)
return
else
- if(prob(80))
+ if(prob(30))
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("\red [M] attempts to wrestle \the [name] off of [Victim]!", 1)
@@ -462,6 +463,7 @@
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
Victim = null
+ anchored = 0
step_away(src,M)
return
@@ -505,7 +507,9 @@
if (prob(90))
if (M.mutations & HULK)
damage += 5
- if(Victim) Victim = null
+ if(Victim)
+ Victim = null
+ anchored = 0
spawn(0)
step_away(src,M,15)
@@ -592,7 +596,10 @@
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has tackled [name]!", M), 1)
- if(Victim) Victim = null
+ if(Victim)
+ Victim = null
+ anchored = 0
+
spawn(0)
step_away(src,M,15)
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index a58c98501cd..2c639867f78 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -41,6 +41,7 @@
Victim = M
src.loc = M.loc
canmove = 0
+ anchored = 1
var/lastnut = nutrition
//if(M.client) M << "\red You legs become paralyzed!"
if(istype(src, /mob/living/carbon/metroid/adult))
@@ -63,7 +64,7 @@
Victim.cloneloss += rand(1,10)
Victim.toxloss += rand(1,2)
if(Victim.health <= 0)
- Victim.toxloss += rand(2,5)
+ Victim.toxloss += rand(2,4)
if(toxloss > 0)
toxloss -= 5
@@ -109,7 +110,7 @@
Victim.updatehealth()
updatehealth()
- sleep(rand(5,25))
+ sleep(rand(15,45))
if(istype(src, /mob/living/carbon/metroid/adult))
@@ -119,6 +120,7 @@
Victim = null
canmove = 1
+ anchored = 0
if(M.health <= -70)
M.canmove = 0
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index e19a851faa0..aab5259c708 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 7550fbf7c22..9a4f4fec1b3 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 38923c20bf1..4416b69d021 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -708,8 +708,10 @@
#include "code\modules\mob\living\carbon\metroid\examine.dm"
#include "code\modules\mob\living\carbon\metroid\hud.dm"
#include "code\modules\mob\living\carbon\metroid\life.dm"
+#include "code\modules\mob\living\carbon\metroid\login.dm"
#include "code\modules\mob\living\carbon\metroid\metroid.dm"
#include "code\modules\mob\living\carbon\metroid\powers.dm"
+#include "code\modules\mob\living\carbon\metroid\say.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
#include "code\modules\mob\living\carbon\monkey\emote.dm"
#include "code\modules\mob\living\carbon\monkey\examine.dm"