This commit is contained in:
izac112
2022-03-27 22:29:40 +02:00
30 changed files with 2447 additions and 300 deletions
+249
View File
@@ -566,3 +566,252 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
var/global/list/weavable_structures = list()
var/global/list/weavable_items = list()
var/global/list/xenobio_metal_materials_normal = list(
/obj/item/stack/material/steel = 20,
/obj/item/stack/material/glass = 15,
/obj/item/stack/material/plastic = 12,
/obj/item/stack/material/wood = 12,
/obj/item/stack/material/cardboard = 6,
/obj/item/stack/material/sandstone = 5,
/obj/item/stack/material/log = 5,
/obj/item/stack/material/lead = 5,
/obj/item/stack/material/iron = 5,
/obj/item/stack/material/graphite = 5,
/obj/item/stack/material/copper = 4,
/obj/item/stack/material/tin = 4,
/obj/item/stack/material/bronze = 4,
/obj/item/stack/material/aluminium = 4)
var/global/list/xenobio_metal_materials_adv = list(
/obj/item/stack/material/glass/reinforced = 15,
/obj/item/stack/material/marble = 10,
/obj/item/stack/material/plasteel = 10,
/obj/item/stack/material/glass/phoronglass = 10,
/obj/item/stack/material/wood/sif = 5,
/obj/item/stack/material/wood/hard = 5,
/obj/item/stack/material/log/sif = 5,
/obj/item/stack/material/log/hard = 5,
/obj/item/stack/material/glass/phoronrglass = 5,
/obj/item/stack/material/glass/titanium = 3,
/obj/item/stack/material/glass/plastitanium = 3,
/obj/item/stack/material/durasteel = 2,
/obj/item/stack/material/painite = 1,
/obj/item/stack/material/void_opal = 1,
/obj/item/stack/material/quartz = 1)
var/global/list/xenobio_metal_materials_weird = list(
/obj/item/stack/material/cloth = 10,
/obj/item/stack/material/leather = 5,
/obj/item/stack/material/fiber = 5,
/obj/item/stack/material/fur/wool = 7,
/obj/item/stack/material/snow = 3,
/obj/item/stack/material/snowbrick = 3,
/obj/item/stack/material/flint = 3,
/obj/item/stack/material/stick = 3,
/obj/item/stack/material/chitin = 1)
var/global/list/xenobio_silver_materials_basic = list(
/obj/item/stack/material/silver = 10,
/obj/item/stack/material/uranium = 8,
/obj/item/stack/material/gold = 6,
/obj/item/stack/material/titanium = 4,
/obj/item/stack/material/phoron = 1)
var/global/list/xenobio_silver_materials_adv = list(
/obj/item/stack/material/deuterium = 5,
/obj/item/stack/material/tritium = 5,
/obj/item/stack/material/osmium = 5,
/obj/item/stack/material/mhydrogen = 3,
/obj/item/stack/material/diamond = 2,
/obj/item/stack/material/verdantium = 1)
var/global/list/xenobio_silver_materials_special = list(
/obj/item/stack/material/valhollide = 1,
/obj/item/stack/material/morphium = 1,
/obj/item/stack/material/supermatter = 1)
var/global/list/xenobio_gold_mobs_hostile = list(
/mob/living/simple_mob/vore/alienanimals/space_jellyfish,
/mob/living/simple_mob/vore/alienanimals/skeleton,
/mob/living/simple_mob/vore/alienanimals/space_ghost,
/mob/living/simple_mob/vore/alienanimals/startreader,
/mob/living/simple_mob/animal/passive/mouse/operative,
/mob/living/simple_mob/animal/giant_spider,
/mob/living/simple_mob/animal/giant_spider/frost,
/mob/living/simple_mob/animal/giant_spider/electric,
/mob/living/simple_mob/animal/giant_spider/hunter,
/mob/living/simple_mob/animal/giant_spider/lurker,
/mob/living/simple_mob/animal/giant_spider/pepper,
/mob/living/simple_mob/animal/giant_spider/thermic,
/mob/living/simple_mob/animal/giant_spider/tunneler,
/mob/living/simple_mob/animal/giant_spider/webslinger,
/mob/living/simple_mob/animal/giant_spider/phorogenic,
/mob/living/simple_mob/animal/giant_spider/carrier,
/mob/living/simple_mob/animal/giant_spider/nurse,
/mob/living/simple_mob/animal/giant_spider/ion,
/mob/living/simple_mob/animal/giant_spider/nurse/queen,
/mob/living/simple_mob/animal/sif/diyaab,
/mob/living/simple_mob/animal/sif/duck,
/mob/living/simple_mob/animal/sif/frostfly,
/mob/living/simple_mob/animal/sif/glitterfly,
/mob/living/simple_mob/animal/sif/hooligan_crab,
/mob/living/simple_mob/animal/sif/kururak,
/mob/living/simple_mob/animal/sif/leech,
/mob/living/simple_mob/animal/sif/tymisian,
/mob/living/simple_mob/animal/sif/sakimm,
/mob/living/simple_mob/animal/sif/savik,
/mob/living/simple_mob/animal/sif/shantak,
/mob/living/simple_mob/animal/sif/siffet,
/mob/living/simple_mob/animal/space/alien,
/mob/living/simple_mob/animal/space/alien/drone,
/mob/living/simple_mob/animal/space/alien/sentinel,
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,
/mob/living/simple_mob/animal/space/alien/queen,
/mob/living/simple_mob/animal/space/alien/queen/empress,
/mob/living/simple_mob/animal/space/alien/queen/empress/mother,
/mob/living/simple_mob/animal/space/bats,
/mob/living/simple_mob/animal/space/bear,
/mob/living/simple_mob/animal/space/carp,
/mob/living/simple_mob/animal/space/carp/large,
/mob/living/simple_mob/animal/space/carp/large/huge,
/mob/living/simple_mob/animal/space/goose,
/mob/living/simple_mob/creature,
/mob/living/simple_mob/faithless,
/mob/living/simple_mob/tomato,
/mob/living/simple_mob/animal/space/tree,
/mob/living/simple_mob/vore/aggressive/corrupthound,
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi,
/mob/living/simple_mob/vore/aggressive/deathclaw,
/mob/living/simple_mob/vore/aggressive/dino,
/mob/living/simple_mob/vore/aggressive/dragon,
/mob/living/simple_mob/vore/aggressive/frog,
/mob/living/simple_mob/otie,
/mob/living/simple_mob/otie/red,
/mob/living/simple_mob/vore/aggressive/panther,
/mob/living/simple_mob/vore/aggressive/rat,
/mob/living/simple_mob/vore/aggressive/giant_snake,
/mob/living/simple_mob/vore/sect_drone,
/mob/living/simple_mob/vore/sect_queen,
/mob/living/simple_mob/vore/weretiger,
/mob/living/simple_mob/animal/wolf,
/mob/living/simple_mob/vore/xeno_defanged)
var/global/list/xenobio_gold_mobs_bosses = list(
/mob/living/simple_mob/animal/giant_spider/broodmother,
/mob/living/simple_mob/vore/leopardmander,
/mob/living/simple_mob/vore/leopardmander/blue,
/mob/living/simple_mob/vore/leopardmander/exotic,
/mob/living/simple_mob/vore/greatwolf,
/mob/living/simple_mob/vore/greatwolf/black,
/mob/living/simple_mob/vore/greatwolf/grey,
/mob/living/simple_mob/vore/bigdragon)
var/global/list/xenobio_gold_mobs_safe = list(
/mob/living/simple_mob/vore/alienanimals/dustjumper,
/mob/living/simple_mob/vore/alienanimals/teppi,
/mob/living/simple_mob/animal/passive/chicken,
/mob/living/simple_mob/animal/passive/cow,
/mob/living/simple_mob/animal/goat,
/mob/living/simple_mob/animal/passive/crab,
/mob/living/simple_mob/animal/passive/mouse/jerboa,
/mob/living/simple_mob/animal/passive/lizard,
/mob/living/simple_mob/animal/passive/lizard/large,
/mob/living/simple_mob/animal/passive/yithian,
/mob/living/simple_mob/animal/passive/tindalos,
/mob/living/simple_mob/animal/passive/mouse,
/mob/living/simple_mob/animal/passive/penguin,
/mob/living/simple_mob/animal/passive/opossum,
/mob/living/simple_mob/animal/passive/cat,
/mob/living/simple_mob/animal/passive/dog/corgi,
/mob/living/simple_mob/animal/passive/dog/void_puppy,
/mob/living/simple_mob/animal/passive/dog/bullterrier,
/mob/living/simple_mob/animal/passive/dog/tamaskan,
/mob/living/simple_mob/animal/passive/dog/brittany,
/mob/living/simple_mob/animal/passive/fox,
/mob/living/simple_mob/animal/passive/fox/syndicate,
/mob/living/simple_mob/animal/passive/hare,
/mob/living/simple_mob/animal/passive/pillbug,
/mob/living/simple_mob/animal/passive/gaslamp,
/mob/living/simple_mob/animal/passive/snake,
/mob/living/simple_mob/animal/passive/snake/red,
/mob/living/simple_mob/animal/passive/snake/python,
/mob/living/simple_mob/vore/bee,
/mob/living/simple_mob/vore/fennec,
/mob/living/simple_mob/vore/fennix,
/mob/living/simple_mob/vore/hippo,
/mob/living/simple_mob/vore/horse,
/mob/living/simple_mob/animal/space/jelly,
/mob/living/simple_mob/vore/oregrub,
/mob/living/simple_mob/vore/oregrub/lava,
/mob/living/simple_mob/vore/rabbit,
/mob/living/simple_mob/vore/redpanda,
/mob/living/simple_mob/vore/sheep,
/mob/living/simple_mob/vore/solargrub)
var/global/list/xenobio_gold_mobs_birds = list(/mob/living/simple_mob/animal/passive/bird/black_bird,
/mob/living/simple_mob/animal/passive/bird/azure_tit,
/mob/living/simple_mob/animal/passive/bird/european_robin,
/mob/living/simple_mob/animal/passive/bird/goldcrest,
/mob/living/simple_mob/animal/passive/bird/ringneck_dove,
/mob/living/simple_mob/animal/passive/bird/parrot,
/mob/living/simple_mob/animal/passive/bird/parrot/kea,
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus,
/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot,
/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique,
/mob/living/simple_mob/animal/passive/bird/parrot/white_caique,
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar,
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue,
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen,
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel,
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white,
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish,
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey,
/mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo,
/mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo,
/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo) //There's too dang many
var/global/list/xenobio_cerulean_potions = list(
/obj/item/slimepotion/enhancer,
/obj/item/slimepotion/stabilizer,
/obj/item/slimepotion/mutator,
/obj/item/slimepotion/docility,
/obj/item/slimepotion/steroid,
/obj/item/slimepotion/unity,
/obj/item/slimepotion/loyalty,
/obj/item/slimepotion/friendship,
/obj/item/slimepotion/feeding,
/obj/item/slimepotion/infertility,
/obj/item/slimepotion/fertility,
/obj/item/slimepotion/shrink,
/obj/item/slimepotion/death,
/obj/item/slimepotion/ferality,
/obj/item/slimepotion/reinvigoration,
/obj/item/slimepotion/mimic,
/obj/item/slimepotion/sapience,
/obj/item/slimepotion/obedience)
var/global/list/xenobio_rainbow_extracts = list(
/obj/item/slime_extract/grey = 2,
/obj/item/slime_extract/metal = 3,
/obj/item/slime_extract/blue = 3,
/obj/item/slime_extract/purple = 1,
/obj/item/slime_extract/orange = 3,
/obj/item/slime_extract/yellow = 3,
/obj/item/slime_extract/gold = 3,
/obj/item/slime_extract/silver = 3,
/obj/item/slime_extract/dark_purple = 2,
/obj/item/slime_extract/dark_blue = 3,
/obj/item/slime_extract/red = 3,
/obj/item/slime_extract/green = 3,
/obj/item/slime_extract/pink = 3,
/obj/item/slime_extract/oil = 3,
/obj/item/slime_extract/bluespace = 3,
/obj/item/slime_extract/cerulean = 1,
/obj/item/slime_extract/amber = 3,
/obj/item/slime_extract/sapphire = 3,
/obj/item/slime_extract/ruby = 3,
/obj/item/slime_extract/emerald = 3,
/obj/item/slime_extract/light_pink = 1,
/obj/item/slime_extract/rainbow = 1)
@@ -486,30 +486,3 @@
light_range = 8
light_power = 0.1
light_color = "#49F37C"
/*
* Slime Extract
*/
/obj/item/device/flashlight/slime
gender = PLURAL
name = "glowing slime extract"
desc = "A slimy ball that appears to be glowing from bioluminesence."
icon = 'icons/obj/lighting.dmi'
icon_state = "floor1" //not a slime extract sprite but... something close enough!
item_state = "slime"
light_color = "#FFF423"
w_class = ITEMSIZE_TINY
light_range = 6
on = 1 //Bio-luminesence has one setting, on.
power_use = 0
/obj/item/device/flashlight/slime/New()
..()
set_light(light_range, light_power, light_color)
/obj/item/device/flashlight/slime/update_brightness()
return
/obj/item/device/flashlight/slime/attack_self(mob/user)
return //Bio-luminescence does not toggle.
@@ -1,6 +1,7 @@
/obj/item/weapon/material/butterfly
name = "butterfly knife"
desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket."
description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave.
icon_state = "butterflyknife"
item_state = null
hitsound = null
@@ -63,6 +64,7 @@
icon = 'icons/obj/kitchen.dmi'
icon_state = "knife"
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave.
sharp = TRUE
edge = TRUE
force_divisor = 0.15 // 9 when wielded with hardness 60 (steel)
@@ -4,6 +4,7 @@
/obj/item/weapon/tool/screwdriver
name = "screwdriver"
desc = "You can be totally screwwy with this."
description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave.
icon = 'icons/obj/tools.dmi'
icon_state = "screwdriver"
center_of_mass = list("x" = 13,"y" = 7)
@@ -4,6 +4,7 @@
/obj/item/weapon/tool/wirecutters
name = "wirecutters"
desc = "This cuts wires."
description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave.
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
item_state = "cutters"
+3 -1
View File
@@ -8,13 +8,15 @@
if(L.a_intent != I_HELP)
attack_tile(C, L) // Be on help intent if you want to decon something.
return
/*
//By god, no I do NOT want to engrave when trying to cut wires, can't get this working with non-help intent either else you just swipe the tools over the floors.
if(!(C.has_tool_quality(TOOL_SCREWDRIVER) && flooring && (flooring.flags & TURF_REMOVE_SCREWDRIVER)))
if(isliving(user))
var/mob/living/L = user
if(L.a_intent == I_HELP)
if(try_graffiti(L, C)) // back by unpopular demand
return
*/
// Multi-z roof building
if(istype(C, /obj/item/stack/tile/roofing))
@@ -131,9 +131,12 @@
user.setClickCooldown(user.get_attack_speed(W))
/*
//As with the floors, only this time it works AND tries pushing the wall after it's done.
if(!construction_stage && user.a_intent == I_HELP)
if(try_graffiti(user,W))
return
*/
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
@@ -76,6 +76,10 @@
if(amount > 0)
if(rabid)
return
if(my_slime.untamable)
holder.say("Grrr...")
holder.add_modifier(/datum/modifier/berserk, 30 SECONDS)
enrage()
var/justified = my_slime.is_justified_to_discipline() // This will also consider the AI-side of that proc.
remove_target() // Stop attacking.
@@ -95,13 +99,6 @@
discipline = between(0, discipline + amount, 10)
my_slime.update_mood()
// This slime always enrages if disciplined.
/datum/ai_holder/simple_mob/xenobio_slime/red/adjust_discipline(amount, silent)
if(amount > 0 && !rabid)
holder.say("Grrr...")
holder.add_modifier(/datum/modifier/berserk, 30 SECONDS)
enrage()
/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical()
discipline_decay()
@@ -145,6 +142,16 @@
my_slime.update_mood()
my_slime.visible_message(span("danger", "\The [my_slime] enrages!"))
// Called to relax from being rabid (when blue slime core was used).
/datum/ai_holder/simple_mob/xenobio_slime/proc/relax()
var/mob/living/simple_mob/slime/xenobio/my_slime = holder
if(my_slime.harmless)
return
if(rabid)
rabid = FALSE
my_slime.update_mood()
my_slime.visible_message(span("danger", "\The [my_slime] calms down."))
// Called when using a pacification agent (or it's Kendrick being initalized).
/datum/ai_holder/simple_mob/xenobio_slime/proc/pacify()
remove_target() // So it stops trying to kill them.
@@ -278,3 +278,113 @@
/obj/item/weapon/holder/catslug/Initialize(mapload, mob/held)
. = ..()
color = held.color
/datum/category_item/catalogue/fauna/catslug/spaceslug
name = "Alien Wildlife - Catslug - Miros"
desc = "This catslug serves as the Fuel Depots resident attendant,\
despite the facility being fully automated and self-serve. - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_MEDIUM //Should offer a measure of incentive for people to visit the depot more often.
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug
name = "Miros"
desc = "Looks like catslugs can into space after all! This little chap seems to have gotten their mitts on a tiny spacesuit, there's a nametag on it that reads \"Miros\" alongside the Aether Atmospherics logo."
tt_desc = "Mollusca Felis Stellaris"
icon_state = "spaceslug"
icon_living = "spaceslug"
icon_rest = "spaceslug_rest"
icon_dead = "spaceslug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/spaceslug)
holder_type = /obj/item/weapon/holder/catslug/spaceslug
makes_dirt = 0
say_list_type = /datum/say_list/catslug/spaceslug
minbodytemp = 0 // Shamelessly stolen temp & atmos tolerances from the space cat.
maxbodytemp = 900
heat_damage_per_tick = 3
cold_damage_per_tick = 2
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
player_msg = "You are an intelligent creature capable of more than most think, clad in a spacesuit that protects you from the ravages of vacuum and hostile atmospheres alike. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>"
has_langs = list("Sign Language")
/datum/say_list/catslug/spaceslug
speak = list("Have any porl?", "What is that?", "What kind of ship is that?", "What are you doing?", "How did you get here?", "Don't take off your helmet.", "SPAAAAAACE!", "WAOW!", "Nice weather we're having, isn't it?")
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD)
return ..()
if(M.a_intent != I_HELP)
return ..()
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(resting)
M.visible_message("<span class='notice'>\The [M.name] shakes \the [src] awake from their nap.</span>","<span class='notice'>You shake \the [src] awake!</span>")
lay_down()
ai_holder.go_wake()
return
if(M.zone_sel.selecting == BP_HEAD)
M.visible_message( \
"<span class='notice'>[M] pats \the [src] on their helmet.</span>", \
"<span class='notice'>You pat \the [src] on their helmet.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src] purrs and leans into [M]'s hand.</span>")
else if(M.zone_sel.selecting == BP_R_HAND || M.zone_sel.selecting == BP_L_HAND)
M.visible_message( \
"<span class='notice'>[M] shakes \the [src]'s hand.</span>", \
"<span class='notice'>You shake \the [src]'s hand.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s looks a little confused and bonks their helmet's faceplate against [M]'s hand experimentally, attempting to nibble at it.</span>")
else if(M.zone_sel.selecting == "mouth")
M.visible_message( \
"<span class='notice'>[M] attempts to boop \the [src]'s nose, defeated only by the helmet they wear.</span>", \
"<span class='notice'>You attempt to boop \the [src] on the nose, stopped only by that helmet they wear.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s eyes widen as they stare at [M]. After a moment they rub at the faint mark [M]'s digit left upon the surface of their helmet's faceplate.</span>")
else if(M.zone_sel.selecting == BP_GROIN)
M.visible_message( \
"<span class='notice'>[M] rubs \the [src]'s tummy...</span>", \
"<span class='notice'>You rub \the [src]'s tummy, accidently pressing a few of the buttons on their chestpiece in the process... You feel the danger.</span>", )
if(client)
return
visible_message("<span class='notice'>\The [src] pushes [M]'s hand away from their tummy and furrows their brow, frantically pressing at the buttons [M] so carelessly pushed!</span>")
if(prob(5))
ai_holder.target = M
ai_holder.track_target_position()
ai_holder.set_stance(STANCE_FIGHT)
else
return ..()
/obj/item/weapon/holder/catslug/spaceslug
item_state = "spaceslug"
@@ -439,15 +439,16 @@
/mob/living/simple_mob/slime/xenobio/amber
)
/* VOREStation Edit. We've had enough server crashes.
/mob/living/simple_mob/slime/xenobio/amber/handle_special()
if(stat != DEAD)
feed_aura()
..()
/mob/living/simple_mob/slime/xenobio/amber/proc/feed_aura()
for(var/mob/living/L in view(2, src))
if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers.
for(var/mob/living/L in view(1, src))
if(L.stat == DEAD || !IIsAlly(L))
continue
if(L == src || istype(L, /mob/living/simple_mob/slime/xenobio/amber)) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers.
continue
if(istype(L, /mob/living/simple_mob/slime/xenobio))
var/mob/living/simple_mob/slime/xenobio/X = L
@@ -457,7 +458,6 @@
if(H.isSynthetic())
continue
H.nutrition = between(0, H.nutrition + rand(15, 25), 800)
*/
/mob/living/simple_mob/slime/xenobio/cerulean
desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none."
@@ -489,6 +489,7 @@
slime_color = "red"
coretype = /obj/item/slime_extract/red
movement_cooldown = 0 // See above.
untamable = TRUE // Will enrage if disciplined.
description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk."
@@ -499,7 +500,7 @@
/mob/living/simple_mob/slime/xenobio/orange
)
ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined.
ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime
/mob/living/simple_mob/slime/xenobio/green
@@ -11,6 +11,9 @@
var/mob/living/victim = null // the person the slime is currently feeding on
var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly.
var/mutation_chance = 25 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes.
var/split_amount = 4 // Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations.
var/untamable = FALSE //Makes slime untamable via discipline.
var/untamable_inheirit = FALSE //Makes slime inheirit its untamability.
var/list/slime_mutation = list(
/mob/living/simple_mob/slime/xenobio/orange,
/mob/living/simple_mob/slime/xenobio/metal,
@@ -54,7 +57,6 @@
AI.resentment = max(previous_AI.resentment - 1, 0)
AI.rabid = previous_AI.rabid
/mob/living/simple_mob/slime/xenobio/update_icon()
icon_living = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"][victim ? " eating" : ""]"
icon_dead = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead"
@@ -107,6 +109,21 @@
update_icon()
update_name()
/mob/living/simple_mob/slime/xenobio/proc/make_baby()
if(!is_adult)
return
is_adult = FALSE
melee_damage_lower = round(melee_damage_lower / 2) // 20
melee_damage_upper = round(melee_damage_upper / 2) // 30
maxHealth = initial(maxHealth)
health = clamp(health, 0, maxHealth)
max_nutrition = initial(max_nutrition)
nutrition = 400
amount_grown = 0
update_icon()
update_name()
/mob/living/simple_mob/slime/xenobio/proc/update_name()
if(harmless) // Docile slimes are generally named, so we shouldn't mess with it.
return
@@ -142,6 +159,13 @@
var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder
AI.enrage()
/mob/living/simple_mob/slime/xenobio/proc/relax()
if(harmless)
return
if(has_AI())
var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder
AI.relax()
/mob/living/simple_mob/slime/xenobio/proc/pacify()
harmless = TRUE
if(has_AI())
@@ -208,12 +232,12 @@
if(free)
free_tiles++
if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies.
if(free_tiles < split_amount-1) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies.
to_chat(src, span("warning", "It is too cramped here to reproduce..."))
return
var/list/babies = list()
for(var/i = 1 to 4)
for(var/i = 1 to split_amount)
babies.Add(make_new_slime())
var/mob/living/simple_mob/slime/new_slime = pick(babies)
@@ -245,6 +269,9 @@
if(!istype(baby, /mob/living/simple_mob/slime/xenobio/rainbow))
baby.unity = unity
if(untamable_inheirit)
baby.untamable = untamable
baby.untamable_inheirit = untamable_inheirit
baby.faction = faction
baby.friends = friends.Copy()
@@ -204,240 +204,17 @@
required_reagents = list("plantcolony" = 5, "virusfood" = 5)
result_amount = 60
///////////////////////////////////////////////////////////////////////////////////
/// Upstream Adjustments
/decl/chemical_reaction/instant/biomass
result_amount = 6 // Roughly 120u per phoron sheet
///////////////////////////////
//SLIME CORES BELOW HERE///////
//SLIME-RELATED BELOW HERE///////
///////////////////////////////
/decl/chemical_reaction/instant/slime_food
name = "Slime Bork"
id = "m_tele2"
result = null
required_reagents = list("phoron" = 10, "slimejelly" = 5, "nutriment" = 20)
result_amount = 1
/decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder)
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
var/obj/B = new chosen
if(B)
B.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
/decl/chemical_reaction/instant/materials
name = "Slime materials"
id = "slimematerial"
result = null
required_reagents = list("phoron" = 20, "slimejelly" = 40, "aluminum" = 20) //Woah there! You have the possibility of making diamonds! 8 ground up slimes required for one of these, and you still have a 10% chance for it to fail.
result_amount = 1
/decl/chemical_reaction/instant/materials/on_reaction(var/datum/reagents/holder)
var/fail_chance = rand(1,1000)
if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials.
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='warning'>The solution begins to vibrate violently!</span>"), 1) // It was at this moment, the Xenobiologist knew... he fucked up.
sleep(30)
playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1)
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='warning'>The reaction begins to rapidly sizzle and swell outwards!</span>"), 1)
sleep(20)
explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person.
empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast!
return
if(fail_chance < 101) // 10% chance of it not working at all.
playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1)
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='warning'>The slime core fizzles disappointingly.</span>"), 1)
return
var/blocked = list(
/obj/item/stack/material, //Technical stacks
/obj/item/stack/hairlesshide, //Useless leather production steps
/obj/item/stack/wetleather,
/obj/item/stack/material/algae/ten) //Why is this one even a separate thing
blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
var/rare_types = list(
/obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
/obj/item/stack/material/morphium/hull,
/obj/item/stack/material/valhollide,
/obj/item/stack/material/supermatter)
var/list/material = typesof(/obj/item/stack/material) - blocked
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
var/spawn_amount = rand(1,50)
var/chosen = pick(material)
if(chosen in rare_types)
spawn_amount = rand(1,15)
new chosen(get_turf(holder.my_atom), spawn_amount)
/decl/chemical_reaction/instant/slimelight
name = "Slime Glow"
id = "m_glow"
result = null
required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 10) //Takes 10 water so it doesn't mess with the frost oil.
result_amount = 1
/decl/chemical_reaction/instant/slimelight/on_reaction(var/datum/reagents/holder)
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='warning'> The contents of the slime core harden and begin to emit a warm, bright light.</span>"), 1)
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
F.loc = get_turf(holder.my_atom)
/decl/chemical_reaction/instant/slimephoron
name = "Slime Phoron"
id = "m_plasma"
result = null
required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20)
result_amount = 1
/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder)
new /obj/item/stack/material/phoron(get_turf(holder.my_atom), 10)
/decl/chemical_reaction/instant/slimefreeze
name = "Slime Freeze"
id = "m_freeze"
result = null
required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10)
result_amount = 1
/decl/chemical_reaction/instant/slimefreeze/on_reaction(var/datum/reagents/holder)
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
sleep(50)
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
M.bodytemperature -= 140
to_chat(M, "<span class='notice'> You suddenly feel a chill!</span>")
/decl/chemical_reaction/instant/slimefrost
name = "Slime Frost Oil"
id = "m_frostoil"
result = "frostoil"
required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5)
result_amount = 10
/decl/chemical_reaction/instant/slimefire
name = "Slime fire"
id = "m_fire"
result = null
required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30)
result_amount = 1
/decl/chemical_reaction/instant/slimefire/on_reaction(var/datum/reagents/holder)
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
sleep(50)
var/turf/location = get_turf(holder.my_atom.loc)
for(var/turf/simulated/floor/target_tile in range(0,location))
target_tile.assume_gas("phoron", 25, 1400)
spawn (0) target_tile.hotspot_expose(700, 400)
/decl/chemical_reaction/instant/slimeify
name = "Advanced Mutation Toxin"
id = "advmutationtoxin2"
result = "advmutationtoxin"
required_reagents = list("phoron" = 15, "slimejelly" = 15, "mutationtoxin" = 15) //In case a xenobiologist wants to become a fully fledged slime person.
result_amount = 1
/decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not.
name = "Slime Health"
id = "slimeheal"
result = "null"
required_reagents = list("phoron" = 10, "bicaridine" = 10, "kelotane" = 10, "inaprovaline" = 10, "slimejelly" = 10)
/decl/chemical_reaction/instant/slimeheal/on_reaction(var/datum/reagents/holder, var/created_volume)
for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
to_chat(C, "<span class='notice'>A wave of energy suddenly invigorates you.</span>")
C.adjustBruteLoss(-25)
C.adjustFireLoss(-25)
C.adjustToxLoss(-25)
C.adjustOxyLoss(-25)
C.adjustBrainLoss(-25)
C.adjustCloneLoss(-25)
C.updatehealth()
/decl/chemical_reaction/instant/slimejelly
name = "Slime Jam"
id = "m_jam"
result = "slimejelly"
required_reagents = list("phoron" = 20, "sugar" = 50, "lithium" = 50) //In case a xenobiologist is impatient and is willing to drain their dispenser resources, along with plasma!
result_amount = 5
/decl/chemical_reaction/instant/slimevore
name = "Slime Vore" // Hostile vore mobs only
id = "m_tele"
result = null
required_reagents = list("phoron" = 20, "nutriment" = 20, "sugar" = 20, "mutationtoxin" = 20) //Can't do slime jelly as it'll conflict with another, but mutation toxin will do.
result_amount = 1
/decl/chemical_reaction/instant/slimevore/on_reaction(var/datum/reagents/holder)
var/mob_path = /mob/living/simple_mob
var/blocked = list( //List of things we do NOT want to spawn
/mob/living/simple_mob, //Technical parent mobs
/mob/living/simple_mob/animal,
/mob/living/simple_mob/animal/passive,
/mob/living/simple_mob/animal/space,
/mob/living/simple_mob/blob,
/mob/living/simple_mob/mechanical,
/mob/living/simple_mob/mechanical/mecha,
/mob/living/simple_mob/slime,
/mob/living/simple_mob/vore,
/mob/living/simple_mob/vore/aggressive,
/mob/living/simple_mob/illusion, //Other technical mobs
/mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs
/mob/living/simple_mob/animal/passive/cat/runtime,
/mob/living/simple_mob/animal/passive/cat/bones,
/mob/living/simple_mob/animal/passive/cat/tabiranth,
/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,
/mob/living/simple_mob/animal/passive/dog/corgi/Ian,
/mob/living/simple_mob/animal/passive/dog/corgi/Lisa,
/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,
/mob/living/simple_mob/animal/passive/fox/renault,
/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter,
/mob/living/simple_mob/animal/passive/bird/parrot/poly,
/mob/living/simple_mob/animal/sif/fluffy,
/mob/living/simple_mob/animal/sif/fluffy/silky,
/mob/living/simple_mob/animal/passive/snake/python/noodle,
/mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
/mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads
/mob/living/simple_mob/animal/space/space_worm/head/severed,
/mob/living/simple_mob/animal/borer, //Event/player-control-only mobs
/mob/living/simple_mob/vore/hostile/morph
)//exclusion list for things you don't want the reaction to create.
blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities
blocked += typesof(/mob/living/simple_mob/construct) //Should only exist
blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled
blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things
var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
var/spawn_count = rand(1,3)
for(var/i = 1, i <= spawn_count, i++)
var/chosen = pick(voremobs)
var/mob/living/simple_mob/C = new chosen
C.faction = "slimesummon"
C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
/decl/chemical_reaction/instant/slime/sapphire_mutation
name = "Slime Mutation Toxins"
id = "slime_mutation_tox"
result = "mutationtoxin"
required_reagents = list("blood" = 5)
result_amount = 30
required = /obj/item/slime_extract/sapphire
/decl/chemical_reaction/instant/biomass
result_amount = 6 // Roughly 120u per phoron sheet
result_amount = 1
@@ -8,6 +8,7 @@
/obj/item/weapon/reagent_containers/syringe
name = "syringe"
desc = "A syringe."
description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave.
icon = 'icons/obj/syringe.dmi'
item_state = "syringe_0"
icon_state = "0"
+14
View File
@@ -76,6 +76,20 @@
var/client/ghost_client = ghost.client
if(!is_alien_whitelisted(ghost, GLOB.all_species[ghost_client?.prefs?.species]) && !check_rights(R_ADMIN, 0)) // Prevents a ghost ghosting in on a slot and spawning via a resleever with race they're not whitelisted for, getting around normal join restrictions.
to_chat(ghost, "<span class='warning'>You are not whitelisted to spawn as this species!</span>")
return
/* // Comments out NO_SCAN restriction, as per headmin/maintainer request.
var/datum/species/chosen_species
if(ghost.client.prefs.species) // In case we somehow don't have a species set here.
chosen_species = GLOB.all_species[ghost_client.prefs.species]
if(chosen_species.flags && NO_SCAN) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them.
to_chat(ghost, "<span class='warning'>This species cannot be resleeved!</span>")
return
*/
//Name matching is ugly but mind doesn't persist to look at.
var/charjob
var/datum/data/record/record_found
@@ -5,7 +5,7 @@
desc = "Another crewmember, small enough to fit in your hand."
icon_state = "micro"
icon_override = 'icons/inventory/head/mob_vr.dmi'
slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID
slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID | SLOT_HOLSTER
w_class = ITEMSIZE_SMALL
item_icons = null // No in-hand sprites (for now, anyway, we could totally add some)
pixel_y = 0 // Override value from parent.
+2
View File
@@ -1,3 +1,5 @@
//VOREStation Note - we use different xenobio balance in extracts_vr, keep this unticked.
// Base
/obj/item/slime_extract
name = "slime extract"
File diff suppressed because it is too large Load Diff
+93 -3
View File
@@ -67,7 +67,6 @@
qdel(src)
// More or less functionally identical to the telecrystal tele.
/obj/item/slime_crystal
name = "lesser slime cystal"
@@ -101,6 +100,7 @@
safe_blink(AM, 14)
qdel(src)
/obj/item/weapon/disposable_teleporter/slime
name = "greater slime crystal"
desc = "A larger, gooier crystal."
@@ -112,7 +112,6 @@
origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 4)
// Very filling food.
/obj/item/weapon/reagent_containers/food/snacks/slime
name = "slimy clump"
@@ -125,4 +124,95 @@
/obj/item/weapon/reagent_containers/food/snacks/slime/Initialize()
. = ..()
bitesize = 5
bitesize = 5
//Flashlight
/obj/item/device/flashlight/slime
gender = PLURAL
name = "glowing slime extract"
desc = "A slimy ball that appears to be glowing from bioluminesence."
icon = 'icons/obj/lighting.dmi'
icon_state = "floor1" //not a slime extract sprite but... something close enough!
item_state = "slime"
light_color = "#FFF423"
w_class = ITEMSIZE_TINY
light_range = 6
on = 1 //Bio-luminesence has one setting, on.
power_use = 0
/obj/item/device/flashlight/slime/New()
..()
set_light(light_range, light_power, light_color)
/obj/item/device/flashlight/slime/update_brightness()
return
/obj/item/device/flashlight/slime/attack_self(mob/user)
return //Bio-luminescence does not toggle.
//Radiation Emitter
/obj/item/slime_irradiator
name = "glowing slime extract"
desc = "A slimy ball that appears to be glowing from bioluminesence."
icon = 'icons/mob/slimes_vr.dmi'
icon_state = "irradiator"
light_color = "#00FF00"
light_power = 0.4
light_range = 2
w_class = ITEMSIZE_TINY
/obj/item/slime_irradiator/New()
START_PROCESSING(SSobj, src)
set_light(light_range, light_power, light_color)
return ..()
/obj/item/slime_irradiator/process()
SSradiation.radiate(src, 5)
/obj/item/slime_irradiator/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
//BS Pouch
/obj/item/weapon/storage/backpack/holding/slime
name = "bluespace slime pouch"
desc = "A slimy pouch that opens into a localized pocket of bluespace."
icon_state = "slimepouch"
//Slime Chems
/datum/reagent/myelamine/slime
name = "Agent A"
id = "slime_bleed_fixer"
description = "A slimy liquid which appears to rapidly clot internal hemorrhages by increasing the effectiveness of platelets at low quantities. Toxic in high quantities."
taste_description = "slime"
overdose = 5
/datum/reagent/osteodaxon/slime
name = "Agent B"
id = "slime_bone_fixer"
description = "A slimy liquid which can be used to heal bone fractures at low quantities. Toxic in high quantities."
taste_description = "slime"
overdose = 5
/datum/reagent/peridaxon/slime
name = "Agent C"
id = "slime_organ_fixer"
description = "A slimy liquid which is used to encourage recovery of internal organs and nervous systems in low quantities. Toxic in high quantities."
taste_description = "slime"
overdose = 5
/datum/reagent/nutriment/glucose/slime
name = "Slime Goop"
id = "slime_goop"
description = "A slimy liquid, with very compelling smell. Extremely nutritious."
color = "#FABA3A"
nutriment_factor = 30
taste_description = "slimy nectar"
+4 -4
View File
@@ -11,7 +11,7 @@
/obj/item/slimepotion/enhancer
name = "extract enhancer agent"
desc = "A potent chemical mix that will give a slime extract an additional two uses."
icon_state = "potpurple"
icon_state = "potcyan"
description_info = "This will even work on inert slime extracts, if it wasn't enhanced before. Extracts enhanced cannot be enhanced again."
// Makes slimes less likely to mutate.
@@ -64,7 +64,7 @@
// Makes the slime friendly forever.
/obj/item/slimepotion/docility
name = "docility agent"
name = "slime docility agent"
desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame. It might also work on other creatures?"
icon_state = "potlightpink"
description_info = "The target needs to be alive, not already passive, and be an animal or slime type entity."
@@ -178,7 +178,7 @@
desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them."
description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \
the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes."
icon_state = "potred"
icon_state = "potlightpink"
/obj/item/slimepotion/loyalty/attack(mob/living/simple_mob/M, mob/user)
if(!istype(M))
@@ -247,7 +247,7 @@
name = "slime feeding agent"
desc = "A potent chemical mix that will instantly sediate the slime."
description_info = "The slime needs to be alive for this to work. It will instantly grow the slime enough to reproduce."
icon_state = "potyellow"
icon_state = "potorange"
/obj/item/slimepotion/feeding/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
@@ -0,0 +1,189 @@
/obj/item/slimepotion/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/slimepotion/mimic))
to_chat(user, "<span class='notice'>You apply the mimic to the slime potion as it copies it's effects.</span>")
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
var/newtype = src.type
new newtype(get_turf(src))
qdel(O)
..()
/obj/item/slimepotion/infertility
name = "slime infertility agent"
desc = "A potent chemical mix that will reduce the amount of offspring this slime will have."
icon_state = "potpurple"
description_info = "The slime needs to be alive for this to work. It will reduce the amount of slime babies by 2 (to minimum of 2)."
/obj/item/slimepotion/infertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on slimes!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return ..()
if(M.split_amount <= 2)
to_chat(user, "<span class='warning'>The slime cannot get any less fertile!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed the slime the infertility agent. It will now have less offspring.</span>")
M.split_amount = between(2, M.split_amount - 2, 6)
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
/obj/item/slimepotion/fertility
name = "slime fertility agent"
desc = "A potent chemical mix that will increase the amount of offspring this slime will have."
icon_state = "potpurple"
description_info = "The slime needs to be alive for this to work. It will increase the amount of slime babies by 2 (to maximum of 6)."
/obj/item/slimepotion/fertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on slimes!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return ..()
if(M.split_amount >= 6)
to_chat(user, "<span class='warning'>The slime cannot get any more fertile!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed the slime the infertility agent. It will now have less offspring.</span>")
M.split_amount = between(2, M.split_amount + 2, 6)
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
/obj/item/slimepotion/shrink
name = "slime shrinking agent"
desc = "A potent chemical mix that will turn adult slime into a baby one."
icon_state = "potpurple"
description_info = "The slime needs to be alive for this to work."
/obj/item/slimepotion/shrink/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on slimes!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return ..()
if(!(M.is_adult))
to_chat(user, "<span class='warning'>The slime is already a baby!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed the slime the shrinking agent. It is now back to being a baby.</span>")
M.make_baby()
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
/obj/item/slimepotion/death
name = "slime death agent"
desc = "A potent chemical mix that will instantly kill a slime."
icon_state = "potblue"
description_info = "The slime needs to be alive for this to work."
/obj/item/slimepotion/death/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on slimes!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The slime is already dead!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed the slime the death agent. Its face flashes pain of betrayal before it goes still.</span>")
M.adjustToxLoss(500)
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
/obj/item/slimepotion/ferality
name = "slime ferality agent"
desc = "A potent chemical mix that will make a slime untamable."
icon_state = "potred"
description_info = "The slime needs to be alive for this to work."
/obj/item/slimepotion/ferality/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on slimes!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The slime is already dead!</span>")
return ..()
if(M.untamable && M.untamable_inheirit)
to_chat(user, "<span class='warning'>The slime is already untamable!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed the slime the death agent. It will now only get angrier at taming attempts.</span>")
M.untamable = TRUE
M.untamable_inheirit = TRUE
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
/obj/item/slimepotion/reinvigoration
name = "extract reinvigoration agent"
desc = "A potent chemical mix that will create a slime of appropriate type out of an extract."
icon_state = "potcyan"
description_info = "This will even work on inert extracts. Extract is destroyed in process."
/obj/item/slimepotion/mimic
name = "mimic agent"
desc = "A potent chemical mix that will mimic effects of other slime-produced agents."
icon_state = "potsilver"
description_info = "Warning: avoid combining multiple doses of mimic agent."
/obj/item/slimepotion/mimic/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/slimepotion/mimic))
to_chat(user, "<span class='warning'>You apply the mimic to the mimic, resulting a mimic that copies a mimic that copies a mimic that copies a mimic that-</span>")
var/location = get_turf(src)
playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1)
var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull
s.set_up(3, 3, location)
s.start()
qdel(O)
qdel(src)
return
..()
/obj/item/slimepotion/sapience
name = "slime sapience agent"
desc = "A potent chemical mix that makes an animal capable of developing more advanced, sapient thought."
description_info = "The slime or other animal needs to be alive for this to work. The development is not always immedeate and may take indeterminate time before effects show."
icon_state = "potblue"
/obj/item/slimepotion/sapience/attack(mob/living/simple_mob/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on creatures!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The creature is dead!</span>")
return ..()
if(M.ghostjoin)
to_chat(user, "<span class='warning'>The creature is already developing sapience.</span>")
return ..()
if(M.ckey)
to_chat(user, "<span class='warning'>The creature is already sapient!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed \the [M] the agent. It may now eventually develop proper sapience.</span>")
M.ghostjoin = 1
active_ghost_pods |= M
M.ghostjoin_icon()
log_and_message_admins("[key_name_admin(user)] used a sapience potion on a simple mob: [M]. [ADMIN_FLW(src)]")
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
/obj/item/slimepotion/obedience
name = "slime obedience agent"
desc = "A potent chemical mix that makes slime extremely obedient."
icon_state = "potlightpink"
description_info = "The target needs to be alive and currently misbehaving. Effect is equivalent to very strong discipline."
/obj/item/slimepotion/obedience/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
to_chat(user, "<span class='warning'>The agent only works on slimes!</span>")
return ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return ..()
to_chat(user, "<span class='notice'>You feed the slime the agent. It has been disciplined, for better or worse...</span>")
M.adjust_discipline(10)
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
qdel(src)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

+26 -4
View File
@@ -1295,6 +1295,10 @@
},
/turf/simulated/shuttle/plating/airless,
/area/tether_away/fueldepot)
"ow" = (
/obj/machinery/vending/weeb,
/turf/simulated/floor/tiled/techmaint/airless,
/area/tether_away/fueldepot)
"rE" = (
/obj/machinery/atmospherics/pipe/manifold/visible/aux{
dir = 1
@@ -1340,6 +1344,10 @@
/obj/random/powercell,
/turf/simulated/floor/tiled/techmaint/airless,
/area/tether_away/fueldepot)
"Gh" = (
/obj/machinery/vending/fitness,
/turf/simulated/floor/tiled/techmaint/airless,
/area/tether_away/fueldepot)
"IR" = (
/obj/machinery/atmospherics/pipe/simple/visible/aux{
dir = 8
@@ -1366,6 +1374,14 @@
/obj/item/weapon/storage/toolbox/mechanical,
/turf/simulated/floor/tiled/techmaint/airless,
/area/tether_away/fueldepot)
"QY" = (
/obj/machinery/atmospherics/pipe/simple/visible/universal{
dir = 1
},
/obj/structure/catwalk,
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug,
/turf/simulated/shuttle/plating/airless,
/area/tether_away/fueldepot)
"Vy" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -1373,6 +1389,12 @@
/obj/structure/catwalk,
/turf/simulated/shuttle/plating/airless,
/area/tether_away/fueldepot)
"XR" = (
/obj/machinery/vending/foodfast{
dir = 0
},
/turf/simulated/floor/tiled/techmaint/airless,
/area/tether_away/fueldepot)
"Ys" = (
/obj/structure/table/steel_reinforced,
/turf/simulated/floor/tiled/techmaint/airless,
@@ -11246,7 +11268,7 @@ ao
aS
bc
bo
bC
QY
rE
cc
cn
@@ -11954,12 +11976,12 @@ aa
aG
aa
aF
aG
Gh
aG
bz
IR
aG
aG
XR
aF
aa
aG
@@ -12238,7 +12260,7 @@ aD
aM
aa
aF
aG
ow
bs
bz
bN
+27 -13
View File
@@ -30484,7 +30484,12 @@
/obj/effect/floor_decal/corner/paleblue/border{
dir = 9
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{
external_pressure_bound = 101.3;
external_pressure_bound_default = 101.3;
pressure_checks = 1;
pressure_checks_default = 1
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"bbJ" = (
@@ -32852,12 +32857,7 @@
/obj/effect/floor_decal/corner/paleblue/border{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/universal,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"fLB" = (
@@ -34005,6 +34005,12 @@
/obj/effect/floor_decal/corner/paleblue/border{
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"iue" = (
@@ -34934,8 +34940,9 @@
/obj/effect/floor_decal/borderfloorwhite/corner,
/obj/effect/floor_decal/corner/paleblue/bordercorner,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 8
dir = 6
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"lbu" = (
@@ -35299,11 +35306,9 @@
dir = 10
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
dir = 8
},
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"lQu" = (
@@ -36235,6 +36240,15 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/brig)
"ogh" = (
/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{
external_pressure_bound = 101.3;
external_pressure_bound_default = 101.3;
pressure_checks = 1;
pressure_checks_default = 1
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"ohi" = (
/obj/structure/catwalk,
/turf/simulated/floor/plating,
@@ -54517,7 +54531,7 @@ acA
axP
aeF
axK
aAI
ogh
uVK
joK
xts
+1 -1
View File
@@ -5618,7 +5618,7 @@
/area/storage/tech)
"amb" = (
/obj/structure/table/rack/steel,
/obj/item/weapon/circuitboard/skills{
/obj/item/weapon/circuitboard/skills/pcu{
pixel_x = -3;
pixel_y = 3
},
+2 -1
View File
@@ -4177,9 +4177,10 @@
#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm"
#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm"
#include "code\modules\xenoarcheaology\tools\tools_vr.dm"
#include "code\modules\xenobio\items\extracts.dm"
#include "code\modules\xenobio\items\extracts_vr.dm"
#include "code\modules\xenobio\items\slime_objects.dm"
#include "code\modules\xenobio\items\slimepotions.dm"
#include "code\modules\xenobio\items\slimepotions_vr.dm"
#include "code\modules\xenobio\items\weapons.dm"
#include "code\modules\xenobio\machinery\processor.dm"
#include "code\modules\xgm\xgm_gas_data.dm"