Show HN: Mochia, a virtual pet browser game, built with Rust, SolidJS, Postgres

mochia.net

21 points by lemphi 2 days ago

Around three years ago, I was reminiscing about how much I loved playing Neopets as a kid. Meanwhile, I was also looking for a project to better learn Rust and SolidJS. So.. I figured making my own virtual pet browser game would be a fun way to practice! Since then, I’ve been working on it nearly every day, and.. it’s grown quite a bit! Here are some bulleted lists for your convenience:

Technical Details:

  * Backend monolithic Rust server runs on a single $5/month VPS

  * Lean frontend with just 3 dependencies (SolidJS, Solid Router, and Mutative)

  * Around 130,000 combined lines of code (frontend + backend)

  * Rust server uses axum, sqlx, tokio, rand, strum, tungstenite (websockets)

  * No server crashes or data loss in 3 years (thank you Rust + Postgres!)

  * Almost all graphics (500+ assets) are SVGs for perfect detail at every zoom level

  * Fully mobile responsive and playable on all modern browsers and devices

  * Actor model for player actions enables trivial parallel, multi-core scaling

  * Single page application that preloads entire game world on initial page load

  * Instantaneous navigation between pages (no additional page fetches required)

  * Lightweight game engine for minigames, powered by custom WebGL shaders

  * Rust is the single source of truth for data structures shared between browser and server

  * Custom derive macros used to autogenerate TypeScript bindings and binary decoding functions

  * Binary WebSocket messages with custom protocol for client-server communication

  * O(1) selection for nested, weighted-random item reward pools

  * Minigames can be played without an account (but rewards can't be saved)

Features:

  * Completely free to play with no ads or tracking

  * Multiplayer browser-based virtual world with 80+ locations to explore

  * Dark mode toggle switch

  * Simple minigames that smoothly run at your display's refresh rate

  * Public leaderboards that track the top scores in each minigame

  * Pet training system with turn-based card-based battle arena

  * Dynamic player economy with player-run shops

  * Player guilds that members can level up to unlock perks

  * Abandoned mines area created by maze generation algorithm

  * Create / adopt pets, adorn them with hats, give them pets, change their color, etc.

  * 220 items to collect (food, toys, cosmetics, books, charms, tiny creatures, etc.)

  * In-game currency with banking, auctions, stock market, and jobs system

  * Villagers you can talk to, befriend, and complete quests and jobs for

  * Optional push notifications (like for when you win an auction)

  * 38 achievement avatars to unlock

  * Social features: befriend others, send gifts, and share your recent activity

  * NPC shops that restock over time (sometimes with very rare items!)

  * Luck system with ways to boost your luck for better rewards

  * Many puzzles that grant items or MP (currency) when solved

  * Fishing, gardening, caves, random events, fountains, galleries, etc.

  * Wheels to spin, treasure maps to complete, and secrets to explore!

  * Much, much more but I don't want to spoil everything!

Links:

  * Website URL: https://mochia.net

  * Community Discord: https://discord.gg/ub6z8YH866

  * Gameplay Video: https://www.youtube.com/watch?v=CC6beIxLq8Q

  * Screenshots Album: https://imgur.com/a/FC9f9u3

I'd love to answer any questions, hear any thoughts, or read any sort of feedback or criticism!
npinsker 2 days ago

I played Neopets a long time ago. It meant a lot of different things to a lot of people, and -- while you're obviously not 100% there yet -- it's incredibly impressive to have done such a large piece of it on your own.

That said, I always saw the "core fantasy" of the experience as developing a relationship with your pet(s). I liked having to feed my pet, and read books to it, and then it would talk to me back. Playing games and going on adventures were framed as being done "with" your pet. The pets were well-drawn and cute, and the higher-level cosmetic items were expensive but very desirable.

From your page, I wasn't sold on that fantasy, or any fantasy in particular. If you look at the popular pet-care games nowadays, they have a fraction of the features you do while still (clearly) striking a chord with a huge number of people. Maybe part of it is because they focus on that relationship more? Especially in today's world -- but even back in 2000 -- I think features like games, items, stats, etc. need to tie in to some sort of greater fantasy in order to catch interest.

You don't have to care about any of this though, especially since you're making it for yourself. It looks fun and the tech stack seems awesome.

Is it actually possible to play minigames without creating an account? I couldn't figure out how.

meatball-farmer 20 hours ago

Do you have plans to share more detail on or open source the Rust-to-TypeScript derive macros and protocol they target? Have you run into any limitations with it?

  • lemphi 2 hours ago

    Yeah so these were the first derive macros I've ever written, and they're quite ad-hoc to say the least, with very few types / expression syntaxes being supported currently. Also, I'm not sure how useful others would find them as they're all meant to work in tandem for my exact use case where I wanted a very specific output that also generated const enums and verbose interface definitions that worked with my code generation for generating binary decoding functions for each type.

    I'm not necessarily against open sourcing them, but I'd probably want to significantly polish / rewrite them first and write a lot of documentation, and probably only if there was significant demand. In the meantime I think there's a decent number of crates for generating Typescript bindings for Rust types that have much better support (like ts-rs and typeshare)

yungporko a day ago

what are your thoughts on solidJS? seems like they're going for "react but not shit", think they pulled it off?

  • lemphi a day ago

    I think it's really great and highly recommend it! Its mental model seems a lot simpler to me, and the runtime performance and bundle size is top-tier as well.

kwere 2 days ago

how much game data do you store on postgres ? do you use classical update cycles ?

  • lemphi 2 days ago

    Basically the bare minimum amount of data is stored in Postgres. Many of the locations are stateless, or it's okay if they are wiped on server restart (like NPC shop inventories, since they can just be regenerated on server startup, so they only exist in server memory). And most of the game world is just included in the large static bundle (item names and descriptions, dialogue, etc.).

    The main data stored in Postgres are things that must be durable, like your items, currency, unlocked avatars, friends list, gallery, garden, guilds, friendship levels with villagers, profile information, personal shops, and things like that. But even in these cases integer identifiers are used (for things like item IDs and avatar IDs), so the tables remain very lean.

    What do you mean by classical update style? I'm not sure if you're still referring to Postgres or if you're talking about the minigames (like does the update loop run at a fixed internal?), or maybe something else entirely?