diff --git a/code/modules/xenobio2/mob/_xeno_setup.dm b/code/modules/xenobio2/_xeno_setup.dm
similarity index 100%
rename from code/modules/xenobio2/mob/_xeno_setup.dm
rename to code/modules/xenobio2/_xeno_setup.dm
diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm
new file mode 100644
index 00000000000..eedd6316927
--- /dev/null
+++ b/code/modules/xenobio2/machinery/core_extractor.dm
@@ -0,0 +1,128 @@
+/*
+ Here lives the slime core extractor
+ This machine extracts slime cores at the cost of the slime itself.
+ To create more of these slimes, stick the slime core in the replicator.
+*/
+/obj/machinery/slime/extractor
+ name = "Slime extractor"
+ desc = "A machine for cutting up slimes to get to their cores."
+ density = 1
+ anchored = 1
+ circuit = /obj/item/weapon/circuitboard/slimeextractor
+ var/inuse
+ var/mob/living/simple_animal/xeno/slime/occupant = null
+ var/occupiedcolor = "#22FF22"
+ var/emptycolor = "#FF2222"
+ var/operatingcolor = "#FFFF22"
+
+/obj/machinery/slime/extractor/map/New()
+ ..()
+ circuit = new circuit(src)
+ component_parts = list()
+ //Component parts go here,
+
+
+/obj/machinery/slime/extractor/attackby(var/obj/item/W, var/mob/user)
+
+ //Let's try to deconstruct first.
+ if(istype(W, /obj/item/weapon/screwdriver) && !inuse)
+ default_deconstruction_screwdriver(user, W)
+ return
+
+ if(istype(W, /obj/item/weapon/crowbar))
+ default_deconstruction_crowbar(user, W)
+ return
+
+ if(panel_open)
+ user << "Close the panel first!"
+
+ var/obj/item/weapon/grab/G = W
+
+ if(!istype(G))
+ return ..()
+
+ if(G.state < 2)
+ user << "You need a better grip to do that!"
+ return
+
+ move_into_extractor(user,G.affecting)
+
+/obj/machinery/slime/extractor/MouseDrop_T(mob/target, mob/user)
+ if(user.stat || user.restrained())
+ return
+ move_into_extractor(user,target)
+
+/obj/machinery/slime/extractor/proc/move_into_extractor(var/mob/user,var/mob/living/victim)
+
+ if(src.occupant)
+ user << "The core extractor is full, empty it first!"
+ return
+
+ if(in_use)
+ user << "The core extractor is locked and running, wait for it to finish."
+ return
+
+ if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) )
+ user << "This is not a suitable subject for the core extractor!"
+ return
+
+ user.visible_message("[user] starts to put [victim] into the core extractor!")
+ src.add_fingerprint(user)
+ if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
+ user.visible_message("[user] stuffs [victim] into the core extractor!")
+ if(victim.client)
+ victim.client.perspective = EYE_PERSPECTIVE
+ victim.client.eye = src
+ victim.forceMove(src)
+ src.occupant = victim
+ update_light_color()
+
+/obj/machinery/slime/extractor/proc/update_light_color()
+ if(src.occupant && !(inuse))
+ set_light(4, 4, occupiedcolor)
+ else if(src.occupant)
+ set_light(4, 4, operatingcolor)
+ else
+ set_light(4, 4, emptycolor)
+
+/obj/machinery/slime/extractor/proc/extract_cores()
+ if(!src.occupant)
+ src.visible_message("\icon[src] [src] pings unhappily.")
+ else if(inuse)
+ return
+
+ inuse = 1
+ update_light_color()
+ spawn(30)
+ for(var/i=1 to occupant.cores)
+ var/obj/item/slime/core/C = new(src)
+ C.slimetraits = occupant.traitdat
+
+ C.create_reagents(C.slimetraits.traits[TRAIT_XENO_CHEMVOL])
+ for(var/reagent in occupant.traitdat.chems.reagents)
+ var/amount = occupant.traitdat.chems.reagents[reagent]
+ C.reagents.add_reagent(reagent, amount)
+
+ C.color = C.slimetraits.traits[TRAIT_XENO_COLOR]
+
+ spawn(30)
+ qdel(occupant)
+ inuse = 0
+ eject_contents()
+ update_light_color()
+
+/obj/machinery/slime/extractor/proc/eject_contents()
+ for(var/obj/thing in (contents - component_parts - circuit))
+ thing.forceMove(loc)
+ if(occupant)
+ occupant.forceMove(loc)
+ occupant = null
+
+//Circuit board below,
+/obj/item/weapon/circuitboard/slimeextractor
+ name = T_BOARD("Slime extractor")
+ build_path = "/obj/machinery/slime/extractor"
+ board_type = "machine"
+ origin_tech = list() //To be filled,
+ req_components = list() //To be filled,
+
\ No newline at end of file
diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm
new file mode 100644
index 00000000000..85a9524739c
--- /dev/null
+++ b/code/modules/xenobio2/machinery/slime_replicator.dm
@@ -0,0 +1,88 @@
+/*
+ Here lives the slime replicator
+ This machine consumes cores to create a slime.
+ To create more of these cores, stick the slime core in the extractor.
+*/
+/obj/machinery/slime/replicator
+ name = "Slime replicator"
+ desc = "A machine for creating slimes from cores. Amazing!"
+ density = 1
+ anchored = 1
+ circuit = /obj/item/weapon/circuitboard/slimereplicator
+ var/obj/item/slime/core/core = null
+ var/inuse
+ var/occupiedcolor = "#22FF22"
+ var/emptycolor = "#FF2222"
+ var/operatingcolor = "#FFFF22"
+
+/obj/machinery/slime/replicator/map/New()
+ ..()
+ circuit = new circuit(src)
+ component_parts = list()
+ //Component parts go here,
+
+/obj/machinery/slime/replicator/attackby(var/obj/item/W, var/mob/user)
+ //Let's try to deconstruct first.
+ if(istype(W, /obj/item/weapon/screwdriver) && !inuse)
+ default_deconstruction_screwdriver(user, W)
+ return
+
+ if(istype(W, /obj/item/weapon/crowbar))
+ default_deconstruction_crowbar(user, W)
+ return
+
+ var/obj/item/slime/core/G = W
+
+ if(!istype(G))
+ return ..()
+
+ if(core)
+ user << "The [src] is already filled!"
+ return
+ if(panel_open)
+ user << "Close the panel first!"
+ core = G
+ G.forceMove(src)
+ update_light_color()
+
+/obj/machinery/slime/replicator/proc/update_light_color()
+ if(src.core && !(inuse))
+ set_light(4, 4, occupiedcolor)
+ else if(src.core)
+ set_light(4, 4, operatingcolor)
+ else
+ set_light(4, 4, emptycolor)
+
+/obj/machinery/slime/replicator/proc/extract_cores()
+ if(!src.core)
+ src.visible_message("\icon[src] [src] pings unhappily.")
+ else if(inuse)
+ return
+
+ inuse = 1
+ update_light_color()
+ spawn(30)
+ var/mob/living/simple_animal/xeno/slime/S = new()
+ S.traitdat = core.slimetraits
+ S.forceMove(src)
+ spawn(30)
+ qdel(core)
+ inuse = 0
+ eject_contents()
+ update_light_color()
+
+/obj/machinery/slime/replicator/proc/eject_contents()
+ for(var/mob/thing in contents)
+ thing.forceMove(loc)
+ if(core)
+ core.forceMove(loc)
+ core = null
+
+//Circuit board below,
+/obj/item/weapon/circuitboard/slimereplicator
+ name = T_BOARD("Slime replicator")
+ build_path = "/obj/machinery/slime/replicator"
+ board_type = "machine"
+ origin_tech = list() //To be filled,
+ req_components = list() //To be filled,
+
\ No newline at end of file
diff --git a/code/modules/xenobio2/mob/slime/slime.dm b/code/modules/xenobio2/mob/slime/slime.dm
index 28276d034f3..36655a59beb 100644
--- a/code/modules/xenobio2/mob/slime/slime.dm
+++ b/code/modules/xenobio2/mob/slime/slime.dm
@@ -31,9 +31,9 @@ Slime definitions, Life and New live here.
universal_speak = 1
speak_chance = 1
speak = list("Hello?",
- "Where's this going?",
- "What's that?",
- "What's in the box?",
+ "Where is this going?",
+ "What is that?",
+ "What is in the box?",
"Cargo.",
"Transport?",
"Special?",
@@ -81,4 +81,5 @@ Slime definitions, Life and New live here.
languages += L
speak += "[station_name()]?"
GenerateChild()
- return 1
\ No newline at end of file
+ return 1
+
\ No newline at end of file
diff --git a/code/modules/xenobio2/mob/slime/slime_core.dm b/code/modules/xenobio2/mob/slime/slime_core.dm
new file mode 100644
index 00000000000..bb6bde65b78
--- /dev/null
+++ b/code/modules/xenobio2/mob/slime/slime_core.dm
@@ -0,0 +1,10 @@
+/*
+Slime core lives here, and related procs.
+*/
+/obj/item/slime/core
+ name = "slime core"
+ desc = "Gooey."
+ icon = 'icons/mob/slime2.dmi'
+ icon_state = "slime extract"
+ var/datum/xeno/traits/slimetraits
+
\ No newline at end of file
diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm
index 8de205adf15..94469269170 100644
--- a/code/modules/xenobio2/mob/xeno procs.dm
+++ b/code/modules/xenobio2/mob/xeno procs.dm
@@ -118,11 +118,13 @@ Procs for targeting
return
if(learned_message) //Is it understood?
var/complete_message = ",[language.key] [message]"
- speech_buffer.Add(complete_message)
- log_debug("Added '[complete_message]'.")
+ if(!(complete_message in speak))
+ speech_buffer.Add(complete_message)
+ log_debug("Added '[complete_message]'.")
else
*/
- speech_buffer.Add(message)
+ if(!(message in speak))
+ speech_buffer.Add(message)
..(message,verb,language,alt_name,italics,speaker)
/mob/living/simple_animal/xeno/proc/ProcessSpeechBuffer()
diff --git a/code/modules/xenobio2/mob/xeno.dm b/code/modules/xenobio2/mob/xeno.dm
index 3dce963f5de..a3ef1b09ad9 100644
--- a/code/modules/xenobio2/mob/xeno.dm
+++ b/code/modules/xenobio2/mob/xeno.dm
@@ -73,19 +73,8 @@ Also includes Life and New
return 1 //Everything worked okay.
/mob/living/simple_animal/xeno/New()
- var/traits
- if(istype(loc, /mob/living/simple_animal/xeno))
- var/mob/living/simple_animal/xeno/X = loc
- traits = X.traitdat
-/*
- if(istype(loc, /obj/machinery/xenobio/replicator))
- var/obj/machinery/xenobio/replicator/R = loc
- traits = R.connected.traitdat
-*/
- if(!traits)
- traitdat = new()
- else
- traitdat = traits
+
+ traitdat = new()
ProcessTraits()
@@ -99,4 +88,5 @@ Also includes Life and New
for(var/R in default_chems)
traitdat.chems.reagents.add_reagent("[R]", default_chems[R])
if(!health)
- stat = DEAD
\ No newline at end of file
+ stat = DEAD
+
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index 916e79f1d44..ed416e048bc 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1873,12 +1873,15 @@
#include "code\modules\virus2\helpers.dm"
#include "code\modules\virus2\isolator.dm"
#include "code\modules\virus2\items_devices.dm"
-#include "code\modules\xenobio2\mob\_xeno_setup.dm"
+#include "code\modules\xenobio2\_xeno_setup.dm"
+#include "code\modules\xenobio2\machinery\core_extractor.dm"
+#include "code\modules\xenobio2\machinery\slime_replicator.dm"
#include "code\modules\xenobio2\mob\xeno procs.dm"
#include "code\modules\xenobio2\mob\xeno.dm"
#include "code\modules\xenobio2\mob\slime\slime life.dm"
#include "code\modules\xenobio2\mob\slime\slime procs.dm"
#include "code\modules\xenobio2\mob\slime\slime.dm"
+#include "code\modules\xenobio2\mob\slime\slime_core.dm"
#include "code\modules\xenobio2\tools\slime_handling_tools.dm"
#include "code\modules\xgm\xgm_gas_data.dm"
#include "code\modules\xgm\xgm_gas_mixture.dm"