Added plant controller.

This commit is contained in:
Zuhayr
2015-02-05 15:53:20 +10:30
parent 5a1980aabd
commit 5890fa3c4b
21 changed files with 241 additions and 177 deletions

View File

@@ -960,6 +960,7 @@
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\grown_inedible.dm"
#include "code\modules\hydroponics\seed.dm"
#include "code\modules\hydroponics\seed_controller.dm"
#include "code\modules\hydroponics\seed_datums.dm"
#include "code\modules\hydroponics\seed_machines.dm"
#include "code\modules\hydroponics\seed_mobs.dm"

View File

@@ -48,7 +48,7 @@
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event"))
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -106,5 +106,8 @@
if("Event")
debug_variables(event_manager)
feedback_add_details("admin_verb", "DEvent")
if("Plants")
debug_variables(plant_controller)
feedback_add_details("admin_verb", "DPlants")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return

View File

@@ -16,10 +16,10 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
var/datum/seed/new_seed_type
if(istype(O, /obj/item/weapon/grown))
var/obj/item/weapon/grown/F = O
new_seed_type = seed_types[F.plantname]
new_seed_type = plant_controller.seeds[F.plantname]
else
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
new_seed_type = seed_types[F.plantname]
new_seed_type = plant_controller.seeds[F.plantname]
if(new_seed_type)
user << "<span class='notice'>You extract some seeds from [O].</span>"

View File

@@ -17,6 +17,14 @@
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
/obj/effect/decal/remains/mouse
desc = "They look like the remains of a small rodent."
icon_state = "mouse"
/obj/effect/decal/remains/lizard
desc = "They look like the remains of a small rodent."
icon_state = "lizard"
/obj/effect/decal/remains/attack_hand(mob/user as mob)
user << "<span class='notice'>[src] sinks together into a pile of ash.</span>"
var/turf/simulated/floor/F = get_turf(src)

View File

@@ -254,11 +254,5 @@ var/static/list/scarySounds = list(
// Bomb cap!
var/max_explosion_range = 14
// Several cache lists for plants/hydroponics.
var/global/list/seed_types = list() // A list of all seed data.
var/global/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness.
var/global/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds.
// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
var/global/obj/item/device/radio/intercom/global_announcer = new(null)

View File

@@ -1001,10 +1001,10 @@ var/global/floorIsLava = 0
if(!check_rights(R_SPAWN)) return
var/seedtype = input("Select a seed type", "Spawn Fruit") as null|anything in seed_types
if(!seedtype || !seed_types[seedtype])
var/seedtype = input("Select a seed type", "Spawn Fruit") as null|anything in plant_controller.seeds
if(!seedtype || !plant_controller.seeds[seedtype])
return
var/datum/seed/S = seed_types[seedtype]
var/datum/seed/S = plant_controller.seeds[seedtype]
S.harvest(usr,0,0,1)
/datum/admins/proc/spawn_plant()
@@ -1014,10 +1014,10 @@ var/global/floorIsLava = 0
if(!check_rights(R_SPAWN)) return
var/seedtype = input("Select a seed type", "Spawn Plant") as null|anything in seed_types
if(!seedtype || !seed_types[seedtype])
var/seedtype = input("Select a seed type", "Spawn Plant") as null|anything in plant_controller.seeds
if(!seedtype || !plant_controller.seeds[seedtype])
return
new /obj/effect/plant(get_turf(usr), seed_types[seedtype])
new /obj/effect/plant(get_turf(usr), plant_controller.seeds[seedtype])
/datum/admins/proc/spawn_atom(var/object as text)
set category = "Debug"

View File

@@ -24,7 +24,15 @@
if(!plantname)
return
seed = seed_types[plantname]
if(!plant_controller)
sleep(250) // ugly hack, should mean roundstart plants are fine.
if(!plant_controller)
world << "<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>"
del(src)
return
seed = plant_controller.seeds[plantname]
if(!seed)
return

View File

@@ -19,7 +19,7 @@
//Handle some post-spawn var stuff.
if(planttype)
plantname = planttype
var/datum/seed/S = seed_types[plantname]
var/datum/seed/S = plant_controller.seeds[plantname]
if(!S || !S.chems)
return

View File

@@ -1,96 +1,3 @@
// Sprite lists.
var/global/list/plant_sprites = list() // List of all harvested product sprites.
var/global/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
// Proc for creating a random seed type.
/proc/create_random_seed(var/survive_on_station)
var/datum/seed/seed = new()
seed.randomize()
seed.uid = seed_types.len + 1
seed.name = "[seed.uid]"
seed_types[seed.name] = seed
if(survive_on_station)
if(seed.consume_gasses)
seed.consume_gasses["phoron"] = null
seed.consume_gasses["carbon_dioxide"] = null
seed.set_trait(TRAIT_IDEAL_HEAT,293)
seed.set_trait(TRAIT_HEAT_TOLERANCE,20)
seed.set_trait(TRAIT_IDEAL_LIGHT,8)
seed.set_trait(TRAIT_LIGHT_TOLERANCE,5)
seed.set_trait(TRAIT_LOWKPA_TOLERANCE,25)
seed.set_trait(TRAIT_HIGHKPA_TOLERANCE,200)
return seed
// Debug for testing seed genes.
/client/proc/show_plant_genes()
set category = "Debug"
set name = "Show Plant Genes"
set desc = "Prints the round's plant gene masks."
if(!holder) return
if(!gene_tag_masks)
usr << "Gene masks not set."
return
for(var/mask in gene_tag_masks)
usr << "[mask]: [gene_tag_masks[mask]]"
// Predefined/roundstart varieties use a string key to make it
// easier to grab the new variety when mutating. Post-roundstart
// and mutant varieties use their uid converted to a string instead.
// Looks like shit but it's sort of necessary.
proc/populate_seed_list()
// Build the icon lists.
for(var/icostate in icon_states('icons/obj/hydroponics_growing.dmi'))
var/split = findtext(icostate,"-")
if(!split)
// invalid icon_state
continue
var/ikey = copytext(icostate,(split+1))
if(ikey == "dead")
// don't count dead icons
continue
ikey = text2num(ikey)
var/base = copytext(icostate,1,split)
if(!(plant_sprites[base]) || (plant_sprites[base]<ikey))
plant_sprites[base] = ikey
for(var/icostate in icon_states('icons/obj/hydroponics_products.dmi'))
plant_product_sprites |= icostate
// Populate the global seed datum list.
for(var/type in typesof(/datum/seed)-/datum/seed)
var/datum/seed/S = new type
seed_types[S.name] = S
S.uid = "[seed_types.len]"
S.roundstart = 1
// Make sure any seed packets that were mapped in are updated
// correctly (since the seed datums did not exist a tick ago).
for(var/obj/item/seeds/S in world)
S.update_seed()
//Might as well mask the gene types while we're at it.
var/list/used_masks = list()
var/list/plant_traits = ALL_GENES
while(plant_traits && plant_traits.len)
var/gene_tag = pick(plant_traits)
var/gene_mask = "[num2hex(rand(0,255))]"
while(gene_mask in used_masks)
gene_mask = "[num2hex(rand(0,255))]"
used_masks += gene_mask
plant_traits -= gene_tag
gene_tag_masks[gene_tag] = gene_mask
/datum/plantgene
var/genetype // Label used when applying trait.
var/list/values // Values to copy into the target seed datum.
@@ -380,8 +287,8 @@ proc/populate_seed_list()
seed_noun = pick("spores","nodes","cuttings","seeds")
set_trait(TRAIT_POTENCY,rand(5,30),200,0)
set_trait(TRAIT_PRODUCT_ICON,pick(plant_product_sprites))
set_trait(TRAIT_PLANT_ICON,pick(plant_sprites))
set_trait(TRAIT_PRODUCT_ICON,pick(plant_controller.plant_product_sprites))
set_trait(TRAIT_PLANT_ICON,pick(plant_controller.plant_sprites))
set_trait(TRAIT_PLANT_COLOUR,"#[get_random_colour(0,75,190)]")
set_trait(TRAIT_PRODUCT_COLOUR,"#[get_random_colour(0,75,190)]")
update_growth_stages()
@@ -679,10 +586,10 @@ proc/populate_seed_list()
if(istype(user)) user << "You [harvest_sample ? "take a sample" : "harvest"] from the [display_name]."
//This may be a new line. Update the global if it is.
if(name == "new line" || !(name in seed_types))
uid = seed_types.len + 1
if(name == "new line" || !(name in plant_controller.seeds))
uid = plant_controller.seeds.len + 1
name = "[uid]"
seed_types[name] = src
plant_controller.seeds[name] = src
if(harvest_sample)
var/obj/item/seeds/seeds = new(get_turf(user))
@@ -759,6 +666,6 @@ proc/populate_seed_list()
/datum/seed/proc/update_growth_stages()
if(get_trait(TRAIT_PLANT_ICON))
growth_stages = plant_sprites[get_trait(TRAIT_PLANT_ICON)]
growth_stages = plant_controller.plant_sprites[get_trait(TRAIT_PLANT_ICON)]
else
growth_stages = 0

View File

@@ -0,0 +1,131 @@
//Attempts to offload processing for the spreading plants from the MC.
// Processes vines/spreading plants.
#define PLANTS_PER_TICK 5
#define PLANT_TICK_TIME 5
// Debug for testing seed genes.
/client/proc/show_plant_genes()
set category = "Debug"
set name = "Show Plant Genes"
set desc = "Prints the round's plant gene masks."
if(!holder) return
if(!plant_controller.gene_tag_masks)
usr << "Gene masks not set."
return
for(var/mask in plant_controller.gene_tag_masks)
usr << "[mask]: [plant_controller.gene_tag_masks[mask]]"
var/global/datum/controller/plants/plant_controller // Set in New().
/datum/controller/plants
var/list/plants = list() // All currently processing plants.
var/list/seeds = list() // All seed data stored here.
var/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness.
var/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds.
var/list/plant_sprites = list() // List of all harvested product sprites.
var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
var/processing = 0
/datum/controller/plants/New()
if(plant_controller && plant_controller != src)
log_debug("Rebuilding plant controller.")
del(plant_controller)
plant_controller = src
setup()
process()
// Predefined/roundstart varieties use a string key to make it
// easier to grab the new variety when mutating. Post-roundstart
// and mutant varieties use their uid converted to a string instead.
// Looks like shit but it's sort of necessary.
/datum/controller/plants/proc/setup()
// Build the icon lists.
for(var/icostate in icon_states('icons/obj/hydroponics_growing.dmi'))
var/split = findtext(icostate,"-")
if(!split)
// invalid icon_state
continue
var/ikey = copytext(icostate,(split+1))
if(ikey == "dead")
// don't count dead icons
continue
ikey = text2num(ikey)
var/base = copytext(icostate,1,split)
if(!(plant_sprites[base]) || (plant_sprites[base]<ikey))
plant_sprites[base] = ikey
for(var/icostate in icon_states('icons/obj/hydroponics_products.dmi'))
plant_product_sprites |= icostate
// Populate the global seed datum list.
for(var/type in typesof(/datum/seed)-/datum/seed)
var/datum/seed/S = new type
seeds[S.name] = S
S.uid = "[seeds.len]"
S.roundstart = 1
// Make sure any seed packets that were mapped in are updated
// correctly (since the seed datums did not exist a tick ago).
for(var/obj/item/seeds/S in world)
S.update_seed()
//Might as well mask the gene types while we're at it.
var/list/used_masks = list()
var/list/plant_traits = ALL_GENES
while(plant_traits && plant_traits.len)
var/gene_tag = pick(plant_traits)
var/gene_mask = "[num2hex(rand(0,255))]"
while(gene_mask in used_masks)
gene_mask = "[num2hex(rand(0,255))]"
used_masks += gene_mask
plant_traits -= gene_tag
gene_tag_masks[gene_tag] = gene_mask
// Proc for creating a random seed type.
/datum/controller/plants/proc/create_random_seed(var/survive_on_station)
var/datum/seed/seed = new()
seed.randomize()
seed.uid = plant_controller.seeds.len + 1
seed.name = "[seed.uid]"
seeds[seed.name] = seed
if(survive_on_station)
if(seed.consume_gasses)
seed.consume_gasses["phoron"] = null
seed.consume_gasses["carbon_dioxide"] = null
seed.set_trait(TRAIT_IDEAL_HEAT,293)
seed.set_trait(TRAIT_HEAT_TOLERANCE,20)
seed.set_trait(TRAIT_IDEAL_LIGHT,8)
seed.set_trait(TRAIT_LIGHT_TOLERANCE,5)
seed.set_trait(TRAIT_LOWKPA_TOLERANCE,25)
seed.set_trait(TRAIT_HIGHKPA_TOLERANCE,200)
return seed
/datum/controller/plants/proc/process()
processing = 1
spawn(0)
set background = 1
while(1)
if(!processing)
sleep(PLANT_TICK_TIME)
else
var/processed = 0
for(var/x=0;x<PLANTS_PER_TICK;x++)
if(!plants.len)
break
sleep(-1)
var/obj/effect/plant/plant = pick(plants)
plants -= plant
plant.process()
/datum/controller/plants/proc/add_plant(var/obj/effect/plant/plant)
plants |= plant

View File

@@ -144,8 +144,8 @@
var/list/data = list()
var/list/geneMasks[0]
for(var/gene_tag in gene_tag_masks)
geneMasks.Add(list(list("tag" = gene_tag, "mask" = gene_tag_masks[gene_tag])))
for(var/gene_tag in plant_controller.gene_tag_masks)
geneMasks.Add(list(list("tag" = gene_tag, "mask" = plant_controller.gene_tag_masks[gene_tag])))
data["geneMasks"] = geneMasks
data["activity"] = active
@@ -186,10 +186,10 @@
if(!seed) return
seed.loc = get_turf(src)
if(seed.seed.name == "new line" || isnull(seed_types[seed.seed.name]))
seed.seed.uid = seed_types.len + 1
if(seed.seed.name == "new line" || isnull(plant_controller.seeds[seed.seed.name]))
seed.seed.uid = plant_controller.seeds.len + 1
seed.seed.name = "[seed.seed.uid]"
seed_types[seed.seed.name] = seed.seed
plant_controller.seeds[seed.seed.name] = seed.seed
seed.update_seed()
visible_message("\icon[src] [src] beeps and spits out [seed].")
@@ -242,8 +242,8 @@
if(!genetics.roundstart)
loaded_disk.genesource += " (variety #[genetics.uid])"
loaded_disk.name += " ([gene_tag_masks[href_list["get_gene"]]], #[genetics.uid])"
loaded_disk.desc += " The label reads \'gene [gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'."
loaded_disk.name += " ([plant_controller.gene_tag_masks[href_list["get_gene"]]], #[genetics.uid])"
loaded_disk.desc += " The label reads \'gene [plant_controller.gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'."
eject_disk = 1
degradation += rand(20,60)
@@ -288,7 +288,7 @@
for(var/datum/plantgene/P in loaded_disk.genes)
if(data["locus"] != "") data["locus"] += ", "
data["locus"] += "[gene_tag_masks[P.genetype]]"
data["locus"] += "[plant_controller.gene_tag_masks[P.genetype]]"
else
data["disk"] = 0
@@ -318,7 +318,7 @@
last_action = world.time
active = 1
if(!isnull(seed_types[seed.seed.name]))
if(!isnull(plant_controller.seeds[seed.seed.name]))
seed.seed = seed.seed.diverge(1)
seed.seed_type = seed.seed.name
seed.update_seed()

View File

@@ -17,8 +17,8 @@ var/global/list/plant_seed_sprites = list()
//Grabs the appropriate seed datum from the global list.
/obj/item/seeds/proc/update_seed()
if(!seed && seed_type && !isnull(seed_types) && seed_types[seed_type])
seed = seed_types[seed_type]
if(!seed && seed_type && !isnull(plant_controller.seeds) && plant_controller.seeds[seed_type])
seed = plant_controller.seeds[seed_type]
update_appearance()
//Updates strings and icon appropriately based on seed datum.
@@ -74,7 +74,7 @@ var/global/list/plant_seed_sprites = list()
seed_type = null
/obj/item/seeds/random/New()
seed = create_random_seed()
seed = plant_controller.create_random_seed()
seed_type = seed.name
update_seed()

View File

@@ -13,7 +13,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/simulated/floor/T = pick(turfs)
var/datum/seed/seed = create_random_seed(1)
var/datum/seed/seed = plant_controller.create_random_seed(1)
seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines.
seed.set_trait(TRAIT_POTENCY,rand(40,50)) // Guarantee a wide spread and powerful effects.
new /obj/effect/plant(T,seed)
@@ -25,10 +25,13 @@
density = 0
color = DEAD_PLANT_COLOUR
/obj/effect/dead_plant/attack_hand()
del(src)
/obj/effect/dead_plant/attackby()
..()
for(var/obj/effect/plant/neighbor in view(1,src))
neighbor.hibernating = 0
plant_controller.add_plant(neighbor)
del(src)
/obj/effect/plant
@@ -55,7 +58,7 @@
var/spread_into_adjacent = 60
var/evolve_chance = 2
var/last_tick = 0
var/hibernating = 0
var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant
/obj/effect/plant/single
spread_chance = 0
@@ -63,7 +66,7 @@
/obj/effect/plant/New(var/newloc, var/datum/seed/newseed)
..()
if(!istype(newseed))
newseed = seed_types[DEFAULT_SEED]
newseed = plant_controller.seeds[DEFAULT_SEED]
seed = newseed
if(!seed)
del(src)
@@ -96,7 +99,7 @@
set_dir(calc_dir())
update_icon()
processing_objects |= src
plant_controller.add_plant(src)
last_tick = world.timeofday
/obj/effect/plant/update_icon()
@@ -148,7 +151,6 @@
/obj/effect/plant/Del()
if(children && children.len)
die_off(null,1)
processing_objects -= src
..()
/obj/effect/plant/proc/get_dist_to_parent(var/current_count)

View File

@@ -14,37 +14,47 @@
health = max_health
refresh_icon()
// Damaged, young hibernating or too far from parent, no chance of spreading.
if(is_mature() || hibernating || (parent && (get_dist_to_parent(0) > spread_distance)))
return
if(buckled_mob)
seed.do_sting(buckled_mob,src)
if(seed.get_trait(TRAIT_CARNIVOROUS))
// Todo: refactor to be less hardcoded.
if(istype(buckled_mob, /mob/living/simple_animal/mouse))
new /obj/effect/decal/remains/mouse(get_turf(src))
del(buckled_mob)
buckled_mob = null
return
else if(istype(buckled_mob, /mob/living/simple_animal/lizard))
new /obj/effect/decal/remains/lizard(get_turf(src))
del(buckled_mob)
buckled_mob = null
return
seed.do_thorns(buckled_mob,src)
var/failed_growth
// Count our neighbors and possible locations for spreading.
var/list/possible_locs = list()
var/count = 0
var/plant_count = 0
for(var/turf/simulated/floor/floor in view(1,src))
if((locate(/obj/effect/dead_plant) in floor.contents) || !floor.Enter(src) || floor.density)
continue
if(locate(/obj/effect/plant) in floor.contents)
count++
plant_count++
continue
possible_locs |= floor
//Entirely surrounded, try to spawn an actual plant.
if(count>=8)
if(!(locate(/obj/machinery/portable_atmospherics/hydroponics/soil/invisible) in T.contents))
var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/new_plant = new(T,seed)
new_plant.age = seed.get_trait(TRAIT_MATURATION)-1
new_plant.update_icon()
if(growth_type==0) //Vines do not become invisible.
invisibility = INVISIBILITY_MAXIMUM
else
new_plant.layer = 4.1
if(health == max_health && plant_count >= 4 && !plant)
plant = new(T,seed)
plant.age = seed.get_trait(TRAIT_MATURATION)-1
plant.update_icon()
if(growth_type==0) //Vines do not become invisible.
invisibility = INVISIBILITY_MAXIMUM
else
plant.layer = layer + 0.1
if(prob(spread_chance))
for(var/i=1,i<=seed.get_trait(TRAIT_YIELD),i++)
if(!possible_locs.len)
hibernating = 1
world << "[src] at [x],[y] is hibernating"
failed_growth = 1
break
if(prob(spread_into_adjacent))
var/turf/target_turf = pick(possible_locs)
@@ -53,11 +63,14 @@
child.parent = get_root()
child.parent.children |= child
if(health != max_health || !failed_growth || (plant_count > 4 && !plant))
plant_controller.add_plant(src)
/obj/effect/plant/proc/die_off(var/no_remains, var/no_del)
// Remove ourselves from our parent.
if(parent && parent.children)
parent.children -= src
// Kill off any of our children (and add an added bonus, other plants in this area)
// Kill off any of our children (and as an added bonus, other plants in this area)
for(var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant in get_turf(src))
plant.dead = 1
plant.update_icon()
@@ -66,7 +79,8 @@
for(var/obj/effect/plant/child in children)
child.die_off()
for(var/obj/effect/plant/neighbor in view(1,src))
neighbor.hibernating = 0
plant_controller.add_plant(neighbor)
if(!no_remains && !(locate(/obj/effect/dead_plant) in get_turf(src)))
var/obj/effect/dead_plant/plant_remains = new(get_turf(src))
plant_remains.icon = src.icon

View File

@@ -1,7 +1,6 @@
/obj/effect/plant/HasProximity(var/atom/movable/AM)
hibernating = 0
plant_controller.add_plant(src)
if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2)
return
@@ -9,16 +8,15 @@
if(!istype(M))
return
if(!buckled_mob && !M.buckled && !M.anchored && prob(round(seed.get_trait(TRAIT_POTENCY)/2)))
if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/2))))
entangle(M)
/obj/effect/plant/attack_hand(mob/user as mob)
hibernating = 0
plant_controller.add_plant(src)
manual_unbuckle(user)
/obj/effect/plant/proc/trodden_on(var/mob/living/victim)
hibernating = 0
world << "Blah."
plant_controller.add_plant(src)
if(!is_mature())
return
var/mob/living/carbon/human/H = victim

View File

@@ -299,7 +299,7 @@
//Remove the seed if something is already planted.
if(seed) seed = null
seed = seed_types[pick(list("reishi","nettles","amanita","mushrooms","plumphelmet","towercap","harebells","weeds"))]
seed = plant_controller.seeds[pick(list("reishi","nettles","amanita","mushrooms","plumphelmet","towercap","harebells","weeds"))]
if(!seed) return //Weed does not exist, someone fucked up.
dead = 0
@@ -329,7 +329,7 @@
// We need to make sure we're not modifying one of the global seed datums.
// If it's not in the global list, then no products of the line have been
// harvested yet and it's safe to assume it's restricted to this tray.
if(!isnull(seed_types[seed.name]))
if(!isnull(plant_controller.seeds[seed.name]))
seed = seed.diverge()
seed.mutate(severity,get_turf(src))
@@ -370,8 +370,8 @@
var/previous_plant = seed.display_name
var/newseed = seed.get_mutant_variant()
if(newseed in seed_types)
seed = seed_types[newseed]
if(newseed in plant_controller.seeds)
seed = plant_controller.seeds[newseed]
else
return
@@ -528,12 +528,10 @@
return
/obj/machinery/portable_atmospherics/hydroponics/attack_tk(mob/user as mob)
if(harvest)
harvest(user)
else if(dead)
if(dead)
remove_dead(user)
else if(harvest)
harvest(user)
/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user as mob)

View File

@@ -53,13 +53,13 @@
else if(istype(target,/obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = target
grown_seed = seed_types[G.plantname]
grown_seed = plant_controller.seeds[G.plantname]
grown_reagents = G.reagents
else if(istype(target,/obj/item/weapon/grown))
var/obj/item/weapon/grown/G = target
grown_seed = seed_types[G.plantname]
grown_seed = plant_controller.seeds[G.plantname]
grown_reagents = G.reagents
else if(istype(target,/obj/item/seeds))

View File

@@ -21,7 +21,7 @@
if(dead)
var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-dead"
var/image/dead_overlay = plant_icon_cache["[ikey]"]
var/image/dead_overlay = plant_controller.plant_icon_cache["[ikey]"]
if(!dead_overlay)
dead_overlay = image('icons/obj/hydroponics_growing.dmi', "[ikey]")
dead_overlay.color = DEAD_PLANT_COLOUR
@@ -39,20 +39,20 @@
overlay_stage = max(1,round(seed.get_trait(TRAIT_MATURATION) / seed.growth_stages))
var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-[overlay_stage]"
var/image/plant_overlay = plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
var/image/plant_overlay = plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
if(!plant_overlay)
plant_overlay = image('icons/obj/hydroponics_growing.dmi', "[ikey]")
plant_overlay.color = seed.get_trait(TRAIT_PLANT_COLOUR)
plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] = plant_overlay
plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] = plant_overlay
overlays |= plant_overlay
if(harvest && overlay_stage == seed.growth_stages)
ikey = "[seed.get_trait(TRAIT_PRODUCT_ICON)]"
var/image/harvest_overlay = plant_icon_cache["product-[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
var/image/harvest_overlay = plant_controller.plant_icon_cache["product-[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
if(!harvest_overlay)
harvest_overlay = image('icons/obj/hydroponics_products.dmi', "[ikey]")
harvest_overlay.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
plant_icon_cache["product-[ikey]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"] = harvest_overlay
plant_controller.plant_icon_cache["product-[ikey]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"] = harvest_overlay
overlays |= harvest_overlay
//Draw the cover.

View File

@@ -48,7 +48,7 @@
H.death()
//This is a terrible hack and I should be ashamed.
var/datum/seed/diona = seed_types["diona"]
var/datum/seed/diona = plant_controller.seeds["diona"]
if(!diona)
del(src)

View File

@@ -55,7 +55,7 @@ var/global/datum/global_init/init = new ()
// Set up roundstart seed list. This is here because vendors were
// bugging out and not populating with the correct packet names
// due to this list not being instantiated.
populate_seed_list()
plant_controller = new()
// Create autolathe recipes, as above.
populate_lathe_recipes()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB