private static Condition ParseCondition(List<Token> parts, ref int i)
{
ParseFunctions(ref parts);
ConditionList List;
for(; i < parts.Count; i++)
{
if (parts[i].Kind == TokenType.ConditionFunction)
{
// Default
ConditionType Type = ConditionType.And;
switch (parts[i].Value)
{
case "f_and":
Type = ConditionType.And;
break;
case "f_or":
Type = ConditionType.Or;
break;
case "f_not":
Type = ConditionType.Not;
break;
case "f_plus":
Type = ConditionType.Plus;
break;
case "f_div":
Type = ConditionType.Div;
break;
}
// Create the new condition list
List = new ConditionList(Type);
// Parse sub conditions
i++;
while(i < parts.Count && parts[i].Kind != TokenType.CloseParen)
List.Add(ParseCondition(parts, ref i));
i++;
// Return condition list
return List;
}
else if (parts[i].Kind == TokenType.StatFunction)
{
List<string> Params = new List<string>();
string Name = parts[i].Value;
for (; i < parts.Count; i++)
{
if (parts[i].Kind == TokenType.CloseParen)
break;
if (parts[i].Kind == TokenType.OpenParen)
continue;
Params.Add(parts[i].Value);
}
i++;
// Create the condition
switch (Name)
{
case "object_stat":
return new ObjectStat(Params);
case "global_stat":
case "player_stat":
case "player_score":
return new PlayerStat(Params);
case "has_medal":
case "has_rank":
return new MedalOrRankCondition(Params);
case "global_stat_multiple_times":
return new GlobalStatMultTimes(Params);
}
}
else if (parts[i].Kind == TokenType.Literal)
{
ConditionValue V = new ConditionValue(parts[i].Value);
i++;
return V;
}
}
return new ConditionList( ConditionType.And );
}