diff --git a/baystation12.dme b/baystation12.dme index 55d10f66d9..a820faad30 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -311,7 +311,6 @@ #include "code\game\machinery\newscaster.dm" #include "code\game\machinery\OpTable.dm" #include "code\game\machinery\overview.dm" -#include "code\game\machinery\podmen.dm" #include "code\game\machinery\portable_turret.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" @@ -858,7 +857,11 @@ #include "code\modules\hydroponics\grown_inedible.dm" #include "code\modules\hydroponics\hydro_tools.dm" #include "code\modules\hydroponics\hydro_tray.dm" +#include "code\modules\hydroponics\seed_datums.dm" +#include "code\modules\hydroponics\seed_machines.dm" +#include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seeds.dm" +#include "code\modules\hydroponics\vines.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm index 5a0f955df3..3f1a7c2f4b 100644 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm +++ b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm @@ -65,7 +65,6 @@ var/jungle_plants_init = 0 reagent_effects = shuffle(reagent_effects) /obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit - seed = "" name = "jungle fruit" desc = "It smells weird and looks off." icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index cf9214079d..75ed7249d9 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -109,7 +109,6 @@ datum/controller/game_controller/proc/setup_objects() var/obj/machinery/atmospherics/unary/vent_scrubber/T = U T.broadcast_status() - //Create the mining ore distribution map. //Create the mining ore distribution map. asteroid_ore_map = new /datum/ore_distribution() asteroid_ore_map.populate_distribution_map() @@ -120,6 +119,9 @@ datum/controller/game_controller/proc/setup_objects() //Set up gear list. populate_gear_list() + //Set up roundstart seed list. + populate_seed_list() + world << "\red \b Initializations complete." sleep(-1) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 8a95096502..74da3c321f 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -848,6 +848,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containername = "Arts and Crafts crate" group = "Operations" + /datum/supply_packs/randomised/contraband num_contained = 5 contains = list(/obj/item/seeds/bloodtomatoseed, @@ -1205,7 +1206,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containertype = /obj/structure/closet/crate/hydroponics containername = "Hydroponics tray crate" group = "Hydroponics" - contains = list(/obj/machinery/hydroponics{anchored = 0}) + contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0}) access = access_hydroponics /datum/supply_packs/canister_empty diff --git a/code/game/gamemodes/events/spacevines.dm b/code/game/gamemodes/events/spacevines.dm index b3af8195ca..d095f19d56 100644 --- a/code/game/gamemodes/events/spacevines.dm +++ b/code/game/gamemodes/events/spacevines.dm @@ -1,247 +1,3 @@ -// SPACE VINES (Note that this code is very similar to Biomass code) -/obj/effect/spacevine - name = "space vines" - desc = "An extremely expansionistic species of vine." - icon = 'icons/effects/spacevines.dmi' - icon_state = "Light1" - anchored = 1 - density = 0 - layer = 5 - pass_flags = PASSTABLE | PASSGRILLE - var/energy = 0 - var/obj/effect/spacevine_controller/master = null - var/mob/living/buckled_mob - - New() - return - - Del() - if(master) - master.vines -= src - master.growth_queue -= src - ..() - - -/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (!W || !user || !W.type) return - switch(W.type) - if(/obj/item/weapon/circular_saw) del src - if(/obj/item/weapon/kitchen/utensil/knife) del src - if(/obj/item/weapon/scalpel) del src - if(/obj/item/weapon/twohanded/fireaxe) del src - if(/obj/item/weapon/hatchet) del src - if(/obj/item/weapon/melee/energy) del src - - //less effective weapons - if(/obj/item/weapon/wirecutters) - if(prob(25)) del src - if(/obj/item/weapon/shard) - if(prob(25)) del src - - else //weapons with subtypes - if(istype(W, /obj/item/weapon/melee/energy/sword)) del src - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) del src - else - manual_unbuckle(user) - return - //Plant-b-gone damage is handled in its entry in chemistry-reagents.dm - ..() - - -/obj/effect/spacevine/attack_hand(mob/user as mob) - manual_unbuckle(user) - - -/obj/effect/spacevine/attack_paw(mob/user as mob) - manual_unbuckle(user) - -/obj/effect/spacevine/proc/unbuckle() - if(buckled_mob) - if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt - buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() - buckled_mob = null - return - -/obj/effect/spacevine/proc/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(prob(50)) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "[user.name] frees [buckled_mob.name] from the vines.",\ - "[user.name] frees you from the vines.",\ - "You hear shredding and ripping.") - else - buckled_mob.visible_message(\ - "[buckled_mob.name] struggles free of the vines.",\ - "You untangle the vines from around yourself.",\ - "You hear shredding and ripping.") - unbuckle() - else - var/text = pick("rips","tears","pulls") - user.visible_message(\ - "[user.name] [text] at the vines.",\ - "You [text] at the vines.",\ - "You hear shredding and ripping.") - return - -/obj/effect/spacevine_controller - var/list/obj/effect/spacevine/vines = list() - var/list/growth_queue = list() - var/reached_collapse_size - var/reached_slowdown_size - //What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0, - //meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore. - - New() - if(!istype(src.loc,/turf/simulated/floor)) - del(src) - - spawn_spacevine_piece(src.loc) - processing_objects.Add(src) - - Del() - processing_objects.Remove(src) - ..() - - proc/spawn_spacevine_piece(var/turf/location) - var/obj/effect/spacevine/SV = new(location) - growth_queue += SV - vines += SV - SV.master = src - - process() - if(!vines) - del(src) //space vines exterminated. Remove the controller - return - if(!growth_queue) - del(src) //Sanity check - return - if(vines.len >= 250 && !reached_collapse_size) - reached_collapse_size = 1 - if(vines.len >= 30 && !reached_slowdown_size ) - reached_slowdown_size = 1 - - var/length = 0 - if(reached_collapse_size) - length = 0 - else if(reached_slowdown_size) - if(prob(25)) - length = 1 - else - length = 0 - else - length = 1 - length = min( 30 , max( length , vines.len / 5 ) ) - var/i = 0 - var/list/obj/effect/spacevine/queue_end = list() - - for( var/obj/effect/spacevine/SV in growth_queue ) - i++ - queue_end += SV - growth_queue -= SV - if(SV.energy < 2) //If tile isn't fully grown - if(prob(20)) - SV.grow() - else //If tile is fully grown - SV.buckle_mob() - - //if(prob(25)) - SV.spread() - if(i >= length) - break - - growth_queue = growth_queue + queue_end - //sleep(5) - //src.process() - -/obj/effect/spacevine/proc/grow() - if(!energy) - src.icon_state = pick("Med1", "Med2", "Med3") - energy = 1 - src.opacity = 1 - layer = 5 - else - src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") - energy = 2 - -/obj/effect/spacevine/proc/buckle_mob() - if(!buckled_mob && prob(25)) - for(var/mob/living/carbon/V in src.loc) - if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured - V.buckled = src - V.loc = src.loc - V.update_canmove() - src.buckled_mob = V - V << "The vines [pick("wind", "tangle", "tighten")] around you!" - break //only capture one mob at a time. - -/obj/effect/spacevine/proc/spread() - var/direction = pick(cardinal) - var/step = get_step(src,direction) - if(istype(step,/turf/simulated/floor)) - var/turf/simulated/floor/F = step - if(!locate(/obj/effect/spacevine,F)) - if(F.Enter(src)) - if(master) - master.spawn_spacevine_piece( F ) - -/* -/obj/effect/spacevine/proc/Life() - if (!src) return - var/Vspread - if (prob(50)) Vspread = locate(src.x + rand(-1,1),src.y,src.z) - else Vspread = locate(src.x,src.y + rand(-1, 1),src.z) - var/dogrowth = 1 - if (!istype(Vspread, /turf/simulated/floor)) dogrowth = 0 - for(var/obj/O in Vspread) - if (istype(O, /obj/structure/window) || istype(O, /obj/effect/forcefield) || istype(O, /obj/effect/blob) || istype(O, /obj/effect/alien/weeds) || istype(O, /obj/effect/spacevine)) dogrowth = 0 - if (istype(O, /obj/machinery/door/)) - if(O:p_open == 0 && prob(50)) O:open() - else dogrowth = 0 - if (dogrowth == 1) - var/obj/effect/spacevine/B = new /obj/effect/spacevine(Vspread) - B.icon_state = pick("vine-light1", "vine-light2", "vine-light3") - spawn(20) - if(B) - B.Life() - src.growth += 1 - if (src.growth == 10) - src.name = "Thick Space Kudzu" - src.icon_state = pick("vine-med1", "vine-med2", "vine-med3") - src.opacity = 1 - src.waittime = 80 - if (src.growth == 20) - src.name = "Dense Space Kudzu" - src.icon_state = pick("vine-hvy1", "vine-hvy2", "vine-hvy3") - src.density = 1 - spawn(src.waittime) - if (src.growth < 20) src.Life() - -*/ - -/obj/effect/spacevine/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(90)) - del(src) - return - if(3.0) - if (prob(50)) - del(src) - return - return - -/obj/effect/spacevine/fire_act(null, temp, volume) //hotspots kill vines - del src - //Carn: Spacevines random event. /proc/spacevine_infestation() @@ -256,5 +12,5 @@ if(turfs.len) //Pick a turf to spawn at if we can var/turf/simulated/floor/T = pick(turfs) - new/obj/effect/spacevine_controller(T) //spawn a controller at turf + new/obj/effect/plant_controller(T) //spawn a controller at turf message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])") diff --git a/code/game/machinery/bees_apiary.dm b/code/game/machinery/bees_apiary.dm index 2c2de70163..d4e6aa6307 100644 --- a/code/game/machinery/bees_apiary.dm +++ b/code/game/machinery/bees_apiary.dm @@ -22,7 +22,7 @@ var/bees_in_hive = 0 var/list/owned_bee_swarms = list() - var/hydrotray_type = /obj/machinery/hydroponics + var/hydrotray_type = /obj/machinery/portable_atmospherics/hydroponics //overwrite this after it's created if the apiary needs a custom machinery sprite /obj/machinery/apiary/New() @@ -169,14 +169,14 @@ bees_in_hive -= 1 //find some plants, harvest - for(var/obj/machinery/hydroponics/H in view(7, src)) - if(H.planted && !H.dead && H.myseed && prob(owned_bee_swarms.len * 10)) + for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src)) + if(H.seed && !H.dead && prob(owned_bee_swarms.len * 10)) src.nutrilevel++ H.nutrilevel++ - if(mut < H.mutmod - 1) - mut = H.mutmod - 1 - else if(mut > H.mutmod - 1) - H.mutmod = mut + if(mut < H.mutation_mod - 1) + mut = H.mutation_mod - 1 + else if(mut > H.mutation_mod - 1) + H.mutation_mod = mut //flowers give us pollen (nutrients) /* - All plants should be giving nutrients to the hive. @@ -188,11 +188,11 @@ if(prob(10)) H.lastcycle -= 5 if(prob(10)) - H.myseed.lifespan = max(initial(H.myseed.lifespan) * 1.5, H.myseed.lifespan + 1) + H.seed.lifespan = max(initial(H.seed.lifespan) * 1.5, H.seed.lifespan + 1) if(prob(10)) - H.myseed.endurance = max(initial(H.myseed.endurance) * 1.5, H.myseed.endurance + 1) - if(H.toxic && prob(10)) - H.toxic = min(0, H.toxic - 1) + H.seed.endurance = max(initial(H.seed.endurance) * 1.5, H.seed.endurance + 1) + if(H.toxins && prob(10)) + H.toxins = min(0, H.toxins - 1) toxic++ /obj/machinery/apiary/proc/die() diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm deleted file mode 100644 index 5acd792942..0000000000 --- a/code/game/machinery/podmen.dm +++ /dev/null @@ -1,158 +0,0 @@ -/* Moved all the plant people code here for ease of reference and coherency. -Injecting a pod person with a blood sample will grow a pod person with the memories and persona of that mob. -Growing it to term with nothing injected will grab a ghost from the observers. */ - -/obj/item/seeds/replicapod - name = "pack of dionaea-replicant seeds" - desc = "These seeds grow into 'replica pods' or 'dionaea', a form of strange sapient plantlife." - icon_state = "seed-replicapod" - mypath = "/obj/item/seeds/replicapod" - species = "replicapod" - plantname = "Dionaea" - productname = "/mob/living/carbon/human" //verrry special -- Urist - lifespan = 50 //no idea what those do - endurance = 8 - maturation = 5 - production = 10 - yield = 1 //seeds if there isn't a dna inside - oneharvest = 1 - potency = 30 - plant_type = 0 - growthstages = 6 - var/ckey = null - var/realName = null - var/mob/living/carbon/human/source //Donor of blood, if any. - gender = MALE - var/obj/machinery/hydroponics/parent = null - var/found_player = 0 - -/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if(istype(W,/obj/item/weapon/reagent_containers)) - - user << "You inject the contents of the syringe into the seeds." - - var/datum/reagent/blood/B - - //Find a blood sample to inject. - for(var/datum/reagent/R in W:reagents.reagent_list) - if(istype(R,/datum/reagent/blood)) - B = R - break - if(B) - source = B.data["donor"] - user << "The strange, sluglike seeds quiver gently and swell with blood." - if(!source.client && source.mind) - for(var/mob/dead/observer/O in player_list) - if(O.mind == source.mind && config.revival_pod_plants) - O << "Your blood has been placed into a replica pod seed. Return to your body if you want to be returned to life as a pod person! (Verbs -> Ghost -> Re-enter corpse)" - break - else - user << "Nothing happens." - return - - if (!istype(source)) - return - - if(source.ckey) - realName = source.real_name - ckey = source.ckey - - W:reagents.clear_reagents() - return - - return ..() - -/obj/item/seeds/replicapod/harvest(mob/user = usr) - - parent = loc - var/found_player = 0 - - user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...") - - //If a sample is injected (and revival is allowed) the plant will be controlled by the original donor. - if(source && source.stat == 2 && source.client && source.ckey && config.revival_pod_plants) - transfer_personality(source.client) - else // If no sample was injected or revival is not allowed, we grab an interested observer. - request_player() - - spawn(75) //If we don't have a ghost or the ghost is now unplayed, we just give the harvester some seeds. - if(!found_player) - parent.visible_message("The pod has formed badly, and all you can do is salvage some of the seeds.") - var/seed_count = 1 - - if(prob(yield * parent.yieldmod * 20)) - seed_count++ - - for(var/i=0,iYou awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark." - if(source && ckey && podman.ckey == ckey) - podman << "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake." - podman << "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." - podman << "Too much darkness will send you into shock and starve you, but light will help you heal." - if(!realName) - var/newname = input(podman,"Enter a name, or leave blank for the default name.", "Name change","") as text - if (newname != "") - podman.real_name = newname - - parent.visible_message("\blue The pod disgorges a fully-formed plant creature!") - parent.update_tray() diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 615e52f398..dbb5a9d271 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -7,44 +7,33 @@ anchored = 1 obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/)) - var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O - user.drop_item() - user << "You extract some seeds from the [F.name]." - var/seed = text2path(F.seed) - var/t_amount = 0 - var/t_max = rand(1,4) - while(t_amount < t_max) - var/obj/item/seeds/t_prod = new seed(loc) - t_prod.species = F.species - t_prod.lifespan = F.lifespan - t_prod.endurance = F.endurance - t_prod.maturation = F.maturation - t_prod.production = F.production - t_prod.yield = F.yield - t_prod.potency = F.potency - t_amount++ - del(O) - - else if(istype(O, /obj/item/weapon/grown/)) - var/obj/item/weapon/grown/F = O - user.drop_item() - user << "You extract some seeds from the [F.name]." - var/seed = text2path(F.seed) - var/t_amount = 0 - var/t_max = rand(1,4) - while(t_amount < t_max) - var/obj/item/seeds/t_prod = new seed(loc) - t_prod.species = F.species - t_prod.lifespan = F.lifespan - t_prod.endurance = F.endurance - t_prod.maturation = F.maturation - t_prod.production = F.production - t_prod.yield = F.yield - t_prod.potency = F.potency - t_amount++ + + // Fruits and vegetables. + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown)) + + user.drop_item(O) + + 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] + else + var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O + new_seed_type = seed_types[F.plantname] + + if(new_seed_type) + user << "You extract some seeds from [O]." + var/produce = rand(1,4) + for(var/i = 0;i<=produce;i++) + var/obj/item/seeds/seeds = new(get_turf(src)) + seeds.seed_type = new_seed_type.name + seeds.update_seed() + else + user << "[O] doesn't seem to have any usable seeds inside it." + del(O) + //Grass. else if(istype(O, /obj/item/stack/tile/grass)) var/obj/item/stack/tile/grass/S = O user << "You extract some seeds from the [S.name]." diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 1eb6096dc3..28efdb9087 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -804,7 +804,7 @@ product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." icon_state = "nutri" icon_deny = "nutri-deny" - products = list(/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20, + products = list(/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/plantspray/pests = 20, /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5) premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index e853976cc0..e6e3cff050 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -15,7 +15,7 @@ Mineral Sheets */ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \ - new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ ) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 04648c39b3..20927cee63 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -81,7 +81,7 @@ var/damage = rand(15,30) var/mob/living/carbon/human/H = M - if(!istype(M)) + if(!istype(H)) H << "\red You land heavily!" M.adjustBruteLoss(damage) return diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index ee8697578c..7db850670f 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -5,26 +5,39 @@ /obj/item/weapon/grown // Grown weapons name = "grown_weapon" icon = 'icons/obj/weapons.dmi' - var/seed = "" - var/plantname = "" - var/productname = "" - var/species = "" - var/lifespan = 20 - var/endurance = 15 - var/maturation = 7 - var/production = 7 - var/yield = 2 + var/plantname var/potency = 1 - var/plant_type = 0 - New() - var/datum/reagents/R = new/datum/reagents(50) - reagents = R - R.my_atom = src + +/obj/item/weapon/grown/New() + + ..() + + var/datum/reagents/R = new/datum/reagents(50) + reagents = R + R.my_atom = src + + //Handle some post-spawn var stuff. + spawn(1) + // Fill the object up with the appropriate reagents. + if(!isnull(plantname)) + var/datum/seed/S = seed_types[plantname] + if(!S || !S.chems) + return + + potency = S.potency + + for(var/rid in S.chems) + var/list/reagent_data = S.chems[rid] + var/rtotal = reagent_data[1] + if(reagent_data.len > 1 && potency > 0) + rtotal += round(potency/reagent_data[2]) + reagents.add_reagent(rid,max(1,rtotal)) /obj/item/weapon/grown/proc/changePotency(newValue) //-QualityVan potency = newValue /obj/item/weapon/grown/log + name = "towercap" name = "tower-cap log" desc = "It's better than bad, it's good!" icon = 'icons/obj/harvest.dmi' @@ -35,9 +48,7 @@ w_class = 3.0 throw_speed = 3 throw_range = 3 - plant_type = 2 origin_tech = "materials=1" - seed = "/obj/item/seeds/towermycelium" attack_verb = list("bashed", "battered", "bludgeoned", "whacked") attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -55,8 +66,8 @@ del(src) return - /obj/item/weapon/grown/sunflower // FLOWER POWER! + plantname = "sunflowers" name = "sunflower" desc = "It's beautiful! A certain person might beat you to death if you trample these." icon = 'icons/obj/harvest.dmi' @@ -68,40 +79,13 @@ w_class = 1.0 throw_speed = 1 throw_range = 3 - plant_type = 1 - seed = "/obj/item/seeds/sunflower" - /obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob) M << " [user] smacks you with a sunflower!FLOWER POWER" user << " Your sunflower's FLOWER POWER strikes [M]" -/* -/obj/item/weapon/grown/gibtomato - desc = "A plump tomato." - icon = 'icons/obj/harvest.dmi' - name = "Gib Tomato" - icon_state = "gibtomato" - damtype = "fire" - force = 0 - flags = TABLEPASS - throwforce = 1 - w_class = 2.0 - throw_speed = 1 - throw_range = 3 - plant_type = 1 - seed = "/obj/item/seeds/gibtomato" - New() - ..() - - -/obj/item/weapon/grown/gibtomato/New() - ..() - src.gibs = new /obj/effect/gibspawner/human(get_turf(src)) - src.gibs.attach(src) - src.smoke.set_up(10, 0, usr.loc) -*/ /obj/item/weapon/grown/nettle // -- Skie + plantname = "nettle" desc = "It's probably not wise to touch it with bare hands..." icon = 'icons/obj/weapons.dmi' name = "nettle" @@ -113,17 +97,12 @@ w_class = 2.0 throw_speed = 1 throw_range = 3 - plant_type = 1 origin_tech = "combat=1" - seed = "/obj/item/seeds/nettleseed" New() ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("sacid", round(potency, 1)) + spawn(5) force = round((5+potency/5), 1) - /obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) user << "\red The nettle burns your bare hand!" @@ -135,7 +114,6 @@ else user.take_organ_damage(0,force) - /obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(!proximity) return if(force > 0) @@ -145,14 +123,12 @@ usr << "All the leaves have fallen off the nettle from violent whacking." del(src) - /obj/item/weapon/grown/nettle/changePotency(newValue) //-QualityVan potency = newValue force = round((5+potency/5), 1) - - /obj/item/weapon/grown/deathnettle // -- Skie + plantname = "deathnettle" desc = "The \red glowing \black nettle incites \redrage\black in you just from looking at it!" icon = 'icons/obj/weapons.dmi' name = "deathnettle" @@ -164,22 +140,17 @@ w_class = 2.0 throw_speed = 1 throw_range = 3 - plant_type = 1 - seed = "/obj/item/seeds/deathnettleseed" origin_tech = "combat=3" attack_verb = list("stung") New() ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("pacid", round(potency, 1)) + spawn(5) force = round((5+potency/2.5), 1) suicide_act(mob/user) viewers(user) << "\red [user] is eating some of the [src.name]! It looks like \he's trying to commit suicide." return (BRUTELOSS|TOXLOSS) - /obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) if(istype(user, /mob/living/carbon/human)) @@ -193,7 +164,6 @@ user.Paralyse(5) user << "\red You are stunned by the Deathnettle when you try picking it up!" - /obj/item/weapon/grown/deathnettle/attack(mob/living/carbon/M as mob, mob/user as mob) if(!..()) return if(istype(M, /mob/living)) @@ -211,7 +181,6 @@ M.Weaken(force/15) M.drop_item() - /obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(!proximity) return if (force > 0) @@ -221,13 +190,10 @@ usr << "All the leaves have fallen off the deathnettle from violent whacking." del(src) - /obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan potency = newValue force = round((5+potency/2.5), 1) - - /obj/item/weapon/corncob name = "corn cob" desc = "A reminder of meals gone by." @@ -239,7 +205,6 @@ throw_speed = 4 throw_range = 20 - /obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual)) diff --git a/code/modules/hydroponics/hydro_tools.dm b/code/modules/hydroponics/hydro_tools.dm index a8fc8aaa31..7d2836d101 100644 --- a/code/modules/hydroponics/hydro_tools.dm +++ b/code/modules/hydroponics/hydro_tools.dm @@ -1,105 +1,210 @@ //Analyzer, pestkillers, weedkillers, nutrients, hatchets. - /obj/item/device/analyzer/plant_analyzer name = "plant analyzer" icon = 'icons/obj/device.dmi' icon_state = "hydro" item_state = "analyzer" - attack_self(mob/user as mob) - return 0 +/obj/item/device/analyzer/plant_analyzer/attack_self(mob/user as mob) + return 0 +/obj/item/device/analyzer/plant_analyzer/afterattack(obj/target, mob/user, flag) + if(!flag) return -// ************************************* -// Pestkiller defines for hydroponics -// ************************************* + var/datum/seed/grown_seed + var/datum/reagents/grown_reagents + if(istype(target,/obj/item/weapon/reagent_containers/food/snacks/grown)) -/obj/item/pestkiller - name = "bottle of pestkiller" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - flags = FPRINT | TABLEPASS - var/toxicity = 0 - var/PestKillStr = 0 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + var/obj/item/weapon/reagent_containers/food/snacks/grown/G = target + grown_seed = seed_types[G.plantname] + grown_reagents = G.reagents -/obj/item/pestkiller/carbaryl - name = "bottle of carbaryl" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - flags = FPRINT | TABLEPASS - toxicity = 4 - PestKillStr = 2 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + else if(istype(target,/obj/item/weapon/grown)) -/obj/item/pestkiller/lindane - name = "bottle of lindane" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle18" - flags = FPRINT | TABLEPASS - toxicity = 6 - PestKillStr = 4 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + var/obj/item/weapon/grown/G = target + grown_seed = seed_types[G.plantname] + grown_reagents = G.reagents -/obj/item/pestkiller/phosmet - name = "bottle of phosmet" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle15" - flags = FPRINT | TABLEPASS - toxicity = 8 - PestKillStr = 7 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + else if(istype(target,/obj/item/seeds)) + + var/obj/item/seeds/S = target + grown_seed = S.seed + + else if(istype(target,/obj/machinery/portable_atmospherics/hydroponics)) + + var/obj/machinery/portable_atmospherics/hydroponics/H = target + grown_seed = H.seed + grown_reagents = H.reagents + + if(!grown_seed) + user << "\red [src] can tell you nothing about [target]." + return + + var/dat = "

Plant data for [target]

" + user.visible_message("\blue [user] runs the scanner over [target].") + + dat += "

General Data

" + + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
Endurance[grown_seed.endurance]
Yield[grown_seed.yield]
Lifespan[grown_seed.lifespan]
Maturation time[grown_seed.maturation]
Production time[grown_seed.production]
Potency[grown_seed.potency]
" + + if(grown_reagents && grown_reagents.reagent_list && grown_reagents.reagent_list.len) + dat += "

Reagent Data

" + + dat += "
This sample contains: " + for(var/datum/reagent/R in grown_reagents.reagent_list) + dat += "
- [R.id], [grown_reagents.get_reagent_amount(R.id)] unit(s)" + + dat += "

Other Data

" + + if(grown_seed.harvest_repeat) + dat += "This plant can be harvested repeatedly.
" + + if(grown_seed.immutable) + dat += "This plant does not possess genetics that are alterable.
" + + if(grown_seed.products && grown_seed.products.len) + dat += "The mature plant will produce [grown_seed.products.len == 1 ? "fruit" : "[grown_seed.products.len] varieties of fruit"].
" + + if(grown_seed.requires_nutrients) + if(grown_seed.nutrient_consumption < 0.05) + dat += "It consumes a small amount of nutrient fluid.
" + else if(grown_seed.nutrient_consumption > 0.2) + dat += "It requires a heavy supply of nutrient fluid.
" + else + dat += "It requires a supply of nutrient fluid.
" + + if(grown_seed.requires_water) + if(grown_seed.water_consumption < 1) + dat += "It requires very little water.
" + else if(grown_seed.water_consumption > 5) + dat += "It requires a large amount of water.
" + else + dat += "It requires a stable supply of water.
" + + if(grown_seed.mutants && grown_seed.mutants.len) + dat += "It exhibits a high degree of potential subspecies shift.
" + + dat += "It thrives in a temperature of [grown_seed.ideal_heat] Kelvin." + + if(grown_seed.lowkpa_tolerance < 20) + dat += "
It is well adapted to low pressure levels." + if(grown_seed.highkpa_tolerance > 220) + dat += "
It is well adapted to high pressure levels." + + if(grown_seed.heat_tolerance > 30) + dat += "
It is well adapted to a range of temperatures." + else if(grown_seed.heat_tolerance < 10) + dat += "
It is very sensitive to temperature shifts." + + dat += "
It thrives in a light level of [grown_seed.ideal_light] lumen[grown_seed.ideal_light == 1 ? "" : "s"]." + + if(grown_seed.light_tolerance > 10) + dat += "
It is well adapted to a range of light levels." + else if(grown_seed.light_tolerance < 3) + dat += "
It is very sensitive to light level shifts." + + if(grown_seed.toxins_tolerance < 3) + dat += "
It is highly sensitive to toxins." + else if(grown_seed.toxins_tolerance > 6) + dat += "
It is remarkably resistant to toxins." + + if(grown_seed.pest_tolerance < 3) + dat += "
It is highly sensitive to pests." + else if(grown_seed.pest_tolerance > 6) + dat += "
It is remarkably resistant to pests." + + if(grown_seed.weed_tolerance < 3) + dat += "
It is highly sensitive to weeds." + else if(grown_seed.weed_tolerance > 6) + dat += "
It is remarkably resistant to weeds." + + switch(grown_seed.spread) + if(1) + dat += "
It is capable of growing beyond the confines of a tray." + if(2) + dat += "
It is a robust and vigorous vine that will spread rapidly." + + switch(grown_seed.carnivorous) + if(1) + dat += "
It is carniovorous and will eat tray pests for sustenance." + if(2) + dat += "
It is carnivorous and poses a significant threat to living things around it." + + if(grown_seed.parasite) + dat += "
It is capable of parisitizing and gaining sustenance from tray weeds." + if(grown_seed.alter_temp) + dat += "
It will periodically alter the local temperature by [grown_seed.alter_temp] degrees Kelvin." + + if(grown_seed.biolum) + dat += "
It is [grown_seed.biolum_colour ? "bio-luminescent" : "bio-luminescent"]." + if(grown_seed.flowers) + dat += "
It has [grown_seed.flower_colour ? "flowers" : "flowers"]." + + if(dat) + user << browse(dat,"window=plant_analyzer") + + return // ************************************* // Hydroponics Tools // ************************************* -/obj/item/weapon/weedspray // -- Skie - desc = "It's a toxic mixture, in spray form, to kill small weeds." +/obj/item/weapon/plantspray icon = 'icons/obj/hydroponics.dmi' + item_state = "spray" + flags = TABLEPASS | OPENCONTAINER | FPRINT | NOBLUDGEON + slot_flags = SLOT_BELT + throwforce = 4 + w_class = 2.0 + throw_speed = 2 + throw_range = 10 + var/toxicity = 4 + var/pest_kill_str = 0 + var/weed_kill_str = 0 + +/obj/item/weapon/plantspray/weeds // -- Skie + name = "weed-spray" + desc = "It's a toxic mixture, in spray form, to kill small weeds." icon_state = "weedspray" - item_state = "spray" - flags = TABLEPASS | OPENCONTAINER | FPRINT | NOBLUDGEON - slot_flags = SLOT_BELT - throwforce = 4 - w_class = 2.0 - throw_speed = 2 - throw_range = 10 - var/toxicity = 4 - var/WeedKillStr = 2 + weed_kill_str = 2 - suicide_act(mob/user) - viewers(user) << "\red [user] is huffing the [src.name]! It looks like \he's trying to commit suicide." - return (TOXLOSS) - -/obj/item/weapon/pestspray // -- Skie - desc = "It's some pest eliminator spray! Do not inhale!" - icon = 'icons/obj/hydroponics.dmi' +/obj/item/weapon/plantspray/pests name = "pest-spray" + desc = "It's some pest eliminator spray! Do not inhale!" icon_state = "pestspray" - item_state = "spray" - flags = TABLEPASS | OPENCONTAINER | FPRINT | NOBLUDGEON - slot_flags = SLOT_BELT - throwforce = 4 - w_class = 2.0 - throw_speed = 2 - throw_range = 10 - var/toxicity = 4 - var/PestKillStr = 2 + pest_kill_str = 2 - suicide_act(mob/user) - viewers(user) << "\red [user] is huffing the [src.name]! It looks like \he's trying to commit suicide." - return (TOXLOSS) +/obj/item/weapon/plantspray/pests/old + name = "bottle of pestkiller" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + +/obj/item/weapon/plantspray/pests/old/carbaryl + name = "bottle of carbaryl" + icon_state = "bottle16" + toxicity = 4 + pest_kill_str = 2 + +/obj/item/weapon/plantspray/pests/old/lindane + name = "bottle of lindane" + icon_state = "bottle18" + toxicity = 6 + pest_kill_str = 4 + +/obj/item/weapon/plantspray/pests/old/phosmet + name = "bottle of phosmet" + icon_state = "bottle15" + toxicity = 8 + pest_kill_str = 7 /obj/item/weapon/minihoe // -- Numbers name = "mini hoe" @@ -125,7 +230,7 @@ icon_state = "bottle16" flags = FPRINT | TABLEPASS var/toxicity = 0 - var/WeedKillStr = 0 + var/weed_kill_str = 0 /obj/item/weedkiller/triclopyr name = "bottle of glyphosate" @@ -133,7 +238,7 @@ icon_state = "bottle16" flags = FPRINT | TABLEPASS toxicity = 4 - WeedKillStr = 2 + weed_kill_str = 2 /obj/item/weedkiller/lindane name = "bottle of triclopyr" @@ -141,7 +246,7 @@ icon_state = "bottle18" flags = FPRINT | TABLEPASS toxicity = 6 - WeedKillStr = 4 + weed_kill_str = 4 /obj/item/weedkiller/D24 name = "bottle of 2,4-D" @@ -149,7 +254,7 @@ icon_state = "bottle15" flags = FPRINT | TABLEPASS toxicity = 8 - WeedKillStr = 7 + weed_kill_str = 7 // ************************************* @@ -175,9 +280,6 @@ flags = FPRINT | TABLEPASS mutmod = 1 yieldmod = 1 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) /obj/item/nutrient/l4z name = "bottle of Left 4 Zed" @@ -185,22 +287,13 @@ icon_state = "bottle18" flags = FPRINT | TABLEPASS mutmod = 2 - yieldmod = 0 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) /obj/item/nutrient/rh name = "bottle of Robust Harvest" icon = 'icons/obj/chemical.dmi' icon_state = "bottle15" flags = FPRINT | TABLEPASS - mutmod = 0 yieldmod = 2 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) - //Hatchets and things to kill kudzu /obj/item/weapon/hatchet @@ -215,7 +308,7 @@ throw_speed = 4 throw_range = 4 sharp = 1 - edge = 1 + edge = 1 matter = list("metal" = 15000) origin_tech = "materials=2;combat=1" attack_verb = list("chopped", "torn", "cut") @@ -232,7 +325,6 @@ icon_state = "unathiknife" attack_verb = list("ripped", "torn", "cut") - /obj/item/weapon/scythe icon_state = "scythe0" name = "scythe" @@ -249,8 +341,8 @@ /obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return - if(istype(A, /obj/effect/spacevine)) - for(var/obj/effect/spacevine/B in orange(A,1)) + if(istype(A, /obj/effect/plantsegment)) + for(var/obj/effect/plantsegment/B in orange(A,1)) if(prob(80)) del B del A \ No newline at end of file diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm index 1e586eacf0..1ead014c2a 100644 --- a/code/modules/hydroponics/hydro_tray.dm +++ b/code/modules/hydroponics/hydro_tray.dm @@ -1,44 +1,133 @@ -#define HYDRO_SPEED_MULTIPLIER 0.25 +#define HYDRO_SPEED_MULTIPLIER 1 -/obj/machinery/hydroponics +/obj/machinery/portable_atmospherics/hydroponics name = "hydroponics tray" icon = 'icons/obj/hydroponics.dmi' icon_state = "hydrotray3" density = 1 anchored = 1 - var/waterlevel = 100 // The amount of water in the tray (max 100) - var/nutrilevel = 10 // The amount of nutrient in the tray (max 10) - var/pestlevel = 0 // The amount of pests in the tray (max 10) - var/weedlevel = 0 // The amount of weeds in the tray (max 10) - var/yieldmod = 1 //Modifier to yield - var/mutmod = 1 //Modifier to mutation chance - var/toxic = 0 // Toxicity in the tray? - var/age = 0 // Current age - var/dead = 0 // Is it dead? - var/health = 0 // Its health. - var/lastproduce = 0 // Last time it was harvested - var/lastcycle = 0 //Used for timing of cycles. - var/cycledelay = 200 // About 10 seconds / cycle - var/planted = 0 // Is it occupied? - var/harvest = 0 //Ready to harvest? - var/obj/item/seeds/myseed = null // The currently planted seed + var/draw_warnings = 1 //Set to 0 to stop it from drawing the alert lights. -/obj/machinery/hydroponics/bullet_act(var/obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. - if(istype(Proj ,/obj/item/projectile/energy/floramut)) - if(planted) - mutate() - else if(istype(Proj ,/obj/item/projectile/energy/florayield)) - if(planted && myseed.yield == 0)//Oh god don't divide by zero you'll doom us all. - myseed.yield += 1 - //world << "Yield increased by 1, from 0, to a total of [myseed.yield]" - else if (planted && (prob(1/(myseed.yield * myseed.yield) *100)))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... - myseed.yield += 1 - //world << "Yield increased by 1, to a total of [myseed.yield]" - else - ..() + // Plant maintenance vars. + var/waterlevel = 100 // Water level (max 100) + var/nutrilevel = 10 // Nutrient level (max 10) + var/pestlevel = 0 // Pests (max 10) + var/weedlevel = 0 // Weeds (max 10)s + + // Tray state vars. + var/dead = 0 // Is it dead? + var/harvest = 0 // Is it ready to harvest? + var/age = 0 // Current plant age + + // Harvest/mutation mods. + var/yield_mod = 0 // Modifier to yield + var/mutation_mod = 0 // Modifier to mutation chance + var/toxins = 0 // Toxicity in the tray? + + // Mechanical concerns. + var/health = 0 // Plant health. + var/lastproduce = 0 // Last time tray was harvested + var/lastcycle = 0 // Cycle timing/tracking var. + var/cycledelay = 150 // Delay per cycle. + var/closed_system // If set, the tray will attempt to take atmos from a pipe. + + // Seed details/line data. + var/datum/seed/seed = null // The currently planted seed + + // Reagent information for attackby(), consider moving this to a controller along + // with cycle information under 'mechanical concerns' at some point. + // For all following lists, when called in attackby() the relevant value will be increased + // by 1,val if val>0 or decreased by 1,val if val<0. + + var/global/list/toxic_reagents = list( + "anti_toxin" = -2, + "toxin" = 2, + "fluorine" = 2.5, + "chlorine" = 1.5, + "sacid" = 1.5, + "pacid" = 3, + "plantbgone" = 3, + "cryoxadone" = -3, + "radium" = 2 + ) + var/global/list/nutrient_reagents = list( + "milk" = 0.1, + "beer" = 0.25, + "phosphorus" = 0.1, + "sugar" = 0.1, + "sodawater" = 0.1, + "ammonia" = 1, + "diethylamine" = 2, + "nutriment" = 1, + "adminordrazine" = 1 + ) + var/global/list/weedkiller_reagents = list( + "fluorine" = -4, + "chlorine" = -3, + "phosphorus" = -2, + "sugar" = 2, + "sacid" = -2, + "pacid" = -4, + "plantbgone" = -8, + "adminordrazine" = -5 + ) + var/global/list/pestkiller_reagents = list( + "sugar" = 2, + "diethylamine" = -2, + "adminordrazine" = -5 + ) + var/global/list/beneficial_reagents = list( + "beer" = -0.05, + "fluorine" = -2, + "chlorine" = -1, + "phosphorus" = -0.75, + "sodawater" = 0.1, + "sacid" = -1, + "pacid" = -2, + "plantbgone" = -2, + "cryoxadone" = 3, + "ammonia" = 0.5, + "diethylamine" = 1, + "nutriment" = 0.5, + "radium" = -1.5, + "adminordrazine" = 1 + ) + var/global/list/water_reagents = list( + "adminordrazine" = 1, + "milk" = 0.9, + "beer" = 0.7, + "flourine" = -0.5, + "chlorine" = -0.5, + "phosphorus" = -0.5, + "water" = 1, + "sodawater" = 1, + ) + + // Mutagen list specifies minimum value for the mutation to take place, rather + // than a bound as the lists above specify. + var/global/list/mutagenic_reagents = list( + "radium" = 8, + "mutagen" = 3 + ) + +/obj/machinery/portable_atmospherics/hydroponics/New() + ..() + connect() + update_icon() + +/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj) + + //Override for somatoray projectiles. + if(istype(Proj ,/obj/item/projectile/energy/floramut) && prob(20)) + mutate(1) + return + else if(istype(Proj ,/obj/item/projectile/energy/florayield) && prob(20)) + yield_mod = min(10,yield_mod+rand(1,2)) return -/obj/machinery/hydroponics/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + ..() + +/obj/machinery/portable_atmospherics/hydroponics/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group || (height==0)) return 1 if(istype(mover) && mover.checkpass(PASSTABLE)) @@ -46,408 +135,308 @@ else return 0 -obj/machinery/hydroponics/process() +/obj/machinery/portable_atmospherics/hydroponics/process() - if(myseed && (myseed.loc != src)) - myseed.loc = src + // Update values every cycle rather than every process() tick. + if(world.time < (lastcycle + cycledelay)) + return + lastcycle = world.time - if(world.time > (lastcycle + cycledelay)) - lastcycle = world.time - if(planted && !dead) - // Advance age - age += 1 * HYDRO_SPEED_MULTIPLIER + // Weeds like water and nutrients, there's a chance the weed population will increase. + // Bonus chance if the tray is unoccupied. + if(waterlevel > 10 && nutrilevel > 2 && prob(isnull(seed) ? 6 : 3)) + weedlevel += 1 * HYDRO_SPEED_MULTIPLIER -//Nutrients////////////////////////////////////////////////////////////// - // Nutrients deplete slowly - if(nutrilevel > 0) - if(prob(50)) - nutrilevel -= 1 * HYDRO_SPEED_MULTIPLIER + // There's a chance for a weed explosion to happen if the weeds take over. + // Plants that are themselves weeds (weed_tolernace > 10) are unaffected. + if (weedlevel >= 10 && prob(10)) + if(!seed || weedlevel >= seed.weed_tolerance) + weed_invasion() - // Lack of nutrients hurts non-weeds - if(nutrilevel <= 0 && myseed.plant_type != 1) - health -= rand(1,3) * HYDRO_SPEED_MULTIPLIER + // If there is no seed data (and hence nothing planted), + // or the plant is dead, process nothing further. + if(!seed || dead) + return -//Water////////////////////////////////////////////////////////////////// - // Drink random amount of water - waterlevel = max(waterlevel - rand(1,6) * HYDRO_SPEED_MULTIPLIER, 0) + // Advance plant age. + age += 1 * HYDRO_SPEED_MULTIPLIER - // If the plant is dry, it loses health pretty fast, unless mushroom - if(waterlevel <= 10 && myseed.plant_type != 2) - health -= rand(0,1) * HYDRO_SPEED_MULTIPLIER - if(waterlevel <= 0) - health -= rand(0,2) * HYDRO_SPEED_MULTIPLIER + // Maintain tray nutrient and water levels. + if(seed.nutrient_consumption > 0 && nutrilevel > 0 && prob(25)) + nutrilevel -= max(0,seed.nutrient_consumption * HYDRO_SPEED_MULTIPLIER) + if(seed.water_consumption > 0 && waterlevel > 0 && prob(25)) + waterlevel -= max(0,seed.water_consumption * HYDRO_SPEED_MULTIPLIER) - // Sufficient water level and nutrient level = plant healthy - else if(waterlevel > 10 && nutrilevel > 0) - health += rand(1,2) * HYDRO_SPEED_MULTIPLIER - if(prob(5)) //5 percent chance the weed population will increase - weedlevel += 1 * HYDRO_SPEED_MULTIPLIER -//Toxins///////////////////////////////////////////////////////////////// + // Make sure the plant is not starving or thirsty. Adequate + // water and nutrients will cause a plant to become healthier. + var/healthmod = rand(1,3) * HYDRO_SPEED_MULTIPLIER + if(seed.requires_nutrients && prob(35)) + health += (nutrilevel < 2 ? -healthmod : healthmod) + if(seed.requires_water && prob(35)) + health += (waterlevel < 10 ? -healthmod : healthmod) - // Too much toxins cause harm, but when the plant drinks the contaiminated water, the toxins disappear slowly - if(toxic >= 40 && toxic < 80) - health -= 1 * HYDRO_SPEED_MULTIPLIER - toxic -= rand(1,10) * HYDRO_SPEED_MULTIPLIER - else if(toxic >= 80) // I don't think it ever gets here tbh unless above is commented out - health -= 3 * HYDRO_SPEED_MULTIPLIER - toxic -= rand(1,10) * HYDRO_SPEED_MULTIPLIER - else if(toxic < 0) // Make sure it won't go overoboard - toxic = 0 + // Check that pressure, heat and light are all within bounds. + // First, handle an open system or an unconnected closed system. -//Pests & Weeds////////////////////////////////////////////////////////// + var/turf/T = loc + var/datum/gas_mixture/environment - // Too many pests cause the plant to be sick - if (pestlevel > 10 ) // Make sure it won't go overoboard - pestlevel = 10 + // If we're closed, take from our internal sources. + if(closed_system && (connected_port || holding)) + environment = air_contents - else if(pestlevel >= 5) - health -= 1 * HYDRO_SPEED_MULTIPLIER + // If atmos input is not there, grab from turf. + if(!environment) + if(istype(T)) + environment = T.return_air() + if(!environment) //We're in a crate or nullspace, bail out. + return - // If it's a weed, it doesn't stunt the growth - if(weedlevel >= 5 && myseed.plant_type != 1 ) - health -= 1 * HYDRO_SPEED_MULTIPLIER + // Process it. + var/pressure = environment.return_pressure() + if(pressure < seed.lowkpa_tolerance || pressure > seed.highkpa_tolerance) + health -= healthmod + if(abs(environment.temperature - seed.ideal_heat) > seed.heat_tolerance) + health -= healthmod -//Health & Age/////////////////////////////////////////////////////////// - // Don't go overboard with the health - if(health > myseed.endurance) - health = myseed.endurance - - // Plant dies if health <= 0 - else if(health <= 0) - dead = 1 - harvest = 0 - weedlevel += 1 * HYDRO_SPEED_MULTIPLIER // Weeds flourish - pestlevel = 0 // Pests die - - // If the plant is too old, lose health fast - if(age > myseed.lifespan) - health -= rand(1,5) * HYDRO_SPEED_MULTIPLIER - - // Harvest code - if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead)) - for(var/i = 0; i < mutmod; i++) - if(prob(85)) - mutate() - else if(prob(30)) - hardmutate() - else if(prob(5)) - mutatespecie() - - if(yieldmod > 0 && myseed.yield != -1) // Unharvestable shouldn't be harvested - harvest = 1 - else - lastproduce = age - if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase - pestlevel += 1 * HYDRO_SPEED_MULTIPLIER + // Handle light requirements. + var/area/A = T.loc + if(A) + var/light_available + if(A.lighting_use_dynamic) + light_available = max(0,min(10,T.lighting_lumcount)-5) else - if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10% - weedlevel += 1 * HYDRO_SPEED_MULTIPLIER - if(weedlevel > 10) - weedlevel = 10 + light_available = 5 + if(abs(light_available - seed.ideal_light) > seed.light_tolerance) + health -= healthmod - // Weeeeeeeeeeeeeeedddssss + // Toxin levels beyond the plant's tolerance cause damage, but + // toxins are sucked up each tick and slowly reduce over time. + if(toxins > 0) + var/toxin_uptake = max(1,round(toxins/10)) + if(toxins > seed.toxins_tolerance) + health -= toxin_uptake + toxins -= toxin_uptake - if (weedlevel >= 10 && prob(50)) // At this point the plant is kind of fucked. Weeds can overtake the plant spot. - if(planted) - if(myseed.plant_type == 0) // If a normal plant - weedinvasion() - else - weedinvasion() // Weed invasion into empty tray - updateicon() + // Check for pests and weeds. + // Some carnivorous plants happily eat pests. + if(pestlevel > 0) + if(seed.carnivorous) + health += HYDRO_SPEED_MULTIPLIER + pestlevel -= HYDRO_SPEED_MULTIPLIER + else if (pestlevel >= seed.pest_tolerance) + health -= HYDRO_SPEED_MULTIPLIER + + // Some plants thrive and live off of weeds. + if(weedlevel > 0) + if(seed.parasite) + health += HYDRO_SPEED_MULTIPLIER + weedlevel -= HYDRO_SPEED_MULTIPLIER + else if (weedlevel >= seed.weed_tolerance) + health -= HYDRO_SPEED_MULTIPLIER + + // Handle life and death. + // If the plant is too old, it loses health fast. + if(age > seed.lifespan) + health -= rand(3,5) * HYDRO_SPEED_MULTIPLIER + + // When the plant dies, weeds thrive and pests die off. + if(health <= 0) + dead = 1 + harvest = 0 + weedlevel += 1 * HYDRO_SPEED_MULTIPLIER + pestlevel = 0 + + // If enough time (in cycles, not ticks) has passed since the plant was harvested, we're ready to harvest again. + else if(age > seed.production && (age - lastproduce) > seed.production && (!harvest && !dead)) + harvest = 1 + lastproduce = age + + if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase + pestlevel += 1 * HYDRO_SPEED_MULTIPLIER + + check_level_sanity() + update_icon() return +//Harvests the product of a plant. +/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user) + //Harvest the product of the plant, + if(!seed || !harvest || !user) + return -obj/machinery/hydroponics/proc/updateicon() - //Refreshes the icon and sets the luminosity - overlays.Cut() - if(planted) - if(dead) - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead") - else if(harvest) - if(myseed.plant_type == 2) // Shrooms don't have a -harvest graphic - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") - else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-harvest") - else if(age < myseed.maturation) - var/t_growthstate = ((age / myseed.maturation) * myseed.growthstages ) // Make sure it won't crap out due to HERPDERP 6 stages only - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[round(t_growthstate)]") - lastproduce = age //Cheating by putting this here, it means that it isn't instantly ready to harvest - else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") // Same + if(closed_system) + user << "You can't harvest from the plant while the lid is shut." + return - if(waterlevel <= 10) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lowwater3") - if(nutrilevel <= 2) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lownutri3") - if(health <= (myseed.endurance / 2)) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lowhealth3") - if(weedlevel >= 5) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_alert3") - if(pestlevel >= 5) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_alert3") - if(toxic >= 40) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_alert3") - if(harvest) - overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3") + seed.harvest(user,yield_mod) - if(istype(myseed,/obj/item/seeds/glowshroom)) - SetLuminosity(round(myseed.potency/10)) - else - SetLuminosity(0) + // Reset values. + harvest = 0 + lastproduce = age + if(!seed.harvest_repeat) + yield_mod = 0 + seed = null + dead = 0 + age = 0 + + check_level_sanity() + update_icon() return +//Clears out a dead plant. +/obj/machinery/portable_atmospherics/hydroponics/proc/remove_dead(var/mob/user) + if(!user || !dead) return + if(closed_system) + user << "You can't remove the dead plant while the lid is shut." + return -obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens. + seed = null dead = 0 - if(myseed) // In case there's nothing in the tray beforehand - del(myseed) - switch(rand(1,18)) // randomly pick predominative weed - if(16 to 18) - myseed = new /obj/item/seeds/reishimycelium - if(14 to 15) - myseed = new /obj/item/seeds/nettleseed - if(12 to 13) - myseed = new /obj/item/seeds/harebell - if(10 to 11) - myseed = new /obj/item/seeds/amanitamycelium - if(8 to 9) - myseed = new /obj/item/seeds/chantermycelium - if(6 to 7) // implementation for tower caps still kinda missing ~ Not Anymore! -Cheridan - myseed = new /obj/item/seeds/towermycelium - if(4 to 5) - myseed = new /obj/item/seeds/plumpmycelium + user << "You remove the dead plant from the [src]." + check_level_sanity() + update_icon() + return + +//Refreshes the icon and sets the luminosity +/obj/machinery/portable_atmospherics/hydroponics/update_icon() + + overlays.Cut() + + // Updates the plant overlay. + if(!isnull(seed)) + + if(draw_warnings && health <= (seed.endurance / 2)) + overlays += "over_lowhealth3" + + if(dead) + overlays += "[seed.plant_icon]-dead" + else if(harvest) + overlays += "[seed.plant_icon]-harvest" + else if(age < seed.maturation) + + var/t_growthstate + if(age >= seed.maturation) + t_growthstate = seed.growth_stages + else + t_growthstate = round(seed.maturation / seed.growth_stages) + + overlays += "[seed.plant_icon]-grow[t_growthstate]" + lastproduce = age else - myseed = new /obj/item/seeds/weeds - planted = 1 + overlays += "[seed.plant_icon]-grow[seed.growth_stages]" + + //Draw the cover. + if(closed_system) + overlays += "hydrocover" + + //Updated the various alert icons. + if(draw_warnings) + if(waterlevel <= 10) + overlays += "over_lowwater3" + if(nutrilevel <= 2) + overlays += "over_lownutri3" + if(weedlevel >= 5 || pestlevel >= 5 || toxins >= 40) + overlays += "over_alert3" + if(harvest) + overlays += "over_harvest3" + + // Update bioluminescence. + if(seed) + if(seed.biolum) + SetLuminosity(round(seed.potency/10)) + if(seed.biolum_colour) + l_color = seed.biolum_colour + else + l_color = null + return + + SetLuminosity(0) + return + + // If a weed growth is sufficient, this proc is called. +/obj/machinery/portable_atmospherics/hydroponics/proc/weed_invasion() + + //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"))] + if(!seed) return //Weed does not exist, someone fucked up. + + dead = 0 age = 0 - health = myseed.endurance + health = seed.endurance lastcycle = world.time harvest = 0 - weedlevel = 0 // Reset - pestlevel = 0 // Reset - updateicon() - visible_message("\blue [src] has been overtaken by [myseed.plantname].") + weedlevel = 0 + pestlevel = 0 + update_icon() + visible_message("\blue [src] has been overtaken by [seed.display_name].") return +/obj/machinery/portable_atmospherics/hydroponics/proc/mutate(var/severity) -obj/machinery/hydroponics/proc/mutate() // Mutates the current seed + // No seed, no mutations. + if(!seed) + return - myseed.lifespan += rand(-2,2) - if(myseed.lifespan < 10) - myseed.lifespan = 10 - else if(myseed.lifespan > 30) - myseed.lifespan = 30 + // Check if we should even bother working on the current seed datum. + if(seed.mutants.len && severity > 1 && prob(10+mutation_mod)) + mutate_species() + return - myseed.endurance += rand(-5,5) - if(myseed.endurance < 10) - myseed.endurance = 10 - else if(myseed.endurance > 100) - myseed.endurance = 100 + // 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])) + seed = seed.diverge() + seed.mutate(severity,get_turf(src)) - myseed.production += rand(-1,1) - if(myseed.production < 2) - myseed.production = 2 - else if(myseed.production > 10) - myseed.production = 10 - - if(myseed.yield != -1) // Unharvestable shouldn't suddenly turn harvestable - myseed.yield += rand(-2,2) - if(myseed.yield < 0) - myseed.yield = 0 - else if(myseed.yield > 10) - myseed.yield = 10 - if(myseed.yield == 0 && myseed.plant_type == 2) - myseed.yield = 1 // Mushrooms always have a minimum yield of 1. - - if(myseed.potency != -1) //Not all plants have a potency - myseed.potency += rand(-25,25) - if(myseed.potency < 0) - myseed.potency = 0 - else if(myseed.potency > 100) - myseed.potency = 100 return +/obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity() + //Make sure various values are sane. + if(seed) + health = max(0,min(seed.endurance,health)) + else + health = 0 + dead = 0 + + nutrilevel = max(0,min(nutrilevel,10)) + waterlevel = max(0,min(waterlevel,100)) + pestlevel = max(0,min(pestlevel,10)) + weedlevel = max(0,min(weedlevel,10)) + toxins = max(0,min(toxins,10)) -obj/machinery/hydroponics/proc/hardmutate() // Strongly mutates the current seed. - - myseed.lifespan += rand(-4,4) - if(myseed.lifespan < 10) - myseed.lifespan = 10 - else if(myseed.lifespan > 30 && !istype(myseed,/obj/item/seeds/glowshroom)) //hack to prevent glowshrooms from always resetting to 30 sec delay - myseed.lifespan = 30 - - myseed.endurance += rand(-10,10) - if(myseed.endurance < 10) - myseed.endurance = 10 - else if(myseed.endurance > 100) - myseed.endurance = 100 - - myseed.production += rand(-2,2) - if(myseed.production < 2) - myseed.production = 2 - else if(myseed.production > 10) - myseed.production = 10 - - if(myseed.yield != -1) // Unharvestable shouldn't suddenly turn harvestable - myseed.yield += rand(-4,4) - if(myseed.yield < 0) - myseed.yield = 0 - else if(myseed.yield > 10) - myseed.yield = 10 - if(myseed.yield == 0 && myseed.plant_type == 2) - myseed.yield = 1 // Mushrooms always have a minimum yield of 1. - - if(myseed.potency != -1) //Not all plants have a potency - myseed.potency += rand(-50,50) - if(myseed.potency < 0) - myseed.potency = 0 - else if(myseed.potency > 100) - myseed.potency = 100 - return - - - -obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! - - if ( istype(myseed, /obj/item/seeds/nettleseed )) - del(myseed) - myseed = new /obj/item/seeds/deathnettleseed - - else if ( istype(myseed, /obj/item/seeds/amanitamycelium )) - del(myseed) - myseed = new /obj/item/seeds/angelmycelium - - else if ( istype(myseed, /obj/item/seeds/lemonseed )) - del(myseed) - myseed = new /obj/item/seeds/cashseed - - else if ( istype(myseed, /obj/item/seeds/ambrosiavulgarisseed )) - del(myseed) - myseed = new /obj/item/seeds/ambrosiadeusseed - - else if ( istype(myseed, /obj/item/seeds/plumpmycelium )) - del(myseed) - myseed = new /obj/item/seeds/walkingmushroommycelium - - else if ( istype(myseed, /obj/item/seeds/chiliseed )) - del(myseed) - myseed = new /obj/item/seeds/icepepperseed - - else if ( istype(myseed, /obj/item/seeds/appleseed )) - del(myseed) - myseed = new /obj/item/seeds/goldappleseed - - else if ( istype(myseed, /obj/item/seeds/berryseed )) - del(myseed) - switch(rand(1,100)) - if(1 to 50) - myseed = new /obj/item/seeds/poisonberryseed - if(51 to 100) - myseed = new /obj/item/seeds/glowberryseed - - else if ( istype(myseed, /obj/item/seeds/poisonberryseed )) - del(myseed) - myseed = new /obj/item/seeds/deathberryseed - - else if ( istype(myseed, /obj/item/seeds/tomatoseed )) - del(myseed) - switch(rand(1,100)) - if(1 to 35) - myseed = new /obj/item/seeds/bluetomatoseed - if(36 to 70) - myseed = new /obj/item/seeds/bloodtomatoseed - if(71 to 100) - myseed = new /obj/item/seeds/killertomatoseed - - else if ( istype(myseed, /obj/item/seeds/bluetomatoseed )) - del(myseed) - myseed = new /obj/item/seeds/bluespacetomatoseed - - else if ( istype(myseed, /obj/item/seeds/grapeseed )) - del(myseed) - myseed = new /obj/item/seeds/greengrapeseed -/* - else if ( istype(myseed, /obj/item/seeds/tomatoseed )) - del(myseed) - myseed = new /obj/item/seeds/gibtomatoseed -*/ - else if ( istype(myseed, /obj/item/seeds/eggplantseed )) - del(myseed) - myseed = new /obj/item/seeds/eggyseed +/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species() + var/previous_plant = seed.display_name + var/newseed = seed.get_mutant_variant() + if(newseed in seed_types) + seed = seed_types[newseed] else return dead = 0 - hardmutate() - planted = 1 + mutate(1) age = 0 - health = myseed.endurance + health = seed.endurance lastcycle = world.time harvest = 0 - weedlevel = 0 // Reset + weedlevel = 0 - spawn(5) // Wait a while - updateicon() - visible_message("\red[src] has suddenly mutated into \blue [myseed.plantname]!") + update_icon() + visible_message("\red The \blue [previous_plant] \red has suddenly mutated into \blue [seed.display_name]!") return +/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) - -obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant - if ( weedlevel > 5 ) - del(myseed) - var/newWeed = pick(/obj/item/seeds/libertymycelium, /obj/item/seeds/angelmycelium, /obj/item/seeds/deathnettleseed, /obj/item/seeds/kudzuseed) - myseed = new newWeed - dead = 0 - hardmutate() - planted = 1 - age = 0 - health = myseed.endurance - lastcycle = world.time - harvest = 0 - weedlevel = 0 // Reset - - spawn(5) // Wait a while - updateicon() - visible_message("\red The mutated weeds in [src] spawned a \blue [myseed.plantname]!") - else - usr << "The few weeds in the [src] seem to react, but only for a moment..." - return - - - -obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier - health = 0 - dead = 1 - harvest = 0 - updateicon() - visible_message("\red[src] is looking very unhealthy!") - return - - - -obj/machinery/hydroponics/proc/mutatepest() // Until someone makes a spaceworm, this is commented out - if ( pestlevel > 5 ) - visible_message("The pests seem to behave oddly...") -// spawn(10) -// new /obj/effect/alien/spaceworm(loc) - else - usr << "The pests seem to behave oddly, but quickly settle down..." //Modified to give a better idea of what's happening when you inject mutagen. There's still nothing proper to spawn here though. -Cheridan - return - - - -obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) - - //Called when mob user "attacks" it with object O if (istype(O, /obj/item/weapon/reagent_containers/glass)) var/b_amount = O.reagents.get_reagent_amount("water") if(b_amount > 0 && waterlevel < 100) @@ -456,322 +445,252 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) O.reagents.remove_reagent("water", b_amount) waterlevel += b_amount playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - user << "You fill \the [src] with [b_amount] units of water." + user << "You fill \the [src] with [round(b_amount,0.1)] units of water." - // Toxicity dilutation code. The more water you put in, the lesser the toxin concentration. - toxic -= round(b_amount/4) - if (toxic < 0 ) // Make sure it won't go overboard - toxic = 0 + // The more water you put in, the more diluted the toxins become. + toxins -= round(b_amount/4) else if(waterlevel >= 100) user << "\red \The [src] is already full." else user << "\red \The [O] is not filled with water." - updateicon() + check_level_sanity() + update_icon() + + // Nutrient fluid replacement. TODO: Consider rolling this into a proper reagent-processing proc. else if ( istype(O, /obj/item/nutrient) ) - var/obj/item/nutrient/myNut = O + var/obj/item/nutrient/nutrient = O user.u_equip(O) nutrilevel = 10 - yieldmod = myNut.yieldmod - mutmod = myNut.mutmod + yield_mod = nutrient.yieldmod + mutation_mod = nutrient.mutmod user << "You replace the nutrient solution in the [src]." del(O) - updateicon() + update_icon() + + // Syringe stuff + else if(istype(O, /obj/item/weapon/reagent_containers/syringe)) - else if(istype(O, /obj/item/weapon/reagent_containers/syringe)) // Syringe stuff var/obj/item/weapon/reagent_containers/syringe/S = O - if (planted) + + if(seed) + // Injecting into the plant. if (S.mode == 1) if(!S.reagents.total_volume) - user << "\red \The [O] is empty." + user << "\red [O] is empty." return - user << "\red You inject the [myseed.plantname] with a chemical solution." - // There needs to be a good amount of mutagen to actually work + user << "\red You inject the [seed.display_name] with a chemical solution." - if(S.reagents.has_reagent("mutagen", 5)) - switch(rand(100)) - if (91 to 100) plantdies() - if (81 to 90) mutatespecie() - if (66 to 80) hardmutate() - if (41 to 65) mutate() - if (21 to 41) user << "The plants don't seem to react..." - if (11 to 20) mutateweed() - if (1 to 10) mutatepest() - else user << "Nothing happens..." + // Uuuuuugh this whole chunk is going to be awful. TODO: condense it down somehow. + // Run through the various reagents in the lists and apply their effects as needed. + for(var/datum/reagent/R in S.reagents.reagent_list) - // Antitoxin binds shit pretty well. So the tox goes significantly down - if(S.reagents.has_reagent("anti_toxin", 1)) - toxic -= round(S.reagents.get_reagent_amount("anti_toxin")*2) + var/reagent_value = 0 - // NIGGA, YOU JUST WENT ON FULL RETARD. - if(S.reagents.has_reagent("toxin", 1)) - toxic += round(S.reagents.get_reagent_amount("toxin")*2) + if(toxic_reagents[R.id]) + reagent_value = toxic_reagents[R.id] + if(reagent_value > 0) + if(reagent_value < 1) + toxins += reagent_value + else + toxins += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value)) + else + if(reagent_value > -1) + toxins += reagent_value + else + toxins -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value)))) - // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now... - if(S.reagents.has_reagent("milk", 1)) - nutrilevel += round(S.reagents.get_reagent_amount("milk")*0.1) - waterlevel += round(S.reagents.get_reagent_amount("milk")*0.9) + if(nutrient_reagents[R.id]) + reagent_value = nutrient_reagents[R.id] + if(reagent_value > 0) + if(reagent_value < 1) + nutrilevel += reagent_value + else + nutrilevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value)) + else + if(reagent_value > -1) + nutrilevel += reagent_value + else + nutrilevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value)))) - // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay? - if(S.reagents.has_reagent("beer", 1)) - health -= round(S.reagents.get_reagent_amount("beer")*0.05) - nutrilevel += round(S.reagents.get_reagent_amount("beer")*0.25) - waterlevel += round(S.reagents.get_reagent_amount("beer")*0.7) + if(weedkiller_reagents[R.id]) + reagent_value = weedkiller_reagents[R.id] + if(reagent_value > 0) + if(reagent_value < 1) + weedlevel += reagent_value + else + weedlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value)) + else + if(reagent_value > -1) + weedlevel += reagent_value + else + weedlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value)))) - // You're an idiot of thinking that one of the most corrosive and deadly gasses would be beneficial - if(S.reagents.has_reagent("fluorine", 1)) - health -= round(S.reagents.get_reagent_amount("fluorine")*2) - toxic += round(S.reagents.get_reagent_amount("flourine")*2.5) - waterlevel -= round(S.reagents.get_reagent_amount("flourine")*0.5) - weedlevel -= rand(1,4) + if(pestkiller_reagents[R.id]) + reagent_value = pestkiller_reagents[R.id] + if(reagent_value > 0) + if(reagent_value < 1) + pestlevel += reagent_value + else + pestlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value)) + else + if(reagent_value > -1) + pestlevel += reagent_value + else + pestlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value)))) - // You're an idiot of thinking that one of the most corrosive and deadly gasses would be beneficial - if(S.reagents.has_reagent("chlorine", 1)) - health -= round(S.reagents.get_reagent_amount("chlorine")*1) - toxic += round(S.reagents.get_reagent_amount("chlorine")*1.5) - waterlevel -= round(S.reagents.get_reagent_amount("chlorine")*0.5) - weedlevel -= rand(1,3) + if(beneficial_reagents[R.id]) + reagent_value = beneficial_reagents[R.id] + if(reagent_value > 0) + if(reagent_value < 1) + health += reagent_value + else + health += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value)) + else + if(reagent_value > -1) + health += reagent_value + else + health -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value)))) - // White Phosphorous + water -> phosphoric acid. That's not a good thing really. Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. - if(S.reagents.has_reagent("phosphorus", 1)) - health -= round(S.reagents.get_reagent_amount("phosphorus")*0.75) - nutrilevel += round(S.reagents.get_reagent_amount("phosphorus")*0.1) - waterlevel -= round(S.reagents.get_reagent_amount("phosphorus")*0.5) - weedlevel -= rand(1,2) + if(water_reagents[R.id]) + reagent_value = water_reagents[R.id] + if(reagent_value > 0) + if(reagent_value < 1) + waterlevel += reagent_value + else + waterlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value)) + else + if(reagent_value > -1) + waterlevel += reagent_value + else + waterlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value)))) - // Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... - if(S.reagents.has_reagent("sugar", 1)) - weedlevel += rand(1,2) - pestlevel += rand(1,2) - nutrilevel+= round(S.reagents.get_reagent_amount("sugar")*0.1) - - // It is water! - if(S.reagents.has_reagent("water", 1)) - waterlevel += round(S.reagents.get_reagent_amount("water")*1) - - // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~ - if(S.reagents.has_reagent("holywater", 1)) - waterlevel += round(S.reagents.get_reagent_amount("holywater")*1) - health += round(S.reagents.get_reagent_amount("holywater")*0.1) - - // A variety of nutrients are dissolved in club soda, without sugar. These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. - if(S.reagents.has_reagent("sodawater", 1)) - waterlevel += round(S.reagents.get_reagent_amount("sodawater")*1) - health += round(S.reagents.get_reagent_amount("sodawater")*0.1) - nutrilevel += round(S.reagents.get_reagent_amount("sodawater")*0.1) - - // Man, you guys are retards - if(S.reagents.has_reagent("sacid", 1)) - health -= round(S.reagents.get_reagent_amount("sacid")*1) - toxic += round(S.reagents.get_reagent_amount("sacid")*1.5) - weedlevel -= rand(1,2) - - // SERIOUSLY - if(S.reagents.has_reagent("pacid", 1)) - health -= round(S.reagents.get_reagent_amount("pacid")*2) - toxic += round(S.reagents.get_reagent_amount("pacid")*3) - weedlevel -= rand(1,4) - - // Plant-B-Gone is just as bad - if(S.reagents.has_reagent("plantbgone", 1)) - health -= round(S.reagents.get_reagent_amount("plantbgone")*2) - toxic -= round(S.reagents.get_reagent_amount("plantbgone")*3) - weedlevel -= rand(4,8) - - // Healing - if(S.reagents.has_reagent("cryoxadone", 1)) - health += round(S.reagents.get_reagent_amount("cryoxadone")*3) - toxic -= round(S.reagents.get_reagent_amount("cryoxadone")*3) - - // FINALLY IMPLEMENTED, Ammonia is bad ass. - if(S.reagents.has_reagent("ammonia", 1)) - health += round(S.reagents.get_reagent_amount("ammonia")*0.5) - nutrilevel += round(S.reagents.get_reagent_amount("ammonia")*1) - - // FINALLY IMPLEMENTED, This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. - if(S.reagents.has_reagent("diethylamine", 1)) - health += round(S.reagents.get_reagent_amount("diethylamine")*1) - nutrilevel += round(S.reagents.get_reagent_amount("diethylamine")*2) - pestlevel -= rand(1,2) - - // Compost, effectively - if(S.reagents.has_reagent("nutriment", 1)) - health += round(S.reagents.get_reagent_amount("nutriment")*0.5) - nutrilevel += round(S.reagents.get_reagent_amount("nutriment")*1) - - // Poor man's mutagen. - if(S.reagents.has_reagent("radium", 1)) - health -= round(S.reagents.get_reagent_amount("radium")*1.5) - toxic += round(S.reagents.get_reagent_amount("radium")*2) - if(S.reagents.has_reagent("radium", 10)) - switch(rand(100)) - if (91 to 100) plantdies() - if (81 to 90) mutatespecie() - if (66 to 80) hardmutate() - if (41 to 65) mutate() - if (21 to 41) user << "The plants don't seem to react..." - if (11 to 20) mutateweed() - if (1 to 10) mutatepest() - else user << "Nothing happens..." - - // The best stuff there is. For testing/debugging. - if(S.reagents.has_reagent("adminordrazine", 1)) - waterlevel += round(S.reagents.get_reagent_amount("adminordrazine")*1) - health += round(S.reagents.get_reagent_amount("adminordrazine")*1) - nutrilevel += round(S.reagents.get_reagent_amount("adminordrazine")*1) - pestlevel -= rand(1,5) - weedlevel -= rand(1,5) - if(S.reagents.has_reagent("adminordrazine", 5)) - switch(rand(100)) - if (66 to 100) mutatespecie() - if (33 to 65) mutateweed() - if (1 to 32) mutatepest() - else user << "Nothing happens..." + // Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation. + if(mutagenic_reagents[R.id]) + var/reagent_total = S.reagents.get_reagent_amount(R.id) + reagent_value = mutagenic_reagents[R.id]+mutation_mod + if(reagent_total >= reagent_value) + if(prob(min(reagent_total*reagent_value,100))) + mutate(reagent_value > 10 ? 2 : 1) S.reagents.clear_reagents() - if (weedlevel < 0 ) // The following checks are to prevent the stats from going out of bounds. - weedlevel = 0 - if (health < 0 ) - health = 0 - if (waterlevel > 100 ) - waterlevel = 100 - if (waterlevel < 0 ) - waterlevel = 0 - if (toxic < 0 ) - toxic = 0 - if (toxic > 100 ) - toxic = 100 - if (pestlevel < 0 ) - pestlevel = 0 - if (nutrilevel > 10 ) - nutrilevel = 10 + else user << "You can't get any extract out of this plant." else - user << "There's nothing to apply the solution into." - updateicon() + user << "There's nothing to inject the solution into." - else if ( istype(O, /obj/item/seeds/) ) - if(!planted) - user.u_equip(O) - user << "You plant the [O.name]" - dead = 0 - myseed = O - planted = 1 - age = 1 - health = myseed.endurance - lastcycle = world.time - O.loc = src - if((user.client && user.s_active != src)) - user.client.screen -= O - O.dropped(user) - updateicon() + check_level_sanity() + update_icon() + + else if (istype(O, /obj/item/seeds)) + + if(!seed) + + var/obj/item/seeds/S = O + user.drop_item(O) + + if(!S.seed) + user << "The packet seems to be empty. You throw it away." + del(O) + return + + user << "You plant the [S.seed.seed_name] [S.seed.seed_noun]." + + if(S.seed.spread == 1) + msg_admin_attack("[key_name(user)] has planted a creeper packet.") + var/obj/effect/plant_controller/creeper/PC = new(get_turf(src)) + if(PC) + PC.seed = S.seed + else if(S.seed.spread == 2) + msg_admin_attack("[key_name(user)] has planted a spreading vine packet.") + var/obj/effect/plant_controller/PC = new(get_turf(src)) + if(PC) + PC.seed = S.seed + else + seed = S.seed //Grab the seed datum. + dead = 0 + age = 1 + health = seed.endurance + lastcycle = world.time + + del(O) + + check_level_sanity() + update_icon() else user << "\red The [src] already has seeds in it!" - else if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - if(planted && myseed) - user << "*** [myseed.plantname] ***" //Carn: now reports the plants growing, not the seeds. - user << "-Plant Age: \blue [age]" - user << "-Plant Endurance: \blue [myseed.endurance]" - user << "-Plant Lifespan: \blue [myseed.lifespan]" - if(myseed.yield != -1) - user << "-Plant Yield: \blue [myseed.yield]" - user << "-Plant Production: \blue [myseed.production]" - if(myseed.potency != -1) - user << "-Plant Potency: \blue [myseed.potency]" - user << "-Weed level: \blue [weedlevel]/10" - user << "-Pest level: \blue [pestlevel]/10" - user << "-Toxicity level: \blue [toxic]/100" - user << "-Water level: \blue [waterlevel]/100" - user << "-Nutrition level: \blue [nutrilevel]/10" - user << "" - else - user << "No plant found." - user << "-Weed level: \blue [weedlevel]/10" - user << "-Pest level: \blue [pestlevel]/10" - user << "-Toxicity level: \blue [toxic]/100" - user << "-Water level: \blue [waterlevel]/100" - user << "-Nutrition level: \blue [nutrilevel]/10" - user << "" - else if (istype(O, /obj/item/weapon/reagent_containers/spray/plantbgone)) - if(planted && myseed) + if(seed) health -= rand(5,20) if(pestlevel > 0) - pestlevel -= 2 // Kill kill kill - else - pestlevel = 0 + pestlevel -= 2 if(weedlevel > 0) - weedlevel -= 3 // Kill kill kill - else - weedlevel = 0 - toxic += 4 // Oops + weedlevel -= 3 + + toxins += 4 + + check_level_sanity() + visible_message("\red \The [src] has been sprayed with \the [O][(user ? " by [user]." : ".")]") playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - updateicon() + update_icon() + else + user << "There's nothing in [src] to spray!" else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe //var/deweeding if(weedlevel > 0) user.visible_message("\red [user] starts uprooting the weeds.", "\red You remove the weeds from the [src].") weedlevel = 0 - updateicon() - src.updateicon() + update_icon() else user << "\red This plot is completely devoid of weeds. It doesn't need uprooting." - else if ( istype(O, /obj/item/weapon/weedspray) ) - var/obj/item/weedkiller/myWKiller = O - user.u_equip(O) - toxic += myWKiller.toxicity - weedlevel -= myWKiller.WeedKillStr - if (weedlevel < 0 ) // Make sure it won't go overoboard - weedlevel = 0 - if (toxic > 100 ) // Make sure it won't go overoboard - toxic = 100 - user << "You apply the weedkiller solution into the [src]." - playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - del(O) - updateicon() - else if (istype(O, /obj/item/weapon/storage/bag/plants)) + attack_hand(user) + var/obj/item/weapon/storage/bag/plants/S = O for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z)) if(!S.can_be_inserted(G)) return S.handle_item_insertion(G, 1) - else if ( istype(O, /obj/item/weapon/pestspray) ) - var/obj/item/pestkiller/myPKiller = O - user.u_equip(O) - toxic += myPKiller.toxicity - pestlevel -= myPKiller.PestKillStr - if (pestlevel < 0 ) // Make sure it won't go overoboard - pestlevel = 0 - if (toxic > 100 ) // Make sure it won't go overoboard - toxic = 100 - user << "You apply the pestkiller solution into the [src]." + else if ( istype(O, /obj/item/weapon/plantspray) ) + + var/obj/item/weapon/plantspray/spray = O + user.drop_item(O) + toxins += spray.toxicity + pestlevel -= spray.pest_kill_str + weedlevel -= spray.weed_kill_str + user << "You spray [src] with [O]." playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) del(O) - updateicon() + + check_level_sanity() + update_icon() + else if(istype(O, /obj/item/weapon/wrench)) + + //If there's a connector here, the portable_atmospherics setup can handle it. + if(locate(/obj/machinery/atmospherics/portables_connector/) in loc) + return ..() + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored user << "You [anchored ? "wrench" : "unwrench"] \the [src]." - else if(istype(O, /obj/item/weapon/shovel)) - if(istype(src, /obj/machinery/hydroponics/soil)) - user << "You clear up the [src]!" - del(src) + else if(istype(O, /obj/item/apiary)) - if(planted) - user << "\red The hydroponics tray is already occupied!" + + if(seed) + user << "\red [src] is already occupied!" else user.drop_item() del(O) @@ -783,191 +702,70 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) del(src) return -/obj/machinery/hydroponics/attack_tk(mob/user as mob) - if(harvest) - myseed.harvest(src) - else if(dead) - planted = 0 - dead = 0 - usr << text("You remove the dead plant from the [src].") - del(myseed) - updateicon() +/obj/machinery/portable_atmospherics/hydroponics/attack_tk(mob/user as mob) -/obj/machinery/hydroponics/attack_hand(mob/user as mob) - if(istype(usr,/mob/living/silicon)) //How does AI know what plant is? + if(harvest) + harvest(user) + + else if(dead) + remove_dead(user) + +/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user as mob) + + if(istype(usr,/mob/living/silicon)) return + if(harvest) - if(!user in range(1,src)) - return - myseed.harvest() + harvest(user) else if(dead) - planted = 0 - dead = 0 - usr << text("You remove the dead plant from the [src].") - del(myseed) - updateicon() + remove_dead(user) + else - if(planted && !dead) - usr << text("The [src] has \blue [myseed.plantname] \black planted.") - if(health <= (myseed.endurance / 2)) - usr << text("The plant looks unhealthy") + if(seed && !dead) + usr << "[src] has \blue [seed.display_name] \black planted." + if(health <= (seed.endurance / 2)) + usr << "The plant looks \red unhealthy." else - usr << text("The [src] is empty.") - usr << text("Water: [waterlevel]/100") - usr << text("Nutrient: [nutrilevel]/10") - if(weedlevel >= 5) // Visual aid for those blind - usr << text("The [src] is filled with weeds!") - if(pestlevel >= 5) // Visual aid for those blind - usr << text("The [src] is filled with tiny worms!") - usr << text ("") // Empty line for readability. + usr << "[src] is empty." + usr << "Water: [round(waterlevel,0.1)]/100" + usr << "Nutrient: [round(nutrilevel,0.1)]/10" + if(weedlevel >= 5) + usr << "[src] is \red filled with weeds!" + if(pestlevel >= 5) + usr << "[src] is \red filled with tiny worms!" + usr << text ("") +/obj/machinery/portable_atmospherics/hydroponics/verb/close_lid() + set name = "Toggle Tray Lid" + set category = "Object" + set src in view(1) -/obj/item/seeds/proc/harvest(mob/user = usr) - var/produce = text2path(productname) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_amount = 0 + if(!usr || usr.stat || usr.restrained()) + return - while ( t_amount < (yield * parent.yieldmod )) - var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new produce(user.loc, potency) // User gets a consumable - if(!t_prod) return - t_prod.seed = mypath - t_prod.species = species - t_prod.lifespan = lifespan - t_prod.endurance = endurance - t_prod.maturation = maturation - t_prod.production = production - t_prod.yield = yield - t_prod.potency = potency - t_prod.plant_type = plant_type - t_amount++ + closed_system = !closed_system + usr << "You [closed_system ? "close" : "open"] the tray's lid." + update_icon() - parent.update_tray() - -/obj/item/seeds/grassseed/harvest(mob/user = usr) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_yield = round(yield*parent.yieldmod) - - if(t_yield > 0) - var/obj/item/stack/tile/grass/new_grass = new/obj/item/stack/tile/grass(user.loc) - new_grass.amount = t_yield - - parent.update_tray() - -/obj/item/seeds/gibtomato/harvest(mob/user = usr) - var/produce = text2path(productname) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_amount = 0 - - while ( t_amount < (yield * parent.yieldmod )) - var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new produce(user.loc, potency) // User gets a consumable - - t_prod.seed = mypath - t_prod.species = species - t_prod.lifespan = lifespan - t_prod.endurance = endurance - t_prod.maturation = maturation - t_prod.production = production - t_prod.yield = yield - t_prod.potency = potency - t_prod.plant_type = plant_type - t_amount++ - - parent.update_tray() - -/obj/item/seeds/nettleseed/harvest(mob/user = usr) - var/produce = text2path(productname) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_amount = 0 - - while ( t_amount < (yield * parent.yieldmod )) - var/obj/item/weapon/grown/t_prod = new produce(user.loc, potency) // User gets a consumable -QualityVan - t_prod.seed = mypath - t_prod.species = species - t_prod.lifespan = lifespan - t_prod.endurance = endurance - t_prod.maturation = maturation - t_prod.production = production - t_prod.yield = yield - t_prod.changePotency(potency) // -QualityVan - t_prod.plant_type = plant_type - t_amount++ - - parent.update_tray() - -/obj/item/seeds/deathnettleseed/harvest(mob/user = usr) //isn't a nettle subclass yet, so - var/produce = text2path(productname) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_amount = 0 - - while ( t_amount < (yield * parent.yieldmod )) - var/obj/item/weapon/grown/t_prod = new produce(user.loc, potency) // User gets a consumable -QualityVan - t_prod.seed = mypath - t_prod.species = species - t_prod.lifespan = lifespan - t_prod.endurance = endurance - t_prod.maturation = maturation - t_prod.production = production - t_prod.yield = yield - t_prod.changePotency(potency) // -QualityVan - t_prod.plant_type = plant_type - t_amount++ - - parent.update_tray() - -/obj/item/seeds/eggyseed/harvest(mob/user = usr) - var/produce = text2path(productname) - var/obj/machinery/hydroponics/parent = loc //for ease of access - var/t_amount = 0 - - while ( t_amount < (yield * parent.yieldmod )) - new produce(user.loc) - t_amount++ - - parent.update_tray() - -/obj/machinery/hydroponics/proc/update_tray(mob/user = usr) - harvest = 0 - lastproduce = age - if((yieldmod * myseed.yield) <= 0 || istype(myseed,/obj/item/seeds/replicapod)) - user << text("\red You fail to harvest anything useful.") - else - user << text("You harvest from the [myseed.plantname].") - if(myseed.oneharvest) - del(myseed) - planted = 0 - dead = 0 - updateicon() - -/////////////////////////////////////////////////////////////////////////////// -/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! +/obj/machinery/portable_atmospherics/hydroponics/soil name = "soil" icon = 'icons/obj/hydroponics.dmi' icon_state = "soil" density = 0 use_power = 0 + draw_warnings = 0 - updateicon() // Same as normal but with the overlays removed - Cheridan. - overlays.Cut() - if(planted) - if(dead) - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead") - else if(harvest) - if(myseed.plant_type == 2) // Shrooms don't have a -harvest graphic - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") - else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-harvest") - else if(age < myseed.maturation) - var/t_growthstate = ((age / myseed.maturation) * myseed.growthstages ) - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[round(t_growthstate)]") - lastproduce = age - else - overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") - - if(!luminosity) - if(istype(myseed,/obj/item/seeds/glowshroom)) - SetLuminosity(round(myseed.potency/10)) - else - SetLuminosity(0) +/obj/machinery/portable_atmospherics/hydroponics/soil/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item/weapon/shovel)) + user << "You clear up [src]!" + del(src) + else if(istype(O,/obj/item/weapon/shovel) || istype(O,/obj/item/weapon/tank)) return + else + ..() -#undef HYDRO_SPEED_MULTIPLIER +/obj/machinery/portable_atmospherics/hydroponics/soil/New() + ..() + verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid + +#undef HYDRO_SPEED_MULTIPLIER \ No newline at end of file diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm new file mode 100644 index 0000000000..0c87e6dcdd --- /dev/null +++ b/code/modules/hydroponics/seed_datums.dm @@ -0,0 +1,1403 @@ +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. + +// 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() + + // 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/gene_tags = list("products","consumption","environment","resistance","vigour","flowers") + var/list/used_masks = list() + + while(gene_tags && gene_tags.len) + var/gene_tag = pick(gene_tags) + var/gene_mask = "[num2hex(rand(0,255))]" + + while(gene_mask in used_masks) + gene_mask = "[num2hex(rand(0,255))]" + + used_masks += gene_mask + gene_tags -= 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. + +/datum/seed + + //Tracking. + var/uid // Unique identifier. + var/name // Index for global list. + var/seed_name // Plant name for seed packet. + var/seed_noun = "seeds" // Descriptor for packet. + var/display_name // Prettier name. + var/roundstart // If set, seed will not display variety number. + + // Output. + var/list/products // Possible fruit/other product paths. + var/list/mutants // Possible predefined mutant varieties, if any. + var/list/chems // Chemicals that plant produces in products/injects into victim. + var/list/consume_gasses // The plant will absorb these gasses during its life. + var/list/exude_gasses // The plant will exude these gasses during its life. + + //Tolerances. + var/requires_nutrients = 1 // The plant can starve. + var/nutrient_consumption = 0.1 // Plant eats this much per tick. + var/requires_water = 1 // The plant can become dehydrated. + var/water_consumption = 1 // Plant drinks this much per tick. + var/ideal_heat = 293 // Preferred temperature in Kelvin. + var/heat_tolerance = 20 // Departure from ideal that is survivable. + var/ideal_light = 8 // Preferred light level in luminosity. + var/light_tolerance = 5 // Departure from ideal that is survivable. + var/toxins_tolerance = 5 // Resistance to poison. + var/lowkpa_tolerance = 25 // Low pressure capacity. + var/highkpa_tolerance = 200 // High pressure capacity. + var/pest_tolerance = 5 // Threshold for pests to impact health. + var/weed_tolerance = 5 // Threshold for weeds to impact health. + + //General traits. + var/endurance = 100 // Maximum plant HP when growing. + var/yield = 0 // Amount of product. + var/lifespan = 0 // Time before the plant dies. + var/maturation = 0 // Time taken before the plant is mature. + var/production = 0 // Time before harvesting can be undertaken again. + var/growth_stages = 6 // Number of stages the plant passes through before it is mature. + var/harvest_repeat = 0 // If 1, this plant will fruit repeatedly.. + var/potency = 1 // General purpose plant strength value. + var/spread = 0 // 0 limits plant to tray, 1 = creepers, 2 = vines. + var/carnivorous = 0 // 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine). + var/parasite = 0 // 0 = no, 1 = gain health from weed level. + var/immutable // If set, plant will never mutate. + var/alter_temp // If set, the plant will periodically alter local temp by this amount. + + // Cosmetics. + var/plant_icon // Icon to use for the plant growing in the tray. + var/product_icon // Base to use for fruit coming from this plant (if a vine). + var/product_colour // Colour to apply to product base (if a vine). + var/packet_icon = "seed" // Icon to use for physical seed packet item. + var/biolum // Plant is bioluminescent. + var/biolum_colour // The colour of the plant's radiance. + var/flowers // Plant has a flower overlay. + var/flower_icon = "vine_fruit" // Which overlay to use. + var/flower_colour // Which colour to use. + +//Returns a key corresponding to an entry in the global seed list. +/datum/seed/proc/get_mutant_variant() + if(!mutants || !mutants.len || immutable) return 0 + return pick(mutants) + +//Mutates the plant overall (randomly). +/datum/seed/proc/mutate(var/degree,var/turf/source_turf) + if(!degree || immutable) return + + source_turf.visible_message("[display_name] quivers uneasily!") + + //This looks like shit, but it's a lot easier to read/change this way. + var/total_mutations = rand(1,1+degree) + for(var/i = 0;ichanges colour
!") + else + source_turf.visible_message("[display_name]'s glow dims...") + if(11) + if(prob(degree*2)) + flowers = !flowers + if(flowers) + source_turf.visible_message("[display_name] sprouts a bevy of flowers!") + if(prob(degree*2)) + flower_colour = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" + source_turf.visible_message("[display_name]'s flowers changes colour!") + else + source_turf.visible_message("[display_name]'s flowers wither and fall off.") + return + +//Mutates a specific trait/set of traits. +/datum/seed/proc/apply_gene(var/datum/plantgene/gene) + + if(!gene || !gene.values || immutable) return + + switch(gene.genetype) + + //Splicing products has some detrimental effects on yield and lifespan. + if("products") + + if(gene.values.len < 6) return + + yield = round(yield*0.5) + endurance = round(endurance*0.5) + lifespan = round(lifespan*0.8) + + if(!products) products = list() + products |= gene.values[1] + + if(!chems) chems = list() + for(var/rid in gene.values[2]) + var/existing_chem + for(var/chem in chems) + if(rid == chem) + existing_chem = 1 + break + + if(existing_chem) + chems[rid][1] = max(1,round((chems[rid][1]+gene.values[2][rid][1])/2)) + chems[rid][2] = max(1,round((chems[rid][2]+gene.values[2][rid][2])/2)) + else + chems[rid] = gene.values[2][rid] + + //TODO. + //if(!exude_gasses) exude_gasses = list() + //exude_gasses |= gene.values[3] + //for(var/gas in exude_gasses) + // exude_gasses[gas] = max(1,round(exude_gasses[gas]/2)) + + alter_temp = gene.values[4] + potency = gene.values[5] + harvest_repeat = gene.values[6] + + if("consumption") + + if(gene.values.len < 7) return + + consume_gasses = gene.values[1] + requires_nutrients = gene.values[2] + nutrient_consumption = gene.values[3] + requires_water = gene.values[4] + water_consumption = gene.values[5] + carnivorous = gene.values[6] + parasite = gene.values[7] + + if("environment") + + if(gene.values.len < 6) return + + ideal_heat = gene.values[1] + heat_tolerance = gene.values[2] + ideal_light = gene.values[3] + light_tolerance = gene.values[4] + lowkpa_tolerance = gene.values[5] + highkpa_tolerance = gene.values[6] + + if("resistance") + + if(gene.values.len < 3) return + + toxins_tolerance = gene.values[1] + pest_tolerance = gene.values[2] + weed_tolerance = gene.values[3] + + if("vigour") + + if(gene.values.len < 6) return + + endurance = gene.values[1] + yield = gene.values[2] + lifespan = gene.values[3] + spread = gene.values[4] + maturation = gene.values[5] + production = gene.values[6] + + if("flowers") + + if(gene.values.len < 7) return + + product_icon = gene.values[1] + product_colour = gene.values[2] + biolum = gene.values[3] + biolum_colour = gene.values[4] + flowers = gene.values[5] + flower_icon = gene.values[6] + flower_colour = gene.values[7] + +//Returns a list of the desired trait values. +/datum/seed/proc/get_gene(var/genetype) + + if(!genetype) return 0 + + var/datum/plantgene/P = new() + P.genetype = genetype + + switch(genetype) + if("products") + P.values = list( + (products ? products : 0), + (chems ? chems : 0), + (exude_gasses ? exude_gasses : 0), + (alter_temp ? alter_temp : 0), + (potency ? potency : 0), + (harvest_repeat ? harvest_repeat : 0) + ) + + if("consumption") + P.values = list( + (consume_gasses ? consume_gasses : 0), + (requires_nutrients ? requires_nutrients : 0), + (nutrient_consumption ? nutrient_consumption : 0), + (requires_water ? requires_water : 0), + (water_consumption ? water_consumption : 0), + (carnivorous ? carnivorous : 0), + (parasite ? parasite : 0) + ) + + if("environment") + P.values = list( + (ideal_heat ? ideal_heat : 0), + (heat_tolerance ? heat_tolerance : 0), + (ideal_light ? ideal_light : 0), + (light_tolerance ? light_tolerance : 0), + (lowkpa_tolerance ? lowkpa_tolerance : 0), + (highkpa_tolerance ? highkpa_tolerance : 0) + ) + + if("resistance") + P.values = list( + (toxins_tolerance ? toxins_tolerance : 0), + (pest_tolerance ? pest_tolerance : 0), + (weed_tolerance ? weed_tolerance : 0) + ) + + if("vigour") + P.values = list( + (endurance ? endurance : 0), + (yield ? yield : 0), + (lifespan ? lifespan : 0), + (spread ? spread : 0), + (maturation ? maturation : 0), + (production ? production : 0) + ) + + if("flowers") + P.values = list( + (product_icon ? product_icon : 0), + (product_colour ? product_colour : 0), + (biolum ? biolum : 0), + (biolum_colour ? biolum_colour : 0), + (flowers ? flowers : 0), + (flower_icon ? flower_icon : 0), + (flower_colour ? flower_colour : 0) + ) + + return (P ? P : 0) + +//Place the plant products at the feet of the user. +/datum/seed/proc/harvest(var/mob/user,var/yield_mod) + if(!user) + return + + //TODO: check for failing to harvest. + var/got_product + if(!isnull(products) && products.len && yield > 0) + got_product = 1 + + if(!got_product) + user << "\red You fail to harvest anything useful." + else + user << "You 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 + name = "[uid]" + seed_types[name] = src + + var/total_yield + if(isnull(yield_mod) || yield_mod < 1) + yield_mod = 0 + total_yield = yield + else + total_yield = max(1,rand(1,((yield_mod+yield)))) + + currently_querying = list() + for(var/i = 0;i last_action + action_time) + finished_task() + +/obj/machinery/botany/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/machinery/botany/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/botany/attack_hand(mob/user as mob) + ui_interact(user) + +/obj/machinery/botany/proc/finished_task() + active = 0 + if(failed_task) + failed_task = 0 + visible_message("\icon[src] [src] pings unhappily, flashing a red warning light.") + else + visible_message("\icon[src] [src] pings happily.") + + if(eject_disk) + eject_disk = 0 + if(loaded_disk) + loaded_disk.loc = get_turf(src) + visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") + loaded_disk = null + +/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/seeds)) + if(seed) + if(seed.seed.immutable) + user << "That seed is not compatible with our genetics technology." + else + user << "There is already a seed loaded." + else + user.drop_item(W) + W.loc = src + seed = W + user << "You load [W] into [src]." + return + if(istype(W,/obj/item/weapon/screwdriver)) + open = !open + user << "\blue You [open ? "open" : "close"] the maintenance panel." + return + + if(open) + if(istype(W, /obj/item/weapon/crowbar)) + dismantle() + return + + if(istype(W,/obj/item/weapon/disk/botany)) + if(loaded_disk) + user << "There is already a data disk loaded." + return + else + var/obj/item/weapon/disk/botany/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_item(W) + W.loc = src + loaded_disk = W + user << "You load [W] into [src]." + + return + ..() + +// Allows for a trait to be extracted from a seed packet, destroying that seed. +/obj/machinery/botany/extractor + name = "lysis-isolation centrifuge" + icon_state = "traitcopier" + + var/datum/seed/genetics // Currently scanned seed genetic structure. + var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point. + +/obj/machinery/botany/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + + if(!user) + return + + 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]))) + data["geneMasks"] = geneMasks + + data["activity"] = active + data["degradation"] = degradation + + if(loaded_disk) + data["disk"] = 1 + else + data["disk"] = 0 + + if(seed) + data["loaded"] = "[seed.name]" + else + data["loaded"] = 0 + + if(genetics) + data["hasGenetics"] = 1 + data["sourceName"] = genetics.display_name + if(!genetics.roundstart) + data["sourceName"] += " (variety #[genetics.uid])" + else + data["hasGenetics"] = 0 + data["sourceName"] = 0 + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/botany/Topic(href, href_list) + + if(..()) + return 1 + + if(href_list["eject_packet"]) + 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 + seed.seed.name = "[uid]" + seed_types[seed.seed.name] = seed.seed + + seed.update_seed() + visible_message("\icon[src] [src] beeps and spits out [seed].") + + seed = null + + if(href_list["eject_disk"]) + if(!loaded_disk) return + loaded_disk.loc = get_turf(src) + visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") + loaded_disk = null + + usr.set_machine(src) + src.add_fingerprint(usr) + +/obj/machinery/botany/extractor/Topic(href, href_list) + + if(..()) + return 1 + + usr.set_machine(src) + src.add_fingerprint(usr) + + if(href_list["scan_genome"]) + + if(!seed) return + + last_action = world.time + active = 1 + + if(seed && seed.seed) + genetics = seed.seed + del(seed) + seed = null + + if(href_list["get_gene"]) + + if(!genetics || !loaded_disk) return + + last_action = world.time + active = 1 + + var/datum/plantgene/P = genetics.get_gene(href_list["get_gene"]) + if(!P) return + loaded_disk.genes += P + + loaded_disk.genesource = "[genetics.display_name]" + if(!genetics.roundstart) + loaded_disk.genesource += " (variety #[genetics.uid])" + + loaded_disk.name += " ([gene_tag_masks[href_list["get_gene"]]])" + loaded_disk.desc += " The label reads \'gene [gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'." + eject_disk = 1 + + degradation += rand(20,60) + if(degradation >= 100) + failed_task = 1 + genetics = null + degradation = 0 + + if(href_list["clear_buffer"]) + if(!genetics) return + genetics = null + degradation = 0 + + src.updateUsrDialog() + return + +// Fires an extracted trait into another packet of seeds with a chance +// of destroying it based on the size/complexity of the plasmid. +/obj/machinery/botany/editor + name = "bioballistic delivery system" + icon_state = "traitgun" + disk_needs_genes = 1 + +/obj/machinery/botany/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + + if(!user) + return + + var/list/data = list() + + data["activity"] = active + + if(seed) + data["degradation"] = seed.modified + else + data["degradation"] = 0 + + if(loaded_disk && loaded_disk.genes.len) + data["disk"] = 1 + data["sourceName"] = loaded_disk.genesource + data["locus"] = "" + + for(var/datum/plantgene/P in loaded_disk.genes) + if(data["locus"] != "") data["locus"] += ", " + data["locus"] += "[gene_tag_masks[P.genetype]]" + + else + data["disk"] = 0 + data["sourceName"] = 0 + data["locus"] = 0 + + if(seed) + data["loaded"] = "[seed.name]" + else + data["loaded"] = 0 + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/botany/editor/Topic(href, href_list) + + if(..()) + return 1 + + if(href_list["apply_gene"]) + if(!loaded_disk || !seed) return + + last_action = world.time + active = 1 + + if(!isnull(seed_types[seed.seed.name])) + seed.seed = seed.seed.diverge(1) + seed.seed_type = seed.seed.name + seed.update_seed() + + if(prob(seed.modified)) + failed_task = 1 + seed.modified = 101 + + for(var/datum/plantgene/gene in loaded_disk.genes) + seed.seed.apply_gene(gene) + seed.modified += rand(5,10) + + usr.set_machine(src) + src.add_fingerprint(usr) \ No newline at end of file diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm new file mode 100644 index 0000000000..0bb301298a --- /dev/null +++ b/code/modules/hydroponics/seed_mobs.dm @@ -0,0 +1,80 @@ +/datum/seed + var/product_requires_player // If yes, product will ask for a player among the ghosts. + var/list/currently_querying // Used to avoid asking the same ghost repeatedly. + +// The following procs are used to grab players for mobs produced by a seed (mostly for dionaea). +/datum/seed/proc/handle_living_product(var/mob/living/host) + + if(!host || !istype(host)) return + + if(product_requires_player) + spawn(0) + request_player(host) + spawn(75) + if(!host.ckey && !host.client) + host.death() // This seems redundant, but a lot of mobs don't + host.stat = 2 // handle death() properly. Better safe than etc. + host.visible_message("\red [host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.") + + var/total_yield = rand(1,3) + for(var/j = 0;j<=total_yield;j++) + var/obj/item/seeds/S = new(get_turf(host)) + S.seed_type = name + S.update_seed() + +/datum/seed/proc/request_player(var/mob/living/host) + if(!host) return + for(var/mob/dead/observer/O in player_list) + if(jobban_isbanned(O, "Dionaea") || (!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist)) + continue + if(O.client) + if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying)) + currently_querying |= O.client + question(O.client,host) + +/datum/seed/proc/question(var/client/C,var/mob/living/host) + spawn(0) + + if(!C || !host || !(C.mob && istype(C.mob,/mob/dead))) return // We don't want to spam them repeatedly if they're already in a mob. + + var/response = alert(C, "Someone is harvesting [display_name]. Would you like to play as one?", "Sentient plant harvest", "Yes", "No", "Never for this round.") + + if(!C || !host || !(C.mob && istype(C.mob,/mob/dead))) return // ...or accidentally accept an invalid argument for transfer. + + if(response == "Yes") + transfer_personality(C,host) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_PLANT + + currently_querying -= C + +/datum/seed/proc/transfer_personality(var/client/player,var/mob/living/host) + + //Something is wrong, abort. + if(!player || !host) return + + //Host already has a controller, pike off slowpoke. + if(host.client && host.ckey) return + + //Transfer them over. + host.ckey = player.ckey + if(player.mob && player.mob.mind) + player.mob.mind.transfer_to(host) + + if(host.dna) host.dna.real_name = host.real_name + + // Update mode specific HUD icons. + callHook("harvest_podman", list(host)) + + host << "\green You awaken slowly, stirring into sluggish motion as the air caresses you." + + // This is a hack, replace with some kind of species blurb proc. + if(istype(host,/mob/living/carbon/monkey/diona)) + host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." + host << "Too much darkness will send you into shock and starve you, but light will help you heal." + + var/newname = input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text + newname = sanitize(newname) + if (newname != "") + host.real_name = newname + host.name = host.real_name \ No newline at end of file diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 2fb0acda31..dbc13158ec 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -1,1128 +1,216 @@ -// ******************************************************** -// Here's all the seeds (plants) that can be used in hydro -// ******************************************************** - +//Seed packet object/procs. /obj/item/seeds - name = "pack of seeds" + name = "packet of seeds" icon = 'icons/obj/seeds.dmi' - icon_state = "seed" // unknown plant seed - these shouldn't exist in-game + icon_state = "seed" flags = FPRINT | TABLEPASS - w_class = 2.0 // Makes them pocketable - var/mypath = "/obj/item/seeds" - var/plantname = "Plants" - var/productname = "" - var/species = "" - var/lifespan = 0 - var/endurance = 0 - var/maturation = 0 - var/production = 0 - var/yield = 0 // If is -1, the plant/shroom/weed is never meant to be harvested - var/oneharvest = 0 - var/potency = -1 - var/growthstages = 0 - var/plant_type = 0 // 0 = 'normal plant'; 1 = weed; 2 = shroom + w_class = 2.0 -/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob) - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "*** [plantname] ***" - user << "-Plant Endurance: \blue [endurance]" - user << "-Plant Lifespan: \blue [lifespan]" - if(yield != -1) - user << "-Plant Yield: \blue [yield]" - user << "-Plant Production: \blue [production]" - if(potency != -1) - user << "-Plant Potency: \blue [potency]" - return - ..() // Fallthrough to item/attackby() so that bags can pick seeds up + var/seed_type + var/datum/seed/seed + var/modified = 0 +/obj/item/seeds/New() + update_seed() + ..() -/obj/item/seeds/chiliseed - name = "pack of chili seeds" - desc = "These seeds grow into chili plants. HOT! HOT! HOT!" - icon_state = "seed-chili" - mypath = "/obj/item/seeds/chiliseed" - species = "chili" - plantname = "Chili Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/chili" - lifespan = 20 - endurance = 15 - maturation = 5 - production = 5 - yield = 4 - potency = 20 - plant_type = 0 - growthstages = 6 +//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] + update_appearance() -/obj/item/seeds/plastiseed - name = "plastellium mycelium" - desc = "This mycelium grows into Plastellium" - icon_state = "mycelium-plast" - mypath = "/obj/item/seeds/plastiseed" - species = "plastellium" - plantname = "Plastellium" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/plastellium" - lifespan = 15 - endurance = 17 - maturation = 5 - production = 6 - yield = 6 - oneharvest = 1 - potency = 20 - plant_type = 2 - growthstages = 3 +//Updates strings and icon appropriately based on seed datum. +/obj/item/seeds/proc/update_appearance() + if(!seed) return + icon_state = seed.packet_icon + src.name = "packet of [seed.seed_name] [seed.seed_noun]" + src.desc = "It has a picture of [seed.display_name] on the front." -/obj/item/seeds/grapeseed - name = "pack of grape seeds" - desc = "These seeds grow into grape vines." - icon_state = "seed-grapes" - mypath = "/obj/item/seeds/grapeseed" - species = "grape" - plantname = "Grape Vine" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/grapes" - lifespan = 50 - endurance = 25 - maturation = 3 - production = 5 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 2 +/obj/item/seeds/examine() + ..() + if(seed && !seed.roundstart) + usr << "It's tagged as variety #[seed.uid]." -/obj/item/seeds/greengrapeseed - name = "pack of green grape seeds" - desc = "These seeds grow into green-grape vines." - icon_state = "seed-greengrapes" - mypath = "/obj/item/seeds/greengrapeseed" - species = "greengrape" - plantname = "Green-Grape Vine" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes" - lifespan = 50 - endurance = 25 - maturation = 3 - production = 5 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 2 - -/obj/item/seeds/peanutseed - name = "pack of peanut seeds" - desc = "These seeds grow into peanut vines." - icon_state = "seed-peanut" - mypath = "/obj/item/seeds/peanutseed" - species = "peanut" - plantname = "Peanuts" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/peanut" - lifespan = 55 - endurance = 50 - maturation = 6 - production = 6 - yield = 6 - potency = 10 - plant_type = 0 - growthstages = 6 - - -/obj/item/seeds/cabbageseed - name = "pack of cabbage seeds" - desc = "These seeds grow into cabbages." - icon_state = "seed-cabbage" - mypath = "/obj/item/seeds/cabbageseed" - species = "cabbage" - plantname = "Cabbages" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage" - lifespan = 50 - endurance = 25 - maturation = 3 - production = 5 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 1 - -/obj/item/seeds/shandseed - name = "pack of s'rendarr's hand seeds" - desc = "These seeds grow into a helpful herb called S'Rendarr's Hand, native to Ahdomai." - icon_state = "seed-shand" - mypath = "/obj/item/seeds/shandseed" - species = "shand" - plantname = "S'Rendarr's Hand" - productname = "/obj/item/stack/medical/bruise_pack/tajaran" - lifespan = 50 - endurance = 25 - maturation = 3 - production = 5 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 3 - -/obj/item/seeds/mtearseed - name = "pack of messa's tear seeds" - desc = "These seeds grow into a helpful herb called Messa's Tear, native to Ahdomai." - icon_state = "seed-mtear" - mypath = "/obj/item/seeds/mtearseed" - species = "mtear" - plantname = "Messa's Tear" - productname = "/obj/item/stack/medical/ointment/tajaran" - lifespan = 50 - endurance = 25 - maturation = 3 - production = 5 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 3 - -/obj/item/seeds/berryseed - name = "pack of berry seeds" - desc = "These seeds grow into berry bushes." - icon_state = "seed-berry" - mypath = "/obj/item/seeds/berryseed" - species = "berry" - plantname = "Berry Bush" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/berries" - lifespan = 20 - endurance = 15 - maturation = 5 - production = 5 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/glowberryseed - name = "pack of glow-berry seeds" - desc = "These seeds grow into glow-berry bushes." - icon_state = "seed-glowberry" - mypath = "/obj/item/seeds/glowberryseed" - species = "glowberry" - plantname = "Glow-Berry Bush" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries" - lifespan = 30 - endurance = 25 - maturation = 5 - production = 5 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/bananaseed - name = "pack of banana seeds" - desc = "They're seeds that grow into banana trees." - icon_state = "seed-banana" - mypath = "/obj/item/seeds/bananaseed" - species = "banana" - plantname = "Banana Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/banana" - lifespan = 50 - endurance = 30 - maturation = 6 - production = 6 - yield = 3 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/eggplantseed - name = "pack of eggplant seeds" - desc = "These seeds grow to produce berries that look nothing like eggs." - icon_state = "seed-eggplant" - mypath = "/obj/item/seeds/eggplantseed" - species = "eggplant" - plantname = "Eggplants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant" - lifespan = 25 - endurance = 15 - maturation = 6 - production = 6 - yield = 2 - potency = 20 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/eggyseed - name = "pack of eggplant seeds" - desc = "These seeds grow to produce berries that look a lot like eggs." - icon_state = "seed-eggy" - mypath = "/obj/item/seeds/eggy" - species = "eggy" - plantname = "Eggplants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/egg" - lifespan = 75 - endurance = 15 - maturation = 6 - production = 12 - yield = 2 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/bloodtomatoseed - name = "pack of blood-tomato seeds" - desc = "These seeds grow into blood-tomato plants." - icon_state = "seed-bloodtomato" - mypath = "/obj/item/seeds/bloodtomatoseed" - species = "bloodtomato" - plantname = "Blood-Tomato Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato" - lifespan = 25 - endurance = 20 - maturation = 8 - production = 6 - yield = 3 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/tomatoseed - name = "pack of tomato seeds" - desc = "These seeds grow into tomato plants." - icon_state = "seed-tomato" - mypath = "/obj/item/seeds/tomatoseed" - species = "tomato" - plantname = "Tomato Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/tomato" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 6 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/killertomatoseed - name = "pack of killer-tomato seeds" - desc = "These seeds grow into killer-tomato plants." - icon_state = "seed-killertomato" - mypath = "/obj/item/seeds/killertomatoseed" - species = "killertomato" - plantname = "Killer-Tomato Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 6 - yield = 2 - potency = 10 - plant_type = 0 - oneharvest = 1 - growthstages = 2 - -/obj/item/seeds/bluetomatoseed - name = "pack of blue-tomato seeds" - desc = "These seeds grow into blue-tomato plants." - icon_state = "seed-bluetomato" - mypath = "/obj/item/seeds/bluetomatoseed" - species = "bluetomato" - plantname = "Blue-Tomato Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 6 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/bluespacetomatoseed - name = "pack of blue-space tomato seeds" - desc = "These seeds grow into blue-space tomato plants." - icon_state = "seed-bluespacetomato" - mypath = "/obj/item/seeds/bluespacetomatoseed" - species = "bluespacetomato" - plantname = "Blue-Space Tomato Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 6 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/cornseed - name = "pack of corn seeds" - desc = "I don't mean to sound corny..." - icon_state = "seed-corn" - mypath = "/obj/item/seeds/cornseed" - species = "corn" - plantname = "Corn Stalks" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/corn" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 6 - yield = 3 - plant_type = 0 - oneharvest = 1 - potency = 20 - growthstages = 3 +/obj/item/seeds/replicapod + seed_type = "diona" /obj/item/seeds/poppyseed - name = "pack of poppy seeds" - desc = "These seeds grow into poppies." - icon_state = "seed-poppy" - mypath = "/obj/item/seeds/poppyseed" - species = "poppy" - plantname = "Poppy Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/poppy" - lifespan = 25 - endurance = 10 - potency = 20 - maturation = 8 - production = 6 - yield = 6 - plant_type = 0 - oneharvest = 1 - growthstages = 3 + seed_type = "poppies" + +/obj/item/seeds/chiliseed + seed_type = "chili" + +/obj/item/seeds/plastiseed + seed_type = "plastic" + +/obj/item/seeds/grapeseed + seed_type = "grapes" + +/obj/item/seeds/greengrapeseed + seed_type = "greengrapes" + +/obj/item/seeds/peanutseed + seed_type = "peanut" + +/obj/item/seeds/cabbageseed + seed_type = "cabbage" + +/obj/item/seeds/shandseed + seed_type = "shand" + +/obj/item/seeds/mtearseed + seed_type = "mtear" + +/obj/item/seeds/berryseed + seed_type = "berries" + +/obj/item/seeds/glowberryseed + seed_type = "glowberries" + +/obj/item/seeds/bananaseed + seed_type = "banana" + +/obj/item/seeds/eggplantseed + seed_type = "eggplant" + +/obj/item/seeds/eggyseed + seed_type = "realeggplant" + +/obj/item/seeds/bloodtomatoseed + seed_type = "bloodtomato" + +/obj/item/seeds/tomatoseed + seed_type = "tomato" + +/obj/item/seeds/killertomatoseed + seed_type = "killertomato" + +/obj/item/seeds/bluetomatoseed + seed_type = "bluetomato" + +/obj/item/seeds/bluespacetomatoseed + seed_type = "bluespacetomato" + +/obj/item/seeds/cornseed + seed_type = "corn" + +/obj/item/seeds/poppyseed + seed_type = "poppies" /obj/item/seeds/potatoseed - name = "pack of potato seeds" - desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" - icon_state = "seed-potato" - mypath = "/obj/item/seeds/potatoseed" - species = "potato" - plantname = "Potato-Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/potato" - lifespan = 30 - endurance = 15 - maturation = 10 - production = 1 - yield = 4 - plant_type = 0 - oneharvest = 1 - potency = 10 - growthstages = 4 + seed_type = "potato" /obj/item/seeds/icepepperseed - name = "pack of ice-pepper seeds" - desc = "These seeds grow into ice-pepper plants." - icon_state = "seed-icepepper" - mypath = "/obj/item/seeds/icepepperseed" - species = "chiliice" - plantname = "Ice-Pepper Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper" - lifespan = 25 - endurance = 15 - maturation = 4 - production = 4 - yield = 4 - potency = 20 - plant_type = 0 - growthstages = 6 + seed_type = "icechili" /obj/item/seeds/soyaseed - name = "pack of soybean seeds" - desc = "These seeds grow into soybean plants." - icon_state = "seed-soybean" - mypath = "/obj/item/seeds/soyaseed" - species = "soybean" - plantname = "Soybean Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans" - lifespan = 25 - endurance = 15 - maturation = 4 - production = 4 - yield = 3 - potency = 5 - plant_type = 0 - growthstages = 6 + seed_type = "soybean" /obj/item/seeds/wheatseed - name = "pack of wheat seeds" - desc = "These may, or may not, grow into weed." - icon_state = "seed-wheat" - mypath = "/obj/item/seeds/wheatseed" - species = "wheat" - plantname = "Wheat Stalks" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/wheat" - lifespan = 25 - endurance = 15 - maturation = 6 - production = 1 - yield = 4 - potency = 5 - oneharvest = 1 - plant_type = 0 - growthstages = 6 + seed_type = "wheat" /obj/item/seeds/riceseed - name = "pack of rice seeds" - desc = "These seeds grow into rice stalks." - icon_state = "seed-rice" - mypath = "/obj/item/seeds/riceseed" - species = "rice" - plantname = "Rice Stalks" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/ricestalk" - lifespan = 25 - endurance = 15 - maturation = 6 - production = 1 - yield = 4 - potency = 5 - oneharvest = 1 - plant_type = 0 - growthstages = 4 + seed_type = "rice" /obj/item/seeds/carrotseed - name = "pack of carrot seeds" - desc = "These seeds grow into carrots." - icon_state = "seed-carrot" - mypath = "/obj/item/seeds/carrotseed" - species = "carrot" - plantname = "Carrots" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/carrot" - lifespan = 25 - endurance = 15 - maturation = 10 - production = 1 - yield = 5 - potency = 10 - oneharvest = 1 - plant_type = 0 - growthstages = 3 + seed_type = "carrot" /obj/item/seeds/reishimycelium - name = "pack of reishi mycelium" - desc = "This mycelium grows into something relaxing." - icon_state = "mycelium-reishi" - mypath = "/obj/item/seeds/reishimycelium" - species = "reishi" - plantname = "Reishi" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi" - lifespan = 35 - endurance = 35 - maturation = 10 - production = 5 - yield = 4 - potency = 15 // Sleeping based on potency? - oneharvest = 1 - growthstages = 4 - plant_type = 2 + seed_type = "reishi" /obj/item/seeds/amanitamycelium - name = "pack of fly amanita mycelium" - desc = "This mycelium grows into something horrible." - icon_state = "mycelium-amanita" - mypath = "/obj/item/seeds/amanitamycelium" - species = "amanita" - plantname = "Fly Amanitas" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita" - lifespan = 50 - endurance = 35 - maturation = 10 - production = 5 - yield = 4 - potency = 10 // Damage based on potency? - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "amanita" /obj/item/seeds/angelmycelium - name = "pack of destroying angel mycelium" - desc = "This mycelium grows into something devestating." - icon_state = "mycelium-angel" - mypath = "/obj/item/seeds/angelmycelium" - species = "angel" - plantname = "Destroying Angels" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel" - lifespan = 50 - endurance = 35 - maturation = 12 - production = 5 - yield = 2 - potency = 35 - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "destroyingangel" /obj/item/seeds/libertymycelium - name = "pack of liberty-cap mycelium" - desc = "This mycelium grows into liberty-cap mushrooms." - icon_state = "mycelium-liberty" - mypath = "/obj/item/seeds/libertymycelium" - species = "liberty" - plantname = "Liberty-Caps" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap" - lifespan = 25 - endurance = 15 - maturation = 7 - production = 1 - yield = 5 - potency = 15 // Lowish potency at start - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "libertycap" /obj/item/seeds/chantermycelium - name = "pack of chanterelle mycelium" - desc = "This mycelium grows into chanterelle mushrooms." - icon_state = "mycelium-chanter" - mypath = "/obj/item/seeds/chantermycelium" - species = "chanter" - plantname = "Chanterelle Mushrooms" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle" - lifespan = 35 - endurance = 20 - maturation = 7 - production = 1 - yield = 5 - potency = 1 - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "mushrooms" /obj/item/seeds/towermycelium - name = "pack of tower-cap mycelium" - desc = "This mycelium grows into tower-cap mushrooms." - icon_state = "mycelium-tower" - mypath = "/obj/item/seeds/towermycelium" - species = "towercap" - plantname = "Tower Caps" - productname = "/obj/item/weapon/grown/log" - lifespan = 80 - endurance = 50 - maturation = 15 - production = 1 - yield = 5 - potency = 1 - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "towercap" /obj/item/seeds/glowshroom - name = "pack of glowshroom mycelium" - desc = "This mycelium -glows- into mushrooms!" - icon_state = "mycelium-glowshroom" - mypath = "/obj/item/seeds/glowshroom" - species = "glowshroom" - plantname = "Glowshrooms" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom" - lifespan = 120 //ten times that is the delay - endurance = 30 - maturation = 15 - production = 1 - yield = 3 //-> spread - potency = 30 //-> brightness - oneharvest = 1 - growthstages = 4 - plant_type = 2 + seed_type = "glowshroom" /obj/item/seeds/plumpmycelium - name = "pack of plump-helmet mycelium" - desc = "This mycelium grows into helmets... maybe." - icon_state = "mycelium-plump" - mypath = "/obj/item/seeds/plumpmycelium" - species = "plump" - plantname = "Plump-Helmet Mushrooms" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 1 - yield = 4 - potency = 0 - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "plumphelmet" /obj/item/seeds/walkingmushroommycelium - name = "pack of walking mushroom mycelium" - desc = "This mycelium will grow into huge stuff!" - icon_state = "mycelium-walkingmushroom" - mypath = "/obj/item/seeds/walkingmushroommycelium" - species = "walkingmushroom" - plantname = "Walking Mushrooms" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom" - lifespan = 30 - endurance = 30 - maturation = 5 - production = 1 - yield = 1 - potency = 0 - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "walkingmushroom" /obj/item/seeds/nettleseed - name = "pack of nettle seeds" - desc = "These seeds grow into nettles." - icon_state = "seed-nettle" - mypath = "/obj/item/seeds/nettleseed" - species = "nettle" - plantname = "Nettles" - productname = "/obj/item/weapon/grown/nettle" - lifespan = 30 - endurance = 40 // tuff like a toiger - maturation = 6 - production = 6 - yield = 4 - potency = 10 - oneharvest = 0 - growthstages = 5 - plant_type = 1 + seed_type = "nettle" /obj/item/seeds/deathnettleseed - name = "pack of death-nettle seeds" - desc = "These seeds grow into death-nettles." - icon_state = "seed-deathnettle" - mypath = "/obj/item/seeds/deathnettleseed" - species = "deathnettle" - plantname = "Death Nettles" - productname = "/obj/item/weapon/grown/deathnettle" - lifespan = 30 - endurance = 25 - maturation = 8 - production = 6 - yield = 2 - potency = 10 - oneharvest = 0 - growthstages = 5 - plant_type = 1 + seed_type = "deathnettle" /obj/item/seeds/weeds - name = "pack of weed seeds" - desc = "Yo mang, want some weeds?" - icon_state = "seed" - mypath = "/obj/item/seeds/weeds" - species = "weeds" - plantname = "Starthistle" - productname = "" - lifespan = 100 - endurance = 50 // damm pesky weeds - maturation = 5 - production = 1 - yield = -1 - potency = -1 - oneharvest = 1 - growthstages = 4 - plant_type = 1 + seed_type = "weeds" /obj/item/seeds/harebell - name = "pack of harebell seeds" - desc = "These seeds grow into pretty little flowers." - icon_state = "seed-harebell" - mypath = "/obj/item/seeds/harebell" - species = "harebell" - plantname = "Harebells" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/harebell" - lifespan = 100 - endurance = 20 - maturation = 7 - production = 1 - yield = 2 - potency = 1 - oneharvest = 1 - growthstages = 4 - plant_type = 1 + seed_type = "harebells" /obj/item/seeds/sunflowerseed - name = "pack of sunflower seeds" - desc = "These seeds grow into sunflowers." - icon_state = "seed-sunflower" - mypath = "/obj/item/seeds/sunflowerseed" - species = "sunflower" - plantname = "Sunflowers" - productname = "/obj/item/weapon/grown/sunflower" - lifespan = 25 - endurance = 20 - maturation = 6 - production = 1 - yield = 2 - potency = 1 - oneharvest = 1 - growthstages = 3 - plant_type = 1 + seed_type = "sunflowers" /obj/item/seeds/brownmold - name = "pack of brown mold" - desc = "Eww.. moldy." - icon_state = "seed" - mypath = "/obj/item/seeds/brownmold" - species = "mold" - plantname = "Brown Mold" - productname = "" - lifespan = 50 - endurance = 30 - maturation = 10 - production = 1 - yield = -1 - potency = 1 - oneharvest = 1 - growthstages = 3 - plant_type = 2 + seed_type = "mold" /obj/item/seeds/appleseed - name = "pack of apple seeds" - desc = "These seeds grow into apple trees." - icon_state = "seed-apple" - mypath = "/obj/item/seeds/appleseed" - species = "apple" - plantname = "Apple Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/apple" - lifespan = 55 - endurance = 35 - maturation = 6 - production = 6 - yield = 5 - potency = 10 - plant_type = 0 - growthstages = 6 + seed_type = "apple" /obj/item/seeds/poisonedappleseed - name = "pack of apple seeds" - desc = "These seeds grow into apple trees." - icon_state = "seed-apple" - mypath = "/obj/item/seeds/poisonedappleseed" - species = "apple" - plantname = "Apple Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned" - lifespan = 55 - endurance = 35 - maturation = 6 - production = 6 - yield = 5 - potency = 10 - plant_type = 0 - growthstages = 6 + seed_type = "poisonapple" /obj/item/seeds/goldappleseed - name = "pack of golden apple seeds" - desc = "These seeds grow into golden apple trees. Good thing there are no firebirds in space." - icon_state = "seed-goldapple" - mypath = "/obj/item/seeds/goldappleseed" - species = "goldapple" - plantname = "Golden Apple Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/goldapple" - lifespan = 55 - endurance = 35 - maturation = 10 - production = 10 - yield = 3 - potency = 10 - plant_type = 0 - growthstages = 6 + seed_type = "goldapple" /obj/item/seeds/ambrosiavulgarisseed - name = "pack of ambrosia vulgaris seeds" - desc = "These seeds grow into common ambrosia, a plant grown by and from medicine." - icon_state = "seed-ambrosiavulgaris" - mypath = "/obj/item/seeds/ambrosiavulgarisseed" - species = "ambrosiavulgaris" - plantname = "Ambrosia Vulgaris" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris" - lifespan = 60 - endurance = 25 - maturation = 6 - production = 6 - yield = 6 - potency = 5 - plant_type = 0 - growthstages = 6 + seed_type = "ambrosia" /obj/item/seeds/ambrosiadeusseed - name = "pack of ambrosia deus seeds" - desc = "These seeds grow into ambrosia deus. Could it be the food of the gods..?" - icon_state = "seed-ambrosiadeus" - mypath = "/obj/item/seeds/ambrosiadeusseed" - species = "ambrosiadeus" - plantname = "Ambrosia Deus" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus" - lifespan = 60 - endurance = 25 - maturation = 6 - production = 6 - yield = 6 - potency = 5 - plant_type = 0 - growthstages = 6 + seed_type = "ambrosiadeus" /obj/item/seeds/whitebeetseed - name = "pack of white-beet seeds" - desc = "These seeds grow into sugary beet producing plants." - icon_state = "seed-whitebeet" - mypath = "/obj/item/seeds/whitebeetseed" - species = "whitebeet" - plantname = "White-Beet Plants" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet" - lifespan = 60 - endurance = 50 - maturation = 6 - production = 6 - yield = 6 - oneharvest = 1 - potency = 10 - plant_type = 0 - growthstages = 6 + seed_type = "whitebeet" /obj/item/seeds/sugarcaneseed - name = "pack of sugarcane seeds" - desc = "These seeds grow into sugarcane." - icon_state = "seed-sugarcane" - mypath = "/obj/item/seeds/sugarcaneseed" - species = "sugarcane" - plantname = "Sugarcane" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane" - lifespan = 60 - endurance = 50 - maturation = 3 - production = 6 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 3 + seed_type = "sugarcane" /obj/item/seeds/watermelonseed - name = "pack of watermelon seeds" - desc = "These seeds grow into watermelon plants." - icon_state = "seed-watermelon" - mypath = "/obj/item/seeds/watermelonseed" - species = "watermelon" - plantname = "Watermelon Vines" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon" - lifespan = 50 - endurance = 40 - maturation = 6 - production = 6 - yield = 3 - potency = 1 - plant_type = 0 - growthstages = 6 + seed_type = "watermelon" /obj/item/seeds/pumpkinseed - name = "pack of pumpkin seeds" - desc = "These seeds grow into pumpkin vines." - icon_state = "seed-pumpkin" - mypath = "/obj/item/seeds/pumpkinseed" - species = "pumpkin" - plantname = "Pumpkin Vines" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin" - lifespan = 50 - endurance = 40 - maturation = 6 - production = 6 - yield = 3 - potency = 10 - plant_type = 0 - growthstages = 3 - + seed_type = "pumpkin" /obj/item/seeds/limeseed - name = "pack of lime seeds" - desc = "These are very sour seeds." - icon_state = "seed-lime" - mypath = "/obj/item/seeds/limeseed" - species = "lime" - plantname = "Lime Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/lime" - lifespan = 55 - endurance = 50 - maturation = 6 - production = 6 - yield = 4 - potency = 15 - plant_type = 0 - growthstages = 6 + seed_type = "lime" /obj/item/seeds/lemonseed - name = "pack of lemon seeds" - desc = "These are sour seeds." - icon_state = "seed-lemon" - mypath = "/obj/item/seeds/lemonseed" - species = "lemon" - plantname = "Lemon Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/lemon" - lifespan = 55 - endurance = 45 - maturation = 6 - production = 6 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 6 - -/obj/item/seeds/cashseed - name = "pack of money seeds" - desc = "When life gives you lemons, mutate them into cash." - icon_state = "seed-cash" - mypath = "/obj/item/seeds/cashseed" - species = "cashtree" - plantname = "Money Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/money" - lifespan = 55 - endurance = 45 - maturation = 6 - production = 6 - yield = 4 - potency = 10 - plant_type = 0 - growthstages = 6 + seed_type = "lemon" /obj/item/seeds/orangeseed - name = "pack of orange seed" - desc = "Sour seeds." - icon_state = "seed-orange" - mypath = "/obj/item/seeds/orangeseed" - species = "orange" - plantname = "Orange Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/orange" - lifespan = 60 - endurance = 50 - maturation = 6 - production = 6 - yield = 5 - potency = 1 - plant_type = 0 - growthstages = 6 + seed_type = "orange" /obj/item/seeds/poisonberryseed - name = "pack of poison-berry seeds" - desc = "These seeds grow into poison-berry bushes." - icon_state = "seed-poisonberry" - mypath = "/obj/item/seeds/poisonberryseed" - species = "poisonberry" - plantname = "Poison-Berry Bush" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries" - lifespan = 20 - endurance = 15 - maturation = 5 - production = 5 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 6 + seed_type = "poisonberries" /obj/item/seeds/deathberryseed - name = "pack of death-berry seeds" - desc = "These seeds grow into death berries." - icon_state = "seed-deathberry" - mypath = "/obj/item/seeds/deathberryseed" - species = "deathberry" - plantname = "Death Berry Bush" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/deathberries" - lifespan = 30 - endurance = 20 - maturation = 5 - production = 5 - yield = 3 - potency = 50 - plant_type = 0 - growthstages = 6 + seed_type = "deathberries" /obj/item/seeds/grassseed - name = "pack of grass seeds" - desc = "These seeds grow into grass. Yummy!" - icon_state = "seed-grass" - mypath = "/obj/item/seeds/grassseed" - species = "grass" - plantname = "Grass" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/grass" - lifespan = 60 - endurance = 50 - maturation = 2 - production = 5 - yield = 5 - plant_type = 0 - growthstages = 2 + seed_type = "grass" /obj/item/seeds/cocoapodseed - name = "pack of cocoa pod seeds" - desc = "These seeds grow into cacao trees. They look fattening." //SIC: cocoa is the seeds. The tress ARE spelled cacao. - icon_state = "seed-cocoapod" - mypath = "/obj/item/seeds/cocoapodseed" - species = "cocoapod" - plantname = "Cocao Tree" //SIC: see above - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod" - lifespan = 20 - endurance = 15 - maturation = 5 - production = 5 - yield = 2 - potency = 10 - plant_type = 0 - growthstages = 5 + seed_type = "cocoa" /obj/item/seeds/cherryseed - name = "pack of cherry pits" - desc = "Careful not to crack a tooth on one... That'd be the pits." - icon_state = "seed-cherry" - mypath = "/obj/item/seeds/cherryseed" - species = "cherry" - plantname = "Cherry Tree" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/cherries" - lifespan = 35 - endurance = 35 - maturation = 5 - production = 5 - yield = 3 - potency = 10 - plant_type = 0 - growthstages = 5 + seed_type = "cherry" /obj/item/seeds/kudzuseed - name = "pack of kudzu seeds" - desc = "These seeds grow into a weed that grows incredibly fast." - icon_state = "seed-kudzu" - mypath = "/obj/item/seeds/kudzuseed" - species = "kudzu" - plantname = "Kudzu" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod" - lifespan = 20 - endurance = 10 - maturation = 6 - production = 6 - yield = 4 - potency = 10 - growthstages = 4 - plant_type = 1 - -/obj/item/seeds/kudzuseed/attack_self(mob/user as mob) - if(istype(user.loc,/turf/space)) - return - user << "You plant the kudzu. You monster." - new /obj/effect/spacevine_controller(user.loc) - del(src) - - - -/* // Maybe one day when I get it to work like a grenade which exlodes gibs. -/obj/item/seeds/gibtomatoseed - name = "Gib Tomato seeds" - desc = "Used to grow gib tomotoes." - icon_state = "seed-gibtomato" - mypath = "/obj/item/seeds/gibtomatoseed" - species = "gibtomato" - plantname = "Gib Tomato plant" - productname = "/obj/item/weapon/grown/gibtomato" - lifespan = 35 - endurance = 25 - maturation = 6 - production = 6 - yield = 3 - potency = 10 - plant_type = 0 - growthstages = 6 -*/ - -/* -/obj/item/seeds/ - name = "" - icon_state = "seed" - mypath = "/obj/item/seeds/" - species = "" - plantname = "" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/" - lifespan = 25 - endurance = 15 - maturation = 10 - production = 1 - yield = -1 - potency = 0 - oneharvest = 1 - growthstages = 3 - plant_type = 0 - -*/ \ No newline at end of file + seed_type = "kudzu" \ No newline at end of file diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm new file mode 100644 index 0000000000..a7312e3dc1 --- /dev/null +++ b/code/modules/hydroponics/vines.dm @@ -0,0 +1,386 @@ +// SPACE VINES (Note that this code is very similar to Biomass code) +/obj/effect/plantsegment + name = "space vines" + desc = "An extremely expansionistic species of vine." + icon = 'icons/effects/spacevines.dmi' + icon_state = "Light1" + anchored = 1 + density = 0 + layer = 5 + pass_flags = PASSTABLE | PASSGRILLE + + // Vars used by vines with seed data. + var/age = 0 + var/lastproduce = 0 + var/harvest = 0 + var/list/chems + var/plant_damage_noun = "Thorns" + var/limited_growth = 0 + + // Life vars/ + var/energy = 0 + var/obj/effect/plant_controller/master = null + var/mob/living/buckled_mob + var/datum/seed/seed + +/obj/effect/plantsegment/New() + return + +/obj/effect/plantsegment/Del() + if(master) + master.vines -= src + master.growth_queue -= src + ..() + +/obj/effect/plantsegment/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (!W || !user || !W.type) return + switch(W.type) + if(/obj/item/weapon/circular_saw) del src + if(/obj/item/weapon/kitchen/utensil/knife) del src + if(/obj/item/weapon/scalpel) del src + if(/obj/item/weapon/twohanded/fireaxe) del src + if(/obj/item/weapon/hatchet) del src + if(/obj/item/weapon/melee/energy) del src + + // Less effective weapons + if(/obj/item/weapon/wirecutters) + if(prob(25)) del src + if(/obj/item/weapon/shard) + if(prob(25)) del src + + // Weapons with subtypes + else + if(istype(W, /obj/item/weapon/melee/energy/sword)) del src + else if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) del src + else + manual_unbuckle(user) + return + // Plant-b-gone damage is handled in its entry in chemistry-reagents.dm + ..() + + +/obj/effect/plantsegment/attack_hand(mob/user as mob) + + if(user.a_intent == "help" && seed && harvest) + seed.harvest(user,1) + harvest = 0 + lastproduce = age + update() + return + + manual_unbuckle(user) + + +/obj/effect/plantsegment/attack_paw(mob/user as mob) + manual_unbuckle(user) + +/obj/effect/plantsegment/proc/unbuckle() + if(buckled_mob) + if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt + buckled_mob.buckled = null + buckled_mob.anchored = initial(buckled_mob.anchored) + buckled_mob.update_canmove() + buckled_mob = null + return + +/obj/effect/plantsegment/proc/manual_unbuckle(mob/user as mob) + if(buckled_mob) + if(prob(seed ? min(max(0,100 - seed.potency),100) : 50)) + if(buckled_mob.buckled == src) + if(buckled_mob != user) + buckled_mob.visible_message(\ + "[user.name] frees [buckled_mob.name] from [src].",\ + "[user.name] frees you from [src].",\ + "You hear shredding and ripping.") + else + buckled_mob.visible_message(\ + "[buckled_mob.name] struggles free of [src].",\ + "You untangle [src] from around yourself.",\ + "You hear shredding and ripping.") + unbuckle() + else + var/text = pick("rips","tears","pulls") + user.visible_message(\ + "[user.name] [text] at [src].",\ + "You [text] at [src].",\ + "You hear shredding and ripping.") + return + +/obj/effect/plantsegment/proc/grow() + + if(!energy) + src.icon_state = pick("Med1", "Med2", "Med3") + energy = 1 + + //Low-lying creepers do not block vision or grow thickly. + if(limited_growth) + energy = 2 + return + + src.opacity = 1 + layer = 5 + else if(!limited_growth) + src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") + energy = 2 + +/obj/effect/plantsegment/proc/entangle_mob() + + if(limited_growth) + return + + if(prob(seed ? seed.potency : 25)) + + if(!buckled_mob) + var/mob/living/carbon/V = locate() in src.loc + if(V && (V.stat != DEAD) && (V.buckled != src)) // If mob exists and is not dead or captured. + V.buckled = src + V.loc = src.loc + V.update_canmove() + src.buckled_mob = V + V << "The vines [pick("wind", "tangle", "tighten")] around you!" + + // FEED ME, SEYMOUR. + if(buckled_mob && seed && (buckled_mob.stat != DEAD)) //Don't bother with a dead mob. + + var/mob/living/M = buckled_mob + if(!istype(M)) return + var/mob/living/carbon/human/H = buckled_mob + + // Drink some blood/cause some brute. + if(seed.carnivorous == 2) + buckled_mob << "\The [src] pierces your flesh greedily!" + + var/damage = rand(round(seed.potency/2),seed.potency) + if(!istype(H)) + H.adjustBruteLoss(damage) + return + + var/datum/organ/external/affecting = H.get_organ(pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")) + + if(affecting) + affecting.take_damage(damage, 0) + if(affecting.parent) + affecting.parent.add_autopsy_data("[plant_damage_noun]", damage) + else + H.adjustBruteLoss(damage) + + H.UpdateDamageIcon() + H.updatehealth() + + // Inject some chems. + if(seed.chems && seed.chems.len && istype(H)) + H << "You feel something seeping into your skin!" + for(var/rid in seed.chems) + var/injecting = min(5,max(1,seed.potency/5)) + H.reagents.add_reagent(rid,injecting) + +/obj/effect/plantsegment/proc/update() + if(!seed) return + + // Update bioluminescence. + if(seed.biolum) + SetLuminosity(1+round(seed.potency/10)) + if(seed.biolum_colour) + l_color = seed.biolum_colour + else + l_color = null + return + else + SetLuminosity(0) + + // Update flower/product overlay. + overlays.Cut() + if(age >= seed.maturation) + if(prob(20) && seed.products && seed.products.len && !harvest && ((age-lastproduce) > seed.production)) + harvest = 1 + lastproduce = age + + if(harvest) + var/image/fruit_overlay = image('icons/obj/hydroponics.dmi',"") + if(seed.product_colour) + fruit_overlay.color = seed.product_colour + overlays += fruit_overlay + + if(seed.flowers) + var/image/flower_overlay = image('icons/obj/hydroponics.dmi',"[seed.flower_icon]") + if(seed.flower_colour) + flower_overlay.color = seed.flower_colour + overlays += flower_overlay + +/obj/effect/plantsegment/proc/spread() + var/direction = pick(cardinal) + var/step = get_step(src,direction) + if(istype(step,/turf/simulated/floor)) + var/turf/simulated/floor/F = step + if(!locate(/obj/effect/plantsegment,F)) + if(F.Enter(src)) + if(master) + master.spawn_piece( F ) + +// Explosion damage. +/obj/effect/plantsegment/ex_act(severity) + switch(severity) + if(1.0) + die() + return + if(2.0) + if (prob(90)) + die() + return + if(3.0) + if (prob(50)) + die() + return + return + +// Hotspots kill vines. +/obj/effect/plantsegment/fire_act(null, temp, volume) + del src + +/obj/effect/plantsegment/proc/die() + if(seed && harvest) + seed.harvest(src,1) + del(src) + +/obj/effect/plantsegment/proc/life() + + if(!seed) + return + + if(prob(30)) + age++ + + var/turf/T = loc + var/datum/gas_mixture/environment + if(T) environment = T.return_air() + + if(!environment) + return + + var/pressure = environment.return_pressure() + if(pressure < seed.lowkpa_tolerance || pressure > seed.highkpa_tolerance) + die() + return + + if(abs(environment.temperature - seed.ideal_heat) > seed.heat_tolerance) + die() + return + + var/area/A = T.loc + if(A) + var/light_available + if(A.lighting_use_dynamic) + light_available = max(0,min(10,T.lighting_lumcount)-5) + else + light_available = 5 + if(abs(light_available - seed.ideal_light) > seed.light_tolerance) + die() + return + +/obj/effect/plant_controller + + //What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0, + //meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore. + + var/list/obj/effect/plantsegment/vines = list() + var/list/growth_queue = list() + var/reached_collapse_size + var/reached_slowdown_size + var/datum/seed/seed + + var/collapse_limit = 250 + var/slowdown_limit = 30 + var/limited_growth = 0 + +/obj/effect/plant_controller/creeper + collapse_limit = 50 + slowdown_limit = 5 + limited_growth = 1 + +/obj/effect/plant_controller/New() + if(!istype(src.loc,/turf/simulated/floor)) + del(src) + + spawn(0) + spawn_piece(src.loc) + + processing_objects.Add(src) + +/obj/effect/plant_controller/Del() + processing_objects.Remove(src) + ..() + +/obj/effect/plant_controller/proc/spawn_piece(var/turf/location) + var/obj/effect/plantsegment/SV = new(location) + SV.limited_growth = src.limited_growth + growth_queue += SV + vines += SV + SV.master = src + if(seed) + SV.seed = seed + SV.name = "[seed.seed_name] vines" + SV.update() + +/obj/effect/plant_controller/process() + + // Space vines exterminated. Remove the controller + if(!vines) + del(src) + return + + // Sanity check. + if(!growth_queue) + del(src) + return + + // Check if we're too big for our own good. + if(vines.len >= (seed ? seed.potency * collapse_limit : 250) && !reached_collapse_size) + reached_collapse_size = 1 + if(vines.len >= (seed ? seed.potency * slowdown_limit : 30) && !reached_slowdown_size ) + reached_slowdown_size = 1 + + var/length = 0 + if(reached_collapse_size) + length = 0 + else if(reached_slowdown_size) + if(prob(seed ? seed.potency : 25)) + length = 1 + else + length = 0 + else + length = 1 + + length = min(30, max(length, vines.len/5)) + + // Update as many pieces of vine as we're allowed to. + // Append updated vines to the end of the growth queue. + var/i = 0 + var/list/obj/effect/plantsegment/queue_end = list() + for(var/obj/effect/plantsegment/SV in growth_queue) + i++ + queue_end += SV + growth_queue -= SV + + SV.life() + + if(SV.energy < 2) //If tile isn't fully grown + var/chance + if(seed) + chance = limited_growth ? round(seed.potency/2,1) : seed.potency + else + chance = 20 + + if(prob(chance)) + SV.grow() + + else if(!seed || !limited_growth) //If tile is fully grown and not just a creeper. + SV.entangle_mob() + + SV.update() + SV.spread() + if(i >= length) + break + + growth_queue = growth_queue + queue_end \ No newline at end of file diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index e7f45999a4..504234d988 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -39,7 +39,7 @@ return if(9) for(var/i = 0, i < 3, i++) - new/obj/machinery/hydroponics(src) + new/obj/machinery/portable_atmospherics/hydroponics(src) if(10) for(var/i = 0, i < 3, i++) new/obj/item/weapon/reagent_containers/glass/beaker/noreact(src) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 4f324805a2..6877ed4b85 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -16,80 +16,78 @@ mecha = null//This does not appear to be used outside of reference in mecha.dm. - attack_self(mob/user as mob) - if(brainmob && !brainmob.key && searching == 0) - //Start the process of searching for a new user. - user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." - icon_state = "posibrain-searching" - src.searching = 1 - src.request_player() - spawn(600) reset_search() +/obj/item/device/mmi/posibrain/attack_self(mob/user as mob) + if(brainmob && !brainmob.key && searching == 0) + //Start the process of searching for a new user. + user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." + icon_state = "posibrain-searching" + src.searching = 1 + src.request_player() + spawn(600) reset_search() - proc/request_player() - for(var/mob/dead/observer/O in player_list) - if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - continue - if(jobban_isbanned(O, "pAI")) - continue - if(O.client) - if(O.client.prefs.be_special & BE_PAI) - question(O.client) +/obj/item/device/mmi/posibrain/proc/request_player() + for(var/mob/dead/observer/O in player_list) + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + continue + if(jobban_isbanned(O, "pAI")) + continue + if(O.client) + if(O.client.prefs.be_special & BE_PAI) + question(O.client) - proc/question(var/client/C) - spawn(0) - if(!C) return - var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") - if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. - if(response == "Yes") - transfer_personality(C.mob) - else if (response == "Never for this round") - C.prefs.be_special ^= BE_PAI +/obj/item/device/mmi/posibrain/proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") + if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(response == "Yes") + transfer_personality(C.mob) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_PAI - transfer_identity(var/mob/living/carbon/H) - name = "positronic brain ([H])" - brainmob.name = H.real_name - brainmob.real_name = H.real_name - brainmob.dna = H.dna - brainmob.timeofhostdeath = H.timeofdeath - brainmob.stat = 0 - if(brainmob.mind) - brainmob.mind.assigned_role = "Positronic Brain" - if(H.mind) - H.mind.transfer_to(brainmob) - brainmob << "\blue You feel slightly disoriented. That's normal when you're just a metal cube." - icon_state = "posibrain-occupied" - return +/obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) + name = "positronic brain ([H])" + brainmob.name = H.real_name + brainmob.real_name = H.real_name + brainmob.dna = H.dna + brainmob.timeofhostdeath = H.timeofdeath + brainmob.stat = 0 + if(brainmob.mind) + brainmob.mind.assigned_role = "Positronic Brain" + if(H.mind) + H.mind.transfer_to(brainmob) + brainmob << "\blue You feel slightly disoriented. That's normal when you're just a metal cube." + icon_state = "posibrain-occupied" + return - proc/transfer_personality(var/mob/candidate) +/obj/item/device/mmi/posibrain/proc/transfer_personality(var/mob/candidate) - src.searching = 0 - src.brainmob.mind = candidate.mind - //src.brainmob.key = candidate.key - src.brainmob.ckey = candidate.ckey - src.name = "positronic brain ([src.brainmob.name])" + src.searching = 0 + src.brainmob.mind = candidate.mind + src.brainmob.ckey = candidate.ckey + src.name = "positronic brain ([src.brainmob.name])" + src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." + src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." + src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + src.brainmob << "Use say :b to speak to other artificial intelligences." + src.brainmob.mind.assigned_role = "Positronic Brain" - src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." - src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." - src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." - src.brainmob << "Use say :b to speak to other artificial intelligences." - src.brainmob.mind.assigned_role = "Positronic Brain" + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain chimes quietly.") + icon_state = "posibrain-occupied" - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue The positronic brain chimes quietly.") - icon_state = "posibrain-occupied" +/obj/item/device/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. - proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. + if(src.brainmob && src.brainmob.key) return - if(src.brainmob && src.brainmob.key) return + src.searching = 0 + icon_state = "posibrain" - src.searching = 0 - icon_state = "posibrain" - - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") /obj/item/device/mmi/posibrain/examine() diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm index 2469ded956..fe21c7a6ae 100644 --- a/code/modules/mob/living/carbon/monkey/diona.dm +++ b/code/modules/mob/living/carbon/monkey/diona.dm @@ -107,11 +107,11 @@ set desc = "Turn your food into nutrients for plants." var/list/trays = list() - for(var/obj/machinery/hydroponics/tray in range(1)) + for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1)) if(tray.nutrilevel < 10) trays += tray - var/obj/machinery/hydroponics/target = input("Select a tray:") as null|anything in trays + var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays if(!src || !target || target.nutrilevel == 10) return //Sanity check. @@ -126,11 +126,11 @@ set desc = "Clean the weeds out of soil or a hydroponics tray." var/list/trays = list() - for(var/obj/machinery/hydroponics/tray in range(1)) + for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1)) if(tray.weedlevel > 0) trays += tray - var/obj/machinery/hydroponics/target = input("Select a tray:") as null|anything in trays + var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays if(!src || !target || target.weedlevel == 0) return //Sanity check. diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index d0d744b0a4..256a9e5091 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -97,6 +97,7 @@ src.modules += new /obj/item/weapon/retractor(src) src.modules += new /obj/item/weapon/cautery(src) src.modules += new /obj/item/weapon/bonegel(src) + src.modules += new /obj/item/weapon/FixOVein(src) src.modules += new /obj/item/weapon/bonesetter(src) src.modules += new /obj/item/weapon/circular_saw(src) src.modules += new /obj/item/weapon/surgicaldrill(src) diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 45ece9f6df..daa247fbbf 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -13,7 +13,7 @@ var/obj/machinery/apiary/parent pass_flags = PASSTABLE turns_per_move = 6 - var/obj/machinery/hydroponics/my_hydrotray + var/obj/machinery/portable_atmospherics/hydroponics/my_hydrotray /mob/living/simple_animal/bee/New(loc, var/obj/machinery/apiary/new_parent) ..() @@ -155,10 +155,10 @@ turns_per_move = rand(1,3) else if(feral < 0) turns_since_move = 0 - else if(!my_hydrotray || my_hydrotray.loc != src.loc || !my_hydrotray.planted || my_hydrotray.dead || !my_hydrotray.myseed) - var/obj/machinery/hydroponics/my_hydrotray = locate() in src.loc + else if(!my_hydrotray || my_hydrotray.loc != src.loc || my_hydrotray.dead || !my_hydrotray.seed) + var/obj/machinery/portable_atmospherics/hydroponics/my_hydrotray = locate() in src.loc if(my_hydrotray) - if(my_hydrotray.planted && !my_hydrotray.dead && my_hydrotray.myseed) + if(!my_hydrotray.dead && my_hydrotray.seed) turns_per_move = rand(20,50) else my_hydrotray = null diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 41bdbfe323..822d4e65fa 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -45,8 +45,8 @@ if(udder && prob(5)) udder.add_reagent("milk", rand(5, 10)) - if(locate(/obj/effect/spacevine) in loc) - var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc + if(locate(/obj/effect/plantsegment) in loc) + var/obj/effect/plantsegment/SV = locate(/obj/effect/plantsegment) in loc del(SV) if(prob(10)) say("Nom") @@ -55,7 +55,7 @@ for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) var/step = get_step(src, direction) if(step) - if(locate(/obj/effect/spacevine) in step) + if(locate(/obj/effect/plantsegment) in step) Move(step) /mob/living/simple_animal/hostile/retaliate/goat/Retaliate() @@ -65,8 +65,8 @@ /mob/living/simple_animal/hostile/retaliate/goat/Move() ..() if(!stat) - if(locate(/obj/effect/spacevine) in loc) - var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc + if(locate(/obj/effect/plantsegment) in loc) + var/obj/effect/plantsegment/SV = locate(/obj/effect/plantsegment) in loc del(SV) if(prob(10)) say("Nom") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2f92ffeffb..5a5fda48e3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -736,10 +736,15 @@ note dizziness decrements automatically in the mob's Life() proc. //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. /mob/proc/update_canmove() - if(buckled && (!buckled.movable)) + + var/is_movable + if(buckled && istype(buckled)) + is_movable = buckled.movable + + if(buckled && !is_movable) anchored = 1 canmove = 0 - if( istype(buckled,/obj/structure/stool/bed/chair) ) + if(istype(buckled,/obj/structure/stool/bed/chair) ) lying = 0 else if(istype(buckled, /obj/vehicle)) var/obj/vehicle/V = buckled @@ -749,7 +754,7 @@ note dizziness decrements automatically in the mob's Life() proc. lying = 1 else lying = 1 - else if(buckled && (buckled.movable)) + else if(buckled && is_movable) anchored = 0 canmove = 1 lying = 0 @@ -757,7 +762,6 @@ note dizziness decrements automatically in the mob's Life() proc. lying = 1 canmove = 0 else if( stunned ) -// lying = 0 canmove = 0 else if(captured) anchored = 1 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 5bfca3a02c..363f218eb6 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -298,7 +298,7 @@ datum/preferences if(CHEF) clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "chefhat"), ICON_OVERLAY) if(prob(1)) clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY) switch(backbag) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index de8f974fb9..fe4b9f26a5 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1332,7 +1332,7 @@ datum if(!M) M = holder.my_atom if(ishuman(M)) var/mob/living/carbon/human/H = M - + //Peridaxon is hard enough to get, it's probably fair to make this all internal organs for(var/datum/organ/internal/I in H.internal_organs) if(I.damage > 0) @@ -1760,7 +1760,7 @@ datum alien_weeds.healthcheck() else if(istype(O,/obj/effect/glowshroom)) //even a small amount is enough to kill it del(O) - else if(istype(O,/obj/effect/spacevine)) + else if(istype(O,/obj/effect/plantsegment)) if(prob(50)) del(O) //Kills kudzu too. // Damage that is done to growing plants is separately at code/game/machinery/hydroponics at obj/item/hydroponics diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm index d5938f3b7c..c93de6ad17 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm @@ -8,17 +8,8 @@ //Grown foods //Subclass so we can pass on values /obj/item/weapon/reagent_containers/food/snacks/grown/ - var/seed = "" - var/plantname = "" - var/productname = "" - var/species = "" - var/lifespan = 0 - var/endurance = 0 - var/maturation = 0 - var/production = 0 - var/yield = 0 + var/plantname var/potency = -1 - var/plant_type = 0 icon = 'icons/obj/harvest.dmi' New(newloc,newpotency) if (!isnull(newpotency)) @@ -27,154 +18,69 @@ src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) -/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/O as obj, var/mob/user as mob) +/obj/item/weapon/reagent_containers/food/snacks/grown/New() ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - var/msg - msg = "*---------*\n This is \a [src]\n" - switch(plant_type) - if(0) - msg += "- Plant type: Normal plant\n" - if(1) - msg += "- Plant type: Weed\n" - if(2) - msg += "- Plant type: Mushroom\n" - msg += "- Potency: [potency]\n" - msg += "- Yield: [yield]\n" - msg += "- Maturation speed: [maturation]\n" - msg += "- Production speed: [production]\n" - msg += "- Endurance: [endurance]\n" - msg += "- Healing properties: [reagents.get_reagent_amount("nutriment")]\n" - msg += "*---------*" - usr << msg - return - /*if (istype(O, /obj/item/weapon/storage/bag/plants)) - var/obj/item/weapon/plantbag/S = O - if (S.mode == 1) - for(var/obj/item/G in get_turf(src)) - if(istype(G, /obj/item/seeds) || istype(G, /obj/item/weapon/reagent_containers/food/snacks/grown)) - if (S.contents.len < S.capacity) - S.contents += G - else - user << "\blue The plant bag is full." - return - user << "\blue You pick up all the plants and seeds." - else - if (S.contents.len < S.capacity) - S.contents += src; - else - user << "\blue The plant bag is full."*/ - return + //Handle some post-spawn var stuff. + spawn(1) + // Fill the object up with the appropriate reagents. + if(!isnull(plantname)) + var/datum/seed/S = seed_types[plantname] + if(!S || !S.chems) + return -/*/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob) - if (istype(O, /obj/item/weapon/storage/bag/plants)) - var/obj/item/weapon/plantbag/S = O - if (S.mode == 1) - for(var/obj/item/G in get_turf(src)) - if(istype(G, /obj/item/seeds) || istype(G, /obj/item/weapon/reagent_containers/food/snacks/grown)) - if (S.contents.len < S.capacity) - S.contents += G - else - user << "\blue The plant bag is full." - return - user << "\blue You pick up all the plants and seeds." - else - if (S.contents.len < S.capacity) - S.contents += src; - else - user << "\blue The plant bag is full." - return*/ + potency = S.potency -/obj/item/weapon/grown/attackby(var/obj/item/O as obj, var/mob/user as mob) - ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - var/msg - msg = "*---------*\n This is \a [src]\n" - switch(plant_type) - if(0) - msg += "- Plant type: Normal plant\n" - if(1) - msg += "- Plant type: Weed\n" - if(2) - msg += "- Plant type: Mushroom\n" - msg += "- Acid strength: [potency]\n" - msg += "- Yield: [yield]\n" - msg += "- Maturation speed: [maturation]\n" - msg += "- Production speed: [production]\n" - msg += "- Endurance: [endurance]\n" - msg += "*---------*" - usr << msg - return + for(var/rid in S.chems) + var/list/reagent_data = S.chems[rid] + var/rtotal = reagent_data[1] + if(reagent_data.len > 1 && potency > 0) + rtotal += round(potency/reagent_data[2]) + reagents.add_reagent(rid,max(1,rtotal)) + + if(reagents.total_volume > 0) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/corn - seed = "/obj/item/seeds/cornseed" name = "ear of corn" desc = "Needs some butter!" + plantname = "corn" icon_state = "corn" potency = 40 filling_color = "#FFEE00" trash = /obj/item/weapon/corncob - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - /obj/item/weapon/reagent_containers/food/snacks/grown/cherries - seed = "/obj/item/seeds/cherryseed" name = "cherries" desc = "Great for toppings!" icon_state = "cherry" filling_color = "#FF0000" gender = PLURAL - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 15), 1)) - reagents.add_reagent("sugar", 1+round((potency / 15), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "cherry" /obj/item/weapon/reagent_containers/food/snacks/grown/poppy - seed = "/obj/item/seeds/poppyseed" name = "poppy" desc = "Long-used as a symbol of rest, peace, and death." icon_state = "poppy" potency = 30 filling_color = "#CC6464" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("bicaridine", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 3, 1) + plantname = "poppies" /obj/item/weapon/reagent_containers/food/snacks/grown/harebell - seed = "obj/item/seeds/harebellseed" name = "harebell" desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten’d not thy breath.\"" icon_state = "harebell" potency = 1 filling_color = "#D4B2C9" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 3, 1) + plantname = "harebells" /obj/item/weapon/reagent_containers/food/snacks/grown/potato - seed = "/obj/item/seeds/potatoseed" name = "potato" desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" icon_state = "potato" potency = 25 filling_color = "#E6E8DA" - New() - ..() - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - spawn(5) //So potency can be set in the proc that creates these crops - bitesize = reagents.total_volume + plantname = "potato" /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -190,107 +96,63 @@ return /obj/item/weapon/reagent_containers/food/snacks/grown/grapes - seed = "/obj/item/seeds/grapeseed" name = "bunch of grapes" desc = "Nutritious!" icon_state = "grapes" filling_color = "#A332AD" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("sugar", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "grapes" /obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes - seed = "/obj/item/seeds/greengrapeseed" name = "bunch of green grapes" desc = "Nutritious!" icon_state = "greengrapes" potency = 25 filling_color = "#A6FFA3" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("kelotane", 3+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "greengrapes" /obj/item/weapon/reagent_containers/food/snacks/grown/peanut - seed = "/obj/item/seeds/peanutseed" name = "peanut" desc = "Nuts!" icon_state = "peanut" filling_color = "857e27" potency = 25 - New () - ..() - spawn(5) - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "peanut" /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage - seed = "/obj/item/seeds/cabbageseed" name = "cabbage" desc = "Ewwwwwwwwww. Cabbage." icon_state = "cabbage" potency = 25 filling_color = "#A2B5A1" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = reagents.total_volume + plantname = "cabbage" /obj/item/weapon/reagent_containers/food/snacks/grown/berries - seed = "/obj/item/seeds/berryseed" name = "bunch of berries" desc = "Nutritious!" icon_state = "berrypile" filling_color = "#C2C9FF" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "berries" /obj/item/weapon/reagent_containers/food/snacks/grown/plastellium - seed = "/obj/item/seeds/plastiseed" name = "clump of plastellium" desc = "Hmm, needs some processing" icon_state = "plastellium" filling_color = "#C4C4C4" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("plasticide", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - + plantname = "plastic" /obj/item/weapon/reagent_containers/food/snacks/grown/shand - seed = "/obj/item/seeds/shandseed" name = "S'rendarr's Hand leaf" - desc = "A leaf sample from a lowland thicket shrub, often hid in by prey and predator to staunch their wounds and conceal their scent, allowing the plant to spread far on its native Ahdomai. Smells strongly like wax." + desc = "A leaf sample from a lowland thicket shrub. Smells strongly like wax." icon_state = "shand" filling_color = "#70C470" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("bicaridine", round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "shand" /obj/item/weapon/reagent_containers/food/snacks/grown/mtear - seed = "/obj/item/seeds/mtearseed" name = "sprig of Messa's Tear" - desc = "A mountain climate herb with a soft, cold blue flower, known to contain an abundance of chemicals in it's flower useful to treating burns- Bad for the allergic to pollen." + desc = "A mountain climate herb with a soft, cold blue flower, known to contain an abundance of healing chemicals." icon_state = "mtear" filling_color = "#70C470" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("honey", 1+round((potency / 10), 1)) - reagents.add_reagent("kelotane", 3+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "mtear" /obj/item/weapon/reagent_containers/food/snacks/grown/mtear/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) @@ -313,19 +175,13 @@ user << "You mash the leaves into a poultice." /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries - seed = "/obj/item/seeds/glowberryseed" name = "bunch of glow-berries" desc = "Nutritious!" var/light_on = 1 var/brightness_on = 2 //luminosity when on filling_color = "#D3FF9E" icon_state = "glowberrypile" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", round((potency / 10), 1)) - reagents.add_reagent("uranium", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "glowberries" /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Del() if(istype(loc,/mob)) @@ -341,146 +197,80 @@ src.SetLuminosity(round(potency/5,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod - seed = "/obj/item/seeds/cocoapodseed" name = "cocoa pod" - desc = "Fattening... Mmmmm... chucklate." + desc = "Can be ground into cocoa powder." icon_state = "cocoapod" potency = 50 filling_color = "#9C8E54" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("coco", 4+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "cocoa" /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane - seed = "/obj/item/seeds/sugarcaneseed" name = "sugarcane" desc = "Sickly sweet." icon_state = "sugarcane" potency = 50 filling_color = "#C0C9AD" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("sugar", 4+round((potency / 5), 1)) + plantname = "sugarcane" /obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries - seed = "/obj/item/seeds/poisonberryseed" name = "bunch of poison-berries" desc = "Taste so good, you could die!" icon_state = "poisonberrypile" gender = PLURAL potency = 15 filling_color = "#B422C7" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("toxin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "poisonberries" /obj/item/weapon/reagent_containers/food/snacks/grown/deathberries - seed = "/obj/item/seeds/deathberryseed" name = "bunch of death-berries" desc = "Taste so good, you could die!" icon_state = "deathberrypile" gender = PLURAL potency = 50 filling_color = "#4E0957" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("toxin", 3+round(potency / 3, 1)) - reagents.add_reagent("lexorin", 1+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "deathberries" /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris - seed = "/obj/item/seeds/ambrosiavulgaris" name = "ambrosia vulgaris branch" desc = "This is a plant containing various healing chemicals." icon_state = "ambrosiavulgaris" potency = 10 filling_color = "#125709" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("space_drugs", 1+round(potency / 8, 1)) - reagents.add_reagent("kelotane", 1+round(potency / 8, 1)) - reagents.add_reagent("bicaridine", 1+round(potency / 10, 1)) - reagents.add_reagent("toxin", 1+round(potency / 10, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "ambrosia" /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus - seed = "/obj/item/seeds/ambrosiadeus" name = "ambrosia deus branch" desc = "Eating this makes you feel immortal!" icon_state = "ambrosiadeus" potency = 10 filling_color = "#229E11" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("bicaridine", 1+round(potency / 8, 1)) - reagents.add_reagent("synaptizine", 1+round(potency / 8, 1)) - reagents.add_reagent("hyperzine", 1+round(potency / 10, 1)) - reagents.add_reagent("space_drugs", 1+round(potency / 10, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "ambrosiadeus" /obj/item/weapon/reagent_containers/food/snacks/grown/apple - seed = "/obj/item/seeds/appleseed" name = "apple" desc = "It's a little piece of Eden." icon_state = "apple" potency = 15 filling_color = "#DFE88B" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.maximum_volume = 20 - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = reagents.maximum_volume // Always eat the apple in one + plantname = "apple" /obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned - seed = "/obj/item/seeds/poisonedappleseed" name = "apple" desc = "It's a little piece of Eden." icon_state = "apple" potency = 15 filling_color = "#B3BD5E" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.maximum_volume = 20 - reagents.add_reagent("cyanide", 1+round((potency / 5), 1)) - bitesize = reagents.maximum_volume // Always eat the apple in one + plantname = "poisonapple" /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple - seed = "/obj/item/seeds/goldappleseed" name = "golden apple" desc = "Emblazoned upon the apple is the word 'Kallisti'." icon_state = "goldapple" potency = 15 filling_color = "#F5CB42" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("gold", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Mineral Content: [reagents.get_reagent_amount("gold")]%" - + plantname = "goldapple" /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon - seed = "/obj/item/seeds/watermelonseed" name = "watermelon" desc = "It's full of watery goodness." icon_state = "watermelon" @@ -488,25 +278,15 @@ filling_color = "#FA2863" slice_path = /obj/item/weapon/reagent_containers/food/snacks/watermelonslice slices_num = 5 - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "watermelon" /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin - seed = "/obj/item/seeds/pumpkinseed" name = "pumpkin" desc = "It's large and scary." icon_state = "pumpkin" potency = 10 filling_color = "#FAB728" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - + plantname = "pumpkin" /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -517,60 +297,38 @@ return /obj/item/weapon/reagent_containers/food/snacks/grown/lime - seed = "/obj/item/seeds/limeseed" name = "lime" desc = "It's so sour, your face will twist." icon_state = "lime" potency = 20 filling_color = "#28FA59" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "lime" /obj/item/weapon/reagent_containers/food/snacks/grown/lemon - seed = "/obj/item/seeds/lemonseed" name = "lemon" desc = "When life gives you lemons, be grateful they aren't limes." icon_state = "lemon" potency = 20 filling_color = "#FAF328" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "lemon" /obj/item/weapon/reagent_containers/food/snacks/grown/orange - seed = "/obj/item/seeds/orangeseed" name = "orange" desc = "It's an tangy fruit." icon_state = "orange" potency = 20 filling_color = "#FAAD28" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "orange" /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet - seed = "/obj/item/seeds/whitebeetseed" name = "white-beet" desc = "You can't beat white-beet." icon_state = "whitebeet" potency = 15 filling_color = "#FFFCCC" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", round((potency / 20), 1)) - reagents.add_reagent("sugar", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "whitebeet" /obj/item/weapon/reagent_containers/food/snacks/grown/banana - seed = "/obj/item/seeds/bananaseed" name = "banana" desc = "It's an excellent prop for a comedy." icon = 'icons/obj/items.dmi' @@ -578,99 +336,53 @@ item_state = "banana" filling_color = "#FCF695" trash = /obj/item/weapon/bananapeel - - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("banana", 1+round((potency / 10), 1)) - bitesize = 5 - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + plantname = "banana" /obj/item/weapon/reagent_containers/food/snacks/grown/chili - seed = "/obj/item/seeds/chiliseed" name = "chili" desc = "It's spicy! Wait... IT'S BURNING ME!!" icon_state = "chilipepper" filling_color = "#FF0000" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - reagents.add_reagent("capsaicin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/chili/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Capsaicin: [reagents.get_reagent_amount("capsaicin")]%" + plantname = "chili" /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant - seed = "/obj/item/seeds/eggplantseed" name = "eggplant" desc = "Maybe there's a chicken inside?" icon_state = "eggplant" filling_color = "#550F5C" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "eggplant" /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans - seed = "/obj/item/seeds/soyaseed" name = "soybeans" desc = "It's pretty bland, but oh the possibilities..." gender = PLURAL filling_color = "#E6E8B7" icon_state = "soybeans" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "soybean" /obj/item/weapon/reagent_containers/food/snacks/grown/tomato - seed = "/obj/item/seeds/tomatoseed" name = "tomato" desc = "I say to-mah-to, you say tom-mae-to." icon_state = "tomato" filling_color = "#FF0000" potency = 10 - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "tomato" - throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/tomato_smudge(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - del(src) - return +/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/tomato_smudge(src.loc) + src.visible_message("The [src.name] has been squashed.","You hear a smack.") + del(src) + return /obj/item/weapon/reagent_containers/food/snacks/grown/killertomato - seed = "/obj/item/seeds/killertomatoseed" name = "killer-tomato" desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!" icon_state = "killertomato" potency = 10 filling_color = "#FF0000" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - if(istype(src.loc,/mob)) - pickup(src.loc) - lifespan = 120 - endurance = 30 - maturation = 15 - production = 1 - yield = 3 potency = 30 - plant_type = 2 + plantname = "killertomato" /obj/item/weapon/reagent_containers/food/snacks/grown/killertomato/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) @@ -681,52 +393,40 @@ user << "You plant the killer-tomato." /obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato - seed = "/obj/item/seeds/bloodtomatoseed" name = "blood-tomato" desc = "So bloody...so...very...bloody....AHHHH!!!!" icon_state = "bloodtomato" potency = 10 filling_color = "#FF0000" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("blood", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "bloodtomato" - throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/blood/splatter(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - src.reagents.reaction(get_turf(hit_atom)) - for(var/atom/A in get_turf(hit_atom)) - src.reagents.reaction(A) - del(src) - return +/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/blood/splatter(src.loc) + src.visible_message("The [src.name] has been squashed.","You hear a smack.") + src.reagents.reaction(get_turf(hit_atom)) + for(var/atom/A in get_turf(hit_atom)) + src.reagents.reaction(A) + del(src) + return /obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato - seed = "/obj/item/seeds/bluetomatoseed" name = "blue-tomato" desc = "I say blue-mah-to, you say blue-mae-to." icon_state = "bluetomato" potency = 10 filling_color = "#586CFC" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("lube", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "bluetomato" - throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/blood/oil(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - src.reagents.reaction(get_turf(hit_atom)) - for(var/atom/A in get_turf(hit_atom)) - src.reagents.reaction(A) - del(src) - return +/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/blood/oil(src.loc) + src.visible_message("The [src.name] has been squashed.","You hear a smack.") + src.reagents.reaction(get_turf(hit_atom)) + for(var/atom/A in get_turf(hit_atom)) + src.reagents.reaction(A) + del(src) + return /obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/Crossed(AM as mob|obj) if (istype(AM, /mob/living/carbon)) @@ -741,191 +441,90 @@ M.Weaken(5) /obj/item/weapon/reagent_containers/food/snacks/grown/wheat - seed = "/obj/item/seeds/wheatseed" name = "wheat" desc = "Sigh... wheat... a-grain?" gender = PLURAL icon_state = "wheat" filling_color = "#F7E186" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "wheat" /obj/item/weapon/reagent_containers/food/snacks/grown/ricestalk - seed = "/obj/item/seeds/riceseed" name = "rice stalk" desc = "Rice to see you." gender = PLURAL icon_state = "rice" filling_color = "#FFF8DB" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "rice" /obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod - seed = "/obj/item/seeds/kudzuseed" name = "kudzu pod" desc = "Pueraria Virallis: An invasive species with vines that rapidly creep and wrap around whatever they contact." icon_state = "kudzupod" filling_color = "#59691B" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment",1+round((potency / 50), 1)) - reagents.add_reagent("anti_toxin",1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "kudzu" /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper - seed = "/obj/item/seeds/icepepperseed" name = "ice-pepper" desc = "It's a mutant strain of chili" icon_state = "icepepper" potency = 20 filling_color = "#66CEED" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("frostoil", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Frostoil: [reagents.get_reagent_amount("frostoil")]%" + plantname = "icechili" /obj/item/weapon/reagent_containers/food/snacks/grown/carrot - seed = "/obj/item/seeds/carrotseed" name = "carrot" desc = "It's good for the eyes!" icon_state = "carrot" potency = 10 filling_color = "#FFC400" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("imidazoline", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "carrot" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi - seed = "/obj/item/seeds/reishimycelium" name = "reishi" desc = "Ganoderma lucidum: A special fungus believed to help relieve stress." icon_state = "reishi" potency = 10 filling_color = "#FF4800" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("stoxin", 3+round(potency / 3, 1)) - reagents.add_reagent("space_drugs", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Sleep Toxin: [reagents.get_reagent_amount("stoxin")]%" - user << "- Space Drugs: [reagents.get_reagent_amount("space_drugs")]%" + plantname = "reishi" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita - seed = "/obj/item/seeds/amanitamycelium" name = "fly amanita" desc = "Amanita Muscaria: Learn poisonous mushrooms by heart. Only pick mushrooms you know." icon_state = "amanita" potency = 10 filling_color = "#FF0000" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("amatoxin", 3+round(potency / 3, 1)) - reagents.add_reagent("psilocybin", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Amatoxins: [reagents.get_reagent_amount("amatoxin")]%" - user << "- Psilocybin: [reagents.get_reagent_amount("psilocybin")]%" + plantname = "amanita" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel - seed = "/obj/item/seeds/angelmycelium" name = "destroying angel" desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amatoxins." icon_state = "angel" potency = 35 filling_color = "#FFDEDE" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("amatoxin", 13+round(potency / 3, 1)) - reagents.add_reagent("psilocybin", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Amatoxins: [reagents.get_reagent_amount("amatoxin")]%" - user << "- Psilocybin: [reagents.get_reagent_amount("psilocybin")]%" + plantname = "destroyingangel" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap - seed = "/obj/item/seeds/libertymycelium" name = "liberty-cap" desc = "Psilocybe Semilanceata: Liberate yourself!" icon_state = "libertycap" potency = 15 filling_color = "#F714BE" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("psilocybin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap/attackby(var/obj/item/O as obj, var/mob/user as mob) - . = ..() - if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Psilocybin: [reagents.get_reagent_amount("psilocybin")]%" + plantname = "libertycap" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet - seed = "/obj/item/seeds/plumpmycelium" name = "plump-helmet" desc = "Plumus Hellmus: Plump, soft and s-so inviting~" icon_state = "plumphelmet" filling_color = "#F714BE" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "plumphelmet" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom - seed = "/obj/item/seeds/walkingmushroom" name = "walking mushroom" desc = "Plumus Locomotus: The beginning of the great walk." icon_state = "walkingmushroom" filling_color = "#FFBFEF" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) - if(istype(src.loc,/mob)) - pickup(src.loc) - lifespan = 120 - endurance = 30 - maturation = 15 - production = 1 - yield = 3 potency = 30 - plant_type = 2 + plantname = "walkingmushroom" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) @@ -936,47 +535,27 @@ user << "You plant the walking mushroom." /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle - seed = "/obj/item/seeds/chantermycelium" name = "chanterelle cluster" desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!" icon_state = "chanterelle" filling_color = "#FFE991" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment",1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "mushrooms" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom - seed = "/obj/item/seeds/glowshroom" name = "glowshroom cluster" desc = "Mycena Bregprox: This species of mushroom glows in the dark. Or does it?" icon_state = "glowshroom" filling_color = "#DAFF91" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("radium",1+round((potency / 20), 1)) - if(istype(src.loc,/mob)) - pickup(src.loc) - else - src.SetLuminosity(round(potency/10,1)) - lifespan = 120 //ten times that is the delay - endurance = 30 - maturation = 15 - production = 1 - yield = 3 potency = 30 - plant_type = 2 + plantname = "glowshroom" /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) return var/obj/effect/glowshroom/planted = new /obj/effect/glowshroom(user.loc) - planted.delay = lifespan * 50 - planted.endurance = endurance - planted.yield = yield + planted.delay = 50 + planted.endurance = 100 planted.potency = potency del(src) @@ -1001,109 +580,61 @@ // Putting these at the bottom so they don't clutter the list up. -Cheridan // ************************************* -/* -//This object is just a transition object. All it does is make a grass tile and delete itself. -/obj/item/weapon/reagent_containers/food/snacks/grown/grass - seed = "/obj/item/seeds/grassseed" - name = "grass" - desc = "Green and lush." - icon_state = "spawner" - potency = 20 - New() - new/obj/item/stack/tile/grass(src.loc) - spawn(5) //Workaround to keep harvesting from working weirdly. - del(src) -*/ - -//This object is just a transition object. All it does is make dosh and delete itself. -Cheridan -/obj/item/weapon/reagent_containers/food/snacks/grown/money - seed = "/obj/item/seeds/cashseed" - name = "dosh" - desc = "Green and lush." - icon_state = "spawner" - potency = 10 - New() - switch(rand(1,100))//(potency) //It wants to use the default potency instead of the new, so it was always 10. Will try to come back to this later - Cheridan - if(0 to 10) - new/obj/item/weapon/spacecash/(src.loc) - if(11 to 20) - new/obj/item/weapon/spacecash/c10(src.loc) - if(21 to 30) - new/obj/item/weapon/spacecash/c20(src.loc) - if(31 to 40) - new/obj/item/weapon/spacecash/c50(src.loc) - if(41 to 50) - new/obj/item/weapon/spacecash/c100(src.loc) - if(51 to 60) - new/obj/item/weapon/spacecash/c200(src.loc) - if(61 to 80) - new/obj/item/weapon/spacecash/c500(src.loc) - else - new/obj/item/weapon/spacecash/c1000(src.loc) - spawn(5) //Workaround to keep harvesting from working weirdly. - del(src) - /obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato - seed = "/obj/item/seeds/bluespacetomatoseed" name = "blue-space tomato" desc = "So lubricated, you might slip through space-time." icon_state = "bluespacetomato" potency = 20 origin_tech = "bluespace=3" filling_color = "#91F8FF" - New() - ..() - spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("singulo", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + plantname = "bluespacetomato" - throw_impact(atom/hit_atom) - ..() - var/mob/M = usr - var/outer_teleport_radius = potency/10 //Plant potency determines radius of teleport. - var/inner_teleport_radius = potency/15 - var/list/turfs = new/list() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats. - new/obj/effect/decal/cleanable/blood/oil(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") - del(src) - return - for(var/turf/T in orange(M,outer_teleport_radius)) - if(T in orange(M,inner_teleport_radius)) continue - if(istype(T,/turf/space)) continue - if(T.density) continue - if(T.x>world.maxx-outer_teleport_radius || T.xworld.maxy-outer_teleport_radius || T.yThe [src.name] has been squashed, causing a distortion in space-time.","You hear a splat and a crackle.") + src.visible_message("The [src.name] has been squashed.","You hear a smack.") del(src) return + for(var/turf/T in orange(M,outer_teleport_radius)) + if(T in orange(M,inner_teleport_radius)) continue + if(istype(T,/turf/space)) continue + if(T.density) continue + if(T.x>world.maxx-outer_teleport_radius || T.xworld.maxy-outer_teleport_radius || T.yThe [src.name] has been squashed, causing a distortion in space-time.","You hear a splat and a crackle.") + del(src) + return diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 8984706099..020573d8c5 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -40,7 +40,7 @@ /obj/machinery/sleeper, /obj/machinery/smartfridge/, /obj/machinery/biogenerator, - /obj/machinery/hydroponics, + /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/constructable_frame) New() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 741a5493d9..fbc5b78f88 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -242,7 +242,7 @@ /obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(!proximity) return - if (istype(A, /obj/machinery/hydroponics)) // We are targeting hydrotray + if (istype(A, /obj/machinery/portable_atmospherics/hydroponics)) // We are targeting hydrotray return if (istype(A, /obj/effect/blob)) // blob damage in blob code diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm index 8496869c85..d9212ac5b0 100644 --- a/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm +++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm @@ -1,21 +1,3 @@ - -/obj/item/seeds/telriis - name = "pack of telriis seeds" - desc = "These seeds grow into telriis grass. Not recommended for consumption by sentient species." - icon_state = "seed-alien1" - mypath = "/obj/item/seeds/telriis" - species = "telriis" - plantname = "Telriis grass" - productname = "/obj/item/weapon/telriis_clump" - lifespan = 50 //number of ticks - endurance = 50 // - maturation = 5 //ticks to full growth stage - production = 5 //ticks till ready to harvest - yield = 4 //number produced when harvest - potency = 5 - plant_type = 1 //1=weed, 2=shroom, 0=normal - growthstages = 4 - /obj/item/weapon/reagent_containers/food/snacks/grown/telriis_clump name = "telriis grass" desc = "A clump of telriis grass, not recommended for consumption by sentients." @@ -27,24 +9,6 @@ reagents.add_reagent("nutriment", potency) bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/seeds/thaadra - name = "pack of thaa'dra seeds" - desc = "These seeds grow into Thaa'dra lichen. Likes the cold." - icon_state = "seed-alien3" - mypath = "/obj/item/seeds/thaadra" - species = "thaadra" - plantname = "Thaa'dra lichen" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/thaadra" - lifespan = 20 - endurance = 10 - maturation = 5 - production = 9 - yield = 2 - potency = 5 - plant_type = 2 - growthstages = 4 - /obj/item/weapon/reagent_containers/food/snacks/grown/thaadrabloom name = "thaa'dra bloom" desc = "Looks chewy, might be good to eat." @@ -56,23 +20,6 @@ reagents.add_reagent("nutriment", potency) bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/seeds/jurlmah - name = "pack of jurl'mah seeds" - desc = "These seeds grow into jurl'mah reeds, which produce large syrupy pods." - icon_state = "seed-alien3" - mypath = "/obj/item/seeds/jurlmah" - species = "jurlmah" - plantname = "jurl'mah reeds" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/jurlmah" - lifespan = 20 - endurance = 12 - maturation = 8 - production = 9 - yield = 3 - potency = 10 - growthstages = 5 - /obj/item/weapon/reagent_containers/food/snacks/grown/jurlmah name = "jurl'mah pod" desc = "Bulbous and veiny, it appears to pulse slightly as you look at it." @@ -84,23 +31,6 @@ reagents.add_reagent("nutriment", potency) bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/seeds/amauri - name = "pack of amauri seeds" - desc = "Grows into a straight, dark plant with small round fruit." - icon_state = "seed-alien3" - mypath = "/obj/item/seeds/amauri" - species = "amauri" - plantname = "amauri plant" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/amauri" - lifespan = 30 - endurance = 10 - maturation = 8 - production = 9 - yield = 4 - potency = 10 - growthstages = 3 - /obj/item/weapon/reagent_containers/food/snacks/grown/amauri name = "amauri fruit" desc = "It is small, round and hard. Its skin is a thick dark purple." @@ -113,23 +43,6 @@ reagents.add_reagent("nutriment", potency) bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/seeds/gelthi - name = "pack of gelthi seeds" - desc = "Grows into a bright, wavy plant with many small fruits." - icon_state = "seed-alien2" - mypath = "/obj/item/seeds/gelthi" - species = "gelthi" - plantname = "gelthi plant" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/gelthi" - lifespan = 20 - endurance = 15 - maturation = 6 - production = 6 - yield = 2 - potency = 1 - growthstages = 3 - /obj/item/weapon/reagent_containers/food/snacks/grown/gelthi name = "gelthi berries" desc = "They feel fluffy and slightly warm to the touch." @@ -143,23 +56,6 @@ reagents.add_reagent("nutriment", potency) bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/seeds/vale - name = "pack of vale seeds" - desc = "The vale bush is often depicted in ancient heiroglyphs and is similar to cherry blossoms." - icon_state = "seed-alien2" - mypath = "/obj/item/seeds/vale" - species = "vale" - plantname = "vale bush" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/vale" - lifespan = 25 - endurance = 15 - maturation = 8 - production = 10 - yield = 3 - potency = 3 - growthstages = 4 - /obj/item/weapon/reagent_containers/food/snacks/grown/vale name = "vale leaves" desc = "Small, curly leaves covered in a soft pale fur." @@ -172,23 +68,6 @@ reagents.add_reagent("nutriment", potency) bitesize = 1+round(reagents.total_volume / 2, 1) - -/obj/item/seeds/surik - name = "pack of surik seeds" - desc = "A spiky blue vine with large fruit resembling pig ears." - icon_state = "seed-alien3" - mypath = "/obj/item/seeds/surik" - species = "surik" - plantname = "surik vine" - productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/surik" - lifespan = 30 - endurance = 18 - maturation = 7 - production = 7 - yield = 3 - potency = 3 - growthstages = 4 - /obj/item/weapon/reagent_containers/food/snacks/grown/surik name = "surik fruit" desc = "Multiple layers of blue skin peeling away to reveal a spongey core, vaguely resembling an ear." @@ -199,4 +78,4 @@ reagents.add_reagent("impedrezene", potency * 3) reagents.add_reagent("synaptizine", potency * 2) reagents.add_reagent("nutriment", potency) - bitesize = 1+round(reagents.total_volume / 2, 1) + bitesize = 1+round(reagents.total_volume / 2, 1) \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_seeds.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_seeds.dm new file mode 100644 index 0000000000..5597d27532 --- /dev/null +++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_seeds.dm @@ -0,0 +1,139 @@ +/datum/seed/telriis + + name = "telriis" + seed_name = "telriis" + display_name = "telriis grass" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/telriis_clump) + packet_icon = "seed-alien1" + plant_icon = "telriis" + + lifespan = 50 + endurance = 50 + maturation = 5 + production = 5 + yield = 4 + potency = 5 + growth_stages = 4 + +/datum/seed/thaadra + + name = "thaadra" + seed_name = "thaa'dra" + display_name = "thaa'dra lichen" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/thaadrabloom) + packet_icon = "seed-alien3" + plant_icon = "thaadra" + + lifespan = 20 + endurance = 10 + maturation = 5 + production = 9 + yield = 2 + potency = 5 + growth_stages = 4 + +/datum/seed/jurlmah + + name = "jurlmah" + seed_name = "jurl'mah" + display_name = "jurl'mah reeds" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/jurlmah) + packet_icon = "seed-alien3" + plant_icon = "jurlmah" + + lifespan = 20 + endurance = 12 + maturation = 8 + production = 9 + yield = 3 + potency = 10 + growth_stages = 5 + +/datum/seed/amauri + + name = "amauri" + seed_name = "amauri" + display_name = "amauri plant" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/amauri) + packet_icon = "seed-alien3" + plant_icon = "amauri" + + lifespan = 30 + endurance = 10 + maturation = 8 + production = 9 + yield = 4 + potency = 10 + growth_stages = 3 + +/datum/seed/gelthi + + name = "gelthi" + seed_name = "gelthi" + display_name = "gelthi plant" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/gelthi) + packet_icon = "seed-alien2" + plant_icon = "gelthi" + + lifespan = 20 + endurance = 15 + maturation = 6 + production = 6 + yield = 2 + potency = 1 + growth_stages = 3 + +/datum/seed/vale + + name = "vale" + seed_name = "vale" + display_name = "vale bush" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/vale) + packet_icon = "seed-alien2" + plant_icon = "vale" + + lifespan = 25 + endurance = 15 + maturation = 8 + production = 10 + yield = 3 + potency = 3 + growth_stages = 4 + +/datum/seed/surik + + name = "surik" + seed_name = "surik" + display_name = "surik vine" + products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/surik) + packet_icon = "seed-alien3" + plant_icon = "surik" + + lifespan = 30 + endurance = 18 + maturation = 7 + production = 7 + yield = 3 + potency = 3 + growth_stages = 4 + +/obj/item/seeds/jurlmah + seed_type = "jurlmah" + +/obj/item/seeds/amauri + seed_type = "amauri" + +/obj/item/seeds/gelthi + seed_type = "gelthi" + +/obj/item/seeds/vale + seed_type = "vale" + +/obj/item/seeds/surik + seed_type = "surik" + +/obj/item/seeds/telriis + seed_type = "telriis" + +/obj/item/seeds/thaadra + seed_type = "thaadra" \ No newline at end of file diff --git a/code/setup.dm b/code/setup.dm index fdf55a5838..69b49d1382 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -486,7 +486,7 @@ var/list/liftable_structures = list(\ /obj/machinery/autolathe, \ /obj/machinery/constructable_frame, \ - /obj/machinery/hydroponics, \ + /obj/machinery/portable_atmospherics/hydroponics, \ /obj/machinery/computer, \ /obj/machinery/optable, \ /obj/structure/dispenser, \ diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi index 5459ad4cb2..a0d31db14c 100644 Binary files a/icons/obj/hydroponics.dmi and b/icons/obj/hydroponics.dmi differ diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index 5b7f2d1024..e9bac6160d 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -1112,7 +1112,7 @@ "avt" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry) "avu" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry) "avv" = (/obj/structure/flora/ausbushes/sparsegrass,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) -"avw" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics/garden) +"avw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics/garden) "avx" = (/obj/structure/flora/bush,/turf/simulated/floor/grass,/area/hydroponics/garden) "avy" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics/garden) "avz" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/secondary/entry) @@ -1199,7 +1199,7 @@ "axc" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry) "axd" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/wood,/area/library) "axe" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/turf/simulated/floor,/area/storage/tools) -"axf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/hydroponics,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"axf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "axg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "axh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; icon_state = "map_vent_out"; on = 1},/obj/structure/table,/obj/item/weapon/cable_coil/random,/obj/item/weapon/cable_coil/random,/turf/simulated/floor,/area/storage/art) "axi" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) @@ -1221,7 +1221,7 @@ "axy" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/hallway/primary/central) "axz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHW"; location = "Lockers"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/primary/port) "axA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."; dir = 4; icon_state = "plaque"; name = "Comemmorative Plaque"; nitrogen = 30; oxygen = 70; temperature = 80},/area/hallway/secondary/entry) -"axB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"axB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "axC" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/simulated/floor,/area/crew_quarters/sleep) "axD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "axE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor,/area/crew_quarters/sleep) @@ -1273,8 +1273,8 @@ "ayy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera{c_tag = "EVA South"; dir = 1},/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/ai_monitored/storage/eva) "ayz" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "ayA" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) -"ayB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hydroponics,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"ayC" = (/obj/machinery/hydroponics,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"ayB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"ayC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "ayD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/sleep) "ayE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor,/area/crew_quarters/sleep) "ayF" = (/obj/structure/stool{pixel_y = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep) @@ -1293,11 +1293,11 @@ "ayS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "ayT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) "ayU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry) -"ayV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "map_vent_out"; on = 1},/obj/machinery/hydroponics,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"ayV" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "ayW" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry) "ayX" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry) "ayY" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry) -"ayZ" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"ayZ" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aza" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "azb" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) "azc" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) @@ -1790,7 +1790,7 @@ "aIv" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/sleep/bedrooms) "aIw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/sleep) "aIx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aIy" = (/obj/machinery/hydroponics,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aIy" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aIz" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/simulated/floor,/area/hallway/primary/central) "aIA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/wall,/area/crew_quarters/sleep/bedrooms) "aIB" = (/obj/machinery/atmospherics/unary/vent_pump{icon_state = "map_vent_out"; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) @@ -1819,7 +1819,7 @@ "aIY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aIZ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2},/obj/machinery/vending/boozeomat,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aJa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/fore) -"aJb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/hydroponics,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aJb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "map_vent_out"; on = 1},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aJc" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access_txt = "0"; req_one_access_txt = "12;25;28"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/bar) "aJd" = (/turf/simulated/wall,/area/crew_quarters/kitchen) "aJe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -2002,7 +2002,7 @@ "aMz" = (/obj/machinery/atmospherics/unary/vent_pump{icon_state = "map_vent_out"; on = 1},/turf/simulated/floor,/area/hallway/primary/starboard) "aMA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; icon_state = "map_vent_out"; on = 1},/turf/simulated/floor,/area/hallway/secondary/exit) "aMB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/crew_quarters/fitness) -"aMC" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_outer"; locked = 1; name = "Escape Airlock"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aMC" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aMD" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plating,/area/maintenance/port) "aME" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/crew_quarters/fitness) "aMF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "0"; req_one_access_txt = "13"},/turf/simulated/floor,/area/hallway/secondary/exit) @@ -2063,7 +2063,7 @@ "aNI" = (/obj/machinery/light/small{dir = 8},/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/sleep/bedrooms) "aNJ" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aNK" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) -"aNL" = (/obj/machinery/light/small{dir = 1},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_south_airlock"; master_tag = "escape_dock"; pixel_y = -30; req_one_access_txt = "13"; tag_airpump = "escape_dock_south_pump"; tag_chamber_sensor = "escape_dock_south_sensor"; tag_exterior_door = "escape_dock_south_outer"; tag_interior_door = "escape_dock_south_inner"; tag_mech_sensor = "escape_dock_south_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_south_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aNL" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_outer"; locked = 1; name = "Escape Airlock"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aNM" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aNN" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/exit) "aNO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "map_vent_out"; on = 1},/turf/simulated/floor,/area/hydroponics/garden) @@ -2129,9 +2129,9 @@ "aOW" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/sleep/sec) "aOX" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "aOY" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) -"aOZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Escape Airlock"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aOZ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_south_airlock"; master_tag = "escape_dock"; pixel_y = -30; req_one_access_txt = "13"; tag_airpump = "escape_dock_south_pump"; tag_chamber_sensor = "escape_dock_south_sensor"; tag_exterior_door = "escape_dock_south_outer"; tag_interior_door = "escape_dock_south_inner"; tag_mech_sensor = "escape_dock_south_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_south_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aPa" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aPb" = (/obj/machinery/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aPb" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Escape Airlock"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aPc" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aPd" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aPe" = (/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access_txt = "13"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"; tag_mech_sensor = "escape_dock_north_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_north_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) @@ -3713,7 +3713,7 @@ "btu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engine/break_room) "btv" = (/turf/simulated/wall/r_wall,/area/teleporter) "btw" = (/obj/item/clothing/mask/cigarette,/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"btx" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"btx" = (/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "bty" = (/turf/simulated/wall,/area/rnd/test_area) "btz" = (/obj/structure/bookcase,/turf/simulated/floor{icon_state = "bcarpet06"},/area/medical/psych) "btA" = (/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = null; req_access_txt = "64"},/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor{icon_state = "bcarpet04"},/area/medical/psych) @@ -4000,7 +4000,7 @@ "byV" = (/turf/simulated/wall,/area/maintenance/asmaint2) "byW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor,/area/hallway/primary/central) "byX" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"byY" = (/obj/machinery/hydroponics,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"byY" = (/obj/machinery/botany/extractor,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "byZ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/holosign/surgery,/obj/machinery/door/airlock/glass_medical{id_tag = "Surgery"; name = "Pre-Op Prep Room"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgeryprep) "bza" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor,/area/hallway/primary/central) "bzb" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/holosign/surgery,/obj/machinery/door/airlock/glass_medical{id_tag = "Surgery"; name = "Pre-Op Prep Room"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgeryprep) @@ -4083,12 +4083,12 @@ "bAA" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/hor) "bAB" = (/obj/structure/lamarr,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor) "bAC" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor) -"bAD" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"bAD" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/box/botanydisk,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "bAE" = (/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bAF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bAG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "map_vent_out"; on = 1},/turf/simulated/floor,/area/rnd/storage) "bAH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) -"bAI" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"bAI" = (/obj/machinery/botany/editor,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "bAJ" = (/obj/structure/closet/secure_closet/hydroponics{req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) "bAK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bAL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -6982,7 +6982,7 @@ "cEn" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "cEo" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "cEp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "map_vent_out"; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cEq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"cEq" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cEr" = (/obj/machinery/door/airlock/research{name = "Xenoflora Research"; req_access_txt = "47"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cEs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cEt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) @@ -6993,8 +6993,8 @@ "cEy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/virologyaccess) "cEz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cEA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"cEB" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cEC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"cEB" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"cEC" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cED" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "cEE" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{dir = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) "cEF" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/wood,/area/syndicate_mothership) @@ -7010,9 +7010,9 @@ "cEP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cEQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "cER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cES" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"cES" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cET" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) -"cEU" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"cEU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cEV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction) "cEW" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "cEX" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) @@ -8444,10 +8444,10 @@ "dgt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) "dgu" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space,/area) "dgv" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) -"dgw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) +"dgw" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "dgx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) "dgy" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) -"dgz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"dgz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) "dgA" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda{pixel_x = 2; pixel_y = 6},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "dgB" = (/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) "dgC" = (/obj/machinery/washing_machine,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) @@ -8466,7 +8466,7 @@ "dgP" = (/obj/machinery/door/window/northright{name = "Xenoflora Containment"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "dgQ" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "dgR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_storage) -"dgS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora) +"dgS" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "dgT" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/rnd/xenobiology/xenoflora) "dgU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "dgV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora) @@ -8520,9 +8520,9 @@ "dhR" = (/obj/structure/closet/wardrobe/black,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "dhS" = (/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "dhT" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"dhU" = (/obj/machinery/hydroponics,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) +"dhU" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "dhV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"dhW" = (/obj/machinery/light,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) +"dhW" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "dhX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "dhY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "dhZ" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/medical/virologyaccess) @@ -8565,7 +8565,7 @@ "diK" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/obj/item/weapon/inflatable_duck,/turf/unsimulated/floor{tag = "icon-siding4"; name = "plating"; icon_state = "siding4"},/area/centcom/holding) "diL" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor,/area/tcommsat/entrance) "diM" = (/obj/item/weapon/inflatable_duck,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) -"diN" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_shuttle_hatch"; pixel_y = 19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"diN" = (/obj/structure/stool,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "diO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_dock_airlock"; locked = 1; name = "Arrivals Airlock"; req_access_txt = "13"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/evac) "diP" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom) "diQ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) @@ -9083,7 +9083,7 @@ "dsI" = (/obj/structure/table,/obj/item/weapon/storage/box/solution_trays,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/sample) "dsJ" = (/obj/machinery/door/window/westleft{dir = 1; name = "Sample Preparation Loading"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/research_outpost/sample) "dsK" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/research_outpost/sample) -"dsL" = (/obj/machinery/hydroponics/soil,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/research_outpost/maintstore1) +"dsL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora) "dsM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "dsN" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "dsO" = (/obj/structure/sink{pixel_y = 30},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{icon_state = "showroomfloor"},/area/research_outpost/hallway) @@ -9563,7 +9563,7 @@ "dBU" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso3) "dBV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway) "dBW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway) -"dBX" = (/obj/machinery/hydroponics,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) +"dBX" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "dBY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/examroom{desc = "A guidance sign which reads 'ISOLATION ROOM TWO'"; name = "\improper ISOLATION ROOM TWO"; pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway) "dBZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway) "dCa" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) @@ -9606,7 +9606,7 @@ "dCL" = (/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/camera{c_tag = "Research Outpost Exotic Particles Lab"; dir = 4; network = list("Research","SS13")},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting) "dCM" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/research_outpost/harvesting) "dCN" = (/obj/machinery/artifact_scanpad,/obj/machinery/light/small,/turf/simulated/floor/bluegrid,/area/research_outpost/harvesting) -"dCO" = (/obj/machinery/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/mine/abandoned) +"dCO" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "dCP" = (/obj/structure/table,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "dCQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/abandoned) "dCR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/mine/abandoned) @@ -9629,7 +9629,7 @@ "dDi" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/circular_saw{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "dDj" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "dDk" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1) -"dDl" = (/obj/machinery/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/grass,/area/research_outpost/maintstore1) +"dDl" = (/obj/machinery/light,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "dDm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage) "dDn" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 0; req_access = null; req_access_txt = "150"},/obj/item/clothing/gloves/white,/obj/item/weapon/storage/box/syringes,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) "dDo" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/research_outpost/maint) @@ -9697,7 +9697,7 @@ "dEy" = (/obj/structure/table,/obj/item/stack/medical/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "dEz" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/engine,/area/tcommsat/computer) "dEA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1) -"dEB" = (/obj/machinery/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/grass,/area/research_outpost/maintstore1) +"dEB" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "dEC" = (/turf/simulated/floor,/area/research_outpost/gearstore) "dED" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/research_outpost/gearstore) "dEE" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) @@ -10968,7 +10968,13 @@ "ecV" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engine/engine_room) "ecW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door_control{id = "engine_maintenance"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engine/engine_waste) "ecX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engine/engine_room) -"ecY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_shuttle_hatch"; pixel_y = -19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"ecY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_shuttle_hatch"; pixel_y = 19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"ecZ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_shuttle_hatch"; pixel_y = -19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"eda" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/mine/abandoned) +"edb" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "dark"},/area/mine/abandoned) +"edc" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/grass,/area/research_outpost/maintstore1) +"edd" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/research_outpost/maintstore1) +"ede" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/grass,/area/research_outpost/maintstore1) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11083,7 +11089,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDiaEBaECaEDaDcaEEaDcaEEaDcaEEaDcaEEaDcaEFaEGazSayWaEHaAKbbhblyaEKaELaEMaENaAKbjZbkiaAcaEQaAcaERaqYaAPaESaDBaDzaDzaDzaDzaDzaDzbboaWjaWgaVJaVIaWMaWNaWKaWLaWJaAkaafaygaWIaWpblGaWxaWqaWsblEaWpaZdaZcaxraFnaypazlaFmaBdazoazpaBdaDOaTuaypaDQaVHaWTaFsaFtaXcbdZagjagjagjagjaVEaVFaWSaVxaVybazaVxaXfaVxaXeaVxaXgaXhbbCaFHbcKaBoaXjaXmaXXaXVaXVaXCaYcaXYaXYaXYaXYaXYbaCaXYaXYaYwaYeaXnaRdaRdaYGaYxblNaWPaWQaWQaWQaWRaEsaEsaGeaEsaGfaGgaGhaEsaEuaWUaEuaGjaXlaXkbbBaGnaGoaIbasHaGraGsaGtaGuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXoaDcaDcaBJaDcaEEaDcaEEaGxaEEaDcaEEaDcaEFaEGazSayWaGyatHatHblVaYKaYPaYKaQlaQlaYJaYNaYOaYLaYMaYLaYLbakbajbdxaGLaGLaGLaGMaGLaGLaGNaGOaARaaaaZXaAkayJbmqayJaAkaAkaaaaygavOaylbmjaZIaZiaZqaZDaZEaZhbglaxraHbaypaFoaCuaAraypaAsaAraCwaZgaypaHdawGaYhaHfaHgaUnaYfalNalNalNalNalNaHjaYbazBbdcaAxazBaHmazBaHnazBaHobcvbcwbcNbczbdNbcXaYUbdlbdmbbvbdAbbwbbvbbvbbxbbzbbybbAbbybbybbybbibcubcbbawbawbawbmxbaSbawbaxbawbaWaYIaHOaHPaHQaHRaHSaHTaEsaHUbaXaEuaHWaHXbdOaHZaGnaIaaIbasHaIcaEyaEyaEyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDiaIdaECaEDaDcaEEaDcaEEaDcaEEaDcaEEaDcaEFaEGazSaCnawzawyawxawuawuawuawzawCawDawzawAaImaInawBauKauKaAPaGOaIpaCaaIqaBOaGOaIraIsaItaIuasSaaaawaaaaavMavNavMaaaaafaaaasSavOaylaAZaBKavZaBLaBcaylaAtaAJaxrachaypazlaIFaIGazoaIHayyazraIKaILaIMawGaBeaIOaIPaAqaBhaISaaaaaaaUnaIUaIVaBsazBaIXaAxaAxaAxaCEaAxaAxaAxauOaBoaKyaBoaBoavJaBoaJcaBoaJdavHavGaJgaJhaJiaJjaJkavFaJjaJjaJjaJjaJjavDaJjaJjaJjaJjaJjaJjaJjaJjasIayRayvaAzaAiaBraBpazHbMsazIavpavlavmavnazFayNayPazDaAXasHaIbaJDaJEaJFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJHaJIaBIaDbaDcaDcaDcaJJaDcaDcaJKaDcaDcaDiaJLaJMayWaxTaJNaJOaJOaJOaJOaJOaJOaJOaJPasDatHaPRarOaPRaPRaAPaJSaJTaJUaJVaJVaJVaJVaJWaJXazEasSaASavaaKbaKcavbaKeaKbaKbaKfasSavcaylaylazJaAbaAaayLawGaUnazGaxraxraxraxraKlaKmaCxaCxaKnayHawGawGaxraxrazqaIOaIOaIOaKpaKqaKraKsaUnaKtaIVaKuazBazBazBazBazBazBazBazBazBauOaKwayKaKxaIZauMavIaKBaKCaJdauyauWauXaznaKHaJjayOayQayZayCaIyaPbayVaxDaxJayaayBaxBaJbaxfaDqaJjauwauvaysaJraxdaxaaJuayqaEsaxNauuaLdavfauoaveaunaEuaEyaLhasHaIbaLiaLjaLkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJHaJIaBIaDbaDcaDcaDcaJJaDcaDcaJKaDcaDcaDiaJLaJMayWaxTaJNaJOaJOaJOaJOaJOaJOaJOaJPasDatHaPRarOaPRaPRaAPaJSaJTaJUaJVaJVaJVaJVaJWaJXazEasSaASavaaKbaKcavbaKeaKbaKbaKfasSavcaylaylazJaAbaAaayLawGaUnazGaxraxraxraxraKlaKmaCxaCxaKnayHawGawGaxraxrazqaIOaIOaIOaKpaKqaKraKsaUnaKtaIVaKuazBazBazBazBazBazBazBazBazBauOaKwayKaKxaIZauMavIaKBaKCaJdauyauWauXaznaKHaJjayOayQaMCayVayZaIyaJbaxDaxJayaayCayBaxBaxfaDqaJjauwauvaysaJraxdaxaaJuayqaEsaxNauuaLdavfauoaveaunaEuaEyaLhasHaIbaLiaLjaLkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJHaBIaBJaBIaBIaDRaDSaBIaBIaBJaJIaLmasSaLnaxTawXaLoaLoaLpaLoaLqatHaLraLsasDaLtaLuaACaFGazwaLyaLzaLAaLzaLzaLzaLzaLzaLzaLzaLBaLCazNaAdaLFaLFayTaETaLFaLFaLFaLIazKaFraLKaLzaxtaNmaLOaLPaIOaGmaIOaLSaIzaFIaLTaLTaLTaLTaLTaLTaOraLVaOAaLXaLYaLZaMaaMbaMcaIOaIOaIOaOBaMeaMfaMeaMgaMhaLSaMjaIzaMkaEgaBoaMlaxMaOOaMoaMnaMpaxKaMraMsaMtaJdaxLaMvaMwaMwaMxaJjaDJaFTaEJaEJaEJaEJaEJaFqaBaaEOaEUaExaEJaEJaHMaJjasIarZaHPaHPaCXaDFaHPaHPaEsaMOaEpaEuaytaMRaHZavTaEuaEhaymayeaIbaEyaEyaEyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXarBaMVaAFaAFaAFaAFaMWarBawXaAHasSaCFaMXaMYaDKavSaNbaNbaNcatHaNdaLsaxAaNfaLuaxzaNhaNiaNjaNkaNlaLzaLzaLzaLzaLzaLzaLzaCDaxiaxuaLzaLzaLzaxpayuaLzaLzaLzaLzaxvaLzaLzaLzaxtaNmaLuaLPaIOaIOaIOaIOaIOaIOaIOaIOaIOaIOaIOaIOaNsaNtaNuaNvaNwaNxaNyaNzaNAaIOaIOaIOaLPaIOaIOaIOaIOaIOaIOaIOaIOaNBbNwaCjaCWaCQaMpaNEaMpaMpawEaNGaMsaCoaJdawFawJawSaCraNMaJjaDraDHaCpaCpaCpaCpaCpaCqaCTaDlaDmaCpaCpaCzaNRaJjasIarZaNVaHPaHPaNWaHPaNXaEsaEuaEuaEuaEuaEuaEuavQaEuaIbaIbasHaIbaNZaOaaEyaaaaafaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafazQasSaMYavtazSaObaOcaOdaOeazSavtaOfaOgasSatlaxTaMYaOhaOiaNbaNbaNcatHaOjaLsasDaNfaLuasXaLAaLzaLzaRyaChaEzaRCaLzausaOmardaOmaALatmarMaOmaOvaOwatzathauaatkatjatiatcatbatbasYaVdaNmaLuaLPaIOaOHaIOaOIaOIaOIaOIaOIaOIaOIaOIaOJaOKaOIaOIaOIaOIaOLaOIaOIaOIaOIaOIaOMaONaOIaOIaOIaOIaOIaOIaOIaIOaIOaIOaBoaAYasOaOQaOQaOQasCasQaNGaMsaBQaJdaJdaJdaJdaJdaOUaJjatsatraSgaTAaTzaUSatQatEaCKatyatCasUasNasNasWaJjasIarZaPfaPfaPgaPhaPiaPiaPjaEsaPkaPlaPmaEyaskaVbasbaIbaIbasHaIbaEyaPsaEyaPtaPtaPtaPuaPvaPwaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11096,7 +11102,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaUQaURaQjaPpaYoaBgaQAaYqaYraYraYraYraQCaYtaTSaYuaYvaOlaCSaYyaYyaYyaYzaYyaOsaRnaTWaUKaWZaWZaPDaSGaFOaFPaFEaFDaFJaFFaFAaIgaFCaFBaFLaFKaFMaYSaYSaYSaYTaUnaOVaIOaYVaORaOFaYYaYZaZaaPWaPnaHiaTBaZfaPWaPWaPWaPWaPWaPWaPWaPWaPWaOxaXwaZkaZlaPWaZaaYZaZmaGTaYWaZoaIOaIOaThaQoaRDaQoaQoaQoaFHaQoaQoaFUaQoaZraZraZraZraZsaZtaKAaRXaRXaRXaRjaZwaZxasfaUTaUVaVhaRvavyaKTavwaVjasfaFWaBDaZFaZGaPgaPgaPgaPgaPgaPgaPgaPgaFVawKaIbaPoaPraSoaPoaPraIbasHawKaYjaSsaSsaZJaKQaSsbusaYmaafaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaZLaZMaWGaKRaZNaBWaZPaZQaZRaZSaZTaYraZUaZVaTSaZWbaEaOlaCSaZYaZZbaaaCLaYybacbadbaeaPEbafbagbahaOnaPEaCRaBtbalbalbalbalaHubalbalbanbaobaobaobapbaobaqaUnaHkaHlaHLawGawGawGbaAbaAbaAbayaFQbaybaAbaBbaBbaBbaBbaBbaBbaBbaBbaBaCVbaDbbubaDaPWaPWaPWawGawGawGaZoaIOaIOaUnbaFbaGaBlbaJaQobaIaQobaJaJnbaLaZrbaMbhWbaOaJdaJdaJdbaPbaQbaQbaQaJdaJdasfaLNaLeaLeaLLavyaKTaKTaKVasfaBEaBDbaYaEsbaZbbabbbaWmaIebbabbdaWmaIhaEyaIBaQMaQNbbgaQMaQNaIbaIDaEyaDkbbjbbkaSsaKQbblbbmaYmaafaLRaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaJoaxRbbnaIQaGwaBgbbpbbpaICaAMbbsbbqbbtbbpaTSaQpaOTaGHaByaBzaBzaBAaBBaBzaHhbadaHeaPEbafbagbbDaGPaPEaBxbfabalbbGbbHbbHaHcbbIbalbbJbbKbbLbbMbarbarbaraUnaIOaIOaYVawGbbPbbQbbRbbSaBRaGQaFlbbWbaAbaBbbXbbYbbZbcaaGKbccbcdbaBaCVbcebcfbcgbchbcibcjaAVbjtawGbcmbcnbcnaUnbcqbcqaBoaBobcoaThbcobcpaBoaBoaRRaBoaBoaBobcqbcrbcrbcrbcrbcrbcrbcsaKObcqaKKaKMaKMaKNaKIaKIaKIaKhbcqaBEaBDbaYaEsaEsaEsaEsaEsarZaEsaEsaEsaEsaEyaBCbcAawKavUawKbcyaJtbcqaPtbcBaSsbcCaSsaKQaWAbcDbcEaTMaWDaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazQasSbcFaAFaWGatHatHatHatHatHatHaNUaOuaBgaTSaTSaTSaTSaTSaTSaTSaTSaTSaNTaNTaOlaCSaZYbcIbcJaMiaYybcLbcMaDEaPEbafbagbcOaOpaPEaBxbfabalbbHbcQbcQbbHbcQbalbbJbcRbcSbcSbcTbcUbcVbaraIOaIOaYVaGpbcYbgCbdabdbbdbbdaaGibddbaAbaBbdebdfbdgbdhbdibdjbdkaGYaHablibdobclbdpbdqbdrbclaLgawGaMybdtaIOaNsbdubdvaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFbdvaZFaZFaZFaZFaZFaZFaZFaMzbdzaDPaDTaCYaDUaCYaDVaCYaDXaDWaCYaCYaDZaDYaEaaEbaCYaCYaCYaCYaCYaCYaEcaEdaEeaMAbcCaSsaMPaMFaOZaNLaPcaMCaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazQasSbcFaAFaWGatHatHatHatHatHatHaNUaOuaBgaTSaTSaTSaTSaTSaTSaTSaTSaTSaNTaNTaOlaCSaZYbcIbcJaMiaYybcLbcMaDEaPEbafbagbcOaOpaPEaBxbfabalbbHbcQbcQbbHbcQbalbbJbcRbcSbcSbcTbcUbcVbaraIOaIOaYVaGpbcYbgCbdabdbbdbbdaaGibddbaAbaBbdebdfbdgbdhbdibdjbdkaGYaHablibdobclbdpbdqbdrbclaLgawGaMybdtaIOaNsbdubdvaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFbdvaZFaZFaZFaZFaZFaZFaZFaMzbdzaDPaDTaCYaDUaCYaDVaCYaDXaDWaCYaCYaDZaDYaEaaEbaCYaCYaCYaCYaCYaCYaEcaEdaEeaMAbcCaSsaMPaMFaPbaOZaPcaNLaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaaaafbdRazTaLDaLwaLbaKvaKvaKvaKvaKvaKvaJZaJYaKYaMDaKGaOlaCSaYyaYybdXbdYaYyaPEaPEaCUaPEbafbeabcOaOoaPEbfbaFSbalbecbedbbHbcQbeebalbbJbefbcSbcSbcSaLHbehbarbeiaIOaYVaGkbekbgCbembenbeobepaGibeqbaAbaBberbesaLJbetbetaNPbevbaBaCVbexbclbclbdpbeybdrbclaLfawGbvTaIOaIOaNsbdubdvaZFaZFaZFaZFaZFaZFaZFaLWaZFaZFaZFaZFaZFaZFaLUaCYaCYaCYaCYaCYaCYaCZaCYaCYaCYaCYaCYaCYaCYaNSaDDaDCaDtaZFaZFaZFaZFaZFaBDaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFbeIbdzbeJaSsaSsbcCaSsaKQaStbeLaTMaTMaTNaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaWEaWFbeMaKRcbnbUVbePbePbeQbePbePbePbeRaPBaPBaPBaPBaOlaCSaZYbeSbeTcbqaYybeVbeWbUWaPEaPEaPEaPEbUmaPEbUybfabalbUqbbHbcQbUicbpbalbbJbarbfcbcSbcSbPhbfebarbULaIOaYVbTrbfhbgCbembfibfjbepaGibfkbaAbflbfmbfnbetbfobetbdfbfpbfqaCVbfrcbvbftbfubfubfvbclbfwawGcCTcuScbAcvvcxRdPwdPxdTPbmZcFsdPxcbCcbEbTtdTSctbctbctaaZFaZFaZFaZFaZFbfDbfybEuaZFctccbwctdcGebWUbGabFebMfdTUdTVdTWaZFaZFaZFaZFcbFbfOcbGbfDaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFaZFbdzbfQbfRbfSbfTbfUcGxcGybfWaafaaaaafaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQcrWcrQcbdcbibfXbePbfYbfZbgabgabgbbgcbgdbgebgebgebgebPBbUubUrbUrbUtbUsbUrbUobUobUpbUobUnbUlbUlbSbbRubTJbTRbUCbTQbUBbUBbTPcslbalbTKbarbgybcSbcSbPhbgzbgAbffaIOaYVbaAbgCbTpbdabdabdabdaaGibgEbaAbaBbgFbgGbWJbgIbgJbgGbgKbaBaCVbURbUQbgNbgObgPbgQbgRbgSawGcsoaHfcsnawGbTqbTqbgUbgUbgUbgUcmTcmTcsUcsVcsrcsscsVcsUcmTcmTcmTckbckbckbckbckbbcqbcqcsJbhbbhbbhbbhbbhbbktcsXbcqcsYcsZcbmbhkbhkbhlbhlbhlbhlbhlbhmbhnbhnbhobhnaZFbhnbhobhnbhnbhpbTqcuRcuRbNtbhrbhgcBhaPtaPtaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11129,12 +11135,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQalQchdalQalQalQalQalQaaaaaaaaaaaaaaaaaaaafaafaaabxWbxTbxTbxTbxVbxTbxTbxRbxSccgbwobwhccgbwJbwKbwHbwIbwDbwGbupbwvbwSbwObfHbxUbwMbgwbjEbwLbxjbiMbxdbfNbiQbiPbuqbxabfNbxObPybymbtYbvlbCAbugbtLbtXbvebxEbiDbvfbvkbvjbuObiDbuQbvFbvNbwUbhebhFaJzbiKbvrbvsbiGbvtbvubuabiGbtPbGKbCebCTbhQbhQbhQbhQbhQbvqbhQbhQbwqbwmbvvbrkbxxbkJblBbtQbtTbkJbxybwCbwTbwrbwsbwYbxkbumbwVbumbumbuLbunbAEbyVbyVbyVaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbtybjBbuPbulbulbjSbjSbjSbjSbjSbjSbjSbjSbjBbjBaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbAdbzWbsKbzRbvPbthbzBbzFbzHccgbzSbzVccgccgbAlbvObAnbAhbvMbAjbAkbYpbvJbyRbyObvIbyJbyMbyLbzDbyJbyJbvLbzpbznbzAcjcbfNbkjbqZbqZbqZbqZbywbqZbqZbqZbysbyrbiDbyvbqJbvobtDbiDbvabynbvnbwUbhebhFbhebiKbwWbwXbiGbuZbwZbyhbwFbwEbDBbwPbwRbwRbwRbwRbwRbwRbygbwRbwRbygbwRbyBbygbygbCEbCPburbyqbCEbyubxAbxAbxAbxCbxDbxAbxAbxAbxAbxAbxzbyabxZbVNbVObyVbyVbyVbyVaaaaafaaaaaaaaaanmanmanmaafaaaaaaaafaaaaaaaafaaaaaabxYbjBbxXbjBbjBbjSbjSbjSbjSbjSbjSbjSbjBbjBaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbsBbsBbsKbsMbsLbthbtlbszbsOccgbqvbqsbqubsAbqDbqwbyobyTbqQbqIbqKbqVbqUbeYbqSbsEbrMbrGbribsdbsebsdbsGbsubsjbjpbshbfNbkjbqZbqYbqWbqRbqXbqWbwcbqLbqPbqNbqxbppbqJbqJbsmbiDbsnbsobsibwUbhebrhbqCbiKbsfbsgbiGbrObrVbqAbiGbssbidbvKboNbrkbrkboNboJboGboibnRbnKbsabrWbrjbstbsvbxrbsrbxtbyjbxrbsqbspbqtbqqdfTdfTdfTdfTbsbbqtbqqdfTdfTbAEbnkbnmbnlbWWbvSbWYbWZbXabXabXabXabXabXabXabXabXabXabXabXabXabXabXabXabpKbpLbpLbpPbjBbjBbjSbjSbqmbjSbjSbjBbjBaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSFbSFbSFbSFbSFbSFbSFbuibujccgccgccgccgccgbukbuAbuKbuKbuKbuMbuNbYpbjqbjxbtsbjybttbtCbtubtEbtFbtGbfNbtVbtHbtObtWbfNbzIbqZbzxbzsbzsbzcbtMbkObqZbzbbyZbiDbtIbsZbqJbtDbiDbtAbtBbtzbwUbhebqHbtJbiKbsIbsNbiGbiGbiGbiGbiGbBPbidbidbidbfMcmHbBObGKbXObXPbXQbGKbrWbBNbBvbAJctibudbuhbFqbtUbudbAIbyYbyYbyYbtxbtjbzQbADbyYbyYbyYbyXdfTbXVbswbXXbyVbyVbyVbyVaaaaafaaaaaaaaaanmanmanmaafaaaaaaaafaaaaaaaafaafaafbtrbtwbtmbtnbtybjBbjBbjSbmLbjSbjBbjBaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbSFbSGcnjcngcnhcnQbSFdgmdgldgkdgjcrEcrCcrrcrrcrucEIcEIcEGcEJbAkbYpbjqbjxcnCbwMcnzctfcnBcnwcnxcnybfNbtVcnpcnqdTTbfNbkjbqZdZLdZOdZOdZMcEKbqZdYtdgpdZQbiDdZTdZRdZSdZHbiDdZGbtBcrVbwUbxPbtKbxQbiKdZKdZJbiKcrXbPwbiddgCbssdZVdZWbidbfMdWwdXGbGKaaaaafaaaaaabrWctuctjdgrdgqdgtdgscERcEPdgxdgwdgzcESdgocEUdfQdfQdgBdgodgodgodgndfTbYUcoebYWbYUaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaafaafaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaafaafaafbTebTebTebTebTebTebTebTebTebTebTebTebTeaaaaaacmobSGbSGbSGbSGcmAbSFdfNdfMcDJcDzcqdcpVcDycpVcDxcpTcpScDpcDocpLcEecqwcmCdfPbgXbgXbgXbgXbgXbgXbgXbfNbfNcDKbfNbfNbfNbkjbqZbqZdZrdZsdZtdZubqZdfUcEfcqTbiDbkdbiDbiDbiDbiDbwUdZydZzbwUcqXcqWcqXbiKbXLdZBbiKbPybPybiddZDbssbidbidbidbfMcpWcmNbGKaaaaafaaaaaedfXdfVdfWdgbdgadfZcEpcEtcEscErcEqcECcECcECcEBdgidghdfQdfQdfQdfRdfSdfTcqQcmGbZVbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSFbSFbSFbSFbSFbSFbSFbuibujccgccgccgccgccgbukbuAbuKbuKbuKbuMbuNbYpbjqbjxbtsbjybttbtCbtubtEbtFbtGbfNbtVbtHbtObtWbfNbzIbqZbzxbzsbzsbzcbtMbkObqZbzbbyZbiDbtIbsZbqJbtDbiDbtAbtBbtzbwUbhebqHbtJbiKbsIbsNbiGbiGbiGbiGbiGbBPbidbidbidbfMcmHbBObGKbXObXPbXQbGKbrWbBNbBvbAJctibudbuhbFqbtUbudcECcEqcEqcEqcEBbtjbzQbADbAIbyYbtxbyXdfTbXVbswbXXbyVbyVbyVbyVaaaaafaaaaaaaaaanmanmanmaafaaaaaaaafaaaaaaaafaafaafbtrbtwbtmbtnbtybjBbjBbjSbmLbjSbjBbjBaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbSFbSGcnjcngcnhcnQbSFdgmdgldgkdgjcrEcrCcrrcrrcrucEIcEIcEGcEJbAkbYpbjqbjxcnCbwMcnzctfcnBcnwcnxcnybfNbtVcnpcnqdTTbfNbkjbqZdZLdZOdZOdZMcEKbqZdYtdgpdZQbiDdZTdZRdZSdZHbiDdZGbtBcrVbwUbxPbtKbxQbiKdZKdZJbiKcrXbPwbiddgCbssdZVdZWbidbfMdWwdXGbGKaaaaafaaaaaabrWctuctjdgrdgqdgtdgscERcEPdgxdgzdhUdgSdgSdhWdfQdfQdgBdiNdgodgodgndfTbYUcoebYWbYUaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaafaafaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaafaafaafbTebTebTebTebTebTebTebTebTebTebTebTebTeaaaaaacmobSGbSGbSGbSGcmAbSFdfNdfMcDJcDzcqdcpVcDycpVcDxcpTcpScDpcDocpLcEecqwcmCdfPbgXbgXbgXbgXbgXbgXbgXbfNbfNcDKbfNbfNbfNbkjbqZbqZdZrdZsdZtdZubqZdfUcEfcqTbiDbkdbiDbiDbiDbiDbwUdZydZzbwUcqXcqWcqXbiKbXLdZBbiKbPybPybiddZDbssbidbidbidbfMcpWcmNbGKaaaaafaaaaaedfXdfVdfWdgbdgadfZcEpcEtcEscErcEScEUdfQdfQdfQdgidgwdfQdfQdfQdfRdfSdfTcqQcmGbZVbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecnScqacnSbTecnOcpYcnObTecnMcpZcnMbTeaaaaaacphbSGcpXbSGbSGcpRbSFcFVcFUcQKcFXcRqcRpcFMcFKcFkbqVbqVcFTbqVbqKcFIcFJbjxcpCcpDcpucpucpEdgZdhadgGdhbdhcdhddhedhfdgGbkjbEaeaxbMXbMXcFqeaweaDeaEdLbdPueazeaAcFreaeeaeeaudXBbwUbwUbwUcFocZLcFpbiKbiKbiKbiKbPybPybiddZDbsseareasbidbfMbGKbGKbGKaaaaafaaaaaadhqdhrdhsdhlcFndhmcWQdQScFldhidhhdfQdfQdfQdfQdhodhndfQdhpdfQdfRdghdfTcaycqbcaAbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecnScnRcnSbTecnOcnPcnObTecnMcnNcnMbTeaaaaaacphbSGbSGbSGcpicoIcEVcsOcsNcvgcuVcsWbpIcsMcsEcsmcoycoEcoDdgFbAkbYpcpdcpbcpccFdcpfcFccpfdgIcoWdgGdgHcFbdgLdgJdgHdgGbkjbEaeabbMXbOsbMXeaaeageahcCNeajeaceadeaeeafeaeeandXBciZboNcDacEycExdgYcFGboNboNboNboNcEzbidbidbidbidbidbidbfMbGKaafaafaafcbfaafaafdgRdgPdgQdgQdgQccQbudcCKcyldgTdgSdgMdgMdgMdgXdgWdgWdgVdgMdgMcFedgOdfTcbjcFfcblbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecNOcnicIfbTecHYcnfcHWbTecGvcnccGubTeaaaaafcphcrdbSGbSGcqqbWbbSFcOGdPVcvgcvgdPTcvgcvgcvgcvgcrzbYpcrxcrybAkbYpdRPcrlbyOcOncricrkcricOwcrqcOxdhLdhGcOodgGdgGdgGbkjbEadhOebrdBIebpebqebiebjdQhebhebmebnebkdBNebcdhNebadQabJNebfdQedQddhMbCTbyDbXPbXQbGKbvKboNboNboNboNboNboNciNbGKaaaaaaaaaaafaaaaaabrWdhWdhUdBXdhTbuddQidQSdQRdfTdhVbyYbyYbyYdhPcvudhQdhSbyYbyYbyYdhYdfTdhXcrNcccccdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecnScnRcnSbTecnOcnPcnObTecnMcnNcnMbTeaaaaaacphbSGbSGbSGcpicoIcEVcsOcsNcvgcuVcsWbpIcsMcsEcsmcoycoEcoDdgFbAkbYpcpdcpbcpccFdcpfcFccpfdgIcoWdgGdgHcFbdgLdgJdgHdgGbkjbEaeabbMXbOsbMXeaaeageahcCNeajeaceadeaeeafeaeeandXBciZboNcDacEycExdgYcFGboNboNboNboNcEzbidbidbidbidbidbidbfMbGKaafaafaafcbfaafaafdgRdgPdgQdgQdgQccQbudcCKcyldgTdsLdgMdgMdgMdgXdgWdgWdgVdgMdgMcFedgOdfTcbjcFfcblbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecNOcnicIfbTecHYcnfcHWbTecGvcnccGubTeaaaaafcphcrdbSGbSGcqqbWbbSFcOGdPVcvgcvgdPTcvgcvgcvgcvgcrzbYpcrxcrybAkbYpdRPcrlbyOcOncricrkcricOwcrqcOxdhLdhGcOodgGdgGdgGbkjbEadhOebrdBIebpebqebiebjdQhebhebmebnebkdBNebcdhNebadQabJNebfdQedQddhMbCTbyDbXPbXQbGKbvKboNboNboNboNboNboNciNbGKaaaaaaaaaaafaaaaaabrWdDldEBdCOdhTbuddQidQSdQRdfTdhVdBXdBXdBXdhPcvudhQdhSdBXdBXdBXdhYdfTdhXcrNcccccdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaafaafbTecqocdMcqpbTecdWcdMcdXbTecdLcdMcdNbTeaaaaafcqrbSGbSGbSIcqqcqybSFdPAdPvcqvcFxcFwcFvcFRcFRcGlcGjcFRcFAcFzbAkbAkbjqcqIcqJcpDcqCcqCcqHdhBdhCdgGdhAdhydhzdhwdhxdgGcGmbEadhDcGqdCpeaOeaPbEaeaFdPDeaHdXBeaIeaJdCqcGtdhEdXBbfMbPydXFeaUeaTeaQdXFaaaaaaaaabGKbGKbGKbXObXPbXPbXQbGKbGKbGKaaaaaaaaabudbudbudbudbudbudbudbudbuddPHdPSdPPdfTdfTbZPbOwcdqdfTdfTdfTdfTcoTbOwcdqdfTdfTccSdhFccSaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachdaafaafaafaaaaafcsLaafcsLaafcdmaafcdlaafcdmaafcdlaafaafaaabSFcsKbUXcsIdbicszbQGcROcRJbQGcsCcsDcmJcmJdTDcmJchBcRZcsFchBcsHcRecRicRCcswcaOcaOcaOcaOcRDcRIcaOcjXcjXcjXcjXcjXcjXbkjbEaebRdibdCyebNebObEaeaFcVtebMdXBebKebIdCzdiaebGdXBcVobPydXFebFebEdhZdXFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaabudcnbcmXcmYdTJdTKcdycSLcfccVndTFdTEdTGckkaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcebceccebaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaafcsgclgcshclgcshclgccWclgccUclgccWclgccUclgccVbQGbQGbQGbQGbQGbQGbQGbQGcrPcQJcrUcrTcrSdQTecIdQVdQUchBcRddZEcrYchBcaTchwchtcaOcsdcsecsbcscchhcaPcaOdRMdRMcsfclLclLcjXbkjbEabEaebxdCJbEabEabEaebvckYebwdXBdXBdXBdDhebCdXBdXBbfMcpqdXFdYWdYcdYddXFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafbudccCcoLccCdRNcmEcbWdTCcfcdRUdTAdRUbudbudaaaaaaaaaaafaafaaaaaeaaaaaaaaaaaaaafaaaceWaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11385,13 +11391,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPicPtcPucPvcPtcPucPudYldYhdYmcPucPxcPycPhcPicPidiVdRrdRrdRrdRrdRrcOycPkcLvcPlcJJcJJcJJcLccLvcPkcNdcNdcNdcNdcNdcNdaaaaaacOVcPLcOYcOYdancRWcRWdakcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPtdazdiWdavcPEcPFcPFcPFcPFcPFcPFcPGcPHcPhcPicPidRsdRrdRrdRrdRrdRrcOycPkcLvcPlcJJcJJcJJcPncLvcPkcPKcPKcPKcPKcPKcNdaaaaaadXIcPLcOYcOYdXIcQMcQMcQMcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPidYfcPCcPNcPCcPOcPCcPCcPCcPCcPCcPCcPCdiQcPicPicPicOycOycOycOycQccWbcOycPkcLvcPlcJJcJJcJJcVqcWacKwcRVcRVcRVcRVcRVcRVcRVcRXcOVcZIcOYcOYdaccPpcPpcPpcPsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPUdaediRdafcPEcPXcPXcPXcPXcPXcPXcPYcPZcPhcPicPicOydhjdhJdPFdPtdPtcOydKhdKjdiycJJcJJcJJcJJcUPcQhcQhcQhcQhcQhcUGdiOcUDdiOecYcOYcOYcOYcOYdaddadcPMdXIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPUdaediRdafcPEcPXcPXcPXcPXcPXcPXcPYcPZcPhcPicPicOydhjdhJdPFdPtdPtcOydKhdKjdiycJJcJJcJJcJJcUPcQhcQhcQhcQhcQhcUGdiOcUDdiOecZcOYcOYcOYcOYdaddadcPMdXIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPicPUcPucQmcPUcPucPudYldYhdYmcPucQncPycPhcPicPicOydPQdPUdQfdPtdPtdQgdQQdQXcJJcJJcJJcJJcJJcUPcQhcQhcQhcQhcQhcUGcSacRVcRXcOVdahcOYcPMdYgcPLcOYdagcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPicPicPicPicPicPicPicPicPicPicPicPicPjcPhcPicPicOydRhdRidRjdPtdPtdQgdQQdQXcJJcJJcJJcJJdRfdRgcRVdRecQhcQhcQwdiScNdaaaaaadYgcPLcOYcPMdYecPLcOYcPMdYgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycOycOycOycOycOycQzcQzcQzcQzcQzcQzcQzcQzcQzcQzcQzcQzcQzcVCcVCcVCcQAcQAcQzcVBcLfcVxcJJcJJcJJcPncQQcPkcVMcQhcUGcVOcVNcNdaaaaaadYecPLcOYcPMdYecPLcOYcPMdYeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycUXcUYcUYcUYcURcUVcQLcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQAcQzcPkcLvcPlcJJcJJcJJcVqcVpcRVcVrcQhcQhcQScVscNdaaaaaadXXcPLcOYcPMdYecPLcOYcPMdXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycPbcPbcPbcPbcPbcUJcQTcUHcUKcQYcQAcQWcUOcUNcQYcQAcQAcQAcQAcQAcQAcQAcQAcQzcPkcLvcPIcJJcJJcJJcJJcUPcQhcQhcQhcQhcQhcUGcSacRVcRXcOVcZIcOYcPMdXXcPLcOYcZKcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycPbcQxcPbcPbcPbcQVcQTcUfcUicQYcQAcQWcSAcSzcQYcQAcQAcSecSecSecSecSecSecQzcShcSgcSrcSicUzcUzcUzcUAcUzcUzcQhcQhcQhcUGdiOcUDdiOdiNcOYcOYcOYcOYcOYcOYcPMdXIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycPbcQxcPbcPbcPbcQVcQTcUfcUicQYcQAcQWcSAcSzcQYcQAcQAcSecSecSecSecSecSecQzcShcSgcSrcSicUzcUzcUzcUAcUzcUzcQhcQhcQhcUGdiOcUDdiOecYcOYcOYcOYcOYcOYcOYcPMdXIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycPbdiMcPbcPbcPbcQVcQLcQAcQAcQAcQAcQAcQAcQAcQAcQAcQCcRUcRUcRUcRUcRUcRUcQzcQzcQzcQzcQzdKddKdcQzcQzcQzcQzcSacRVcRVcRVcRVcRVcRXcOVdXUdXTdKfdXIcZBcOYcZrcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycPbcPbcREcPbcRGcQVcQTcRNcRFcQYcQAcQWcRAcRzcQYcQAcQCcRycQBcQBcQBcQBcQBcQzcRBcRBcRBdJHcOtcOtcRRcRhcRhcQzcPKcPKcPKcPKcNdaaaaaacOVcRLcRMcPAcRgcOVcZpcZrcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycQRcPbcPbcQPcPbcQVcQTcQUcQXcQYcQAcQWcRacQZcQYcQAcQCcQBcQBcQBcQBcQBcQBcQzdJFcWncWkdJEcOtcOtcOtcRhcRhcQzcNdcNdcNdcNdcNdaaaaaadXIcPAcPAcPAcZecOVcZdcZdcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -12051,8 +12057,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdqTdqTdqTdqTdrJduYdrLdrMdrNdrOdrPdrQdrRdrSdrTdrUdrVdrTdrWdrEdrTdrXdrUdrDaafaafdrYdrZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdsadsadqTdqTdsadsadsadsadqTdsadsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdqTdrJdrJdrJdrJdsbdscdvAechdsedsedseeciecjdrTdshdsieckdrEdrEecldsidshdrDaafaafecgdslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdsadqTdqTdqTdqTdqTdqTdsadsadqTdqTdqTdqTdsadsadsadsadqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTaaaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdrJdrJdsmdsndrJdsodsodsodsodJIdsedsqdDvdDudrTdrTdrTdrTeaYeaXdsvdsvdsvdsvdsvdsvdqtdsxdsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadszdsAdszaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdsadqTdqTdqTdsadsadqTdsadsadsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdrJdsBdsCdsDdsEdqsdsGdsHdsIdsJdsKdsLdDldDkdrTdsOdsPdrTdqmdqldsvdqkeaVeaWeaSdqpdqndsYdsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtadtbdtaaafaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdrJdtcdtddKIdrJdtfdsFdtgdthdtidtjdtkdEBdEAdEedEddEgebsdEidqIdqKebtebldqCebodqGdqHdtydsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadszdsAdszaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdsadqTdqTdqTdsadsadqTdsadsadsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdrJdsBdsCdsDdsEdqsdsGdsHdsIdsJdsKeddedcdDkdrTdsOdsPdrTdqmdqldsvdqkeaVeaWeaSdqpdqndsYdsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtadtbdtaaafaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaadrIdqTdqTdqTdqTdrJdtcdtddKIdrJdtfdsFdtgdthdtidtjdtkededEAdEedEddEgebsdEidqIdqKebtebldqCebodqGdqHdtydsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtzdtAdtBdtCaafaaaaaadqTdqTdqTdqTdqTdqTdqTdsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaadqVdtDaaadqTdqTdqTdrJdtcdtddtEdrJdtFdtgebdebbdKbdtJdtKdtJebedtJdtJdtJdrDdqydqxdsveaZdqBdqCdqzebgdqDdsYdsZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtSdtTdtTdtUdtVdtWdtaaafaaaaaadqTdqTdqTdqTdsadsadsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaafdtXdtYdrsdrsdrsdtZduaaaadqTdqTdqTdrJdtcebPebQdrJdudduedGwdGNduhebDdMrdukdGudumdunduodrDebJebHdsvebLdradrbdrmebBdsvduudqZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduwduxduyduzduAduBduCaafaafdsadsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaduDduDduDaafduEduaaafaafaafaafaafaaadrJdrJdrJdrJdrJdEUebAdrJdsodrDdqeebuduJdtJduKduLdEKduNduOduPdrDdqPdqOdqNebydqSdqYdqQebzdqNdpkdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -12067,10 +12073,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafdAqdArdAsdxqdzxdAtdxUdAudxVdAvdvcdAwdAxdvcdAydxudAzdAAdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTaaaaaaaaaaaadABdACdyLdyLeaodyLdAEdAFdBDeatdBFeapeaqdDXdyUdBfeaveaydAPdBHdBGeaBdBPeaCdBSdBWdBVdBZdBYdqhdBVdBVdCrdBWdBVeaGeaKeaLdCBdCCeaMdCFdCIeaNeaRdBmdBmdBndzrdslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafdsadsadvcdxtdBodBpdBqdAsdBrdBsdxWdBtdszduBdBudvcdAydwodxudAAdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdBvdBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdBwdBxaaaaaaaaadBydBzdyLdBAdAYdAZdDTdBbdBcdBddBedZYdBJdBKdyUdqcdZZeamdBMdBMdrDdrDdqfdBOdBidBkdBOdBRdBjdBCdBRdBUdBBdBgdBUdrDdqddqedvZeaidzreakealdzrdCddBmdBmdCedzrdslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdvcdvcdvcdvcdvcdvcdxsdxVdCfdBodxVdzydCgdBtdBtdxYdxudAwdvcdAydvIdChdAAdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdBvdCidCidCidCidBvdBvdBvdqTdqTdCjdCkdCldyDaaaaaaaaadCmdCndyddyedCodCodCodCodvUdWudvSdrTdrTdrTdyUdWvdBMdCtdBMdCudCvdWHdWJdBOdwfdwcdWCdBRdwbdwedWGdBUdwddvVdWydBUdCHdwadvZdphdCKdzrdzrdzrdCLdCMdCNdApdzrdslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdvcdCOduBdxWdCPdvcdCQdCRdCSdvcdzzdvcdCTdCUdCVdvcduBdCWdtbdCXdvIdwndtbdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidBvdBvdqTdCYdCZdrYdDadrsdrsdrsdtZduaaafaafdDbdDcdDddDedwHdDgdwtdwjdWOdwGdpjdpidWWdDodDpdDqdDrdXpdXsdBOdxfdWZdALdBRdxadXkdBadBUdxedXHdCxdBUdXOdxKdxCdYidDmdDIdDJdzrdzrdzrdzrdzrdDKdtDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadvcdCOdvIduBdxUdzzdCWdBodDLdBodDMduBduBdDNdxuduBdvIdvIdvcdtbdDOdvIduBdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidDPdDQdDRdDQaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdDcdVxdvudvsdVvdvpdxgdDYdDYdpadpbdBMdCtdBMdEadBMdoZdEcdVodBOdVldBOdBRdBRdVjdBRdBUdBUdVadBUdBUdUvdvkdvjdUodEldEldEmdCKdEndqWdrsdrsdEodEpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadvcdCOdEqdvIdvIdzzdvIdChdwTdvIdErdDMdChdBudEsdvIdEtdwodvcdBodtbdCWduBdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdDQdCidCidCidCidCidCidCidCidCidCidCidEudEvdEwdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdDcdWtdvQdvRdvQdvPdECdEDdDYdpfdyUdyUdEGdpddEIdBMdpcdEJdvFdWmdVKdWhdWkdWldVzdVEdVFdVGdvOdEVdBUdEWdpedCKdEYdEZdEYdEZdCKdFadFbdsaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadvcdCOdFcdxUdxsdvcdFddvcdFedFfdvcdxWdvcdFedFfdvcdxVdCWdvcdDNdFgdtbdAwdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdFhdCidCidCidCidCidCidCidCidCidCidCidCidFidFjdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdoVdECdECdFkdFldTHdECdFndDYdEEdyUdMCdFqdFpdFsdBMdoWdTQdTLdFwdTZdFydBRdFzdUadFBdBUdFCdTIdFEdBUdFFdwFdFHdCKdCKdCKdCKdFIdFJdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdvcedbduBdxWdCPdvcdCQdCRdCSdvcdzzdvcdCTdCUdCVdvcduBdCWdtbdCXdvIdwndtbdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidBvdBvdqTdCYdCZdrYdDadrsdrsdrsdtZduaaafaafdDbdDcdDddDedwHdDgdwtdwjdWOdwGdpjdpidWWdDodDpdDqdDrdXpdXsdBOdxfdWZdALdBRdxadXkdBadBUdxedXHdCxdBUdXOdxKdxCdYidDmdDIdDJdzrdzrdzrdzrdzrdDKdtDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadvcedbdvIduBdxUdzzdCWdBodDLdBodDMduBduBdDNdxuduBdvIdvIdvcdtbdDOdvIduBdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidDPdDQdDRdDQaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdDcdVxdvudvsdVvdvpdxgdDYdDYdpadpbdBMdCtdBMdEadBMdoZdEcdVodBOdVldBOdBRdBRdVjdBRdBUdBUdVadBUdBUdUvdvkdvjdUodEldEldEmdCKdEndqWdrsdrsdEodEpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadvcedadEqdvIdvIdzzdvIdChdwTdvIdErdDMdChdBudEsdvIdEtdwodvcdBodtbdCWduBdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdDQdCidCidCidCidCidCidCidCidCidCidCidEudEvdEwdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdDcdWtdvQdvRdvQdvPdECdEDdDYdpfdyUdyUdEGdpddEIdBMdpcdEJdvFdWmdVKdWhdWkdWldVzdVEdVFdVGdvOdEVdBUdEWdpedCKdEYdEZdEYdEZdCKdFadFbdsaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadvcedadFcdxUdxsdvcdFddvcdFedFfdvcdxWdvcdFedFfdvcdxVdCWdvcdDNdFgdtbdAwdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdFhdCidCidCidCidCidCidCidCidCidCidCidCidFidFjdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdoVdECdECdFkdFldTHdECdFndDYdEEdyUdMCdFqdFpdFsdBMdoWdTQdTLdFwdTZdFydBRdFzdUadFBdBUdFCdTIdFEdBUdFFdwFdFHdCKdCKdCKdCKdFIdFJdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadvcdvcdvcdvcdvcdvcdFddvcdFKdxudxWdAwdwodxVdBrdxVdzBdxUdvcdFedFLdFMdFNdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdDPdCidCidCidCidCidCidCidCidCidCidCidCidFidEwdExaaaaaaaaaaaaaaaaaaaaaaafaafdDbdFOdFPdFPdFQdFRdECdFSdFTdDYdFodyUdoXdFqdoYdFsdBMdUgdFWdBOdFXdFYdFZdBRdGadGbdGcdBUdGddGedGfdBUdGgdGhdFHdqTdsadqTdGidGjdGkdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdxudAwdGldzydtWdxUdxudvcdxVdwodvcdGmdGndGndGodvcdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdBvdCidCidCidoPdCidCidCidCidCidCidCidCidGqdGraafaaaaaaaaaaaaaaaaaaaafaafaafdDbdDbdGsdGtdDbduSdGvdTtdGvdDbdoOdGTdCidCidCidCidBMdBMdBMdBOdBOdBOdBOdBRdBRdBRdBRdBUdBUdBUdBUdBUdFHdFHdGydGzdrndrndGAdFbdqTdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdAwduBdzBdxudxVdwodzBdvcdFddvcdvcdAydtbdGndGBdGCdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdoJdCidoUdoFdoKdCidCidCidCidCidCidCidCidGDdGEaaaaaaaaaaaaaaaaafdGFdGGdGHdGIdGJdoSdoRdoQdTvdTudGPdGQdDbdGxdCidCidCidCidCidGRdGSdGTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdrldGUdFbdGVdqTdqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/templates/botany_editor.tmpl b/nano/templates/botany_editor.tmpl new file mode 100644 index 0000000000..afd24f0f81 --- /dev/null +++ b/nano/templates/botany_editor.tmpl @@ -0,0 +1,56 @@ + + +{{if data.activity}} + Scanning... +{{else}} +

Buffered Genetic Data

+ {{if data.disk}} +
+
+ Source: +
+
+ {{:data.sourceName}} +
+
+ Gene decay: +
+
+ {{if data.degradation <= 100}} + {{:data.degradation}}% + {{else}} + FURTHER AMENDMENTS NONVIABLE + {{/if}} +
+
+ Locus: +
+
+ {{:data.locus}} +
+ {{:helper.link('Eject Disk', 'circle-arrow-e', {'eject_disk' : 1}, null)}} +
+ {{else}} +
No disk loaded.
+ {{/if}} +

Loaded Material

+ {{if data.loaded}} +
+
+ Target: +
+
+ {{:data.loaded}} +
+ {{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)}} +
+ {{else}} +
No target seed packet loaded
+ {{/if}} +{{/if}} \ No newline at end of file diff --git a/nano/templates/botany_isolator.tmpl b/nano/templates/botany_isolator.tmpl new file mode 100644 index 0000000000..c0e4d4a613 --- /dev/null +++ b/nano/templates/botany_isolator.tmpl @@ -0,0 +1,73 @@ + + +{{if data.activity}} + Scanning... +{{else}} +

Buffered Genetic Data

+ {{if data.hasGenetics}} +
+
+ Source: +
+
+ {{:data.sourceName}} +
+
+ Gene decay: +
+
+ {{:data.degradation}}% +
+
+ {{if data.disk}} + {{for data.geneMasks}} +
+
+ {{:value.mask}} +
+
+ {{:helper.link('Extract', 'circle-arrow-s', {'get_gene' : value.tag}, null)}} +
+
+ {{empty}} +
Data error. Genetic record corrupt.
+ {{/for}} +
+
+ {{:helper.link('Eject Loaded Disk', 'circle-arrow-e', {'eject_disk' : 1}, null)}} + {{:helper.link('Clear Genetic Buffer', 'gear', {'clear_buffer' : 1}, null)}} +
+ {{else}} +
No disk inserted.
+ {{/if}} + {{else}} +
No data buffered.
+ {{if data.disk}} +
+
+ {{:helper.link('Eject Loaded Disk', 'circle-arrow-e', {'eject_disk' : 1}, null)}} +
+ {{else}} +
No disk inserted.
+ {{/if}} + {{/if}} +

Loaded Material

+ {{if data.loaded}} +
+
+ Packet loaded: +
+
+ {{:data.loaded}} +
+
+ {{:helper.link('Process Genome', 'gear', {'scan_genome' : 1}, null)}}{{:helper.link('Eject Packet', 'circle-arrow-e', {'eject_packet' : 1}, null)}} +
+
+ {{else}} +
No seeds loaded.
+ {{/if}} +{{/if}} \ No newline at end of file