Dreaming of making indie games is, sadly, still just a dream.
About Will Edwards
Ludum Dare 25
Ludum Dare 24
Ludum Dare 23
Will Edwards's Trophies
Prettiest Text Adventure Award
Awarded by royvanrijn on April 27, 2012
Will Edwards's Archive
-5 hours excited
-4 hours tired
-3 hours prepared
-2 hours nervous
-1 hour panic
0 web site unavailable
+15 minutes hourglass
+16 minutes OMG afterlife
+17 minutes horror
+20 minutes indignant
+25 minutes IRC
+30 minutes complain
+1 hour rage
+2 hours rage at self for wasting 2 hours!
My barebones.js webGL library now has a basic heightmap-based terrain and simple camera system:
It is hopefully simple enough and isolated enough that you can borrow it, adapt it, or learn from it without needing to adopt barebones.js.
It does top-down and 3D views, and makes it easy to work out where the user clicked and to update the map tiles. Grid is optional.
Each tile can have its own texture etc.
So go make an RTS or something!
I can’t enter LD26 but, rather than complaining and doing nothing about this travesty of priority, I’ve done my own little LD in my evenings. An hour here and an hour there and, after about 2 days worth, this is how far I got with my city-building game (video):
Now I must press on and make a proper full game of this! Its a big project, of course…
I ask for your help! How would you simulate a city, at a very deep technical algorithmic level?
I’ve played around with a “priority flood fill” so that, from each zone of a type, it fills outwards over neighbouring tiles using its score as the priority. There’s a cost lookup by tile type so residential influence travels further along roads, for example.
This is very pretty and its neat but is it useful? Will a large building with a high score ‘drown out’ nearby low-scoring buildings? Will the influence of a high score building cause it to reach lots of target zones – e.g. residential finding industrial – quickly, meaning it sates the needs of far-off target zones at the cost of nearer but not-yet-high-score zones? Will it mean a concentration of score? Will it be intuitive?
What ways can you think of of actually computing, each sim step, if a zone should increase or decrease score?
yay! I’m the first on mini#40: http://www.ludumdare.com/compo/minild-40/?action=preview&uid=10313
Its a joint effort – already got lots of help from the LD IRC channel! – so do head over and help code/art/sound/gameplay/concept etc!
Opening myself up here, but to be honest I’m deeply disappointed about our LD score history. I expected more of us; we aimed higher, and we hoped to make something that would please and wow the crowd.
We’ve always aimed to challenge norms; in LD23 we’d tried to put graphics into text adventures in an interesting, new way. We’ve tried to enter a multi-player on-line game in LD24, and we’ve tried in LD25 to make a 2D platform game without tiles.
We really are overactive underachievers.
Our highest LD25 score was for music. We were perhaps not clear enough that that was the one thing we had not ourselves made It was a track we’d picked up on the Internet, and we thought we’d explained that.
So why did we fail so miserably? Bad control. We should have had a lot more and we lacked in plenty of areas, but I think that the playability was most affected by the bad control.
Its fairly non-trivial to do collision with arbitrary lines and so on, and do it efficiently too. Our collision code, which we’d written for the game and mostly as the deadline loomed, was immature and incomplete. We should of course have learned how to code it before the jam, or borrowed a library or something. But we’re not really borrowing-code-libraries kind-of-people.
And what happens is that you do badly in a core area such as control and people voting just give you a low score across the board. We got 1.92 for innovation which just means we hid the code well I guess.
I’m deeply saddened that we didn’t score higher for graphics, as I myself am in awe of my team-mate’s artistic prowess and thing it deserved more. A very big part of that is my fault, as I also didn’t get around to good GLSL lighting. Meaning the whole making the scene out of meshes thing didn’t work, and it was hard to see where the platforms were because of the uniform shading.
In previous LDs the winners have always wowed me. I’ve always looked down the winners list and been awed and inspired. This time its been a whole lot, well, distanced. I don’t mean to take anything from the winners and everyone else in on the game; I think its in a large part because I didn’t find the theme exciting.
We had had an alternative game that was a FarmRomanVilla thing; Zynga being villains and villain being a medieval French word for farm worker and all. All actually inspired by a recent episode of Time Team I’d watched where they excavated a Roman villa in Britain… But whilst that was very much the kind of game I like making, I think it would have disappointed just as badly as the lets-make-a-platform-game,-they-always-do-well game that we tried.
Its been a introspective start to the new year. Our strength is art and we do ok-ish at coding too, but general story and game-play, audio (we’re both terribly untalented musically) and overarching fun we fail miserably at.
I know I’m supposed to end on a high note of future optimism and enthusiasm and a promise to try harder and come back next time. But its hard to muster the bravado. Time heals, so maybe we’ll be back for another beating; we’ll see.
Wouldn’t it be nice if you could click on a randomise button on the ratings screen and it swaps out all the choices?
And blacklist/whitelist popular tags, so you can say you aren’t interested in those that have “windows” (and “source”), but are interested in those that have “web”… and so the ratings screen will be full of games you actually stand an outside chance of playing…
I expect this has all been said a thousand times before…
We need a mod-ludum-dare-itself mini weekend
(And thanks to everyone who has rated my game, what a great turnout yet again for LD
Hmm that’s a working title.
Here’s how the editor/player looks at end of day one. Now, today, I work on play mode
And here’s a video of me clicking around in the editor:
I usually develop my webgl entry on a VPS and then publish it on github-pages.
For this purpose, I have a little python web-server that I run on my VPS which serves its files from a git repo.
Rather like github-pages, but without the build-times and aggressive caching headers.
Ideal for quick development.
I have now added some very neat collaboration features:
- you can download a zip-ball of the project easily from a URL
- you can upload files to the git repo! So, your artists can load new/edited content into the game, and then the game can upload that to the central server!
I hope this is as useful for you as I hope it will be for my jam team! Feel free to use, abuse, profit!
A very nice write-up about the never-released Hard Vacuum RTS game http://lunar.lostgarden.com/game_HardVacuum.htm
And, in excellent timing for LD25, the artwork is up for grabs!
Jam entries can use existing artwork etc.
And recently Command&Conquer was ported to HTML5 http://www.adityaravishankar.com/projects/games/command-and-conquer/
Surely all the pushing and hinting you need, right?
github Game Off for web-apps
Prizes := iPads;
I figured people want something to do between the October Challenge and the next LD in December
(I’m not affiliated with them in any way, I just saw the announcement n proggit and thought ‘cool, LDers will want to know!’)
Multi-player games need YOU!
We ought to get together a list of multi-player games and, on say the last few hours of voting or some time we can all agree on – rendezvous in-game.
Because for the poor soles rating games when they are alone in the game-would, it must be hard to appreciate them.
I’ll be sitting in my multi-player game hoping you’ll come and appreciate it!
Played Cage Flight yet? You ought to
The framerate is set by the server, and people were complaining that I’d set it too low. I’ve reconfigured the server to run at 12 fps, but its hosted in Sweden and is there’s a lot of latency over the Atlantic to contend with.
So I’ve also published instructions on how to run your own server. If anyone can run a server at a higher framerate in North America, that’d be awesome! Please post link
Played Cage Flight yet? Its a multi-player on-line space-fighter game! You are in a cage, weaving around trying to shoot down the other players; distilled survival of the fittest!
Its the game we wanted to play, so we made it! We are super pleased and proud of it. We didn’t settle on what we would make until the theme was announced; I had hoped we’d fly around a fractal landscape and put a lot of preparation time into learning ray-tracing. In the end I think we shoe-horned the theme Evolution into it acceptably and got the very best game we’ve made to boot.
How would I sum up Cage Flight as a creator? Fun and then tears. Sorry for the hurt and drama in this post:
Making a true 3D game the first time is hard. Making a multi-player game the first time is hard. Making that multi-player game real-time is hard. And making a true 3D on-line multi-player game that works in your web-browser – now that is hard! It has all kinds of challenges and components that we had never tackled before and had not prepared for.
Browser games are the future!
The real down-side to most Ludum Dare entries is that downloading them. Do we really want to be running all these Windows exes? And Unity web-client doesn’t run on Linux.
HTML5&co has really brought new potential to browser games. You have webGL, you have a new proper audio API and you have websockets. A year ago I don’t think you could make a multi-player on-line 3D game in the browser. A half-year ago you might have to use Chrome’s excellent Native Client. And now you can just use the browser! We’ve had very few people saying that they are using Internet Explorer and have no webGL
Surprisingly, there isn’t any nice tutorial or anything about how to do 3D flight in a game; they tend to use gluLookAt or glRotatef for rotation and such and they’re all just doing it wrong! I’ll have to make a little cheat-sheet for anyone Googling during the next LD.
Working with web/open/GL and meshes was no challenge, since the team draws from hobby RTS hackers. It was just 1st/3rd-person camera control that I had never tackled before. When moving the camera over an RTS board you tend to have a fixed angle-to-the-horizon and movement is actually 2D. But move to true 3D and the camera has a position and a rotation. The rotation has to be represented by a Quaternion which is just 4 floats; use classic roll, pitch and yaw (called the Euler angles) and you’ll end up with a gimbal lock! You have to be able to determine which direction is forward and which direction is up, and that’s encoded in the quaternion.
I lost about 10 hours debugging my which-way-is-forward code for the players. My initial code was simple and obvious – multiply the inverse of the quaternion by a forward vector scaled by speed. It would work at first but if you spun around more than 180 degrees, it started to fly backwards! And after 10 hours of debugging, I got it working with basically the same code as I’d started with. My problems seem to have stemmed from my library – pyeuclid – not doing what I wanted it to do regards quaternion*vector3 multiplication; moving the forward vector into a 0-rotation quaternion and it all worked. I think my original vector3 code would work in a normal math library, so I think I lost the time more to a bug in the library than me doing it wrong. But the fact was, I know so little geometry – or math in general – that I did not know how to recognise or diagnose where I was going wrong. Hence 10 frustrating hours.
While fighting the quaternions I couldn’t really focus on the actual drawing of the camera. Again, a lot of the Googleable material is out-of-date and uses glRotatef matrices. In the end it was timely intervention by Philip’ (the excellent 0ad dev) who very quickly sorted out my camera code while I was going in circles with the server’s quaternion code. I fear we’d have been much further schedule behind without his help.
Multi-player via websockets
The multi-player aspect worked really well (we thought). Its super-simple to set up a websocket server (I used Python’s Tornado) and talk to clients. The very good news is that the websockets can connect to a different server than the pages are served, which has always been a problem with classic AJAX.
So we have a websocket server, and we have all the players sending their key ups and downs to the server. The server stores these in a little table and, N times a second, sees what keys the players are holding down and applies the correct rotations and movement to each player. If the space bar is being held down, it might generate shots. It then serialises the position and rotation of all players and shots and sends it to each player. N times a second each player is receiving the position and rotation of each player and shot. It then draws it.
So, in this design, the apparent frame-rate is actually lock-step with server.
Because websockets can be opened against non-origin servers, we were able to host the game code and artwork on github and only do the actual game-play bandwidth on my hobby VPS. This is a good model you can copy. Remember, though, that github-pages has cache-always headers so people have to clear their browser cache to get new versions of the game. And in Chrome/Safari there doesn’t seem to be a reliable way to do location.reload(true)
We set the frame-rate to 8 fps and had lots of fun weaving around shooting each other! The Glest community stood up and fought! It was play-testing and discussing if up pitches up or down and if the ships moved fast enough or fired enough or the hit spheres were too small and so on. We had testers from North America and they even made videos, attesting to the playable frame-rate they achieved:
Now if you’ve read much in the way of proper game how-tos (I fuzzily remember reading about the Doom/Quake approach and a really great article about the Age of Empires II RTS) you’ll recall that that’s not how you do it! Proper games have the some client-side interpolation between receiving updates from the sever. And its hard to miss all the talk about slerping when you google quaternions.
The flaw was that our initial game-play went so well that we did not identify 8 fps as a problem. In reality we had three problems:
- players are unhappy with 8 fps. Their expectations were much higher. They think 8 fps is crap and buggy and call the game unplayable
- players don’t always get as good Internet connections to my cheap hobby VPS in Sweden as I do. Even I can get poor connections occasionally. The server times out clients who haven’t sent anything for 3 seconds and clients themselves time out if they haven’t received anything from the server in 2 seconds and the sad truth is that this happens all the time
- websockets are TCP-based and TCP has never been a popular protocol for anything with any semblance of low-latency game-playing requirements. But you can’t just chuck UDP into browser games. What we won in simplicity
I could have told you all this. I used to write streaming video servers and clients ffs. But, somehow in my recent focus on servers connected to each other over 100G I forgot it all. As I said, the moment we played our game at 8 fps all thought of client-side prediction went out of my mind. I thought we had a winning game.
And lets face it – client-side prediction is not trivial. There’s a lot of corner cases and it can smooth out tweens between server frames but it can’t really invent whole new frames when it can’t reach the server for a whole half-second. Would it have made the game playable?
“Exasperated wifes and children to unneglect”
Jam entries have three days but we have jobs to go to on Monday, exasperated wifes and children to unneglect. So we were working a weekend schedule. Being in Europe, we didn’t even have quite the same easy weekend as you North American kids. The theme was announced at 2am and we lost a few hours before we got up, breakfasted, kissed the kids goodbye and locked ourselves in our studies.
We skimmed on laser rendering and didn’t actually put in a particle effects engine that I had imagined. We’d played the game and thought it was perfectly fun without them.
Maybe with more time we could have slipped in slerping in the client. We seem to have the tools necessary, now we’ve wrestled with and nailed quaternions. But its a half-fix, and doesn’t address the fundamental, bursty-nature of TCP.
We did slip in some sound effect for the laser (yeah, I know lasers are silent in real life!) and use cool open-source text-to-speech software to make computer-like voices (as we were un-musical and lacked decent microphones). I imagined 3D sound for the other players, but again that fell out of our time budget.
Early attempts using HTML’s <audio> element to play sounds was a disaster. Just calling play can cause a webGL freeze of half a second or so. It was unplayable.
There is a very new Audio API (I believe a lot of credit goes to pushers at Microsoft for that; thanks!) and Chrome supports it, as does the upcoming version of Firefox. We did get crackily audio for the intro speech on some Chrome browsers on Linux caused, we think, by network activity. But overall it worked really well and had no impact on FPS.
The game launched on Sunday. Its a multi-player game so we went over to the Ludum Dare IRC chat-room and extolled people to play. And we had some pretty epic games with 10 or 20 fighters all zooming around the cage and shooting each other. It was such a high to be playing something you’ve made and seeing total strangers also playing it!
The complaints about the FPS were fairly understanding in the IRC chat-room. The calibre of people who hang out there is high and these people, perhaps, understood the challenges to making an on-line multi-player game with any semblance of real-time combat. Or perhaps they complain less to the face. But in the LD entry page comments there were rather fewer well-dones and back-pats.
I sat in the cage Monday and Tuesday evening, to ensure people had someone to play with. And you’d see players popping into existence in the cage, and waggle around a bit as they discover the controls, then move forward a bit, then fire, then … vanish. The vanishing can be split into two classes; those who had done nothing for a second or so so might have timed out on the client. And those who had been making some intricate maneuver and its hard to imagine they got a time-out. Either which way, the game tries to restart and these players didn’t.
The game just isn’t as gripping as we found it.
We could have polished the game much more; added more arcade-style stuff like NPCs to fight, bonuses to collect, hoops to fly though for extra points, power ups etc. But that wasn’t the game we wanted to build; we wanted distilled combat.
Will we be back for the next LD? You bet! We might stop trying to be different, though. Our first-of-its-kind spatial-text-adventure-with-beautiful-graphics fell flat on its face and so too has our attempt at doing real-time multi-player. We’ll end up doing a platform game using tiles in an effort to win compliments, I’m sure
Play Cage Flight now!
Wow its just been so much fun After the frantic coding over the weekend, we haven’t really used today to actually code or tweak much. We’ve just been playing the game to bits!
At times we’ve had 10+ total strangers all wheeling, weaving and diving!
a massive multi-player on-line space-fighter beat’em-up!
no pansy foyers and menus; just straight in, spawning right in the middle of crazy space cage combat.
End of day 1:
Write the name down: Cage Flight – because you’re gona wanta play it next week for sure!
Our team blog. And here’s just a bit of getting-fired-up team-building photo:
The suggestion system for rating 20 random posts for me is now chock-full of Windows games, which I cannot play. If I could, would I anyway? All that downloading and installing and trusting and stuff… yuck!
So I’ve taken to going down the top-10s people are posting now; if the game was good for them, well worth a look for me?!
And when I go down everyone’s top-10 -type posts for LD 23, almost all of them are WEB playable games!
What does this mean? Will we be able to work out how rateable things are by their platform choice after voting finishes? Is there a trend here?
I’ve been stuck staring at Java applets that just show blank and being asked to download Unity players that don’t exist for my Linux OS, and I’ve even borrowed a Windows machine to play a few that looked particularly promising. But the general Webness is goodness and the right direction!
Haven’t seen any NaCL entries yet though, which is a shame as I tried it myself for a mini once: Afraid of the Dark
My favourite so far is Tondie and Zupe:
Its just so playable! A complete little platform game.
Something completely different is Tiny’s World
I really loved the music! I forgave the gameplay, even. Go listen to it
Tiny Civilization is super-nostalgic for me and I’m not even going to try the new colour version
My own game is a web game, and I’m rather hoping people will appreciate the pretty graphics and the CTRL-B mode-switching:
(nothing like trying to rustle up a few more ratings before the deadline
Go Web Go!
After an engineered launch on Hacker News a few hours ago, Google Analytics tells me that we have had over 9000 players and wasted over 100 hours of their collective time so far! (Yeah, average time/visitor not so high, but hey)
We are super proud of the game. I am super proud of the game. I am rather in awe of Mr War’s artwork and the pace he works at. And he uses MS Paint! The top-down map for a text adventure gives a spatial feel that works really well. Anyone ever played a game like it?
Text adventures really bring back warm memories. And they are shockingly underrepresented in LD, so we tried to remedy that! We deliberately didn’t want to fall into the point-n-click improvements trap and we wanted an overall Victorian HG-Wells / steam-punk feel to it all.
Back when we were small we used to make text adventures in Basic and later Turbo Pascal with still images in VGA 13h. I actually can’t remember how we did it, but I imagine it took far more technical planning then. Nowadays RAM is so cheap we just have big JSON arrays of everything in dynamic languages…
We did a dry run back in the mini 31 in January. That showed that artwork was our strength but that we were under-resourced programmer-wise (my area) and we completely lacked musicians.
We didn’t recruit any musicians for this LD either. Tempted?
We prepared the weeks before by acquiring permission from loved ones and deciding the kind of game we wanted to make. We settled on a text-adventure, using HTML/JS, and the top-down spatial map idea. I wanted the programmer UI but that didn’t need Mr War, so would have been a solo entry. Not cool. And I’m so glad we did the illustrated one; its by far the defining feature of the whole experience.
Day 3 was of course a Monday – a work day. It was also the day that my flu kicked into overdrive and I was feeling decidedly groggy. We didn’t return to the challenge before the evening (Europe-time), just hours away from the deadline. We managed to get the puzzles complete and get some of the glest community to do play-testing for us. We submitted in time and went back to our families.
This went super-smoothly. We ended up with a playable game that can give several hours of fun (if you enjoy slow-paced text adventure puzzle games without bloodshed).
Technically, it has some weak points:
The command parsing is primitive in the extreme. Its just a list of legal commands. (You can see them all by pressing shift-space). I had planned text auto-completion. Its not the meaning that you have to guess the commands.
The programmer SFW mode doesn’t have the auto-completion I imagined as central to its look&feel. I experimented with code-like layout of text, but the shortcuts I tried to massage text into code nesting and adding faint punctuation and camelCasing etc made it completely unreadable. Chopped. I think with more finesse such a mode could be successful.
The NPCs don’t have the full role we imagined. We had wanted much more emergent dialogue, and work in how they all knew each other and what a coincidence it was that they converged to retrieve the treasure. That got cut on time grounds. And writing dialogue lines is hard. The NPCs were to have a role in the solution, and be a hindrance, but that never got fully developed.
And we forgot to add the vicar.
With 50+ locations, 30+ items and 7+ NPCs its quite a full enough game anyway?