Aquaponics and Molluscs (#10067)

This commit is contained in:
Geeves
2020-10-03 13:48:29 +02:00
committed by GitHub
parent e639199ea2
commit d155132fa1
25 changed files with 245 additions and 48 deletions
+1 -1
View File
@@ -119,7 +119,7 @@
descriptors -= chosen
desc += "[(descriptor_count>1 && descriptor_count!=descriptor_num) ? "," : "" ] [chosen]"
descriptor_num--
if(seed.seed_noun == "spores")
if(seed.seed_noun == SEED_NOUN_SPORES)
desc += " mushroom"
else
desc += " fruit"
+55 -21
View File
@@ -7,7 +7,7 @@
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/seed_noun = SEED_NOUN_SEEDS // Descriptor for packet.
var/display_name // Prettier name.
var/roundstart // If set, seed will not display variety number.
var/mysterious // Only used for the random seed packets.
@@ -21,8 +21,9 @@
var/kitchen_tag // Used by the reagent grinder.
var/trash_type // Garbage item produced when eaten.
var/splat_type = /obj/effect/decal/cleanable/fruit_smudge // Graffiti decal.
var/has_mob_product
var/product_type = /obj/item/reagent_containers/food/snacks/grown
var/force_layer
var/hydrotray_only
/datum/seed/proc/setup_traits()
@@ -328,14 +329,50 @@
return impact
/datum/seed/proc/generate_name()
var/prefix = ""
var/name = ""
if(prob(50)) //start with a prefix.
//These are various plant/mushroom genuses.
//I realize these might not be entirely accurate, but it could facilitate RP.
var/list/possible_prefixes
if(seed_noun == SEED_NOUN_CUTTINGS || seed_noun == SEED_NOUN_SEEDS || (seed_noun == SEED_NOUN_NODES && prob(50)))
possible_prefixes = list("amelanchier", "saskatoon",
"magnolia", "angiosperma", "osmunda", "scabiosa", "spigelia", "psydrax", "chastetree",
"strychnos", "treebine", "caper", "justica", "ragwortus", "everlasting", "combretum",
"loganiaceae", "gelsemium", "logania", "sabadilla", "neuburgia", "canthium", "rytigynia",
"chaste", "vitex", "cissus", "capparis", "senecio", "curry", "cycad", "liverwort", "charophyta",
"glaucophyte", "pinidae", "vascular", "embryophyte", "lillopsida")
else
possible_prefixes = list("bisporus", "bitorquis", "campestris", "crocodilinus", "agaricus",
"armillaria", "matsutake", "mellea", "ponderosa", "auricularia", "auricala",
"polytricha", "boletus", "badius", "edulis", "mirabilis", "zelleri",
"calvatia", "gigantea", "clitopilis", "prumulus", "entoloma", "abortivum",
"suillus", "tuber", "aestivum", "volvacea", "delica", "russula", "rozites")
possible_prefixes |= list("butter", "shad", "sugar", "june", "wild", "rigus", "curry", "hard", "soft", "dark", "brick", "stone", "red", "brown",
"black", "white", "paper", "slippery", "honey", "bitter")
prefix = pick(possible_prefixes)
var/num = rand(2,5)
var/list/possible_name = list("rhon", "cus", "quam", "met", "eget", "was", "reg", "zor", "fra", "rat", "sho", "ghen", "pa",
"eir", "lip", "sum", "lor", "em", "tem", "por", "invi", "dunt", "ut", "la", "bore", "mag", "na",
"al", "i", "qu", "yam", "er", "at", "sed", "di", "am", "vol", "up", "tua", "at", "ve", "ro", "eos",
"et", "ac", "cus")
for(var/i in 1 to num)
var/syl = pick(possible_name)
possible_name -= syl
name += syl
if(prefix)
name = "[prefix] [name]"
seed_name = name
display_name = name
display_name = "[name] plant"
//Creates a random seed. MAKE SURE THE LINE HAS DIVERGED BEFORE THIS IS CALLED.
/datum/seed/proc/randomize()
roundstart = FALSE
mysterious = TRUE
roundstart = 0
seed_name = "strange plant" // TODO: name generator.
display_name = "strange plants" // TODO: name generator.
mysterious = 1
seed_noun = pick("spores","nodes","cuttings","seeds")
seed_noun = pick(SEED_NOUN_SEEDS, SEED_NOUN_PITS, SEED_NOUN_NODES, SEED_NOUN_CUTTINGS)
set_trait(TRAIT_POTENCY,rand(5,30),200,0)
set_trait(TRAIT_PRODUCT_ICON,pick(SSplants.plant_product_sprites))
@@ -486,6 +523,8 @@
set_trait(TRAIT_MATURATION,rand(5,15))
set_trait(TRAIT_PRODUCTION,get_trait(TRAIT_MATURATION)+rand(2,5))
generate_name()
//Returns a key corresponding to an entry in the global seed list.
/datum/seed/proc/get_mutant_variant()
if(!mutants || !mutants.len || get_trait(TRAIT_IMMUTABLE) > 0) return 0
@@ -609,8 +648,8 @@
consume_gasses |= new_gasses
gene.values["[TRAIT_CONSUME_GASSES]"] = null
if(GENE_METABOLISM)
has_mob_product = gene.values["mob_product"]
gene.values["mob_product"] = null
product_type = gene.values["product_type"]
gene.values["product_type"] = null
for(var/trait in gene.values)
set_trait(trait,gene.values["[trait]"])
@@ -639,7 +678,7 @@
if(GENE_HARDINESS)
traits_to_copy = list(TRAIT_TOXINS_TOLERANCE,TRAIT_PEST_TOLERANCE,TRAIT_WEED_TOLERANCE,TRAIT_ENDURANCE)
if(GENE_METABOLISM)
P.values["mob_product"] = has_mob_product
P.values["product_type"] = product_type
traits_to_copy = list(TRAIT_REQUIRES_NUTRIENTS,TRAIT_REQUIRES_WATER,TRAIT_ALTER_TEMP)
if(GENE_VIGOUR)
traits_to_copy = list(TRAIT_PRODUCTION,TRAIT_MATURATION,TRAIT_YIELD,TRAIT_SPREAD)
@@ -700,17 +739,12 @@
spawn_seed(get_turf(user))
/datum/seed/proc/spawn_seed(var/turf/spawning_loc)
var/obj/item/product
if(has_mob_product)
product = new has_mob_product(spawning_loc,name)
else
product = new /obj/item/reagent_containers/food/snacks/grown(spawning_loc,name)
var/obj/item/product = new product_type(spawning_loc, name)
if(get_trait(TRAIT_PRODUCT_COLOUR))
if(!istype(product, /mob))
product.color = get_trait(TRAIT_PRODUCT_COLOUR)
if(istype(product,/obj/item/reagent_containers/food))
var/obj/item/reagent_containers/food/food = product
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
if(istype(product, /obj/item/reagent_containers/food))
var/obj/item/reagent_containers/food/food = product
food.color = get_trait(TRAIT_PRODUCT_COLOUR)
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
if(mysterious)
product.name += "?"
@@ -750,7 +784,7 @@
new_seed.can_self_harvest = can_self_harvest
new_seed.kitchen_tag = kitchen_tag
new_seed.trash_type = trash_type
new_seed.has_mob_product = has_mob_product
new_seed.product_type = product_type
//Copy over everything else.
if(mutants) new_seed.mutants = mutants.Copy()
if(chems) new_seed.chems = chems.Copy()
@@ -99,7 +99,7 @@
/datum/seed/mushroom/nfrihi
name = "nfrihi"
seed_name = "blizzard ears"
seed_noun = "nodes"
seed_noun = SEED_NOUN_NODES
display_name = "blizzard ear stalks"
mutants = null
chems = list(/datum/reagent/nutriment/flour/nfrihi = list(10, 10))
@@ -127,7 +127,7 @@
name = "nmshaan"
seed_name = "sugar tree"
display_name = "sugar trees"
seed_noun = "seeds"
seed_noun = SEED_NOUN_SEEDS
mutants = null
chems = list(/datum/reagent/sugar = list(2, 10))
kitchen_tag = "nmshaan"
@@ -0,0 +1,52 @@
/datum/seed/mollusc
name = "mollusc"
seed_name = "mollusc"
display_name = "mollusc bed"
product_type = /obj/item/mollusc
seed_noun = SEED_NOUN_EGGS
mutants = null
/datum/seed/mollusc/New()
..()
set_trait(TRAIT_MATURATION, 10)
set_trait(TRAIT_PRODUCTION, 1)
set_trait(TRAIT_YIELD, 3)
set_trait(TRAIT_POTENCY, 1)
set_trait(TRAIT_PRODUCT_ICON, "mollusc")
set_trait(TRAIT_PLANT_ICON, "mollusc")
set_trait(TRAIT_WATER_CONSUMPTION, 6)
set_trait(TRAIT_IDEAL_HEAT, 288)
set_trait(TRAIT_LIGHT_TOLERANCE, 6)
set_trait(TRAIT_PRODUCT_COLOUR, "#aaabba")
set_trait(TRAIT_PLANT_COLOUR, "#aaabba")
/obj/item/seeds/mollusc
seed_type = "mollusc"
/datum/seed/mollusc/clam
name = "clam"
seed_name = "clam"
display_name = "clam bed"
product_type = /obj/item/mollusc/clam
/datum/seed/mollusc/clam/New()
..()
set_trait(TRAIT_PRODUCT_COLOUR, "#9aaca6")
set_trait(TRAIT_PLANT_COLOUR, "#9aaca6")
/obj/item/seeds/clam
seed_type = "clam"
/datum/seed/mollusc/barnacle
name = "barnacle"
seed_name = "barnacle"
display_name = "barnacle bed"
product_type = /obj/item/mollusc/barnacle
/datum/seed/mollusc/barnacle/New()
..()
set_trait(TRAIT_PRODUCT_COLOUR, "#c1c0b6")
set_trait(TRAIT_PLANT_COLOUR, "#c1c0b6")
/obj/item/seeds/barnacle
seed_type = "barnacle"
@@ -306,7 +306,7 @@
/datum/seed/cherries
name = "cherry"
seed_name = "cherry"
seed_noun = "pits"
seed_noun = SEED_NOUN_PITS
display_name = "cherry tree"
chems = list(/datum/reagent/nutriment = list(1,15), /datum/reagent/sugar = list(1,15), /datum/reagent/nutriment/cherryjelly = list(10,15))
kitchen_tag = "cherries"
+1 -1
View File
@@ -126,7 +126,7 @@
seed_noun = "node"
display_name = "diona pod"
can_self_harvest = 1
has_mob_product = /mob/living/carbon/alien/diona
product_type = /mob/living/carbon/alien/diona
/datum/seed/diona/setup_traits()
..()
@@ -4,7 +4,7 @@
/datum/seed/mushroom
name = "mushrooms"
seed_name = "chanterelle"
seed_noun = "spores"
seed_noun = SEED_NOUN_SPORES
display_name = "chanterelle mushrooms"
mutants = list("reishi","amanita","plumphelmet")
chems = list(/datum/reagent/nutriment = list(1,25))
@@ -31,7 +31,7 @@
/datum/seed/koisspore
name = "koisspore"
seed_name = "kois"
seed_noun = "spores"
seed_noun = SEED_NOUN_SPORES
display_name = "k'ois spores"
chems = list(
/datum/reagent/kois = list(4),
@@ -130,7 +130,7 @@
display_name = "walking mushrooms"
mutants = null
can_self_harvest = 1
has_mob_product = /mob/living/simple_animal/mushroom
product_type = /mob/living/simple_animal/mushroom
/datum/seed/mushroom/plump/walking/setup_traits()
..()
@@ -5,7 +5,7 @@
name = "tomato"
seed_name = "tomato"
display_name = "tomato plant"
mutants = list("bluetomato","bloodtomato") // no killer :(
mutants = list("bluetomato","bloodtomato") // no killer :[
chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/drink/tomatojuice = list(10,10))
kitchen_tag = "tomato"
@@ -49,7 +49,7 @@
display_name = "killer tomato plant"
mutants = null
can_self_harvest = 1
has_mob_product = /mob/living/simple_animal/tomato
product_type = /mob/living/simple_animal/tomato
/datum/seed/tomato/killer/setup_traits()
..()
+7 -6
View File
@@ -23,13 +23,14 @@ var/global/list/plant_seed_sprites = list()
//Updates strings and icon appropriately based on seed datum.
/obj/item/seeds/proc/update_appearance()
if(!seed) return
if(!seed)
return
// Update icon.
cut_overlays()
var/is_seeds = ((seed.seed_noun in list("seeds","pits","nodes")) ? 1 : 0)
var/is_seeds = ((seed.seed_noun in list(SEED_NOUN_SEEDS, SEED_NOUN_PITS, SEED_NOUN_NODES)) ? 1 : 0)
var/image/seed_mask
var/seed_base_key = "base-[is_seeds ? seed.get_trait(TRAIT_PLANT_COLOUR) : "spores"]"
var/seed_base_key = "base-[is_seeds ? seed.get_trait(TRAIT_PLANT_COLOUR) : SEED_NOUN_SPORES]"
if(plant_seed_sprites[seed_base_key])
seed_mask = plant_seed_sprites[seed_base_key]
else
@@ -52,10 +53,10 @@ var/global/list/plant_seed_sprites = list()
if(is_seeds)
src.name = "packet of [seed.seed_name] [seed.seed_noun]"
src.desc = "It has a picture of [seed.display_name] on the front."
src.desc = "It has a picture of \a [seed.display_name] on the front."
else
src.name = "sample of [seed.seed_name] [seed.seed_noun]"
src.desc = "It's labelled as coming from [seed.display_name]."
src.desc = "It's labelled as coming from \a [seed.display_name]."
/obj/item/seeds/examine(mob/user)
..(user)
@@ -63,7 +64,7 @@ var/global/list/plant_seed_sprites = list()
to_chat(user, "It's tagged as variety #[seed.uid].")
/obj/item/seeds/cutting
name = "cuttings"
name = SEED_NOUN_CUTTINGS
desc = "Some plant cuttings."
/obj/item/seeds/cutting/update_appearance()
+5 -2
View File
@@ -21,7 +21,7 @@
name = "Seed storage"
desc = "It stores, sorts, and dispenses seeds."
icon = 'icons/obj/vending.dmi'
icon_state = "seeds"
icon_state = SEED_NOUN_SEEDS
density = 1
anchored = 1
use_power = 1
@@ -91,7 +91,10 @@
/obj/item/seeds/wheatseed = 3,
/obj/item/seeds/whitebeetseed = 3,
/obj/item/seeds/wulumunushaseed = 2,
/obj/item/seeds/ylpha = 2
/obj/item/seeds/ylpha = 2,
/obj/item/seeds/clam = 15,
/obj/item/seeds/barnacle = 15,
/obj/item/seeds/mollusc = 15
)
/obj/machinery/seed_storage/xenobotany
@@ -106,8 +106,8 @@
growth_type = 2 // Vines by default.
if(seed.get_trait(TRAIT_CARNIVOROUS) == 2)
growth_type = 1 // WOOOORMS.
else if(!(seed.seed_noun in list("seeds","pits")))
if(seed.seed_noun == "nodes")
else if(!(seed.seed_noun in list(SEED_NOUN_SEEDS,SEED_NOUN_PITS)))
if(seed.seed_noun == SEED_NOUN_NODES)
growth_type = 3 // Biomass
else
growth_type = 4 // Mold
+8 -3
View File
@@ -1,5 +1,6 @@
/obj/machinery/portable_atmospherics/hydroponics
name = "hydroponics tray"
desc = "A mechanical basin designed to nurture plants and other aquatic life. It has various useful sensors."
icon = 'icons/obj/hydroponics_machines.dmi'
icon_state = "hydrotray3"
density = 1
@@ -151,8 +152,7 @@
return ..()
/obj/machinery/portable_atmospherics/hydroponics/attack_ghost(var/mob/abstract/observer/user)
if(!(harvest && seed && seed.has_mob_product))
if(!(harvest && seed && ispath(seed.product_type, /mob)))
return
var/datum/ghosttrap/plant/G = get_ghost_trap("living plant")
@@ -328,7 +328,8 @@
//Clears out a dead plant.
/obj/machinery/portable_atmospherics/hydroponics/proc/remove_dead(var/mob/user)
if(!user || !dead) return
if(!user || !dead || !seed)
return
if(closed_system)
to_chat(user, "You can't remove the dead plant while the lid is shut.")
@@ -522,6 +523,10 @@
qdel(O)
return
if(S.seed.hydrotray_only && !mechanical)
to_chat(user, SPAN_WARNING("This packet can only be planted in a hydroponics tray."))
return
to_chat(user, "You plant the [S.seed.seed_name] [S.seed.seed_noun].")
lastproduce = 0
seed = S.seed //Grab the seed datum.
@@ -1,5 +1,6 @@
/obj/machinery/portable_atmospherics/hydroponics/soil
name = "soil"
desc = "A mound of earth. You could plant some seeds here."
icon_state = "soil"
density = 0
use_power = 0
@@ -47,6 +48,7 @@
// Hence using a blank icon.
/obj/machinery/portable_atmospherics/hydroponics/soil/invisible
name = "plant"
desc = null
icon = 'icons/obj/seeds.dmi'
icon_state = "blank"
+1 -1
View File
@@ -61,7 +61,7 @@ var/global/list/datum/supply_drop_loot/supply_drop
/obj/item/gun/projectile/automatic/rifle/z8)
/datum/supply_drop_loot/seeds
name = "Seeds"
name = SEED_NOUN_SEEDS
container = /obj/structure/closet/crate
/datum/supply_drop_loot/seeds/New()
..()
@@ -229,6 +229,11 @@
color = "#f5f4e9"
taste_description = "fish"
/datum/reagent/nutriment/protein/seafood/mollusc
name = "Mollusc Protein"
taste_description = "cold, bitter slime"
hydration_factor = 6
/datum/reagent/nutriment/protein/egg // Also bad for skrell.
name = "Egg Yolk"
color = "#FFFFAA"
@@ -22,3 +22,82 @@
/obj/item/reagent_containers/food/snacks/fish/fishfillet
name = "fish fillet"
desc = "A fillet of fish."
/obj/item/reagent_containers/food/snacks/fish/mollusc
name = "slimy meat"
desc = "Some slimy meat from clams or molluscs."
fish_type = "mollusc"
reagents_to_add = list(/datum/reagent/nutriment/protein/seafood/mollusc = 3)
/obj/item/reagent_containers/food/snacks/fish/mollusc/clam
fish_type = "clam"
/obj/item/reagent_containers/food/snacks/fish/mollusc/barnacle
fish_type = "barnacle"
// Molluscs!
/obj/item/trash/mollusc_shell
name = "mollusc shell"
icon = 'icons/obj/molluscs.dmi'
icon_state = "mollusc_shell"
desc = "The cracked shell of an unfortunate mollusc."
/obj/item/trash/mollusc_shell/clam
name = "clamshell"
icon_state = "clam_shell"
/obj/item/trash/mollusc_shell/barnacle
name = "barnacle shell"
icon_state = "barnacle_shell"
/obj/item/mollusc
name = "mollusc"
w_class = ITEMSIZE_TINY
desc = "A small slimy mollusc. Fresh!"
desc_info = "You will need a sharp or edged implement to pry it open. You can also try opening it in your hand if you're strong enough."
icon = 'icons/obj/molluscs.dmi'
icon_state = "mollusc"
var/meat_type = /obj/item/reagent_containers/food/snacks/fish/mollusc
var/shell_type = /obj/item/trash/mollusc_shell
/obj/item/mollusc/barnacle
name = "barnacle"
desc = "A hull barnacle, probably freshly scraped off a spaceship."
icon_state = "barnacle"
meat_type = /obj/item/reagent_containers/food/snacks/fish/mollusc/barnacle
shell_type = /obj/item/trash/mollusc_shell/barnacle
/obj/item/mollusc/clam
name = "clam"
desc = "A free-ranging space clam."
icon_state = "clam"
meat_type = /obj/item/reagent_containers/food/snacks/fish/mollusc/clam
shell_type = /obj/item/trash/mollusc_shell/clam
/obj/item/mollusc/proc/crack_shell(var/mob/user)
playsound(loc, /decl/sound_category/pickaxe_sound, 40, TRUE)
if(user && loc == user)
user.drop_from_inventory(src)
if(meat_type)
var/obj/item/meat = new meat_type(get_turf(src))
if(user)
user.put_in_hands(meat)
if(shell_type)
var/obj/item/shell = new shell_type(get_turf(src))
if(user)
user.put_in_hands(shell)
qdel(src)
/obj/item/mollusc/attack_self(mob/user)
if(isvaurca(user) || isipc(user) || isunathi(user))
user.visible_message("<b>[user]</b> cracks open \the [src] with their hands.", SPAN_NOTICE("You crack open \the [src] with your hands."))
crack_shell(user)
return
return ..()
/obj/item/mollusc/attackby(var/obj/item/thing, var/mob/user)
if(thing.sharp || thing.edge)
user.visible_message("<b>[user]</b> cracks open \the [src] with \the [thing].", SPAN_NOTICE("You crack open \the [src] with \the [thing]."))
crack_shell(user)
return
return ..()