From 9e09720be588329ec6f39fd366b96f7a45819f09 Mon Sep 17 00:00:00 2001 From: Datraen Date: Wed, 25 May 2016 14:11:37 -0400 Subject: [PATCH] Final Initial Implementation of Xenobio2 System. Kinks worked out, everything is functioning as it should. --- code/controllers/verbs.dm | 5 +- code/modules/admin/admin_verbs.dm | 1 + code/modules/xenobio2/_xeno_setup.dm | 2 + code/modules/xenobio2/controller.dm | 2 +- .../xenobio2/machinery/core_extractor.dm | 19 +++- .../xenobio2/machinery/gene_manipulators.dm | 106 +++++++++++++++--- .../xenobio2/machinery/slime_replicator.dm | 10 +- .../modules/xenobio2/mob/slime/slime procs.dm | 10 +- code/modules/xenobio2/mob/slime/slime.dm | 1 + .../xenobio2/mob/slime/slime_monkey.dm | 6 +- code/modules/xenobio2/mob/xeno procs.dm | 3 + code/world.dm | 3 + nano/templates/xenobio_editor.tmpl | 2 +- nano/templates/xenobio_isolator.tmpl | 4 +- 14 files changed, 145 insertions(+), 29 deletions(-) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index bb7bf300d0..ee361c9888 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -25,7 +25,7 @@ usr.client.debug_variables(antag) message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.") -/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote")) +/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote","Xenobio")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -95,5 +95,8 @@ if("Vote") debug_variables(vote) feedback_add_details("admin_verb", "DVote") + if("Xenobio") + debug_variables(xenobio_controller) + feedback_add_details("admin_verb", "DXenobio") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 78aca1da78..f049424b02 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -183,6 +183,7 @@ var/list/admin_verbs_debug = list( /client/proc/overlay_random_map, /client/proc/delete_random_map, /client/proc/show_plant_genes, + /client/proc/show_xenobio_genes, /client/proc/enable_debug_verbs, /client/proc/callproc, /client/proc/callproc_target, diff --git a/code/modules/xenobio2/_xeno_setup.dm b/code/modules/xenobio2/_xeno_setup.dm index 1e5d46175e..a08cb54681 100644 --- a/code/modules/xenobio2/_xeno_setup.dm +++ b/code/modules/xenobio2/_xeno_setup.dm @@ -160,6 +160,8 @@ var/global/list/xenoChemList = list("mutationtoxin", G.values["[TRAIT_XENO_HOSTILE]"] = get_trait(TRAIT_XENO_HOSTILE) G.values["[TRAIT_XENO_CHROMATIC]"] = get_trait(TRAIT_XENO_CHROMATIC) + return G + /datum/xeno/traits/proc/apply_gene(var/datum/xeno/genes/genes) if(!genes.genetype) return 0 diff --git a/code/modules/xenobio2/controller.dm b/code/modules/xenobio2/controller.dm index ecc550dcde..112d667c0f 100644 --- a/code/modules/xenobio2/controller.dm +++ b/code/modules/xenobio2/controller.dm @@ -14,7 +14,7 @@ for(var/mask in xenobio_controller.gene_tag_masks) usr << "[mask]: [xenobio_controller.gene_tag_masks[mask]]" -var/global/datum/controller/plants/xenobio_controller // Set in New(). +var/global/datum/controller/xenobio/xenobio_controller // Set in New(). /datum/controller/xenobio diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index a67169a282..6e14e57299 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -17,6 +17,11 @@ var/emptycolor = "#FF2222" var/operatingcolor = "#FFFF22" + +/obj/machinery/slime/extractor/New() + ..() + update_light_color() + /obj/machinery/slime/extractor/map/New() ..() circuit = new circuit(src) @@ -67,7 +72,12 @@ if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) ) user << "This is not a suitable subject for the core extractor!" return - + + var/mob/living/simple_animal/xeno/slime/S = victim + if(S.is_child) + user << "This subject is not developed enough 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) @@ -81,11 +91,11 @@ /obj/machinery/slime/extractor/proc/update_light_color() if(src.occupant && !(inuse)) - set_light(1, 1, occupiedcolor) + set_light(2, 2, occupiedcolor) else if(src.occupant) - set_light(1, 1, operatingcolor) + set_light(2, 2, operatingcolor) else - set_light(1, 1, emptycolor) + set_light(2, 2, emptycolor) /obj/machinery/slime/extractor/proc/extract_cores() if(!src.occupant) @@ -115,6 +125,7 @@ inuse = 0 eject_contents() update_light_color() + src.updateUsrDialog() /obj/machinery/slime/extractor/proc/eject_slime() if(occupant) diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index 2b453051f8..6b253dd2ab 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -53,6 +53,41 @@ var/eject_disk = 0 var/failed_task = 0 var/disk_needs_genes = 0 + +/obj/machinery/xenobio/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/xenobio/attack_hand(mob/user as mob) + ui_interact(user) + +/obj/machinery/xenobio/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(istype(W,/obj/item/weapon/disk/xenobio)) + if(loaded_disk) + user << "There is already a data disk loaded." + return + else + var/obj/item/weapon/disk/xenobio/B = W + + if(B.genes && B.genes.len) + if(!disk_needs_genes) + user << "That disk already has gene data loaded." + return + else + if(disk_needs_genes) + user << "That disk does not have any gene data loaded." + return + + user.drop_from_inventory(W) + W.forceMove(src) + loaded_disk = W + user << "You load [W] into [src]." + + return + ..() /obj/machinery/xenobio/process() @@ -86,9 +121,23 @@ var/obj/item/xenoproduct/product var/datum/xeno/traits/genetics // Currently scanned xeno genetic structure. var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point. + +/obj/machinery/xenobio/extractor/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/xenoproduct)) + if(product) + user << "There is already a xenobiological product loaded." + return + else + var/obj/item/xenoproduct/B = W + user.drop_from_inventory(B) + B.forceMove(src) + product = B + user << "You load [B] into [src]." + + return + ..() /obj/machinery/xenobio/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!user) return @@ -121,10 +170,16 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "xenobio_isolator.tmpl", "Biological Product Destructive Analyzer UI", 470, 450) + ui = new(user, src, ui_key, "xenobio_isolator.tmpl", "B.P.D. Analyzer UI", 470, 450) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) + +/obj/machinery/xenobio/proc/eject_disk() + if(!loaded_disk) return + loaded_disk.forceMove(loc) + visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") + loaded_disk = null /obj/machinery/xenobio/extractor/Topic(href, href_list) @@ -139,11 +194,7 @@ product = null if(href_list["eject_disk"]) - if(!loaded_disk) return - - loaded_disk.forceMove(get_turf(src)) - visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") - loaded_disk = null + eject_disk() if(href_list["scan_genome"]) @@ -172,7 +223,7 @@ loaded_disk.genesource = "[genetics.source]" - loaded_disk.name += " ([xenobio_controller.gene_tag_masks[href_list["get_gene"]]], [genetics.source]" + loaded_disk.name += " ([xenobio_controller.gene_tag_masks[href_list["get_gene"]]], [genetics.source])" loaded_disk.desc += " The label reads \'gene [xenobio_controller.gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.source]\'." eject_disk = 1 @@ -201,6 +252,26 @@ circuit = /obj/item/weapon/circuitboard/biobombarder var/mob/living/simple_animal/xeno/slime/occupant + +/obj/machinery/xenobio/editor/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + if(occupant) + user << "There is already an organism loaded." + return + else + if(isxeno(G.affecting)) + var/mob/living/simple_animal/xeno/X = G.affecting + if(do_after(user, 30) && X.Adjacent(src) && user.Adjacent(src) && X.Adjacent(user) && !occupant) + user.drop_from_inventory(G) + X.forceMove(src) + occupant = X + user << "You load [X] into [src]." + else + user << "This specimen is incompatible with the machinery!" + return + ..() + /obj/machinery/xenobio/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -252,16 +323,23 @@ last_action = world.time active = 1 + occupant.nameVar = "modified" if(prob(occupant.stability)) failed_task = 1 occupant.stability = 101 - for(var/datum/plantgene/gene in loaded_disk.genes) + for(var/datum/xeno/genes/gene in loaded_disk.genes) occupant.traitdat.apply_gene(gene) occupant.stability += rand(5,10) occupant.ProcessTraits() - + + if(href_list["eject_disk"]) + eject_disk() + + if(href_list["eject_xeno"]) + eject_xeno() + usr.set_machine(src) src.add_fingerprint(usr) @@ -295,12 +373,14 @@ occupant = victim /obj/machinery/xenobio/editor/proc/eject_contents() - for(var/obj/thing in (contents - component_parts - circuit)) - thing.forceMove(loc) + eject_disk() + eject_xeno() + +/obj/machinery/xenobio/editor/proc/eject_xeno() if(occupant) occupant.forceMove(loc) occupant = null - + /obj/item/weapon/circuitboard/bioproddestanalyzer name = T_BOARD("biological product destructive analyzer") build_path = "/obj/machinery/xenobio/extractor" diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index 4939e1e92f..e7be0d3a7e 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -17,6 +17,10 @@ var/emptycolor = "#FF2222" var/operatingcolor = "#FFFF22" +/obj/machinery/slime/replicator/New() + ..() + update_light_color() + /obj/machinery/slime/replicator/map/New() ..() circuit = new circuit(src) @@ -50,11 +54,11 @@ /obj/machinery/slime/replicator/proc/update_light_color() if(src.core && !(inuse)) - set_light(1, 1, occupiedcolor) + set_light(2, 2, occupiedcolor) else if(src.core) - set_light(1, 1, operatingcolor) + set_light(2, 2, operatingcolor) else - set_light(1, 1, emptycolor) + set_light(2, 2, emptycolor) /obj/machinery/slime/replicator/proc/replicate_slime() if(!src.core) diff --git a/code/modules/xenobio2/mob/slime/slime procs.dm b/code/modules/xenobio2/mob/slime/slime procs.dm index 10d500c015..56ad5d6050 100644 --- a/code/modules/xenobio2/mob/slime/slime procs.dm +++ b/code/modules/xenobio2/mob/slime/slime procs.dm @@ -103,4 +103,12 @@ Slime specific procs go here. if(reagents.has_reagent("docilitytoxin")) //Toxin that makes them docile? Good for quelling angry mobs. hostile = 0 traitdat.traits[TRAIT_XENO_HOSTILE] = 0 - ..() \ No newline at end of file + ..() + +/mob/living/simple_animal/xeno/slime/ProcessTraits() + ..() + if(is_child) + GenerateChild() + else + GenerateAdult() + \ 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 65444f7aaa..8ef1efb5cc 100644 --- a/code/modules/xenobio2/mob/slime/slime.dm +++ b/code/modules/xenobio2/mob/slime/slime.dm @@ -83,6 +83,7 @@ Slime definitions, Life and New live here. for(var/datum/language/L in (typesof(/datum/language) - /datum/language)) languages += L speak += "[station_name()]?" + traitdat.source = "Slime" resistances[BURN] = 4 resistances[BRUTE] = 0.2 resistances[TOX] = 1.5 diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm index c88afd7651..5194f87fdb 100644 --- a/code/modules/xenobio2/mob/slime/slime_monkey.dm +++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm @@ -48,18 +48,18 @@ Slime cube lives here. announce_ghost_joinleave(candidate, 0, "They are a promethean now.") src.searching = 2 var/mob/living/carbon/human/S = new(get_turf(src)) + S.client = candidate.client S. << "You are a promethean, brought into existence on [station_name()]." S.mind.assigned_role = "Promethean" S.set_species("Promethean") S.shapeshifter_set_colour("#05FF9B") + for(var/mob/M in viewers(get_turf(loc)) + M.show_message("The monkey cube suddenly takes the shape of a humanoid!") var/newname = sanitize(input(S, "You are a Promethean. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) if (newname) S.real_name = newname S.name = S.real_name S.dna.real_name = newname if(S.mind) S.mind.name = S.name - - for(var/mob/M in viewers(get_turf_or_move(loc))) - M.show_message("The monkey cube suddenly takes the shape of a man!") qdel(src) \ 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 35ba792c72..e0a64ebdd3 100644 --- a/code/modules/xenobio2/mob/xeno procs.dm +++ b/code/modules/xenobio2/mob/xeno procs.dm @@ -92,6 +92,9 @@ Procs for targeting traitdat.traits[TRAIT_XENO_COLOR] = "#" for(var/i=0, i<6, i++) traitdat.traits[TRAIT_XENO_COLOR] += pick(hexNums) + traitdat.traits[TRAIT_XENO_BIO_COLOR] = "#" + for(var/i=0, i<6, i++) + traitdat.traits[TRAIT_XENO_BIO_COLOR] += pick(hexNums) RandomChemicals() //if(SPECIESMUT & mutable) diff --git a/code/world.dm b/code/world.dm index bfa399fe2a..66edcd00d2 100644 --- a/code/world.dm +++ b/code/world.dm @@ -73,6 +73,9 @@ var/global/datum/global_init/init = new () // Set up roundstart seed list. plant_controller = new() + + // Set up roundstart gene masking + xenobio_controller = new() // This is kinda important. Set up details of what the hell things are made of. populate_material_list() diff --git a/nano/templates/xenobio_editor.tmpl b/nano/templates/xenobio_editor.tmpl index 2ee83488f0..d16b3df6b6 100644 --- a/nano/templates/xenobio_editor.tmpl +++ b/nano/templates/xenobio_editor.tmpl @@ -49,7 +49,7 @@ Used In File(s): \code\modules\xenobio2\machines\gene_manipulators.dm {{if data.degradation <= 100}} {{:helper.link('Apply Gene Mods', 'gear', {'apply_gene' : 1}, null)}} {{/if}} - {{:helper.link('Eject Target', 'circle-arrow-e', {'eject_packet' : 1}, null)}} + {{:helper.link('Eject Target', 'circle-arrow-e', {'eject_xeno' : 1}, null)}} {{else}}
No target organism loaded
diff --git a/nano/templates/xenobio_isolator.tmpl b/nano/templates/xenobio_isolator.tmpl index 630828eb4c..3bc855a457 100644 --- a/nano/templates/xenobio_isolator.tmpl +++ b/nano/templates/xenobio_isolator.tmpl @@ -1,5 +1,5 @@ @@ -69,6 +69,6 @@ Copy of Lysis-isolation Centrifuge's NanoUI Template {{else}} -
No seeds loaded.
+
No biologocial sample loaded.
{{/if}} {{/if}} \ No newline at end of file