
#include "om.h"
#include "snd.c"


int
  lev_no,			/* level of current game */
  tank,
  lives,			/* lives of player */
  music,			/* sound? */
  toggle = 1,
  cheat,			/* cheat flag */
  row_mr, row_ml, drm,		/* max no of rows right/left, dropsrow_m */
  pipe_ripped;			/* pipe was just blown up */

int
  ping, schnorch, schrap;	/* sound flags */

long
  score;			/* score of player */

struct lev_s
  * lev;			/* ptr to actual level */

int
  rowtabl [ 10 ],		/* tabs for rows to go */
  rowtabr [ 10 ];

int				/* tabs for pipeline movements */
  delta_x [ 9 ] = { -1,0,1,-1,0,1,-1,0,1 },
  delta_y [ 9 ] = { 1,1,1,0,0,0,-1,-1,-1 };


unsigned char
  far * mask;			/* address of currently active mask */

extern int get_pipe  ( int x0, int y0, int x1 );
extern int get_maskx ( int x, int y );
extern int get_masky ( int x, int y );
extern int set_maskx ( int x0, int y0, int x1 );
extern int set_masky ( int x0, int y0, int y1 );
extern int rem_maskx ( int x0, int y0, int x1 );
extern int rem_masky ( int x0, int y0, int y1 );

extern void mouse_int ( void );

#include "gfx.c"
#include "omi.c"


#include "bw.c"

#include "lev_ega.c"
#include "lev_her.c"

#include "zw_ega.c"
#include "zw_her.c"


/* prepare for level: load gfx, init structures.. */

void lev_init ( void )
{

  r0 -> adr = 0;				/* clear pointer */
  r1 -> adr = 0;
  r2 -> adr = 0;
  r3 -> adr = 0;

  iff_read ( lev -> pic_level, r0, 1 );		/* read pictures */
  iff_read ( lev -> pic_parts, r1, 0 );
  iff_read ( lev -> pic_enemy, r2, 0 );
  iff_read ( lev -> pic_masks, r3, 2 );

  mask = r3 -> adr;				/* make mask address available */

}


/* free level mem and others ... */

void lev_exit ( void )
{

  if ( r0 -> adr ) free ( r0 -> adr );
  if ( r1 -> adr ) free ( r1 -> adr );
  if ( r2 -> adr ) free ( r2 -> adr );
  if ( r3 -> adr ) free ( r3 -> adr );

  r0 -> adr = 0;
  r1 -> adr = 0;
  r2 -> adr = 0;
  r3 -> adr = 0;

}




/* prepare for level: load gfx, init structures.. */

void zw_init ( void )
{

  r0 -> adr = 0;				/* clear pointer */
  r1 -> adr = 0;
  r2 -> adr = 0;
  r3 -> adr = 0;

  iff_read ( "lbm/mountain.lbm", r0, 1 );	/* read pictures */
  iff_read ( "lbm/enemies.bbm", r1, 0 );
  iff_read ( "lbm/scroll.lbm", r2, 0 );

}


/* free level mem and others ... */

void zw_exit ( void )
{

  if ( r0 -> adr ) free ( r0 -> adr );
  if ( r1 -> adr ) free ( r1 -> adr );
  if ( r2 -> adr ) free ( r2 -> adr );
  if ( r3 -> adr ) free ( r3 -> adr );

  r0 -> adr = 0;
  r1 -> adr = 0;
  r2 -> adr = 0;
  r3 -> adr = 0;

}




/* scheduling routine for game */

void play ( void )
{

  int i, j, k;

  struct hs_s {
    char name[9];
    long score;
  }
  hs [ 5 ] = {
    { "dirk", 500 }, { "marcel", 400 }, { "martin", 300 },
    { "patrick", 200 }, { "gerald", 100 } };

  FILE *fhd;

  char scstr[20];

  lives = 3;

  for ( i = lev_no/5; i < 4; i++ ) {  

    for ( j = 0; j < 4; j++ ) {

      lev = level + lev_no;
      if ( ! tank ) {
	lev_init ();
	if ( vmode == vm_her ) levh_play (); else leve_play ();
 	lev_exit (); }
      if ( ! lives ) goto high;
      lev_no++;

    }

    lev = & level [ lev_no ];
    zw_init ();
    lives -= 1 + ( ( vmode == vm_her ) ? zwh_play () : zwe_play () );
    zw_exit ();
    if ( ! lives ) goto died;
    lev_no++;

  }

  lev = level + lev_no;
  if ( ! tank ) {
    lev_init ();
    if ( vmode == vm_her ) levh_play (); else leve_play ();
    lev_exit (); }
  if ( ! lives ) goto high;
  lev_no++;
  lev = level + lev_no;
  if ( ! tank ) {
    lev_init ();
    if ( vmode == vm_her ) levh_play (); else leve_play ();
    lev_exit (); }
  if ( ! lives ) goto high;
  lev_no++;

  lev = & level [ lev_no ];
  zw_init ();
  lives -= 1 + ( ( vmode == vm_her ) ? zwh_play () : zwe_play () );
  zw_exit ();
  if ( ! lives ) goto died;
  lev_no++;

  lev = level + lev_no;
  if ( ! tank ) {
    lev_init ();
    if ( vmode == vm_her ) levh_play (); else leve_play ();
    lev_exit (); }
  if ( ! lives ) goto high;
  lev_no++;
  lev = level + lev_no;
  if ( ! tank ) {
    lev_init ();
    if ( vmode == vm_her ) levh_play (); else leve_play ();
    lev_exit (); }
  if ( ! lives ) goto high;

  while ( kbhit () ) getch ();

  lev_no = 0;
  iff_read ( "lbm/final.lbm", r0, 1 );
  vd_sync_and_switch ();
  vd_r2cb ( r0, 0, 0, p1, 0, 0, vmode?320:640, r0->height );
  vd_sync_and_switch ();

  while ( keys_and_mouse () == -1 );
  if ( r0->adr ) free ( r0->adr ); r0->adr = 0;
  goto high;

died:
  between ( 1, 0 );

high:					/* care for highscore */
  gfx->clear ( FP_SEG ( p0->adr ) );
  iff_read ( "lbm/intro1.lbm", r0, 1 );
  if ( ( fhd = fopen ( "high.dat", "rb" ) ) != 0 ) {
    fread ( hs, sizeof ( struct hs_s ), 5, fhd );
    fclose ( fhd ); }

  writeln ( "highscore", 9, vmode?88:176, 20 );

  for ( i = 0, k = 0; i < 5; i++ ) {
    if ( ( hs[i].score < score ) && !k ) {
      ltoa ( score, scstr, 10 );
      writeln ( scstr, 8, r0->width/2+32, 50+i*24 );
      for ( j = 3; j >= i; j-- ) {
      	strncpy ( hs[j+1].name, hs[j].name, 9 ); hs[j+1].score = hs[j].score; }
      hs[i].score = score;
      for ( j = 0; j < 9; j++ ) hs[i].name[j]=' ';
      readln ( hs[i].name, 9, 16, 50 + i* 24 );
      k = -1;
    }
    else {
      writeln ( hs[i].name, 9, 16, 50 + i*24 );
      ltoa ( hs[i].score, scstr, 10 );
      writeln ( scstr, 8, r0->width/2+32, 50+i*24 );
    }
    for ( j = 0; j < 70; j++ ) gfx->wvbl ();
  }

  if ( k ) {				/* write highscore */
char fn = "high.dat";
union REGS r;
int handle;
r.x.ax=0x3d01;
r.x.dx=FP_OFF(fn);
r.x.ds=FP_SEG(fn);
int86 ( 0x21, &r, &r );
handle=r.x.ax;
if(!r.x.cflag) {
r.x.ax=0x3e00;
r.x.bx=handle;
int86 ( 0x21, &r, &r );
      if ( ( fhd = fopen ( "high.dat", "wb" ) ) != 0 ) {
      fwrite ( hs, sizeof ( struct hs_s ), 5, fhd );
      fclose ( fhd ); }
}
  }

  for ( j = 0; ( j < 400 ) && ( keys_and_mouse () == -1 ); j++ ) gfx->wvbl ();

end:

  free ( r0->adr ); r0->adr = 0;
  gfx->clear ( FP_SEG ( p0->adr ) );

  lev_no = 0;

}




/* ough - bet you don't guess.. it's OILMANIA on your screen */

void main ( int argc, char *argv[] )
{

  if ( argc == 1 )
    game_init ( 0 );			/* no parameter from dos */
  else
    game_init ( argv [ 1 ] );		/* got a parameter string */

  loader ();
  
  while ( 1 ) {

    intro ();

    play ();
    
  }

}
