Skip to content

Commit 2f147a0

Browse files
First version
Compiler/decompiler, GUI and such.
1 parent 007aef7 commit 2f147a0

File tree

4 files changed

+733
-0
lines changed

4 files changed

+733
-0
lines changed

GUI.py

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
import os
2+
import tkinter as tk
3+
from tkinter import filedialog
4+
from tkinter import messagebox
5+
from SilkyMes import SilkyMes
6+
7+
class GUI:
8+
def __init__(self):
9+
self.__window = tk.Tk()
10+
self.__language = 'eng'
11+
self.__setWindowTitle()
12+
self.__width = 400
13+
self.__height = 500
14+
self.__window.geometry('{}x{}+{}+{}'.format(
15+
self.__width,
16+
self.__height,
17+
self.__window.winfo_screenwidth()//2-self.__width//2,
18+
self.__window.winfo_screenheight()//2-self.__height//2))
19+
self.__window.resizable(width=False, height=False)
20+
21+
self.__btn_rus = tk.Button(master=self.__window,
22+
text="Русский",
23+
command=self.__toRus,
24+
font=('Helvetica', 15),
25+
bg='white')
26+
self.__btn_eng = tk.Button(master=self.__window,
27+
text="English",
28+
command=self.__toEng,
29+
font=('Helvetica', 15),
30+
bg='white')
31+
self.__btn_rus.place(relx=0.0, rely=0.0, relwidth=0.5, relheight=0.1)
32+
self.__btn_eng.place(relx=0.5, rely=0.0, relwidth=0.5, relheight=0.1)
33+
self.__lbl_MesPoint = tk.Label(master=self.__window,
34+
bg='white',
35+
text='Enter a title of the .mes file:',
36+
font=('Helvetica', 12))
37+
self.__mesFile = tk.StringVar()
38+
self.__ent_MesName = tk.Entry(master=self.__window,
39+
bg='white',
40+
textvariable=self.__mesFile)
41+
self.__btn_MesFind = tk.Button(master=self.__window,
42+
text="???",
43+
command=self.__FindMes,
44+
font=('Helvetica', 12),
45+
bg='white')
46+
self.__lbl_TxtPoint = tk.Label(master=self.__window,
47+
bg='white',
48+
text='Enter a title of the .txt file:',
49+
font=('Helvetica', 12))
50+
self.__txtFile = tk.StringVar()
51+
self.__ent_TxtName = tk.Entry(master=self.__window,
52+
bg='white',
53+
textvariable=self.__txtFile)
54+
self.__btn_TxtFind = tk.Button(master=self.__window,
55+
text="???",
56+
command=self.__FindTxt,
57+
font=('Helvetica', 12),
58+
bg='white')
59+
self.__lbl_MesPoint.place(relx=0.0, rely=0.1, relwidth=1.0, relheight=0.05)
60+
self.__ent_MesName.place(relx=0.0, rely=0.15, relwidth=0.9, relheight=0.05)
61+
self.__btn_MesFind.place(relx=0.9, rely=0.15, relwidth=0.1, relheight=0.05)
62+
self.__lbl_TxtPoint.place(relx=0.0, rely=0.2, relwidth=1.0, relheight=0.05)
63+
self.__ent_TxtName.place(relx=0.0, rely=0.25, relwidth=0.9, relheight=0.05)
64+
self.__btn_TxtFind.place(relx=0.9, rely=0.25, relwidth=0.1, relheight=0.05)
65+
66+
self.__lblfr_Commands = tk.LabelFrame(master=self.__window,
67+
text="Commands:",
68+
font=('Helvetica', 14),
69+
bg='white',
70+
relief=tk.RAISED)
71+
self.__lblfr_Status = tk.LabelFrame(master=self.__window,
72+
text="Status:",
73+
font=('Helvetica', 14),
74+
bg='white',
75+
relief=tk.RAISED)
76+
self.__lblfr_Help = tk.LabelFrame(master=self.__window,
77+
text="Help:",
78+
font=('Helvetica', 14),
79+
bg='white',
80+
relief=tk.RAISED)
81+
self.__lblfr_Commands.place(relx=0.0, rely=0.3, relwidth=1.0, relheight=0.2)
82+
self.__lblfr_Status.place(relx=0.0, rely=0.5, relwidth=1.0, relheight=0.2)
83+
self.__lblfr_Help.place(relx=0.0, rely=0.7, relwidth=1.0, relheight=0.3)
84+
85+
self.__btm_commonHelp = tk.Button(master=self.__lblfr_Help,
86+
text="Common help",
87+
command=self.__commonHelp,
88+
font=('Helvetica', 12),
89+
bg='white')
90+
self.__btm_usageHelp = tk.Button(master=self.__lblfr_Help,
91+
text="Usage help",
92+
command=self.__usageHelp,
93+
font=('Helvetica', 12),
94+
bg='white')
95+
self.__btm_breaksHelp = tk.Button(master=self.__lblfr_Help,
96+
text="Line/message breaks help",
97+
command=self.__breaksHelp,
98+
font=('Helvetica', 12),
99+
bg='white')
100+
self.__txt_StatusArea = tk.Text(master=self.__lblfr_Status,
101+
font=('Helvetica', 14),
102+
bg='white',
103+
relief=tk.SUNKEN,
104+
state=tk.DISABLED)
105+
self.__txt_StatusArea.pack()
106+
107+
self.__btm_commonHelp.pack(fill=tk.X)
108+
self.__btm_usageHelp.pack(fill=tk.X)
109+
self.__btm_breaksHelp.pack(fill=tk.X)
110+
self.__btn_disasse = tk.Button(master=self.__lblfr_Commands,
111+
text="Disasseble script",
112+
command=self.__dissScript,
113+
font=('Helvetica', 12),
114+
bg='white')
115+
self.__btn_asse = tk.Button(master=self.__lblfr_Commands,
116+
text="Assemble script",
117+
command=self.__asseScript,
118+
font=('Helvetica', 12),
119+
bg='white')
120+
self.__btn_disasse.pack(fill=tk.X)
121+
self.__btn_asse.pack(fill=tk.X)
122+
123+
self.__window.mainloop()
124+
125+
def __FindMes(self):
126+
ftypes = []
127+
if (self.__language == 'eng'):
128+
ftypes = [('Silky Engine scripts', '*.mes'), ('All files', '*')]
129+
elif (self.__language == 'rus'):
130+
ftypes = [('Скрипты Silky Engine', '*.mes'), ('Все файлы', '*')]
131+
dialg = filedialog.Open(self.__window, filetypes=ftypes, initialdir=os.getcwd())
132+
file = dialg.show()
133+
self.__mesFile.set(file)
134+
def __FindTxt(self):
135+
ftypes = []
136+
if (self.__language == 'eng'):
137+
ftypes = [('Text files', '*.txt'), ('All files', '*')]
138+
elif (self.__language == 'rus'):
139+
ftypes = [('Текстовые файлы', '*.txt'), ('Все файлы', '*')]
140+
dialg = filedialog.Open(self.__window, filetypes=ftypes, initialdir=os.getcwd())
141+
file = dialg.show()
142+
self.__txtFile.set(file)
143+
def __toRus(self):
144+
self.__language = 'rus'
145+
self.__setWindowTitle()
146+
self.__lbl_MesPoint["text"] = "Введите название файла .mes:"
147+
self.__lbl_TxtPoint["text"] = "Введите название файла .txt:"
148+
self.__lblfr_Commands["text"] = "Команды:"
149+
self.__lblfr_Status["text"] = "Статус:"
150+
self.__lblfr_Help["text"] = "Помощь:"
151+
self.__btn_disasse["text"] = "Разобрать скрипт"
152+
self.__btn_asse["text"] = "Собрать скрипт"
153+
self.__txt_StatusArea["state"] = tk.NORMAL
154+
text = self.__txt_StatusArea.get(1.0, tk.END).rstrip('\n')
155+
self.__txt_StatusArea.delete(1.0, tk.END)
156+
if (text == 'Assembling succeed.'):
157+
self.__txt_StatusArea.insert(1.0, "Сборка удалось.")
158+
elif (text == 'Disassembling succeed.'):
159+
self.__txt_StatusArea.insert(1.0, "Разборка удалась.")
160+
elif (text == 'Assembling failed.'):
161+
self.__txt_StatusArea.insert(1.0, "Сборка не удалась.")
162+
elif (text == 'Disassembling failed.'):
163+
self.__txt_StatusArea.insert(1.0, "Разборка не удалась.")
164+
self.__txt_StatusArea["state"] = tk.DISABLED
165+
self.__btm_commonHelp["text"] = "Общая помощь"
166+
self.__btm_usageHelp["text"] = "Помощь по использованию"
167+
self.__btm_breaksHelp["text"] = "Помощь по переносам (по строкам/сообщениям)"
168+
def __toEng(self):
169+
self.__language = 'eng'
170+
self.__setWindowTitle()
171+
self.__lbl_MesPoint["text"] = "Enter a title of the .mes file:"
172+
self.__lbl_TxtPoint["text"] = "Enter a title of the .txt file:"
173+
self.__lblfr_Commands["text"] = "Commands:"
174+
self.__lblfr_Status["text"] = "Status:"
175+
self.__lblfr_Help["text"] = "Help:"
176+
self.__btn_disasse["text"] = "Disasseble script"
177+
self.__btn_asse["text"] = "Assemble script"
178+
self.__txt_StatusArea["state"] = tk.NORMAL
179+
text = self.__txt_StatusArea.get(1.0, tk.END).rstrip('\n')
180+
self.__txt_StatusArea.delete(1.0, tk.END)
181+
if (text == 'Сборка удалось.'):
182+
self.__txt_StatusArea.insert(1.0, "Assembling succeed.")
183+
elif (text == 'Разборка удалась.'):
184+
self.__txt_StatusArea.insert(1.0, "Disassembling succeed.")
185+
elif (text == 'Сборка не удалась.'):
186+
self.__txt_StatusArea.insert(1.0, "Assembling failed.")
187+
elif (text == 'Разборка не удалась.'):
188+
self.__txt_StatusArea.insert(1.0, "Disassembling failed.")
189+
self.__txt_StatusArea["state"] = tk.DISABLED
190+
self.__btm_commonHelp["text"] = "Common help"
191+
self.__btm_usageHelp["text"] = "Usage help"
192+
self.__btm_breaksHelp["text"] = "Line/message breaks help"
193+
def __setWindowTitle(self):
194+
if (self.__language == 'eng'):
195+
self.__window.title("mesScriptAsseAndDisassembler by Tester")
196+
elif (self.__language == 'rus'):
197+
self.__window.title("mesScriptAsseAndDisassembler от Tester-а")
198+
199+
def __dissScript(self):
200+
mesFile = ''
201+
txtFile = ''
202+
status = True
203+
mesFile, txtFile, status = self.__getMesAndTxt()
204+
if (not (status)):
205+
return False
206+
ScriptMes = SilkyMes(mesFile, txtFile)
207+
try:
208+
ScriptMes.dissasemble()
209+
self.__txt_StatusArea["state"] = tk.NORMAL
210+
self.__txt_StatusArea.delete(1.0, tk.END)
211+
if (self.__language == 'eng'):
212+
self.__txt_StatusArea.insert(1.0, "Disassembling succeed.")
213+
elif (self.__language == 'rus'):
214+
self.__txt_StatusArea.insert(1.0, "Разборка удалась.")
215+
self.__txt_StatusArea["state"] = tk.DISABLED
216+
except:
217+
self.__txt_StatusArea["state"] = tk.NORMAL
218+
self.__txt_StatusArea.delete(1.0, tk.END)
219+
if (self.__language == 'eng'):
220+
self.__txt_StatusArea.insert(1.0, "Disassembling failed.")
221+
elif (self.__language == 'rus'):
222+
self.__txt_StatusArea.insert(1.0, "Разборка не удалась.")
223+
self.__txt_StatusArea["state"] = tk.DISABLED
224+
del ScriptMes
225+
return True
226+
227+
def __asseScript(self):
228+
mesFile = ''
229+
txtFile = ''
230+
status = True
231+
mesFile, txtFile, status = self.__getMesAndTxt()
232+
if (not (status)):
233+
return False
234+
ScriptMes = SilkyMes(mesFile, txtFile)
235+
try:
236+
ScriptMes.assemble()
237+
self.__txt_StatusArea["state"] = tk.NORMAL
238+
self.__txt_StatusArea.delete(1.0, tk.END)
239+
if (self.__language == 'eng'):
240+
self.__txt_StatusArea.insert(1.0, "Assembling succeed.")
241+
elif (self.__language == 'rus'):
242+
self.__txt_StatusArea.insert(1.0, "Сборка удалось.")
243+
self.__txt_StatusArea["state"] = tk.DISABLED
244+
except:
245+
self.__txt_StatusArea["state"] = tk.NORMAL
246+
self.__txt_StatusArea.delete(1.0, tk.END)
247+
if (self.__language == 'eng'):
248+
self.__txt_StatusArea.insert(1.0, "Assembling failed.")
249+
elif (self.__language == 'rus'):
250+
self.__txt_StatusArea.insert(1.0, "Сборка не удалась.")
251+
self.__txt_StatusArea["state"] = tk.DISABLED
252+
del ScriptMes
253+
return True
254+
255+
def __getMesAndTxt(self):
256+
status = True
257+
mesFile = self.__ent_MesName.get()
258+
if (mesFile == ''):
259+
status = False
260+
if (self.__language == 'eng'):
261+
tk.messagebox.showerror("Error",
262+
"Error!\n.mes file title wasn't given!")
263+
elif (self.__language == 'rus'):
264+
tk.messagebox.showerror("Ошибка",
265+
"Ошибка!\nНазвание файла .mes не введено!")
266+
txtFile = self.__ent_TxtName.get()
267+
if (txtFile == ''):
268+
status = False
269+
if (self.__language == 'eng'):
270+
tk.messagebox.showerror("Error",
271+
"Error!\n.txt file title wasn't given!")
272+
elif (self.__language == 'rus'):
273+
tk.messagebox.showerror("Ошибка",
274+
"Ошибка!\nНазвание файла .txt не введено!")
275+
return mesFile, txtFile, status
276+
277+
def __commonHelp(self):
278+
if (self.__language == 'eng'):
279+
tk.messagebox.showinfo("Common help", ''' Dual languaged (rus+eng) tool for disassembling and assembling scripts .me sfrom the visual novel's engine Silky Engine (also known as Silky's Engine or SilkyEngine). With it thou can fully edit code, not just strings, as with some earlier tools. Thou can add line or even message breaks without restrictions!\n\n It has some useful features.\nFirstly, during disassembling all opcodes '\x0A' changes to '\x0B', so the engine wouldn't try to decrypt new strings and break latin and half-width kana symbols.\nSecondly, thou can make comments in txt file with "\u0024" at the beginning of the string.\nThirdly, some definations: "#0-" are "free bytes", "#1-" are commands (and "[...]" are arguments below) and "#2-" are labels.\n\nDeveloped by Tester: https://anivisual.net/index/8-78951.''')
280+
elif (self.__language == 'rus'):
281+
tk.messagebox.showinfo("Общая помощь", ''' Двуязычное (рус+англ) средство для разборки и сборки скриптов .mes движка визуальных новелл Silky Engine, также как Silky's Engine и SilkyEngine. С ним вы можете полностью редактирвоать код, а не только строки, как с ранее существовшими средствами. Вы можете добавлять разрывы текста по строкам и даже сообщениям без ограничений!\n\n В нём есть несколько полезных особенностей.Во-первых, во время дизассемблирования все опкоды '\x0A' меняются на '\x0B', дабы движок не пытался дешифровать новые строки и не ломал при том латиницу и полуширинные символы.\nВо-вторых, можно делать комментарии, при этом в начало строки необходимо ставить "\u0024".\nВ-третьих, опишем некоторые определения: "#0-" есть "вольные байты", "#1-" есть команды (и под ними "[...]" аргументы) и "#2-" есть метки.\n\nРазработано Tester-ом: https://anivisual.net/index/8-78951.''')
282+
def __usageHelp(self):
283+
if (self.__language == 'eng'):
284+
tk.messagebox.showinfo("Usage help", '''1. Enter a title of the .mes file in the top entry (do see, with extension). Thou can also enter relative or absolute path.\n2. Enter a title of the .txt file (do see, with extension). Thou can also enter relative or absolute path.\n3. For dissassemble push the button "Disassemble script".\n4. For assemble push the button "Assemble script".\n5. Status will be displayed on the text area below.''')
285+
elif (self.__language == 'rus'):
286+
tk.messagebox.showinfo("Помощь по использованию", '''1. Введите название файла .mes в верхней форме (заметьте, с исключением). Также можно вводить относительный или абсолютный до него путь.\n2. Введите название файла .txt в нижней форме (заметьте, с исключением). Также можно вводить относительный или абсолютный до него путь.\n3. Для разборки нажмите на кнопку "Разобрать скрипт".\n4. Для сборки нажмите на кнопку "Собрать скрипт".\n5. Статус сих операций будет отображаться на текстовом поле ниже.''')
287+
def __breaksHelp(self):
288+
if (self.__language == 'eng'):
289+
tk.messagebox.showinfo("Break help", '''Sometimes there could be a very big problem: text may not fully get in textbox. But with this tool thou don't need to cut some part of text, no. Thou can use line and message breaks. Methods are below.\n\n- For line breaks insert this below the current message ('SomeString' -> text on the new line):\n#1-TO_NEW_STRING\n[0]\n#1-STR_UNCRYPT\n['SomeString']\n\n- For message breaks insert this below the current message ('SomeString' -> text on the new message):\n#1-32\n[0, 3]\n#1-32\n[0, 22]\n#1-NVL?\n[]\n#1-32\n[0, 0]\n#1-32\n[0, 3]\n#1-17\n[]\n#1-MESSAGE\n[0]\n#1-STR_UNCRYPT\n['SomeString']''')
290+
elif (self.__language == 'rus'):
291+
tk.messagebox.showinfo("Помощь по переносам", '''Иногда можно столкнуться с одной большой-пребольшой проблемой: текст может не полностью влезать в текстовое окно. Однако, с сим средством вам не нужно обрезать его, отнюдь. Вы можеет организовывать переносы по строкам и сообщениям. Методы указаны ниже.\n\n- Для переносов по строкам добавьте под текущее сообщение следующий код ('Какая_то_строка' -> текст на новой строке):\n#1-TO_NEW_STRING\n[0]\n#1-STR_UNCRYPT\n['SomeString']\n\n- Для переносов по сообщениям добавьте под текущее сообщение следующий код ('Какая_то_строка' -> текст на новой строке):\n#1-32\n[0, 3]\n#1-32\n[0, 22]\n#1-NVL?\n[]\n#1-32\n[0, 0]\n#1-32\n[0, 3]\n#1-17\n[]\n#1-MESSAGE\n[0]\n#1-STR_UNCRYPT\n['SomeString']''')

0 commit comments

Comments
 (0)