musicmud-2.1.6/data/
musicmud-2.1.6/data/help/
musicmud-2.1.6/data/policy/
musicmud-2.1.6/data/wild/
musicmud-2.1.6/data/world/
musicmud-2.1.6/doc/
musicmud-2.1.6/src/ident/
musicmud-2.1.6/src/lua/
musicmud-2.1.6/src/lua/include/
musicmud-2.1.6/src/lua/src/lib/
musicmud-2.1.6/src/lua/src/lua/
musicmud-2.1.6/src/lua/src/luac/
/* 
 * MusicMUD Daemon, version 1.0
 * Copyright (C) 1998-2003 Abigail Brady
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 * 
 */
#include <stdio.h>
#include <string.h>

#include "musicmud.h"
#include "zoneload.h"
#include "flags.h"
#include "pflags.h"
#include "paths.h"

string getline(FILE *f) {
  string s;
  while (1) {
    int ch = getc(f);
    if (ch == EOF)
      return s;
    if (ch == '\n')
      return s;
    s += ch;
  }
}

string getproperty(FILE *who) {
  string buffer;
  int quotes = 0;
  while (quotes!=2) {
    int value = fgetc(who);
    if (value == EOF) return buffer;
    if (value=='"')
      quotes++;
    if (value=='\n' && quotes!=1) {
      break;
    }
    if (value=='\\') {
      int value = fgetc(who);
      if (value == EOF) return buffer;
      buffer += value;
      continue;
    }
    buffer += value;
  }
  return buffer;
}

void load_newzone(const char *zonename) {
  FILE *f = xopen(DATA_WORLD, zonename, "r");
  
  if (!f) {
    log(PFL_SEEINFO, 0, "zones", "can't load zone : %s", zonename);
    return;
  }
  
  string lastid;
  
  string buffer;
  
  while (!feof(f)) {
    buffer = getline(f);
    if (feof(f)) break;
    if (buffer.substr(0, 10)=="mudobject ")
      {
	string id = buffer.substr(buffer.find('"')+1);
	id = id.substr(0, id.find('"'));
	
	if (planet->get(id.c_str())) {
	  log(PFL_SEEINFO, 0, "zoneload", "corrupt zone file : object %s repeated", id.c_str());
	  while (!feof(f) && buffer != "}")
	    buffer = getproperty(f);
	} else {
	  
	  lastid = id;
	  MudObject *o = new MudObject(id.c_str());
	  planet->add(*o);
	  
	  while (buffer != "}") {
	    buffer = getproperty(f);
	    if (feof(f))
	      break;
	    o->load(buffer.c_str());
	  }
	  
	  if (const char *s = o->get("!owner")) {
	    if (!o->get("start"))
	      o->set("start", s);
	    o->unset("!owner");
	  }
	  
	  if (!o->get("zone")) 
	    o->set("zone", zonename);
	}
	
      } else {
	log(PFL_SEEINFO, 0, "zoneload", "error in zone file : %s (%s)", buffer.c_str(), lastid.c_str());
      }
  }
  
  xclose(f);
}

void load_zones() { 
  FILE *f = xopen(DATA_WORLD, "index", "r");
  if (!f)
    return;
  do {
    string zone = getline(f);
    if (!feof(f)) {	
      load_newzone(zone.c_str());
    }
  } while (!feof(f));
  xclose(f);
}