
#define WIDTH 160
#define HEIGHT 100
#define DEPTH 8
#define SIZE WIDTH*HEIGHT
#define BPLSIZE SIZE/DEPTH



#define NULL   0

#define GFX_POLYGON      1
#define GFX_FRAME        2
#define GFX_ENVIRONMENT  3
#define GFX_OBJECT       4
#define GFX_CAMERA       5
#define GFX_SHADETABLE   6

#define GFX_NONE   0

#define GFX_FILL_SHADING      0
#define GFX_FLAT_SHADING      1
#define GFX_DEPTH_CUEING      2
#define GFX_DEPTH_SHADING     2



/******************/
/*                */
/* STRUTTURE DATI */
/*                */
/******************/

#define MEMF_PUBLIC  0x00001
#define MEMF_CHIP    0x00002
#define MEMF_FAST    0x00004
#define MEMF_CLEAR   0x10000
#define MEMF_LARGEST 0x20000

typedef struct BitMap
{
   short BytesPerRow;
   short Rows;
   char Flags;
   char Depth;
   short Pad;
   void * Planes[8];
} BitMap;

typedef struct NewScreen
{
   short LeftEdge, TopEdge;
   short Width, Height;
   short Depth;
   char DetailPen, BlockPen;
   short ViewModes;
   short Type;
   void * Font;
   char * DefaultTitle;
   void * Gadgets;
   struct BitMap * CustomBitMap;
} NewScreen;

#define SCREENTYPE   0x0F
#define WBENCHSCREEN 0x01
#define PUBLICSCREEN 0x02
#define CUSTOMSCREEN 0x0F
#define SHOWTITLE    0x10
#define BEEPING      0x20
#define CUSTOMBITMAP 0x40

typedef struct rl_RGB
{
   unsigned char Red, Green, Blue;
   char paddle;
} rl_RGB;



/***************/
/*             */
/*  PROTOTIPI  */
/*             */
/***************/

unsigned long ReadJoystick( unsigned long joynum );
long ReadDeltaXMouse (unsigned long portnum);
long ReadDeltaYMouse (unsigned long portnum);
void * BuildFrame( short *points, short *polygons, long scale, long offset );



/***********************/
/*                     */
/*  VARIABILI GLOBALI  */
/*                     */
/***********************/

long total=0;



/*************************/
/*                       */
/*  FUNZIONE PRINCIPALE  */
/*                       */
/*************************/

void * GfxBase;
void * IntuitionBase;
void * GfX3dBase;

struct BitMap MyBitMap;
struct NewScreen MyNewScreen = {
   0, 0, WIDTH, HEIGHT, DEPTH,
   1, 0,
   0,
   CUSTOMSCREEN | CUSTOMBITMAP,
   0,
   "GfX3d shared library v2.1 ©1998",
   0,
   NULL
};
void * MyScreen;
unsigned long *View;
unsigned long ViewPort;
void * memptr;
long trigonometry;
void *polygon, *frame, *object, *env, *cam;
void *groundenv, *groundcam;

unsigned long RGB32[] =
{
   0x01000000,0x00000000,0x00000000,0x00000000,0xa0a0a0a0,0xa0a0a0a0,
   0xa0a0a0a0,0x00000000,0xaaaaaaaa,0x00000000,0x00000000,0xaaaaaaaa,
   0xaaaaaaaa,0xaaaaaaaa,0x00000000,0x00000000,0xaaaaaaaa,0x00000000,
   0xaaaaaaaa,0xaaaaaaaa,0x55555555,0x00000000,0xaaaaaaaa,0xaaaaaaaa,
   0xaaaaaaaa,0x55555555,0x55555555,0x55555555,0x55555555,0x55555555,
   0xffffffff,0x55555555,0xffffffff,0x55555555,0x55555555,0xffffffff,
   0xffffffff,0xffffffff,0x55555555,0x55555555,0xffffffff,0x55555555,
   0xffffffff,0xffffffff,0xffffffff,0x55555555,0xffffffff,0xffffffff,
   0xffffffff,0xefefefef,0xefefefef,0xefefefef,0xdfdfdfdf,0xdfdfdfdf,
   0xdfdfdfdf,0xd3d3d3d3,0xd3d3d3d3,0xd3d3d3d3,0xc3c3c3c3,0xc3c3c3c3,
   0xc3c3c3c3,0xb7b7b7b7,0xb7b7b7b7,0xb7b7b7b7,0xabababab,0xabababab,
   0xabababab,0x9b9b9b9b,0x9b9b9b9b,0x9b9b9b9b,0x8f8f8f8f,0x8f8f8f8f,
   0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f,0x7f7f7f7f,0x73737373,0x73737373,
   0x73737373,0x67676767,0x67676767,0x67676767,0x57575757,0x57575757,
   0x57575757,0x4b4b4b4b,0x4b4b4b4b,0x4b4b4b4b,0x3b3b3b3b,0x3b3b3b3b,
   0x3b3b3b3b,0x2f2f2f2f,0x2f2f2f2f,0x2f2f2f2f,0x23232323,0x23232323,
   0x23232323,0xffffffff,0x00000000,0x00000000,0xefefefef,0x00000000,
   0x00000000,0xe3e3e3e3,0x00000000,0x00000000,0xd7d7d7d7,0x00000000,
   0x00000000,0xcbcbcbcb,0x00000000,0x00000000,0xbfbfbfbf,0x00000000,
   0x00000000,0xb3b3b3b3,0x00000000,0x00000000,0xa7a7a7a7,0x00000000,
   0x00000000,0x9b9b9b9b,0x00000000,0x00000000,0x8b8b8b8b,0x00000000,
   0x00000000,0x7f7f7f7f,0x00000000,0x00000000,0x73737373,0x00000000,
   0x00000000,0x67676767,0x00000000,0x00000000,0x5b5b5b5b,0x00000000,
   0x00000000,0x4f4f4f4f,0x00000000,0x00000000,0x40404040,0x00000000,
   0x00000000,0xffffffff,0xdadadada,0xdadadada,0xffffffff,0xbabababa,
   0xbabababa,0xffffffff,0x9f9f9f9f,0x9f9f9f9f,0xffffffff,0x7f7f7f7f,
   0x7f7f7f7f,0xffffffff,0x5f5f5f5f,0x5f5f5f5f,0xffffffff,0x40404040,
   0x40404040,0xffffffff,0x20202020,0x20202020,0xffffffff,0x00000000,
   0x00000000,0xfcfcfcfc,0xa8a8a8a8,0x5c5c5c5c,0xfcfcfcfc,0x98989898,
   0x40404040,0xfcfcfcfc,0x88888888,0x20202020,0xfcfcfcfc,0x78787878,
   0x00000000,0xe4e4e4e4,0x6c6c6c6c,0x00000000,0xcccccccc,0x60606060,
   0x00000000,0xb4b4b4b4,0x54545454,0x00000000,0x9c9c9c9c,0x4c4c4c4c,
   0x00000000,0xfcfcfcfc,0xfcfcfcfc,0xd8d8d8d8,0xfcfcfcfc,0xfcfcfcfc,
   0xb8b8b8b8,0xfcfcfcfc,0xfcfcfcfc,0x9c9c9c9c,0xfcfcfcfc,0xfcfcfcfc,
   0x7c7c7c7c,0xfcfcfcfc,0xf8f8f8f8,0x5c5c5c5c,0xfcfcfcfc,0xf4f4f4f4,
   0x40404040,0xfcfcfcfc,0xf4f4f4f4,0x20202020,0xfcfcfcfc,0xf4f4f4f4,
   0x00000000,0xe4e4e4e4,0xd8d8d8d8,0x00000000,0xcccccccc,0xc4c4c4c4,
   0x00000000,0xb4b4b4b4,0xacacacac,0x00000000,0x9c9c9c9c,0x9c9c9c9c,
   0x00000000,0x84848484,0x84848484,0x00000000,0x70707070,0x6c6c6c6c,
   0x00000000,0x58585858,0x54545454,0x00000000,0x40404040,0x40404040,
   0x00000000,0xd0d0d0d0,0xfcfcfcfc,0x5c5c5c5c,0xc4c4c4c4,0xfcfcfcfc,
   0x40404040,0xb4b4b4b4,0xfcfcfcfc,0x20202020,0xa0a0a0a0,0xfcfcfcfc,
   0x00000000,0x90909090,0xe4e4e4e4,0x00000000,0x80808080,0xcccccccc,
   0x00000000,0x74747474,0xb4b4b4b4,0x00000000,0x60606060,0x9c9c9c9c,
   0x00000000,0xd8d8d8d8,0xfcfcfcfc,0xd8d8d8d8,0xbcbcbcbc,0xfcfcfcfc,
   0xb8b8b8b8,0x9c9c9c9c,0xfcfcfcfc,0x9c9c9c9c,0x80808080,0xfcfcfcfc,
   0x7c7c7c7c,0x60606060,0xfcfcfcfc,0x5c5c5c5c,0x40404040,0xfcfcfcfc,
   0x40404040,0x20202020,0xfcfcfcfc,0x20202020,0x00000000,0xfcfcfcfc,
   0x00000000,0x00000000,0xffffffff,0x00000000,0x00000000,0xefefefef,
   0x00000000,0x00000000,0xe3e3e3e3,0x00000000,0x00000000,0xd7d7d7d7,
   0x00000000,0x07070707,0xcbcbcbcb,0x00000000,0x07070707,0xbfbfbfbf,
   0x00000000,0x07070707,0xb3b3b3b3,0x00000000,0x07070707,0xa7a7a7a7,
   0x00000000,0x07070707,0x9b9b9b9b,0x00000000,0x07070707,0x8b8b8b8b,
   0x00000000,0x07070707,0x7f7f7f7f,0x00000000,0x07070707,0x73737373,
   0x00000000,0x07070707,0x67676767,0x00000000,0x07070707,0x5b5b5b5b,
   0x00000000,0x07070707,0x4f4f4f4f,0x00000000,0x04040404,0x40404040,
   0x00000000,0xdadadada,0xffffffff,0xffffffff,0xb8b8b8b8,0xfcfcfcfc,
   0xfcfcfcfc,0x9c9c9c9c,0xfcfcfcfc,0xfcfcfcfc,0x7c7c7c7c,0xfcfcfcfc,
   0xf8f8f8f8,0x5c5c5c5c,0xfcfcfcfc,0xfcfcfcfc,0x40404040,0xfcfcfcfc,
   0xfcfcfcfc,0x20202020,0xfcfcfcfc,0xfcfcfcfc,0x00000000,0xfcfcfcfc,
   0xfcfcfcfc,0x00000000,0xe4e4e4e4,0xe4e4e4e4,0x00000000,0xcccccccc,
   0xcccccccc,0x00000000,0xb4b4b4b4,0xb4b4b4b4,0x00000000,0x9c9c9c9c,
   0x9c9c9c9c,0x00000000,0x84848484,0x84848484,0x00000000,0x70707070,
   0x70707070,0x00000000,0x58585858,0x58585858,0x00000000,0x40404040,
   0x40404040,0x5c5c5c5c,0xbcbcbcbc,0xfcfcfcfc,0x40404040,0xb0b0b0b0,
   0xfcfcfcfc,0x20202020,0xa8a8a8a8,0xfcfcfcfc,0x00000000,0x9c9c9c9c,
   0xfcfcfcfc,0x00000000,0x8c8c8c8c,0xe4e4e4e4,0x00000000,0x7c7c7c7c,
   0xcccccccc,0x00000000,0x6c6c6c6c,0xb4b4b4b4,0x00000000,0x5c5c5c5c,
   0x9c9c9c9c,0xdadadada,0xdadadada,0xffffffff,0xbabababa,0xbfbfbfbf,
   0xffffffff,0x9f9f9f9f,0x9f9f9f9f,0xffffffff,0x7f7f7f7f,0x80808080,
   0xffffffff,0x5f5f5f5f,0x60606060,0xffffffff,0x40404040,0x40404040,
   0xffffffff,0x20202020,0x25252525,0xffffffff,0x00000000,0x05050505,
   0xffffffff,0x00000000,0x00000000,0xffffffff,0x00000000,0x00000000,
   0xefefefef,0x00000000,0x00000000,0xe3e3e3e3,0x00000000,0x00000000,
   0xd7d7d7d7,0x00000000,0x00000000,0xcbcbcbcb,0x00000000,0x00000000,
   0xbfbfbfbf,0x00000000,0x00000000,0xb3b3b3b3,0x00000000,0x00000000,
   0xa7a7a7a7,0x00000000,0x00000000,0x9b9b9b9b,0x00000000,0x00000000,
   0x8b8b8b8b,0x00000000,0x00000000,0x7f7f7f7f,0x00000000,0x00000000,
   0x73737373,0x00000000,0x00000000,0x67676767,0x00000000,0x00000000,
   0x5b5b5b5b,0x00000000,0x00000000,0x4f4f4f4f,0x00000000,0x00000000,
   0x40404040,0xf0f0f0f0,0xdadadada,0xffffffff,0xe5e5e5e5,0xbabababa,
   0xffffffff,0xdadadada,0x9f9f9f9f,0xffffffff,0xd0d0d0d0,0x7f7f7f7f,
   0xffffffff,0xcacacaca,0x5f5f5f5f,0xffffffff,0xbfbfbfbf,0x40404040,
   0xffffffff,0xb5b5b5b5,0x20202020,0xffffffff,0xaaaaaaaa,0x00000000,
   0xffffffff,0x9a9a9a9a,0x00000000,0xe5e5e5e5,0x80808080,0x00000000,
   0xcfcfcfcf,0x75757575,0x00000000,0xb5b5b5b5,0x60606060,0x00000000,
   0x9f9f9f9f,0x50505050,0x00000000,0x85858585,0x45454545,0x00000000,
   0x70707070,0x35353535,0x00000000,0x5a5a5a5a,0x2a2a2a2a,0x00000000,
   0x40404040,0xffffffff,0xdadadada,0xffffffff,0xffffffff,0xbabababa,
   0xffffffff,0xffffffff,0x9f9f9f9f,0xffffffff,0xffffffff,0x7f7f7f7f,
   0xffffffff,0xffffffff,0x5f5f5f5f,0xffffffff,0xffffffff,0x40404040,
   0xffffffff,0xffffffff,0x20202020,0xffffffff,0xffffffff,0x00000000,
   0xffffffff,0xe0e0e0e0,0x00000000,0xe5e5e5e5,0xcacacaca,0x00000000,
   0xcfcfcfcf,0xb5b5b5b5,0x00000000,0xb5b5b5b5,0x9f9f9f9f,0x00000000,
   0x9f9f9f9f,0x85858585,0x00000000,0x85858585,0x6f6f6f6f,0x00000000,
   0x70707070,0x5a5a5a5a,0x00000000,0x5a5a5a5a,0x40404040,0x00000000,
   0x40404040,0xffffffff,0xe9e9e9e9,0xdededede,0xf7f7f7f7,0xdddddddd,
   0xd0d0d0d0,0xf0f0f0f0,0xd1d1d1d1,0xc3c3c3c3,0xe9e9e9e9,0xc7c7c7c7,
   0xb7b7b7b7,0xe1e1e1e1,0xbabababa,0xaaaaaaaa,0xdadadada,0xb0b0b0b0,
   0x9e9e9e9e,0xd3d3d3d3,0xa4a4a4a4,0x94949494,0xcccccccc,0x9b9b9b9b,
   0x89898989,0xc5c5c5c5,0x90909090,0x80808080,0xbebebebe,0x86868686,
   0x76767676,0xb6b6b6b6,0x7c7c7c7c,0x6b6b6b6b,0xafafafaf,0x73737373,
   0x63636363,0xa8a8a8a8,0x6b6b6b6b,0x5a5a5a5a,0xa1a1a1a1,0x61616161,
   0x52525252,0x9a9a9a9a,0x59595959,0x4a4a4a4a,0x93939393,0x50505050,
   0x43434343,0x8b8b8b8b,0x48484848,0x3b3b3b3b,0x84848484,0x3f3f3f3f,
   0x34343434,0x7e7e7e7e,0x39393939,0x2e2e2e2e,0x77777777,0x31313131,
   0x28282828,0x70707070,0x2c2c2c2c,0x23232323,0x69696969,0x26262626,
   0x1d1d1d1d,0x61616161,0x1f1f1f1f,0x18181818,0x5a5a5a5a,0x1b1b1b1b,
   0x14141414,0x53535353,0x15151515,0x10101010,0x4c4c4c4c,0x11111111,
   0x0d0d0d0d,0x45454545,0x0c0c0c0c,0x09090909,0x3e3e3e3e,0x09090909,
   0x07070707,0x36363636,0x05050505,0x04040404,0x2f2f2f2f,0x03030303,
   0x02020202,0x28282828,0x01010101,0x01010101,0x21212121,0x00000000,
   0x00000000,0xffffffff,0x58585858,0x58585858,0xffffffff,0xbebebebe,
   0x80808080,0xffffffff,0xfefefefe,0x82828282,0x82828282,0xffffffff,
   0x84848484,0x80808080,0xffffffff,0xffffffff,0x80808080,0x80808080,
   0xffffffff,0xbfbfbfbf,0x80808080,0xffffffff,0xfefefefe,0x80808080,
   0xffffffff,0xc7c7c7c7,0x2b2b2b2b,0x2b2b2b2b,0xc7c7c7c7,0x4f4f4f4f,
   0x2b2b2b2b,0xc7c7c7c7,0x77777777,0x2b2b2b2b,0xc7c7c7c7,0x9f9f9f9f,
   0x2b2b2b2b,0xc7c7c7c7,0xc7c7c7c7,0x2b2b2b2b,0x9f9f9f9f,0xc7c7c7c7,
   0x2b2b2b2b,0x77777777,0xc7c7c7c7,0x2b2b2b2b,0x4f4f4f4f,0xc7c7c7c7,
   0x2b2b2b2b,0x2b2b2b2b,0xc7c7c7c7,0x33333333,0x2b2b2b2b,0xc7c7c7c7,
   0x5f5f5f5f,0x2b2b2b2b,0xc7c7c7c7,0x8b8b8b8b,0x2b2b2b2b,0xc7c7c7c7,
   0xb7b7b7b7,0x2b2b2b2b,0xabababab,0xc7c7c7c7,0x2b2b2b2b,0x7f7f7f7f,
   0xc7c7c7c7,0x2b2b2b2b,0x53535353,0xc7c7c7c7,0x2f2f2f2f,0x2b2b2b2b,
   0xc7c7c7c7,0x5b5b5b5b,0x2b2b2b2b,0xc7c7c7c7,0x87878787,0x2b2b2b2b,
   0xc7c7c7c7,0xb3b3b3b3,0x2b2b2b2b,0xc7c7c7c7,0xc7c7c7c7,0x2b2b2b2b,
   0xafafafaf,0xc7c7c7c7,0x2b2b2b2b,0x83838383,0xc7c7c7c7,0x2b2b2b2b,
   0x57575757,0xc7c7c7c7,0x2b2b2b2b,0x2b2b2b2b,0xffffffff,0xffffffff,
   0xffffffff,0x00000000,
};
unsigned long RGB8bit[] =
{
   0x00c7ffff,0x00a0a0a0,0x0000aa00,0x0000aaaa,0x00aa0000,0x00aa00aa,
   0x00aa5500,0x00aaaaaa,0x00555555,0x005555ff,0x0055ff55,0x0055ffff,
   0x00ff5555,0x00ff55ff,0x00ffff55,0x00ffffff,0x00efefef,0x00dfdfdf,
   0x00d3d3d3,0x00c3c3c3,0x00b7b7b7,0x00ababab,0x009b9b9b,0x008f8f8f,
   0x007f7f7f,0x00737373,0x00676767,0x00575757,0x004b4b4b,0x003b3b3b,
   0x002f2f2f,0x00232323,0x00ff0000,0x00ef0000,0x00e30000,0x00d70000,
   0x00cb0000,0x00bf0000,0x00b30000,0x00a70000,0x009b0000,0x008b0000,
   0x007f0000,0x00730000,0x00670000,0x005b0000,0x004f0000,0x00400000,
   0x00ffdada,0x00ffbaba,0x00ff9f9f,0x00ff7f7f,0x00ff5f5f,0x00ff4040,
   0x00ff2020,0x00ff0000,0x00fca85c,0x00fc9840,0x00fc8820,0x00fc7800,
   0x00e46c00,0x00cc6000,0x00b45400,0x009c4c00,0x00fcfcd8,0x00fcfcb8,
   0x00fcfc9c,0x00fcfc7c,0x00fcf85c,0x00fcf440,0x00fcf420,0x00fcf400,
   0x00e4d800,0x00ccc400,0x00b4ac00,0x009c9c00,0x00848400,0x00706c00,
   0x00585400,0x00404000,0x00d0fc5c,0x00c4fc40,0x00b4fc20,0x00a0fc00,
   0x0090e400,0x0080cc00,0x0074b400,0x00609c00,0x00d8fcd8,0x00bcfcb8,
   0x009cfc9c,0x0080fc7c,0x0060fc5c,0x0040fc40,0x0020fc20,0x0000fc00,
   0x0000ff00,0x0000ef00,0x0000e300,0x0000d700,0x0007cb00,0x0007bf00,
   0x0007b300,0x0007a700,0x00079b00,0x00078b00,0x00077f00,0x00077300,
   0x00076700,0x00075b00,0x00074f00,0x00044000,0x00daffff,0x00b8fcfc,
   0x009cfcfc,0x007cfcf8,0x005cfcfc,0x0040fcfc,0x0020fcfc,0x0000fcfc,
   0x0000e4e4,0x0000cccc,0x0000b4b4,0x00009c9c,0x00008484,0x00007070,
   0x00005858,0x00004040,0x005cbcfc,0x0040b0fc,0x0020a8fc,0x00009cfc,
   0x00008ce4,0x00007ccc,0x00006cb4,0x00005c9c,0x00dadaff,0x00babfff,
   0x009f9fff,0x007f80ff,0x005f60ff,0x004040ff,0x002025ff,0x000005ff,
   0x000000ff,0x000000ef,0x000000e3,0x000000d7,0x000000cb,0x000000bf,
   0x000000b3,0x000000a7,0x0000009b,0x0000008b,0x0000007f,0x00000073,
   0x00000067,0x0000005b,0x0000004f,0x00000040,0x00f0daff,0x00e5baff,
   0x00da9fff,0x00d07fff,0x00ca5fff,0x00bf40ff,0x00b520ff,0x00aa00ff,
   0x009a00e5,0x008000cf,0x007500b5,0x0060009f,0x00500085,0x00450070,
   0x0035005a,0x002a0040,0x00ffdaff,0x00ffbaff,0x00ff9fff,0x00ff7fff,
   0x00ff5fff,0x00ff40ff,0x00ff20ff,0x00ff00ff,0x00e000e5,0x00ca00cf,
   0x00b500b5,0x009f009f,0x00850085,0x006f0070,0x005a005a,0x00400040,
   0x00ffe9de,0x00f7ddd0,0x00f0d1c3,0x00e9c7b7,0x00e1baaa,0x00dab09e,
   0x00d3a494,0x00cc9b89,0x00c59080,0x00be8676,0x00b67c6b,0x00af7363,
   0x00a86b5a,0x00a16152,0x009a594a,0x00935043,0x008b483b,0x00843f34,
   0x007e392e,0x00773128,0x00702c23,0x0069261d,0x00611f18,0x005a1b14,
   0x00531510,0x004c110d,0x00450c09,0x003e0907,0x00360504,0x002f0302,
   0x00280101,0x00210000,0x00ff5858,0x00ffbe80,0x00fffe82,0x0082ff84,
   0x0080ffff,0x008080ff,0x00bf80ff,0x00fe80ff,0x00c72b2b,0x00c74f2b,
   0x00c7772b,0x00c79f2b,0x00c7c72b,0x009fc72b,0x0077c72b,0x004fc72b,
   0x002bc733,0x002bc75f,0x002bc78b,0x002bc7b7,0x002babc7,0x002b7fc7,
   0x002b53c7,0x002f2bc7,0x005b2bc7,0x00872bc7,0x00b32bc7,0x00c72baf,
   0x00c72b83,0x00c72b57,0x00c72b2b,0x00000000
};
struct rl_RGB palette[256];

short ground_points[] =
{
   2, 0, 0,   1, 0, 0,   1, 0, -1,   2, 0, -1,   1, 0, -2,   2, 0, -2, 
   0, 0, -1,  -1, 0, -1, -1, 0, -2,  0, 0, -2,   0, 0, 0,    -1, 0, 0, 
   -2, 0, 0,  -2, 0, -1, -2, 0, -2,  1, 0, 2,    0, 0, 2,    0, 0, 1, 
   1, 0, 1,   -1, 0, 1,  -2, 0, 1,   -1, 0, 2,   -2, 0, 2,   2, 0, 1, 
   2, 0, 2 
};

short ground_poly[] =
{
   16,
   4, 3, 2, 1, 0, 2,     4, 5, 4, 2, 3, 2,     4, 9, 8, 7, 6, 2,
   4, 6, 7, 11, 10, 2,   4, 7, 13, 12, 11, 2,  4, 8, 14, 13, 7, 2,
   4, 4, 9, 6, 2, 2,     4, 2, 6, 10, 1, 2,    4, 18, 17, 16, 15, 2,
   4, 1, 10, 17, 18, 2,  4, 11, 12, 20, 19, 2, 4, 19, 20, 22, 21, 2,
   4, 17, 19, 21, 16, 2, 4, 10, 11, 19, 17, 2, 4, 0, 1, 18, 23, 2,
   4, 23, 18, 15, 24, 2
};

short pino_points[] =
{
   8, 84, 8,    16, 74, 16,    18, 62, 18,    16, 50, 16,    4, 40, 4,
   10, 86, 2,   22, 74, 0,     26, 64, 0,     22, 48, -2,    4, 40, 0,
   10, 84, -8,  14, 76, -14,   18, 64, -18,   14, 48, -16,   4, 40, -4,
   -2, 86, -10, 2, 74, -20,    -2, 60, -24,   0, 50, -20,    0, 40, -4,
   -8, 84, -8,  -14, 74, -16,  -18, 62, -18,  -16, 50, -16,  -4, 40, -4,
   -12, 84, 0,  -22, 74, -2,   -24, 62, -2,   -20, 48, -2,   -4, 40, 0,
   -8, 84, 6,   -16, 72, 14,   -18, 62, 18,   -16, 50, 18,   -4, 40, 4,
   0, 88, 0,    2, 82, 12,     0, 74, 22,     2, 62, 26,     2, 48, 20,
   0, 40, 4,    4, 20, 4,      4, 0, 4,       6, 20, 0,      6, 0, 0,
   4, 20, -4,   4, 0, -4,      0, 20, -6,     0, 0, -6,      -4, 20, -4,
   -4, 0, -4,   -4, 20, 0,     -6, 0, 0,      -4, 20, 4,     -4, 0, 4,
   0, 20, 4,    0, 0, 6
};

short pino_poly[] =
{
   56,
   3, 36, 0, 35, 10,        4, 37, 1, 0, 36, 10,     4, 38, 2, 1, 37, 10,
   4, 39, 3, 2, 38, 10,     4, 40, 4, 3, 39, 10,     3, 0, 5, 35, 10,
   4, 1, 6, 5, 0, 10,       4, 2, 7, 6, 1, 10,       4, 3, 8, 7, 2, 10,
   4, 4, 9, 8, 3, 10,       3, 5, 10, 35, 10,        4, 6, 11, 10, 5, 10,
   4, 7, 12, 11, 6, 10,     4, 8, 13, 12, 7, 10,     4, 9, 14, 13, 8, 10,
   3, 10, 15, 35, 10,       4, 11, 16, 15, 10, 10,   4, 12, 17, 16, 11, 10,
   4, 13, 18, 17, 12, 10,   4, 14, 19, 18, 13, 10,   3, 15, 20, 35, 10,
   4, 16, 21, 20, 15, 10,   4, 17, 22, 21, 16, 10,   4, 18, 23, 22, 17, 10,
   4, 19, 24, 23, 18, 10,   3, 20, 25, 35, 10,       4, 21, 26, 25, 20, 10,
   4, 22, 27, 26, 21, 10,   4, 23, 28, 27, 22, 10,   4, 24, 29, 28, 23, 10,
   3, 25, 30, 35, 10,       4, 26, 31, 30, 25, 10,   4, 27, 32, 31, 26, 10,
   4, 28, 33, 32, 27, 10,   4, 29, 34, 33, 28, 10,   3, 30, 36, 35, 10,
   4, 31, 37, 36, 30, 10,   4, 32, 38, 37, 31, 10,   4, 33, 39, 38, 32, 10,
   4, 34, 40, 39, 33, 10,   4, 55, 41, 4, 40, 6,     4, 56, 42, 41, 55, 6,
   4, 41, 43, 9, 4, 6,      4, 42, 44, 43, 41, 6,    4, 43, 45, 14, 9, 6,
   4, 44, 46, 45, 43, 6,    4, 45, 47, 19, 14, 6,    4, 46, 48, 47, 45, 6,
   4, 47, 49, 24, 19, 6,    4, 48, 50, 49, 47, 6,    4, 49, 51, 29, 24, 6,
   4, 50, 52, 51, 49, 6,    4, 51, 53, 34, 29, 6,    4, 52, 54, 53, 51, 6,
   4, 53, 55, 40, 34, 6,    4, 54, 56, 55, 53, 6
};

short cartello_points[] =
{
   2, 8, 0,    3, 0, 0,    -1, 0, 0,    -2, 8, 0,    10, 9, 0,
   9, 18, 0,   -11, 16, 0, -10, 7, 0
};

short cartello_poly[] =
{
   4,
   4, 3, 2, 1, 0, 6,  4, 3, 0, 1, 2, 6,  4, 4, 5, 6, 7, 14,  4, 4, 7, 6, 5, 14
};

short pozzo_points[] =
{
   3, 13, -1,   3, 13, 1,   3, 6, 1,   3, 6, -1,   -3, 13, -1,   -3, 13, 1, 
   -3, 6, 1,    -3, 6, -1,  -6, 12, 6, 6, 12, 6,   -6, 12, -6,   6, 12, -6, 
   6, 15, 0,    -6, 15, 0,  3, 0, -3,  3, 0, 3,    -3, 0, 3,     -3, 0, -3, 
   3, 6, -3,    3, 6, 3,    -3, 6, 3,  -3, 6, -3,  -5, 6, 5,     5, 6, 5, 
   5, 6, -5,    -5, 6, -5,  -5, 5, 5,  5, 5, 5,    5, 5, -5,     -5, 5, -5, 
   4, 5, -4,    -4, 5, -4,  -4, 5, 4,  4, 5, 4,    5, 0, -5,     -5, 0, -5, 
   -5, 0, 5,    5, 0, 5
};

short pozzo_poly[] =
{
   25,
   4, 3, 2, 1, 0, 6,   4, 3, 0, 1, 2, 6,       4, 7, 6, 5, 4, 6,
   4, 7, 4, 5, 6, 6,   4, 12, 13, 10, 11, 6,   4, 12, 11, 10, 13, 6,
   4, 13, 8, 9, 12, 6, 4, 13, 12, 9, 8, 6,     4, 15, 16, 20, 19, 5,
   4, 14, 18, 21, 17, 5,   4, 14, 15, 19, 18, 5,   4, 17, 21, 20, 16, 5,
   4, 14, 17, 16, 15, 255, 4, 23, 19, 20, 22, 15,  4, 24, 18, 19, 23, 15,
   4, 25, 21, 18, 24, 15,  4, 25, 22, 20, 21, 15,  4, 24, 28, 29, 25, 15,
   4, 26, 27, 23, 22, 15,  4, 22, 25, 29, 26, 15,  4, 28, 24, 23, 27, 15,
   4, 34, 35, 31, 30, 7,   4, 32, 31, 35, 36, 7,   4, 37, 34, 30, 33, 7,
   4, 36, 37, 33, 32, 7
};

short bat_points[] =
{
   39, -6, -8, 30, -10, -8, 49, -9, -8, 46, 12, -4, 41, 3, -8, 30, 6, -8,
   30, 25, -2, 15, 5, -6, -41, 3, -8, -30, 6, -8, -30, -10, -8, -39, -6, -8,
   -49, -9, -8, -46, 12, -4, -30, 25, -2, -15, 5, -6, -13, 12, -5, -18, 0, -8,
   -13, -12, -5, -13, 12, 5, -18, 0, 8, -13, -12, 5, -5, 12, 13, -8, 0, 18,
   -5, -12, 13, 5, 12, 13, 8, 0, 18, 5, -12, 13, 13, 12, 5, 18, 0, 8,
   13, -12, 5, 13, 12, -5, 18, 0, -8, 13, -12, -5, 5, 12, -13, 8, 0, -18,
   5, -12, -13, 0, 18, 0, -5, 12, -13, -8, 0, -18, -5, -12, -13, 0, -18, 0,
   0, 15, 8, 0, 5, 8, 3, 15, 18, 3, 5, 18, 13, 15, 18, 13, 5, 18, 16, 15, 8,
   16, 5, 8, 8, 20, 11, 8, 15, 2, 8, 5, 2, 8, 0, 11, -16, 15, 8, -16, 5, 8,
   -13, 15, 18, -13, 5, 18, -3, 15, 18, -3, 5, 18, -8, 20, 11, -8, 15, 2,
   -8, 5, 2, -8, 0, 11
};

short bat_poly[] =
{
  90,
   3, 6, 3, 4, 4,   3, 6, 4, 5, 4,   3, 6, 4, 3, 4,   3, 6, 5, 4, 4,
   3, 0, 4, 2, 4,   3, 5, 4, 0, 4,   3, 5, 0, 1, 4,   3, 7, 5, 1, 4,
   3, 0, 2, 4, 4,   3, 5, 0, 4, 4,   3, 5, 1, 0, 4,   3, 7, 1, 5, 4,
   3, 4, 3, 2, 4,   3, 7, 6, 5, 4,   3, 4, 2, 3, 4,   3, 7, 5, 6, 4,
   3, 42, 61, 60, 15,  3, 63, 43, 59, 15,  4, 59, 43, 42, 58, 15,
   3, 58, 42, 60, 15,  3, 63, 59, 57, 15,  4, 57, 59, 58, 56, 255,
   3, 56, 58, 60, 15,  3, 63, 57, 55, 15,  4, 55, 57, 56, 54, 15,
   3, 54, 56, 60, 15,  3, 63, 55, 62, 15,  4, 62, 55, 54, 61, 15,
   3, 61, 54, 60, 15,  3, 53, 52, 49, 15,  4, 49, 52, 51, 48, 15,
   3, 48, 51, 50, 15,  3, 53, 49, 47, 15,  4, 47, 49, 48, 46, 15,
   3, 46, 48, 50, 15,  3, 53, 47, 45, 15,  4, 45, 47, 46, 44, 255,
   3, 44, 46, 50, 15,  3, 53, 45, 43, 15,  4, 43, 45, 44, 42, 15,
   3, 42, 44, 50, 15,  3, 51, 42, 50, 15,  3, 41, 40, 36, 6,
   4, 36, 40, 39, 35, 6,  4, 35, 39, 38, 34, 6,  3, 34, 38, 37, 6,  3, 41, 36, 33, 6,
   4, 33, 36, 35, 32, 6,  4, 32, 35, 34, 31, 6,  3, 31, 34, 37, 6,  3, 41, 33, 30, 6,
   4, 30, 33, 32, 29, 6,  4, 29, 32, 31, 28, 6,  3, 28, 31, 37, 6,  3, 41, 30, 27, 6,
   4, 27, 30, 29, 26, 6,  4, 26, 29, 28, 25, 6,  3, 25, 28, 37, 6,  3, 41, 27, 24, 6,
   4, 24, 27, 26, 23, 6,  4, 23, 26, 25, 22, 6,  3, 22, 25, 37, 6,  3, 41, 24, 21, 6,
   4, 21, 24, 23, 20, 6,  4, 20, 23, 22, 19, 6,  3, 19, 22, 37, 6,  3, 41, 21, 18, 6,
   4, 18, 21, 20, 17, 6,  4, 17, 20, 19, 16, 6,  3, 16, 19, 37, 6,  3, 41, 18, 40, 6,
   4, 40, 18, 17, 39, 6,  4, 39, 17, 16, 38, 6,  3, 38, 16, 37, 6,  3, 15, 14, 9, 4,
   3, 8, 13, 12, 4,  3, 15, 9, 14, 4,  3, 8, 12, 13, 4,  3, 15, 9, 10, 4,
   3, 9, 11, 10, 4,  3, 9, 8, 11, 4,   3, 11, 8, 12, 4,  3, 15, 10, 9, 4,
   3, 9, 10, 11, 4,  3, 9, 11, 8, 4,   3, 11, 12, 8, 4,  3, 14, 8, 9, 4, 
   3, 14, 13, 8, 4,  3, 14, 9, 8, 4,   3, 14, 8, 13, 4
};

short cane_points[] =
{
   16, 5, 11,    8, 5, 11,    18, 0, 14,    6, 0, 14,    11, 0, 0,
   6, 0, -10,    18, 0, -10,  8, 5, -13,    16, 5, -13,  11, 0, -24,
   -16, 5, -13,  -8, 5, -13,  -18, 0, -10,  -6, 0, -10,  -11, 0, -24,
   -17, 39, 15,  -13, 37, 23, -8, 42, 14,   17, 39, 15,  13, 37, 23,
   8, 42, 14,    -8, 5, 11,   -16, 5, 11,   -11, 0, 0,   -6, 0, 14,
   -18, 0, 14,   0, 21, -31,  0, 30, -29,   8, 28, 0,    8, 23, 7,
   14, 13, 7,    6, 5, 7,     8, 3, 0,      17, 15, 1,   8, 3, -18,
   8, 28, -18,   17, 15, -20, 0, 16, -27,   -8, 28, -18, -8, 28, 0,
   -17, 15, -20, -17, 15, 1,  -8, 3, -18,   -8, 3, 0,    -8, 23, 7,
   -14, 13, 7,   -6, 5, 7,    0, 19, 34,    -4, 21, 35,  -13, 23, 25,
   -16, 23, 15,  -8, 23, 9,   -14, 13, 9,   -17, 13, 18, -6, 5, 9,
   -11, 10, 30,  -4, 11, 36,  -9, 5, 26,    0, 7, 33,    6, 5, 9,
   9, 5, 26,     14, 13, 9,   17, 13, 18,   4, 11, 36,   13, 23, 25,
   4, 21, 35,    11, 10, 30,  0, 23, 31,    0, 26, 35,   0, 33, 15,
   0, 23, 15,    3, 33, 25,   3, 23, 25,    13, 33, 25,  16, 33, 15,
   16, 23, 15,   8, 38, 18,   8, 33, 9,     8, 23, 9,    -16, 33, 15,
   -13, 33, 25,  -3, 33, 25,  -3, 23, 25,   -8, 38, 18,  -8, 33, 9
};

short cane_poly[] =
{
   109,
   3, 4, 1, 0, 6,     3, 4, 0, 2, 6,     3, 3, 1, 4, 6,    4, 3, 2, 0, 1, 6,
   3, 4, 2, 3, 6,     3, 9, 6, 5, 6,     4, 5, 6, 8, 7, 6, 3, 5, 7, 9, 6,
   3, 9, 8, 6, 6,     3, 9, 7, 8, 6,     3, 14, 10, 11, 6, 3, 14, 12, 10, 6,
   3, 13, 14, 11, 6,  4, 13, 11, 10, 12, 6,                3, 14, 13, 12, 6,
   3, 17, 16, 15, 6,  3, 17, 15, 16, 6,  3, 20, 19, 18, 6, 3, 20, 18, 19, 6,
   3, 23, 24, 25, 6,  4, 24, 21, 22, 25, 6,                3, 24, 23, 21, 6,
   3, 23, 25, 22, 6,  3, 23, 22, 21, 6,  3, 27, 26, 37, 6,
   3, 27, 37, 26, 6,  4, 43, 32, 31, 46, 6,                4, 39, 44, 29, 28, 6,
   4, 38, 39, 28, 35, 6,                 4, 42, 34, 32, 43, 6,
   3, 37, 38, 35, 6,  3, 37, 34, 42, 6,  4, 36, 35, 28, 33, 6,
   4, 36, 33, 32, 34, 6,                 4, 33, 28, 29, 30, 6,
   4, 33, 30, 31, 32, 6,                 3, 37, 36, 34, 6,
   3, 37, 35, 36, 6,  3, 37, 40, 38, 6,  3, 37, 42, 40, 6, 4, 41, 43, 46, 45, 6,
   4, 41, 45, 44, 39, 6, 4, 40, 42, 43, 41, 6,             4, 40, 41, 39, 38, 6,
   4, 78, 29, 44, 51, 14,                4, 30, 29, 78, 61, 14,
   4, 59, 31, 30, 61, 14,                4, 46, 31, 59, 54, 14,
   4, 45, 46, 54, 52, 14,                4, 44, 45, 52, 51, 14,
   3, 70, 78, 51, 6,  4, 54, 59, 60, 57, 6,                 3, 57, 60, 58, 6,
   3, 58, 63, 56, 6,  3, 56, 63, 47, 6,  3, 55, 48, 49, 6,  3, 55, 56, 48, 6,
   3, 56, 47, 48, 6,  3, 49, 53, 55, 6,  3, 53, 49, 50, 6,  3, 50, 52, 53, 6,
   3, 51, 52, 50, 6,  3, 57, 55, 53, 6,  3, 54, 53, 52, 6,  3, 54, 57, 53, 6,
   3, 56, 55, 57, 6,  3, 58, 56, 57, 6,  3, 58, 60, 63, 6,  3, 63, 60, 66, 6,
   3, 59, 62, 60, 6,  3, 59, 61, 62, 6,  3, 60, 62, 66, 6,  3, 78, 75, 61, 6,
   3, 75, 62, 61, 6,  3, 62, 75, 64, 6,  3, 64, 66, 62, 6,  3, 63, 65, 47, 6,
   3, 66, 65, 63, 6,  3, 66, 64, 65, 6,  3, 47, 65, 48, 6,  3, 48, 67, 49, 6,
   3, 67, 82, 49, 6,  3, 65, 64, 67, 6,  3, 67, 64, 72, 6,  3, 67, 72, 82, 6,
   3, 70, 82, 72, 6,  3, 65, 68, 48, 255,3, 65, 67, 68, 255,3, 67, 48, 68, 255,
   4, 70, 51, 84, 69, 6,    3, 69, 84, 83, 6,      4, 82, 70, 69, 81, 15,
   3, 81, 69, 83, 15,       4, 49, 82, 81, 80, 255,3, 80, 81, 83, 15,
   4, 50, 49, 80, 79, 15,   3, 79, 80, 83, 15,     4, 51, 50, 79, 84, 6,
   3, 84, 79, 83, 6,        4, 75, 78, 77, 74, 6,  3, 74, 77, 76, 6,
   4, 64, 75, 74, 73, 15,   3, 73, 74, 76, 15,     4, 72, 64, 73, 71, 255,
   3, 71, 73, 76, 15,       4, 70, 72, 71, 69, 15, 3, 69, 71, 76, 15,
   4, 78, 70, 69, 77, 6,    3, 77, 69, 76, 6
};

short player_points[] =
{
   9, -20, 8,    4, -20, 10,    5, -20, -5,    5, -4, -4,    5, -6, 4,
   5, -16, 0,    5, -16, -4,    -5, -6, 4,     -5, -4, -4,   -5, -16, 0,
   -5, -16, -4,  -4, -20, 10,   -9, -20, 8,    -5, -20, -5,  10, -3, -1,
   10, 3, -1,    14, 1, 5,      10, 5, 7,      10, -5, 7,    -14, 1, 5,
   -10, 5, 7,    -10, -5, 7,    -10, -3, -1,   -10, 3, -1,   0, -12, -13,
   12, -13, -11, -12, -13, -11, 10, 6, -9,     -10, 6, -9,   0, 17, -1,
   -8, -6, -8,   -10, 5, -7,    -8, 2, 8,      10, 5, -7,    8, -6, -8,
   0, -13, 2,    8, 2, 8,       -11, 21, 11,   -10, 25, -11, 10, 25, -11,
   11, 21, 11,   0, 30, 12,     0, 45, -1,     0, 35, -1,    3, 45, 9,
   3, 35, 9,     13, 45, 9,     13, 35, 9,     16, 45, -1,   16, 35, -1,
   8, 50, 2,     8, 45, -7,     8, 35, -7,     8, 30, 2,     -16, 45, -1,
   -16, 35, -1,  -13, 45, 9,    -13, 35, 9,    -3, 45, 9,    -3, 35, 9,
   -8, 50, 2,    -8, 45, -7,    -8, 35, -7,    -8, 30, 2
};

short player_poly[] =
{
   84,
   3, 42, 61, 60, 15,    3, 63, 43, 59, 15,    4, 59, 43, 42, 58, 15,
   3, 58, 42, 60, 15,    3, 63, 59, 57, 15,    4, 57, 59, 58, 56, 255,
   3, 56, 58, 60, 15,    3, 63, 57, 55, 15,    4, 55, 57, 56, 54, 15,
   3, 54, 56, 60, 15,    3, 63, 55, 62, 15,    4, 62, 55, 54, 61, 15,
   3, 61, 54, 60, 15,    3, 53, 52, 49, 15,    4, 49, 52, 51, 48, 15,
   3, 48, 51, 50, 15,    3, 53, 49, 47, 15,    4, 47, 49, 48, 46, 15,
   3, 46, 48, 50, 15,    3, 53, 47, 45, 15,    4, 45, 47, 46, 44, 255,
   3, 44, 46, 50, 15,    3, 53, 45, 43, 15,    4, 43, 45, 44, 42, 15,
   3, 42, 44, 50, 15,    3, 51, 42, 50, 15,    3, 42, 62, 61, 15,
   3, 42, 51, 52, 15,    3, 42, 52, 62, 10,    4, 39, 38, 62, 52, 10,
   3, 39, 52, 53, 10,    3, 38, 63, 62, 10,    3, 41, 43, 63, 10,
   3, 41, 53, 43, 10,    3, 29, 38, 39, 10,    3, 40, 37, 29, 10,
   3, 37, 38, 29, 10,    3, 29, 39, 40, 10,    3, 37, 63, 38, 10,
   3, 53, 40, 39, 10,    3, 41, 63, 37, 10,    3, 41, 40, 53, 10,
   3, 41, 37, 40, 10,    3, 29, 32, 36, 14,    3, 32, 29, 31, 10,
   3, 29, 36, 33, 10,    3, 32, 35, 36, 14,    3, 30, 32, 31, 10,
   3, 34, 33, 36, 10,    3, 35, 32, 30, 10,    3, 35, 34, 36, 10,
   3, 35, 30, 34, 10,    4, 30, 31, 33, 34, 10, 3, 33, 31, 29, 10,
   3, 29, 27, 28, 12,    3, 29, 28, 27, 12,    3, 28, 24, 26, 12,
   3, 28, 26, 24, 12,    3, 27, 24, 25, 12,    3, 27, 25, 24, 12,
   3, 28, 24, 27, 12,    3, 28, 27, 24, 12,    4, 21, 22, 23, 20, 15,
   3, 22, 19, 23, 15,    3, 22, 21, 19, 15,    3, 23, 19, 20, 15,
   3, 21, 20, 19, 15,    3, 18, 16, 17, 15,    3, 15, 17, 16, 15,
   3, 14, 16, 18, 15,    3, 14, 15, 16, 15,    4, 18, 17, 15, 14, 15,
   3, 13, 11, 12, 14,    3, 12, 11, 9, 10,      4, 13, 12, 9, 10, 10,
   4, 13, 10, 9, 11, 10,  4, 10, 8, 7, 9, 10,    4, 10, 9, 7, 8, 10,
   4, 6, 3, 4, 5, 10,     4, 6, 5, 4, 3, 10,     4, 2, 1, 5, 6, 10,
   4, 2, 6, 5, 0, 10,     3, 0, 5, 1, 10,        3, 2, 0, 1, 14
};

void *ground_frame, *ground_obj;
void *pozzo_frame, *pozzo_obj;
void *pino_frame, *pino_obj;
void *cartello_frame, *cartello_obj;
void *bat_frame, *bat_obj;
void *cane_frame, *cane_obj;
void *player_frame, *player_obj;

int main (void)
{
   long i, j, k;
   long x, y, z;
   long xp, yp;
   unsigned long memptr;
   long dist;
   long r;
   void * Raster;
   long sn, cs;
   unsigned long joy;
   long dxmouse, dymouse;
   long v;
   long xb, yb, zb, ab, rb;

   if ( GfxBase = (void *) OpenLibrary ("graphics.library", 0) )
   {
      if ( IntuitionBase = (void *) OpenLibrary ("intuition.library", 0) )
      {
         if ( GfX3dBase = (void *) OpenLibrary ("gfx3d.library", 0) )
         {
            if ( Raster = (void *) AllocMem ( SIZE , MEMF_CHIP | MEMF_CLEAR ) )
            {

               InitBitMap ( &MyBitMap, DEPTH, WIDTH, HEIGHT );
               memptr = (long) Raster;
               for ( k=0 ; k<DEPTH ; k++ )
               {
                  MyBitMap.Planes[k] = (char *) memptr;
                  memptr += BPLSIZE;
               }

               MyNewScreen.CustomBitMap = &MyBitMap;
               if ( MyScreen = (void *) OpenScreen (&MyNewScreen) )
               {
                  View = (unsigned long *) ViewAddress();
                  ViewPort = View[0];

                  LoadRGB32( ViewPort, &RGB32, 256 );

                  SetRGB4( ViewPort, 0, 12, 15, 15 );
                  SetRGB4( ViewPort, 255, 0, 0, 0 );

                  for ( k=0 ; k<256 ; k++ )
                  {
                     i = RGB8bit[k];
                     palette[k].Red   = (i >> 16) & 0xFF;
                     palette[k].Green = (i >> 8) & 0xFF;
                     palette[k].Blue  = i & 0xFF;
                  }

                  GFXSetShading( GFX_FLAT_SHADING | GFX_DEPTH_SHADING );

                  GFXBegin( GFX_ENVIRONMENT );
                     GFXBegin( GFX_SHADETABLE );
                        GFXSteps( 12 );
                        GFXThreshold( 3 );
                        GFXColor( 0xc7ffff );
                        GFXFarClip( 2048 );
                        GFXPalette( (void *) &palette );
                     GFXShadeTable( GFXEnd() );
                     GFXBegin( GFX_OBJECT );
                        ground_frame = BuildFrame( ground_points, ground_poly, GFXFlt( 120 ), 0 );
                        GFXFrame( ground_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( 0, 200, 0 );
                     ground_obj = (void *) GFXEnd();
                     GFXObject( ground_obj );
                  groundenv = (void *) GFXEnd();

                  GFXBegin( GFX_ENVIRONMENT );
                     GFXBegin( GFX_SHADETABLE );
                        GFXSteps( 12 );
                        GFXThreshold( 3 );
                        GFXColor( 0xc7ffff );
                        GFXFarClip( 2048 );
                        GFXPalette( (void *) &palette );
                     GFXShadeTable( GFXEnd() );
                     GFXBegin( GFX_OBJECT );
                        pozzo_frame = BuildFrame( pozzo_points, pozzo_poly, GFXFlt( 5 ), 0 );
                        GFXFrame( pozzo_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( 0, 200, 0 );
                     pozzo_obj = (void *) GFXEnd();
                     GFXObject( pozzo_obj );
                     GFXBegin( GFX_OBJECT );
                        pino_frame = BuildFrame( pino_points, pino_poly, GFXFlt( 2 ), 0 );
                        GFXFrame( pino_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( -150, 300, 0 );
                     pino_obj = (void *) GFXEnd();
                     GFXObject( pino_obj );
                     GFXBegin( GFX_OBJECT );
                        cartello_frame = BuildFrame( cartello_points, cartello_poly, GFXFlt( 2 ), 0 );
                        GFXFrame( cartello_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( 50, 100, 0 );
                        GFXDirection( 0, 0, -8 );
                     cartello_obj = (void *) GFXEnd();
                     GFXObject( cartello_obj );
                     GFXBegin( GFX_OBJECT );
                        bat_frame = BuildFrame( bat_points, bat_poly, GFXFlt( 1 ), 0 );
                        GFXFrame( bat_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( 0, 200, 0 );
                     bat_obj = (void *) GFXEnd();
                     GFXObject( bat_obj );
                     GFXBegin( GFX_OBJECT );
                        cane_frame = BuildFrame( cane_points, cane_poly, GFXFlt( 1 ), 0 );
                        GFXFrame( cane_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( 150, 350, 0 );
                        GFXDirection( 0, 0, -20 );
                     cane_obj = (void *) GFXEnd();
                     GFXObject( cane_obj );
                     GFXBegin( GFX_OBJECT );
                        player_frame = BuildFrame( player_points, player_poly, GFXFlt( 1 ), 0 );
                        GFXFrame( player_frame );
                        GFXFarClip( 2048 );
                        GFXPosition( 0, 200, 0 );
                     player_obj = (void *) GFXEnd();
                     GFXObject( player_obj );
                  env = (void *) GFXEnd();

                  GFXBegin( GFX_CAMERA );
                     GFXWidth( WIDTH );
                     GFXHeight( HEIGHT );
                     GFXVideoBuffer( Raster );
                     GFXEnvironment( groundenv );
                     GFXFocus( 256 );
                     GFXFarClip( 2048 );
                     GFXAspectRatio( GFXDiv( GFXFlt( 320 ), GFXFlt( WIDTH ) ),
                                           GFXFlt( 1 ),
                                           GFXDiv( GFXFlt( 200 ), GFXFlt( HEIGHT ) ) );
                     GFXDirection( -10, 0, 0 );
                     GFXPosition( 0, 0, 100 );
                  groundcam = (void *) GFXEnd();

                  GFXBegin( GFX_CAMERA );
                     GFXWidth( WIDTH );
                     GFXHeight( HEIGHT );
                     GFXVideoBuffer( Raster );
                     GFXShareWorkBuffer( groundcam );
                     GFXEnvironment( env );
                     GFXFocus( 256 );
                     GFXFarClip( 2048 );
                     GFXAspectRatio( GFXDiv( GFXFlt( 320 ), GFXFlt( WIDTH ) ),
                                             GFXFlt( 1 ),
                                             GFXDiv( GFXFlt( 200 ), GFXFlt( HEIGHT ) ) );
                     GFXDirection( -10, 0, 0 );
                     GFXPosition( 0, 0, 100 );
                  cam = (void *) GFXEnd();

                  trigonometry = GFXDiv( GFXFlt( 128 ), GFXPi() );

                  i = 0;
                  j = 0;
                  k = 0;
                  x = 0;
                  y = 0;
                  v = 2;
                  z = GFXFlt( 100 );
                  xp = GFXFlt( 200 );
                  yp = GFXFlt( 200 );
                  xb = 0;
                  yb = 0;
                  zb = 0;
                  ab = 0;
                  rb = 100;
                  do
                  {
                     sn = GFXSin ( GFXMul ( GFXFlt(ab&255) , trigonometry ) );
                     cs = GFXCos ( GFXMul ( GFXFlt(ab&255) , trigonometry ) );
                     xb = GFXFixMul( rb, sn );
                     yb = GFXFixMul( rb, cs );
                     sn = GFXSin ( GFXMul ( GFXFlt((ab*16)&255) , trigonometry ) );
                     zb = GFXFixMul( 10, sn );
                     ab++;

                     dxmouse = ReadDeltaXMouse( 0 );
                     if ( dxmouse > 0 )
                     {
                        k -= dxmouse;
                     }                    
                     if ( dxmouse < 0 )
                     {
                        k -= dxmouse;
                     }                    

                     dymouse = ReadDeltaYMouse( 0 );
                     if ( dymouse < 0 )
                     {
                        if ( ( j-=dymouse ) > 40 )
                        {
                           j = 40;
                        }
                     }                    
                     if ( dymouse > 0 )
                     {
                        if ( ( j-=dymouse ) < -40 )
                        {
                           j = -40;
                        }
                     }                    

                     joy = ReadJoystick( 0 );
                     if ( joy & 16 )
                     {
                        sn = GFXSin ( GFXMul ( GFXFlt(k&255) , trigonometry ) );
                        cs = GFXCos ( GFXMul ( GFXFlt(k&255) , trigonometry ) );
                        x += GFXFixMul( j/2 , sn );
                        y -= GFXFixMul( j/2 , cs );
                     }

                     joy = ReadJoystick ( 1 );
                     if ( joy & 4 )
                     {
                        i-=2;
                     }                 
                     else  
                     {
                        if ( joy & 8 )
                        {
                           i+=2;
                        }                    
                     }
                     if ( joy & 2 )
                     {
                        sn = GFXSin ( GFXMul ( GFXFlt(i&255) , trigonometry ) );
                        cs = GFXCos ( GFXMul ( GFXFlt(i&255) , trigonometry ) );
                        xp -= GFXFixMul( v , sn );
                        yp += GFXFixMul( v , cs );
                     }
                     else
                     {                    
                        if ( joy & 1 )
                        {
                           sn = GFXSin ( GFXMul ( GFXFlt(i&255) , trigonometry ) );
                           cs = GFXCos ( GFXMul ( GFXFlt(i&255) , trigonometry ) );
                           xp += GFXFixMul( v , sn );
                           yp -= GFXFixMul( v , cs );
                        }                    
                     }

                     GFXModifyCameraPosition( groundcam , GFXFix( x ) , GFXFix( y ) , GFXFix( z ) );
                     GFXModifyCameraDirection( groundcam , j , dxmouse/2 , k );
                     GFXUpdateScene( groundcam );

                     GFXModifyCameraPosition( cam , GFXFix( x ) , GFXFix( y ) , GFXFix( z ) );
                     GFXModifyCameraDirection( cam , j , dxmouse/2 , k );

                     GFXModifyObjectPosition( bat_obj, GFXFix( xb ), 200+GFXFix( yb ), 50+GFXFix( zb ) );
                     GFXModifyObjectDirection( bat_obj, 0, 0, 64-ab );

                     GFXModifyObjectPosition( player_obj, GFXFix( xp ), GFXFix( yp ), 20 );
                     GFXModifyObjectDirection( player_obj, 0, 0, i );

                     GFXUpdateScene( cam );

                     GFXUpdateVideoBuffer();
                     GFXClearWorkBuffer();

                  } while ( !( joy & 16 ) );

                  Delay ( 50 );
                  CloseScreen ( MyScreen );
               }
            FreeMem ( Raster, SIZE );
            }
            CloseLibrary (GfX3dBase);
         }
         CloseLibrary (IntuitionBase);
      }
      CloseLibrary (GfxBase);
   }
   return NULL;
}



unsigned long ReadJoystick (unsigned long joynum)
{
   unsigned long ret = 0;
   unsigned short joy;
   unsigned short * hardware;
   unsigned char * lbutton;

   if (joynum == 0)
   {
      hardware = (unsigned short *) 0xDFF00AL;
   }
   else
   {
      hardware = (unsigned short *) 0xDFF00CL;
   }
   joy = * hardware;

   ret += (joy >> 1 ^ joy) & 0x0100 ? 1 : 0;
   ret += (joy >> 1 ^ joy) & 0x0001 ? 2 : 0;
   ret += joy & 0x0002 ? 4 : 0;
   ret += joy & 0x0200 ? 8 : 0;

   lbutton = (unsigned char *) 0xBFE001;
   joy = * lbutton;
   if (joynum == 0)
   {
      ret += !(joy & 0x0040) ? 16 : 0;
   }
   else
   {
      ret += !(joy & 0x0080) ? 16 : 0;
   }

   return ret;
}



long ReadDeltaXMouse (unsigned long portnum)
{
   static char prev=0;
   static char init=0;
   long ret = 0;
   char joy;
   unsigned char * hardware;

   if ( portnum == 0 )
   {
      hardware = (unsigned char *) 0xDFF00BL;
   }
   else
   {
      hardware = (unsigned char *) 0xDFF00DL;
   }
   joy = * hardware;
   joy /= 2;

   if ( init == 0 )
   {
      prev = joy;
      ret = 0;
      init = 1;
   }
   else
   {
      if ( ( prev>0 && joy>0 ) || ( prev<0 && joy<0 ) )
      {
      ret = joy - prev;
         prev = joy;
      }
      else
      {
      ret = joy + prev;
         prev = -joy;
      }
   }

   return ret;
}



long ReadDeltaYMouse (unsigned long portnum)
{
   static char prev=0;
   static char init=0;
   long ret = 0;
   char joy;
   unsigned char * hardware;

   if ( portnum == 0 )
   {
      hardware = (unsigned char *) 0xDFF00AL;
   }
   else
   {
      hardware = (unsigned char *) 0xDFF00CL;
   }
   joy = * hardware;

   if ( init == 0 )
   {
      prev = joy;
      ret = 0;
      init = 1;
   }
   else
   {
      if ( ( prev>0 && joy>0 ) || ( prev<0 && joy<0 ) )
      {
      ret = joy - prev;
         prev = joy;
      }
      else
      {
      ret = joy + prev;
         prev = -joy;
      }
   }

   return ret;
}



void * BuildFrame ( short *points, short *polygons, long scale,
                              long offset )
{
  long i, k;
  long count;
  long n;
  long index;
  long color;
  long x, y, z;
  long x0, y0, z0;
  long x1, y1, z1;

  GFXBegin ( GFX_FRAME );
    count = polygons[0];
    index = 1;
    for ( k=1 ; k<=count ; k++ )
    {
      n = polygons[ index ];
      index++;
      color = polygons[ index+n ];
      GFXSetColor ( color+offset );
      x0 = GFXFltMul( scale , points[ polygons[ index ] * 3 ] );
      y0 = GFXFltMul( scale , points[ polygons[ index ] * 3 + 1 ] );
      z0 = GFXFltMul( scale , points[ polygons[ index ] * 3 + 2 ] );
      x1 = GFXFltMul( scale , points[ polygons[ index+1 ] * 3 ] );
      y1 = GFXFltMul( scale , points[ polygons[ index+1 ] * 3 + 1 ] );
      z1 = GFXFltMul( scale , points[ polygons[ index+1 ] * 3 + 2 ] );
      i = 2;
      while ( i<n )
      {
        GFXBegin ( GFX_POLYGON );
          GFXVertex ( x0 , -z0 , y0 );
          GFXVertex ( x1 , -z1 , y1 );
          x = GFXFltMul( scale , points[ polygons[ index+i ] * 3 ] );
          y = GFXFltMul( scale , points[ polygons[ index+i ] * 3 + 1 ] );
          z = GFXFltMul( scale , points[ polygons[ index+i ] * 3 + 2 ] );
          i++;
          GFXVertex ( x , -z , y );
        GFXPolygon ( GFXEnd () );
        total++;
        if ( i<n )
        {
          x1 = x;
          y1 = y;
          z1 = z;
        }
      }
      index += n+1;
      }
  return (void *) GFXEnd ();
}


