diff --git a/Content.Client/_CP14/Farming/CP14PlantVisualsComponent.cs b/Content.Client/_CP14/Farming/CP14PlantVisualsComponent.cs
new file mode 100644
index 0000000000..a0cdca231e
--- /dev/null
+++ b/Content.Client/_CP14/Farming/CP14PlantVisualsComponent.cs
@@ -0,0 +1,23 @@
+namespace Content.Client._CP14.Farming;
+
+///
+/// Controls the visual display of plant growth
+///
+[RegisterComponent]
+public sealed partial class CP14PlantVisualsComponent : Component
+{
+ [DataField]
+ public int GrowthSteps = 3;
+
+ [DataField]
+ public string? GrowState;
+
+ [DataField]
+ public string? GrowUnshadedState;
+}
+
+public enum PlantVisualLayers : byte
+{
+ Base,
+ BaseUnshaded,
+}
diff --git a/Content.Client/_CP14/Farming/ClientCP14FarmingSystem.cs b/Content.Client/_CP14/Farming/ClientCP14FarmingSystem.cs
new file mode 100644
index 0000000000..dad9d5995d
--- /dev/null
+++ b/Content.Client/_CP14/Farming/ClientCP14FarmingSystem.cs
@@ -0,0 +1,48 @@
+using Content.Shared._CP14.Farming;
+using Content.Shared.Rounding;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._CP14.Farming;
+
+public sealed class ClientCP14FarmingSystem : CP14SharedFarmingSystem
+{
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnPlantVisualInit);
+ SubscribeLocalEvent(OnAutoHandleState);
+ }
+
+ private void OnAutoHandleState(Entity plant, ref AfterAutoHandleStateEvent args)
+ {
+ if (!TryComp(plant, out var visuals))
+ return;
+
+ UpdateVisuals(new Entity(plant, visuals));
+ }
+
+ private void OnPlantVisualInit(Entity visuals, ref ComponentInit args)
+ {
+ UpdateVisuals(visuals);
+ }
+
+ private void UpdateVisuals(Entity visuals)
+ {
+ if (!TryComp(visuals, out var sprite))
+ return;
+
+ if (!TryComp(visuals, out var plant))
+ return;
+
+ var growthState = ContentHelpers.RoundToNearestLevels(plant.GrowthLevel, 1, visuals.Comp.GrowthSteps);
+ if (growthState == 0)
+ growthState++;
+
+ if (sprite.LayerMapTryGet(PlantVisualLayers.Base, out _))
+ sprite.LayerSetState(PlantVisualLayers.Base, $"{visuals.Comp.GrowState}{growthState}");
+
+ if (sprite.LayerMapTryGet(PlantVisualLayers.BaseUnshaded, out _))
+ sprite.LayerSetState(PlantVisualLayers.BaseUnshaded, $"{visuals.Comp.GrowUnshadedState}{growthState}");
+ }
+}
diff --git a/Content.Server/_CP14/Farming/CP14FarmingSystem.Interactions.cs b/Content.Server/_CP14/Farming/CP14FarmingSystem.Interactions.cs
new file mode 100644
index 0000000000..8c31bef3d6
--- /dev/null
+++ b/Content.Server/_CP14/Farming/CP14FarmingSystem.Interactions.cs
@@ -0,0 +1,153 @@
+using Content.Server._CP14.Farming.Components;
+using Content.Server.Gatherable.Components;
+using Content.Shared._CP14.Farming;
+using Content.Shared.DoAfter;
+using Content.Shared.Interaction;
+using Content.Shared.Weapons.Melee.Events;
+
+namespace Content.Server._CP14.Farming;
+
+public sealed partial class CP14FarmingSystem
+{
+ private void InitializeInteractions()
+ {
+ SubscribeLocalEvent(OnSeedInteract);
+ SubscribeLocalEvent(OnActivate);
+ SubscribeLocalEvent(OnAttacked);
+
+ SubscribeLocalEvent(OnSeedPlantedDoAfter);
+ }
+
+ private void OnAttacked(Entity gatherable, ref AttackedEvent args)
+ {
+ if (_whitelist.IsWhitelistFailOrNull(gatherable.Comp.ToolWhitelist, args.Used))
+ return;
+
+ TryHarvestPlant(gatherable, out _);
+ }
+
+ private void OnActivate(Entity gatherable, ref ActivateInWorldEvent args)
+ {
+ if (args.Handled || !args.Complex)
+ return;
+
+ if (_whitelist.IsWhitelistFailOrNull(gatherable.Comp.ToolWhitelist, args.User))
+ return;
+
+ TryHarvestPlant(gatherable, out _);
+ args.Handled = true;
+ }
+
+ public bool TryHarvestPlant(Entity gatheredPlant, out HashSet result, EntityUid? gatherer = null)
+ {
+ result = new();
+
+ if (!TryComp(gatheredPlant, out var plant))
+ return false;
+
+ if (plant.GrowthLevel < gatheredPlant.Comp.GrowthLevelToHarvest)
+ return false;
+
+
+ if (TryComp(gatheredPlant, out var soundComp))
+ {
+ _audio.PlayPvs(soundComp.Sound, Transform(gatheredPlant).Coordinates);
+ }
+
+ if (gatheredPlant.Comp.Loot == null)
+ return false;
+
+ var pos = _transform.GetMapCoordinates(gatheredPlant);
+
+ foreach (var (tag, table) in gatheredPlant.Comp.Loot)
+ {
+ if (tag != "All")
+ {
+ if (gatherer != null && !_tag.HasTag(gatherer.Value, tag))
+ continue;
+ }
+
+ if (!_proto.TryIndex(table, out var getLoot))
+ continue;
+
+ var spawnLoot = getLoot.GetSpawns(_random);
+ var spawnPos = pos.Offset(_random.NextVector2(gatheredPlant.Comp.GatherOffset));
+ result.Add(Spawn(spawnLoot[0], spawnPos)); //TODO почему то не спавнится больше 1 пшенички. Кажись проблема оффов
+ }
+
+ if (gatheredPlant.Comp.DeleteAfterHarvest)
+ _destructible.DestroyEntity(gatheredPlant);
+ else
+ AffectGrowth((gatheredPlant, plant), -gatheredPlant.Comp.GrowthCostHarvest);
+
+ return true;
+ }
+
+ private void OnSeedInteract(Entity seed, ref AfterInteractEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (!TryComp(args.Target, out var soil))
+ return;
+
+ if (EntityManager.EntityExists(soil.PlantUid))
+ {
+ _popup.PopupEntity(Loc.GetString("cp14-farming-soil-interact-plant-exist"), args.Target.Value, args.User);
+ return;
+ }
+ var doAfterArgs =
+ new DoAfterArgs(EntityManager, args.User, seed.Comp.PlantingTime, new PlantSeedDoAfterEvent(), args.Target, args.Used, args.Target)
+ {
+ BreakOnDamage = true,
+ BlockDuplicate = true,
+ BreakOnMove = true,
+ BreakOnHandChange = true,
+ };
+ _doAfter.TryStartDoAfter(doAfterArgs);
+
+ args.Handled = true;
+ }
+
+ public bool TryPlantSeed(EntityUid seed, EntityUid soil, EntityUid? user)
+ {
+ if (!TryComp(soil, out var soilComp))
+ return false;
+
+ if (!TryComp(seed, out var seedComp))
+ return false;
+
+ if (Exists(soilComp.PlantUid))
+ {
+ if (user is not null)
+ _popup.PopupEntity(Loc.GetString("cp14-farming-soil-interact-plant-exist"), soil, user.Value);
+
+ return false;
+ }
+
+ var plant = SpawnAttachedTo(seedComp.PlantProto, Transform(soil).Coordinates);
+
+ if (!TryComp(plant, out var plantComp))
+ return false;
+
+ _transform.SetParent(plant, soil);
+ soilComp.PlantUid = plant;
+ plantComp.SoilUid = soil;
+
+ return true;
+ }
+
+ private void OnSeedPlantedDoAfter(Entity soil, ref PlantSeedDoAfterEvent args)
+ {
+ if (args.Cancelled || args.Handled || args.Args.Used == null || args.Target == null)
+ return;
+
+ if (!TryPlantSeed(args.Target.Value, soil, args.User))
+ return;
+
+ //Audio
+ QueueDel(args.Target); //delete seed
+
+ args.Handled = true;
+ }
+}
diff --git a/Content.Server/_CP14/Farming/CP14FarmingSystem.Resourse.cs b/Content.Server/_CP14/Farming/CP14FarmingSystem.Resourse.cs
new file mode 100644
index 0000000000..c431f94d7f
--- /dev/null
+++ b/Content.Server/_CP14/Farming/CP14FarmingSystem.Resourse.cs
@@ -0,0 +1,87 @@
+using Content.Server._CP14.Farming.Components;
+using Content.Shared._CP14.Farming;
+using Content.Shared.Chemistry.Components.SolutionManager;
+
+namespace Content.Server._CP14.Farming;
+
+public sealed partial class CP14FarmingSystem
+{
+ private void InitializeResources()
+ {
+ SubscribeLocalEvent(OnTakeEnergyFromLight);
+ SubscribeLocalEvent(OnPlantMetabolizing);
+ SubscribeLocalEvent(OnPlantFade);
+
+ SubscribeLocalEvent(OnPlantGrowing);
+ }
+
+ private void OnPlantFade(Entity ent, ref CP14PlantUpdateEvent args)
+ {
+ var realFade = ent.Comp.ResourcePerMinute * (float)args.Plant.Comp.Age.TotalMinutes;
+ if (args.Plant.Comp.Resource < realFade)
+ {
+ _damageable.TryChangeDamage(ent, ent.Comp.FadeDamage, true);
+ }
+ AffectResource(args.Plant, -realFade);
+ }
+
+ private void OnTakeEnergyFromLight(Entity regeneration, ref CP14PlantUpdateEvent args)
+ {
+ var gainEnergy = false;
+ var daylight = _dayCycle.TryDaylightThere(regeneration, true);
+
+ if (regeneration.Comp.Daytime && daylight)
+ gainEnergy = true;
+
+ if (regeneration.Comp.Nighttime && !daylight)
+ gainEnergy = true;
+
+ if (gainEnergy)
+ args.EnergyDelta += regeneration.Comp.Energy;
+ }
+
+ private void OnPlantGrowing(Entity growing, ref CP14AfterPlantUpdateEvent args)
+ {
+ if (args.Plant.Comp.Energy < growing.Comp.EnergyCost)
+ return;
+
+ if (args.Plant.Comp.Resource < growing.Comp.ResourceCost)
+ return;
+
+ if (args.Plant.Comp.GrowthLevel >= 1)
+ return;
+
+ AffectEnergy(args.Plant, -growing.Comp.EnergyCost);
+ AffectResource(args.Plant, -growing.Comp.ResourceCost);
+
+ AffectGrowth(args.Plant, growing.Comp.GrowthPerUpdate);
+ }
+
+ private void OnPlantMetabolizing(Entity ent, ref CP14PlantUpdateEvent args)
+ {
+ if (args.Plant.Comp.SoilUid == null ||
+ !TryComp(args.Plant.Comp.SoilUid, out var soil) ||
+ !TryComp(ent, out var plant) ||
+ !TryComp(args.Plant.Comp.SoilUid, out var solmanager))
+ return;
+
+ var solEntity = new Entity(args.Plant.Comp.SoilUid.Value, solmanager);
+ if (!_solutionContainer.TryGetSolution(solEntity, soil.Solution, out var soln, out var solution))
+ return;
+
+ if (!_proto.TryIndex(ent.Comp.MetabolizerId, out var metabolizer))
+ return;
+
+ var splitted = _solutionContainer.SplitSolution(soln.Value, ent.Comp.SolutionPerUpdate);
+ foreach (var reagent in splitted)
+ {
+ if (!metabolizer.Metabolization.ContainsKey(reagent.Reagent.ToString()))
+ continue;
+
+ foreach (var effect in metabolizer.Metabolization[reagent.Reagent.ToString()])
+ {
+ effect.Effect((ent, plant), reagent.Quantity, EntityManager);
+ }
+ }
+ }
+}
diff --git a/Content.Server/_CP14/Farming/CP14FarmingSystem.cs b/Content.Server/_CP14/Farming/CP14FarmingSystem.cs
new file mode 100644
index 0000000000..8eeaa3bd5e
--- /dev/null
+++ b/Content.Server/_CP14/Farming/CP14FarmingSystem.cs
@@ -0,0 +1,114 @@
+using Content.Server._CP14.Farming.Components;
+using Content.Server.Destructible;
+using Content.Server.DoAfter;
+using Content.Server.Popups;
+using Content.Shared._CP14.DayCycle;
+using Content.Shared._CP14.Farming;
+using Content.Shared.Chemistry.EntitySystems;
+using Content.Shared.Damage;
+using Content.Shared.Tag;
+using Content.Shared.Whitelist;
+using Robust.Server.Audio;
+using Robust.Server.GameObjects;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
+using Robust.Shared.Timing;
+
+namespace Content.Server._CP14.Farming;
+
+public sealed partial class CP14FarmingSystem : CP14SharedFarmingSystem
+{
+ [Dependency] private readonly DoAfterSystem _doAfter = default!;
+ [Dependency] private readonly CP14DayCycleSystem _dayCycle = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly TransformSystem _transform = default!;
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly IPrototypeManager _proto = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
+ [Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
+ [Dependency] private readonly AudioSystem _audio = default!;
+ [Dependency] private readonly TagSystem _tag = default!;
+ [Dependency] private readonly DamageableSystem _damageable = default!;
+ [Dependency] private readonly DestructibleSystem _destructible = default!;
+ [Dependency] private readonly SharedMapSystem _map = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ InitializeInteractions();
+ InitializeResources();
+
+ SubscribeLocalEvent(OnUnpaused);
+ SubscribeLocalEvent(OnMapInit);
+ SubscribeLocalEvent(OnAutoRootMapInit);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var plant))
+ {
+ if (_timing.CurTime <= plant.NextUpdateTime)
+ continue;
+
+ var newTime = _random.NextFloat(plant.UpdateFrequency);
+ plant.NextUpdateTime = _timing.CurTime + TimeSpan.FromSeconds(newTime);
+ plant.Age += TimeSpan.FromSeconds(plant.UpdateFrequency);
+
+ var ev = new CP14PlantUpdateEvent((uid, plant));
+ RaiseLocalEvent(uid, ev);
+
+ AffectResource((uid, plant), ev.ResourceDelta);
+ AffectEnergy((uid, plant), ev.EnergyDelta);
+
+ var ev2 = new CP14AfterPlantUpdateEvent((uid, plant));
+ RaiseLocalEvent(uid, ev2);
+
+ Dirty(uid, plant);
+ }
+ }
+
+ private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args)
+ {
+ ent.Comp.NextUpdateTime += args.PausedTime;
+ }
+
+ private void OnMapInit(Entity plant, ref MapInitEvent args)
+ {
+ var newTime = _random.NextFloat(plant.Comp.UpdateFrequency);
+ plant.Comp.NextUpdateTime = _timing.CurTime + TimeSpan.FromSeconds(newTime);
+ }
+
+ private void OnAutoRootMapInit(Entity autoRoot, ref MapInitEvent args)
+ {
+ var grid = Transform(autoRoot).GridUid;
+ if (grid == null || !TryComp(grid, out var gridComp))
+ return;
+
+
+ var targetPos = new EntityCoordinates(grid.Value,Transform(autoRoot).LocalPosition);
+ var anchored = _map.GetAnchoredEntities(grid.Value, gridComp, targetPos);
+
+ foreach (var entt in anchored)
+ {
+ if (!TryComp(entt, out var soil))
+ continue;
+
+ _transform.SetParent(autoRoot, entt);
+ soil.PlantUid = autoRoot;
+
+ if (TryComp(autoRoot, out var plantComp))
+ {
+ plantComp.SoilUid = entt;
+ }
+
+ break;
+ }
+ }
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14PlantAutoRootComponent.cs b/Content.Server/_CP14/Farming/Components/CP14PlantAutoRootComponent.cs
new file mode 100644
index 0000000000..6732756f93
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14PlantAutoRootComponent.cs
@@ -0,0 +1,9 @@
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// when it init, it automatically attaches itself by its roots to the soil beneath it.
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14PlantAutoRootComponent : Component
+{
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14PlantEnergyFromLightComponent.cs b/Content.Server/_CP14/Farming/Components/CP14PlantEnergyFromLightComponent.cs
new file mode 100644
index 0000000000..7aee236634
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14PlantEnergyFromLightComponent.cs
@@ -0,0 +1,17 @@
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// allows the plant to receive energy passively, depending on daylight
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14PlantEnergyFromLightComponent : Component
+{
+ [DataField]
+ public float Energy = 0f;
+
+ [DataField]
+ public bool Daytime = true;
+
+ [DataField]
+ public bool Nighttime = false;
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14PlantFadingComponent.cs b/Content.Server/_CP14/Farming/Components/CP14PlantFadingComponent.cs
new file mode 100644
index 0000000000..75339a0201
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14PlantFadingComponent.cs
@@ -0,0 +1,23 @@
+using Content.Shared.Damage;
+using Content.Shared.FixedPoint;
+
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// Gradually wastes the plant's resources, killing it if there aren't enough. The waste gradually increases over time, reflecting the "Old Age" of the plant
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14PlantFadingComponent : Component
+{
+ [DataField]
+ public float ResourcePerMinute = 0f;
+
+ [DataField]
+ public DamageSpecifier FadeDamage = new()
+ {
+ DamageDict = new Dictionary
+ {
+ { "Cellular", 0.05 },
+ },
+ };
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14PlantGrowingComponent.cs b/Content.Server/_CP14/Farming/Components/CP14PlantGrowingComponent.cs
new file mode 100644
index 0000000000..a78c399c3c
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14PlantGrowingComponent.cs
@@ -0,0 +1,20 @@
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// Is trying to use up the plant's energy and resources to grow.
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14PlantGrowingComponent : Component
+{
+ [DataField]
+ public float EnergyCost = 0f;
+
+ [DataField]
+ public float ResourceCost = 0f;
+
+ ///
+ /// for each plant renewal. It is not every frame, it depends on the refresh rate in PlantComponent
+ ///
+ [DataField]
+ public float GrowthPerUpdate = 0f;
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14PlantMetabolizerComponent.cs b/Content.Server/_CP14/Farming/Components/CP14PlantMetabolizerComponent.cs
new file mode 100644
index 0000000000..1d1aeed2bc
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14PlantMetabolizerComponent.cs
@@ -0,0 +1,18 @@
+using Content.Shared._CP14.Farming.Prototypes;
+using Content.Shared.FixedPoint;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// allows the plant to obtain resources by absorbing liquid from the ground
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14PlantMetabolizerComponent : Component
+{
+ [DataField]
+ public FixedPoint2 SolutionPerUpdate = 5f;
+
+ [DataField(required: true)]
+ public ProtoId MetabolizerId;
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14SeedComponent.cs b/Content.Server/_CP14/Farming/Components/CP14SeedComponent.cs
new file mode 100644
index 0000000000..5a3f81d47f
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14SeedComponent.cs
@@ -0,0 +1,16 @@
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// a component that allows for the creation of the plant entity on the soil
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14SeedComponent : Component
+{
+ [DataField]
+ public TimeSpan PlantingTime = TimeSpan.FromSeconds(2f);
+
+ [DataField(required: true)]
+ public EntProtoId PlantProto;
+}
diff --git a/Content.Server/_CP14/Farming/Components/CP14SoilComponent.cs b/Content.Server/_CP14/Farming/Components/CP14SoilComponent.cs
new file mode 100644
index 0000000000..8cb4740a85
--- /dev/null
+++ b/Content.Server/_CP14/Farming/Components/CP14SoilComponent.cs
@@ -0,0 +1,13 @@
+namespace Content.Server._CP14.Farming.Components;
+
+///
+/// a component that provides a link to a liquid storage that can be used by the plant
+///
+[RegisterComponent, Access(typeof(CP14FarmingSystem))]
+public sealed partial class CP14SoilComponent : Component
+{
+ [DataField(required: true)]
+ public string Solution = string.Empty;
+
+ public EntityUid? PlantUid;
+}
diff --git a/Content.Server/_CP14/SpawnOnTileTool/CP14SpawnOnTileSystem.cs b/Content.Server/_CP14/SpawnOnTileTool/CP14SpawnOnTileSystem.cs
new file mode 100644
index 0000000000..33cb3dfd58
--- /dev/null
+++ b/Content.Server/_CP14/SpawnOnTileTool/CP14SpawnOnTileSystem.cs
@@ -0,0 +1,21 @@
+using Content.Shared._CP14.SpawnOnTileTool;
+
+namespace Content.Server._CP14.SpawnOnTileTool;
+
+public sealed partial class CP14SpawnOnTileToolSystem : SharedCP14SpawnOnTileToolSystem
+{
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(AfterDoAfter);
+ }
+
+ private void AfterDoAfter(Entity ent, ref SpawnOnTileToolAfterEvent args)
+ {
+ if (args.Handled || args.Cancelled)
+ return;
+
+ SpawnAtPosition(args.Spawn, GetCoordinates(args.Coordinates));
+
+ args.Handled = true;
+ }
+}
diff --git a/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs b/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs
index 4d7cd39b6d..423957219d 100644
--- a/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs
+++ b/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs
@@ -1,3 +1,6 @@
+using System.Diagnostics;
+using Content.Shared.Maps;
+using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Timing;
@@ -9,6 +12,9 @@ public sealed partial class CP14DayCycleSystem : EntitySystem
private const float MaxTimeDiff = 0.05f;
[Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly SharedMapSystem _maps = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!;
public override void Initialize()
{
@@ -102,6 +108,35 @@ public sealed partial class CP14DayCycleSystem : EntitySystem
Dirty(dayCycle);
}
+ ///
+ /// Checks to see if the specified entity is on the map where it's daytime.
+ ///
+ /// An entity being tested to see if it is in daylight
+ /// Checks if the tile covers the weather (the only "roof" factor at the moment)
+ /// daylight test result returned
+ public bool TryDaylightThere(EntityUid target, bool checkRoof)
+ {
+ if (!TryComp(target, out var xform))
+ return false;
+
+ if (!TryComp(xform.MapUid, out var dayCycle))
+ return false;
+
+ if (checkRoof)
+ {
+ if (!TryComp(xform.GridUid, out var mapGrid))
+ return !dayCycle.IsNight;
+
+ var tileRef = _maps.GetTileRef(xform.GridUid.Value, mapGrid, xform.Coordinates);
+ var tileDef = (ContentTileDefinition) _tileDefManager[tileRef.Tile.TypeId];
+
+ if (!tileDef.Weather)
+ return false;
+ }
+
+ return !dayCycle.IsNight;
+ }
+
private void SetAmbientColor(Entity light, Color color)
{
if (color == light.Comp.AmbientLightColor)
diff --git a/Content.Shared/_CP14/DestroyedByTool/CP14DestroyedByToolComponent.cs b/Content.Shared/_CP14/DestroyedByTool/CP14DestroyedByToolComponent.cs
new file mode 100644
index 0000000000..8b42e08637
--- /dev/null
+++ b/Content.Shared/_CP14/DestroyedByTool/CP14DestroyedByToolComponent.cs
@@ -0,0 +1,17 @@
+using Content.Shared.Tools;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._CP14.DestroyedByTool;
+
+///
+/// abstract ability to destroy objects by using the right kind of tool on them
+///
+[RegisterComponent, Access(typeof(CP14DestroyedByToolSystem))]
+public sealed partial class CP14DestroyedByToolComponent : Component
+{
+ [DataField]
+ public ProtoId? Tool;
+
+ [DataField]
+ public TimeSpan RemoveTime = TimeSpan.FromSeconds(1f);
+}
diff --git a/Content.Shared/_CP14/DestroyedByTool/CP14DestroyedByToolSystem.cs b/Content.Shared/_CP14/DestroyedByTool/CP14DestroyedByToolSystem.cs
new file mode 100644
index 0000000000..57067c3d4b
--- /dev/null
+++ b/Content.Shared/_CP14/DestroyedByTool/CP14DestroyedByToolSystem.cs
@@ -0,0 +1,59 @@
+using Content.Shared.DoAfter;
+using Content.Shared.Interaction;
+using Content.Shared.Tools.Components;
+using Content.Shared.Tools.Systems;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._CP14.DestroyedByTool;
+
+public sealed partial class CP14DestroyedByToolSystem : EntitySystem
+{
+ [Dependency] private readonly SharedToolSystem _tool = default!;
+ [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnDestroyDoAfter);
+ SubscribeLocalEvent(OnInteractUsing);
+ }
+
+ private void OnInteractUsing(Entity ent, ref InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (ent.Comp.Tool == null || !_tool.HasQuality(args.Used, ent.Comp.Tool))
+ return;
+
+ if (TryComp(args.Used, out var tool))
+ {
+ _tool.PlayToolSound(args.Used, tool, args.User);
+ }
+
+ var doAfterArgs =
+ new DoAfterArgs(EntityManager, args.User, ent.Comp.RemoveTime, new CP14DestroyedByToolDoAfterEvent(), args.Target)
+ {
+ BreakOnDamage = true,
+ BlockDuplicate = true,
+ BreakOnMove = true,
+ BreakOnHandChange = true,
+ };
+ _doAfter.TryStartDoAfter(doAfterArgs);
+ }
+
+ private void OnDestroyDoAfter(Entity ent, ref CP14DestroyedByToolDoAfterEvent args)
+ {
+ if (args.Cancelled || args.Handled)
+ return;
+
+ QueueDel(ent);
+
+ args.Handled = true;
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed partial class CP14DestroyedByToolDoAfterEvent : SimpleDoAfterEvent
+{
+}
diff --git a/Content.Shared/_CP14/Farming/CP14PlantComponent.cs b/Content.Shared/_CP14/Farming/CP14PlantComponent.cs
new file mode 100644
index 0000000000..df35aee9c8
--- /dev/null
+++ b/Content.Shared/_CP14/Farming/CP14PlantComponent.cs
@@ -0,0 +1,75 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._CP14.Farming;
+
+///
+/// The backbone of any plant. Provides common variables for the plant to other components, and a link to the soil
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(CP14SharedFarmingSystem))]
+public sealed partial class CP14PlantComponent : Component
+{
+ ///
+ /// Soil link. May be null, as not all plants in the world grow on entity soil (e.g. wild shrubs)
+ ///
+ public EntityUid? SoilUid;
+
+ ///
+ /// The ability to consume a resource for growing
+ ///
+ [DataField]
+ public float Energy = 0f;
+
+ [DataField]
+ public float EnergyMax = 100f;
+
+ ///
+ /// resource consumed for growth
+ ///
+ [DataField]
+ public float Resource = 0f;
+
+ [DataField]
+ public float ResourceMax = 100f;
+
+ ///
+ /// Plant growth status, 0 to 1
+ ///
+ [DataField, AutoNetworkedField]
+ public float GrowthLevel = 0f;
+
+ [DataField(serverOnly: true)]
+ public float UpdateFrequency = 60f;
+
+ [DataField(serverOnly: true)]
+ public TimeSpan NextUpdateTime = TimeSpan.Zero;
+
+ [DataField(serverOnly: true)]
+ public TimeSpan Age = TimeSpan.Zero;
+}
+
+///
+/// Is called periodically at random intervals on the plant.
+///
+public sealed class CP14PlantUpdateEvent : EntityEventArgs
+{
+ public readonly Entity Plant;
+ public float EnergyDelta = 0f;
+ public float ResourceDelta = 0f;
+
+ public CP14PlantUpdateEvent(Entity comp)
+ {
+ Plant = comp;
+ }
+}
+
+///
+/// is called after CP14PlantUpdateEvent when all value changes have already been calculated.
+///
+public sealed class CP14AfterPlantUpdateEvent : EntityEventArgs
+{
+ public readonly Entity Plant;
+ public CP14AfterPlantUpdateEvent(Entity comp)
+ {
+ Plant = comp;
+ }
+}
diff --git a/Content.Shared/_CP14/Farming/CP14PlantGatherableComponent.cs b/Content.Shared/_CP14/Farming/CP14PlantGatherableComponent.cs
new file mode 100644
index 0000000000..a5800528da
--- /dev/null
+++ b/Content.Shared/_CP14/Farming/CP14PlantGatherableComponent.cs
@@ -0,0 +1,63 @@
+
+using Content.Shared.EntityList;
+using Content.Shared.Whitelist;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._CP14.Farming;
+
+///
+/// Means that the plant can be harvested.
+///
+[RegisterComponent]
+public sealed partial class CP14PlantGatherableComponent : Component
+{
+ ///
+ /// Whitelist for specifying the kind of tools can be used on a resource
+ /// Supports multiple tags.
+ ///
+ [DataField(required: true)]
+ public EntityWhitelist ToolWhitelist = new();
+
+ ///
+ /// YAML example below
+ /// (Tag1, Tag2, LootTableID1, LootTableID2 are placeholders for example)
+ /// --------------------
+ /// useMappedLoot: true
+ /// toolWhitelist:
+ /// tags:
+ /// - Tag1
+ /// - Tag2
+ /// loot:
+ /// Tag1: LootTableID1
+ /// Tag2: LootTableID2
+ ///
+ [DataField]
+ public Dictionary>? Loot = new();
+
+ ///
+ /// Random shift of the appearing entity during gathering
+ ///
+ [DataField]
+ public float GatherOffset = 0.3f;
+
+ [DataField]
+ public TimeSpan Time = TimeSpan.FromSeconds(1f);
+
+ ///
+ /// after harvesting, should the plant be completely removed?
+ ///
+ [DataField]
+ public bool DeleteAfterHarvest = false;
+
+ ///
+ /// after harvest, the growth level of the plant will be reduced by the specified value
+ ///
+ [DataField]
+ public float GrowthCostHarvest = 0.4f;
+
+ ///
+ /// what level of growth does a plant need to have before it can be harvested?
+ ///
+ [DataField]
+ public float GrowthLevelToHarvest = 0.9f;
+}
diff --git a/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs b/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs
new file mode 100644
index 0000000000..27a03fdbb6
--- /dev/null
+++ b/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs
@@ -0,0 +1,37 @@
+using Content.Shared.DoAfter;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._CP14.Farming;
+
+public abstract partial class CP14SharedFarmingSystem : EntitySystem
+{
+ public void AffectEnergy(Entity ent, float energyDelta)
+ {
+ if (energyDelta == 0)
+ return;
+
+ ent.Comp.Energy = MathHelper.Clamp(ent.Comp.Energy + energyDelta, 0, ent.Comp.EnergyMax);
+ }
+ public void AffectResource(Entity ent, float resourceDelta)
+ {
+ if (resourceDelta == 0)
+ return;
+
+ ent.Comp.Resource = MathHelper.Clamp(ent.Comp.Resource + resourceDelta, 0, ent.Comp.ResourceMax);
+ }
+
+ public void AffectGrowth(Entity ent, float growthDelta)
+ {
+ if (growthDelta == 0)
+ return;
+
+ ent.Comp.GrowthLevel = MathHelper.Clamp01(ent.Comp.GrowthLevel + growthDelta);
+ Dirty(ent);
+ }
+
+
+ [Serializable, NetSerializable]
+ public sealed partial class PlantSeedDoAfterEvent : SimpleDoAfterEvent
+ {
+ }
+}
diff --git a/Content.Shared/_CP14/Farming/Metabolizer/AffectPlantValues.cs b/Content.Shared/_CP14/Farming/Metabolizer/AffectPlantValues.cs
new file mode 100644
index 0000000000..839783f2a1
--- /dev/null
+++ b/Content.Shared/_CP14/Farming/Metabolizer/AffectPlantValues.cs
@@ -0,0 +1,23 @@
+using Content.Shared._CP14.Farming.Prototypes;
+using Content.Shared.FixedPoint;
+
+namespace Content.Shared._CP14.Farming.Metabolizer;
+
+public sealed partial class AffectPlantValues : CP14MetabolizerEffect
+{
+ [DataField]
+ public float Energy = 0f;
+ [DataField]
+ public float Resource = 0f;
+ [DataField]
+ public float Growth = 0f;
+
+ public override void Effect(Entity plant, FixedPoint2 amount, EntityManager entityManager)
+ {
+ var farmingSystem = entityManager.System();
+
+ farmingSystem.AffectEnergy(plant, Energy * (float)amount);
+ farmingSystem.AffectResource(plant,Resource * (float)amount);
+ farmingSystem.AffectGrowth(plant, Growth * (float)amount);
+ }
+}
diff --git a/Content.Shared/_CP14/Farming/Prototypes/CP14PlantMetabolizerPrototype.cs b/Content.Shared/_CP14/Farming/Prototypes/CP14PlantMetabolizerPrototype.cs
new file mode 100644
index 0000000000..3d747d3090
--- /dev/null
+++ b/Content.Shared/_CP14/Farming/Prototypes/CP14PlantMetabolizerPrototype.cs
@@ -0,0 +1,27 @@
+using Content.Shared.Chemistry.Reagent;
+using Content.Shared.FixedPoint;
+using JetBrains.Annotations;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._CP14.Farming.Prototypes;
+
+///
+/// Allows the plant to drink chemicals from the soil. The effect of the drank reagents depends on the selected metabolizer.
+///
+[Prototype("CP14PlantMetabolizer")]
+public sealed partial class CP14PlantMetabolizerPrototype : IPrototype
+{
+ [ViewVariables]
+ [IdDataField]
+ public string ID { get; private set; } = string.Empty;
+
+ [DataField]
+ public Dictionary, HashSet> Metabolization = new();
+}
+
+[ImplicitDataDefinitionForInheritors]
+[MeansImplicitUse]
+public abstract partial class CP14MetabolizerEffect
+{
+ public abstract void Effect(Entity plant, FixedPoint2 amount, EntityManager entityManager);
+}
diff --git a/Content.Shared/_CP14/SpawnOnTileTool/CP14SpawnOnTileToolComponent.cs b/Content.Shared/_CP14/SpawnOnTileTool/CP14SpawnOnTileToolComponent.cs
new file mode 100644
index 0000000000..9bdd921e2a
--- /dev/null
+++ b/Content.Shared/_CP14/SpawnOnTileTool/CP14SpawnOnTileToolComponent.cs
@@ -0,0 +1,43 @@
+using Content.Shared.DoAfter;
+using Content.Shared.Maps;
+using Robust.Shared.Map;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._CP14.SpawnOnTileTool;
+
+///
+/// Allows using an item on a certain type of tile to spawn entities on it.
+///
+[RegisterComponent, Access(typeof(SharedCP14SpawnOnTileToolSystem))]
+public sealed partial class CP14SpawnOnTileToolComponent : Component
+{
+ [DataField]
+ public Dictionary, EntProtoId> Spawns = new();
+
+ [DataField]
+ public bool NeedEmptySpace = true;
+
+ [DataField]
+ public TimeSpan DoAfter = TimeSpan.FromSeconds(1f);
+}
+
+[Serializable, NetSerializable]
+public sealed partial class SpawnOnTileToolAfterEvent : DoAfterEvent
+{
+ public override DoAfterEvent Clone() => this;
+ public readonly NetCoordinates Coordinates;
+ public readonly EntProtoId Spawn;
+
+ public SpawnOnTileToolAfterEvent(IEntityManager entManager, EntityCoordinates coord, EntProtoId spawn)
+ {
+ Spawn = spawn;
+ Coordinates = entManager.GetNetCoordinates(coord);
+ }
+
+ public SpawnOnTileToolAfterEvent(NetCoordinates coord, EntProtoId spawn)
+ {
+ Spawn = spawn;
+ Coordinates = coord;
+ }
+}
diff --git a/Content.Shared/_CP14/SpawnOnTileTool/SharedCP14SpawnOnTileToolSystem.cs b/Content.Shared/_CP14/SpawnOnTileTool/SharedCP14SpawnOnTileToolSystem.cs
new file mode 100644
index 0000000000..1236aed50c
--- /dev/null
+++ b/Content.Shared/_CP14/SpawnOnTileTool/SharedCP14SpawnOnTileToolSystem.cs
@@ -0,0 +1,58 @@
+using System.Linq;
+using Content.Shared._CP14.Farming;
+using Content.Shared.DoAfter;
+using Content.Shared.Interaction;
+using Content.Shared.Maps;
+using Content.Shared.Popups;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+
+namespace Content.Shared._CP14.SpawnOnTileTool;
+
+public partial class SharedCP14SpawnOnTileToolSystem : EntitySystem
+{
+ [Dependency] private readonly SharedMapSystem _map = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly ITileDefinitionManager _tileDef = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnAfterInteract);
+ }
+
+ private void OnAfterInteract(Entity tool, ref AfterInteractEvent args)
+ {
+ var grid = _transform.GetGrid(args.ClickLocation);
+
+ if (grid == null || !TryComp(grid, out var gridComp))
+ return;
+
+ var tile = _map.GetTileRef(grid.Value, gridComp, args.ClickLocation);
+ var tileDef = (ContentTileDefinition) _tileDef[tile.Tile.TypeId];
+
+ if (tool.Comp.NeedEmptySpace && _map.GetAnchoredEntities(grid.Value, gridComp, args.ClickLocation).Count() > 0)
+ {
+ _popup.PopupClient(Loc.GetString("cp14-insufficient-space"), args.ClickLocation, args.User);
+ return;
+ }
+
+ foreach (var pair in tool.Comp.Spawns)
+ {
+ if (tileDef.ID != pair.Key)
+ continue;
+
+ var doAfterArgs =
+ new DoAfterArgs(EntityManager, args.User, tool.Comp.DoAfter, new SpawnOnTileToolAfterEvent(EntityManager, args.ClickLocation, pair.Value), tool)
+ {
+ BreakOnDamage = true,
+ BlockDuplicate = true,
+ BreakOnMove = true,
+ BreakOnHandChange = true
+ };
+ _doAfter.TryStartDoAfter(doAfterArgs);
+ break;
+ }
+ }
+}
diff --git a/Resources/Locale/en-US/_CP14/_PROTO/popup.ftl b/Resources/Locale/en-US/_CP14/_PROTO/popup.ftl
deleted file mode 100644
index 00c190f614..0000000000
--- a/Resources/Locale/en-US/_CP14/_PROTO/popup.ftl
+++ /dev/null
@@ -1,3 +0,0 @@
-# Crystal
-
-popup-cp14crystal-ding = *ding*
diff --git a/Resources/Locale/en-US/_CP14/farming/farming.ftl b/Resources/Locale/en-US/_CP14/farming/farming.ftl
new file mode 100644
index 0000000000..c6dcebdf30
--- /dev/null
+++ b/Resources/Locale/en-US/_CP14/farming/farming.ftl
@@ -0,0 +1 @@
+cp14-farming-soil-interact-plant-exist = There's already something planted here!
\ No newline at end of file
diff --git a/Resources/Locale/en-US/_CP14/misc/interaction.ftl b/Resources/Locale/en-US/_CP14/misc/interaction.ftl
new file mode 100644
index 0000000000..9c249fa011
--- /dev/null
+++ b/Resources/Locale/en-US/_CP14/misc/interaction.ftl
@@ -0,0 +1,3 @@
+popup-cp14crystal-ding = *ding*
+
+cp14-insufficient-space = Insufficient space!
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/_CP14/_PROTO/popup.ftl b/Resources/Locale/ru-RU/_CP14/_PROTO/popup.ftl
deleted file mode 100644
index eab662dd42..0000000000
--- a/Resources/Locale/ru-RU/_CP14/_PROTO/popup.ftl
+++ /dev/null
@@ -1,3 +0,0 @@
-# Crystal
-
-popup-cp14crystal-ding = *дзынь*
diff --git a/Resources/Locale/ru-RU/_CP14/farming/farming.ftl b/Resources/Locale/ru-RU/_CP14/farming/farming.ftl
new file mode 100644
index 0000000000..69ca0b04ea
--- /dev/null
+++ b/Resources/Locale/ru-RU/_CP14/farming/farming.ftl
@@ -0,0 +1 @@
+cp14-farming-soil-interact-plant-exist = Здесь уже что-то посажено!
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/_CP14/misc/interaction.ftl b/Resources/Locale/ru-RU/_CP14/misc/interaction.ftl
new file mode 100644
index 0000000000..7c5f6f97fe
--- /dev/null
+++ b/Resources/Locale/ru-RU/_CP14/misc/interaction.ftl
@@ -0,0 +1,3 @@
+popup-cp14crystal-ding = *дзынь*
+
+cp14-insufficient-space = Недостаточно места!
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/FARMINGTEST.yml b/Resources/Prototypes/_CP14/Entities/FARMINGTEST.yml
new file mode 100644
index 0000000000..6a83f97a5d
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/FARMINGTEST.yml
@@ -0,0 +1,10 @@
+- type: entity
+ id: CP14SeedTest
+ name: FUCK test SEED
+ parent: BaseItem
+ components:
+ - type: Sprite
+ sprite: Objects/Specific/Hydroponics/seeds.rsi
+ state: seed
+ - type: CP14Seed
+ plantProto: CP14PlantWheat
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/Random/herbal_gather.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/Random/herbal_gather.yml
index 6dc65152ef..4f25fde063 100644
--- a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/Random/herbal_gather.yml
+++ b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/Random/herbal_gather.yml
@@ -8,7 +8,7 @@
- type: Sprite
layers:
- state: red
- - sprite: _CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi
+ - sprite: _CP14/Structures/Specific/Farming/Herbals/agaric.rsi
state: world1
- type: RandomSpawner
prototypes:
diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Farming/farm.yml b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Farming/farm.yml
new file mode 100644
index 0000000000..486d0c3095
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Farming/farm.yml
@@ -0,0 +1,19 @@
+- type: entity
+ id: CP14Wheat
+ parent: ProduceBase
+ name: wheat bushel
+ description: You have the choice of either planting the grains again or grinding them into flour.
+ components:
+ - type: Item
+ size: Tiny
+ - type: Produce
+ - type: Sprite
+ sprite: _CP14/Objects/Specific/Farming/Produce/wheat.rsi
+ layers:
+ - state: base1
+ map: ["random"]
+ - type: RandomSprite
+ available:
+ - random:
+ base1: ""
+ base2: ""
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Alchemy/herbals.yml b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Farming/herbals.yml
similarity index 93%
rename from Resources/Prototypes/_CP14/Entities/Objects/Specific/Alchemy/herbals.yml
rename to Resources/Prototypes/_CP14/Entities/Objects/Specific/Farming/herbals.yml
index 5a1f5b2f43..0bf85076a9 100644
--- a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Alchemy/herbals.yml
+++ b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Farming/herbals.yml
@@ -12,7 +12,7 @@
size: Tiny
- type: Produce
- type: Sprite
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi
+ sprite: _CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi
layers:
- state: base1
map: ["random"]
@@ -54,7 +54,7 @@
size: Tiny
- type: Produce
- type: Sprite
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi
+ sprite: _CP14/Objects/Specific/Farming/Produce/agaric.rsi
layers:
- state: base1
map: ["random"]
@@ -93,7 +93,7 @@
size: Tiny
- type: Produce
- type: Sprite
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi
+ sprite: _CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi
layers:
- state: base1
map: ["random"]
@@ -131,7 +131,7 @@
- 0,0,0,1
- type: Produce
- type: Sprite
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi
+ sprite: _CP14/Objects/Specific/Farming/Produce/wild_sage.rsi
layers:
- state: base1
map: ["random"]
@@ -197,7 +197,7 @@
size: Tiny
- type: Produce
- type: Sprite
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi
+ sprite: _CP14/Objects/Specific/Farming/Produce/lumishroom.rsi
layers:
- state: base1
map: ["random"]
diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Tools/gardening.yml b/Resources/Prototypes/_CP14/Entities/Objects/Tools/gardening.yml
new file mode 100644
index 0000000000..f3d98a8f72
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Objects/Tools/gardening.yml
@@ -0,0 +1,53 @@
+- type: entity
+ id: CP14Shovel
+ parent: BaseItem
+ name: shovel
+ description: An implement for digging up earth, digging beds or graves.
+ components:
+ - type: Sprite
+ sprite: _CP14/Objects/Tools/shovel.rsi
+ state: icon
+ - type: MeleeWeapon
+ wideAnimationRotation: 65
+ damage:
+ types:
+ Blunt: 5
+ Slash: 2
+ soundHit:
+ collection: MetalThud
+ - type: Item
+ size: Normal
+ sprite: _CP14/Objects/Tools/shovel.rsi
+ - type: ToolTileCompatible
+ - type: Tool
+ qualities:
+ - CP14Digging
+ useSound:
+ collection: CP14Digging
+ params:
+ variation: 0.03
+ volume: 2
+
+- type: entity
+ id: CP14Hoe
+ parent: BaseItem
+ name: hoe
+ description: A gardening tool to prepare the soil for planting, or to clear weeds
+ components:
+ - type: Sprite
+ sprite: _CP14/Objects/Tools/hoe.rsi
+ state: icon
+ - type: MeleeWeapon
+ wideAnimationRotation: 65
+ damage:
+ types:
+ Piercing: 5
+ Slash: 2
+ soundHit:
+ collection: MetalThud
+ - type: Item
+ size: Normal
+ sprite: _CP14/Objects/Tools/hoe.rsi
+ - type: CP14SpawnOnTileTool
+ spawns:
+ CP14FloorDirt: CP14PloughedGround
diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Tools/shovel.yml b/Resources/Prototypes/_CP14/Entities/Objects/Tools/shovel.yml
deleted file mode 100644
index 95d2777f36..0000000000
--- a/Resources/Prototypes/_CP14/Entities/Objects/Tools/shovel.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-- type: entity
- id: CP14Shovel
- parent: BaseItem
- name: shovel
- description: An implement for digging up earth, digging beds or graves.
- components:
- - type: Sprite
- sprite: _CP14/Objects/Tools/shovel.rsi
- state: icon
- - type: MeleeWeapon
- wideAnimationRotation: 45
- damage:
- types:
- Blunt: 7
- Slash: 3
- soundHit:
- collection: MetalThud
- - type: Item
- size: Normal
- sprite: _CP14/Objects/Tools/shovel.rsi
- - type: ToolTileCompatible
- - type: Tool
- qualities:
- - CP14Digging
- useSound:
- collection: CP14Digging
- params:
- variation: 0.03
- volume: 2
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/base.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/base.yml
new file mode 100644
index 0000000000..e82e467a26
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/base.yml
@@ -0,0 +1,70 @@
+- type: entity
+ id: CP14GatherableBase
+ parent: BaseStructure
+ abstract: true
+ components:
+ - type: Sprite
+ snapCardinals: true
+ - type: Transform
+ anchored: true
+ - type: Physics
+ canCollide: false
+ bodyType: Static
+ - type: CP14DestroyedByTool
+ tool: CP14Digging
+ - type: CP14PlantAutoRoot
+ - type: Damageable
+ damageContainer: Biological
+ - type: MeleeSound
+ soundGroups:
+ Brute:
+ collection: CP14GrassGathering
+ params:
+ variation: 0.03
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 25
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Cellular
+ damage: 1
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+
+- type: entity
+ id: CP14GatherableWildBase
+ parent: CP14GatherableBase
+ abstract: true
+ components:
+ - type: Tag
+ tags:
+ - HideContextMenu
+ - type: Gatherable
+ toolWhitelist:
+ tags:
+ - CP14HerbalGathering
+
+- type: entity
+ id: CP14GatherablePlantBase
+ parent: CP14GatherableBase
+ abstract: true
+ components:
+ - type: InteractionOutline
+ - type: Appearance
+ - type: CP14PlantVisuals
+ growthSteps: 5
+ growState: "grow-"
+ - type: CP14Plant
+ resource: 10
+ energy: 0
+ growthLevel: 0
+ - type: CP14PlantGatherable
+ toolWhitelist:
+ tags:
+ - CP14HerbalGathering
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/domesticated.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/domesticated.yml
new file mode 100644
index 0000000000..6f2e5cb35e
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/domesticated.yml
@@ -0,0 +1,67 @@
+- type: entity
+ id: CP14PlantWheat
+ parent: CP14GatherablePlantBase
+ name: wheat
+ description: Most popular crop. Unpretentious, it opens the way to an abundance of flour products.
+ components:
+ - type: Sprite
+ sprite: _CP14/Structures/Specific/Farming/Herbals/wheat.rsi
+ layers:
+ - state: grow-1
+ map: ["enum.PlantVisualLayers.Base"]
+ - type: CP14PlantMetabolizer
+ metabolizerId: Base
+ - type: CP14PlantEnergyFromLight
+ energy: 1
+ daytime: true
+ - type: CP14PlantGrowing
+ energyCost: 1
+ resourceCost: 1
+ growthPerUpdate: 0.1 # 10 minute to full grow
+ - type: CP14PlantFading
+ resourcePerMinute: 0.25 #20 minute from water
+ - type: CP14PlantGatherable
+ deleteAfterHarvest: true
+ loot:
+ All: CP14GatherWheat
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 25
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Cellular
+ damage: 1
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ CP14PlantWheatDeath:
+ min: 1
+ max: 1
+
+- type: entity
+ id: CP14PlantWheatDeath
+ name: dead wheat
+ description: The sad spectacle of wasted food.
+ parent: CP14GatherableBase
+ components:
+ - type: Sprite
+ sprite: _CP14/Structures/Specific/Farming/Herbals/wheat.rsi
+ state: death
+ - type: Gatherable
+ toolWhitelist:
+ tags:
+ - CP14HerbalGathering
+
+- type: entityLootTable
+ id: CP14GatherWheat
+ entries:
+ - id: CP14Wheat
+ amount: 2
+ maxAmount: 4
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/herbals.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/wild.yml
similarity index 73%
rename from Resources/Prototypes/_CP14/Entities/Structures/Specific/herbals.yml
rename to Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/wild.yml
index 5c57c2e789..a67cb59e16 100644
--- a/Resources/Prototypes/_CP14/Entities/Structures/Specific/herbals.yml
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/Herbals/wild.yml
@@ -1,36 +1,3 @@
-- type: entity
- id: CP14GatherableHerbalBase
- parent: BaseStructure
- abstract: true
- components:
- - type: Transform
- anchored: true
- - type: Physics
- canCollide: false
- - type: Gatherable
- toolWhitelist:
- tags:
- - CP14HerbalGathering
- - type: Damageable
- damageContainer: Inorganic
- damageModifierSet: Wood
- - type: MeleeSound
- soundGroups:
- Brute:
- collection: CP14GrassGathering
- params:
- variation: 0.03
- - type: Destructible
- thresholds:
- - trigger:
- !type:DamageTrigger
- damage: 25
- behaviors:
- - !type:DoActsBehavior
- acts: [ "Destruction" ]
- - type: Tag
- tags:
- - HideContextMenu
# Bloodgrass
@@ -43,15 +10,14 @@
- type: entity
id: CP14GatherableBloodgrass
- parent: CP14GatherableHerbalBase
+ parent: CP14GatherableWildBase
name: bloodgrass
description: The dullest and most common plant to be found in the wild is the dark brown grass.
suffix: Gatherable
components:
- type: Sprite
- snapCardinals: true
drawdepth: FloorTiles
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi
+ sprite: _CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi
layers:
- state: grass1
map: ["random"]
@@ -78,15 +44,14 @@
- type: entity
id: CP14GatherableFlyAgaric
- parent: CP14GatherableHerbalBase
+ parent: CP14GatherableWildBase
name: fly agaric
description: This poisonous mushroom can often be found near bodies of water or other wet areas. It is not recommended for consumption.
suffix: Gatherable
components:
- type: Sprite
- snapCardinals: true
drawdepth: FloorTiles
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi
+ sprite: _CP14/Structures/Specific/Farming/Herbals/agaric.rsi
layers:
- state: world1
map: ["random"]
@@ -119,15 +84,14 @@
- type: entity
id: CP14GatherableChromiumSlime
- parent: CP14GatherableHerbalBase
+ parent: CP14GatherableWildBase
name: chromium slime
description: This rare thick substance can be found in a stream of water as if it has a mind of its own. When trying to change the slime itself - the slime changes the reagent it interacts with.
suffix: Gatherable
components:
- type: Sprite
- snapCardinals: true
drawdepth: FloorTiles
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi
+ sprite: _CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi
layers:
- state: world1
map: ["random"]
@@ -155,15 +119,14 @@
- type: entity
id: CP14GatherableWildSage
- parent: CP14GatherableHerbalBase
+ parent: CP14GatherableWildBase
name: wild sage
description: Root of this ubiquitous medicinal plant not bad at healing physical injuries, and inducing coughing.
suffix: Gatherable
components:
- type: Sprite
- snapCardinals: true
drawdepth: FloorTiles
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi
+ sprite: _CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi
layers:
- state: world1
map: ["random"]
@@ -188,15 +151,14 @@
- type: entity
id: CP14GatherableLumiMushroom
- parent: CP14GatherableHerbalBase
+ parent: CP14GatherableWildBase
name: lumishroom
description: A faintly luminous mushroom. Often used by alchemists as a means of concentrating solutions.
suffix: Gatherable
components:
- type: Sprite
- snapCardinals: true
drawdepth: FloorTiles
- sprite: _CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi
+ sprite: _CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi
layers:
- state: world1
map: ["random"]
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/soil.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/soil.yml
new file mode 100644
index 0000000000..ef711610ef
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Farming/soil.yml
@@ -0,0 +1,88 @@
+- type: entity
+ id: CP14BaseFarmingSoil
+ abstract: true
+ placement:
+ mode: SnapgridCenter
+ components:
+ - type: Clickable
+ - type: Physics
+ bodyType: Static
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.45,-0.45,0.45,0.1"
+ density: 190
+ hard: false
+ mask:
+ - FullTileMask
+ layer:
+ - FullTileMask
+ - type: Appearance
+ - type: SolutionContainerManager
+ solutions:
+ soil:
+ maxVol: 200
+ - type: RefillableSolution
+ solution: soil
+ maxRefill: 50
+ - type: Transform
+ anchored: true
+ - type: CP14Soil
+ solution: soil
+ - type: CP14DestroyedByTool
+ tool: CP14Digging
+
+- type: entity
+ name: ploughed ground
+ parent: CP14BaseFarmingSoil
+ id: CP14PloughedGround
+ components:
+ - type: Sprite
+ drawdepth: FloorTiles
+ sprite: _CP14/Structures/Specific/Farming/soil.rsi
+ layers:
+ - state: soil1
+ map: ["random"]
+ - state: liq-1 #Resprite this shit
+ map: ["enum.SolutionContainerLayers.Fill"]
+ visible: false
+ snapCardinals: true
+ - type: SolutionContainerVisuals
+ maxFillLevels: 4
+ fillBaseName: liq-
+ - type: RandomSprite
+ available:
+ - random:
+ soil1: ""
+ soil2: ""
+ soil3: ""
+ soil4: ""
+
+- type: entity
+ name: seedbed
+ id: CP14SeedbedDefault
+ parent: CP14BaseFarmingSoil
+ components:
+ - type: Icon
+ sprite: _CP14/Structures/Specific/Farming/seedbed.rsi
+ state: seedbed_default
+ - type: SmoothEdge
+ - type: IconSmooth
+ key: walls
+ mode: NoSprite
+ - type: Sprite
+ drawdepth: FloorTiles
+ sprite: _CP14/Structures/Specific/Farming/seedbed.rsi
+ layers:
+ - state: seedbed_default
+ - map: [ "enum.EdgeLayer.South" ]
+ state: seedbed_default_south
+ - map: [ "enum.EdgeLayer.East" ]
+ state: seedbed_default_east
+ - map: [ "enum.EdgeLayer.North" ]
+ state: seedbed_default_north
+ - map: [ "enum.EdgeLayer.West" ]
+ state: seedbed_default_west
+# snapCardinals: true (when you flip it over, you get a swastika)
diff --git a/Resources/Prototypes/_CP14/PlantMetabolizer/metabolizers.yml b/Resources/Prototypes/_CP14/PlantMetabolizer/metabolizers.yml
new file mode 100644
index 0000000000..ce99925717
--- /dev/null
+++ b/Resources/Prototypes/_CP14/PlantMetabolizer/metabolizers.yml
@@ -0,0 +1,6 @@
+- type: CP14PlantMetabolizer
+ id: Base
+ metabolization:
+ CP14Water:
+ - !type:AffectPlantValues
+ resource: 1
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base1.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base1.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base2.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base2.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base3.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base3.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base4.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base4.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base4.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base4.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base5.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base5.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/base5.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/base5.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/meta.json b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/meta.json
new file mode 100644
index 0000000000..10bdf6ee5e
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/agaric.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd (Github) for CrystallPunk14",
+ "states": [
+ {
+ "name": "base1"
+ },
+ {
+ "name": "base2"
+ },
+ {
+ "name": "base3"
+ },
+ {
+ "name": "base4"
+ },
+ {
+ "name": "base5"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base1.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base1.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base2.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base2.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base3.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base3.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base4.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base4.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base4.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base4.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base5.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base5.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/base5.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/base5.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/meta.json b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/meta.json
new file mode 100644
index 0000000000..a54761f6d7
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/bloodgrass.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Base Created by TheShuEd (Github) for CrystallPunk14, Grass taken from tgstation at commits https://github.com/tgstation/tgstation/commit/729d858807905263adab8b5a331c1d8a04982dd3, and recolored",
+ "states": [
+ {
+ "name": "base1"
+ },
+ {
+ "name": "base2"
+ },
+ {
+ "name": "base3"
+ },
+ {
+ "name": "base4"
+ },
+ {
+ "name": "base5"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/base1.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/base1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/base1.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/base1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/base2.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/base2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/base2.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/base2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/base3.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/base3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/base3.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/base3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/meta.json b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/meta.json
new file mode 100644
index 0000000000..41ffc95aa5
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/chromium_slime.rsi/meta.json
@@ -0,0 +1,20 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd (Github) for CrystallPunk14",
+ "states": [
+ {
+ "name": "base1"
+ },
+ {
+ "name": "base2"
+ },
+ {
+ "name": "base3"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base1.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base1.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base2.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base2.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base3.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base3.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base4.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base4.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base4.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base4.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base5.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base5.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/base5.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/base5.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/meta.json b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/meta.json
new file mode 100644
index 0000000000..10bdf6ee5e
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/lumishroom.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd (Github) for CrystallPunk14",
+ "states": [
+ {
+ "name": "base1"
+ },
+ {
+ "name": "base2"
+ },
+ {
+ "name": "base3"
+ },
+ {
+ "name": "base4"
+ },
+ {
+ "name": "base5"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/base1.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/base1.png
new file mode 100644
index 0000000000..2cdfca47d3
Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/base1.png differ
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/base2.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/base2.png
new file mode 100644
index 0000000000..7d6f7cc660
Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/base2.png differ
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/meta.json b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/meta.json
new file mode 100644
index 0000000000..bac91552b6
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wheat.rsi/meta.json
@@ -0,0 +1,17 @@
+{
+ "version": 1,
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd for CrystallPunk14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "base1"
+ },
+ {
+ "name": "base2"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/base1.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/base1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/base1.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/base1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/base2.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/base2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/base2.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/base2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/base3.png b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/base3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/base3.png
rename to Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/base3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/meta.json b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/meta.json
new file mode 100644
index 0000000000..b58485d4be
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Specific/Farming/Produce/wild_sage.rsi/meta.json
@@ -0,0 +1,20 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by Prazar for CrystallPunk14",
+ "states": [
+ {
+ "name": "base1"
+ },
+ {
+ "name": "base2"
+ },
+ {
+ "name": "base3"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/icon.png b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/icon.png
new file mode 100644
index 0000000000..055d844c25
Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/icon.png differ
diff --git a/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/inhand-left.png b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/inhand-left.png
new file mode 100644
index 0000000000..875206d787
Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/inhand-right.png
new file mode 100644
index 0000000000..ca649221ec
Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/meta.json b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/meta.json
new file mode 100644
index 0000000000..182b816e44
--- /dev/null
+++ b/Resources/Textures/_CP14/Objects/Tools/hoe.rsi/meta.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd (Github) for CrystallPunk",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/icon.png b/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/icon.png
index bb6349a43f..23e44893b2 100644
Binary files a/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/icon.png and b/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/icon.png differ
diff --git a/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-left.png b/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-left.png
index fee212ccec..3861cdeb29 100644
Binary files a/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-left.png and b/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-right.png
index 765229c5e8..d4470bc904 100644
Binary files a/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-right.png and b/Resources/Textures/_CP14/Objects/Tools/shovel.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT1.png b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT1.png
index 86c60421e5..6757aa75c7 100644
Binary files a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT1.png and b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT1.png differ
diff --git a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT2.png b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT2.png
index 178ddbb2b8..9dbd16530f 100644
Binary files a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT2.png and b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/equipped-BELT2.png differ
diff --git a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/icon.png b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/icon.png
index bb5755a9c6..b0cd3caf63 100644
Binary files a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/icon.png and b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/icon.png differ
diff --git a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-left.png b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-left.png
index cd4df08595..4dae3235b2 100644
Binary files a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-left.png and b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-right.png
index 0e8509ed9a..6fdce06693 100644
Binary files a/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-right.png and b/Resources/Textures/_CP14/Objects/Weapons/Melee/Sickle/sickle.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/meta.json
similarity index 71%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/meta.json
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/meta.json
index 5446984454..6555eb48c1 100644
--- a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/meta.json
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/meta.json
@@ -7,21 +7,6 @@
"license": "All rights reserved for the CrystallPunk14 project only",
"copyright": "Created by TheShuEd (Github) for CrystallPunk14",
"states": [
- {
- "name": "base1"
- },
- {
- "name": "base2"
- },
- {
- "name": "base3"
- },
- {
- "name": "base4"
- },
- {
- "name": "base5"
- },
{
"name": "world1"
},
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world1.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world2.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world3.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world4.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world4.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world4.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world4.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world5.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world5.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world5.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world5.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world6.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world6.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/agaric.rsi/world6.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/agaric.rsi/world6.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass1.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass2.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass3.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass4.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass4.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass4.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass4.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass5.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass5.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/grass5.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/grass5.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/meta.json
similarity index 74%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/meta.json
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/meta.json
index 3d030c7049..71ed5fddb4 100644
--- a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/bloodgrass.rsi/meta.json
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/bloodgrass.rsi/meta.json
@@ -7,21 +7,6 @@
"license": "CC-BY-SA-3.0",
"copyright": "Base Created by TheShuEd (Github) for CrystallPunk14, Grass taken from tgstation at commits https://github.com/tgstation/tgstation/commit/729d858807905263adab8b5a331c1d8a04982dd3, and recolored",
"states": [
- {
- "name": "base1"
- },
- {
- "name": "base2"
- },
- {
- "name": "base3"
- },
- {
- "name": "base4"
- },
- {
- "name": "base5"
- },
{
"name": "grass1"
},
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/meta.json
similarity index 86%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/meta.json
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/meta.json
index 780f3e816b..d23e620f21 100644
--- a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/meta.json
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/meta.json
@@ -7,15 +7,6 @@
"license": "All rights reserved for the CrystallPunk14 project only",
"copyright": "Created by TheShuEd (Github) for CrystallPunk14",
"states": [
- {
- "name": "base1"
- },
- {
- "name": "base2"
- },
- {
- "name": "base3"
- },
{
"name": "world1",
"delays": [
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/world1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/world1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/world1.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/world1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/world2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/world2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/world2.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/world2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/world3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/world3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/chromium_slime.rsi/world3.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/chromium_slime.rsi/world3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/meta.json
similarity index 71%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/meta.json
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/meta.json
index 5446984454..6555eb48c1 100644
--- a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/meta.json
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/meta.json
@@ -7,21 +7,6 @@
"license": "All rights reserved for the CrystallPunk14 project only",
"copyright": "Created by TheShuEd (Github) for CrystallPunk14",
"states": [
- {
- "name": "base1"
- },
- {
- "name": "base2"
- },
- {
- "name": "base3"
- },
- {
- "name": "base4"
- },
- {
- "name": "base5"
- },
{
"name": "world1"
},
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world1.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world2.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world3.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world3.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world4.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world4.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world4.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world4.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world5.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world5.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world5.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world5.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world6.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world6.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/lumishroom.rsi/world6.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/lumishroom.rsi/world6.png
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/death.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/death.png
new file mode 100644
index 0000000000..2fb196993f
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/death.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-1.png
new file mode 100644
index 0000000000..81b4d9e770
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-1.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-2.png
new file mode 100644
index 0000000000..eac53dac60
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-2.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-3.png
new file mode 100644
index 0000000000..fa67f4f3d1
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-3.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-4.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-4.png
new file mode 100644
index 0000000000..e22ecf6121
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-4.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-5.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-5.png
new file mode 100644
index 0000000000..f4571a9beb
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/grow-5.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/meta.json
new file mode 100644
index 0000000000..7190c499e3
--- /dev/null
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wheat.rsi/meta.json
@@ -0,0 +1,29 @@
+{
+ "version": 1,
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd for CrystallPunk14",
+ "size": {
+ "x": 48,
+ "y": 48
+ },
+ "states": [
+ {
+ "name": "grow-1"
+ },
+ {
+ "name": "grow-2"
+ },
+ {
+ "name": "grow-3"
+ },
+ {
+ "name": "grow-4"
+ },
+ {
+ "name": "grow-5"
+ },
+ {
+ "name": "death"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/meta.json
similarity index 74%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/meta.json
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/meta.json
index 0adde5cd86..e91fee36bf 100644
--- a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/meta.json
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/meta.json
@@ -7,15 +7,6 @@
"license": "All rights reserved for the CrystallPunk14 project only",
"copyright": "Created by Prazar for CrystallPunk14",
"states": [
- {
- "name": "base1"
- },
- {
- "name": "base2"
- },
- {
- "name": "base3"
- },
{
"name": "world1"
},
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/world1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/world1.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/world1.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/world1.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/world2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/world2.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/world2.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/world2.png
diff --git a/Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/world3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/world3.png
similarity index 100%
rename from Resources/Textures/_CP14/Objects/Specific/Alchemy/Herbal/wild_sage.rsi/world3.png
rename to Resources/Textures/_CP14/Structures/Specific/Farming/Herbals/wild_sage.rsi/world3.png
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/meta.json
new file mode 100644
index 0000000000..f0b7bbf8fb
--- /dev/null
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by Jaraten(Discord/Github)",
+ "size": {
+ "x": 35,
+ "y": 35
+ },
+ "states": [
+ {
+ "name": "seedbed_default"
+ },
+ {
+ "name": "seedbed_default_east"
+ },
+ {
+ "name": "seedbed_default_west"
+ },
+ {
+ "name": "seedbed_default_north"
+ },
+ {
+ "name": "seedbed_default_south"
+ }
+ ]
+}
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default.png b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default.png
new file mode 100644
index 0000000000..243edc9bdf
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_east.png b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_east.png
new file mode 100644
index 0000000000..55221721a3
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_east.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_north.png b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_north.png
new file mode 100644
index 0000000000..6f46d93b72
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_north.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_south.png b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_south.png
new file mode 100644
index 0000000000..8e44dc87ba
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_south.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_west.png b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_west.png
new file mode 100644
index 0000000000..36691f39f0
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/seedbed.rsi/seedbed_default_west.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-1.png
new file mode 100644
index 0000000000..866669947f
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-1.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-2.png
new file mode 100644
index 0000000000..8ef3440ed8
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-2.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-3.png
new file mode 100644
index 0000000000..c49454b976
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-3.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-4.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-4.png
new file mode 100644
index 0000000000..6d9e10a71e
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/liq-4.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/meta.json
new file mode 100644
index 0000000000..65b48ae5f5
--- /dev/null
+++ b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/meta.json
@@ -0,0 +1,35 @@
+{
+ "version": 1,
+ "license": "All rights reserved for the CrystallPunk14 project only",
+ "copyright": "Created by TheShuEd for CrystallPunk14",
+ "size": {
+ "x": 48,
+ "y": 48
+ },
+ "states": [
+ {
+ "name": "liq-1"
+ },
+ {
+ "name": "liq-2"
+ },
+ {
+ "name": "liq-3"
+ },
+ {
+ "name": "liq-4"
+ },
+ {
+ "name": "soil1"
+ },
+ {
+ "name": "soil2"
+ },
+ {
+ "name": "soil3"
+ },
+ {
+ "name": "soil4"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil1.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil1.png
new file mode 100644
index 0000000000..67eb9b052e
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil1.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil2.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil2.png
new file mode 100644
index 0000000000..735fc692aa
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil2.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil3.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil3.png
new file mode 100644
index 0000000000..c4a342ff3b
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil3.png differ
diff --git a/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil4.png b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil4.png
new file mode 100644
index 0000000000..6e4e368879
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Farming/soil.rsi/soil4.png differ
diff --git a/SpaceStation14.sln.DotSettings b/SpaceStation14.sln.DotSettings
index 800617c0fd..97e1e31b3f 100644
--- a/SpaceStation14.sln.DotSettings
+++ b/SpaceStation14.sln.DotSettings
@@ -55,6 +55,7 @@
AL
BB
CC
+ CP
FTL
GC
GD