// obj_trig_save.c
// Saves object triggers to files in the otm directory, each obj_trig
// get its own file to allow for easier managment
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/stat.h>
#include <stdlib.h>
#include "merc.h"
#include "recycle.h"
#include "obj_trig.h"

extern bool is_encrypted;
extern bool fBootDb;
int rename (const char *oldfname, const char *newfname);
OBJ_TRIG_DATA *new_obj_trig(void);
extern OBJ_TRIG *ot_list;
//extern OBJ_TRIG_DATA *obj_trig_list;
extern OBJ_TRIG *giant_ot_list;
extern OBJ_TRIG *on_tick_ot_list;

void save_obj_trig(OBJ_TRIG_DATA *ot);
void fwrite_obj_trig(OBJ_TRIG_DATA *ot, FILE *fp);
AREA_DATA *get_vnum_area args((int vnum));


void otsave(FILE *fp, AREA_DATA *pArea)
{
//	FILE *fp;
	int i=0;
	bool found;
	OBJ_TRIG_DATA *ot;


//	sprintf(strsave, "%s", OTM_FILE);
//	is_encrypted = FALSE;

		encrypt_write("#OT\n", fp);
		for(i = pArea->lvnum; i <= pArea->uvnum; i++)
		{
			if((ot = get_obj_trig(i)) == NULL)
 	                        continue;
			found = TRUE;
			fwrite_obj_trig(ot, fp);
		}
 //	if (found)
  	  encrypt_write("#0\n", fp);
//	else encrypt_write("0\n",fp);
//	encrypt_write("#$\n", fp);
//	fclose(fp);
//	fpReserve = fopen (NULL_FILE, "r");

 //	send_to_char("Save successful.\n\r", ch);
        return;
}

void fwrite_obj_trig(OBJ_TRIG_DATA *ot, FILE *fp)
{
  char buf[MAX_STRING_LENGTH];
  int i;
  
  sprintf(buf, "#%d\n", ot->vnum);
  encrypt_write(buf, fp);
  
  sprintf(buf, "%s~\n", ot->name);
  encrypt_write(buf, fp);
  
  
  
  sprintf(buf, "%s~\n", ot->trigger);
  encrypt_write(buf, fp);
  
  
  sprintf(buf, "%ld\n", ot->trig_flags);
  encrypt_write(buf, fp);
  
  sprintf(buf, "%ld\n", ot->extra_flags);
  encrypt_write(buf, fp);
  
  
  for (i=0;i<16;i++)
    {
      sprintf(buf, "%s~\n", ot->action[i]);
      encrypt_write(buf, fp);
      
      sprintf(buf, "%d\n", ot->chance[i]);
      encrypt_write(buf, fp);
      
      sprintf(buf, "%d\n", ot->delay[i]);
      encrypt_write(buf, fp);
    }
  sprintf(buf, "%d\n", ot->overall_chance);
  encrypt_write(buf, fp);
  
  
  
  return;
}

// load_obj_trigs: called from boot_db loads ot's from obj_trig.are
void load_obj_trigs (FILE *fp)
{
  AREA_DATA *pArea;
  if (area_last == NULL)
    {
      bug ("Load_resets: no #AREA seen yet.", 0);
      exit (1);
    }
  for (;;)
    {
      OBJ_TRIG_DATA *ot, *otp = NULL;
      
      ot_list = NULL;
      giant_ot_list = NULL;
      on_tick_ot_list = NULL;
      for(;;)
	{
	  sh_int vnum;
	  char letter;
	  int i;
	  
	  letter = fread_letter (fp);
	  if (letter != '#')
	    {
	      bug ("load_obj_trigs: # not found.", 0);
	      exit (1);
	    }
	  
	  vnum = fread_number (fp);
	  pArea = get_vnum_area(vnum);
	  if (pArea == NULL)
  	    pArea = get_vnum_area(100);
	  if (vnum == 0)
	    break;
	  
	  fBootDb = FALSE;
	  
	  if (get_obj_trig(vnum) != NULL)
	    {
	      bug ("load_obj_trig: vnum %d duplicated.", vnum);
	      exit (1);
	    }
	  
	  fBootDb = TRUE;
	  
	  ot = new_obj_trig();
	  ot->vnum = vnum;
	  ot->name = fread_string(fp);
	  ot->trigger = fread_string(fp);
	  ot->trig_flags = fread_number(fp);
	  ot->extra_flags = fread_number(fp);
	  for (i = 0; i < 16; i++)
	    {
	      ot->action[i] = fread_string(fp);
	      ot->chance[i] = fread_number(fp);
	      ot->delay[i] = fread_number(fp);
	    }
	  ot->overall_chance = fread_number(fp);
	  // A little bit of sloppy cleanup:
	  if(!str_cmp(ot->name, "(null)"))
	    ot->name = NULL;
	  if(!str_cmp(ot->trigger, "(null)"))
	    ot->trigger = NULL;
	  for (i = 0; i < 16; i++)
	    {
	      if(!str_cmp(ot->action[i], "(null)"))
		ot->action[i] = NULL;
	    }
	  
	  ot->fakie = create_mobile(get_mob_index(MOB_VNUM_FAKIE));
	 

/*          if (pArea == NULL)
	  {
	    bug("Objtrigger vnum %d is NOT IN AN AREA!",vnum);
	    free_ot(ot);
	    continue;
	  }*/
	  
	  if (pArea->ot_first == NULL)
	  {
	    pArea->ot_first = ot;
	    ot->next = NULL;
	  }
	  else 
	  {
	    for (otp = pArea->ot_first; otp->next != NULL;otp = otp->next)
	    {
  	    }
	    otp->next = ot;
	  }
	  /*if (otp == NULL)
	    {
		    //pArea to area_last
	      ot->next = pArea->ot_first;
	      pArea->ot_first = ot;
	      otp = ot;
	    }
	  else
	    {
	      otp->next = ot;
	      ot->next = NULL;
			otp = ot;
	    }*/
	  
	}
      
      return;
    }
}