TRCommands.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using System;
  2. using System.Collections.Generic;
  3. using MinorShift.Emuera.GameData.Expression;
  4. using MinorShift.Emuera.GameData.Variable;
  5. using MinorShift.Emuera.Sub;
  6. namespace MinorShift.Emuera.GameData.Function
  7. {
  8. internal static partial class FunctionMethodCreator
  9. {
  10. // str TR_NAME(str,str)
  11. // Input 1: string with csv key or
  12. // Input 2: string with csv value or int identifier
  13. // Output: String with TR-translated if it's successful found, or the original if it fails
  14. public sealed class TRNameMethod : FunctionMethod
  15. {
  16. public TRNameMethod()
  17. {
  18. ReturnType = typeof(string);
  19. argumentTypeArray = null;
  20. CanRestructure = true;
  21. }
  22. public override string CheckArgumentType(string name, IOperandTerm[] arguments)
  23. {
  24. if (arguments.Length < 2)
  25. return name + " needs 2 arguments";
  26. if (arguments.Length > 2)
  27. return name + " has too many arguments";
  28. if (arguments[0] == null)
  29. return "1st argument of " + name + " cannot be ommited";
  30. if (!(arguments[0].GetOperandType() == typeof(string) || arguments[0] is VariableTerm))
  31. return "1st argument of " + name + " must be a string or term";
  32. if (arguments[1] == null)
  33. return "2nd argument of " + name + " cannot be ommited";
  34. if (!(arguments[1].GetOperandType() == typeof(Int64) || arguments[1].GetOperandType() == typeof(string)))
  35. return "2nd argument of " + name + " must be a string or int";
  36. return null;
  37. }
  38. public override string GetStrValue(ExpressionMediator exm, IOperandTerm[] arguments, bool tryTranslate = false)
  39. {
  40. string sdic = "";
  41. VariableCode varCode;
  42. if (arguments[0].GetOperandType() == typeof(string)) { // JVN: If first argument is a string...
  43. sdic = arguments[0].GetStrValue(exm);
  44. switch (sdic)
  45. { // JVN: Prepares the first argument
  46. case "ABL":
  47. case "ABLNAME":
  48. sdic = "Abl";
  49. varCode = VariableCode.ABL;
  50. break;
  51. case "BASE":
  52. case "BASENAME":
  53. sdic = "Base";
  54. varCode = VariableCode.BASE;
  55. break;
  56. case "CDFLAG1":
  57. case "CDFLAGNAME1":
  58. sdic = "Cdflag1";
  59. varCode = VariableCode.CDFLAGNAME1;
  60. break;
  61. case "CDFLAG2":
  62. case "CDFLAGNAME2":
  63. sdic = "Cdflag2";
  64. varCode = VariableCode.CDFLAGNAME2;
  65. break;
  66. case "CFLAG":
  67. case "CFLAGNAME":
  68. sdic = "Cflag";
  69. varCode = VariableCode.CFLAG;
  70. break;
  71. case "CSTR":
  72. case "CSTRNAME":
  73. sdic = "CSTR";
  74. varCode = VariableCode.CSTR;
  75. break;
  76. case "EQUIP":
  77. case "EQUIPNAME":
  78. sdic = "EQUIP";
  79. varCode = VariableCode.EQUIP;
  80. break;
  81. case "EX":
  82. case "EXNAME":
  83. sdic = "Ex";
  84. varCode = VariableCode.EX;
  85. break;
  86. case "EXP":
  87. case "EXPNAME":
  88. sdic = "Exp";
  89. varCode = VariableCode.EXP;
  90. break;
  91. case "FLAG":
  92. case "FLAGNAME":
  93. sdic = "Flag";
  94. varCode = VariableCode.FLAG;
  95. break;
  96. case "GLOBAL":
  97. case "GLOBALNAME":
  98. sdic = "GLOBAL";
  99. varCode = VariableCode.GLOBAL;
  100. break;
  101. case "GLOBALS":
  102. case "GLOBALSNAME":
  103. sdic = "GLOBALS";
  104. varCode = VariableCode.GLOBALS;
  105. break;
  106. case "ITEM":
  107. case "ITEMNAME":
  108. sdic = "Item";
  109. varCode = VariableCode.ITEM;
  110. break;
  111. case "MARK":
  112. case "MARKNAME":
  113. sdic = "Mark";
  114. varCode = VariableCode.MARK;
  115. break;
  116. case "PALAM":
  117. case "PALAMNAME":
  118. case "PARAM":
  119. case "PARAMNAME":
  120. sdic = (Translation.isCanLoadParam() ? "Param" : "Palam");
  121. varCode = VariableCode.PALAM;
  122. break;
  123. case "SAVESTR":
  124. case "SAVESTRNAME":
  125. sdic = "SaveStr";
  126. varCode = VariableCode.SAVESTR;
  127. break;
  128. case "SOURCE":
  129. case "SOURCENAME":
  130. sdic = "Source";
  131. varCode = VariableCode.SOURCE;
  132. break;
  133. case "STAIN":
  134. case "STAINNAME":
  135. sdic = "Stain";
  136. varCode = VariableCode.STAIN;
  137. break;
  138. case "STR":
  139. case "STRNAME":
  140. sdic = "Str";
  141. varCode = VariableCode.STR;
  142. break;
  143. case "TALENT":
  144. case "TALENTNAME":
  145. sdic = "Talent";
  146. varCode = VariableCode.TALENT;
  147. break;
  148. case "TCVAR":
  149. case "TCVARNAME":
  150. sdic = "Tcvar";
  151. varCode = VariableCode.TCVAR;
  152. break;
  153. case "TEQUIP":
  154. case "TEQUIPNAME":
  155. sdic = "TEQUIP";
  156. varCode = VariableCode.TEQUIP;
  157. break;
  158. case "TFLAG":
  159. case "TFLAGNAME":
  160. sdic = "TFLAG";
  161. varCode = VariableCode.TFLAG;
  162. break;
  163. case "TRAIN":
  164. case "TRAINNAME":
  165. sdic = "Train";
  166. varCode = VariableCode.TRAINNAME;
  167. break;
  168. case "TSTR":
  169. case "TSTRNAME":
  170. sdic = "TSTR";
  171. varCode = VariableCode.TSTR;
  172. break;
  173. default:
  174. throw new CodeEE("Invalid first argument: " + arguments[0].GetStrValue(exm));
  175. }
  176. }
  177. else { //JVN: first argument must be a variable term
  178. VariableTerm vToken = (VariableTerm)arguments[0];
  179. varCode = vToken.Identifier.Code;
  180. switch (varCode)
  181. {
  182. case VariableCode.ABL:
  183. sdic = "Abl";
  184. break;
  185. case VariableCode.BASE:
  186. sdic = "Base";
  187. break;
  188. case VariableCode.CDFLAGNAME1:
  189. sdic = "Cdflag1";
  190. break;
  191. case VariableCode.CDFLAGNAME2:
  192. sdic = "Cdflag2";
  193. break;
  194. case VariableCode.CFLAG:
  195. sdic = "Cflag";
  196. break;
  197. case VariableCode.CSTR:
  198. sdic = "CSTR";
  199. break;
  200. case VariableCode.EQUIP:
  201. sdic = "EQUIP";
  202. break;
  203. case VariableCode.EX:
  204. sdic = "Ex";
  205. break;
  206. case VariableCode.EXP:
  207. sdic = "Exp";
  208. break;
  209. case VariableCode.FLAG:
  210. sdic = "Flag";
  211. break;
  212. case VariableCode.GLOBAL:
  213. sdic = "GLOBAL";
  214. break;
  215. case VariableCode.GLOBALS:
  216. sdic = "GLOBALS";
  217. break;
  218. case VariableCode.ITEM:
  219. sdic = "Item";
  220. break;
  221. case VariableCode.MARK:
  222. sdic = "Mark";
  223. break;
  224. case VariableCode.PALAM:
  225. sdic = (Translation.isCanLoadParam() ? "Param" : "Palam");
  226. break;
  227. case VariableCode.SAVESTR:
  228. sdic = "SaveStr";
  229. break;
  230. case VariableCode.SOURCE:
  231. sdic = "Source";
  232. break;
  233. case VariableCode.STAIN:
  234. sdic = "Stain";
  235. break;
  236. case VariableCode.STR:
  237. sdic = "Str";
  238. break;
  239. case VariableCode.TALENT:
  240. sdic = "Talent";
  241. break;
  242. case VariableCode.TCVAR:
  243. sdic = "Tcvar";
  244. break;
  245. case VariableCode.TEQUIP:
  246. sdic = "TEQUIP";
  247. break;
  248. case VariableCode.TFLAG:
  249. sdic = "TFLAG";
  250. break;
  251. case VariableCode.TRAINNAME:
  252. sdic = "Train";
  253. break;
  254. case VariableCode.TSTR:
  255. sdic = "TSTR";
  256. break;
  257. default:
  258. throw new CodeEE("Invalid first argument: " + vToken);
  259. }
  260. }
  261. if (arguments[1].GetOperandType() == typeof(string)) { // JVN: Deal with the string
  262. string key = arguments[1].GetStrValue(exm);
  263. if (exm.VEvaluator.Constant.isDefined(varCode, key)) return Translation.translate(key, sdic, true);
  264. throw new CodeEE("Invalid second argument: " + arguments[1].GetStrValue(exm));
  265. }
  266. // JVN: Deal with the integer
  267. string errPos;
  268. Dictionary<string, int> dic = exm.VEvaluator.Constant.GetKeywordDictionary(out errPos, varCode, -1);
  269. if (dic != null) {
  270. foreach (var entry in dic)
  271. if (entry.Value == arguments[1].GetIntValue(exm)) return Translation.translate(entry.Key,sdic,true);
  272. throw new CodeEE("Invalid second argument: " + arguments[1].GetIntValue(exm));
  273. }
  274. throw new CodeEE("Invalid second argument: " + arguments[1].GetIntValue(exm));
  275. // JVN: Should never get here
  276. throw new CodeEE("Unknown Error");
  277. }
  278. }
  279. /*public sealed class TRCSTRMethod : FunctionMethod
  280. {
  281. //return exm.VEvaluator.GetCharacterStrfromCSVData(x, varCode, false, 0);
  282. }*/
  283. }
  284. }