mud/lib/secure/cmds/admins/statconvert.c
2020-09-06 05:43:07 -07:00

97 lines
2.9 KiB
C

/* statconvert.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 = 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(this_player()->query_cwd(), files);
Convert(files, change);
return 1;
}
string GetHelp(){
return ("Syntax: statconvert <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: statconvert *.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.");
}