Ice Fighters

Feeling bloody thirsty? (Well, without the blood). A nice, mindless shoot 'em up game in which you get to kill lots of evil fire-breathing aliens. Just the thing for a bit of stress relief. All you need to do is escape with your life to win.

There are 3 levels to escape from, but to escape from the last level you need to clear it of monsters…

Visit the website here or play via webstart.

Use the arrow keys to move / turn, ctrl + left / right arrow to strafe and shift to fire.

Any feedback greatly appreciated. I’m not a huge fan of the keys myself, and would be very happy to listen to suggestions. (I didn’t want to use Alt to fire because if you press it and don’t press anything else before you release it, you get a system menu which makes your player pretty unresponsive for a while… :’()


The third level was rediculous - so many of those “fire elementals” ! :smiley:

Pretty cool! I’d use different buttons to strafe/move. My not WASD and Q/E for strafing? You could export two different versions, one for QWERTY and one for ADVORK.

Thanks for the suggestions. I’ve released a new version incorporating these.

Now there are 7 levels of difficulty (1-7) with 1 being very easy and 7 being, well, not very easy.

The keys have changed to WSAD + QE for strafe and Enter to fire. At the moment I’ve only got a version for QWERTY keyboards, but I’ll do a DVORAK one soon.

If you die, just hit enter to restart.

Ok, I’ve cut the levels of difficulty down to 4, but level 4 is much harder than level 1. The graphics are also a bit cooler now, with some nice reflections coming off the floor. 8)

I’d be very interested to hear any feedback. Are the levels too hard or too easy? (Yes, it’s possible to win on level 4!) Are there any changes you’d like to see to improve the game play?

Some more keyboard suggestions:

Create multiple bindings for :


  • move forward -> up cursor | numpad 8 | w
  • move backward -> down cursor | numpad 5 | s
  • turn left -> numpad 7 | a
  • turn right -> numpad 9 | d
  • stafe left -> left cursor | numpad 4 | q
  • stafe right -> right cursor | numpad 6 | e
  • fire -> space | return | numpad enter | numpad 0 | right CTRL

AZERTY (even the french need love ;)):

  • move forward -> up cursor | numpad 8 | z
  • move backward -> down cursor, numpad 5 | s
  • turn left -> numpad 7 | q
  • turn right -> numpad 9 | d
  • stafe left -> left cursor | numpad 4 | a
  • stafe right -> right cursor | numpad 6 | e
  • fire -> space | return | numpad enter | numpad 0 | right CTRL


  • move forward -> up cursor | numpad 8 | ,
  • move backward -> down cursor | numpad 5 | o
  • turn left -> numpad 7 | a
  • turn right -> numpad 9 | e
  • stafe left -> left cursor | numpad 4 | ’
  • stafe right -> right cursor | numpad 6 | .
  • fire -> space | return | numpad enter | numpad 0 | right CTRL

This should suite everyone ;D

Very cool.
I found it easy, but the last stage is crazy on hard. It just lagged to much. Maybe would be playable if it used both of my cores…

Very good execution. I’m surprised you got this kind of gameplay out of 4k.

A little food for thought, however. At a distance it is difficult to target the creatures because the left/right turning seems to jump a little far to be helpful. I got around this by strafing (which seemed to be smoother than turning) and sprayed in their general direction. If the turning action could be progressive and not jerky this might make for a very useful engine.

Again, good stuff.

Thanks for the suggestions, cylab. I like your suggestions and they make a lot of sense, but I’m pretty sure I don’t have the bytes available to be able to support multiple different key strokes for the same action. I’ll give it a try though, but I’ve already had to do a lot of horrible things to get it under 4k

I will put out different version for different keyboards though, and thanks for the reminder about the French keyboard.

One question: I notice that you’ve put the strafe next to the “backwards” key, and turn next to the “forwards” key, whereas from memory games like HalfLife start off with the turn next to the “backwards” key. I’m assuming you put it this way because you find it easier to play with keys set up like this?

zammbi, can I ask which difficulty level you were playing on? I know that level 4 has some issues with speed if you’re facing towards a large group of monsters on the last level and they’re all firing as it does a painter’s algorithm based render. Maybe I’ll put a couple of walls in on the last level so there aren’t so many shots on screen at the same time or something…

Jason, I’ve got to agree with you. I thought it was just me… >:( I tried having it turn slower so you could fire more accurately, but then it turned too slowly. I think the solution might be accelerating into a turn. (ie turn 1 degree the first frame, 2 degrees the next frame, 4 the next and so on up to the maximum turn rate) Is this what you mean by “progressive”?

Oh, for more bytes to play with… :’(

Thanks for the feedback to all…

I was on lvl4. Yea some walls might solve it. I wasn’t lagging too bad at the start.

virtually nobody is playing with keyboard turn, since mouselook is used widespread. Since everybody is used to two-hand-fps, you can use a keyboard mapping to allow left hand move/strafe and righthand turn/shoot (that’s the reason for numpad 0 or right CTRL should be fire) or left hand move/turn and righthand strafe/shoot.

I would prefer left hand move/strafe and righthand turn/shoot, so have

  • move forward -> w
  • move backward ->s
  • turn left -> left cursor
  • turn right -> right cursor
  • stafe left -> a
  • stafe right -> d
  • fire -> numpad 0

the last one is debatable, since especially on notebooks, you might miss a numpad…

are there only 2 lvls? or does taht first tiny room count as a lvl. cause I beat it in like 5 min. the last level was hard though, that was fun mowing al of those fire dudes down.

good game. keep up the good work.

Pah! Of course I’m counting it as a level!! :slight_smile:

I wanted something to “warm up” people as they entered the game and not have them have to fight too many monsters originally. I might try to put a couple of extra walls in if you think it would help, or I could add more monsters. Or both. (Maybe. It depends on finding those rather elusive spare bytes!)


I’m not sure I fully understood what I meant by “progressive” :slight_smile: - but I’ll do what I can to better articulate myself.

Perhaps fading into and out of the motion would be most appropriate. You are on “ice” after all. When a player is holding either turning key, if you were to apply an additive force, up to a certain limit – then once the key is released, degrade the force gradually. Slide in and out of the turn.

It helps me to walk through it with some dirty pseudo-code:

set turnspeed to 0
set maxturnspeed to 10

while left turn key is pressed
	if 10 tics have passed since last increase
		if we have not reached maxturnspeed
			add 1 to turnspeed

when left turn key is released
	while turnspeed is greater than 0
		if 10 tics have passed since last decrease
			reduce turnspeed by 1

Do we have a math major in here who can turn this into some sort of equation to save some space?

Something along these lines would allow you to gradually increase the turn speed, and you could adjust both the rate of increase and the max turn speed until it feels right. Also, you could independently control increase and decrease rates, which might be handy if you want to immediately stop the turning action upon key release – just set turnspeed to zero, or maybe something more graceful.

Thanks for the really helpful feed back, everyone.

I’ve changed the turning similar to what Jason suggested, having an accelerated turn (but no decelerated turn, I ran out of bytes!) and you can pretty much turn to anywhere if you tap the turn key quickly.

The first level is now expanded. Not much, but hopefully enough to qualify as a level in it’s own right. ::slight_smile:

There are walls in the third level for you and the monsters to hide behind. Not too many, just enough to make it interesting. This seems to reduce the lag a little.

I’ve also beefed up the difficulty a fraction. Hopefully not too much so that the extra monsters on level 3 more than compensate for the speedup I get from the extra walls, but hopefully enough to make level 4 a fair challenge.

Haven’t done the keyboard remapping yet, but it’s on the list. I do find I’m using turn more often, now I can turn to pretty much anywhere I want to.

Very impressive graphics for a 4K game. How is the maze generated/stored? I noticed that some of the walls are diagonal. I played through the game on the easiest level, which is a tad too easy. I have a 1.8 MHz single-core WinXP machine. The game ran a bit slow on my machine. It’s difficult to aim and it’s difficult to avoid enemy bullets. As with many 3D games, it’s hard to get a sense of relative depth between the player and obstacles.

Sorry for the slow reply, been out of the loop for a little bit… (I hate it when work interferes with my hobbies!!)

The maze is hard coded in an octal-encoded string, so for example the simple level is:

String sMapData = “\001\001\055\260” + “\010\001\060\265\377\201\201\236\372\255\201”;

The first number is the number of walls in each “wall chain”, then the x and the y coordinate of the wall starting point. After that, there’s either pairs of x,y coordinates (one byte each) or if the high bit is set then the wall is perpindicular to the last wall (or vertical, if it’s the first wall)

So the first few walls on the second chain here ("\010\001\060\265\377\201\201\236\372\255\201") are:

  • there are \010 (ie 8) walls in this chain
  • the first wall starts at (\001, \060) ie (1, 48)
  • the next number (\265) has it’s high bit set on the first wall so it’s a vertical wall, and we’ll ignore the high bit, so the wall ends at \065 ie 53. Thus the first wall goes from (1, 48) to (1,53)
  • the next number (\377) again has the high bit set, so it’s perpendicular to the last wall (ie horizontal) and ends at (177) ie 127. Thus the second wall goes from (1,53) to (127,53)

And so on. This constrains my walls to be in the range (1, 1) to (127,127) but it means I get to effectively use one byte per wall, unless I want a diagonal wall in which case I need to give both x and y coordinates.

Aren’t you glad you asked? 8)

I’m happy to release the source code if anyone’s interested, but it’s rather a mess due to the optimisations…

Thanks for the comments though, it’s much appreciated. I wanted to see what kind of cool graphics I could stuff into 4k, and I’m aware that it does tax the CPU a little, particularly at some of the harder levels when there are a bunch more monsters and sprites. I think even moderately high spec’d machines would grind a bit on level 4, but without many more bytes, the only way I could have sped it up would be by reducing the screen size, and that would have been a shame… :slight_smile:

I really wanted to put in a gun image on the screen which would have helped with the aiming, but I had exactly 1 byte to spare after my best optimisation attempts, so it went by the wayside. As did the mini-map… :’(

[quote]As did the mini-map
I like it without a mini-map cause then it adds a maze effect to the game.

pretty complicated way of saving levels.

would be cool if you continued this as a non-4k (is that allowed?). I think it has tons of potential. you oculd do those things oyu missed :slight_smile: