Merge pull request #6314 from VOREStation/upstream-merge-6529

[MIRROR] Remove unused simple_animal files
This commit is contained in:
Novacat
2019-12-15 23:54:50 -05:00
committed by GitHub
10 changed files with 171 additions and 2051 deletions

View File

@@ -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

View File

@@ -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 << "<span class='notice'>[src] ignores you.</span>"
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)
..()

View File

@@ -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("<span class='warning'>[src] gets an evil-looking gleam in their eye.</span>")
/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("<span class='notice'>[user] milks [src] using \the [O].</span>")
var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
if(G.reagents.total_volume >= G.volume)
user << "<font color='red'>The [O] is full.</font>"
if(!transfered)
user << "<font color='red'>The udder is dry. Wait a bit longer...</font>"
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("<span class='notice'>[user] milks [src] using \the [O].</span>")
var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
if(G.reagents.total_volume >= G.volume)
user << "<font color='red'>The [O] is full.</font>"
if(!transfered)
user << "<font color='red'>The udder is dry. Wait a bit longer...</font>"
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("<span class='warning'>[M] tips over [src].</span>","<span class='notice'>You tip over [src].</span>")
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("<font color='blue'>[user] feeds [O] to [name]! It clucks happily.</font>","<font color='blue'>You feed [O] to [name]! It clucks happily.</font>")
user.drop_item()
qdel(O)
eggsleft += rand(1, 4)
else
user << "<font color='blue'>[name] doesn't seem hungry!</font>"
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)

View File

@@ -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 << "<font color='blue'>You feel the soporific flow of sugar in your host's blood, lulling you into docility.</font>"
else
to_chat(src, "<font color='blue'>You feel the soporific flow of sugar in your host's blood, lulling you into docility.</font>")
docile = 1
else
if(docile)
if(controlling)
host << "<font color='blue'>You shake off your lethargy as the sugar leaves your host's blood.</font>"
else
to_chat(src, "<font color='blue'>You shake off your lethargy as the sugar leaves your host's blood.</font>")
docile = 0
if(chemicals < 250)
chemicals++
if(controlling)
if(docile)
host << "<font color='blue'>You are feeling far too docile to continue controlling your host...</font>"
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, "<span class='notice'>You are a cortical borer!</span> 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 <b>say</b>, to other borers with <b>say :x</b>, and use your Abilities tab to access powers.")
/mob/living/simple_mob/animal/borer/cannot_use_vents()
return

View File

@@ -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, "<font color='red'>You cannot speak in IC (muted).</font>")
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 << "<span class='danger'>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</span>"
B.host << "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>"
spawn(rand(200,250)+B.host.brainloss)
if(!B || !B.controlling) return
B.host.adjustBrainLoss(rand(0.1,0.5))
H << "<span class='danger'>With an immense exertion of will, you regain control of your body!</span>"
B.host << "<span class='danger'>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</span>"
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
return
..()

View File

@@ -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, "<font color='blue'>You are feeling far too docile to do that.</font>")
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 << "<span class='danger'>Something slimy wiggles out of your ear and plops to the ground!</span>"
host << "<span class='danger'>As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again.</span>"
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, "<font color='blue'>You are feeling far too docile to do that.</font>")
return
to_chat(src, "<span class = 'danger'>It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...</span>")
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, "<span class = 'danger'>You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].</span>")
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, "<font color='blue'>You are feeling far too docile to do that.</font>")
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, "<font color='red'><B>You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.</B></font>")
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, "<font color='red'>You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.</font>")
M << "<font color='red'>You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.</font>"
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, "<font color='blue'>You are feeling far too docile to do that.</font>")
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, "<font color='red'><B>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</B></font>")
host << "<font color='red'><B>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</B></font>"
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

View File

@@ -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, "<font color='red'>You cannot speak in IC (muted).</font>")
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]\""

View File

@@ -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("<span class='danger'>\The [src] erupts in an inferno!</span>")
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("<span class='danger'>\The [src] reflects \the [P]!</span>")
// 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, "<span class='warning'>There's nothing to teleport to.</span>")
return FALSE
if(world.time < last_tele + tele_cooldown)
to_chat(src, "<span class='warning'>You can't teleport right now, wait a few seconds.</span>")
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, "<span class='warning'>There wasn't an unoccupied spot to teleport to.</span>")
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("<span class='notice'>\The [src] vanishes!</span>")
s1.start()
forceMove(target_turf)
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
to_chat(src, "<span class='notice'>You teleport to \the [target_turf].</span>")
target_turf.visible_message("<span class='warning'>\The [src] appears!</span>")
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("<span class='danger'>\The [src] sends \the [L] flying with the impact!</span>")
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 = "<span class='warning'>Twinkling spores of goo surround you. It makes you feel healthier.</span>"
on_expired_text = "<span class='notice'>The spores of goo have faded, although you feel much healthier than before.</span>"
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()
..()

View File

@@ -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"