Normally when coding multiplayer you have to worry about following "the rules of multiplayer" like avoiding non-determinism, or not modifying entities your client has no authority over, but all that is just way too hard for someone who just wants to get straight into making games. So my idea was that if we put multiplayer into the fabric of the programming language, below all of your code, we can make the entire language multiplayer-safe. In Easel the entire world is hermetically sealed - there is nothing you can do to break multiplayer, which means it suits someone who just wants to make games and not learn all about networking. I've had people make multiplayer games on their first day of coding with Easel because you basically cannot go wrong.
There were so many other interesting things that went into this project. It's written in Rust and compiled to WebAssembly because I think that the zero-download nature of the web is a better way of getting many people together into multiplayer games. The networking is done by relaying peer-to-peer connections through Cloudflare Calls, which means Cloudflare collates the messages and reduces the bandwidth requirements for the clients so games can have more players.
I also took inspiration from my experience React when creating this language, here's how you would make a ship change color from green to red as it loses health:
`with Health { ImageSprite(@ship.svg, color=(Health / MaxHealth).BlendHue(#ff6600, #66ff00)) }`
There is a lot of hidden magic that makes the code snippet above work - it creates a async coroutine that loops each time Health sends a signal, and the ImageSprite has an implicit ID assigned by the compiler so it knows which one to update each time around the loop. All of this lets you work at a higher level of abstraction and, in my opinion, make code that is easier to understand.
Speaking of async coroutines, my belief is that they don't get used enough in other game engines because their lifetimes are not tied to anything - you have this danger where they can outlive their entities and crash your game. In Easel each async task lives and dies with its entity, which is why we call them behaviors. Clear lifetime semantics makes it safe to use async tasks everywhere in Easel, which is why Easel games often consist of thousands of concurrently-executing behaviors. In my opinion, this untangles your code and makes it easier to understand.
That's just the beginning, there is even more to talk about, it has been a long journey these past 3 years, but I will stop there for now! I hope that, even for those people who don't care about the multiplayer capabilities of Easel, they just find it an interesting proposal of how a next-generation game programming language could work.
The Editor runs in your web browser and is free to play around with, so I would love to see more people try out making some games! Click the "Try it out" button to open the Sample Project and see if you can change the code to achieve the suggested tasks listed in the README.
It seems it is going through a DDOS attack right now. https://www.reddit.com/r/BYOND/comments/1kl4bjs/byond_hub_do...
Some history of BYOND here: https://tig.fandom.com/wiki/BYOND
Basically it is a fully contained multi-user game development environment created by two friends, Dan and Tom around 2000. It has its own language, DM (DreamMaker), roughly based on C and Python. It has a map editor and server software. You would write a game and then host it and then anyone else who had the BYOND client software could connect to the server and run it. The server acted as the source of truth and the clients were effectively dumb clients just rendering. It had limitations (frankly a lot of limitations), but for the time it ran pretty damn well for reasonably sized 2d top down games. While you could publish your game to the BYOND site, you could also run it will no connection to the centralized BYOND hub.
The secret sauce was the combined game dev environment and how simple it made networking. You basically didn't have to think about any of it because the total game state was run by a server the you or someone else would host. The client just had to download the interface.
The development environment was bare bones but the language was so simple that it didn't really matter. Over simplifying but basically movable objects were of type "mob" and background tiles were of type "turf". Both inherited from "atom". You could also write like 5 lines of code defining 1 mob and 1 turf and walk around in your new world with others online. You could then add "verbs" basically functions that the mob could take and "procs" which are just all other functions you'd want to write.
You can read the language reference here on internet archive while the main site is down: https://web.archive.org/web/20200229044355/http://www.byond....
Some other links:
- Forum entry from 2000 by one of the creators https://web.archive.org/web/20250325092124/http://www.byond.com/forum/post/194515
- Getting started writing games post (formatting is all broken on this archived version but the text is there): https://web.archive.org/web/20190402034657/http://www.byond.com/forum/post/46230
- Interesting crash course on everything from 2023: https://www.youtube.com/watch?v=TzAzMtWa0u0
- Probably the biggest game that made it out of just cult following was NEStalgia: http://www.silkgames.com/nestalgia/
/tg/station's github is very interesting, too. About a dozen pull requests every week adding random features and bug fixes from random contributors. The game is constantly in flux, but they manage to keep everything feeling the same.