/* virtual LSC monster "compiler"
 *  - written by square@cco.caltech.edu 6/92
 */
/* not done */

#define LSC_MON "u/s/square/lsc/lsc_inherit"

int query_prevent_shadow() { 
	return 1; 
}

string clean_up_code(string line) {
	string contents;
	while(sscanf(line," %s",line) || sscanf(line,"\t%s",line));
	if(strlen(line)>1 && line[0..1]=="%!" ) return line;
	if (line[0]=='%') return 0; /* remove all comment lines */
	return line;
}

string clean_up_string(string str) {
	int n;
	
	while(sscanf(str," %s", str) || sscanf(str,"\t%s",str));
	n=strlen(str);
	if (!n) return str;
	while(str[n-1]==' ') {
		str = str[0..n-2];
		n--;
	}
	return str;
}

object compile_object(string s) {
	string *lines, *id, code;
	string path, long, word, tmp, tmp1, tmp2, name;
	int current, max, l, len, num;
	object lscobj, me;

	if (me=find_player("square")) tell_object(me,"filename:"+s+"\n");
	if ((len=strlen(s)) > 4 && s[len-4..len-1]!=".lsc") {
		s += ".lsc";
	}
	if (file_size(s) == -1)
		return 0;
	seteuid(getuid(this_object()));
	lscobj = clone_object(LSC_MON);
	lines = explode(read_file(s),"\n") - ({
		""	}
	);
	lines = map_array(lines,"clean_up_code", this_object()) - ({
		0	}
	);
	max = sizeof(lines);
	for (current = 0; current < max; current++) {

		word = lines[current];
		len = strlen(word);
		if (len>1 && word[0..1]=="%!") {
			write("got code...\n");
			code = current==max-1?"":implode(lines[current+1..max-1]," ");
			write("code: "+code+"\n");
			lscobj->done();
			lscobj->Compile(code);
			return lscobj;
		}
		sscanf(word,"%s:$*",word);
		switch (word) {
		case "id" :
			sscanf(lines[current],"id:%s", tmp);
			id = explode(tmp+",", ",");
			id = map_array(id,"clean_up_string",this_object()) - ({""});
			lscobj->set("id",({id}) );
			break;

		case "name" :
			sscanf(lines[current],"name:%s",tmp);
			tmp = clean_up_string(tmp);
			lscobj->set_name(tmp);
			break;

		case "aggressive" :
			sscanf(lines[current],"aggressive:%s",tmp);
			tmp = clean_up_string(tmp);
			sscanf(tmp,"%d",num);
			lscobj->set("aggressive",num);
			break;

		case "gender" :
			sscanf(lines[current],"gender:%s",tmp);
			tmp = clean_up_string(tmp);
			lscobj->set("gender",tmp);
			break;

		case "level" : /* not done yet */
			break;
		case "limb" : /* not done yet */
			break;
		case "object" :
			sscanf(lines[current],"object:%s",tmp);
			tmp = clean_up_string(tmp);
			sscanf(tmp,"%s %s", name, path);
			lscobj->add_object(name,path);
			break;
		case "long" :
			current++;
			for (long = ""; lines[current] != "**"; current++) {
				long += lines[current] + "\n";
			}
			lscobj->set("long",long);
			break;
		case "short" :
			sscanf(lines[current],"short:%s",tmp);
			tmp = clean_up_string(tmp);
			lscobj->set("short",tmp);
			break;

		default: 
			break;
		}
	}
	lscobj->done();
	return lscobj;
}