From e4f2d0c064fa47da81491bbfdcb8e87c5645f0a4 Mon Sep 17 00:00:00 2001 From: c0 Date: Sat, 12 Mar 2016 14:58:40 +0300 Subject: [PATCH] Bioengineering Part 1 --- code/game/machinery/cloning.dm | 9 +- code/game/machinery/constructable_frame.dm | 11 + code/modules/hydroponics/gene_modder.dm | 387 +++++++++++++++++++++ code/modules/hydroponics/grown.dm | 8 +- code/modules/hydroponics/grown/citrus.dm | 2 +- code/modules/hydroponics/growninedible.dm | 6 +- code/modules/hydroponics/plant_genes.dm | 42 +++ code/modules/hydroponics/seeds.dm | 5 +- icons/obj/hydroponics/equipment.dmi | Bin 16233 -> 17964 bytes tgstation.dme | 1 + 10 files changed, 454 insertions(+), 17 deletions(-) create mode 100644 code/modules/hydroponics/gene_modder.dm diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 85b3363e073..a6d8287c1db 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -353,13 +353,8 @@ /obj/item/weapon/storage/box/disks/New() ..() - new /obj/item/weapon/disk/data(src) - new /obj/item/weapon/disk/data(src) - new /obj/item/weapon/disk/data(src) - new /obj/item/weapon/disk/data(src) - new /obj/item/weapon/disk/data(src) - new /obj/item/weapon/disk/data(src) - new /obj/item/weapon/disk/data(src) + for(var/i in 1 to 7) + new /obj/item/weapon/disk/data(src) /* * Manual -- A big ol' manual. diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 79f88ef5797..b0775204b67 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -791,3 +791,14 @@ obj/item/weapon/circuitboard/rdserver req_components = list( /obj/item/weapon/stock_parts/console_screen = 1, /obj/item/weapon/stock_parts/matter_bin = 3) + +/obj/item/weapon/circuitboard/plantgenes + name = "circuit board (Plant DNA Manipulator)" + build_path = /obj/machinery/plantgenes + board_type = "machine" + origin_tech = "programming=2;biotech=3" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 2, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/scanning_module = 1,) \ No newline at end of file diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm new file mode 100644 index 00000000000..37695f75e65 --- /dev/null +++ b/code/modules/hydroponics/gene_modder.dm @@ -0,0 +1,387 @@ +/obj/machinery/plantgenes + name = "plant DNA manipulator" + desc = "An advanced device designed to manipulate plant genetic makeup." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "dnamod" + density = 1 + anchored = 1 + + var/obj/item/seeds/seed + var/obj/item/weapon/disk/plantgene/disk + + var/list/core_genes = list() + var/list/reagent_genes = list() + var/list/trait_genes = list() + + var/datum/plant_gene/target + var/operation = "" + var/rating = 0 // TODO: add failures, make it useful + +/obj/machinery/plantgenes/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/plantgenes(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + RefreshParts() + +/obj/machinery/plantgenes/RefreshParts() + rating = 0 + for(var/obj/item/weapon/stock_parts/S in component_parts) + rating += S.rating-1 + +/obj/machinery/plantgenes/update_icon() + ..() + overlays.Cut() + if((stat & (BROKEN|NOPOWER))) + icon_state = "dnamod-off" + else + icon_state = "dnamod" + if(seed) + overlays += "dnamod-dna" + if(panel_open) + overlays += "dnamod-open" + +/obj/machinery/plantgenes/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I)) + update_icon() + return + if(exchange_parts(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + if(isrobot(user)) + return + + if(istype(I, /obj/item/seeds)) + if(seed) + user << "A sample is already loaded into the machine!" + else + if(!user.drop_item()) + return + insert_seed(I) + user << "You add [I] to the machine." + interact(user) + return + else if(istype(I, /obj/item/weapon/disk/plantgene)) + if(disk) + user << "A data disk is already loaded into the machine!" + else + if(!user.drop_item()) + return + disk = I + disk.loc = src + user << "You add [I] to the machine." + interact(user) + else + ..() + + +/obj/machinery/plantgenes/attack_hand(mob/user) + if(..()) + return + interact(user) + +/obj/machinery/plantgenes/interact(mob/user) + user.set_machine(src) + if(!user) + return + + var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600) // Set up the popup browser window + if(!( in_range(src, user) || istype(user, /mob/living/silicon) )) + popup.close() + return + + var/dat = "" + + if(operation) + if(!seed || (!target && operation != "insert")) + operation = "" + target = null + interact(user) + return + if((operation == "replace" || operation == "insert") && (!disk || !disk.gene)) + operation = "" + target = null + interact(user) + return + + dat += "

Confirm Operation

" + dat += "
Are you sure you want to [operation] " + switch(operation) + if("remove") + dat += "[target.get_name()] gene from \the [seed]?
" +// dat += "Failure may damage or destroy the sample!" // No failures yet. TODO: add failures + if("extract") + dat += "[target.get_name()] gene from \the [seed]?
" + dat += "The sample will be destroyed in process!" + if("replace") + dat += "[target.get_name()] gene with [disk.gene.get_name()]?
" +// dat += "Failure may damage or destroy the sample!" // No failures yet. TODO: add failures + if("insert") + dat += "[disk.gene.get_name()] gene into \the [seed]?
" +// dat += "Failure may damage or destroy the sample!" // No failures yet. TODO: add failures + dat += "
Confirm " + dat += "Abort
" + popup.set_content(dat) + popup.open() + return + + dat+= "
" + + dat += "" + + dat += "" + + dat += "
" + + if(seed) + var/can_insert = disk && disk.gene && disk.gene.can_add(seed) + var/can_extract = disk && !disk.read_only + + dat += "

Core Genes

" + for(var/a in core_genes) + var/datum/plant_gene/G = a + if(!G) + continue + dat += "" + dat += "
[G.get_name()]" + if(can_extract) + dat += "Extract" + if(can_insert && istype(disk.gene, G.type)) + dat += "Replace" + dat += "
" + + if(seed.yield != -1) + dat += "

Content Genes

" + if(reagent_genes.len) + dat += "" + for(var/a in reagent_genes) + var/datum/plant_gene/G = a + dat += "" + dat += "
[G.get_name()]" + if(can_extract) + dat += "Extract" + dat += "Remove" + dat += "
" + else + dat += "No content-related genes detected in sample.
" + dat += "
" + if(can_insert && istype(disk.gene, /datum/plant_gene/reagent)) + dat += "Insert: [disk.gene.get_name()]" + + dat += "

Trait Genes

" + if(trait_genes.len) + dat += "" + for(var/a in trait_genes) + var/datum/plant_gene/G = a + dat += "" + dat += "
[G.get_name()]" + if(can_extract) + dat += "Extract" + dat += "Remove" + dat += "
" + else + dat += "No trait-related genes detected in sample.
" + if(can_insert && istype(disk.gene, /datum/plant_gene/trait)) + dat += "Insert: [disk.gene.get_name()]" + dat += "
" + else + dat += "
No sample found.

Please, insert a plant sample to use this device." + popup.set_content(dat) + popup.open() + + +/obj/machinery/plantgenes/Topic(var/href, var/list/href_list) + if(..()) + return + usr.set_machine(src) + + if(href_list["eject_seed"] && !operation) + if (seed) + seed.loc = src.loc + seed.verb_pickup() + seed = null + update_genes() + update_icon() + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/seeds)) + if(!usr.drop_item()) + return + insert_seed(I) + usr << "You add [I] to the machine." + update_icon() + else if(href_list["eject_disk"] && !operation) + if (disk) + disk.loc = src.loc + disk.verb_pickup() + disk = null + update_genes() + else + var/obj/item/I = usr.get_active_hand() + if(istype(I, /obj/item/weapon/disk/plantgene)) + if(!usr.drop_item()) + return + disk = I + disk.loc = src + usr << "You add [I] to the machine." + else if(href_list["op"] == "insert" && disk && disk.gene && seed) + if(!operation) // Wait for confirmation + operation = "insert" + else + if(!istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed)) + seed.genes += disk.gene.Copy() + if(istype(disk.gene, /datum/plant_gene/reagent)) + seed.reagents_from_genes() + update_genes() + operation = "" + target = null + + else if(href_list["gene"] && seed) + var/datum/plant_gene/G = seed.get_gene(href_list["gene"]) + if(!G || !href_list["op"] || !(href_list["op"] in list("remove", "extract", "replace"))) + interact(usr) + return + + if(!operation || target != G) // Wait for confirmation + target = G + operation = href_list["op"] + + else if(operation == href_list["op"] && target == G) + switch(href_list["op"]) + if("remove") + if(!istype(G, /datum/plant_gene/core)) + seed.genes -= G + if(istype(G, /datum/plant_gene/reagent)) + seed.reagents_from_genes() + if("extract") + if(disk && !disk.read_only) + disk.gene = G + disk.update_name() + qdel(seed) + seed = null + update_icon() + if("replace") + if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core)) + seed.genes -= G + var/datum/plant_gene/core/C = disk.gene.Copy() + seed.genes += C + C.apply_stat(seed) + if("insert") + if(disk && disk.gene && !istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed)) + seed.genes += disk.gene.Copy() + if(istype(disk.gene, /datum/plant_gene/reagent)) + seed.reagents_from_genes() + + update_genes() + operation = "" + target = null + else if(href_list["abort"]) + operation = "" + target = null + + interact(usr) + +/obj/machinery/plantgenes/proc/insert_seed(obj/item/seeds/S) + if(!istype(S) || seed) + return + S.loc = src + seed = S + update_genes() + update_icon() + +/obj/machinery/plantgenes/proc/update_genes() + core_genes = list() + reagent_genes = list() + trait_genes = list() + + if(seed) + var/gene_paths = list( + /datum/plant_gene/core/potency, + /datum/plant_gene/core/yield, + /datum/plant_gene/core/production, + /datum/plant_gene/core/endurance, + /datum/plant_gene/core/lifespan + ) + for(var/a in gene_paths) + core_genes += seed.get_gene(a) + + for(var/datum/plant_gene/reagent/G in seed.genes) + reagent_genes += G + for(var/datum/plant_gene/trait/G in seed.genes) + trait_genes += G + + + +/* + * Plant DNA disk + */ + +/obj/item/weapon/disk/plantgene + name = "plant data disk" + desc = "A disk for storing plant genetic data." + icon_state = "datadisk2" + materials = list(MAT_METAL=30, MAT_GLASS=10) + var/datum/plant_gene/gene + var/read_only = 0 //Well, it's still a floppy disk + +/obj/item/weapon/disk/plantgene/New() + ..() + overlays += "datadisk_gene" + src.pixel_x = rand(-5, 5) + src.pixel_y = rand(-5, 5) + +/obj/item/weapon/disk/plantgene/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/pen)) + var/t = stripped_input(user, "What would you like the label to be?", name, null) + if(user.get_active_hand() != W) + return + if(!in_range(src, user) && loc != user) + return + if(t) + name = "plant data disk - '[t]'" + else + name = "plant data disk" + +/obj/item/weapon/disk/plantgene/proc/update_name() + if(gene) + name = "plant data disk - '[gene.get_name()]'" + else + name = "plant data disk" + +/obj/item/weapon/disk/plantgene/attack_self(mob/user) + read_only = !read_only + user << "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"]." + +/obj/item/weapon/disk/plantgene/examine(mob/user) + ..() + user << "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"]." + + +/* + * Plant DNA Disks Box + */ +/obj/item/weapon/storage/box/disks_plantgene + name = "plant data disks box" + icon_state = "disk_kit" + +/obj/item/weapon/storage/box/disks_plantgene/New() + ..() + for(var/i in 1 to 7) + new /obj/item/weapon/disk/plantgene(src) \ No newline at end of file diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 02226ad0ade..59caa40fe7c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -23,7 +23,7 @@ else if(ispath(seed)) // This is for adminspawn or map-placed growns. They get the default stats of their seed type. seed = new seed() - seed.potency = 50 + seed.adjust_potency(50-seed.potency) else // Something is terribly wrong qdel(src) return @@ -77,7 +77,7 @@ if(reag_txt) msg += reag_txt - msg += "*---------*" + msg += "
*---------*" user << msg return return @@ -128,8 +128,8 @@ var/datum/plant_gene/trait/slip/S = seed.get_gene(/datum/plant_gene/trait/slip) if(S && !ispath(trash, /obj/item/weapon/grown) && iscarbon(AM)) var/mob/living/carbon/M = AM - var/stun = min(seed.potency * S.rate * 2, 1) - var/weaken = min(seed.potency * S.rate, 0.5) + var/stun = max(seed.potency * S.rate * 2, 1) + var/weaken = max(seed.potency * S.rate, 0.5) if(M.slip(stun, weaken, src)) for(var/datum/plant_gene/trait/T in seed.genes) T.on_slip(src, M) diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 7f5bc5e7f27..cf05ca2b1a8 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -30,7 +30,7 @@ // Orange /obj/item/seeds/orange - name = "pack of orange seed" + name = "pack of orange seeds" desc = "Sour seeds." icon_state = "seed-orange" species = "orange" diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index a97cf99a19e..6af91f91aa9 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -17,7 +17,7 @@ else if(ispath(seed)) // This is for adminspawn or map-placed growns. They get the default stats of their seed type. seed = new seed() - seed.potency = 50 + seed.adjust_potency(50-seed.potency) else // Something is terribly wrong qdel(src) return @@ -53,8 +53,8 @@ var/datum/plant_gene/trait/slip/S = seed.get_gene(/datum/plant_gene/trait/slip) if(S && iscarbon(AM)) var/mob/living/carbon/M = AM - var/stun = min(seed.potency * S.rate * 2, 1) - var/weaken = min(seed.potency * S.rate, 0.5) + var/stun = max(seed.potency * S.rate * 2, 1) + var/weaken = max(seed.potency * S.rate, 0.5) if(M.slip(stun, weaken, src)) for(var/datum/plant_gene/trait/T in seed.genes) T.on_slip(src, M) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 364a0b68d2a..24e3e9e0527 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -4,11 +4,15 @@ /datum/plant_gene/proc/get_name() // Used for manipulator display and gene disk name. return name +/datum/plant_gene/proc/can_add(obj/item/seeds/S) + return TRUE + /datum/plant_gene/proc/Copy() return new type + // Core plant genes store 5 main variables: lifespan, endurance, production, yield, potency /datum/plant_gene/core var/value @@ -16,6 +20,9 @@ /datum/plant_gene/core/get_name() return "[name] [value]" +/datum/plant_gene/core/proc/apply_stat(obj/item/seeds/S) + return + /datum/plant_gene/core/New(var/i = null) ..() if(!isnull(i)) @@ -26,27 +33,47 @@ C.value = value return C +/datum/plant_gene/core/can_add(obj/item/seeds/S) + return S.get_gene(src.type) /datum/plant_gene/core/lifespan name = "Lifespan" value = 25 +/datum/plant_gene/core/lifespan/apply_stat(obj/item/seeds/S) + S.lifespan = value + + /datum/plant_gene/core/endurance name = "Endurance" value = 15 +/datum/plant_gene/core/endurance/apply_stat(obj/item/seeds/S) + S.endurance = value + + /datum/plant_gene/core/production name = "Production Speed" value = 6 +/datum/plant_gene/core/production/apply_stat(obj/item/seeds/S) + S.production = value + + /datum/plant_gene/core/yield name = "Yield" value = 3 +/datum/plant_gene/core/yield/apply_stat(obj/item/seeds/S) + S.yield = value + + /datum/plant_gene/core/potency name = "Potency" value = 10 +/datum/plant_gene/core/potency/apply_stat(obj/item/seeds/S) + S.potency = value // Reagent genes store reagent ID and reagent ratio. Amount of reagent in the plant = 1 + (potency * rate) @@ -79,6 +106,11 @@ G.rate = rate return G +/datum/plant_gene/reagent/can_add(obj/item/seeds/S) + for(var/datum/plant_gene/reagent/R in S.genes) + if(R.reagent_id == reagent_id) + return FALSE + return TRUE // Various traits affecting the product. Each must be somehow useful. @@ -86,12 +118,21 @@ var/rate = 0.05 var/examine_line = "" var/list/origin_tech = null + var/trait_id // must be set and equal for any two traits of the same type /datum/plant_gene/trait/Copy() var/datum/plant_gene/trait/G = ..() G.rate = rate return G +/datum/plant_gene/trait/can_add(obj/item/seeds/S) + for(var/datum/plant_gene/trait/R in S.genes) + if(trait_id && R.trait_id == trait_id) + return FALSE + if(type == R.type) + return FALSE + return TRUE + /datum/plant_gene/trait/proc/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc) if(origin_tech) // This ugly code segment adds RnD tech levels to resulting plants. if(G.origin_tech) @@ -179,6 +220,7 @@ name = "Bioluminescence" rate = 0.1 examine_line = "It emits a soft glow." + trait_id = "glow" /datum/plant_gene/trait/glow/proc/get_lum(obj/item/seeds/S) return round(S.potency*rate) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 26ce249e646..b13dd503231 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -78,6 +78,7 @@ for(var/g in genes) var/datum/plant_gene/G = g S.genes += G.Copy() + S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes. return S /obj/item/seeds/proc/get_gene(typepath) @@ -141,10 +142,10 @@ if(T.reagents) for(var/reagent_id in reagents_add) if(reagent_id == "blood") // Hack to make blood in plants always O- - T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id]), list("blood_type"="O-")) + T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id], 1), list("blood_type"="O-")) continue - T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id])) + T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id]), 1) return 1 diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi index 904eb38c53cb8682f31b25dd97e248ff427b922c..9b35f0851ad369342401600302c890cbe4c23c03 100644 GIT binary patch literal 17964 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 literal 16233 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

OLGM@hcbr{)F470l9AVLkV z^{(Wfl_j_b@85DqZ#Hu?<5Nlg)h{$q_MSgu$v+@#*Eni}0-RkBD!7QPAT8On^2|>| tG&cq-#c>BDED%&>3f_UiHrhv=OroFK)MzHl;4Aci?Av#5N+k4s{|9d>JW~Jw diff --git a/tgstation.dme b/tgstation.dme index 9927e75c18f..d64ff1487ef 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1089,6 +1089,7 @@ #include "code\modules\html_interface\cards\cards.dm" #include "code\modules\html_interface\nanotrasen\nanotrasen.dm" #include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\gene_modder.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\growninedible.dm" #include "code\modules\hydroponics\hydroitemdefines.dm"