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 language: c
env: env:
BYOND_MAJOR="503" global:
BYOND_MINOR="1224" - BYOND_MAJOR="504"
- BYOND_MINOR="1232"
matrix:
- DM_MAPFILE="tgstation2"
- DM_MAPFILE="metastation"
- DM_MAPFILE="ministation"
before_install: before_install:
- sudo apt-get update -qq - sudo apt-get update -qq
@@ -17,4 +22,4 @@ install:
- cd .. - cd ..
script: 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>" announcement += "<h1 class='alert'>Priority Announcement</h1>"
else if(type == "Captain") else if(type == "Captain")
news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null)
announcement += "<h1 class='alert'>Captain Announces</h1>" announcement += "<h1 class='alert'>Captain Announces</h1>"
news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null)
else else
announcement += "<h1 class='alert'>[command_name()] Update</h1>"
if (title && length(title) > 0) if (title && length(title) > 0)
announcement += "<br><h2 class='alert'>[html_encode(title)]</h2>" announcement += "<br><h2 class='alert'>[html_encode(title)]</h2>"
if(title == "") if(title == "")
news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null) news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null)
else else
news_network.SubmitArticle(title + "<br><br>" + text, "Central Command", "Station Announcements", null) 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><span class='alert'>[html_encode(text)]</span><br>"
announcement += "<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) /obj/machinery/smartfridge/extract/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/slime_extract)) if(istype(O,/obj/item/slime_extract))
return 1 return 1
if(istype(O,/obj/item/device/slime_scanner))
return 1
return 0 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 // Chemistry Medical Smartfridge
// ----------------------------- // -----------------------------

View File

@@ -301,3 +301,47 @@ MASS SPECTROMETER
icon_state = "adv_spectrometer" icon_state = "adv_spectrometer"
details = 1 details = 1
origin_tech = "magnets=4;biotech=2" 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_speed = 3
throw_range = 7 throw_range = 7
w_class = 3.0 w_class = 3.0
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway. attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
/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 ..()
/* /*
* Trays - Agouri * Trays - Agouri
*/ */
/obj/item/weapon/tray /obj/item/weapon/tray
name = "tray" name = "tray"
icon = 'icons/obj/food.dmi' icon = 'icons/obj/food.dmi'
icon_state = "tray" icon_state = "tray"
desc = "A metal tray to lay food on." desc = "A metal tray to lay food on."
force = 8
hitsound = 'sound/items/trayhit1.ogg'
throwforce = 10.0 throwforce = 10.0
throw_speed = 3 throw_speed = 3
throw_range = 5 throw_range = 5
@@ -211,104 +182,6 @@
// w_class = 2 -- takes up 3 // w_class = 2 -- takes up 3
// w_class = 3 -- takes up 5 // 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) if(I)
step(I, pick(NORTH,SOUTH,EAST,WEST)) step(I, pick(NORTH,SOUTH,EAST,WEST))
sleep(rand(2,4)) 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/paper(src) new /obj/item/weapon/paper(src)
new /obj/item/weapon/pen(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) src.add_fingerprint(user)
return 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 // Secure Safe
// ----------------------------- // -----------------------------

View File

@@ -8,12 +8,14 @@
maxHealth = 150 maxHealth = 150
revive() revive()
regenerate_icons() 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 return
if(stat == DEAD) return if(stat == DEAD) return
stat = DEAD stat = DEAD
icon_state = "[colour] baby slime dead" icon_state = "[colour] baby slime dead"
overlays = 0
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))
O.show_message("<b>The [name]</b> seizes up and falls limp...", 1) //ded -- Urist 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/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 var/SStun = 0 // stun variable
/mob/living/carbon/slime/Life() /mob/living/carbon/slime/Life()
set invisibility = 0 set invisibility = 0
set background = BACKGROUND_ENABLED set background = BACKGROUND_ENABLED
@@ -24,88 +22,69 @@
handle_targets() handle_targets()
if (!ckey)
handle_speech_and_mood()
var/datum/gas_mixture/environment var/datum/gas_mixture/environment
if(src.loc) if(src.loc)
environment = loc.return_air() environment = loc.return_air()
//Apparently, the person who wrote this code designed it so that //Apparently, the person who wrote this code designed it so that
//blinded get reset each cycle and then get activated later in the //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 //code. Very ugly. I dont care. Moving this stuff here so its easy
//to find it. //to find it.
src.blinded = null src.blinded = null
// Basically just deletes any screen objects :< regular_hud_updates() // Basically just deletes any screen objects :<
regular_hud_updates()
//Handle temperature/pressure differences between body and environment
if(environment) if(environment)
handle_environment(environment) handle_environment(environment) // Handle temperature/pressure differences between body and environment
//Status updates, death etc.
handle_regular_status_updates()
handle_regular_status_updates() // Status updates, death etc.
/mob/living/carbon/slime/proc/AIprocess() // the master AI process /mob/living/carbon/slime/proc/AIprocess() // the master AI process
//world << "AI proc started."
if(AIproc || stat == DEAD || client) return if(AIproc || stat == DEAD || client) return
var/hungry = 0 var/hungry = 0
var/starving = 0 if (nutrition < get_starve_nutrition())
if(is_adult) hungry = 2
switch(nutrition) else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
if(400 to 1100) hungry = 1 hungry = 1
if(0 to 399)
starving = 1
else
switch(nutrition)
if(150 to 900) hungry = 1
if(0 to 149) starving = 1
AIproc = 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 if(Victim) // can't eat AND have this little process at the same time
//world << "break 1"
break break
if(!Target || client) if(!Target || client)
//world << "break 2"
break break
if(Target.health <= -70 || Target.stat == 2) if(Target.health <= -70 || Target.stat == 2)
Target = null Target = null
AIproc = 0 AIproc = 0
//world << "break 3"
break break
if(Target) if(Target)
//world << "[Target] Target Found"
for(var/mob/living/carbon/slime/M in view(1,Target)) for(var/mob/living/carbon/slime/M in view(1,Target))
if(M.Victim == Target) if(M.Victim == Target)
Target = null Target = null
AIproc = 0 AIproc = 0
//world << "break 4"
break break
if(!AIproc) if(!AIproc)
//world << "break 5"
break break
if(Target in view(1,src)) if(Target in view(1,src))
if(istype(Target, /mob/living/silicon)) if(istype(Target, /mob/living/silicon))
if(!Atkcool) if(!Atkcool)
spawn() spawn()
Atkcool = 1 Atkcool = 1
sleep(15) sleep(45)
Atkcool = 0 Atkcool = 0
if(Target.Adjacent(src)) if(Target.Adjacent(src))
Target.attack_slime(src) Target.attack_slime(src)
//world << "retrun 1"
return return
if(!Target.lying && prob(80)) if(!Target.lying && prob(80))
@@ -113,16 +92,12 @@
if(!Atkcool) if(!Atkcool)
spawn() spawn()
Atkcool = 1 Atkcool = 1
sleep(25) sleep(45)
Atkcool = 0 Atkcool = 0
if(Target.Adjacent(src)) if(Target.Adjacent(src))
Target.attack_slime(src) Target.attack_slime(src)
if(prob(30))
step_to(src, Target)
else else
if(!Atkcool && Target.Adjacent(src)) if(!Atkcool && Target.Adjacent(src))
Feedon(Target) Feedon(Target)
@@ -133,13 +108,12 @@
else else
if(Target in view(7, src)) 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) step_to(src, Target)
else else
Target = null Target = null
AIproc = 0 AIproc = 0
//world << "break 6"
break break
var/sleeptime = movement_delay() var/sleeptime = movement_delay()
@@ -148,7 +122,6 @@
sleep(sleeptime + 2) // this is about as fast as a player slime can go sleep(sleeptime + 2) // this is about as fast as a player slime can go
AIproc = 0 AIproc = 0
//world << "AI proc ended."
/mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment) /mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment)
if(!environment) if(!environment)
@@ -158,28 +131,11 @@
//var/environment_heat_capacity = environment.heat_capacity() //var/environment_heat_capacity = environment.heat_capacity()
var/loc_temp = get_temperature(environment) 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 if(loc_temp < 310.15) // a cold place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
else // a hot place else // a hot place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) 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 //Account for massive pressure differences
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
@@ -199,7 +155,6 @@
return //TODO: DEFERRED return //TODO: DEFERRED
/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) /mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost)
var/temperature = current var/temperature = current
var/difference = abs(current-loc_temp) //get difference var/difference = abs(current-loc_temp) //get difference
@@ -221,12 +176,10 @@
if(reagents) reagents.metabolize(src) if(reagents) reagents.metabolize(src)
src.updatehealth() src.updatehealth()
return //TODO: DEFERRED return //TODO: DEFERRED
/mob/living/carbon/slime/proc/handle_regular_status_updates() /mob/living/carbon/slime/proc/handle_regular_status_updates()
if(is_adult) if(is_adult)
@@ -234,20 +187,17 @@
else else
health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
if(health < config.health_threshold_dead && stat != 2) if(health < config.health_threshold_dead && stat != 2)
death() death()
return return
else if(src.health < config.health_threshold_crit) 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"))
if(!src.reagents.has_reagent("inaprovaline")) src.adjustOxyLoss(10) src.adjustOxyLoss(10)
if(src.stat != DEAD) src.stat = UNCONSCIOUS if(src.stat != DEAD)
src.stat = UNCONSCIOUS
if(prob(30)) if(prob(30))
adjustOxyLoss(-1) adjustOxyLoss(-1)
@@ -256,12 +206,9 @@
adjustCloneLoss(-1) adjustCloneLoss(-1)
adjustBruteLoss(-1) adjustBruteLoss(-1)
if (src.stat == DEAD) if (src.stat == DEAD)
src.lying = 1 src.lying = 1
src.blinded = 1 src.blinded = 1
else else
if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc.
if (src.stunned > 0) if (src.stunned > 0)
@@ -306,33 +253,23 @@
return 1 return 1
/mob/living/carbon/slime/proc/handle_nutrition() /mob/living/carbon/slime/proc/handle_nutrition()
if(prob(20)) if (prob(15))
if(is_adult) nutrition-=rand(4,6) nutrition -= 1 + is_adult
else nutrition-=rand(2,3)
if(nutrition <= 0) if(nutrition <= 0)
nutrition = 0 nutrition = 0
if(prob(75)) if(prob(75))
adjustToxLoss(rand(0,5)) adjustToxLoss(rand(0,5))
else else if (nutrition >= get_grow_nutrition() && amount_grown < 10)
if(is_adult) nutrition -= 20
if(nutrition >= 1000) amount_grown++
if(prob(40)) amount_grown++
else if(amount_grown >= 10 && !Victim && !Target && !ckey)
if(nutrition >= 800)
if(prob(40)) amount_grown++
if(amount_grown >= 10 && !Victim && !Target)
if(!ckey)
if(is_adult) if(is_adult)
Reproduce() Reproduce()
else else
Evolve() Evolve()
@@ -346,7 +283,6 @@
if(attacked > 50) attacked = 50 if(attacked > 50) attacked = 50
if(attacked > 0) if(attacked > 0)
if(prob(85))
attacked-- attacked--
if(Discipline > 0) if(Discipline > 0)
@@ -357,70 +293,49 @@
if(prob(10)) if(prob(10))
Discipline-- Discipline--
if(!client) if(!client)
if(!canmove) return 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(Victim) return // if it's eating someone already, continue eating!
if(Target)
if(prob(1)) --target_patience
emote(pick("bounce","sway","light","vibrate","jiggle")) if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention
target_patience = 0
Target = null
if(AIproc && SStun) return if(AIproc && SStun) return
var/hungry = 0 // determines if the slime is hungry 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 if (nutrition < get_starve_nutrition())
switch(nutrition) // 1000 max nutrition hungry = 2
if(501 to 700) else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
if(prob(25)) hungry = 1 hungry = 1
if(201 to 500) hungry = 1
if(0 to 200) starving = 1
if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends
if(starving && !client) // if a slime is starving, it starts losing its friends
if(Friends.len > 0 && prob(1)) if(Friends.len > 0 && prob(1))
var/mob/nofriend = pick(Friends) var/mob/nofriend = pick(Friends)
Friends -= nofriend --Friends[nofriend]
if(!Target) if(!Target)
if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to
var/list/targets = list() 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)) for(var/mob/living/L in view(7,src))
//Ignore other slimes, dead mobs and simple_animals if(isslime(L) || L.stat == DEAD || isanimal(L)) // Ignore other slimes, dead mobs, and simple_animals
if(isslime(L) || L.stat != CONSCIOUS || isanimal(L))
continue continue
if(issilicon(L)) if(L in Friends) // No eating friends!
if(!is_adult) //Non-starving diciplined adult slimes wont eat things
if(!starving && Discipline > 0)
continue
if(tame) //Tame slimes ignore electronic life
continue continue
if(issilicon(L)) // They can't eat silicons, but they can glomp them in defence
if (rabid || attacked)
targets += L // Possible target found! targets += L // Possible target found!
else if(iscarbon(L)) if(!iscarbon(L))
continue
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 var/mob/living/carbon/human/H = L
@@ -428,18 +343,7 @@
if(H.dna.mutantrace == "slime") if(H.dna.mutantrace == "slime")
continue 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 var/notarget = 0
for(var/mob/living/carbon/slime/M in view(1,L)) for(var/mob/living/carbon/slime/M in view(1,L))
if(M.Victim == L) if(M.Victim == L)
@@ -449,44 +353,213 @@
targets += L // Possible target found! targets += L // Possible target found!
if(targets.len > 0)
if(attacked || rabid || hungry == 2)
if((hungry || starving) && targets.len > 0) Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care
if(!is_adult) else
if(!starving)
for(var/mob/living/carbon/C in targets) for(var/mob/living/carbon/C in targets)
if(!Discipline && prob(5)) if(!Discipline && prob(5))
if(ishuman(C)) if(ishuman(C) || isalienadult(C))
Target = C
break
if(isalienadult(C))
Target = C Target = C
break break
if(islarva(C)) if(islarva(C) || ismonkey(C))
Target = C Target = C
break break
if(ismonkey(C))
Target = C
break
else
Target = targets[1]
else
Target = targets[1] // closest target
if(targets.len > 0) if (Target)
if(attacked > 0 || rabid) target_patience = rand(5,7)
Target = targets[1] //closest mob probably attacked it, so override Target and attack the nearest! 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)
if(!Target) else if(hungry)
if(hungry || starving) if (holding_still)
if(canmove && isturf(loc) && prob(50)) holding_still = max(holding_still - hungry, 0)
else if(canmove && isturf(loc) && prob(50))
step(src, pick(cardinal)) step(src, pick(cardinal))
else 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)) 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 else
if(!AIproc) to_say = "No... I follow [Leader]..."
spawn() AIprocess() 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 gender = NEUTER
update_icon = 0 update_icon = 0
nutrition = 700 // 1000 = max nutrition = 700
see_in_dark = 8 see_in_dark = 8
update_slimes = 0 update_slimes = 0
@@ -25,23 +25,27 @@
status_flags = CANPARALYSE|CANPUSH status_flags = CANPARALYSE|CANPUSH
var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside 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/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 var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
// if adult: if 10: 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/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/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/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/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/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
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
// 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 ///////////TIME FOR SUBSPECIES
@@ -52,19 +56,27 @@
/mob/living/carbon/slime/New() /mob/living/carbon/slime/New()
create_reagents(100) create_reagents(100)
spawn (0) 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" icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
real_name = name real_name = name
slime_mutation = mutation_table(colour) slime_mutation = mutation_table(colour)
mutation_chance = rand(25, 35)
var/sanitizedcolour = replacetext(colour, " ", "") var/sanitizedcolour = replacetext(colour, " ", "")
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
..() ..()
/mob/living/carbon/slime/regenerate_icons() /mob/living/carbon/slime/regenerate_icons()
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" 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() /mob/living/carbon/slime/movement_delay()
if (bodytemperature >= 330.23) // 135 F
return -1 // slimes become supercharged at high temperatures
var/tally = 0 var/tally = 0
var/health_deficiency = (100 - health) var/health_deficiency = (100 - health)
@@ -74,21 +86,17 @@
tally += (283.222 - bodytemperature) / 10 * 1.75 tally += (283.222 - bodytemperature) / 10 * 1.75
if(reagents) if(reagents)
if(reagents.has_reagent("hyperzine")) // hyperzine slows slimes down if(reagents.has_reagent("hyperzine")) // Hyperzine slows slimes down
tally *= 2 // moves twice as slow 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 tally *= 5
if(health <= 0) // if damaged, the slime moves twice as slow if(health <= 0) // if damaged, the slime moves twice as slow
tally *= 2 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) /mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
if ((!(yes) || now_pushing)) if ((!(yes) || now_pushing))
return return
@@ -105,23 +113,13 @@
if(9) probab = 70 if(9) probab = 70
if(10) probab = 95 if(10) probab = 95
if(prob(probab)) if(prob(probab))
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
if(is_adult) if(nutrition <= get_hunger_nutrition() && !Atkcool)
if(nutrition <= 600 && !Atkcool) if (is_adult || prob(5))
AM.attack_slime(src) AM.attack_slime(src)
spawn() spawn()
Atkcool = 1 Atkcool = 1
sleep(15) sleep(45)
Atkcool = 0
else
if(nutrition <= 500 && !Atkcool)
if(prob(5))
AM.attack_slime(src)
spawn()
Atkcool = 1
sleep(15)
Atkcool = 0 Atkcool = 0
if(ismob(AM)) if(ismob(AM))
@@ -156,7 +154,6 @@
/mob/living/carbon/slime/Process_Spacemove() /mob/living/carbon/slime/Process_Spacemove()
return 2 return 2
/mob/living/carbon/slime/Stat() /mob/living/carbon/slime/Stat()
..() ..()
@@ -166,20 +163,16 @@
else else
stat(null, "Health: [round((health / 150) * 100)]%") stat(null, "Health: [round((health / 150) * 100)]%")
if (client.statpanel == "Status") if (client.statpanel == "Status")
if(is_adult) stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
stat(null, "Nutrition: [nutrition]/1200")
if(amount_grown >= 10) if(amount_grown >= 10)
if(is_adult)
stat(null, "You can reproduce!") stat(null, "You can reproduce!")
else else
stat(null, "Nutrition: [nutrition]/1000")
if(amount_grown >= 10)
stat(null, "You can evolve!") stat(null, "You can evolve!")
stat(null,"Power Level: [powerlevel]") stat(null,"Power Level: [powerlevel]")
/mob/living/carbon/slime/adjustFireLoss(amount) /mob/living/carbon/slime/adjustFireLoss(amount)
..(-abs(amount)) // Heals them ..(-abs(amount)) // Heals them
return return
@@ -189,7 +182,6 @@
..(Proj) ..(Proj)
return 0 return 0
/mob/living/carbon/slime/emp_act(severity) /mob/living/carbon/slime/emp_act(severity)
powerlevel = 0 // oh no, the power! powerlevel = 0 // oh no, the power!
..() ..()
@@ -244,11 +236,9 @@
/mob/living/carbon/slime/unEquip(obj/item/W as obj) /mob/living/carbon/slime/unEquip(obj/item/W as obj)
return return
/mob/living/carbon/slime/attack_ui(slot) /mob/living/carbon/slime/attack_ui(slot)
return return
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) /mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker) if (!ticker)
M << "You cannot attack people before the game has started." M << "You cannot attack people before the game has started."
@@ -265,19 +255,16 @@
var/damage = rand(1, 3) var/damage = rand(1, 3)
attacked += 5 attacked += 5
if(is_adult) if(M.is_adult)
damage = rand(1, 6) damage = rand(1, 6)
else else
damage = rand(1, 3) damage = rand(1, 3)
adjustBruteLoss(damage) adjustBruteLoss(damage)
updatehealth() updatehealth()
return return
/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob) /mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0) if(M.melee_damage_upper == 0)
M.emote("[M.friendly] [src]") M.emote("[M.friendly] [src]")
@@ -292,7 +279,8 @@
updatehealth() updatehealth()
/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob) /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) if (!ticker)
M << "You cannot attack people before the game has started." M << "You cannot attack people before the game has started."
@@ -301,6 +289,7 @@
if (istype(loc, /turf) && istype(loc.loc, /area/start)) if (istype(loc, /turf) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass." M << "No attacking people at spawn, you jackass."
return return
..() ..()
switch(M.a_intent) switch(M.a_intent)
@@ -422,8 +411,9 @@
if (prob(90)) if (prob(90))
if (HULK in M.mutations) if (HULK in M.mutations)
damage += 5 damage += 5
if(Victim) if(Victim || Target)
Victim = null Victim = null
Target = null
anchored = 0 anchored = 0
if(prob(80) && !client) if(prob(80) && !client)
Discipline++ Discipline++
@@ -513,8 +503,9 @@
if ((O.client && !( O.blinded ))) if ((O.client && !( O.blinded )))
O.show_message(text("<span class='warning'> <B>[] has tackled [name]!</B></span>", M), 1) O.show_message(text("<span class='warning'> <B>[] has tackled [name]!</B></span>", M), 1)
if(Victim) if(Victim || Target)
Victim = null Victim = null
Target = null
anchored = 0 anchored = 0
if(prob(80) && !client) if(prob(80) && !client)
Discipline++ Discipline++
@@ -553,11 +544,12 @@
if(W.force >= 3) if(W.force >= 3)
if(is_adult) if(is_adult)
if(prob(5 + round(W.force/2))) if(prob(5 + round(W.force/2)))
if(Victim) if(Victim || Target)
if(prob(80) && !client) if(prob(80) && !client)
Discipline++ Discipline++
Victim = null Victim = null
Target = null
anchored = 0 anchored = 0
spawn() spawn()
@@ -577,7 +569,7 @@
else else
if(prob(10 + W.force*2)) if(prob(10 + W.force*2))
if(Victim) if(Victim || Target)
if(prob(80) && !client) if(prob(80) && !client)
Discipline++ Discipline++
if(Discipline == 1) if(Discipline == 1)
@@ -588,6 +580,7 @@
SStun = 0 SStun = 0
Victim = null Victim = null
Target = null
anchored = 0 anchored = 0
spawn(0) spawn(0)
@@ -604,17 +597,22 @@
/mob/living/carbon/slime/restrained() /mob/living/carbon/slime/restrained()
return 0 return 0
mob/living/carbon/slime/var/co2overloadtime = null mob/living/carbon/slime/var/co2overloadtime = null
mob/living/carbon/slime/var/temperature_resistance = T0C+75 mob/living/carbon/slime/var/temperature_resistance = T0C+75
/mob/living/carbon/slime/show_inv(mob/user) /mob/living/carbon/slime/show_inv(mob/user)
return return
/mob/living/carbon/slime/toggle_throw_mode() /mob/living/carbon/slime/toggle_throw_mode()
return 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 /obj/item/slime_extract
name = "slime extract" name = "slime extract"

View File

@@ -71,7 +71,7 @@
"A sharp, deep pain bathes every inch of your body!")]" "A sharp, deep pain bathes every inch of your body!")]"
if(istype(M, /mob/living/carbon)) if(istype(M, /mob/living/carbon))
Victim.adjustCloneLoss(rand(1,10)) Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2)) Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0) if(Victim.health <= 0)
Victim.adjustToxLoss(rand(2,4)) Victim.adjustToxLoss(rand(2,4))
@@ -88,7 +88,7 @@
if(slime.Victim == M && slime != src) if(slime.Victim == M && slime != src)
slime.Feedstop() slime.Feedstop()
nutrition += rand(10,25) nutrition += rand(15,30)
if(nutrition >= lastnut + 50) if(nutrition >= lastnut + 50)
if(prob(80)) if(prob(80))
lastnut = nutrition lastnut = nutrition
@@ -96,12 +96,11 @@
if(powerlevel > 10) if(powerlevel > 10)
powerlevel = 10 powerlevel = 10
if(is_adult) if (nutrition > get_max_nutrition())
if(nutrition > 1200) if (amount_grown < 10)
nutrition = 1200 nutrition -= 20
else ++amount_grown
if(nutrition > 1000) nutrition = min(nutrition, get_max_nutrition())
nutrition = 1000
Victim.updatehealth() Victim.updatehealth()
updatehealth() updatehealth()
@@ -139,7 +138,11 @@
if(Victim.LAssailant && Victim.LAssailant != Victim) if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50)) if(prob(50))
if(!(Victim.LAssailant in Friends)) 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(M.client && istype(src, /mob/living/carbon/human))
if(prob(85)) if(prob(85))
@@ -179,7 +182,7 @@
maxHealth = 200 maxHealth = 200
amount_grown = 0 amount_grown = 0
regenerate_icons() regenerate_icons()
name = text("[colour] [is_adult ? "adult" : "baby"] slime ([rand(1, 1000)])") name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])")
else else
src << "<i>I am not ready to evolve yet...</i>" src << "<i>I am not ready to evolve yet...</i>"
else else
@@ -204,13 +207,14 @@
var/new_powerlevel = round(powerlevel / 4) var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++) for(var/i=1,i<=4,i++)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
if(prob(70)) if(prob(mutation_chance))
M.colour = colour
else
M.colour = slime_mutation[rand(1,4)] 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! 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 M.powerlevel = new_powerlevel
if(i != 1) step_away(M,src) if(i != 1) step_away(M,src)
M.Friends = Friends.Copy()
babies += M babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") 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[3] = "gold"
slime_mutation[4] = "gold" slime_mutation[4] = "gold"
if("orange") if("orange")
slime_mutation[1] = "red" slime_mutation[1] = "dark purple"
slime_mutation[2] = "red" slime_mutation[2] = "yellow"
slime_mutation[3] = "dark purple" slime_mutation[3] = "red"
slime_mutation[4] = "yellow" slime_mutation[4] = "red"
if("blue") if("blue")
slime_mutation[1] = "dark blue" slime_mutation[1] = "dark blue"
slime_mutation[2] = "pink" slime_mutation[2] = "silver"
slime_mutation[3] = "pink" slime_mutation[3] = "pink"
slime_mutation[4] = "silver" slime_mutation[4] = "pink"
//Tier 3 //Tier 3
if("dark blue") if("dark blue")
slime_mutation[1] = "purple" slime_mutation[1] = "purple"
slime_mutation[2] = "cerulean" slime_mutation[2] = "blue"
slime_mutation[3] = "blue" slime_mutation[3] = "cerulean"
slime_mutation[4] = "cerulean" slime_mutation[4] = "cerulean"
if("dark purple") if("dark purple")
slime_mutation[1] = "purple" slime_mutation[1] = "purple"
slime_mutation[2] = "sepia" slime_mutation[2] = "orange"
slime_mutation[3] = "orange" slime_mutation[3] = "sepia"
slime_mutation[4] = "sepia" slime_mutation[4] = "sepia"
if("yellow") if("yellow")
slime_mutation[1] = "metal" slime_mutation[1] = "metal"
slime_mutation[2] = "bluespace" slime_mutation[2] = "orange"
slime_mutation[3] = "orange" slime_mutation[3] = "bluespace"
slime_mutation[4] = "bluespace" slime_mutation[4] = "bluespace"
if("silver") if("silver")
slime_mutation[1] = "metal" slime_mutation[1] = "metal"
slime_mutation[2] = "pyrite" slime_mutation[2] = "blue"
slime_mutation[3] = "blue" slime_mutation[3] = "pyrite"
slime_mutation[4] = "pyrite" slime_mutation[4] = "pyrite"
//Tier 4 //Tier 4
if("pink") 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.Remove(pick(P.speech_buffer))
P.speech_buffer.Add(html_decode(message)) 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 if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0
var/obj/O = A var/obj/O = A
spawn (0) spawn (0)

View File

@@ -218,7 +218,7 @@ datum
T.MakeSlippery() T.MakeSlippery()
for(var/mob/living/carbon/slime/M in T) 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) var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !istype(T, /turf/space)) if(hotspot && !istype(T, /turf/space))

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB