Shoot-em-up Project

What's this?
Hosted by...
More info & Download!
Install or Compile
Coming soon

What's this?

It's a free open source shoot-em-up game! Created by Ben Jones and Trevor Dodds, without buying any modelling tools or game engines! It's made by hand, in OpenGL.

Play single-player or multiplayer across the net. Extra levels to be released soon!

Hosted by Sourceforge Logo

More info & Download!

Install or Compile

For windows, just run the exe

For linux, install OpenGL and OpenAL first if you've not got them already. Then type 'make all'.

Screen shots








Coming soon...

New weapons and pick-ups. New levels.


       ______   __   ___  _______  _______  __________
      /     /  / /  /  / /      / /      / /         /
     /  ___/  / /  /  / / ___  / / ___  / /___    __/
    /___     / /__/  / / /  / / / /  / /     /   /
    ___/  / /  __   / / /__/ / / /__/ /     /   /
   /     / /  / /  / /      / /      /     /   /
  /_____/ /__/ /__/ /______/ /______/     /___/
                   SHOOT    v 0.9
       a game by Trevor Dodds and Ben Jones
Where from...

Files (Windows version,
In this zip, you should find
shoot.exe  - game executable
server.exe - server executable (for multiplayer)
ShootCommand.bat - batch file used to open command line
glut32.dll     - graphics library needed to run the game
OpenAL32.dll   - sound library needed to run the game
readme.txt     - this file you're reading
CHANGELOG.txt  - version history
Level Files (.level)
Texture Files (.tex)
Texture Image Files (.bmp)
Sound Files (.wav)

Files (Linux version, shoot.tgz):
shoot     - game binary
server    - server binary           |         | openGL libraries*    |

libopenal.a*         |         | openAL libraries       |*  |

README    - this file you're reading
CHANGELOG - version history
Level Files (.level)
Texture Files (.tex)
Texture Image Files (.bmp)
Sound Files (.wav)

1. Unzip the zipfile to C:\ using your favourite zip program.
2. To run Shoot, go to the "Shoot" folder and double click on the 
"Shoot" file. This will run Shoot in its basic configuration, 
using example.level
as the level to play/edit

           - - - - - - - - - - - - - - - - - - - - - -
1L. Extract the contents of file shoot.tgz using the following command:

   % tar xzf shoot.tgz

This will create a directory called 'shoot' with the game contents.

2L. To run Shoot immediately type:
   % cd shoot
   % ./shoot

   (See below for command line options)

           - - - - - - - - - - - - - - - - - - - - - -

Running the game
To run Shoot with various configuration options, open a command 
prompt in the current directory. Shoot can be run with several command line 
arguments to change how it runs.

These are:
- fullscreen - run it in fullscreen mode
eg shoot -fullscreen

levelname.level - run it, playing levelname.level
eg: shoot dmcastle.level

<serveraddress> - connect to a shoot server for a multiplayer game
eg: shoot arena.level    (connect to localhost server)
    shoot arena.level localhost    (ditto)
    shoot arena.level  (Connect to

Note: Levelname must be supplied when connecting to multiplayer game

Supplying a name after the server address will set the player's name in game.
eg: shoot arena.level Ben
would set your name to "Ben"

An example of running Shoot with command line arguments is:

c:\..\shoot>shoot arena.level Ben -fullscreen

Starts Shoot playing arena.level, connecting to a server on the local machine, 
using the player name Ben, and in fullscreen mode

  Setting up the server
To run a multiplayer game between 2 or more people, a server needs to be run.

The server should be run on a computer whose IP address is known, and has 
sufficient resources to cope with multiple connections to it, since it will 
be routing the messages from every client in the game.

To run a server, first go to the directory where Shoot is installed and type:

In Windows:

In Linux:
   % ./server

This will run a Shoot server on that machine. Make sure your firewall allows 
connections on port 3490, otherwise the server will not be able to communicate
with the clients. The firewalls on every client computer should be set up in 
the same way. See your firewall's documentation for how to do this.

           - - - - - - - - - - - - - - - - - - - - - -
  Setting up the clients
With the server set up, players just have to enter the game to begin playing. 
Decide between the players which map will be used for the game, so that every
player runs Shoot with the same map on the command line.

Once this has been decided, each player runs Shoot, connecting to the same 
server. For example, if the level is dmcastle.level and the server is at, each player would type

In Windows:
   c:\..\shoot>shoot dmcastle.level <player's name> -fullscreen

In Linux:
   % shoot dmcastle.level <player's name> -fullscreen

<player's name> is whatever name that player chooses to be represented by 
in-game. "-fullscreen" is optional, but is recommended for a better gaming 

  Quitting a multiplayer game
Quitting a multiplayer game is done using the menu in the same way as quitting
a singleplayer game. The other players' game is not disturbed by this.


Shoot is a 3D multiplayer first person shooter. Run around and shoot the other
players before they get you! If singleplayer is your thing, then battle your 
way through the legions of evil cyborg soldiers until you reach your ultimate 
goal... the arbitrary end of the level!


Main game:

w - Move forward
d - Move backwards
a - Strafe left
s - Strafe right
Spacebar/Middle mouse - Jump
Left click - Primary fire
Right click - Secondary fire (if applicable)
t - talk to other players
i - toggle invert mouse

The arrow keys can be used to achieve the same effect as WSAD for movement.

Esc - Open menu


Arrow keys - Navigate menu
Esc - Close menu and go back to main game
Enter - Select option



Rocket Launcher aka "The Boxgun"
The Boxgun basically a pipe, housed in a 80's car-esque box. It deals death 
in the form of rockets and overly-bouncy grenades. Grenades stick to the wall 
on impact and explode on a timer

A classic. This two-barrelled variety is fearsome when you can see the whites 
of their eyes, and pointless at distance. Its reload time is as scary as the 
actual payload. But to different people...

Fast, and very dangerous. The rugged construction of this gatling-style gun 
means it's not hugely accurate, but when you're firing so fast, who cares?

Surprise Launcher
The origins of this gun are shrouded in mystery. Why would anyone make such 
a weapon? It has no practical use... to the uneducated eye! To a desperate 
mercenary in a tight spot, it offers a somewhat random ray of hope. The 
surprise launcher has been the saviour of a small select few, often last 
seen running away from an increasingly large oversized explosion throwing 
their assailants skywards.


Health Packs
Pick one up for a 15 health boost

Rocket ammo crates
Get some extra rockets, you'll go through them quickly.

More items will come soon!



Shoot is an open source piece of software and is constantly in development.
With that in mind, it will contain bugs.

Upon finding a bug, email one of us at:

Trev - trev at
Ben - sheepyl33t at

A list of known bugs will go up on the site soon.

See the CHANGELOG file for most known bugs, and changes by date.


Programming: Trevor Dodds and Ben Jones
Elliot Rice made the excellent minigun model, whilst Ben did the other
modelling. All the models are hand-coded.

...are copyright Elliot Rice and possibly someone whose site got Googled.
All other textures are copyright The Shoot 'Em Up Project (Ben Jones and 
Trevor Dodds) 2005

Game engine and level editor created from scratch, written using C++, 
OpenGL and OpenAL.

Uses code from NeHe, to load textures.
Function to load textures from Nehe ( 
submitted by Richard Campbell, Lesson 6

Uses Nehe's masking tutorial code from Lesson 20

Uses code from Lighthouse 3D, for calculating frames per second, and 
for billboarding.

FPS Calculation:


Change log

- going through beginning to remove warnings
- removed \ in comments in surprise.cpp because they escape newline character
- removed unused variable in hud.cpp
- changed level 1 wall texture to window2 instead of window1
- changed level1b to have a hole for the end of level
- made bigger hole at end of level2 and reduced brightness of it
- changed level4.tex window1 to window2
- fixed bug where bullet loaded next level
- changed Makefile to compile with -D_LINUX_ and warnings
- made it load the next level when you complete one
- NUM_LEVELS constant limits number of levels. Will go back to level 1 when you complete them all
- made coke cans in clutter
- made cola machines in item
- player::checkHitItem detects hit with cola machines and uses clutter and level to make cans
- made 'v' (for vending machine) place cola machine items
- changed sprintf in to limit number of decimal places
- made baddies only activate if within +-200 vertically of player
- changed number of elements in second dimension of particles array (particle.h)
  from 8 to 7
- made clutter stuff
- made hack for getting rid of black walls with cloud texture in
- decreased texture bullet speed to try to make it work better!
- fixed windows startup stuff in client
- tested multiplayer with one player on windows one on linux
- disabled editor for multiplayer only
- made rocket jumps possible
- added logo
- updated README
- doesn't draw gun when you're out of lives
- added level complete message
- got rid of lives
- fixed -fullscreen when not using network. It must be last command line arg
- disabled editor
- changed default filename to level1.level
- disabled noclip
- disabled home and end keys for up and down
- increased shotgun spread and power
- made baddies have random weapons but more likely to have boxgun
- made baddies not pause so long for next shot if they have minigun
- made items respawn in network play
- decreased amount of ammo you start with
- made ammo packs give you ammo for all weapons
- changed wallmark initial brightness
- added lots of sounds!
- increased jumpPower and removed from Player::reset()
- sorted out sound for baddies and player hit
- added item textures and wallmark stuff
- added new core textures to
- added rocket to surprise launcher model
- added sound for explosions but need to give it multiple sources
- made soundmanager class
- need to work on attaching sound to baddie/objects - mapping sound source to player etc.
- made baddie legs swing faster
- fixed minigun by resetting prop
- made minigun spin faster
- made shotgun kickback faster
- added viewbob and gunflash to shotgun
- added viewbob to minigun
- changed level::getCeilingOfPoint to return 10000 if point is in sky region so
  that bullets don't collide with sky
- sorted out surprise launcher so new rocket appears in time for next shot
- increased bspeed in
- decreased lift count in
- integrated
- changed mouseSensitivity in
- increased bspeed in
- changed srand to time() in
- experimenting with getting baddie to fall properly
- angleX = dieCount*2 in
- works now - think they were just still walking forwards while dying - see and
- baddie sound can be heard but quitely. Experimenting with orientation of listener.
- made bullet set ground to level.getFloorOfPoint() because using the new collision detection
  method means that it doesn't collide with walls that it goes over
- made baddies have a sound
- working on setting listener and source position - currently no sound heard
- made it clear the colour again and made mountains transparant again (problem was
  sky has to fade out (using fog) above mountains and fog was blending with the colour from
  the last frame (i.e. not the clear colour))
- fixed up collision method
- moved glutPostRedisplay to top of idle
- moved glClear to bottom of display and stopped it clearing the colour buffer
- removed blending on skybox mountains
- commented out the separate specular colour in init()
- made checkHit2 have collisionPoint as a reference parameter
- thinking of checking four points again, because if you move planes then you cause a lot of trouble!
  could do this in checkHit2???
- made wallmarks work for walls, ceiling and floor
- removed depth mask from trails
- made grenades explode properly
- turned off depth mask on explosion flashes and smoke
- implemented a new collision detection method for player
- varied wallmark size slightly with rand() - had floating point exception!
- made explosion flash size depend on explosion size
- made wallmark fit with explosion size on surprise launcher
- made baddies become unaware if they are too far away
- made baddies fade away before being deleted
- made Region::moveLift() return false all the time for platforms so they are removed from activeLifts straight away
- decreased DIECOUNT_LIMIT (in player.h) and made remove baddies that have reached their dead limit from
  the vector. Added Baddie::getReachedDeadLimit() so this can be achieved
- added glLightModel to init()
- made output method in level for couting region you're in
- fixed lift bug for old getCeilingOfPoint method (not using regionDivisions)
- added hacked section advancer regions
- made player.reset() also reset strafeRightSpeed
- increased rocket speed from 2 to 3
- introduced two lift times - short and long - shorter wait for activating lift (it was taking too long),
  then it waits longer at its destination height before returning to initial position
- made item collision area bigger so it's easier to pick up
- made it so if wall is black (bug) then pressing 'm' to make it brighter jumps it to BRIGHTNESS_DEFAULT
- made space jump
- added face class
- added communication class
- added srand to
- improved makefile - all .o files are now in one variable. Also, instead of 'make allfiles', it's now 'make all'
- changed makefile
- made it only send dead messages if NETWORK is 1
- made it so health displays as 0 if it's negative
- made client and server use weird ascii chars as codes for start and end of data
- made humans reset their connectionErrorCount upon construction so they don't get stuck!
- made bullet types that are sent +48 to bring them to normal displayable chars that don't conflict with start and end data chars
- fixed bug that wasn't sending grenade type - was using player.getBulletType() instead of 'type' variable in mousePress() in
- improved kickback on boxgun
- shifted kickback and viewbob variables into gun.h so they can be used by all guns
- made it send names
- made sky slightly higher, then lowered it again!
- made client a separate class
- made humans affect lifts and doors
- made client send data using glutTimerFunc
- added secondary fire for boxgun - makes rockets act in a more grenade like way, but they still explode on impact
- put glutInit() before dealing with command line args, as that function removes any args
  intended for glut itself
- added multiple hud message thing
- added kickback to shotgun
- made trails draw after bullets so they don't cover up half the bullet
- implemented WASD keys for movement
- implemented multiple start positions
- made it not reload upon death if NETWORK is 1
- made it set you to a random start position upon load/death
- made trails fade away
- multiple humans!
- increased server maxrecvbytes thing
- made it deal with overflows better
- sky pan
- core textures
- billboarding
- finished integrating
- made bullet trails thinner, disable depth test (so they don't cover up explosions), and last shorter periods of time
  EDIT: re-enabled depth test, that was a bad idea!
- fixed kickback to look right when looking up or down
- changed NETWORK so it is 1 if you specify an ip on command line
- made explosion flashes fade out so when you're hit directly by a bullet the flash fades away
- made server read things in terms of bytes
- fixed some bugs
- made clients read in data properly - if lots is sent at once it iterates through it
- made clients pass on when and where they fire(d)
- made humans animate when moving
- decreased smoothness of human movement for testing purposes
- using the fact that humans have id of > 99, in, make them fire bullets from left hand side
  like player (id 0)
- quick and easy collision - made human objects check their own collision - may not be what really happens to other player
  e.g. other player could move into bullet and human on client side may not have updated position yet
- when using slower connections or a more distant server there seem to be errors in the position received from time to time
  maybe not all the data was sent at once?? For now I've just made it wait a bit until it can accept a suitable value
- fixed bug where player could send bullets repeatedly even if fire rate prevented them firing locally
  (made player::fire() return a value to say whether the firing was successful or not)
- made sky slightly bigger so you can't see the edges
- fixed lift bug - to do with ceiling being checked for a point in a lift before player has been 'snapped' to lift top
- made dead baddies so they go up with lifts
- removed purple tint from lift tops/bottoms
- made baddies not check for bullet collision if they are 'tooFar'
- made clients read data in terms of bytes!! it now accounts for not all the data being received straight away!
- made networking work! DELAY the sending! Sorted ids - don't worry about numbytes!!
- put normals in skybox, then realised lightings disabled
- made sky four polygons
- taken away purple tint from the floor and ceiling (in Region::draw())
- added torch, press 'f' to toggle when not in editor
- made it so you can save and load tiling options (tiling is done using '/' and '?')
- version 2 of level files is now complete - up to 100 textures can be used (0-99) and tiling can be saved
- made it so baddies height is decreased when they are lying down for bullet collision purposes
- made it so baddies are still affected by explosions when they are dead, so they slide about everywhere! Yay!
- made baddies slide forward slightly when they fall and die so the collision point is more central
- fixed segfault when you left grid range
- added screen flash for when you are hit
- adjusted max pushY in player::checkHitBullets so you can rocket jump a bit higher
- the region division thing seems to be working. It will output some error messages if not.
  Currently it outputs the array to the screen upon loading.
- fixed bug with banging your head on doors
- fixed a cause of segfaulting when moving lines - in the for loop in, i was an unsigned int and was
  taken to < 0 - i is now an int! This seems to work - tested by being a crazy right-clicker everywhere!
- removed unecessary zOverX and xOverZ vars in baddie::ai()
- should have got rid of the problems with asn being out of range
- decreased maximum push from bullets so that you shouldn't get stuck to walls anymore!
- also capped the push values when being pushed by explosions - min -1.0 and max 1.0
- baddies now only fire if they have a clear shot!
- baddies fire the direction they are facing if they fire when dying. (i.e. they fire upwards as they fall back)
  not sure if this looks silly?!
- got rid of one of the things that made it segfault - to do with deleting regions and others still being connected to it
- made baddies feet move when alive not dead!
- got rid of bug that made some wall brightnesses reset when you added a region
- Began updating from Ben's build - keeping stuff I added and copying in stuff that Ben added
- Baddie models updated
- in Baddie:ai() not bothered passing through aiOn, just don't call the ai if it's turned off
- added the code for bullet timer and thruster
- when copying, used constants in checkHitItem instead of numbers for checking which item it is
  also didn't return in the middle of loop so you can pick up more than one item at a time.
  also in noted that bullets are no longer passed to move
- noted our two files are the same except for initialisation in for loops
- noted that in I had fog start set to 100, Ben had set to 900, which probably makes more sense for indoor levels!
- made baddies bullets fire from it's gun (right hand side instead of left)
- made explosion effects look cool using different blending techniques
- got rid of gluPerspective and replaced with hard-coded glFrustum
- got rid of gluLookAt and replaced with operations that rotate and translate the world
- the above two points seem to speed things up - colossus now runs at high res with loads of baddies!
- got rid of atan and used a sqrtApprox and asn array in Trig.h (log tables) for asin instead
  (this seems to speed things up nicely!!)
- renamed window to 'Shoot-em-up Project'
- fixed level saving bug
- fixed bug that made all baddies aware when you fired first shot!
- increased mouse sensitivity (slightly) and added a new variable 'mouseSensitivity' to control this
- lowered baddies so they walk on the floor not hovering above it :-)
- fixed saving wall brightness so it works for lift walls (must remember to set brightness values before setting
  lift! D'oh!)
- can change grid size now, using q and w. I wouldn't recommend halving it any more than once from the standard size.
- can now change lift thickness!
- the hud message didn't display properly because it was a proportional font but every letter
  was displayed at a constantly increasing x coordinate. Now using fixed-width fonts for editor
  and hud messages
- made editor messages white
- implemented level file versions, to make updating old levels to the new system easier
- now loads and saves brightness
- surface brightness of floor, ceiling and lift bottom/top can be changed
- fixed bug that pinged you to top of walls if near a moving region
- integrated ben's lighting version and new baddie models
- made it so 'n' and 'm' increase/decrease brightness of walls, and ',' and '.' inc/dec floor brightness
- fixed it so that when you disable clipping you no longer are moved by lifts/moving regions
- sorry if you had three or four baddies it didn't work - fixed it
- you can delete baddies by firing a texture bullet or real bullet at them
- you can now save player position. Set the position by pressing 'x' whilst in editor mode.
- fixed it so you don't run out of ammo whilst changing textures!!
- made shotgun fire a spread of bullets
- fixed some bugs
- fixed some bugs
- made it so you can load/save baddie positions
- fixed a couple of lift/door bugs and a jumping bug
- made shotgun (gun 2) the right height
- explosions send people flying! ROCKET JUMPS!
- explosions injure you. Hit by a rocket now will knock off about 25 health - that's 10 for being hit
  by the bullet and 15 for being in the middle of the explosion. Hit by the edge of an explosion and
  you'll be injured a bit less - about 1 to 15 health loss.
- baddies are now saved and loaded along with level
- tested everything out a bit more - made a level full of loads of gimmicks (lifts/doors/walkways)
  all near each other and found loads of bugs, which have now mostly been fixed. Just a couple left,
  but I'll leave them for now as they're pretty harmless and rare.
- fixed it so you can still turn whilst pressing mouse button!
- made it so you can jump by pressing the middle mouse button
- made it so you can bang your head when going up on a door/lift and standing half on and half off
- fixed up door textures so you can plaster the lot
- stopped drawing bullets when exploding
- no longer explodes when changing textures!
- integrated new bullet/gun/explosion stuff
- changed bullet kill method to 'explode'
- fixed bullet collision problem
- made bullets collide with moving doors
- FLIPPING ECK absolute MISSION. Made bullets fire from the gun (it was a subtle
  problem that when you looked up/down the bullets weren't coming from the right
  place). Also, gun is now drawn on top of bullets.
- you can now change the texture of doors, (with difficulty)
- doors are now saved/loaded along with the level
- made doors, which can also be used as lifts!
- improved efficiency of code
- made big level
- realised the need for a bigger level grid, and a 'centre level' option
- allowed island regions to be at the edge of a region, without drawing walls (no z-fighting)
- converted fort.level to new level code
- after an absolute mission of a coding session, we now have lifts!!
- realised that a stationary lift can be used to make walkways, so we can have fake multi-level stuff!
  (i.e. a bridge you can walk over and under!)
- controls for lifts: o p [ ]
  p (place platform)
  [ set current lift (the one you're standing above) minimum height to the height you are at
  ] set max height
  o make it start at the top instead of the bottom, press again to change this
- made editor display confirmation of save operation
- added IN_EDITOR and EDITOR_MESS_AROUND constants
  IN_EDITOR 0 will be used for the actual game
  When in editor (IN_EDITOR 1) then baddies will not move, and you won't be able to fire.
  However, for messing around set EDITOR_MESS_AROUND 1 and baddies will move when you press 'e' to turn
  off the map, and you'll also be able to fire.
- fixed bug where deleting in an empty space caused editor lines to disappear
- changed keys to actual characters instead of ASCII codes (d'oh!)
- textures should now be able to be other sizes other than 256x256 (see gluBuild2DMipmaps line - it was
  hard coding the image size, but now is reading it from tempTex)
- integrated gun class
- got it to change weapon when you press 1 or 2 (change to weapon 1 boxgun or 2 shotgun) when not in editor
- baddies sink into the ground when they die (did this ages ago but missed it out from changelog)
- slowed down baddies a lot, the side-stepping maniacs were too hard to kill!
- since to change textures you need to point at a wall/floor/ceiling, it became necessary to be able to look
  up and down in editor mode. So the controls have now been 'improved' slightly. Page up and down look up and
  down. However, if you hold ctrl first, they raise/lower the floor, if you hold shift they raise/lower the ceiling
  and if you hold ctrl+shift then they raise/lower the floor and ceiling.
- made it so you can use a texture name instead of a number, although surfaces just use numbers cos they only
  need to cycle through them. Useful for baddies. Useage:
    void Baddie::draw(const TextureManager &texMan)
      string texName = "robosoldier";
      int texId = texMan.getId(texName);
      if (texId > -1) glBindTexture(GL_TEXTURE_2D, texId);
      else cerr << "Texture not found: " << texName << endl;
- finished up reorganising
- made walls so you can change their textures
- disabled baddie movement when editor is active
- implemented it so that when you fire at a wall in editor mode it changes the texture
- made it load and save wall textures along with the level
- fixed a bullet collision with floor bug
- made it so you can change floor/ceiling textures, and load/save these with level
- stopped showing bullet when it's for changing textures
- speeded it up so texture change is 'instant'
- you can now change textures by pointing at a surface and pressing 'f' or 'g' to cycle
  forward or backward through textures respectively.
- can place baddies when in editor mode by pressing 'b'
- baddies now fire towards you if you're a different height
- reorganised everything so player has control, and objects communicate using reference parameters
- made it so you can delete a region by walking to it and double pressing 'd'
- increased draw distance
- made it so sky is saved/loaded
- bullets now hit ceiling correctly
- fixed 'corner of death' (one of the corners made things go haywire - turned out it was because of a division
  by zero in one of the normal calculations)
- removed unnecessary sqrts in
- added baddie ai to make it sidestep when it gets within a certain range. Looks cool!
- added a baddie texture to make it look like this weird llama type creature!
- noted problem with plain shaded stuff - always make sure you disable GL_TEXTURE_2D before
  drawing plain stuff cos otherwise the last texture used will influence colour.
- fixed bug that let you fly in example level - set pointHeights to oldPointHeights upon hit
- finally got it to look completely up and down by manually rotating an invisible 'lookAt' point
  around in 3D space as you move the mouse
- got bullets to fire up and down - no floor or ceiling collision yet though
- disabled editor controls when editor is deactivated (except left 'c' there for messing around)
- turned off the editor map/grid when editor is deactivated
- made it so left mouse button fires when editor is deactivated
- locked angleX to -90 - 90 in Pawn::turn()
- stopped it hopping when you look up and walk forward
- attempted to make it so you can look up and down vertically, although this is still not ideal
- moved translate to 'raise the camera' to after the perspective calculations so that you don't look
  down through walls
- put perspective back to normal for now (see gluPerspective - the aspect ratio was 1.2 to make things
  feel further away, but people may think this is a mistake so back to 1.0 for now)
- noted bug that level editor doesn't save whether regions are sky (no roof) or not. Will consider
  looking into object serialization and how to use it in C++ as this would make saving everything easier
- hidden mouse pointer when not in editor mode
- added crosshair
- fixed editor lighting bug - cheers Ben
- added Gun
- removed depth testing on gun to stop it going through walls
- cut down bullet move method to check collision on just one point
- added texture manager
- implemented two textures
- made a more complex level
- realised the need for island regions
- made bullets actually come from the gun, instead of centre of screen
- adjusted perspective to make things seem slightly further away and more spaced out
  (also hopefully making bullets look squarer, because they are!)
- improved editor so you no longer have to draw regions from the top left
  (but you still need to draw the points in a clockwise order)
- noticed gun seems to change colour when wall textures are resized! Not sure why
- made wall textures not use the whole texture if wall is thin (so texture doesn't appear so squashed)
- applied same principle to floor and ceiling textures, noting that it doesn't work for diagonals
- sorted it so you can make 'islands' within regions (but not pits)
- implemented mouse look! Press e to activate/deactivate editor (this will soon diable editor grid and controls)
  when editor is not active mouse look and strafe come into play!
- sorted out mipmapping for textures. Now runs a lot faster! Happy!
- improved handling by making accel and decel linear and increasing turn speed
- attempted to make walls feel less 'sticky' and more solid by penalising speed more upon a hit
- made a baddie with simple ai to turn slowly and follow player around
- put collision and other stuff in a pawn object
- added bullets
- added textures
- fixed loads of collision bugs (to do with ceiling joins, corners, setting ground value in more than one place)