Xenobiology Species Rework (#34166)

I've always found grating that xenobiology had access to species they had no business working with, and slime magic can only explain so much. My idea is to separate those species into their respective departments/antags, instead of having them all into a centralized, cheap source.

    Androids should be made by robotics through augmentation
    Podpeople are a botany feature
    Skeletons should be limited to liches or other magic antags
    Zombies should stay limited to romerol
    Golems are still available in adamantine slimes (and luminescents can morph into golems with them)
    Shadowpeople still lack an official place, but luminescents can become shadowpeople with black cores

The basic races are mostly human and lizard, and there are mutation toxins for those in case someone wants their species back after bodyswapping/ling mutation sting/etc.
This commit is contained in:
XDTM
2018-01-15 23:07:06 +01:00
committed by oranges
parent c854162f1e
commit 76b5ee3966
16 changed files with 941 additions and 215 deletions

View File

@@ -483,6 +483,12 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define HOSTILE_SPAWN 1
#define FRIENDLY_SPAWN 2
//slime core activation type
#define SLIME_ACTIVATE_MINOR 1
#define SLIME_ACTIVATE_MAJOR 2
#define LUMINESCENT_DEFAULT_GLOW 2
#define RIDING_OFFSET_ALL "ALL"
//text files

View File

@@ -488,3 +488,24 @@ Proc for attack log creation, because really why not
warning("Invalid speech logging type detected. [logtype]. Defaulting to say")
log_say(logmessage)
//Used in chemical_mob_spawn. Generates a random mob based on a given gold_core_spawnable value.
/proc/create_random_mob(spawn_location, mob_class = HOSTILE_SPAWN)
var/static/list/mob_spawn_meancritters = list() // list of possible hostile mobs
var/static/list/mob_spawn_nicecritters = list() // and possible friendly mobs
if(mob_spawn_meancritters.len <= 0 || mob_spawn_nicecritters.len <= 0)
for(var/T in typesof(/mob/living/simple_animal))
var/mob/living/simple_animal/SA = T
switch(initial(SA.gold_core_spawnable))
if(HOSTILE_SPAWN)
mob_spawn_meancritters += T
if(FRIENDLY_SPAWN)
mob_spawn_nicecritters += T
var/chosen
if(mob_class == FRIENDLY_SPAWN)
chosen = pick(mob_spawn_nicecritters)
else
chosen = pick(mob_spawn_meancritters)
var/mob/living/simple_animal/C = new chosen(spawn_location)
return C

View File

@@ -1537,3 +1537,29 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
D.vv_edit_var(var_name, var_value) //same result generally, unless badmemes
else
D.vars[var_name] = var_value
/proc/get_random_food()
var/list/blocked = list(/obj/item/reagent_containers/food/snacks,
/obj/item/reagent_containers/food/snacks/store/bread,
/obj/item/reagent_containers/food/snacks/breadslice,
/obj/item/reagent_containers/food/snacks/store/cake,
/obj/item/reagent_containers/food/snacks/cakeslice,
/obj/item/reagent_containers/food/snacks/store,
/obj/item/reagent_containers/food/snacks/pie,
/obj/item/reagent_containers/food/snacks/kebab,
/obj/item/reagent_containers/food/snacks/pizza,
/obj/item/reagent_containers/food/snacks/pizzaslice,
/obj/item/reagent_containers/food/snacks/salad,
/obj/item/reagent_containers/food/snacks/meat,
/obj/item/reagent_containers/food/snacks/meat/slab,
/obj/item/reagent_containers/food/snacks/soup,
/obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom,
/obj/item/reagent_containers/food/snacks/deepfryholder
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
return pick(typesof(/obj/item/reagent_containers/food/snacks) - blocked)
/proc/get_random_drink()
return pick(subtypesof(/obj/item/reagent_containers/food/drinks))

View File

@@ -76,7 +76,7 @@ SUBSYSTEM_DEF(augury)
active = FALSE
UpdateButtonIcon()
/datum/action/innate/augury/UpdateButtonIcon(status_only = FALSE)
/datum/action/innate/augury/UpdateButtonIcon(status_only = FALSE, force)
..()
if(active)
button.icon_state = "template_active"

View File

@@ -104,7 +104,7 @@
return 0
return 1
/datum/action/proc/UpdateButtonIcon(status_only = FALSE)
/datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE)
if(button)
if(!status_only)
button.name = name
@@ -121,7 +121,7 @@
if(button.icon_state != background_icon_state)
button.icon_state = background_icon_state
ApplyIcon(button)
ApplyIcon(button, force)
if(!IsAvailable())
button.color = rgb(128,0,0,128)
@@ -129,8 +129,8 @@
button.color = rgb(255,255,255,255)
return 1
/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button)
if(icon_icon && button_icon_state && current_button.button_icon_state != button_icon_state)
/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE)
if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force))
current_button.cut_overlays(TRUE)
current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state))
current_button.button_icon_state = button_icon_state
@@ -163,11 +163,11 @@
I.ui_action_click(owner, src)
return 1
/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button)
/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button, force)
if(button_icon && button_icon_state)
// If set, use the custom icon that we set instead
// of the item appearence
..(current_button)
..()
else if(target && current_button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid.
var/obj/item/I = target
var/old_layer = I.layer
@@ -215,7 +215,7 @@
/datum/action/item_action/set_internals
name = "Set Internals"
/datum/action/item_action/set_internals/UpdateButtonIcon(status_only = FALSE)
/datum/action/item_action/set_internals/UpdateButtonIcon(status_only = FALSE, force)
if(..()) //button available
if(iscarbon(owner))
var/mob/living/carbon/C = owner
@@ -253,7 +253,7 @@
if(..())
UpdateButtonIcon()
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE)
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE, force)
if(istype(target, /obj/item/hierophant_club))
var/obj/item/hierophant_club/H = target
if(H.friendly_fire_check)

View File

@@ -204,12 +204,13 @@
..()
switch(stage)
if(1)
if(ishuman(affected_mob) && affected_mob.dna && affected_mob.dna.species.id == "slime")
stage = 5
if(ishuman(affected_mob) && affected_mob.dna)
if(affected_mob.dna.species.id == "slime" || affected_mob.dna.species.id == "stargazer" || affected_mob.dna.species.id == "lum")
stage = 5
if(3)
if(ishuman(affected_mob))
var/mob/living/carbon/human/human = affected_mob
if(human.dna.species.id != "slime")
if(human.dna.species.id != "slime" && affected_mob.dna.species.id != "stargazer" && affected_mob.dna.species.id != "lum")
human.set_species(/datum/species/jelly/slime)
/datum/disease/transformation/corgi

View File

@@ -53,3 +53,8 @@
/obj/effect/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
/obj/effect/decal/cleanable/oil/slippery
/obj/effect/decal/cleanable/oil/slippery/Initialize()
AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE))

View File

@@ -10,17 +10,22 @@
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
liked_food = MEAT
coldmod = 6 // = 3x cold damage
heatmod = 0.5 // = 1/4x heat damage
burnmod = 0.5 // = 1/2x generic burn damage
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
if(regenerate_limbs)
regenerate_limbs.Remove(C)
..()
C.faction -= "slime"
/datum/species/jelly/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
if(ishuman(C))
regenerate_limbs = new
regenerate_limbs.Grant(C)
C.faction |= "slime"
/datum/species/jelly/spec_life(mob/living/carbon/human/H)
if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely
@@ -39,7 +44,8 @@
to_chat(H, "<span class='danger'>You feel drained!</span>")
if(H.blood_volume < BLOOD_VOLUME_BAD)
Cannibalize_Body(H)
H.update_action_buttons_icon()
if(regenerate_limbs)
regenerate_limbs.UpdateButtonIcon()
/datum/species/jelly/proc/Cannibalize_Body(mob/living/carbon/human/H)
var/list/limbs_to_consume = list("r_arm", "l_arm", "r_leg", "l_leg") - H.get_missing_limbs()
@@ -94,10 +100,11 @@
return
to_chat(H, "<span class='warning'>...but there is not enough of you to go around! You must attain more mass to heal!</span>")
////////////////////////////////////////////////////////SLIME PEOPLE///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////SLIMEPEOPLE///////////////////////////////////////////////////////////////////
//Slime people are able to split like slimes, retaining a single mind that can swap between bodies at will, even after death.
/datum/species/jelly/slime
// Humans mutated by slime mutagen, produced from green slimes. They are not targetted by slimes.
name = "Slimeperson"
id = "slime"
default_color = "00FFFF"
@@ -106,9 +113,6 @@
hair_color = "mutcolor"
hair_alpha = 150
ignored_by = list(/mob/living/simple_animal/slime)
burnmod = 0.5
coldmod = 2
heatmod = 0.5
var/datum/action/innate/split_body/slime_split
var/list/mob/living/carbon/bodies
var/datum/action/innate/swap_body/swap_body
@@ -121,7 +125,6 @@
bodies -= C // This means that the other bodies maintain a link
// so if someone mindswapped into them, they'd still be shared.
bodies = null
C.faction -= "slime"
C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL)
..()
@@ -138,7 +141,18 @@
else
bodies |= C
C.faction |= "slime"
/datum/species/jelly/slime/spec_death(gibbed, mob/living/carbon/human/H)
if(slime_split)
var/datum/mind/M
for(var/mob/living/L in bodies)
if(L.mind && L.mind.active)
M = L.mind
if(!M || M != H.mind)
return
var/list/available_bodies = (bodies - H)
if(!LAZYLEN(available_bodies))
return
swap_body.swap_to_dupe(M, pick(available_bodies))
//If you're cloned you get your body pool back
/datum/species/jelly/slime/copy_properties_from(datum/species/jelly/slime/old_species)
@@ -223,7 +237,7 @@
/datum/action/innate/swap_body
name = "Swap Body"
check_flags = AB_CHECK_CONSCIOUS
check_flags = NONE
button_icon_state = "slimeswap"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
@@ -235,7 +249,7 @@
else
ui_interact(owner)
/datum/action/innate/swap_body/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.conscious_state)
/datum/action/innate/swap_body/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.self_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -321,14 +335,356 @@
return
if(selected.stat != CONSCIOUS)
return
swap_to_dupe(M, selected)
/datum/action/innate/swap_body/proc/swap_to_dupe(datum/mind/M, mob/living/carbon/human/dupe)
M.current.visible_message("<span class='notice'>[M.current] \
stops moving and starts staring vacantly into space.</span>",
"<span class='notice'>You stop moving this body...</span>")
if(M.current.stat == CONSCIOUS)
M.current.visible_message("<span class='notice'>[M.current] \
stops moving and starts staring vacantly into space.</span>",
"<span class='notice'>You stop moving this body...</span>")
else
to_chat(M.current, "<span class='notice'>You abandon this body...</span>")
M.transfer_to(dupe)
dupe.visible_message("<span class='notice'>[dupe] blinks and looks \
around.</span>",
"<span class='notice'>...and move this one instead.</span>")
///////////////////////////////////LUMINESCENTS//////////////////////////////////////////
//Luminescents are able to consume and use slime extracts, without them decaying.
/datum/species/jelly/luminescent
name = "Luminescent"
id = "lum"
say_mod = "says"
var/glow_intensity = LUMINESCENT_DEFAULT_GLOW
var/obj/effect/dummy/luminescent_glow/glow
var/obj/item/slime_extract/current_extract
var/datum/action/innate/integrate_extract/integrate_extract
var/datum/action/innate/use_extract/extract_minor
var/datum/action/innate/use_extract/major/extract_major
var/extract_cooldown = 0
/datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C)
..()
if(current_extract)
current_extract.forceMove(C.drop_location())
current_extract = null
qdel(glow)
if(integrate_extract)
integrate_extract.Remove(C)
if(extract_minor)
extract_minor.Remove(C)
if(extract_major)
extract_major.Remove(C)
/datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
glow = new(C)
update_glow(C)
integrate_extract = new(src)
integrate_extract.Grant(C)
extract_minor = new(src)
extract_minor.Grant(C)
extract_major = new(src)
extract_major.Grant(C)
/datum/species/jelly/luminescent/proc/update_slime_actions()
integrate_extract.update_name()
integrate_extract.UpdateButtonIcon()
extract_minor.UpdateButtonIcon()
extract_major.UpdateButtonIcon()
/datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity)
if(intensity)
glow_intensity = intensity
glow.set_light(glow_intensity, glow_intensity, C.dna.features["mcolor"])
/obj/effect/dummy/luminescent_glow
name = "luminescent glow"
desc = "Tell a coder if you're seeing this."
icon_state = "nothing"
light_color = "#FFFFFF"
light_range = LUMINESCENT_DEFAULT_GLOW
/obj/effect/dummy/luminescent_glow/Initialize()
. = ..()
if(!isliving(loc))
return INITIALIZE_HINT_QDEL
/datum/action/innate/integrate_extract
name = "Integrate Extract"
desc = "Eat a slime extract to use its properties."
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "slimeconsume"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
var/datum/species/jelly/luminescent/species
/datum/action/innate/integrate_extract/New(_species)
..()
species = _species
/datum/action/innate/integrate_extract/proc/update_name()
if(!species || !species.current_extract)
name = "Integrate Extract"
desc = "Eat a slime extract to use its properties."
else
name = "Eject Extract"
desc = "Eject your current slime extract."
/datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force)
if(!species || !species.current_extract)
button_icon_state = "slimeconsume"
else
button_icon_state = "slimeeject"
..()
/datum/action/innate/integrate_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force)
..(current_button, TRUE)
if(species && species.current_extract)
current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state))
/datum/action/innate/integrate_extract/Activate()
var/mob/living/carbon/human/H = owner
if(!is_species(H, /datum/species/jelly/luminescent) || !species)
return
CHECK_DNA_AND_SPECIES(H)
if(species.current_extract)
var/obj/item/slime_extract/S = species.current_extract
if(!H.put_in_active_hand(S))
S.forceMove(H.drop_location())
species.current_extract = null
to_chat(H, "<span class='notice'>You eject [S].</span>")
species.update_slime_actions()
else
var/obj/item/I = H.get_active_held_item()
if(istype(I, /obj/item/slime_extract))
var/obj/item/slime_extract/S = I
if(!S.Uses)
to_chat(H, "<span class='warning'>[I] is spent! You cannot integrate it.</span>")
return
if(!H.temporarilyRemoveItemFromInventory(S))
return
S.forceMove(H)
species.current_extract = S
to_chat(H, "<span class='notice'>You consume [I], and you feel it pulse within you...</span>")
species.update_slime_actions()
else
to_chat(H, "<span class='warning'>You need to hold an unused slime extract in your active hand!</span>")
/datum/action/innate/use_extract
name = "Extract Minor Activation"
desc = "Pulse the slime extract with energized jelly to activate it."
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "slimeuse1"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
var/activation_type = SLIME_ACTIVATE_MINOR
var/datum/species/jelly/luminescent/species
/datum/action/innate/use_extract/New(_species)
..()
species = _species
/datum/action/innate/use_extract/IsAvailable()
if(..())
if(species && species.current_extract && (world.time > species.extract_cooldown))
return TRUE
return FALSE
/datum/action/innate/use_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force)
..(current_button, TRUE)
if(species && species.current_extract)
current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state))
/datum/action/innate/use_extract/Activate()
var/mob/living/carbon/human/H = owner
if(!is_species(H, /datum/species/jelly/luminescent) || !species)
return
CHECK_DNA_AND_SPECIES(H)
if(species.current_extract)
var/cooldown = species.current_extract.activate(H, species, activation_type)
species.extract_cooldown = world.time + cooldown
/datum/action/innate/use_extract/major
name = "Extract Major Activation"
desc = "Pulse the slime extract with plasma jelly to activate it."
button_icon_state = "slimeuse2"
activation_type = SLIME_ACTIVATE_MAJOR
///////////////////////////////////STARGAZERS//////////////////////////////////////////
//Stargazers are the telepathic branch of jellypeople, able to project psychic messages and to link minds with willing participants.
/datum/species/jelly/stargazer
name = "Stargazer"
id = "stargazer"
var/datum/action/innate/project_thought/project_thought
var/datum/action/innate/link_minds/link_minds
var/list/mob/living/linked_mobs = list()
var/list/datum/action/innate/linked_speech/linked_actions = list()
var/mob/living/carbon/human/slimelink_owner
var/current_link_id = 0
/datum/species/jelly/stargazer/on_species_loss(mob/living/carbon/C)
..()
for(var/M in linked_mobs)
unlink_mob(M)
if(project_thought)
project_thought.Remove(C)
if(link_minds)
link_minds.Remove(C)
/datum/species/jelly/stargazer/spec_death(gibbed, mob/living/carbon/human/H)
..()
for(var/M in linked_mobs)
unlink_mob(M)
/datum/species/jelly/stargazer/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
project_thought = new(src)
project_thought.Grant(C)
link_minds = new(src)
link_minds.Grant(C)
slimelink_owner = C
link_mob(C)
/datum/species/jelly/stargazer/proc/link_mob(mob/living/M)
if(QDELETED(M) || M.stat == DEAD)
return FALSE
if(M.isloyal()) //mindshield implant, no dice
return FALSE
if(M in linked_mobs)
return FALSE
linked_mobs.Add(M)
to_chat(M, "<span class='notice'>You are now connected to [slimelink_owner.real_name]'s Slime Link.</span>")
var/datum/action/innate/linked_speech/action = new(src)
linked_actions.Add(action)
action.Grant(M)
return TRUE
/datum/species/jelly/stargazer/proc/unlink_mob(mob/living/M)
var/link_id = linked_mobs.Find(M)
if(!(link_id))
return
var/datum/action/innate/linked_speech/action = linked_actions[link_id]
action.Remove(M)
to_chat(M, "<span class='notice'>You are no longer connected to [slimelink_owner.real_name]'s Slime Link.</span>")
linked_mobs[link_id] = null
linked_actions[link_id] = null
/datum/action/innate/linked_speech
name = "Slimelink"
desc = "Send a psychic message to everyone connected to your slime link."
button_icon_state = "link_speech"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
var/datum/species/jelly/stargazer/species
/datum/action/innate/linked_speech/New(_species)
..()
species = _species
/datum/action/innate/linked_speech/Activate()
var/mob/living/carbon/human/H = owner
if(!species || !(H in species.linked_mobs))
to_chat(H, "<span class='warning'>The link seems to have been severed...</span>")
Remove(H)
return
var/message = sanitize(input("Message:", "Slime Telepathy") as text|null)
if(!species || !(H in species.linked_mobs))
to_chat(H, "<span class='warning'>The link seems to have been severed...</span>")
Remove(H)
return
if(QDELETED(H) || H.stat == DEAD)
species.unlink_mob(H)
return
if(message)
var/msg = "<i><font color=#008CA2>\[[species.slimelink_owner.real_name]'s Slime Link\] <b>[H]:</b> [message]</font></i>"
log_talk(H,"SlimeLink: [key_name(H)] : [msg]",LOGSAY)
for(var/X in species.linked_mobs)
var/mob/living/M = X
if(QDELETED(M) || M.stat == DEAD)
species.unlink_mob(M)
continue
to_chat(M, msg)
for(var/X in GLOB.dead_mob_list)
var/mob/M = X
var/link = FOLLOW_LINK(M, H)
to_chat(M, "[link] [msg]")
/datum/action/innate/project_thought
name = "Send Thought"
desc = "Send a private psychic message to someone you can see."
button_icon_state = "send_mind"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
/datum/action/innate/project_thought/Activate()
var/mob/living/carbon/human/H = owner
if(!is_species(H, /datum/species/jelly/stargazer))
return
CHECK_DNA_AND_SPECIES(H)
var/list/options = list()
for(var/mob/living/Ms in oview(H))
options += Ms
var/mob/living/M = input("Select who to send your message to:","Send thought to?",null) as null|mob in options
if(!M)
return
var/msg = sanitize(input("Message:", "Telepathy") as text|null)
if(msg)
log_talk(H,"SlimeTelepathy: [key_name(H)]->[M.key] : [msg]",LOGSAY)
to_chat(M, "<span class='notice'>You hear an alien voice in your head... </span><font color=#008CA2>[msg]</font>")
to_chat(H, "<span class='notice'>You telepathically said: \"[msg]\" to [M]</span>")
for(var/dead in GLOB.dead_mob_list)
if(!isobserver(dead))
continue
var/follow_link_user = FOLLOW_LINK(dead, H)
var/follow_link_target = FOLLOW_LINK(dead, M)
to_chat(dead, "[follow_link_user] <span class='name'>[H]</span> <span class='alertalien'>Slime Telepathy --> </span> [follow_link_target] <span class='name'>[M]</span> <span class='noticealien'>[msg]</span>")
/datum/action/innate/link_minds
name = "Link Minds"
desc = "Link someone's mind to your Slime Link, allowing them to communicate telepathically with other linked minds."
button_icon_state = "mindlink"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
var/datum/species/jelly/stargazer/species
/datum/action/innate/link_minds/New(_species)
..()
species = _species
/datum/action/innate/link_minds/Activate()
var/mob/living/carbon/human/H = owner
if(!is_species(H, /datum/species/jelly/stargazer))
return
CHECK_DNA_AND_SPECIES(H)
if(!H.pulling || !isliving(H.pulling) || H.grab_state < GRAB_AGGRESSIVE)
to_chat(H, "<span class='warning'>You need to aggressively grab someone to link minds!</span>")
return
var/mob/living/target = H.pulling
to_chat(H, "<span class='notice'>You begin linking [target]'s mind to yours...</span>")
to_chat(target, "<span class='warning'>You feel a foreign presence within your mind...</span>")
if(do_after(H, 60, target = target))
if(H.pulling != target || H.grab_state < GRAB_AGGRESSIVE)
return
if(species.link_mob(target))
to_chat(H, "<span class='notice'>You connect [target]'s mind to your slime link!</span>")
else
to_chat(H, "<span class='warning'>You can't seem to link [target]'s mind...</span>")
to_chat(target, "<span class='warning'>The foreign presence leaves your mind.</span>")

View File

@@ -397,17 +397,17 @@
..()
return
/datum/reagent/stableslimetoxin
/datum/reagent/mutationtoxin
name = "Stable Mutation Toxin"
id = "stablemutationtoxin"
description = "A humanizing toxin produced by slimes."
description = "A humanizing toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY //So it instantly removes all of itself
taste_description = "slime"
var/datum/species/race = /datum/species/human
var/mutationtext = "<span class='danger'>The pain subsides. You feel... human.</span>"
/datum/reagent/stableslimetoxin/on_mob_life(mob/living/carbon/human/H)
/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/H)
..()
if(!istype(H))
return
@@ -417,7 +417,7 @@
addtimer(CALLBACK(src, .proc/mutate, H), 30)
return
/datum/reagent/stableslimetoxin/proc/mutate(mob/living/carbon/human/H)
/datum/reagent/mutationtoxin/proc/mutate(mob/living/carbon/human/H)
if(QDELETED(H))
return
var/current_species = H.dna.species.type
@@ -428,130 +428,150 @@
else
to_chat(H, "<span class='danger'>The pain vanishes suddenly. You feel no different.</span>")
/datum/reagent/stableslimetoxin/classic //The one from plasma on green slimes
/datum/reagent/mutationtoxin/classic //The one from plasma on green slimes
name = "Mutation Toxin"
id = "mutationtoxin"
description = "A corruptive toxin produced by slimes."
description = "A corruptive toxin."
color = "#13BC5E" // rgb: 19, 188, 94
race = /datum/species/jelly/slime
mutationtext = "<span class='danger'>The pain subsides. Your whole body feels like slime.</span>"
/datum/reagent/stableslimetoxin/lizard
/datum/reagent/mutationtoxin/lizard
name = "Lizard Mutation Toxin"
id = "lizardmutationtoxin"
description = "A lizarding toxin produced by slimes."
description = "A lizarding toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/lizard
mutationtext = "<span class='danger'>The pain subsides. You feel... scaly.</span>"
/datum/reagent/stableslimetoxin/fly
/datum/reagent/mutationtoxin/fly
name = "Fly Mutation Toxin"
id = "flymutationtoxin"
description = "An insectifying toxin produced by slimes."
description = "An insectifying toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/fly
mutationtext = "<span class='danger'>The pain subsides. You feel... buzzy.</span>"
/datum/reagent/stableslimetoxin/pod
/datum/reagent/mutationtoxin/pod
name = "Podperson Mutation Toxin"
id = "podmutationtoxin"
description = "A vegetalizing toxin produced by slimes."
description = "A vegetalizing toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/pod
mutationtext = "<span class='danger'>The pain subsides. You feel... plantlike.</span>"
/datum/reagent/stableslimetoxin/jelly
/datum/reagent/mutationtoxin/jelly
name = "Imperfect Mutation Toxin"
id = "jellymutationtoxin"
description = "An jellyfying toxin produced by slimes."
description = "An jellyfying toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/jelly
mutationtext = "<span class='danger'>The pain subsides. You feel... wobbly.</span>"
/datum/reagent/stableslimetoxin/golem
/datum/reagent/mutationtoxin/golem
name = "Golem Mutation Toxin"
id = "golemmutationtoxin"
description = "A crystal toxin produced by slimes."
description = "A crystal toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/golem/random
mutationtext = "<span class='danger'>The pain subsides. You feel... rocky.</span>"
/datum/reagent/stableslimetoxin/abductor
/datum/reagent/mutationtoxin/abductor
name = "Abductor Mutation Toxin"
id = "abductormutationtoxin"
description = "An alien toxin produced by slimes."
description = "An alien toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/abductor
mutationtext = "<span class='danger'>The pain subsides. You feel... alien.</span>"
/datum/reagent/stableslimetoxin/android
/datum/reagent/mutationtoxin/android
name = "Android Mutation Toxin"
id = "androidmutationtoxin"
description = "A robotic toxin produced by slimes."
description = "A robotic toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/android
mutationtext = "<span class='danger'>The pain subsides. You feel... artificial.</span>"
//BLACKLISTED RACES
/datum/reagent/stableslimetoxin/skeleton
/datum/reagent/mutationtoxin/skeleton
name = "Skeleton Mutation Toxin"
id = "skeletonmutationtoxin"
description = "A scary toxin produced by slimes."
description = "A scary toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/skeleton
mutationtext = "<span class='danger'>The pain subsides. You feel... spooky.</span>"
/datum/reagent/stableslimetoxin/zombie
/datum/reagent/mutationtoxin/zombie
name = "Zombie Mutation Toxin"
id = "zombiemutationtoxin"
description = "An undead toxin produced by slimes."
description = "An undead toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past.
mutationtext = "<span class='danger'>The pain subsides. You feel... undead.</span>"
/datum/reagent/stableslimetoxin/ash
/datum/reagent/mutationtoxin/ash
name = "Ash Mutation Toxin"
id = "ashmutationtoxin"
description = "An ashen toxin produced by slimes."
description = "An ashen toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/lizard/ashwalker
mutationtext = "<span class='danger'>The pain subsides. You feel... savage.</span>"
//DANGEROUS RACES
/datum/reagent/stableslimetoxin/shadow
/datum/reagent/mutationtoxin/shadow
name = "Shadow Mutation Toxin"
id = "shadowmutationtoxin"
description = "A dark toxin produced by slimes."
description = "A dark toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/shadow
mutationtext = "<span class='danger'>The pain subsides. You feel... darker.</span>"
/datum/reagent/stableslimetoxin/plasma
/datum/reagent/mutationtoxin/plasma
name = "Plasma Mutation Toxin"
id = "plasmamutationtoxin"
description = "A plasma-based toxin produced by slimes."
description = "A plasma-based toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/plasmaman
mutationtext = "<span class='danger'>The pain subsides. You feel... flammable.</span>"
/datum/reagent/stableslimetoxin/unstable //PSYCH
name = "Unstable Mutation Toxin"
id = "unstablemutationtoxin"
description = "An unstable and unpredictable corruptive toxin produced by slimes."
/datum/reagent/slime_toxin
name = "Slime Mutation Toxin"
id = "slime_toxin"
description = "A toxin that turns organic material into slime."
color = "#5EFF3B" //RGB: 94, 255, 59
mutationtext = "<span class='danger'>The pain subsides. You feel... different.</span>"
taste_description = "slime"
metabolization_rate = 0.2
/datum/reagent/stableslimetoxin/unstable/on_mob_life(mob/living/carbon/human/H)
var/list/possible_morphs = list()
for(var/type in subtypesof(/datum/species))
var/datum/species/S = type
if(initial(S.blacklisted))
continue
possible_morphs += S
race = pick(possible_morphs)
/datum/reagent/slime_toxin/on_mob_life(mob/living/carbon/human/H)
..()
if(!istype(H))
return
if(!H.dna || !H.dna.species || !(H.dna.species.species_traits & SPECIES_ORGANIC))
return
if(istype(H.dna.species, /datum/species/jelly/slime) || istype(H.dna.species, /datum/species/jelly/stargazer) || istype(H.dna.species, /datum/species/jelly/luminescent))
to_chat(H, "<span class='warning'>Your jelly shifts and morphs, turning you into another subspecies!</span>")
var/species_type = pick(/datum/species/jelly/slime,/datum/species/jelly/stargazer,/datum/species/jelly/luminescent)
H.set_species(species_type)
H.reagents.del_reagent(id)
switch(current_cycle)
if(1 to 6)
if(prob(10))
to_chat(H, "<span class='warning'>[pick("You don't feel very well.", "Your skin feels a little slimy.")]</span>")
if(7 to 12)
if(prob(10))
to_chat(H, "<span class='warning'>[pick("Your appendages are melting away.", "Your limbs begin to lose their shape.")]</span>")
if(13 to 19)
if(prob(10))
to_chat(H, "<span class='warning'>[pick("You feel your internal organs turning into slime.", "You feel very slimelike.")]</span>")
if(20 to INFINITY)
var/species_type = pick(/datum/species/jelly/slime,/datum/species/jelly/stargazer,/datum/species/jelly/luminescent)
H.set_species(species_type)
H.reagents.del_reagent(id)
to_chat(H, "<span class='warning'>You've become \a jellyperson!</span>")
/datum/reagent/mulligan
name = "Mulligan Toxin"

View File

@@ -21,18 +21,8 @@
return
//I recommend you set the result amount to the total volume of all components.
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
var/static/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs
var/static/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_class = HOSTILE_SPAWN, mob_faction = "chemicalsummon")
if(holder && holder.my_atom)
if (chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0)
for (var/T in typesof(/mob/living/simple_animal))
var/mob/living/simple_animal/SA = T
switch(initial(SA.gold_core_spawnable))
if(HOSTILE_SPAWN)
chemical_mob_spawn_meancritters += T
if(FRIENDLY_SPAWN)
chemical_mob_spawn_nicecritters += T
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/message = "A [reaction_name] reaction has occurred in [get_area_name(T)] [ADMIN_COORDJMP(T)]"
@@ -50,18 +40,13 @@
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
C.flash_act()
for(var/i = 1, i <= amount_to_spawn, i++)
var/chosen
if (reaction_name == "Friendly Gold Slime")
chosen = pick(chemical_mob_spawn_nicecritters)
else
chosen = pick(chemical_mob_spawn_meancritters)
var/spawnloc = get_turf(holder.my_atom)
var/mob/living/simple_animal/C = new chosen(spawnloc)
C.faction |= mob_faction
for(var/i in 1 to amount_to_spawn)
var/mob/living/simple_animal/S = create_random_mob(get_turf(holder.my_atom), mob_class)
S.faction |= mob_faction
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
step(S, pick(NORTH,SOUTH,EAST,WEST))
/datum/chemical_reaction/proc/goonchem_vortex(turf/T, setting_type, range)
for(var/atom/movable/X in orange(range, T))

View File

@@ -125,96 +125,12 @@
required_reagents = list("ammonia" = 2, "nitrogen" = 1, "oxygen" = 2)
required_temp = 525
////////////////////////////////// Mutation Toxins ///////////////////////////////////
/datum/chemical_reaction/stable_mutation_toxin
name = "Stable Mutation Toxin"
id = "stablemutationtoxin"
results = list("stablemutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "blood" = 1) //classic
/datum/chemical_reaction/lizard_mutation_toxin
name = "Lizard Mutation Toxin"
id = "lizardmutationtoxin"
results = list("lizardmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "radium" = 1) //mutant
/datum/chemical_reaction/fly_mutation_toxin
name = "Fly Mutation Toxin"
id = "flymutationtoxin"
results = list("flymutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "mutagen" = 1) //VERY mutant
/datum/chemical_reaction/jelly_mutation_toxin
name = "Imperfect Mutation Toxin"
id = "jellymutationtoxin"
results = list("jellymutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "slimejelly" = 1) //why would you even make this
/datum/chemical_reaction/abductor_mutation_toxin
name = "Abductor Mutation Toxin"
id = "abductormutationtoxin"
results = list("abductormutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "morphine" = 1)
/datum/chemical_reaction/android_mutation_toxin
name = "Android Mutation Toxin"
id = "androidmutationtoxin"
results = list("androidmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "teslium" = 1) //beep boop
/datum/chemical_reaction/pod_mutation_toxin
name = "Podperson Mutation Toxin"
id = "podmutationtoxin"
results = list("podmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "eznutriment" = 1) //plant food
/datum/chemical_reaction/golem_mutation_toxin
name = "Golem Mutation Toxin"
id = "golemmutationtoxin"
results = list("golemmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "silver" = 1) //not too hard to get but also not just there in xenobio
//BLACKLISTED RACES
/datum/chemical_reaction/skeleton_mutation_toxin
name = "Skeleton Mutation Toxin"
id = "skeletonmutationtoxin"
results = list("skeletonmutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "milk" = 1) //good for yer bones
/datum/chemical_reaction/zombie_mutation_toxin
name = "Zombie Mutation Toxin"
id = "zombiemutationtoxin"
results = list("zombiemutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "toxin" = 1)
/datum/chemical_reaction/ash_mutation_toxin //ash lizard
name = "Ash Mutation Toxin"
id = "ashmutationtoxin"
results = list("ashmutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "lizardmutationtoxin" = 1, "ash" = 1)
//DANGEROUS RACES
/datum/chemical_reaction/plasma_mutation_toxin
name = "Plasma Mutation Toxin"
id = "plasmamutationtoxin"
results = list("plasmamutationtoxin" = 1)
required_reagents = list("skeletonmutationtoxin" = 1, "plasma" = 1, "uranium" = 1) //this is very fucking powerful, so it's hard to make
/datum/chemical_reaction/shadow_mutation_toxin
name = "Shadow Mutation Toxin"
id = "shadowmutationtoxin"
results = list("shadowmutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "liquid_dark_matter" = 1, "holywater" = 1)
//Technically a mutation toxin
/datum/chemical_reaction/mulligan
name = "Mulligan"
id = "mulligan"
results = list("mulligan" = 1)
required_reagents = list("stablemutationtoxin" = 1, "mutagen" = 1)
required_reagents = list("slime_toxin" = 1, "mutagen" = 1)
////////////////////////////////// VIROLOGY //////////////////////////////////////////

View File

@@ -48,21 +48,27 @@
//Green
/datum/chemical_reaction/slime/slimemutate
name = "Mutation Toxin"
id = "mutationtoxin"
results = list("mutationtoxin" = 1)
id = "slimetoxin"
results = list("slime_toxin" = 1)
required_reagents = list("plasma" = 1)
required_other = 1
required_container = /obj/item/slime_extract/green
//Mutated Green
/datum/chemical_reaction/slime/slimemutate_unstable
name = "Unstable Mutation Toxin"
id = "unstablemutationtoxin"
results = list("unstablemutationtoxin" = 1)
/datum/chemical_reaction/slime/slimehuman
name = "Human Mutation Toxin"
id = "humanmuttoxin"
results = list("stablemutationtoxin" = 1)
required_reagents = list("blood" = 1)
required_other = 1
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimelizard
name = "Lizard Mutation Toxin"
id = "lizardmuttoxin"
results = list("lizardmutationtoxin" = 1)
required_reagents = list("radium" = 1)
required_other = 1
required_container = /obj/item/slime_extract/green
mix_message = "<span class='info'>The mixture rapidly expands and contracts, its appearance shifting into a sickening green.</span>"
//Metal
/datum/chemical_reaction/slime/slimemetal
@@ -110,7 +116,7 @@
/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently!</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50)
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime", HOSTILE_SPAWN), 50)
/datum/chemical_reaction/slime/slimemobspawn/lesser
name = "Slime Crit Lesser"
@@ -119,7 +125,7 @@
/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently!</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", "neutral"), 50)
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50)
/datum/chemical_reaction/slime/slimemobspawn/friendly
name = "Slime Crit Friendly"
@@ -128,7 +134,7 @@
/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", "neutral"), 50)
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50)
//Silver
/datum/chemical_reaction/slime/slimebork
@@ -140,7 +146,6 @@
/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder)
//BORK BORK BORK
var/list/borks = getborks()
var/turf/T = get_turf(holder.my_atom)
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
@@ -149,7 +154,7 @@
C.flash_act()
for(var/i in 1 to 4 + rand(1,2))
var/chosen = pick(borks)
var/chosen = getbork()
var/obj/B = new chosen(T)
if(prob(5))//Fry it!
var/obj/item/reagent_containers/food/snacks/deepfryholder/fried
@@ -161,36 +166,16 @@
step(B, pick(NORTH,SOUTH,EAST,WEST))
..()
/datum/chemical_reaction/slime/slimebork/proc/getborks()
var/list/blocked = list(/obj/item/reagent_containers/food/snacks,
/obj/item/reagent_containers/food/snacks/store/bread,
/obj/item/reagent_containers/food/snacks/breadslice,
/obj/item/reagent_containers/food/snacks/store/cake,
/obj/item/reagent_containers/food/snacks/cakeslice,
/obj/item/reagent_containers/food/snacks/store,
/obj/item/reagent_containers/food/snacks/pie,
/obj/item/reagent_containers/food/snacks/kebab,
/obj/item/reagent_containers/food/snacks/pizza,
/obj/item/reagent_containers/food/snacks/pizzaslice,
/obj/item/reagent_containers/food/snacks/salad,
/obj/item/reagent_containers/food/snacks/meat,
/obj/item/reagent_containers/food/snacks/meat/slab,
/obj/item/reagent_containers/food/snacks/soup,
/obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom,
/obj/item/reagent_containers/food/snacks/deepfryholder
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
return typesof(/obj/item/reagent_containers/food/snacks) - blocked
/datum/chemical_reaction/slime/slimebork/proc/getbork()
return get_random_food()
/datum/chemical_reaction/slime/slimebork/drinks
name = "Slime Bork 2"
id = "m_tele4"
required_reagents = list("water" = 1)
/datum/chemical_reaction/slime/slimebork/drinks/getborks()
return subtypesof(/obj/item/reagent_containers/food/drinks)
/datum/chemical_reaction/slime/slimebork/drinks/getbork()
return get_random_drink()
//Blue
/datum/chemical_reaction/slime/slimefrost

View File

@@ -34,94 +34,499 @@
if(Uses)
grind_results["slimejelly"] = 20
//Effect when activated by a Luminescent. Separated into a minor and major effect. Returns cooldown in deciseconds.
/obj/item/slime_extract/proc/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
to_chat(user, "<span class='notice'>Nothing happened... This slime extract cannot be activated this way.</span>")
return 0
/obj/item/slime_extract/grey
name = "grey slime extract"
icon_state = "grey slime extract"
/obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/obj/item/reagent_containers/food/snacks/monkeycube/M = new
if(!user.put_in_active_hand(M))
M.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
to_chat(user, "<span class='notice'>You spit out a monkey cube.</span>")
return 120
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, "<span class='notice'>Your [name] starts pulsing...</span>")
if(do_after(user, 40, target = user))
var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey")
playsound(user, 'sound/effects/splat.ogg', 50, 1)
to_chat(user, "<span class='notice'>You spit out [S].</span>")
return 350
else
return 0
/obj/item/slime_extract/gold
name = "gold slime extract"
icon_state = "gold slime extract"
/obj/item/slime_extract/gold/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
user.visible_message("<span class='warning'>[user] starts shaking!</span>","<span class='notice'>Your [name] starts pulsing gently...</span>")
if(do_after(user, 40, target = user))
var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), FRIENDLY_SPAWN)
S.faction |= "neutral"
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [S]!</span>", "<span class='notice'>You spit out [S]!</span>")
return 300
if(SLIME_ACTIVATE_MAJOR)
user.visible_message("<span class='warning'>[user] starts shaking violently!</span>","<span class='warning'>Your [name] starts pulsing violently...</span>")
if(do_after(user, 50, target = user))
var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), HOSTILE_SPAWN)
if(user.a_intent != INTENT_HARM)
S.faction |= "neutral"
else
S.faction |= "slime"
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [S]!</span>", "<span class='warning'>You spit out [S]!</span>")
return 600
/obj/item/slime_extract/silver
name = "silver slime extract"
icon_state = "silver slime extract"
/obj/item/slime_extract/silver/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/food_type = get_random_food()
var/obj/O = new food_type
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 200
if(SLIME_ACTIVATE_MAJOR)
var/drink_type = get_random_drink()
var/obj/O = new drink_type
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 200
/obj/item/slime_extract/metal
name = "metal slime extract"
icon_state = "metal slime extract"
/obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/obj/item/stack/sheet/glass/O = new(null, 5)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
var/obj/item/stack/sheet/metal/O = new(null, 5)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 200
/obj/item/slime_extract/purple
name = "purple slime extract"
icon_state = "purple slime extract"
/obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
user.nutrition += 50
user.blood_volume += 50
to_chat(user, "<span class='notice'>You activate [src], and your body is refilled with fresh slime jelly!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, "<span class='notice'>You activate [src], and it releases regenerative chemicals!</span>")
user.reagents.add_reagent("tricordrazine",10)
return 600
/obj/item/slime_extract/darkpurple
name = "dark purple slime extract"
icon_state = "dark purple slime extract"
/obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/obj/item/stack/sheet/mineral/plasma/O = new(null, 1)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
var/turf/open/T = get_turf(user)
if(istype(T))
T.atmos_spawn_air("plasma=20")
to_chat(user, "<span class='warning'>You activate [src], and a cloud of plasma bursts out of your skin!</span>")
return 900
/obj/item/slime_extract/orange
name = "orange slime extract"
icon_state = "orange slime extract"
/obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='notice'>You activate [src]. You start feeling hot!</span>")
user.reagents.add_reagent("capsaicin",10)
return 150
if(SLIME_ACTIVATE_MAJOR)
user.reagents.add_reagent("phosphorus",5)//
user.reagents.add_reagent("potassium",5) // = smoke, along with any reagents inside mr. slime
user.reagents.add_reagent("sugar",5) //
to_chat(user, "<span class='warning'>You activate [src], and a cloud of smoke bursts out of your skin!</span>")
return 450
/obj/item/slime_extract/yellow
name = "yellow slime extract"
icon_state = "yellow slime extract"
/obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
if(species.glow_intensity != LUMINESCENT_DEFAULT_GLOW)
to_chat(user, "<span class='warning'>Your glow is already enhanced!</span>")
return
species.update_glow(user, 5)
addtimer(CALLBACK(species, /datum/species/jelly/luminescent.proc/update_glow, user, LUMINESCENT_DEFAULT_GLOW), 600)
to_chat(user, "<span class='notice'>You start glowing brighter.</span>")
if(SLIME_ACTIVATE_MAJOR)
user.visible_message("<span class='warning'>[user]'s skin starts flashing intermittently...</span>", "<span class='warning'>Your skin starts flashing intermittently...</span>")
if(do_after(user, 25, target = user))
empulse(user, 1, 2)
user.visible_message("<span class='warning'>[user]'s skin flashes!</span>", "<span class='warning'>Your skin flashes as you emit an electromagnetic pulse!</span>")
return 600
/obj/item/slime_extract/red
name = "red slime extract"
icon_state = "red slime extract"
/obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='notice'>You activate [src]. You start feeling fast!</span>")
user.reagents.add_reagent("ephedrine",5)
return 450
if(SLIME_ACTIVATE_MAJOR)
user.visible_message("<span class='warning'>[user]'s skin flashes red for a moment...</span>", "<span class='warning'>Your skin flashes red as you emit rage-inducing pheromones...</span>")
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null))
slime.rabid = TRUE
slime.visible_message("<span class='danger'>The [slime] is driven into a frenzy!</span>")
return 600
/obj/item/slime_extract/blue
name = "blue slime extract"
icon_state = "blue slime extract"
/obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='notice'>You activate [src]. Your genome feels more stable!</span>")
user.adjustCloneLoss(-15)
user.reagents.add_reagent("mutadone", 10)
user.reagents.add_reagent("potass_iodide", 10)
return 250
if(SLIME_ACTIVATE_MAJOR)
var/location = get_turf(user)
var/datum/effect_system/foam_spread/s = new()
s.set_up(20, location, user.reagents)
s.start()
user.reagents.clear_reagents()
user.visible_message("<span class='danger'>Foam spews out from [user]'s skin!</span>", "<span class='warning'>You activate [src], and foam bursts out of your skin!</span>")
return 600
/obj/item/slime_extract/darkblue
name = "dark blue slime extract"
icon_state = "dark blue slime extract"
/obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='notice'>You activate [src]. You start feeling colder!</span>")
user.ExtinguishMob()
user.adjust_fire_stacks(-20)
user.reagents.add_reagent("frostoil",5)
user.reagents.add_reagent("cryoxadone",5)
return 100
if(SLIME_ACTIVATE_MAJOR)
var/turf/open/T = get_turf(user)
if(istype(T))
T.atmos_spawn_air("nitrogen=40;TEMP=2.7")
to_chat(user, "<span class='warning'>You activate [src], and icy air bursts out of your skin!</span>")
return 900
/obj/item/slime_extract/pink
name = "pink slime extract"
icon_state = "pink slime extract"
/obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
if(user.gender != MALE && user.gender != FEMALE)
to_chat(user, "<span class='warning'>You can't swap your gender!</span>")
return
if(user.gender == MALE)
user.gender = FEMALE
user.visible_message("<span class='boldnotice'>[user] suddenly looks more feminine!</span>", "<span class='boldwarning'>You suddenly feel more feminine!</span>")
else
user.gender = MALE
user.visible_message("<span class='boldnotice'>[user] suddenly looks more masculine!</span>", "<span class='boldwarning'>You suddenly feel more masculine!</span>")
return 100
if(SLIME_ACTIVATE_MAJOR)
user.visible_message("<span class='warning'>[user]'s skin starts flashing hypnotically...</span>", "<span class='notice'>Your skin starts forming odd patterns, pacifying creatures around you.</span>")
for(var/mob/living/carbon/C in viewers(user, null))
if(C != user)
C.reagents.add_reagent("pax",2)
return 600
/obj/item/slime_extract/green
name = "green slime extract"
icon_state = "green slime extract"
/obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='warning'>You feel yourself reverting to human form...</span>")
if(do_after(user, 120, target = user))
to_chat(user, "<span class='warning'>You feel human again!</span>")
user.set_species(/datum/species/human)
return
to_chat(user, "<span class='notice'>You stop the transformation.</span>")
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, "<span class='warning'>You feel yourself radically changing your slime type...</span>")
if(do_after(user, 120, target = user))
to_chat(user, "<span class='warning'>You feel different!</span>")
user.set_species(pick(/datum/species/jelly/slime, /datum/species/jelly/stargazer))
return
to_chat(user, "<span class='notice'>You stop the transformation.</span>")
/obj/item/slime_extract/lightpink
name = "light pink slime extract"
icon_state = "light pink slime extract"
/obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/obj/item/slimepotion/docility/O = new(null, 1)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
var/obj/item/slimepotion/sentience/O = new(null, 1)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 450
/obj/item/slime_extract/black
name = "black slime extract"
icon_state = "black slime extract"
/obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='userdanger'>You feel something <i>wrong</i> inside you...</span>")
user.ForceContractDisease(new /datum/disease/transformation/slime(0))
return 100
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, "<span class='warning'>You feel your own light turning dark...</span>")
if(do_after(user, 120, target = user))
to_chat(user, "<span class='warning'>You feel a longing for darkness.</span>")
user.set_species(pick(/datum/species/shadow))
return
to_chat(user, "<span class='notice'>You stop feeding [src].</span>")
/obj/item/slime_extract/oil
name = "oil slime extract"
icon_state = "oil slime extract"
/obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='warning'>You vomit slippery oil.</span>")
playsound(user, 'sound/effects/splat.ogg', 50, 1)
new /obj/effect/decal/cleanable/oil/slippery(get_turf(user))
return 450
if(SLIME_ACTIVATE_MAJOR)
user.visible_message("<span class='warning'>[user]'s skin starts pulsing and glowing ominously...</span>", "<span class='userdanger'>You feel unstable...</span>")
if(do_after(user, 60, target = user))
to_chat(user, "<span class='userdanger'>You explode!</span>")
explosion(get_turf(user), 1 ,3, 6)
user.gib()
return
to_chat(user, "<span class='notice'>You stop feeding [src], and the feeling passes.</span>")
/obj/item/slime_extract/adamantine
name = "adamantine slime extract"
icon_state = "adamantine slime extract"
/obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
if(species.armor > 0)
to_chat(user, "<span class='warning'>Your skin is already hardened!</span>")
return
to_chat(user, "<span class='notice'>You feel your skin harden and become more resistant.</span>")
species.armor += 25
addtimer(CALLBACK(src, .proc/reset_armor, species), 1200)
return 450
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, "<span class='warning'>You feel your body rapidly crystallizing...</span>")
if(do_after(user, 120, target = user))
to_chat(user, "<span class='warning'>You feel solid.</span>")
user.set_species(pick(/datum/species/golem/adamantine))
return
to_chat(user, "<span class='notice'>You stop feeding [src], and your body returns to its slimelike state.</span>")
/obj/item/slime_extract/adamantine/proc/reset_armor(datum/species/jelly/luminescent/species)
if(istype(species))
species.armor -= 25
/obj/item/slime_extract/bluespace
name = "bluespace slime extract"
icon_state = "bluespace slime extract"
var/teleport_ready = FALSE
var/teleport_x = 0
var/teleport_y = 0
var/teleport_z = 0
/obj/item/slime_extract/bluespace/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "<span class='warning'>You feel your body vibrating...</span>")
if(do_after(user, 25, target = user))
to_chat(user, "<span class='warning'>You teleport!</span>")
do_teleport(user, get_turf(user), 6, asoundin = 'sound/weapons/emitter2.ogg')
return 300
if(SLIME_ACTIVATE_MAJOR)
if(!teleport_ready)
to_chat(user, "<span class='notice'>You feel yourself anchoring to this spot...</span>")
var/turf/T = get_turf(user)
teleport_x = T.x
teleport_y = T.y
teleport_z = T.z
teleport_ready = TRUE
else
teleport_ready = FALSE
if(teleport_x && teleport_y && teleport_z)
var/turf/T = locate(teleport_x, teleport_y, teleport_z)
to_chat(user, "<span class='notice'>You snap back to your anchor point!</span>")
do_teleport(user, T, asoundin = 'sound/weapons/emitter2.ogg')
return 450
/obj/item/slime_extract/pyrite
name = "pyrite slime extract"
icon_state = "pyrite slime extract"
/obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan)))
var/obj/item/O = new chosen(null)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
var/chosen = pick(subtypesof(/obj/item/toy/crayon/spraycan))
var/obj/item/O = new chosen(null)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 250
/obj/item/slime_extract/cerulean
name = "cerulean slime extract"
icon_state = "cerulean slime extract"
/obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
user.reagents.add_reagent("salbutamol",15)
to_chat(user, "<span class='notice'>You feel like you don't need to breathe!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
var/turf/open/T = get_turf(user)
if(istype(T))
T.atmos_spawn_air("o2=11;n2=41;TEMP=293.15")
to_chat(user, "<span class='warning'>You activate [src], and fresh air bursts out of your skin!</span>")
return 600
/obj/item/slime_extract/sepia
name = "sepia slime extract"
icon_state = "sepia slime extract"
/obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
var/obj/item/device/camera/O = new(null, 1)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 150
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, "<span class='warning'>You feel time slow down...</span>")
if(do_after(user, 30, target = user))
new /obj/effect/timestop(get_turf(user), 2, 50, list(user))
return 900
/obj/item/slime_extract/rainbow
name = "rainbow slime extract"
icon_state = "rainbow slime extract"
/obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
user.dna.features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
user.updateappearance(mutcolor_update=1)
species.update_glow(user)
to_chat(user, "<span class='notice'>You feel different...</span>")
return 100
if(SLIME_ACTIVATE_MAJOR)
var/chosen = pick(subtypesof(/obj/item/slime_extract))
var/obj/item/O = new chosen(null)
if(!user.put_in_active_hand(O))
O.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] spits out [O]!</span>", "<span class='notice'>You spit out [O]!</span>")
return 150
////Slime-derived potions///
/obj/item/slimepotion

View File

@@ -478,8 +478,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
perform(targets,user=user)
/obj/effect/proc_holder/spell/proc/updateButtonIcon()
action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/updateButtonIcon(status_only, force)
action.UpdateButtonIcon(status_only, force)
/obj/effect/proc_holder/spell/proc/can_be_cast_by(mob/caster)
if((human_req || clothes_req) && !ishuman(caster))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 38 KiB