public static Rank ParseRank( string name ) {
if( name == null ) return null;
if( RanksByFullName.ContainsKey( name ) ) {
return RanksByFullName[name];
}
if( name.Contains( "#" ) ) {
// new format
string id = name.Substring( name.IndexOf( "#" ) + 1 );
if( RanksByID.ContainsKey( id ) ) {
// current class
return RanksByID[id];
} else {
// unknown class
int tries = 0;
while( LegacyRankMapping.ContainsKey( id ) ) {
id = LegacyRankMapping[id];
if( RanksByID.ContainsKey( id ) ) {
return RanksByID[id];
}
// avoid infinite loops due to recursive definitions
tries++;
if( tries > 100 ) {
throw new RankDefinitionException( "Recursive legacy rank definition" );
}
}
// try to fall back to name-only
name = name.Substring( 0, name.IndexOf( '#' ) ).ToLower();
return RanksByName.ContainsKey( name ) ? RanksByName[name] : null;
}
} else if( RanksByName.ContainsKey( name.ToLower() ) ) {
// old format
return RanksByName[name.ToLower()]; // LEGACY
} else {
// totally unknown rank
return null;
}
}