Inspiration

The original inspiration comes from childhood memories. The fun of collecting Pogs, while challenging friends to duels where the Pogs you flip, you get to keep. I hope to bring that fun to younger generations that haven't had a chance to experience this game. This update aims to make the world more engaging, with interesting progression systems and better visibility of the Pogs collection.

What it does

The goal of the game is to capture the fun of Pogs while keeping it as simple as possible. Matches are played with 3 random Pogs from each player's inventory. Each player gets a turn to grab a Slammer and try to flip a Pog to keep it. The gameplay loop consists of playing matches, winning Pogs from other players and earning Tokens after each match. Then, using Tokens to purchase Surprise Packs that contain 3 random Pogs to add to their collection, while completing quests, which grant them more rewards to keep them growing their collection.

The world includes an onboarding tutorial, 4 leaderboards (Visits, Matches Played, Pogs Won and Pogs Lost). 12 quest goals, grouped by collecting Pogs, playing matches and winning Pogs from other players. Completing a goal will grant the player a specific number of Surprise Packs. A Pogs collection screen was added for players to inspect their collection, the rarities of the Pogs, and the duplicates they own. It also features a progress bar with a few milestones, giving the player a sense of how many they still have left to collect.

A custom notification system informs players when they earn a reward and shows which Pogs they won or lost at the end of a match. Players are also shown information during matches, to let them know if a Pog they flipped was already theirs or if it belonged to the opponent. The Surprise Pack opening station screen shows when a Pog is not in the player's inventory already. Similarly, the notification showing which Pogs were won or lost after each match also shows when a Pog is not in the inventory already.

How I built it

The persistent variables system was used for leaderboards and quests. It was also used for the Pogs inventory, but more on that later.

The collection screen was an interesting challenge, in particular the progress bar on top, which was built using a sequence of empty View instances placed right next to each other, with marginLeft: -1 style to overlap them so the seams are not visible, and then maintaining a collection of color bindings to control the color transition of the progress bar.

The custom notification system was built using an overlay UI and object pools that reuse bindings to show multiple independent notifications simultaneously. Notifications transition in and out of view using an AnimatedBinding for opacity, and they show text and images.

Challenges I ran into

The biggest challenge was transitioning from the world inventory system to persistent variables to store the Pogs player inventory. The decision was made because the world inventory system was too slow when handling so many unique consumable inventory items (80 Pogs), which was evident when loading the collection screen. Since visitors of the previous version of the world could already have Pogs in their world inventory, a migration process was implemented to store their existing inventory in a persistent variable. Considering the limitations in the size of object persistent variables, an array of numbers was used to store the inventory for players, which is correlated using the array index.

The Pogs flipping mechanic was also an interesting challenge since the collider for custom assets is bigger than the mesh; therefore, the distance between the Slammer and the Pog needs to be checked. Detecting when a Pog is flipped is done by calculating, on an interval, the dot product of the forward vector of the Pog and the Y axis.

Reusing Pog entities with an object pool was also a challenge since Pogs would occasionally jump and fly hundreds of meters when moved into their starting positions in the arena. This was addressed by disabling the physics for the Pogs with physicalEntity.simulated.set(false) when returning them to the object pool.

Loading the face textures on the Pog entities was also interesting. Importing a plane custom asset with the correct material setup, so that textures with transparency can be dynamically loaded on it. The plane and the rest of the geometry of the Pog were combined into an asset template to represent the Pog.

Accomplishments that I'm proud of

I am particularly proud of the custom notification system. It supports both VR and mobile clients. It is capable of up to 5 simultaneous independent notifications on screen. And can show different notifications to different players at the same time while using a single Overlay UI Gizmo instance.

What I learned

I learned there's a limit to the world inventory system, so from now on, I'll consider persistent variables when designing large inventory systems. I also learned clever ways to make the most of the UI system, such as the implementation of the progress bar in the collection screen and the custom notifications in an Overlay UI.

What's next for Pogs

There's a lot of room for improvement in the visuals department. The new generative AI tools for environments are promising, so I plan to experiment with them to enrich the world visually.

I am also thinking about a system that allows 2 players to agree beforehand which pogs they want to risk in a match. This would bring the world closer to the original game, but I would like players to have the choice of keeping it simple if they prefer. Other modes, such as starting with pogs stacked on top of each other, could be added too.

Another idea is to display the names of the contestants on top of the arena, which will increase anticipation for players while waiting in the lobby and make it more interesting for spectators.

I am planning to keep growing the Pogs collection with added quests over time, including seasonal events and Pogs. And to improve the Surprise Pack purchase UI to allow entering the number of Packs to purchase at once.

Additionally, I am thinking about implementing a custom mechanic to throw the Slammer on mobile devices with more accuracy. As well as collectable cosmetic Slammers for players to purchase with Meta credits or earn with seasonal quests.

Built With

Share this project:

Updates