things with stuff (#6233)

* buncha things from upstream

* datums globals, onclick

* datums

* game folder, holy shit mirror bot why

* modules

* icons

* dme

* compiles cleanly

* tools purge

* updates maps

* double check just because. and wew lad

* incidentally, this needs more work first

* some things

* weh

* sound cleanup and icons

* reeeee

* compile issues

* oh look, fresh code sync

* cleans up some unused icons

* dirty vars

* reeeeeeeeeeeeeeee

* wew lad. fuck off with this already
This commit is contained in:
Poojawa
2018-04-02 03:53:25 -05:00
committed by deathride58
parent 832939d3ac
commit 5fa001c10f
838 changed files with 25446 additions and 23273 deletions
@@ -40,4 +40,4 @@
build_type = LIMBGROWER
reagents_list = list("synthflesh" = 75)
build_path = /obj/item/melee/synthetic_arm_blade
category = list("special")
category = list("other","emagged")
@@ -2,6 +2,42 @@
/////////////////Weapons/////////////////
/////////////////////////////////////////
/datum/design/c38/sec
id = "sec_38"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/rubbershot/sec
id = "sec_rshot"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/shotgun_slug/sec
id = "sec_slug"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/buckshot_shell/sec
id = "sec_bshot"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/shotgun_dart/sec
id = "sec_dart"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/incendiary_slug/sec
id = "sec_Islug"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/pin_testing
name = "Test-Range Firing Pin"
desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
+1 -3
View File
@@ -69,7 +69,6 @@
if(initial(tempCheck.icon_state) != null)
critical_items += I
/obj/machinery/rnd/experimentor/Initialize()
. = ..()
@@ -109,8 +108,7 @@
ejectItem()
. = ..(O)
/obj/machinery/rnd/experimentor/attack_hand(mob/user)
user.set_machine(src)
/obj/machinery/rnd/experimentor/ui_interact(mob/user)
var/list/dat = list("<center>")
if(!linked_console)
dat += "<b><a href='byond://?src=[REF(src)];function=search'>Scan for R&D Console</A></b>"
@@ -2,7 +2,7 @@
name = "technology fabricator"
desc = "Makes researched and prototype items with materials and energy."
container_type = OPENCONTAINER
layer = BELOW_OBJ_LAYER
var/consoleless_interface = FALSE //Whether it can be used without a console.
var/efficiency_coeff = 1 //Materials needed / coeff = actual.
var/list/categories = list()
+2 -7
View File
@@ -1012,13 +1012,8 @@ doesn't have toxins access.
updateUsrDialog()
/obj/machinery/computer/rdconsole/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/rdconsole/interact(mob/user)
user.set_machine(src)
/obj/machinery/computer/rdconsole/ui_interact(mob/user)
. = ..()
var/datum/browser/popup = new(user, "rndconsole", name, 900, 600)
popup.add_stylesheet("techwebs", 'html/browser/techwebs.css')
popup.set_content(generate_ui())
-11
View File
@@ -13,7 +13,6 @@
var/console_link = TRUE //allow console link.
var/requires_console = TRUE
var/disabled = FALSE
var/shocked = FALSE
var/obj/machinery/computer/rdconsole/linked_console
var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer)
@@ -39,17 +38,7 @@
else
return FALSE
/obj/machinery/rnd/attack_hand(mob/user)
if(shocked)
if(shock(user,50))
return
if(panel_open)
wires.interact(user)
/obj/machinery/rnd/attackby(obj/item/O, mob/user, params)
if (shocked)
if(shock(user,50))
return TRUE
if (default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), O))
if(linked_console)
disconnect_console()
+3 -13
View File
@@ -80,13 +80,6 @@
env.merge(removed)
air_update_turf()
/obj/machinery/rnd/server/attack_hand(mob/user as mob) // I guess only exists to stop ninjas or hell does it even work I dunno. See also ninja gloves.
if (disabled)
return
if (shocked)
shock(user,50)
return
/proc/fix_noid_research_servers()
var/list/no_id_servers = list()
var/list/server_ids = list()
@@ -138,10 +131,8 @@
updateUsrDialog()
return
/obj/machinery/computer/rdservercontrol/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
/obj/machinery/computer/rdservercontrol/ui_interact(mob/user)
. = ..()
var/dat = ""
switch(screen)
@@ -149,8 +140,7 @@
dat += "Connected Servers:<BR><BR>"
for(var/obj/machinery/rnd/server/S in GLOB.machines)
dat += "[S.name] || "
dat += "<BR>"
dat += "[S.name]<BR>"
//Mining status here
+2 -1
View File
@@ -9,7 +9,8 @@
description = "NT default research technologies."
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
"space_heater","xlarge_beaker") //Default research tech, prevents bricking
"space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38") //Default research tech, prevents bricking
/////////////////////////Biotech/////////////////////////
/datum/techweb_node/biotech
@@ -0,0 +1,182 @@
//////////////////////////////////////////////
////////// SLIME CROSSBREEDS //////////
//////////////////////////////////////////////
// A system of combining two extract types. //
// Performed by feeding a slime 20 of an //
// extract color. //
//////////////////////////////////////////////
/*==========================================*\
To add a crossbreed:
The file name is automatically selected
by the crossbreeding effect, which uses
the format slimecross/[modifier]/[color].
If a crossbreed doesn't exist, don't
worry. If no file is found at that
location, it will simple display that
the crossbreed was too unstable.
As a result, do not feel the need to
try to add all of the crossbred
effects at once, if you're here and
trying to make a new slime type. Just
get your slimetype in the codebase and
get around to the crossbreeds eventually!
\*==========================================*/
/obj/item/slimecross //The base type for crossbred extracts. Mostly here for posterity, and to set base case things.
name = "crossbred slime extract"
desc = "An extremely potent slime extract, formed through crossbreeding."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "base"
var/colour = "null"
var/effect = "null"
force = 0
w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
throw_range = 6
/obj/item/slimecross/Initialize()
..()
name = colour + " " + name
var/itemcolor = "#FFFFFF"
switch(colour)
if("orange")
itemcolor = "#FFA500"
if("purple")
itemcolor = "#B19CD9"
if("blue")
itemcolor = "#ADD8E6"
if("metal")
itemcolor = "#7E7E7E"
if("yellow")
itemcolor = "#FFFF00"
if("dark purple")
itemcolor = "#551A8B"
if("dark blue")
itemcolor = "#0000FF"
if("silver")
itemcolor = "#D3D3D3"
if("bluespace")
itemcolor = "#32CD32"
if("sepia")
itemcolor = "#704214"
if("cerulean")
itemcolor = "#2956B2"
if("pyrite")
itemcolor = "#FAFAD2"
if("red")
itemcolor = "#FF0000"
if("green")
itemcolor = "#00FF00"
if("pink")
itemcolor = "#FF69B4"
if("gold")
itemcolor = "#FFD700"
if("oil")
itemcolor = "#505050"
if("black")
itemcolor = "#000000"
if("light pink")
itemcolor = "#FFB6C1"
if("adamantine")
itemcolor = "#008B8B"
add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY)
/obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals.
name = "result extract"
desc = "You shouldn't see this."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "base"
var/del_on_empty = TRUE
container_type = INJECTABLE | DRAWABLE
var/list/list_reagents
/obj/item/slimecrossbeaker/Initialize()
..()
create_reagents(50)
if(list_reagents)
for(var/reagent in list_reagents)
reagents.add_reagent(reagent, list_reagents[reagent])
if(del_on_empty)
START_PROCESSING(SSobj,src)
/obj/item/slimecrossbeaker/Destroy()
STOP_PROCESSING(SSobj,src)
return ..()
/obj/item/slimecrossbeaker/process()
if(!reagents.total_volume)
visible_message("<span class='notice'>[src] has been drained completely, and melts away.</span>")
qdel(src)
/obj/item/slimecrossbeaker/bloodpack //Pack of 50u blood. Deletes on empty.
name = "blood extract"
desc = "A sphere of liquid blood, somehow managing to stay together."
color = "#FF0000"
list_reagents = list("blood" = 50)
/obj/item/slimecrossbeaker/pax //5u synthpax.
name = "peace-inducing extract"
desc = "A small blob of synthetic pax."
color = "#FFCCCC"
list_reagents = list("synthpax" = 5)
/obj/item/slimecrossbeaker/omnizine //15u omnizine.
name = "healing extract"
desc = "A gelatinous extract of pure omnizine."
color = "#FF00FF"
list_reagents = list("omnizine" = 15)
/obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents.
container_type = DRAWABLE //Cannot be refilled, since it's basically an autoinjector!
var/ignore_flags = FALSE
var/self_use_only = FALSE
/obj/item/slimecrossbeaker/autoinjector/attack(mob/living/M, mob/user)
if(!reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty!</span>")
return
if(!iscarbon(M))
return
if(self_use_only && M != user)
to_chat(user, "<span class='warning'>This can only be used on yourself.</span>")
return
if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1)))
reagents.trans_to(M, reagents.total_volume)
if(user != M)
to_chat(M, "<span class='warning'>[user] presses [src] against you!</span>")
to_chat(user, "<span class='notice'>You press [src] against [M], injecting them.</span>")
else
to_chat(user, "<span class='notice'>You press [src] against yourself, and it flattens against you!</span>")
else
to_chat(user, "<span class='warning'>There's no place to stick [src]!</span>")
/obj/item/slimecrossbeaker/autoinjector/regenpack
ignore_flags = TRUE //It is, after all, intended to heal.
name = "mending solution"
desc = "A strange glob of sweet-smelling semifluid, which seems to stick to skin rather easily."
color = "#FF00FF"
list_reagents = list("regen_jelly" = 20)
/obj/item/slimecrossbeaker/autoinjector/slimejelly //Primarily for slimepeople, but you do you.
self_use_only = TRUE
ignore_flags = TRUE
name = "slime jelly bubble"
desc = "A sphere of slime jelly. It seems to stick to your skin, but avoids other surfaces."
color = "#00FF00"
list_reagents = list("slimejelly" = 50)
/obj/item/slimecrossbeaker/autoinjector/peaceandlove
container_type = null //It won't be *that* easy to get your hands on pax.
name = "peaceful distillation"
desc = "A light pink gooey sphere. Simply touching it makes you a little dizzy."
color = "#DDAAAA"
list_reagents = list("synthpax" = 10, "space_drugs" = 15) //Peace, dudes
/obj/item/slimecrossbeaker/autoinjector/slimestimulant
name = "invigorating gel"
desc = "A bubbling purple mixture, designed to heal and boost movement."
color = "#FF00FF"
list_reagents = list("regen_jelly" = 30, "methamphetamine" = 9)
@@ -0,0 +1,798 @@
/obj/screen/alert/status_effect/rainbow_protection
name = "Rainbow Protection"
desc = "You are defended from harm, but so are those you might seek to injure!"
icon_state = "slime_rainbowshield"
/datum/status_effect/rainbow_protection
id = "rainbow_protection"
duration = 100
alert_type = /obj/screen/alert/status_effect/rainbow_protection
var/originalcolor
/datum/status_effect/rainbow_protection/on_apply()
owner.status_flags |= GODMODE
owner.add_trait(TRAIT_PACIFISM, "slimestatus")
owner.visible_message("<span class='warning'>[owner] shines with a brilliant rainbow light.</span>",
"<span class='notice'>You feel protected by an unknown force!</span>")
originalcolor = owner.color
return ..()
/datum/status_effect/rainbow_protection/tick()
owner.color = rgb(rand(0,255),rand(0,255),rand(0,255))
return ..()
/datum/status_effect/rainbow_protection/on_remove()
owner.status_flags &= ~GODMODE
owner.color = originalcolor
owner.remove_trait(TRAIT_PACIFISM, "slimestatus")
owner.visible_message("<span class='notice'>[owner] stops glowing, the rainbow light fading away.</span>",
"<span class='warning'>You no longer feel protected...</span>")
/obj/screen/alert/status_effect/slimeskin
name = "Adamantine Slimeskin"
desc = "You are covered in a thick, non-neutonian gel."
icon_state = "slime_stoneskin"
/datum/status_effect/slimeskin
id = "slimeskin"
duration = 300
alert_type = /obj/screen/alert/status_effect/slimeskin
var/originalcolor
/datum/status_effect/slimeskin/on_apply()
originalcolor = owner.color
owner.color = "#3070CC"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance += 10
owner.visible_message("<span class='warning'>[owner] is suddenly covered in a strange, blue-ish gel!</span>",
"<span class='notice'>You are covered in a thick, rubbery gel.</span>")
return ..()
/datum/status_effect/slimeskin/on_remove()
owner.color = originalcolor
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance -= 10
owner.visible_message("<span class='warning'>[owner]'s gel coating liquefies and dissolves away.</span>",
"<span class='notice'>Your gel second-skin dissolves!</span>")
///////////////////////////////////////////////////////
//////////////////CONSUMING EXTRACTS///////////////////
///////////////////////////////////////////////////////
/datum/status_effect/firecookie
id = "firecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/firecookie/on_apply()
owner.add_trait(TRAIT_RESISTCOLD,"firecookie")
owner.adjust_bodytemperature(110)
return ..()
/datum/status_effect/firecookie/on_remove()
owner.remove_trait(TRAIT_RESISTCOLD,"firecookie")
/datum/status_effect/watercookie
id = "watercookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/watercookie/on_apply()
owner.add_trait(TRAIT_NOSLIPWATER,"watercookie")
return ..()
/datum/status_effect/watercookie/tick()
for(var/turf/open/T in range(get_turf(owner),1))
T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5)
/datum/status_effect/watercookie/on_remove()
owner.remove_trait(TRAIT_NOSLIPWATER,"watercookie")
/datum/status_effect/metalcookie
id = "metalcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/metalcookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.brute_mod *= 0.9
return ..()
/datum/status_effect/metalcookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.brute_mod /= 0.9
/datum/status_effect/sparkcookie
id = "sparkcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 300
var/original_coeff
/datum/status_effect/sparkcookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
original_coeff = H.physiology.siemens_coeff
H.physiology.siemens_coeff = 0
return ..()
/datum/status_effect/sparkcookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.siemens_coeff = original_coeff
/datum/status_effect/toxincookie
id = "toxincookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 600
/datum/status_effect/toxincookie/on_apply()
owner.add_trait(TRAIT_TOXINLOVER,"toxincookie")
return ..()
/datum/status_effect/toxincookie/on_remove()
owner.remove_trait(TRAIT_TOXINLOVER,"toxincookie")
/datum/status_effect/timecookie
id = "timecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 600
/datum/status_effect/timecookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H
H.physiology.do_after_speed *= 0.95
return ..()
/datum/status_effect/timecookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H
H.physiology.do_after_speed /= 0.95
/datum/status_effect/lovecookie
id = "lovecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 300
/datum/status_effect/lovecookie/tick()
if(owner.stat != CONSCIOUS)
return
if(iscarbon(owner))
var/mob/living/carbon/C = owner
if(C.handcuffed)
return
var/list/huggables = list()
for(var/mob/living/carbon/L in range(get_turf(owner),1))
if(L != owner)
huggables += L
if(length(huggables))
var/mob/living/carbon/hugged = pick(huggables)
owner.visible_message("<span class='notice'>[owner] hugs [hugged]!</span>", "<span class='notice'>You hug [hugged]!</span>")
/datum/status_effect/tarcookie
id = "tarcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/tarcookie/tick()
for(var/mob/living/carbon/human/L in range(get_turf(owner),1))
if(L != owner)
L.apply_status_effect(/datum/status_effect/tarfoot)
/datum/status_effect/tarfoot
id = "tarfoot"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 30
/datum/status_effect/tarfoot/on_apply()
var/mob/living/carbon/human/H = owner
if(istype(H))
H.physiology.speed_mod += 0.5
return ..()
/datum/status_effect/tarfoot/on_remove()
var/mob/living/carbon/human/H = owner
if(istype(H))
H.physiology.speed_mod -= 0.5
/datum/status_effect/spookcookie
id = "spookcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 300
/datum/status_effect/spookcookie/on_apply()
var/image/I = image(icon = 'icons/mob/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner)
I.override = 1
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I)
return ..()
/datum/status_effect/spookcookie/on_remove()
owner.remove_alt_appearance("spookyscary")
/datum/status_effect/peacecookie
id = "peacecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/peacecookie/tick()
for(var/mob/living/L in range(get_turf(owner),1))
L.apply_status_effect(/datum/status_effect/plur)
/datum/status_effect/plur
id = "plur"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 30
/datum/status_effect/plur/on_apply()
owner.add_trait(TRAIT_PACIFISM, "peacecookie")
return ..()
/datum/status_effect/plur/on_remove()
owner.remove_trait(TRAIT_PACIFISM, "peacecookie")
/datum/status_effect/adamantinecookie
id = "adamantinecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/adamantinecookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.burn_mod *= 0.9
return ..()
/datum/status_effect/adamantinecookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.burn_mod /= 0.9
///////////////////////////////////////////////////////
//////////////////STABILIZED EXTRACTS//////////////////
///////////////////////////////////////////////////////
/datum/status_effect/stabilized //The base stabilized extract effect, has no effect of its' own.
id = "stabilizedbase"
duration = -1
alert_type = null
var/obj/item/slimecross/stabilized/linked_extract
var/colour = "null"
/datum/status_effect/stabilized/tick()
if(!linked_extract || !linked_extract.loc) //Sanity checking
qdel(src)
return
if(linked_extract && linked_extract.loc != owner && linked_extract.loc.loc != owner)
linked_extract.linked_effect = null
if(!QDELETED(linked_extract))
linked_extract.owner = null
START_PROCESSING(SSobj,linked_extract)
qdel(src)
return ..()
/datum/status_effect/stabilized/null //This shouldn't ever happen, but just in case.
id = "stabilizednull"
//Stabilized effects start below.
/datum/status_effect/stabilized/grey
id = "stabilizedgrey"
colour = "grey"
/datum/status_effect/stabilized/grey/tick()
for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner)))
if(!(owner in S.Friends))
to_chat(owner, "<span class='notice'>[linked_extract] pulses gently as it communicates with [S]</span>")
S.Friends[owner] = 1
return ..()
/datum/status_effect/stabilized/orange
id = "stabilizedorange"
colour = "orange"
/datum/status_effect/stabilized/orange/tick()
var/body_temperature_difference = BODYTEMP_NORMAL - owner.bodytemperature
owner.adjust_bodytemperature(min(5,body_temperature_difference))
return ..()
/datum/status_effect/stabilized/purple
id = "stabilizedpurple"
colour = "purple"
/datum/status_effect/stabilized/purple/tick()
var/is_healing = FALSE
if(owner.getBruteLoss() > 0)
owner.adjustBruteLoss(-0.2)
is_healing = TRUE
if(owner.getFireLoss() > 0)
owner.adjustFireLoss(-0.2)
is_healing = TRUE
if(owner.getToxLoss() > 0)
owner.adjustToxLoss(-0.2, forced = TRUE) //Slimepeople should also get healed.
is_healing = TRUE
if(is_healing)
examine_text = "<span class='warning'>SUBJECTPRONOUN is regenerating slowly, purplish goo filling in small injuries!</span>"
new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000")
else
examine_text = null
..()
/datum/status_effect/stabilized/blue
id = "stabilizedblue"
colour = "blue"
/datum/status_effect/stabilized/blue/on_apply()
owner.add_trait(TRAIT_NOSLIPWATER, "slimestatus")
return ..()
datum/status_effect/stabilized/blue/on_remove()
owner.remove_trait(TRAIT_NOSLIPWATER, "slimestatus")
/datum/status_effect/stabilized/metal
id = "stabilizedmetal"
colour = "metal"
var/cooldown = 30
var/max_cooldown = 30
/datum/status_effect/stabilized/metal/tick()
if(cooldown > 0)
cooldown--
else
cooldown = max_cooldown
var/list/sheets = list()
for(var/obj/item/stack/sheet/S in owner.GetAllContents())
if(S.amount < S.max_amount)
sheets += S
if(sheets.len > 0)
var/obj/item/stack/sheet/S = pick(sheets)
S.amount++
to_chat(owner, "<span class='notice'>[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!</span>")
return ..()
/datum/status_effect/stabilized/yellow
id = "stabilizedyellow"
colour = "yellow"
var/cooldown = 10
var/max_cooldown = 10
examine_text = "<span class='warning'>Nearby electronics seem just a little more charged wherever SUBJECTPRONOUN goes.</span>"
/datum/status_effect/stabilized/yellow/tick()
if(cooldown > 0)
cooldown--
return ..()
cooldown = max_cooldown
var/list/batteries = list()
for(var/obj/item/stock_parts/cell/C in owner.GetAllContents())
if(C.charge < C.maxcharge)
batteries += C
if(batteries.len)
var/obj/item/stock_parts/cell/ToCharge = pick(batteries)
ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum.
to_chat(owner, "<span class='notice'>[linked_extract] discharges some energy into a device you have.</span>")
return ..()
/obj/item/hothands
name = "burning fingertips"
desc = "You shouldn't see this."
/obj/item/hothands/is_hot()
return 290 //Below what's required to ignite plasma.
/datum/status_effect/stabilized/darkpurple
id = "stabilizeddarkpurple"
colour = "dark purple"
var/obj/item/hothands/fire
examine_text = "<span class='notice'>Their fingertips burn brightly!</span>"
/datum/status_effect/stabilized/darkpurple/on_apply()
owner.add_trait(TRAIT_RESISTHEATHANDS, "slimestatus")
fire = new(owner)
return ..()
/datum/status_effect/stabilized/darkpurple/tick()
var/obj/item/I = owner.get_active_held_item()
var/obj/item/reagent_containers/food/snacks/F = I
if(istype(F))
if(F.cooked_type)
to_chat(owner, "<span class='warning'>[linked_extract] flares up brightly, and your hands alone are enough cook [F]!</span>")
F.microwave_act()
else
I.attackby(fire, owner)
return ..()
/datum/status_effect/stabilized/darkpurple/on_remove()
owner.remove_trait(TRAIT_RESISTHEATHANDS, "slimestatus")
qdel(fire)
/datum/status_effect/stabilized/darkblue
id = "stabilizeddarkblue"
colour = "dark blue"
/datum/status_effect/stabilized/darkblue/tick()
if(owner.fire_stacks > 0 && prob(80))
owner.fire_stacks--
if(owner.fire_stacks <= 0)
to_chat(owner, "<span class='notice'>[linked_extract] coats you in a watery goo, extinguishing the flames.</span>")
var/obj/O = owner.get_active_held_item()
O.extinguish() //All shamelessly copied from water's reaction_obj, since I didn't seem to be able to get it here for some reason.
O.acid_level = 0
// Monkey cube
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
to_chat(owner, "<span class='warning'>[linked_extract] kept your hands wet! It makes [O] expand!</span>")
var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
cube.Expand()
// Dehydrated carp
else if(istype(O, /obj/item/toy/plush/carpplushie/dehy_carp))
to_chat(owner, "<span class='warning'>[linked_extract] kept your hands wet! It makes [O] expand!</span>")
var/obj/item/toy/plush/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
else if(istype(O, /obj/item/stack/sheet/hairlesshide))
to_chat(owner, "<span class='warning'>[linked_extract] kept your hands wet! It wets [O]!</span>")
var/obj/item/stack/sheet/hairlesshide/HH = O
var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH))
WL.amount = HH.amount
qdel(HH)
..()
/datum/status_effect/stabilized/silver
id = "stabilizedsilver"
colour = "silver"
/datum/status_effect/stabilized/silver/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.hunger_mod *= 0.8 //20% buff
return ..()
/datum/status_effect/stabilized/silver/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.hunger_mod /= 0.8
//Bluespace has an icon because it's kinda active.
/obj/screen/alert/status_effect/bluespaceslime
name = "Stabilized Bluespace Extract"
desc = "You shouldn't see this, since we set it to change automatically!"
icon_state = "slime_bluespace_on"
/datum/status_effect/bluespacestabilization
id = "stabilizedbluespacecooldown"
duration = 1200
alert_type = null
/datum/status_effect/stabilized/bluespace
id = "stabilizedbluespace"
colour = "bluespace"
alert_type = /obj/screen/alert/status_effect/bluespaceslime
var/healthcheck
/datum/status_effect/stabilized/bluespace/tick()
if(owner.has_status_effect(/datum/status_effect/bluespacestabilization))
linked_alert.desc = "The stabilized bluespace extract is still aligning you with the bluespace axis."
linked_alert.icon_state = "slime_bluespace_off"
return ..()
else
linked_alert.desc = "The stabilized bluespace extract will try to redirect you from harm!"
linked_alert.icon_state = "slime_bluespace_on"
if(healthcheck && (healthcheck - owner.health) > 5)
owner.visible_message("<span class='warning'>[linked_extract] notices the sudden change in [owner]'s physical health, and activates!</span>")
do_sparks(5,FALSE,owner)
var/F = find_safe_turf(zlevels = owner.z, extended_safety_checks = TRUE)
var/range = 0
if(!F)
F = get_turf(owner)
range = 50
if(do_teleport(owner, F, range))
to_chat(owner, "<span class='notice'>[linked_extract] will take some time to re-align you on the bluespace axis.</span>")
do_sparks(5,FALSE,owner)
owner.apply_status_effect(/datum/status_effect/bluespacestabilization)
healthcheck = owner.health
return ..()
/datum/status_effect/stabilized/sepia
id = "stabilizedsepia"
colour = "sepia"
var/mod = 0
/datum/status_effect/stabilized/sepia/tick()
if(prob(50) && mod > -1)
mod--
var/mob/living/carbon/human/H = owner
if(istype(H))
H.physiology.speed_mod--
else if(mod < 1)
mod++
var/mob/living/carbon/human/H = owner
if(istype(H))
H.physiology.speed_mod++
return ..()
/datum/status_effect/stabilized/sepia/on_remove()
var/mob/living/carbon/human/H = owner
if(istype(H))
H.physiology.speed_mod += -mod //Reset the changes.
/datum/status_effect/stabilized/cerulean
id = "stabilizedcerulean"
colour = "cerulean"
var/mob/living/clone
/datum/status_effect/stabilized/cerulean/on_apply()
var/typepath = owner.type
clone = new typepath(owner.loc)
var/mob/living/carbon/O = owner
var/mob/living/carbon/C = clone
if(istype(C) && istype(O))
C.real_name = O.real_name
O.dna.transfer_identity(C)
C.updateappearance(mutcolor_update=1)
return ..()
/datum/status_effect/stabilized/cerulean/tick()
if(owner.stat == DEAD)
if(clone && clone.stat != DEAD)
owner.visible_message("<span class='warning'>[owner] blazes with brilliant light, [linked_extract] whisking [owner.p_their()] soul away.</span>",
"<span class='notice'>You feel a warm glow from [linked_extract], and you open your eyes... elsewhere.</span>")
if(owner.mind)
owner.mind.transfer_to(clone)
clone = null
qdel(linked_extract)
if(!clone || clone.stat == DEAD)
to_chat(owner, "<span class='notice'>[linked_extract] desperately tries to move your soul to a living body, but can't find one!</span>")
qdel(linked_extract)
..()
/datum/status_effect/stabilized/cerulean/on_remove()
if(clone)
clone.visible_message("<span class='warning'>[clone] dissolves into a puddle of goo!</span>")
qdel(clone)
/datum/status_effect/stabilized/pyrite
id = "stabilizedpyrite"
colour = "pyrite"
var/originalcolor
/datum/status_effect/stabilized/pyrite/on_apply()
originalcolor = owner.color
return ..()
/datum/status_effect/stabilized/pyrite/tick()
owner.color = rgb(rand(0,255),rand(0,255),rand(0,255))
return ..()
/datum/status_effect/stabilized/pyrite/on_remove()
owner.color = originalcolor
/datum/status_effect/stabilized/red
id = "stabilizedred"
colour = "red"
/datum/status_effect/stabilized/red/on_apply()
owner.add_trait(TRAIT_IGNORESLOWDOWN,"slimestatus")
return ..()
/datum/status_effect/stabilized/red/on_remove()
owner.remove_trait(TRAIT_IGNORESLOWDOWN,"slimestatus")
/datum/status_effect/stabilized/green
id = "stabilizedgreen"
colour = "green"
var/datum/dna/originalDNA
var/originalname
/datum/status_effect/stabilized/green/on_apply()
to_chat(owner, "<span class='warning'>You feel different...</span>")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
originalDNA = new H.dna.type
originalname = H.real_name
H.dna.copy_dna(originalDNA)
randomize_human(H)
return ..()
/datum/status_effect/stabilized/green/tick() //Only occasionally give examiners a warning.
if(prob(50))
examine_text = "<span class='warning'>SUBJECTPRONOUN looks a bit green and gooey...</span>"
else
examine_text = null
return ..()
/datum/status_effect/stabilized/green/on_remove()
to_chat(owner, "<span class='notice'>You feel more like yourself.</span>")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
originalDNA.transfer_identity(H)
H.real_name = originalname
H.updateappearance(mutcolor_update=1)
/datum/status_effect/brokenpeace
id = "brokenpeace"
duration = 1200
alert_type = null
/datum/status_effect/pinkdamagetracker
id = "pinkdamagetracker"
duration = -1
alert_type = null
var/damage = 0
var/lasthealth
/datum/status_effect/pinkdamagetracker/tick()
if((lasthealth - owner.health) > 0)
damage += (lasthealth - owner.health)
lasthealth = owner.health
/datum/status_effect/stabilized/pink
id = "stabilizedpink"
colour = "pink"
var/list/mobs = list()
var/faction_name
/datum/status_effect/stabilized/pink/on_apply()
faction_name = owner.real_name
return ..()
/datum/status_effect/stabilized/pink/tick()
for(var/mob/living/simple_animal/M in view(7,get_turf(owner)))
if(!(M in mobs))
mobs += M
M.apply_status_effect(/datum/status_effect/pinkdamagetracker)
M.faction |= faction_name
for(var/mob/living/simple_animal/M in mobs)
if(!(M in view(7,get_turf(owner))))
M.faction -= faction_name
M.remove_status_effect(/datum/status_effect/pinkdamagetracker)
mobs -= M
var/datum/status_effect/pinkdamagetracker/C = M.has_status_effect(/datum/status_effect/pinkdamagetracker)
if(istype(C) && C.damage > 0)
C.damage = 0
owner.apply_status_effect(/datum/status_effect/brokenpeace)
var/HasFaction = FALSE
for(var/i in owner.faction)
if(i == faction_name)
HasFaction = TRUE
if(HasFaction && owner.has_status_effect(/datum/status_effect/brokenpeace))
owner.faction -= faction_name
to_chat(owner, "<span class='userdanger'>The peace has been broken! Hostile creatures will now react to you!</span>")
if(!HasFaction && !owner.has_status_effect(/datum/status_effect/brokenpeace))
to_chat(owner, "<span class='notice'>[linked_extract] pulses, generating a fragile aura of peace.</span>")
owner.faction |= faction_name
return ..()
/datum/status_effect/stabilized/pink/on_remove()
for(var/mob/living/simple_animal/M in mobs)
M.faction -= faction_name
M.remove_status_effect(/datum/status_effect/pinkdamagetracker)
for(var/i in owner.faction)
if(i == faction_name)
owner.faction -= faction_name
/datum/status_effect/stabilized/oil
id = "stabilizedoil"
colour = "oil"
examine_text = "<span class='warning'>SUBJECTPRONOUN smells of sulfer and oil!</span>"
/datum/status_effect/stabilized/oil/tick()
if(owner.stat == DEAD)
explosion(get_turf(owner),1,2,4,flame_range = 5)
return ..()
/datum/status_effect/stabilized/black
id = "stabilizedblack"
colour = "black"
var/messagedelivered = FALSE
var/heal_amount = 1
/datum/status_effect/stabilized/black/tick()
if(owner.pulling && isliving(owner.pulling) && owner.grab_state == GRAB_KILL)
var/mob/living/M = owner.pulling
if(M.stat == DEAD)
return
if(!messagedelivered)
to_chat(owner,"<span class='notice'>You feel your hands melt around [M]'s neck and start to drain them of life.</span>")
to_chat(owner.pulling, "<span class='userdanger'>[owner]'s hands melt around your neck, and you can feel your life starting to drain away!</span>")
messagedelivered = TRUE
examine_text = "<span class='warning'>SUBJECTPRONOUN is draining health from [owner.pulling]!</span>"
var/list/healing_types = list()
if(owner.getBruteLoss() > 0)
healing_types += BRUTE
if(owner.getFireLoss() > 0)
healing_types += BURN
if(owner.getToxLoss() > 0)
healing_types += TOX
if(owner.getCloneLoss() > 0)
healing_types += CLONE
owner.apply_damage_type(-heal_amount, damagetype=pick(healing_types))
owner.nutrition += 3
M.adjustCloneLoss(heal_amount * 1.2) //This way, two people can't just convert each other's damage away.
else
messagedelivered = FALSE
examine_text = null
return ..()
/datum/status_effect/stabilized/lightpink
id = "stabilizedlightpink"
colour = "light pink"
/datum/status_effect/stabilized/lightpink/on_apply()
owner.add_trait(TRAIT_GOTTAGOFAST,"slimestatus")
return ..()
/datum/status_effect/stabilized/lightpink/tick()
for(var/mob/living/carbon/human/H in range(1, get_turf(owner)))
if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent("epinephrine"))
to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep them alive.")
H.reagents.add_reagent("epinephrine",5)
return ..()
/datum/status_effect/stabilized/lightpink/on_remove()
owner.remove_trait(TRAIT_GOTTAGOFAST,"slimestatus")
/datum/status_effect/stabilized/adamantine
id = "stabilizedadamantine"
colour = "adamantine"
examine_text = "<span class='warning'>SUBJECTPRONOUN has a strange metallic coating on their skin.</span>"
/datum/status_effect/stabilized/gold
id = "stabilizedgold"
colour = "gold"
var/mob/living/simple_animal/familiar
/datum/status_effect/stabilized/gold/tick()
if(!familiar)
familiar = create_random_mob(get_turf(owner.loc), FRIENDLY_SPAWN)
familiar.del_on_death = TRUE
return ..()
/datum/status_effect/stabilized/gold/on_remove()
if(familiar)
qdel(familiar)
/datum/status_effect/stabilized/adamantine/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance += 5
return ..()
/datum/status_effect/stabilized/adamantine/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance += 5
/datum/status_effect/stabilized/rainbow
id = "stabilizedrainbow"
colour = "rainbow"
/datum/status_effect/stabilized/rainbow/tick()
if(owner.health <= 0)
var/obj/item/slimecross/stabilized/rainbow/X = linked_extract
if(istype(X))
if(X.regencore)
X.regencore.afterattack(owner,owner,TRUE)
X.regencore = null
owner.visible_message("<span class='warning'>[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!</span>")
qdel(src)
qdel(linked_extract)
return ..()
@@ -0,0 +1,420 @@
/*
Burning extracts:
Have a unique, primarily offensive effect when
filled with 10u plasma and activated in-hand.
*/
/obj/item/slimecross/burning
name = "burning extract"
desc = "It's boiling over with barely-contained energy."
effect = "burning"
container_type = INJECTABLE | DRAWABLE
icon_state = "burning"
/obj/item/slimecross/burning/Initialize()
..()
create_reagents(10)
/obj/item/slimecross/burning/attack_self(mob/user)
if(!reagents.has_reagent("plasma",10))
to_chat(user, "<span class='warning'>This extract needs to be full of plasma to activate!</span>")
return
reagents.remove_reagent("plasma",10)
to_chat(user, "<span class='notice'>You squeeze the extract, and it absorbs the plasma!</span>")
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
playsound(src, 'sound/magic/fireball.ogg', 50, 1)
do_effect(user)
/obj/item/slimecross/burning/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..()
qdel(src)
return
/obj/item/slimecross/burning/grey
colour = "grey"
/obj/item/slimecross/burning/grey/do_effect(mob/user)
var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey")
S.visible_message("<span class='danger'>A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!</span>")
S.Friends[user] = 20 //Gas, gas, gas
S.bodytemperature = T0C + 400 //We gonna step on the gas.
S.nutrition = S.get_hunger_nutrition() //Tonight, we fight!
..()
/obj/item/slimecross/burning/orange
colour = "orange"
/obj/item/slimecross/burning/orange/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] boils over with a caustic gas!</span>")
var/datum/reagents/R = new/datum/reagents(100)
R.add_reagent("condensedcapsaicin", 100)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 7, get_turf(user))
smoke.start()
..()
/obj/item/slimecross/burning/purple
colour = "purple"
/obj/item/slimecross/burning/purple/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] fills with a bubbling liquid!</span>")
new /obj/item/slimecrossbeaker/autoinjector/slimestimulant(get_turf(user))
..()
/obj/item/slimecross/burning/blue
colour = "blue"
/obj/item/slimecross/burning/blue/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] flash-freezes the area!</span>")
for(var/turf/open/T in range(3, get_turf(user)))
T.MakeSlippery(TURF_WET_PERMAFROST, min_wet_time = 10, wet_time_to_add = 5)
for(var/mob/living/carbon/M in range(5, get_turf(user)))
if(M != user)
M.bodytemperature = BODYTEMP_COLD_DAMAGE_LIMIT + 10 //Not quite cold enough to hurt.
to_chat(M, "<span class='danger'>You feel a chill run down your spine, and the floor feels a bit slippery with frost...</span>")
..()
/obj/item/slimecross/burning/metal
colour = "metal"
/obj/item/slimecross/burning/metal/do_effect(mob/user)
for(var/turf/closed/wall/W in range(1,get_turf(user)))
W.dismantle_wall(1)
playsound(W, 'sound/effects/break_stone.ogg', 50, 1)
user.visible_message("<span class='danger'>[src] pulses violently, and shatters the walls around it!</span>")
..()
/obj/item/slimecross/burning/yellow
colour = "yellow"
/obj/item/slimecross/burning/yellow/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] explodes into an electrical field!</span>")
playsound(get_turf(src), 'sound/weapons/zapbang.ogg', 50, 1)
for(var/mob/living/M in range(4,get_turf(user)))
if(M != user)
var/mob/living/carbon/C = M
if(istype(C))
C.electrocute_act(25,src)
else
M.adjustFireLoss(25)
to_chat(M, "<span class='danger'>You feel a sharp electrical pulse!</span>")
..()
/obj/item/slimecross/burning/darkpurple
colour = "dark purple"
/obj/item/slimecross/burning/darkpurple/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] sublimates into a cloud of plasma!</span>")
var/turf/T = get_turf(user)
T.atmos_spawn_air("plasma=60")
..()
/obj/item/slimecross/burning/darkblue
colour = "dark blue"
/obj/item/slimecross/burning/darkblue/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] releases a burst of chilling smoke!</span>")
var/datum/reagents/R = new/datum/reagents(100)
R.add_reagent("frostoil", 40)
user.reagents.add_reagent("cryoxadone",10)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 7, get_turf(user))
smoke.start()
..()
/obj/item/slimecross/burning/silver
colour = "silver"
/obj/item/slimecross/burning/silver/do_effect(mob/user)
var/amount = rand(3,6)
var/list/turfs = list()
for(var/turf/open/T in range(1,get_turf(user)))
turfs += T
for(var/i = 0, i < amount, i++)
var/path = get_random_food()
var/obj/item/O = new path(pick(turfs))
O.reagents.add_reagent("slimejelly",5) //Oh god it burns
if(prob(50))
O.desc += " It smells strange..."
user.visible_message("<span class='danger'>[src] produces a few pieces of food!</span>")
..()
/obj/item/slimecross/burning/bluespace
colour = "bluespace"
/obj/item/slimecross/burning/bluespace/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] sparks, and lets off a shockwave of bluespace energy!</span>")
for(var/mob/living/L in range(1, get_turf(user)))
if(L != user)
do_teleport(L, get_turf(L), 6, asoundin = 'sound/effects/phasein.ogg') //Somewhere between the effectiveness of fake and real BS crystal
new /obj/effect/particle_effect/sparks(get_turf(L))
playsound(get_turf(L), "sparks", 50, 1)
..()
/obj/item/slimecross/burning/sepia
colour = "sepia"
/obj/item/slimecross/burning/sepia/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] shapes itself into a camera!</span>")
new /obj/item/device/camera/timefreeze(get_turf(user))
..()
/obj/item/slimecross/burning/cerulean
colour = "cerulean"
/obj/item/slimecross/burning/cerulean/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] produces a potion!</span>")
new /obj/item/slimepotion/extract_cloner(get_turf(user))
..()
/obj/item/slimecross/burning/pyrite
colour = "pyrite"
/obj/item/slimecross/burning/pyrite/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] releases a colorful wave of energy, which shatters the lights!</span>")
var/area/A = get_area(user.loc)
for(var/obj/machinery/light/L in A) //Shamelessly copied from the APC effect.
L.on = TRUE
L.break_light_tube()
L.on = FALSE
stoplag()
..()
/obj/item/slimecross/burning/red
colour = "red"
/obj/item/slimecross/burning/red/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] pulses a hazy red aura for a moment, which wraps around [user]!</span>")
for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user)))
if(user in S.Friends)
var/friendliness = S.Friends[user]
S.Friends = list()
S.Friends[user] = friendliness
else
S.Friends = list()
S.rabid = 1
S.visible_message("<span class='danger'>The [S] is driven into a dangerous frenzy!</span>")
..()
/obj/item/slimecross/burning/green
colour = "green"
/obj/item/slimecross/burning/green/do_effect(mob/user)
var/which_hand = "l_hand"
if(!(user.active_hand_index % 2))
which_hand = "r_hand"
var/mob/living/L = user
if(!istype(user))
return
var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case...
L.dropItemToGround(held)
var/obj/item/melee/arm_blade/slime/blade = new(user)
if(!L.put_in_hands(blade))
qdel(blade)
user.visible_message("<span class='warning'>[src] melts onto [user]'s arm, boiling the flesh horribly!</span>")
else
user.visible_message("<span class='danger'>[src] sublimates the flesh around [user]'s arm, transforming the bone into a gruesome blade!</span>")
user.emote("scream")
L.apply_damage(30,BURN,which_hand)
..()
/obj/item/slimecross/burning/pink
colour = "pink"
/obj/item/slimecross/burning/pink/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] shrinks into a small, gel-filled pellet!</span>")
new /obj/item/slimecrossbeaker/pax(get_turf(user))
..()
/obj/item/slimecross/burning/gold
colour = "gold"
/obj/item/slimecross/burning/gold/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] shudders violently, and summons an army for [user]!</span>")
for(var/i in 1 to 3) //Less than gold normally does, since it's safer and faster.
var/mob/living/simple_animal/S = create_random_mob(get_turf(user), HOSTILE_SPAWN)
S.faction |= "[REF(user)]"
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(S, pick(NORTH,SOUTH,EAST,WEST))
..()
/obj/item/slimecross/burning/oil
colour = "oil"
/obj/item/slimecross/burning/oil/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] begins to shake with rapidly increasing force!</span>")
addtimer(CALLBACK(src, .proc/boom), 50)
/obj/item/slimecross/burning/oil/proc/boom()
explosion(get_turf(src), 2, 4, 4) //Same area as normal oils, but increased high-impact values by one each, then decreased light by 2.
qdel(src)
/obj/item/slimecross/burning/black
colour = "black"
/obj/item/slimecross/burning/black/do_effect(mob/user)
var/mob/living/L = user
if(!istype(L))
return
user.visible_message("<span class='danger'>[src] absorbs [user], transforming them into a slime!</span>")
var/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/S = new()
S.remove_on_restore = TRUE
user.mind.AddSpell(S)
S.cast(list(user),user)
..()
/obj/item/slimecross/burning/lightpink
colour = "light pink"
/obj/item/slimecross/burning/lightpink/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] lets off a hypnotizing pink glow!</span>")
for(var/mob/living/carbon/C in view(7, get_turf(user)))
C.reagents.add_reagent("pax",5)
..()
/obj/item/slimecross/burning/adamantine
colour = "adamantine"
/obj/item/slimecross/burning/adamantine/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] crystallizes into a large shield!</span>")
new /obj/item/twohanded/required/adamantineshield(get_turf(user))
..()
/obj/item/slimecross/burning/rainbow
colour = "rainbow"
/obj/item/slimecross/burning/rainbow/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] flattens into a glowing rainbow blade.</span>")
new /obj/item/kitchen/knife/rainbowknife(get_turf(user))
..()
//Misc. things added
/obj/item/device/camera/timefreeze
name = "sepia-tinted camera"
desc = "They say a picture is like a moment stopped in time."
pictures_left = 1
pictures_max = 1
/obj/item/device/camera/timefreeze/afterattack(atom/target, mob/user, flag)
if(!on || !pictures_left || !isturf(target.loc))
return
new /obj/effect/timestop(get_turf(target), 2, 50, list(user))
..()
var/text = "The camera fades away"
if(disk)
text += ", leaving the disk behind!"
user.put_in_hands(disk)
else
text += "!"
to_chat(user,"<span class='notice'>[text]</span>")
qdel(src)
/obj/item/slimepotion/extract_cloner
name = "extract cloning potion"
desc = "An more powerful version of the extract enhancer potion, capable of cloning regular slime extracts."
icon = 'icons/obj/chemical.dmi'
icon_state = "potpurple"
/obj/item/slimepotion/extract_cloner/afterattack(obj/item/target, mob/user , proximity)
if(!proximity)
return
if(istype(target, /obj/item/reagent_containers))
return ..(target, user, proximity)
if(istype(target, /obj/item/slimecross))
to_chat(user, "<span class='warning'>[target] is too complex for the potion to clone!</span>")
return
if(!istype(target, /obj/item/slime_extract))
return
var/obj/item/slime_extract/S = target
if(S.recurring)
to_chat(user, "<span class='warning'>[target] is too complex for the potion to clone!</span>")
return
var/path = S.type
var/obj/item/slime_extract/C = new path(get_turf(target))
C.Uses = S.Uses
to_chat(user, "<span class='notice'>You pour the potion onto [target], and the fluid solidifies into a copy of it!</span>")
qdel(src)
return
/obj/item/melee/arm_blade/slime
name = "slimy boneblade"
desc = "What remains of the bones in your arm. Incredibly sharp, and painful for both you and your opponents."
force = 15
force_string = "painful"
/obj/item/melee/arm_blade/slime/attack(mob/living/L, mob/user)
. = ..()
if(prob(20))
user.emote("scream")
/obj/item/kitchen/knife/rainbowknife
name = "rainbow knife"
desc = "A strange, transparent knife which constantly shifts color. It hums slightly when moved."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "rainbowknife"
force = 15
throwforce = 15
damtype = BRUTE
/obj/item/kitchen/knife/rainbowknife/afterattack(atom/O, mob/user, proximity)
if(proximity && istype(O, /mob/living))
damtype = pick(BRUTE, BURN, TOX, OXY, CLONE)
switch(damtype)
if(BRUTE)
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("slashed","sliced","cut")
if(BURN)
hitsound = 'sound/weapons/sear.ogg'
attack_verb = list("burned","singed","heated")
if(TOX)
hitsound = 'sound/weapons/pierce.ogg'
attack_verb = list("poisoned","dosed","toxified")
if(OXY)
hitsound = 'sound/effects/space_wind.ogg'
attack_verb = list("suffocated","winded","vacuumed")
if(CLONE)
hitsound = 'sound/items/geiger/ext1.ogg'
attack_verb = list("irradiated","mutated","maligned")
return ..()
/obj/item/twohanded/required/adamantineshield
name = "adamantine shield"
desc = "A gigantic shield made of solid adamantium."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "adamshield"
item_state = "adamshield"
w_class = WEIGHT_CLASS_HUGE
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
slot_flags = SLOT_BACK
block_chance = 75
throw_range = 1 //How far do you think you're gonna throw a solid crystalline shield...?
throw_speed = 2
force = 15 //Heavy, but hard to wield.
attack_verb = list("bashed","pounded","slammed")
flags_2 = SLOWS_WHILE_IN_HAND_2
/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform
name = "Slime Transformation"
desc = "Transform from a human to a slime, or back again!"
action_icon_state = "transformslime"
cooldown_min = 0
charge_max = 0
invocation_type = "none"
shapeshift_type = /mob/living/simple_animal/slime/transformedslime
convert_damage = TRUE
convert_damage_type = CLONE
var/remove_on_restore = FALSE
/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/Restore(mob/living/M)
if(remove_on_restore)
if(M.mind)
M.mind.RemoveSpell(src)
..()
/mob/living/simple_animal/slime/transformedslime
/mob/living/simple_animal/slime/transformedslime/Reproduce() //Just in case.
to_chat(src, "<span class='warning'>I can't reproduce...</span>")
return
@@ -0,0 +1,433 @@
/*
Charged extracts:
Have a unique, effect when filled with
10u plasma and activated in-hand, related to their
normal extract effect.
*/
/obj/item/slimecross/charged
name = "charged extract"
desc = "It sparks with electric power."
effect = "charged"
container_type = INJECTABLE | DRAWABLE
icon_state = "charged"
/obj/item/slimecross/charged/Initialize()
..()
create_reagents(10)
/obj/item/slimecross/charged/attack_self(mob/user)
if(!reagents.has_reagent("plasma",10))
to_chat(user, "<span class='warning'>This extract needs to be full of plasma to activate!</span>")
return
reagents.remove_reagent("plasma",10)
to_chat(user, "<span class='notice'>You squeeze the extract, and it absorbs the plasma!</span>")
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
do_effect(user)
/obj/item/slimecross/charged/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..()
qdel(src)
return
/obj/item/slimecross/charged/grey
colour = "grey"
/obj/item/slimecross/charged/grey/do_effect(mob/user)
new /obj/item/slimepotion/slime_reviver(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/orange
colour = "orange"
/obj/item/slimecross/charged/orange/do_effect(mob/user)
for(var/turf/turf in range(5,get_turf(user)))
if(!locate(/obj/effect/hotspot) in turf)
new /obj/effect/hotspot(turf)
..()
/obj/item/slimecross/charged/purple
colour = "purple"
/obj/item/slimecross/charged/purple/do_effect(mob/user)
new /obj/item/slimecrossbeaker/omnizine(get_turf(user))
user.visible_message("<span class='notice'>[src] sparks, and floods with a regenerative solution!</span>")
..()
/obj/item/slimecross/charged/blue
colour = "blue"
/obj/item/slimecross/charged/blue/do_effect(mob/user)
new /obj/item/slimepotion/slime/chargedstabilizer(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/metal
colour = "metal"
/obj/item/slimecross/charged/metal/do_effect(mob/user)
var/obj/item/stack/sheet/metal/M = new(get_turf(user))
M.amount = 25
var/obj/item/stack/sheet/plasteel/P = new(get_turf(user))
P.amount = 10
user.visible_message("<span class='notice'>[src] grows into a plethora of metals!</span>")
..()
/obj/item/slimecross/charged/yellow
colour = "yellow"
/obj/item/slimecross/charged/yellow/do_effect(mob/user)
new /obj/item/stock_parts/cell/high/slime/hypercharged(get_turf(user))
user.visible_message("<span class='notice'>[src] sparks violently, and swells with electric power!</span>")
..()
/obj/item/slimecross/charged/darkpurple
colour = "dark purple"
/obj/item/slimecross/charged/darkpurple/do_effect(mob/user)
var/obj/item/stack/sheet/mineral/plasma/M = new(get_turf(user))
M.amount = 10
user.visible_message("<span class='notice'>[src] produces a large amount of plasma!</span>")
..()
/obj/item/slimecross/charged/darkblue
colour = "dark blue"
/obj/item/slimecross/charged/darkblue/do_effect(mob/user)
new /obj/item/slimepotion/spaceproof(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/silver
colour = "silver"
/obj/item/slimecross/charged/silver/do_effect(mob/user)
new /obj/item/reagent_containers/food/snacks/store/cake/slimecake(get_turf(user))
for(var/i in 1 to 10)
var/drink_type = get_random_drink()
new drink_type(get_turf(user))
user.visible_message("<span class='notice'>[src] produces a party's worth of cake and drinks!</span>")
..()
/obj/item/slimecross/charged/bluespace
colour = "bluespace"
/obj/item/slimecross/charged/bluespace/do_effect(mob/user)
var/obj/item/stack/sheet/bluespace_crystal/M = new(get_turf(user))
M.amount = 10
user.visible_message("<span class='notice'>[src] produces several sheets of polycrystal!</span>")
..()
/obj/item/slimecross/charged/sepia
colour = "sepia"
/obj/item/slimecross/charged/sepia/do_effect(mob/user)
new /obj/item/device/camera/spooky(get_turf(user))
user.visible_message("<span class='notice'>[src] flickers in a strange, ethereal manner, and produces a camera!</span>")
..()
/obj/item/slimecross/charged/cerulean
colour = "cerulean"
/obj/item/slimecross/charged/cerulean/do_effect(mob/user)
new /obj/item/slimepotion/enhancer/max(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/pyrite
colour = "pyrite"
/obj/item/slimecross/charged/pyrite/do_effect(mob/user)
var/obj/item/stack/sheet/mineral/bananium/M = new(get_turf(user))
M.amount = 10
user.visible_message("<span class='warning'>[src] solidifies with a horrifying banana stench!</span>")
..()
/obj/item/slimecross/charged/red
colour = "red"
/obj/item/slimecross/charged/red/do_effect(mob/user)
new /obj/item/slimepotion/lavaproof(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/green
colour = "green"
/obj/item/slimecross/charged/green/do_effect(mob/user)
var/mob/living/carbon/human/H = user
if(!istype(H))
to_chat(user, "<span class='warning'>You must be a humanoid to use this!</span>")
return
var/racechoice = input(H, "Choose your slime subspecies.", "Slime Selection") as null|anything in subtypesof(/datum/species/jelly)
if(!racechoice)
to_chat(user, "<span class='notice'>You decide not to become a slime for now.</span>")
return
if(!user.canUseTopic(src, BE_CLOSE))
return
H.set_species(racechoice, icon_update=1)
H.visible_message("<span class='warning'>[H] suddenly shifts form as [src] dissolves into [H.p_their()] skin!</span>")
..()
/obj/item/slimecross/charged/pink
colour = "pink"
/obj/item/slimecross/charged/pink/do_effect(mob/user)
new /obj/item/slimepotion/lovepotion(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/gold
colour = "gold"
var/max_spawn = 10
var/spawned = 0
/obj/item/slimecross/charged/gold/do_effect(mob/user)
user.visible_message("<span class='warning'>[src] starts shuddering violently!</span>")
addtimer(CALLBACK(src, .proc/startTimer), 50)
/obj/item/slimecross/charged/gold/proc/startTimer()
START_PROCESSING(SSobj, src)
/obj/item/slimecross/charged/gold/process()
visible_message("<span class='warning'>[src] lets off a spark, and produces a living creature!</span>")
new /obj/effect/particle_effect/sparks(get_turf(src))
playsound(get_turf(src), "sparks", 50, 1)
create_random_mob(get_turf(src), HOSTILE_SPAWN)
spawned++
if(spawned >= max_spawn)
visible_message("<span class='warning'>[src] collapses into a puddle of goo.</span>")
qdel(src)
/obj/item/slimecross/charged/gold/Destroy()
STOP_PROCESSING(SSobj, src)
..()
/obj/item/slimecross/charged/oil
colour = "oil"
/obj/item/slimecross/charged/oil/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] begins to shake with rapidly increasing force!</span>")
addtimer(CALLBACK(src, .proc/boom), 50)
/obj/item/slimecross/charged/oil/proc/boom()
explosion(get_turf(src), 3, 2, 1) //Much smaller effect than normal oils, but devastatingly strong where it does hit.
qdel(src)
/obj/item/slimecross/charged/black
colour = "black"
/obj/item/slimecross/charged/black/do_effect(mob/user)
var/mob/living/carbon/human/H = user
if(!istype(H))
to_chat(user, "<span class='warning'>You have to be able to have a species to get your species changed.</span>")
return
var/list/allowed_species = list()
for(var/X in subtypesof(/datum/species))
var/datum/species/temp = X
if(!initial(temp.blacklisted))
allowed_species += X
var/datum/species/changed = pick(allowed_species)
if(changed)
H.set_species(changed, icon_update = 1)
to_chat(H, "<span class='danger'>You feel very different!</span>")
..()
/obj/item/slimecross/charged/lightpink
colour = "light pink"
/obj/item/slimecross/charged/lightpink/do_effect(mob/user)
new /obj/item/slimepotion/peacepotion(get_turf(user))
user.visible_message("<span class='notice'>[src] distills into a potion!</span>")
..()
/obj/item/slimecross/charged/adamantine
colour = "adamantine"
/obj/item/slimecross/charged/adamantine/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] produces a fully formed golem shell!</span>")
new /obj/effect/mob_spawn/human/golem/servant(get_turf(src), /datum/species/golem/adamantine, user)
..()
/obj/item/slimecross/charged/rainbow
colour = "rainbow"
/obj/item/slimecross/charged/rainbow/do_effect(mob/user)
user.visible_message("<span class='warning'>[src] swells and splits into three new slimes!</span>")
for(var/i in 1 to 3)
var/mob/living/simple_animal/slime/S = new(get_turf(user))
S.random_colour()
..()
////////////Unique things.
/obj/item/slimepotion/slime_reviver
name = "slime revival potion"
desc = "Infused with plasma and compressed gel, this brings dead slimes back to life."
icon = 'icons/obj/chemical.dmi'
icon_state = "potsilver"
/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))
to_chat(user, "<span class='warning'>The potion only works on slimes!</span>")
return ..()
if(M.stat != DEAD)
to_chat(user, "<span class='warning'>The slime is still alive!</span>")
return
if(M.maxHealth <= 0)
to_chat(user, "<span class='warning'>The slime is too unstable to return!</span>")
M.revive(full_heal = 1)
M.stat = CONSCIOUS
M.visible_message("<span class='notice'>[M] is filled with renewed vigor and blinks awake!</span>")
M.maxHealth -= 10 //Revival isn't healthy.
M.health -= 10
M.regenerate_icons()
qdel(src)
/obj/item/slimepotion/slime/chargedstabilizer
name = "slime omnistabilizer"
desc = "An extremely potent chemical mix that will stop a slime from mutating completely."
icon = 'icons/obj/chemical.dmi'
icon_state = "potcyan"
/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))
to_chat(user, "<span class='warning'>The stabilizer only works on slimes!</span>")
return ..()
if(M.stat)
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return
if(M.mutation_chance == 0)
to_chat(user, "<span class='warning'>The slime already has no chance of mutating!</span>")
return
to_chat(user, "<span class='notice'>You feed the slime the omnistabilizer. It will not mutate this cycle!</span>")
M.mutation_chance = 0
qdel(src)
/obj/item/stock_parts/cell/high/slime/hypercharged
name = "hypercharged slime core"
desc = "A charged yellow slime extract, infused with even more plasma. It almost hurts to touch."
rating = 7 //Roughly 1.5 times the original.
maxcharge = 20000 //2 times the normal one.
chargerate = 2250 //1.5 times the normal rate.
/obj/item/slimepotion/spaceproof
name = "slime pressurization potion"
desc = "A potent chemical sealant that will render any article of clothing airtight. Has two uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "potblue"
var/uses = 2
/obj/item/slimepotion/spaceproof/afterattack(obj/item/clothing/C, mob/user, proximity)
..()
if(!uses)
qdel(src)
return
if(!proximity)
return
if(!istype(C))
to_chat(user, "<span class='warning'>The potion can only be used on clothing!</span>")
return
if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && STOPSPRESSUREDMAGE_1 in C.flags_1)
to_chat(user, "<span class='warning'>The [C] is already pressure-resistant!</span>")
return ..()
to_chat(user, "<span class='notice'>You slather the blue gunk over the [C], making it airtight.</span>")
C.name = "pressure-resistant [C.name]"
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY)
C.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
C.cold_protection = C.body_parts_covered
C.flags_1 |= STOPSPRESSUREDMAGE_1
uses--
if(!uses)
qdel(src)
/obj/item/slimepotion/enhancer/max
name = "extract maximizer"
desc = "An extremely potent chemical mix that will maximize a slime extract's uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "potpurple"
/obj/item/slimepotion/lavaproof
name = "slime lavaproofing potion"
desc = "A strange, reddish goo said to repel lava as if it were water, without reducing flammability. Has two uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "potred"
var/uses = 2
/obj/item/slimepotion/lavaproof/afterattack(obj/item/C, mob/user, proximity)
..()
if(!uses)
qdel(src)
return ..()
if(!proximity)
return ..()
if(!istype(C))
to_chat(user, "<span class='warning'>You can't coat this with lavaproofing fluid!</span>")
return ..()
to_chat(user, "<span class='notice'>You slather the red gunk over the [C], making it lavaproof.</span>")
C.name = "lavaproof [C.name]"
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#800000", FIXED_COLOUR_PRIORITY)
C.resistance_flags |= LAVA_PROOF
C.flags_2 |= LAVA_PROTECT_2
uses--
if(!uses)
qdel(src)
/obj/item/slimepotion/lovepotion
name = "love potion"
desc = "A pink chemical mix thought to inspire feelings of love."
icon = 'icons/obj/chemical.dmi'
icon_state = "potpink"
/obj/item/slimepotion/lovepotion/attack(mob/living/M, mob/user)
if(!isliving(M) || M.stat == DEAD)
to_chat(user, "<span class='warning'>The love potion only works on living things, sicko!</span>")
return ..()
if(user == M)
to_chat(user, "<span class='warning'>You can't drink the love potion. What are you, a narcissist?</span>")
return ..()
M.visible_message("<span class='danger'>[user] starts to feed [M] a love potion!</span>",
"<span class='userdanger'>[user] starts to feed you a love potion!</span>")
if(!do_after(user, 50, target = M))
return
to_chat(user, "<span class='notice'>You feed [M] the love potion!</span>")
to_chat(M, "<span class='notice'>You develop feelings for [user], and anyone [p_they(user)] like.</span>")
if(!("[REF(user)]" in M.faction) && M.mind)
M.mind.store_memory("You have strong feelings for [user].")
M.faction |= "[REF(user)]"
qdel(src)
/obj/item/slimepotion/peacepotion
name = "pacification potion"
desc = "A light pink solution of chemicals, smelling like liquid peace. And mercury salts."
icon = 'icons/obj/chemical.dmi'
icon_state = "potlightpink"
/obj/item/slimepotion/peacepotion/attack(mob/living/M, mob/user)
if(!isliving(M) || M.stat == DEAD)
to_chat(user, "<span class='warning'>The pacification potion only works on the living.</span>")
return ..()
if(M != user)
M.visible_message("<span class='danger'>[user] starts to feed [M] a pacification potion!</span>",
"<span class='userdanger'>[user] starts to feed you a love potion!</span>")
else
M.visible_message("<span class='danger'>[user] starts to drink the pacification potion!</span>",
"<span class='danger'>You start to drink the pacification potion!</span>")
if(!do_after(user, 100, target = M))
return
if(M != user)
to_chat(user, "<span class='notice'>You feed [M] the pacification potion!</span>")
else
to_chat(user, "<span class='warning'>You drink the pacification potion!</span>")
if(isanimal(M))
M.add_trait(TRAIT_PACIFISM, MAGIC_TRAIT)
else if(iscarbon(M))
var/mob/living/carbon/C = M
C.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_SURGERY)
qdel(src)
@@ -0,0 +1,426 @@
/*
Consuming extracts:
Can eat food items.
After consuming enough, produces special cookies.
*/
/obj/item/slimecross/consuming
name = "consuming extract"
desc = "It hungers... for <i>more</i>." //My slimecross has finally decided to eat... my buffet!
icon_state = "consuming"
effect = "consuming"
var/nutriment_eaten = 0
var/nutriment_required = 10
var/cooldown = 600 //1 minute.
var/last_produced = 0
var/cookies = 5 //Number of cookies to spawn
var/cookietype = /obj/item/slime_cookie
/obj/item/slimecross/consuming/attackby(obj/item/O, mob/user)
if(istype(O,/obj/item/reagent_containers/food/snacks))
if(last_produced + cooldown > world.time)
to_chat(user, "<span class='warning'>[src] is still digesting after its last meal!<span>")
return
var/datum/reagent/N = O.reagents.has_reagent("nutriment")
if(N)
nutriment_eaten += N.volume
to_chat(user, "<span class='notice'>[src] opens up and swallows [O] whole!</span>")
qdel(O)
playsound(src, 'sound/items/eatfood.ogg', 20, 1)
else
to_chat(user, "<span class='warning'>[src] burbles unhappily at the offering.</span>")
if(nutriment_eaten >= nutriment_required)
nutriment_eaten = 0
user.visible_message("<span class='notice'>[src] swells up and produces a small pile of cookies!</span>")
playsound(src, 'sound/effects/splat.ogg', 40, 1)
last_produced = world.time
for(var/i in 1 to cookies)
var/obj/item/S = spawncookie()
S.pixel_x = rand(-5, 5)
S.pixel_y = rand(-5, 5)
return
..()
/obj/item/slimecross/consuming/proc/spawncookie()
return new cookietype(get_turf(src))
/obj/item/slime_cookie //While this technically acts like food, it's so removed from it that I made it its' own type.
name = "error cookie"
desc = "A weird slime cookie. You shouldn't see this."
icon = 'icons/obj/food/slimecookies.dmi'
var/taste = "error"
var/nutrition = 5
icon_state = "base"
force = 0
w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
throw_range = 6
/obj/item/slime_cookie/proc/do_effect(mob/living/M, mob/user)
return
/obj/item/slime_cookie/attack(mob/living/M, mob/user)
var/fed = FALSE
if(M == user)
M.visible_message("<span class='notice'>[user] eats [src]!</span>", "<span class='notice'>You eat [src].</span>")
fed = TRUE
else
M.visible_message("<span class='danger'>[user] tries to force [M] to eat [src]!</span>", "<span class='userdanger'>[user] tries to force you to eat [src]!</span>")
if(do_after(user, 20, target = M))
fed = TRUE
M.visible_message("<span class='danger'>[user] forces [M] to eat [src]!</span>", "<span class='warning'>[user] forces you to eat [src].</span>")
if(fed)
to_chat(M, "Tastes like [taste].")
playsound(get_turf(M), 'sound/items/eatfood.ogg', 20, 1)
if(nutrition)
M.reagents.add_reagent("nutriment",nutrition)
do_effect(M, user)
qdel(src)
return
..()
/obj/item/slimecross/consuming/grey
colour = "grey"
cookietype = /obj/item/slime_cookie/grey
/obj/item/slime_cookie/grey
name = "slime cookie"
desc = "A grey-ish transparent cookie. Nutritious, probably."
icon_state = "grey"
taste = "goo"
nutrition = 15
/obj/item/slimecross/consuming/orange
colour = "orange"
cookietype = /obj/item/slime_cookie/orange
/obj/item/slime_cookie/orange
name = "fiery cookie"
desc = "A orange cookie with a fiery pattern. Feels warm."
icon_state = "orange"
taste = "cinnamon and burning"
/obj/item/slime_cookie/orange/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/firecookie)
/obj/item/slimecross/consuming/purple
colour = "purple"
cookietype = /obj/item/slime_cookie/purple
/obj/item/slime_cookie/purple
name = "health cookie"
desc = "A purple cookie with a cross pattern. Soothing."
icon_state = "purple"
taste = "fruit jam and cough medicine"
/obj/item/slime_cookie/purple/do_effect(mob/living/M, mob/user)
M.adjustBruteLoss(-5)
M.adjustFireLoss(-5)
M.adjustToxLoss(-5, forced=1) //To heal slimepeople.
M.adjustOxyLoss(-5)
M.adjustCloneLoss(-5)
M.adjustBrainLoss(-5)
/obj/item/slimecross/consuming/blue
colour = "blue"
cookietype = /obj/item/slime_cookie/blue
/obj/item/slime_cookie/blue
name = "water cookie"
desc = "A transparent blue cookie. Constantly dripping wet."
icon_state = "blue"
taste = "water"
/obj/item/slime_cookie/blue/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/watercookie)
/obj/item/slimecross/consuming/metal
colour = "metal"
cookietype = /obj/item/slime_cookie/metal
/obj/item/slime_cookie/metal
name = "metallic cookie"
desc = "A shiny grey cookie. Hard to the touch."
icon_state = "metal"
taste = "copper"
/obj/item/slime_cookie/metal/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/metalcookie)
/obj/item/slimecross/consuming/yellow
colour = "yellow"
cookietype = /obj/item/slime_cookie/yellow
/obj/item/slime_cookie/yellow
name = "sparking cookie"
desc = "A yellow cookie with a lightning pattern. Has a rubbery texture."
icon_state = "yellow"
taste = "lemon cake and rubber gloves"
/obj/item/slime_cookie/yellow/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/sparkcookie)
/obj/item/slimecross/consuming/darkpurple
colour = "dark purple"
cookietype = /obj/item/slime_cookie/darkpurple
/obj/item/slime_cookie/darkpurple
name = "toxic cookie"
desc = "A dark purple cookie, stinking of plasma."
icon_state = "darkpurple"
taste = "slime jelly and toxins"
/obj/item/slime_cookie/darkpurple/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/toxincookie)
/obj/item/slimecross/consuming/darkblue
colour = "dark blue"
cookietype = /obj/item/slime_cookie/darkblue
/obj/item/slime_cookie/darkblue
name = "frosty cookie"
desc = "A dark blue cookie with a snowflake pattern. Feels cold."
icon_state = "darkblue"
taste = "mint and bitter cold"
/obj/item/slime_cookie/darkblue/do_effect(mob/living/M, mob/user)
M.adjust_bodytemperature(-110)
M.ExtinguishMob()
/obj/item/slimecross/consuming/silver
colour = "silver"
cookietype = /obj/item/slime_cookie/silver
/obj/item/slime_cookie/silver
name = "waybread cookie"
desc = "A warm, crispy cookie, sparkling silver in the light. Smells wonderful."
icon_state = "silver"
taste = "masterful elven baking"
nutrition = 0 //We don't want normal nutriment
/obj/item/slime_cookie/silver/do_effect(mob/living/M, mob/user)
M.reagents.add_reagent("stabilizednutriment",10)
/obj/item/slimecross/consuming/bluespace
colour = "bluespace"
cookietype = /obj/item/slime_cookie/bluespace
/obj/item/slime_cookie/bluespace
name = "space cookie"
desc = "A white cookie with green icing. Surprisingly hard to hold."
icon_state = "bluespace"
taste = "sugar and starlight"
/obj/item/slime_cookie/bluespace/do_effect(mob/living/M, mob/user)
var/list/L = list()
for(var/turf/T in get_area_turfs(get_area(get_turf(M))))
if(!T.density)
var/clear = 1
for(var/obj/O in T)
if(O.density)
clear = 0
break
if(clear)
L+=T
if(length(L))
do_teleport(M, pick(L), 0, asoundin = 'sound/effects/phasein.ogg')
new /obj/effect/particle_effect/sparks(get_turf(M))
playsound(get_turf(M), "sparks", 50, 1)
/obj/item/slimecross/consuming/sepia
colour = "sepia"
cookietype = /obj/item/slime_cookie/sepia
/obj/item/slime_cookie/sepia
name = "time cookie"
desc = "A light brown cookie with a clock pattern. Takes some time to chew."
icon_state = "sepia"
taste = "brown sugar and a metronome"
/obj/item/slime_cookie/sepia/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/timecookie)
/obj/item/slimecross/consuming/cerulean
colour = "cerulean"
cookietype = /obj/item/slime_cookie/cerulean
cookies = 3 //You're gonna get more.
/obj/item/slime_cookie/cerulean
name = "duplicookie"
desc = "A cerulean cookie with strange proportions. It feels like it could break apart easily."
icon_state = "cerulean"
taste = "a sugar cookie"
/obj/item/slime_cookie/cerulean/do_effect(mob/living/M, mob/user)
if(prob(50))
to_chat(M, "<span class='notice'>A piece of [src] breaks off while you chew, and falls to the ground.</span>")
var/obj/item/slime_cookie/cerulean/C = new(get_turf(M))
C.taste = taste + " and a sugar cookie"
/obj/item/slimecross/consuming/pyrite
colour = "pyrite"
cookietype = /obj/item/slime_cookie/pyrite
/obj/item/slime_cookie/pyrite
name = "color cookie"
desc = "A yellow cookie with rainbow-colored icing. Reflects the light strangely."
icon_state = "pyrite"
taste = "vanilla and " //Randomly selected color dye.
var/colour = "#FFFFFF"
/obj/item/slime_cookie/pyrite/Initialize()
..()
var/tastemessage = "paint remover"
switch(rand(1,7))
if(1)
tastemessage = "red dye"
colour = "#FF0000"
if(2)
tastemessage = "orange dye"
colour = "#FFA500"
if(3)
tastemessage = "yellow dye"
colour = "#FFFF00"
if(4)
tastemessage = "green dye"
colour = "#00FF00"
if(5)
tastemessage = "blue dye"
colour = "#0000FF"
if(6)
tastemessage = "indigo dye"
colour = "#4B0082"
if(7)
tastemessage = "violet dye"
colour = "#FF00FF"
taste += tastemessage
/obj/item/slime_cookie/pyrite/do_effect(mob/living/M, mob/user)
M.add_atom_colour(colour,WASHABLE_COLOUR_PRIORITY)
/obj/item/slimecross/consuming/red
colour = "red"
cookietype = /obj/item/slime_cookie/red
/obj/item/slime_cookie/red
name = "blood cookie"
desc = "A red cookie, oozing a thick red fluid. Vampires might enjoy it."
icon_state = "red"
taste = "red velvet and iron"
/obj/item/slime_cookie/red/do_effect(mob/living/M, mob/user)
new /obj/effect/decal/cleanable/blood(get_turf(M))
playsound(get_turf(M), 'sound/effects/splat.ogg', 10, 1)
if(iscarbon(M))
var/mob/living/carbon/C = M
C.blood_volume += 25 //Half a vampire drain.
/obj/item/slimecross/consuming/green
colour = "green"
cookietype = /obj/item/slime_cookie/green
/obj/item/slime_cookie/green
name = "gross cookie"
desc = "A disgusting green cookie, seeping with pus. You kind of feel ill just looking at it."
icon_state = "green"
taste = "the contents of your stomach"
/obj/item/slime_cookie/green/do_effect(mob/living/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.vomit(25)
M.reagents.remove_all()
/obj/item/slimecross/consuming/pink
colour = "pink"
cookietype = /obj/item/slime_cookie/pink
/obj/item/slime_cookie/pink
name = "love cookie"
desc = "A pink cookie with an icing heart. D'aww."
icon_state = "pink"
taste = "love and hugs"
/obj/item/slime_cookie/pink/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/lovecookie)
/obj/item/slimecross/consuming/gold
colour = "gold"
cookietype = /obj/item/slime_cookie/gold
/obj/item/slime_cookie/gold
name = "gilded cookie"
desc = "A buttery golden cookie, closer to a bread than anything. May good fortune find you."
icon_state = "gold"
taste = "sweet cornbread and wealth"
/obj/item/slime_cookie/gold/do_effect(mob/living/M, mob/user)
var/obj/item/held = M.get_active_held_item() //This should be itself, but just in case...
M.dropItemToGround(held)
var/newcoin = /obj/item/coin/gold
var/obj/item/coin/C = new newcoin(get_turf(M))
playsound(get_turf(C), 'sound/items/coinflip.ogg', 50, 1)
M.put_in_hand(C)
/obj/item/slimecross/consuming/oil
colour = "oil"
cookietype = /obj/item/slime_cookie/oil
/obj/item/slime_cookie/oil
name = "tar cookie"
desc = "An oily black cookie, which sticks to your hands. Smells like chocolate."
icon_state = "oil"
taste = "rich molten chocolate and tar"
/obj/item/slime_cookie/oil/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/tarcookie)
/obj/item/slimecross/consuming/black
colour = "black"
cookietype = /obj/item/slime_cookie/black
/obj/item/slime_cookie/black
name = "spooky cookie"
desc = "A pitch black cookie with an icing ghost on the front. Spooky!"
icon_state = "black"
taste = "ghosts and stuff"
/obj/item/slime_cookie/black/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/spookcookie)
/obj/item/slimecross/consuming/lightpink
colour = "light pink"
cookietype = /obj/item/slime_cookie/lightpink
/obj/item/slime_cookie/lightpink
name = "peace cookie"
desc = "A light pink cookie with a peace symbol in the icing. Lovely!"
icon_state = "lightpink"
taste = "strawberry icing and P.L.U.R" //Literal candy raver.
/obj/item/slime_cookie/lightpink/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/peacecookie)
/obj/item/slimecross/consuming/adamantine
colour = "adamantine"
cookietype = /obj/item/slime_cookie/adamantine
/obj/item/slime_cookie/adamantine
name = "crystal cookie"
desc = "A translucent rock candy in the shape of a cookie. Surprisingly chewy."
icon_state = "adamantine"
taste = "crystalline sugar and metal"
/obj/item/slime_cookie/adamantine/do_effect(mob/living/M, mob/user)
M.apply_status_effect(/datum/status_effect/adamantinecookie)
/obj/item/slimecross/consuming/rainbow
colour = "rainbow"
/obj/item/slimecross/consuming/rainbow/spawncookie()
var/cookie_type = pick(subtypesof(/obj/item/slime_cookie))
var/obj/item/slime_cookie/S = new cookie_type(get_turf(src))
S.name = "rainbow cookie"
S.desc = "A beautiful rainbow cookie, constantly shifting colors in the light."
S.icon_state = "rainbow"
return S
@@ -0,0 +1,189 @@
/*
Industrial extracts:
Slowly consume plasma, produce items with it.
*/
/obj/item/slimecross/industrial
name = "industrial extract"
desc = "A gel-like, sturdy extract, fond of plasma and industry."
container_type = INJECTABLE | DRAWABLE
effect = "industrial"
icon_state = "industrial_still"
var/plasmarequired = 2 //Units of plasma required to be consumed to produce item.
var/itempath = /obj/item //The item produced by the extract.
var/plasmaabsorbed = 0 //Units of plasma aborbed by the extract already. Absorbs at a rate of 2u/obj tick.
var/itemamount = 1 //How many items to spawn
/obj/item/slimecross/industrial/examine(mob/user)
..()
to_chat(user, "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units.")
/obj/item/slimecross/industrial/proc/do_after_spawn(obj/item/spawned)
return
/obj/item/slimecross/industrial/Initialize()
..()
create_reagents(100)
START_PROCESSING(SSobj,src)
/obj/item/slimecross/industrial/Destroy()
STOP_PROCESSING(SSobj,src)
return ..()
/obj/item/slimecross/industrial/process()
var/IsWorking = FALSE
if(reagents.has_reagent("plasma",amount = 2) && plasmarequired > 1) //Can absorb as much as 2
IsWorking = TRUE
reagents.remove_reagent("plasma",2)
plasmaabsorbed += 2
else if(reagents.has_reagent("plasma",amount = 1)) //Can absorb as little as 1
IsWorking = TRUE
reagents.remove_reagent("plasma",1)
plasmaabsorbed += 1
if(plasmaabsorbed >= plasmarequired)
playsound(src, 'sound/effects/attackblob.ogg', 50, 1)
plasmaabsorbed -= plasmarequired
for(var/i = 0, i < itemamount, i++)
do_after_spawn(new itempath(get_turf(src)))
else if(IsWorking)
playsound(src, 'sound/effects/bubbles.ogg', 5, 1)
if(IsWorking)
icon_state = "industrial"
else
icon_state = "industrial_still"
/obj/item/slimecross/industrial/grey
colour = "grey"
itempath = /obj/item/reagent_containers/food/snacks/monkeycube
itemamount = 5
/obj/item/slimecross/industrial/orange
colour = "orange"
plasmarequired = 6
itempath = /obj/item/lighter/slime
/obj/item/slimecross/industrial/purple
colour = "purple"
plasmarequired = 5
itempath = /obj/item/slimecrossbeaker/autoinjector/regenpack
/obj/item/slimecross/industrial/blue
colour = "blue"
plasmarequired = 10
itempath = /obj/item/extinguisher
/obj/item/slimecross/industrial/metal
colour = "metal"
plasmarequired = 3
itempath = /obj/item/stack/sheet/metal
/obj/item/slimecross/industrial/metal/do_after_spawn(obj/item/spawned)
var/obj/item/stack/sheet/metal/M = spawned
if(istype(M))
M.amount = 10
/obj/item/slimecross/industrial/yellow
colour = "yellow"
plasmarequired = 5
itempath = /obj/item/stock_parts/cell/high
/obj/item/slimecross/industrial/yellow/do_after_spawn(obj/item/spawned)
var/obj/item/stock_parts/cell/high/C = spawned
if(istype(C))
C.charge = rand(0,C.maxcharge/2)
/obj/item/slimecross/industrial/darkpurple
colour = "dark purple"
plasmarequired = 10
itempath = /obj/item/stack/sheet/mineral/plasma
/obj/item/slimecross/industrial/darkblue
colour = "dark blue"
plasmarequired = 6
itempath = /obj/item/slimepotion/fireproof
/obj/item/slimecross/industrial/darkblue/do_after_spawn(obj/item/spawned)
var/obj/item/slimepotion/fireproof/potion = spawned
if(istype(potion))
potion.uses = 1
/obj/item/slimecross/industrial/silver
colour = "silver"
plasmarequired = 1
//Item picked below.
/obj/item/slimecross/industrial/silver/process()
itempath = pick(list(get_random_food(), get_random_drink()))
..()
/obj/item/slimecross/industrial/bluespace
colour = "bluespace"
plasmarequired = 7
itempath = /obj/item/stack/ore/bluespace_crystal/artificial
/obj/item/slimecross/industrial/sepia
colour = "sepia"
plasmarequired = 2
itempath = /obj/item/device/camera
/obj/item/slimecross/industrial/cerulean
colour = "cerulean"
plasmarequired = 5
itempath = /obj/item/slimepotion/enhancer
/obj/item/slimecross/industrial/pyrite
colour = "pyrite"
plasmarequired = 2
itempath = /obj/item/toy/crayon/spraycan
/obj/item/slimecross/industrial/red
colour = "red"
plasmarequired = 5
itempath = /obj/item/slimecrossbeaker/bloodpack
/obj/item/slimecross/industrial/green
colour = "green"
plasmarequired = 7
itempath = /obj/item/slimecrossbeaker/autoinjector/slimejelly
/obj/item/slimecross/industrial/pink
colour = "pink"
plasmarequired = 6
itempath = /obj/item/slimecrossbeaker/autoinjector/peaceandlove
/obj/item/slimecross/industrial/gold
colour = "gold"
plasmarequired = 10
/obj/item/slimecross/industrial/gold/process()
itempath = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium)
..()
/obj/item/slimecross/industrial/oil
colour = "oil"
plasmarequired = 4
itempath = /obj/item/grenade/iedcasing
/obj/item/slimecross/industrial/black //What does this have to do with black slimes? No clue! Fun, though
colour = "black"
plasmarequired = 6
itempath = /obj/item/storage/fancy/cigarettes/cigpack_xeno
/obj/item/slimecross/industrial/lightpink
colour = "light pink"
plasmarequired = 3
itempath = /obj/item/storage/fancy/heart_box
/obj/item/slimecross/industrial/adamantine
colour = "adamantine"
plasmarequired = 10
itempath = /obj/item/stack/sheet/mineral/adamantine
/obj/item/slimecross/industrial/rainbow
colour = "rainbow"
plasmarequired = 5
//Item picked below.
/obj/item/slimecross/industrial/rainbow/process()
itempath = pick(subtypesof(/obj/item/slime_extract))
..()
@@ -0,0 +1,122 @@
/*
Prismatic extracts:
Becomes an infinite-use paintbrush.
*/
/obj/item/slimecross/prismatic
name = "prismatic extract"
desc = "It's constantly wet with a semi-transparent, colored goo."
effect = "prismatic"
icon_state = "prismatic"
var/paintcolor = "#FFFFFF"
/obj/item/slimecross/prismatic/afterattack(turf/target, mob/user, proximity)
if(!proximity)
return
if(!istype(target) || isspaceturf(target))
return
target.add_atom_colour(paintcolor, WASHABLE_COLOUR_PRIORITY)
playsound(target, 'sound/effects/slosh.ogg', 20, 1)
/obj/item/slimecross/prismatic/grey/
colour = "grey"
desc = "It's constantly wet with a pungent-smelling, clear chemical."
/obj/item/slimecross/prismatic/grey/afterattack(turf/target, mob/user, proximity)
if(!proximity)
return
if(istype(target) && target.color != initial(target.color))
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
playsound(target, 'sound/effects/slosh.ogg', 20, 1)
/obj/item/slimecross/prismatic/orange
paintcolor = "#FFA500"
colour = "orange"
/obj/item/slimecross/prismatic/purple
paintcolor = "#B19CD9"
colour = "purple"
/obj/item/slimecross/prismatic/blue
paintcolor = "#ADD8E6"
colour = "blue"
/obj/item/slimecross/prismatic/metal
paintcolor = "#7E7E7E"
colour = "metal"
/obj/item/slimecross/prismatic/yellow
paintcolor = "#FFFF00"
colour = "yellow"
/obj/item/slimecross/prismatic/darkpurple
paintcolor = "#551A8B"
colour = "dark purple"
/obj/item/slimecross/prismatic/darkblue
paintcolor = "#0000FF"
colour = "dark blue"
/obj/item/slimecross/prismatic/silver
paintcolor = "#D3D3D3"
colour = "silver"
/obj/item/slimecross/prismatic/bluespace
paintcolor = "#32CD32"
colour = "bluespace"
/obj/item/slimecross/prismatic/sepia
paintcolor = "#704214"
colour = "sepia"
/obj/item/slimecross/prismatic/cerulean
paintcolor = "#2956B2"
colour = "cerulean"
/obj/item/slimecross/prismatic/pyrite
paintcolor = "#FAFAD2"
colour = "pyrite"
/obj/item/slimecross/prismatic/red
paintcolor = "#FF0000"
colour = "red"
/obj/item/slimecross/prismatic/green
paintcolor = "#00FF00"
colour = "green"
/obj/item/slimecross/prismatic/pink
paintcolor = "#FF69B4"
colour = "pink"
/obj/item/slimecross/prismatic/gold
paintcolor = "#FFD700"
colour = "gold"
/obj/item/slimecross/prismatic/oil
paintcolor = "#505050"
colour = "oil"
/obj/item/slimecross/prismatic/black
paintcolor = "#000000"
colour = "black"
/obj/item/slimecross/prismatic/lightpink
paintcolor = "#FFB6C1"
colour = "light pink"
/obj/item/slimecross/prismatic/adamantine
paintcolor = "#008B8B"
colour = "adamantine"
/obj/item/slimecross/prismatic/rainbow
paintcolor = "#FFFFFF"
colour = "rainbow"
/obj/item/slimecross/prismatic/rainbow/attack_self(mob/user)
var/newcolor = input(user, "Choose the slime color:", "Color change",paintcolor) as color|null
if ((user.get_active_held_item() != src || user.stat || user.restrained()))
return
if(!newcolor)
return
paintcolor = newcolor
return
@@ -0,0 +1,137 @@
/*
Recurring extracts:
Generates a new charge every few seconds.
If depleted of its' last charge, stops working.
*/
/obj/item/slimecross/recurring
name = "recurring extract"
desc = "A tiny, glowing core, wrapped in several layers of goo."
effect = "recurring"
icon_state = "recurring"
var/extract_type
var/obj/item/slime_extract/extract
var/cooldown = 0
var/max_cooldown = 5 //In sets of 2 seconds.
/obj/item/slimecross/recurring/Initialize()
..()
extract = new extract_type(src.loc)
visible_message("<span class='notice'>[src] wraps a layer of goo around itself!</span>")
extract.name = name
extract.desc = desc
extract.icon = icon
extract.icon_state = icon_state
extract.recurring = TRUE
src.forceMove(extract)
START_PROCESSING(SSobj,src)
/obj/item/slimecross/recurring/process()
if(cooldown > 0)
cooldown--
else if(extract.Uses < 10 && extract.Uses > 0)
extract.Uses++
cooldown = max_cooldown
else if(extract.Uses <= 0)
extract.visible_message("<span class='warning'>The light inside [extract] flickers and dies out.</span>")
extract.desc = "A tiny, inert core, bleeding dark, cerulean-colored goo."
extract.icon_state = "prismatic"
qdel(src)
/obj/item/slimecross/recurring/Destroy()
..()
STOP_PROCESSING(SSobj,src)
/obj/item/slimecross/recurring/grey
extract_type = /obj/item/slime_extract/grey
colour = "grey"
/obj/item/slimecross/recurring/orange
extract_type = /obj/item/slime_extract/orange
colour = "orange"
/obj/item/slimecross/recurring/purple
extract_type = /obj/item/slime_extract/purple
colour = "purple"
/obj/item/slimecross/recurring/blue
extract_type = /obj/item/slime_extract/blue
colour = "blue"
/obj/item/slimecross/recurring/metal
extract_type = /obj/item/slime_extract/metal
colour = "metal"
max_cooldown = 10
/obj/item/slimecross/recurring/yellow
extract_type = /obj/item/slime_extract/yellow
colour = "yellow"
max_cooldown = 10
/obj/item/slimecross/recurring/darkpurple
extract_type = /obj/item/slime_extract/darkpurple
colour = "dark purple"
max_cooldown = 10
/obj/item/slimecross/recurring/darkblue
extract_type = /obj/item/slime_extract/darkblue
colour = "dark blue"
/obj/item/slimecross/recurring/silver
extract_type = /obj/item/slime_extract/silver
colour = "silver"
/obj/item/slimecross/recurring/bluespace
extract_type = /obj/item/slime_extract/bluespace
colour = "bluespace"
/obj/item/slimecross/recurring/sepia
extract_type = /obj/item/slime_extract/sepia
colour = "sepia"
max_cooldown = 18 //No infinite timestop for you!
/obj/item/slimecross/recurring/cerulean
extract_type = /obj/item/slime_extract/cerulean
colour = "cerulean"
/obj/item/slimecross/recurring/pyrite
extract_type = /obj/item/slime_extract/pyrite
colour = "pyrite"
/obj/item/slimecross/recurring/red
extract_type = /obj/item/slime_extract/red
colour = "red"
/obj/item/slimecross/recurring/green
extract_type = /obj/item/slime_extract/green
colour = "green"
/obj/item/slimecross/recurring/pink
extract_type = /obj/item/slime_extract/pink
colour = "pink"
/obj/item/slimecross/recurring/gold
extract_type = /obj/item/slime_extract/gold
colour = "gold"
max_cooldown = 15
/obj/item/slimecross/recurring/oil
extract_type = /obj/item/slime_extract/oil
colour = "oil" //Why would you want this?
/obj/item/slimecross/recurring/black
extract_type = /obj/item/slime_extract/black
colour = "black"
/obj/item/slimecross/recurring/lightpink
extract_type = /obj/item/slime_extract/lightpink
colour = "light pink"
/obj/item/slimecross/recurring/adamantine
extract_type = /obj/item/slime_extract/adamantine
colour = "adamantine"
max_cooldown = 10
/obj/item/slimecross/recurring/rainbow
extract_type = /obj/item/slime_extract/rainbow
colour = "rainbow"
max_cooldown = 20 //It's pretty powerful.
@@ -0,0 +1,254 @@
/*
Regenerative extracts:
Work like a legion regenerative core.
Has a unique additional effect.
*/
/obj/item/slimecross/regenerative
name = "regenerative extract"
desc = "It's filled with a milky substance, and pulses like a heartbeat."
effect = "regenerative"
icon_state = "regenerative"
/obj/item/slimecross/regenerative/proc/core_effect(mob/living/carbon/human/target, mob/user)
return
/obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user)
return
/obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox)
if(!prox || !isliving(target))
return
var/mob/living/H = target
if(H.stat == DEAD)
to_chat(user, "<span class='warning'>[src] will not work on the dead!</span>")
return
if(H != user)
user.visible_message("<span class='notice'>[user] crushes the [src] over [H], the milky goo quickly regenerating all of [H.p_their()] injuries!</span>",
"<span class='notice'>You squeeze the [src], and it bursts over [H], the milky goo regenerating [H.p_their()] injuries.</span>")
else
user.visible_message("<span class='notice'>[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!</span>",
"<span class='notice'>You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!</span>")
core_effect_before(H, user)
H.revive(full_heal = 1)
core_effect(H, user)
playsound(target, 'sound/effects/splat.ogg', 40, 1)
qdel(src)
/obj/item/slimecross/regenerative/grey
colour = "grey" //Has no bonus effect.
/obj/item/slimecross/regenerative/orange
colour = "orange"
/obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user)
target.visible_message("<span class='warning'>The [src] boils over!</span>")
for(var/turf/turf in range(1,target))
if(!locate(/obj/effect/hotspot) in turf)
new /obj/effect/hotspot(turf)
/obj/item/slimecross/regenerative/purple
colour = "purple"
/obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user)
target.reagents.add_reagent("regen_jelly",10)
/obj/item/slimecross/regenerative/blue
colour = "blue"
/obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user)
if(isturf(target.loc))
var/turf/open/T = get_turf(target)
T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5)
target.visible_message("<span class='warning'>The milky goo in the extract gets all over the floor!</span>")
/obj/item/slimecross/regenerative/metal
colour = "metal"
/obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user)
target.visible_message("<span class='warning'>The milky goo hardens and reshapes itself, encasing [target]!</span>")
var/obj/structure/closet/C = new /obj/structure/closet(target.loc)
C.name = "slimy closet"
C.desc = "Looking closer, it seems to be made of a sort of solid, opaque, metal-like goo."
target.forceMove(C)
/obj/item/slimecross/regenerative/yellow
colour = "yellow"
/obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user)
var/list/batteries = list()
for(var/obj/item/stock_parts/cell/C in target.GetAllContents())
if(C.charge < C.maxcharge)
batteries += C
if(batteries.len)
var/obj/item/stock_parts/cell/ToCharge = pick(batteries)
ToCharge.charge = ToCharge.maxcharge
to_chat(target, "<span class='notice'>You feel a strange electrical pulse, and one of your electrical items was recharged.</span>")
/obj/item/slimecross/regenerative/darkpurple
colour = "dark purple"
/obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user)
var/equipped = 0
equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), slot_shoes)
equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), slot_w_uniform)
equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), slot_gloves)
equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), slot_head)
if(equipped > 0)
target.visible_message("<span class='notice'>The milky goo congeals into clothing!</span>")
/obj/item/slimecross/regenerative/darkblue
colour = "dark blue"
/obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user)
if(!ishuman(target))
return
var/mob/living/carbon/human/H = target
var/fireproofed = FALSE
if(H.get_item_by_slot(slot_wear_suit))
fireproofed = TRUE
var/obj/item/clothing/C = H.get_item_by_slot(slot_wear_suit)
fireproof(C)
if(H.get_item_by_slot(slot_head))
fireproofed = TRUE
var/obj/item/clothing/C = H.get_item_by_slot(slot_head)
fireproof(C)
if(fireproofed)
target.visible_message("<span class='notice'>Some of [target]'s clothing gets coated in the goo, and turns blue!</span>")
/obj/item/slimecross/regenerative/darkblue/proc/fireproof(obj/item/clothing/C)
C.name = "fireproofed [C.name]"
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY)
C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
C.heat_protection = C.body_parts_covered
C.resistance_flags |= FIRE_PROOF
/obj/item/slimecross/regenerative/silver
colour = "silver"
/obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user)
target.nutrition = NUTRITION_LEVEL_FULL - 1
to_chat(target, "<span class='notice'>You feel satiated.</span>")
/obj/item/slimecross/regenerative/bluespace
colour = "bluespace"
var/turf/open/T
/obj/item/slimecross/regenerative/bluespace/core_effect(mob/living/target, mob/user)
target.visible_message("<span class='warning'>[src] disappears in a shower of sparks!</span>","<span class='danger'>The milky goo teleports you somewhere it remembers!</span>")
do_sparks(5,FALSE,target)
target.forceMove(T)
do_sparks(5,FALSE,target)
/obj/item/slimecross/regenerative/bluespace/Initialize()
..()
T = get_turf(src)
/obj/item/slimecross/regenerative/sepia
colour = "sepia"
/obj/item/slimecross/regenerative/sepia/core_effect(mob/living/target, mob/user)
new /obj/effect/timestop(get_turf(target), 2, 50, list(user,target))
/obj/item/slimecross/regenerative/cerulean
colour = "cerulean"
/obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user)
src.forceMove(user.loc)
var/obj/item/slimecross/X = new /obj/item/slimecross/regenerative(user.loc)
X.name = name
X.desc = desc
user.put_in_active_hand(X)
to_chat(user, "<span class='notice'>Some of the milky goo congeals in your hand!</span>")
/obj/item/slimecross/regenerative/pyrite
colour = "pyrite"
/obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user)
target.visible_message("<span class='warning'>The milky goo coating [target] leaves [target.p_them()] a different color!</span>")
target.add_atom_colour(rgb(rand(0,255),rand(0,255),rand(0,255)),WASHABLE_COLOUR_PRIORITY)
/obj/item/slimecross/regenerative/red
colour = "red"
/obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user)
to_chat(target, "<span class='notice'>You feel... <i>faster.</i></span>")
target.reagents.add_reagent("ephedrine",3)
/obj/item/slimecross/regenerative/green
colour = "green"
/obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user)
if(isslime(target))
target.visible_message("<span class='warning'>The [target] suddenly changes color!</span>")
var/mob/living/simple_animal/slime/S = target
S.random_colour()
if(isjellyperson(target))
target.reagents.add_reagent("slime_toxin",5)
/obj/item/slimecross/regenerative/pink
colour = "pink"
/obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user)
to_chat(target, "<span class='notice'>You feel more calm.</span>")
target.reagents.add_reagent("krokodil",4)
/obj/item/slimecross/regenerative/gold
colour = "gold"
/obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user)
var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium)
var/obj/item/coin/C = new newcoin(target.loc)
playsound(C, 'sound/items/coinflip.ogg', 50, 1)
target.put_in_hand(C)
/obj/item/slimecross/regenerative/oil
colour = "oil"
/obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user)
playsound(src, 'sound/weapons/flash.ogg', 100, 1)
for(var/mob/living/L in view(user,7))
L.flash_act()
/obj/item/slimecross/regenerative/black
colour = "black"
/obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user)
var/dummytype = target.type
var/mob/living/dummy = new dummytype(target.loc)
to_chat(target, "<span class='notice'>The milky goo flows from your skin, forming an imperfect copy of you.</span>")
if(iscarbon(target))
var/mob/living/carbon/T = target
var/mob/living/carbon/D = dummy
T.dna.transfer_identity(D)
D.updateappearance(mutcolor_update=1)
D.real_name = T.real_name
dummy.adjustBruteLoss(target.getBruteLoss())
dummy.adjustFireLoss(target.getFireLoss())
dummy.adjustToxLoss(target.getToxLoss())
dummy.adjustOxyLoss(200)
/obj/item/slimecross/regenerative/lightpink
colour = "light pink"
/obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user)
if(!isliving(user))
return
if(target == user)
return
var/mob/living/U = user
U.revive(full_heal = 1)
to_chat(U, "<span class='notice'>Some of the milky goo sprays onto you, as well!</span>")
/obj/item/slimecross/regenerative/adamantine
colour = "adamantine"
/obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work.
target.apply_status_effect(STATUS_EFFECT_SLIMESKIN)
/obj/item/slimecross/regenerative/rainbow
colour = "rainbow"
/obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user)
target.apply_status_effect(STATUS_EFFECT_RAINBOWPROTECTION)
@@ -0,0 +1,132 @@
/*
Reproductive extracts:
When fed three monkey cubes, produces between
1 and 4 normal slime extracts of the same colour.
*/
/obj/item/slimecross/reproductive
name = "reproductive extract"
desc = "It pulses with a strange hunger."
icon_state = "reproductive"
effect = "reproductive"
var/extract_type = /obj/item/slime_extract/
var/cubes_eaten = 0
var/last_produce = 0
var/cooldown = 30 // 3 seconds.
/obj/item/slimecross/reproductive/attackby(obj/item/O, mob/user)
if((last_produce + cooldown) > world.time)
to_chat(user, "<span class='warning'>[src] is still digesting!</span>")
return
if(istype(O, /obj/item/storage/bag/bio))
var/obj/item/storage/P = O
var/obj/item/reagent_containers/food/snacks/monkeycube/M
for(var/obj/item/X in P.contents)
M = X
if(M && istype(M))
break
if(M && istype(M))
P.remove_from_storage(M, get_turf(src))
attackby(M,user)
else
to_chat(user, "<span class='warning'>There are no monkey cubes in the bio bag!</span>")
if(istype(O,/obj/item/reagent_containers/food/snacks/monkeycube))
qdel(O)
cubes_eaten++
to_chat(user, "<span class='notice'>You feed [O] to [src], and it pulses gently.</span>")
playsound(src, 'sound/items/eatfood.ogg', 20, 1)
if(cubes_eaten >= 3)
var/cores = rand(1,4)
visible_message("<span class='notice'>[src] briefly swells to a massive size, and expels [cores] extract[cores > 1 ? "s":""]!</span>")
playsound(src, 'sound/effects/splat.ogg', 40, 1)
last_produce = world.time
for(var/i = 0, i < cores, i++)
new extract_type(get_turf(loc))
cubes_eaten = 0
/obj/item/slimecross/reproductive/grey
extract_type = /obj/item/slime_extract/grey
colour = "grey"
/obj/item/slimecross/reproductive/orange
extract_type = /obj/item/slime_extract/orange
colour = "orange"
/obj/item/slimecross/reproductive/purple
extract_type = /obj/item/slime_extract/purple
colour = "purple"
/obj/item/slimecross/reproductive/blue
extract_type = /obj/item/slime_extract/blue
colour = "blue"
/obj/item/slimecross/reproductive/metal
extract_type = /obj/item/slime_extract/metal
colour = "metal"
/obj/item/slimecross/reproductive/yellow
extract_type = /obj/item/slime_extract/yellow
colour = "yellow"
/obj/item/slimecross/reproductive/darkpurple
extract_type = /obj/item/slime_extract/darkpurple
colour = "dark purple"
/obj/item/slimecross/reproductive/darkblue
extract_type = /obj/item/slime_extract/darkblue
colour = "dark blue"
/obj/item/slimecross/reproductive/silver
extract_type = /obj/item/slime_extract/silver
colour = "silver"
/obj/item/slimecross/reproductive/bluespace
extract_type = /obj/item/slime_extract/bluespace
colour = "bluespace"
/obj/item/slimecross/reproductive/sepia
extract_type = /obj/item/slime_extract/sepia
colour = "sepia"
/obj/item/slimecross/reproductive/cerulean
extract_type = /obj/item/slime_extract/cerulean
colour = "cerulean"
/obj/item/slimecross/reproductive/pyrite
extract_type = /obj/item/slime_extract/pyrite
colour = "pyrite"
/obj/item/slimecross/reproductive/red
extract_type = /obj/item/slime_extract/red
colour = "red"
/obj/item/slimecross/reproductive/green
extract_type = /obj/item/slime_extract/green
colour = "green"
/obj/item/slimecross/reproductive/pink
extract_type = /obj/item/slime_extract/pink
colour = "pink"
/obj/item/slimecross/reproductive/gold
extract_type = /obj/item/slime_extract/gold
colour = "gold"
/obj/item/slimecross/reproductive/oil
extract_type = /obj/item/slime_extract/oil
colour = "oil"
/obj/item/slimecross/reproductive/black
extract_type = /obj/item/slime_extract/black
colour = "black"
/obj/item/slimecross/reproductive/lightpink
extract_type = /obj/item/slime_extract/lightpink
colour = "light pink"
/obj/item/slimecross/reproductive/adamantine
extract_type = /obj/item/slime_extract/adamantine
colour = "adamantine"
/obj/item/slimecross/reproductive/rainbow
extract_type = /obj/item/slime_extract/rainbow
colour = "rainbow"
@@ -0,0 +1,142 @@
/*
Self-sustaining extracts:
Produces 4 extracts that do not need reagents.
*/
/obj/item/slimecross/selfsustaining
name = "self-sustaining extract"
effect = "selfsustaining"
icon_state = "selfsustaining"
var/extract_type = /obj/item/slime_extract
/obj/item/autoslime
name = "autoslime"
desc = "It resembles a normal slime extract, but seems filled with a strange, multi-colored fluid."
var/obj/item/slime_extract/extract
//Just divides into the actual item.
/obj/item/slimecross/selfsustaining/Initialize()
. = ..()
visible_message("<span class='warning'>The [src] shudders, and splits into four smaller extracts.</span>")
for(var/i = 0, i < 4, i++)
var/obj/item/autoslime/A = new /obj/item/autoslime(src.loc)
var/obj/item/slime_extract/X = new extract_type(A)
A.extract = X
A.icon = icon
A.icon_state = icon_state
qdel(src)
/obj/item/autoslime/Initialize()
name = "self-sustaining " + extract.name
..()
/obj/item/autoslime/attack_self(mob/user)
var/reagentselect = input(user, "Choose the reagent the extract will produce.", "Self-sustaining Reaction") as null|anything in extract.activate_reagents
var/amount = 5
var/secondary
if ((user.get_active_held_item() != src || user.stat || user.restrained()))
return
if(!reagentselect)
return
if(reagentselect == "lesser plasma")
amount = 4
reagentselect = "plasma"
if(reagentselect == "holy water and uranium")
reagentselect = "holywater"
secondary = "uranium"
extract.forceMove(user.drop_location())
qdel(src)
user.put_in_active_hand(extract)
extract.reagents.add_reagent(reagentselect,amount)
if(secondary)
extract.reagents.add_reagent(secondary,amount)
//Different types.
/obj/item/slimecross/selfsustaining/grey
extract_type = /obj/item/slime_extract/grey
colour = "grey"
/obj/item/slimecross/selfsustaining/orange
extract_type = /obj/item/slime_extract/orange
colour = "orange"
/obj/item/slimecross/selfsustaining/purple
extract_type = /obj/item/slime_extract/purple
colour = "purple"
/obj/item/slimecross/selfsustaining/blue
extract_type = /obj/item/slime_extract/blue
colour = "blue"
/obj/item/slimecross/selfsustaining/metal
extract_type = /obj/item/slime_extract/metal
colour = "metal"
/obj/item/slimecross/selfsustaining/yellow
extract_type = /obj/item/slime_extract/yellow
colour = "yellow"
/obj/item/slimecross/selfsustaining/darkpurple
extract_type = /obj/item/slime_extract/darkpurple
colour = "dark purple"
/obj/item/slimecross/selfsustaining/darkblue
extract_type = /obj/item/slime_extract/darkblue
colour = "dark blue"
/obj/item/slimecross/selfsustaining/silver
extract_type = /obj/item/slime_extract/silver
colour = "silver"
/obj/item/slimecross/selfsustaining/bluespace
extract_type = /obj/item/slime_extract/bluespace
colour = "bluespace"
/obj/item/slimecross/selfsustaining/sepia
extract_type = /obj/item/slime_extract/sepia
colour = "sepia"
/obj/item/slimecross/selfsustaining/cerulean
extract_type = /obj/item/slime_extract/cerulean
colour = "cerulean"
/obj/item/slimecross/selfsustaining/pyrite
extract_type = /obj/item/slime_extract/pyrite
colour = "pyrite"
/obj/item/slimecross/selfsustaining/red
extract_type = /obj/item/slime_extract/red
colour = "red"
/obj/item/slimecross/selfsustaining/green
extract_type = /obj/item/slime_extract/green
colour = "green"
/obj/item/slimecross/selfsustaining/pink
extract_type = /obj/item/slime_extract/pink
colour = "pink"
/obj/item/slimecross/selfsustaining/gold
extract_type = /obj/item/slime_extract/gold
colour = "gold"
/obj/item/slimecross/selfsustaining/oil
extract_type = /obj/item/slime_extract/oil
colour = "oil"
/obj/item/slimecross/selfsustaining/black
extract_type = /obj/item/slime_extract/black
colour = "black"
/obj/item/slimecross/selfsustaining/lightpink
extract_type = /obj/item/slime_extract/lightpink
colour = "light pink"
/obj/item/slimecross/selfsustaining/adamantine
extract_type = /obj/item/slime_extract/adamantine
colour = "adamantine"
/obj/item/slimecross/selfsustaining/rainbow
extract_type = /obj/item/slime_extract/rainbow
colour = "rainbow"
@@ -0,0 +1,123 @@
/*
Stabilized extracts:
Provides a passive buff to the holder.
*/
//To add: Create an effect in crossbreeding/_status_effects.dm with the name "/datum/status_effect/stabilized/[color]"
//Status effect will automatically be applied while held, and lost on drop.
/obj/item/slimecross/stabilized
name = "stabilized extract"
desc = "It seems inert, but anything it touches glows softly..."
effect = "stabilized"
icon_state = "stabilized"
var/datum/status_effect/linked_effect
var/mob/living/owner
/obj/item/slimecross/stabilized/Initialize()
..()
START_PROCESSING(SSobj,src)
/obj/item/slimecross/stabilized/Destroy()
STOP_PROCESSING(SSobj,src)
qdel(linked_effect)
return ..()
/obj/item/slimecross/stabilized/process()
var/humanfound = null
if(ishuman(loc))
humanfound = loc
if(ishuman(loc.loc)) //Check if in backpack.
humanfound = (loc.loc)
if(!humanfound)
return
var/mob/living/carbon/human/H = humanfound
var/effectpath = /datum/status_effect/stabilized
var/static/list/effects = subtypesof(/datum/status_effect/stabilized)
for(var/X in effects)
var/datum/status_effect/stabilized/S = X
if(initial(S.colour) == colour)
effectpath = S
break
if(!H.has_status_effect(effectpath))
var/datum/status_effect/stabilized/S = H.apply_status_effect(effectpath)
owner = H
S.linked_extract = src
STOP_PROCESSING(SSobj,src)
//Colors and subtypes:
/obj/item/slimecross/stabilized/grey
colour = "grey"
/obj/item/slimecross/stabilized/orange
colour = "orange"
/obj/item/slimecross/stabilized/purple
colour = "purple"
/obj/item/slimecross/stabilized/blue
colour = "blue"
/obj/item/slimecross/stabilized/metal
colour = "metal"
/obj/item/slimecross/stabilized/yellow
colour = "yellow"
/obj/item/slimecross/stabilized/darkpurple
colour = "dark purple"
/obj/item/slimecross/stabilized/darkblue
colour = "dark blue"
/obj/item/slimecross/stabilized/silver
colour = "silver"
/obj/item/slimecross/stabilized/bluespace
colour = "bluespace"
/obj/item/slimecross/stabilized/sepia
colour = "sepia"
/obj/item/slimecross/stabilized/cerulean
colour = "cerulean"
/obj/item/slimecross/stabilized/pyrite
colour = "pyrite"
/obj/item/slimecross/stabilized/red
colour = "red"
/obj/item/slimecross/stabilized/green
colour = "green"
/obj/item/slimecross/stabilized/pink
colour = "pink"
/obj/item/slimecross/stabilized/gold
colour = "gold"
/obj/item/slimecross/stabilized/oil
colour = "oil"
/obj/item/slimecross/stabilized/black
colour = "black"
/obj/item/slimecross/stabilized/lightpink
colour = "light pink"
/obj/item/slimecross/stabilized/adamantine
colour = "adamantine"
/obj/item/slimecross/stabilized/rainbow
colour = "rainbow"
var/obj/item/slimecross/regenerative/regencore
/obj/item/slimecross/stabilized/rainbow/attackby(obj/item/O, mob/user)
var/obj/item/slimecross/regenerative/regen = O
if(istype(O) && !regencore)
to_chat(user, "<span class='notice'>You place the [O] in the [src], prepping the extract for automatic application!</span>")
regencore = regen
regen.forceMove(src)
return
return ..()
@@ -87,13 +87,13 @@
return
else if(istype(O, /obj/item/storage/bag) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
var/obj/item/storage/P = O
var/loaded = 0
var/loaded = FALSE
for(var/obj/G in P.contents)
if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube))
loaded = 1
loaded = TRUE
monkeys++
qdel(G)
if (loaded)
if(loaded)
to_chat(user, "<span class='notice'>You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.</span>")
return
else if(istype(O, /obj/item/slimepotion/slime) && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
@@ -1,4 +1,3 @@
/// Slime Extracts ///
/obj/item/slime_extract
@@ -6,7 +5,7 @@
desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
icon = 'icons/mob/slimes.dmi'
icon_state = "grey slime extract"
force = 1
force = 0
w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
@@ -15,14 +14,26 @@
grind_results = list()
var/Uses = 1 // uses before it goes inert
var/qdel_timer = null // deletion timer, for delayed reactions
var/effectmod
var/list/activate_reagents = list() //Reagents required for activation
var/recurring = FALSE
/obj/item/slime_extract/examine(mob/user)
..()
if(Uses > 1)
to_chat(user,"It has [Uses] uses remaining.")
/obj/item/slime_extract/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/slimepotion/enhancer))
if(Uses >= 5)
if(Uses >= 5 || recurring)
to_chat(user, "<span class='warning'>You cannot enhance this extract further!</span>")
return ..()
to_chat(user, "<span class='notice'>You apply the enhancer to the slime extract. It may now be reused one more time.</span>")
Uses++
if(O.type == /obj/item/slimepotion/enhancer) //Seriously, why is this defined here...?
to_chat(user, "<span class='notice'>You apply the enhancer to the slime extract. It may now be reused one more time.</span>")
Uses++
if(O.type == /obj/item/slimepotion/enhancer/max)
to_chat(user, "<span class='notice'>You dump the maximizer on the slime extract. It can now be used a total of 5 times!</span>")
Uses = 5
qdel(O)
..()
@@ -39,9 +50,36 @@
to_chat(user, "<span class='notice'>Nothing happened... This slime extract cannot be activated this way.</span>")
return 0
//Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract.
/obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))
return ..()
if(M.stat)
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return
if(!M.is_adult)
to_chat(user, "<span class='warning'>The slime must be an adult to cross it's core!</span>")
return
if(M.effectmod && M.effectmod != effectmod)
to_chat(user, "<span class='warning'>The slime is already being crossed with a different extract!</span>")
return
if(!M.effectmod)
M.effectmod = effectmod
M.applied++
qdel(src)
to_chat(user, "<span class='notice'>You feed the slime [src], [M.applied == 1 ? "starting to mutate its core." : "further mutating its core."]</span>")
playsound(M, 'sound/effects/attackblob.ogg', 50, 1)
if(M.applied >= SLIME_EXTRACT_CROSSING_REQUIRED)
M.spawn_corecross()
/obj/item/slime_extract/grey
name = "grey slime extract"
icon_state = "grey slime extract"
effectmod = "reproductive"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -65,6 +103,8 @@
/obj/item/slime_extract/gold
name = "gold slime extract"
icon_state = "gold slime extract"
effectmod = "symbiont"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/gold/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -92,6 +132,8 @@
/obj/item/slime_extract/silver
name = "silver slime extract"
icon_state = "silver slime extract"
effectmod = "consuming"
activate_reagents = list("plasma","water")
/obj/item/slime_extract/silver/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -115,6 +157,8 @@
/obj/item/slime_extract/metal
name = "metal slime extract"
icon_state = "metal slime extract"
effectmod = "industrial"
activate_reagents = list("plasma","water")
/obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -137,6 +181,8 @@
/obj/item/slime_extract/purple
name = "purple slime extract"
icon_state = "purple slime extract"
effectmod = "regenerative"
activate_reagents = list("blood","plasma")
/obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -154,6 +200,8 @@
/obj/item/slime_extract/darkpurple
name = "dark purple slime extract"
icon_state = "dark purple slime extract"
effectmod = "self-sustaining"
activate_reagents = list("plasma")
/obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -175,6 +223,8 @@
/obj/item/slime_extract/orange
name = "orange slime extract"
icon_state = "orange slime extract"
effectmod = "burning"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -193,6 +243,8 @@
/obj/item/slime_extract/yellow
name = "yellow slime extract"
icon_state = "yellow slime extract"
effectmod = "charged"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -214,6 +266,8 @@
/obj/item/slime_extract/red
name = "red slime extract"
icon_state = "red slime extract"
effectmod = "sanguine"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -232,6 +286,8 @@
/obj/item/slime_extract/blue
name = "blue slime extract"
icon_state = "blue slime extract"
effectmod = "stabilized"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -254,6 +310,8 @@
/obj/item/slime_extract/darkblue
name = "dark blue slime extract"
icon_state = "dark blue slime extract"
effectmod = "chilling"
activate_reagents = list("plasma","water")
/obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -275,6 +333,8 @@
/obj/item/slime_extract/pink
name = "pink slime extract"
icon_state = "pink slime extract"
effectmod = "gentle"
activate_reagents = list("blood","plasma")
/obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -301,6 +361,8 @@
/obj/item/slime_extract/green
name = "green slime extract"
icon_state = "green slime extract"
effectmod = "mutative"
activate_reagents = list("blood","plasma","radium")
/obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -323,6 +385,8 @@
/obj/item/slime_extract/lightpink
name = "light pink slime extract"
icon_state = "light pink slime extract"
effectmod = "loyal"
activate_reagents = list("plasma")
/obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -345,6 +409,8 @@
/obj/item/slime_extract/black
name = "black slime extract"
icon_state = "black slime extract"
effectmod = "transformative"
activate_reagents = list("plasma")
/obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -364,6 +430,8 @@
/obj/item/slime_extract/oil
name = "oil slime extract"
icon_state = "oil slime extract"
effectmod = "detonating"
activate_reagents = list("blood","plasma")
/obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -385,6 +453,8 @@
/obj/item/slime_extract/adamantine
name = "adamantine slime extract"
icon_state = "adamantine slime extract"
effectmod = "crystalline"
activate_reagents = list("plasma")
/obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -412,6 +482,8 @@
/obj/item/slime_extract/bluespace
name = "bluespace slime extract"
icon_state = "bluespace slime extract"
effectmod = "warping"
activate_reagents = list("blood","plasma")
var/teleport_ready = FALSE
var/teleport_x = 0
var/teleport_y = 0
@@ -446,6 +518,8 @@
/obj/item/slime_extract/pyrite
name = "pyrite slime extract"
icon_state = "pyrite slime extract"
effectmod = "prismatic"
activate_reagents = list("blood","plasma")
/obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -470,6 +544,8 @@
/obj/item/slime_extract/cerulean
name = "cerulean slime extract"
icon_state = "cerulean slime extract"
effectmod = "recurring"
activate_reagents = list("blood","plasma")
/obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -488,6 +564,8 @@
/obj/item/slime_extract/sepia
name = "sepia slime extract"
icon_state = "sepia slime extract"
effectmod = "lengthened"
activate_reagents = list("blood","plasma","water")
/obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -508,6 +586,8 @@
/obj/item/slime_extract/rainbow
name = "rainbow slime extract"
icon_state = "rainbow slime extract"
effectmod = "hyperchromatic"
activate_reagents = list("blood","plasma","lesser plasma","slimejelly","holy water and uranium") //Curse this snowflake reagent list.
/obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)