diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 36ecb1d402..26c2eb7f80 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -105,11 +105,6 @@
#define CITADEL_MENTOR_OOC_COLOUR "#224724"
-//xenobio console upgrade stuff
-#define XENOBIO_UPGRADE_MONKEYS 1
-#define XENOBIO_UPGRADE_SLIMEBASIC 2
-#define XENOBIO_UPGRADE_SLIMEADV 4
-
//Citadel toggles because bitflag memes
#define MEDIHOUND_SLEEPER (1<<0)
#define EATING_NOISES (1<<1)
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 69a7bc906a..31e9d70462 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -235,6 +235,8 @@
for (var/atom/movable/A in urange(12, FROM )) // iterate thru list of mobs in the area
if(istype(A, /obj/item/beacon))
continue // don't teleport beacons because that's just insanely stupid
+ if(iscameramob(A))
+ continue // Don't mess with AI eye, blob eye, xenobio or advanced cameras
if(A.anchored)
continue
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index 0e4f85572c..e1235f929b 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -131,3 +131,8 @@
name = "nanotrasen logo"
desc = "The Nanotrasen corporate logo."
icon_state = "nanotrasen_sign1"
+
+/obj/structure/sign/xenobio_guide
+ name = "\improper Slime genealogy sign"
+ desc = "A sign depicting how the slime colors change with mutations, and the grey slime in the root."
+ icon_state = "xenobio-guide"
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
index b900a2da9f..da8a4eef1f 100644
--- a/code/modules/events/wizard/magicarp.dm
+++ b/code/modules/events/wizard/magicarp.dm
@@ -52,7 +52,20 @@
color = "#00FFFF"
maxHealth = 75
health = 75
+ gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
projectiletype = pick(allowed_projectile_types)
..()
+
+/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool
+ gold_core_spawnable = HOSTILE_SPAWN
+ allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection,
+ /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade,
+ /obj/item/projectile/magic/arcane_barrage) //thanks Lett1
+
+/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology
+ gold_core_spawnable = HOSTILE_SPAWN
+ allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection,
+ /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade,
+ /obj/item/projectile/magic/arcane_barrage)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index 2318c54508..1f01f1f5eb 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -1,3 +1,5 @@
+GLOBAL_LIST_EMPTY(monkey_recyclers)
+
/obj/machinery/monkey_recycler
name = "monkey recycler"
desc = "A machine used for recycling dead monkeys into monkey cubes." // except it literally never does
@@ -9,24 +11,34 @@
idle_power_usage = 5
active_power_usage = 50
circuit = /obj/item/circuitboard/machine/monkey_recycler
- var/grinded = 0
- var/required_grind = 5
- var/cube_production = 1
+ var/stored_matter = 0
+ var/cube_production = 0.2
+ var/list/connected = list() //Keeps track of connected xenobio consoles, for deletion in /Destroy()
-/obj/machinery/monkey_recycler/RefreshParts()
- var/req_grind = 5
- var/cubes_made = 1
+/obj/machinery/monkey_recycler/Initialize(mapload)
+ . = ..()
+ if (mapload)
+ GLOB.monkey_recyclers += src
+
+/obj/machinery/monkey_recycler/Destroy()
+ GLOB.monkey_recyclers -= src
+ for(var/thing in connected)
+ var/obj/machinery/computer/camera_advanced/xenobio/console = thing
+ console.connected_recycler = null
+ connected.Cut()
+ return ..()
+
+/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled
+ cube_production = 0
for(var/obj/item/stock_parts/manipulator/B in component_parts)
- req_grind -= B.rating
+ cube_production += B.rating * 0.1
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
- cubes_made = M.rating
- cube_production = cubes_made
- required_grind = req_grind
+ cube_production += M.rating * 0.1
/obj/machinery/monkey_recycler/examine(mob/user)
. = ..()
if(in_range(user, src) || isobserver(user))
- . += "The status display reads: Producing [cube_production] cubes for every monkey inserted."
+ to_chat(user, "The status display reads: Producing [cube_production] cubes for every monkey inserted.")
/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params)
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
@@ -68,17 +80,23 @@
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
use_power(500)
- grinded++
+ stored_matter += cube_production
addtimer(VARSET_CALLBACK(src, pixel_x, initial(pixel_x)))
- addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "The machine now has [grinded] monkey\s worth of material stored."))
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "The machine now has [stored_matter] monkey\s worth of material stored."))
/obj/machinery/monkey_recycler/interact(mob/user)
- if(grinded >= required_grind)
- to_chat(user, "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.")
+ if(stored_matter >= 1)
+ to_chat(user, "The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube.")
playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
- grinded -= required_grind
- for(var/i = 0, i < cube_production, i++)
+ for(var/i in 1 to FLOOR(stored_matter, 1))
new /obj/item/reagent_containers/food/snacks/cube/monkey(src.loc)
- to_chat(user, "The machine's display flashes that it has [grinded] monkeys worth of material left.")
+ stored_matter--
+ to_chat(user, "The machine's display flashes that it has [stored_matter] monkeys worth of material left.")
else
- to_chat(user, "The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded].")
+ to_chat(user, "The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter].")
+
+/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I)
+ if(istype(I))
+ to_chat(user, "You log [src] in the multitool's buffer.")
+ I.buffer = src
+ return TRUE
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 02d0c17538..95eb1856d8 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -113,6 +113,10 @@
for (var/A in actions)
var/datum/action/AC = A
AC.Remove(src)
+ Target = null
+ Leader = null
+ Friends.Cut()
+ speech_buffer.Cut()
return ..()
/mob/living/simple_animal/slime/proc/initialize_mutations()
diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm
index 7e5bedaf0e..b7314aa33d 100644
--- a/code/modules/research/designs/electronics_designs.dm
+++ b/code/modules/research/designs/electronics_designs.dm
@@ -140,29 +140,3 @@
build_path = /obj/item/drone_shell
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/xenobio_upgrade
- name = "owo"
- desc = "someone's bussin"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 300, /datum/material/glass = 100)
- category = list("Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/xenobio_upgrade/xenobiomonkeys
- name = "Xenobiology console monkey upgrade disk"
- desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
- id = "xenobio_monkeys"
- build_path = /obj/item/disk/xenobio_console_upgrade/monkey
-
-/datum/design/xenobio_upgrade/xenobioslimebasic
- name = "Xenobiology console basic slime upgrade disk"
- desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
- id = "xenobio_slimebasic"
- build_path = /obj/item/disk/xenobio_console_upgrade/slimebasic
-
-/datum/design/xenobio_upgrade/xenobioslimeadv
- name = "Xenobiology console advanced slime upgrade disk"
- desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
- id = "xenobio_slimeadv"
- build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv
diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm
index 21e002b359..c7ad71a4d3 100644
--- a/code/modules/research/techweb/nodes/bluespace_nodes.dm
+++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm
@@ -5,7 +5,7 @@
display_name = "Basic Bluespace Theory"
description = "Basic studies into the mysterious alternate dimension known as bluespace."
prereq_ids = list("base", "datatheory")
- design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys")
+ design_ids = list("beacon", "xenobioconsole", "telesci_gps")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/practical_bluespace
@@ -13,7 +13,7 @@
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic", "bluespace_tray", "light_replacer_blue")
+ design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "bluespace_tray", "light_replacer_blue")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/adv_bluespace
@@ -21,7 +21,7 @@
display_name = "Advanced Bluespace Research"
description = "Deeper understanding of how the Bluespace dimension works"
prereq_ids = list("practical_bluespace", "high_efficiency")
- design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv")
+ design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
/datum/techweb_node/emp_super
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index bccc738398..1d4c027125 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -30,11 +30,11 @@
var/datum/action/innate/feed_potion/potion_action
var/datum/action/innate/hotkey_help/hotkey_help
+ var/obj/machinery/monkey_recycler/connected_recycler
var/list/stored_slimes
var/obj/item/slimepotion/slime/current_potion
- var/max_slimes = 1
+ var/max_slimes = 10
var/monkeys = 0
- var/upgradetier = 0
icon_screen = "slime_comp"
icon_keyboard = "rd_key"
@@ -51,15 +51,27 @@
potion_action = new
hotkey_help = new
stored_slimes = list()
- RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
+ for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers)
+ if(get_area(recycler.loc) == get_area(loc))
+ connected_recycler = recycler
+ connected_recycler.connected += src
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
- stored_slimes = null
QDEL_NULL(current_potion)
- for(var/i in contents)
- var/mob/living/simple_animal/slime/S = i
- if(istype(S))
- S.forceMove(drop_location())
+ for(var/thing in stored_slimes)
+ var/mob/living/simple_animal/slime/S = thing
+ S.forceMove(drop_location())
+ stored_slimes.Cut()
+ if(connected_recycler)
+ connected_recycler.connected -= src
+ connected_recycler = null
+ return ..()
+
+/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A)
+ if(A == current_potion)
+ current_potion = null
+ if(A in stored_slimes)
+ stored_slimes -= A
return ..()
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
@@ -72,22 +84,22 @@
/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user)
..()
- if(slime_up_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
+ if(slime_up_action)
slime_up_action.target = src
slime_up_action.Grant(user)
actions += slime_up_action
- if(slime_place_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
+ if(slime_place_action)
slime_place_action.target = src
slime_place_action.Grant(user)
actions += slime_place_action
- if(feed_slime_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ if(feed_slime_action)
feed_slime_action.target = src
feed_slime_action.Grant(user)
actions += feed_slime_action
- if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ if(monkey_recycle_action)
monkey_recycle_action.target = src
monkey_recycle_action.Grant(user)
actions += monkey_recycle_action
@@ -97,7 +109,7 @@
scan_action.Grant(user)
actions += scan_action
- if(potion_action && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
+ if(potion_action)
potion_action.target = src
potion_action.Grant(user)
actions += potion_action
@@ -123,35 +135,13 @@
UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL)
..()
-/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
- if(current_potion == deleted)
- current_potion = null
- if(deleted in stored_slimes)
- stored_slimes -= deleted
-
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/disk/xenobio_console_upgrade))
- var/obj/item/disk/xenobio_console_upgrade/diskthing = O
- var/successfulupgrade = FALSE
- for(var/I in diskthing.upgradetypes)
- if(upgradetier & I)
- continue
- else
- upgradetier |= I
- successfulupgrade = TRUE
- if(I == XENOBIO_UPGRADE_SLIMEADV)
- max_slimes = 10
- if(successfulupgrade)
- to_chat(user, "You have successfully upgraded [src] with [O].")
- else
- to_chat(user, "[src] already has the contents of [O] installed!")
- return
- if(istype(O, /obj/item/reagent_containers/food/snacks/cube/monkey) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ if(istype(O, /obj/item/reagent_containers/food/snacks/cube/monkey))
monkeys++
to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.")
qdel(O)
return
- else if(istype(O, /obj/item/storage/bag) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
+ else if(istype(O, /obj/item/storage/bag))
var/obj/item/storage/P = O
var/loaded = FALSE
for(var/obj/G in P.contents)
@@ -162,7 +152,7 @@
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) && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
+ else if(istype(O, /obj/item/slimepotion/slime))
var/replaced = FALSE
if(user && !user.transferItemToLoc(O, src))
return
@@ -174,6 +164,13 @@
return
..()
+/obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/living/user, obj/item/multitool/I)
+ if (istype(I) && istype(I.buffer,/obj/machinery/monkey_recycler))
+ to_chat(user, "You link [src] with [I.buffer] in [I] buffer.")
+ connected_recycler = I.buffer
+ connected_recycler.connected += src
+ return TRUE
+
/datum/action/innate/slime_place
name = "Place Slimes"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
@@ -237,12 +234,13 @@
var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner)
if (!QDELETED(food))
food.LAssailant = WEAKREF(C)
- X.monkeys --
- to_chat(owner, "[X] now has [X.monkeys] monkey(s) left.")
+ X.monkeys--
+ X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
+ to_chat(owner, "[X] now has [X.monkeys] monkeys stored.")
else
- to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
+ to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
else
- to_chat(owner, "Target is not near a camera. Cannot proceed.")
+ to_chat(owner, "Target is not near a camera. Cannot proceed.")
/datum/action/innate/monkey_recycle
@@ -256,13 +254,20 @@
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
+ var/obj/machinery/monkey_recycler/recycler = X.connected_recycler
+ if(!recycler)
+ to_chat(owner, "There is no connected monkey recycler. Use a multitool to link one.")
+ return
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/carbon/monkey/M in remote_eye.loc)
if(M.stat)
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
- X.monkeys = round(X.monkeys + 0.2,0.1)
+ recycler.use_power(500)
+ X.monkeys += recycler.cube_production
+ X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
qdel(M)
+ to_chat(owner, "[X] now has [X.monkeys] monkeys available.")
else
to_chat(owner, "Target is not near a camera. Cannot proceed.")
@@ -310,33 +315,6 @@
//Demodularized Code
-/obj/item/disk/xenobio_console_upgrade
- name = "Xenobiology console upgrade disk"
- desc = "Allan please add detail."
- icon_state = "datadisk5"
- var/list/upgradetypes = list()
-
-/obj/item/disk/xenobio_console_upgrade/admin
- name = "Xenobio all access thing"
- desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'"
- upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS)
-
-/obj/item/disk/xenobio_console_upgrade/monkey
- name = "Xenobiology console monkey upgrade disk"
- desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
- upgradetypes = list(XENOBIO_UPGRADE_MONKEYS)
-
-/obj/item/disk/xenobio_console_upgrade/slimebasic
- name = "Xenobiology console basic slime upgrade disk"
- desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
- upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC)
-
-/obj/item/disk/xenobio_console_upgrade/slimeadv
- name = "Xenobiology console advanced slime upgrade disk"
- desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
- upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV)
-
-
//Xenobio Hotkeys Port
/datum/action/innate/hotkey_help
@@ -399,9 +377,6 @@
//Feeds a potion to slime
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S)
- if(!(upgradetier & XENOBIO_UPGRADE_SLIMEADV)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEADV
- to_chat(user, "This console does not have the advanced slime upgrade.")
- return
if(!GLOB.cameranet.checkTurfVis(S.loc))
to_chat(user, "Target is not near a camera. Cannot proceed.")
return
@@ -417,9 +392,6 @@
//Picks up slime
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S)
- if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
- to_chat(user, "This console does not have the basic slime upgrade.")
- return
if(!GLOB.cameranet.checkTurfVis(S.loc))
to_chat(user, "Target is not near a camera. Cannot proceed.")
return
@@ -442,9 +414,6 @@
//Place slimes
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T)
- if(!(upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
- to_chat(user, "This console does not have the basic slime upgrade.")
- return
if(!GLOB.cameranet.checkTurfVis(T))
to_chat(user, "Target is not near a camera. Cannot proceed.")
return
@@ -460,9 +429,6 @@
//Place monkey
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T)
- if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
- to_chat(user, "This console does not have the monkey upgrade.")
- return
if(!GLOB.cameranet.checkTurfVis(T))
to_chat(user, "Target is not near a camera. Cannot proceed.")
return
@@ -477,15 +443,12 @@
food.LAssailant = WEAKREF(C)
X.monkeys--
X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
- to_chat(C, "[X] now has [X.monkeys] monkey(s) stored.")
+ to_chat(C, "[X] now has [X.monkeys] monkeys stored.")
else
- to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
+ to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
//Pick up monkey
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M)
- if(!(upgradetier & XENOBIO_UPGRADE_MONKEYS)) // CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
- to_chat(user, "This console does not have the monkey upgrade.")
- return
if(!isturf(M.loc) || !GLOB.cameranet.checkTurfVis(M.loc))
to_chat(user, "Target is not near a camera. Cannot proceed.")
return
@@ -493,11 +456,15 @@
var/mob/camera/aiEye/remote/xenobio/E = C.remote_control
var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
var/area/mobarea = get_area(M.loc)
+ if(!X.connected_recycler)
+ to_chat(C, "There is no connected monkey recycler. Use a multitool to link one.")
+ return
if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible)
if(!M.stat)
return
M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!")
- X.monkeys = round(X.monkeys + 0.2,0.1)
+ X.connected_recycler.use_power(500)
+ X.monkeys += connected_recycler.cube_production
+ X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
qdel(M)
- if (X.monkeys == (round(X.monkeys,1)))
- to_chat(C, "[X] now has [X.monkeys] monkey(s) available.")
+ to_chat(C, "[X] now has [X.monkeys] monkeys available.")
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 10fab0ed06..24a841a14f 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -940,6 +940,7 @@
M.visible_message("[M] has a new name, [new_name].", "Your old name of [M.real_name] fades away, and your new name [new_name] anchors itself in your mind.")
message_admins("[ADMIN_LOOKUPFLW(user)] used [src] on [ADMIN_LOOKUPFLW(M)], letting them rename themselves into [new_name].")
+ log_game("[key_name(user)] used [src] on [key_name(M)], letting them rename themselves into [new_name].")
// pass null as first arg to not update records or ID/PDA
M.fully_replace_character_name(null, new_name)
diff --git a/icons/mob/slimes.dmi b/icons/mob/slimes.dmi
index f9998d6f10..56094049e2 100644
Binary files a/icons/mob/slimes.dmi and b/icons/mob/slimes.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index 892f974afd..9216c94b67 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ