Seasonal Harvest


Dev time: 5 Months

Team: 2 Artist & 1 Developer (me!)

Summary


Step into the enchanting world of Seasonal Harvest, where you'll cultivate crops, navigate ever-changing seasons, and defend your fields against relentless enemies. As a player, you'll strategize your planting choices, harness the power of nature's transitions, and protect your harvest at all costs. With each season's unique challenges and visual transformations, you'll find yourself immersed in a dynamic, strategic, and visually stunning farming simulation.

My role as the developer behind Seasonal Harvest was bringing the vision of a living, breathing seasonal world to life. I did this by designing and implementing every system found in the game such as the cooking, farming and my main focus on the seasonal changes in the world.

Filters

What I did


The goal

I developed a dynamic Seasons and Weather System designed to immerse players in a captivating virtual world. This system seamlessly integrates changing weather patterns and the four seasons, enhancing the realism and player experience. The system is setup so you have full control over the system's customization. Tailoring the weather parameters to match an artistic vision and gameplay requirements is as easy as changing the profiles.

How it works

The Seasons and Weather System is a technically advanced framework. It uses a time value from 0 to 1 to drive dynamic changes based on the active Season Profile. With customizable parameters for each season, such as weather, colors, and lighting, the system creates seamless transitions between day and night, rain and snowfall, and various environmental effects. Artists and designers can easily modify the Season Profiles to fit the game's vision and achieve the desired atmosphere, making it an invaluable tool for immersive and captivating game worlds.

Project Image

The manager

The Seasons and Weather Manager is not only powerful but also user-friendly. Me or a designer can easily adjust variables to test various scenarios and create different gameplay experiences. This flexibility allows for efficient testing and iteration, ensuring the perfect balance of weather conditions and seasonal transitions in the game.
Moreover, the system's visual changes are predominantly driven by the season data profiles. These profiles can be easily customized, giving developers/designers full control over the visual aesthetics of each season. From the vibrant blossoms of spring to the snow-covered landscapes of winter, the season data profiles shape the captivating beauty of the virtual world.
With this seamless integration of customizable variables and season data profiles, the Seasons and Weather Manager made it easy to change and finalize a truly immersive and ever-changing environment that captivates players throughout their farming journey.

Project Image

Season Profile's

The Season Profiles in our game provide a comprehensive set of customizable data to enrich the dynamic Seasons and Weather System. Each Season Profile is a ScriptableObject that empowers an easy way to define distinct environmental characteristics for different seasons. Let's explore the components of a Season Profile:

Degree Settings:
Define the minimum and maximum day and night degrees for the season. Set the duration of the season in terms of the number of in-game days.

Rain Settings:
Adjust the rain chance, specifying the probability of rain during the season. Control the minimum and maximum duration of rain and cooldown time between rain occurrences.

Sun Settings:
Utilize gradients to define the colors of the sun and moon for visual transitions during the season. Apply animation curves to regulate the intensity of the sunlight and the moonlight.

Ambient Lighting:
Fine-tune the gradients for sky, equator, and ground colors, adding depth to the environment's ambient lighting.

Skybox Color:
Customize gradients for the top and bottom skybox colors, creating realistic visual changes during the season. Implement distinct gradients for skybox colors during rainfall, heightening the immersive experience.

Shadows:
Employ animation curves to control shadow settings for the sun and moon, impacting the scene's lighting and atmosphere. Use animation curves to regulate fog visibility for diverse atmospheric effects.

Cloud Color:
Define gradients for normal and rain cloud Colors, ensuring dynamic cloud appearances during the season. Adjust gradients for fog colors during rainfall, further enhancing visual realism.

Colors:
Create lists of GrassColor, LeavesColor, and BosjesColor(bushes), each holding gradients for normal and rain colors.

Empower developers to modify vegetation colors based on seasons, adding a touch of realism to the game world.

The Season Profiles offer a treasure trove of possibilities, enabling an easy way to craft distinct and immersive environments for each season. By seamlessly integrating these profiles into the Seasons and Weather System, the game world comes alive with dynamic weather changes, seasonal aesthetics, and a truly captivating player experience.

Project Image

Profile code

The C# code for the SeasonData script is designed with clear header sections, concise summary tags, and compact readability. It utilizes serialized fields for easy modification in the Unity Editor. Public getters and private setters ensure controlled data access, and the use of IReadOnlyList enhances data encapsulation. This setup enables the main manager to quickly understand and customize the script for a seamless game development process.

Link to part of the code

Project Image

Changes in action

The GIF showcases the dynamic Seasons and Weather System in action. Experience captivating sky color changes and delightful transformations of trees and grass. Please note that the colors featured in the demonstration are currently set for testing purposes. However, rest assured that game designers and artists can easily customize and tweak the colors to their artistic vision and desired atmosphere. The system provides the flexibility to create immersive scenes for different times of the day.

Link to part of the code

Project Image

Snow

During development, I initially attempted custom terrain shaders using Shader Graph in URP. However, due to limitations with samplers, I couldn't achieve the desired complexity. So, I opted for a commercial asset, skillfully interwoven into the Seasonal Manager, to track snowfall and attain the desired seasonal terrain changes. This blend of custom and commercial solutions resulted in a dynamic and visually immersive environment filled with snow, adaptable to changing weather and seasons.

A morning view

Here you can see a more polished morning version with my system in action!

Project Image

An evening view

Here you can see a more polished evening version with my system in action!

Project Image

The goal

A Farming System for an immersive agricultural experience in the game. Easily integrate new items and features, ensuring adaptability to diverse gameplay requirements. Modify terrain grass for clear visibility of plant growth areas. Cultivate various crops with adjustable parameters for watering, growth, and harvesting. Responds to changing seasons, adding realism and joy to farming.

How it works

I developed a flexible and immersive Farming System, seamlessly integrated with the Seasons and Weather System. It allows for easy addition of new seeds, growth states, and crop variations. The inventory system is also connected to the farming manager, when you select a tool the correct functions get triggered. Players experience realistic crop growth based on seasonal preferences, water, and fertilizer requirements. The system offers a rewarding progression, unlocking higher tiers of produce through attentive farming practices. The combination of these features creates an engaging and captivating agricultural experience for players.

Project Image

Items

The versatile ItemBase system is a powerful class that made it easier for me to create diverse and interactive game worlds full of items. With the ItemBase, you can define various item types like seeds, tools, weapons, and food, each with distinct attributes and interactions. Assign unique IDs, descriptive names, and detailed descriptions to enrich the player's experience.

For seeds, customize growth-related data, including plant prefabs and assigned seasons. The system manages the pricing of the items for the shops, allowing items to get new random values daily. You can mark items as cooking ingredients and categorize them for strict or type-based recipes.

Adding new items is a breeze with the "Add Item to List" button, and duplicates can be easily avoided using the "Check for Duplicate IDs" button. The functionality made it easy to add and keep track of the items.

Link to part of the code

Project Image

Plant script

In the game, the Plant Growth Scripts play a vital role in the life cycle of each plant. As the players places plants into the world, these scripts take charge, meticulously tracking the plant's data and managing its growth stages. The passage of time is a key factor here, but it's not just about time alone – the state of water and fertilizer significantly influences the growth rate.

As the player nurtures the plants with care, providing them with sufficient hydration and nourishment, they respond by growing faster and stronger. And that's not all – these scripts are also connected to our mana gain system, meaning that the way the player cultivate their plants can have profound effects on the game world around them.

With the Plant Growth Scripts at the helm, the player's gaming experience becomes an intricate dance between cultivation and consequence. The decisions the players make about each plant directly impact the world around them, making every moment in the game a truly immersive and rewarding adventure.

Link to part of the code

Project Image

Plant config

In the game, Crop Objects serve as the foundation for simulating crop growth and lifecycle. These objects hold crucial data that directly impacts crop flourishing.

Crop Object stats include:
Max Water:
The maximum water capacity a crop can hold.

Water Level:
The current water level affecting crop growth.

Water Consumption Rate:
Rate at which crops consume water over time.

Water Threshold:
Minimum water level required for crop survival and growth.

Mest Value:
Current fertilizer amount applied to the crop.

Max Mest:
Maximum fertilizer capacity for the crop.

Max Multiplier (Growth):
Highest growth multiplier achieved with optimal fertilizer.

Mest Consumption:
Rate at which the crop consumes fertilizer.

Current Growth Stage:
Tracks the crop's current growth stage.

Current Growth Time:
Calculated growth time based on water and fertilizer values.

Actual Growth Time:
Total time the crop spent in the world (in seconds).

These variables determine the crop tier, reflecting player efforts in nurturing and managing crops.

Link to part of the code

Project Image

Item type detection

The "Farming Mechanics - Input and Interaction Script" is a key component of a farming simulation game. It handles player input, manages active item types, and enables interactions within the game world.

The script registers events for player interactions, such as planting seeds, harvesting crops, and refilling watering tools. It also tracks the selected item type and updates the interaction area based on the selected item.

When the player selects an item, the script enables a grid and updates the interaction area to provide visual cues. The interaction area differs based on the active item, such as showing plantable ground for seeds or targetable plants for watering and fertilizing.

Link to part of the code

The goal

The Inventory System was developed to provide players with an intuitive and visually appealing way to manage items, tools, and resources in a farming simulation game. It features a unique quick select wheel for swift item switching, dynamic UI for easy interaction, and seamless inventory management.

How it works

The Inventory System streamlines item management in our farming game. Players access their inventory, where items are displayed in slots. The Quick Select Wheel allows swift item switching via a radial menu. While selected items reveal details for equipping or consuming. The system's organization and clear icons aid quick decisions. With support for keyboard and gamepad controls, it offers a seamless and engaging inventory experience. It also works fully with the itembase class described in the tab Farming/Items/Crops.

Project Image

The manager

The Inventory Manager operates on an Object-Oriented Programming (OOP) principle, where player input and specific events dictate's the behavior. This essential system enables efficient item queries and interactions. It ensures that players can effortlessly determine item availability and engage with the game's mechanics in a responsive manner.

In addition to its backend functionality, the Inventory Manager significantly enhances the user interface. The Quick Select Wheel redefines item selection by offering players an intuitive and rapid means to switch between tools and seeds. This integration establishes a tactile connection between players and the in-game inventory, enriching their immersion and overall gameplay experience.

If you would like to see the code, feel free to reach out. Next link(in the next tab) shows a little bit. I want to improve the system first, since I believe it can be more performant and clean.

Project Image

The checks

Item Availability and Management:
The Inventory script offers essential checks for item availability and management within the game. Through the GameManager interface, other scripts can conveniently access these checks to ensure smooth gameplay mechanics.

Checking Item Availability:
The CheckIfPlayerHasItem(int slotid, ulong id, int amount = 1) method empowers other scripts to verify whether the player possesses a specific item, considering the slot ID, item ID, and desired quantity.

Removing Items:
For item removal, scripts can rely on RemoveItemFromPlayer(int slotId, ulong itemId, int amount = 1). This function returns a boolean indicating successful removal, guiding subsequent actions.

Checking Remaining Quantity:
With the CheckHowMuchWouldBeLeft(int slotId, ulong itemId, int amount = 1) method, scripts can determine the remaining quantity of an item after potential removal.

Seamless Integration via GameManager:
The Inventory script is accessible through the GameManager, allowing scripts to seamlessly interact with the player's inventory. This integration streamlines gameplay mechanics, enhancing the overall player experience.

In summary, the Inventory script's checks, coupled with its accessibility via the GameManager, form a vital component of the game's mechanics, promoting efficient item management and dynamic interactions.

Link to part of the code

Project Image

UI Intergration

Integration with UI:

The Inventory script seamlessly integrates with the game's UI to provide players with a visually intuitive and interactive inventory management experience. The script interacts with various UI elements to ensure a cohesive and engaging gameplay flow.

Key aspects of this integration include:

Dynamic Slot Display:
The script dynamically populates UI slots with the player's inventory items, reflecting their current quantity, tier, and associated visuals. This allows players to quickly assess their available items at a glance.

Quick Select Wheel:
The Inventory script interfaces with a quick-select wheel UI, enabling players to swiftly switch between equipped tools and items. As players rotate the wheel, the script detects their selection and updates the UI accordingly, enhancing accessibility and ease of use.

Item Information Panel:
When players interact with an inventory item, the script activates an information panel within the UI. This panel provides detailed information about the selected item, for example, its name, description, and associated effects. This feature aids players in making informed decisions about item usage.

Responsive UI Scaling:
The Inventory script ensures that the UI scales appropriately across different devices and screen sizes. This responsiveness guarantees that players have a consistent and visually appealing inventory interface, regardless of the platform they are playing on.

The goal

The cooking system aims to be a fun and interactive experience where players can combine ingredients to discover new recipes. As they progress, successful recipes will be added to their collection, motivating them to explore and unlock the full potential of their culinary skills. It's a journey of creativity and discovery, offering a unique and enjoyable gameplay for players of all levels.

How it works

In "Seasonal Harvest" the player collects food ingredients and places them in a cooking pot. With at least five ingredients they are able to cook. The system checks if there's a strict recipe, where all items match exactly the same items as the recipe needs. If not, the system checks if the types (e.g., vegetables, meat) match any recipe. Players receive the cooked dish accordingly. Successful cooking may unlock new recipes for their collection, promoting culinary exploration and experimentation.

Project Image

Recipe

The Recipe class is an abstract class that represents a recipe in the game. It has fields for the recipe's name, sprite, and the resulting item when crafted. The class declares an abstract method, CanCraftRecipe, which must be implemented in concrete recipe subclasses. This method checks if the provided list of ingredients is sufficient to craft the recipe.

Project Image

Strict Recipe

RecipeStrict is a subclass of the abstract Recipe class. It represents a strict recipe that requires specific ingredients in a particular order and quantity. The class contains a list of ItemBase objects named recipeItems, representing the required ingredients.

The CanCraftRecipe method checks if a given list of items can craft this strict recipe. It ensures that the count of items in the provided list match the required recipeItems. If the conditions are met, it returns true; otherwise, it returns false.

Link to part of the code

Project Image

By type Recipe

RecipeType works the same as the strict recipes. However, instead of assigning cooking ingredients, it checks them by type.

Link to part of the code

Project Image

Checking Recipes

The system first checks for exact matches called "strict recipes." If found, it crafts the dish accordingly. If not, it evaluates "type recipes" that require specific ingredient types. It can even combine multiple type recipes to create a meal. If no matches are found, the cooking attempt fails. This encourages experimentation, unlocking new recipes and creating delightful dishes.

Link to part of the code

Project Image

Cooking UI

The showcased GIF demonstrates our cooking system in action, complete with a user-friendly UI that dynamically scales with the device. The system allows players to experiment with ingredient combinations to discover new recipes.

As seen in the GIF, the UI displays a cooking pot where players can drag and drop up to five food items. Once the required number of ingredients is added, the button becomes clickable, and initiates the cooking process. The UI smoothly transitions and updates to reflect the current state of the cooking.

The animation effects are achieved using the LeanTween library, a powerful C# tweening engine. With LeanTween, we can create seamless and engaging animations, adding polish to the cooking experience.