navi.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/usr/bin/python3
  2. import re
  3. def parse_setarray(s):
  4. """
  5. parse setarray
  6. returns list of x,y tuples
  7. """
  8. # D1: setarray @c[2],261,272,275,270,116,27;
  9. res = re.match(r".*\],(.*);", s)
  10. # print(res.group(1))
  11. spl = res.group(1).split(',')
  12. l = [spl[i:i + 2] for i in range(0, len(spl), 2)]
  13. # print(l)
  14. return l
  15. def parse_disp(s):
  16. """
  17. parse disp
  18. returns name for all, or list of names for each
  19. """
  20. # Disp("Comodo Field",1,9);
  21. res = re.match(r""".*"(.*)".*,.*(\d+),(\d+)\).*""", s)
  22. if res:
  23. # print(res.group(1))
  24. # print(res.group(2))
  25. # print(res.group(3))
  26. l = [f"{res.group(1)} {i}" for i in range(int(res.group(2)), int(res.group(3)) + 1)]
  27. # print(l)
  28. return l
  29. res = re.match(r'.*Disp\("(.*)"\);.*', s)
  30. l = res.group(1).split(':')
  31. # print(l)
  32. return l
  33. def parse_pick(s):
  34. """
  35. parse pick
  36. returns base fld for all, or list of flds for all
  37. """
  38. if s.count('"') > 2:
  39. # need to return lsit of fields
  40. res = re.match(r'Pick\("",(.*)\).*', s)
  41. # print(res.group(1))
  42. l = res.group(1).split(',')
  43. l = [m[1:-1] for m in l], 0
  44. return l
  45. elif ',' in s:
  46. # need to subtract number
  47. res = re.match(r""".*\("(.*)".*(\d+).*\)""", s)
  48. # print(res.group(1))
  49. return res.group(1), int(res.group(2))
  50. else:
  51. res = re.match(r""".*\("(.*)"\)""", s)
  52. # print(res.group(1))
  53. return res.group(1), 0
  54. def split_disp_pick(s):
  55. """
  56. returns tuple of <"disp(..)", "pick(...)">
  57. """
  58. res = re.match(r""".*(Disp\(.*\);).*(Pick\(.*\);).*""", s)
  59. # print(res.group(1))
  60. # print(res.group(2))
  61. return res.group(1), res.group(2)
  62. def gen_mapname(map, i, diff):
  63. """
  64. take man_fild, 3, 0
  65. output man_fild03
  66. diff is the subtract for gef_fild00
  67. """
  68. if isinstance(map, str):
  69. i = i + 1 - diff
  70. return f"{map}{'0' if i < 10 else ''}{i}"
  71. elif isinstance(map, list):
  72. return map[i]
  73. else:
  74. raise Exception
  75. def main():
  76. # parse_disp('Disp("Sograt Desert 1:Sograt Desert 2:Sograt Desert 3:Sograt Desert 7:Sograt Desert 11:Sograt Desert 12:Sograt Desert 13:Sograt Desert 16:Sograt Desert 17:Sograt Desert 18:Sograt Desert 19:Sograt Desert 20:Sograt Desert 21:Sograt Desert 22");')
  77. # parse_setarray(
  78. # ' setarray @c[2],219,205,177,206,194,182,224,170,198,216,156,187,185,263,206,228,208,238,209,223,85,97,207,202,31,195,38,195;')
  79. # return
  80. while (1):
  81. setarray = input("input setarray")
  82. disppick = input("input disppick")
  83. poses = parse_setarray(setarray)
  84. disp, pick = split_disp_pick(disppick)
  85. names = parse_disp(disp)
  86. maps, diff = parse_pick(pick)
  87. for i in range(len(poses)):
  88. if i == 1:
  89. print("if (!.OnlyFirstDun) {")
  90. if i > 0:
  91. tabs = " "
  92. else:
  93. tabs = ""
  94. print(
  95. f'{tabs}naviregisterwarp("Warper > {names[i]}", "{gen_mapname(maps, i, diff)}", {poses[i][0]}, {poses[i][1]});')
  96. if i > 0 and i == len(poses) - 1:
  97. print("}")
  98. if __name__ == "__main__":
  99. main()