diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index ca1feafe5e3..0d54cac1b12 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -425,6 +425,9 @@ GAS ANALYZER
to_chat(user, "This device can only scan slimes!")
return
var/mob/living/simple_animal/slime/T = M
+ slime_scan(T, user)
+
+/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user)
to_chat(user, "Slime scan results:")
to_chat(user, "[T.colour] [T.is_adult ? "adult" : "baby"] slime")
to_chat(user, "Nutrition: [T.nutrition]/[T.get_max_nutrition()]")
@@ -449,4 +452,4 @@ GAS ANALYZER
to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting")
if (T.cores > 1)
to_chat(user, "Anomalious slime core amount detected")
- to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]")
+ to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]")
\ No newline at end of file
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index c872756872d..71574104c60 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -55,7 +55,7 @@
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_ugprade/health, 400),
new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_ugprade/cooldown, 600),
- new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
+ new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/slime/sentience/mining, 1000),
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
)
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 7caf57b0a64..3c33441561c 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -255,7 +255,7 @@
//AI
-/obj/item/slimepotion/sentience/mining
+/obj/item/slimepotion/slime/sentience/mining
name = "minebot AI upgrade"
desc = "Can be used to grant sentience to minebots."
icon_state = "door_electronics"
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 44f904b0a74..11d41ea20fc 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -194,7 +194,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder)
- new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom))
+ new /obj/item/slimepotion/slime/stabilizer(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimefoam
@@ -326,7 +326,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder)
- new /obj/item/slimepotion/steroid(get_turf(holder.my_atom))
+ new /obj/item/slimepotion/slime/steroid(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimeregen
@@ -358,7 +358,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder)
- new /obj/item/slimepotion/mutator(get_turf(holder.my_atom))
+ new /obj/item/slimepotion/slime/mutator(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimebloodlust
@@ -394,7 +394,7 @@
required_other = 1
/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder)
- new /obj/item/slimepotion/docility(get_turf(holder.my_atom))
+ new /obj/item/slimepotion/slime/docility(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/gender
@@ -465,7 +465,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder)
- new /obj/item/slimepotion/sentience(get_turf(holder.my_atom))
+ new /obj/item/slimepotion/slime/sentience(get_turf(holder.my_atom))
..()
//Adamantine
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index ca929e5e9a7..45460eccbd3 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -26,8 +26,11 @@
var/datum/action/innate/slime_pick_up/slime_up_action = new
var/datum/action/innate/feed_slime/feed_slime_action = new
var/datum/action/innate/monkey_recycle/monkey_recycle_action = new
+ var/datum/action/innate/slime_scan/scan_action = new
+ var/datum/action/innate/feed_potion/potion_action = new
var/list/stored_slimes = list()
+ var/obj/item/slimepotion/slime/current_potion
var/max_slimes = 5
var/monkeys = 0
@@ -66,6 +69,16 @@
monkey_recycle_action.Grant(user)
actions += monkey_recycle_action
+ if(scan_action)
+ scan_action.target = src
+ scan_action.Grant(user)
+ actions += scan_action
+
+ if(potion_action)
+ potion_action.target = src
+ potion_action.Grant(user)
+ actions += potion_action
+
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
monkeys++
@@ -83,6 +96,16 @@
if (loaded)
to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.")
return
+ else if(istype(O, /obj/item/slimepotion/slime))
+ var/replaced = FALSE
+ if(user && !user.transferItemToLoc(O, src))
+ return
+ if(!QDELETED(current_potion))
+ current_potion.forceMove(drop_location())
+ replaced = TRUE
+ current_potion = O
+ to_chat(user, "You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].")
+ return
..()
/datum/action/innate/slime_place
@@ -173,3 +196,44 @@
qdel(M)
else
to_chat(owner, "Target is not near a camera. Cannot proceed.")
+
+/datum/action/innate/slime_scan
+ name = "Scan Slime"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
+ button_icon_state = "slime_scan"
+
+/datum/action/innate/slime_scan/Activate()
+ if(!target || !isliving(owner))
+ return
+ var/mob/living/C = owner
+ var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
+
+ if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
+ for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
+ slime_scan(S, C)
+ else
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
+
+/datum/action/innate/feed_potion
+ name = "Apply Potion"
+ icon_icon = 'icons/mob/actions/actions_silicon.dmi'
+ button_icon_state = "slime_potion"
+
+/datum/action/innate/feed_potion/Activate()
+ if(!target || !isliving(owner))
+ return
+
+ var/mob/living/C = owner
+ var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
+ var/obj/machinery/computer/camera_advanced/xenobio/X = target
+
+ if(QDELETED(X.current_potion))
+ to_chat(owner, "No potion loaded.")
+ return
+
+ if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
+ for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
+ X.current_potion.attack(S, C)
+ break
+ else
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index a072e160592..77f5a04c880 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -327,7 +327,7 @@
/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)
+ var/obj/item/slimepotion/slime/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)
@@ -335,7 +335,7 @@
return 150
if(SLIME_ACTIVATE_MAJOR)
- var/obj/item/slimepotion/sentience/O = new(null, 1)
+ var/obj/item/slimepotion/slime/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)
@@ -539,19 +539,19 @@
to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb." )
return
-/obj/item/slimepotion/docility
+/obj/item/slimepotion/slime/docility
name = "docility potion"
desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame."
icon = 'icons/obj/chemical.dmi'
icon_state = "potsilver"
-/obj/item/slimepotion/docility/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))
to_chat(user, "The potion only works on slimes!")
return ..()
if(M.stat)
to_chat(user, "The slime is dead!")
- return ..()
+ return
M.docile = 1
M.nutrition = 700
@@ -565,33 +565,31 @@
M.real_name = newname
qdel(src)
-/obj/item/slimepotion/sentience
+/obj/item/slimepotion/slime/sentience
name = "intelligence potion"
desc = "A miraculous chemical mix that grants human like intelligence to living beings."
icon = 'icons/obj/chemical.dmi'
icon_state = "potpink"
var/list/not_interested = list()
- var/being_used = 0
+ var/being_used = FALSE
var/sentience_type = SENTIENCE_ORGANIC
-/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user)
- if(being_used || !ismob(M) || !user.Adjacent(M))
+/obj/item/slimepotion/slime/sentience/attack(mob/living/M, mob/user)
+ if(being_used || !ismob(M))
return
if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled
to_chat(user, "[M] is already too intelligent for this to work!")
- return ..()
+ return
if(M.stat)
to_chat(user, "[M] is dead!")
- return ..()
+ return
var/mob/living/simple_animal/SM = M
if(SM.sentience_type != sentience_type)
to_chat(user, "[src] won't work on [SM].")
- return ..()
-
-
+ return
to_chat(user, "You offer [src] to [SM]...")
- being_used = 1
+ being_used = TRUE
var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm
var/mob/dead/observer/theghost = null
@@ -608,17 +606,17 @@
qdel(src)
else
to_chat(user, "[SM] looks interested for a moment, but then looks back down. Maybe you should try again later.")
- being_used = 0
+ being_used = FALSE
..()
-/obj/item/slimepotion/sentience/proc/after_success(mob/living/user, mob/living/simple_animal/SM)
+/obj/item/slimepotion/slime/sentience/proc/after_success(mob/living/user, mob/living/simple_animal/SM)
return
-/obj/item/slimepotion/sentience/nuclear
+/obj/item/slimepotion/slime/sentience/nuclear
name = "syndicate intelligence potion"
desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems."
-/obj/item/slimepotion/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM)
+/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM)
var/obj/item/implant/radio/imp = new(src)
imp.implant(SM, user)
@@ -667,25 +665,25 @@
SM.name = "[SM.name] as [user.real_name]"
qdel(src)
-/obj/item/slimepotion/steroid
+/obj/item/slimepotion/slime/steroid
name = "slime steroid"
desc = "A potent chemical mix that will cause a baby slime to generate more extract."
icon = 'icons/obj/chemical.dmi'
icon_state = "potred"
-/obj/item/slimepotion/steroid/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))//If target is not a slime.
to_chat(user, "The steroid only works on baby slimes!")
return ..()
if(M.is_adult) //Can't steroidify adults
to_chat(user, "Only baby slimes can use the steroid!")
- return ..()
+ return
if(M.stat)
to_chat(user, "The slime is dead!")
- return ..()
+ return
if(M.cores >= 5)
to_chat(user, "The slime already has the maximum amount of extract!")
- return ..()
+ return
to_chat(user, "You feed the slime the steroid. It will now produce one more extract.")
M.cores++
@@ -697,46 +695,46 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "potpurple"
-/obj/item/slimepotion/stabilizer
+/obj/item/slimepotion/slime/stabilizer
name = "slime stabilizer"
desc = "A potent chemical mix that will reduce the chance of a slime mutating."
icon = 'icons/obj/chemical.dmi'
icon_state = "potcyan"
-/obj/item/slimepotion/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))
to_chat(user, "The stabilizer only works on slimes!")
return ..()
if(M.stat)
to_chat(user, "The slime is dead!")
- return ..()
+ return
if(M.mutation_chance == 0)
to_chat(user, "The slime already has no chance of mutating!")
- return ..()
+ return
to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.")
M.mutation_chance = CLAMP(M.mutation_chance-15,0,100)
qdel(src)
-/obj/item/slimepotion/mutator
+/obj/item/slimepotion/slime/mutator
name = "slime mutator"
desc = "A potent chemical mix that will increase the chance of a slime mutating."
icon = 'icons/obj/chemical.dmi'
icon_state = "potgreen"
-/obj/item/slimepotion/mutator/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user)
if(!isslime(M))
to_chat(user, "The mutator only works on slimes!")
return ..()
if(M.stat)
to_chat(user, "The slime is dead!")
- return ..()
+ return
if(M.mutator_used)
to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!")
- return ..()
+ return
if(M.mutation_chance == 100)
to_chat(user, "The slime is already guaranteed to mutate!")
- return ..()
+ return
to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.")
M.mutation_chance = CLAMP(M.mutation_chance+12,0,100)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 4c4137d52c8..e66c201e078 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1061,7 +1061,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/device_tools/potion
name = "Syndicate Sentience Potion"
- item = /obj/item/slimepotion/sentience/nuclear
+ item = /obj/item/slimepotion/slime/sentience/nuclear
desc = "A potion recovered at great risk by undercover syndicate operatives and then subsequently modified with syndicate technology. Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
cost = 4
include_modes = list(/datum/game_mode/nuclear)
@@ -1372,7 +1372,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
exclude_modes = list(/datum/game_mode/nuclear)
cant_discount = TRUE
var/starting_crate_value = 50
-
+
/datum/uplink_item/badass/surplus/super
name = "Super Surplus Crate"
desc = "A dusty SUPER-SIZED from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \
diff --git a/icons/mob/actions/actions_silicon.dmi b/icons/mob/actions/actions_silicon.dmi
index 5b198649baa..cd997a25ac1 100644
Binary files a/icons/mob/actions/actions_silicon.dmi and b/icons/mob/actions/actions_silicon.dmi differ