/* DAGMON - Hacking the MONSTER.BSA file for useful data
 * Copyright (c) 1996 Dave Humphrey - aj589@freenet.carelton.ca
 *
 * Monster Data Begins at Hex Offset 2A15h from beginning of MONSTER.BSA
 */

// Standard Include files
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct monster_type MONSTER_TYPE;

struct monster_type {
   unsigned char name[22];
   unsigned int hitdice;
   unsigned char rest[50];
};


//========= Exits program and displays error message ========================
void bug(char *string, char *file) {
  clrscr();
  printf ("DAGMON ERROR: %s\n", string);
  if (file != NULL) printf ("Filename = %s\n\n", file);
  exit(1); }
//========= End of procedure bug() ==========================================


//========= Main Program ====================================================
int main (void) {
  char filename[20] = "monster.bsa";
  int i, n; //Loop counters
  MONSTER_TYPE monster[43];
  FILE *f;

  if ((f = fopen(filename, "rb")) == NULL) bug("Could not open file!", filename);
  fseek(f, 0x2A15, SEEK_SET);  //Seek to beginning of monster data, Gargoyle


  for (n = 0; n < 32; n++) { //Read monsters
    fread(&monster[n].name[0], sizeof(char), 23, f); //Read name
    fseek(f, 1, SEEK_CUR);  //Jump ahead one byte
    fread(&monster[n].hitdice, sizeof(int), 1, f);  //Read number of d8 hit dice

    for (i = 0; i < 48; i++) { //Read remaining stuff
      monster[n].rest[i] = (int) fgetc(f);
     }
   } //End of for loop

  fseek(f, 0x5D4E, SEEK_SET);  //Jump to 2nd set of monster data

  for (n = 32; n < 41; n++) { //Read more monsters
    fread(&monster[n].name[0], sizeof(char), 23, f); //Read name
    fseek(f, 1, SEEK_CUR);  //Jump ahead one byte
    fread(&monster[n].hitdice, sizeof(int), 1, f);  //Read number of d8 hit dice

    for (i = 0; i < 48; i++) { //Read remaining stuff
      monster[n].rest[i] = (int) fgetc(f);
     }
   } //End of for loop

  fseek(f, 0x6138, SEEK_SET);  //Jump to 3rd set of monster data

  for (n = 41; n < 42; n++) { //Read more monsters
    fread(&monster[n].name[0], sizeof(char), 23, f); //Read name
    fseek(f, 1, SEEK_CUR);  //Jump ahead one byte
    fread(&monster[n].hitdice, sizeof(int), 1, f);  //Read number of d8 hit dice

    for (i = 0; i < 48; i++) { //Read remaining stuff
      monster[n].rest[i] = (int) fgetc(f);
     }
   } //End of for loop

  fclose(f);

  if ((f = fopen("temp.dat", "wt")) == NULL) bug("Could not open file!", "temp.txt");
  fprintf (f, "MONSTER.BSA Stuff\n\n");
  fprintf (f, "%23s %2s\n", "MONSTER NAME", "HP");
  fprintf (f, "%23s %2s\n", "=================", "==");

  for (n = 0; n < 42; n++) { //Write all monsters
    fprintf (f, "%23s %2d", monster[n].name, monster[n].hitdice);

    for (i = 0; i < 48; i++) { //Write all stuff
      fprintf (f, " %3d", (unsigned int) monster[n].rest[i]);
     }

    fprintf (f, "\n");
   } //End of for loop


  fclose(f);

  return(0); }
//========= End Main Program ================================================