Merge branch 'upstream/master'

This commit is contained in:
Kelenius
2014-05-20 13:23:46 +04:00
17 changed files with 469 additions and 564 deletions

View File

@@ -2,8 +2,13 @@
language: c
env:
BYOND_MAJOR="503"
BYOND_MINOR="1224"
global:
- BYOND_MAJOR="504"
- BYOND_MINOR="1232"
matrix:
- DM_MAPFILE="tgstation2"
- DM_MAPFILE="metastation"
- DM_MAPFILE="ministation"
before_install:
- sudo apt-get update -qq
@@ -17,4 +22,4 @@ install:
- cd ..
script:
- DreamMaker tgstation.dme
- bash dm.sh -M${DM_MAPFILE} tgstation.dme

View File

@@ -8,17 +8,17 @@
announcement += "<h1 class='alert'>Priority Announcement</h1>"
else if(type == "Captain")
news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null)
announcement += "<h1 class='alert'>Captain Announces</h1>"
news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null)
else
announcement += "<h1 class='alert'>[command_name()] Update</h1>"
if (title && length(title) > 0)
announcement += "<br><h2 class='alert'>[html_encode(title)]</h2>"
if(title == "")
news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null)
else
news_network.SubmitArticle(title + "<br><br>" + text, "Central Command", "Station Announcements", null)
announcement += "<h1 class='alert'>[command_name()] Update</h1>"
announcement += "<br><span class='alert'>[html_encode(text)]</span><br>"
announcement += "<br>"

View File

@@ -300,8 +300,17 @@ obj/machinery/smartfridge/drying_rack/load() //For updating the filled overlay
/obj/machinery/smartfridge/extract/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/slime_extract))
return 1
if(istype(O,/obj/item/device/slime_scanner))
return 1
return 0
/obj/machinery/smartfridge/extract/New()
..()
var/obj/item/device/slime_scanner/I = new /obj/item/device/slime_scanner(src)
load(I)
var/obj/item/device/slime_scanner/T = new /obj/item/device/slime_scanner(src)
load(T)
// -----------------------------
// Chemistry Medical Smartfridge
// -----------------------------

View File

@@ -301,3 +301,47 @@ MASS SPECTROMETER
icon_state = "adv_spectrometer"
details = 1
origin_tech = "magnets=4;biotech=2"
/obj/item/device/slime_scanner
name = "slime scanner"
icon_state = "adv_spectrometer"
item_state = "analyzer"
origin_tech = "biotech=1"
w_class = 2.0
flags = CONDUCT
throwforce = 0
throw_speed = 3
throw_range = 7
m_amt = 30
g_amt = 20
/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
if (!isslime(M))
user << "<B>This device can only scan slimes!</B>"
return
var/mob/living/carbon/slime/T = M
user.show_message("Slime scan results:")
user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"))
user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()))
if (T.nutrition < T.get_starve_nutrition())
user.show_message("<span class='alert'>Warning: slime is starving!</span>")
else if (T.nutrition < T.get_hunger_nutrition())
user.show_message("<span class='warning'>Warning: slime is hungry</span>")
user.show_message("Electric change strength: [T.powerlevel]")
user.show_message("Health: [T.health]")
if (T.slime_mutation[4] == T.colour)
user.show_message("This slime does not evolve any further")
else
if (T.slime_mutation[3] == T.slime_mutation[4])
if (T.slime_mutation[2] == T.slime_mutation[1])
user.show_message(text("Possible mutation: []", T.slime_mutation[3]))
user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting")
else
user.show_message(text("Possible mutations: [], [], [] (x2)", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3]))
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting")
else
user.show_message(text("Possible mutations: [], [], [], []", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3], T.slime_mutation[4]))
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting")
if (T.cores > 1)
user.show_message("Anomalious slime core amount detected")
user.show_message("Growth progress: [T.amount_grown]/10")

View File

@@ -158,48 +158,19 @@
throw_speed = 3
throw_range = 7
w_class = 3.0
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
user << "<span class='danger'>The [src] slips out of your hand and hits your head.</span>"
user.take_organ_damage(10)
user.Paralyse(2)
return
add_logs(user, M, "attacked", object="[src.name]")
var/t = user:zone_sel.selecting
if (t == "head")
if(ishuman(M))
var/mob/living/carbon/human/H = M
if (H.stat < 2 && H.health < 50 && prob(90))
// ******* Check
if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
H << "<span class='danger'> The helmet protects you from being hit hard in the head!</span>"
return
var/time = rand(2, 6)
if (prob(75))
H.Paralyse(time)
else
H.Stun(time)
if(H.stat != 2) H.stat = 1
user.visible_message("<span class='danger'>[H] has been knocked unconscious!</span>", "<span class='userdanger'>You knock [H] unconscious!</span>")
return
else
H.visible_message("<span class='danger'> [user] tried to knock [H] unconscious!</span>", "<span class='danger'> [user] tried to knock you unconscious!</span>")
H.eye_blurry += 3
return ..()
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
/*
* Trays - Agouri
*/
/obj/item/weapon/tray
name = "tray"
icon = 'icons/obj/food.dmi'
icon_state = "tray"
desc = "A metal tray to lay food on."
force = 8
hitsound = 'sound/items/trayhit1.ogg'
throwforce = 10.0
throw_speed = 3
throw_range = 5
@@ -211,104 +182,6 @@
// w_class = 2 -- takes up 3
// w_class = 3 -- takes up 5
/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
// Drop all the things. All of them.
overlays.Cut()
for(var/obj/item/I in carrying)
I.loc = M.loc
carrying.Remove(I)
if(isturf(I.loc))
spawn()
for(var/i = 1, i <= rand(1,2), i++)
if(I)
step(I, pick(NORTH,SOUTH,EAST,WEST))
sleep(rand(2,4))
if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
user << "<span class='danger'> You accidentally slam yourself with the [src]!</span>"
user.Weaken(1)
user.take_organ_damage(2)
if(prob(50))
playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
return
else
playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
add_logs(user, M, "attacked", object="[src.name]")
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
if(prob(50))
playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
else
playsound(M, 'sound/items/trayhit2.ogg', 50, 1)
if(prob(33))
src.add_blood(H)
var/turf/location = H.loc
if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor.
location.add_blood(H)
if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
H.visible_message("<span class='danger'>[user] slams [H] with the tray!</span>", \
"<span class='userdanger'>[user] slams [H] with the tray!</span>")
if(prob(15))
M.Weaken(3)
M.take_organ_damage(3)
return
else
M.take_organ_damage(5)
return
if((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))
if(prob(33))
if (H.wear_mask)
H.wear_mask.add_blood(H) //adding blood on the items.
if (H.head)
H.head.add_blood(H)
if (H.glasses && prob(33))
H.glasses.add_blood(H)
M.visible_message("<span class='danger'>[user] slams [M] in the face with the tray!</span>", \
"<span class='userdanger'>[user] slams [M] in the face with the tray, against your mask!</span>")
if(prob(10))
M.Stun(rand(1,3))
M.take_organ_damage(3)
return
else
M.take_organ_damage(5)
return
else //No eye or head protection, tough luck!
M.visible_message("<span class='danger'>[user] slams [M] in the face with the tray!</span>", \
"<span class='userdanger'>[user] slams [M] in the face with the tray!</span>")
if(prob(30))
M.Stun(rand(2,4))
M.take_organ_damage(4)
return
else
M.take_organ_damage(8)
if(prob(30))
M.Weaken(2)
return
return
else
..()
/*
===============~~~~~================================~~~~~====================
= =
@@ -374,48 +247,3 @@
if(I)
step(I, pick(NORTH,SOUTH,EAST,WEST))
sleep(rand(2,4))
/////////////////////////////////////////////////////////////////////////////////////////
//Enough with the violent stuff, here's what happens if you try putting food on it
/////////////////////////////////////////////////////////////////////////////////////////////
/*/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/kitchen/utensil/fork))
if (W.icon_state == "forkloaded")
user << "\red You already have omelette on your fork."
return
W.icon = 'icons/obj/kitchen.dmi'
W.icon_state = "forkloaded"
viewers(3,user) << "[user] takes a piece of omelette with his fork!"
reagents.remove_reagent("nutriment", 1)
if (reagents.total_volume <= 0)
qdel(src)*/
/* if (prob(33))
var/turf/location = H.loc
if (istype(location, /turf/simulated))
location.add_blood(H)
if (H.wear_mask)
H.wear_mask.add_blood(H)
if (H.head)
H.head.add_blood(H)
if (H.glasses && prob(33))
H.glasses.add_blood(H)
if (istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
if (user2.gloves)
user2.gloves.add_blood(H)
else
user2.add_blood(H)
if (prob(15))
if (user2.wear_suit)
user2.wear_suit.add_blood(H)
else if (user2.w_uniform)
user2.w_uniform.add_blood(H)*/

View File

@@ -19,34 +19,3 @@
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/pen(src)
/obj/item/weapon/storage/briefcase/attack(mob/living/M as mob, mob/living/user as mob)
//..()
if ((CLUMSY in user.mutations) && prob(50))
user << "\red The [src] slips out of your hand and hits your head."
user.take_organ_damage(10)
user.Paralyse(2)
return
add_logs(user, M, "attacked", object="[src.name]")
if (M.stat < 2 && M.health < 50 && prob(90))
var/mob/H = M
// ******* Check
if ((istype(H, /mob/living/carbon/human) && istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80)))
M << "\red The helmet protects you from being hit hard in the head!"
return
var/time = rand(2, 6)
if (prob(75))
M.Paralyse(time)
else
M.Stun(time)
if(M.stat != 2) M.stat = 1
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] has been knocked unconscious!</B>", M), 1, "\red You hear someone fall.", 2)
else
M << text("\red [] tried to knock you unconcious!",user)
M.eye_blurry += 3
return

View File

@@ -181,42 +181,6 @@
src.add_fingerprint(user)
return
//I consider this worthless but it isn't my code so whatever. Remove or uncomment.
/*attack(mob/M as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
user << "\red The [src] slips out of your hand and hits your head."
user.take_organ_damage(10)
user.Paralyse(2)
return
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
log_attack("<font color='red'>[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
var/t = user:zone_sel.selecting
if (t == "head")
if(ishuman(M))
var/mob/living/carbon/human/H = M
if (H.stat < 2 && H.health < 50 && prob(90))
// ******* Check
if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
H << "\red The helmet protects you from being hit hard in the head!"
return
var/time = rand(2, 6)
if (prob(75))
H.Paralyse(time)
else
H.Stun(time)
if(H.stat != 2) H.stat = 1
for(var/mob/O in viewers(H, null))
O.show_message(text("\red <B>[] has been knocked unconscious!</B>", H), 1, "\red You hear someone fall.", 2)
else
H << text("\red [] tried to knock you unconcious!",user)
H.eye_blurry += 3
return*/
// -----------------------------
// Secure Safe
// -----------------------------

View File

@@ -8,12 +8,14 @@
maxHealth = 150
revive()
regenerate_icons()
name = "[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])"
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
if(stat == DEAD) return
stat = DEAD
icon_state = "[colour] baby slime dead"
overlays = 0
for(var/mob/O in viewers(src, null))
O.show_message("<b>The [name]</b> seizes up and falls limp...", 1) //ded -- Urist

View File

@@ -5,8 +5,6 @@
var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
var/SStun = 0 // stun variable
/mob/living/carbon/slime/Life()
set invisibility = 0
set background = BACKGROUND_ENABLED
@@ -24,88 +22,69 @@
handle_targets()
if (!ckey)
handle_speech_and_mood()
var/datum/gas_mixture/environment
if(src.loc)
environment = loc.return_air()
//Apparently, the person who wrote this code designed it so that
//blinded get reset each cycle and then get activated later in the
//code. Very ugly. I dont care. Moving this stuff here so its easy
//to find it.
src.blinded = null
// Basically just deletes any screen objects :<
regular_hud_updates()
regular_hud_updates() // Basically just deletes any screen objects :<
//Handle temperature/pressure differences between body and environment
if(environment)
handle_environment(environment)
//Status updates, death etc.
handle_regular_status_updates()
handle_environment(environment) // Handle temperature/pressure differences between body and environment
handle_regular_status_updates() // Status updates, death etc.
/mob/living/carbon/slime/proc/AIprocess() // the master AI process
//world << "AI proc started."
if(AIproc || stat == DEAD || client) return
var/hungry = 0
var/starving = 0
if(is_adult)
switch(nutrition)
if(400 to 1100) hungry = 1
if(0 to 399)
starving = 1
else
switch(nutrition)
if(150 to 900) hungry = 1
if(0 to 149) starving = 1
if (nutrition < get_starve_nutrition())
hungry = 2
else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
hungry = 1
AIproc = 1
//world << "AIproc [AIproc] && stat != 2 [stat] && (attacked > 0 [attacked] || starving [starving] || hungry [hungry] || rabid [rabid] || Victim [Victim] || Target [Target]"
while(AIproc && stat != 2 && (attacked > 0 || starving || hungry || rabid || Victim))
while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim))
if(Victim) // can't eat AND have this little process at the same time
//world << "break 1"
break
if(!Target || client)
//world << "break 2"
break
if(Target.health <= -70 || Target.stat == 2)
Target = null
AIproc = 0
//world << "break 3"
break
if(Target)
//world << "[Target] Target Found"
for(var/mob/living/carbon/slime/M in view(1,Target))
if(M.Victim == Target)
Target = null
AIproc = 0
//world << "break 4"
break
if(!AIproc)
//world << "break 5"
break
if(Target in view(1,src))
if(istype(Target, /mob/living/silicon))
if(!Atkcool)
spawn()
Atkcool = 1
sleep(15)
sleep(45)
Atkcool = 0
if(Target.Adjacent(src))
Target.attack_slime(src)
//world << "retrun 1"
return
if(!Target.lying && prob(80))
@@ -113,16 +92,12 @@
if(!Atkcool)
spawn()
Atkcool = 1
sleep(25)
sleep(45)
Atkcool = 0
if(Target.Adjacent(src))
Target.attack_slime(src)
if(prob(30))
step_to(src, Target)
else
if(!Atkcool && Target.Adjacent(src))
Feedon(Target)
@@ -133,13 +108,12 @@
else
if(Target in view(7, src))
if(Target.Adjacent(src))
if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them
step_to(src, Target)
else
Target = null
AIproc = 0
//world << "break 6"
break
var/sleeptime = movement_delay()
@@ -148,7 +122,6 @@
sleep(sleeptime + 2) // this is about as fast as a player slime can go
AIproc = 0
//world << "AI proc ended."
/mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment)
if(!environment)
@@ -158,28 +131,11 @@
//var/environment_heat_capacity = environment.heat_capacity()
var/loc_temp = get_temperature(environment)
/*
if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
var/transfer_coefficient
transfer_coefficient = 1
if(wear_mask && (wear_mask.body_parts_covered & HEAD) && (environment.temperature < wear_mask.protective_temperature))
transfer_coefficient *= wear_mask.heat_transfer_coefficient
// handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
*/
if(loc_temp < 310.15) // a cold place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
else // a hot place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
/*
if(stat==2)
bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
*/
//Account for massive pressure differences
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
@@ -199,7 +155,6 @@
return //TODO: DEFERRED
/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost)
var/temperature = current
var/difference = abs(current-loc_temp) //get difference
@@ -221,12 +176,10 @@
if(reagents) reagents.metabolize(src)
src.updatehealth()
return //TODO: DEFERRED
/mob/living/carbon/slime/proc/handle_regular_status_updates()
if(is_adult)
@@ -234,20 +187,17 @@
else
health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
if(health < config.health_threshold_dead && stat != 2)
death()
return
else if(src.health < config.health_threshold_crit)
// if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
//if(!src.rejuv) src.oxyloss++
if(!src.reagents.has_reagent("inaprovaline")) src.adjustOxyLoss(10)
if(!src.reagents.has_reagent("inaprovaline"))
src.adjustOxyLoss(10)
if(src.stat != DEAD) src.stat = UNCONSCIOUS
if(src.stat != DEAD)
src.stat = UNCONSCIOUS
if(prob(30))
adjustOxyLoss(-1)
@@ -256,12 +206,9 @@
adjustCloneLoss(-1)
adjustBruteLoss(-1)
if (src.stat == DEAD)
src.lying = 1
src.blinded = 1
else
if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc.
if (src.stunned > 0)
@@ -306,33 +253,23 @@
return 1
/mob/living/carbon/slime/proc/handle_nutrition()
if(prob(20))
if(is_adult) nutrition-=rand(4,6)
else nutrition-=rand(2,3)
if (prob(15))
nutrition -= 1 + is_adult
if(nutrition <= 0)
nutrition = 0
if(prob(75))
adjustToxLoss(rand(0,5))
else
if(is_adult)
if(nutrition >= 1000)
if(prob(40)) amount_grown++
else if (nutrition >= get_grow_nutrition() && amount_grown < 10)
nutrition -= 20
amount_grown++
else
if(nutrition >= 800)
if(prob(40)) amount_grown++
if(amount_grown >= 10 && !Victim && !Target)
if(!ckey)
if(amount_grown >= 10 && !Victim && !Target && !ckey)
if(is_adult)
Reproduce()
else
Evolve()
@@ -346,7 +283,6 @@
if(attacked > 50) attacked = 50
if(attacked > 0)
if(prob(85))
attacked--
if(Discipline > 0)
@@ -357,89 +293,57 @@
if(prob(10))
Discipline--
if(!client)
if(!canmove) return
// DO AI STUFF HERE
if(Target)
if(attacked <= 0)
Target = null
if(Victim) return // if it's eating someone already, continue eating!
if(prob(1))
emote(pick("bounce","sway","light","vibrate","jiggle"))
if(Target)
--target_patience
if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention
target_patience = 0
Target = null
if(AIproc && SStun) return
var/hungry = 0 // determines if the slime is hungry
var/starving = 0 // determines if the slime is starving-hungry
if(is_adult) // 1200 max nutrition
switch(nutrition)
if(601 to 900)
if(prob(25)) hungry = 1//Ensures they continue eating, but aren't as aggressive at the same time
if(301 to 600) hungry = 1
if(0 to 300)
starving = 1
else
switch(nutrition) // 1000 max nutrition
if(501 to 700)
if(prob(25)) hungry = 1
if(201 to 500) hungry = 1
if(0 to 200) starving = 1
if (nutrition < get_starve_nutrition())
hungry = 2
else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
hungry = 1
if(starving && !client) // if a slime is starving, it starts losing its friends
if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends
if(Friends.len > 0 && prob(1))
var/mob/nofriend = pick(Friends)
Friends -= nofriend
--Friends[nofriend]
if(!Target)
if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to
var/list/targets = list()
if(hungry || starving) //Only add to the list if we need to
for(var/mob/living/L in view(7,src))
//Ignore other slimes, dead mobs and simple_animals
if(isslime(L) || L.stat != CONSCIOUS || isanimal(L))
if(isslime(L) || L.stat == DEAD || isanimal(L)) // Ignore other slimes, dead mobs, and simple_animals
continue
if(issilicon(L))
if(!is_adult) //Non-starving diciplined adult slimes wont eat things
if(!starving && Discipline > 0)
if(L in Friends) // No eating friends!
continue
if(tame) //Tame slimes ignore electronic life
if(issilicon(L)) // They can't eat silicons, but they can glomp them in defence
if (rabid || attacked)
targets += L // Possible target found!
if(!iscarbon(L))
continue
targets += L //Possible target found!
else if(iscarbon(L))
if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
if(istype(L, /mob/living/carbon/human)) // Ignore slime(wo)men
var/mob/living/carbon/human/H = L
if(H.dna)
if(H.dna.mutantrace == "slime")
continue
if(!is_adult) //Non-starving diciplined adult slimes wont eat things
if(!starving && Discipline > 0)
continue
if(L in Friends) //No eating friends!
continue
if(tame && ishuman(L)) //Tame slimes dont eat people.
continue
if(!L.canmove) //Only one slime can latch on at a time.
if(!L.canmove) // Only one slime can latch on at a time.
var/notarget = 0
for(var/mob/living/carbon/slime/M in view(1,L))
if(M.Victim == L)
@@ -447,46 +351,215 @@
if(notarget)
continue
targets += L //Possible target found!
if((hungry || starving) && targets.len > 0)
if(!is_adult)
if(!starving)
for(var/mob/living/carbon/C in targets)
if(!Discipline && prob(5))
if(ishuman(C))
Target = C
break
if(isalienadult(C))
Target = C
break
if(islarva(C))
Target = C
break
if(ismonkey(C))
Target = C
break
else
Target = targets[1]
else
Target = targets[1] // closest target
targets += L // Possible target found!
if(targets.len > 0)
if(attacked > 0 || rabid)
Target = targets[1] //closest mob probably attacked it, so override Target and attack the nearest!
if(attacked || rabid || hungry == 2)
Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care
else
for(var/mob/living/carbon/C in targets)
if(!Discipline && prob(5))
if(ishuman(C) || isalienadult(C))
Target = C
break
if(islarva(C) || ismonkey(C))
Target = C
break
if(!Target)
if(hungry || starving)
if(canmove && isturf(loc) && prob(50))
if (Target)
target_patience = rand(5,7)
if (is_adult)
target_patience += 3
if(!Target) // If we have no target, we are wandering or following orders
if (Leader)
if (holding_still)
holding_still = max(holding_still - 1, 0)
else if(canmove && isturf(loc))
step_to(src, Leader)
else if(hungry)
if (holding_still)
holding_still = max(holding_still - hungry, 0)
else if(canmove && isturf(loc) && prob(50))
step(src, pick(cardinal))
else
if(canmove && isturf(loc) && prob(33))
if (holding_still)
holding_still = max(holding_still - 1, 0)
else if(canmove && isturf(loc) && prob(33))
step(src, pick(cardinal))
else if(!AIproc)
spawn()
AIprocess()
/mob/living/carbon/slime/proc/handle_speech_and_mood()
//Mood starts here
var/newmood = ""
if (rabid || attacked) newmood = "angry"
else if (Target) newmood = "mischevous"
if (!newmood)
if (Discipline && prob(25))
newmood = "pout"
else if (prob(1))
newmood = pick("sad", ":3", "pout")
if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood)
if (prob(75)) newmood = mood
if (newmood != mood) // This is so we don't redraw them every time
mood = newmood
regenerate_icons()
//Speech understanding starts here
var/to_say
if (speech_buffer.len > 0)
var/who = speech_buffer[1] // Who said it?
var/phrase = speech_buffer[2] // What did they say?
if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us
if (findtext(phrase, "hello") || findtext(phrase, "hi"))
to_say = pick("Hello...", "Hi...")
else if (findtext(phrase, "follow"))
if (Leader)
if (Leader == who) // Already following him
to_say = pick("Yes...", "Lead...", "Following...")
else if (Friends[who] > Friends[Leader]) // VIVA
Leader = who
to_say = "Yes... I follow [who]..."
else
if(!AIproc)
spawn() AIprocess()
to_say = "No... I follow [Leader]..."
else
if (Friends[who] > 2)
Leader = who
to_say = "I follow..."
else // Not friendly enough
to_say = pick("No...", "I won't follow...")
else if (findtext(phrase, "stop"))
if (Victim) // We are asked to stop feeding
if (Friends[who] > 4)
Victim = null
if (Friends[who] < 7)
--Friends[who]
to_say = "Grrr..." // I'm angry but I do it
else
to_say = "Fine..."
else if (Leader) // We are asked to stop following
if (Leader == who)
to_say = "Yes... I'll stay..."
Leader = null
else
if (Friends[who] > Friends[Leader])
Leader = null
to_say = "Yes... I'll stop..."
else
to_say = "No... I'll keep following..."
else if (findtext(phrase, "stay"))
if (Leader)
if (Leader == who)
holding_still = Friends[who] * 10
to_say = "Yes... Staying..."
else if (Friends[who] > Friends[Leader])
holding_still = (Friends[who] - Friends[Leader]) * 10
to_say = "Yes... Staying..."
else
to_say = "No... I'll keep following..."
else
if (Friends[who] > 2)
holding_still = Friends[who] * 10
to_say = "Yes... Staying..."
else
to_say = "No... I won't stay..."
speech_buffer = list()
//Speech starts here
if (to_say)
say (to_say)
else if(prob(1))
emote(pick("bounce","sway","light","vibrate","jiggle"))
else
var/t = 10
var/slimes_near = -1 // Don't count myself
var/dead_slimes = 0
var/friends_near = list()
for (var/mob/living/carbon/M in view(7,src))
if (isslime(M))
++slimes_near
if (M.stat == DEAD)
++dead_slimes
if (M in Friends)
t += 20
friends_near += M
if (nutrition < get_hunger_nutrition()) t += 10
if (nutrition < get_starve_nutrition()) t += 10
if (prob(2) && prob(t))
var/phrases = list()
if (Target) phrases += "[Target]... looks tasty..."
if (nutrition < get_starve_nutrition())
phrases += "So... hungry..."
phrases += "Very... hungry..."
phrases += "Need... food..."
phrases += "Must... eat..."
else if (nutrition < get_hunger_nutrition())
phrases += "Hungry..."
phrases += "Where is the food?"
phrases += "I want to eat..."
phrases += "Rawr..."
phrases += "Blop..."
phrases += "Blorble..."
if (rabid || attacked)
phrases += "Hrr..."
phrases += "Nhuu..."
phrases += "Unn..."
if (mood == ":3")
phrases += "Purr..."
if (attacked)
phrases += "Grrr..."
if (getToxLoss() > 30)
phrases += "Cold..."
if (getToxLoss() > 60)
phrases += "So... cold..."
phrases += "Very... cold..."
if (getToxLoss() > 90)
phrases += "..."
phrases += "C... c..."
if (Victim)
phrases += "Nom..."
phrases += "Tasty..."
if (powerlevel > 3) phrases += "Bzzz..."
if (powerlevel > 5) phrases += "Zap..."
if (powerlevel > 8) phrases += "Zap... Bzz..."
if (mood == "sad") phrases += "Bored..."
if (slimes_near) phrases += "Brother..."
if (slimes_near > 1) phrases += "Brothers..."
if (dead_slimes) phrases += "What happened?"
if (!slimes_near)
phrases += "Lonely..."
for (var/M in friends_near)
phrases += "[M]... friend..."
if (nutrition < get_hunger_nutrition())
phrases += "[M]... feed me..."
say (pick(phrases))
/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it
if (is_adult) return 1200
else return 1000
/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
if (is_adult) return 1000
else return 800
/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat
if (is_adult) return 600
else return 500
/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
if (is_adult) return 300
else return 200
/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
if (hunger == 2 || rabid || attacked) return 1
if (Leader) return 0
if (holding_still) return 0
return 1

View File

@@ -15,7 +15,7 @@
gender = NEUTER
update_icon = 0
nutrition = 700 // 1000 = max
nutrition = 700
see_in_dark = 8
update_slimes = 0
@@ -25,23 +25,27 @@
status_flags = CANPARALYSE|CANPUSH
var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside
var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35
var/powerlevel = 0 // 1-10 controls how much electricity they are generating
var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows into an adult
// if adult: if 10: reproduces
var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
var/number = 0 // Used to understand when someone is talking to it
var/mob/living/Victim = null // the person the slime is currently feeding on
var/mob/living/Target = null // AI variable - tells the slime to hunt this down
var/mob/living/Leader = null // AI variable - tells the slime to follow this person
var/attacked = 0 // determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
var/tame = 0 // if set to 1, the slime will not eat humans ever, or attack them
var/rabid = 0 // if set to 1, the slime will attack and eat anything it comes in contact with
var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with
var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place
var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
var/list/Friends = list() // A list of potential friends
var/list/FriendsWeight = list() // A list containing values respective to Friends. This determines how many times a slime "likes" something. If the slime likes it more than 2 times, it becomes a friend
var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
// slimes pass on genetic data, so all their offspring have the same "Friends",
var/list/speech_buffer = list() // Last phrase said near it and person who said it
var/mood = "" // To show its face
///////////TIME FOR SUBSPECIES
@@ -52,19 +56,27 @@
/mob/living/carbon/slime/New()
create_reagents(100)
spawn (0)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])"
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
real_name = name
slime_mutation = mutation_table(colour)
mutation_chance = rand(25, 35)
var/sanitizedcolour = replacetext(colour, " ", "")
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
..()
/mob/living/carbon/slime/regenerate_icons()
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
overlays = 0
if (mood)
overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")
..()
/mob/living/carbon/slime/movement_delay()
if (bodytemperature >= 330.23) // 135 F
return -1 // slimes become supercharged at high temperatures
var/tally = 0
var/health_deficiency = (100 - health)
@@ -74,23 +86,19 @@
tally += (283.222 - bodytemperature) / 10 * 1.75
if(reagents)
if(reagents.has_reagent("hyperzine")) // hyperzine slows slimes down
tally *= 2 // moves twice as slow
if(reagents.has_reagent("hyperzine")) // Hyperzine slows slimes down
tally *= 2
if(reagents.has_reagent("frostoil")) // frostoil also makes them move VEEERRYYYYY slow
if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
tally *= 5
if(health <= 0) // if damaged, the slime moves twice as slow
tally *= 2
if (bodytemperature >= 330.23) // 135 F
return -1 // slimes become supercharged at high temperatures
return tally+config.slime_delay
return tally + config.slime_delay
/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
if ((!(yes) || now_pushing))
return
now_pushing = 1
@@ -105,23 +113,13 @@
if(9) probab = 70
if(10) probab = 95
if(prob(probab))
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
if(is_adult)
if(nutrition <= 600 && !Atkcool)
if(nutrition <= get_hunger_nutrition() && !Atkcool)
if (is_adult || prob(5))
AM.attack_slime(src)
spawn()
Atkcool = 1
sleep(15)
Atkcool = 0
else
if(nutrition <= 500 && !Atkcool)
if(prob(5))
AM.attack_slime(src)
spawn()
Atkcool = 1
sleep(15)
sleep(45)
Atkcool = 0
if(ismob(AM))
@@ -156,7 +154,6 @@
/mob/living/carbon/slime/Process_Spacemove()
return 2
/mob/living/carbon/slime/Stat()
..()
@@ -166,20 +163,16 @@
else
stat(null, "Health: [round((health / 150) * 100)]%")
if (client.statpanel == "Status")
if(is_adult)
stat(null, "Nutrition: [nutrition]/1200")
stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
if(amount_grown >= 10)
if(is_adult)
stat(null, "You can reproduce!")
else
stat(null, "Nutrition: [nutrition]/1000")
if(amount_grown >= 10)
stat(null, "You can evolve!")
stat(null,"Power Level: [powerlevel]")
/mob/living/carbon/slime/adjustFireLoss(amount)
..(-abs(amount)) // Heals them
return
@@ -189,7 +182,6 @@
..(Proj)
return 0
/mob/living/carbon/slime/emp_act(severity)
powerlevel = 0 // oh no, the power!
..()
@@ -244,17 +236,15 @@
/mob/living/carbon/slime/unEquip(obj/item/W as obj)
return
/mob/living/carbon/slime/attack_ui(slot)
return
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
if(Victim) return // can't attack while eating!
if (Victim) return // can't attack while eating!
if (health > -100)
@@ -265,19 +255,16 @@
var/damage = rand(1, 3)
attacked += 5
if(is_adult)
if(M.is_adult)
damage = rand(1, 6)
else
damage = rand(1, 3)
adjustBruteLoss(damage)
updatehealth()
return
/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
M.emote("[M.friendly] [src]")
@@ -292,7 +279,8 @@
updatehealth()
/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob)
if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens.
if(!(istype(M, /mob/living/carbon/monkey)))
return // Fix for aliens receiving double messages when attacking other aliens.
if (!ticker)
M << "You cannot attack people before the game has started."
@@ -301,6 +289,7 @@
if (istype(loc, /turf) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
..()
switch(M.a_intent)
@@ -401,7 +390,7 @@
if ("grab")
if (M == src || anchored)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
M.put_in_active_hand(G)
@@ -422,8 +411,9 @@
if (prob(90))
if (HULK in M.mutations)
damage += 5
if(Victim)
if(Victim || Target)
Victim = null
Target = null
anchored = 0
if(prob(80) && !client)
Discipline++
@@ -513,8 +503,9 @@
if ((O.client && !( O.blinded )))
O.show_message(text("<span class='warning'> <B>[] has tackled [name]!</B></span>", M), 1)
if(Victim)
if(Victim || Target)
Victim = null
Target = null
anchored = 0
if(prob(80) && !client)
Discipline++
@@ -553,11 +544,12 @@
if(W.force >= 3)
if(is_adult)
if(prob(5 + round(W.force/2)))
if(Victim)
if(Victim || Target)
if(prob(80) && !client)
Discipline++
Victim = null
Target = null
anchored = 0
spawn()
@@ -577,7 +569,7 @@
else
if(prob(10 + W.force*2))
if(Victim)
if(Victim || Target)
if(prob(80) && !client)
Discipline++
if(Discipline == 1)
@@ -588,6 +580,7 @@
SStun = 0
Victim = null
Target = null
anchored = 0
spawn(0)
@@ -604,17 +597,22 @@
/mob/living/carbon/slime/restrained()
return 0
mob/living/carbon/slime/var/co2overloadtime = null
mob/living/carbon/slime/var/temperature_resistance = T0C+75
/mob/living/carbon/slime/show_inv(mob/user)
return
/mob/living/carbon/slime/toggle_throw_mode()
return
/mob/living/carbon/slime/proc/apply_water()
adjustToxLoss(rand(15,20))
if (!client)
if (Target) // Like cats
Target = null
++Discipline
return
/obj/item/slime_extract
name = "slime extract"

View File

@@ -71,7 +71,7 @@
"A sharp, deep pain bathes every inch of your body!")]"
if(istype(M, /mob/living/carbon))
Victim.adjustCloneLoss(rand(1,10))
Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
Victim.adjustToxLoss(rand(2,4))
@@ -88,7 +88,7 @@
if(slime.Victim == M && slime != src)
slime.Feedstop()
nutrition += rand(10,25)
nutrition += rand(15,30)
if(nutrition >= lastnut + 50)
if(prob(80))
lastnut = nutrition
@@ -96,12 +96,11 @@
if(powerlevel > 10)
powerlevel = 10
if(is_adult)
if(nutrition > 1200)
nutrition = 1200
else
if(nutrition > 1000)
nutrition = 1000
if (nutrition > get_max_nutrition())
if (amount_grown < 10)
nutrition -= 20
++amount_grown
nutrition = min(nutrition, get_max_nutrition())
Victim.updatehealth()
updatehealth()
@@ -139,7 +138,11 @@
if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50))
if(!(Victim.LAssailant in Friends))
Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
Friends[Victim.LAssailant] = 1
//Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
else
++Friends[Victim.LAssailant]
if(M.client && istype(src, /mob/living/carbon/human))
if(prob(85))
@@ -179,7 +182,7 @@
maxHealth = 200
amount_grown = 0
regenerate_icons()
name = text("[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])")
name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])")
else
src << "<i>I am not ready to evolve yet...</i>"
else
@@ -204,13 +207,14 @@
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
if(prob(70))
M.colour = colour
else
if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
else
M.colour = colour
if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
M.powerlevel = new_powerlevel
if(i != 1) step_away(M,src)
M.Friends = Friends.Copy()
babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")

View File

@@ -19,35 +19,35 @@ proc/mutation_table(var/colour)
slime_mutation[3] = "gold"
slime_mutation[4] = "gold"
if("orange")
slime_mutation[1] = "red"
slime_mutation[2] = "red"
slime_mutation[3] = "dark purple"
slime_mutation[4] = "yellow"
slime_mutation[1] = "dark purple"
slime_mutation[2] = "yellow"
slime_mutation[3] = "red"
slime_mutation[4] = "red"
if("blue")
slime_mutation[1] = "dark blue"
slime_mutation[2] = "pink"
slime_mutation[2] = "silver"
slime_mutation[3] = "pink"
slime_mutation[4] = "silver"
slime_mutation[4] = "pink"
//Tier 3
if("dark blue")
slime_mutation[1] = "purple"
slime_mutation[2] = "cerulean"
slime_mutation[3] = "blue"
slime_mutation[2] = "blue"
slime_mutation[3] = "cerulean"
slime_mutation[4] = "cerulean"
if("dark purple")
slime_mutation[1] = "purple"
slime_mutation[2] = "sepia"
slime_mutation[3] = "orange"
slime_mutation[2] = "orange"
slime_mutation[3] = "sepia"
slime_mutation[4] = "sepia"
if("yellow")
slime_mutation[1] = "metal"
slime_mutation[2] = "bluespace"
slime_mutation[3] = "orange"
slime_mutation[2] = "orange"
slime_mutation[3] = "bluespace"
slime_mutation[4] = "bluespace"
if("silver")
slime_mutation[1] = "metal"
slime_mutation[2] = "pyrite"
slime_mutation[3] = "blue"
slime_mutation[2] = "blue"
slime_mutation[3] = "pyrite"
slime_mutation[4] = "pyrite"
//Tier 4
if("pink")

View File

@@ -288,6 +288,16 @@ var/list/department_radio_keys = list(
P.speech_buffer.Remove(pick(P.speech_buffer))
P.speech_buffer.Add(html_decode(message))
if(isslime(A)) //Slimes answering to people
if (A == src)
continue
var/mob/living/carbon/slime/S = A
if (src in S.Friends)
S.speech_buffer = list()
S.speech_buffer.Add(src)
S.speech_buffer.Add(lowertext(html_decode(message)))
if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0
var/obj/O = A
spawn (0)

View File

@@ -218,7 +218,7 @@ datum
T.MakeSlippery()
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(15,20))
M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !istype(T, /turf/space))

View File

@@ -935,7 +935,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Spawn"
id = "m_spawn"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/grey
required_other = 1
@@ -951,7 +951,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Monkey"
id = "m_monkey"
result = null
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/grey
required_other = 1
@@ -966,7 +966,7 @@ datum/chemical_reaction/pestkiller
name = "Mutation Toxin"
id = "mutationtoxin"
result = "mutationtoxin"
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/green
@@ -978,7 +978,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Metal"
id = "m_metal"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/metal
required_other = 1
@@ -996,7 +996,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Crit"
id = "m_tele"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
@@ -1065,7 +1065,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Crit Lesser"
id = "m_tele3"
result = null
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
@@ -1117,7 +1117,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Bork"
id = "m_tele2"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
@@ -1148,7 +1148,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Bork 2"
id = "m_tele4"
result = null
required_reagents = list("water" = 5)
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
@@ -1180,7 +1180,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Frost Oil"
id = "m_frostoil"
result = "frostoil"
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/blue
required_other = 1
@@ -1192,7 +1192,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Freeze"
id = "m_freeze"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkblue
required_other = 1
@@ -1212,7 +1212,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Capsaicin Oil"
id = "m_capsaicinoil"
result = "capsaicin"
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/orange
required_other = 1
@@ -1223,7 +1223,7 @@ datum/chemical_reaction/pestkiller
name = "Slime fire"
id = "m_fire"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/orange
required_other = 1
@@ -1243,7 +1243,7 @@ datum/chemical_reaction/pestkiller
name = "Slime EMP"
id = "m_emp"
result = null
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
@@ -1256,7 +1256,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Powercell"
id = "m_cell"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
@@ -1269,7 +1269,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Glow"
id = "m_glow"
result = null
required_reagents = list("water" = 5)
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
@@ -1286,7 +1286,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Steroid"
id = "m_steroid"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/purple
required_other = 1
@@ -1299,7 +1299,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Jam"
id = "m_jam"
result = "slimejelly"
required_reagents = list("sugar" = 5)
required_reagents = list("sugar" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/purple
required_other = 1
@@ -1312,7 +1312,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Plasma"
id = "m_plasma"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkpurple
required_other = 1
@@ -1327,7 +1327,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Glycerol"
id = "m_glycerol"
result = "glycerol"
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 8
required_container = /obj/item/slime_extract/red
required_other = 1
@@ -1339,14 +1339,13 @@ datum/chemical_reaction/pestkiller
name = "Bloodlust"
id = "m_bloodlust"
result = null
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/red
required_other = 1
/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null))
slime.tame = 0
slime.rabid = 1
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("\red The [slime] is driven into a frenzy!."), 1)
@@ -1356,7 +1355,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Potion"
id = "m_potion"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pink
required_other = 1
@@ -1371,7 +1370,7 @@ datum/chemical_reaction/pestkiller
name = "Advanced Mutation Toxin"
id = "mutationtoxin2"
result = "amutationtoxin"
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/black
@@ -1383,7 +1382,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Explosion"
id = "m_explosion"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/oil
required_other = 1
@@ -1401,7 +1400,7 @@ datum/chemical_reaction/pestkiller
result = null
result_amount = 1
required_container = /obj/item/slime_extract/lightpink
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
required_other = 1
/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
@@ -1412,7 +1411,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Golem"
id = "m_golem"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/adamantine
required_other = 1
@@ -1428,7 +1427,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Crystal"
id = "m_crystal"
result = null
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
@@ -1444,7 +1443,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Steroid 2"
id = "m_steroid2"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/cerulean
required_other = 1
@@ -1458,7 +1457,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Camera"
id = "m_camera"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -1471,7 +1470,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Film"
id = "m_film"
result = null
required_reagents = list("blood" = 5)
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -1487,7 +1486,7 @@ datum/chemical_reaction/pestkiller
name = "Slime Paint"
id = "s_paint"
result = null
required_reagents = list("plasma" = 5)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pyrite
required_other = 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB