using System; using NTERA.EmuEra.Game.EraEmu.GameData.Variable; using NTERA.EmuEra.Game.EraEmu.GameProc; namespace NTERA.EmuEra.Game.EraEmu.GameData.Function { internal sealed class UserDefinedRefMethod { public CalledFunction CalledFunction { get; private set; } public string Name { get; private set; } public Type RetType { get; private set; } public UserDifinedFunctionDataArgType[] ArgTypeList { get; private set; } internal static UserDefinedRefMethod Create(UserDefinedFunctionData funcData) { UserDefinedRefMethod ret = new UserDefinedRefMethod(); ret.Name = funcData.Name; if (funcData.TypeIsStr) ret.RetType = typeof(string); else ret.RetType = typeof(Int64); ret.ArgTypeList = funcData.ArgList; return ret; } /// /// 戻り値と引数の数・型の完全一致が必要 /// /// /// 一致ならtrue internal bool MatchType(CalledFunction call) { FunctionLabelLine label = call.TopLabel; if (label.IsError) return false; if (RetType != label.MethodType) return false; if (ArgTypeList.Length != label.Arg.Length) return false; for (int i = 0; i < ArgTypeList.Length; i++) { VariableToken vToken = label.Arg[i].Identifier; if (vToken.IsReference) { UserDifinedFunctionDataArgType type = UserDifinedFunctionDataArgType.__Ref; type += vToken.Dimension; if (vToken.IsInteger) type |= UserDifinedFunctionDataArgType.Int; else type |= UserDifinedFunctionDataArgType.Str; if (ArgTypeList[i] != type) return false; } else { if (vToken.IsInteger && ArgTypeList[i] != UserDifinedFunctionDataArgType.Int) return false; if (vToken.IsString && ArgTypeList[i] != UserDifinedFunctionDataArgType.Str) return false; } } return true; } /// /// 戻り値と引数の数・型の完全一致が必要 /// /// /// 一致ならtrue internal bool MatchType(UserDefinedRefMethod rother) { if (RetType != rother.RetType) return false; if (ArgTypeList.Length != rother.ArgTypeList.Length) return false; for (int i = 0; i < ArgTypeList.Length; i++) { if (ArgTypeList[i] != rother.ArgTypeList[i]) return false; } return true; } internal void SetReference(CalledFunction call) { CalledFunction = call; } } }