/*
** geschrieben von
**  ssch0098@rz.uni-hildesheim.de (Stefan Schwoon)
**
** Datei: baulab.c
**
** Kommentar:
**  Erzeugt ein Labyrinth aus einer Textdatei
*/


#include <stdio.h>
#include <string.h>
#include <time.h>

#include "global.h"
#include "speicher.h"
#include "labyrinth.h"
#include "farben.h"


char MAGIC[11]="iMazeLab1\n";
char **lab;

#define BASISFARBE 1
#define BASISTUERFARBE 8

#ifndef NORMALFARBE
#define NORMALFARBE 5
#endif

#define M(a,b) a.unbegehbar = b>>7; a.schusssicher = (b>>6) & 1; a.farbe = b&0x0f;

extern char *optarg;
extern int optind;

u_int feldlaenge, feldbreite;
block **spielfeld;

static char *av0;

static int wanddichte, tuerdichte, startwert;
static int suchen, laber;


static void speicherlab(name)
char *name;
{
	FILE *datei;
	u_char daten[4];
	int x, y, i;

	if (strcmp(name, "-"))
		datei = fopen(name, "wb");
	else
		datei = stdout;

	if (datei == NULL)
	{
	fehler:
		fprintf(stderr, "cannot write file '%s'\n", name);
		exit(1);
	}

	if (fwrite(MAGIC, 1, strlen(MAGIC), datei) != strlen(MAGIC))
		goto fehler;

	daten[0] = feldbreite;
	daten[1] = feldlaenge;
	if (fwrite(daten, 1, 2, datei) != 2)
		goto fehler;

	for (y = 0; y < feldlaenge; y++)
		for (x = 0; x < feldbreite; x++)
		{
			for (i = 0; i < 4; i++)
			{
				struct wand *wand;

				wand = &spielfeld[x][y][i];
				daten[i] = wand->unbegehbar << 7 |
					wand->schusssicher << 6 | wand->farbe;
			}
			if (fwrite(daten, 1, 4, datei) != 4)
				goto fehler;
		}

	if (laber)
		fprintf(datei == stdout ? stderr : stdout,
			"iMaze makelab 1.0: %dx%d\n", feldbreite, feldlaenge);

	fprintf(datei,
		"iMaze makelab 1.0: %dx%d\n", feldbreite, feldlaenge);

	if (datei != stdout)
		fclose(datei);
}


static int leselab(char *fname)
{
  FILE *f;
  char zeile[256],*z;
  int i,j;
  char temp,temp2,temp3;
  
  feldbreite = feldlaenge = 0;
  f = fopen(fname,"rt");
  do
    fgets(zeile,256,f);
  while (zeile[0]!='+');
  
  for (z = zeile, i=0; i<strlen(zeile); z++, i++)
    if (*z=='+') feldbreite++;
  feldbreite--;
  
  while (!feof(f))
  {
    fgets(zeile,256,f);
    if (zeile[0]=='+') feldlaenge++;
  }
  feldlaenge--;
/*  printf("%i %i\n",feldbreite,feldlaenge); */
  
  speicher_belegen((void **)&spielfeld, feldbreite * sizeof(block *));

  for (j = 0; j < feldbreite; j++)
    speicher_belegen((void **)&spielfeld[j],feldlaenge * sizeof(block));
  
  f = fopen(fname,"rt");
  do
    fgets(zeile,256,f);
  while (zeile[0]!='+');
  for (j = 0; j < feldlaenge; j++)
  {
    for(i = 0; i < feldbreite; i++)
    {
      if (j==0)
      { 
        M(spielfeld[i][j][NORD],0xc5)
        M(spielfeld[i][feldlaenge-1][SUED],0xc5);
      }
      else
      switch (zeile[(i<<1)+1])
      {
        case ' ' : M(spielfeld[i][j][NORD],0);
                   M(spielfeld[i][j-1][SUED],0);
                   break;

        case '-' : M(spielfeld[i][j][NORD],0xc5);
                   M(spielfeld[i][j-1][SUED],0xc5);
                   break;
        case '^' : M(spielfeld[i][j][NORD],(0x48 | (zufall() & 0x07)));
                   M(spielfeld[i][j-1][SUED],0xc5);
                   break;
        case 'v' : M(spielfeld[i][j][NORD],0xc5);
                   M(spielfeld[i][j-1][SUED],(0x48 | (zufall() & 0x07)));
                   break;
        case '|' : M(spielfeld[i][j][NORD],(0x48 | (zufall() & 0x07)));
                   M(spielfeld[i][j-1][SUED],(0x48 | (zufall() & 0x07)));
                   break;
        default : printf(stderr, "Illegal char : %c\n",zeile[(i<<1)+1]);
                  exit(1);
      }
    }
    fgets(zeile,256,f);
    M(spielfeld[0][j][WEST],0xc5);
    M(spielfeld[feldbreite-1][j][OST],0xc5);
    for(i = 1; i < feldbreite; i++)
    {
      switch (zeile[i<<1])
      {
        case ' ' : M(spielfeld[i][j][WEST],0);
                   M(spielfeld[i-1][j][OST],0);
                   break;
        case '|' : M(spielfeld[i][j][WEST],0xc5);
                   M(spielfeld[i-1][j][OST],0xc5);
                   break;
        case '<' : M(spielfeld[i][j][WEST],(0x48 | (zufall() & 0x07)));
                   M(spielfeld[i-1][j][OST],0xc5);
                   break;
        case '>' : M(spielfeld[i][j][WEST],0xc5);
                   M(spielfeld[i-1][j][OST],(0x48 | (zufall() & 0x07)));
                   break;
        case '-' : M(spielfeld[i][j][WEST],(0x48 | (zufall() & 0x07)));
                   M(spielfeld[i-1][j][OST],(0x48 | (zufall() & 0x07)));
                   break;
        default : printf(stderr, "Illegal char : %c\n",zeile[(i<<1)+1]);
                  exit(1);
      }
    }
    fgets(zeile,256,f);
  }                             
  fclose(f);
}  
  
/* bis hier lokaler Teil                       */
/***********************************************/
/* ab hier globaler Teil                       */


void uebler_fehler(meldung, knopf)
char **meldung;
char *knopf;
{
	fprintf(stderr, "fatal error\n");
	exit(1);
}


int main(argc, argv)
int argc;
char **argv;
{
  if (argc!=3)
  {
    printf("Usage : %s infile outfile\n",argv[0]);
    exit(1);
  }
  leselab(argv[1]);
  speicherlab(argv[2]);
  return 0;
}

