dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/*   sconvert.c
 *   A utility which reduces or raises SetSkill and SetStat lines
 *   in a file by a specified percentage.
 *   created by Blitz@Dead Souls
 */

void GetHelp(string str);

string ConvertLine(string str, int change, int line, string search)
{
    string s1, s2, cut, n, tmp;
    int a, b, val;

    if(!archp(previous_object())) return 0;
    while( (a = strsrch(str, search)) > -1 ) {
	tmp = str[a..];
	b = strsrch(tmp, ")");
	if( b < 0) break;
	cut = tmp[0..b];
	if( sscanf(cut, "%s,%s", s1, s2) != 2 ) break;
	s2 = replace_string(s2, " ", "");
	sscanf(s2, "%s)", s2);
	val = to_int(s2);
	if( !val ) break;
	val = val - (val / (100 / change));
	n = sprintf("%s, %d)", s1[0] + "@@@" + s1[1..], val);
	str = replace_string(str, cut, n);
	write("Line "+line+": "+cut+" -> "+val+".");
    }
    str = replace_string(str, search[0] + "@@@" + search[1..], search);
    return str;
}

void Convert(string s, int change) {
    string args, file, str;
    string *files, *tmp;
    int i;

    if(!archp(previous_object())) return 0;
    if( !sizeof(s) ) args = "*.c";
    else args = s;
    files = (string *)this_player()->wild_card(args);
    if( !i = sizeof(files) ) {
	message("info", "No file(s) found: "+implode(files, " "),
	  this_player() );
	return;
    }
    foreach(file in files) {
	string line;
	int    changed = 0;

	str = read_file(file);
	if( !sizeof(str) ) continue;
	i = sizeof(tmp = explode(str, "\n"));
	write("Checking: "+file);
	while(i--) {
	    line = tmp[i];
	    line = ConvertLine(line, change, i, "SetSkill");
	    line = ConvertLine(line, change, i, "SetStat");
	    if( tmp[i] != line ) changed = 1;
	    if( changed ) tmp[i] = line;
	}
	if( changed ) {
	    rename(file, file+"~");
	    write(file+": Writing new file...");
	    write_file(file, implode(tmp, "\n"));
	}
    }
}

mixed cmd(string str) {
    string files;
    int change;

    if(!archp(previous_object())) return 0;
    if( !sizeof(str) || (sscanf(str, "%s %d", files, change) != 2) || !change) {
	GetHelp(0);
	return 1;
    }
    files = absolute_path((string)this_player()->query_cwd(), files);
    Convert(files, change);
    return 1;
}


void GetHelp(string str) {
    message("info",
      "Syntax: sconvert <filename | wild card> <percentage>\n\n"
      "This command searches through the specified file(s) and lowers "
      "all occurrences of SetSkill and SetStat by a <percentage> "
      "amount.\n\n"
      "Example: sconvert *.c 10\n"
      "  - Searches all .c files in your currenct path, and reduces\n"
      "    all skill and stat settings by 10%\n\n"
      "Note: It is possible to raise settings by passing a negative number.",
      this_player() );
}