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"