Inspiration

This project is building upon my world "Cardboard Farm" from the previous GameJam.

Having read the recent article from Meta on discoverability within Horizon Worlds, it was clear that, algorithmically, the main issue in my world was that people weren't sticking around long enough.

After watching some of the videos in the Horizon documentation, it was a comment from one of Laex05's video's, about how players want to AFFECT the world, that stuck with me. In my previous iteration of the world, crops and NPCs were in static locations, and players were just asked to run from point to point.

So my goal here was to burn it ALL down, to the point a player enters a complete blank canvas, and gets to rebuild the world as they like, while also providing them a nice feeling of progression and accomplishment as they advance.

The best, most shareable progression! By combining an engaging progression system, that is also visually diverse and striking, I hope to both increase long term engagement with the world AND provide content worthwhile for sharing with friends, to hopefully increase that K-factor!

What it does

Upon joining the world, a player is assigned one of the 8 Farms.

Progression is personal to the player, and their farm will be brought with them each time they re-join the world.

Plots and Crops: The farm is made up of several plots, which can be unlocked for gold as the player progresses. The player also unlock a greater variety of seeds as they level up, which all have subtle differences in how the player interacts with them. Some can be harvested multiple times, some require watering, some have large cooldowns between planting. This all leads in to providing a more varied experience, and exciting looking farm, the more the player plays. Meanwhile the increasing plot costs provide a constant goal to work towards, and the future horizon point of unlocking the whole farm should take a considerable time to reach.

Decorations The farm has several "Customisation points", unlocking as the player levels up. Each of these has a number of options for their "category", such as "fence" / "pet" / "gate", giving a nice range of expression for players to show off to their friends.

How we built it

The world was built entirely in the Horizons Desktop Editor, however the world itself is far more simplistic in this incarnation, largely made up of a single large Template at 8 different rotations.

The logic for loading in seeds / decorations / screens is all handled programmatically by typescript.

The art pipeline involves sprites generated by ChatGPT, worked into large sprite sheets in photoshop, fed through Blender to cut-out/extrude/UV to produce FBXs, and finally imported to Horizon as unlit meshes.

Challenges we ran into

Memory limits on player variables Only AFTER releasing and having player play for several house, did I realise there is a~10kb limit on a player variable. Due to having players with many hours invested, I ended up splitting the data into a variable per plot, and including a migration step in my OnPlayerEnterWorld function. This is certainly something I would like to have done differently had I known I'd hit this issue from the start.

Players not getting assigned a HUD from Asset Pool My biggest issue in both versions of this world, has been that as soon as I am playing outside of the editor with multiple people connected, I sometimes find players joining the world and not being granted any HUD.

I've since moved away from using the AssetPool gizmo, to my own SpawnController setup with multiple layers of error checking/retries. Since this change I haven't seen the issue again myself, so am cautiously optimistic, but with the inability to test/reproduce the issue locally it's very hard to be confident.

Hitching in UI on mobile/desktop, but not VR Both in editor and on mobile I find that sometimes there will be what feels like hitching in the UI system. This also affects the system controls, such as bringing up the leave button, however I can still see movement in the 3D world unhindered while waiting for these screens to appear. However it is most noticeable on my seed menu, where the controls would ideally feel snappy and responsive.

Lack of Logs? Having had people run up to me in game and mention their potatoes vanished, or their HUD hasn't spawned in, I always try to check out my in-world debug gizmo, only to be shown only the logging since my client connected (and not even the logging WHILE I was connecting, which is where anything juicy concerning my own player would be). Given that I also can't easily test multiple players or save-states in-editor, it makes it sometimes feel like a bit of a black box, and I have to take a bit of a scatter-shot approach and patching up anything that could POSSIBLY contribute to a vanishing spud.

Accomplishments that we're proud of

Automated art pipeline I stuck with my art pipeline from Cardboard Farm, however the biggest time sink in the previous Jam was time spent drawing vertexes around sprites, and then UVing cardboard around the extruded edges! With the shorter time frame for this Jam, I was keen to avoid such a sink. Luckily after some noodling with ChatGPT, we came up with a script that automates the process entirely. I am able to simply build a sprite-sheet, pass it through blender, and have a folder full of FBX files from a single button click. The majority of time THEN became the import and management of these assets within the Horizon Desktop Editor.

Some kind of editor scripting and/or AssetDatabase library would potentially make this step much less cumbersome, if I could do more of this programmatically. (This is generally how I would handle this step in engines such as Godot or UE5)

Increased use of pooling Something I didn't really pay attention too previously was the world capacity limits. However when I was first considering not only letting players manage the farm, but having multiple of these in the world at once, I realised a lot of my old processes would not scale well. I therefore moved as much as the game to be lazily loaded as required programmatically and asynchronously. The single biggest gain I got in this vector was when I learnt that the SpawnController returns a promise!! (I'd previously been relying on the spawned entity's Start function to register itself back with the spawner) By using this promise, I was suddenly able to spawn (and hold references to) my decoration meshes, without having to make a TemplateDefinition just to add a self-registering script! (Very exciting)

What we learned

Plan your Player variables for when you later want to scale the amount of data UP

SpawnController returns a promise, and it makes everything easier

Some people REALLY like farming

What's next for Farming

Orbs While keeping gold and XP flowing constantly is important for keeping the game engaging, I want to add a third, harder-to-get currency, that can be required for only the fanciest / most elaborate decorations / plots. This currency, orbs, will only be available from crops that require extra steps to plant, such as:

Rare Seeds In order to increase the impact of playing with other users alongside your farm, I am keen to add in-world events fairly regularly (+15 minutes) that encourage all players to congregate in the centre of the map to compete for rare seeds. My first version of this will probably be some kind of Jumping Puzzle / Obby where players can race up the various routes to grab as many rare seeds as they can before they're all gone. Rare seeds can then be planted back in your farm to produce a few orbs.

Day-of-the-week Crops I have the framework ready, but haven't yet made the crops, but I hope to introduce some seeds that can only be planted on specific days, but will then last for several days. For example, you might plant an "Orb Bush" on Friday, and it's then harvestable once a day for the next 6 days. With a few of these spread across the week, it will provide a nice meta layer of management for players looking to optimise their orb production.

I also hope this will give me some interesting content to publish events around, as "Come plant your Friday crops!" is hopefully a bit more enticing for existing players than just "Hey, why not come do some more farming again" !

Built With

Share this project:

Updates