Removes redundant files

This commit is contained in:
Spades
2019-01-07 09:36:11 -05:00
parent a06692fae8
commit fc959cd1e8
15 changed files with 0 additions and 2860 deletions

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))
processing_objects.Add(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))
processing_objects.Remove(src)
qdel(src)
else
processing_objects.Remove(src)

View File

@@ -1,29 +0,0 @@
/mob/living/simple_animal/retaliate/diyaab
name = "diyaab"
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
tt_desc = "S Choeros hirtus" //diyaab and shantak are technically reletives!
faction = "diyaab"
icon_state = "diyaab"
icon_living = "diyaab"
icon_dead = "diyaab_dead"
icon = 'icons/jungle.dmi'
faction = "diyaab"
cooperative = 1
maxHealth = 25
health = 25
speed = 1
move_to_delay = 1
melee_damage_lower = 4
melee_damage_upper = 12
attack_sharp = 1 //Bleeds, but it shouldn't rip off a limb?
attacktext = list("gouged")
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Awrr?","Aowrl!","Worrl")
emote_see = list("sniffs the air cautiously","looks around")
emote_hear = list("snuffles")

View File

@@ -1,36 +0,0 @@
/mob/living/simple_animal/hostile/savik
name = "savik"
desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
tt_desc = "S Pistris tellus" //landshark
faction = "savik"
icon_state = "savik"
icon_living = "savik"
icon_dead = "savik_dead"
icon = 'icons/jungle.dmi'
faction = "savik"
maxHealth = 125
health = 125
speed = 2
move_to_delay = 2
melee_damage_lower = 15
melee_damage_upper = 35
attack_armor_pen = 15
attack_sharp = 1
attack_edge = 1
attacktext = list("mauled")
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Hruuugh!","Hrunnph")
emote_see = list("paws the ground","shakes its mane","stomps")
emote_hear = list("snuffles")
/mob/living/simple_animal/hostile/savik/handle_stance(var/new_stance)
..(new_stance)
if(stance == STANCE_ATTACK || stance == STANCE_ATTACKING)
if((health / maxHealth) <= 0.5) // At half health, and fighting someone currently.
add_modifier(/datum/modifier/berserk, 30 SECONDS)

View File

@@ -1,29 +0,0 @@
/mob/living/simple_animal/hostile/shantak
name = "shantak"
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
tt_desc = "S Choeros shantak"
faction = "shantak"
icon_state = "shantak"
icon_living = "shantak"
icon_dead = "shantak_dead"
icon = 'icons/jungle.dmi'
faction = "shantak"
maxHealth = 75
health = 75
speed = 1
move_to_delay = 1
melee_damage_lower = 12
melee_damage_upper = 28
attack_armor_pen = 5
attack_sharp = 1
attack_edge = 1
attacktext = list("gouged")
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Shuhn","Shrunnph?","Shunpf")
emote_see = list("scratches the ground","shakes out its mane","clinks gently as it moves")

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
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
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"
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."
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)
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
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)
src << "You are not inside a host body."
return
if(stat)
src << "You cannot leave your host in your current state."
if(docile)
src << "<font color='blue'>You are feeling far too docile to do that.</font>"
return
if(!host || !src) return
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)
src << "You cannot release your host in your current state."
return
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)
src << "You are already within a host."
return
if(stat)
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)
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())
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())
src << "\The [H] does not have a head!"
if(!H.should_have_organ("brain"))
src << "\The [H] does not seem to have an ear canal to breach."
return
if(H.check_head_coverage())
src << "You cannot get through that host's protective gear."
return
M << "Something slimy begins probing at the opening of your ear canal..."
src << "You slither up [M] and begin probing at their ear canal..."
if(!do_after(src,30))
src << "As [M] moves away, you are dislodged and fall to the ground."
return
if(!M || !src) return
if(src.stat)
src << "You cannot infest a target in your current state."
return
if(M in view(1, src))
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
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)
src << "You are not inside a host body."
return
if(host.stat != 2)
src << "Your host is still alive."
return
if(stat)
src << "You cannot do that in your current state."
if(docile)
src << "<font color='blue'>You are feeling far too docile to do that.</font>"
return
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))
src << "This host does not have a suitable brain."
return
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)
src << "You are not inside a host body."
return
if(stat)
src << "You cannot secrete chemicals in your current state."
if(docile)
src << "<font color='blue'>You are feeling far too docile to do that.</font>"
return
if(chemicals < 50)
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
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)
src << "You cannot use that ability again so soon."
return
if(host)
src << "You cannot do that from within a host body."
return
if(src.stat)
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)
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())
src << "You cannot infest someone who is already infested!"
return
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)
src << "You are not inside a host body."
return
if(src.stat)
src << "You cannot do that in your current state."
return
if(docile)
src << "<font color='blue'>You are feeling far too docile to do that.</font>"
return
src << "You begin delicately adjusting your connection to the host brain..."
spawn(100+(host.brainloss*5))
if(!host || !src || controlling)
return
else
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)
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.
src << "You have no host to speak to."
return //No host, no audible speech.
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,91 +0,0 @@
/mob/living/simple_animal/slime/FindTarget()
if(victim) // Don't worry about finding another target if we're eatting someone.
return
if(follow_mob && can_command(follow_mob)) // If following someone, don't attack until the leader says so, something hits you, or the leader is no longer worthy.
return
..()
/mob/living/simple_animal/slime/Found(mob/living/L)
if(isliving(L))
if(SA_attackable(L))
if(L.faction == faction && !attack_same)
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return H // Monkeys are always food.
else
return
if(L in friends)
return
if(istype(L, /mob/living/simple_animal/slime))
var/mob/living/simple_animal/slime/buddy = L
if(buddy.slime_color == src.slime_color || discipline || unity || buddy.unity)
return // Don't hurt same colored slimes.
else
return buddy //do hurt others
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return H // Monkeys are always food.
if(issilicon(L) || isbot(L))
if(discipline && !rabid)
return // We're a good slime. For now at least.
return
return
/mob/living/simple_animal/slime/special_target_check(mob/living/L)
if(L.faction == faction && !attack_same && !istype(L, /mob/living/simple_animal/slime))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return TRUE // Monkeys are always food.
else
return FALSE
if(L in friends)
return FALSE
if(istype(L, /mob/living/simple_animal/slime))
var/mob/living/simple_animal/slime/buddy = L
if(buddy.slime_color == src.slime_color || discipline || unity || buddy.unity)
return FALSE // Don't hurt same colored slimes.
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.species && H.species.name == "Promethean")
return FALSE // Prometheans are always our friends.
else if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return TRUE // Monkeys are always food.
if(discipline && !rabid)
return FALSE // We're a good slime. For now at least
if(issilicon(L) || isbot(L) )
if(discipline && !rabid)
return FALSE // We're a good slime. For now at least.
return ..() // Other colors and nonslimes are jerks however.
/mob/living/simple_animal/slime/ClosestDistance()
if(target_mob.stat == DEAD)
return 1 // Melee (eat) the target if dead, don't shoot it.
return ..()
/mob/living/simple_animal/slime/HelpRequested(var/mob/living/simple_animal/slime/buddy)
if(istype(buddy))
if(buddy.slime_color != src.slime_color && (!unity || !buddy.unity)) // We only help slimes of the same color, if it's another slime calling for help.
ai_log("HelpRequested() by [buddy] but they are a [buddy.slime_color] while we are a [src.slime_color].",2)
return
if(buddy.target_mob)
if(!special_target_check(buddy.target_mob))
ai_log("HelpRequested() by [buddy] but special_target_check() failed when passed [buddy.target_mob].",2)
return
..()
/mob/living/simple_animal/slime/handle_resist()
if(buckled && victim && isliving(buckled) && victim == buckled) // If it's buckled to a living thing it's probably eating it.
return
else
..()

View File

@@ -1,277 +0,0 @@
/*
// Check target_mob if worthy of attack
/mob/living/simple_animal/slime/SA_attackable(target_mob)
ai_log("SA_attackable([target_mob])",3)
if(isliving(target_mob))
var/mob/living/L = target_mob
if(L.stat == DEAD)
if(can_consume(L)) // If we can eat them, then it doesn't matter if they're dead.
return TRUE
..()
*/
/mob/living/simple_animal/slime/PunchTarget()
if(victim)
return // Already eatting someone.
if(!client) // AI controlled.
if( (!target_mob.lying && prob(60 + (power_charge * 4) ) || (!target_mob.lying && optimal_combat) )) // "Smart" slimes always stun first.
a_intent = I_DISARM // Stun them first.
else if(can_consume(target_mob) && target_mob.lying)
a_intent = I_GRAB // Then eat them.
else
a_intent = I_HURT // Otherwise robust them.
ai_log("PunchTarget() will [a_intent] [target_mob]",2)
..()
/mob/living/simple_animal/slime/proc/can_consume(var/mob/living/L)
if(!L || !istype(L))
to_chat(src, "This subject is incomparable...")
return FALSE
if(L.isSynthetic())
to_chat(src, "This subject is not biological...")
return FALSE
if(L.getarmor(null, "bio") >= 75)
to_chat(src, "I cannot reach this subject's biological matter...")
return FALSE
if(istype(L, /mob/living/simple_animal/slime))
to_chat(src, "I cannot feed on other slimes...")
return FALSE
if(!Adjacent(L))
to_chat(src, "This subject is too far away...")
return FALSE
if(istype(L, /mob/living/carbon) && L.getCloneLoss() >= L.getMaxHealth() * 1.5 || istype(L, /mob/living/simple_animal) && L.stat == DEAD)
to_chat(src, "This subject does not have an edible life energy...")
return FALSE
if(L.has_buckled_mobs())
for(var/A in L.buckled_mobs)
if(istype(A, /mob/living/simple_animal/slime))
if(A != src)
to_chat(src, "\The [A] is already feeding on this subject...")
return FALSE
return TRUE
/mob/living/simple_animal/slime/proc/start_consuming(var/mob/living/L)
if(!can_consume(L))
return
if(!Adjacent(L))
return
step_towards(src, L) // Get on top of them to feed.
if(loc != L.loc)
return
if(L.buckle_mob(src, forced = TRUE))
victim = L
update_icon()
victim.visible_message("<span class='danger'>\The [src] latches onto [victim]!</span>",
"<span class='danger'>\The [src] latches onto you!</span>")
/mob/living/simple_animal/slime/proc/stop_consumption()
if(!victim)
return
victim.unbuckle_mob()
victim.visible_message("<span class='notice'>\The [src] slides off of [victim]!</span>",
"<span class='notice'>\The [src] slides off of you!</span>")
victim = null
update_icon()
/mob/living/simple_animal/slime/proc/handle_consumption()
if(victim && can_consume(victim) && !stat)
var/armor_modifier = abs((victim.getarmor(null, "bio") / 100) - 1)
if(istype(victim, /mob/living/carbon))
victim.adjustCloneLoss(rand(5,6) * armor_modifier)
victim.adjustToxLoss(rand(1,2) * armor_modifier)
if(victim.health <= 0)
victim.adjustToxLoss(rand(2,4) * armor_modifier)
else if(istype(victim, /mob/living/simple_animal))
victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
else
to_chat(src, "<span class='warning'>[pick("This subject is incompatable", \
"This subject does not have a life energy", "This subject is empty", "I am not satisified", \
"I can not feed from this subject", "I do not feel nourished", "This subject is not food")]...</span>")
stop_consumption()
adjust_nutrition(50 * armor_modifier)
adjustOxyLoss(-10 * armor_modifier) //Heal yourself
adjustBruteLoss(-10 * armor_modifier)
adjustFireLoss(-10 * armor_modifier)
adjustCloneLoss(-10 * armor_modifier)
updatehealth()
if(victim)
victim.updatehealth()
else
stop_consumption()
/mob/living/simple_animal/slime/DoPunch(var/mob/living/L)
if(!Adjacent(L)) // Might've moved away in the meantime.
return
if(istype(L))
if(ishuman(L))
var/mob/living/carbon/human/H = L
// Slime attacks can be blocked with shields.
if(H.check_shields(damage = 0, damage_source = null, attacker = src, def_zone = null, attack_text = "the attack"))
return
switch(a_intent)
if(I_HELP)
ai_log("DoPunch() against [L], helping.",2)
L.visible_message("<span class='notice'>[src] gently pokes [L]!</span>",
"<span class='notice'>[src] gently pokes you!</span>")
do_attack_animation(L)
post_attack(L, a_intent)
if(I_DISARM)
ai_log("DoPunch() against [L], disarming.",2)
var/stun_power = between(0, power_charge + rand(0, 3), 10)
if(ishuman(L))
var/mob/living/carbon/human/H = L
stun_power *= max(H.species.siemens_coefficient,0)
if(prob(stun_power * 10))
power_charge = max(0, power_charge - 3)
L.visible_message("<span class='danger'>[src] has shocked [L]!</span>", "<span class='danger'>[src] has shocked you!</span>")
playsound(src, 'sound/weapons/Egloves.ogg', 75, 1)
L.Weaken(4)
L.Stun(4)
do_attack_animation(L)
if(L.buckled)
L.buckled.unbuckle_mob() // To prevent an exploit where being buckled prevents slimes from jumping on you.
L.stuttering = max(L.stuttering, stun_power)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, L)
s.start()
if(prob(stun_power * 10) && stun_power >= 8)
L.adjustFireLoss(power_charge * rand(1, 2))
post_attack(L, a_intent)
else if(prob(40))
L.visible_message("<span class='danger'>[src] has pounced at [L]!</span>", "<span class='danger'>[src] has pounced at you!</span>")
playsound(src, 'sound/weapons/thudswoosh.ogg', 75, 1)
L.Weaken(2)
do_attack_animation(L)
if(L.buckled)
L.buckled.unbuckle_mob() // To prevent an exploit where being buckled prevents slimes from jumping on you.
post_attack(L, a_intent)
else
L.visible_message("<span class='danger'>[src] has tried to pounce at [L]!</span>", "<span class='danger'>[src] has tried to pounce at you!</span>")
playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1)
do_attack_animation(L)
L.updatehealth()
return L
if(I_GRAB)
ai_log("DoPunch() against [L], grabbing.",2)
start_consuming(L)
post_attack(L, a_intent)
if(I_HURT)
ai_log("DoPunch() against [L], hurting.",2)
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1)
L.attack_generic(src, damage_to_do, pick(attacktext))
playsound(src, 'sound/weapons/bite.ogg', 75, 1)
// Give the slime some nutrition, if applicable.
if(!L.isSynthetic())
if(ishuman(L))
if(L.getCloneLoss() < L.getMaxHealth() * 1.5)
adjust_nutrition(damage_to_do * armor_modifier)
else if(istype(L, /mob/living/simple_animal))
if(!isslime(L))
var/mob/living/simple_animal/SA = L
if(!SA.stat)
adjust_nutrition(damage_to_do)
post_attack(L, a_intent)
if(istype(L,/obj/mecha))
var/obj/mecha/M = L
M.attack_generic(src, rand(melee_damage_lower, melee_damage_upper), pick(attacktext))
/mob/living/simple_animal/slime/proc/post_attack(var/mob/living/L, var/intent = I_HURT)
if(intent != I_HELP)
if(L.reagents && L.can_inject() && reagent_injected)
L.reagents.add_reagent(reagent_injected, injection_amount)
/mob/living/simple_animal/slime/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/clothing/head)) // Handle hat simulator.
give_hat(W, user)
return
// Otherwise they're probably fighting the slime.
if(prob(25))
visible_message("<span class='danger'>\The [user]'s [W] passes right through [src]!</span>")
user.setClickCooldown(user.get_attack_speed(W))
return
..()
/mob/living/simple_animal/slime/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
..()
if(!stat)
if(O.force > 0 && discipline && !rabid) // wow, buddy, why am I getting attacked??
adjust_discipline(1)
return
if(O.force >= 3)
if(victim || target_mob) // We've been a bad slime.
if(is_adult)
if(prob(5 + round(O.force / 2)) )
if(prob(80) && !client)
adjust_discipline(2)
if(user)
step_away(src, user)
else
if(prob(10 + O.force * 2))
if(prob(80) && !client)
adjust_discipline(2)
if(user)
step_away(src, user)
else
if(user in friends) // Friend attacking us for no reason.
if(prob(25))
friends -= user
say("[user]... not friend...")
/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M as mob)
if(victim) // Are we eating someone?
var/fail_odds = 30
if(victim == M) // Harder to get the slime off if its eating you right now.
fail_odds = 60
if(prob(fail_odds))
visible_message("<span class='warning'>[M] attempts to wrestle \the [name] off!</span>")
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
visible_message("<span class='warning'> [M] manages to wrestle \the [name] off!</span>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(prob(40) && !client)
adjust_discipline(1)
stop_consumption()
step_away(src,M)
else
if(M.a_intent == I_HELP)
if(hat)
remove_hat(M)
else
..()
else
..()
// Shocked grilles don't hurt slimes, and in fact give them charge.
/mob/living/simple_animal/slime/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null)
power_charge = between(0, power_charge + round(shock_damage / 10), 10)
to_chat(src, "<span class='notice'>\The [source] shocks you, and it charges you.</span>")

View File

@@ -1,27 +0,0 @@
/mob/living/simple_animal/slime/death(gibbed)
if(stat == DEAD)
return
if(!gibbed && is_adult)
var/death_type = type_on_death
if(!death_type)
death_type = src.type
var/mob/living/simple_animal/slime/S = make_new_slime(death_type)
S.rabid = TRUE
step_away(S, src)
is_adult = FALSE
maxHealth = initial(maxHealth)
revive()
if(!client)
rabid = TRUE
number = rand(1, 1000)
update_name()
return
stop_consumption()
. = ..(gibbed, "stops moving and partially dissolves...")
update_icon()
return

View File

@@ -1,183 +0,0 @@
/mob/living/simple_animal/slime/proc/adjust_nutrition(input)
nutrition = between(0, nutrition + input, get_max_nutrition())
if(input > 0)
if(prob(input * 2)) // Gain around one level per 50 nutrition
power_charge = min(power_charge++, 10)
if(power_charge == 10)
adjustToxLoss(-10)
/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it
if(is_adult)
return 1200
return 1000
/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
if(is_adult)
return 1000
return 800
/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat
if(is_adult)
return 600
return 500
/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
if(is_adult)
return 300
return 200
/mob/living/simple_animal/slime/proc/handle_nutrition()
if(docile)
return
if(prob(15))
adjust_nutrition(-1 - is_adult)
if(nutrition <= get_starve_nutrition())
handle_starvation()
else if(nutrition >= get_grow_nutrition() && amount_grown < 10)
adjust_nutrition(-20)
amount_grown = between(0, amount_grown + 1, 10)
/mob/living/simple_animal/slime/proc/handle_starvation()
if(nutrition < get_starve_nutrition() && !client) // if a slime is starving, it starts losing its friends
if(friends.len && prob(1))
var/mob/nofriend = pick(friends)
if(nofriend)
friends -= nofriend
say("[nofriend]... food now...")
if(nutrition <= 0)
adjustToxLoss(rand(1,3))
if(client && prob(5))
to_chat(src, "<span class='danger'>You are starving!</span>")
/mob/living/simple_animal/slime/proc/handle_discipline()
if(discipline > 0)
update_mood()
// if(discipline >= 5 && rabid)
// if(prob(60))
// rabid = 0
// adjust_discipline(1) // So it stops trying to murder everyone.
// Handle discipline decay.
if(!prob(75 + (obedience * 5)))
adjust_discipline(-1)
if(!discipline)
update_mood()
/mob/living/simple_animal/slime/handle_regular_status_updates()
if(stat != DEAD)
handle_nutrition()
handle_discipline()
if(prob(30))
adjustOxyLoss(-1)
adjustToxLoss(-1)
adjustFireLoss(-1)
adjustCloneLoss(-1)
adjustBruteLoss(-1)
if(victim)
handle_consumption()
if(amount_grown >= 10 && !target_mob && !client)
if(is_adult)
reproduce()
else
evolve()
handle_stuttering()
..()
// This is to make slime responses feel a bit more natural and not instant.
/mob/living/simple_animal/slime/proc/delayed_say(var/message, var/mob/target)
spawn(rand(1 SECOND, 2 SECONDS))
if(target)
face_atom(target)
say(message)
//Commands, reactions, etc
/mob/living/simple_animal/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
..()
if((findtext(message, num2text(number)) || findtext(message, name) || findtext(message, "slimes"))) // Talking to us
// First make sure it's not just another slime repeating things.
if(istype(speaker, /mob/living/simple_animal/slime))
if(!speaker.client)
return
//Are all slimes being referred to?
var/mass_order = 0
if(findtext(message, "slimes"))
mass_order = 1
// Say hello back.
if(findtext(message, "hello") || findtext(message, "hi") || findtext(message, "greetings"))
delayed_say(pick("Hello...", "Hi..."), speaker)
// Follow request.
if(findtext(message, "follow") || findtext(message, "come with me"))
if(!can_command(speaker))
delayed_say(pick("No...", "I won't follow..."), speaker)
return
delayed_say("Yes... I follow \the [speaker]...", speaker)
set_follow(speaker)
FollowTarget()
// Stop request.
if(findtext(message, "stop") || findtext(message, "halt") || findtext(message, "cease"))
if(victim) // We're being asked to stop eatting someone.
if(!can_command(speaker))
delayed_say("No...", speaker)
return
else
delayed_say("Fine...", speaker)
stop_consumption()
adjust_discipline(1, TRUE)
if(target_mob) // We're being asked to stop chasing someone.
if(!can_command(speaker))
delayed_say("No...", speaker)
return
else
delayed_say("Fine...", speaker)
LoseTarget()
adjust_discipline(1, TRUE)
if(follow_mob) // We're being asked to stop following someone.
if(can_command(speaker) == SLIME_COMMAND_FRIEND || follow_mob == speaker)
delayed_say("Yes... I'll stop...", speaker)
LoseFollow()
else
delayed_say("No... I'll keep following \the [follow_mob]...", speaker)
// Murder request
if(findtext(message, "harm") || findtext(message, "kill") || findtext(message, "murder") || findtext(message, "eat") || findtext(message, "consume"))
if(can_command(speaker) < SLIME_COMMAND_FACTION)
delayed_say("No...", speaker)
return
for(var/mob/living/L in view(7, src) - list(src, speaker))
if(L == src)
continue // Don't target ourselves.
var/list/valid_names = splittext(L.name, " ") // Should output list("John", "Doe") as an example.
for(var/line in valid_names) // Check each part of someone's name.
if(findtext(message, lowertext(line))) // If part of someone's name is in the command, the slime targets them if allowed to.
if(!(mass_order && line == "slime")) //don't think random other slimes are target
if(special_target_check(L))
delayed_say("Okay... I attack \the [L]...", speaker)
LoseFollow()
set_target(L, 1)
return
else
delayed_say("No... I won't attack \the [L].", speaker)
return
// If we're here, it couldn't find anyone with that name.
delayed_say("No... I don't know who to attack...", speaker)

View File

@@ -1,470 +0,0 @@
/mob/living/simple_animal/slime
name = "slime"
desc = "The most basic of slimes. The grey slime has no remarkable qualities, however it remains one of the most useful colors for scientists."
tt_desc = "A Macrolimbus vulgaris"
icon = 'icons/mob/slime2.dmi'
icon_state = "grey baby slime"
intelligence_level = SA_ANIMAL
pass_flags = PASSTABLE
var/shiny = FALSE // If true, will add a 'shiny' overlay.
var/glows = FALSE // If true, will glow in the same color as the color var.
var/icon_state_override = null // Used for special slime appearances like the rainbow slime.
pass_flags = PASSTABLE
makes_dirt = FALSE // Goop
speak_emote = list("chirps")
maxHealth = 150
var/maxHealth_adult = 200
melee_damage_lower = 10
melee_damage_upper = 15
melee_miss_chance = 0
gender = NEUTER
// Atmos stuff.
minbodytemp = T0C-30
heat_damage_per_tick = 0
cold_damage_per_tick = 40
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
response_help = "pets"
speak = list(
"Blorp...",
"Blop..."
)
emote_hear = list(
)
emote_see = list(
"bounces",
"jiggles",
"sways"
)
hostile = 1
retaliate = 1
attack_same = 1
cooperative = 1
faction = "slime" // Slimes will help other slimes, provided they share the same color.
color = "#CACACA"
var/is_adult = FALSE
var/cores = 1 // How many cores you get when placed in a Processor.
var/power_charge = 0 // 0-10 controls how much electricity they are generating. High numbers encourage the slime to stun someone with electricity.
var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
var/number = 0 // This is used to make the slime semi-unique for indentification.
var/mob/living/victim = null // the person the slime is currently feeding on
var/rabid = FALSE // If true, will attack anyone and everyone.
var/docile = FALSE // Basically the opposite of above. If true, will never harm anything and won't get hungry.
var/discipline = 0 // Beating slimes makes them less likely to lash out. In theory.
var/resentment = 0 // 'Unjustified' beatings make this go up, and makes it more likely for abused slimes to go berserk.
var/obedience = 0 // Conversely, 'justified' beatings make this go up, and makes discipline decay slowly, potentially making it not decay at all.
var/unity = FALSE // If true, slimes will consider other colors as their own. Other slimes will see this slime as the same color as well. A rainbow slime is required to get this.
var/optimal_combat = FALSE // Used to dumb down the combat AI somewhat. If true, the slime tends to be really dangerous to fight alone due to stunlocking.
var/mood = ":3" // Icon to use to display 'mood'.
var/obj/item/clothing/head/hat = null // The hat the slime may be wearing.
var/slime_color = "grey"
var/mutation_chance = 25 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes.
var/coretype = /obj/item/slime_extract/grey
// List of potential slime color mutations. This must have exactly four types.
var/list/slime_mutation = list(
/mob/living/simple_animal/slime/orange,
/mob/living/simple_animal/slime/metal,
/mob/living/simple_animal/slime/blue,
/mob/living/simple_animal/slime/purple
)
var/type_on_death = null // Set this if you want dying slimes to split into a specific type and not their type.
var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly.
var/reagent_injected = null // Some slimes inject reagents on attack. This tells the game what reagent to use.
var/injection_amount = 5 // This determines how much.
can_enter_vent_with = list(
/obj/item/clothing/head,
)
/mob/living/simple_animal/slime/New(var/location, var/start_as_adult = FALSE)
verbs += /mob/living/proc/ventcrawl
if(start_as_adult)
make_adult()
health = maxHealth
// slime_mutation = mutation_table(slime_color)
update_icon()
number = rand(1, 1000)
update_name()
..(location)
/mob/living/simple_animal/slime/Destroy()
if(hat)
drop_hat()
return ..()
/mob/living/simple_animal/slime/proc/make_adult()
if(is_adult)
return
is_adult = TRUE
melee_damage_lower = 20
melee_damage_upper = 40
maxHealth = maxHealth_adult
amount_grown = 0
update_icon()
update_name()
/mob/living/simple_animal/slime/proc/update_name()
if(docile) // Docile slimes are generally named, so we shouldn't mess with it.
return
name = "[slime_color] [is_adult ? "adult" : "baby"] [initial(name)] ([number])"
real_name = name
/mob/living/simple_animal/slime/update_icon()
if(stat == DEAD)
icon_state = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead"
set_light(0)
else
if(incapacitated(INCAPACITATION_DISABLED))
icon_state = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead"
else
icon_state = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"][victim ? " eating":""]"
overlays.Cut()
if(stat != DEAD)
var/image/I = image(icon, src, "slime light")
I.appearance_flags = RESET_COLOR
overlays += I
if(shiny)
I = image(icon, src, "slime shiny")
I.appearance_flags = RESET_COLOR
overlays += I
I = image(icon, src, "aslime-[mood]")
I.appearance_flags = RESET_COLOR
overlays += I
if(glows)
set_light(3, 2, color)
if(hat)
var/hat_state = hat.item_state ? hat.item_state : hat.icon_state
var/image/I = image('icons/mob/head.dmi', src, hat_state)
I.pixel_y = -7 // Slimes are small.
I.appearance_flags = RESET_COLOR
overlays += I
if(modifier_overlay) // Restore our modifier overlay.
overlays += modifier_overlay
/mob/living/simple_animal/slime/proc/update_mood()
var/old_mood = mood
if(incapacitated(INCAPACITATION_DISABLED))
mood = "sad"
else if(rabid)
mood = "angry"
else if(target_mob)
mood = "mischevous"
else if(discipline)
mood = "pout"
else if(docile)
mood = ":33"
else
mood = ":3"
if(old_mood != mood)
update_icon()
// Makes the slime very angry and dangerous.
/mob/living/simple_animal/slime/proc/enrage()
if(docile)
return
rabid = TRUE
update_mood()
visible_message("<span class='danger'>\The [src] enrages!</span>")
// Makes the slime safe and harmless.
/mob/living/simple_animal/slime/proc/pacify()
rabid = FALSE
docile = TRUE
hostile = FALSE
retaliate = FALSE
cooperative = FALSE
// If for whatever reason the mob AI decides to try to attack something anyways.
melee_damage_upper = 0
melee_damage_lower = 0
update_mood()
/mob/living/simple_animal/slime/proc/unify()
unity = TRUE
attack_same = FALSE
/mob/living/simple_animal/slime/examine(mob/user)
..()
if(hat)
to_chat(user, "It is wearing \a [hat].")
if(stat == DEAD)
to_chat(user, "It appears to be dead.")
else if(incapacitated(INCAPACITATION_DISABLED))
to_chat(user, "It appears to be incapacitated.")
else if(rabid)
to_chat(user, "It seems very, very angry and upset.")
else if(obedience >= 5)
to_chat(user, "It looks rather obedient.")
else if(discipline)
to_chat(user, "It has been subjugated by force, at least for now.")
else if(docile)
to_chat(user, "It appears to have been pacified.")
/mob/living/simple_animal/slime/water_act(amount) // This is called if a slime enters a water tile.
adjustBruteLoss(40 * amount)
/mob/living/simple_animal/slime/proc/adjust_discipline(amount, silent)
if(amount > 0)
if(!rabid)
var/justified = is_justified_to_discipline()
spawn(0)
stop_consumption()
LoseTarget()
if(!silent)
if(justified)
say(pick("Fine...", "Okay...", "Sorry...", "I yield...", "Mercy..."))
else
say(pick("Why...?", "I don't understand...?", "Cruel...", "Stop...", "Nooo..."))
if(justified)
obedience++
else
if(prob(resentment * 20))
enrage() // Pushed the slime too far.
say(pick("Evil...", "Kill...", "Tyrant..."))
resentment++ // Done after check so first time will never enrage.
discipline = between(0, discipline + amount, 10)
/mob/living/simple_animal/slime/movement_delay()
if(bodytemperature >= 330.23) // 135 F or 57.08 C
return -1 // slimes become supercharged at high temperatures
. = ..()
var/health_deficiency = (maxHealth - health)
if(health_deficiency >= 45)
. += (health_deficiency / 25)
if(bodytemperature < 183.222)
. += (283.222 - bodytemperature) / 10 * 1.75
. += config.slime_delay
/mob/living/simple_animal/slime/Process_Spacemove()
return 2
/mob/living/simple_animal/slime/verb/evolve()
set category = "Slime"
set desc = "This will let you evolve from baby to adult slime."
if(stat)
to_chat(src, "<span class='notice'>I must be conscious to do this...</span>")
return
if(docile)
to_chat(src, "<span class='notice'>I have been pacified. I cannot evolve...</span>")
return
if(!is_adult)
if(amount_grown >= 10)
make_adult()
else
to_chat(src, "<span class='notice'>I am not ready to evolve yet...</span>")
else
to_chat(src, "<span class='notice'>I have already evolved...</span>")
/mob/living/simple_animal/slime/verb/reproduce()
set category = "Slime"
set desc = "This will make you split into four Slimes."
if(stat)
to_chat(src, "<span class='notice'>I must be conscious to do this...</span>")
return
if(docile)
to_chat(src, "<span class='notice'>I have been pacified. I cannot reproduce...</span>")
return
if(is_adult)
if(amount_grown >= 10)
// Check if there's enough 'room' to split.
var/list/nearby_things = orange(1, src)
var/free_tiles = 0
for(var/turf/T in nearby_things)
var/free = TRUE
if(T.density) // No walls.
continue
for(var/atom/movable/AM in T)
if(AM.density)
free = FALSE
break
if(free)
free_tiles++
if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies.
to_chat(src, "<span class='warning'>It is too cramped here to reproduce...</span>")
return
var/list/babies = list()
for(var/i = 1 to 4)
babies.Add(make_new_slime())
var/mob/living/simple_animal/slime/new_slime = pick(babies)
new_slime.universal_speak = universal_speak
if(src.mind)
src.mind.transfer_to(new_slime)
else
new_slime.key = src.key
qdel(src)
else
to_chat(src, "<span class='notice'>I am not ready to reproduce yet...</span>")
else
to_chat(src, "<span class='notice'>I am not old enough to reproduce yet...</span>")
// Used for reproducing and dying.
/mob/living/simple_animal/slime/proc/make_new_slime(var/desired_type)
var/t = src.type
if(desired_type)
t = desired_type
if(prob(mutation_chance / 10))
t = /mob/living/simple_animal/slime/rainbow
else if(prob(mutation_chance) && slime_mutation.len)
t = slime_mutation[rand(1, slime_mutation.len)]
var/mob/living/simple_animal/slime/baby = new t(loc)
// Handle 'inheriting' from parent slime.
baby.mutation_chance = mutation_chance
baby.power_charge = round(power_charge / 4)
baby.resentment = max(resentment - 1, 0)
if(!istype(baby, /mob/living/simple_animal/slime/light_pink))
baby.discipline = max(discipline - 1, 0)
baby.obedience = max(obedience - 1, 0)
if(!istype(baby, /mob/living/simple_animal/slime/rainbow))
baby.unity = unity
baby.faction = faction
baby.attack_same = attack_same
baby.friends = friends.Copy()
if(rabid)
baby.enrage()
step_away(baby, src)
return baby
/mob/living/simple_animal/slime/speech_bubble_appearance()
return "slime"
// Called after they finish eatting someone.
/mob/living/simple_animal/slime/proc/befriend(var/mob/living/friend)
if(!(friend in friends))
friends |= friend
say("[friend]... friend...")
/mob/living/simple_animal/slime/proc/can_command(var/mob/living/commander)
if(rabid)
return FALSE
if(docile)
return SLIME_COMMAND_OBEY
if(commander in friends)
return SLIME_COMMAND_FRIEND
if(faction == commander.faction)
return SLIME_COMMAND_FACTION
if(discipline > resentment && obedience >= 5)
return SLIME_COMMAND_OBEY
return FALSE
/mob/living/simple_animal/slime/proc/give_hat(var/obj/item/clothing/head/new_hat, var/mob/living/user)
if(!istype(new_hat))
to_chat(user, "<span class='warning'>\The [new_hat] isn't a hat.</span>")
return
if(hat)
to_chat(user, "<span class='warning'>\The [src] is already wearing \a [hat].</span>")
return
else
user.drop_item(new_hat)
hat = new_hat
new_hat.forceMove(src)
to_chat(user, "<span class='notice'>You place \a [new_hat] on \the [src]. How adorable!</span>")
update_icon()
return
/mob/living/simple_animal/slime/proc/remove_hat(var/mob/living/user)
if(!hat)
to_chat(user, "<span class='warning'>\The [src] doesn't have a hat to remove.</span>")
else
hat.forceMove(get_turf(src))
user.put_in_hands(hat)
to_chat(user, "<span class='warning'>You take away \the [src]'s [hat.name]. How mean.</span>")
hat = null
update_icon()
/mob/living/simple_animal/slime/proc/drop_hat()
if(!hat)
return
hat.forceMove(get_turf(src))
hat = null
update_icon()
// Checks if disciplining the slime would be 'justified' right now.
/mob/living/simple_animal/slime/proc/is_justified_to_discipline()
if(rabid)
return TRUE
if(target_mob)
if(ishuman(target_mob))
var/mob/living/carbon/human/H = target_mob
if(istype(H.species, /datum/species/monkey))
return FALSE
return TRUE
return FALSE
/mob/living/simple_animal/slime/get_description_interaction()
var/list/results = list()
if(!stat)
results += "[desc_panel_image("slimebaton")]to stun the slime, if it's being bad."
results += ..()
return results
/mob/living/simple_animal/slime/get_description_info()
var/list/lines = list()
var/intro_line = "Slimes are generally the test subjects of Xenobiology, with different colors having different properties. \
They can be extremely dangerous if not handled properly."
lines.Add(intro_line)
lines.Add(null) // To pad the line breaks.
var/list/rewards = list()
for(var/potential_color in slime_mutation)
var/mob/living/simple_animal/slime/S = potential_color
rewards.Add(initial(S.slime_color))
var/reward_line = "This color of slime can mutate into [english_list(rewards)] colors, when it reproduces. It will do so when it has eatten enough."
lines.Add(reward_line)
lines.Add(null)
lines.Add(description_info)
return lines.Join("\n")

View File

@@ -1,747 +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 = 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()
radiation_repository.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

@@ -1,32 +0,0 @@
/mob/living/simple_animal/hostile/carp/large/huge
name = "great white carp"
desc = "You're going to need a bigger ship."
icon = 'icons/mob/vore64x64.dmi'
icon_dead = "megacarp-dead"
icon_living = "megacarp"
icon_state = "megacarp"
maxHealth = 600 // Boss
health = 600
speed = 3
meat_amount = 10
melee_damage_lower = 10
melee_damage_upper = 25
old_x = -16
old_y = -16
default_pixel_x = -16
default_pixel_y = -16
pixel_x = -16
pixel_y = -16
vore_capacity = 2
// Activate Noms!
/mob/living/simple_animal/hostile/carp/large
icon = 'icons/mob/vore64x64.dmi'
vore_active = 1
vore_pounce_chance = 50
vore_capacity = 1
vore_max_size = RESIZE_HUGE
vore_icons = SA_ICON_LIVING