make
./vik [file.map]
./vik maze.map
An amazing use of the X libraries with twisty code passages, all different. One
risks running in code path circles as main()
is called again and again. Be
sure to pay attention to commas! :-)
This entry is a Wolfenstein style graphics engine where a user can navigate in a 3D world. The maze has walls with bitmap textures. The application contains a default world with textures, but the power of the engine is exposed through user configured maps. User defined worlds support up to 26 different wall textures that can even be animated. One example of a user defined world is submitted with the entry.
This program is a complete 3D engine with
Compile the source code and link in X libraries if necessary. The program takes three options which have to be typed in a specific order as described below.
./vik [-w <width>] [mapfile]
where:
width - Specifies the width of the window
mapfile - Filename containing a map
Start the engine using a built in labyrinth and texture bitmaps:
./vik
Start the engine and loads the labyrinth defined in the file maze.map:
./vik maze.map
Start the engine using maze.map in a window that is 400 pixels wide:
./vik -w 400 maze.map
Note that the mapfile
has to be the last argument and the -w
option if present
has to be the first. The map definition files and the bitmap files should be
located in the current directory.
Use the cursor keys to navigate through the labyrinth.
A maze consists of a map file and texture bitmap files. The map file is an
ASCII text file where lower case letters represent walls. The letter tells the
engine what bitmap texture file to use. The *
character lets the engine know
where to position the user. The example below shows how a map file can look:
aaaaaaaaaaaaa
a a
a * a
a bbbb cccccccc
c c
cccccccccccccccccccc
The engine loads the map, and creates walls. When a character in the range a-z
is found, the engine will load the corresponding texture bitmap. The bitmap file
must be named *.bmp
where *
is substituted with the letter of the wall in
the map (note that only a
, b
and c
exist).
So to load the map above, the files a.bmp
, b.bmp
, and c.bmp
should be
located in the same directory as the engine executable (or rather in the
current directory).
The program is obfuscated in several ways:
?
operator.main()
.for
loops and the comma operator.There are no compiler warnings when compiling with -ansi
but there are quite
a few warnings from lclint
. Mainly because the program is very optimized for
code size.
The program only compiles and runs on X based systems.
The program does not run that smooth under Cygwin. It seems to be a priority issue with Cygwin and it can easily be solved by increasing the priority of the application a little bit.