diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/dead/corpse.dm
similarity index 96%
rename from code/modules/mob/living/simple_animal/corpse.dm
rename to code/modules/mob/dead/corpse.dm
index 62b2c43fe8..81a51214a7 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/dead/corpse.dm
@@ -1,170 +1,170 @@
-//Meant for simple animals to drop lootable human bodies.
-
-//If someone can do this in a neater way, be my guest-Kor
-
-//This has to be seperate from the Away Mission corpses, because New() doesn't work for those, and initialize() doesn't work for these.
-
-//To do: Allow corpses to appear mangled, bloody, etc. Allow customizing the bodies appearance (they're all bald and white right now).
-
-
-/obj/effect/landmark/mobcorpse
- name = "Unknown"
- var/mobname = "Unknown" //Unused now but it'd fuck up maps to remove it now
- var/corpseuniform = null //Set this to an object path to have the slot filled with said object on the corpse.
- var/corpsesuit = null
- var/corpseshoes = null
- var/corpsegloves = null
- var/corpseradio = null
- var/corpseglasses = null
- var/corpsemask = null
- var/corpsehelmet = null
- var/corpsebelt = null
- var/corpsepocket1 = null
- var/corpsepocket2 = null
- var/corpseback = null
- var/corpseid = 0 //Just set to 1 if you want them to have an ID
- var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
- var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
- var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID
-
-/obj/effect/landmark/mobcorpse/New()
- createCorpse()
-
-/obj/effect/landmark/mobcorpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
- var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
- M.real_name = src.name
- M.stat = 2 //Kills the new mob
- if(src.corpseuniform)
- M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
- if(src.corpsesuit)
- M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
- if(src.corpseshoes)
- M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
- if(src.corpsegloves)
- M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
- if(src.corpseradio)
- M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
- if(src.corpseglasses)
- M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
- if(src.corpsemask)
- M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
- if(src.corpsehelmet)
- M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
- if(src.corpsebelt)
- M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
- if(src.corpsepocket1)
- M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
- if(src.corpsepocket2)
- M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
- if(src.corpseback)
- M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
- if(src.corpseid == 1)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- var/datum/job/jobdatum
- for(var/jobtype in typesof(/datum/job))
- var/datum/job/J = new jobtype
- if(J.title == corpseidaccess)
- jobdatum = J
- break
- if(src.corpseidicon)
- W.icon_state = corpseidicon
- if(src.corpseidaccess)
- if(jobdatum)
- W.access = jobdatum.get_access()
- else
- W.access = list()
- if(corpseidjob)
- W.assignment = corpseidjob
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
- delete_me = 1
- qdel(src)
-
-
-
-//List of different corpse types
-
-/obj/effect/landmark/mobcorpse/syndicatesoldier
- name = "Mercenary"
- corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/armor/vest
- corpseshoes = /obj/item/clothing/shoes/boots/swat
- corpsegloves = /obj/item/clothing/gloves/swat
- corpseradio = /obj/item/device/radio/headset
- corpsemask = /obj/item/clothing/mask/gas
- corpsehelmet = /obj/item/clothing/head/helmet/swat
- corpseback = /obj/item/weapon/storage/backpack
- corpseid = 1
- corpseidjob = "Operative"
- corpseidaccess = "Syndicate"
-
-/obj/effect/landmark/mobcorpse/solarpeacekeeper
- name = "Mercenary"
- corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/armor/pcarrier/blue/sol
- corpseshoes = /obj/item/clothing/shoes/boots/swat
- corpsegloves = /obj/item/clothing/gloves/swat
- corpseradio = /obj/item/device/radio/headset
- corpsemask = /obj/item/clothing/mask/gas
- corpsehelmet = /obj/item/clothing/head/helmet/swat
- corpseback = /obj/item/weapon/storage/backpack
- corpseid = 1
- corpseidjob = "Peacekeeper"
- corpseidaccess = "Syndicate"
-
-/obj/effect/landmark/mobcorpse/syndicatecommando
- name = "Syndicate Commando"
- corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/space/void/merc
- corpseshoes = /obj/item/clothing/shoes/boots/swat
- corpsegloves = /obj/item/clothing/gloves/swat
- corpseradio = /obj/item/device/radio/headset
- corpsemask = /obj/item/clothing/mask/gas/syndicate
- corpsehelmet = /obj/item/clothing/head/helmet/space/void/merc
- corpseback = /obj/item/weapon/tank/jetpack/oxygen
- corpsepocket1 = /obj/item/weapon/tank/emergency/oxygen
- corpseid = 1
- corpseidjob = "Operative"
- corpseidaccess = "Syndicate"
-
-
-
-/obj/effect/landmark/mobcorpse/clown
- name = "Clown"
- corpseuniform = /obj/item/clothing/under/rank/clown
- corpseshoes = /obj/item/clothing/shoes/clown_shoes
- corpseradio = /obj/item/device/radio/headset
- corpsemask = /obj/item/clothing/mask/gas/clown_hat
- corpsepocket1 = /obj/item/weapon/bikehorn
- corpseback = /obj/item/weapon/storage/backpack/clown
- corpseid = 1
- corpseidjob = "Clown"
- corpseidaccess = "Clown"
-
-
-
-/obj/effect/landmark/mobcorpse/pirate
- name = "Pirate"
- corpseuniform = /obj/item/clothing/under/pirate
- corpseshoes = /obj/item/clothing/shoes/boots/jackboots
- corpseglasses = /obj/item/clothing/glasses/eyepatch
- corpsehelmet = /obj/item/clothing/head/bandana
-
-
-
-/obj/effect/landmark/mobcorpse/pirate/ranged
- name = "Pirate Gunner"
- corpsesuit = /obj/item/clothing/suit/pirate
- corpsehelmet = /obj/item/clothing/head/pirate
-
-
-
-/obj/effect/landmark/mobcorpse/russian
- name = "Russian"
- corpseuniform = /obj/item/clothing/under/soviet
- corpseshoes = /obj/item/clothing/shoes/boots/jackboots
- corpsehelmet = /obj/item/clothing/head/bearpelt
-
-/obj/effect/landmark/mobcorpse/russian/ranged
+//Meant for simple animals to drop lootable human bodies.
+
+//If someone can do this in a neater way, be my guest-Kor
+
+//This has to be seperate from the Away Mission corpses, because New() doesn't work for those, and initialize() doesn't work for these.
+
+//To do: Allow corpses to appear mangled, bloody, etc. Allow customizing the bodies appearance (they're all bald and white right now).
+
+
+/obj/effect/landmark/mobcorpse
+ name = "Unknown"
+ var/mobname = "Unknown" //Unused now but it'd fuck up maps to remove it now
+ var/corpseuniform = null //Set this to an object path to have the slot filled with said object on the corpse.
+ var/corpsesuit = null
+ var/corpseshoes = null
+ var/corpsegloves = null
+ var/corpseradio = null
+ var/corpseglasses = null
+ var/corpsemask = null
+ var/corpsehelmet = null
+ var/corpsebelt = null
+ var/corpsepocket1 = null
+ var/corpsepocket2 = null
+ var/corpseback = null
+ var/corpseid = 0 //Just set to 1 if you want them to have an ID
+ var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
+ var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
+ var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID
+
+/obj/effect/landmark/mobcorpse/New()
+ createCorpse()
+
+/obj/effect/landmark/mobcorpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
+ var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
+ M.real_name = src.name
+ M.stat = 2 //Kills the new mob
+ if(src.corpseuniform)
+ M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
+ if(src.corpsesuit)
+ M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
+ if(src.corpseshoes)
+ M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
+ if(src.corpsegloves)
+ M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
+ if(src.corpseradio)
+ M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
+ if(src.corpseglasses)
+ M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
+ if(src.corpsemask)
+ M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
+ if(src.corpsehelmet)
+ M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
+ if(src.corpsebelt)
+ M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
+ if(src.corpsepocket1)
+ M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
+ if(src.corpsepocket2)
+ M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
+ if(src.corpseback)
+ M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
+ if(src.corpseid == 1)
+ var/obj/item/weapon/card/id/W = new(M)
+ W.name = "[M.real_name]'s ID Card"
+ var/datum/job/jobdatum
+ for(var/jobtype in typesof(/datum/job))
+ var/datum/job/J = new jobtype
+ if(J.title == corpseidaccess)
+ jobdatum = J
+ break
+ if(src.corpseidicon)
+ W.icon_state = corpseidicon
+ if(src.corpseidaccess)
+ if(jobdatum)
+ W.access = jobdatum.get_access()
+ else
+ W.access = list()
+ if(corpseidjob)
+ W.assignment = corpseidjob
+ W.registered_name = M.real_name
+ M.equip_to_slot_or_del(W, slot_wear_id)
+ delete_me = 1
+ qdel(src)
+
+
+
+//List of different corpse types
+
+/obj/effect/landmark/mobcorpse/syndicatesoldier
+ name = "Mercenary"
+ corpseuniform = /obj/item/clothing/under/syndicate
+ corpsesuit = /obj/item/clothing/suit/armor/vest
+ corpseshoes = /obj/item/clothing/shoes/boots/swat
+ corpsegloves = /obj/item/clothing/gloves/swat
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas
+ corpsehelmet = /obj/item/clothing/head/helmet/swat
+ corpseback = /obj/item/weapon/storage/backpack
+ corpseid = 1
+ corpseidjob = "Operative"
+ corpseidaccess = "Syndicate"
+
+/obj/effect/landmark/mobcorpse/solarpeacekeeper
+ name = "Mercenary"
+ corpseuniform = /obj/item/clothing/under/syndicate
+ corpsesuit = /obj/item/clothing/suit/armor/pcarrier/blue/sol
+ corpseshoes = /obj/item/clothing/shoes/boots/swat
+ corpsegloves = /obj/item/clothing/gloves/swat
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas
+ corpsehelmet = /obj/item/clothing/head/helmet/swat
+ corpseback = /obj/item/weapon/storage/backpack
+ corpseid = 1
+ corpseidjob = "Peacekeeper"
+ corpseidaccess = "Syndicate"
+
+/obj/effect/landmark/mobcorpse/syndicatecommando
+ name = "Syndicate Commando"
+ corpseuniform = /obj/item/clothing/under/syndicate
+ corpsesuit = /obj/item/clothing/suit/space/void/merc
+ corpseshoes = /obj/item/clothing/shoes/boots/swat
+ corpsegloves = /obj/item/clothing/gloves/swat
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas/syndicate
+ corpsehelmet = /obj/item/clothing/head/helmet/space/void/merc
+ corpseback = /obj/item/weapon/tank/jetpack/oxygen
+ corpsepocket1 = /obj/item/weapon/tank/emergency/oxygen
+ corpseid = 1
+ corpseidjob = "Operative"
+ corpseidaccess = "Syndicate"
+
+
+
+/obj/effect/landmark/mobcorpse/clown
+ name = "Clown"
+ corpseuniform = /obj/item/clothing/under/rank/clown
+ corpseshoes = /obj/item/clothing/shoes/clown_shoes
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas/clown_hat
+ corpsepocket1 = /obj/item/weapon/bikehorn
+ corpseback = /obj/item/weapon/storage/backpack/clown
+ corpseid = 1
+ corpseidjob = "Clown"
+ corpseidaccess = "Clown"
+
+
+
+/obj/effect/landmark/mobcorpse/pirate
+ name = "Pirate"
+ corpseuniform = /obj/item/clothing/under/pirate
+ corpseshoes = /obj/item/clothing/shoes/boots/jackboots
+ corpseglasses = /obj/item/clothing/glasses/eyepatch
+ corpsehelmet = /obj/item/clothing/head/bandana
+
+
+
+/obj/effect/landmark/mobcorpse/pirate/ranged
+ name = "Pirate Gunner"
+ corpsesuit = /obj/item/clothing/suit/pirate
+ corpsehelmet = /obj/item/clothing/head/pirate
+
+
+
+/obj/effect/landmark/mobcorpse/russian
+ name = "Russian"
+ corpseuniform = /obj/item/clothing/under/soviet
+ corpseshoes = /obj/item/clothing/shoes/boots/jackboots
+ corpsehelmet = /obj/item/clothing/head/bearpelt
+
+/obj/effect/landmark/mobcorpse/russian/ranged
corpsehelmet = /obj/item/clothing/head/ushanka
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/corpse_vr.dm b/code/modules/mob/dead/corpse_vr.dm
similarity index 100%
rename from code/modules/mob/living/simple_animal/corpse_vr.dm
rename to code/modules/mob/dead/corpse_vr.dm
diff --git a/code/modules/mob/living/simple_animal/animals/cat.dm b/code/modules/mob/living/simple_animal/animals/cat.dm
deleted file mode 100644
index 140deb0b24..0000000000
--- a/code/modules/mob/living/simple_animal/animals/cat.dm
+++ /dev/null
@@ -1,193 +0,0 @@
-//Cat
-/mob/living/simple_animal/cat
- name = "cat"
- desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
- tt_desc = "E Felis silvestris catus"
- intelligence_level = SA_ANIMAL
- icon_state = "cat2"
- item_state = "cat2"
- icon_living = "[initial(icon_state)]"
- icon_dead = "[initial(icon_state)]_dead"
- icon_rest = "[initial(icon_state)]_rest"
-
- investigates = 1
- specific_targets = 1 //Only targets with Found()
- run_at_them = 0 //DOMESTICATED
- view_range = 5
-
- turns_per_move = 5
- see_in_dark = 6
-
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
-
- min_oxy = 16 //Require atleast 16kPA oxygen
- minbodytemp = 223 //Below -50 Degrees Celcius
- maxbodytemp = 323 //Above 50 Degrees Celcius
-
- holder_type = /obj/item/weapon/holder/cat
- mob_size = MOB_SMALL
-
- has_langs = list("Cat")
- speak_chance = 1
- speak = list("Meow!","Esp!","Purr!","HSSSSS")
- speak_emote = list("purrs", "meows")
- emote_hear = list("meows","mews")
- emote_see = list("shakes their head", "shivers")
- say_maybe_target = list("Meow?","Mew?","Mao?")
- say_got_target = list("MEOW!","HSSSS!","REEER!")
-
- meat_amount = 1
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
-
- var/turns_since_scan = 0
- var/mob/flee_target
-
-/mob/living/simple_animal/cat/Life()
- . = ..()
- if(!.) return
-
- if(prob(2)) //spooky
- var/mob/observer/dead/spook = locate() in range(src,5)
- if(spook)
- var/turf/T = spook.loc
- var/list/visible = list()
- for(var/obj/O in T.contents)
- if(!O.invisibility && O.name)
- visible += O
- if(visible.len)
- var/atom/A = pick(visible)
- visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].")
-
- handle_flee_target()
-
-/mob/living/simple_animal/cat/PunchTarget()
- if(ismouse(target_mob))
- var/mob/living/simple_mob/animal/passive/mouse/mouse = target_mob
- mouse.splat()
- visible_emote(pick("bites \the [mouse]!","toys with \the [mouse].","chomps on \the [mouse]!"))
- return mouse
- else
- ..()
-
-/mob/living/simple_animal/cat/Found(var/atom/found_atom)
- if(ismouse(found_atom) && SA_attackable(found_atom))
- return found_atom
-
-/mob/living/simple_animal/cat/proc/handle_flee_target()
- //see if we should stop fleeing
- if (flee_target && !(flee_target in ListTargets(view_range)))
- flee_target = null
- GiveUpMoving()
-
- if (flee_target && !stat && !buckled)
- if (resting)
- lay_down()
- if(prob(25)) say("HSSSSS")
- stop_automated_movement = 1
- walk_away(src, flee_target, 7, 2)
-
-/mob/living/simple_animal/cat/react_to_attack(var/atom/A)
- if(A == src) return
- flee_target = A
- turns_since_scan = 5
-
-/mob/living/simple_animal/cat/ex_act()
- . = ..()
- react_to_attack(src.loc)
-
-//Basic friend AI
-/mob/living/simple_animal/cat/fluff
- var/mob/living/carbon/human/friend
- var/befriend_job = null
- var/friend_name = null
-
-/mob/living/simple_animal/cat/fluff/Life()
- . = ..()
- if(!. || ai_inactive || !friend) return
-
- var/friend_dist = get_dist(src,friend)
-
- if (friend_dist <= 4)
- if(stance == STANCE_IDLE)
- if(set_follow(friend))
- handle_stance(STANCE_FOLLOW)
-
- if (friend_dist <= 1)
- if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit)
- if (prob((friend.stat < DEAD)? 50 : 15))
- var/verb = pick("meows", "mews", "mrowls")
- audible_emote(pick("[verb] in distress.", "[verb] anxiously."))
- else
- if (prob(5))
- visible_emote(pick("nuzzles [friend].",
- "brushes against [friend].",
- "rubs against [friend].",
- "purrs."))
- else if (friend.health <= 50)
- if (prob(10))
- var/verb = pick("meows", "mews", "mrowls")
- audible_emote("[verb] anxiously.")
-
-/mob/living/simple_animal/cat/fluff/verb/become_friends()
- set name = "Become Friends"
- set category = "IC"
- set src in view(1)
-
- if(!friend)
- var/mob/living/carbon/human/H = usr
- if(istype(H) && (!befriend_job || H.job == befriend_job) && (!friend_name || H.real_name == friend_name))
- friend = usr
- . = 1
- else if(usr == friend)
- . = 1 //already friends, but show success anyways
-
- if(.)
- set_dir(get_dir(src, friend))
- visible_emote(pick("nuzzles [friend].",
- "brushes against [friend].",
- "rubs against [friend].",
- "purrs."))
- else
- usr << "[src] ignores you."
- return
-
-//RUNTIME IS ALIVE! SQUEEEEEEEE~
-/mob/living/simple_animal/cat/fluff/Runtime
- name = "Runtime"
- desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
- tt_desc = "E Felis silvestris medicalis" //a hypoallergenic breed produced by NT for... medical purposes? Sure.
- gender = FEMALE
- icon_state = "cat"
- item_state = "cat"
- befriend_job = "Chief Medical Officer"
-
-/mob/living/simple_animal/cat/kitten
- name = "kitten"
- desc = "D'aaawwww"
- icon_state = "kitten"
- item_state = "kitten"
- icon_living = "kitten"
- icon_dead = "kitten_dead"
- gender = NEUTER
-
-// Leaving this here for now.
-/obj/item/weapon/holder/cat/fluff/bones
- name = "Bones"
- desc = "It's Bones! Meow."
- gender = MALE
- icon_state = "cat3"
-
-/mob/living/simple_animal/cat/fluff/bones
- name = "Bones"
- desc = "That's Bones the cat. He's a laid back, black cat. Meow."
- gender = MALE
- icon_state = "cat3"
- item_state = "cat3"
- holder_type = /obj/item/weapon/holder/cat/fluff/bones
- friend_name = "Erstatz Vryroxes"
-
-/mob/living/simple_animal/cat/kitten/New()
- gender = pick(MALE, FEMALE)
- ..()
diff --git a/code/modules/mob/living/simple_animal/animals/farm_animals.dm b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
deleted file mode 100644
index 534bbf6000..0000000000
--- a/code/modules/mob/living/simple_animal/animals/farm_animals.dm
+++ /dev/null
@@ -1,292 +0,0 @@
-//goat
-/mob/living/simple_animal/retaliate/goat
- name = "goat"
- desc = "Not known for their pleasant disposition."
- tt_desc = "E Oreamnos americanus"
- icon_state = "goat"
- icon_living = "goat"
- icon_dead = "goat_dead"
-
- faction = "goat"
- intelligence_level = SA_ANIMAL
-
- health = 40
- turns_per_move = 5
- see_in_dark = 6
-
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
-
- melee_damage_lower = 1
- melee_damage_upper = 5
- attacktext = list("kicked")
-
- speak_chance = 1
- speak = list("EHEHEHEHEH","eh?")
- speak_emote = list("brays")
- emote_hear = list("brays")
- emote_see = list("shakes its head", "stamps a foot", "glares around")
-
- meat_amount = 4
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
-
- var/datum/reagents/udder = null
-
-/mob/living/simple_animal/retaliate/goat/New()
- udder = new(50)
- udder.my_atom = src
- ..()
-
-/mob/living/simple_animal/retaliate/goat/Life()
- . = ..()
- if(.)
- if(stat == CONSCIOUS)
- if(udder && prob(5))
- udder.add_reagent("milk", rand(5, 10))
-
- if(locate(/obj/effect/plant) in loc)
- var/obj/effect/plant/SV = locate() in loc
- SV.die_off(1)
-
- if(locate(/obj/machinery/portable_atmospherics/hydroponics/soil/invisible) in loc)
- var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/SP = locate() in loc
- qdel(SP)
-
- if(!pulledby)
- var/obj/effect/plant/food
- food = locate(/obj/effect/plant) in oview(5,loc)
- if(food)
- var/step = get_step_to(src, food, 0)
- Move(step)
-
-/mob/living/simple_animal/retaliate/goat/react_to_attack()
- . = ..()
- if(.)
- visible_message("[src] gets an evil-looking gleam in their eye.")
-
-/mob/living/simple_animal/retaliate/goat/Move()
- ..()
- if(!stat)
- for(var/obj/effect/plant/SV in loc)
- SV.die_off(1)
-
-/mob/living/simple_animal/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob)
- var/obj/item/weapon/reagent_containers/glass/G = O
- if(stat == CONSCIOUS && istype(G) && G.is_open_container())
- user.visible_message("[user] milks [src] using \the [O].")
- var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
- if(G.reagents.total_volume >= G.volume)
- user << "The [O] is full."
- if(!transfered)
- user << "The udder is dry. Wait a bit longer..."
- else
- ..()
-//cow
-/mob/living/simple_animal/cow
- name = "cow"
- desc = "Known for their milk, just don't tip them over."
- tt_desc = "E Bos taurus"
- icon_state = "cow"
- icon_living = "cow"
- icon_dead = "cow_dead"
- icon_gib = "cow_gib"
- intelligence_level = SA_ANIMAL
-
- health = 50
- turns_per_move = 5
- see_in_dark = 6
-
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- attacktext = list("kicked")
-
- speak_chance = 1
- speak = list("moo?","moo","MOOOOOO")
- speak_emote = list("moos","moos hauntingly")
- emote_hear = list("brays")
- emote_see = list("shakes its head")
-
- meat_amount = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
-
- var/datum/reagents/udder = null
-
-/mob/living/simple_animal/cow/New()
- udder = new(50)
- udder.my_atom = src
- ..()
-
-/mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob)
- var/obj/item/weapon/reagent_containers/glass/G = O
- if(stat == CONSCIOUS && istype(G) && G.is_open_container())
- user.visible_message("[user] milks [src] using \the [O].")
- var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
- if(G.reagents.total_volume >= G.volume)
- user << "The [O] is full."
- if(!transfered)
- user << "The udder is dry. Wait a bit longer..."
- else
- ..()
-
-/mob/living/simple_animal/cow/Life()
- . = ..()
- if(stat == CONSCIOUS)
- if(udder && prob(5))
- udder.add_reagent("milk", rand(5, 10))
-
-/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
- if(!stat && M.a_intent == I_DISARM && icon_state != icon_dead)
- M.visible_message("[M] tips over [src].","You tip over [src].")
- Weaken(30)
- icon_state = icon_dead
- spawn(rand(20,50))
- if(!stat && M)
- icon_state = icon_living
- var/list/responses = list( "[src] looks at you imploringly.",
- "[src] looks at you pleadingly",
- "[src] looks at you with a resigned expression.",
- "[src] seems resigned to its fate.")
- M << pick(responses)
- else
- ..()
-
-/mob/living/simple_animal/chick
- name = "\improper chick"
- desc = "Adorable! They make such a racket though."
- tt_desc = "E Gallus gallus"
- icon_state = "chick"
- icon_living = "chick"
- icon_dead = "chick_dead"
- icon_gib = "chick_gib"
- intelligence_level = SA_ANIMAL
-
- health = 1
- turns_per_move = 2
-
- pass_flags = PASSTABLE | PASSGRILLE
- mob_size = MOB_MINISCULE
-
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- attacktext = list("kicked")
-
- has_langs = list("Bird")
- speak_chance = 2
- speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
- speak_emote = list("cheeps")
- emote_hear = list("cheeps")
- emote_see = list("pecks at the ground","flaps its tiny wings")
-
- meat_amount = 1
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
-
- var/amount_grown = 0
-
-/mob/living/simple_animal/chick/New()
- ..()
- pixel_x = rand(-6, 6)
- pixel_y = rand(0, 10)
-
-/mob/living/simple_animal/chick/Life()
- . =..()
- if(!.)
- return
- if(!stat)
- amount_grown += rand(1,2)
- if(amount_grown >= 100)
- new /mob/living/simple_animal/chicken(src.loc)
- qdel(src)
-
-var/const/MAX_CHICKENS = 50
-var/global/chicken_count = 0
-
-/mob/living/simple_animal/chicken
- name = "\improper chicken"
- desc = "Hopefully the eggs are good this season."
- tt_desc = "E Gallus gallus"
- icon_state = "chicken"
- icon_living = "chicken"
- icon_dead = "chicken_dead"
- intelligence_level = SA_ANIMAL
-
- health = 10
- turns_per_move = 3
- pass_flags = PASSTABLE
- mob_size = MOB_SMALL
-
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- attacktext = list("kicked")
-
- has_langs = list("Bird")
- speak_chance = 2
- speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
- speak_emote = list("clucks","croons")
- emote_hear = list("clucks")
- emote_see = list("pecks at the ground","flaps its wings viciously")
-
- meat_amount = 2
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
-
- var/eggsleft = 0
- var/body_color
-
-/mob/living/simple_animal/chicken/New()
- ..()
- if(!body_color)
- body_color = pick( list("brown","black","white") )
- icon_state = "chicken_[body_color]"
- icon_living = "chicken_[body_color]"
- icon_dead = "chicken_[body_color]_dead"
- pixel_x = rand(-6, 6)
- pixel_y = rand(0, 10)
- chicken_count += 1
-
-/mob/living/simple_animal/chicken/death()
- ..()
- chicken_count -= 1
-
-/mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) //feedin' dem chickens
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
- if(G.seed && G.seed.kitchen_tag == "wheat")
- if(!stat && eggsleft < 8)
- user.visible_message("[user] feeds [O] to [name]! It clucks happily.","You feed [O] to [name]! It clucks happily.")
- user.drop_item()
- qdel(O)
- eggsleft += rand(1, 4)
- else
- user << "[name] doesn't seem hungry!"
- else
- user << "[name] doesn't seem interested in that."
- else
- ..()
-
-/mob/living/simple_animal/chicken/Life()
- . =..()
- if(!.)
- return
- if(!stat && prob(3) && eggsleft > 0)
- visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
- eggsleft--
- var/obj/item/weapon/reagent_containers/food/snacks/egg/E = new(get_turf(src))
- E.pixel_x = rand(-6,6)
- E.pixel_y = rand(-6,6)
- if(chicken_count < MAX_CHICKENS && prob(10))
- START_PROCESSING(SSobj, E)
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/var/amount_grown = 0
-/obj/item/weapon/reagent_containers/food/snacks/egg/process()
- if(isturf(loc))
- amount_grown += rand(1,2)
- if(amount_grown >= 100)
- visible_message("[src] hatches with a quiet cracking sound.")
- new /mob/living/simple_animal/chick(get_turf(src))
- STOP_PROCESSING(SSobj, src)
- qdel(src)
- else
- STOP_PROCESSING(SSobj, src)
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
deleted file mode 100644
index 8b28544b9e..0000000000
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ /dev/null
@@ -1,213 +0,0 @@
-/mob/living/simple_mob/animal/borer
- name = "cortical borer"
- real_name = "cortical borer"
- desc = "A small, quivering sluglike creature."
- speak_emote = list("chirrups")
- emote_hear = list("chirrups")
- intelligence_level = SA_HUMANOID // Player controlled.
- response_help = "pokes"
- response_disarm = "prods"
- response_harm = "stomps on"
- icon_state = "brainslug"
- item_state = "brainslug"
- icon_living = "brainslug"
- icon_dead = "brainslug_dead"
- speed = 5
- a_intent = I_HURT
- stop_automated_movement = 1
- status_flags = CANPUSH
- attacktext = list("nipped")
- friendly = "prods"
- wander = 0
- pass_flags = PASSTABLE
- universal_understand = 1
- holder_type = /obj/item/weapon/holder/borer
-
- var/used_dominate
- var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
- var/mob/living/carbon/human/host // Human host for the brain worm.
- var/truename // Name used for brainworm-speak.
- var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
- var/controlling // Used in human death check.
- var/docile = 0 // Sugar can stop borers from acting.
- var/has_reproduced
- var/roundstart
-
- can_be_antagged = TRUE
-
-/mob/living/simple_mob/animal/borer/roundstart
- roundstart = 1
-
-/mob/living/simple_mob/animal/borer/Login()
- ..()
- if(mind)
- borers.add_antagonist(mind)
-
-/mob/living/simple_mob/animal/borer/New()
- ..()
-
- add_language("Cortical Link")
- verbs += /mob/living/proc/ventcrawl
- verbs += /mob/living/proc/hide
-
- truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
- if(!roundstart) request_player()
-
-/mob/living/simple_mob/animal/borer/Life()
-
- ..()
-
- if(host)
-
- if(!stat && !host.stat)
-
- if(host.reagents.has_reagent("sugar"))
- if(!docile)
- if(controlling)
- host << "You feel the soporific flow of sugar in your host's blood, lulling you into docility."
- else
- to_chat(src, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.")
- docile = 1
- else
- if(docile)
- if(controlling)
- host << "You shake off your lethargy as the sugar leaves your host's blood."
- else
- to_chat(src, "You shake off your lethargy as the sugar leaves your host's blood.")
- docile = 0
-
- if(chemicals < 250)
- chemicals++
- if(controlling)
-
- if(docile)
- host << "You are feeling far too docile to continue controlling your host..."
- host.release_control()
- return
-
- if(prob(5))
- host.adjustBrainLoss(0.1)
-
- if(prob(host.brainloss/20))
- host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]")
-
-/mob/living/simple_mob/animal/borer/Stat()
- ..()
- statpanel("Status")
-
- if(emergency_shuttle)
- var/eta_status = emergency_shuttle.get_status_panel_eta()
- if(eta_status)
- stat(null, eta_status)
-
- if (client.statpanel == "Status")
- stat("Chemicals", chemicals)
-
-/mob/living/simple_mob/animal/borer/proc/detatch()
-
- if(!host || !controlling) return
-
- if(istype(host,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = host
- var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
- head.implants -= src
-
- controlling = 0
-
- host.remove_language("Cortical Link")
- host.verbs -= /mob/living/carbon/proc/release_control
- host.verbs -= /mob/living/carbon/proc/punish_host
- host.verbs -= /mob/living/carbon/proc/spawn_larvae
-
- if(host_brain)
-
- // these are here so bans and multikey warnings are not triggered on the wrong people when ckey is changed.
- // computer_id and IP are not updated magically on their own in offline mobs -walter0o
-
- // host -> self
- var/h2s_id = host.computer_id
- var/h2s_ip= host.lastKnownIP
- host.computer_id = null
- host.lastKnownIP = null
-
- src.ckey = host.ckey
-
- if(!src.computer_id)
- src.computer_id = h2s_id
-
- if(!host_brain.lastKnownIP)
- src.lastKnownIP = h2s_ip
-
- // brain -> host
- var/b2h_id = host_brain.computer_id
- var/b2h_ip= host_brain.lastKnownIP
- host_brain.computer_id = null
- host_brain.lastKnownIP = null
-
- host.ckey = host_brain.ckey
-
- if(!host.computer_id)
- host.computer_id = b2h_id
-
- if(!host.lastKnownIP)
- host.lastKnownIP = b2h_ip
-
- qdel(host_brain)
-
-/mob/living/simple_mob/animal/borer/proc/leave_host()
-
- if(!host) return
-
- if(host.mind)
- borers.remove_antagonist(host.mind)
-
- src.forceMove(get_turf(host))
-
- reset_view(null)
- machine = null
-
- host.reset_view(null)
- host.machine = null
- host = null
- return
-
-//Procs for grabbing players.
-/mob/living/simple_mob/animal/borer/proc/request_player()
- for(var/mob/observer/dead/O in player_list)
- if(jobban_isbanned(O, "Borer"))
- continue
- if(O.client)
- if(O.client.prefs.be_special & BE_ALIEN)
- question(O.client)
-
-/mob/living/simple_mob/animal/borer/proc/question(var/client/C)
- spawn(0)
- if(!C) return
- var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round")
- if(!C || ckey)
- return
- if(response == "Yes")
- transfer_personality(C)
- else if (response == "Never for this round")
- C.prefs.be_special ^= BE_ALIEN
-
-/mob/living/simple_mob/animal/borer/proc/transfer_personality(var/client/candidate)
-
- if(!candidate || !candidate.mob || !candidate.mob.mind)
- return
-
- src.mind = candidate.mob.mind
- candidate.mob.mind.current = src
- src.ckey = candidate.ckey
-
- if(src.mind)
- src.mind.assigned_role = "Cortical Borer"
- src.mind.special_role = "Cortical Borer"
-
- to_chat(src, "You are a cortical borer! You are a brain slug that worms its way \
- into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, \
- your host and your eventual spawn safe and warm.")
- to_chat(src, "You can speak to your victim with say, to other borers with say :x, and use your Abilities tab to access powers.")
-
-/mob/living/simple_mob/animal/borer/cannot_use_vents()
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm
deleted file mode 100644
index c7088bc715..0000000000
--- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/mob/living/captive_brain
- name = "host brain"
- real_name = "host brain"
- universal_understand = 1
-
-/mob/living/captive_brain/say(var/message)
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
-
- if(istype(src.loc,/mob/living/simple_mob/animal/borer))
-
- message = sanitize(message)
- if (!message)
- return
- log_say(message,src)
- if (stat == 2)
- return say_dead(message)
-
- var/mob/living/simple_mob/animal/borer/B = src.loc
- to_chat(src, "You whisper silently, \"[message]\"")
- B.host << "The captive mind of [src] whispers, \"[message]\""
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- M << "The captive mind of [src] whispers, \"[message]\""
-
-/mob/living/captive_brain/emote(var/message)
- return
-
-/mob/living/captive_brain/process_resist()
- //Resisting control by an alien mind.
- if(istype(src.loc,/mob/living/simple_mob/animal/borer))
- var/mob/living/simple_mob/animal/borer/B = src.loc
- var/mob/living/captive_brain/H = src
-
- H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)."
- B.host << "You feel the captive mind of [src] begin to resist your control."
-
- spawn(rand(200,250)+B.host.brainloss)
- if(!B || !B.controlling) return
-
- B.host.adjustBrainLoss(rand(0.1,0.5))
- H << "With an immense exertion of will, you regain control of your body!"
- B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."
- B.detatch()
- verbs -= /mob/living/carbon/proc/release_control
- verbs -= /mob/living/carbon/proc/punish_host
- verbs -= /mob/living/carbon/proc/spawn_larvae
-
- return
-
- ..()
diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
deleted file mode 100644
index d5575f78e7..0000000000
--- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm
+++ /dev/null
@@ -1,337 +0,0 @@
-/mob/living/simple_mob/animal/borer/verb/release_host()
- set category = "Abilities"
- set name = "Release Host"
- set desc = "Slither out of your host."
-
- if(!host)
- to_chat(src, "You are not inside a host body.")
- return
-
- if(stat)
- to_chat(src, "You cannot leave your host in your current state.")
-
- if(docile)
- to_chat(src, "You are feeling far too docile to do that.")
- return
-
- if(!host || !src) return
-
- to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.")
-
- if(!host.stat)
- host << "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..."
-
- spawn(100)
-
- if(!host || !src) return
-
- if(src.stat)
- to_chat(src, "You cannot release your host in your current state.")
- return
-
- to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.")
- if(host.mind)
- if(!host.stat)
- host << "Something slimy wiggles out of your ear and plops to the ground!"
- host << "As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again."
-
- detatch()
- leave_host()
-
-/mob/living/simple_mob/animal/borer/verb/infest()
- set category = "Abilities"
- set name = "Infest"
- set desc = "Infest a suitable humanoid host."
-
- if(host)
- to_chat(src, "You are already within a host.")
- return
-
- if(stat)
- to_chat(src, "You cannot infest a target in your current state.")
- return
-
- var/list/choices = list()
- for(var/mob/living/carbon/C in view(1,src))
- if(src.Adjacent(C))
- choices += C
-
- if(!choices.len)
- to_chat(src, "There are no viable hosts within range...")
- return
-
- var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
-
- if(!M || !src) return
-
- if(!(src.Adjacent(M))) return
-
- if(M.has_brain_worms())
- to_chat(src, "You cannot infest someone who is already infested!")
- return
-
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
-
- var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD]
- if(!E || E.is_stump())
- to_chat(src, "\The [H] does not have a head!")
-
- if(!H.should_have_organ("brain"))
- to_chat(src, "\The [H] does not seem to have an ear canal to breach.")
- return
-
- if(H.check_head_coverage())
- to_chat(src, "You cannot get through that host's protective gear.")
- return
-
- M << "Something slimy begins probing at the opening of your ear canal..."
- to_chat(src, "You slither up [M] and begin probing at their ear canal...")
-
- if(!do_after(src,30))
- to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
- return
-
- if(!M || !src) return
-
- if(src.stat)
- to_chat(src, "You cannot infest a target in your current state.")
- return
-
- if(M in view(1, src))
- to_chat(src, "You wiggle into [M]'s ear.")
- if(!M.stat)
- M << "Something disgusting and slimy wiggles into your ear!"
-
- src.host = M
- src.forceMove(M)
-
- //Update their traitor status.
- if(host.mind)
- borers.add_antagonist_mind(host.mind, 1, borers.faction_role_text, borers.faction_welcome)
-
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/I = H.internal_organs_by_name["brain"]
- if(!I) // No brain organ, so the borer moves in and replaces it permanently.
- replace_brain()
- else
- // If they're in normally, implant removal can get them out.
- var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
- head.implants += src
-
- return
- else
- to_chat(src, "They are no longer in range!")
- return
-
-/*
-/mob/living/simple_mob/animal/borer/verb/devour_brain()
- set category = "Abilities"
- set name = "Devour Brain"
- set desc = "Take permanent control of a dead host."
-
- if(!host)
- to_chat(src, "You are not inside a host body.")
- return
-
- if(host.stat != 2)
- to_chat(src, "Your host is still alive.")
- return
-
- if(stat)
- to_chat(src, "You cannot do that in your current state.")
-
- if(docile)
- to_chat(src, "You are feeling far too docile to do that.")
- return
-
-
- to_chat(src, "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...")
- replace_brain()
-*/
-
-// BRAIN WORM ZOMBIES AAAAH.
-/mob/living/simple_mob/animal/borer/proc/replace_brain()
-
- var/mob/living/carbon/human/H = host
-
- if(!istype(host))
- to_chat(src, "This host does not have a suitable brain.")
- return
-
- to_chat(src, "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].")
-
- H.add_language("Cortical Link")
-
- if(host.stat == 2)
- H.verbs |= /mob/living/carbon/human/proc/jumpstart
-
- H.verbs |= /mob/living/carbon/human/proc/psychic_whisper
- H.verbs |= /mob/living/carbon/human/proc/tackle
- H.verbs |= /mob/living/carbon/proc/spawn_larvae
-
- if(H.client)
- H.ghostize(0)
-
- if(src.mind)
- src.mind.special_role = "Borer Husk"
- src.mind.transfer_to(host)
-
- H.ChangeToHusk()
-
- var/obj/item/organ/internal/borer/B = new(H)
- H.internal_organs_by_name["brain"] = B
- H.internal_organs |= B
-
- var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD)
- affecting.implants -= src
-
- var/s2h_id = src.computer_id
- var/s2h_ip= src.lastKnownIP
- src.computer_id = null
- src.lastKnownIP = null
-
- if(!H.computer_id)
- H.computer_id = s2h_id
-
- if(!H.lastKnownIP)
- H.lastKnownIP = s2h_ip
-
-/mob/living/simple_mob/animal/borer/verb/secrete_chemicals()
- set category = "Abilities"
- set name = "Secrete Chemicals"
- set desc = "Push some chemicals into your host's bloodstream."
-
- if(!host)
- to_chat(src, "You are not inside a host body.")
- return
-
- if(stat)
- to_chat(src, "You cannot secrete chemicals in your current state.")
-
- if(docile)
- to_chat(src, "You are feeling far too docile to do that.")
- return
-
- if(chemicals < 50)
- to_chat(src, "You don't have enough chemicals!")
-
- var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol")
-
- if(!chem || chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
- return
-
- to_chat(src, "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.")
- host.reagents.add_reagent(chem, 10)
- chemicals -= 50
-
-/mob/living/simple_mob/animal/borer/verb/dominate_victim()
- set category = "Abilities"
- set name = "Paralyze Victim"
- set desc = "Freeze the limbs of a potential host with supernatural fear."
-
- if(world.time - used_dominate < 150)
- to_chat(src, "You cannot use that ability again so soon.")
- return
-
- if(host)
- to_chat(src, "You cannot do that from within a host body.")
- return
-
- if(src.stat)
- to_chat(src, "You cannot do that in your current state.")
- return
-
- var/list/choices = list()
- for(var/mob/living/carbon/C in view(3,src))
- if(C.stat != 2)
- choices += C
-
- if(world.time - used_dominate < 150)
- to_chat(src, "You cannot use that ability again so soon.")
- return
-
- var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
-
- if(!M || !src) return
-
- if(M.has_brain_worms())
- to_chat(src, "You cannot infest someone who is already infested!")
- return
-
- to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.")
- M << "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing."
- M.Weaken(10)
-
- used_dominate = world.time
-
-/mob/living/simple_mob/animal/borer/verb/bond_brain()
- set category = "Abilities"
- set name = "Assume Control"
- set desc = "Fully connect to the brain of your host."
-
- if(!host)
- to_chat(src, "You are not inside a host body.")
- return
-
- if(src.stat)
- to_chat(src, "You cannot do that in your current state.")
- return
-
- if(docile)
- to_chat(src, "You are feeling far too docile to do that.")
- return
-
- to_chat(src, "You begin delicately adjusting your connection to the host brain...")
-
- spawn(100+(host.brainloss*5))
-
- if(!host || !src || controlling)
- return
- else
-
- to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.")
- host << "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours."
- host.add_language("Cortical Link")
-
- // host -> brain
- var/h2b_id = host.computer_id
- var/h2b_ip= host.lastKnownIP
- host.computer_id = null
- host.lastKnownIP = null
-
- qdel(host_brain)
- host_brain = new(src)
-
- host_brain.ckey = host.ckey
-
- host_brain.name = host.name
-
- if(!host_brain.computer_id)
- host_brain.computer_id = h2b_id
-
- if(!host_brain.lastKnownIP)
- host_brain.lastKnownIP = h2b_ip
-
- // self -> host
- var/s2h_id = src.computer_id
- var/s2h_ip= src.lastKnownIP
- src.computer_id = null
- src.lastKnownIP = null
-
- host.ckey = src.ckey
-
- if(!host.computer_id)
- host.computer_id = s2h_id
-
- if(!host.lastKnownIP)
- host.lastKnownIP = s2h_ip
-
- controlling = 1
-
- host.verbs += /mob/living/carbon/proc/release_control
- host.verbs += /mob/living/carbon/proc/punish_host
- host.verbs += /mob/living/carbon/proc/spawn_larvae
-
- return
diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm
deleted file mode 100644
index 41229d9bd2..0000000000
--- a/code/modules/mob/living/simple_animal/borer/say.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/mob/living/simple_mob/animal/borer/say(var/message)
-
- message = sanitize(message)
- message = capitalize(message)
-
- if(!message)
- return
-
- if (stat == 2)
- return say_dead(message)
-
- if (stat)
- return
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
-
- if (copytext(message, 1, 2) == "*")
- return emote(copytext(message, 2))
-
- var/datum/language/L = parse_language(message)
- if(L && L.flags & HIVEMIND)
- L.broadcast(src,trim(copytext(message,3)),src.truename)
- return
-
- if(!host)
- //TODO: have this pick a random mob within 3 tiles to speak for the borer.
- to_chat(src, "You have no host to speak to.")
- return //No host, no audible speech.
-
- to_chat(src, "You drop words into [host]'s mind: \"[message]\"")
- host << "Your own thoughts speak: \"[message]\""
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- M << "[src.truename] whispers to [host], \"[message]\""
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm
deleted file mode 100644
index 75f33cdcef..0000000000
--- a/code/modules/mob/living/simple_animal/slime/subtypes.dm
+++ /dev/null
@@ -1,748 +0,0 @@
-// Tier 1
-
-/mob/living/simple_animal/slime/purple
- desc = "This slime is rather toxic to handle, as it is poisonous."
- color = "#CC23FF"
- slime_color = "purple"
- coretype = /obj/item/slime_extract/purple
- reagent_injected = "toxin"
-
- description_info = "This slime spreads a toxin when it attacks. A biosuit or other thick armor can protect from the toxic attack."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/dark_purple,
- /mob/living/simple_animal/slime/dark_blue,
- /mob/living/simple_animal/slime/green,
- /mob/living/simple_animal/slime
- )
-
-
-/mob/living/simple_animal/slime/orange
- desc = "This slime is known to be flammable and can ignite enemies."
- color = "#FFA723"
- slime_color = "orange"
- coretype = /obj/item/slime_extract/orange
-
- description_info = "Attacks from this slime can ignite you. A firesuit can protect from the burning attacks of this slime."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/dark_purple,
- /mob/living/simple_animal/slime/yellow,
- /mob/living/simple_animal/slime/red,
- /mob/living/simple_animal/slime
- )
-
-/mob/living/simple_animal/slime/orange/post_attack(mob/living/L, intent)
- if(intent != I_HELP)
- L.adjust_fire_stacks(1)
- if(prob(25))
- L.IgniteMob()
- ..()
-
-/mob/living/simple_animal/slime/blue
- desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes."
- color = "#19FFFF"
- slime_color = "blue"
- coretype = /obj/item/slime_extract/blue
- reagent_injected = "cryotoxin"
-
- description_info = "Attacks from this slime can chill you. A biosuit or other thick armor can protect from the chilling attack."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/dark_blue,
- /mob/living/simple_animal/slime/silver,
- /mob/living/simple_animal/slime/pink,
- /mob/living/simple_animal/slime
- )
-
-
-/mob/living/simple_animal/slime/metal
- desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface."
- color = "#5F5F5F"
- slime_color = "metal"
- shiny = 1
- coretype = /obj/item/slime_extract/metal
-
- description_info = "This slime is a lot more durable and tough to damage than the others."
-
- resistance = 10 // Sloped armor is strong.
- maxHealth = 250
- maxHealth_adult = 350
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/silver,
- /mob/living/simple_animal/slime/yellow,
- /mob/living/simple_animal/slime/gold,
- /mob/living/simple_animal/slime
- )
-
-// Tier 2
-
-/mob/living/simple_animal/slime/yellow
- desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes."
- color = "#FFF423"
- slime_color = "yellow"
- coretype = /obj/item/slime_extract/yellow
-
- ranged = 1
- shoot_range = 3
- firing_lines = 1
- projectiletype = /obj/item/projectile/beam/lightning/slime
- projectilesound = 'sound/weapons/gauss_shoot.ogg' // Closest thing to a 'thunderstrike' sound we have.
- glows = TRUE
-
- description_info = "This slime will fire lightning attacks at enemies if they are at range, and generate electricity \
- for their stun attack faster than usual. Insulative or reflective armor can protect from the lightning."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/bluespace,
- /mob/living/simple_animal/slime/bluespace,
- /mob/living/simple_animal/slime/metal,
- /mob/living/simple_animal/slime/orange
- )
-
-/mob/living/simple_animal/slime/yellow/handle_regular_status_updates()
- if(stat == CONSCIOUS)
- if(prob(25))
- power_charge = between(0, power_charge + 1, 10)
- ..()
-
-/obj/item/projectile/beam/lightning/slime
- power = 15
-
-/mob/living/simple_animal/slime/yellow/ClosestDistance() // Needed or else they won't eat monkeys outside of melee range.
- if(target_mob && ishuman(target_mob))
- var/mob/living/carbon/human/H = target_mob
- if(istype(H.species, /datum/species/monkey))
- return 1
- return ..()
-
-
-/mob/living/simple_animal/slime/dark_purple
- desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it."
- color = "#660088"
- slime_color = "dark purple"
- coretype = /obj/item/slime_extract/dark_purple
- reagent_injected = "phoron"
-
- description_info = "This slime applies phoron to enemies it attacks. A biosuit or other thick armor can protect from the toxic attack. \
- If hit with a burning attack, it will erupt in flames."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/purple,
- /mob/living/simple_animal/slime/orange,
- /mob/living/simple_animal/slime/ruby,
- /mob/living/simple_animal/slime/ruby
- )
-
-/mob/living/simple_animal/slime/dark_purple/proc/ignite()
- visible_message("\The [src] erupts in an inferno!")
- for(var/turf/simulated/target_turf in view(2, src))
- target_turf.assume_gas("phoron", 30, 1500+T0C)
- spawn(0)
- target_turf.hotspot_expose(1500+T0C, 400)
- qdel(src)
-
-/mob/living/simple_animal/slime/dark_purple/ex_act(severity)
- log_and_message_admins("[src] ignited due to a chain reaction with an explosion.")
- ignite()
-
-/mob/living/simple_animal/slime/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume)
- log_and_message_admins("[src] ignited due to exposure to fire.")
- ignite()
-
-/mob/living/simple_animal/slime/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone)
- if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
- log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
- ignite()
- else
- ..()
-
-/mob/living/simple_animal/slime/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user)
- if(istype(W) && W.force && W.damtype == BURN)
- log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].")
- ignite()
- else
- ..()
-
-
-
-
-/mob/living/simple_animal/slime/dark_blue
- desc = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It tends to kill other slimes rather quickly."
- color = "#2398FF"
- glows = TRUE
- slime_color = "dark blue"
- coretype = /obj/item/slime_extract/dark_blue
-
- description_info = "This slime is immune to the cold, however water will still kill it. A winter coat or other cold-resistant clothing can protect from the chilling aura."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/purple,
- /mob/living/simple_animal/slime/blue,
- /mob/living/simple_animal/slime/cerulean,
- /mob/living/simple_animal/slime/cerulean
- )
-
- minbodytemp = 0
- cold_damage_per_tick = 0
-
-/mob/living/simple_animal/slime/dark_blue/Life()
- if(stat != DEAD)
- cold_aura()
- ..()
-
-/mob/living/simple_animal/slime/dark_blue/proc/cold_aura()
- for(var/mob/living/L in view(2, src))
- var/protection = L.get_cold_protection()
-
- if(protection < 1)
- var/cold_factor = abs(protection - 1)
- var/delta = -20
- delta *= cold_factor
- L.bodytemperature = max(50, L.bodytemperature + delta)
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/env = T.return_air()
- if(env)
- env.add_thermal_energy(-10 * 1000)
-
-/mob/living/simple_animal/slime/dark_blue/get_cold_protection()
- return 1 // This slime is immune to cold.
-
-// Surface variant
-/mob/living/simple_animal/slime/dark_blue/feral
- name = "feral slime"
- desc = "The result of slimes escaping containment from some xenobiology lab. The slime makes other entities near it feel much colder, \
- and it is more resilient to the cold. These qualities have made this color of slime able to thrive on a harsh, cold world and is able to rival \
- the ferocity of other apex predators in this region of Sif. As such, it is a very invasive species."
- description_info = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It also has learned advanced combat tactics from \
- having to endure the harsh world outside its lab. Note that processing this large slime will give six cores."
- icon_scale_x = 2
- icon_scale_y = 2
- optimal_combat = TRUE // Gotta be sharp to survive out there.
- rabid = TRUE
- rainbow_core_candidate = FALSE
- cores = 6
- maxHealth = 150
- maxHealth_adult = 250
- type_on_death = /mob/living/simple_animal/slime/dark_blue // Otherwise infinite slimes might occur.
- pixel_y = -10 // Since the base sprite isn't centered properly, the pixel auto-adjustment needs some help.
-
-/mob/living/simple_animal/slime/dark_blue/feral/New()
- ..()
- make_adult()
-
-/mob/living/simple_animal/slime/silver
- desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it."
- color = "#AAAAAA"
- slime_color = "silver"
- coretype = /obj/item/slime_extract/silver
- shiny = TRUE
-
- description_info = "Tasers, including the slime version, are ineffective against this slime. The slimebation still works."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/metal,
- /mob/living/simple_animal/slime/blue,
- /mob/living/simple_animal/slime/amber,
- /mob/living/simple_animal/slime/amber
- )
-
-/mob/living/simple_animal/slime/silver/bullet_act(var/obj/item/projectile/P, var/def_zone)
- if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy))
- visible_message("\The [src] reflects \the [P]!")
-
- // Find a turf near or on the original location to bounce to
- var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
- var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
- var/turf/curloc = get_turf(src)
-
- // redirect the projectile
- P.redirect(new_x, new_y, curloc, src)
- return PROJECTILE_CONTINUE // complete projectile permutation
- else
- ..()
-
-
-// Tier 3
-
-/mob/living/simple_animal/slime/bluespace
- desc = "Trapping this slime in a cell is generally futile, as it can teleport at will."
- color = null
- slime_color = "bluespace"
- icon_state_override = "bluespace"
- coretype = /obj/item/slime_extract/bluespace
-
- description_info = "This slime will teleport to attack something if it is within a range of seven tiles. The teleport has a cooldown of five seconds."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/bluespace,
- /mob/living/simple_animal/slime/bluespace,
- /mob/living/simple_animal/slime/yellow,
- /mob/living/simple_animal/slime/yellow
- )
-
- spattack_prob = 100
- spattack_min_range = 3
- spattack_max_range = 7
- var/last_tele = null // Uses world.time
- var/tele_cooldown = 5 SECONDS
-
-/mob/living/simple_animal/slime/bluespace/ClosestDistance() // Needed or the SA AI won't ever try to teleport.
- if(world.time > last_tele + tele_cooldown)
- return spattack_max_range - 1
- return ..()
-
-/mob/living/simple_animal/slime/bluespace/SpecialAtkTarget()
- // Teleport attack.
- if(!target_mob)
- to_chat(src, "There's nothing to teleport to.")
- return FALSE
-
- if(world.time < last_tele + tele_cooldown)
- to_chat(src, "You can't teleport right now, wait a few seconds.")
- return FALSE
-
- var/list/nearby_things = range(1, target_mob)
- var/list/valid_turfs = list()
-
- // All this work to just go to a non-dense tile.
- for(var/turf/potential_turf in nearby_things)
- var/valid_turf = TRUE
- if(potential_turf.density)
- continue
- for(var/atom/movable/AM in potential_turf)
- if(AM.density)
- valid_turf = FALSE
- if(valid_turf)
- valid_turfs.Add(potential_turf)
-
-
-
- var/turf/T = get_turf(src)
- var/turf/target_turf = pick(valid_turfs)
-
- if(!target_turf)
- to_chat(src, "There wasn't an unoccupied spot to teleport to.")
- return FALSE
-
- var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
- s1.set_up(5, 1, T)
- var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
- s2.set_up(5, 1, target_turf)
-
-
- T.visible_message("\The [src] vanishes!")
- s1.start()
-
- forceMove(target_turf)
- playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
- to_chat(src, "You teleport to \the [target_turf].")
-
- target_turf.visible_message("\The [src] appears!")
- s2.start()
-
- last_tele = world.time
-
- if(Adjacent(target_mob))
- PunchTarget()
- return TRUE
-
-/mob/living/simple_animal/slime/ruby
- desc = "This slime has great physical strength."
- color = "#FF3333"
- slime_color = "ruby"
- shiny = TRUE
- glows = TRUE
- coretype = /obj/item/slime_extract/ruby
-
- description_info = "This slime is unnaturally stronger, allowing it to hit much harder, take less damage, and be stunned for less time. \
- Their glomp attacks also send the victim flying."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/dark_purple,
- /mob/living/simple_animal/slime/dark_purple,
- /mob/living/simple_animal/slime/ruby,
- /mob/living/simple_animal/slime/ruby
- )
-
-/mob/living/simple_animal/slime/ruby/New()
- ..()
- add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole.
-
-/mob/living/simple_animal/slime/ruby/DoPunch(var/mob/living/L)
- ..() // Do regular attacks.
-
- if(istype(L))
- if(a_intent == I_HURT)
- visible_message("\The [src] sends \the [L] flying with the impact!")
- playsound(src, "punch", 50, 1)
- L.Weaken(1)
- var/throwdir = get_dir(src, L)
- L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
-
-
-/mob/living/simple_animal/slime/amber
- desc = "This slime seems to be an expert in the culinary arts, as they create their own food to share with others. \
- They would probably be very important to other slimes, if the other colors didn't try to kill them."
- color = "#FFBB00"
- slime_color = "amber"
- shiny = TRUE
- glows = TRUE
- coretype = /obj/item/slime_extract/amber
-
- description_info = "This slime feeds nearby entities passively while it is alive. This can cause uncontrollable \
- slime growth and reproduction if not kept in check. The amber slime cannot feed itself, but can be fed by other amber slimes."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/silver,
- /mob/living/simple_animal/slime/silver,
- /mob/living/simple_animal/slime/amber,
- /mob/living/simple_animal/slime/amber
- )
-
-/mob/living/simple_animal/slime/amber/Life()
- if(stat != DEAD)
- feed_aura()
- ..()
-
-/mob/living/simple_animal/slime/amber/proc/feed_aura()
- for(var/mob/living/L in view(2, src))
- if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers.
- continue
- if(isslime(L))
- var/mob/living/simple_animal/slime/S = L
- S.adjust_nutrition(rand(15, 25))
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if(H.isSynthetic())
- continue
- H.nutrition = between(0, H.nutrition + rand(15, 25), 600)
-
-
-
-/mob/living/simple_animal/slime/cerulean
- desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none."
- color = "#4F7EAA"
- slime_color = "cerulean"
- coretype = /obj/item/slime_extract/cerulean
-
- // Less than the specialized slimes, but higher than the rest.
- maxHealth = 200
- maxHealth_adult = 250
-
- melee_damage_lower = 10
- melee_damage_upper = 30
-
- move_to_delay = 3
-
-
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/dark_blue,
- /mob/living/simple_animal/slime/dark_blue,
- /mob/living/simple_animal/slime/cerulean,
- /mob/living/simple_animal/slime/cerulean
- )
-
-// Tier 4
-
-/mob/living/simple_animal/slime/red
- desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here."
- color = "#FF3333"
- slime_color = "red"
- coretype = /obj/item/slime_extract/red
- move_to_delay = 3 // The red ones go faster.
-
- description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go berserk."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/red,
- /mob/living/simple_animal/slime/oil,
- /mob/living/simple_animal/slime/oil,
- /mob/living/simple_animal/slime/orange
- )
-
-
-/mob/living/simple_animal/slime/red/adjust_discipline(amount)
- if(amount > 0)
- if(!rabid)
- enrage() // How dare you try to control the red slime.
- say("Grrr...!")
-
-/mob/living/simple_animal/slime/red/enrage()
- ..()
- add_modifier(/datum/modifier/berserk, 30 SECONDS)
-
-
-/mob/living/simple_animal/slime/green
- desc = "This slime is radioactive."
- color = "#14FF20"
- slime_color = "green"
- coretype = /obj/item/slime_extract/green
- glows = TRUE
- reagent_injected = "radium"
- var/rads = 25
-
- description_info = "This slime will irradiate anything nearby passively, and will inject radium on attack. \
- A radsuit or other thick and radiation-hardened armor can protect from this. It will only radiate while alive."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/purple,
- /mob/living/simple_animal/slime/green,
- /mob/living/simple_animal/slime/emerald,
- /mob/living/simple_animal/slime/emerald
- )
-
-/mob/living/simple_animal/slime/green/Life()
- if(stat != DEAD)
- irradiate()
- ..()
-
-/mob/living/simple_animal/slime/green/proc/irradiate()
- SSradiation.radiate(src, rads)
-
-
-/mob/living/simple_animal/slime/pink
- desc = "This slime has regenerative properties."
- color = "#FF0080"
- slime_color = "pink"
- coretype = /obj/item/slime_extract/pink
- glows = TRUE
-
- description_info = "This slime will passively heal nearby entities within two tiles, including itself. It will only do this while alive."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/blue,
- /mob/living/simple_animal/slime/light_pink,
- /mob/living/simple_animal/slime/light_pink,
- /mob/living/simple_animal/slime/pink
- )
-
-/mob/living/simple_animal/slime/pink/Life()
- if(stat != DEAD)
- heal_aura()
- ..()
-
-/mob/living/simple_animal/slime/pink/proc/heal_aura()
- for(var/mob/living/L in view(src, 2))
- if(L.stat == DEAD || L == target_mob)
- continue
- L.add_modifier(/datum/modifier/slime_heal, 5 SECONDS, src)
-
-/datum/modifier/slime_heal
- name = "slime mending"
- desc = "You feel somewhat gooy."
- mob_overlay_state = "pink_sparkles"
-
- on_created_text = "Twinkling spores of goo surround you. It makes you feel healthier."
- on_expired_text = "The spores of goo have faded, although you feel much healthier than before."
- stacks = MODIFIER_STACK_EXTEND
-
-/datum/modifier/slime_heal/tick()
- if(holder.stat == DEAD) // Required or else simple animals become immortal.
- expire()
-
- if(ishuman(holder)) // Robolimbs need this code sadly.
- var/mob/living/carbon/human/H = holder
- for(var/obj/item/organ/external/E in H.organs)
- var/obj/item/organ/external/O = E
- O.heal_damage(2, 2, 0, 1)
- else
- holder.adjustBruteLoss(-2)
- holder.adjustFireLoss(-2)
-
- holder.adjustToxLoss(-2)
- holder.adjustOxyLoss(-2)
- holder.adjustCloneLoss(-1)
-
-
-
-/mob/living/simple_animal/slime/gold
- desc = "This slime absorbs energy, and cannot be stunned by normal means."
- color = "#EEAA00"
- shiny = TRUE
- slime_color = "gold"
- coretype = /obj/item/slime_extract/gold
- description_info = "This slime is immune to the slimebaton and taser, and will actually charge the slime, however it will still discipline the slime."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/metal,
- /mob/living/simple_animal/slime/gold,
- /mob/living/simple_animal/slime/sapphire,
- /mob/living/simple_animal/slime/sapphire
- )
-
-/mob/living/simple_animal/slime/gold/Weaken(amount)
- power_charge = between(0, power_charge + amount, 10)
- return
-
-/mob/living/simple_animal/slime/gold/Stun(amount)
- power_charge = between(0, power_charge + amount, 10)
- return
-
-/mob/living/simple_animal/slime/gold/get_description_interaction() // So it doesn't say to use a baton on them.
- return list()
-
-
-// Tier 5
-
-/mob/living/simple_animal/slime/oil
- desc = "This slime is explosive and volatile. Smoking near it is probably a bad idea."
- color = "#333333"
- slime_color = "oil"
- shiny = TRUE
- coretype = /obj/item/slime_extract/oil
-
- description_info = "If this slime suffers damage from a fire or heat based source, or if it is caught inside \
- an explosion, it will explode. Rabid oil slimes will charge at enemies, then suicide-bomb themselves. \
- Bomb suits can protect from the explosion."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/oil,
- /mob/living/simple_animal/slime/oil,
- /mob/living/simple_animal/slime/red,
- /mob/living/simple_animal/slime/red
- )
-
-/mob/living/simple_animal/slime/oil/proc/explode()
- if(stat != DEAD)
- // explosion(src.loc, 1, 2, 4)
- explosion(src.loc, 0, 2, 4) // A bit weaker since the suicide charger tended to gib the poor sod being targeted.
- if(src) // Delete ourselves if the explosion didn't do it.
- qdel(src)
-
-/mob/living/simple_animal/slime/oil/post_attack(var/mob/living/L, var/intent = I_HURT)
- if(!rabid)
- return ..()
- if(intent == I_HURT || intent == I_GRAB)
- say(pick("Sacrifice...!", "Sssss...", "Boom...!"))
- sleep(2 SECOND)
- log_and_message_admins("[src] has suicide-bombed themselves while trying to kill \the [L].")
- explode()
-
-/mob/living/simple_animal/slime/oil/ex_act(severity)
- log_and_message_admins("[src] exploded due to a chain reaction with another explosion.")
- explode()
-
-/mob/living/simple_animal/slime/oil/fire_act(datum/gas_mixture/air, temperature, volume)
- log_and_message_admins("[src] exploded due to exposure to fire.")
- explode()
-
-/mob/living/simple_animal/slime/oil/bullet_act(var/obj/item/projectile/P, var/def_zone)
- if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
- log_and_message_admins("[src] exploded due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
- explode()
- else
- ..()
-
-/mob/living/simple_animal/slime/oil/attackby(var/obj/item/weapon/W, var/mob/user)
- if(istype(W) && W.force && W.damtype == BURN)
- log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].")
- explode()
- else
- ..()
-
-
-/mob/living/simple_animal/slime/sapphire
- desc = "This slime seems a bit brighter than the rest, both figuratively and literally."
- color = "#2398FF"
- slime_color = "sapphire"
- shiny = TRUE
- glows = TRUE
- coretype = /obj/item/slime_extract/sapphire
-
- optimal_combat = TRUE // Lift combat AI restrictions to look smarter.
- run_at_them = FALSE // Use fancy A* pathing.
- astar_adjacent_proc = /turf/proc/TurfsWithAccess // Normal slimes don't care about cardinals (because BYOND) so smart slimes shouldn't as well.
- move_to_delay = 3 // A* chasing is slightly slower in terms of movement speed than regular pathing so reducing this hopefully makes up for that.
-
- description_info = "This slime uses more robust tactics when fighting and won't hold back, so it is dangerous to be alone \
- with one if hostile, and especially dangerous if they outnumber you."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/sapphire,
- /mob/living/simple_animal/slime/sapphire,
- /mob/living/simple_animal/slime/gold,
- /mob/living/simple_animal/slime/gold
- )
-
-/mob/living/simple_animal/slime/emerald
- desc = "This slime is faster than usual, even more so than the red slimes."
- color = "#22FF22"
- shiny = TRUE
- glows = TRUE
- slime_color = "emerald"
- coretype = /obj/item/slime_extract/emerald
-
- description_info = "This slime will make everything around it, and itself, faster for a few seconds, if close by."
- move_to_delay = 2
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/green,
- /mob/living/simple_animal/slime/green,
- /mob/living/simple_animal/slime/emerald,
- /mob/living/simple_animal/slime/emerald
- )
-
-/mob/living/simple_animal/slime/emerald/Life()
- if(stat != DEAD)
- zoom_aura()
- ..()
-
-/mob/living/simple_animal/slime/emerald/proc/zoom_aura()
- for(var/mob/living/L in view(src, 2))
- if(L.stat == DEAD || L == target_mob)
- continue
- L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src)
-
-/mob/living/simple_animal/slime/light_pink
- desc = "This slime seems a lot more peaceful than the others."
- color = "#FF8888"
- slime_color = "light pink"
- coretype = /obj/item/slime_extract/light_pink
-
- description_info = "This slime is effectively always disciplined initially."
- obedience = 5
- discipline = 5
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/pink,
- /mob/living/simple_animal/slime/pink,
- /mob/living/simple_animal/slime/light_pink,
- /mob/living/simple_animal/slime/light_pink
- )
-
-// Special
-/mob/living/simple_animal/slime/rainbow
- desc = "This slime changes colors constantly."
- color = null // Only slime subtype that uses a different icon_state.
- slime_color = "rainbow"
- coretype = /obj/item/slime_extract/rainbow
- icon_state_override = "rainbow"
- unity = TRUE
-
- description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \
- other slimes being friendly to them, and therefore will never be harmed by another slime. \
- Attacking this slime will provoke the wrath of all slimes within range."
-
- slime_mutation = list(
- /mob/living/simple_animal/slime/rainbow,
- /mob/living/simple_animal/slime/rainbow,
- /mob/living/simple_animal/slime/rainbow,
- /mob/living/simple_animal/slime/rainbow
- )
-
-/mob/living/simple_animal/slime/rainbow/New()
- unify()
- ..()
-
-// The RD's pet slime.
-/mob/living/simple_animal/slime/rainbow/kendrick
- name = "Kendrick"
- desc = "The Research Director's pet slime. It shifts colors constantly."
- rainbow_core_candidate = FALSE
-
-/mob/living/simple_animal/slime/rainbow/kendrick/New()
- pacify()
- ..()
\ No newline at end of file
diff --git a/vorestation.dme b/vorestation.dme
index f8833be230..f483baceb5 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2148,6 +2148,8 @@
#include "code\modules\mob\_modifiers\traits.dm"
#include "code\modules\mob\_modifiers\traits_phobias.dm"
#include "code\modules\mob\_modifiers\unholy.dm"
+#include "code\modules\mob\dead\corpse.dm"
+#include "code\modules\mob\dead\corpse_vr.dm"
#include "code\modules\mob\dead\death.dm"
#include "code\modules\mob\dead\observer\free_vr.dm"
#include "code\modules\mob\dead\observer\login.dm"
@@ -2411,8 +2413,6 @@
#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm"
-#include "code\modules\mob\living\simple_animal\corpse.dm"
-#include "code\modules\mob\living\simple_animal\corpse_vr.dm"
#include "code\modules\mob\living\simple_mob\appearance.dm"
#include "code\modules\mob\living\simple_mob\combat.dm"
#include "code\modules\mob\living\simple_mob\defense.dm"