8 ms·
Show HN: I made a browser-based RTS game
I've posted this game here before, hopefully a repost is fine as the game has changed quite a bit (improved AI, improved mapeditor, much quicker gameplay, etc).
Game is based on JavaScript/Canvas and WebSockets. On the browser side the map is pre-rendered (as a background image), just the mobile units/buildings and animations are dynamically rendered. The lobby server is made in node.js, but the game server is C++ for performance reasons (mainly the pathfinding). I found the C++ WebSocket libraries out there to be too difficult to use so I made my own based on the rfc. Overall I think making a game like this is quite easy with the browser performance/features nowadays. The game server and client side JavaScript are around 5000 lines of code each.
If you have any questions about the tech I'm happy to answer them.
- iWillOffshoreU 4y agoNice, big fan of browser based multiplayer stuff. I think there's so much potential now to make some crazy browser based games given current state of web apps. Edit: How long did it take you to create?
- Gluten 4y agoI've been working on this since 2014, but the actual time spent on development is maybe a few months.
- ricardobayes 4y agoit's very nice, I enjoy the tutorial and love the fact there is both PvE and PvP optionally. Very well thought out game so far, hope it gets more depth later as in more things to build, train etc.
- emteycz 4y agoI'd love to make a good browser game and I know how, but I am absolutely useless wrt. game design stuff itself.
- bmacho 4y ago> I think there's so much potential now to make some crazy browser based games given current state of web apps. I believe that this could have be done ~20 years ago with about the same effort. Websocket is maybe minimally easier than AJAX + 20 years old javascript, and the newer ECMA standards also have some nice syntactic sugars, but nothing radical. Objects, classes, closures, passing and modifying functions, javascript was so powerful and easy to work with from the beginning. People just didn't used it back then. I remember playing e.g. travianer 15 years ago, different genre, but the technology was given.
- Sebb767 4y agoLatency is far worse with AJAX. Also, browsers nowadays are much more powerful, both in rendering capabilities and Javascript engines. Servers have become a lot cheaper, too, which makes hosting this for free far more viable. Lastly, while a lot of stuff added to JS was just syntactic sugar, the whole ecosystem and tooling improved massively, which makes developing something like this a lot easier. I'm not saying this was impossible 15 years ago (in fact, Flash-based MMOs existed back then), but it would've taken a lot more effort.
- boredtofears 4y agoThere’s no way you could do anything real time with full HTTP request round trips for updates
- jlokier 4y agoThe trick was to run many HTTP requests in parallel, using different subdomains so they wouldn't be subject to the browser limit on number of parallel connections to a domain, a dummy first request per subdomain so the interesting messages went over established persistent connections, and decoupling outbound from inbound messages to make a set of "short-long-polling" connections. That resulted in real-time message throughput close to the game frame rate, bidirectional, and no connection setup latency per message, just the transmission latency even over TLS (SSL back then).
- vvanders 4y ago
- dandigangi 4y agoThis is pretty cool. I love a good RTS. Nice job.
- deleted 4y ago[deleted]
- visox 4y agoremind me of my old old abandoned side project where i tried to create a diablo clone in browser with scala.js does not work in most browsers, think in safari it works :D http://diablo-forever.com/ http://diablo-forever.com/
- crickcreek 4y agoAwesome dude
- visox 4y agoThx, did you find the second máp? :D
- DistrictFun7572 4y agoThat looks great. * By JavaScript/Canvas I suppose you are talking about WebGL? * Is the source code available for public viewing? * Did you use any of the popular frameworks like ThreeJS? * Do you use differently sized textures depending on whether the user is on a mobile phone or desktop?
- Gluten 4y ago- Not WebGL, there are just some "canvas" draw functions. - Source is not public currently. - Just jQuery - Game is desktop only, based on 32x32 sprites, there is an option to scale though if you are on a high resolution display.
- hejpadig 4y agoCool, the graphics are very reminiscent of Tibia, an old school MMO that I loved as a kid.
- Sujeto 4y agoHad some fun with the ai. That flag has a lot of hp and was tough https://i.imgur.com/5AcAD66.jpg https://i.imgur.com/5AcAD66.jpg
- smegsicle 4y agothis obviously isn't as simple of a game as tagpro or agar.io, but i think one factor for their success was being able to pop in without making an account.. i guess they call that ".io" style browser games?
- caretak3r 4y agoYeah the AI is pretty tough, pretty much only spams workers and warriors. Only issue for me is being able to accurately click on my base and/or individual chars. But otherwise pretty fun!
- all2 4y agoWould love to see support for viewing the group of selected units, group hot-keys, fog of war, a* path finding...
- bytehowl 4y agoI would recommend allowing people to just pick a name and hop in. One of the keys to the success of web games is that there's (often) literally no barrier to entry, including the need to create an account.
- adventured 4y agoI second this. The likelihood that I'll try the game out is drastically increased if I can enter a throw-away name and quickly start playing. You could automatically assign a throw-away generic name, and then slap a 'try it right now' type button prominently on the home page. If the game is good, then I'd be willing to create an account.
- all2 4y agoYou could also do a "link to Steam" option or something like that in the user settings menu. So if someone is interested in continuing to play, or even just persist a user name, they have the option to link it to something more permanant.
- Gluten 4y agoThank you for the feedback! This sounds like something that I will get implemented in due time.
- z3t4 4y agoMy experience is that almost 100% do sign up. Signing up is not a barrier. Funny statistic I had in a game was that while almost 100% did sign up, only 50% of those entered the game. After highlighting the "enter game" button, that 50% went up to something like 85%. But the takeaway is that almost everyone do signup almost automatically.
- karmakaze 4y agoDo an A/B test, and see how many enter the game when presented with a sign up form vs without.
- 4y ago
- mikenew 4y agoThis is awesome, but I do have a nitpick. Using left click to select as well as move feels really unnatural to somebody coming from other RTS games. I probably have over 5k hours in StarCraft 2 and WC3, and that's a lot of muscle memory to contend with.
- gavmor 4y ago> Using left click to select as well as move feels really unnatural to somebody coming from other RTS games. Is there a documented standard for RTS controls, at least for baseline features?
- mikenew 4y agoNot that I've ever come across, but Blizzard RTSs would have to be the gold standard. Age of Empires being second. Looking at those franchises would cover the majority of player expectations, at least in terms of basic mechanics like attack-moving, move-commands, unit selection, and so on.
- all2 4y agoThis. I don't have nearly that much time in SC/2, but I still want to R-click to move.
- beebeepka 4y agoThis is how things have been for almost 30 years now. Are we old or are we old. WarCraft 2 was quite something
- 8note 4y agoLeft click to select and move is how the Westwood RTSs worked. Eg. Red alert 2
- mLuby 4y agoAgreed but maybe this is a concession for mobile users? Can't confirm without registering an account.
- kwhitefoot 4y agoWhy can nicknames not contain spaces?
- deleted 4y ago[deleted]
- strongbond 4y agoPlease make the tutorial more prominent.
- closedloop129 4y agoIs it possible to play the game without having to register an account?
- mLuby 4y agoI'm curious if it's reasonable to push more processing to the browsers to save on server costs. I know multiplayer games generally need a server to "referee" (and to matchmake) but I wonder if games ever offload most of that work so the client does the heavy lifting (e.g. find a path from A to B) and then submits its work for the server to validate (e.g. this path from A to B works) and broadcast rather than the server doing all the game simulation work. My understanding is that multiplayer game clients generally just do graphics/sound and user interaction processing. (yeah yeah distributed consensus don't say the B word)
- junon 4y agoThis is a common vector for cheats, so most developers eschew some sort of P2P lobby system.
- lolinder 4y agoA client-solves-server-verifies model introduces an interesting metagame that you'd have to be prepared to embrace. To run with your pathfinding example: odds are the stock client's pathfinder isn't ideal for every circumstance. You'd inevitably see alternate clients emerge with better or specialized pathfinding that would still check out with the server but would accomplish the player's goals better. As far as I can tell there's no way to have the server prevent this while still saving any compute time, so you would have to design your game around the idea that this metagame exists. It could be really interesting for a certain type of player, but frustrating for many others.
- crickcreek 4y agoI love rts but i just have an old-ass android phone! look for me, 551154305985 TIM
- smegma2 4y agoHi Gluten, I never wrote a real-time game, so I'm curious about a lot of things. * Does the server have a tick rate and it updates clients at a set interval, or does it only update when things happen? * Did you ever run into any issues getting enough throughput from the server? e.g. maybe too many events happening at once to update everyone? * Do you have to manage situations where two clients have a different view of the game state (due to extra latency for example)? If so, how do you resolve it? For example, I know that Team Fortress 2 follows the rule for guns that "if the shooter thinks it hit, then it hit", which means that people get shot around corners sometimes. I'm working on a turn-based game using websockets which has been hard enough, a real-time game seems much harder to make! Thanks for sharing!
- mizzao 4y agoIt's probably a completely different architecture, see the classic article "1500 archers on a 28.8": https://www.gamedeveloper.com/programming/1500-archers-on-a-28-8-network-programming-in-age-of-empires-and-beyond https://www.gamedeveloper.com/programming/1500-archers-on-a-...
- smegma2 4y agoThis is interesting, thanks! So sounds like there is too much data to send the entire game state every time.
- rnd420_69 4y agoIn 2022 the bandwidth requirement is actually easily doable with some compression of the sent data. But an architecture that uses prediction (cool kids seem to call this 'rollback networking' nowadays) has other benefits, like zero latency for player input.
- mizzao 4y agoFor folks who are reading, the "simultaneous simulation" architecture used in almost all RTS games is still a very different beast than the "rollback networking" architecture used in some FPS (and fighting) games referred to by the above post.
- holografix 4y agoThis is so cool! Is there a dev blog?! I’m particularly interested in the netcode and things like path finding and object collision detection at scale.
- ttty 4y agoRelated to multiplayer rts games this is also done with same tech but node.js only to reuse code between client and server side https://bitplanets.com/ https://bitplanets.com/ I wonder what performance issues you had with node.js that justified a bridge to c++ (including the increase of complexity of the architecture). Pathfinder is not terrible in node.
- aliswe 4y agoLooking real good!
- hombre_fatal 4y agoAlways impressed by people like you who can do the impossible work of getting a game to the point of launching something.