Show HN: 90s.dev – Game maker that runs on the web
114 comments
·May 20, 202590s_dev
9dev
Absolutely not too soon! This is a great project; it's so amazingly, ridiculously overengineered, in the best way possible! The most beautiful bike shed I have ever seen. You even implemented your own reactivity system.
I love it.
90s_dev
Ha, thanks! Yeah the reactivity system was born out of trying to get stuff done quickly. I was tired of manually setting variables so I made it easy to "chain" and "adapt" them and stuff. Same thing with the (hacky?) auto-layout system. Shortcuts to get stuff done quick!
Yiin
it's the best, I reused vue reactivity for gta multiplayer server to track player state changes and write reactive functionality around those changes and people called me crazy for using frontend tech in backend :c
electroly
It's just right for a Show HN. I was able to find the Hello World tour and grasp what's going on here, from previous PICO-8 and React experience. Looks pretty cool, and I think 16:9 is a good pick. PICO-8 being square is awkward.
90s_dev
Thank you to you and the other replies. You're very encouraging. I'll keep iterating, making it more usable and its usage more clear. Maybe I can at least finish at least a few tasks while it's on HN's front page(!!!) based on everyone's feedback. Going to work on finishing the paint app right now, hopefully done within an hour.
dapperdrake
Thank you for launching early.
Definitely launch often.
10,000 iterations. One down. 9,999 more to go.
90s_dev
Thanks! That's an encouraging way to look at it, as it allows me to ship something that's not 100% perfect yet. But I guess no matter how hard we try, it never really is, is it?
johnisgood
Usually it never really is perfect, unless it does its job 100% without any bugs (which we may not be able to tell, but it is possible). I have projects that are completely finished, so I think. :D
worthless-trash
No sir, you didnt launch too soon. You're doing great.
90s_dev
Thanks! And you are not worthless trash, just in case your username was serious.
ojo-rojo
>One day this February, I just got up at 2am and started writing code. I was tired of waiting. So I wrote and wrote and wrote.
That's cool. It makes me feel happy reading this, kind of inspiring :)
>I found myself making an API for making game maker tools and a game engine and a game. It turns out I’m an API designer at heart. I guess I always kinda knew this.
I like hearing when someone finds their passion and goes for it full throttle.
90s_dev
Thanks.
I failed to capture the essenence of what my project is. The APIs are really what's exciting. But you can't see APIs, they're like the wind, you have to see them in action, through their side effects. I should have waited until I had made more things that show off how innovative these APIs are. I released it too soon.
Bjartr
A rule of thumb is that if you're not embarrassed, you released too late. Human tendency is to want to dot every i and cross every t, but too often that leads to never releasing. I appreciate that you released when you did. It's looks great!
ridruejo
Nope. Sooner is better than the alternative in nearly every case! Also take HN feedback with a grain of salt …
winslow
Does the paint app work for anyone? https://90s.dev/os/#sys/apps/paint.app.js
I tried in both Firefox and Chrome on Linux and picking colors and clicking I can't draw anything. No logs in the console that alert something is wrong.
On a different note I think you've captured the 90s really well. I had a moment of realization that the 90s really were like this. On first look I was thinking this was more 70s/80s terminals. Looking forward to seeing where you take this.
90s_dev
Oh, no, sorry for the confusion. The color picker is as far as I got with that app, it's relatively new. I can probably get it fully working within an hour though.
Also thanks, that's exactly what I was going for! I wanted to capture the fun and excitement and raw power of creating GUI apps in the 90s (but without all the inconveniences). Hence the name 90s.dev
90s_dev
Working on paint app[1] now:
- [x] Add canvas with semi-transparent background
- [x] Make canvas resizable by dragging corner (min 1x1)
- [x] Show grid on canvas if grid button is checked
- [x] Make zoom adjustable by clicking and dragging zoom number up/down
- [x] Show selected color as square over canvas during mouse move
- [x] Allow click/drag to change square colors
- [x] Right-click/drag to erase squares
- [x] Support loading/saving bitmap
Hopefully I can finish it while this comment is editable! :D
As features are added, you will see them in the source code. Either:
1. Click the top-left button and click View Source
2. Download helloworld.zip from Downoad SDK and view /fs/sys/apps/paint.app.js
3. Open https://90s.dev/os/fs/sys/apps/paint.app.js in an incognito window
These all show the same live copy of the source for the paint app. The reason for the incognito window is because the service worker compiles TSX to JS at runtime.
[1] https://90s.dev/os/#sys/apps/paint.app.js
[edit] Ha, I did it! I got all the features working before the edit button went away! But it was about 2 hours, not 1. As a bonus I'll try to work on undo/redo.
sureglymop
Hey don't stress yourself out okay :) This is so cool, cooler than 90% of stuff I see usually see in these posts.
electroly
I'm not sure it's implemented yet. If you click the "hash" button in the upper-left of the window, you can click "View Source". From there you can see it's just a mocked up UI, the scroll area just draws pinstripes.
90s_dev
You were right, it wasn't at the time. It works now, except for undo/redo.
duxup
I can't say I fully understand what this is / the capabilities, but man I love the aesthetic.
It's interesting how an aesthetic can make an emotional impact and draw a lot more interest.
90s_dev
I think I figured out how to explain it:
I basically wanted to make a much more usable pico8 for game prototyping. Hence the 320x180 design, and this prototype: https://90s.dev/v1/ But I also wanted the full convenience of VS Code, including full type checking and autocompletion support for TypeScript. So I designed it to be a platform that can be used to make and publish the things that pico8's tabs contain.
Now I see that I released this much too soon.
fidotron
I like the aesthetic, but 16:9 and 90s computing together is just wrong.
The back breaking not quite square trinitron monsters were the best.
90s_dev
I chose 320 x 180 because of Animal Well. In fact, the whole app was originally conceived as a way for me to make an Animal Well style game, but more conveniently than using Pico8 (Billy Basso implied once that he used Pico8 to prototype Animal Well before moving to C++). I still think 320 x 180 is the right size for both games and game makers.
For example, here's a very early (mostly broken) prototype of 90s.dev
Because of 320x180, it can fit the code editor and the mapmaker or spritemaker on the screen at once, and each tab is big enough to be usable.
90s_dev
Thanks!
Explaining stuff is so hard! In fact, this entire article is just me trying to explain what this is in the shortest way possible.
Maybe the shortest version is: 90s.dev is an API around a 320x180 web canvas, designed specifically for making games and game maker tools, with sharing capabilities built-in, and an innovative GUI for making game maker tools quickly and easily.
No, that's still too vague. I give up.
dr_kiszonka
I would put your text under "Welcome to 90s.dev." If possible, I would further simplify it. I took a stab at it below but I am no marketer (or a game maker),
90s.dev simplifies making games and tooling for game creators via:
- an expressive API around a 320×180 web canvas,
- built-in sharing capabilities,
- an innovative GUI.
Each bullet would link to a relevant part of the documentation. I think you also need a page with examples.
90s_dev
Thanks, I'll definitely consider using that in the next launch.
stevage
Keep going, you'll get there. Yeah, explaining is hard.
As someone who is not involved in game development I admit I didn't really understand your description about it being an API but not a game engine. But keep going, you're doing a great thing here.
dflock
Show examples of things built with it?
90s_dev
So far, only the built-in apps are made with it.
You can click them on the desktop-thing when you open the app.
So far the only finished app is fontmaker: https://90s.dev/os/#sys/apps/fontmaker.app.js
Their source code for all built-in apps are in https://90s.dev/os/helloworld.zip (found on https://90s.dev/getting-started/download-sdk.html)
johnisgood
Is 320x180 generally enough for anything interesting?
90s_dev
Animal Well uses 320 x 180
https://en.wikipedia.org/wiki/Animal_Well
(In fact I partly made this app so I could make an Animal Well clone.)
danielvaughn
It really is. It’s almost harder than building the thing. Every time I try explaining my side project, I end up just saying “you know…it’s easier if I just show you”
90s_dev
Yep, that's why I decided to make the pages able to have interactive demos. Though only the hello world tour and the refs guide use it so far.
null
pizzuh
I didn't dig into this deeply, but I miss this aesthetic more than I'd like to admit. I'm sure it reflects on simpler times, but there's some comfort in seeing projects like this for me.
nico
Looks very cool, just kinda hard getting started
Maybe you could have a little walkthrough of how to build a mini game with it?
90s_dev
Thanks.
The current method of building a game is the same as the walkthrough for building an app[1], except you make a custom view and override its draw method. For higher performance, you can create an OffscreenCanvas and draw into it however you want. There's no API to wrap WebGL2 more conveniently than this yet.
I definitely should and will wirte a guide that takes you from nothing to a full fledged game. But right now, the guides are all geared towards making apps, since before we can make games, we need to make gamemaker tools, like spritemakers and mapmakers.
MrGilbert
I love what you did there! It's an awesome project. I directly traveled back to my childhood. While I love pico8, I think it's a decade too early for me. I grew up with desktop and gui. This feels like buying a CD again.
90s_dev
You might also be interested in Picotron[1], made by the same guy who made Pico8. It's basically a desktop OS with the same basic design as Pico8 but with slightly looser restrictions. I've never really tried it, only looked at his gifs once a long time ago, but I think he and I had the same basic idea: make a platform that you could make pico8 in. We just went different routes.
MrGilbert
Thank you! Yes, I'm aware of picotron, I tried the very first version of it. I think it's also a great environment. I first bought Voxatron years ago, because I really liked the tech behind it, and got kinda sad that it didn't evolve.
Anyways, thanks for pointing me to picotron! Think I'll have to keep an eye on both projects.^^
90s_dev
Thanks. Oh man I remember buying Voxatron and thinking it was such a cool idea, but not knowing how to use it at all or what to do with it beyond the demos. I guess the guy behind it probably ran into the same issue. Still a cool idea.
gtoast
I'm stuck on the first step of the "Getting Started" guide.
1. I've downloaded helloworld.zip to my local computer, I think. 2. I open the filer.app.js by clicking the link on the webpage. This open a 90s.dev instance right on the page. 3. Then i'm supposed to mount helloworld/app as app and click it, so i click the mount button, it asks for the drive name, hi put in helloworld/app and click mount but nothing happens.
I must be missing how you're supposed to get helloworld.zip into the 90s.dev instance... how do you upload it into the instance?
90s_dev
Thanks for the feedback.
You're likely using Firefox, right? This feature relies on showDirectoryPicker which Firefox doesn't support. You'd have to use Chrome for the getting started guide.
Also, the drive name shouldn't have a path. Name it something like "foo". I'll udpate the guide to reflect this. Then foo/helloworld.app.js will point to /some/local/path/helloworld.app.js, as long as you mounted "foo" to point to the directory at "/some/local/path"
kleiba
Boo for "Chrome only"!
Could you find a work-around to support firefox as well?
90s_dev
I took great pains to support Firefox, mostly in my service worker.
Unfortunately when it comes to mounting drives for faster local development, there's nothing I can do until FF supports `showDirectoryPicker`
However, you could just load up a local file server in your local directory (python -m http.server 8080) and import your file directly:
import 'http://localhost:8080/index.js'
Then put that one line of code inside usr/myapp.app.js and click it in filer[1]You'll have to use filer to create the file and edit it by right-clicking, then type it in and ctrl-s to save or use the top-left menu button.
I'll add all of this to the website under some "Using Firefox" page or something, for people who can't stand Chrome.
gtoast
I'm in actually in Chrome. I get the following error when running 90s.dev on that getting started page:
process.ts:159 SecurityError: Failed to execute 'showDirectoryPicker' on 'Window': Cross origin sub frames aren't allowed to show a file picker. at askdir (process.ts:154:37) at port.onmessage (rpc.ts:103:10) askdir @ process.ts:159 await in askdir port.onmessage @ rpc.ts:103 filer.app.js:129 Failed to get folder: error, cancelled, or using Firefox.
90s_dev
That's a new error, and it's because I changed some internals[1]. For now, you'll have to open the link[2] in a new tab and do the steps there.
[1] For about a week (and at the time of posting) the app was on 90s.dev/os/ to avoid this exact CORS error. But I got tired of how it forced me to name my github repos or pay for my own server, so I moved it back to os.90s.dev, which has the one downside of the error you ran into.
roskelld
Trying to load it on Firefox (Floorp Browser variant 11.26.0) and the examples get stuck on the `Loading` screen. Moving my mouse over it draws the cursor and leaves it imprinted on screen so you get that permanent trail effect.
In the console I see:
Failed to load ‘https://90s.dev/os/fs/run? code=H4sIAAAAAAAACk2QMW%2BDMBCFd%2F%2BKa4QEKAiiKlMVs1Rqlw4dmy0GjsSNsRE2TVKL%2F16DSYq3d3ef797jTas6A6zlCVgIEnhFabBL4L1TfbtP4IMVKGb5BQPUnWogzJTOHJN%2B65AQdmF8%2BiJtOxR9hfqNS65PWBFSKqkNlKqXBigE0SaeS1yWrhDFQHPfTn%2BY6HG9vjMtkyjcyP%2Fv%2BqbThp3xc%2BxEFiRr8AVWJxRCwUV1olrBkBCAnTcBmv8itXc0GOUABSvPR%2BdGVtRurtvp1fWQO86R3jYcWUvtdi668pQCGLwaGi72PYWQPWbmiCb0%2BYG6RtEboyRocxNIQ90XDTchsNJwJal1QQx5KXh5hgZ3mR9e0IvV1gfFKtaaSI7JHSYQKwisHMDwBvUhHhZHZf6q2Z1X%2B1HtMh9STmJCpqzTWpW99uHGfz0j7XEYAgAA’. A ServiceWorker passed a promise to FetchEvent.respondWith() that rejected with ‘TypeError: Array(...).keys().map is not a function’.
Seems to work fine in Chrome though.90s_dev
Thanks for letting me know. Hmm, I don't know what Floorp is doing differently. I'd need more of a stacktrace. It works in regular Firefox though. Feel free to paste a stacktrace and/or stacktrace screenshot on the issues page and I'll take a look.
foobarchu
A critique on the landing (I have not played with anything else at all): it's very confusing to post this calling it a game maker, then have a list of things it's not include "a game maker", then in the following paragraph call it a game maker. The terminology is kind of all over the place.
90s_dev
I agree. To be fair, naming things is one of the three hardest problems in computing (the other one being cache invalidation).
stevage
Oh boy, I love this aesthetic. That font, amazing. Apparently I'm much more into the 90s look than the 80s pixel art.
danielvaughn
Love the idea. Ever since I played Dreams on PS4, I’ve been curious about collaborative game development interfaces.
90s_dev
Collaboration has always been one of my favorite things. Shortly after starting this project, the focus began to center around making sure users could create first-class apps and libraries and easily find and use them in their own creations. Much of the API evolved around supporting this idea.
Hi, author here.
Thank you everyone for the feedback. It's clear that I launched this far too soon.
I'll work on the pain points you all noted, and come back in a few months.