//**************************************************************************//
// Das hier wird die DEFKON17 Konvertierung auf WATCOM C                    //
// -----------------------------------------------------                    //
// von Stephan Meiáner                                                      //
// ab 25. Mrz 1996                                                         //
//**************************************************************************//
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <graph.h>
#include <dos.h>
#include <i86.h>
#include <string.h>
#include "gfklib.h"
#include "pcxlib.h"
#include "maus.h"
#include "font.h"
#include "button.h"
#include "defkon.h"
#include "smenu.h"
#include "menue.h"
#include "ki.h"
#include "mann.h"

#define px      1
#define py      90


void main ( int argc, char *argv[] )
{
  char p[768], i;

  Init_Program();
  if ( intro ) { play_dfl("defkon.dfl"); fade_out(); delay(500); }
  if ( (argc < 2) ) { Init_Spiel(1); Spiel(); quit(); }
  else { Menue(); quit(); }
}


void Spiel ( void )
{
  int i, j=0, pal_count=45, RegenAnz=50, Regen=1;
  char strgeld[5], c, update=0;
  DEST regen[400];
  struct dostime_t t, tm;

  MannFeld[2][3] = 290;

  go = atack = noway = 0;
  write(265,29, "A", 255); write(276,29, "B", 255); write(287,29, "C", 255); write(298,29, "D", 255); write(309,29, "E", 255);
  write(270,12, "A", 255); write(271,13, "A", 254);
  write(11,188, "Menu", 255); write(10,187, "Menu", 254);
  _dos_gettime(&tm);
  t.minute = 0; t.second = 0; _dos_settime(&t);
  for(i=0; i<RegenAnz; i++) { regen[i].x = rand() % Mrechts; regen[i].y = rand() % (Munten-4); }


  while ( m_taste != 7 )                                  // sinnlose Abfrage
  {
    update = 0; fast_scroll = 1;
    m_show_image= 1;                         // Mauszeiger auf Default setzen
    if ( go == 1  ) m_show_image= 6;  // Bewegungszeiger, wenn Mann aktiv ist
    if ( atack==1 ) { m_show_image= 8; atack= 0; }           // Angrifszeiger
    if ( noway==1 ) { m_show_image= 8; noway= 0; }               // Hindernis
    if ( maus_innen(260, 0, 320, 200) ) m_show_image = 1;
    maus_pos();
    if ( (rahmen == 1)&&(m_x>259) ) m_x=259;
    if ( (rahmen == 1)&&(m_y>179) ) m_y=179;
    maus_show();                          // Mauspos. berechnen, und anzeigen

    if ( (Feld[f_y+(m_y/20)][f_x+(m_x/20)] > Hindernis)&&(aktive) ) noway=1; 
    if ( m_taste == 1 )
    {
      i = maus_links();
      if ( i ) return;                                             // beenden
      if ( !i ) goto compute;               // im Men wurde 'Weiter' gewhlt
    }
    if ( m_taste == 2 ) { maus_rechts(); fast_scroll = 2; }
    if ( m_taste == 3 ) maus_beide();

    if ( kbhit() )
    {
      c = getch();
      if ( c == 0 )
      {
        c = getch();
      }
      else
      {
        if ( c == 27 ) { m_back_restore(); if ( spiel_menu() ) return;  screen_refresh= 1; }
        if ( c == 45 ) { mann_del+=4; }                                // -
        if ( c == 43 ) { if ( mann_del > 0 ) mann_del-=4; }            // +
        if ( c == 47 ) { scroll_del+=1; }                              // /
        if ( c == 42 ) { if ( scroll_del > 0 ) scroll_del-=1; }        // *
        if ( c ==  8 ) { scroll_del = ss_del; mann_del = sm_del; }     // bs
        if ( c ==109 ) { if ( MannAnzahl > -1 ) { MF[ML[0].feldy][ML[0].feldx]=0; mann_back_restore(0); MannDelete(0); } }
        if ( c ==102 ) { if ( FeindAnzahl > -1 )
        if ( c ==97  ) if ( RegenAnz < 400 ) RegenAnz++;
        if ( c ==121 ) if ( RegenAnz > 0 ) RegenAnz--;
        if ( c ==114 ) { if ( res == 320x200 ) init640x480(); if ( res == 640x480 ) init320*200(); }
        {
          MF[FL[0].feldy][FL[0].feldx]=0;
          if ( FL[0].job == SaveMain ) HauptAnz--;
          feind_back_restore(0); FeindDelete(0);
        } }
        if ( c == 13 )
        {
           m_back_restore();
           MannInsert((f_x*Teilung)+m_x, (f_y*Teilung)+m_y, 2); mann_set(MannAnzahl);
           m_back_save(); m_place();
        }
        if ( c == 33 )
        {
           m_back_restore();
           FeindInsert((f_x*Teilung)+m_x, (f_y*Teilung)+m_y, 2); feind_set(FeindAnzahl);
           m_back_save(); m_place();
        }
        if ( c == 32 )
        {
          for ( i=0; i<MannAnzahl+1; i++ )
          {
            if ( AktListe[i] ) mann_set(i);
            AktListe[i] = 0;
          }
          fill_box(264, 48, 317, 68, 255); fill_box(264, 79, 315, 87, 251);
          go=0; atack=0; aktzaehler = -1; aktive = 0; aktsel = -1;
        } 

      } // c == 0;
    }

    if ( meldung == 0 ) fill_box(100, 186, 230, 194, 0);
    if ( meldung >  0 ) meldung--;
    for (i=0; i<=fbcount; i++)
    {
      if ( FB[i].time != 100000 ) FB[i].time--;
      if ( FB[i].time == 0 )
      {
         if ( FB[i].owner == 1 )
         {
           MannInsert((FB[i].x*Teilung), ((FB[i].y+1)*Teilung), 1);
           fill_box(100, 186, 230, 194, 0); write(100, 187, "Neuer Mann erstellt", 245); meldung=200;
         }
         if ( FB[i].owner == 2 ) FeindInsert((FB[i].x*Teilung), ((FB[i].y+1)*Teilung), 1);
         FB[i].time=100000;
      }
    }
//  //-- Medikit setzen --//
    MediDelay = rand() % MediRand;
    if ( (MediDelay == 1)&&(MediSet == 0) )
    {
      while ( Feld[MediKit.y][MediKit.x] > 1 )
      {
        MediKit.x = rand() % x_lang+1;
        MediKit.y = rand() % y_breit+1;
      }
      MediSave = Feld[MediKit.y][MediKit.x];
      Feld[MediKit.y][MediKit.x] = 113;
      MediSet = 1; MediRand = rand() % (MannAnzahl*FeindAnzahl);
      fill_box(100, 186, 230, 194, 0); write(100, 187, "Medikit geortet!", 249); meldung=200;
    }
    //-------------------------------------------------------------------------------------------------
    if ( (m_y>196)&&(f_y<FELD_Y) )  { if ((sdel>=scroll_del)&&(!rahmen)) { scroll_down(); update=1; } else sdel++; }
    if ( (m_y<  3)&&(f_y>1) )       { if ((sdel>=scroll_del)&&(!rahmen)) { scroll_up(); update=1;   } else sdel++; }
    if ( (m_x>316)&&(f_x<FELD_X)) { if (sdel>=scroll_del) { scroll_right(); update=1;} else sdel++; }
    if ( (m_x<  3)&&(f_x>0) )       { if ((sdel>=scroll_del)&&(!rahmen)) { scroll_left(); update=1; } else sdel++; }
    //-------------------------------------------------------------------------------------------------

compute:

    Feind_KI();

    for(i=0; i<=fbcount; i++) FB[i].inrange = 0;

//  //-- Alle Mnner werden berechnet --//
    if ( MannAnzahl > -1 )                      // ist berhaupt ein Mann da
    {
      inRange = 0; atkzoom = -1;
      for ( i=0; i<MannAnzahl+1; i++ )
      {
        if ( ML[i].type == 1 ) Mann1_compute(i);
        if ( ML[i].type == 2 ) Mann2_compute(i);
        //-- Ist er nahe einer Fabrik --//
        for (j=0; j<=fbcount; j++) if ( ((ML[i].feldx<FB[j].x+4)&&(ML[i].feldx>FB[j].x-4))&&((ML[i].feldy<FB[j].y+4)&&(ML[i].feldy>FB[j].y-4)) ) FB[j].inrange++;
        if ( ML[i].feldy < FHauptY+15 ) inRange++;
        if ( ML[i].atkanz > 0 ) atkzoom = i;
        }
      }

//  //-- Alle Feinde werden berechnet --//
    if ( FeindAnzahl > -1 )                      // ist berhaupt ein Mann da
    {
      HauptAnz=0; FBAnzahl=0; avaiable=FeindAnzahl;
      for ( i=0; i<FeindAnzahl+1; i++ )
      {
        if ( FL[i].type == 1 ) Feind1_compute(i);
        if ( FL[i].type == 2 ) Feind2_compute(i);

        if ( FL[i].job == SaveMain ) HauptAnz++;
        if ( FL[i].job == SaveFB )   FBAnzahl++; 
        if ( FL[i].job != 0 ) avaiable--;
      }
    }

    if ( !update ) UpdateScreen();
    else {
//----------------------------------------------------------------------------
    if ( MannAnzahl > -1 )                      // ist berhaupt ein Mann da
    {
      m_back_restore();
      for ( i=0; i<MannAnzahl+1; i++ ) 
      {
        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);
        ML[i].ax1= ML[i].ax; ML[i].ay1= ML[i].ay;
      }
      m_back_save(); m_place();
    }

    if ( FeindAnzahl > -1 )
    {
      m_back_restore();
      for ( i=0; i<FeindAnzahl+1; i++ )
      {
        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);
        FL[i].ax1= FL[i].ax; FL[i].ay1= FL[i].ay;
      }
      m_back_save(); m_place();
    }     }
    m_back_restore();

//  //-- Regen --//
    if ( Regen == 1 )
    {
      for(i=0; i<RegenAnz; i++)
      {
        if ( regen[i].y > (Munten-2) ) { regen[i].y=rand() % 100; regen[i].x=rand() % Mrechts; }
        regen[i].y++; j = rand() % 5;
        if ( j == 2 ) vsetpix(regen[i].x, regen[i].y, 50, res_x);
        else vsetpix(regen[i].x, regen[i].y, 49, res_x);
      }
    }
    if ( maus_innen(4, 184, 40, 194) )  { m_show_image = 1; write(10,187, "Menu", 211); }
    else write(10,187, "Menu", 254);
    //--------------------------------------------------------------------------
    fill_box(306, 48, 317, 68, 255);
    if ( aktsel != -1 )
    {
      Iwrite(306, 48, Data[ML[aktsel].type].see_reach, 251); Iwrite(306, 57, ML[aktsel].energie, 251);
    }
    //--------------------------------------------------------------------------
    fill_box(263, 122, 273, 128, 97); Iwrite(263, 123, MannAnzahl+1, 255);
    fill_box(263, 134, 273, 139, 247); Iwrite(263, 135, FeindAnzahl+1, 255);
//    fill_box(277, 123, 317, 127, 255); fill_box(277, 123, 277+(((MannAnzahl+FeindAnzahl)*2)/FeindAnzahl), 127, 112);
//    fill_box(277, 135, 317, 139, 255); fill_box(277, 135, 277+(((MannAnzahl+FeindAnzahl)*2)/MannAnzahl),  139, 247);
    //--------------------------------------------------------------------------
    _dos_gettime(&t); fill_box(282, 12, 315, 19, 243);
    Iwrite(286, 13, t.minute, 255); write(298, 13, ":", 255); Iwrite(304, 13, t.second, 255);
    Iwrite(285, 12, t.minute, 254); write(297, 12, ":", 254); Iwrite(303, 12, t.second, 254);
    //--------------------------------------------------------------------------

    if ( atkzoom > -1 ) write(271,13, "A", 251);
    else write(271,13, "A", 254);

    if ( rahmen == 1 )
    {
      if ( r_x!=m_x )
      {
        if ( r_x<m_x ) for(i=r_x; i<=m_x; i++) { vsetpix(i, r_y, 254, res_x); vsetpix(i, m_y, 254, res_x); }
        if ( r_x>m_x ) for(i=m_x; i<=r_x; i++) { vsetpix(i, r_y, 254, res_x); vsetpix(i, m_y, 254, res_x); }
      }
      if ( r_y!=m_y )
      {
        if ( r_y<m_y ) for(i=r_y; i<=m_y; i++) { vsetpix(r_x, i, 254, res_x); vsetpix(m_x, i, 254, res_x); }
        if ( r_y>m_y ) for(i=m_y; i<=r_y; i++) { vsetpix(r_x, i, 254, res_x); vsetpix(m_x, i, 254, res_x); }
      }
    }
    //--------------------------------------------------------------------------
    if ( radar_akt ) radar();
    m_back_save(); m_place();

    if ( (MannAnzahl < 0)||(FeindAnzahl < 0) ) { shut_down(); return; }
    if ( screen_refresh ) cpy2screen();
  }

  _dos_settime(&tm);

}







void radar ( void )
{
  int i, j;

  fill_box(Radar_x+1, Radar_y+1, Radar_x1-2, Radar_y1, 110);
  draw_box(((f_x*50)/x_lang)+Radar_x+1, ((f_y*50)/y_breit)+Radar_y+1, (((f_x+16)*50)/x_lang)+Radar_x+1, (((f_y+10)*50)/y_breit)+Radar_y+1, 254);

  for (i=0; i<=y_breit; i++)
  {
    for (j=0; j<=x_lang; j++)
    {
      if ( MannFeld[i][j] > 0 )
      {
        if ( MannFeld[i][j] <= 199 ) vsetpix(((j*50)/x_lang)+Radar_x+1, ((i*50)/y_breit)+Radar_y+1, 252, res_x);
        else vsetpix(((j*50)/x_lang)+Radar_x+1, ((i*50)/y_breit)+Radar_y+1, 251, res_x);
      }
    }
  }

  for (i=0; i<=fbcount; i++)
  {
    if ( FB[i].owner == 0 ) vsetpix(((FB[i].x*50)/x_lang)+Radar_x+1, ((FB[i].y*50)/y_breit)+Radar_y+1, 254, res_x);
    if ( FB[i].owner == 1 ) vsetpix(((FB[i].x*50)/x_lang)+Radar_x+1, ((FB[i].y*50)/y_breit)+Radar_y+1, 244, res_x);
    if ( FB[i].owner == 2 ) vsetpix(((FB[i].x*50)/x_lang)+Radar_x+1, ((FB[i].y*50)/y_breit)+Radar_y+1, 247, res_x);
  }

  if ( MediSet == 1 ) vsetpix(((MediKit.x*50)/x_lang)+Radar_x+1, ((MediKit.y*50)/y_breit)+Radar_y+1, 249, res_x);
  screen_refresh = 1;
}


