conv_lvs.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. # Desc: 将用到的关卡文件压缩成程序使用的protobuf格式
  2. # Date: 2017-04-18
  3. import os
  4. import sys
  5. import json
  6. import levelData_pb2
  7. def read_json(file_path):
  8. with open(file_path, 'r') as file:
  9. return json.load(file)
  10. def write_json(data, file_path):
  11. with open(file_path, 'w+') as file:
  12. json.dump(data, file, indent=4)
  13. # 将 ../conf/levelInstInfo.csv 里面的每一个实例的模板名加上“tf_”前缀
  14. def add_prefix_to_inst_name():
  15. with open('../conf/levelInstInfo.csv', 'r') as f:
  16. hdr_done = False
  17. with open('../conf/levelInstInfo_new.csv', 'w+') as f_new:
  18. for line in f.readlines():
  19. if line.startswith('#'):
  20. f_new.write(line)
  21. continue
  22. if not hdr_done:
  23. f_new.write(line)
  24. hdr_done = True
  25. continue
  26. line = line.split(',')
  27. if line[1].startswith('tf_'):
  28. f_new.write(line)
  29. continue
  30. line[1] = 'tf_' + line[1]
  31. f_new.write(','.join(line))
  32. # 解析 ../conf/levelInstInfo.csv 文件,得到所有被用到的模板列表
  33. def parse_level_inst_info(groups):
  34. temp_list = set()
  35. for grp in groups:
  36. fn = '../conf/levelInstInfo.csv'
  37. if len(grp) != 0:
  38. fn = '../conf/levelInstInfo-' + grp + '.csv'
  39. with open(fn, 'r') as f:
  40. # 跳过第一行
  41. f.readline()
  42. for line in f.readlines():
  43. if line.startswith('#'):
  44. continue
  45. temp_list.add(line.split(',')[1])
  46. return temp_list
  47. # 将某个tiled的json文件转换成protobuf格式
  48. def conver_json_to_proto(tDir, tFileName, outDir):
  49. global lvFileInfo, lvInfo
  50. jsonFile = os.path.join(tDir, tFileName + '.json')
  51. with open(jsonFile, 'r') as f:#, encoding='utf-8'
  52. jsonData = json.load(f)
  53. levelData = levelData_pb2.LevelData()
  54. levelData.tileWidth = jsonData['width']
  55. levelData.tileHeight = jsonData['height']
  56. cntUndefined = 0
  57. tilesByPos = {}
  58. maxZ = 0
  59. maxX = 0
  60. maxY = 0
  61. # 首先得到stacked的坐标数据
  62. stacked_map = {}
  63. for item in jsonData['layers']:
  64. name = item['name']
  65. if name == 'Marks':
  66. data = item['data']
  67. for i in range(0, len(data)):
  68. if data[i] == 0:
  69. continue
  70. x = (int)(i % levelData.tileWidth)
  71. y = (int)(i / (int)(levelData.tileWidth))
  72. stacked_map[(x, y)] = 0
  73. # 处理各层的tile数据
  74. cntTiles = 0
  75. for item in jsonData['layers']:
  76. name = item['name']
  77. if not name.startswith('Tile_'):
  78. # stacked
  79. continue
  80. z = int(name[5:])
  81. data = item['data']
  82. for i in range(0, len(data)):
  83. if data[i] == 0:
  84. continue
  85. tile = levelData.tiles.add()
  86. tile.x = (int)(i % levelData.tileWidth)
  87. tile.y = (int)(i / (int)(levelData.tileWidth))
  88. tile.z = z
  89. if (tile.x, tile.y) in stacked_map:
  90. stacked_map[(x, y)] += 1
  91. tiledata = tile.tileData
  92. tiledata.zv = 0
  93. tiledata.weight = 0
  94. tiledata.id = data[i]
  95. if tiledata.id == -10:
  96. cntUndefined += 1
  97. tiledata.type = 1
  98. tiledata.subtype = 0
  99. # 一些统计信息
  100. tilesByPos[(tile.x, tile.y, tile.z)] = tile
  101. if tile.z > maxZ:
  102. maxZ = tile.z
  103. if tile.x > maxX:
  104. maxX = tile.x
  105. if tile.y > maxY:
  106. maxY = tile.y
  107. cntTiles += 1
  108. if cntTiles%3 != 0:
  109. print('Error: tile count is not a multiple of 3: %d' % (cntTiles,))
  110. exit(1)
  111. # 根据上面的布局信息,计算每个tile的几个信息:
  112. # 1. 每个tile的视觉层级(不同于上面z的信息,那是一个布局信息,相同的z可能出在不同的视觉层级)
  113. # 从maxZ开始,逐层向下计算;对于每一个位置,如果该位置有tile,则计算该tile的视觉层级
  114. # 对于每一个tile,如果其上方(从该tile的z+1层,一直到maxZ层)有tile,则其视觉层级为上方tile的视觉层级+1
  115. for z in range(0, maxZ+1):
  116. z = maxZ - z
  117. for x in range(0, maxX+1):
  118. for y in range(0, maxY+1):
  119. if (x,y,z) in tilesByPos:
  120. tile = tilesByPos[(x, y, z)]
  121. adjs = [(x,y),(x,y+1),(x,y-1),(x+1,y),(x+1,y+1),(x+1,y-1),(x-1,y),(x-1,y-1),(x-1,y+1)]
  122. # 确定视觉层级
  123. zvMax = -1
  124. for zup in range(z+1, maxZ+1):
  125. for adj in adjs:
  126. if (adj[0],adj[1],zup) in tilesByPos:
  127. zv = tilesByPos[adj[0],adj[1],zup].tileData.zv
  128. if zv > zvMax:
  129. zvMax = zv
  130. tile.tileData.zv = zvMax + 1
  131. # 计算权重
  132. # 从最底下开始,逐层向上计算
  133. # 每个tile的初始权重为4,然后加上其下方压住的tile的权重:如果压了全部,则该加上被压住的tile权重;
  134. # 如果压住了一半,则加上被压住的tile权重的一半;如果是压住1/4,则加上被压住的tile权重的1/4
  135. for z in range(0, maxZ+1):
  136. for x in range(0, maxX+1):
  137. for y in range(0, maxY+1):
  138. if (x,y,z) in tilesByPos:
  139. tile = tilesByPos[(x,y,z)]
  140. adjs = [(x,y,1.0),(x,y+1,0.5),(x,y-1,0.5),(x+1,y,0.5),(x+1,y+1,0.25),(x+1,y-1,0.25),(x-1,y,0.5),(x-1,y-1,0.25),(x-1,y+1,0.25)]
  141. weight = 4
  142. for adj in adjs:
  143. # 从临近层往下,在某个位置找到了tile,则该tile被压住了,就不再找了
  144. for zb in range(0, z):
  145. zb = z-1-zb
  146. if (adj[0], adj[1], zb) in tilesByPos:
  147. tileB = tilesByPos[(adj[0], adj[1], zb)]
  148. weight += tileB.tileData.weight * adj[2]
  149. break
  150. tile.tileData.weight = int(weight)
  151. pass
  152. for item in stacked_map:
  153. stack_data = levelData.stacks.add()
  154. stack_data.x = int(item[0])
  155. stack_data.y = int(item[1])
  156. stack_data.direction = 0 # 先默认都是0
  157. # 数据序列化
  158. level_protobuf_data = levelData.SerializeToString()
  159. protoFile = os.path.join(outDir, tFileName + '.bin')
  160. with open(protoFile, 'w+b') as f:
  161. f.write(level_protobuf_data)
  162. def gen_index_and_data(binDir, group = None):
  163. lvelsIndex = levelData_pb2.LevelsIndex()
  164. if group is not None:
  165. protoDataTrunk = os.path.join(binDir, 'levels-' + str(group) + '.bin')
  166. protoDataIndex = os.path.join(binDir, 'levelsIndex-' + str(group) + '.bin')
  167. else:
  168. protoDataTrunk = os.path.join(binDir, 'levels' + '.bin')
  169. protoDataIndex = os.path.join(binDir, 'levelsIndex' + '.bin')
  170. offset = 0
  171. for filename in os.listdir(binDir):
  172. my_message = levelData_pb2.LevelData()
  173. binFile = os.path.splitext(filename)[0] + '.bin'
  174. binFile = os.path.join(binDir, binFile)
  175. if os.path.exists(binFile) :
  176. # print(binFile)
  177. with open(binFile, "rb") as f:
  178. binary_data = f.read()
  179. my_message.ParseFromString(binary_data)
  180. os.remove(binFile)
  181. with open(protoDataTrunk, 'ab') as f:
  182. f.write(binary_data)
  183. lvelsIndex.LevelsIndex[os.path.splitext(filename)[0]].len = len(binary_data)
  184. lvelsIndex.LevelsIndex[os.path.splitext(filename)[0]].offset = offset
  185. offset += len(binary_data)
  186. level_protobuf_index = lvelsIndex.SerializePartialToString()
  187. with open(protoDataIndex, 'w+b') as f:
  188. f.write(level_protobuf_index)
  189. # 将所有的模板文件转换成protobuf格式
  190. def convert_all_templates():
  191. # 清空loadable目录
  192. for root, dirs, files in os.walk('../loadable'):
  193. for name in files:
  194. os.remove(os.path.join(root, name))
  195. temp_list = parse_level_inst_info(['','3'])
  196. dirs = ['../tf_templates', '../miniGame', '../templates']
  197. for temp_name in temp_list:
  198. print(f"Converting template {temp_name}")
  199. # 判断正确的目录
  200. for d in dirs:
  201. if os.path.exists(os.path.join(d, temp_name + '.json')):
  202. conver_json_to_proto(d, temp_name, '../loadable')
  203. break
  204. gen_index_and_data('../loadable')
  205. # 修改levelInstInfo.csv文件: 对于每一行,如果其try1一直到try10的随机数都是100,则一次将其加1
  206. def correct_random_seed():
  207. for f in ['../conf/levelInstInfo.csv', '../conf/levelInstInfo-2.csv']:
  208. lines = None
  209. with open(f, 'r') as file:
  210. lines = file.readlines()
  211. with open(f, 'w') as file:
  212. for line in lines:
  213. if line.startswith('#'):
  214. file.write(line)
  215. continue
  216. fs = line.split(',')
  217. if len(fs) < 12:
  218. file.write(line)
  219. continue
  220. for i in range(2, 12):
  221. if fs[i].split('|')[1] == '100':
  222. fs[i] = fs[i].replace('100', '%d' % (100+i))
  223. file.write(','.join(fs))
  224. # 将关卡实例每个关卡单独保存一个,避免改动的时候相互影响
  225. def split_level_inst_info():
  226. # 首先读取levelInfo.csv文件,对于每一个关卡,解析其所使用的实例名字信息
  227. # 然后读取levelInstInfo.csv文件,得到每一个实例的详细信息
  228. # 新建一个levelInstInfo-new.csv文件,对于每一个关卡,将其所使用的实例的信息改名成inst-关卡名,并存入上一步的详细信息
  229. # 最后将levelInstInfo-new.csv文件保存
  230. lvs_inst = {}
  231. with open('../conf/levelInfo-2.csv', 'r') as file:
  232. for line in file.readlines():
  233. if line.startswith('#'):
  234. continue
  235. fs = line.split(',')
  236. lvs_inst[fs[0]] = (fs[1], fs)
  237. inst_info = {}
  238. with open('../conf/levelInstInfo-2.csv', 'r') as file:
  239. for line in file.readlines():
  240. if line.startswith('#'):
  241. continue
  242. fs = line.split(',')
  243. inst_info[fs[0]] = ",".join(fs[1:])
  244. # 更新info
  245. with open('../conf/levelInfo-2-new.csv', 'w') as file:
  246. for lv, (inst,li) in lvs_inst.items():
  247. li[1] = 'inst-%s' % (lv,)
  248. file.write(",".join(li))
  249. # 写入实例信息
  250. with open('../conf/levelInstInfo-2-new.csv', 'w') as file:
  251. for lv, (inst,li) in lvs_inst.items():
  252. if inst in inst_info:
  253. file.write("inst-%s,%s" % (lv, inst_info[inst]))
  254. else:
  255. print(f"Error: {inst} not found in levelInstInfo.csv")
  256. pass
  257. # 更新关卡实例的随机值
  258. def updateRandomSeed(lvInfoFN, instInfoFN, seedsInfo):
  259. # seedsInfo每一行的格式:[Tile] resovler id: 31,37710|539110|14697|465925|662106|151463|667120|234313|60714|840794|
  260. # 解析seedsInfo,得到关卡和实例的时机值
  261. seeds = {}
  262. for line in seedsInfo.split('\n'):
  263. fs = line.split(' ')
  264. if len(fs) < 4:
  265. continue
  266. fs = fs[3].split(',')
  267. seeds[fs[0]] = fs[1].split('|')
  268. # 先通过lvInfoFN文件,得到所有的关卡对应的实例名称
  269. seeds4Inst = {}
  270. with open(lvInfoFN, 'r') as file:
  271. for line in file.readlines():
  272. if line.startswith('#'):
  273. continue
  274. fs = line.split(',')
  275. if fs[0] in seeds:
  276. seeds4Inst[fs[1]] = seeds[fs[0]]
  277. # 对于instInfoFN文件,对于每一行,如果lvid在seeds里面,则用上面的随机值来更新一下;否则原封不动写入新文件
  278. with open(instInfoFN, 'r') as infile:
  279. lines = infile.readlines()
  280. with open(instInfoFN + '-new', 'w') as outfile:
  281. for line in lines:
  282. fs = line.split(',')
  283. if len(fs) < 2:
  284. outfile.write(line)
  285. continue
  286. if fs[0] in seeds4Inst:
  287. for i in range(2, 12):
  288. v = seeds4Inst[fs[0]][i-2].split('-')
  289. ps = fs[i].split('|')
  290. ps[0] = v[0]
  291. ps[1] = v[1]
  292. fs[i] = '|'.join(ps)
  293. outfile.write(','.join(fs))
  294. # 将instInfoFN-new文件重命名为instInfoFN
  295. os.rename(instInfoFN + '-new', instInfoFN)
  296. pass
  297. if __name__ == '__main__':
  298. # 获取当前工作目录
  299. current_dir = os.getcwd()
  300. script_dir = os.path.dirname(os.path.abspath(__file__))
  301. os.chdir(script_dir)
  302. # 得到可以发布的protobuf文件
  303. # convert_all_templates()
  304. # correct_random_seed()
  305. # split_level_inst_info()
  306. # 更新随机信息
  307. seedsInfo = """
  308. [Tile] resovler id: 25,7-341610|6-262325|6-945921|6-473668|6-128340|6-2892|6-72626|6-893012|6-408548|6-44503|
  309. [Tile] resovler id: 26,7-567613|6-379105|6-850011|7-290409|6-519083|6-432876|6-942100|6-274091|6-237419|6-179412|
  310. [Tile] resovler id: 27,9-377089|8-919618|7-859942|7-699142|7-418060|7-687768|7-854285|7-570664|7-72134|7-247144|
  311. [Tile] resovler id: 28,7-488088|5-265529|6-788870|6-979469|6-818177|6-983170|6-144435|6-350100|6-954211|6-980536|
  312. [Tile] resovler id: 29,9-15846|8-871897|8-311662|8-293447|7-804047|7-885158|7-414106|7-31288|7-327241|7-979414|
  313. [Tile] resovler id: 30,9-872816|9-200069|8-314634|8-477935|8-743749|8-597368|8-983810|8-193666|7-487585|7-722035|
  314. [Tile] resovler id: 31,9-998180|9-299273|8-949613|8-412564|8-444406|8-553034|8-116508|8-5708|8-566134|8-699614|
  315. [Tile] resovler id: 32,9-763414|9-988866|8-553506|8-253789|7-741396|7-500411|7-805018|7-389569|7-845276|7-313335|
  316. [Tile] resovler id: 33,8-102828|6-216194|7-114590|7-259842|7-559078|7-893772|7-728323|7-13890|7-255809|7-280572|
  317. [Tile] resovler id: 34,9-90440|9-401323|8-516911|8-248769|8-776515|8-746085|8-397365|8-37564|8-541355|8-255120|
  318. [Tile] resovler id: 35,11-247285|10-810932|10-100934|9-102272|9-944882|9-204255|9-555059|9-52477|9-916439|9-946541|
  319. [Tile] resovler id: 36,9-363314|9-247562|8-973740|8-307516|8-881629|8-333555|8-511025|8-825751|8-763137|8-345186|
  320. [Tile] resovler id: 37,6-370229|6-239105|6-445902|6-920948|6-660307|7-248341|7-265246|6-96751|7-228173|7-423060|
  321. [Tile] resovler id: 38,8-642127|8-44859|7-504201|7-31700|7-499255|7-698402|7-153744|7-860229|7-742799|7-811031|
  322. [Tile] resovler id: 39,9-913284|9-951378|8-382312|8-437694|8-279055|8-424757|8-639322|8-576705|8-485431|8-430052|
  323. [Tile] resovler id: 40,7-696477|7-33900|8-119957|7-940172|7-99802|7-792344|7-655357|8-207736|8-455232|8-684503|
  324. [Tile] resovler id: 41,10-788132|10-742310|10-868868|9-138244|9-794303|9-385431|9-253451|8-908781|8-150327|8-938588|
  325. [Tile] resovler id: 42,12-732881|12-547653|11-813343|11-836719|10-938074|10-931711|10-644864|10-863521|10-415599|10-77497|
  326. [Tile] resovler id: 43,10-610224|10-973379|9-163942|9-481277|9-644467|9-350239|9-616049|9-366997|9-97698|9-635651|
  327. [Tile] resovler id: 44,14-52787|14-528276|13-909860|13-16181|13-236545|12-8570|12-722536|12-296225|12-158053|12-966578|
  328. [Tile] resovler id: 45,11-243810|12-96805|11-54683|12-438169|11-338719|10-530372|10-900325|10-900451|10-630413|10-570106|
  329. [Tile] resovler id: 46,8-791094|9-371251|9-676014|9-19207|8-935075|8-178931|8-916878|8-658910|8-216667|8-257354|
  330. [Tile] resovler id: 47,10-505382|9-499194|10-828522|9-816513|9-775689|9-597962|9-550814|9-95365|9-709569|9-552908|
  331. [Tile] resovler id: 48,7-120090|9-575552|8-315110|8-554649|8-463145|3-401102|3-204291|3-451939|4-220184|3-641713|
  332. [Tile] resovler id: 49,5-528105|4-885959|5-899692|5-602010|4-545985|5-596026|5-136995|5-698681|5-252227|5-47798|
  333. [Tile] resovler id: 50,12-635284|12-400697|11-52445|10-408269|10-657076|10-440321|10-89234|10-165772|10-425500|9-351002|
  334. [Tile] resovler id: 51,15-171695|13-68697|12-601255|12-736632|12-590389|12-255975|12-337435|12-621772|12-276310|12-995441|
  335. [Tile] resovler id: 52,14-608516|10-203251|8-788333|14-736941|12-672215|10-223334|12-820599|12-270827|10-355041|10-24539|
  336. [Tile] resovler id: 53,13-673433|11-327072|11-761830|16-217035|13-174556|13-300604|13-29917|13-639017|13-558354|13-309239|
  337. [Tile] resovler id: 54,17-40211|12-872976|12-703087|16-683902|16-111094|17-655813|14-554089|16-100388|16-531335|16-834959|
  338. [Tile] resovler id: 55,14-375711|9-118026|7-272489|10-434034|12-143509|10-6859|9-44251|9-437285|10-812657|10-29062|
  339. [Tile] resovler id: 56,16-34443|14-807113|9-686602|14-501291|12-216059|16-592701|16-4976|16-513291|14-892878|14-455292|
  340. [Tile] resovler id: 57,18-673682|15-720807|13-674941|18-510748|17-408080|17-525548|17-261853|17-329768|18-658693|18-175945|
  341. [Tile] resovler id: 58,14-720029|12-406840|10-645269|15-81879|13-388640|13-542548|14-943324|13-6752|12-364355|12-473514|
  342. [Tile] resovler id: 59,12-180286|9-902545|7-897819|12-811614|11-924670|11-185724|11-48430|9-610620|9-973340|9-388493|
  343. [Tile] resovler id: 60,16-378214|12-819875|11-463132|16-794525|16-945954|16-425471|16-771707|14-203910|12-225743|12-281303|
  344. [Tile] resovler id: 61,17-182597|16-184736|14-717220|17-860539|17-214411|17-113674|17-518804|16-473156|16-274588|16-742004|
  345. [Tile] resovler id: 62,16-611|14-200559|10-164706|17-93461|17-684187|16-11041|14-155328|14-635091|12-664863|12-598720|
  346. [Tile] resovler id: 63,16-933468|14-669665|12-279363|16-391703|14-588361|14-289149|14-494528|16-599309|15-210394|16-682849|
  347. [Tile] resovler id: 64,16-216364|14-768792|12-308913|17-768426|17-738253|17-614829|16-722577|14-657197|14-139891|14-448502|
  348. [Tile] resovler id: 65,10-39852|9-559626|6-76214|10-718926|9-338797|9-33080|9-683259|8-561606|8-426209|8-85242|
  349. [Tile] resovler id: 66,16-899743|14-423102|9-31749|16-974369|14-105893|16-954567|12-929064|14-287147|12-257060|12-623200|
  350. [Tile] resovler id: 67,17-304729|16-384210|12-257625|17-314353|17-893772|18-606129|18-297148|17-131673|14-784002|14-190726|
  351. [Tile] resovler id: 68,17-410681|15-768967|11-81391|17-340026|17-197497|17-775247|17-901047|15-665976|15-502478|15-914611|
  352. [Tile] resovler id: 69,12-321284|12-739422|8-484006|15-896910|14-677777|15-450233|10-52907|12-428201|10-441209|10-823854|
  353. [Tile] resovler id: 70,18-572065|13-990765|11-880379|18-536300|16-948853|16-615238|15-421155|15-454710|13-443886|13-701271|
  354. [Tile] resovler id: 71,13-481253|11-756402|11-770766|16-57272|14-863255|12-529289|13-214231|13-583642|13-656662|11-974420|
  355. [Tile] resovler id: 72,12-813001|12-594052|9-349991|12-230482|10-492191|12-446794|11-30687|12-325640|9-823522|9-136551|
  356. [Tile] resovler id: 73,16-457055|12-47994|10-557232|14-949057|15-97802|14-619333|12-198322|12-802861|12-601970|12-376792|
  357. [Tile] resovler id: 74,14-117315|14-540591|12-588370|14-213629|14-757870|14-85482|14-366335|14-511209|12-933919|12-493089|
  358. [Tile] resovler id: 75,17-797637|13-861573|11-100042|17-510654|16-1835|17-219010|16-369236|16-568965|13-252172|13-833809|
  359. [Tile] resovler id: 76,18-794231|15-827668|18-942110|18-404360|18-422771|18-624509|18-329176|16-440697|18-535528|18-917276|
  360. [Tile] resovler id: 77,18-354081|16-344623|14-532930|18-540815|17-23786|18-929712|17-743020|16-999279|17-995555|17-172066|
  361. [Tile] resovler id: 78,17-580555|14-904064|12-326822|17-616516|16-601490|16-934590|17-689133|16-138293|14-412350|14-412923|
  362. [Tile] resovler id: 79,11-361860|7-353099|7-725424|11-364145|11-138344|9-793923|9-528013|9-873439|9-667265|9-878410|
  363. [Tile] resovler id: 80,10-31033|7-329259|10-447049|10-926203|9-991517|10-162175|9-233838|9-842085|9-772360|9-839139|
  364. [Tile] resovler id: 81,18-87609|14-315533|19-925752|17-763456|16-355542|17-832654|18-409050|16-522776|14-624601|17-995036|
  365. [Tile] resovler id: 82,18-878683|12-903771|18-988848|18-781041|16-914398|16-74199|16-960252|15-733529|15-125376|16-920581|
  366. [Tile] resovler id: 83,19-73678|13-414863|19-647222|17-697643|17-972345|16-890752|17-853482|17-965095|16-521942|15-562364|
  367. [Tile] resovler id: 84,19-815835|15-14671|17-894705|19-774467|19-850870|16-140801|17-657994|17-900680|19-880891|16-761085|
  368. [Tile] resovler id: 85,15-192686|11-334787|9-118658|15-247606|13-350360|11-922803|13-684873|13-33550|9-154659|9-675174|
  369. [Tile] resovler id: 86,12-541386|10-967203|11-901006|11-856068|11-370551|11-843500|12-928773|11-153754|11-996884|10-413325|
  370. [Tile] resovler id: 87,16-787581|11-847118|18-118893|13-659698|16-253226|15-894559|16-812321|16-1497|15-847956|11-773433|
  371. [Tile] resovler id: 88,13-1956|9-143439|14-644282|14-988156|12-784450|12-570588|14-495741|10-690821|10-717969|9-232747|
  372. [Tile] resovler id: 89,13-669016|10-14320|8-68756|13-591339|12-204669|10-790926|10-294117|12-403642|10-460469|10-378875|
  373. [Tile] resovler id: 90,19-816676|15-35394|19-317226|19-7014|16-937968|17-927872|19-671907|17-310498|15-76566|14-653328|
  374. [Tile] resovler id: 91,16-468177|13-61558|15-671487|17-550117|16-192925|17-477865|16-473309|19-915730|17-486703|15-576887|
  375. [Tile] resovler id: 92,11-67296|7-696457|13-116512|12-381071|12-729161|12-632052|14-958939|10-331801|9-483227|10-891943|
  376. [Tile] resovler id: 93,17-888209|14-104480|17-450375|16-349736|17-68965|16-9702|16-327059|15-510881|14-106281|14-153663|
  377. [Tile] resovler id: 94,14-531553|8-496919|12-540410|12-270084|10-688059|10-457035|12-684333|10-943615|10-635612|8-207819|
  378. [Tile] resovler id: 95,17-106979|17-72415|12-46023|17-636604|17-493080|17-659368|17-150214|17-852232|15-932584|15-51251|
  379. [Tile] resovler id: 96,18-869352|13-944228|16-514449|16-812866|16-473186|15-350504|15-82949|13-200680|13-379246|15-863221|
  380. [Tile] resovler id: 97,18-81387|12-306675|16-741517|16-812747|15-199378|16-857759|14-324036|12-371416|12-292829|13-630633|
  381. [Tile] resovler id: 98,14-517142|14-708568|12-659801|12-657691|10-548711|12-790244|12-446895|13-62844|13-353753|13-692671|
  382. [Tile] resovler id: 99,17-785205|15-958578|11-72177|15-881422|17-298547|17-627995|17-2147|17-357842|13-208586|13-607505|
  383. [Tile] resovler id: 100,18-946430|13-982527|17-321736|18-249529|16-241206|18-54762|15-386411|17-109401|17-419348|16-510358|
  384. """
  385. updateRandomSeed('../conf/levelInfo-3.csv', '../conf/levelInstInfo-3.csv', seedsInfo)
  386. # 恢复当前工作目录
  387. os.chdir(current_dir)