//
//  Defkon.h
//
#include "data.h"

#define MANN_SIZE       31
#define STRG            36
#define ML              MannListe
#define FL              FeindListe
#define MF              MannFeld
#define Hindernis       16
#define Fabrik          64;
#define MHaupt          59;
#define FHaupt          58;
#define MLi             ML[index]
#define FLi             FL[index]
#define Teilung         20

typedef struct fbxy
{
        int  x, y;
        long time;
        BYTE owner;
        BYTE inrange;
} FBXY;


BYTE LandData[500000], MannData[500000], MannBack[500000], FeindBack[500000];
BYTE ExploseData[10000];
BYTE  Feld[200][200];
int  MannFeld[200][200]; 
BYTE AktListe[200]; 
MANN MannListe[200], FeindListe[200];
int f_x=0; f_y=0;
int MannAnzahl= -1, FeindAnzahl= -1, scroll_del, mann_del, ss_del, sm_del;
int sdel;
int aktive = 0, aktsel=-1, atkzoom=0, rahmen=0;
BYTE akt[6];
int VIEW_LANG  = 4, vx=230;
int VIEW_BREIT = 3; vy=130;
int FELD_X;
int FELD_Y;
int Radar_x, Radar_y, Radar_x1, Radar_y1, intro;
BYTE radar_akt=1;
int x_lang, y_breit, aktzaehler;
char karte[13];
char pal[768];
BYTE O_ANFANG, U_ANFANG, R_ANFANG, L_ANFANG, MANN_DIV, O_LANG,
     U_LANG, R_LANG, L_LANG,
     LO_ANFANG, LU_ANFANG, RO_ANFANG, RU_ANFANG, LO_LANG, LU_LANG, RO_LANG, RU_LANG,
     ANGRIF_L, ANGRIF_R, ANGRIF_O, ANGRIF_U,
     ANGRIF_LL, ANGRIF_RL, ANGRIF_OL, ANGRIF_UL,
     ANGRIF_LO, ANGRIF_LU, ANGRIF_RO, ANGRIF_RU,
     ANGRIF_LOL, ANGRIF_LUL, ANGRIF_ROL, ANGRIF_RUL;
FBXY FB[20];
BYTE fbcount=0, fast_scroll;
int  FHauptX, FHauptY, MHauptX, MHauptY;
BYTE mansel[50];
int  meldung, MediDelay, MediSave, MediSet=0, MediRand=200;
DEST MediKit;

/****************************************************************************/
/* put_sprite bring ein Sprite von 20x20 auf den Bildschirm. Zuvor muá ihr  */
/* aber die Position des Sprites im XMS bergeben werden, sowie die X- und  */
/* Y-Koordinaten.                                                           */
/*--------------------------------------------------------------------------*/
/* Parameter:                                                               */
/*            x................................... X-Koordinate des Sprites */
/*            y................................... Y-Koordinate des Sprites */
/*            pos................................... Sprite-Position im XMS */
/****************************************************************************/
void put_sprite( int x, int y, unsigned int pos )
{
  int i;

  for(i=0; i<20; i++)
  {
    memcpy(&VScreen[((y+i)*320)+x], &LandData[pos+(i*20)], 20);
  }
}

void hput_sprite( int x, int y, unsigned int pos )
{
  int i, j, h=pos;

  for(i=0; i<20; i++)
  {
    for (j=0; j<20; j++)
    {
      if ( vgetpix(x+j, y+i, res_x) < 230 ) vsetpix(x+j, y+i, LandData[h++], res_x);
    }
  }
}


/****************************************************************************/
/* Dies Funktion stellt das Grundgrst fr diese Spiel dar. Sie berechnet   */
/* welche Teile der Landschaft (Karte) angezeigt werden soll.               */
/* Gesteuert wird per Maus.                                                 */
/*--------------------------------------------------------------------------*/
/* Parameter:                                                               */
/*            weiter_x..................... wie weit in X-Richtung scrollen */
/*            weiter_y..................... wie weit in Y_Richtung scrollen */
/****************************************************************************/
void Landschaft ( int weiter_x, int weiter_y )
{
  int i, j;
  char strgeld[5];


  for (i=weiter_y; i<weiter_y+SPIEL_LANG; i++)
  {
    for (j=weiter_x; j<weiter_x+SPIEL_BREIT; j++)
    {
      put_sprite((j-weiter_x)*20, (i-weiter_y)*20, Feld[i][j]*400);
    }
  }
}


/****************************************************************************/
/* Initialisiert das Programm an sich.                                      */
/* ------------------------------------------------------------------------ */
/* keine Parameter                                                          */
/****************************************************************************/
void Init_Program( void )
{
  int i, Zeichen;
  char DateiName[127];

  printf("Starte Defkon17-Alpha Version v0.1\n");
  delay(1000);
  if ( maus_reset() )        // berprfen ob ein Maustreiber installiert ist
  {
   printf("\n\nERROR: Es wurde kein Maustreiber gefunden!\n\n");
   exit(0);
  }
  load_ini(); ss_del = scroll_del; sm_del = mann_del;

  if ( chdir("DATA") )                       // ins DATA-Verzeichnis wechseln
  {
    printf("\n\nERROR: Kann Verzeichnis DATA nicht finden!\n\n");
    exit(0);
  }                                          
  init320x200();
  maus_off(); maus_put(160, 100);                              // Maus setzen
}

/****************************************************************************/
/* Initialisiert das ein Spiel. (vom Men aus)                              */
/* ------------------------------------------------------------------------ */
/* keine Parameter                                                          */
/****************************************************************************/
void Init_Spiel ( char type )
{
  int i, Zeichen;
  char puffer[13];
  FILE *Datei;

  if ( type )
  {
    MannAnzahl = FeindAnzahl = -1;
    f_x = f_y = 0;
    aktzaehler = -1; 
    memset(AktListe, 0, 200);
    memset(mansel, 0, 50);
  }
  memset(MannFeld, 0, 200*200*2);
  aktsel=-1; 
  if ( (Datei = fopen("terrain.ref", "rb")) == NULL )     // Landschaft laden
  {
    textmodus();
    printf("\n\nERROR: Kann 'terrain.ref' nicht laden!\n\n");
    exit(0);
  }
  i= 0; 
  while ((Zeichen = fgetc(Datei)) != EOF) LandData[i++] = (BYTE)Zeichen;
  fclose(Datei);
  if ( (Datei = fopen("mann.ref", "rb")) == NULL )             // Leute laden
  {
    textmodus();
    printf("\n\nERROR: Kann 'mann.ref' nicht laden!\n\n");
    exit(0);
  }
  i=0;
  while ((Zeichen = fgetc(Datei)) != EOF) MannData[i++] = (BYTE)Zeichen;
  fclose(Datei);
  load_num();

  if ( (Datei = fopen("font.ref", "rb")) == NULL )             // Leute laden
  {
    textmodus();
    printf("\n\nERROR: Kann 'font.ref' nicht laden!\n\n");
    exit(0);
  }
  i=0;
  while ((Zeichen = fgetc(Datei)) != EOF) bchst[i++] = (BYTE)Zeichen;
  fclose(Datei);

  if ( (Datei = fopen("explose.ref", "rb")) == NULL )             // Leute laden
  {
    textmodus();
    printf("\n\nERROR: Kann 'explose.ref' nicht laden!\n\n");
    exit(0);
  }
  i=0;
  while ((Zeichen = fgetc(Datei)) != EOF) ExploseData[i++] = (BYTE)Zeichen;
  fclose(Datei);

  if ( type ) load_gam(karte);
  else load_gamap(karte);

  if ( type )
  {
    Screen_Off();
    UpdateScreen();
    maus_off(); maus_put(160, 100);
  }
  if ( !type ) UpdateScreen();

  get_factory(); set_DataBase();
  for(i=0; i<6; i++) { FeindInsert(((FHauptX-3)+i)*20, (FHauptY+1)*20, 1); MannInsert(((MHauptX-3)+i)*20, (MHauptY+1)*20, 1); }
  f_x = MHauptX-5; f_y = MHauptY-5;
  for(i=0; i<6; i++)
  {
    ML[i].x=ML[i].x1-=20*f_x; ML[i].y=ML[i].y1-=20*f_y;
    FL[i].x=FL[i].x1-=20*f_x; FL[i].y=FL[i].y1-=20*f_y;
  }
  show_PCX("mr-005.dbl"); /*SetPalette(pal);*/ Set_Overscan_Color(0);
  m_back_save(); m_place();
  cpy2screen(); /*set_pal_out(0, 232, 60);*/ Screen_On();

}

/****************************************************************************/
/* Maushandler fr die Funktion Spiel().                                    */
/* ------------------------------------------------------------------------ */
/* keine Parameter                                                          */
/****************************************************************************/
int maus_links ( void )
{
  int i, j, h, k;
  BYTE kb;
  union REGS regs;

  regs.x.ax = 0x0200;      
  int386( 0x16, &regs, &regs );
  kb = regs.h.al;
                                            
  //------------------------------------------------------------------------//
  for(i=0; i<=fbcount; i++)
  {
    if ( ((f_x+(m_x/Teilung))==FB[i].x)&&((f_y+(m_y/Teilung))==FB[i].y)&&(FB[i].owner==1) )
    {
      m_back_restore(); show_fb_menu(i); m_back_save(); m_place();
      return 0;
    }
  }
  if ( maus_innen(4, 184, 40, 194) ) { if ( spiel_menu() ) return 1; else return 0; }
  if ( maus_innen(266, 10, 279, 20)&&(atkzoom>-1) )
  {
    f_x = ML[atkzoom].feldx; f_y = ML[atkzoom].feldy;
    for ( i=0; i<=MannAnzahl; i++ ) { ML[i].y1=ML[i].y=(ML[i].ay-(f_y*Teilung)); ML[i].x1=ML[i].x=(ML[i].ax-(f_x*Teilung)); }
    for ( i=0; i<=FeindAnzahl; i++ ) { FL[i].y1=FL[i].y=(FL[i].ay-(f_y*Teilung)); FL[i].x1=FL[i].x=(FL[i].ax-(f_x*Teilung)); }
    return 0;
  }
  if ( maus_innen(285, 2, 293, 11) )
  {
    memset(AktListe, 0, 200);
    for ( i=0; i<=50; i++ ) if ( mansel[i] > 0 ) AktListe[mansel[i]-1]=1;
    go = 1; m_show_image = 6;
  }
  //------------------------------------------------------------------------//


  if ( (m_x>Mlinks)&&(m_x<Mrechts)&&(m_y>Moben)&&(m_y<Munten) ) // wenn auf Spielfeld
  {
    for ( i=0; i<FeindAnzahl+1; i++ )
    {
      if ( (m_x>FL[i].x-15)&&(m_x<FL[i].x+15)&&(m_y>FL[i].y-15)&&(m_y<FL[i].y+15) )
      {
        for ( j=0; j<MannAnzahl+1; j++ )                        // angreifen
        {
          if ( AktListe[j] == 1 )
          {
            ML[j].attack = i; FL[i].atkanz++;
            ML[j].dx = FL[i].ax; ML[j].dy = FL[i].ay;
          }
        }
        return 0;
      }
    }
    for ( i=0; i<MannAnzahl+1; i++ )
    {
      if ( (m_x>ML[i].x-15)&&(m_x<ML[i].x+15)&&(m_y>ML[i].y-15)&&(m_y<ML[i].y+15) )
      {
        if ( AktListe[i] ) return 0;                     // is schon markiert
        if ( kb == 32 )
	{
          for ( j=0; j<MannAnzahl+1; j++ )        // alle anderen demarkieren
	    if ( AktListe[j] )
	    {
               mann_back_restore(j); mann_set(j); AktListe[j]=0; 
	    } 
          aktive = 0;
        }
        fill_box(100, 186, 230, 194, 0); write(100, 187, "Jawohl, Sir!", 252); meldung=200;
        AktListe[i] = 1; m_show_image=6; go=1; aktive++; aktsel=i;
        m_back_restore(); mann_back_restore(i); mann_akt_set(i); m_back_save(); m_place();
        if ( ML[i].type == 1 ) { write(275, 82, "Goder", 255); write(276, 81, "Goder", 254); }
        if ( ML[i].type == 2 ) { write(278, 82, "Lupo", 255); write(279, 81, "Lupo", 254); }
        m_taste= 0; return 0;
      }
    }
    if ( (!noway)&&(aktive>0) )
    {
      k=h=0;
      for ( i=0; i<=MannAnzahl; i++ )
      { 
        if ( (AktListe[i]) )
        {
          if ( h == aktive/3 ) { k++; h=0; }
          ML[i].dx=((f_x+1+(m_x/Teilung)+h)*Teilung); ML[i].dy=((f_y+(m_y/Teilung)+k)*Teilung); ML[i].stop=0;
          ML[i].stop=0; h++;
        }
        if ( aktive ) { fill_box(100, 186, 230, 194, 0); write(100, 187, "Schon unterwegs", 252); meldung=200; }
      }
      return 0;
    }

    if ( !noway ) { r_x=m_x; r_y=m_y; rahmen=1; }
  }

  return 0;
}

/****************************************************************************/
/* Maushandler fr die Funktion Spiel().                                    */
/* ------------------------------------------------------------------------ */
/* keine Parameter                                                          */
/****************************************************************************/
void maus_rechts ( void )
{
  int i, j, akt;

  if ( rahmen == 1 )
  {
    akt=0;
    if (m_x>r_x) { i=m_x; m_x=r_x; r_x=i; }
    if (m_y>r_y) { i=m_y; m_y=r_y; r_y=i; }

    memset(AktListe, 0, 200);

    for(i=0; i<=MannAnzahl; i++)
    {
      if ( ((ML[i].x<=r_x)&&(ML[i].x>=m_x))&&((ML[i].y<=r_y)&&(ML[i].y>=m_y)) ) { akt++; AktListe[i] = 1; }
    }

    if ( akt > 0 ) { m_show_image=6; go=1; }
    else { m_show_image = 1; go = 0; }
    rahmen=0; aktive = akt; return;
  }

  if ( maus_innen(285, 2, 293, 11) )
  {
    memset(mansel, 0, 50);
    for(i=0, j=0; i<=MannAnzahl; i++) if ( AktListe[i]==1 ) mansel[j++]=i+1;
  }

}

void maus_beide ( void )
{
  r_x=m_x; r_y=m_y; rahmen=1; 
}

void get_factory ()
{
  int i, j;

  for (i=0; i<=y_breit; i++)
  {
    for(j=0; j<=x_lang; j++)
    {
      if ( Feld[i][j] == 64 )
      {
        FB[fbcount].x = j; FB[fbcount].y = i; FB[fbcount].inrange = 0;
        FB[fbcount].time = 100000; FB[fbcount++].owner=0;
      }
      if ( Feld[i][j] == 58 ) { MHauptX = j; MHauptY = i; }
      if ( Feld[i][j] == 59 ) { FHauptX = j; FHauptY = i; }
    }
  }
  fbcount--;
}


void UpdateScreen ( void )
{
  int i, j;
  char strgeld[5];


/*  for (i=f_y; i<f_y+SPIEL_LANG; i++)
  {
    for (j=f_x; j<f_x+SPIEL_BREIT; j++)
    {
      put_sprite((j-f_x)*20, (i-f_y)*20, Feld[i][j]);
    }
  }*/

  Landschaft(f_x, f_y);

  if ( MannAnzahl > -1 )
  {
    for ( i=0; i<MannAnzahl+1; i++ )
    {
      if ( (ML[i].x<320)&&(ML[i].x>-20)&&(ML[i].y<200)&&(ML[i].y>-20) )
      {
        if ( ML[i].explose ) show_explore(i, 0);
        else
        {
          if ( AktListe[i] ) mann_akt_set(i);
          else mann_set(i);
          if ( (ML[i].type==2)&&(ML[i].fire!=0) ) Mann2_Fire(i);
          if ( (ML[i].type==1)&&(ML[i].fire!=0) ) Mann1_Fire(i);
        }
      }
    }
  }
  if ( FeindAnzahl > -1 )
  {
    for ( i=0; i<FeindAnzahl+1; i++ )
    {
      if ( (FL[i].x<320)&&(FL[i].x>-20)&&(FL[i].y<200)&&(FL[i].y>-20) )
      {
        if ( FL[i].explose ) show_explore(i, 1);
        else feind_set(i);
        if ( (FL[i].type==2)&&(FL[i].fire!=0) ) Feind2_Fire(i);
        if ( (FL[i].type==1)&&(FL[i].fire!=0) ) Feind1_Fire(i);
      }
    }
  }
}

void scroll_down ( void )
{
  int i;

  sdel=0; f_y+=fast_scroll;
  Landschaft(f_x, f_y); screen_refresh= 1;
  if ( MannAnzahl > -1 )
  {
    for ( i=0; i<MannAnzahl+1; i++ )
    {
      ML[i].y1=ML[i].y-=20*fast_scroll; 
      if ( (ML[i].x<320)&&(ML[i].x>-20)&&(ML[i].y<200)&&(ML[i].y>-20) )
      {
        if ( AktListe[i] ) mann_akt_set(i);
        else mann_set(i);
      }
    }
  }
  if ( FeindAnzahl > -1 )
  {
    for ( i=0; i<FeindAnzahl+1; i++ )
    {
      FL[i].y1=FL[i].y-=20*fast_scroll;
      if ( (FL[i].x<320)&&(FL[i].x>-20)&&(FL[i].y<200)&&(FL[i].y>-20) ) feind_set(i);
    }
  }
  m_show_image=m_down;
}

void scroll_up ( void )
{
  int i;

  sdel=0; f_y-=fast_scroll;
  Landschaft(f_x, f_y); screen_refresh= 1;
  if ( MannAnzahl > -1 )
  {
    for ( i=0; i<MannAnzahl+1; i++ )
    {
      ML[i].y1=ML[i].y+=20*fast_scroll; 
      if ( (ML[i].x<320)&&(ML[i].x>-20)&&(ML[i].y<200)&&(ML[i].y>-20) )
      {
        if ( AktListe[i] ) mann_akt_set(i);
        else mann_set(i);
      }
    }
  }
  if ( FeindAnzahl > -1 )
  {
    for ( i=0; i<FeindAnzahl+1; i++ )
    {
      FL[i].y1=FL[i].y+=20*fast_scroll;
      if ( (FL[i].x<320)&&(FL[i].x>-20)&&(FL[i].y<200)&&(FL[i].y>-20) ) feind_set(i);
    }
  }
  m_show_image=m_up; 
}

void scroll_right ( void )
{
  int i;

  sdel=0; f_x+=fast_scroll;
  Landschaft(f_x, f_y); screen_refresh= 1;
  if ( MannAnzahl > -1 )
  {
    for ( i=0; i<MannAnzahl+1; i++ )
    {
      ML[i].x1=ML[i].x-=20*fast_scroll;
      if ( (ML[i].x<320)&&(ML[i].x>-20)&&(ML[i].y<200)&&(ML[i].y>-20) )
      {
        if ( AktListe[i] ) mann_akt_set(i);
        else mann_set(i);
      }
    }
  }
  if ( FeindAnzahl > -1 )
  {
    for ( i=0; i<FeindAnzahl+1; i++ )
    {
      FL[i].x1=FL[i].x-=20*fast_scroll;
      if ( (FL[i].x<320)&&(FL[i].x>-20)&&(FL[i].y<200)&&(FL[i].y>-20) ) feind_set(i);
    }
  }
  m_show_image=m_right; 
}

void scroll_left ( void )
{
  int i;

  sdel=0; f_x-=fast_scroll;
  Landschaft(f_x, f_y); screen_refresh= 1;
  if ( MannAnzahl > -1 )
  {
    for ( i=0; i<MannAnzahl+1; i++ )
    {
      ML[i].x1=ML[i].x+=20*fast_scroll; 
      if ( (ML[i].x<320)&&(ML[i].x>-20)&&(ML[i].y<200)&&(ML[i].y>-20) )
      {
        if ( AktListe[i] ) mann_akt_set(i);
        else mann_set(i);
      }
    }
  }
  if ( FeindAnzahl > -1 )
  {
    for ( i=0; i<FeindAnzahl+1; i++ )
    {
      FL[i].x1=FL[i].x+=20*fast_scroll;
      if ( (FL[i].x<320)&&(FL[i].x>-20)&&(FL[i].y<200)&&(FL[i].y>-20) ) feind_set(i);
    }
  }
  m_show_image=m_left;
}

/****************************************************************************/
/* L„d eine Karte.                                                          */
/* ------------------------------------------------------------------------ */
/* Parameter: Dateiname.                                                    */
/****************************************************************************/
void load_gam ( char *Datei )
{
  int i, j;
  FILE *D;
  char sign[2];

  f_x = f_y = 0;

  if ( (D = fopen(Datei, "rb")) == NULL )
  {
    printf("\n\nERROR: Kann Datei '%s' nicht laden!\n\n", Datei);
    exit(0);
  }
  sign[0] = 'S'; sign[1] = 'M';
//------------------------------ Header --------------------------------------
  sign[0] = fgetc(D); sign[1] = fgetc(D);
  FELD_X = fgetc(D); x_lang = FELD_X + 12;
  FELD_Y = fgetc(D); y_breit = FELD_Y + 10;
  MannAnzahl =  fgetc(D); MannAnzahl--;
  FeindAnzahl = fgetc(D); FeindAnzahl--;
//---------------------------- Karte speichern -------------------------------
  for ( i=0; i<(FELD_Y+11); i++)
  {
    for ( j=0; j<(FELD_X+13); j++) Feld[i][j] = fgetc(D);
  }
//---------------------------- Kennung fr Leute -----------------------------
  sign[0] = fgetc(D);
  if ( (MannAnzahl > -1) )
    for(i=0; i<MannAnzahl+1; i++)
    {
      fget_Mann(D, &ML[i]);
      ML[i].ax=ML[i].feldx*20; ML[i].ay=ML[i].feldy*20;
      ML[i].y=ML[i].y1=ML[i].ay-(f_y*20); ML[i].x=ML[i].x1=ML[i].ax-(f_x*20);
    }
  if ( (FeindAnzahl > -1) )
    for(i=0; i<FeindAnzahl+1; i++)
    {
      fget_Mann(D, &FL[i]);
      FL[i].ax=FL[i].feldx*20; FL[i].ay=FL[i].feldy*20;
      FL[i].y=FL[i].y1=FL[i].ay-(f_y*20); FL[i].x=FL[i].x1= FL[i].ax-(f_x*20);
    }
//-----------------------------------------------------------------------------
  fclose(D);
}


void load_gamap ( char *Datei )
{
  int i, j;
  FILE *D;
  char sign[2];

  if ( (D = fopen(Datei, "rb")) == NULL )
  {
    printf("\n\nERROR: Kann Datei '%s' nicht laden!\n\n", Datei);
    exit(0);
  }
  sign[0] = 'S'; sign[1] = 'M';
//------------------------------ Header --------------------------------------
  sign[0] = fgetc(D); sign[1] = fgetc(D);
  FELD_X = fgetc(D); x_lang = FELD_X + 12;
  FELD_Y = fgetc(D); y_breit = FELD_Y + 10;
  sign[0] =  fgetc(D); sign[0] = fgetc(D); 
//---------------------------- Karte speichern -------------------------------
  for ( i=0; i<(FELD_Y+11); i++)
  {
    for ( j=0; j<(FELD_X+13); j++) Feld[i][j] = fgetc(D);
  }

//--------------------------------------------------------------------------------------------------------------------------------------------
  fclose(D);
}


/****************************************************************************/
/* Speichert das momentane Spiel ab.                                        */
/* ------------------------------------------------------------------------ */
/* Parameter: Name des SaveGames.                                           */
/****************************************************************************/
void save_game ( char DateiName[13], char Name[50] )
{
  FILE *Datei;
  char sign[2]="SM";
  int i, j;

  if ( (Datei = fopen(DateiName, "wb")) == NULL )
  {
    Screen_On(); textmodus();
    printf("\n\nERROR: Kann in Datei '%s' nicht schreiben!\n\n", DateiName);
    exit(0);
  }
  fwrite(sign, 2, 1, Datei);                                      // Signatur
  fwrite(Name, 50, 1, Datei);                                // Savegame-Name
  fwrite(karte, 13, 1, Datei);                                  // x.map Name

  fputc(MannAnzahl+1, Datei);                                   // MannAnzahl
  fputc(FeindAnzahl+1, Datei);                                 // FeindAnzahl
  fputc(f_x, Datei); fputc(f_y, Datei);                 // Karten-Koordinaten
  for(i=0; i<=200; i++) fputc(AktListe[i], Datei);                // AktListe
  if ( (MannAnzahl > -1) )
  {
    for(i=0; i<MannAnzahl+1; i++) fput_Mann(Datei, &ML[i]);
    for(i=0; i<=((MannAnzahl+1)*400); i++) fputc(MannBack[i], Datei); // MannBack
  }
  if ( (FeindAnzahl > -1) )
  {
    for(i=0; i<FeindAnzahl+1; i++) fput_Mann(Datei, &FL[i]);
    for(i=0; i<=((FeindAnzahl+1)*400); i++) fputc(FeindBack[i], Datei);// FeindBack
  }

  fclose(Datei);
  chdir(".."); chdir("data");
}

/****************************************************************************/
/* L„d ein zuvor gespeichertes Spiel.                                       */
/* ------------------------------------------------------------------------ */
/* Parameter: Name des SaveGames.                                           */
/****************************************************************************/
void load_game ( char DateiName[13] )
{
  FILE *Datei;
  char sign[1], Name[50];
  int i, j;

  memset(sign, 0, 2);
  if ( (Datei = fopen(DateiName, "r")) == NULL )
  {
    Screen_On(); textmodus();
    printf("\n\nERROR: Kann Datei '%s' nicht laden!\n\n", DateiName);
    exit(0);
  }
  sign[0] = fgetc(Datei); sign[1] = fgetc(Datei);                 // Signatur
  fread(Name, 50, 1, Datei);                                 // Savegame-Name
  fread(karte, 13, 1, Datei);                                   // x.map Name
  MannAnzahl  = fgetc(Datei); MannAnzahl--;                     // MannAnzahl
  FeindAnzahl = fgetc(Datei); FeindAnzahl--;                   // FeindAnzahl
  f_x = fgetc(Datei); f_y = fgetc(Datei);               // Karten-Koordinaten
  for(i=0; i<=200; i++) AktListe[i] = fgetc(Datei);               // AktListe
  if ( (MannAnzahl > -1) )
  {
    for(i=0; i<MannAnzahl+1; i++) fget_Mann(Datei, &ML[i]);
    for(i=0; i<=((MannAnzahl+1)*400); i++) MannBack[i] = fgetc(Datei);// MannBack
    for(i=0; i<MannAnzahl+1; i++) { ML[i].y = ML[i].ay-(f_y*20); ML[i].x = ML[i].ax-(f_x*20); }
  }
  if ( (FeindAnzahl > -1) )
  {
    for(i=0; i<FeindAnzahl+1; i++) fget_Mann(Datei, &FL[i]);
    for(i=0; i<=((FeindAnzahl+1)*400); i++) FeindBack[i] = fgetc(Datei);// FeindBack
    for(i=0; i<FeindAnzahl+1; i++) { FL[i].y = FL[i].ay-(f_y*20); FL[i].x = FL[i].ax-(f_x*20); }
  }

  fclose(Datei);
  chdir(".."); chdir("data");
}

int get_ini_value ( FILE *D )
{
  char ini[5];
  int i= 0;

  memset(ini, 32, 5);
  while ( fgetc(D) != '=' );
  while ( (ini[i++] = fgetc(D)) != ':');
  return atoi(ini); 
}

/****************************************************************************/
/* Wertet die INI-Datei aus, und setzt die dazugeh”rigen Variablen          */
/* ------------------------------------------------------------------------ */
/* Keine Parameter.                                                         */
/****************************************************************************/
void load_ini ( void )
{
  int i;
  FILE *Datei;

  if ( (Datei = fopen("defkon.ini", "rb")) == NULL )
  {
    Screen_On(); textmodus();
    printf("\n\nERROR: Kann 'defkon.ini' nicht laden!\n\n");
    exit(0);
  }
//---------------------- scroll_del ------------------------------------------
    scroll_del = get_ini_value(Datei); 
//---------------------- mann_del --------------------------------------------
    mann_del = get_ini_value(Datei); 
//---------------------- Intro -----------------------------------------------
    intro = get_ini_value(Datei); 
//---------------------- Radar_x ---------------------------------------------
    Radar_x = get_ini_value(Datei); 
//---------------------- Radar_y ---------------------------------------------
    Radar_y = get_ini_value(Datei); 
//---------------------- Radar_x1 --------------------------------------------
    Radar_x1 = get_ini_value(Datei); 
//---------------------- Radar_y1 --------------------------------------------
    Radar_y1 = get_ini_value(Datei); 
//---------------------- radar_akt -------------------------------------------
    radar_akt = get_ini_value(Datei); i= 0;
//---------------------- karte -----------------------------------------------
  memset(karte, 0, 13); while ( fgetc(Datei) != '=' ); while ( (karte[i++] = fgetc(Datei)) != ':');
  karte[--i] = 0x00;

  fclose(Datei);
}


/****************************************************************************/
/* Wertet die NUM-Datei aus, und setzt die dazugeh”rigen Variablen          */
/* ------------------------------------------------------------------------ */
/* Keine Parameter.                                                         */
/****************************************************************************/
void load_num ( void )
{
  FILE *Datei;

  if ( (Datei = fopen("mann.num", "rb")) == NULL )
  {
    Screen_On(); textmodus();
    printf("\n\nERROR: Kann 'mann.num' nicht laden!\n\n");
    exit(0);
  }
//----------------------L_ANFANG ---------------------------------------------
   L_ANFANG = get_ini_value(Datei);
   L_LANG   = get_ini_value(Datei);
//----------------------R_ANFANG ---------------------------------------------
   R_ANFANG = get_ini_value(Datei);
   R_LANG   = get_ini_value(Datei);
//----------------------O_ANFANG ---------------------------------------------
   O_ANFANG = get_ini_value(Datei);
   O_LANG   = get_ini_value(Datei);
//----------------------U_ANFANG ---------------------------------------------
   U_ANFANG = get_ini_value(Datei);
   U_LANG   = get_ini_value(Datei);
//----------------------LO_ANFANG ---------------------------------------------
   LO_ANFANG = get_ini_value(Datei);
   LO_LANG   = get_ini_value(Datei);
//----------------------LU_ANFANG ---------------------------------------------
   LU_ANFANG = get_ini_value(Datei);
   LU_LANG   = get_ini_value(Datei);
//----------------------RO_ANFANG ---------------------------------------------
   RO_ANFANG = get_ini_value(Datei);
   RO_LANG   = get_ini_value(Datei);
//----------------------RU_ANFANG ---------------------------------------------
   RU_ANFANG = get_ini_value(Datei);
   RU_LANG   = get_ini_value(Datei);


//----------------------MANN_DIV ---------------------------------------------
   MANN_DIV = get_ini_value(Datei);

//----------------------ANGRIF_L ---------------------------------------------
  ANGRIF_L  = get_ini_value(Datei);
  ANGRIF_LL = get_ini_value(Datei);
//----------------------ANGRIF_R ---------------------------------------------
  ANGRIF_R  = get_ini_value(Datei);
  ANGRIF_RL = get_ini_value(Datei);
//----------------------ANGRIF_O ---------------------------------------------
  ANGRIF_O  = get_ini_value(Datei);
  ANGRIF_OL = get_ini_value(Datei);
//----------------------ANGRIF_U ---------------------------------------------
  ANGRIF_U  = get_ini_value(Datei);
  ANGRIF_UL = get_ini_value(Datei);
//----------------------ANGRIF_LO ---------------------------------------------
  ANGRIF_LO  = get_ini_value(Datei);
  ANGRIF_LOL = get_ini_value(Datei);
//----------------------ANGRIF_LU ---------------------------------------------
  ANGRIF_LU  = get_ini_value(Datei);
  ANGRIF_LUL = get_ini_value(Datei);
//----------------------ANGRIF_RO ---------------------------------------------
  ANGRIF_RO  = get_ini_value(Datei);
  ANGRIF_ROL = get_ini_value(Datei);
//----------------------ANGRIF_RU ---------------------------------------------
  ANGRIF_RU  = get_ini_value(Datei);
  ANGRIF_RUL = get_ini_value(Datei);


  fclose(Datei);
}


/****************************************************************************/
/* Beendet das Spiel.                                                       */
/* ------------------------------------------------------------------------ */
/* keine Parameter                                                          */
/****************************************************************************/
void quit ( void )
{
  chdir("..");
  textmodus();
  printf("Du hast diese Zeit verloren!\n");
  exit(0);
}



void show_fb_menu ( BYTE index )
{
   m_back_restore();
   fill_box(80, 70, 200, 120, 240);
   fill_box(82, 72, 198, 81, 242); write(112, 75, "Mann-Fabrik", 255); write(111, 74, "Mann-Fabrik", 254); 
   if ( FB[index].time != 100000 ) { fill_box(150,84, 197, 90, 250);  write(162, 85, "Baue", 254); }
   else { fill_box(150,84, 197, 90, 253);  write(156, 85, "Bereit", 254); }
   draw_box(82, 84, 147, 105, 255);
   button_down(82, 107, 65, "Goder");

   button_up(150, 95,  47, "OK");
   button_up(150, 107, 47, "Ende");

   m_back_save();
   cpy2screen();

   while ( m_taste != 7 )
   {
     maus_pos(); maus_show();              // Mauspos. berechnen, und anzeigen
     
     if ( m_taste == 1 )
     {
       if ( maus_innen(150, 95, 197, 105) ) { button_punch(150, 95, 47, "OK"); FB[index].time =  2000; return; }
       if ( maus_innen(150,107, 197, 117) ) { button_punch(150,107, 47, "Ende"); return; }
     }

     cpy2screen();
   }

}


void show_explore ( BYTE index, BYTE sort )
{
  int i, j, k;

  if ( !sort )
  {
    k = (ML[index].explose-1)*806;

    for ( i=0; i<26; i++ )
    {
      for ( j=0; j<31; j++ )
      {
        if ( ((ML[index].x+j)<Mrechts)&&((ML[index].x+j)>Mlinks)&&((ML[index].y+i)>Moben)&&((ML[index].y+i)<Munten) )
        {
         if ( ExploseData[k] != 255 ) vsetpix( ML[index].x+j, ML[index].y+i, ExploseData[k], res_x); 
        }
      k++;
      }
    }
  }

  if ( sort )
  {
    k = (FL[index].explose-1)*806;
    for ( i=0; i<26; i++ )
    {
      for ( j=0; j<31; j++ )
      {
        if ( ((FL[index].x+j)<Mrechts)&&((FL[index].x+j)>Mlinks)&&((FL[index].y+i)>Moben)&&((FL[index].y+i)<Munten) )
        {
         if ( ExploseData[k] != 255 ) vsetpix( FL[index].x+j, FL[index].y+i, ExploseData[k], res_x); 
        }
      k++;
      }
    }
  }


}
  

void Line( int x1, int y1, int x2, int y2, BYTE farbe )
{
 int d, dx, dy, aincr, bincr, xincr, yincr, x, y, swp;

 if ( abs((x2-x1)) < abs((y2-y1)) )       
  {
    if ( y1 > y2 )                                    
    {
     swp=x1; x1=x2; x2=swp;
     swp=y1; y1=y2; y2=swp;
    }

   xincr = ( x2 > x1 ) ?  1 : -1;       

   dy = y2 - y1;
   dx = abs( x2-x1 );
   d  = 2 * dx - dy;
   aincr = 2 * (dx - dy);
   bincr = 2 * dx;
   x = x1;
   y = y1;

   if ( (x<Mrechts)&&(x>Mlinks)&&(y<Munten)&&(y>Moben) ) vsetpix(x, y, farbe, res_x);                      
   for (y=y1+1; y<= y2; ++y )         
    {
     if ( d >= 0 )
      {
       x += xincr;
       d += aincr;
      }
     else
      d += bincr;
      if ( (x<Mrechts)&&(x>Mlinks)&&(y<Munten)&&(y>Moben) ) vsetpix(x, y, farbe, res_x);
    }
  }
 else                                             
  {
   if ( x1 > x2 )
   {
     swp=x1; x1=x2; x2=swp;
     swp=y1; y1=y2; y2=swp;
    }

   yincr = ( y2 > y1 ) ? 1 : -1;         

   dx = x2 - x1;
   dy = abs( y2-y1 );
   d  = 2 * dy - dx;
   aincr = 2 * (dy - dx);
   bincr = 2 * dy;
   x = x1;
   y = y1;

   if ( (x<Mrechts)&&(x>Mlinks)&&(y<Munten)&&(y>Moben) ) vsetpix(x, y, farbe, res_x);                        
   for (x=x1+1; x<=x2; ++x )          
    {
     if ( d >= 0 )
      {
       y += yincr;
       d += aincr;
      }
     else
      d += bincr;
     if ( (x<Mrechts)&&(x>Mlinks)&&(y<Munten)&&(y>Moben) ) vsetpix(x, y, farbe, res_x);
    }
  } 
}


