Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2018
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.92 KB | None | 0 0
  1. extends Node
  2.  
  3. var run_once = false
  4.  
  5.  
  6. var file_dictionary = [] #main files data paths
  7. var mods_dictionary = {} #mod folder data
  8.  
  9. var modfolder = globals.setfolders.mods
  10. var filedir = globals.filedir
  11. var backupdir = globals.backupdir
  12.  
  13. var temp_mod_scripts = {} #variable to store all original + mod script data before overwrite
  14.  
  15.  
  16. var loadorder = []
  17. var activemods = []
  18.  
  19.  
  20. func _ready():
  21. # if globals.developmode == true:
  22. # return
  23. var dir = Directory.new()
  24. var file = File.new()
  25. var files = globals.dir_contents(filedir)
  26. for i in files: #collects file_dictionary data and makes a backup
  27. if (i.find(".gd") != -1):
  28. dir.open(i.replacen(filedir, backupdir).get_base_dir ())
  29. if !dir.dir_exists(i.replacen(filedir, backupdir).get_base_dir ()):
  30. dir.make_dir_recursive(i.replacen(filedir, backupdir).get_base_dir ())
  31. file_dictionary.append(i)
  32. for i in scanfolder() : #collects mod_dictionary data
  33. if !file.file_exists(i +"/info.txt"): #makes info.txt to store mod description
  34. file.open(i+'/info.txt', File.WRITE)
  35. file.store_line("There's no information on this mod.")
  36. file.close()
  37. var check = false
  38. print(scanfolder())
  39. for k in globals.dir_contents(i):
  40. if k.find('.gd') != -1:
  41. check = true
  42.  
  43. if check == false:
  44. continue
  45.  
  46.  
  47.  
  48. dir.open(i)
  49. mods_dictionary[i] = get_mod(i)
  50. if !dir.dir_exists(backupdir) || globals.dir_contents(backupdir).size() <= 0:
  51. storebackup()
  52.  
  53. # order config file management
  54.  
  55. loadfromconfig()
  56.  
  57. file.open(backupdir + "/version", File.READ)
  58. var text = file.get_as_text()
  59. file.close()
  60.  
  61. if str(text).strip_edges() != str(globals.gameversion):
  62. storebackup()
  63.  
  64.  
  65. func scanfolder(): #makes an array of all folders in modfolder
  66. var target = modfolder
  67. var dir = Directory.new()
  68. var array = []
  69. if dir.dir_exists(modfolder) == false:
  70. dir.make_dir(modfolder)
  71. if dir.open(target) == OK:
  72. dir.list_dir_begin()
  73.  
  74. var file_name = dir.get_next()
  75. while file_name != "":
  76. if dir.current_is_dir() && !file_name in ['.','..',null]:
  77. array.append(target + file_name)
  78. file_name = dir.get_next()
  79. return array
  80.  
  81.  
  82. func _on_Mods_pressed():
  83. self.visible = !self.visible
  84. show()
  85.  
  86.  
  87.  
  88. var dir = Directory.new()
  89. var file = File.new()
  90.  
  91. func loadfromconfig():
  92. var config = ConfigFile.new()
  93. var err = config.load(modfolder + "FileOrder.ini")
  94. if err == OK:
  95. loadorder = config.get_value("Mods", "LoadOrder", [])
  96. activemods = config.get_value("Mods", "ActiveMods", [])
  97. for i in loadorder:
  98. if !dir.dir_exists(modfolder + str(i)):
  99. loadorder.erase(i)
  100. removeduplicates()
  101.  
  102. func removeduplicates():
  103. for i in loadorder:
  104. var counter = 0
  105. for k in loadorder:
  106. if k == i:
  107. counter += 1
  108. while counter > 1:
  109. loadorder.erase(i)
  110. counter -= 1
  111.  
  112. func saveconfig():
  113. var config = ConfigFile.new()
  114. config.load(modfolder + "FileOrder.ini")
  115. config.set_value("Mods", "LoadOrder", loadorder)
  116. config.set_value("Mods", "ActiveMods", activemods)
  117. config.save(modfolder + "FileOrder.ini")
  118.  
  119. func storebackup(): #clears and restores backups
  120. var file = File.new()
  121. var dir = Directory.new()
  122.  
  123. # if globals.developmode == true:
  124. # print("Debug mode: No backup stored.")
  125. # return
  126.  
  127. print("Making Backup...")
  128. for i in globals.dir_contents(backupdir):
  129. dir.remove(i)
  130.  
  131. for i in file_dictionary:
  132. var backup = File.new()
  133. if !backup.file_exists(i.replacen(filedir, backupdir)):
  134. file.open(i, File.READ)
  135. backup.open(i.replacen(filedir, backupdir), File.WRITE)
  136. backup.store_string(file.get_as_text())
  137. file.close()
  138. backup.close()
  139. file.open(backupdir + "/version", File.WRITE)
  140. file.store_line(str(globals.gameversion))
  141. file.close()
  142. print("Backup finished.")
  143.  
  144.  
  145. func loadbackup():
  146. print("Loading Backup...")
  147. for i in file_dictionary:
  148. var backup = File.new()
  149. backup.open(i.replacen(filedir, backupdir), File.READ)
  150. var file_string = backup.get_as_text()
  151. backup.close()
  152. backup.open(i, File.WRITE)
  153. backup.store_string(file_string)
  154. backup.close()
  155. print("Load Finished")
  156.  
  157. func show():
  158. modfolder = globals.setfolders.mods
  159. $modfolder.text = modfolder
  160. $modfolder.hint_tooltip = modfolder
  161.  
  162. for i in $allmodscontainer/VBoxContainer.get_children():
  163. if i.name != 'Button':
  164. i.hide()
  165. i.queue_free()
  166. var array = []
  167. for i in scanfolder():
  168. array.append(i)
  169. array.sort_custom(self, 'sortmods')
  170. for i in array:
  171. i = i.replace(modfolder,"")
  172. var modactive = loadorder.has(i)
  173. var newbutton = $allmodscontainer/VBoxContainer/Button.duplicate()
  174. $allmodscontainer/VBoxContainer.add_child(newbutton)
  175. newbutton.visible = true
  176. newbutton.text = i
  177. if modactive == true:
  178. newbutton.pressed = true
  179. newbutton.get_node("order").text = str(loadorder.find(i))
  180. newbutton.get_node('up').visible = true
  181. newbutton.get_node('down').visible = true
  182. newbutton.get_node("order").visible = true
  183. newbutton.get_node("up").connect("pressed",self,'modup',[i])
  184. newbutton.get_node("down").connect("pressed",self,'moddown',[i])
  185. newbutton.connect("mouse_entered", self, 'moddescript',[i])
  186. newbutton.connect("pressed",self, 'togglemod', [i])
  187.  
  188. func sortmods(first,second):
  189. if loadorder.has(first.replace(modfolder,"")):
  190. if loadorder.has(second.replace(modfolder,"")):
  191. if loadorder.find(first.replace(modfolder,"")) < loadorder.find(second.replace(modfolder,"")):
  192. return true
  193. else:
  194. return false
  195. else:
  196. return true
  197. return true
  198. else:
  199. return false
  200.  
  201. func moddescript(mod):
  202. var text
  203. file.open(modfolder + mod + '/info.txt', File.READ)
  204. text = file.get_as_text()
  205. file.close()
  206. if text == '':
  207. text = "There's no information on this mod."
  208. text = '[center][color=aqua]' + mod + '[/color][/center]\n' + text
  209. $modinfo.bbcode_text = text
  210.  
  211. func togglemod(mod):
  212. if loadorder.has(mod):
  213. loadorder.erase(mod)
  214. else:
  215. loadorder.append(mod)
  216. show()
  217. saveconfig()
  218.  
  219.  
  220. func modup(mod):
  221. var order = loadorder.find(mod)
  222. loadorder.erase(mod)
  223. if order == 0:
  224. loadorder.insert(order, mod)
  225. else:
  226. loadorder.insert(order-1, mod)
  227. saveconfig()
  228. show()
  229.  
  230. func moddown(mod):
  231. var order = loadorder.find(mod)
  232. loadorder.erase(mod)
  233. if order + 1 > loadorder.size():
  234. loadorder.append(mod)
  235. else:
  236. loadorder.insert(order+1, mod)
  237. saveconfig()
  238. show()
  239.  
  240.  
  241. func _on_applymods_pressed():
  242. if !globals.developmode:
  243. loadbackup()
  244. for i in loadorder:
  245. if dir.dir_exists(modfolder + i):
  246. activemods.append(i)
  247. apply_mod_to_dictionary(modfolder + i)
  248. apply_mod_dictionary()
  249. saveconfig()
  250. $restartpanel.show()
  251.  
  252. func apply_mod_dictionary():
  253. for i in temp_mod_scripts:
  254. var core_file = File.new()
  255. core_file.open(i, File.WRITE)
  256. core_file.store_string(temp_mod_scripts[i])
  257. core_file.close()
  258.  
  259. func apply_mod_to_dictionary(mod):
  260. var dict = get_mod(mod)
  261.  
  262. for file in dict.keys():
  263. apply_file_to_dictionary(file, dict[file])
  264.  
  265. func get_mod(string):
  266. var mods = globals.dir_contents(string)
  267. var mod = {}
  268. string = string.replace(modfolder, '')
  269. for i in mods:
  270. if(i.find(".gd") != -1):
  271. var modfile = File.new()
  272. modfile.open(i, File.READ)
  273. mod[i.replace(modfolder, filedir).replace(string, '')] = modfile.get_as_text()
  274. modfile.close()
  275. return mod
  276.  
  277. func apply_file_to_dictionary(file_name, string):
  278. #print(file_dictionary)
  279. if file_dictionary.has(file_name):
  280. file.open(file_name, File.READ)
  281. temp_mod_scripts[file_name] = file.get_as_text()
  282. file.close()
  283. var offset = 0
  284. while offset != -1 :
  285. offset = apply_next_element_to_dictionary(file_name, string, offset)
  286.  
  287. func apply_next_element_to_dictionary(key, string, offset):
  288. var regex_string_dictionary = {}
  289. regex_string_dictionary["FUNC"] = "(func\\s+[\\w][\\w\\d]*).*(([\r\n]*[\\t#]+.*)*)"
  290. #regex_string_dictionary["VAR"] = "(var.*=)\\s([{]([^\\{\\}]*[\r\n]*)*[}])?([^\\{\\}\\s]*)"
  291. regex_string_dictionary["VAR"] = "(var.*=)\\s+(([\\{\\[][\n\r]+[\\S\\s]*?[\r\n]+[\\}\\]]([\r\n]+|\\Z))|([^\n\r]*))"
  292. regex_string_dictionary["SIGN"] = "(signal\\s.*)"
  293. regex_string_dictionary["ONREADY"] = "(onready\\svar.*=).*([\\{]([^\\{\\}]*[\r\n]*)*[\\}])?"
  294. regex_string_dictionary["CLASS"] = "(class\\s+[\\w][\\w\\d]*).*(([\r\n]*[\\t#]+.*)*)"
  295.  
  296. var tag_regex = "<(\\w*)(\\s+[0-9\\-]+)?(\\s[0-9\\-]+)?>"
  297. var add_to = "AddTo"
  298. var remove_from = "RemoveFrom"
  299.  
  300. var full_tag = RegEx.new()
  301. full_tag.compile(tag_regex)
  302.  
  303. var has_next = false
  304. var file_string = temp_mod_scripts[key]
  305. var which_operation = "NULL"
  306. var current_match
  307. var new_offset = 0
  308.  
  309. for i in regex_string_dictionary.keys():
  310. var next_func = RegEx.new()
  311. next_func.compile(regex_string_dictionary[i])
  312. var next_match = next_func.search(string, offset)
  313. if next_match != null && (new_offset == 0 || new_offset > next_match.get_start()) && next_match.get_start() > -1:
  314. new_offset = next_match.get_start()
  315. current_match = next_match
  316. which_operation = i
  317. has_next = true
  318.  
  319. var next_tag = full_tag.search(string, offset)
  320. if new_offset != 0 :
  321. new_offset = new_offset + current_match.get_string().length()
  322. var file_match
  323. if has_next && (next_tag == null || new_offset <= next_tag.get_start() || next_tag.get_start() == -1):
  324. var regex_match = RegEx.new()
  325. if regex_string_dictionary.has(which_operation):
  326. regex_match.compile(regex_string_dictionary[which_operation])
  327. file_match = regex_match.search_all(file_string)
  328. var found_match = false
  329. for nested_match in file_match:
  330. if(current_match.get_string(1) == nested_match.get_string(1)):
  331. temp_mod_scripts[key] = temp_mod_scripts[key].replacen(nested_match.get_string(), current_match.get_string())
  332. found_match = true
  333. if !found_match :
  334. temp_mod_scripts[key] = temp_mod_scripts[key] + "\r\n" + current_match.get_string()
  335. pass
  336. elif has_next :
  337. var regex_match = RegEx.new()
  338. if regex_string_dictionary.has(which_operation):
  339. regex_match.compile(regex_string_dictionary[which_operation])
  340. file_match = regex_match.search_all(file_string)
  341. if next_tag.get_string(1) == add_to:
  342. var param = next_tag.get_string(2).to_int() + 1
  343. if param == 0:
  344. param = -1
  345.  
  346. for nested_match in file_match:
  347. if(current_match.get_string(1) == nested_match.get_string(1)):
  348. var pool_string = nested_match.get_string().split("\n")
  349. if param > pool_string.size() :
  350. param = -1
  351. var new_string = current_match.get_string()
  352. if which_operation in ["FUNC",'CLASS']:
  353. var param_temp = param
  354. for i in current_match.get_string(2).split("\n"):
  355. if i != "":
  356. pool_string.insert(param_temp, i)
  357. if param_temp > 0:
  358. param_temp += 1
  359. temp_mod_scripts[key] = temp_mod_scripts[key].replacen(nested_match.get_string(), pool_string.join("\n"))
  360. elif which_operation == "VAR":
  361. var param_temp = param
  362. for i in current_match.get_string(2).replacen("{", "").replacen("}", "").split("\n"):
  363. if i != "":
  364. pool_string.insert(param_temp, i)
  365. if param_temp > 0:
  366. param_temp += 1
  367. temp_mod_scripts[key] = temp_mod_scripts[key].replacen(nested_match.get_string(), pool_string.join("\n"))
  368. elif which_operation == "SIGN":
  369. pool_string.insert(param, current_match.get_string(1))
  370. temp_mod_scripts[key] = temp_mod_scripts[key].replacen(nested_match.get_string(), pool_string.join("\n"))
  371. elif which_operation == "ONREADY":
  372. pool_string.insert(param, current_match.get_string(2))
  373. temp_mod_scripts[key] = temp_mod_scripts[key].replacen(nested_match.get_string(), pool_string.join("\n"))
  374. else:
  375. #operation not supported
  376. pass
  377. break
  378. elif next_tag.get_string(1) == remove_from:
  379. var param = next_tag.get_string(2).to_int()
  380. var param_2 = next_tag.get_string(3).to_int()
  381. for nested_match in file_match:
  382. if(current_match.get_string(1) == nested_match.get_string(1)):
  383. var new_string = nested_match.get_string().split("\n")
  384. for i in range(0, param_2 - param + 1):
  385. if i < new_string.size():
  386. new_string.remove(param)
  387. temp_mod_scripts[key] = temp_mod_scripts[key].replacen(nested_match.get_string(), new_string.join("\n"))
  388. break
  389. pass
  390. else:
  391. # operation not supported
  392. pass
  393. offset = new_offset + 1
  394. if(has_next):
  395. return offset
  396. else:
  397. return -1
  398.  
  399. func _on_disablemods_pressed():
  400. loadorder.clear()
  401. activemods.clear()
  402. saveconfig()
  403. loadbackup()
  404. $restartpanel.show()
  405.  
  406. func _on_closemods_pressed():
  407. self.visible = false
  408.  
  409.  
  410.  
  411. func _on_FileDialog_dir_selected(dir):
  412. globals.setfolders.mods = dir
  413. print(dir)
  414. show()
  415.  
  416.  
  417. func _on_modfolder_pressed():
  418. $FileDialog.popup()
  419. $FileDialog.current_dir = modfolder
  420.  
  421.  
  422.  
  423. func _on_helpclose_pressed():
  424. $Panel.hide()
  425.  
  426.  
  427. func _on_modhelp_pressed():
  428. $Panel.show()
  429.  
  430.  
  431. func _on_openmodfolder_pressed():
  432. OS.shell_open(modfolder)
  433.  
  434.  
  435. func _on_activemods_pressed():
  436. var text = ''
  437. for i in activemods:
  438. text += i + '\n'
  439. $activemodlist.popup()
  440. $activemodlist/RichTextLabel.bbcode_text = text
  441.  
  442.  
  443. func _on_restartbutton_pressed():
  444.  
  445. get_tree().quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement