//Here you go darma, my own little list of tweaks and what some would consider to be h4x.


//This is a new variable used for internal name tweaking
//it should NEVER be directly set!
var name RetName;

final function name StrName(string A)
{
 SetPropertyText("RetName", A);
 
 return RetName;
}

final function int InName(name A, name B)
{
 local int i;
 local string s, s2;
 local name C;
 
 //I have no idea why, but this fucks up when searching for single characters!
 if (NameLen(B) == 1)
 {
  for(i=0; i<NameLen(A); i++)
  {
   if (MidN(A, i, 1) ~= B)
    return i;
  }
 }
 
 s = ""$A$"";
 s2 = ""$B$"";
 
 i = InStr(s, s2);
 
 return i;
}

final function name RightN(name A, int B)
{
 local string S, s2;
 local name n;
 
 s = ""$A$"";
 s2 = Right(s, B);
 
 n = StrName(s2);
 
 return n;
}

final function name MidN(name A, int B, optional int C)
{
 local string S, s2;
 local name n;
 
 s = ""$A$"";
 s2 = Mid(s, B, C);
 
 n = StrName(s2);
 
 return n;
}

final function name LeftN(name A, int B)
{
 local string S, s2;
 local name n;
 
 s = ""$A$"";
 s2 = Left(s, B);
 
 n = StrName(s2);
 
 return n;
}

final function int NameLen(name A)
{
 local int i;
 local string s;
 
 s = ""$A$"";
 
 i = Len(s);
 
 return i;
}


final operator(34) name -= ( name A, name B )
{
 local int i, j;
 local string s;
 local name n, n2;
 local name RN;
  
 if (InName(A, B) == -1)
  return A;
  
  i = InName(A, B);
  n = LeftN(A, i);
  n2 = RightN(A, NameLen(A) - i - NameLen(b));
  
  if (n != '') s = s$n;
  if (n2 != '') s = s$n2;
  
  RN = StrName(s);
  
 return RN;
}

//HOLY SHIT, Why does unreal not have this already?!?
final operator(24) bool ~= ( name A, name B )
{
 local string s1, s2;
 
 s1 = ""$A$"";
 s2 = ""$B$"";
 
 if (s1 ~= s2)
  return true;

 return false;
}

exec function NameLenTest(name n)
{
 ClientMessage("|p4"$NameLen(n)$" character(s) name length");
}

exec function NameLTest(name n, int i)
{
 ClientMessage("|p4"$LeftN(n, i)$" name result");
}

exec function NameRTest(name n, int i)
{
 ClientMessage("|p4"$RightN(n, i)$" name result");
}

exec function NameMTest(name n, int i, optional int j)
{
 ClientMessage("|p4"$MidN(n, i, j)$" name result");
}


exec function StrNameTest(string S)
{
 ClientMessage("|p4"$StrName(s)$" name result");
}

exec function NameSubTest(name A, name B)
{
 ClientMessage("|p4"$A -= B$" name result");
}

exec function InNameTest(name A, name B)
{
 ClientMessage("|p4"$InName(A,B)$" interger result");
}

exec function NameApTest(name A, name B)
{
 ClientMessage("|p4"$A ~= B$" bool result");
}