mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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))
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
@@ -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>")
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 //////////////////////////////////////////
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 |
Reference in New Issue
Block a user