diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 77306a0e167..fb100742d3b 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -407,13 +407,16 @@ This is here to make the tiles around the station mininuke change when it's arme
SetTurfs()
//==========DAT FUKKEN DISK===============
+/obj/item/weapon/disk
+ icon = 'icons/obj/module.dmi'
+ w_class = 1
+ item_state = "card-id"
+ icon_state = "datadisk0"
+
/obj/item/weapon/disk/nuclear
name = "nuclear authentication disk"
desc = "Better keep this safe."
- icon = 'icons/obj/items.dmi'
icon_state = "nucleardisk"
- item_state = "card-id"
- w_class = 1
/obj/item/weapon/disk/nuclear/New()
..()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index ab1c078c395..85b3363e073 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -51,13 +51,25 @@
//TO-DO: Make the genetics machine accept them.
/obj/item/weapon/disk/data
name = "cloning data disk"
- icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
- item_state = "card-id"
- w_class = 1
var/list/fields = list()
var/read_only = 0 //Well,it's still a floppy disk
+//Disk stuff.
+/obj/item/weapon/disk/data/New()
+ ..()
+ icon_state = "datadisk[rand(0,6)]"
+ overlays += "datadisk_gene"
+
+
+/obj/item/weapon/disk/data/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/data/examine(mob/user)
+ ..()
+ user << "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"]."
+
//Find a dead mob with a brain and client.
/proc/find_dead_player(find_key)
@@ -78,19 +90,6 @@
break
return selected
-//Disk stuff.
-/obj/item/weapon/disk/data/New()
- ..()
- icon_state = "datadisk[pick(0,1,2)]"
-
-/obj/item/weapon/disk/data/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/data/examine(mob/user)
- ..()
- user << "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"]."
-
//Health Tracker Implant
/obj/item/weapon/implant/health
diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm
index 7feca692186..97a1fab67d0 100644
--- a/code/game/objects/items/robot/ai_upgrades.dm
+++ b/code/game/objects/items/robot/ai_upgrades.dm
@@ -5,8 +5,8 @@
/obj/item/device/malf_upgrade
name = "combat software upgrade"
desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs."
- icon = 'icons/obj/cloning.dmi'
- icon_state = "datadisk0"
+ icon = 'icons/obj/module.dmi'
+ icon_state = "datadisk3"
/obj/item/device/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
@@ -26,8 +26,8 @@
/obj/item/device/surveillance_upgrade
name = "surveillance software upgrade"
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
- icon = 'icons/obj/cloning.dmi'
- icon_state = "datadisk0"
+ icon = 'icons/obj/module.dmi'
+ icon_state = "datadisk3"
/obj/item/device/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
if(!istype(AI))
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 0c14842f4a1..02226ad0ade 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -24,7 +24,6 @@
// This is for adminspawn or map-placed growns. They get the default stats of their seed type.
seed = new seed()
seed.potency = 50
- seed.prepare_result(src)
else // Something is terribly wrong
qdel(src)
return
@@ -35,16 +34,13 @@
if(dried_type == -1)
dried_type = src.type
- add_juice()
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_new(src, newloc)
+ seed.prepare_result(src)
+ add_juice()
transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
- var/datum/plant_gene/trait/glow/G = seed.get_gene(/datum/plant_gene/trait/glow)
- if(G)
- if(istype(src.loc,/mob))
- pickup(src.loc)//adjusts the lighting on the mob
- else
- src.SetLuminosity(G.get_lum(seed))
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/add_juice()
@@ -117,7 +113,7 @@
for(var/datum/plant_gene/trait/trait in seed.genes)
trait.on_squash(src, target)
- for(var/atom/A in T)
+ for(var/A in T)
reagents.reaction(A)
qdel(src)
@@ -128,9 +124,9 @@
T.on_consume(src, usr)
..()
-/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(AM as mob|obj)
+/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM)
var/datum/plant_gene/trait/slip/S = seed.get_gene(/datum/plant_gene/trait/slip)
- if(S && !ispath(trash, /obj/item/weapon/grown) && istype(AM, /mob/living/carbon))
+ 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)
@@ -144,7 +140,7 @@
// Glow gene procs
/obj/item/weapon/reagent_containers/food/snacks/grown/Destroy()
var/datum/plant_gene/trait/glow/G = seed.get_gene(/datum/plant_gene/trait/glow)
- if(G && istype(loc,/mob))
+ if(G && ismob(loc))
loc.AddLuminosity(-G.get_lum(seed))
return ..()
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 95e8ccc6387..a439da93253 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -100,14 +100,12 @@
icon_state = "banana_blue"
trash = /obj/item/weapon/grown/bananapeel/bluespace
filling_color = "#0000FF"
- origin_tech = "bluespace=3"
/obj/item/weapon/grown/bananapeel/bluespace
seed = /obj/item/seeds/banana/bluespace
name = "bluespace banana peel"
desc = "A peel from a bluespace banana."
icon_state = "banana_peel_blue"
- origin_tech = "bluespace=3"
// Other
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index 338f5318664..2e2dc8815bb 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -86,7 +86,6 @@
name = "blue-space tomato"
desc = "So lubricated, you might slip through space-time."
icon_state = "bluespacetomato"
- origin_tech = "bluespace=3"
// Killer Tomato
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 6a997407847..a97cf99a19e 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -18,7 +18,6 @@
// This is for adminspawn or map-placed growns. They get the default stats of their seed type.
seed = new seed()
seed.potency = 50
- seed.prepare_result(src)
else // Something is terribly wrong
qdel(src)
return
@@ -26,16 +25,14 @@
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
- add_juice()
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_new(src, newloc)
+ if(istype(src, seed.product)) // no adding reagents if it is just a trash item
+ seed.prepare_result(src)
+ add_juice()
transform *= TransformUsingVariable(seed.potency, 100, 0.5)
- var/datum/plant_gene/trait/glow/G = seed.get_gene(/datum/plant_gene/trait/glow)
- if(G)
- if(istype(src.loc,/mob))
- pickup(src.loc)//adjusts the lighting on the mob
- else
- src.SetLuminosity(G.get_lum(seed))
/obj/item/weapon/grown/attackby(obj/item/O, mob/user, params)
..()
@@ -52,9 +49,9 @@
return 0
-/obj/item/weapon/grown/Crossed(AM as mob|obj)
+/obj/item/weapon/grown/Crossed(atom/movable/AM)
var/datum/plant_gene/trait/slip/S = seed.get_gene(/datum/plant_gene/trait/slip)
- if(S && istype(AM, /mob/living/carbon))
+ 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)
@@ -68,7 +65,7 @@
// Glow gene procs
/obj/item/weapon/grown/Destroy()
var/datum/plant_gene/trait/glow/G = seed.get_gene(/datum/plant_gene/trait/glow)
- if(G && istype(loc,/mob))
+ if(G && ismob(loc))
loc.AddLuminosity(-G.get_lum(seed))
return ..()
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 433e4cf1828..364a0b68d2a 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -85,22 +85,36 @@
/datum/plant_gene/trait
var/rate = 0.05
var/examine_line = ""
+ var/list/origin_tech = null
/datum/plant_gene/trait/Copy()
var/datum/plant_gene/trait/G = ..()
G.rate = rate
return G
+/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)
+ var/list/tech = params2list(G.origin_tech)
+ for(var/t in origin_tech)
+ if(t in tech)
+ tech[t] = max(tech[t], origin_tech[t])
+ else
+ tech[t] = origin_tech[t]
+ G.origin_tech = list2params(tech)
+ else
+ G.origin_tech = list2params(origin_tech)
+ return
+
/datum/plant_gene/trait/proc/on_consume(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
return
-
/datum/plant_gene/trait/proc/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
return
-
/datum/plant_gene/trait/proc/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
return
+
/datum/plant_gene/trait/squash
// Allows the plant to be squashed when thrown or slipped on, leaving a colored mess and trash type item behind.
// Also splashes everything in target turf with reagents and applies other trait effects (teleporting, etc) to the target by on_squash.
@@ -128,6 +142,7 @@
// Multiplies max charge by (rate*1000) when used in potato power cells.
name = "Electrical Activity"
rate = 0.01
+ origin_tech = list("powerstorage" = 4)
/datum/plant_gene/trait/cell_charge/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/power = G.seed.potency*rate*5
@@ -168,6 +183,13 @@
/datum/plant_gene/trait/glow/proc/get_lum(obj/item/seeds/S)
return round(S.potency*rate)
+/datum/plant_gene/trait/glow/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
+ ..()
+ if(ismob(newloc))
+ G.pickup(newloc)//adjusts the lighting on the mob
+ else
+ G.SetLuminosity(get_lum(G.seed))
+
/datum/plant_gene/trait/glow/berry
name = "Strong Bioluminescence"
rate = 0.2
@@ -178,6 +200,7 @@
// Teleport radius is calculated as max(round(potency*rate), 1)
name = "Bluespace Activity"
rate = 0.1
+ origin_tech = list("bluespace" = 3)
/datum/plant_gene/trait/teleport/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
if(isliving(target))
@@ -195,4 +218,17 @@
do_teleport(G, T, teleport_radius)
else
new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect...
- qdel(G)
\ No newline at end of file
+ qdel(G)
+
+
+/datum/plant_gene/trait/noreact
+ // Makes plant NOREACT until squashed.
+ name = "Separated Chemicals"
+
+/datum/plant_gene/trait/noreact/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
+ ..()
+ G.flags |= NOREACT
+
+/datum/plant_gene/trait/noreact/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ G.flags &= ~NOREACT
+ G.reagents.handle_reactions()
\ No newline at end of file
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index e98d0c111c4..26ce249e646 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -51,9 +51,9 @@
if(!nogenes) // not used on Copy()
genes += new /datum/plant_gene/core/lifespan(lifespan)
genes += new /datum/plant_gene/core/endurance(endurance)
- genes += new /datum/plant_gene/core/production(production)
if(yield != -1)
genes += new /datum/plant_gene/core/yield(yield)
+ genes += new /datum/plant_gene/core/production(production)
if(potency != -1)
genes += new /datum/plant_gene/core/potency(potency)
@@ -83,6 +83,12 @@
/obj/item/seeds/proc/get_gene(typepath)
return (locate(typepath) in genes)
+/obj/item/seeds/proc/reagents_from_genes()
+ reagents_add = list()
+ for(var/datum/plant_gene/reagent/R in genes)
+ reagents_add[R.reagent_id] = R.rate
+
+
/obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/item/projectile/energy/florayield))
@@ -120,7 +126,6 @@
var/product_name
while(t_amount < getYield())
var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src)
- prepare_result(t_prod)
result.Add(t_prod) // User gets a consumable
if(!t_prod)
return
@@ -164,9 +169,10 @@
C.value = endurance
/obj/item/seeds/proc/adjust_production(adjustamt)
- production = Clamp(production + adjustamt, 2, 10)
- var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production)
- C.value = production
+ if(yield != -1)
+ production = Clamp(production + adjustamt, 2, 10)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production)
+ C.value = production
/obj/item/seeds/proc/adjust_potency(adjustamt)
if(potency != -1)
@@ -191,7 +197,8 @@
if(yield != -1)
text += "- Yield: [yield]\n"
text += "- Maturation speed: [maturation]\n"
- text += "- Production speed: [production]\n"
+ if(yield != -1)
+ text += "- Production speed: [production]\n"
text += "- Endurance: [endurance]\n"
text += "- Lifespan: [lifespan]\n"
if(rarity)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 17de8229dea..8e3f719d11f 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -63,10 +63,7 @@ other types of metals and chemistry for reagents).
/obj/item/weapon/disk/design_disk
name = "Component Design Disk"
desc = "A disk for storing device design data for construction in lathes."
- icon = 'icons/obj/cloning.dmi'
- icon_state = "datadisk2"
- item_state = "card-id"
- w_class = 1
+ icon_state = "datadisk1"
materials = list(MAT_METAL=30, MAT_GLASS=10)
var/datum/design/blueprint
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 154cd02b932..552765519cb 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -105,15 +105,15 @@ research holder datum.
for(var/datum/tech/PT in possible_tech)
if(TechHasReqs(PT))
AddTech2Known(PT)
-
+
for(var/datum/design/PD in possible_designs)
if(DesignHasReqs(PD))
AddDesign2Known(PD)
-
+
for(var/v in known_tech)
var/datum/tech/T = known_tech[v]
T.level = Clamp(T.level, 1, 20)
-
+
for(var/v in known_designs)
var/datum/design/D = known_designs[v]
D.CalcReliability(known_tech)
@@ -275,10 +275,7 @@ research holder datum.
/obj/item/weapon/disk/tech_disk
name = "Technology Disk"
desc = "A disk for storing technology data for further research."
- icon = 'icons/obj/cloning.dmi'
- icon_state = "datadisk2"
- item_state = "card-id"
- w_class = 1
+ icon_state = "datadisk0"
materials = list(MAT_METAL=30, MAT_GLASS=10)
var/datum/tech/stored
diff --git a/icons/obj/cloning.dmi b/icons/obj/cloning.dmi
index a65c2a43f78..5aa439df6bc 100644
Binary files a/icons/obj/cloning.dmi and b/icons/obj/cloning.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index fb68f0bcc65..e317e004860 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ