/* 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; }