Archive for category Meeplings
I’ve been playing around with Flash lately and my first flash game RoboFortress (A revision of a game I made earlier this year for the Global Game Jam) should be finished in a couple of weeks. Its a pretty simple maze based shooter but should be entertaining enough for people who like fast action games with retro graphics and sound effects.
After that I’m going to have a go at making Attack of the Meeplings II in flash. Here are my thoughts based on the feedback for the first game.
- The game is too hard (Casual gamers like the retro look and feel, but the game is too hard. I’ve noticed lots of inexperienced video game players don’t even use the up and down arrow keys at first) – I’m going to have to put a bit more thought into easy/medium/hard difficulty levels
- The game is too easy (Experienced players, esp those used to playing more hardcore shooters find the game too easy. They are only challenged ~30+ minutes in after the game speeds up fast enough for them. Yes, I know this is directly opposite to the first point but it shows how games sometimes have two (or more) very different audiences.
- The game doesn’t have any powerups People have commented on the simplicity of the game. Which is of course intentional. But it feels pretty good to be big and powerful so I’ll look at adding a couple powerups.
- The music is awesome The sequal will feature more awesome music!
Also I think I will cut it down to 2 stages – Most people don’t even get through one loop of the game and I like the infinite looping concept. For the hardcore players the speed increase per loop needs to be greater each time.
If you have any other feedback on Attack of the Meeplings or ideas for Attack of the Meeplings II please leave a comment.
Like any art – As we game programmers grow in our skills and abilities more often that not we can look at our past projects and be embarrassed at some of our ideas and implementations.
Most people don’t get to look at your code, unless you’ve released open source software of course. Infact, I’ve heard a good reason to make your project open source is just because other people can look at it, for that reason alone, you are compelled to make it good.
I’ve had a few “what the hell was I thinking?” moments which each of my finished games, and that’s just the finished ones. Some of the unfinished projects that never saw the light of day had horrendous ideas – like that time I tried to implement my own scripting language and parser in VB 6 with a whole lot of select statements and if-then-else trees that ended up wider than the Mississippi.
I would still like to program my own scriping language (or Domain Specific Language or DSL as all the cool kids are calling them these days.) But now at least I know it’s a difficult problem that involves a lot of Hardcore Computer Science™
So here are a few things in my finished projects that I implemented bady
- Star Cars – My first serious attempt at becoming an independant game developer was a 3D arcade title that I no longer advertise on this site due to vista incompatabilities and requiring a hardware transform and lighting supported video card. It had this had a really long, really complex collision detection algorithm that got to the point where I didn’t actually know how it worked. It got that way by me trying to solve the problem, attempting a solution, where-in the implementation would cover 80% of the cases, then I would just hack it until it worked. There was one edge case that I could never figure out – It turned out that it was easier to change the level mesh, than try to debug that horrible code.
- Caverns of Underkeep – Most of the design decisions for Caverns of Underkeep turned out very well, infact most of the game engine structure is being ported to my current project, but there is one part of the code thats just downright bad. And that’s how I implemented the modal dialogs – I did this weird thing where I would put the gamestate into a “modal mode” and all events would be routed from the active game state into the modal dialog class and then I would poll an object until its value was non-null which would return the gamestate back into its normal state, passing the newly created object back to the client gamestate – Don’t worry if you didn’t follow that, it’s kinda hard to explain without pictures and flow charts and things, which kind of illustrates my point. Now this method worked, but it was stupidly complex, my new method of rendering modal dialogs is to do a hit detection against GUI elements before they can process events, and simply masking the background so only the dialogs elements are exposed to the hit detection.
- Attack of the Meeplings – Originally Attack of the Meeplings was going to have powerups and I had this cool idea for a spread gun, unfortunately I couldn’t track down a bug in my code that was not allowing for symmetric vectors for the bullet paths, ie if v is a vector then v mirrored would not have an angle symmetric with v which gave it this lopsided look – I played with this for a day before just giving up and cutting the idea of powerups. I think it had something to do with the location of the centre pixel of the bullet, the spawn location of the bullet relative to the player, and the fact that I was rendering at discrete values (ie pixels) on the screen. Really this problem shouldn’t have been all that hard to solve, but I decided at the time it just wasn’t worth it to fix.
Here’s a histogram of the 4,842 scores in the Attack of the Meeplings database. At first glance the data looks realitively normal – However, it’s far from it. The horizontal axis is not linear, but exponential (2^n) the data is heavily right skewed which tells us that there are some people who are just so much better at the game than most.
This graph shows us how difficult the game is and we can see where peoples limits begin to emerge – For example, there is quite a bit of drop off in the 4000-8000 area.
The median score is 949 and there are only 295 scores that are greater than 16,000.
What does this say about developing a shooter if you’re an indie game developer? – Implement difficulty levels! The people who are in the top 100 are those who really like these types of games and are really good at them. Unfortunately if you only target those people you drastically reduce your potential audience.
Your players are supposed to be having fun, remember that. Give a challenge to those who want it, but relax on people who aren’t quite as good.
Many months ago I bought a book on CSS, DHTML and AJAX and have only got around to flicking through it now.
Thats quite a bit of stuff just to make a webpage. But anyway – I wrote my first bit of AJAX code today, instead of having to refresh the browser to reload the highscores in Attack of the Meeplings theres a little refresh button you can click and it only refreshes the highscore table and not the whole page -Pretty neat huh?
So its not as cool as gmail or with its little animations and automatic refreshing, but I’m not too sure what kind of effect on performance polling the server will have whilst playing the game. I’m pretty new at this webscripting stuff so I’m sure there’s some best practices way to handle it.
Well curb it at least
I’ve had a couple of problems with people cheating on the Attack of the Meeplings scoreboard. My guess was that they were using some kind of memory hacking tool such as Quick Memory Editor – Which is quite a cool program
The way it works is by searching through the memory of a game being played and locating the place where the information resides. Once the location is found, it’s pretty straightforward to alter the value and give yourself whatever you need, higher score, more lives, more money, whatever you can find you can change.
Lets say your score on an online game is 1200. In order to find the memory location you would search for that number. You will probably get a large number of possible locations, and because writing to random locations in memory can be quite disastrous you play the game a little more until your score changes to say 1400. Then you can narrow down your search to places that contained the value 1200 but now contain the value 1400. Once you’ve found the location you can alter it.
The problem with cheating in this way is that you need to be able to find the location of the data you are looking for. So my solution was to make this slightly more difficult to do.
I encoded the score as s = n + m where m was a random value and n is initalised as -m . Whenever I needed to know the score I simply returned the sum of n and m.
Because no one knows the values of m or n (not even me) searching for them in memory requires a few more tricks than a simple search.
I don’t claim that the above method is foolproof, there are probably some more advanced memory hack tools out there that might be able to detect such a scheme. But a little protection is better than no protection, and I will revise my methods should the need arise.
Update to How to Stop Highscore Cheating
Since writing my post I realised that there was still one bit of information known to the alleged cheater. They know how much their scores have differed between attempts. I don’t know if the memory hacker tool I used has this feature, but theoretically you could search the memory space for all values that have been changed by x amount.
It is therefore my opinion that we should set n = a + b
Where a = (-m/2) and b = (-m/2)
And whenever we want to update the score we randomly decide whether we want to update a or b. This makes even searching for the difference difficult as a, b, n, m are all unknown.
Japanese -> English
Attack of the Meeplings
“It is the simple vertical scroll shooting game which does not have power rise!
When the item which the enemy drops is taken magnification ratio of score keeps raising.
But simple the degree of hardness being high well enough, the feeling which does and answers.”
I’ve just removed a particularly suspicious score from the AOTM boards – Please don’t cheat people, it ruins the fun for everyone and makes more work for me.
Of course, now I have to improve the highscore boards security now anyway.
Anyway congrats to NIMITZ who is the first person to break 1,000,000
Heres a snippit:
“The game is glorious, retro-styled fun from top to bottom, including every pixel and the tough but fair gameplay; however, the real stand out is the music. Usually I find myself playing with the sound muted, but with this game I couldn’t play without the music. It is an important part of the experience. Everything meshes well; the bullets’ pew, the destructive kssh, the pick-up pwing all go hand-in-hand together to create a nicely layered experience.”
Thanks for the kind words Jay
Check out reviews of more games at Jay is Games
*Edit looks like it was Adam, not Jay who posted the review
I’ve just finished a new version of Attack of the Meeplings – Play it here!
So Whats New?
Added an ‘Easy’ difficulty level for those who are not quite experts at playing these types of games. The downside to playing on easy is that your score will not be included in the highscore table. But it should be enough to train yourself for the normal difficulty.
Heat seeking enemies now have turning arcs so they don’t change direction instantly.
And finally – Improved the performance of the game / Fixed some minor bugs.
Edit – Forgot to add that pressing A will toggle autofire on/off
Apparently computer manufacturers are always looking at ways to cut costs. My Laptop keyboard cannot register if I press the left arrow+down arrow+z keys at the same time – This makes playing Attack of the Meeplings very difficult!
However, I’m planning to release version 2.0 of AOTM within the next week, it will have an autofire option, instead of holding down the z key – Just press A once to enable autofire mode, c’mon you pretty much fire all the time anyway, so why not have that automated for you.
Version 2.0 will also feature a much needed easy difficulty mode I’m not sure if I should build a separate highscore table for easy mode, or just not allow posting highscores if you play on easy…
The other improvement to the game will be to get rid of the occasional random pause that happens sometimes. It looks like I’m making the java garbage collector do too much work with adding/removing hundreds of enemies/bullets/particles etc into and out of ArrayLists – As you can imagine the memory manager has a bit of a hard time keeping up.
Look for Attack of the Meeplings 2.0 coming soon!