Advertisement
Guest User

modpanel.gd

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