From 484eb0bba44d3e014873e7d7026a99d7ba56f7b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Mon, 26 Oct 2020 23:19:46 +0100 Subject: [PATCH] Botany (#2357) * plants and seeds go brrrr * update plants * P L A N T * brrrr * Hydroponics actually work! How about that? * Reuse resource path in visualizer * They lied to us. * Several stuffs * more werk * Add a bunch of plants * Logs go brr. * Brrr moment. * Remove unused method * Important comment. * Seed inventory, yo! * tomato moment * Balance consumption * Makes hydroponics pourable * Adds plant metabolism effect for sugar, the same as glucose. * Eggplant moment * Apple moment * Corn moment * Chanterelle mushroom moment * prototype tweaks * Seed extractor moment * typo * IPlantMetabolizable doc improvement * I should trust my gut instinct more often. * egg-plant..... * localization * Make WaterLevel and NutritionLevel setters private * Less code repetition! Wooo! --- .../Components/Atmos/FireVisualizer.cs | 20 + .../Botany/PlantHolderVisualizer.cs | 105 +++ .../Nutrition/CreamPiedVisualizer.cs | 27 + Content.Server/Atmos/GasMixture.cs | 2 + Content.Server/Botany/Seed.cs | 354 ++++++++ .../PlantMetabolism/AdjustAttribute.cs | 49 + .../Chemistry/PlantMetabolism/AdjustHealth.cs | 20 + .../PlantMetabolism/AdjustMutationLevel.cs | 19 + .../PlantMetabolism/AdjustMutationMod.cs | 19 + .../PlantMetabolism/AdjustNutrition.cs | 21 + .../Chemistry/PlantMetabolism/AdjustPests.cs | 19 + .../Chemistry/PlantMetabolism/AdjustToxins.cs | 20 + .../Chemistry/PlantMetabolism/AdjustWater.cs | 20 + .../Chemistry/PlantMetabolism/AdjustWeeds.cs | 20 + .../Chemistry/PlantMetabolism/AffectGrowth.cs | 19 + .../Chemistry/PlantMetabolism/Clonexadone.cs | 38 + .../Chemistry/PlantMetabolism/Diethylamine.cs | 45 + .../PlantMetabolism/RobustHarvest.cs | 47 + .../Components/AnchorableComponent.cs | 21 +- .../Components/Botany/BotanySharpComponent.cs | 10 + .../Components/Botany/HoeComponent.cs | 10 + .../Components/Botany/LogComponent.cs | 35 + .../Components/Botany/PlantHolderComponent.cs | 850 ++++++++++++++++++ .../Botany/PlantSampleTakerComponent.cs | 10 + .../Components/Botany/ProduceComponent.cs | 64 ++ .../Components/Botany/SeedComponent.cs | 56 ++ .../Botany/SeedExtractorComponent.cs | 56 ++ .../Components/Fluids/SprayComponent.cs | 2 + .../GameObjects/EntitySystems/PlantSystem.cs | 70 ++ Content.Shared/Chemistry/ReagentPrototype.cs | 25 +- .../Components/Botany/PlantHolderVisuals.cs | 16 + .../Components/SharedStackComponent.cs | 1 + .../Chemistry/IPlantMetabolizable.cs | 17 + .../Utility/EntityPrototypeHelpers.cs | 32 + .../Atmospherics/{gasses.yml => gases.yml} | 0 .../Catalog/VendingMachines/seeds.yml | 13 + .../Constructible/Power/seed_extractor.yml | 28 + .../Entities/Constructible/hydroponics.yml | 47 + .../Entities/Mobs/Species/human.yml | 2 + .../Entities/Objects/Consumable/botany.yml | 212 +++++ .../Entities/Objects/Consumable/food.yml | 21 +- .../Entities/Objects/Consumable/trash.yml | 6 +- .../Entities/Objects/Misc/utensils.yml | 5 +- .../Entities/Objects/Specific/seeds.yml | 142 +++ .../Entities/Objects/Tools/botany_tools.yml | 100 +++ .../Entities/Objects/Tools/tools.yml | 1 + .../Prototypes/Entities/Objects/materials.yml | 21 +- Resources/Prototypes/Hydroponics/seeds.yml | 288 ++++++ Resources/Prototypes/Reagents/chemicals.yml | 175 ++++ Resources/Prototypes/Reagents/drinks.yml | 19 +- Resources/Prototypes/Reagents/elements.yml | 36 + Resources/Prototypes/Reagents/medicine.yml | 21 + .../Recipes/Cooking/meal_recipes.yml | 4 +- .../Recipes/Reactions/chemicals.yml | 44 + .../hydro_tools.rsi/claypot-item.png | Bin 0 -> 375 bytes .../hydro_tools.rsi/claypot-large.png | Bin 0 -> 394 bytes .../Hydroponics/hydro_tools.rsi/claypot.png | Bin 0 -> 377 bytes .../hydro_tools.rsi/cyan black stripe.png | Bin 0 -> 659 bytes .../hydro_tools.rsi/cyan blue stripe.png | Bin 0 -> 653 bytes .../hydro_tools.rsi/cyan lime stripe.png | Bin 0 -> 662 bytes .../hydro_tools.rsi/cyan purple stripe.png | Bin 0 -> 655 bytes .../hydro_tools.rsi/cyan red stripe.png | Bin 0 -> 664 bytes .../hydro_tools.rsi/cyan white stripe.png | Bin 0 -> 672 bytes .../hydro_tools.rsi/cyan yellow stripe.png | Bin 0 -> 668 bytes .../Hydroponics/hydro_tools.rsi/cyan.png | Bin 0 -> 660 bytes .../hydro_tools.rsi/deathspray.png | Bin 0 -> 354 bytes .../Hydroponics/hydro_tools.rsi/disk.png | Bin 0 -> 355 bytes .../hydro_tools.rsi/green black stripe.png | Bin 0 -> 680 bytes .../hydro_tools.rsi/green blue stripe.png | Bin 0 -> 692 bytes .../hydro_tools.rsi/green lime stripe.png | Bin 0 -> 693 bytes .../hydro_tools.rsi/green purple stripe.png | Bin 0 -> 684 bytes .../hydro_tools.rsi/green red stripe.png | Bin 0 -> 673 bytes .../hydro_tools.rsi/green white stripe.png | Bin 0 -> 682 bytes .../hydro_tools.rsi/green yellow stripe.png | Bin 0 -> 677 bytes .../Hydroponics/hydro_tools.rsi/hatchet.png | Bin 0 -> 555 bytes .../Hydroponics/hydro_tools.rsi/hoe.png | Bin 0 -> 601 bytes .../hydro_tools.rsi/hydrocover.png | Bin 0 -> 1406 bytes .../Hydroponics/hydro_tools.rsi/hydrotray.png | Bin 0 -> 338 bytes .../hydro_tools.rsi/hydrotray2.png | Bin 0 -> 543 bytes .../hydro_tools.rsi/hydrotray3.png | Bin 0 -> 547 bytes .../Hydroponics/hydro_tools.rsi/meta.json | 1 + .../hydro_tools.rsi/moldcreep0.png | Bin 0 -> 307 bytes .../hydro_tools.rsi/moldcreep1.png | Bin 0 -> 504 bytes .../hydro_tools.rsi/moldcreep2.png | Bin 0 -> 856 bytes .../hydro_tools.rsi/nolabelspray.png | Bin 0 -> 299 bytes .../hydro_tools.rsi/over_alert3.png | Bin 0 -> 235 bytes .../hydro_tools.rsi/over_harvest3.png | Bin 0 -> 260 bytes .../hydro_tools.rsi/over_lowhealth3.png | Bin 0 -> 250 bytes .../hydro_tools.rsi/over_lownutri.png | Bin 0 -> 137 bytes .../hydro_tools.rsi/over_lownutri3.png | Bin 0 -> 300 bytes .../hydro_tools.rsi/over_lowwater3.png | Bin 0 -> 306 bytes .../Hydroponics/hydro_tools.rsi/pestspray.png | Bin 0 -> 368 bytes .../Hydroponics/hydro_tools.rsi/plantbag.png | Bin 0 -> 663 bytes .../hydro_tools.rsi/plantbgone.png | Bin 0 -> 274 bytes .../hydro_tools.rsi/portaseeder.png | Bin 0 -> 683 bytes .../Hydroponics/hydro_tools.rsi/scythe.png | Bin 0 -> 450 bytes .../Hydroponics/hydro_tools.rsi/seedbag.png | Bin 0 -> 585 bytes .../hydro_tools.rsi/sextractor.png | Bin 0 -> 1639 bytes .../Hydroponics/hydro_tools.rsi/soil.png | Bin 0 -> 435 bytes .../hydro_tools.rsi/spaceworms.png | Bin 0 -> 3552 bytes .../Hydroponics/hydro_tools.rsi/spawner.png | Bin 0 -> 113 bytes .../hydro_tools.rsi/sprayparts.png | Bin 0 -> 353 bytes .../hydro_tools.rsi/traitcopier.png | Bin 0 -> 853 bytes .../Hydroponics/hydro_tools.rsi/traitgun.png | Bin 0 -> 600 bytes .../hydro_tools.rsi/traitscanner.png | Bin 0 -> 592 bytes .../hydro_tools.rsi/vine_flowers.png | Bin 0 -> 172 bytes .../hydro_tools.rsi/vine_fruit.png | Bin 0 -> 150 bytes .../Hydroponics/hydro_tools.rsi/weedspray.png | Bin 0 -> 335 bytes .../Consumable/Food/banana.rsi/icon.png | Bin 488 -> 0 bytes .../Consumable/Food/banana.rsi/meta.json | 28 - .../Consumable/Food/banana.rsi/peel.png | Bin 445 -> 0 bytes .../Specific/Hydroponics/apple.rsi/dead.png | Bin 0 -> 390 bytes .../Hydroponics/apple.rsi/harvest.png | Bin 0 -> 668 bytes .../Specific/Hydroponics/apple.rsi/meta.json | 1 + .../Hydroponics/apple.rsi/produce.png | Bin 0 -> 378 bytes .../Specific/Hydroponics/apple.rsi/seed.png | Bin 0 -> 268 bytes .../Hydroponics/apple.rsi/stage-1.png | Bin 0 -> 148 bytes .../Hydroponics/apple.rsi/stage-2.png | Bin 0 -> 172 bytes .../Hydroponics/apple.rsi/stage-3.png | Bin 0 -> 203 bytes .../Hydroponics/apple.rsi/stage-4.png | Bin 0 -> 265 bytes .../Hydroponics/apple.rsi/stage-5.png | Bin 0 -> 499 bytes .../Hydroponics/apple.rsi/stage-6.png | Bin 0 -> 584 bytes .../Specific/Hydroponics/banana.rsi/dead.png | Bin 0 -> 593 bytes .../Hydroponics/banana.rsi/harvest.png | Bin 0 -> 626 bytes .../Specific/Hydroponics/banana.rsi/meta.json | 1 + .../Specific/Hydroponics/banana.rsi/peel.png | Bin 0 -> 448 bytes .../Hydroponics/banana.rsi/produce.png | Bin 0 -> 488 bytes .../Specific/Hydroponics/banana.rsi/seed.png | Bin 0 -> 379 bytes .../Hydroponics/banana.rsi/stage-1.png | Bin 0 -> 152 bytes .../Hydroponics/banana.rsi/stage-2.png | Bin 0 -> 214 bytes .../Hydroponics/banana.rsi/stage-3.png | Bin 0 -> 287 bytes .../Hydroponics/banana.rsi/stage-4.png | Bin 0 -> 377 bytes .../Hydroponics/banana.rsi/stage-5.png | Bin 0 -> 427 bytes .../Hydroponics/banana.rsi/stage-6.png | Bin 0 -> 554 bytes .../Specific/Hydroponics/carrot.rsi/dead.png | Bin 0 -> 688 bytes .../Hydroponics/carrot.rsi/harvest.png | Bin 0 -> 369 bytes .../Specific/Hydroponics/carrot.rsi/meta.json | 1 + .../Hydroponics/carrot.rsi/produce.png | Bin 0 -> 695 bytes .../Specific/Hydroponics/carrot.rsi/seed.png | Bin 0 -> 354 bytes .../Hydroponics/carrot.rsi/stage-1.png | Bin 0 -> 169 bytes .../Hydroponics/carrot.rsi/stage-2.png | Bin 0 -> 260 bytes .../Hydroponics/carrot.rsi/stage-3.png | Bin 0 -> 369 bytes .../Hydroponics/chanterelle.rsi/dead.png | Bin 0 -> 623 bytes .../Hydroponics/chanterelle.rsi/harvest.png | Bin 0 -> 472 bytes .../Hydroponics/chanterelle.rsi/meta.json | 1 + .../Hydroponics/chanterelle.rsi/produce.png | Bin 0 -> 405 bytes .../Hydroponics/chanterelle.rsi/seed.png | Bin 0 -> 586 bytes .../Hydroponics/chanterelle.rsi/stage-1.png | Bin 0 -> 274 bytes .../Hydroponics/chanterelle.rsi/stage-2.png | Bin 0 -> 344 bytes .../Hydroponics/chanterelle.rsi/stage-3.png | Bin 0 -> 472 bytes .../Specific/Hydroponics/corn.rsi/cob.png | Bin 0 -> 373 bytes .../Specific/Hydroponics/corn.rsi/dead.png | Bin 0 -> 456 bytes .../Specific/Hydroponics/corn.rsi/harvest.png | Bin 0 -> 456 bytes .../Specific/Hydroponics/corn.rsi/meta.json | 1 + .../Specific/Hydroponics/corn.rsi/produce.png | Bin 0 -> 482 bytes .../Hydroponics/corn.rsi/produce_big.png | Bin 0 -> 359 bytes .../Specific/Hydroponics/corn.rsi/seed.png | Bin 0 -> 270 bytes .../Specific/Hydroponics/corn.rsi/stage-1.png | Bin 0 -> 162 bytes .../Specific/Hydroponics/corn.rsi/stage-2.png | Bin 0 -> 191 bytes .../Specific/Hydroponics/corn.rsi/stage-3.png | Bin 0 -> 362 bytes .../Hydroponics/eggplant.rsi/dead.png | Bin 0 -> 510 bytes .../Hydroponics/eggplant.rsi/harvest.png | Bin 0 -> 665 bytes .../Hydroponics/eggplant.rsi/meta.json | 1 + .../Hydroponics/eggplant.rsi/produce.png | Bin 0 -> 343 bytes .../Hydroponics/eggplant.rsi/seed.png | Bin 0 -> 321 bytes .../Hydroponics/eggplant.rsi/stage-1.png | Bin 0 -> 140 bytes .../Hydroponics/eggplant.rsi/stage-2.png | Bin 0 -> 179 bytes .../Hydroponics/eggplant.rsi/stage-3.png | Bin 0 -> 233 bytes .../Hydroponics/eggplant.rsi/stage-4.png | Bin 0 -> 348 bytes .../Hydroponics/eggplant.rsi/stage-5.png | Bin 0 -> 412 bytes .../Hydroponics/eggplant.rsi/stage-6.png | Bin 0 -> 462 bytes .../Specific/Hydroponics/eggy.rsi/dead.png | Bin 0 -> 510 bytes .../Specific/Hydroponics/eggy.rsi/harvest.png | Bin 0 -> 572 bytes .../Specific/Hydroponics/eggy.rsi/meta.json | 1 + .../Specific/Hydroponics/eggy.rsi/produce.png | Bin 0 -> 289 bytes .../Specific/Hydroponics/eggy.rsi/seed.png | Bin 0 -> 217 bytes .../Specific/Hydroponics/eggy.rsi/stage-1.png | Bin 0 -> 140 bytes .../Specific/Hydroponics/eggy.rsi/stage-2.png | Bin 0 -> 179 bytes .../Specific/Hydroponics/eggy.rsi/stage-3.png | Bin 0 -> 233 bytes .../Specific/Hydroponics/eggy.rsi/stage-4.png | Bin 0 -> 348 bytes .../Specific/Hydroponics/eggy.rsi/stage-5.png | Bin 0 -> 412 bytes .../Specific/Hydroponics/eggy.rsi/stage-6.png | Bin 0 -> 462 bytes .../Specific/Hydroponics/lemon.rsi/dead.png | Bin 0 -> 406 bytes .../Hydroponics/lemon.rsi/harvest.png | Bin 0 -> 665 bytes .../Specific/Hydroponics/lemon.rsi/meta.json | 1 + .../Hydroponics/lemon.rsi/produce.png | Bin 0 -> 308 bytes .../Specific/Hydroponics/lemon.rsi/seed.png | Bin 0 -> 246 bytes .../Hydroponics/lemon.rsi/stage-1.png | Bin 0 -> 149 bytes .../Hydroponics/lemon.rsi/stage-2.png | Bin 0 -> 172 bytes .../Hydroponics/lemon.rsi/stage-3.png | Bin 0 -> 203 bytes .../Hydroponics/lemon.rsi/stage-4.png | Bin 0 -> 312 bytes .../Hydroponics/lemon.rsi/stage-5.png | Bin 0 -> 512 bytes .../Hydroponics/lemon.rsi/stage-6.png | Bin 0 -> 550 bytes .../Specific/Hydroponics/potato.rsi/dead.png | Bin 0 -> 293 bytes .../Hydroponics/potato.rsi/harvest.png | Bin 0 -> 515 bytes .../Specific/Hydroponics/potato.rsi/meta.json | 1 + .../Hydroponics/potato.rsi/produce.png | Bin 0 -> 533 bytes .../Specific/Hydroponics/potato.rsi/seed.png | Bin 0 -> 302 bytes .../Hydroponics/potato.rsi/stage-1.png | Bin 0 -> 152 bytes .../Hydroponics/potato.rsi/stage-2.png | Bin 0 -> 268 bytes .../Hydroponics/potato.rsi/stage-3.png | Bin 0 -> 363 bytes .../Hydroponics/potato.rsi/stage-4.png | Bin 0 -> 443 bytes .../Specific/Hydroponics/seeds.rsi/meta.json | 1 + .../Hydroponics/seeds.rsi/mycelium-empty.png | Bin 0 -> 525 bytes .../Hydroponics/seeds.rsi/produce.png | Bin 0 -> 340 bytes .../Hydroponics/seeds.rsi/seed-alien1.png | Bin 0 -> 204 bytes .../Hydroponics/seeds.rsi/seed-alien2.png | Bin 0 -> 208 bytes .../Hydroponics/seeds.rsi/seed-alien3.png | Bin 0 -> 207 bytes .../Hydroponics/seeds.rsi/seed-alien4.png | Bin 0 -> 210 bytes .../Hydroponics/seeds.rsi/seed-synthbrain.png | Bin 0 -> 252 bytes .../Specific/Hydroponics/seeds.rsi/seed.png | Bin 0 -> 278 bytes .../Hydroponics/sugarcane.rsi/dead.png | Bin 0 -> 326 bytes .../Hydroponics/sugarcane.rsi/harvest.png | Bin 0 -> 284 bytes .../Hydroponics/sugarcane.rsi/meta.json | 1 + .../Hydroponics/sugarcane.rsi/produce.png | Bin 0 -> 402 bytes .../Hydroponics/sugarcane.rsi/seed.png | Bin 0 -> 257 bytes .../Hydroponics/sugarcane.rsi/stage-1.png | Bin 0 -> 142 bytes .../Hydroponics/sugarcane.rsi/stage-2.png | Bin 0 -> 200 bytes .../Hydroponics/sugarcane.rsi/stage-3.png | Bin 0 -> 247 bytes .../Specific/Hydroponics/tomato.rsi/dead.png | Bin 0 -> 343 bytes .../Hydroponics/tomato.rsi/harvest.png | Bin 0 -> 647 bytes .../Specific/Hydroponics/tomato.rsi/meta.json | 1 + .../Hydroponics/tomato.rsi/produce.png | Bin 0 -> 263 bytes .../Specific/Hydroponics/tomato.rsi/seed.png | Bin 0 -> 311 bytes .../Hydroponics/tomato.rsi/stage-1.png | Bin 0 -> 174 bytes .../Hydroponics/tomato.rsi/stage-2.png | Bin 0 -> 143 bytes .../Hydroponics/tomato.rsi/stage-3.png | Bin 0 -> 225 bytes .../Hydroponics/tomato.rsi/stage-4.png | Bin 0 -> 336 bytes .../Hydroponics/tomato.rsi/stage-5.png | Bin 0 -> 462 bytes .../Hydroponics/tomato.rsi/stage-6.png | Bin 0 -> 514 bytes .../Hydroponics/towercap.rsi/dead.png | Bin 0 -> 508 bytes .../Hydroponics/towercap.rsi/harvest.png | Bin 0 -> 524 bytes .../Hydroponics/towercap.rsi/meta.json | 1 + .../Hydroponics/towercap.rsi/produce.png | Bin 0 -> 605 bytes .../Hydroponics/towercap.rsi/seed.png | Bin 0 -> 600 bytes .../Hydroponics/towercap.rsi/stage-1.png | Bin 0 -> 334 bytes .../Hydroponics/towercap.rsi/stage-2.png | Bin 0 -> 435 bytes .../Hydroponics/towercap.rsi/stage-3.png | Bin 0 -> 524 bytes .../Specific/Hydroponics/wheat.rsi/dead.png | Bin 0 -> 581 bytes .../Hydroponics/wheat.rsi/harvest.png | Bin 0 -> 1173 bytes .../Specific/Hydroponics/wheat.rsi/meta.json | 1 + .../Hydroponics/wheat.rsi/produce.png | Bin 0 -> 936 bytes .../Specific/Hydroponics/wheat.rsi/seed.png | Bin 0 -> 271 bytes .../Hydroponics/wheat.rsi/stage-1.png | Bin 0 -> 368 bytes .../Hydroponics/wheat.rsi/stage-2.png | Bin 0 -> 561 bytes .../Hydroponics/wheat.rsi/stage-3.png | Bin 0 -> 737 bytes .../Hydroponics/wheat.rsi/stage-4.png | Bin 0 -> 830 bytes .../Hydroponics/wheat.rsi/stage-5.png | Bin 0 -> 1014 bytes .../Hydroponics/wheat.rsi/stage-6.png | Bin 0 -> 1023 bytes SpaceStation14.sln.DotSettings | 2 + 250 files changed, 3297 insertions(+), 72 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Botany/PlantHolderVisualizer.cs create mode 100644 Content.Server/Botany/Seed.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustAttribute.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustHealth.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustMutationLevel.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustMutationMod.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustNutrition.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustPests.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustToxins.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustWater.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AdjustWeeds.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/AffectGrowth.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/Clonexadone.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/Diethylamine.cs create mode 100644 Content.Server/Chemistry/PlantMetabolism/RobustHarvest.cs create mode 100644 Content.Server/GameObjects/Components/Botany/BotanySharpComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/HoeComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/LogComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/PlantSampleTakerComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/ProduceComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/SeedComponent.cs create mode 100644 Content.Server/GameObjects/Components/Botany/SeedExtractorComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/PlantSystem.cs create mode 100644 Content.Shared/GameObjects/Components/Botany/PlantHolderVisuals.cs create mode 100644 Content.Shared/Interfaces/Chemistry/IPlantMetabolizable.cs create mode 100644 Content.Shared/Utility/EntityPrototypeHelpers.cs rename Resources/Prototypes/Atmospherics/{gasses.yml => gases.yml} (100%) create mode 100644 Resources/Prototypes/Entities/Constructible/Power/seed_extractor.yml create mode 100644 Resources/Prototypes/Entities/Constructible/hydroponics.yml create mode 100644 Resources/Prototypes/Entities/Objects/Consumable/botany.yml create mode 100644 Resources/Prototypes/Entities/Objects/Specific/seeds.yml create mode 100644 Resources/Prototypes/Entities/Objects/Tools/botany_tools.yml create mode 100644 Resources/Prototypes/Hydroponics/seeds.yml create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot-item.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot-large.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan black stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan blue stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan lime stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan purple stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan red stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan white stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan yellow stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/deathspray.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/disk.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green black stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green blue stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green lime stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green purple stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green red stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green white stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green yellow stripe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hatchet.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hoe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrocover.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray2.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray3.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/meta.json create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep0.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep1.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep2.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/nolabelspray.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_alert3.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_harvest3.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lowhealth3.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lownutri.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lownutri3.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lowwater3.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/pestspray.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/plantbag.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/plantbgone.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/portaseeder.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/scythe.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/seedbag.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/sextractor.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/soil.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/spaceworms.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/spawner.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/sprayparts.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitcopier.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitgun.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitscanner.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/vine_flowers.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/vine_fruit.png create mode 100644 Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/weedspray.png delete mode 100644 Resources/Textures/Objects/Consumable/Food/banana.rsi/icon.png delete mode 100644 Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Consumable/Food/banana.rsi/peel.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/peel.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-6.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/cob.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/produce_big.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-6.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-6.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-6.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/mycelium-empty.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-alien1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-alien2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-alien3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-alien4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-synthbrain.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-6.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-4.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png diff --git a/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs index 3ca9ed4388..fc5bfaf5af 100644 --- a/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs +++ b/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs @@ -1,22 +1,41 @@ using System; using Content.Shared.GameObjects.Components.Atmos; +using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Utility; using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Atmos { + [UsedImplicitly] public class FireVisualizer : AppearanceVisualizer { private int _fireStackAlternateState = 3; private string _normalState; private string _alternateState; + private string _sprite; + + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + var sprite = entity.GetComponent(); + + sprite.LayerMapReserveBlank(FireVisualLayers.Fire); + sprite.LayerSetVisible(FireVisualLayers.Fire, false); + } public override void LoadData(YamlMappingNode node) { base.LoadData(node); + if (node.TryGetNode("sprite", out var sprite)) + { + _sprite = sprite.AsString(); + } + if (node.TryGetNode("fireStackAlternateState", out var fireStack)) { _fireStackAlternateState = fireStack.AsInt(); @@ -52,6 +71,7 @@ namespace Content.Client.GameObjects.Components.Atmos { var sprite = component.Owner.GetComponent(); + sprite.LayerSetRSI(FireVisualLayers.Fire, _sprite); sprite.LayerSetVisible(FireVisualLayers.Fire, onFire); if(fireStacks > _fireStackAlternateState && !string.IsNullOrEmpty(_alternateState)) diff --git a/Content.Client/GameObjects/Components/Botany/PlantHolderVisualizer.cs b/Content.Client/GameObjects/Components/Botany/PlantHolderVisualizer.cs new file mode 100644 index 0000000000..568978ab8b --- /dev/null +++ b/Content.Client/GameObjects/Components/Botany/PlantHolderVisualizer.cs @@ -0,0 +1,105 @@ +using Content.Shared.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Utility; + +namespace Content.Client.GameObjects.Components.Botany +{ + [UsedImplicitly] + public class PlantHolderVisualizer : AppearanceVisualizer + { + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + var sprite = entity.GetComponent(); + + sprite.LayerMapReserveBlank(PlantHolderLayers.Plant); + sprite.LayerMapReserveBlank(PlantHolderLayers.HealthLight); + sprite.LayerMapReserveBlank(PlantHolderLayers.WaterLight); + sprite.LayerMapReserveBlank(PlantHolderLayers.NutritionLight); + sprite.LayerMapReserveBlank(PlantHolderLayers.AlertLight); + sprite.LayerMapReserveBlank(PlantHolderLayers.HarvestLight); + + var hydroTools = new ResourcePath("Constructible/Hydroponics/hydro_tools.rsi"); + + sprite.LayerSetSprite(PlantHolderLayers.HealthLight, + new SpriteSpecifier.Rsi(hydroTools, "over_lowhealth3")); + sprite.LayerSetSprite(PlantHolderLayers.WaterLight, + new SpriteSpecifier.Rsi(hydroTools, "over_lowwater3")); + sprite.LayerSetSprite(PlantHolderLayers.NutritionLight, + new SpriteSpecifier.Rsi(hydroTools, "over_lownutri3")); + sprite.LayerSetSprite(PlantHolderLayers.AlertLight, + new SpriteSpecifier.Rsi(hydroTools, "over_alert3")); + sprite.LayerSetSprite(PlantHolderLayers.HarvestLight, + new SpriteSpecifier.Rsi(hydroTools, "over_harvest3")); + + // Let's make those invisible for now. + sprite.LayerSetVisible(PlantHolderLayers.Plant, false); + sprite.LayerSetVisible(PlantHolderLayers.HealthLight, false); + sprite.LayerSetVisible(PlantHolderLayers.WaterLight, false); + sprite.LayerSetVisible(PlantHolderLayers.NutritionLight, false); + sprite.LayerSetVisible(PlantHolderLayers.AlertLight, false); + sprite.LayerSetVisible(PlantHolderLayers.HarvestLight, false); + + // Pretty unshaded lights! + sprite.LayerSetShader(PlantHolderLayers.HealthLight, "unshaded"); + sprite.LayerSetShader(PlantHolderLayers.WaterLight, "unshaded"); + sprite.LayerSetShader(PlantHolderLayers.NutritionLight, "unshaded"); + sprite.LayerSetShader(PlantHolderLayers.AlertLight, "unshaded"); + sprite.LayerSetShader(PlantHolderLayers.HarvestLight, "unshaded"); + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + + if (component.TryGetData(PlantHolderVisuals.Plant, out var specifier)) + { + var valid = !specifier.Equals(SpriteSpecifier.Invalid); + sprite.LayerSetVisible(PlantHolderLayers.Plant, valid); + if(valid) + sprite.LayerSetSprite(PlantHolderLayers.Plant, specifier); + } + + if (component.TryGetData(PlantHolderVisuals.HealthLight, out var health)) + { + sprite.LayerSetVisible(PlantHolderLayers.HealthLight, health); + } + + if (component.TryGetData(PlantHolderVisuals.WaterLight, out var water)) + { + sprite.LayerSetVisible(PlantHolderLayers.WaterLight, water); + } + + if (component.TryGetData(PlantHolderVisuals.NutritionLight, out var nutrition)) + { + sprite.LayerSetVisible(PlantHolderLayers.NutritionLight, nutrition); + } + + if (component.TryGetData(PlantHolderVisuals.AlertLight, out var alert)) + { + sprite.LayerSetVisible(PlantHolderLayers.AlertLight, alert); + } + + if (component.TryGetData(PlantHolderVisuals.HarvestLight, out var harvest)) + { + sprite.LayerSetVisible(PlantHolderLayers.HarvestLight, harvest); + } + } + } + + public enum PlantHolderLayers + { + Plant, + HealthLight, + WaterLight, + NutritionLight, + AlertLight, + HarvestLight, + } +} diff --git a/Content.Client/GameObjects/Components/Nutrition/CreamPiedVisualizer.cs b/Content.Client/GameObjects/Components/Nutrition/CreamPiedVisualizer.cs index 2bb5ad6541..d83e99165f 100644 --- a/Content.Client/GameObjects/Components/Nutrition/CreamPiedVisualizer.cs +++ b/Content.Client/GameObjects/Components/Nutrition/CreamPiedVisualizer.cs @@ -2,12 +2,38 @@ using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Nutrition { [UsedImplicitly] public class CreamPiedVisualizer : AppearanceVisualizer { + private string _state; + + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + var sprite = entity.GetComponent(); + + sprite.LayerMapReserveBlank(CreamPiedVisualLayers.Pie); + sprite.LayerSetRSI(CreamPiedVisualLayers.Pie, "Effects/creampie.rsi"); + sprite.LayerSetVisible(CreamPiedVisualLayers.Pie, false); + } + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + if (node.TryGetNode("state", out var otherNode)) + { + _state = otherNode.AsString(); + } + } + public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); @@ -23,6 +49,7 @@ namespace Content.Client.GameObjects.Components.Nutrition var sprite = component.Owner.GetComponent(); sprite.LayerSetVisible(CreamPiedVisualLayers.Pie, pied); + sprite.LayerSetState(CreamPiedVisualLayers.Pie, _state); } } diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index c8d795e572..425c5da204 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -22,6 +22,8 @@ namespace Content.Server.Atmos { private readonly AtmosphereSystem _atmosphereSystem; + public static GasMixture SpaceGas => new GasMixture() {Volume = 2500f, Immutable = true, Temperature = Atmospherics.TCMB}; + [ViewVariables] private float[] _moles = new float[Atmospherics.TotalNumberOfGases]; diff --git a/Content.Server/Botany/Seed.cs b/Content.Server/Botany/Seed.cs new file mode 100644 index 0000000000..03069a5fc0 --- /dev/null +++ b/Content.Server/Botany/Seed.cs @@ -0,0 +1,354 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Content.Server.GameObjects.Components.Botany; +using Content.Server.GameObjects.Components.Stack; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.Atmos; +using Content.Shared.Interfaces; +using Content.Shared.Utility; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Map; +using Robust.Shared.Maths; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Server.Botany +{ + public enum HarvestType : byte + { + NoRepeat, + Repeat, + SelfHarvest, + } + +/* + public enum PlantSpread : byte + { + NoSpread, + Creepers, + Vines, + } + + public enum PlantMutation : byte + { + NoMutation, + Mutable, + HighlyMutable, + } + + public enum PlantCarnivorous : byte + { + NotCarnivorous, + EatPests, + EatLivingBeings, + } + + public enum PlantJuicy : byte + { + NotJuicy, + Juicy, + Slippery, + } +*/ + + public struct SeedChemQuantity + { + public int Min; + public int Max; + public int PotencyDivisor; + } + + [Prototype("seed")] + public class Seed : IPrototype, IIndexedPrototype, IExposeData + { + private const string SeedPrototype = "SeedBase"; + + public string ID { get; private set; } + + /// + /// Unique identifier of this seed. Do NOT set this. + /// + public int Uid { get; internal set; } = -1; + + #region Tracking + [ViewVariables] public string Name { get; set; } + [ViewVariables] public string SeedName { get; set; } + [ViewVariables] public string SeedNoun { get; set; } + [ViewVariables] public string DisplayName { get; set; } + [ViewVariables] public bool RoundStart { get; private set; } + [ViewVariables] public bool Mysterious { get; set; } + [ViewVariables] public bool Immutable { get; set; } + #endregion + + #region Output + [ViewVariables] public List ProductPrototypes { get; set; } + [ViewVariables] public Dictionary Chemicals { get; set; } + [ViewVariables] public Dictionary ConsumeGasses { get; set; } + [ViewVariables]public Dictionary ExudeGasses { get; set; } + #endregion + + #region Tolerances + [ViewVariables] public float NutrientConsumption { get; set; } + [ViewVariables] public float WaterConsumption { get; set; } + [ViewVariables] public float IdealHeat { get; set; } + [ViewVariables] public float HeatTolerance { get; set; } + [ViewVariables] public float IdealLight { get; set; } + [ViewVariables] public float LightTolerance { get; set; } + [ViewVariables] public float ToxinsTolerance { get; set; } + [ViewVariables] public float LowPressureTolerance { get; set; } + [ViewVariables] public float HighPressureTolerance { get; set; } + [ViewVariables] public float PestTolerance { get; set; } + [ViewVariables] public float WeedTolerance { get; set; } + #endregion + + #region General traits + [ViewVariables] public float Endurance { get; set; } + [ViewVariables] public int Yield { get; set; } + [ViewVariables] public float Lifespan { get; set; } + [ViewVariables] public float Maturation { get; set; } + [ViewVariables] public float Production { get; set; } + [ViewVariables] public int GrowthStages { get; set; } + [ViewVariables] public HarvestType HarvestRepeat { get; set; } + [ViewVariables] public float Potency { get; set; } + // No, I'm not removing these. + //public PlantSpread Spread { get; set; } + //public PlantMutation Mutation { get; set; } + //public float AlterTemperature { get; set; } + //public PlantCarnivorous Carnivorous { get; set; } + //public bool Parasite { get; set; } + //public bool Hematophage { get; set; } + //public bool Thorny { get; set; } + //public bool Stinging { get; set; } + public bool Ligneous { get; set; } + // public bool Teleporting { get; set; } + // public PlantJuicy Juicy { get; set; } + #endregion + + #region Cosmetics + [ViewVariables]public ResourcePath PlantRsi { get; set; } + [ViewVariables] public string PlantIconState { get; set; } + [ViewVariables] public bool Bioluminescent { get; set; } + [ViewVariables] public Color BioluminescentColor { get; set; } + [ViewVariables] public string SplatPrototype { get; set; } + #endregion + + + public void ExposeData(ObjectSerializer serializer) + { + serializer.DataField(this, x => x.ID, "id", string.Empty); + serializer.DataField(this, x => x.Name, "name", string.Empty); + serializer.DataField(this, x => x.SeedName, "seedName", string.Empty); + serializer.DataField(this, x => x.SeedNoun, "seedNoun", "seeds"); + serializer.DataField(this, x => x.DisplayName, "displayName", string.Empty); + serializer.DataField(this, x => x.RoundStart, "roundStart", true); + serializer.DataField(this, x => x.Mysterious, "mysterious", false); + serializer.DataField(this, x => x.Immutable, "immutable", false); + serializer.DataField(this, x => x.ProductPrototypes, "productPrototypes", new List()); + serializer.DataField(this, x => x.Chemicals, "chemicals", new Dictionary()); + serializer.DataField(this, x => x.ConsumeGasses, "consumeGasses", new Dictionary()); + serializer.DataField(this, x => x.ExudeGasses, "exudeGasses", new Dictionary()); + serializer.DataField(this, x => x.NutrientConsumption, "nutrientConsumption", 0.25f); + serializer.DataField(this, x => x.WaterConsumption, "waterConsumption", 3f); + serializer.DataField(this, x => x.IdealHeat, "idealHeat", 293f); + serializer.DataField(this, x => x.HeatTolerance, "heatTolerance", 20f); + serializer.DataField(this, x => x.IdealLight, "idealLight", 7f); + serializer.DataField(this, x => x.LightTolerance, "lightTolerance", 5f); + serializer.DataField(this, x => x.ToxinsTolerance, "toxinsTolerance", 4f); + serializer.DataField(this, x => x.LowPressureTolerance, "lowPressureTolerance", 25f); + serializer.DataField(this, x => x.HighPressureTolerance, "highPressureTolerance", 200f); + serializer.DataField(this, x => x.PestTolerance, "pestTolerance", 5f); + serializer.DataField(this, x => x.WeedTolerance, "weedTolerance", 5f); + serializer.DataField(this, x => x.Endurance, "endurance", 100f); + serializer.DataField(this, x => x.Yield, "yield", 0); + serializer.DataField(this, x => x.Lifespan, "lifespan", 0f); + serializer.DataField(this, x => x.Maturation, "maturation", 0f); + serializer.DataField(this, x => x.Production, "production", 0f); + serializer.DataField(this, x => x.GrowthStages, "growthStages", 6); + serializer.DataField(this, x => x.HarvestRepeat, "harvestRepeat", HarvestType.NoRepeat); + serializer.DataField(this, x => x.Potency, "potency", 1f); + serializer.DataField(this, x => x.Ligneous, "ligneous", false); + serializer.DataField(this, x => x.PlantRsi, "plantRsi", null); + serializer.DataField(this, x => x.PlantIconState, "plantIconState", "produce"); + serializer.DataField(this, x => x.Bioluminescent, "bioluminescent", false); + serializer.DataField(this, x => x.BioluminescentColor, "bioluminescentColor", Color.White); + serializer.DataField(this, x => x.SplatPrototype, "splatPrototype", string.Empty); + } + + public void LoadFrom(YamlMappingNode mapping) + { + var serializer = YamlObjectSerializer.NewReader(mapping); + ExposeData(serializer); + } + + public Seed Clone() + { + var newSeed = new Seed() + { + ID = ID, + Name = Name, + SeedName = SeedName, + SeedNoun = SeedNoun, + RoundStart = RoundStart, + Mysterious = Mysterious, + + ProductPrototypes = new List(ProductPrototypes), + Chemicals = new Dictionary(Chemicals), + ConsumeGasses = new Dictionary(ConsumeGasses), + ExudeGasses = new Dictionary(ExudeGasses), + + NutrientConsumption = NutrientConsumption, + WaterConsumption = WaterConsumption, + IdealHeat = IdealHeat, + HeatTolerance = HeatTolerance, + IdealLight = IdealLight, + LightTolerance = LightTolerance, + ToxinsTolerance = ToxinsTolerance, + LowPressureTolerance = LowPressureTolerance, + HighPressureTolerance = HighPressureTolerance, + PestTolerance = PestTolerance, + WeedTolerance = WeedTolerance, + + Endurance = Endurance, + Yield = Yield, + Lifespan = Lifespan, + Maturation = Maturation, + Production = Production, + GrowthStages = GrowthStages, + HarvestRepeat = HarvestRepeat, + Potency = Potency, + + PlantRsi = PlantRsi, + PlantIconState = PlantIconState, + Bioluminescent = Bioluminescent, + BioluminescentColor = BioluminescentColor, + SplatPrototype = SplatPrototype, + }; + + return newSeed; + } + + public IEntity SpawnSeedPacket(EntityCoordinates transformCoordinates, IEntityManager entityManager = null) + { + entityManager ??= IoCManager.Resolve(); + + var seed = entityManager.SpawnEntity(SeedPrototype, transformCoordinates); + + var seedComp = seed.EnsureComponent(); + seedComp.Seed = this; + + if (seed.TryGetComponent(out SpriteComponent sprite)) + { + // Seed state will always be seed. Blame the spriter if that's not the case! + sprite.LayerSetSprite(0, new SpriteSpecifier.Rsi(PlantRsi, "seed")); + } + + seed.Name = Loc.GetString($"packet of {SeedName} {SeedNoun}"); + + return seed; + } + + private void AddToDatabase() + { + var plantSystem = EntitySystem.Get(); + if (plantSystem.AddSeedToDatabase(this)) + { + Name = Uid.ToString(); + } + } + + public IEnumerable AutoHarvest(EntityCoordinates position, int yieldMod = 1) + { + if (position.IsValid(IoCManager.Resolve()) && ProductPrototypes != null && + ProductPrototypes.Count > 0) + return GenerateProduct(position, yieldMod); + + return Enumerable.Empty(); + } + + public IEnumerable Harvest(IEntity user, int yieldMod = 1) + { + AddToDatabase(); + + if (user == null) + return Enumerable.Empty(); + + if (ProductPrototypes == null || ProductPrototypes.Count == 0 || Yield <= 0) + { + user.PopupMessageCursor(Loc.GetString("You fail to harvest anything useful.")); + return Enumerable.Empty(); + } + + user.PopupMessageCursor(Loc.GetString($"You harvest from the {DisplayName}")); + return GenerateProduct(user.Transform.Coordinates, yieldMod); + } + + public IEnumerable GenerateProduct(EntityCoordinates position, int yieldMod = 1) + { + var totalYield = 0; + if (Yield > -1) + { + if (yieldMod < 0) + { + yieldMod = 1; + totalYield = Yield; + } + else + { + totalYield = Yield * yieldMod; + } + + totalYield = Math.Max(1, totalYield); + } + + var random = IoCManager.Resolve(); + var entityManager = IoCManager.Resolve(); + + var products = new List(); + + for (var i = 0; i < totalYield; i++) + { + var product = random.Pick(ProductPrototypes); + + var entity = entityManager.SpawnEntity(product, position); + entity.RandomOffset(0.25f); + products.Add(entity); + + var produce = entity.EnsureComponent(); + + produce.Seed = this; + produce.Grown(); + + if (Mysterious) + { + entity.Name += "?"; + entity.Description += Loc.GetString(" On second thought, something about this one looks strange."); + } + } + + return products; + } + + public Seed Diverge(bool modified) + { + return Clone(); + } + + public bool CheckHarvest(IEntity user, IEntity held = null) + { + return (!Ligneous || (Ligneous && held != null && held.HasComponent())); + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustAttribute.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustAttribute.cs new file mode 100644 index 0000000000..8b1119df2b --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustAttribute.cs @@ -0,0 +1,49 @@ +#nullable enable +using System.Diagnostics.CodeAnalysis; +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Random; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + public abstract class AdjustAttribute : IPlantMetabolizable + { + [Dependency] private readonly IRobustRandom _robustRandom = default!; + + public float Amount { get; private set; } + public float Prob { get; private set; } + + public void ExposeData(ObjectSerializer serializer) + { + serializer.DataField(this, x => x.Amount, "amount", 1f); + serializer.DataField(this, x => x.Prob, "prob", 1f); + } + + /// + /// Checks if the plant holder can metabolize the reagent or not. Checks if it has an alive plant by default. + /// + /// The entity holding the plant + /// The plant holder component + /// Whether to check if it has an alive plant or not + /// + public bool CanMetabolize(IEntity plantHolder, [NotNullWhen(true)] out PlantHolderComponent? plantHolderComponent, bool mustHaveAlivePlant = true) + { + plantHolderComponent = null; + + if (plantHolder.Deleted || !plantHolder.TryGetComponent(out plantHolderComponent) + || mustHaveAlivePlant && (plantHolderComponent.Seed == null || plantHolderComponent.Dead)) + return false; + + if (Prob >= 1f) + return true; + + return !(Prob <= 0f) && _robustRandom.Prob(Prob); + } + + public abstract void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f); + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustHealth.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustHealth.cs new file mode 100644 index 0000000000..26ada887ea --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustHealth.cs @@ -0,0 +1,20 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustHealth : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp)) + return; + + plantHolderComp.Health += Amount; + plantHolderComp.CheckHealth(); + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustMutationLevel.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustMutationLevel.cs new file mode 100644 index 0000000000..c6813f68e3 --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustMutationLevel.cs @@ -0,0 +1,19 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustMutationLevel : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp, false)) + return; + + plantHolderComp.MutationLevel += Amount * plantHolderComp.MutationMod * customPlantMetabolism; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustMutationMod.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustMutationMod.cs new file mode 100644 index 0000000000..177c2fa72f --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustMutationMod.cs @@ -0,0 +1,19 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustMutationMod : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp)) + return; + + plantHolderComp.MutationMod += Amount; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustNutrition.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustNutrition.cs new file mode 100644 index 0000000000..5379b34322 --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustNutrition.cs @@ -0,0 +1,21 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustNutrition : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp, false)) + return; + + plantHolderComp.AdjustNutrient(Amount); + return; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustPests.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustPests.cs new file mode 100644 index 0000000000..be8a0efaf7 --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustPests.cs @@ -0,0 +1,19 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustPests : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp)) + return; + + plantHolderComp.PestLevel += Amount; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustToxins.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustToxins.cs new file mode 100644 index 0000000000..b05c6feb5a --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustToxins.cs @@ -0,0 +1,20 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustToxins : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp, false)) + return; + + plantHolderComp.Toxins += Amount; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustWater.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustWater.cs new file mode 100644 index 0000000000..481c2bcd60 --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustWater.cs @@ -0,0 +1,20 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustWater : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp, false)) + return; + + plantHolderComp.AdjustWater(Amount); + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AdjustWeeds.cs b/Content.Server/Chemistry/PlantMetabolism/AdjustWeeds.cs new file mode 100644 index 0000000000..1b9be2e74e --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AdjustWeeds.cs @@ -0,0 +1,20 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AdjustWeeds : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp, false)) + return; + + plantHolderComp.WeedLevel += Amount; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/AffectGrowth.cs b/Content.Server/Chemistry/PlantMetabolism/AffectGrowth.cs new file mode 100644 index 0000000000..dd1c3fb05f --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/AffectGrowth.cs @@ -0,0 +1,19 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class AffectGrowth : AdjustAttribute + { + public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (!CanMetabolize(plantHolder, out var plantHolderComp)) + return; + + plantHolderComp.AffectGrowth((int) Amount); + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/Clonexadone.cs b/Content.Server/Chemistry/PlantMetabolism/Clonexadone.cs new file mode 100644 index 0000000000..68ab5a2513 --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/Clonexadone.cs @@ -0,0 +1,38 @@ +#nullable enable +using System; +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class Clonexadone : IPlantMetabolizable + { + public void ExposeData(ObjectSerializer serializer) + { + } + + public void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1) + { + if (plantHolder.Deleted || !plantHolder.TryGetComponent(out PlantHolderComponent? plantHolderComp) + || plantHolderComp.Seed == null || plantHolderComp.Dead) + return; + + var deviation = 0; + var seed = plantHolderComp.Seed; + var random = IoCManager.Resolve(); + if (plantHolderComp.Age > seed.Maturation) + deviation = (int) Math.Max(seed.Maturation - 1, plantHolderComp.Age - random.Next(7, 10)); + else + deviation = (int) (seed.Maturation / seed.GrowthStages); + plantHolderComp.Age -= deviation; + plantHolderComp.SkipAging++; + plantHolderComp.ForceUpdate = true; + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/Diethylamine.cs b/Content.Server/Chemistry/PlantMetabolism/Diethylamine.cs new file mode 100644 index 0000000000..32a31961de --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/Diethylamine.cs @@ -0,0 +1,45 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Random; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class Diethylamine : IPlantMetabolizable + { + public void ExposeData(ObjectSerializer serializer) + { + } + + public void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1) + { + if (plantHolder.Deleted || !plantHolder.TryGetComponent(out PlantHolderComponent? plantHolderComp) + || plantHolderComp.Seed == null || plantHolderComp.Dead || + plantHolderComp.Seed.Immutable) + return; + + var random = IoCManager.Resolve(); + + var chance = MathHelper.Lerp(15f, 125f, plantHolderComp.Seed.Lifespan) * 2f * customPlantMetabolism; + if (random.Prob(chance)) + { + plantHolderComp.CheckForDivergence(true); + plantHolderComp.Seed.Lifespan++; + } + + chance = MathHelper.Lerp(15f, 125f, plantHolderComp.Seed.Endurance) * 2f * customPlantMetabolism; + if (random.Prob(chance)) + { + plantHolderComp.CheckForDivergence(true); + plantHolderComp.Seed.Endurance++; + } + } + } +} diff --git a/Content.Server/Chemistry/PlantMetabolism/RobustHarvest.cs b/Content.Server/Chemistry/PlantMetabolism/RobustHarvest.cs new file mode 100644 index 0000000000..98bbf61b27 --- /dev/null +++ b/Content.Server/Chemistry/PlantMetabolism/RobustHarvest.cs @@ -0,0 +1,47 @@ +#nullable enable +using Content.Server.GameObjects.Components.Botany; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Random; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.PlantMetabolism +{ + [UsedImplicitly] + public class RobustHarvest : IPlantMetabolizable + { + public void ExposeData(ObjectSerializer serializer) + { + } + + public void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f) + { + if (plantHolder.Deleted || !plantHolder.TryGetComponent(out PlantHolderComponent? plantHolderComp) + || plantHolderComp.Seed == null || plantHolderComp.Dead || + plantHolderComp.Seed.Immutable) + return; + + var random = IoCManager.Resolve(); + + var chance = MathHelper.Lerp(15f, 150f, plantHolderComp.Seed.Potency) * 3.5f * customPlantMetabolism; + + if (random.Prob(chance)) + { + plantHolderComp.CheckForDivergence(true); + plantHolderComp.Seed.Potency++; + } + + chance = MathHelper.Lerp(6f, 2f, plantHolderComp.Seed.Yield) * 0.15f * customPlantMetabolism; + + if (random.Prob(chance)) + { + plantHolderComp.CheckForDivergence(true); + plantHolderComp.Seed.Yield--; + } + } + } +} diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index c98cc33516..2fec6e340c 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -2,10 +2,12 @@ using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; +using Content.Server.Utility; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Components.Transform; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; @@ -17,18 +19,22 @@ namespace Content.Server.GameObjects.Components { public override string Name => "Anchorable"; - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - serializer.DataField(this, x => x.Tool, "tool", ToolQuality.Anchoring); - } - [ViewVariables] public ToolQuality Tool { get; private set; } = ToolQuality.Anchoring; [ViewVariables] int IInteractUsing.Priority => 1; + [ViewVariables(VVAccess.ReadWrite)] + public bool Snap { get; private set; } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(this, x => x.Tool, "tool", ToolQuality.Anchoring); + serializer.DataField(this, x => x.Snap, "snap", false); + } + /// /// Checks if a tool can change the anchored status. /// @@ -73,6 +79,9 @@ namespace Content.Server.GameObjects.Components var physics = Owner.GetComponent(); physics.Anchored = true; + if (Snap) + Owner.SnapToGrid(SnapGridOffset.Center, Owner.EntityManager); + return true; } diff --git a/Content.Server/GameObjects/Components/Botany/BotanySharpComponent.cs b/Content.Server/GameObjects/Components/Botany/BotanySharpComponent.cs new file mode 100644 index 0000000000..a185a20b2e --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/BotanySharpComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class BotanySharpComponent : Component + { + public override string Name => "BotanySharp"; + } +} diff --git a/Content.Server/GameObjects/Components/Botany/HoeComponent.cs b/Content.Server/GameObjects/Components/Botany/HoeComponent.cs new file mode 100644 index 0000000000..c92c347975 --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/HoeComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class HoeComponent : Component + { + public override string Name => "Hoe"; + } +} diff --git a/Content.Server/GameObjects/Components/Botany/LogComponent.cs b/Content.Server/GameObjects/Components/Botany/LogComponent.cs new file mode 100644 index 0000000000..3bebc0a902 --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/LogComponent.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces.GameObjects.Components; +using Content.Shared.Utility; +using Robust.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class LogComponent : Component, IInteractUsing + { + public override string Name => "Log"; + + public async Task InteractUsing(InteractUsingEventArgs eventArgs) + { + if (!ActionBlockerSystem.CanInteract(eventArgs.User)) + return false; + + if (eventArgs.Using.HasComponent()) + { + for (var i = 0; i < 2; i++) + { + var plank = Owner.EntityManager.SpawnEntity("WoodPlank1", Owner.Transform.Coordinates); + plank.RandomOffset(0.25f); + } + + Owner.Delete(); + + return true; + } + + return false; + } + } +} diff --git a/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs b/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs new file mode 100644 index 0000000000..2c1eb99033 --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs @@ -0,0 +1,850 @@ +#nullable enable +using System; +using System.Linq; +using System.Threading.Tasks; +using Content.Server.Atmos; +using Content.Server.Botany; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.GameObjects.Components.Fluids; +using Content.Server.GameObjects.Components.GUI; +using Content.Server.GameObjects.EntitySystems; +using Content.Server.Utility; +using Content.Shared.Audio; +using Content.Shared.Chemistry; +using Content.Shared.GameObjects.Components.Botany; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces; +using Content.Shared.Interfaces.GameObjects.Components; +using Content.Shared.Utility; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.ComponentDependencies; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Log; +using Robust.Shared.Maths; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class PlantHolderComponent : Component, IInteractUsing, IInteractHand, IActivate, IReagentReaction, IExamine + { + public const float HydroponicsSpeedMultiplier = 1f; + public const float HydroponicsConsumptionMultiplier = 4f; + + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + + public override string Name => "PlantHolder"; + + [ViewVariables] private int _lastProduce; + [ViewVariables(VVAccess.ReadWrite)] private int _missingGas; + private readonly TimeSpan _cycleDelay = TimeSpan.FromSeconds(15f); + [ViewVariables] private TimeSpan _lastCycle = TimeSpan.Zero; + [ViewVariables(VVAccess.ReadWrite)] private bool _updateSpriteAfterUpdate; + + [ViewVariables(VVAccess.ReadWrite)] + public bool DrawWarnings { get; private set; } = false; + + [ViewVariables(VVAccess.ReadWrite)] + public float WaterLevel { get; private set; } = 100f; + + [ViewVariables(VVAccess.ReadWrite)] + public float NutritionLevel { get; private set; } = 100f; + + [ViewVariables(VVAccess.ReadWrite)] + public float PestLevel { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public float WeedLevel { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public float Toxins { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public int Age { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public int SkipAging { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool Dead { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool Harvest { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool Sampled { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public int YieldMod { get; set; } = 1; + + [ViewVariables(VVAccess.ReadWrite)] + public float MutationMod { get; set; } = 1f; + + [ViewVariables(VVAccess.ReadWrite)] + public float MutationLevel { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public float Health { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public float WeedCoefficient { get; set; } = 1f; + + [ViewVariables(VVAccess.ReadWrite)] + public Seed? Seed { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool ImproperHeat { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool ImproperPressure { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool ImproperLight { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool ForceUpdate { get; set; } + + [ComponentDependency] private readonly SolutionContainerComponent? _solutionContainer = default!; + [ComponentDependency] private readonly AppearanceComponent? _appearanceComponent = default!; + + public override void Initialize() + { + base.Initialize(); + + if(!Owner.EnsureComponent(out var solution)) + Logger.Warning($"Entity {Owner} with a PlantHolderComponent did not have a SolutionContainerComponent."); + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(this, x => x.DrawWarnings, "drawWarnings", false); + } + + public void WeedInvasion() + { + // TODO + } + + public void Update() + { + UpdateReagents(); + + var curTime = _gameTiming.CurTime; + + if (ForceUpdate) + ForceUpdate = false; + else if (curTime < (_lastCycle + _cycleDelay)) + { + if(_updateSpriteAfterUpdate) + UpdateSprite(); + return; + } + + _lastCycle = curTime; + + + // Weeds like water and nutrients! They may appear even if there's not a seed planted. + if (WaterLevel > 10 && NutritionLevel > 2 && _random.Prob(Seed == null ? 0.05f : 0.01f)) + { + WeedLevel += 1 * HydroponicsSpeedMultiplier * WeedCoefficient; + + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + // There's a chance for a weed explosion to happen if weeds take over. + // Plants that are themselves weeds (WeedTolerance > 8) are unaffected. + if (WeedLevel >= 10 && _random.Prob(0.1f)) + { + if (Seed == null || WeedLevel >= Seed.WeedTolerance + 2) + WeedInvasion(); + } + + // If we have no seed planted, or the plant is dead, stop processing here. + if (Seed == null || Dead) + { + if (_updateSpriteAfterUpdate) + UpdateSprite(); + + return; + } + + // There's a small chance the pest population increases. + // Can only happen when there's a live seed planted. + if (_random.Prob(0.01f)) + { + PestLevel += 0.5f * HydroponicsSpeedMultiplier; + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + // Advance plant age here. + if (SkipAging > 0) + SkipAging--; + else + { + if(_random.Prob(0.8f)) + Age += (int)(1 * HydroponicsSpeedMultiplier); + + _updateSpriteAfterUpdate = true; + } + + // Nutrient consumption. + if (Seed.NutrientConsumption > 0 && NutritionLevel > 0 && _random.Prob(0.75f)) + { + NutritionLevel -= MathF.Max(0f, Seed.NutrientConsumption * HydroponicsSpeedMultiplier); + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + // Water consumption. + if (Seed.WaterConsumption > 0 && WaterLevel > 0 && _random.Prob(0.75f)) + { + WaterLevel -= MathF.Max(0f, Seed.NutrientConsumption * HydroponicsConsumptionMultiplier * HydroponicsSpeedMultiplier); + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + var healthMod = _random.Next(1, 3) * HydroponicsSpeedMultiplier; + + // Make sure the plant is not starving. + if (_random.Prob(0.35f)) + { + if (NutritionLevel > 2) + { + Health += healthMod; + } + else + { + AffectGrowth(-1); + Health -= healthMod; + } + + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + // Make sure the plant is not thirsty. + if (_random.Prob(0.35f)) + { + if (WaterLevel > 10) + { + Health += healthMod; + } + else + { + AffectGrowth(-1); + Health -= healthMod; + } + + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + var tileAtmos = Owner.Transform.Coordinates.GetTileAtmosphere(); + var environment = tileAtmos?.Air ?? GasMixture.SpaceGas; + + if (Seed.ConsumeGasses.Count > 0) + { + _missingGas = 0; + + foreach (var (gas, amount) in Seed.ConsumeGasses) + { + if (environment.GetMoles(gas) < amount) + { + _missingGas++; + continue; + } + + environment.AdjustMoles(gas, -amount); + } + + if (_missingGas > 0) + { + Health -= _missingGas * HydroponicsSpeedMultiplier; + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + } + + // Seed pressure resistance. + var pressure = environment.Pressure; + if (pressure < Seed.LowPressureTolerance || pressure > Seed.HighPressureTolerance) + { + Health -= healthMod; + ImproperPressure = true; + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + else + { + ImproperPressure = false; + } + + // Seed ideal temperature. + if (MathF.Abs(environment.Temperature - Seed.IdealHeat) > Seed.HeatTolerance) + { + Health -= healthMod; + ImproperHeat = true; + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + else + { + ImproperHeat = false; + } + + // Gas production. + var exudeCount = Seed.ExudeGasses.Count; + if (exudeCount > 0) + { + foreach (var (gas, amount) in Seed.ExudeGasses) + { + environment.AdjustMoles(gas, MathF.Max(1f, MathF.Round((amount * MathF.Round(Seed.Potency)) / exudeCount))); + } + } + + // Toxin levels beyond the plant's tolerance cause damage. + // They are, however, slowly reduced over time. + if (Toxins > 0) + { + var toxinUptake = MathF.Max(1, MathF.Round(Toxins / 10f)); + if (Toxins > Seed.ToxinsTolerance) + { + Health -= toxinUptake; + } + + Toxins -= toxinUptake; + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + // Weed levels. + if (PestLevel > 0) + { + // TODO: Carnivorous plants? + if (PestLevel > Seed.PestTolerance) + { + Health -= HydroponicsSpeedMultiplier; + } + + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + // Weed levels. + if (WeedLevel > 0) + { + // TODO: Parasitic plants. + if (WeedLevel >= Seed.WeedTolerance) + { + Health -= HydroponicsSpeedMultiplier; + } + + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + + if (Age > Seed.Lifespan) + { + Health -= _random.Next(3, 5) * HydroponicsSpeedMultiplier; + if (DrawWarnings) + _updateSpriteAfterUpdate = true; + } + else if(Age < 0) // Revert back to seed packet! + { + Seed.SpawnSeedPacket(Owner.Transform.Coordinates); + RemovePlant(); + ForceUpdate = true; + Update(); + } + + CheckHealth(); + + if (Harvest && Seed.HarvestRepeat == HarvestType.SelfHarvest) + AutoHarvest(); + + // If enough time has passed since the plant was harvested, we're ready to harvest again! + if (!Dead && Seed.ProductPrototypes.Count > 0) + { + if (Age > Seed.Production) + { + if ((Age - _lastProduce) > Seed.Production && !Harvest) + { + Harvest = true; + _lastProduce = Age; + } + } + else + { + if (Harvest) + { + Harvest = false; + _lastProduce = Age; + } + } + } + + CheckLevelSanity(); + + if(_updateSpriteAfterUpdate) + UpdateSprite(); + } + + private void CheckLevelSanity() + { + if (Seed != null) + Health = MathHelper.Clamp(Health, 0, Seed.Endurance); + else + { + Health = 0f; + Dead = false; + } + + MutationLevel = MathHelper.Clamp(MutationLevel, 0f, 100f); + NutritionLevel = MathHelper.Clamp(NutritionLevel, 0f, 100f); + WaterLevel = MathHelper.Clamp(WaterLevel, 0f, 100f); + PestLevel = MathHelper.Clamp(PestLevel, 0f, 10f); + WeedLevel = MathHelper.Clamp(WeedLevel, 0f, 10f); + Toxins = MathHelper.Clamp(Toxins, 0f, 100f); + YieldMod = MathHelper.Clamp(YieldMod, 0, 2); + MutationMod = MathHelper.Clamp(MutationMod, 0f, 3f); + } + + public bool DoHarvest(IEntity user) + { + if (Seed == null || user.Deleted || !ActionBlockerSystem.CanInteract(user)) + return false; + + if (Harvest && !Dead) + { + if (user.TryGetComponent(out HandsComponent? hands)) + { + if (!Seed.CheckHarvest(user, hands.GetActiveHand?.Owner)) + return false; + + } else if (!Seed.CheckHarvest(user)) + { + return false; + } + + Seed.Harvest(user, YieldMod); + AfterHarvest(); + return true; + } + + if (!Dead) return false; + + RemovePlant(); + AfterHarvest(); + return true; + } + + public void AutoHarvest() + { + if (Seed == null || !Harvest) + return; + + Seed.AutoHarvest(Owner.Transform.Coordinates); + AfterHarvest(); + } + + private void AfterHarvest() + { + Harvest = false; + _lastProduce = Age; + + if(Seed?.HarvestRepeat == HarvestType.NoRepeat) + RemovePlant(); + + CheckLevelSanity(); + UpdateSprite(); + } + + public void CheckHealth() + { + if (Health <= 0) + { + Die(); + } + } + + public void Die() + { + Dead = true; + Harvest = false; + MutationLevel = 0; + YieldMod = 1; + MutationMod = 1; + ImproperLight = false; + ImproperHeat = false; + ImproperPressure = false; + WeedLevel += 1 * HydroponicsSpeedMultiplier; + PestLevel = 0; + UpdateSprite(); + } + + public void RemovePlant() + { + YieldMod = 1; + MutationMod = 1; + PestLevel = 0; + Seed = null; + Dead = false; + Age = 0; + Sampled = false; + Harvest = false; + ImproperLight = false; + ImproperPressure = false; + ImproperHeat = false; + + UpdateSprite(); + } + + public void AffectGrowth(int amount) + { + if (Seed == null) + return; + + if (amount > 0) + { + if (Age < Seed.Maturation) + Age += amount; + else if (!Harvest && Seed.Yield <= 0f) + _lastProduce -= amount; + } + else + { + if (Age < Seed.Maturation) + SkipAging++; + else if (!Harvest && Seed.Yield <= 0f) + _lastProduce += amount; + } + } + + public void AdjustNutrient(float amount) + { + NutritionLevel += amount; + } + + public void AdjustWater(float amount) + { + WaterLevel += amount; + + // Water dilutes toxins. + if (amount > 0) + { + Toxins -= amount * 4f; + } + } + + public void UpdateReagents() + { + if (_solutionContainer == null) + return; + + if (_solutionContainer.Solution.TotalVolume <= 0 || MutationLevel >= 25) + { + if (MutationLevel >= 0) + { + Mutate(Math.Min(MutationLevel, 25)); + MutationLevel = 0; + } + } + else + { + var one = ReagentUnit.New(1); + + foreach (var (reagent, amount) in _solutionContainer.ReagentList.ToArray()) + { + var reagentProto = _prototypeManager.Index(reagent); + reagentProto.ReactionPlant(Owner); + _solutionContainer.Solution.RemoveReagent(reagent, amount < one ? amount : one); + } + } + + CheckLevelSanity(); + } + + private void Mutate(float severity) + { + // TODO: Coming soon in "Botany 2: Plant boogaloo". + } + + public void UpdateSprite() + { + _updateSpriteAfterUpdate = false; + + if (_appearanceComponent == null) + return; + + if (Seed != null) + { + if(DrawWarnings) + _appearanceComponent.SetData(PlantHolderVisuals.HealthLight, Health <= (Seed.Endurance / 2f)); + + if (Dead) + { + _appearanceComponent.SetData(PlantHolderVisuals.Plant, new SpriteSpecifier.Rsi(Seed.PlantRsi, "dead")); + } + else if (Harvest) + { + _appearanceComponent.SetData(PlantHolderVisuals.Plant, new SpriteSpecifier.Rsi(Seed.PlantRsi, "harvest")); + } + else if (Age < Seed.Maturation) + { + var growthStage = Math.Max(1, (int)((Age * Seed.GrowthStages) / Seed.Maturation)); + _appearanceComponent.SetData(PlantHolderVisuals.Plant, new SpriteSpecifier.Rsi(Seed.PlantRsi,$"stage-{growthStage}")); + _lastProduce = Age; + } + else + { + _appearanceComponent.SetData(PlantHolderVisuals.Plant, new SpriteSpecifier.Rsi(Seed.PlantRsi,$"stage-{Seed.GrowthStages}")); + } + } + else + { + _appearanceComponent.SetData(PlantHolderVisuals.Plant, SpriteSpecifier.Invalid); + _appearanceComponent.SetData(PlantHolderVisuals.HealthLight, false); + } + + if (!DrawWarnings) return; + _appearanceComponent.SetData(PlantHolderVisuals.WaterLight, WaterLevel <= 10); + _appearanceComponent.SetData(PlantHolderVisuals.NutritionLight, NutritionLevel <= 2); + _appearanceComponent.SetData(PlantHolderVisuals.AlertLight, WeedLevel >= 5 || PestLevel >= 5 || Toxins >= 40 || ImproperHeat || ImproperLight || ImproperPressure || _missingGas > 0); + _appearanceComponent.SetData(PlantHolderVisuals.HarvestLight, Harvest); + } + + public void CheckForDivergence(bool modified) + { + // Make sure we're not modifying a "global" seed. + // If this seed is not in the global seed list, then no products of this line have been harvested yet. + // It is then safe to assume it's restricted to this tray. + if (Seed == null) return; + var plantSystem = EntitySystem.Get(); + if (plantSystem.Seeds.ContainsKey(Seed.Uid)) + Seed = Seed.Diverge(modified); + } + + public async Task InteractUsing(InteractUsingEventArgs eventArgs) + { + var user = eventArgs.User; + var usingItem = eventArgs.Using; + + if (usingItem == null || usingItem.Deleted || !ActionBlockerSystem.CanInteract(user)) + return false; + + if (usingItem.TryGetComponent(out SeedComponent? seeds)) + { + if (Seed == null) + { + if (seeds.Seed == null) + { + user.PopupMessageCursor(Loc.GetString("The packet seems to be empty. You throw it away.")); + usingItem.Delete(); + return false; + } + + user.PopupMessageCursor(Loc.GetString("You plant the {0} {1}.", seeds.Seed.SeedName, seeds.Seed.SeedNoun)); + + Seed = seeds.Seed; + Dead = false; + Age = 1; + Health = Seed.Endurance; + _lastCycle = _gameTiming.CurTime; + + usingItem.Delete(); + + CheckLevelSanity(); + UpdateSprite(); + + return true; + } + + user.PopupMessageCursor(Loc.GetString("The {0} already has seeds in it!", Owner.Name)); + return false; + } + + if (usingItem.HasComponent()) + { + if (WeedLevel > 0) + { + user.PopupMessageCursor(Loc.GetString("You remove the weeds from the {0}.", Owner.Name)); + user.PopupMessageOtherClients(Loc.GetString("{0} starts uprooting the weeds.", user.Name)); + WeedLevel = 0; + UpdateSprite(); + } + else + { + user.PopupMessageCursor(Loc.GetString("This plot is devoid of weeds! It doesn't need uprooting.")); + } + + return true; + } + + if (usingItem.TryGetComponent(out SolutionContainerComponent? solution) && solution.CanRemoveSolutions) + { + var amount = 5f; + var sprayed = false; + + if (usingItem.TryGetComponent(out SprayComponent? spray)) + { + sprayed = true; + amount = 1f; + EntitySystem.Get().PlayFromEntity(spray.SpraySound, usingItem, AudioHelpers.WithVariation(0.125f)); + } + + var chemAmount = ReagentUnit.New(amount); + + var split = solution.Solution.SplitSolution(chemAmount <= solution.Solution.TotalVolume ? chemAmount : solution.Solution.TotalVolume); + + user.PopupMessageCursor(Loc.GetString(sprayed ? $"You spray {Owner.Name} with {usingItem.Name}." : $"You transfer {split.TotalVolume.ToString()}u to {Owner.Name}")); + + _solutionContainer?.TryAddSolution(split); + + SkipAging++; // We're forcing an update cycle, so one age hasn't passed. + ForceUpdate = true; + Update(); + + return true; + } + + if (usingItem.HasComponent()) + { + if (Seed == null) + { + user.PopupMessageCursor(Loc.GetString("There is nothing to take a sample of!")); + return false; + } + + if (Sampled) + { + user.PopupMessageCursor(Loc.GetString("This plant has already been sampled.")); + return false; + } + + if (Dead) + { + user.PopupMessageCursor(Loc.GetString("This plant is dead.")); + return false; + } + + var seed = Seed.SpawnSeedPacket(user.Transform.Coordinates); + seed.RandomOffset(0.25f); + user.PopupMessageCursor(Loc.GetString($"You take a sample from the {Seed.DisplayName}.")); + Health -= (_random.Next(3, 5) * 10); + + if (_random.Prob(0.3f)) + Sampled = true; + + // Just in case. + CheckLevelSanity(); + SkipAging++; // We're forcing an update cycle, so one age hasn't passed. + ForceUpdate = true; + Update(); + + return true; + } + + if (usingItem.HasComponent()) + { + return DoHarvest(user); + } + + return false; + } + + public ReagentUnit ReagentReactTouch(ReagentPrototype reagent, ReagentUnit volume) + { + if(_solutionContainer == null) + return ReagentUnit.Zero; + + _solutionContainer.TryAddReagent(reagent.ID, volume, out var accepted); + return accepted; + } + + public ReagentUnit ReagentReactInjection(ReagentPrototype reagent, ReagentUnit volume) + { + if(_solutionContainer == null) + return ReagentUnit.Zero; + + _solutionContainer.TryAddReagent(reagent.ID, volume, out var accepted); + return accepted; + } + + public bool InteractHand(InteractHandEventArgs eventArgs) + { + // DoHarvest does the sanity checks. + return DoHarvest(eventArgs.User); + } + + public void Activate(ActivateEventArgs eventArgs) + { + // DoHarvest does the sanity checks. + DoHarvest(eventArgs.User); + } + + public void Examine(FormattedMessage message, bool inDetailsRange) + { + if (!inDetailsRange) + return; + + if (Seed == null) + { + message.AddMarkup(Loc.GetString("It has nothing planted in it.\n")); + } + else if (!Dead) + { + message.AddMarkup(Loc.GetString($"[color=green]{Seed.DisplayName}[/color] {(Seed.DisplayName.EndsWith('s') ? "are" : "is")} growing here.\n")); + + if(Health <= Seed.Endurance / 2) + message.AddMarkup(Loc.GetString($"The plant looks [color=red]{(Age > Seed.Lifespan ? "old and wilting" : "unhealthy")}[/color].\n")); + } + else + { + message.AddMarkup(Loc.GetString("It is full of [color=red]dead plant matter[/color].\n")); + } + + if(WeedLevel >= 5) + message.AddMarkup(Loc.GetString("It is filled with [color=green]weeds[/color]!\n")); + + if(PestLevel >= 5) + message.AddMarkup(Loc.GetString("It is filled with [color=gray]tiny worms[/color]!\n")); + + message.AddMarkup(Loc.GetString($"Water: [color=cyan]{(int)WaterLevel}[/color]\n")); + message.AddMarkup(Loc.GetString($"Nutrient: [color=orange]{(int)NutritionLevel}[/color]\n")); + + if (DrawWarnings) + { + if(Toxins > 40f) + message.AddMarkup(Loc.GetString("The [color=red]toxicity level alert[/color] is flashing red.\n")); + + if(ImproperLight) + message.AddMarkup(Loc.GetString("The [color=yellow]improper light level alert[/color] is blinking.\n")); + + if(ImproperHeat) + message.AddMarkup(Loc.GetString("The [color=orange]improper temperature level alert[/color] is blinking.\n")); + + if(ImproperPressure) + message.AddMarkup(Loc.GetString("The [color=lightblue]improper environment pressure alert[/color] is blinking.\n")); + + if(_missingGas > 0) + message.AddMarkup(Loc.GetString("The [color=cyan]improper gas environment alert[/color] is blinking.\n")); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Botany/PlantSampleTakerComponent.cs b/Content.Server/GameObjects/Components/Botany/PlantSampleTakerComponent.cs new file mode 100644 index 0000000000..6fd08ea50b --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/PlantSampleTakerComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class PlantSampleTakerComponent : Component + { + public override string Name => "PlantSampleTaker"; + } +} diff --git a/Content.Server/GameObjects/Components/Botany/ProduceComponent.cs b/Content.Server/GameObjects/Components/Botany/ProduceComponent.cs new file mode 100644 index 0000000000..0e5ca425dc --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/ProduceComponent.cs @@ -0,0 +1,64 @@ +using Content.Server.Botany; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Shared.Chemistry; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class ProduceComponent : Component + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + public override string Name => "Produce"; + + [ViewVariables] + public Seed Seed { get; set; } = null; + + public float Potency => Seed.Potency; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataReadFunction("seed", null, + (s) => + { + if(!string.IsNullOrEmpty(s)) + Seed = _prototypeManager.Index(s); + }); + } + + public void Grown() + { + if (Seed == null) + return; + + if (Owner.TryGetComponent(out SpriteComponent sprite)) + { + sprite.LayerSetRSI(0, Seed.PlantRsi); + sprite.LayerSetState(0, Seed.PlantIconState); + } + + var solutionContainer = Owner.EnsureComponent(); + + solutionContainer.RemoveAllSolution(); + + foreach (var (chem, quantity) in Seed.Chemicals) + { + var amount = ReagentUnit.New(quantity.Min); + if(quantity.PotencyDivisor > 0 && Potency > 0) + amount += ReagentUnit.New(Potency/quantity.PotencyDivisor); + amount = ReagentUnit.New((int) MathHelper.Clamp(amount.Float(), quantity.Min, quantity.Max)); + solutionContainer.MaxVolume += amount; + solutionContainer.Solution.AddReagent(chem, amount); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Botany/SeedComponent.cs b/Content.Server/GameObjects/Components/Botany/SeedComponent.cs new file mode 100644 index 0000000000..d314677bc6 --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/SeedComponent.cs @@ -0,0 +1,56 @@ +using Content.Server.Botany; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class SeedComponent : Component, IExamine + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public override string Name => "Seed"; + [ViewVariables] + public Seed Seed { get; set; } = null; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataReadFunction("seed", null, + (s) => + { + if(!string.IsNullOrEmpty(s)) + Seed = _prototypeManager.Index(s); + }); + } + + public void Examine(FormattedMessage message, bool inDetailsRange) + { + if (!inDetailsRange) + return; + + if (Seed == null) + { + message.AddMarkup(Loc.GetString("It doesn't seem to contain any seeds.\n")); + return; + } + + message.AddMarkup(Loc.GetString($"It has a picture of [color=yellow]{Seed.DisplayName}[/color] on the front.\n")); + + if(!Seed.RoundStart) + message.AddMarkup(Loc.GetString($"It's tagged as variety [color=lightgray]no. {Seed.Uid}[/color].\n")); + else + { + message.AddMarkup(Loc.GetString($"Plant Yield: [color=lightblue]{Seed.Yield}[/color]\n")); + message.AddMarkup(Loc.GetString($"Plant Potency: [color=lightblue]{Seed.Potency}[/color]\n")); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Botany/SeedExtractorComponent.cs b/Content.Server/GameObjects/Components/Botany/SeedExtractorComponent.cs new file mode 100644 index 0000000000..4f1b313d94 --- /dev/null +++ b/Content.Server/GameObjects/Components/Botany/SeedExtractorComponent.cs @@ -0,0 +1,56 @@ +#nullable enable +using System.Collections.Generic; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Power.ApcNetComponents; +using Content.Server.Utility; +using Content.Shared.GameObjects.Components.Botany; +using Content.Shared.Interfaces; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.ComponentDependencies; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Localization; + +namespace Content.Server.GameObjects.Components.Botany +{ + [RegisterComponent] + public class SeedExtractorComponent : Component, IInteractUsing + { + [ComponentDependency] private readonly PowerReceiverComponent? _powerReceiver = default!; + + [Dependency] private readonly IRobustRandom _random = default!; + + public override string Name => "SeedExtractor"; + + // TODO: Upgradeable machines. + private int _minSeeds = 1; + private int _maxSeeds = 4; + + public async Task InteractUsing(InteractUsingEventArgs eventArgs) + { + if (!_powerReceiver?.Powered ?? false) + return false; + + if (eventArgs.Using.TryGetComponent(out ProduceComponent? produce) && produce.Seed != null) + { + eventArgs.User.PopupMessageCursor(Loc.GetString("You extract some seeds from the {0}.", eventArgs.Using.Name)); + + eventArgs.Using.Delete(); + + var random = _random.Next(_minSeeds, _maxSeeds); + + for (var i = 0; i < random; i++) + { + produce.Seed.SpawnSeedPacket(Owner.Transform.Coordinates, Owner.EntityManager); + } + + return true; + } + + return false; + } + } +} diff --git a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs index febe086fb6..6669a8b261 100644 --- a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs @@ -67,6 +67,8 @@ namespace Content.Server.GameObjects.Components.Fluids set => _sprayVelocity = value; } + public string SpraySound => _spraySound; + public ReagentUnit CurrentVolume => Owner.GetComponentOrNull()?.CurrentVolume ?? ReagentUnit.Zero; public override void Initialize() diff --git a/Content.Server/GameObjects/EntitySystems/PlantSystem.cs b/Content.Server/GameObjects/EntitySystems/PlantSystem.cs new file mode 100644 index 0000000000..4f60d22aa5 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/PlantSystem.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using Content.Server.Botany; +using Content.Server.GameObjects.Components.Botany; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameObjects.EntitySystems +{ + [UsedImplicitly] + public class PlantSystem : EntitySystem + { + [Dependency] private readonly IComponentManager _componentManager = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + + private int _nextUid = 0; + private readonly Dictionary _seeds = new Dictionary(); + + private float _timer = 0f; + + public IReadOnlyDictionary Seeds => _seeds; + + public override void Initialize() + { + base.Initialize(); + + foreach (var seed in _prototypeManager.EnumeratePrototypes()) + { + AddSeedToDatabase(seed); + } + } + + public bool AddSeedToDatabase(Seed seed) + { + // If it's not -1, it's already in the database. Probably. + if (seed.Uid != -1) + return false; + + seed.Uid = GetNextSeedUid(); + _seeds[seed.Uid] = seed; + return true; + } + + private int GetNextSeedUid() + { + return _nextUid++; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + _timer += frameTime; + if (_timer < 3f) + return; + + _timer = 0f; + + foreach (var plantHolder in _componentManager.EntityQuery()) + { + plantHolder.Update(); + } + } + } +} diff --git a/Content.Shared/Chemistry/ReagentPrototype.cs b/Content.Shared/Chemistry/ReagentPrototype.cs index 15e4f84b1e..208d1d7e0d 100644 --- a/Content.Shared/Chemistry/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/ReagentPrototype.cs @@ -23,9 +23,11 @@ namespace Content.Shared.Chemistry private string _description; private string _physicalDescription; private Color _substanceColor; - private List _metabolism; private string _spritePath; + private List _metabolism; private List _tileReactions; + private List _plantMetabolism; + private float _customPlantMetabolism = 1f; public string ID => _id; public string Name => _name; @@ -34,8 +36,9 @@ namespace Content.Shared.Chemistry public Color SubstanceColor => _substanceColor; //List of metabolism effects this reagent has, should really only be used server-side. - public List Metabolism => _metabolism; - public List TileReactions => _tileReactions; + public IReadOnlyList Metabolism => _metabolism; + public IReadOnlyList TileReactions => _tileReactions; + public IReadOnlyList PlantMetabolism => _plantMetabolism; public string SpriteReplacementPath => _spritePath; public ReagentPrototype() @@ -53,16 +56,19 @@ namespace Content.Shared.Chemistry serializer.DataField(ref _physicalDescription, "physicalDesc", string.Empty); serializer.DataField(ref _substanceColor, "color", Color.White); serializer.DataField(ref _spritePath, "spritePath", string.Empty); + serializer.DataField(ref _customPlantMetabolism, "customPlantMetabolism", 1f); if (_moduleManager.IsServerModule) { serializer.DataField(ref _metabolism, "metabolism", new List { new DefaultMetabolizable() }); serializer.DataField(ref _tileReactions, "tileReactions", new List { }); + serializer.DataField(ref _plantMetabolism, "plantMetabolism", new List { }); } else { _metabolism = new List { new DefaultMetabolizable() }; - _tileReactions = new List(); + _tileReactions = new List(0); + _plantMetabolism = new List(0); } } @@ -136,5 +142,16 @@ namespace Content.Shared.Chemistry return removed; } + + public void ReactionPlant(IEntity plantHolder) + { + if (plantHolder == null || plantHolder.Deleted) + return; + + foreach (var plantMetabolizable in _plantMetabolism) + { + plantMetabolizable.Metabolize(plantHolder, _customPlantMetabolism); + } + } } } diff --git a/Content.Shared/GameObjects/Components/Botany/PlantHolderVisuals.cs b/Content.Shared/GameObjects/Components/Botany/PlantHolderVisuals.cs new file mode 100644 index 0000000000..336a56e483 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Botany/PlantHolderVisuals.cs @@ -0,0 +1,16 @@ +using System; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Botany +{ + [Serializable, NetSerializable] + public enum PlantHolderVisuals + { + Plant, + HealthLight, + WaterLight, + NutritionLight, + AlertLight, + HarvestLight, + } +} diff --git a/Content.Shared/GameObjects/Components/SharedStackComponent.cs b/Content.Shared/GameObjects/Components/SharedStackComponent.cs index 3df152b69a..2acedacade 100644 --- a/Content.Shared/GameObjects/Components/SharedStackComponent.cs +++ b/Content.Shared/GameObjects/Components/SharedStackComponent.cs @@ -127,6 +127,7 @@ namespace Content.Shared.GameObjects.Components Glass, Plasteel, Cable, + Wood, MVCable, HVCable, Gold, diff --git a/Content.Shared/Interfaces/Chemistry/IPlantMetabolizable.cs b/Content.Shared/Interfaces/Chemistry/IPlantMetabolizable.cs new file mode 100644 index 0000000000..ed0f1dcd12 --- /dev/null +++ b/Content.Shared/Interfaces/Chemistry/IPlantMetabolizable.cs @@ -0,0 +1,17 @@ +using Content.Shared.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Serialization; + +namespace Content.Shared.Interfaces.Chemistry +{ + public interface IPlantMetabolizable : IExposeData + { + /// + /// Metabolize unit(s) of a reagent. + /// + /// Entity holding the plant + /// Units to metabolize + void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f); + } +} diff --git a/Content.Shared/Utility/EntityPrototypeHelpers.cs b/Content.Shared/Utility/EntityPrototypeHelpers.cs new file mode 100644 index 0000000000..3c7115f20f --- /dev/null +++ b/Content.Shared/Utility/EntityPrototypeHelpers.cs @@ -0,0 +1,32 @@ +#nullable enable +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Utility +{ + public static class EntityPrototypeHelpers + { + public static bool HasComponent(string prototype, IPrototypeManager? prototypeManager = null, IComponentFactory? componentFactory = null) where T : IComponent + { + return HasComponent(prototype, typeof(T), prototypeManager, componentFactory); + } + + public static bool HasComponent(string prototype, Type component, IPrototypeManager? prototypeManager = null, IComponentFactory? componentFactory = null) + { + prototypeManager ??= IoCManager.Resolve(); + componentFactory ??= IoCManager.Resolve(); + + var registration = componentFactory.GetRegistration(component); + + if (!prototypeManager.TryIndex(prototype, out EntityPrototype proto)) + { + return proto.Components.ContainsKey(registration.Name); + } + + return false; + } + } +} diff --git a/Resources/Prototypes/Atmospherics/gasses.yml b/Resources/Prototypes/Atmospherics/gases.yml similarity index 100% rename from Resources/Prototypes/Atmospherics/gasses.yml rename to Resources/Prototypes/Atmospherics/gases.yml diff --git a/Resources/Prototypes/Catalog/VendingMachines/seeds.yml b/Resources/Prototypes/Catalog/VendingMachines/seeds.yml index b9d930ce4b..424a5821d3 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/seeds.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/seeds.yml @@ -4,3 +4,16 @@ description: For when you need seeds fast. Hands down the best seed selection on the station! animationDuration: 1.3 spriteName: seeds + startingInventory: + WheatSeeds: 10 + BananaSeeds: 10 + CarrotSeeds: 10 + LemonSeeds: 10 + PotatoSeeds: 10 + SugarcaneSeeds: 10 + TowercapSeeds: 10 + TomatoSeeds: 10 + EggplantSeeds: 10 + AppleSeeds: 10 + CornSeeds: 10 + ChanterelleSeeds: 10 diff --git a/Resources/Prototypes/Entities/Constructible/Power/seed_extractor.yml b/Resources/Prototypes/Entities/Constructible/Power/seed_extractor.yml new file mode 100644 index 0000000000..968872e993 --- /dev/null +++ b/Resources/Prototypes/Entities/Constructible/Power/seed_extractor.yml @@ -0,0 +1,28 @@ +- type: entity + id: SeedExtractor + name: seed extractor + description: Extracts seeds from produce. + placement: + mode: SnapgridCenter + components: + - type: Clickable + - type: InteractionOutline + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: sextractor + - type: Physics + mass: 25 + anchored: true + shapes: + - !type:PhysShapeAabb + bounds: "-0.4,-0.25,0.4,0.25" + layer: + - Opaque + - Impassable + - MobImpassable + - VaultImpassable + - type: SnapGrid + offset: Center + - type: Anchorable + - type: SeedExtractor + - type: PowerReceiver diff --git a/Resources/Prototypes/Entities/Constructible/hydroponics.yml b/Resources/Prototypes/Entities/Constructible/hydroponics.yml new file mode 100644 index 0000000000..c462eb9610 --- /dev/null +++ b/Resources/Prototypes/Entities/Constructible/hydroponics.yml @@ -0,0 +1,47 @@ +- type: entity + name: soil + id: hydroponicsSoil + placement: + mode: SnapgridCenter + components: + - type: Clickable + - type: InteractionOutline + - type: Physics + anchored: true + hard: false + shapes: + - !type:PhysShapeAabb + mask: + - Impassable + - MobImpassable + - VaultImpassable + - type: Destructible + deadThreshold: 50 + resistances: metallicResistances + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: soil + - type: PlantHolder + drawWarnings: false + - type: SolutionContainer + maxVol: 200 + caps: AddTo, NoExamine + - type: Pourable + - type: SnapGrid + offset: Center + - type: Appearance + visuals: + - type: PlantHolderVisualizer + +- type: entity + name: hydroponics tray + parent: hydroponicsSoil + id: hydroponicsTray + components: + - type: Anchorable + snap: true + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: hydrotray3 + - type: PlantHolder + drawWarnings: true diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 1fe6cd904b..26741a8d06 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -167,10 +167,12 @@ - type: RotationVisualizer - type: BuckleVisualizer - type: FireVisualizer + sprite: Mobs/Effects/onfire.rsi normalState: Generic_mob_burning alternateState: Standing fireStackAlternateState: 3 - type: CreamPiedVisualizer + state: creampie_human - type: CombatMode - type: Climbing - type: Cuffable diff --git a/Resources/Prototypes/Entities/Objects/Consumable/botany.yml b/Resources/Prototypes/Entities/Objects/Consumable/botany.yml new file mode 100644 index 0000000000..1ee4463f89 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Consumable/botany.yml @@ -0,0 +1,212 @@ +- type: entity + parent: BaseItem + id: ProduceBase + abstract: true + components: + - type: SolutionContainer + caps: NoExamine + - type: Sprite + state: produce + - type: Produce + +- type: entity + name: wheat + description: Sigh... wheat... a-grain? + id: Wheat + parent: ProduceBase + components: + - type: Sprite + sprite: Objects/Specific/Hydroponics/wheat.rsi + - type: SolutionContainer + caps: NoExamine + contents: + chem.Nutrient: 5 + chem.Flour: 5 + - type: Produce + seed: wheat + +- type: entity + name: sugarcane + description: Sickly sweet. + id: Sugarcane + parent: ProduceBase + components: + - type: Sprite + sprite: Objects/Specific/Hydroponics/sugarcane.rsi + - type: SolutionContainer + caps: NoExamine + contents: + chem.Nutrient: 5 + chem.Flour: 5 + - type: Produce + seed: sugarcane + +- type: entity + name: tower-cap log + description: It's better than bad, it's good! + id: Log + parent: ProduceBase + components: + - type: Sprite + sprite: Objects/Specific/Hydroponics/towercap.rsi + - type: SolutionContainer + caps: NoExamine + - type: MeleeWeapon + - type: Produce + seed: towercap + - type: Log + +- type: entity + name: banana + parent: ProduceBase + id: FoodBanana + description: Rich in potassium. + components: + - type: Food + trash: TrashBananaPeel + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/banana.rsi + - type: Produce + seed: banana + +- type: entity + name: carrot + parent: ProduceBase + id: FoodCarrot + description: It's good for the eyes! + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/carrot.rsi + - type: Produce + seed: carrots + +- type: entity + name: lemon + parent: ProduceBase + id: FoodLemon + description: When life gives you lemons, be grateful they aren't limes + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/lemon.rsi + - type: Produce + seed: lemon + +- type: entity + name: potato + parent: ProduceBase + id: FoodPotato + description: The space Irish starved to death after their potato crops died. Sadly they were unable to fish for space carp due to it being the queen's space. Bringing this up to any space IRA member will drive them insane with anger. + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/potato.rsi + - type: Produce + seed: potato + +- type: entity + name: tomato + parent: ProduceBase + id: FoodTomato + description: I say to-mah-to, you say tom-mae-to. + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/tomato.rsi + - type: Produce + seed: tomato + +- type: entity + name: eggplant + parent: ProduceBase + id: FoodEggplant + description: Maybe there's a chicken inside? + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/eggplant.rsi + - type: Produce + seed: eggplant + +- type: entity + name: apple + parent: ProduceBase + id: FoodApple + description: It's a little piece of Eden. + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/apple.rsi + - type: Produce + seed: apple + +- type: entity + name: ear of corn + parent: ProduceBase + id: FoodCorn + description: Needs some butter! + components: + - type: Food + trash: TrashCornCob + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/corn.rsi + - type: Produce + seed: corn + +- type: entity + name: chanterelle cluster + parent: ProduceBase + id: FoodMushroom + description: "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!" + components: + - type: Food + - type: SolutionContainer + contents: + reagents: + - ReagentId: chem.Nutriment + Quantity: 6 + - type: Sprite + sprite: Objects/Specific/Hydroponics/chanterelle.rsi + - type: Produce + seed: chanterelle diff --git a/Resources/Prototypes/Entities/Objects/Consumable/food.yml b/Resources/Prototypes/Entities/Objects/Consumable/food.yml index cd2b5314c6..0467526a1e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/food.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/food.yml @@ -931,7 +931,8 @@ Quantity: 2 - type: Sprite sprite: Objects/Consumable/Food/egg.rsi - + - type: Produce + seed: eggy - type: Item sprite: Objects/Consumable/Food/egg.rsi @@ -2857,24 +2858,6 @@ - type: Sprite sprite: Objects/Consumable/Food/milkape.rsi - -- type: entity - name: banana - parent: FoodBase - id: FoodBanana - description: Rich in potassium. - components: - - type: Food - trash: TrashBananaPeel - - type: SolutionContainer - contents: - reagents: - - ReagentId: chem.Nutriment - Quantity: 6 - - type: Sprite - sprite: Objects/Consumable/Food/banana.rsi - - - type: entity name: memory leek parent: FoodBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/trash.yml b/Resources/Prototypes/Entities/Objects/Consumable/trash.yml index 7fd021cf8f..71490e6b8b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/trash.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/trash.yml @@ -46,7 +46,8 @@ - type: entity - name: corn cob (trash) + name: corn cob + description: A reminder of meals gone by. parent: TrashBase id: TrashCornCob components: @@ -188,9 +189,8 @@ id: TrashBananaPeel components: - type: Sprite - sprite: Objects/Consumable/Food/banana.rsi + sprite: Objects/Specific/Hydroponics/banana.rsi state: peel - - type: Slippery intersectPercentage: 0.2 - type: Physics diff --git a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml index cdd0b159af..171613297b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml @@ -6,9 +6,6 @@ - type: Sprite sprite: Objects/Misc/utensils.rsi - - - - type: entity parent: UtensilBase id: Fork @@ -17,7 +14,7 @@ components: - type: Sprite state: fork - + - type: Hoe - type: Utensil types: - Fork diff --git a/Resources/Prototypes/Entities/Objects/Specific/seeds.yml b/Resources/Prototypes/Entities/Objects/Specific/seeds.yml new file mode 100644 index 0000000000..1a84b04aef --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/seeds.yml @@ -0,0 +1,142 @@ +- type: entity + parent: BaseItem + id: SeedBase + abstract: true + components: + - type: Seed + - type: SolutionContainer + caps: NoExamine + - type: Sprite + sprite: Objects/Specific/Hydroponics/seeds.rsi + state: seed + netsync: true + +- type: entity + parent: SeedBase + name: packet of wheat seeds + id: WheatSeeds + components: + - type: Seed + seed: wheat + - type: Sprite + sprite: Objects/Specific/Hydroponics/wheat.rsi + +- type: entity + parent: SeedBase + name: packet of banana seeds + id: BananaSeeds + components: + - type: Seed + seed: banana + - type: Sprite + sprite: Objects/Specific/Hydroponics/banana.rsi + +- type: entity + parent: SeedBase + name: packet of carrot seeds + id: CarrotSeeds + components: + - type: Seed + seed: carrots + - type: Sprite + sprite: Objects/Specific/Hydroponics/carrot.rsi + +- type: entity + parent: SeedBase + name: packet of lemon seeds + id: LemonSeeds + components: + - type: Seed + seed: lemon + - type: Sprite + sprite: Objects/Specific/Hydroponics/lemon.rsi + +- type: entity + parent: SeedBase + name: packet of potato seeds + id: PotatoSeeds + components: + - type: Seed + seed: potato + - type: Sprite + sprite: Objects/Specific/Hydroponics/potato.rsi + +- type: entity + parent: SeedBase + name: packet of sugarcane seeds + id: SugarcaneSeeds + components: + - type: Seed + seed: sugarcane + - type: Sprite + sprite: Objects/Specific/Hydroponics/sugarcane.rsi + +- type: entity + parent: SeedBase + name: packet of tower cap seeds + id: TowercapSeeds + components: + - type: Seed + seed: towercap + - type: Sprite + sprite: Objects/Specific/Hydroponics/towercap.rsi + +- type: entity + parent: SeedBase + name: packet of tomato seeds + id: TomatoSeeds + components: + - type: Seed + seed: tomato + - type: Sprite + sprite: Objects/Specific/Hydroponics/tomato.rsi + +- type: entity + parent: SeedBase + name: packet of eggplant seeds + id: EggplantSeeds + components: + - type: Seed + seed: eggplant + - type: Sprite + sprite: Objects/Specific/Hydroponics/eggplant.rsi + +- type: entity + parent: SeedBase + name: packet of apple seeds + id: AppleSeeds + components: + - type: Seed + seed: apple + - type: Sprite + sprite: Objects/Specific/Hydroponics/apple.rsi + +- type: entity + parent: SeedBase + name: packet of corn seeds + id: CornSeeds + components: + - type: Seed + seed: apple + - type: Sprite + sprite: Objects/Specific/Hydroponics/corn.rsi + +- type: entity + parent: SeedBase + name: packet of chanterelle spores + id: ChanterelleSeeds + components: + - type: Seed + seed: chanterelle + - type: Sprite + sprite: Objects/Specific/Hydroponics/chanterelle.rsi + +- type: entity + parent: SeedBase + name: packet of egg-plant seeds + id: EggySeeds + components: + - type: Seed + seed: eggy + - type: Sprite + sprite: Objects/Specific/Hydroponics/eggy.rsi diff --git a/Resources/Prototypes/Entities/Objects/Tools/botany_tools.yml b/Resources/Prototypes/Entities/Objects/Tools/botany_tools.yml new file mode 100644 index 0000000000..c3b1f3d47e --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/botany_tools.yml @@ -0,0 +1,100 @@ +- type: entity + name: mini hoe + parent: BaseItem + id: MiniHoe + description: It's used for removing weeds or scratching your back. + components: + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: hoe + - type: ItemCooldown + - type: MeleeWeapon + - type: Item + - type: Hoe + +- type: entity + name: Plant-B-Gone + id: PlantBGoneSpray + parent: SprayBottle + description: Kills those pesky weeds! + suffix: "Filled" + components: + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: plantbgone + - type: SolutionContainer + maxVol: 100 + caps: RemoveFrom, NoExamine + contents: + reagents: + - ReagentId: chem.PlantBGone + Quantity: 100 + +- type: entity + name: weed spray + id: WeedSpray + parent: SprayBottle + description: It's a toxic mixture, in spray form, to kill small weeds. + suffix: "Filled" + components: + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: weedspray + - type: SolutionContainer + maxVol: 50 + caps: RemoveFrom, NoExamine + contents: + reagents: + - ReagentId: chem.WeedKiller + Quantity: 50 + - type: Pourable + transferAmount: 1.0 + - type: Spillable + - type: ItemCooldown + - type: Spray + transferAmount: 1 + +- type: entity + name: pest spray + id: PestSpray + parent: WeedSpray + description: It's some pest eliminator spray! Do not inhale! + suffix: "Filled" + components: + - type: Sprite + state: pestspray + - type: SolutionContainer + maxVol: 50 + caps: RemoveFrom, NoExamine + contents: + reagents: + - ReagentId: chem.PestKiller + Quantity: 50 + +- type: entity + name: scythe + parent: BaseItem + id: Scythe + description: A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow. + components: + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: scythe + - type: ItemCooldown + - type: MeleeWeapon + - type: BotanySharp + - type: Item + +- type: entity + name: hatchet + parent: BaseItem + id: Hatchet + description: A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood. + components: + - type: Sprite + sprite: Constructible/Hydroponics/hydro_tools.rsi + state: hatchet + - type: ItemCooldown + - type: MeleeWeapon + - type: BotanySharp + - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index cb6604728b..0941fe2bf0 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -27,6 +27,7 @@ yellow: "#d58c18" - type: Item sprite: Objects/Tools/wirecutters.rsi + - type: PlantSampleTaker - type: entity name: screwdriver diff --git a/Resources/Prototypes/Entities/Objects/materials.yml b/Resources/Prototypes/Entities/Objects/materials.yml index 91be161812..ce955eae16 100644 --- a/Resources/Prototypes/Entities/Objects/materials.yml +++ b/Resources/Prototypes/Entities/Objects/materials.yml @@ -163,8 +163,21 @@ - type: entity name: wood plank id: WoodPlank - parent: BaseItem + parent: MaterialStack + suffix: Full components: - - type: Sprite - sprite: Objects/Materials/materials.rsi - state: wood_plank + # TODO: Specify a material. + - type: Sprite + sprite: Objects/Materials/materials.rsi + state: wood_plank + - type: Stack + stacktype: enum.StackType.Wood + +- type: entity + id: WoodPlank1 + name: wood plank + parent: WoodPlank + suffix: 1 + components: + - type: Stack + count: 1 diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml new file mode 100644 index 0000000000..3c6dd8c8fc --- /dev/null +++ b/Resources/Prototypes/Hydroponics/seeds.yml @@ -0,0 +1,288 @@ +- type: seed + id: wheat + name: wheat + seedName: wheat + displayName: wheat stalks + plantRsi: Objects/Specific/Hydroponics/wheat.rsi + productPrototypes: + - Wheat + lifespan: 25 + maturation: 6 + production: 1 + yield: 4 + potency: 5 + idealLight: 8 + nutrientConsumption: 0.15 + chemicals: + chem.Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + chem.Flour: + Min: 5 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: banana + name: banana + seedName: banana + displayName: banana plant + plantRsi: Objects/Specific/Hydroponics/banana.rsi + productPrototypes: + - FoodBanana + harvestRepeat: Repeat + lifespan: 50 + maturation: 6 + production: 6 + yield: 3 + idealLight: 9 + waterConsumption: 6 + idealHeat: 298 + chemicals: + chem.Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: carrots + name: carrot + seedName: carrot + displayName: carrots + plantRsi: Objects/Specific/Hydroponics/carrot.rsi + productPrototypes: + - FoodCarrot + lifespan: 25 + maturation: 10 + production: 1 + yield: 5 + potency: 10 + growthStages: 3 + waterConsumption: 6 + chemicals: + chem.Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: lemon + name: lemon + seedName: lemon + displayName: lemon trees + plantRsi: Objects/Specific/Hydroponics/lemon.rsi + productPrototypes: + - FoodLemon + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 4 + potency: 10 + idealLight: 8 + chemicals: + chem.Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: potato + name: potato + seedName: potato + displayName: potatoes + plantRsi: Objects/Specific/Hydroponics/potato.rsi + productPrototypes: + - FoodPotato + lifespan: 30 + maturation: 10 + production: 1 + yield: 4 + potency: 10 + growthStages: 4 + waterConsumption: 6 + chemicals: + chem.Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: sugarcane + name: sugarcane + seedName: sugarcane + displayName: sugarcanes + plantRsi: Objects/Specific/Hydroponics/sugarcane.rsi + productPrototypes: + - Sugarcane + harvestRepeat: Repeat + lifespan: 60 + maturation: 3 + production: 6 + yield: 4 + potency: 10 + growthStages: 3 + idealHeat: 298 + chemicals: + chem.Sugar: + Min: 4 + Max: 5 + PotencyDivisor: 5 + +- type: seed + id: towercap + name: towercap + seedName: tower cap + displayName: tower caps + plantRsi: Objects/Specific/Hydroponics/towercap.rsi + productPrototypes: + - Log + lifespan: 80 + maturation: 15 + ligneous: true + production: 1 + yield: 5 + potency: 1 + growthStages: 3 + waterConsumption: 6 + lightTolerance: 6 + idealLight: 288 + +- type: seed + id: tomato + name: tomato + seedName: tomato + displayName: tomato plant + plantRsi: Objects/Specific/Hydroponics/tomato.rsi + productPrototypes: + - FoodTomato + harvestRepeat: Repeat + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 10 + waterConsumption: 6 + nutrientConsumption: 0.25 + idealLight: 8 + idealHeat: 298 + juicy: true + splatPrototype: PuddleSplatter + chemicals: + chem.Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: eggplant + name: eggplant + seedName: eggplant + displayName: eggplants + plantRsi: Objects/Specific/Hydroponics/eggplant.rsi + productPrototypes: + - FoodEggplant + harvestRepeat: Repeat + lifespan: 25 + maturation: 6 + production: 6 + yield: 2 + potency: 20 + idealLight: 9 + idealHeat: 298 + chemicals: + chem.Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: apple + name: apple + seedName: apple + displayName: apple tree + plantRsi: Objects/Specific/Hydroponics/apple.rsi + productPrototypes: + - FoodApple + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 5 + potency: 10 + idealLight: 6 + chemicals: + chem.Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: corn + name: corn + seedName: corn + displayName: ears of corn + plantRsi: Objects/Specific/Hydroponics/corn.rsi + productPrototypes: + - FoodCorn + lifespan: 25 + maturation: 8 + production: 6 + yield: 3 + potency: 20 + growthStages: 3 + idealLight: 8 + waterConsumption: 6 + idealHeat: 298 + chemicals: + chem.Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: chanterelle + name: chanterelle + seedName: chanterelle + seedNoun: spores + displayName: chanterelle mushrooms + plantRsi: Objects/Specific/Hydroponics/chanterelle.rsi + productPrototypes: + - FoodMushroom + lifespan: 35 + maturation: 7 + production: 1 + yield: 5 + potency: 1 + growthStages: 3 + lightTolerance: 6 + waterConsumption: 6 + idealHeat: 288 + chemicals: + chem.Nutriment: + Min: 1 + Max: 25 + PotencyDivisor: 25 + +- type: seed + id: eggy + name: eggy + seedName: egg-plant + displayName: egg-plants + plantRsi: Objects/Specific/Hydroponics/eggy.rsi + productPrototypes: + - FoodEgg + harvestRepeat: Repeat + lifespan: 75 + maturation: 6 + production: 12 + yield: 2 + potency: 20 + idealLight: 9 + idealHeat: 298 + chemicals: + chem.Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index a2e26868c7..bd379b94b9 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -7,6 +7,11 @@ metabolism: - !type:DefaultFood rate: 1 + plantMetabolism: + - !type:AdjustNutrition + amount: 1 + - !type:AdjustHealth + amount: 0.5 - type: reagent id: chem.H2SO4 @@ -16,6 +21,13 @@ color: "#BF8C00" boilingPoint: 337.0 meltingPoint: 10.31 + plantMetabolism: + - !type:AdjustToxins + amount: 10 + - !type:AdjustWeeds + amount: -2 + - !type:AdjustHealth + amount: -4 - type: reagent id: chem.H2O @@ -31,6 +43,9 @@ tileReactions: - !type:ExtinguishTileReaction {} - !type:SpillIfPuddlePresentTileReaction {} + plantMetabolism: + - !type:AdjustWater + amount: 1 - type: reagent id: chem.Ice @@ -40,6 +55,9 @@ color: "#bed8e6" meltingPoint: 0.0 boilingPoint: 100.0 + plantMetabolism: + - !type:AdjustWater + amount: 1 - type: reagent id: chem.Phoron @@ -73,6 +91,13 @@ color: "#ffffff" boilingPoint: 340282300000000000000000000000000000000 #Fun fact: Glucose can't boil. So let's just set it to the maximum float value. meltingPoint: 146.0 + plantMetabolism: + - !type:AdjustNutrition + amount: 0.1 + - !type:AdjustWeeds + amount: 2 + - !type:AdjustPests + amount: 2 - type: reagent id: chem.Ammonia @@ -82,6 +107,11 @@ color: "#77b58e" boilingPoint: -33.0 meltingPoint: -77.7 + plantMetabolism: + - !type:AdjustNutrition + amount: 1 + - !type:AdjustHealth + amount: 0.5 - type: reagent id: chem.Bleach @@ -100,6 +130,20 @@ color: "#a1000b" boilingPoint: 55.5 meltingPoint: -50.0 + customPlantMetabolism: 0.1 + plantMetabolism: + - !type:AdjustNutrition + amount: 0.1 + - !type:AdjustPests + prob: 0.1 + amount: -1 + - !type:AdjustHealth + amount: 0.1 + - !type:AffectGrowth + prob: 0.2 + amount: 1 + - !type:Diethylamine {} + - type: reagent id: chem.FoamingAgent @@ -118,6 +162,13 @@ color: "#a1000b" boilingPoint: 78.2 # This isn't a real chemical... meltingPoint: -19.4 + plantMetabolism: + - !type:AdjustToxins + amount: 20 + - !type:AdjustWeeds + amount: -4 + - !type:AdjustHealth + amount: -8 - type: reagent id: chem.SpaceCleaner @@ -152,6 +203,19 @@ color: "#a1000b" boilingPoint: 1465.0 meltingPoint: 800.7 + plantMetabolism: + - !type:AdjustWater + amount: -3 + - !type:AdjustNutrition + amount: -0.3 + - !type:AdjustToxins + amount: 8 + - !type:AdjustWeeds + amount: -2 + - !type:AdjustPests + amount: -1 + - !type:AdjustHealth + amount: -2 - type: reagent id: chem.Thermite @@ -173,6 +237,10 @@ color: "#00ff5f" boilingPoint: 340282300000000000000000000000000000000 # Ethidium bromide, which doesn't boil. meltingPoint: 261.0 + customPlantMetabolism: 2 + plantMetabolism: + - !type:AdjustMutationLevel + amount: 1 - type: reagent id: chem.WeldingFuel @@ -184,3 +252,110 @@ meltingPoint: -80.7 tileReactions: - !type:FlammableTileReaction {} + +- type: reagent + id: chem.EZNutrient + name: EZ nutrient + desc: Give your plants some of those EZ nutrients! + color: "#664330" + physicalDesc: thick + plantMetabolism: + - !type:AdjustNutrition + amount: 1 + +- type: reagent + id: chem.Left4Zed + name: left-4-zed + desc: A cocktail of mutagenic compounds, which cause plant life to become highly unstable. + color: "#5b406c" + physicalDesc: heterogeneous + plantMetabolism: + - !type:AdjustNutrition + amount: 1 + - !type:AdjustHealth + amount: -0.5 + - !type:AdjustMutationMod + prob: 0.3 + amount: 0.2 + +- type: reagent + id: chem.RobustHarvest + name: robust harvest + desc: Plant-enhancing hormones, good for increasing potency. + color: "#3e901c" + physicalDesc: robust + customPlantMetabolism: 0.1 + plantMetabolism: + - !type:AdjustNutrition + amount: 0.05 + - !type:AdjustWeeds + prob: 0.025 + amount: 1 + - !type:AdjustPests + prob: 0.025 + amount: 1 + - !type:RobustHarvest {} + +- type: reagent + id: chem.PlantBGone + name: plant-B-gone + desc: A harmful toxic mixture to kill plantlife. Do not ingest! + color: "#49002E" + physicalDesc: bubbling + plantMetabolism: + - !type:AdjustToxins + amount: 6 + - !type:AdjustWeeds + amount: -8 + - !type:AdjustHealth + amount: -20 + - !type:AdjustMutationMod + amount: 0.1 + +- type: reagent + id: chem.WeedKiller + name: weed killer + desc: A mixture that targets weeds. + color: "#968395" + physicalDesc: bubbling + plantMetabolism: + - !type:AdjustToxins + amount: 4 + - !type:AdjustWeeds + amount: -6 + +- type: reagent + id: chem.PestKiller + name: pest killer + desc: A mixture that targets pests. + color: "#9e9886" + physicalDesc: bubbling + plantMetabolism: + - !type:AdjustToxins + amount: 4 + - !type:AdjustPests + amount: -6 + +- type: reagent + id: chem.Toxin + name: toxin + desc: A Toxic chemical. + color: "#cf3600" + physicalDesc: opaque + plantMetabolism: + - !type:AdjustToxins + amount: 10 + +- type: reagent + id: chem.Sugar + name: sugar + desc: Sickly sweet. + color: "#ffffff" + physicalDesc: opaque + plantMetabolism: + - !type:AdjustNutrition + amount: 0.1 + - !type:AdjustWeeds + amount: 2 + - !type:AdjustPests + amount: 2 diff --git a/Resources/Prototypes/Reagents/drinks.yml b/Resources/Prototypes/Reagents/drinks.yml index 13a308e3b6..bce9438f42 100644 --- a/Resources/Prototypes/Reagents/drinks.yml +++ b/Resources/Prototypes/Reagents/drinks.yml @@ -29,6 +29,11 @@ physicalDesc: bubbly color: "#cfa85f" spritePath: beerglass.rsi + plantMetabolism: + - !type:AdjustNutrition + amount: 0.25 + - !type:AdjustWater + amount: 0.7 - type: reagent id: chem.Vodka @@ -156,6 +161,13 @@ metabolism: - !type:DefaultDrink rate: 1 + plantMetabolism: + - !type:AdjustNutrition + amount: 0.1 + - !type:AdjustWater + amount: 1 + - !type:AdjustHealth + amount: 0.1 - type: reagent id: chem.Coffee @@ -196,6 +208,11 @@ metabolism: - !type:DefaultDrink rate: 1 + plantMetabolism: + - !type:AdjustNutrition + amount: 0.1 + - !type:AdjustWater + amount: 0.9 - type: reagent id: chem.SpoiledMilk @@ -235,4 +252,4 @@ color: "#9d5fb8" metabolism: - !type:DefaultDrink - rate: 1 \ No newline at end of file + rate: 1 diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index e237d58e20..8fab1f0048 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -78,6 +78,15 @@ color: "#808080" boilingPoint: -188.11 meltingPoint: -219.67 + plantMetabolism: + - !type:AdjustWater + amount: -0.5 + - !type:AdjustToxins + amount: 25 + - !type:AdjustWeeds + amount: -4 + - !type:AdjustHealth + amount: -2 - type: reagent id: chem.Si @@ -96,6 +105,15 @@ color: "#a2ff00" meltingPoint: -101.5 boilingPoint: -34.04 + plantMetabolism: + - !type:AdjustWater + amount: -0.5 + - !type:AdjustToxins + amount: 15 + - !type:AdjustWeeds + amount: -3 + - !type:AdjustHealth + amount: -1 - type: reagent id: chem.Li @@ -123,6 +141,13 @@ color: "#ede4e4" meltingPoint: 44.2 boilingPoint: 280.5 + plantMetabolism: + - !type:AdjustNutrition + amount: 0.1 + - !type:AdjustWater + amount: -0.5 + - !type:AdjustWeeds + amount: -2 - type: reagent id: chem.K @@ -141,6 +166,17 @@ color: "#00ff04" meltingPoint: 700.0 boilingPoint: 1737.0 + customPlantMetabolism: 2 + plantMetabolism: + - !type:AdjustMutationLevel + amount: 0.6 + - !type:AdjustToxins + amount: 4 + - !type:AdjustHealth + amount: -1.5 + - !type:AdjustMutationMod + prob: 0.2 + amount: 0.1 - type: reagent id: chem.Na diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index a0a9558af6..b87417674e 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -18,6 +18,11 @@ desc: A broad-spectrum anti-toxin, which treats toxin damage in the blood stream. Overdosing will cause vomiting, dizzyness and pain. physicalDesc: translucent color: "#3a1d8a" + plantMetabolism: + - !type:AdjustToxins + amount: -10 + - !type:AdjustHealth + amount: 1 - type: reagent id: chem.Arithrazine @@ -39,6 +44,11 @@ desc: Required for the proper function of cryogenics. Heals all standard types of damage very swiftly, but only works in temperatures under 170K (usually this means cryo cells). Can also slowly heal clone damage, such as caused by cloning or Slimes. physicalDesc: fizzy color: "#0091ff" + plantMetabolism: + - !type:AdjustToxins + amount: -3 + - !type:AdjustHealth + amount: 3 - type: reagent id: chem.Clonexadone @@ -46,6 +56,11 @@ desc: Heals standard damage in the same as Cryoxadone, with the same temperature requirement. Significantly more effective than the former at treating cellular damage, although both can be used simultaneously. Best used in cryo cells. physicalDesc: bubbly color: "#0666ff" + plantMetabolism: + - !type:AdjustToxins + amount: -5 + - !type:AdjustHealth + amount: 5 - type: reagent id: chem.Citalopram @@ -235,6 +250,9 @@ desc: A hallucinogenic compound that is illegal under space law. A synthetic drug derived from Mindbreaker toxin, it blocks some neurological signals to the respiratory system which causes choking. physicalDesc: strong-smelling color: "#5f959c" + plantMetabolism: + - !type:AdjustToxins + amount: 10 - type: reagent id: chem.Impedrezene @@ -263,6 +281,9 @@ desc: A potent hallucinogenic compound that is illegal under space law. Formerly known as LSD. physicalDesc: opaque color: "#77b58e" + plantMetabolism: + - !type:AdjustToxins + amount: 10 - type: reagent id: chem.Soporific diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 12a59cf5ef..199de7734d 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -284,7 +284,7 @@ solids: FoodFlatDough: 2 FoodMeat: 2 - FoodEggPlant: 1 + FoodEggplant: 1 FoodCheeseWedge: 1 #Soups & Stew @@ -334,8 +334,6 @@ solids: FoodMiloSoup: 1 - - #Handy template for copy **pasta**. Get it? Pasta? Aw whatever fuck you. # - type: microwaveMealRecipe # id: diff --git a/Resources/Prototypes/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/Recipes/Reactions/chemicals.yml index 36bfa2aa97..11ff5162c7 100644 --- a/Resources/Prototypes/Recipes/Reactions/chemicals.yml +++ b/Resources/Prototypes/Recipes/Reactions/chemicals.yml @@ -134,3 +134,47 @@ flashRange: 0.2 scaled: true #Scaled proportionally to amount of potassium and water maxScale: 30 #Explosion strength stops scaling at 30 potassium + 30 water + +- type: reaction + id: react.EZNutrient + reactants: + chem.N: + amount: 1 + chem.P: + amount: 1 + chem.K: + amount: 1 + products: + chem.EZNutrient: 3 + +- type: reaction + id: react.RobustHarvest + reactants: + chem.EZNutrient: + amount: 1 + chem.H2SO4: + amount: 1 + catalyst: true + products: + chem.RobustHarvest: 1 + +- type: reaction + id: react.Left4Zed + reactants: + chem.EZNutrient: + amount: 1 + chem.Ra: + amount: 1 + catalyst: true + products: + chem.Left4Zed: 1 + +- type: reaction + id: react.PlantBGone + reactants: + chem.Toxin: + amount: 1 + chem.H2O: + amount: 4 + products: + chem.PlantBGone: 5 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot-item.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot-item.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc452f8c264f68150ca15b7f33106b0155d4776 GIT binary patch literal 375 zcmV--0f_#IP)9d&E@`Io%&I3_yqKj;mai}B((%YD1WRbl z-#!Zr`uf^tr;qJ=&<7ssp;d^GBg*nMKK!C%Y}o98ko6!T=;ZkQ7j=1d+Uc0015HYG40a4FFUiDQsHuH{oBw3NW2#9+3n|0TSn5Z!-cS zY4ssuKLHa0&@&gIzEy-idSReLSegTt{{jGbdAw`P9;oUAgddzjJio83`#BsA$2Ui8 VYXg2sEt3EM002ovPDHLkV1hr4pT7VA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot-large.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot-large.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3936c1b3b060372b5c2cf8522be831275889d4 GIT binary patch literal 394 zcmV;50d@X~P)6t*Tzra(2bdBIy6BilNM`nXzuQPuLl~n zaqxZ#;l01l!~1doI2;a#!{KoJcRaIWKFOO?3XW$5(`1eLByWmxeM)`gS;9=HK#DK@ z3eT^HzTp5WHt8Dcnt$EDU?zMyp(xjwuI%E&!SRM&;*T%-GMTO_&@2aZFpUq3(wGZ; zCPvrFm?9rW?oCk!@+<*L;2u?{5H(Bh<~TJYA0Ul&3Gh&H1Js0-eoKGbc+31eOIVv3 z*lf1A8lCI*w$^d2Pv_h2-MaZ%&{MGp^#K!6$TWnA>;}FnTJQE&1Dqa-^`6uWKu*D5 zp$v>?g(pPB9MUv?7qb*XMC?PvGGH?yq4f=e1=E;O^$Kk@at@eZA)| oV(8lqN;4w#aJzW=c}jnq50VUn4#!VUE&u=k07*qoM6N<$f-^F)ZvX%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/claypot.png new file mode 100644 index 0000000000000000000000000000000000000000..f6633eb3c53796c030845b68bb03ea7c909c8cfc GIT binary patch literal 377 zcmV-<0fzpGP)91e%$zvJ167qhfErE1RuTH>g@F!XX%1Na3jpBh{-!Z|psM!}esB!&`0{Su@6Y)H Xy*O(FPa^nD00000NkvXXu0mjfgB+yl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan black stripe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan black stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6222b7a738449e0ab851d57b37cd05ce873653 GIT binary patch literal 659 zcmV;E0&M+>P)S_*Fb2SkMa3juNMri%zEE?sod z2N+VCg4EiOR_G$+MFP$`E>3P{CgVKXx-%by`#9e{=ey^gdnd5K{|+rQ^Idr|>;L!# z+sDqeFCI=P+_%Q>YoUBcLI*btDAgbm0V62^?ZJ(t*h)1p45#2*3joMf;LB6ksmr+4 zw`{7vQx{II656eQnqEDbF#hch6eu=j^)?*ig$XWZ^f3$2>0aN^5KI! zzSiMT+VwTr6|Zf^Jtw!NY#nz7eBhk{b>5l=y`G%qXaw~pbh~bTw=1^MNVu9NKfABL zz&iuE6zrbCW?9nO{0Z?mjK4!VO>=97CIETicRG@G#VHnLu6iK88duj808q-qhnhHO z_2Fe^x|@BLzl|N#i$^gh=TlYMQeKMi+8I#Tcr52=Ph%{~($WN7*D+0VHU~D2k(4^P zaSbS>)6(Wrl2Y3p&t|jex^8jjIcn{#1Sm(U2>l+TR$n+FgNGMzbPD(GN`aN~(71GS z8kb^=$0hwor~goZ+O>Lw>`$$Nnp2#R&vvkYUQe##?in0Dm)1zSc}CL7*(}T28w=Pz z)@Ij7iKre(TPV2sg@Ti#g8O_2`~@fs=0y1IYMwLjzW)lr|60^naSqF$+m7+YM%KMH tVE5q!C=m)l#bqzhfZz)(u)qQUe*jeD;I^vnaSs3h002ovPDHLkV1grDIa~k$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan blue stripe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan blue stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cf3b23728a7387f2f2806d92dd416c79222338 GIT binary patch literal 653 zcmV;80&@L{P)ITk$dgN!wKd+d;YN&DRwM!a>IaP4Pr4c(vr}b+(?VBSOddw3%<1gfLs~sPhqzy zbE{|j)OfckoLo6_*x)j~eKO(l%9|)uY{nihC*bpU-#q>TR9RCgnV+1)+UhhxnWgow zXd5O}VKQzps#wr&i~m~#9^9AlU;w}R-kzBv_y|%d&~-a`uIyjl#C!2&v%)<&w_^k# z9_Sqm#ICK%u6XCqwUn>ztv~?$E1=F>)1cdxvm6egc?_M7m*44#Z#WdLrpeD4>#qdl zGO%|BD=Sbaz~vPrlVWw9QN`l=MV;#}bvb`scXJ8_S-W@UZps-1A3-q>pK21o>cN}r zbT^KcSkBQ|#^nUD_#?Eq$z!G-ve zNh$x~=|2>pcCB7Qf9h)WOmQN-6KbSR?J_8EH3Xt0ZgZ7O-=q-CQ3f zqPj2EG`)P&baPblfbT%C0EPaHh@f4~a{B)FUm^Toi~1_gU}<~PH6Lwmd)J2SKAHd} nLLscVoDCY1e1QcPSODNR=IY@BQ%D!400000NkvXXu0mjfUDP&t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan lime stripe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan lime stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..26e6787fce6754d66bc869ff4627e84eb2fa784f GIT binary patch literal 662 zcmV;H0%`q;P)d#3hnAR9p;591iRraL~ocp%m=uDB|2XAkHoYGo*-TlMBlP-pK>z}5Tdt*jF-GKtdrl$Q^6kcz6#_<-Q(wa!f_}~zh^OFEYtkxA) zp5%x%8?0APs2FR|Zj1dx6>i;-{$K#deRs`F;J*cl1nBxSc)IAF-sp3&8HR8V4yQhR zaLLy?7)ZOEmsRo9W_;`9wv?^y&VUcRGobcc)1cdxy&Mjqwhx_-o8Re(Z8#LJrpaUX z^%r<&Af19r6IKh7*8MLKkHhE_=sFc+jmmp~92fv?NxR}KElEw3w#8Td_>2MotPH#= zi-T4V9vhR@RLMntIjB3o7o40oC26gU6ycdOpzz?X?4v!6u_z07e()^62*7&v1Zp~9 zEzCG)Z7aRP>xg)`dvn?o^V124=-T10gIQVz^n|^ zkKCO4k=WvKN&jx+9|};bR+o_ds#Q?$6er}h9W0>Rm7`c`!pDcwnn^d$OgcHM1(|zp z0ULYT>G4q_O54(Avu=Ji>*T25KHmX<0Sf&Y5q_(h<@CMJze4a|i~1_gAou;7W4v?q wntN`*>ca_8A{2s(%U+-X!RMG`jyVAS06KBt&UIfCa{vGU07*qoM6N<$f&@uEz5oCK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan purple stripe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/cyan purple stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..2e51733923d6de7d37ddbda1debabb51bcff3943 GIT binary patch literal 655 zcmV;A0&x9_P)3Nq7bKIGo(R_wsx{+Pax9gnMt!_nz}T=bn2LnBjkimYDgmI=-C$ z?85qifA7l&W6JaH`cos3?^NR8h5?lZq*7qyC7?IBkr!K~0fylhd}9FsW*xSkz-Cj{ zoq=mp^UbDk%z9$C(Pet`c+AD`V4zsB1$UlF!-t-5t6^p`cpSnIG za4XU}8p*i4Bw6t`oZC^hUa$fY2(N%TZ%qT+ma}vmXdXhpALRG@VsjkfYMOk!zW##n z3YZ1hIe}VL%6j+I{UFFnDqS`^PYMTNfDd zHY?@dKmLaTRMzSd@;N~|r_-w}uux+`DJ16ktg^Wf%$TRYOPOU0?uPtExK)bv? zN`$p1W4RpUm&<;R3Lf!05G_DqI3*$~t7*bF zp&>ObXcL=7g)TzANWpdD;^ZcGGR|b$x-&0?`*GfT&U?>2_hw*${~bnX=8N2D(y#x5 zV$Hqw;k6OzOVjboawy+s=-{>unKGCr*l`J{2e;#5%ap;k-Ga|803cO>k9T0bBI9Ov zYE%97if~ee&~Ag%^!V0@li%JzbHyg6{pAR}`QjVLUw}$$EGFaqL&&a;0~GjncZrqk z3d7G08p9#i-#>#^OY9q4aP_kE`+Yd>d242j;3J5|z_O;nQw9I@MxKi;nH28+;nYU} zE(BWpeQC36vMZiy#Kt3mF-TMjAD4cu;%aSt($dCE0mZV*AR##=Nv@O1>$EOqkka6HuSsXOG z@F+Rn%@(ge{BTj9+`HoDyemnYaij=OodJdWH{~4lG%iQDVHh~3Nn<#i%z?(S<5CA_ zt^ozhk~Wo)lxla}yzStanu}SET6-=5%8@F(IFttE=4+|bP+l< z#hM|s#4b%qh6)n$o3wN&S>kYV``*hlFVED?d?B3s-ud2hzW3a7ZywC>zeDrPe480u zj>|t`y=0&J?EZlGZS(nE&Qolk=j4U~=^XfcV1y;1HMtQMUpfbdVHbR50RXWqY(0X_ zqC8jIrcaGGi^7RzJ%@EK)60hgPS2f*CW>7!$MXUB^lfaO@d8v?Lm_!StibB>FhQ2Q zFHb6!qE@TXXf#+k+l6{v{M&nQ?~aVSUHH{;_RJ9OTM!C?uA9kY+41EKyb)hCD%``0 z8N&tFT)o|{*wtlO6|YR+-4Sk8`RdLJxL|w*)P8Fkv|6&4y&e>QK(p!OH=E+?^@OWw z^0UVJD*>?u*g1y9MMx&$^c;dgvAWL6*)BKpABb1J$o}iPos&$;+?`{4Q;xuW3(`yQ zF((14ZFn9Xu4a#~FW%dzkGEgjIiEMgrkA7%rxF10%UP*uoq?*v}GOD(P<1x8+0S8BL^#P$-z(a@m=5!s@~6Cz(~mq~@|V=!E1m%rL_Y0KWl2*XmI8H%5H`0000mIJ^8>!VN1J*C^}5(!ufw$&>9^Z((6ZM|56)W<41%tk!DHFs>GeMrTO=afowDh} z0cRbp?Y6WFbFwNPnzr*VtlWyS)$JKLk$_55s$J8d(U847JcM!;qL(P0`32urO#a{R zP_4mCRJfXE^)<49SQys!U@;?U{qPwA0qA@LT_+h?vhwS7NxS0A&dRskhWIKRj3@vg z9fxOmaZqW({YY;$>+D`HTBynGl$G-`Cv7?|ML2Q>6z<%Vee6%;w4bY&C*jHs`27cJ z+wjE?^l^-k)PYM4xL-uNE^RCVLUx`J zvT_zPGWWy+mW$f)@lhgj8`35cc77sZ<*48e?|`!ah1P%wr&SGdTEox3g8N^KdKCw- zd-08BoNUb7=en%kn*b$3!L7LZ3)Cg}7-Nhv2EY+YKi)`s_oCzg000002-Y?h7C9^}uJEup zlrxPvFU18!gPVjLq>shRxVx9^4~(7pHg9J3&HH}m&6}Bp4gPmzQhUCr&;PW019)>1 zp1WI{7L+N3L2_lvH@5>yg$1uI0Kjg+y9aP^EdBn-|EAjq z$KqqRQiqLC)3f_?E@sO_iDC=2@%mP;C{t$uz%4_&BLVs& zXcQN#Ia*%TWuMn?#k%D+Y5?HTUD?MV;Z_drcI-NIf zz_qKsUFDIbYEuW;_k-#A7cO0?c*MauYZq}6o$W4y#j-8kO`#Z7zry|M(ji61d%dijW~hlWaA83IE0Y`5=VF)qR>*(Zm(VZ zNlzf_xBs7K%RnR&i9{m*%tCA7Gi$kV1K{>3H7@`x$Qi_fSk^L*TPqf1v)RaR^L0X5 zE8crqgLv;>hEQuuS(b7*9H{Gh99u4z>~=evrWt+TwE_Utbxlze48uU*_Z*MMnMN(Z z^?GHo_-yd~e&=$z%yep7V2t_k(6wzl`o3ue0Lb&45W-k_o@?4oF~*39$gAg9ooWZ1 zbA%882qEB{)3lpnjFB`=XJ7wk9oTNSbX`Z5Wh6;LmSq4WNixx?Zo%nvqU*Y`R;$%a zqxyqL(^U5RJ@B{(s;ZjYg6aXDA)fEw%_9+j4>1yoSRwuU$p8QV07*qoM6N<$g2(Qi AfdBvi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/disk.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..e77f266db33b8a90dead2237365e055dcf570b50 GIT binary patch literal 355 zcmV-p0i6DcP)b;z6vpw7ih->|2L_JBzzN(NbgaS=%FcwiLA-i}sMTt|~d_^nU!3 zbFR7g)E>cNlNumDt^hZvcLBEhmlW&BmOqVt;;}isZ8qKCoqMfk^!)e&NUC3J=^$y@ zUhw0SWj15J&sDGvL%yj1zoFL)7*p2|U|`<^d}vsR0@>ey+!DQkwgQ~gY&iZu7mmje z=7ygQ;tKE~=~L20((I4(P;%!300000002Pg%IOanNLl>>1E4>k?*zH~1NthjKOnIp z`vX$C`#qrC28l#ykT5-!yFVbIvibu60001_@&o3)Vf%}AX}|yg002ovPDHLkV1mAv BpdbJM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green black stripe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green black stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..67a893e7cdd01a3953ad363e4510f2da061e88fc GIT binary patch literal 680 zcmV;Z0$2TsP)a8Qi-JQj&rqa`oGuQDgF^#$>C$2sTRI$+)YaP}T@*?$6bEfVLWg#$ zn2vTxK`FX)61o&A@eBo5ONfm{@;aO*xzxMd)lO~x@Zfvj{lD-1-}~OZ_n?FS9g(0! zBdN*eer~563G@9@Fp`?2g43Qmt$9Ersnz}GyjDS8P(mqL1|zR|3(ae=94e!K38tr~ z<(Iv$;WD=1#_)C4*4Dz8!$@jUJQ0!t^=2g$$tIFbq^|37W@bhv5(%m6dfjg&6jw}Z zxmw{{0(-))+jE&H=3=d_aC5Q7TqfFZjQI2Y_rT|dnO&%2WHiKbQG)dQerBN~PjB)C*$A+GY=V5CP&? zz_??_<8f5=Y~=BFl&_V3>|rUsbL_WhZF+)g=icyt1Q zS*S5vC}9@bAH^%FL1qgjR#Jli93Gwcz75*15g?uk%z_P{+H>tmn-zp(_u7E>^$h`D zL`G7Rx!Yyu_iGM(?GBX>+!vnRYx|ynfd!n42*PW{UwxK!&_M_PEPesjd*zJSqdL|A O0000fp2GKda8(;QV^>G zN;SA85UT<;rI4N~p2Y_*AwXY}5NiUlCIIMYb?!8PX(?6+7lBsdqDy8L7F1^lEm|4(05F< z`}R4IU%zxvOD|>s&_4tB;O4d8Xk#Yy0~Z!h7QqsTp90v0HajfI{eO1zip z-m&xEywpq5b=v!(KY>@H>+kr;xCLnpJ!&qd@O;(CVfdS6Y@e&_DzK aEdBtz-R9a$RpGJ#0000`DLt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green lime stripe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/green lime stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3c2188b5a401729fb28d0bfabdf1ba8e08d1e7 GIT binary patch literal 693 zcmV;m0!safP)^=q`d55*TW(Smefh?9~g+mt8-h~i$XL@bkGjE)GcUn zk6N&S9`xcNgdk#zWt2pzi;JYI*i47f)!Ewlp`B{K@WS&x@ArM?`@YXR@B2U<|2qO+ ziAqd1Pxmv+I{`oA=YkTGO@3gtr&c@tK_wZlBd$NsARH$$pU74rprKz(SS&(C0PP)c8?IhBKpirm2XGMJeh(ZSB2f~Sami}Iz7nZ1gJ55YU|*@?x1q;1 zy3dOU5W4~*mR-7j6E${pF-81F@*$uYlDJ#=N--p%$MxF8h{a8;Hc$+CTbnB@@uGpw zH7oC(YX*tw+Q%j_?VamcK%i&^c@w^3>z|kFNx;~%7Ul=qZNBG^%Qe`)kIfIXGnQ^S zn}E#nPGEC;9{@FPFp^(K&AVU4Q~e!`g5QVX1YskJ1le^B^%+6$|+CMz_-uM3Rd;j;oH{U#H;D1NR zFHzT2d9qD@JH8|JPO*)+po(^48rMM#`IV#N@QY5QLR*})ZIr(OIS>7CfA)|eB6~8&8 zIOf!*s}`Oqu!gOQ9Z!TYX3KSj8?$BNiE!1?>&^GR1MjM4a;AiyP!Vea4t~Qu0I?>} z6DrA>Qq@0n0s&@5L97eJx&WZP*?B6pu!b$#n{E4Wo;m8hN7u`tYpP5|i^QLX*#r8n zmDqgQL|4H(4f%+|jEOP~09p4XyaoIcK?cNE0c=By?UvmaX^)%-;8Wo(v@9K;J5V=z zz(NFwJpqHZef`Vl>cC*oNC5=oBMO(dK9Y|pSRpwNVW1 z?Ct|#JCsVm?7DhV(*xB9pd>hn1BS72}7&!}G)#q9x77Ga5ZnXgS z-#7Sp5$T#LQ{zSZ^E-kINzKuJ9p7*YX|+5npl<<(BK+`b@mHT^4K&ceKZ~ExUh9{Z SSA|{x0000iZFzuOX=NHssYQtaWwF;z`LWXnECMXkLX?PZ6C{5Rb>@ zr-LuvBDUcA$Tf1gocDBSF;$AkLQ?zpUkLUJzY&8MOFbJTYw8zmILs46>N%|1$yE-LmiK_ymAtp~hU{kYu5K zDPEf%Vy1b?Ya7t&KkmO_vwKB?;Bjah_sk0v-is8 z=XVYZE8i^rm4z!-A$_`I1#~T-F2W736@T?v)a;lcO5_kZ8}zxm$#=0OwxJ3@Ym zx~9tG{nTb56lA<1=$b0o$8L}9c6>oyQ!D->UacTED1nqDK~JmhLenZF14Z;s!Q|wm z%x-@Q7O@7G`Yy7xv=lrYx~59;Ku9uFnmMdU){v|rW61^iZT~=KvsoESE>!&Hu;Q3g zo32`TrobApD)w|dj4@ZPE8LhXGaV0C9sS;X?=$eBY9?lj=y4UXE}(P@w*+EcpvP4b zv&E`^xB&s?vVzzUhz$WiN2~Lz)WRCE=xDX=qj~1I_a0pjhpwqIb*sSii!cYkmAgf@ z-nG!X?#1s)wi&J%G|-a(E}DD zKpY4dvhB_b-PM7ippgOy$VC*cZGR>gQLsiWcjA!Ejc&D&i}>4HT~_pY_2BjHl!-37 zXDzzupX*ydC}#(G(|6v{ZKx(rP+TA+@ zz{r%D%H%OJ^-J;mcsEm-JoDrB0o~m@^n4rC|3-j#Brq}-ysyu-MlI$Mw%uj{?!RyF z@gmYSRicS!mjX*_tv2mtb^s zRDIt0Qd>qJZggK~d3m|^a#(RwiAkZzP#R9mP^_U?L#d?}rPgjLwbY_M&QS6@F~jqW zzg&IZo{$#c$N@E#k3g7%2Z_=`ObfmhoR`|lMhox`hF|Z|0@(Lmtn@hr(4!Y}Rtz2$z{$DTcl3Ag{AaI+`mo_W z0L~lWHe74?fj#0vFK})FzeTVD;+p{Sa7nu#T-}DtQP|D#DSuf0K=+pM`B2-B2oQ$? z`pN{#`9dI+fNa#@?#@@TQ3E+3D--)PH?h@7HX3ekRauE=jdbO7-MexwiG|8lODu%v zh87UX>LjnauXyGc<%SY4@wAQAp$?C4ex_J~{by`-sDp`A+xY}6ZXQH-_m2RuGcIG9 zJa(q~uXt{-ld(*mxxr2VcK440dxPrl2oR42c1FV6>RdS>nL}v1RRWc-ZwS#5S#eV> z-aF98?+jL(rDr}|@Wy4U#7di0JEKtdblC33kH6ZM)lo+s|15q1X~*ig0X6{T00000 LNkvXXu0mjfASOnU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hatchet.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hatchet.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1773d22a92f1e3a641fd0bd95d7037bc8f8247 GIT binary patch literal 555 zcmV+`0@VG9P)1f{2vRtppWZ2<}`6ZgkN1VV@l(bl#QGEvj0Nt;eO*HuN4B$Fm8!kqPUc@NKh?*#`32ZsUisy=z^;Z6BZ zhKEy{ymbAdjGm6jyHD*yIdui62Y?ZccpYMiZCzMX7C4izRxD>(O z*Ihj0o?&ML;O-Y#TFS^{lRl_Gtz!TnEzpu7%(f|qZJ}oa+3aOGn@nO^7C|jY(5-?? zVZXD-`#0~1%}4R7zM*!ZtNrTgBMH!G)Y;hFxMAscyTYD-1c_n*|+NT<& zQt7u$rECaIM|RpK=N8XU$QR|HP4o>fFW;8{J3C(p1Wp`^{eq^ea$>^E^sGi9U*yHg z92f2thJK<0q3NoOq{4D$AttN2+p_#vwRI)7{sB8w%7!=)CT82js+Kr;_9}KHMka75 z@wwJPj7=goUgArH`$~*d0ATlHP1M)l;tIrx-zbQwQ}Lb>BNqTjt*ndchu2h|rKJ*D t=$ZW^0zV_RUZFoQ{_cx#aB%pq_zs&ZvK}0{CZGTS002ovPDHLkV1l#U{(b-e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hoe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..4f61e98fb0e42d83d7be82f27d9eab517f4f27e6 GIT binary patch literal 601 zcmV-f0;c_mP)e&~Ts!ZI7=DHHK(g`8C~Vdf()Ie&opun3(*7OeSMZBod2~B@I!*L}tq6^q436Aw=&lY4($NmW(qpC2;Ds8A?`CSD?) zPTw*Ng8_gb2&AfN4FDKpU$fcl`b5JeNz&u-I5EbkTrS`22a_m@D}o^0Q51!8x!m$Z z!UyJGXN*y`T3u5V#ljdP0FY&w!r}1BL<$UIv)P_9#wef9Uq11nX1^06@K>`HVeo z-=_08J^)%Tums@CdG#}+765?8D{a|B!u}k`Fa7x30(G!>mC)`1o*fQ9Pt%UP!0!?j z&3E*UtJ^y~dQG798g_jPn`h}p`hf>x|CwpOAxnzXTv?GI?0)TV8Wsj0yx zjZJ7srS(CjRzrjcL8&Mur68c9$it#ig@6P>vb!*ko#_vpadzDpwA%jhB%AELXYY5; zcfW7HT;P8O(JmYjQTYI{c;)7?GspHCmHn7`86zD{)mH6qXQwUqwACLs0l=c{OQhUFjX9&y^k` zd}z4L^E}*PGo-{<-V}O&+&N*Ov-vmj-0SPctR@4S5aSdJ3$_`TugG-Qo~W>%C@K0= zn}x+NX(1;SGx*{F+Q0G074Tfkcc+3hvvg$#M07AJ;GyTWlJ?c zQ50cW7A#}}05qW`{~(j8c_7{&4x3s18>$9e=Np+1-(Lr@=P%0tz@yYW5V$KBbgNcn z@dNE`w2y(Lj2vmo+!XN{s|AtCiBfE8mN3yBQ%@$0JPZjM`Lx{l{BhF4+ zey<6etBWZBu$l}2fcAz;=4xM`R~uZLX&~_j@j+%IRr6~B0AOaAl>vaZ`s030NQevo zVZkN}03@$OKWfeW`P-u&wdwBa_%>luM$SaT@ge|VQT8U`&Zt}es5STJLxYUWvUflC z5njA<^SElDxw@DdI@iEl8yJ==kCckFWkpO#u$g~cbD;U$1y4ocb~4o3z_j-cQdDo3 z`OLAszN0w&r3IqXZu5B|J@z>Oz-hOU!J%PZS*r%zoFF3rp2Qr`LN#!!sn&aKU|0qw zdLWR7!`%v zTXMHb(MS#hn`28I*MYwF!A($mb^15UfG(YuR0SF&+SlKgnT~m$Cn|{O$Wvcmn9{=|1#d=sd+!JjJB&4_CpsXcmtY+W-In M07*qoM6N<$f+LcoaR2}S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray.png new file mode 100644 index 0000000000000000000000000000000000000000..79d35a91e7aa29a65e4590f5cf9186ab27188993 GIT binary patch literal 338 zcmV-Y0j>UtP)#OH8gspAdN$v821mkUK~Q=zH7N%;~2 z!F=bCoPz*?Kp+qZd^Z+Xos|2T`TDjjy zUsoSMU8${T+jf3{s;ZDA3F0``vyGGz<2dR$O;Z3s*L6;=5CVCg12B4kF-FYbQp&|J zzca>&k1K>gQ54#pHK85I9`};FxOVbc3Cuvtimk)P)dzUxG4gR2O{iX{t*GmI0{(iS kEXyr(!_4{dKjFvu1x(iG2SnX!qW}N^07*qoM6N<$f+{YPnE(I) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray2.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray2.png new file mode 100644 index 0000000000000000000000000000000000000000..81488012ff1e2ca76b1010651206fae0585ff90c GIT binary patch literal 543 zcmV+)0^t3LP)1w2+Fb$S;G2*M@KdA-KLEi`fL}0kQ(pwl)Dqn0P$2jLcm(FoqaYI`1cBjX zfaq=MnP7A+3wMw}X8I&wXnXp8?|V4yDP&}1WMpJyWc+7D@?^DI>D_MkaMMbq68joS z^WkualoBcBLyVPDD5aRqX8IIDB+WOQ4PSFr4k1LLKx=&$V<7}NL-WpnPtkXZ#Ui$C zW81bc02Ye{Qc6DmtPuJTyb7WKbR_=O`?>%*$e9B3z2@6fl`nD~kHt$Mr6l|Tfe)dt ziTry8(Bz%~eGHRaVgq2i-2xCD1knK^|5!S>i$B6VP9!oQI;6*Prvs%F&*lsI06GF4 z0CZm^P^;Ad7=HBcGwll~^?`c5&U89W2N;b;G#ZVEngbLH z1$w<6)oL{z0AM^GW11%Ud>+#@{}Km5z<$3c2m+SNWopc_tgE$2;%C5d9C5ng^m|^( z29{-|>fGd#cD-KXx^8+WoJ=Nhh;Fy5^Z7jc{r=)C-r_B7(){EZFM;d2+Vec&IL=is zzw5fXTrLAJpU?3;@9Is%b=`Q26#&gZ7@>voF{;1`1C9r`0zA>sf4002ovPDHLkV1oQ(_74C6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray3.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/hydrotray3.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a70ad57004bb9c3098f79ef661d0cbd0b9a16b GIT binary patch literal 547 zcmV+;0^I$HP)V6MnT|w`Gs3#|JJScn|Pces0+k0PfGv8nNUkm#P<_u7a+C-nPelAJGe9 z5G0uwgD)u+)|i}{5iBpjPTe%us=%(j0a_k&cKKkiE4u;St-U3d9A$1h!!%>2xvrTf znzg?(9tfDT7zDk|oSuPjk~gnkbptG~ta51N6ce{@bEZ?Z?!Br#ZBrLCkR*si##wmu zkmZ%tZh-QJDl9FgjibYdDSz9xT%aG?(qfwOhAKc$8^(_xF@k{sY7Lzqdj)t<^b+uk zwrg6gN%7;CZX4!vSwpK-P?Qv#U%z+KR;oJ${9)U*yQw<_hlY%?i{pYjpUWDBLXk{* zfkZrpR%=?GtRI@9q_}=#f_yG(xBwD~H~`bL3X$-zW%NVq_3YHZgL{e*3P;)6EOlDs l?78#wOPidUvHU~-jNg}nK9WIWekT9`002ovPDHLkV1i+J{}TWJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/meta.json b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/meta.json new file mode 100644 index 0000000000..a7f175b169 --- /dev/null +++ b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA 3.0", "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", "states": [{"name": "claypot", "directions": 1, "delays": [[1.0]]}, {"name": "claypot-item", "directions": 1, "delays": [[1.0]]}, {"name": "claypot-large", "directions": 1, "delays": [[1.0]]}, {"name": "cyan", "directions": 1, "delays": [[1.0]]}, {"name": "cyan black stripe", "directions": 1, "delays": [[1.0]]}, {"name": "cyan blue stripe", "directions": 1, "delays": [[1.0]]}, {"name": "cyan lime stripe", "directions": 1, "delays": [[1.0]]}, {"name": "cyan purple stripe", "directions": 1, "delays": [[1.0]]}, {"name": "cyan red stripe", "directions": 1, "delays": [[1.0]]}, {"name": "cyan white stripe", "directions": 1, "delays": [[1.0]]}, {"name": "cyan yellow stripe", "directions": 1, "delays": [[1.0]]}, {"name": "deathspray", "directions": 1, "delays": [[1.0]]}, {"name": "disk", "directions": 1, "delays": [[0.1, 0.1, 0.1]]}, {"name": "green black stripe", "directions": 1, "delays": [[1.0]]}, {"name": "green blue stripe", "directions": 1, "delays": [[1.0]]}, {"name": "green lime stripe", "directions": 1, "delays": [[1.0]]}, {"name": "green purple stripe", "directions": 1, "delays": [[1.0]]}, {"name": "green red stripe", "directions": 1, "delays": [[1.0]]}, {"name": "green white stripe", "directions": 1, "delays": [[1.0]]}, {"name": "green yellow stripe", "directions": 1, "delays": [[1.0]]}, {"name": "hydrocover", "directions": 1, "delays": [[1.0]]}, {"name": "hydrotray", "directions": 1, "delays": [[1.0]]}, {"name": "hydrotray2", "directions": 1, "delays": [[1.0]]}, {"name": "hydrotray3", "directions": 1, "delays": [[1.0]]}, {"name": "moldcreep0", "directions": 1, "delays": [[1.0]]}, {"name": "moldcreep1", "directions": 1, "delays": [[1.0]]}, {"name": "moldcreep2", "directions": 1, "delays": [[1.0]]}, {"name": "nolabelspray", "directions": 1, "delays": [[1.0]]}, {"name": "over_alert3", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "over_harvest3", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "over_lowhealth3", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "over_lownutri", "directions": 1, "delays": [[1.0]]}, {"name": "over_lownutri3", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "over_lowwater3", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "pestspray", "directions": 1, "delays": [[1.0]]}, {"name": "plantbag", "directions": 1, "delays": [[1.0]]}, {"name": "plantbgone", "directions": 1, "delays": [[1.0]]}, {"name": "portaseeder", "directions": 1, "delays": [[1.0]]}, {"name": "seedbag", "directions": 1, "delays": [[1.0]]}, {"name": "sextractor", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "soil", "directions": 1, "delays": [[1.0]]}, {"name": "spaceworms", "directions": 1, "delays": [[0.4, 0.4, 0.4, 0.4]]}, {"name": "spawner", "directions": 1, "delays": [[1.0]]}, {"name": "sprayparts", "directions": 1, "delays": [[1.0]]}, {"name": "traitcopier", "directions": 1, "delays": [[1.0]]}, {"name": "traitgun", "directions": 1, "delays": [[1.0]]}, {"name": "traitscanner", "directions": 1, "delays": [[1.0]]}, {"name": "vine_flowers", "directions": 1, "delays": [[1.0]]}, {"name": "vine_fruit", "directions": 1, "delays": [[1.0]]}, {"name": "weedspray", "directions": 1, "delays": [[1.0]]}, {"name": "scythe", "directions": 1, "delays": [[1.0]]}, {"name": "hoe", "directions": 1, "delays": [[1.0]]}, {"name": "hatchet", "directions": 1, "delays": [[1.0]]}]} diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep0.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep0.png new file mode 100644 index 0000000000000000000000000000000000000000..74d4641dded4cf9d5df761704233546670048af5 GIT binary patch literal 307 zcmV-30nGl1P)Y{-l5rUvh#^=HY-RaOVQzU0I zJebG3yy4z~j*bVDCdh2ulQcoRitskPqr*AbG?wf0uLQOY%k`f3VJM6B!Nq)(&E>|= zuP=(d7M8hPzZ22~zp3_oj0S$!Y3+iC2*@U}_}D}?i6sCicc$&xG;;%hpR)EMATRY< zK)%&p1blC5qM`!u^8_DXru`&+Zbk#d*3$nYh+Hrm_XIAP($uX9XtE?P^>3~3`e&Tk z;H@7@qztu$M9NSfL*}2iZRTtP^OaFW1=>JSfj-{XcLK3i>UaPE002ovPDHLk FV1nI^jh+Ai literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep1.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/moldcreep1.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc02be46e4cdc068f1ab5c1e049abe50980bdbe GIT binary patch literal 504 zcmVGxG{j~qKT2PC?QTJCN73wz(4c{FgUo7ID*DR76TX|C?we4U3(6_ z68S2HmO99@-1U0*KF{6z-rKjpe}JlhFMAi7omegJEuHKI)pBy7-O%j7>pO8&ye?D) zJd=*%;c1LZH8N*+PC$1+{os0l*F=a{f*&a30t)xD?0G;L|jH8eZZ(RhXrX_$H7T0+` z%54EbAQlxaV5T*|OsiuU+b6HL45>ddAuY<~`-w2>EhCU5<2y+q8|FucGM?MIt4+)m zrG7xSed+?fon42M2sr|BB$87rPiREyPz|mNX9}?74W3&&RhL2>o2G`WVnA> u9b=AGn_Wm_QT2@V)sg)%vT}&sy1@^P$+L+}g?k?W00006nP)=DK(@P1DYs$@BxfFr0*W^X_@)-E-dq{+Fn1PSb78t>!_MjcHQz zxRgWoel*(*Y93TBP24Dvaw$Uq(Ck>g?`4nSUdsRg>>Zf!V|vx7?hG)SO}H5MCjbDg z4&&JNXL_Azx^sT1Gf6l|&4avWoJmD{DwG{d=x+|fhLgWj%B(g;4ko^2y3003RhzJOO#qp~?oYfGT938;C{ zLN1BzhK7ZlGQ>SioMc1XU75{a$!kmF7n8TzuEs`CL|8LPXu)c|izmx>5MN!K1kk6i zKZ31NZ$VPQD3z4Z*BqphGLE};pv6S(7XWy^F3F~N5xyjJlb~A!-E>0zUH_?v&MBLW zEA*x`LE~&kSi>42Ymtzocj(E6#dDh0&7a0WBn`Kx$oq!_ce0+lah6@X)YtUxeRn2Az>hz^en-5hf!P3$e&7iiH@x ze|cx@?<~vV1T1@00S}|ZyBAXg0A>XBk_jLV0L%dr62Ke>NeQs+XvvF(7@a3yEX3&X zVj3Xe!{@%Q6KV}xDi%QUQ4i?!8IF3uN#Dj%4`2?V*03X8A`Ir>;e7>LyBZ!nNMUPN z3*E|E!F~B<={~ydba0_O$34H%$oMF)6 zV!B<;v^iQfK>}d0U`GWi&}>`CBxR0DaJ@3uIDby~CFHovrSJ+<6ro;M^PqYQl80eq iC(|+XH5(p=ee(~T!qce_VL|->0000Cy8SK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/nolabelspray.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/nolabelspray.png new file mode 100644 index 0000000000000000000000000000000000000000..a7bb126fd47d8c473e12f003a2e4983ee5860752 GIT binary patch literal 299 zcmV+`0o4A9P)w0LAJBS9+q~iLu77dbRnS2`WM@nlk#z+ccjCqsr zx+PUrNz*h~Yh7OyMU-X9JkK|PZ=V7H)>?|9;5ZKUeWz{PQ{B73Fbpo<|{Ln`LHy|a<;kb(ePLdmNu z`xx_Y-rd;0diHHgh0Ky1-XkAsPxd}lXWwqRgaxPr0xrZq5!tv`dwIs({pVE8i@Hkl z=I{4WEuR~#6a4#6h;%&vqRP5^(idJc=>)Ho6F5KOJ^(^-Dj$fCu z{QqnA+n$$o+NEurKQ7lGlsyPfx;;Pt{l}WWAF>|5cKmYhe1Q)`!9DJYZ?oraUO90C ONTsK%pUXO@geCy#=3L+a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_harvest3.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_harvest3.png new file mode 100644 index 0000000000000000000000000000000000000000..6faa8c519f60d36070f7f21225cd73a8210a4fa8 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGor#)R9Ln`LHz3b@L;vm3!A?tCX z1=BpgXJ+?U@*B4Q)Jt;{o^ho0W#7c_LX(A7ji zrYBXhi$6~fS@w08?#ufB=YKQbp0g|D_o~}#<(>wuy>~C)`tyx9tA3rkcXh9f*n=E? zm?1#=hdSTe^S@^{^iSXT_htI&`d5`jb!m)pH=bQF%9+LcmI$4m zGyD4gYyVvGzXtc6sGRBTvgJSHTyqCY2bWG;s|}w)R>FW5kE#6MdmVCdrN6Iz68}0s zQ0(%KtiPY5I{EUY%ss1bsc6GgGB7w~mwsjxw6uMfTDW&T`=kJ}FSLgXJM8l)J$*Bm`#5iVo+ l;C90_b9R?lsSSUn%NArvPJcJGQ50x4gQu&X%Q~loCIHyMG8g~= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lownutri3.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lownutri3.png new file mode 100644 index 0000000000000000000000000000000000000000..97ac3156fb92ebb40bf8c4fd9cca7ae4b4020567 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGopFLe1Ln`LHy|dBxu!9KO1N#m} z9djLr=hOIFStS^=W@uiKWE4BWCGy11^@|TToCx1OIF}44BnDrl(%z0XE%rJ8q4%nMZZ@O{a{9}3l;cNEC z{~VmZeEZqDt5?iU{z?4wvqxU?3)3@m&+^?Kt-p=G*J?y#M9N!Wt~$(6989wdOrXF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lowwater3.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/over_lowwater3.png new file mode 100644 index 0000000000000000000000000000000000000000..2553c3de5bb01a1e947dad4fa1f0891766c68008 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoKRsO>Ln`LHy|dAm*-@bF;{A?4 zOS&@-ObiYRW|Vc{Vf-pEpDj7X)hQbar#@Y^YL%FL=-SV_-!0QRzy9p+n<2IH9jC39|NA+t*eCAV$&zbY+wc2MdRzUu zY?6-Nq~GiQZ>_(U1LS|&mN)J8>%Nj7o<-Mtr-57u0S*6CjVc}%sQ>$x_2U`m*V}8B zm;b$PzHFWU-80AMKJ0j?|Db5z(VA(y^8Q;SFMmDxrH=pYk8Uu{K$^|$&$>U457zy0 ne*E{3{kpsFUt6AHWl;XbvbWaF)=NJy024kAczbTXR{APz2$o!r`DU0gCawj!NxPzN2{Tnln% zu`eJOhr_}_d*0CKV7@8*3HiT234h?fV>JZ@p#tbra?Oxevc`3t2?#>9&V(m=^eH*x zbQ%{zO`=cUyb)=dYLjS02%)5u%EnbvO67T;(vhdJs(tp<<;N9yp4TzQaX45#>HIpD z+9vWm$M=1zs-i4Qf*|NJ?*amYyLvnxk9m(qzbmlG_Kd_DTf8vrT%b2^G7b}Bl@NzX z=ZO~*U;{EM1)(kf&jPOUAkrt$`UbwqtdxQRD76T*p1>pbGnGH{phckd1a{;uM+1Nx z0G7oHL`CNUtzFH=Rp;^$nD&8-<6AAC(%cPg+`9kk{1FWXgTY`h{3&0@17ZU8JZ16# O0000QNRcopLVK)~HmQ_d58LjqlFe@FN%MurzIpTJ&3ER#nH}ike@7y! zqn1`JZ@av8n26JVDQIcc;s{$_+2Wm0ORJ9k+%HI|6O>p?RzRz&orzXeScw%eJO#O2 z&icOdBVNP+ZcW^zQmMpGhn7|?u_!ERIATmI7N2n>*mi85F~M{N5t;%yBOSd^OrkHF zzJ7h##CWb;uoa3)*Dx8r(C`}g=BlNoHd;|d)CHUZr%-s7M1N#DZBZ9!MU~Q0+Z{N4 z2?EBtg4h&@O##5jpnq3NkK1VP-J+B;l954MKObjg!`C@z+Lz2(|bT90*#cy{hgmQQVKF70gxGKpNKOZ zY%-0MLVkOIMk?Ccx_af`4lv%d^FH1*$*;L(<0S!*U+e7KGl4|I4)S5*y07ge5!E*~ zfrZz@Y|M`OY;Rt)J9uC0+n60?p)}kZf%4X2V(;Jt0KH~1U)x2mxkpgcg|q$MG^}RF zn6K@!njHgR@8Bf#Z4jwa#7kjM{>8POZ@s7sUm9daI+M#G*WL+Tf0J5TwaO0a(nmKKl4)@dtu{_zchR7Nh_G002ovPDHLkV1mWZG*AEl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/plantbgone.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/plantbgone.png new file mode 100644 index 0000000000000000000000000000000000000000..00a8ac59469f771d805b0ac5e30ad550d2b80ee6 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJo1QL?Ar*6y6C_v{Cy4MEB&fI+ z?$y6sA5+vj`~SogF`f+*RvmPi*m}_Yx44*O$77FDj+5)$_*&WK*9%l}3*S^c;IfKs zhAU99p;?Y%r1ew272i{T`LE00$k@g6s35Ju{doW0Co^5QFfL*6`W?h@8S{ z!71)atqp4g9u%bg_^-^~{X^u^;-*CcKjbrdoF+4C6fr#hwVCHXbFZYt_4%?4>~~Td zqW{@nn9=x9ukzT0`D`{DJMz_Sc_+k(A2?XNsdN!T*D1yl!y@j*fd*V|2Q?&aGB9NL W+Qsfzz;Y7kNd`|>KbLh*2~7ax6Kbgd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/portaseeder.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/portaseeder.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9830df0b6d291ae13a833b0a59883e987c7f81 GIT binary patch literal 683 zcmV;c0#yBpP)8OMMgB=y8=vFc$W0!Whpo?_4 zp-^tTP|1NyLT#bcbGQg1F6WTmncls3y>@M$<$dqo=e_6q>;2vfGhBBR@)D(#K{y}# zJ_FY+TxLBDH}i@&Uo-*mPCQ1V5kL@%NGStd*AYT6cYh9mZo3oYG2%uZ1IE6OcjDol zc=SwDxem}X&4`y5nHH|Ctp$gNhy4EY_uTtCw{I!=aUQ^<#fNNfZ>Q>{ra(#=RF|t% zm#dfZXc}QUz8)N;rX!hx-P3(`Pxr&etBS|>mP@6eTq*@|&iM%Jp6B_Qd zynOvCH0WG3ltuXT-el~yJ5d8A@Bdua9p8;QfPDUXF0DZ@a1S*D+Wix%pK?p(L zai|zZG;bAK%6d{7u(eWd!X$*@hb+sAys0-DO7Wg)Cb%KG?T&I^!ho%na`Ub0@);Ot zTJ*kFt7YbY8q?h2aENqWo&y^SZo+`|y}{1LSp+J&4kW{xhS2Lc*YeDsE-bw{YeF(cwBOsQ!f~j$q37|A zm@LB8g(U!_3`V0-rpI{@)Z5Mz<>%6RZ-*GbU2DyI69A7~_=bp??XxnyS z?E3-F{(tboqc|mek@t}EN_MwC7p3CCxA{!&_r)L4{8!J*edU{Bh8eCe{sDfXHYl;K RA4~uM002ovPDHLkV1gbQMS1`L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/scythe.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/scythe.png new file mode 100644 index 0000000000000000000000000000000000000000..3686b5ee1a56b9a1de63fe2a6f4d971fb33c4eeb GIT binary patch literal 450 zcmV;z0X_bSP)7a)Q*>oZW>81A&br2achSwdubPZ48KOvoDe~t`1?5-6O-Uo%dO(ZSC zgApEjI&F+{nr$tLeXj4r^Zh>W^8<*9`DM7U6RLHUW|J8JU^pCZ%%2QXyj(650Mu$S z03e&?=`8^mUBlN%Xa+}!2uMbQKX%d;>RvEN%FS_1wf53MQU#1K0R6ZsEG=E$mXysl8gB$luZ%kII6e(K} zLKFYU+8Ia*X-e)Se@uKWPR|cc_5=6)Z;E?2;9rZoL+BhC+ZtnHP9qyQ*T8OO54JVN sa`_sSHUQ5dnm;`QK%~{j#KZu=JG9!u40W^W5&!@I07*qoM6N<$f_F#2lmGw# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/seedbag.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/seedbag.png new file mode 100644 index 0000000000000000000000000000000000000000..b82bb03eacbba14fd440d01e4053b8fa8efceddd GIT binary patch literal 585 zcmV-P0=E5$P)h8W_sBhinzU>d%R zSDT%LYVJf(Fb&_|!1p)s8y0@FVZk)~hDDH%=Hj6BYsB9AyWF1;`>3+ntpE1?$Nnn= zH?Lo%R;%^w(KA^v4gda~4(SWwxk^=IcF7ZQDU1XDAmp1Zc)D)%oQc?15N&R)=!Y84 zE_qZ++97VO=mF29;;Jhc*ldOI@|??j*?>J@53Hh&nezfZUp82ta|8XwODAB!u4_15 zaJqtzoC|Z)d6y?IjeyIX)IWX{KjUZP1mlw)Z`O3a1DSg+?U8*d)v)jlx&d#e_HnxK zd`;&(aC^$--THtAGAUrn#jb1I`V3!N9-V96vDzyifC;#K<_F`G9+@#ZG&pbBp{eh2hrK$=i?z(4va8DfYb{!9D< XVBgF7wk~^H00000NkvXXu0mjf{K6K! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/sextractor.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/sextractor.png new file mode 100644 index 0000000000000000000000000000000000000000..5e66856de22c8e311da5394f84ab81ce08209e19 GIT binary patch literal 1639 zcmZ9NeKgcr7{{-?jE0O}loJ}+-iXLnG|P-i-pWftHZ8-caE>A(GG<1Rq%o=1pqRA1 z>})Gdd5ap8jS<6aCdL#dHl`NMnBR`^GjBWWp8aG0xc8oW&vWkmem>_p=N5(p`7T4Q zMFIep`TKc?>Q?;1FgDW7V`b;u0WjL;@4Y81^Y(OQaDsKXHK(=3xbFk9+El(`Lz2&` ztvd!hUmsYWy|li@e2OVFco7!IL@;yr9`KC3_i=mD%K+P5nfw*O*^xI^#Ua@d7y-DIZ%csepbD!SK0PdST2NBMChcJJFA@5uk-tHX(X??PV{761gUo& ze~{>N_h@PU`IqaSU)}-5oQX=XG@6u1s0M5Lw_V70vg=V5>$#X-v_R$$rZ6sd23U!< z1G^WY4DThYk%pF+^tzwgc{)!M1dX<4JhMtv{SEc~-C+(E8_rDJqew8oPW2}xnQ%@z zOsTzQgQ2SLKkrPz6{?&!M?a&9%0~|MD)_N*l|BIRoK4JTWbgR<} z)7!_DtxGauK)GX3pyO^@5#^aWL>kICj@z=jsG9Xnn&!7J>p7{up2)dW?d*JfcENphGK5si+s#ng&4t8}ReSCdOc&NJ(QTrHS$aHge?Wc#W829Ypb9PW| z41I4+!zBXI#g(q$oj?~D%q!4j5*>gMj9a#JjvisoJ#1aYLtP@8iEA~g!k>!W$EJ>+ za&nEC=-6!*t=2u;`x}Dz$aCW{Lsw8nr*mqe+?Y*G#vq}-Z6_Pv9IbT>^*pUAFE1Zd z{d}dbbrP&X8iqNfmE0NI-)Tu+4vN5t{*!kJ__VZ@H789R^^@Gz<|+eBMCss{eusm6 z?`^bw^+)q#EptgxrTNFUAwZLWb;hF6jMd`SV3nDXxTdE?6OVU;8>z!SXCC==(3Fh` zvesMhzIY6T_T<1QW^rXXWa>51yMgB?>-uapUikMq(f)bA=H+FLQO;XteA##Ltp zeN96;6MOS!-)q!)Ll=!bdIO7+SYgwym0Po@d@iqf`f5yw zvGgjZXJo*z7l(IUQyeetVA7-}oNveG!=RiPJz4TvqKy23r~X*!w!Shjx7FuCt|S6j zq0y)@p#!ZOd|c`lxbjjg9*<|w+@76fh+9}o1_Xj>(Y^~`FAm|cDZ%#(CFhOiBE(LD zoHw&r>bLu$`ntNhcL&7!mthRriz|RZ9IF>$4y9wsWwnsrYgGsgzVc`v}6sDLUInxF9OL3UbQg9P#&p5ecnmJrfWZG=IWp~>X}5bA`ge1CVbD3i4XtB zOsGWJPD~QO_Lv1Ni?#pic*zm;_4S2r)D@KKEG=leuanfLv-X7mn8iaXy}MrzO3qSh z1DF#ibG2-hhVZzbQuA0AzGXnA7x?DEuv1nKnk`=Tc~?xnT@Tu}*UD=*iTs%_*|fO- z{p>B5J=HjoTstGNTRZ`NX~tWsaO}|@YA5wZa7eWuga9*QbH6S+`kYy=J8WQq355`O zHTF6~$b}StsdR}Tgn7{rT4X{9C{g~Aog2)kl5!41*?|k7|BrnZOODi0uKTq0$A6%7 dEnzH2^Nzi+e091aL-&CI|NTMUkN4s){0$*IQDOi9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/soil.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/soil.png new file mode 100644 index 0000000000000000000000000000000000000000..dff27217f28e44a50f1e7396e400051fba28a9e9 GIT binary patch literal 435 zcmV;k0ZjghP)Zt~5Jf+W8@jYa+9EAdDwK9_kep*rks_zaIdX)w5$(1qkd}5k8Z1(f51&~B*(!~H zW6R^2H#0UEh>D7eii(Pg`e!9;#Luw;f3LanAAeW0^BEC~ygE*Uy*j-SPBy?=@Ga?n z7W?(>lZ0>p$ec%!Upw3iJ2lhX#?vkUfK$gJA2t;E9JmH2jJ^t`6kg;&RZlhtBkOEI zb{|J;*JM~gDE6-050|dodz_kZAZBjiw9(#nDcUYYRS%;Da<4L-8req8-mckd)vk9a z)QwOVcEIGw%x%V2tZwbxLvVJ7)dRnGfXT7sBpbxclDY#0% d2z`94egMbi>|{WL!%P4G002ovPDHLkV1iMG!(9LX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/spaceworms.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/spaceworms.png new file mode 100644 index 0000000000000000000000000000000000000000..de0238a0f241e03b1316253108cfb1125ee0e821 GIT binary patch literal 3552 zcmV<64IlD}P)odx8Kb2+YTXNs>>9aArtJ?C#_H-rHKp@o@tfHvXLB_X@t91gpNg z6%N{UB=8(}p}xB%7a(>;5hptdV-vA-A>_Mr-2!zq@C{ LM3uF;RJ^;S>TNXzu;? zejb_P2q}=y>G_j{GwCoK8xsu{-+(y$_I^Gbw5KAklgtP{CnoOVyNC;>J3tLlRFdyuG~3F z5T$|5r&Yu{{27}@@edRwh&xAK;sVBAugw+A+~!e3#MtY#Ckn6~-4THw*?|8BAIItN z5mVAY#TP%WZ6*|D7X(+KZ4lL4FoB-gbKFU$&>Vq%O&E4-{Kzg7eEL2J2I1oIXLtbs zZ^-wVwZucnrSs2^Kg0I`aOCwq0sv%I*4NTpNu!%#0x&YsKgG&&2&kj3o ztB_s4;P?Xj9ss;3KD9=bYJItoeK0ER)LPAM;{x$x7H=JP+~==ex0kEV-UWT<4KDG| z{$a;mE@am)z7Y@nX18%c{{EUv=fB0#!;hx`0C4C2T{>Ul?56LZm9`h!`}xp%*;ufX zVEyo2qE*PId@}A2ieV?gdiA>9Dr8f1F^Dg*k3Yi;I|=uOA5V(_aCGPX-6CB)Vr}mJ z2IbQBPq}oyb=mI$0D!>%gE32wk6IEvE8$g9adFV>a8oDVOC=-3SDLWeW+EaT+{4pg zOYx1vwxj-tqI@~7pe=&G`091LRW5D&RcCLMOXpj1x9?7O`^)7JIrz2r?gWBh>XZl( zcADLWe|FQSyP7z=>5teE$qe07IP45I@WIm33Q%k@-x1=Qu#Z2(3vompaWuXcKe{85 z+1&k2i!UeSHl8R&?#+!&PKJi_+~&(&!`)=o=bV1`zhDzgsXTS~KZKeC%8oiZyZ+J+YYabhl)9?Dg8(WCIHMa24X+_b#H-;i^IP#U@Q3eO=@!!%BAg5E}dUqO+AL8dkQP- zYoItvOygQKt5VqXO~;^8i^JEEGYG2&+& z9lE8Z6=0V-o@i6dzDTXizeED-yIX4NjA?ixdJdgm+V>AiqJx^-SQ3AxtBn%##2oUBtVc42fz^#i9thi{@G z4qvA*X}D_{Le4Ss(T$Vo#u#D&xmY4m(!J&Mv4G8|42esyY9!_$!tD9Z-IXH3w(z3p zy-w+Hf^|gd`~e-lZV@^fO!zo23HHt-gH$G5(Ikad$)RK*AqJ6DVhxSL@|g~pi629Q zbd=bfk#xCsGRlMqr;G$##htlq$2|I=?9q5%%$^1EFx6O^;YN8iA)@jNbxIHTHM-8 z(4?d@;+HAb{pEpr_|oQT!ePT zZ1LGATdmd9W6)G|{KC(v5yL;C?~#T|x!w|Wh9cGrC_ZO0jnd-my{_&a$qZx8kBEOH zT;{$4jtzprJbs53pS{;5O3euxu2lH0XngZo{Q*8xk~&AnCpiGj85o@xP6yI3ud`#T zj-I++uJCAvmF=7*l+8R6!xd5_jYW$mI*BmRF`X~cP+`?J6LHo6a|ud+!Z$$9aI@QZ zb=mJhv)jPxE@o}5!_HN!kbOYU)*}XB{qS9)1pu)3zOQ720RYCsK)GK@rF3)x0Aw!v zJvh7R`_Proc%>KI+CLO*k=FCioc=-(xZ%=L%1A>5o9wE?9R+%ZO*WXEdFiO|JijVQ zZk$etNCfQ^q58#e9|@}|4O|-03@Y_`&RLP5d;~D<5x^Z6`SupkxK1IP@{3O`vAQO0_*LBgy(aNmMGm z0b;zdKR|b(lH&J7+BklsEMMD9ge2<}n`lM)X{{kn$$kR>M_$h@0zk&CH6|ST@`YAv z;OwTq=sw)A;pQXm%T;+GZjY z<}tyfjpNI1F3~6jXE*)g*;5Nm@Cpe4k2S48D{)#l%w4CX*ZU=v-_$=joYej5VdrrR_&cr1Jqx`25)D@O63z zVCo9f8a@84tIf-6_}*0(FM4@LNVu*)01UN!dU?G8z_hW^cu{<8nxwR9@H2N-SCLj} z31muaWql3Z&m#V7o2fpZOXrKM5ji8=Q%AVR^0{|;3FXqZlH#JSEGNi){~mAwrXB?V zrSVxR*7klrWRj!ciwH7v=l)$a>qO1OUr?WqBsFi-qk!YoGQF$lDUMGq57jvUL;^&T z&_BEBk81?keE#UetKbE(36vKkFZM2Frr;&uC^=mm{P}(zV1x9HYfYDgEVO zPvU#M0g#rOM;yOWt+%Sq-UYhK0C0p7v}jKU=u!3)z&ULo`_{ zn<8j>#>08Mu(f_M`(&$CuE+tI-n$d23{!h~{5#R?HhkSgNB|PZ05P1FUEMa%%7W|& z2LJ#T$3to_Pj3?<|8Q@bsd9PfOKFOP^N5eSYVphEkPh&h-NtBo?(PGCqGcm#FhRh` z>$SsNI^SAZUxP}uz9Dwo?|eELwfFNOiPDs=Fi@jDhCihN=>UKuVpS4_Y-)7ax!PdP zluYm-K6#h9?Dy1YP!}x;hh(n*116QBng2Bw*HlH*a>OCx^?qHBLVBRRx3y5yAK+sS zg5zUr>JDiyJph1%!;br{TWbK%6X=)#qHT7@7>phx2~Ii>0Q?j2mzGkI)>#uC!%%SI a@c#of);75JkTiP$0000P8pQQ(O=th_5p3%VG=ss@ L)z4*}Q$iB}!mJ{& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/sprayparts.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/sprayparts.png new file mode 100644 index 0000000000000000000000000000000000000000..3f849802cdf623534436cac9bbcfd389567e2d62 GIT binary patch literal 353 zcmV-n0iOPeP)crs_rfG_0SuoEt%Cfxjkf+%MbX{lMZa3ba*Znk2zb4t+$8o$Q;8dH4h#kj) zZQJlX@6O)${Wb>RDE=h^RuO0Xt`yg3Gyw1kDXf3v3517H00000NkvXXu0mjf>xh=4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitcopier.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitcopier.png new file mode 100644 index 0000000000000000000000000000000000000000..968f26e53b615e2d108a54d41752bc611998eb26 GIT binary patch literal 853 zcmV-b1FHOqP)lG#}^yR*a2ddUp)wL4iTw1@m)czNIVndkq1 zpLt#eHrZs8P5xtqL0=f3I@8UHd3O7!4d=}dDm*_odo?R||8cq-HIf++I`K_^ZGLWc zVgK=&SHp4hbF&LcBQu|78R@xEtya5h+YWGY?+$*wb(bHnd>!na`{Emv#Ye%srB5<_ zXkX7mT>JeoTb|rWtQ&?Qi2cM*eYg`bCnAa>7ry!yK@boGfm}{RQ4|zK;rnYhn0(_c zcD=oud_JH00H~@OJYf<&P_0(Gxm+$(B7yCbySO-g3;=Cpgg1A;%h@AWnLa$lmuF6} zHol#)nNRp&>L37Jugl*HHA>}Cj(+|FmA~!<`E1)pRaI=;P8#sVeFN{jw-?Ja8GGd! zpI!crp^`>#p2>3x~>mqAk5Oz5|v6NF#@#PZK~J*iNqTp zk7XJk$bc^vAASD(WoBT(feiGkfGo?jAN&@Hmt}cFqMqk%%s{^iWc5j*prGsedJ{H! z#-$pl*XwDzpi^bIa)CyRZ6}%iq(=>*MhjCpO*L9I32}zO?^DI2i!}B~k zoerH&2g5Lghyl|y85$Y_V0Cqsa=9F=`v#iLW{@yEmn4a1vx(!hVwF%LRfvm64EXrs zVH0sI%Sx2jzxQEuT@T`1*G-5=3}~8$X`1Boc^ZvIFlw5XY9fx`bn!KxG;vt}8)p5C f{teQ^{};Rj*s4Omb9!wE00000NkvXXu0mjf=Mj)) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitgun.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/traitgun.png new file mode 100644 index 0000000000000000000000000000000000000000..159af405e656dd602929f4aa15de72c5823dd755 GIT binary patch literal 600 zcmV-e0;m0nP)|3Y1iId;wp;XYvJnfxA?3g@htSqM!gm3KWXm;>wmCVkg;~ ztKDL!I`;ALOz`*t@E?B}A3ev_KgHKaK)qV6zQtOWCGtFP<@{|cB%*pgpMQ&7nM;VM zRS`x3L{x7!n^DMHL`bv>P{|o%gNd5LXR{fu*K6xo>k#0D$}bF8e2w3970>S(a}i2MNfsOvY)N zB93F(b{t2>Wm$rVwAv&|WPO*9ewh+s81^DJ!F62_QKyHDzd#TK$g&L6=@h5aNy~Yj zC*z_hTI-+BCw$+xl3N7`EEWp@cr&3`+aL&}0R?Wi8(yy$@;vWcf=&~v5GFJkP(>Jq z+HwsRU@~Es0f8?QI*!w88xAsIUjqW&+fSg=gjH1`Ns?ZZ{RylljG_ph=b=qDmXQG~|OT*fNYaZNP8{;eTE mL}Q0000^0ja$11-^htnL;mM+Iv90aCN?r2c!*O;38$f7YORj?tmB&RHWk- zxm8Gswn+-9ZU9=+a;X_Dxm+4}>)34^@3-=95#ZalEgCRQ6P$Aq_xl=VBJzjBp=KzE zh(&k+yJ7)E#DeU)qoX_XTUNr?we)sunmj9n0Pq5Y^6}c(_ zO#b21W0vpptB4e;1zf|okN@t!{JQR&C4h*E^8FTRh<7>UP1B%hn(UW`5x9k`5m@H? zG)-AAEs4NI0jYdHolep7@AG;me7GOx2;>M!3g9`vmFo}pL(;xE0?xT)jaV+m=bzv6 znMwp)14rdjUSC2`gtiG#N?{yF2q7?zBaX)-wAORKF=l=a{VoZ}F2}qmm*h)mtznEo z*L5qA)><@86PD#Xej@T(YmdJrG-_Sfd9C%_0IYnq)}G(dwk_N9Be1mub0M#^LEJAcR=;JLl##&~@ExFFKYJk(W{?336bq z1&@E7qViMm65}|c@B3(_1DH3WTc{Ec&UfGUkWvD`d|ld?;IE&5a4Dgj+m!~e)=`Wip>Vx7r8 V%ezvw>NU`M22WQ%mvv4FO#t6cMDqXu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/vine_fruit.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/vine_fruit.png new file mode 100644 index 0000000000000000000000000000000000000000..ce53ba8555d8f2179665d4481017291ddce522c5 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJSWg$nkcv5PuNrbS1n@9l(3-dO zyS@LeFKUIQf{)wv>rTw}){wo#VI0lq$@HM-O|0aqRWI^11sFU}ot8Tlkd~LVVAqP7 zHy6+RT3s4_H2>B2=~w0}{B08Sjz53qO|bgiNqTORT8^>;En@I=^>bP0l+XkKd9*oY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/weedspray.png b/Resources/Textures/Constructible/Hydroponics/hydro_tools.rsi/weedspray.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3f7d66cd2dcac4077ef922c5dd5a744980a115 GIT binary patch literal 335 zcmV-V0kHmwP)H~1|!3EGIh zkQHP;7}yz@osaise#rbWMP$Jv%iz~lxQP)F|9LGQVc6Z!q-9Kb1N{N|>5rSfeNW|j~6jac?o7>fJ>lET4=-^4uouiY&)@?yZ zi*&^ff`Q?Nn~5T=w7Ts0c4l9f?#|exhvsvA@Auw^FZ{mXyK1>cK~S}Q8{X(uvz3nbmY(J+P@L_`sIzH{vA=@A=&nmrTiKL{f%5| zZe{VkB)}369_~BZf)g(-E<9F;zvfZun2Sv<)Ga{Slq)vT*ky)pzr(hhsa9=@TZe2G zI=Od$!|{5bm_RP~k(9AVr5q-nFwylWrYRY`RU{bPKye)r)F^yg=f{rj>T_^WL{G-9 zshfk_#NuJBdWd9PB7|gbH^S;l6ECN>PE~5Ih9)O^Rf8@tO`T+-3}{%j9>$-}de*2u eK0ZGGAHMu;fwz diff --git a/Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json deleted file mode 100644 index 2374895ce2..0000000000 --- a/Resources/Textures/Objects/Consumable/Food/banana.rsi/meta.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA 3.0", - "states": [ - { - "name": "icon", - "directions": 1, - "delays": [ - [ - 1.0 - ] - ] - }, - { - "name": "peel", - "directions": 1, - "delays": [ - [ - 1.0 - ] - ] - } - ] -} diff --git a/Resources/Textures/Objects/Consumable/Food/banana.rsi/peel.png b/Resources/Textures/Objects/Consumable/Food/banana.rsi/peel.png deleted file mode 100644 index 46bd5c09796a77b690585a2b2707c6d0c29c45fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP)*iC~qq+L5xk}*7PYTJX4agh4F&hOsu*YkkEU@#b-E1}MiJhcPepF^@1pL{wI z$LW{vj#s9qoAZ{ibc4y=f&WHo-(2wa9e91&eE0PQ&i-VHMSJcfwi9!5o^_#I7B2(- zf3i!<_1YiN7Rcpp2-diXMf(IG{X4>9WC2TFAf(yY7`z*8Z@VNO|Dq+KEztU5R{h+) zCRlTWv(h8BAHv}@{-O#B3TjEEq5#C4u%t78aeE52dX=sKz~1IpIXQJv7En~z&4Sgy zN+gNL_mQ2=b-cElvhqrVAAIUM*6O}DG(OfO9q&`TuBt>Si|XJ$F1H^=fJ9=8Uq?1R zPa6lx9h3!##kbx)?ZdQ!!$U!7Z8^j)vMDXjk~zC(b@dffGsy>iFmC~XiLrVSRY++` nhTK&nBct<=9yb^a1_Qt?P@#JN+Sv5l00000NkvXXu0mjf0P4}g diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..817c0f4bff16fee612ea7c54b594e29462015f5f GIT binary patch literal 390 zcmV;10eSw3P)6gV^dr>h0X{IwZWvK-kUY(By!Pc_StEx~6fvcqT^>@#Dq8xFIS=5Y?Q1e-%> z7W~)@E^ub}U*OE}|Kc3){|pScLxySqW;x7aWQWX*K^4R1c$$F_BZTGXK~L4Fz~>Y6 zP@%fz$QEJCj@TTB%~2EsTm=$(uAoW0!kq$qwl8)P@^$agO)@BV`Q#&pu>e=-$P^h#dT`S`amcEewq3YZ(4VnL+f@exXbwvBLs$J!8x%E|5wM^Vd%kS4g&*;+3%X>B5}Nn|I&OIq%-{W(FFl z6T|bE)jO*4lFNQ~+&w9v(zh8%s?iBmRy8`S?P!37I|_J9^4k9{w~<*v$CV(!pbG5;h zoV1^wz^xN-I$nyul6GxQ;-NT%PD(bw`RT#oEr|Fr?;n!7h7<7dJ4`h}a|i58Lhg*1 z&eJXPpP%|m0+gd;K_Ldq4@MfsGm-%#E#$?#luoTR(pKM<00nPUoWC$DMjP>2gaDV{ zfd7Y#9lao8C;IHk9ScxcJ|NdIH~_uJrS?0v3E7=ehGsk9@mc3Sa5PDkBEAGmd!V%+ zwrrIWT=$AMj5Pe(fc4kVwp(I#zlh4oV?i<7wN~gHk`iP~*Rr4s;nWAoOeTU>_j^Dg z6+oNlleUi%xFNqP~evvG+^hn)fLCHidsQF{0+&!Lwhc996ig-cY1}Da=OF%ii zQOqNc?H z=SJN94}#6-xDuwj&V%Q(6=>TITy?9Vfd(4*&+!{9XYCfw!?9KX0000YE9LGQDA80UWYlk922CFD^a1`_r#L-Rb;_3r9I21vA1p5|(_zDFPLAMG{O*=GN zLW`u4ww^->F)q!8xZP*DaKFoazWnYE6bgkxp^%{7MAVyzH22KN$ek`YUH=>4bTi#B zu{pRvq$StlE_9C(qYm^Z@HB>&3uoo9zTJwy*KcASf!8Pr{pybL`4N?TR9?x$MipLm zlXYZnYOhfe*`0j=W)Js#zd1bj{My>g9~VvdIt2X@3YT)7$jx0bbrAhq@G=N%6cGn< zYY)tcj8-N9pe=pke!x_NNhc~F)WFb_$zunwhfrvP?tyNG^Me{>R$$qHTo&y0e+clt z;NR5T7L42AR>3X$HA4^ONr`n~tZRf@3|swIY7hN!^+f(DO8xM96Mbqypd@02LZJxw Y0avwJZsa0PIRF3v07*qoM6N<$f{${h1^@s6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e380db4cecbed4d59274f4327f2063f990a839 GIT binary patch literal 268 zcmV+n0rUQeP)cJP4RGrjwjG-0}2S==lBkKkM=^myuJ;o07^FeWuE}K zKt|?cE`XiD7qJ!?9Zl3Ga2lJKO=}VWhyob4Os-rY3ZT;me~{Fb3Ou=;p}Vj@Z!NI9 zB*U*8Q`;bZ3A3yYu=asvQdcTaW@wt?R}hw5&yf3Bq|tNvFXwHG^>#QM|H}hUl}9^7 Sy^1ja0000}|vV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..97245d27f2f3a08dc02d24b43da44d76e47ebbae GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJXipc%kcv6U2@(|PS92R5vlZL=AqpH*3ofx%r?aM{jpw@rc8FnGH9xvXR!SWfr>~)Bsx2z{p_0A+CJ+ SKd%?idInEdKbLh*2~7a-c{?ru literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..37bd6d53d116718c2ecafc38c3300360fa6e44a6 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJNuDl_Ar*6y6C_v{Cy4Yk1sYsw zd>YpFpE+&g!#RwbWNr#hnRU>mbLr*2;4E87K8tr}4^-@9yZpSwpZj^X#J|HbO=lfT z7>$z!`V_<`$gsXRu%WfF&_UKgbHNG5>+|^+FsB`JcqHdGnfpZ7ex`IEZ}m5-=XJ!2 xOne3OQWJjs;Zr=IedNG_3%-4U5bF;xFf?^(gycWwZ3nuJ!PC{xWt~$(69D*&OQrw- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png new file mode 100644 index 0000000000000000000000000000000000000000..8667357c88a00bb887b013ff128085dee45a9c27 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ3!W~HAr*6y6C_v{H!v0KYkTzI?C9Eg@Olf@h*}8>cy#O<_v-!?Epz{+%dI}gALUk*uPrT`x0`wb$ Mr>mdKI;Vst0022+{r~^~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2100edd39f83efe9b6f64278bd4f7cadb730bf GIT binary patch literal 499 zcmVC!f=^~t_8g|1Vf<6O&xK508jhQ^E%pS>WFNGfT|Rrk(T88 z161~;n70%69ax?AGFe9)-9jk=#T0@oXyzrE>PE|wdpEX6&${Wv2x2wcT;qOoacMf` ze05GU2G_ITN@22&=)B6-uZ3afLdKhUx$atU`Yes>H0R7IP%w4*In;OVS~fXIgB%r_jndkxpv@A&u(0HG3{-^#KO+tC= p7=mARV0{xf^QvKqC6@T-_yOBF!+5?w`f&gN002ovPDHLkV1m4G=*<8C literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png new file mode 100644 index 0000000000000000000000000000000000000000..be279f7c12c5bff3102e8e81ab4567eb0c386c7a GIT binary patch literal 584 zcmV-O0=NB%P)|VsTiUMZilD4^o&SSS4U#ca2uZ zR%(5XSS+kpSp<|VRumSCWt+8l4zt0S{gFTl?=|0<9cI4o`@V1H4wkqeT#qattHP<9 zbl$gn^U3FZ9M>aDLTI!!uSLKdde#A*eX?d(<0Q1-(+HYf7|mdJ6M~)M0tSjD0w|`?n%RD8rsPL%BR zLs(yx)UmHNw8u)GMrujklx1)(Q`aLK%~X}?^`vJd9|j_2$fS{VzUz_2e(_DH)Pj5> z6F~}1dKx!c)vjTshsfN5eDBv+mCO*_JE`V_QXX(UvbT@O+GCqM_O+Hz-t1}~`{keJ zLIQaoe0i)2K`mJPFQZbKR4U5G#)oqe+V?=?RBQ17hT1dg}K7NOek=2QK1O5K99u&DUr zT{;0!^;bgRc-!9bjT=`$!1NvzpWLhWe-Pk$olS?gp2Erx`(f=S@S-keOi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..3df1e3a50022dca027ff08298cf54d570c30b611 GIT binary patch literal 593 zcmV-X0)LziaI(8YKP zv{SY;LtC6s@CP^u6&sTjb!cUr_(N8Z>EdTOhg68osN)h>d9st*MC&7cN61qgovXWBbx-I~wX;Q1zM7dn{>h-!Pl}et! zHZ9^o*x*u1Y}*!wVPF^rrfDLjWHcJl>-89oMvTW}YPFgG&@>I-N-1Z2t}MXM+;q?EU+7-|M=+ZL5d#RDc8-X*ET zc$Ujy93FVpYE?8E4FTXd4$}$vglYjmwOU;`H}5|ki*MaN-&5Q4zMS4#tJmvu&xIDS z3dycRM%Q`syf8DccPqEDfGA%oep^BbSe31c)%9eaFy2BwRXtpdSDeIAHqapn?%3d7H1djrTgzy zfx@2REwaPmFW~P0o?W!L?DwM;P}ozv*4JyX$bLTmh%dqqest0jub(P`e@B7%PVQ?r fY}l}2!#w@~W%JMIrqjIg00000NkvXXu0mjf;My1X literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..44aeb6c967208bde602157bf7eb77514a94ac3dc GIT binary patch literal 626 zcmV-&0*(ENP)BoZ=B2qmI~%0v`;UF1$WlaG#R2i)X^%egai&UxQ^?&02n{|v>|Y(>P#vt#}X zu9K&Lu(YFsCg7rL0st~V4>**=DvaT?ttzu`!D*`sTZmKA8d4NCQA6I@Do{ia2K<(H z8qk5lC-_pi1wiuK6-vdj!ZrfG^f7UW4gcN)=E|?hp-Jl>kT>gI*6w^Jb+vL5lS82@ z1^cCc7+V!*Yr>RF)B#pe$f0b0P-xb@Jb3(@T20Wbd%3x?L%NV2kZcV6=!}Svm~9J8 zVu{UXipXU&B2j~u4v!vQrq(dH9@l`kys^gSW!#p%hi0q5#^k1L>67RAM>Bq`1n~+xWcv{#H=Q@a90y-sPjJe9|lqxe+`1xs`1mm4Ax zi_`A)PKg@8z01ggL@Z7~^>8B^bM$rhItHHHTM@xvko{%@fTd7~gKl@~Hn?5^pYIZ{ z7rv5+#aRl49IN2&bqr|QB6s_X1XK^PXpB9*d8+@JDv(X8VwyFKp8&LbJ@)h_2i>l_ z0TgA?NAW(KZw6T+^d0P z2;_}|hFFL#62GEIs|l21j2<^Z9QrgJ?C@Ok&3#|zfWcre7|JB{Iwbe)!0=E=){~#_ zPsDL1WXr7MChZW7UP0m%P|@FlX0B@YntY;L~08SU*kCz*VsC7~_Q{c=Hl z-@YW+a)lEc6Wb5ra2|hE9TgR=8n1g)`iqO08a{D*&*Q9+Be{7c~Jz^YaC; z+KEN7czmzOq&M)|Zfa`l5xy}vaHQ4!$I!=_PU-K<(a>0rQWnj@U0iNIiU6t976*qm zK2HyO*$m18#A5XAj`m?%!KwE_>F(OcuCl3qSfp@zNj(09+4<~WeXwi+fKM}RBC3+= qM+Hh39ZY{%`sZ0000P)1uYGjpBWI6q`6N`_`g5<#I0QNrb1Fet&jJIAfk=t`nR;KEg|TZbzHYbON$ zL^@&%!9a1sNktKrMu)kcxpz*R)^bO0N^qa;Io~-CFMKa}czAgH&lm|q83{w(vsqD)rs*yRIbAa<722bOw?q zRD>k&CLcLYBH)HVDB?%c@&p6*+;5U)&0bmH+v1q|IP-zg6cmes)3tviu=!(3QTl}_?Gdj#Vky1G(+J67Wq%G1i)eVL zS+%$A5Qzq{N&(_gi4c;5{Sd1wRg6z;U%Jp7559T*P*vyx)6|K_a)5?aY~j_&v@31u e;o;$NWBdWd&XcdloHV`w00000fhdEP)rfj^FnaH`>Tupqy!4Zmqg;LI`3P! zKo%l~ZubO43`9&RLs@``q0>3W{T&d7o@$JoKzX&8dTzDas2>=p+9iacmwbh6-@*hw z630UTz@V?1@I!&@&PPvwEC9@QU$sjZk6)EDlmv)aYWSJ|45#5HYmq_tPne}va}k_- z81y-g+_q|rnm`;6LB!xR+|=2x3p_kd00b~soZNxYD0uG^L;5zfw!eR+cf*BmLybnG Zc>~LfbxNBie|G=?002ovPDHLkV1f-|rqloc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f455b562fef8be3ebc0f3b0019dca8254dfafd89 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJcuyC{kcv6U2@Jwx)GM*J=ezf8z&;RH8pPM4~BsMsu{4>&Dq?@*A+tY>1*8I=E wTXFosf`eZ5_uFSV>9j`jJ?@7ZbAX-UkFRX{EWetyK&u!$UHx3vIVCg!07#}fTL1t6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d3636e9ea3f877090467efbfd2193ab4cb2c87 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJxt=bLAr*7pPBG+ab`W7bE}+ey zkRG+se|_#Rlb1!@{TsHQ2;9@!QWB>y_iI##5R;+ir|=f@tML&t676+36kC3%^YtHI zFMTmbCn;ShK=AD6>058GFl>Kgaw>R19VeIQg)-YE2fl8WNytws|DojlV3Q8}YVj4F zx7PiCx#}iYm-D7LhndI!71jqmEBx{QL5RUH5T literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2a215896cb119cd9d4c17fc9162c3896ae59be GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJXPz#OAr*6y6C_v{C){Y@Yx~b5 z%k!W8n&9vD1Gt;OA${cwHT-z|PE5eE*N=L^nZ-*I*0g;R|2U)~uSyfFTgZjkPvD}90Ctdqm< znVQVa7ImjHUoo(;v9gTe~DWM4f?&fZH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png new file mode 100644 index 0000000000000000000000000000000000000000..356953934b5de1ce77058a6aaac4e81e5b40d12d GIT binary patch literal 377 zcmV-<0fzpGP)1-w;U!Zi=sbgFM4laIzEP`(0mbIUt9Ryc9J7n&nI4L?+R}HuY zmviW)HX${ESa9JzP7d;dT0-9gJgvt=}UfLhHj^0n$Qur8E{1t=V#2Ydm~`6j9x z2v7{Q2wDih0gj6E*WZE=#T*y{^UOaZ6@XmQ4}#go|#Brj6ZS}6G}Zp zBNY%4ruS#1_8M!!;^VV<0|!n=0Zi}4sW|x>B@yukY0+%lh`2ZCsAR0Kx3sjhwB+#v X9sF5z;{Wux00000NkvXXu0mjfH_oN2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png new file mode 100644 index 0000000000000000000000000000000000000000..0aaa030699601916da413bbe15a6dac89bbcde6d GIT binary patch literal 427 zcmV;c0aX5pP)o=5!NU&y`O0T?#2%<>2nAOduN zh8)5=*EuOFgI;>7g`u z5ZZ%RV?j#P62g{9z(z{Y@sQaxn`B*AMta#l438Q9^WOixc{984pCPn*t0Kqdq5dCe z4_*W;Wyb|g!HhNm0Iz{A&{ktq7{j@*D$$SNrmU=yz(r+yN)$d(!?@8ZP(@+^sgboL z(1PWi<>8X^`w6vbUGNo2N^v~2@!|G8;AK9qMpD_-!0vDFi&uZMtUiABZ_f&XhTnp9qvCL8vx-$#@l(D!JKB%<#jQkb26NT<_bDQ9!) zT!r$r3;3}0N#re)^*`Sy`(O(6zJv;A{Y%RIJn2FLK-Tu^fybx40sx22p8)*oc0-u= zBw*2AAZ;XA%Gse@y`N*?{hL*p$z+CA$eJc6u1nA{+{-Qa^5}>~dx5NJhE_p)6DE^$ zlrQE;8wu>3&B1Z=M*f{DP;v|zWP81HV9($LKmY&$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..4c7096265c3ed1530184812f10bf9710f73e2b21 GIT binary patch literal 688 zcmV;h0#E&kP)D)a#q zcA|B#1&>6@OkshgR;Y9H?b+SIboICyAqWM}4{o?${`YlX_y4-U!otGB;(wr{7y0{I zi<;MGiWWrVy$l15k zOidz=?rBkEa5x{!A3ixTQEKznoff(J;}iBu2XE%K&?Ybi2QUs`C#`UKFh??xzo*B{ z8geSzn+BDR9A)KZ&4~`&jaJB|j~lcEAd}q!VDX(OIHSi9jqNr9JszBOf~gnK8Z-yi zV~Exu==wg+IzgbvLu0!QJ%$JjmdmlIQgEaw0abCaXKcaYC&uobqqE~Ws&H}iJDc5L zKE8rsw^A` zv^vL!_$B~--9y+F57{&*ib^`=#a-W2&_g~UcYPD-lov%&$)>@sc zy%s%eoI&+hcJk z15=ZTWC9X1`y%9XN!MyMy>4ewqDO>$F6qux5oxYuA(0U^-c;eN#+zaxkr9z#rF3T< zgf8UE$3}6}7j29L>*S-GUA&IZ;;F4?cJVVa@At%6XiN?OjE7YD?Dh?o*1mGyQO)lD z4$Er_;~`a^M)Ty=^og312>>jwuaf+dBK3Wpjm$O=u3bDX`D@Ln-}y(4g@uL1KfzBk W(IoF>jkoXs00009 z9?ij(r1m1N>W}2&5C9Op3!nwR4d~ZJnV_ow8)bs@5mp@|SCY()dSMoKdCntrG`IeO zle0R~$*i(2SCZ1n46ftiM-p$-gVJ~*xtY}H@lv1>uR=GyXLR!=+lB+IZNN-=`C4u5 z?)VhVq(-Lmbd@?Cv$@T&4$#e)tPwMOE`Ceq1vJF5YIc%%+8r1QA3n+GPr&(q&+U**_LxU-|~CqQ7! zHg{ThL3F75gp^!8BD?Q2uLA2|v`WpbrgaT$Y6k$4S_;Jh6<*gWJTz~hDCDuxhpkm^qG1y)p2Fz_%e0xj-2WTXwHZL^xhaglfrN@%RngQH$}5}<4MZ?*46Xue z@3ySjhP*oo5cD{XxCp?kvEtU9fZr2Pk(c%Db@- dQWf>z={xr{ARimdO42t*DKtSI_$By=i2QBIpnSmfK3d9NMv)I2;;59=^!`Yx~>WV!3A77u4BX&`- zfqTO`&cuXT0j5NK4j?V$6wm&LFY@q#g8s(FgFL6EE9#19lrfy%C(!nv=NJ#qMjjsR zxQXlLC$T#mh-~}+?#as~lb978!mAo&3f@|_?E5q29ACms@k2lkbMrKnBZ3E0OU|_E z{8qT>>piJ4@u?&m+t!Rry6FiDn-!97UO%_t6OYO{eS6jO&qXXB^aratZxC)->$dHx xfJ0Dj#EWC!=0|M(ySr{;$~O&A$UI?Un0qBuz8u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..012d95655ba2338f1f41dc7e369a4af5b53e2423 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ0#6smkcv5PFKpyJpuod&z+a{8 zB-58S4L90ljoi~pw5&cTFLV*9Um9`wVh9DO@S|a-k)VFrFaeo1Yi5Vde7R2e>SXjmkgWl zcGXAMl!qtc(t%f(_e)A{kx`J*WnVLE#nLp0quE#)7<|ezr)-m`TnY3RgQu&X%Q~lo FCIHJpV=4du literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/carrot.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..5097c228392fbf4474026c1259ff446a4ba1fa8c GIT binary patch literal 369 zcmV-%0gnEOP)9 z9?ij(r1m1N>W}2&5C9Op3!nwR4d~ZJnV_ow8)bs@5mp@|SCY()dSMoKdCntrG`IeO zle0R~$*i(2SCZ1n46ftiM-p$-gVJ~*xtY}H@lv1>uR=GyXLR!=+lB+IZNN-=`C4u5 z?)VhVq(-Lmbd@?Cv$@T&4$#e)tPwMOE`Ceqg=WZ9a1x6SEhk-EI*3Dsii3j+4$>j$rW71n z92^S;hYD(?21?sds-)10k<&JbCTWvibI&OuY0qlKt@l|Tzwh1eeSg2-dv{=AVPRom zahOP|F*!NhEt@r)*-IUMHyN!=hu=-_!#Co873+TAEdUP)>IBQgs@9$#1pjqHdhg$|yF$k0T!P8(9KgC)=9_xsuMc{sFYi z6w|47{OwM*w+$2_7#f?~Go7Rwlg)Zkjmc=Fjit{;Dy15Bl$Jb^RAbWNP-qWE`M8+k z&UjkfyK+Vb0xkweQ{rx4MCvt($8D!(NQ6@$CER+pAa)zq$DGm14LurZV`e@_Wv7Ni zD2z;`Tk;yg{i{(qGQKDP)I?CmJADj}rds07e9g4$NBw8z(KaVGf0*prJSR@YsOFZa zmJHT%TNEoh9CJJNm_ySYsGIMHnK{7C=ksFV@vPWbN#k=kc{}rt<<$}^-^=Jb2G>=U z^Fa@0_ee3@@Lw4kn-l7j52CQ8BW&>C<+6x}eQ22}GFsX6i!$vT!nzwg<;gt3OWI=3xJ9DmERW8*JYPlK?lI^ zv7;6A#`^k`d9$WsPYBt(0l^&SXdlhegXK{?~$^OM{588002ov JPDHLkV1iDjB9Q<9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a0afbd10ce2b28add8dca75d2168d0b851e770 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkld+#~-%*;Z91PKx(STL?zD9=I3cv(80gL3;&&ck%OdVn<# z;&MJZza)zQm7NB0t*rlr)N}M#&VyZQU>9^@0xP^(Hu2tul}QWuy{Idaq}q(S6Ry@S z=_00cNt_iI7>Ec3RCe^7-vhfaQNJA@9}tIf*o7!LOpZWMZDP57@E^4UCUUQ|dsoi03&e@8AcZeQogY?${M1OooZpXrbpdNd?cS_$2@)jupZEkQpWBYTeoOQ-8_ zem04Rnp)cq_k(ap?vnrSzAq54SS%Kc#qtMCMyS;o1#n*G!POWwT|(1?;&^$7b4YO0 z%ilXIV-3*i1eiuyH$Ar+>#OO3+X!%LS{&GKZ90M52;d`zi}eVki+oi;&tbhEw)XlV zPALJSMCOI9PQYUl=YunQ+*&>yO0+=mL!9Xn(wVM6FLPcUS z%8TsdM@rLcqv}<7d4qa&ch65suWkMxSpGGiFoU^<0ZyVf00000NkvXXu0mjfst~!U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..54d1d2c03a2062fb081ae09c560d13256e8a2605 GIT binary patch literal 586 zcmV-Q0=4~#P)A#)HAywaND69fAQ5Rj6s#atlnEpjbl8c9zY+O%p+Yh&{{Bp0riTym)n3im882lsuy=X>9eJMi%MpLt_Q_1&t} zK0hv~``ttIxOzUs&MpM{(WQi)8iWHV=Y~k135(2M7g*bp>gyF!Yuf>A9^D0Mi*ubSlWo2Zy>Z$j0k}5oF4#`)J1lNOxe7ra%4mr6<>PxrngX+i)Rs1(T0{5s!OeL4 zO%Fa36LWbOi-Emv-Ihmm zi`d7}DLj({*c<#P5zRC^V8t#X1SI0^MNA2&@aH)Y4#6gl-vPUb1a5Wch{?-*{id7G zPQhITdKIy@*-fx(fo>u%mSI=+9^A8llZYi0z;*B+Q>;ienJs9^?EZhn9v&VZ9{&Wt Y0V6OB|C=mJRR91007*qoM6N<$g5$OUEdT%j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fef4a8320a148be07b584e5f4d7865aa33eace2b GIT binary patch literal 274 zcmV+t0qy>YP)%I>_<{e3k(ZhzussZ|5&h?1u=%y>$zv?(5|M_90OVGniy`GGraSe@&^I^?tG(p8Nsd zbH!Q*Q>Y?`Em3rdlUfIW@#2^}*!Nrsc4q)8WtU)gPS3<_^;xiVpzpcz{^oakl~VuZ Y3f_}MePC6ZUH||907*qoM6N<$g3--)8UO$Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/chanterelle.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa7e3e9af607fd0346da4f699a9d901111fcd50 GIT binary patch literal 344 zcmV-e0jK_nP)~M7;{- zT9e?pLwOsl!)#9;$@IQEnR+mU!3g#*=IhK9;}CBVe7!?D5MT_I4iOA>&160|0KoYP z>gWJ=&#?L}{R!$-vw6(8t@{Tfy*HTyteIZM0=KVvB8$uc)=#l6@1U}^*xVT4=H9%| zBR#z${WDFC9hB?Xe0)xD9h)fn!Sh30#|Gf)agr;1yjN159|EwsQNr`XWbM5a{0U6P)Nkld+#~-%*;Z91PKx(STL?zD9=I3cv(80gL3;&&ck%OdVn<# z;&MJZza)zQm7NB0t*rlr)N}M#&VyZQU>9^@0xP^(Hu2tul}QWuy{Idaq}q(S6Ry@S z=_00cNt_iI7>Ec3RCe^7-vhfaQNJA@9}tIf*o7!LOpZWMZDP57@E^4UCUUQ|dsoi03&e@8AcZeQogY?${M1OooZpXrbpdNd?cS_$2@)jupZEkQpWBYTeoKP)i^V_Y-916C$FV0N2~`6Kwy7FyKQ_jpkm__+NWwM`PyN^WHv?XehduG7 zFbP$KGsUq9Zw(PZLO{ETXS}LN%)^tfy58TCcTf5Gsk2;zxC!v#<4@cTh_>0b4ZEot zjKd=!qz$Qfd9MBL3A`NH$v_&!8vqVSLYgtNxu!~&yqu@h27v_0DM!u2mp^@1Cy*8@ z(Y=9!1109zlPO4MBNTQnx!p!JuObdoKuucLRJV8F`)BR#Fov*$3dr1tG3qzr81tTM z6mh1w>g{`pPv3IYb=O~TeAMoQlBg0%Xy-KkAar_XE@OckzHax`Un~}j#sAGOu%fq> TV1GAp00000NkvXXu0mjfb@-!y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..eb913e649783b67a256478c9fe33e43e21d4e720 GIT binary patch literal 456 zcmV;(0XP1MP)mGfVJ=gm+p8)WR|4qvs^l`I z{{sjr0={cNMxfPc^Kcgx0DHS|aXHt#oa1S6y%rV2kv%paE%p!3*gkp&K#xOnVt*@? z-9xxeLA@6Jx$z3+xwdRPTbyfpe06PL006_$!n@*iQ#(Jl$j)rzUe0mKRShhAWHvMb zFnw2gN&pWLaC)E43+?4ILURJi#F_#A%BP&m&VJ9!I`Gm7t|H*{UK*F(F!)-9aBJK( zz;atjpo0^OWCC6d_f_v1z!^^GJphX$jHN8!5T4r*Z12s6CSoZIu!~ZT*9zcFMLI85 yaxL3)V=^0>P{}_i{*(qGC4eAq!cd_?h582TW1iH2%W%*D0000BeUO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..ad426280ae86043ffd435a7b573210bd26b003d1 GIT binary patch literal 456 zcmV;(0XP1MP)n7hCV7e));cn|IJgK&r#^r>DUBPA zf;kR&p_CTeUWCN(ZS6Vde!rgkuYiOsQ(>8U0LaJ`s~?^;L^f@qWh(6cK*%Un2P{+J z^TGfC;BMtt4{*Hefph}`V&wn;z}*H&H`WJ0x&iJs)(7x!IzVZPo;w-d*BGQ5xV^c? zgZl{p*x4J$uP%nM$BmWPZ08sN-e0HhE|0$O_?DlT*UBSwdf5p`T!>$jn(Z75<5qn- zsAVebH?LNh?(T^@y=B8{sGCK(q%{rKrF(IHri+-8GQp^`no;`3uD*-0000!EA%k^7N0SMh5b2rB* z34jZ>Ns=xypOIyCY+*23lh!UF)fQ=Oi<2+UY4+Z7>w{*P~WIBm5aPT8nEA9XcC`Nm_sU+V`kGn zk+@CZUJ(h6%)e2T6RaL#>7uY9k{z+zF6JsATr6=F6g9AP4&}^Y@Q7; zoeABZpmjhTl>ivUM+=V&I;j&!CA1Fc_Jrwdc?veb*}0^bLwOyv4ydW?h5H4a)KOk1 z4bA3#I|YBix+%z=(eSY)-a$n4gTY`hd;tHn1EJc^P0auR002ovPDHLk FV1f}oqDue( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..93addd8ede62aa363a2ccc2877930419edcd9088 GIT binary patch literal 270 zcmV+p0rCEcP)lT{EZu^&4f{zFA?A&v_|ZE*gK+1*qYerP zf*?$cV-k*HuYSHNxC;-u^{}s4-E4s<_G;H%!e4E)*`mDTdP{LS>ig$h0q$@Btz4?j zvIV~7fi_c=IlFIWD$s?Ji`9NR0SciM0TfOoFaUM}DgluKR5FnO04E@;{k;XYo%i0o z9#xvz`ah>IpPM`wj;T|AvoZS97y#|7_GP2*UsJ2Ijdx UhR(A$SpWb407*qoM6N<$f?Tz48UO$Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..50c14731bc1ef49394b39896d6403bc2fa975db5 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJOivfbkcv5PFCXM=Fc5ILxSo|G z^We85MnR4qx@F1QuT`7U-6L8mzo*!zFsG%Z?Z3|X^v4|22!4iJj#m~P^EP{FblZmuuiS43E_Rl$ndE%tMhO`!&|0h zNA@(bl(dK}Si2xA&ry0-dYTDyg`&@<7HzhM_yg}7+Ah>FEstR+>-g8Qx3;qEQ8+_! lmN*DEgfmWHUZl~LmpMi1#m#L6T|gHxc)I$ztaD0e0sxk+Ls+B|E=_@$7wJ+e%!9rc!bnPZW1d$F2 z9tVlshJxI4LPf|o-3!S%fBtjs$%R1D%t@L#@%N!IeB#g-t}lxS;OfSfSS`R80nq8$ zTu=$9629HVGDu332$g_}_ca`SMhuct9m6C5;2{?7S9^aaz=}!0^S=Ecm>sa#4-ozS z$ad1qNvHR{&R;fB|u$;A|2} zJ>lxrX>*4QsPp*bSmgRK49X^~%CN{whJ9hWD*@9BiI|i>JuvJyawX6+TOzk}q*`lY zH1ac=Es@h>-7HY`fd94Y4>&*34Qf&c&j07*qo IM6N<$g77DwQ~&?~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1068d5e6544881c232a04bf857831c33e879f8 GIT binary patch literal 510 zcmVPml)X0@Mg0aSkMesJQ`6PT-2#MG6sx<0%_xi9cYW*Ys&SXo z3;-C$$!U;boZK)@E(RKMEZ)<#NQi_0<(|I7pky5V&vGSEOH;iTVz1e#S!RKb5AfS1`3r&6O(VTUqqOs z88}ic+KJAP^2Kz%g$f|R=U|%kLHblc53NjU9QEN8mn}`R|&el^}ONa2{oPNP)Ekj z<-bfE|9|9Ftec7@G-l$E^?F@PHgw4VV+vx9*g>caR@p+h!#Fu-8Cw7r$lAJQJMIg% zTiy3-5wTbcY0WO!$)Rk-x<5odW@jo7`<*|YuXk(oeSX97e2o$~?05btd%1nvPH>BZa|AbArV%=qXdcSt|Rowi(%GWaCu-SnHOeLTNRvK0sCR_nL z2WowCQ`t{^^U87tYL$1Yx*Ui@EbfaA3bB>q#DABF(1f=CdW(681{t zSh4fqUGN1LSPl~OQG%pG1tK^}#Zuh{czgNl5~&s-!laKESmxNI2~iGO-wro0x>w$c zKF|HX?fZ&v9K~`$9-obu4&8o3tSQ!DY$j9As8#z}5v_h?@`%DP(uj38=$Q@_9i%1d zl>WKjglhv*<1hKcVI9*6X4QZa(BhkSP;PnxN-hsF9VSz3lQSm{(>?()FuEW71mIVuLXpbq8i}oap&akTA;t-d$XI}?Eki3L}AGz&KJCq zE?|~{Ih|iczl59R;=@wJT(UZ##5FCjibs@*{Pd9d4_I6h5n5Uh0aXHX8IQXC^C>m} pV5Co-c7TG+k5ZDnQmIt_44*v#ax}3NgF65K002ovPDHLkV1lt2i|7CV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..fde1c5b7e3e82825086d6e5ec674b5327eaefee6 GIT binary patch literal 321 zcmV-H0lxl;P)T&;$VNk%!>s+K&P2ill|Ac*f66_$xWF*wrnt;R6nGH|tgQABzfWy%>J*~W6fXduph?J-O(v(+J=TYB*NJ;#) zZemn@YJUZlxyLgWm&oiHlc4G|V(y|GoZyvQ?FVp<$|;_070mdKI;Vst06J4MC;$Ke literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..49e037ad763eba0e89d5f295532f90baca164c3a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJDo+>3kcv6U2@xE{cUII^5^6~;Y$KgYk({QaH!^{%i0fX{0+NJipw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-4.png new file mode 100644 index 0000000000000000000000000000000000000000..89aec95f271d1c9e87c819d4ae10cd767624ca99 GIT binary patch literal 348 zcmV-i0i*tjP)^spXwHRA)%~H zA{8r*?u^#l<`KyY5KZMZ;hN&cckrE{zrn;JpX2KhVVjV~?CNPkTZZRdlv*??S z?tfr#FTmk?y%BLwj zNgNST8}(PnC(rkYNH6J#yqEY8?*+8F=X{pLFnKSDR`0fNK*ZWy|7467JUjYX@)}F@ zsR8EtodK)}4XG6YD*|Se?X6WpU91$xEzl1nc6ZuteQC_U529e7p%0000=WQmu+DGQv=erK`|6U4e2cRlYwDk!k$hiope}2i5-vM3BXN%f)Cm z=&Wbg^~K+a1qIm-GJq5q%m7vlSTSHhX#)2^b9J5q`2p*hc?F`(C&|tOiS&H02{&L@ zq?0qJ9=tp3Bsez4QV?xI+m;zah?#49lyY6!x?J}jO_O!RN12j(t>Qk!^I$nC*%a_S z>dlYwBT&ncu$L-hFA;;{^iL?;8eLxvLT^|Sy@ahD1C$70FzV2a&Gk$JS4WChofSu) zQCYSOG!vC+wtlYd^cE_vnV}_6iu&GrB|Vuasi<|~o%Rf`rawx?gATC!Q%nW+D2rCc z-cOa&U>2TlK{7nBza0|DajJpy0ps2W(s_tn%YT9!w@6bJvKs1~a(~H)o$D2)9jE9P zu~G-}K{|VoRM+vY>qBY2f;(Bs%SS%E#}-6J+kyma{|U*wZ%pTcMn9p*@pmXaAB8JF zmH!sDG0-?p20^YAj;df=|C)k^Ay6Jz@7e{b{rab$qnE(I)07*qoM6N<$ Eg4Em4@c;k- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1068d5e6544881c232a04bf857831c33e879f8 GIT binary patch literal 510 zcmVPml)X0@Mg0aSkMesJQ`6PT-2#MG6sx<0%_xi9cYW*Ys&SXo z3;-C$$!U;boZK)@E(RKMEZ)<#NQi_0<(|I7pky5V&vGSEOH;iTVz1e#S!RKb5AfS1`3r&6O(VTUqqOs z88}ic+KJAP^2Kz%g$f|R=U|%kLHblc53NjU9QEN8mn}`R|&el^}ONa2{oPNP)Ekj z<-bfE|9|9Ftec7@G-l$E^?F@PHgw4VV+vx9*g>caR@p+h!#Fu-8Cw7r$lAJQJMIg% zTiy3-5wTbcY0WO!$)Rk-x<5odW@jo7`<*|YuXk(oeSX97e2o$~?05btd%1nk}@P)SwKd3AFjxDuQFqW53?7Z^Bz z@DZ>qOFaSnZuiJ!qHaC?PB>p(9$9L>`F$qL!IhSGLTmOL*HK-a-yeFmTKQh8-Q6Ow zv-2z9Rw8}5@~hxQ&7y>fqSCb!*zJ zT(N{_6N8upeK)V-5;XL*S;KU#h~e2B?+39dZ5=b7-`&fUUL2wDe2@Qw&^ni-$OoHC zLLbe_e{elBJn!Kw^9`{JzQ4O=ANwHsrkCY|KfKv%56{wFx+9I<@xy)_#^v9QGyIcy R8h~zP@O1TaS?83{1OOPzS9|~f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9321fade48b4fc8e1f13ed7abe604cca21f873 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJU{4pvkcv5PFKy&KpuppDF<7O{ z)6sjr>Wm&oiHlc4G|V(y|GoZyvQ?FVp<$|;_070mdKI;Vst06J4MC;$Ke literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..49e037ad763eba0e89d5f295532f90baca164c3a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJDo+>3kcv6U2@xE{cUII^5^6~;Y$KgYk({QaH!^{%i0fX{0+NJipw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png new file mode 100644 index 0000000000000000000000000000000000000000..89aec95f271d1c9e87c819d4ae10cd767624ca99 GIT binary patch literal 348 zcmV-i0i*tjP)^spXwHRA)%~H zA{8r*?u^#l<`KyY5KZMZ;hN&cckrE{zrn;JpX2KhVVjV~?CNPkTZZRdlv*??S z?tfr#FTmk?y%BLwj zNgNST8}(PnC(rkYNH6J#yqEY8?*+8F=X{pLFnKSDR`0fNK*ZWy|7467JUjYX@)}F@ zsR8EtodK)}4XG6YD*|Se?X6WpU91$xEzl1nc6ZuteQC_U529e7p%0000=WQmu+DGQv=erK`|6U4e2cRlYwDk!k$hiope}2i5-vM3BXN%f)Cm z=&Wbg^~K+a1qIm-GJq5q%m7vlSTSHhX#)2^b9J5q`2p*hc?F`(C&|tOiS&H02{&L@ zq?0qJ9=tp3Bsez4QV?xI+m;zah?#49lyY6!x?J}jO_O!RN12j(t>Qk!^I$nC*%a_S z>dlYwBT&ncu$L-hFA;;{^iL?;8eLxvLT^|Sy@ahD1C$70FzV2a&Gk$JS4WChofSu) zQCYSOG!vC+wtlYd^cE_vnV}_6iu&GrB|Vuasi<|~o%Rf`rawx?gATC!Q%nW+D2rCc z-cOa&U>2TlK{7nBza0|DajJpy0ps2W(s_tn%YT9!w@6bJvKs1~a(~H)o$D2)9jE9P zu~G-}K{|VoRM+vY>qBY2f;(Bs%SS%E#}-6J+kyma{|U*wZ%pTcMn9p*@pmXaAB8JF zmH!sDG0-?p20^YAj;df=|C)k^Ay6Jz@7e{b{rab$qnE(I)07*qoM6N<$ Eg4Em4@c;k- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..00d15ded8d557175b3a81ff97699f75815c8cfda GIT binary patch literal 406 zcmV;H0crk;P)=O3*sShd~vV$f0(1FYAHH^Sq`%p*&#EVsGQ(P0U_=P%drJLRUL-Q zF!WG?0jj43m}Te&Q^Rs5Vinq&Ffat?GBBcBik=7$pP@mP#8vDT#54R4amSuWi3N=0 zIx57S;lHaj1H<*Z5dMUP!kq$qwjA)P@^$aj*CPBg+~7pS{Y!&^?!d5jpr>ts!a* z0~r|4uV?rlrv*`8kPYUv;4T3}+z}X-{pPeV{9j#ZhoJ|TISdRWX2bLA8UCNT z%)pR-rIdl;^E-qDuMh*ns&29q;wTseqhMqM0B8lWx#X%piU0rr07*qoM6N<$f*$g% A!T&E^Q?84#FkquG30MRyBu#`sa;Qxp7RHE; zcDaaHiCCG1uog*^!$LeEVwy`13Cy#2E_-UoP42`L-UrL>%+9>;oAp)3AWVxUQmm38p@S ztb^(NmF#57VKYCo0myrc%{m`$06&$9aZUSVpzTbLk|iEmT5^ub0ESO!Hl{kjWE~s5 zezCm%xOSpb@iHywX^f9x>ymEr9LeRt=P2p-9F4Q@HbsJVASwLK<#IN7M%RxOKMl$|euOR`|NQ@)b zSM)jmxV~6*3z!~5mRHq==dbFIMZ#00000NkvXXu0mjffuJzG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json new file mode 100644 index 0000000000..bf938ef176 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA 3.0", "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", "states": [{"name": "dead", "directions": 1, "delays": [[1.0]]}, {"name": "harvest", "directions": 1, "delays": [[1.0]]}, {"name": "produce", "directions": 1, "delays": [[1.0]]}, {"name": "seed", "directions": 1, "delays": [[1.0]]}, {"name": "stage-1", "directions": 1, "delays": [[1.0]]}, {"name": "stage-2", "directions": 1, "delays": [[1.0]]}, {"name": "stage-3", "directions": 1, "delays": [[1.0]]}, {"name": "stage-4", "directions": 1, "delays": [[1.0]]}, {"name": "stage-5", "directions": 1, "delays": [[1.0]]}, {"name": "stage-6", "directions": 1, "delays": [[1.0]]}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png new file mode 100644 index 0000000000000000000000000000000000000000..dc357dce1ed47f5b826c8744150bf05d5286d225 GIT binary patch literal 308 zcmV-40n7f0P)^hqNVo$>${n~!3Xtd>kSJ(KEN26SW8(}(DDE_TMgVii2u-eQL$&s9;^k0CaX9Ijn_!Pk*{9(k`2?;PK|^7c(6pgO;4# t2UGU1ouyPS!KfOnmo8x0_n2W1qs4Ehi*f!TlYt&#@O1TaS?83{1OOo{S&sk! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4bf31b4a2af7ecf66ed7ab5ecef016fad67589 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ7*7|+kcv6U2@)@VNshi+Zo3H^Z7S0_i+IUzgRg3_A@z2KkEPLwJbZr*pu>-OZ)Hn t4?ks_&TAhzuwm6~o6R5tSe4}%7{aCt@|CkPzX96A;OXk;vd$@?2>{~rF@^vD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..597c915139681aa1eb4bfc86a374068c9d6537ec GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=k0IPZ!6KiaE&%60D08M0%P64Y=G6 z2C&_Umi!l-#U`ve>%aZ-D^*6a44;1nK4dI95T4I=?DK0){<^M%XO=PgF<)Uwv1WKy z?d9A!QO1|`V!Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..918687cbd3a64d7145461aa43e58643d9037d5e5 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJNuDl_Ar*6y6C_v{Cy4Yk1sYso z{2tc!pE=F&`W(hhGB*XM%sS}OxzxQbFw0hw@5igN2P*1pmz{q(Pwd?K^dJ1i9A@kn zSpDv*57(8A5T-G@yGywq54n{8k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf24a1cb662d38e5a6784132cfc491374142d4c GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ|DG<6Ar*6y6C_v{C#-1x{95u~ z@S^#hL8o(X2-Lh=JH?Vszd@4kv*C4_5IbMp_C}C`;^E~>HF}bva8*&owJ}kF z`Eg((hqNWjn)^-}@7D7C-(O{HFeypRli_B$@ob5Ihn-kr`|=oUZ6`3FIK^tf?H}9r z<4-i#&x3wjn0GvLcr>H2vGHLv7qhZn{A4L97wZQ=cJlp5k2{Bd@BqR8`HQV4OuBG@ zJHgKRT-%A86E6u(OflHZx!alTj36@;*CWmCa~7TIkZQ9#ah9X>wef>$nw8oLD5A=1Br&WsG;Zmjw05NVH~aYW!l z4p4DDC{vi6!Jvl(H5)(Nfc6ObM+9l2uFPFPnjrZ;!QqCA`0zyq1#jTvg^CDcq_OMo zz_TrgGK6#Jwh%^2CR6DAgtc20#5<_0>-j(1Dk91d^IRIH*VQ3XdVGHGv9=< zeRpYxm%=DR?#60;P}5d`x)RhtF5x(bo!{_zMThsfn$9zjCdj9A$oI9VTv~Ea>tza~ zAMWH%DB2jt_xHZrLIyoM`6kzG`EP?W46z|0@?kEP)E+mJ5zUP)Z?UB}MFvJK z+8cs*8$K`hN};!>)Q|@r_lM`5?>px^=OHk&2`$lrG}m7RHP7n#X)Iw2*3W5Qrve$v za4$RBS9Sq)Z~Bk2n2nR`Ya;Om!9$PtBK_4@cI+h?OCa=sEoV5W>;NLgd)KF*NCVXm zps>bDOr-)&MQ3sPq|2?c7HQz+jce!u2P=c185`(93>zn<`NH#H1 zwx+>DkH4AVu?)}o9?v$7IF>-71=-I*@K&Yy^YX-)-l_n!OeS+rP@ z3DnDw?FY(maUDI5)f9YZssSgp$OHgp|0e|MW&KfFUH$_CN_&87aXb3|!MP|eRf8iS o_Np&}MF7W9Im~QkGyCWE2}&c-BRbk&&j0`b07*qoM6N<$g0Fn~-v9sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..d3444b938300e66260df71e6ae8b348d7116851d GIT binary patch literal 293 zcmV+=0owkFP)ST5JfRcHlavKlg3qcKv{qqAtdHNLdZ26um&{)unVa^*u)TXm@4-r%kts(eYWmI z5U^M*)(>TAGF{2u^hMoNQ<0Z~awwGzb%Sx}=d4xR3DtJO^>8X1>We6rGh8>-p_`mx zcZFL~OkLP;>%-azPYg5Hgvcy5=|z>L$%NsH6*h1jdczO}g-XZ1A}@sxc9tzm*S4av zUoW6%xpgD#^TqCpQUga=r!Ih0+leTaK@`iwZAoUY{ufwZ;Ptp0ZG;)|J)L0^FOs literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..35242e122294f8341877fac50f8b6da30658c01b GIT binary patch literal 515 zcmV+e0{s1nP)46gX z4SY9iwUE@i4!#0E^Q_uST^~C*1T3J0We1=d`MVURu@RP-!vJdv2B^24c|PP5R(q-E zRgapFb4pp}qjJtXg(Ht71;@u#mwXO;zy%5j&Qk$2<4g+9>O-&1~02`=LBj*$l%n zmFE4t>N(rQQOCAugmq@ei58t^d&0OgA#0~0W#g-C(7xMU9sdGL>u4tPC1}xpLR|S= z36_}i);23%D1lSh?Umi@jdS1Osa6#Awu2Rg5;88q0sQQ*PJ1T~U~LUJ$A@u0>Vr%V zu%_^nvdIr~JKjXV?=O6$8002ovPDHLk FV1i-U@gV>J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json new file mode 100644 index 0000000000..9d25171028 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA 3.0", "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", "states": [{"name": "dead", "directions": 1, "delays": [[1.0]]}, {"name": "harvest", "directions": 1, "delays": [[1.0]]}, {"name": "produce", "directions": 1, "delays": [[1.0]]}, {"name": "seed", "directions": 1, "delays": [[1.0]]}, {"name": "stage-1", "directions": 1, "delays": [[1.0]]}, {"name": "stage-2", "directions": 1, "delays": [[1.0]]}, {"name": "stage-3", "directions": 1, "delays": [[1.0]]}, {"name": "stage-4", "directions": 1, "delays": [[1.0]]}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png new file mode 100644 index 0000000000000000000000000000000000000000..426106d04691580dffbb759f3d57de24fca1c815 GIT binary patch literal 533 zcmV+w0_y#VP)i+SWW_wIg&C+a-`8KMv^KiP*aWRazrE4Oqt}`r&gy-LeyS*1QW9=RP8>A zqy&IH=mb`PgG0x^wg(-GY8In0W7wZA4Y2eNjGbOUzH$9VAcXD8RLTm^jJI5tzO%ip zVh=i$QVv6JsXu%Z+Jg@Jho5;_KMw3~q&$rMV>WYV06cm6ib=1_us`L&-try`)r4j( zEi$=0??y?kt)B+&9rae&%$;F0X57AciPtac0HNfe1I$AJWO8|bZ!R?&GfF83%T?HY zY(<)^P*VV4xeBspVY!MgE2SKa#?N)wpR&8Rc;tRZCHIjcC)ZJK0?^@HQxkvzZkHy!@j$FuoF5ldtygQUf)|0xAm{-50NU&-35UJe44M1N7q*A65p@8wsxKQe literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..db81535872b4d1c9cda71566d3cc9098717c10f0 GIT binary patch literal 268 zcmV+n0rUQeP)#8hQPX)1OE`lk*j77^um`YM3unm^V38PN;k<+}JDLAy zW)~DiQ4~e_G09{_j^iY;0W#n)p(}7?z!f;f>(`?u6|QY+fK%!X?t1l~zy`55 znZv*}59US(h!ihDwAp^UX}7;Up0ft~Mhn1k_criG{=BrdV-Sm%&?<`ZpS%EfTu9d> SfiKJe0000HI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f6964e668ac221a472c20f742ef3b52a3183fea3 GIT binary patch literal 363 zcmV-x0hIoUP)t4C-M%ch&S&dj!{I0jB!RQq4m2OHp0~|_H)`iKuem^ ztD%MpGA?!CLt5<(FBon#AuiTX-T`Z@B3hZxX3wi^a0GsT7joCGHfxJe)2Z=b-mm?F zh@+DZ+9F0Nz*Ag=c?UGTT{vnGaiuCI93`kNM(=-w&v(J4>0!gRvnZVt3ui|j;M#-c zMl71`Uw2dWpWmmeg5AOe;Qj3^phEh5Z|+QBX?zcEMMcH`#1AnKbL~K+Itu^*002ov JPDHLkV1narm0$n> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png new file mode 100644 index 0000000000000000000000000000000000000000..5668fb94ce30714e132fcbb729f5b7ebe417cf2f GIT binary patch literal 443 zcmV;s0Yv_ZP)EM}`6iDN_5{H*?7x?qlRJ7EQ^bS0T1Asf$ zm8fWGgp2UcjFgxvV3MWL7@#C@mUFWhdI+vuzK?Zu0`v0M?wrL0OiAM}4xu@)9s#_@s?O0-R4GivF>11nu6MbMhftWPZH2R8rkl(1xquaPtc060Zf@)Vp9byd))&Tz!IFP1n4H* zzkl5WYx|=|LEHbJTc_7z2RE7A_yzOJSPk}cf7@5^_W5;DVpnsGxb?rreR&+)`txRR lBP@N-Ir<6rz<~q*8{at?rvl^f^&wXWrIQ7 ztva$@tlOv=7Ok?MPK@SwQ7g4GYf{}%$aj+jPV#-{3QzjHi5n^WfDe1{(}q|W^K%E*E>0}OE-h%oNAt0Svy0rL;}w|tjMb`)hE4n>?Up+;5Vdx znZ1ZT2Q&*=_zXwVzu0$xTS%Q0z_a+mlqyooind myvQ^6;H18P{yWZOGMO*!$Bl%^pYq=T0000>;YJ7J7j|t*ilGT?{j9$V&!?-#iO*>L!!h;p zX(r7Fi*Ar*7pPIcsCQsi-+e@yzS z@xhrhjD63W=%qY7lwm#p#WH=x4H>7hoi#*U1OLqQR@<>ro+0hQzsmP@{7?C~O}-u0 z(R_;jX!RWiOOi4p*vCkPUH5Toh;|Lc@~^k^~jKoI8fPW_x)qhzm*4+ zzPM|ItmoEo5EfW{o%M*lgLuS+#w#W=-{!OlF1oxyqw5i)ld|lq`MJxd1D(j=>FVdQ I&MBb@09iv(<^TWy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-alien3.png b/Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed-alien3.png new file mode 100644 index 0000000000000000000000000000000000000000..2182f93c52643aa30d95808c9fb5ecf1f1b790a0 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJX`U{QAr*7pPIcsRR^(wleo6Z0 zd6Dxe=a!^ZJ%5d9cVZ1h3S^G|6cW@B)QAk+YRjy=PcW^Vp?%T+MY$(B zjK7C((!UfMZM^Ss+M@YYOtu^ERnBU(suT#Vo1gT+vqjWgdd0@Rx*H8X*`D?(54O$^ zNblHx0E0FxLmj}sst#&X4dAh=&X`8*Oxu&MlULp`B{S)ZUz=)X4~CSoWAYZ zVOis1vAHr0JPCaXKwxpsA!{q^Tv7l4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/seeds.rsi/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..0d20641059983152538ca62d3a98b8a9d73ba569 GIT binary patch literal 278 zcmV+x0qOpUP)+@73SeKy+w$4suX6iu cSSS<Np{iGVS(aTM5xIGuclq14mCBR>h{&z$3ILZ5 zLJ<)$@BK9o5nT;dL@WjBQn)ybRYWYd!;|KOvo`*s;&&Kd5Zh_dI3CV)7rGR8mRq{C z+ZIs=~t)!Ph6itsG0B3jI4RChX-2lI-0r2ktLqkJD Y-yiU|M|czsGynhq07*qoM6N<$f{sCjYybcN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..c0419b7202b3b213bc6872062017995590bc4374 GIT binary patch literal 284 zcmV+%0ptFOP)k&N0_RkaNei@)^2{kS8)qf?Bg4h-l8iifpM)kN8k?lklhrm!YK@%{ z?y7(mguLW-2{>xU(?J)&i|{?~3WJ!a(Y-B@2Wn@z2e5!-gF79uc^B7uDQv|7!1mB9OX z9VgaU82e4L0MZi{B4CA;j=f93qGb{xe?iNVHVb$QY1NtqqPwmZi0-;tfbr805yR_t i*oP>ZzY9zzlgSsZIeOysofNzP0000jXR*H z4r6$_bFjBXv*y(SPo6-2+)815IB{bGddXhjyu$rs;BdqWA{P;)yX#dV;dSm;gtsRdu|h4X+Vc}0ahw>VBcY4&)NqoWqwHVsTI6Q$*S}>fyhNnP5G(R wQ`b36nkX{?^S*iP-_@9YSh2cFH75{^vV?cc>n+a07*qoM6N<$g3`pd*#H0l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..afc5627427a3d3bd871e2e1c2503da07d98ef73d GIT binary patch literal 257 zcmV+c0sj7pP)5fJi5Ymj8XuW#t?mlfGzcueGi=s4e|5WfA}M-Z1VntS64gm{be@ pZd|>4>BSt6#)CQujNBfV_`ZqBT=*wr(FwGG!PC{xWt~$(69C)bFr)wg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c5541e0de3537d6bcea64c106a4dd07c75020183 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJeoq(2kcv5Pr|cDMP~dTEmfkT> z+n~u*xM1A_uAcVZiU;zX;(p!lLmz5Snl2*Hcz<(1O|5-uEX$6=!N&xoS20aHb5Udc zRJ}m)8y_1NMW1H03n)pp+;Kuj(v(rGr!kkQ@^Q%hR9>T9;u#D~0u2oj5B^Ad8HqMl y?y57mvnJA^I(uWow`)m_^Bf)&GcqvTV0iq+%qHA>?pC1F7(8A5T-G@yGywoIxJh~d literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..caf581eb894d396941cabbae2dab91592e69c930 GIT binary patch literal 247 zcmV~4iaAFhi#X4Yo01qkw5+DJ>0PSxWi46hR xUcVoVH`Wa>+I1LUwCgaylS+WU1Ef-^)CY^GR^oBZXfy+D^PJr0W(Zomb&0W${*lTqqAw$mViM4nVt`MhVxp9G-d zmw||39{aGBKaYJt#DIuNjV5In0AQM?W*+-+IG%yVmeJVQ^KpmE_14h5hrdD`0qrCj zH<$M|Mk&Yp<8lk pY&yXOhOQ0tSwbb;ii(Q=#tRV9dO^_nQ9}R#002ovPDHLkV1goimkAk<9 z(?zT9n%6|{S>D~D+E&e-;Svo5d+jrJ@2^8$$h#9vvj0WMr2r-q7FEUgmZTlS^2P09 zfg0Rg>EfKUpM`G;Q3LzYoUHTQH>*kAF8z>W4k|cS6Z){pId7vix!^pO0i0mC#H|+H zlO9B|0U2v&Q+*JvuUobyLFi=J$1ITa35MySQG}V~)dt)n_l?}6LCA^5k4Ntb91V7yTzWod h=wG;7Y_Y}b#$T%+H=akimS_L~002ovPDHLkV1n_BGm!uQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json new file mode 100644 index 0000000000..bf938ef176 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA 3.0", "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", "states": [{"name": "dead", "directions": 1, "delays": [[1.0]]}, {"name": "harvest", "directions": 1, "delays": [[1.0]]}, {"name": "produce", "directions": 1, "delays": [[1.0]]}, {"name": "seed", "directions": 1, "delays": [[1.0]]}, {"name": "stage-1", "directions": 1, "delays": [[1.0]]}, {"name": "stage-2", "directions": 1, "delays": [[1.0]]}, {"name": "stage-3", "directions": 1, "delays": [[1.0]]}, {"name": "stage-4", "directions": 1, "delays": [[1.0]]}, {"name": "stage-5", "directions": 1, "delays": [[1.0]]}, {"name": "stage-6", "directions": 1, "delays": [[1.0]]}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png new file mode 100644 index 0000000000000000000000000000000000000000..70734354b7d7c5684f7dd11eb8ac34b55e63f6ae GIT binary patch literal 263 zcmV+i0r>ujP)k}_kq!qbO~oE5NmPRhhKHEM%2}`5 zNuIa0ENPtM22_6E9oR=htz@=OHI zD;=gN&*&&+*f{O*m4cHR0;zfz`5f4k#P}*QgBT)#%%JPcnwQQy@pdP^NuTxF)2w}s zz=RV1lppa24t&_p5c+4k^~;5ho0wHD>NHwD%4MwVTVTPf5Pj|dP^|He_a3o literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6188a2d2cae82e0899523aec21f5a438e2f4e7f1 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJQcoAhkcv5PFK*;*P!MQ+7%yC2 z$XGqSK;kjOx~CHFk{VkNW)!yzXx$HY{HVvz=K=&a+>KKw%q`vG*_<|O4O2t-J-rFP zKc!#O%oo?FtV}Y?Wfh&Ndwk#S@C|Q|FTbyGlF5MgdV__=z3lXO<~7B=YdZd1=8V6g VnxxBe2xvb8gQu&X%Q~loCIG7RKnef= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..56e4f6b5238e86487d939faf7c9fe262a0c4180c GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJFi#i9kcv5PFKpy(FyL{y$RAXe z$XGS)gv3lW=60q);iG{nOa4oRmv7^lq~d9-)$8^9{HIKI_pW7ff+y>qe1G^Uu2px+ r{yvjGjUHkRHFm7;W2R1BvNSK`m+b4X#OFW@7#KWV{an^LB{Ts5JP=AdfWQzngFYE<;cOEJKZ@02Sar{n5!QGABw30vIqCAm}4+ZdOfr6CaMrF|{UYVk0NpORSjiv?^>A0aR^mh#f##_jztX?`kg zzqPF+a+DL5uEPu(_iJ2t^7F-BTBt>=jU{o-`vH#2y!jhY@qy=c+-Rl_cu=nKN#b9w zFMovUR7K5%cY57d!x}p#ma*rL$m6aRzkDB}%{FxXzqna}rFn^aJ-i9E ilnVWYTTxN*-gp3ovk}k*h3J@u zHyhC>Dr=w9R>>}eAZDD3ZArf0OsS5w0asMOz25{j4;yx?5@Bkhomtj1D7x4ftJOE1->6OBS{Ru*H?sC2q(ZAD4 zAozh#0;FKZAET*8jtunqI{{z7D%&lv4LA`O-~znn?=I$-!7M-$(hq`!T%7n6^IwV} zTN>Itv6FGL6VT^m9-gcGF1+)n0N z3EFJyoXn4V03n?yo6z9(Ie=utOI&LAr>G zhKf*h(prcw+#+p;>vTm!E*hn!(EOGQ;s5+!p4?pk7Z;bmj;g8@05X{jRTPE(N>N2o zC@aj0Iw`KIDviZr6adVt8IRS=UauzlF1}0mCAQh>ohTs zRSs^_R3c1eNklNF)F#&8`d*E+%`4gf$?Ya?H(3L87HYziK-BqDbv(pF33#;mjl zqS44&4Fm)JrFyOdsYIA=>OfO#LzYBb70TQrypjX?Qq|ENVAdC|bKINMwt@a&h|ze0 z%WP_`pAb6*gMObIv+_M)H-#A%+tk`i^_F`e9rx0R?19#O#^=z7c7xzNb&8WPXvpWq zecj-Gl62flcRla$esmEzIE2=C!rO}v(;2ahw{+mXZU|cU6*@7nzqbRO7`VB8z_Q{1 ypc4akdBx+}yG_yEwWyxj2Z>h&pAlkUbGv zOh7^sB^3*DgySJZc!lRsQWE;^-Q{8sX};xgf4<-Uz5CvK+<`%vGAdI>nLG>QGiB5d zHBdGAHc^wfd`efeJXHVVfP>@4X|43=9=~4d{qyi=3YLeeym>rT`#d-RpjN5#d(XUx zS^234%R}uv+Xmq9>)}+BFSQ;3$KMEDL=t{Q*Qi#h1JHWWI~}j@6m(Xt=He|6Rs6KA zGG)|ewJ&H=o1F+N`;kC_bsintYPKxqcPE$X_ru z`F`|smO0O8zum#j=ZqfhAslNmfh3B<8y7IIoU9$`S#H5X6L7LN{xC3l7Mj3*yYqJv zhWL_R%W!W|IeZ?{NDX%2`db+mNAO#?n?=0R$t#jmuZ4H=Ee)4#7xh{n`X} z8#2}EckzWhIYdJ8{8g2x$pL&JdHwzazK|zdASA&^;0tNOmRf45bF4pj`3AUp$nekr O0000MhW&_rFt#cn#d zWbY=$xT>X40~KsdKqXaZpdj~iD8FmcBqz;Xx4h|i@b2?{-}mkvbfX*H@Gwk6m!_f1 zqty7kgfC<>^anI9UpOc0^G>2pdIg`Kogtsg0WcUmje^e4&hUM$2p|i^4RN^EwF9d2 zr};bp$wZX#c!ZJRAd7Pk6r3}Cep)%){ti&)SewdYasm$NOCf(GlEH zz~Pw-A$Yg8)zrBgIJ6moy6vHG41ks8B>+n0D%WmJHaMb0bpi(m2YkL0_OqIKDm~rg z$WYKvZSQYK@U{XhDS7?s1(oV9LI?%|8rN@6vi}17{QO4S$=8f9^StP;0YXBd5I&0Dzx#{lbcs4%Ds%D_bQfh)~e(Gz9f(<52|h(*1-Y_y_t21Z5(EXIu0lgE=M$ z(Zf8fNR+Xvbd{Dat6FPax4s^_bzN=Jbb3(8b4tjYJWukzNx;VDf96F|D6dLF{WMch z_InL!*b~%}P;xq{jV)NtciQce}i{bs5QaoLO$syJ$YMa7+`0Tfx?y&F;-+|LA)QPf zdHS>zmlldb)z%^4g{dIgAo-izr0IqA(jwE38m19TIxK%d25?S|N%3U1pvIyhGI?a5 z3oeKIhs@1+fJOA0U}8K5Kt-?OXs+xA)P$jUwgBIoZSnnQuQ@v&N_W;kxh|C3v#Y6C zba%xmC;Ernz3%NygI*Kd%KkLH<4hi4ulQafoB@NkpgTm8AQ3U28Y3R(K{62UVE7&A z4H3XqgD29>(~s?yzO!#69vCoeNcUs5BDNebDCEfp*b>8whYm0b>5>9i7XLBjx=@nY mf||_k|5t2dV`F3UPw)%CA@*w(po--H0000<#8-NG1>j3>L)F3{+K<1v9~LvkPK! z2(loWR2&ouBW-uLKoFeIT=jqFzvo_16h%=Kxi^v2OEucAqk%XE4n!lzkPM g4*!X)qA34|57U;3T}}ZECIA2c07*qoM6N<$f+8J_3jhEB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e7dee320b323c5a127a22a515151090da451077c GIT binary patch literal 435 zcmV;k0ZjghP)_$rC#SZ+DH{9;K|`%ks8~}|B`ywL!{HFM z6k1LaA`OAUzadVnyz}lFYPbhpxZ~d6|M&3n9{Bk9`21(4)5vrh`LpttG~}{Z^d#{s z`QdVNxf$k0e#+{D(XUbMQ~; z&Bvy*c3>qFVrgTM-P0Y{@?Qufk>TYgw^|5EAc<_=t__~8_K!Rkll|?80PLOJ+3p)9 zG5r31W!*DrH%OhGAsStF(>*B6su8kk#I_u4?tn?_`Ng#We9Ak)_5=Xt7Un$(IL(d~ z@OlDHvz7t}nYe(r6L6FLA)v(+NraKIt^;s#enBahl0+EMVv6nWsKpd1#{d8T literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/towercap.rsi/stage-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3145b07a1c8e9bf182ff4a259babbc1f43a7bd GIT binary patch literal 524 zcmV+n0`vWeP)dBx+}yG_yEwWyxj2Z>h&pAlkUbGv zOh7^sB^3*DgySJZc!lRsQWE;^-Q{8sX};xgf4<-Uz5CvK+<`%vGAdI>nLG>QGiB5d zHBdGAHc^wfd`efeJXHVVfP>@4X|43=9=~4d{qyi=3YLeeym>rT`#d-RpjN5#d(XUx zS^234%R}uv+Xmq9>)}+BFSQ;3$KMEDL=t{Q*Qi#h1JHWWI~}j@6m(Xt=He|6Rs6KA zGG)|ewJ&H=o1F+N`;kC_bsintYPKxqcPE$X_ru z`F`|smO0O8zum#j=ZqfhAslNmfh3B<8y7IIoU9$`S#H5X6L7LN{xC3l7Mj3*yYqJv zhWL_R%W!W|IeZ?{NDX%2`db+mNAO#?n?=0R$t#jmuZ4H=Ee)4#7xh{n`X} z8#2}EckzWhIYdJ8{8g2x$pL&JdHwzazK|zdASA&^;0tNOmRf45bF4pj`3AUp$nekr O00004*7?Tc$vjM!uJo1oYoWT)sMze8ZTeJb+mgo z802%YmVy5GGVOr2Z)R#TIy>(m3@@a{&sVy1fIFBcq1_V)Zua#70362w0JyGuC1C$R zM7?^m>J0Q3P`NWKeO{_X+j1L3K&|!}0MO}#0Dx-slaT1n$w~Yj!|+040H{;h00000NkvXXu0mjf&TtA; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb45d11998cfaad075f4b3221b58849cdce78f8 GIT binary patch literal 1173 zcmV;G1Zw+#hy3hIXDF9@y5qJIDni7YB5 z-2s)F?Ai(v(IynND%cfvVnZ7dlF6h2J52&AH1XUn#&bPmo1#kW;B0*Ex#ynqedn8d zWvJWvk@w}-=TAt058pd1FP%LuX|mDJj>&IEKbB7Z<#Q)IInA+lIn8lDz{N8k$z(FY z)YL2h$KH91Sgec7=T68EhQAcM%$*M~Jaj~c!$AhqNi;34;(mbn z`MUsQvuTEhELkX&I5cpO`MEo)fjg&IECVn&cnG-e**|>Pj=A$kP6lK=9OTzRiH_PM zEK8Ejrh!>H00ssQqU&)Ag%bS-ddOr_Xo(n^OiBUBWKt@}@o(RrS0i=T7#=#}SsRAQ zT6KfIr0%JsCNMX52Pq}lY>IqwnQCPPOG-6?;i03lSS({%mYRTNSqu&y;^LWcAH(fQ;NWVce9OPE9j9)%hbzs&8;GmtFnkC+qMAv$V$D?!z!N|#dG9C(`>p?Uv z#`n{C-pHiTw3zy4oKYtdQKqJ5*`^bpKftw_nfPks0XmoK+K8uT)uF z-C{>%Uv5A}j>~G-o=!{saRO#(W5|4za`2v*6 zclrFnjOf;N;*k&w<`((l0)4usdNK zd2xDlM!4@~hvV#QTPzzUe=Hg-8zxrGPP@NS|A4x6l3JL1E33+PzwtpH-t5MvWLaew6jV-q={C%ORWOEwDHYmFttZ`!d;shZ?y(Oz<1-uM1Nh>?cVc`pFZPEz zamzP8nHPy@1oxg6i?n4O*t@S4z#b`){Y1>md6ytudYCxDWrnbFR+ z+f1Ny-`+aVdNCJbhmj*oGox5E~(r%$&%J!h}qY=fgcqt14qo6ODH zZ3@88zx-w=){Av@1zm^#n~@{mdZpU3=a`#yTM7Qzv7XDqZG-)Bjt%zV7K3POTXU(pi8cW2Sl;HMio7s$r+y1VwY0&pzde*o}G zkc`_O-_av)s+dvvTls#!eG4+_*FCk|`EJ{M(&j0CX(dq6x6`|x|8BlOyH?t6{2y>E n7WjX^FY4?odu6Ze<+gtTJIh-eT2q`Q00000NkvXXu0mjfGekUu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json new file mode 100644 index 0000000000..bf938ef176 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA 3.0", "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", "states": [{"name": "dead", "directions": 1, "delays": [[1.0]]}, {"name": "harvest", "directions": 1, "delays": [[1.0]]}, {"name": "produce", "directions": 1, "delays": [[1.0]]}, {"name": "seed", "directions": 1, "delays": [[1.0]]}, {"name": "stage-1", "directions": 1, "delays": [[1.0]]}, {"name": "stage-2", "directions": 1, "delays": [[1.0]]}, {"name": "stage-3", "directions": 1, "delays": [[1.0]]}, {"name": "stage-4", "directions": 1, "delays": [[1.0]]}, {"name": "stage-5", "directions": 1, "delays": [[1.0]]}, {"name": "stage-6", "directions": 1, "delays": [[1.0]]}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png new file mode 100644 index 0000000000000000000000000000000000000000..37c416330065a1c82a3b88857950bef2ed6690f0 GIT binary patch literal 936 zcmV;Z16TZsP)R#%>3tgKmq$hGTY#x`xIkU()nT8*AzE$M&4pi(}{9lzvGCVfa9JbIA9d=Xaj> z{Xzmy^?#6={Z^hd17`M{rXYOlF|9l2?wg9i6fZUmu_l0?7=B<=GhTm>lBbeRP;%Es_31j0isSAK?Ij6h42s{Wc#Ifj4mociaztLuNu(+r5405SNY zZ!1KoI-_hhuTr`B1C`%S(XynFdKyFs&G&JOQ45|Q5pffbH1`a^)&tDUkD;COa>qH1 z3oMq#Kw!h*M^tiS5bUGuo@TkDhpmGtrJeI)W`DxJ?=uBZoBrgX?eGNP?>(wSY)wx> zxD$+laupVmpW+Gx{M%{G!nN@cwDYC-dygu_P|KVWfKcDZ4^6?-3;@&;adDU6b`d(C zgW{Br$PV*&E#HJtJ1pMv(G@iSZ0moMQ0$nhWll&acC7gs04Qs?aRpj8fe4g~1`!A< zTZ;wQuo?Eh^M^79x^^CB)$~#34JD8tk4thK;zLl*Lg%wkNc)KHGR#jyXd|?3f#n*+ zUQc=6*K-2yb?Dy*rAZL8`Vz!It*!`nK>kk!+Ut&1EnY7)25L*-3qn2v)vBUAD+Clg z(=LcW*LERx$ouJ`fdq_(bP`tXfHrmx;s?RWDU7zC8`FrjmFEQ7yTKO#Cj&bMU@9s2 z119?_B{hsmq2UCWWm>>*gGU#`BAa!c|kOEM}^&o8;c(rXhCHG{<;l* zzoKmu6enRiE3|Eas|nkNX5<+l7>0aaQE-LYqL93wv`fFmR+fbMQC=M%&5P2DU})y1NH{{{!l3&e?6D>Z^Yo?5j5XL`++jw{Jtw&Tud?4qGkRldI6Hv4Y*a-dw{-KsuS_H&GP>&S8qMix{WG!ZQ z&AKOgmCgK`y_x;y+nG6lVHk#C7)DWU#_~Vj?bjcrsqsv~^hWgO##XoIat~n|NS|Ia z1%dAY04jScznYIuj9GE*pkmdOx0W3b)4=VVlB4U~KUneO zogIrnIJV9PM1e$WJM*&VT?GCB0HFKU1pxR(-#n0FP16_h8Y)u$+eUP4@9#DZydNC{0HWIj05Ew)=j`(h6`!;K0O9!= z-CrigBud((O-VbFTu}bHZF%WhaoWnBa=+@yJZB^JWFyX3qfdrm7|kaW-f49b5e0bw O0000uAt50lAvYbF6tZg>ZN#H^ZiAi8eYw<3 zgWD>KvSUCo@=Pzg1r1zte2?$K%m zI1BRtJbRtdtM9TJU?J_`A9}cM9Vb2T`-kK4PhURJ*|m(G+JRxUwcR5krh!*$u=H?| z=8@0rg@F+_@LUgxfMwdKv^DnH=Wm{9Gj3dJzfOhZeFtU7__n*ptd275tm({A%2x#7 z*02Eo&_ip7POC$-8)fOyBFc_|2(_|{t!-37aWUJc?X@|V9$Guhr;|VxOPMtGf1tI4 zvoOzTyGOI`5d?FT3RTIxxTh@*>W;!r#evHB2xLY$?FN)LY7&`?u%6qJ?_XWkb4A(N z+?Rf@Pq9#zMDi|zz|R?4{xP3&MH!4KV7pM2ZZ}~4{gyNjd`kJMn6dbuRtx9-Gm0O} zf?Tb`WdWspMUD?nrtQgJeA#rxJ8r|sG%aOLjn#S(RNkl!a)4&tn||@iaztOpUN;9O zzTwJpL?ZtE^8hVf9gwqgp2i5K^mY$h{1&pglb|Ia``KtMo1z;7%pP07XOY5A}6 zg}Nux*C+p&c=kqC0<5gf^)2ky-5Gf&KQ94t%UQXyHYZo}xxO(y1!$T=L>a=eKC`;k z4qRNClF89HtNEPNk_zoYa`N8&+cLMD?Hsosv(E&%4fNz-XEmPrFUoi&h*Wzu|Ue5F<~K}yn@ zRARE0=9Orw5?*YW^JXHxjx`uH7JbpyBQF(8L1zx}|Y z2V0__0-XYU|DusW(wP*RrZARCW7!UN-Jw`03tw+jH?aSpBOkEBpMH6 z*$tFLwDbSk&8u=@Y3kH{2tluZATV?j%W^PulVYJPYPCjtw`|{uROVN=KAY<$QT=#; z-EeT7Lo_XpJW02>G$oU%IJWJun$O8wcV{|=s6)_XbNOsv4(J_o#lXpYl@xcB9*}cBB65vTX;mQo}lMdM$YTa7(;;`G&2H9g#@H z*jz6ObHB#sdPx8b4qXNy8jbSoNm01oH-_VpQw4-$VYXkCh36guFp^FJ@N}anc1wE{ z3-1I1Jl8uF%iNWV^1P$}{mmKOs&#@#Vo-0vS>vBLZ>&E)-#zO4JOcs({vUnP)NxFtvwcreQo`o^g14J3wzlHnp2Ba zH&Y1HK<2C77np*0v+vwinyZU@(a2pQ_YrP4UH-pUGYnl1vMb zFtoUAv;O&wOECr+4OBN*rDYkE%0+xX1YmL5#x!+GdJ(@n#5?W+aCRoSb9;$SYr>Sh zWMf(yotDdJ^mm+VX}IH?uE^}P$#ibpMap>MlW<6<<-c; z?Hma2kM4g?m0-VdB)Z)m@)AE}c@_sf{$a8fw>=p)Z2;ib`}1+qxbnLT@1%uNR>p@~ zmVVBkKvPQq7!~b;Z+_kY;$a8q2j?#ASrNNnPI93$q$Ie&u0Kdnag z)=@M1O23a!?q0vrTkikx{jdL=Uje{;>CK*3l{>=>GrZmS7urQa=u%nn`~Uy|07*qo IM6N<$f@@Te6aWAK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png new file mode 100644 index 0000000000000000000000000000000000000000..efe887736d4ef534b726a570e77de2e4398dc3ba GIT binary patch literal 1014 zcmV%flqIy{o1Bsxt214U8a<>_7W-goY~=ROL!wEvPV zEY8v8)jYk(oRPPEacLz_Z@h1yYBnzNd`tv4AAj;5<>J%exoK>y?-I{{>-J4rt2F>n z7+D=aAvD>-;v7xQ%;5gLP4f8{H>n_Um`Nt_&DYlh8y{ZIhSwhc-FRhEW)sssFaas<1V zz{B-|Urn%LkD*L<7Qiof8^%HyNP-vRI4Cu+yqc$k5LlHq1c^hXY@^#gIk)0>4IQ$Q z!2aG7+`9b%H8MIBC4s$j7z+ikvA#ocAI{QjmN8(Nbr8hdrv$PZ_uq{~37nC6h`8Lu zW7DuIT|C||;?ZXL-2MZBDOgyXqhEgY8RhvHjEoLh5n*I>G&?rh%@^3-Dh`R#GV5qJ zZI^POR%_s(TnG9wB$7N@og<_)9>JLTJGrqDjsSxZv&=dOA+XFkI_(}TvySbpB6;@w z2mnASFn=dUwe$>(j1Da=!7}TNy|tf-S#F}$weiya1DcWqb=V>EcXKp-Err9j?HB9a zCleleCLkTHRvAV{M@mkB5CWh8L11l2h&)P9TTp30ln(}?lvNJS=@fV=j!O9%u3lp; z^Te$w5|&rXny3-K>n1B>bg83U`pjxe?+c`$HS|6f|f`)qbNhFMAaQ8A{R}g&Wi*6=fp`N9cnW^_ zpg>~NQ~qI|@f`CJ0<=P=!avxpILH_fj46>(@kRiqVCqJB>-Bf8`iX;}wzo>eaU3kI zd`iFj_VEx1F_8cOC@Ho&eU|HoM@2vX{d=3FbWrof>)!*Ci}vKzDFC4N^4L%8`RwD~ z5TH@(xzEFLoEPH*n3!P2M56Bg%Ah#kH_3d_Xatj2#=qpz$v5PP41UWgX&k`o*Nh^k z@9s|rBJh1@%-8QbI6HO50QAq^kRxz!ce?gCfPaet-}}*x$qW6f^>_B;)3ad_0)Qg? kv-P54FYVGU?f-3m0p&lz6)xL%1ONa407*qoM6N<$f}%0x9smFU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png new file mode 100644 index 0000000000000000000000000000000000000000..d49034836da9dd55246b16f3abf4e2fb726a27f4 GIT binary patch literal 1023 zcmV+)r={Tgd9ginSb*rk>^H|KcJqbYqbwSR?e)rvX-#zEv`$nP<%S-bj zlTP#XH+Q9|{gaR06|bM2K^~I%^zye-|G6ZrtuBh3s_@z8-yP~NM;9xX7R2e-@-*Al zfMdB-q>xwG-ZqbOH(!16p?LevbLd9>NWWMD&9;SYcPVJOnA7soJ3=>1nk}2z+2WzW z)>aqA)%6PkptiG1qj|LdKmr9VhoYoo3angO5Hqi8luJcU6%=&CObp~Ru2vraP&#+| zSc(lt7tOYX5Q2P8joTcRZr9?#o?>HjOY+%jni}*&ZD$vNH|EX&KVjUjBZTl2*!pJ* zH1;j7e0g2~Osgu2nr5%@l&bMCk!_5zVY0k5FaA!kLTTNg+4b7yd-_ zE8sJ>?JiC)Mb+3ll6@=zzk@TWQOczv`RT07##FD@k3cVqKMscP)e z>U4rpb{u!le_tA&ifgNj!tb$R2x~f9F4AaKD3^*%=cbTk3D{yXJqm!5&G1X*5hM4X zCe}BvWqAI46h%q#n_g$;l?fo6u7aj=W&OM;Xj$&w`#Dq~=wRJdpjI>4xBj43Gl|0; z(db0yS^oT|HH3byY4dd;*eFQ zXj&Z#T8_Lnk(fZVWQv*z6tL|s`J5Uwue907{trc-@r2X9h_X#e)tlL zfq`-rio)r+PB(6aWzmg#KsHDK7^rFVg0!cKkID2XN_MaZvdZM4iBC*ehH^@Ve&x&LqqPNq2c&CYLn&AC%PX5 zlMjy}4~2d)yZ@)>)vNa+zK+@)C-jN#`-txM$8dU~U(_D^7`+U<^b!RB-k%#u7_9#e tcdCEJ#}L4u#N+<{TW3#jf)o6|@fYhi{Dj7-%On5*002ovPDHLkV1f=D^Wp#i literal 0 HcmV?d00001 diff --git a/SpaceStation14.sln.DotSettings b/SpaceStation14.sln.DotSettings index 9fb16d013f..9a400dd8e1 100644 --- a/SpaceStation14.sln.DotSettings +++ b/SpaceStation14.sln.DotSettings @@ -77,10 +77,12 @@ <data /> <data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data> True + True True True True True + True True True True