mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
Merge pull request #6314 from VOREStation/upstream-merge-6529
[MIRROR] Remove unused simple_animal files
This commit is contained in:
@@ -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
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
..()
|
||||
@@ -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
|
||||
@@ -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]\""
|
||||
@@ -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()
|
||||
..()
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user