From a92d860aef375b10cfb6c7ed2c9fb5d73ad9fe95 Mon Sep 17 00:00:00 2001 From: Datraen Date: Fri, 13 May 2016 13:28:57 -0400 Subject: [PATCH] Adds slime cores, replicator, extractor. Replicator and extractor circuits currently need to be adjusted, as they require origin tech and components. This commit is being added simply to save any headaches that may occur do to data loss. --- .../modules/xenobio2/{mob => }/_xeno_setup.dm | 0 .../xenobio2/machinery/core_extractor.dm | 128 ++++++++++++++++++ .../xenobio2/machinery/slime_replicator.dm | 88 ++++++++++++ code/modules/xenobio2/mob/slime/slime.dm | 9 +- code/modules/xenobio2/mob/slime/slime_core.dm | 10 ++ code/modules/xenobio2/mob/xeno procs.dm | 8 +- code/modules/xenobio2/mob/xeno.dm | 18 +-- polaris.dme | 5 +- 8 files changed, 244 insertions(+), 22 deletions(-) rename code/modules/xenobio2/{mob => }/_xeno_setup.dm (100%) create mode 100644 code/modules/xenobio2/machinery/core_extractor.dm create mode 100644 code/modules/xenobio2/machinery/slime_replicator.dm create mode 100644 code/modules/xenobio2/mob/slime/slime_core.dm 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"