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"