3
0
mirror of synced 2024-11-27 17:00:55 +01:00

Chara search by name, get hariai from game files

This commit is contained in:
Shinrin Ouja Moriking 2024-05-11 20:11:11 -06:00
parent 72293be29b
commit e27e4949b7
4 changed files with 86 additions and 19 deletions

View File

@ -45,6 +45,7 @@
"New chart format": "New chart format", "New chart format": "New chart format",
"Background": "Background", "Background": "Background",
"Hariai": "Hariai", "Hariai": "Hariai",
"From game files": "From game files",
"Output folder": "Output folder", "Output folder": "Output folder",
"Create Mod": "Create Mod", "Create Mod": "Create Mod",
"Fw error": "FW fields can't be Hiragana, kanji or have symbols", "Fw error": "FW fields can't be Hiragana, kanji or have symbols",

View File

@ -766,6 +766,7 @@ if __name__ == "__main__":
requiredNamed.add_argument('--banner', help='Banner image (must be 244x58)', default=None, required=True) requiredNamed.add_argument('--banner', help='Banner image (must be 244x58)', default=None, required=True)
parser.add_argument('--bg', help='Background image (must be 128x256)', default=None, required=False) parser.add_argument('--bg', help='Background image (must be 128x256)', default=None, required=False)
parser.add_argument('--hariai', help='Hariai image (must be 250x322 or 382x502)', default=None) parser.add_argument('--hariai', help='Hariai image (must be 250x322 or 382x502)', default=None)
parser.add_argument('--metadata-hariai-in-game', help='hariai already is in game files', default=False, action='store_true')
parser.add_argument('--metadata-fw-title', help='Fullwidth music title for database', default=None) parser.add_argument('--metadata-fw-title', help='Fullwidth music title for database', default=None)
parser.add_argument('--metadata-fw-artist', help='Fullwidth music artist for database', default=None) parser.add_argument('--metadata-fw-artist', help='Fullwidth music artist for database', default=None)
parser.add_argument('--metadata-fw-genre', help='Fullwidth music genre for database', default=None) parser.add_argument('--metadata-fw-genre', help='Fullwidth music genre for database', default=None)
@ -829,7 +830,6 @@ if __name__ == "__main__":
# Chart level # Chart level
level = args_vars['lvl_%s' % difficulty] level = args_vars['lvl_%s' % difficulty]
level = level if level != None else 1 level = level if level != None else 1
chart = E.chart( chart = E.chart(
E.folder("custom", __type="str"), E.folder("custom", __type="str"),
E.filename(args.name, __type="str"), E.filename(args.name, __type="str"),
@ -899,9 +899,14 @@ if __name__ == "__main__":
# Create banner folder # Create banner folder
tex_files['kc_diff_ifs'] = create_banner(output_path, args.musicid, args.banner) tex_files['kc_diff_ifs'] = create_banner(output_path, args.musicid, args.banner)
hariai = ""
if args.hariai: if args.hariai:
# Create hariai folder # If hariai is on game files, dont need to create again
tex_files['ha_merge_ifs'] = create_hariai(output_path, args.musicid, args.hariai) if args.metadata_hariai_in_game:
hariai = args.hariai
else: # Create hariai folder
tex_files['ha_merge_ifs'] = create_hariai(output_path, args.musicid, args.hariai)
hariai = tex_files['ha_merge_ifs']
mask |= 0x00800000 # Required for songs that show a hariai image on the music selection screen mask |= 0x00800000 # Required for songs that show a hariai image on the music selection screen
if args.bg: if args.bg:
@ -925,7 +930,7 @@ if __name__ == "__main__":
E.cs_version(str(args.metadata_cs_version), __type="u32"), E.cs_version(str(args.metadata_cs_version), __type="u32"),
E.categories(str(args.metadata_categories), __type="u32"), E.categories(str(args.metadata_categories), __type="u32"),
E.charts(*charts_xml), E.charts(*charts_xml),
E.ha(tex_files.get('ha_merge_ifs', ""), __type="str"), E.ha(hariai, __type="str"),
E.chara_x(str(args.metadata_chara_x), __type="u32"), E.chara_x(str(args.metadata_chara_x), __type="u32"),
E.chara_y(str(args.metadata_chara_y), __type="u32"), E.chara_y(str(args.metadata_chara_y), __type="u32"),
E.unk1("0 0 0 0 0 0 36 0 0 59 77 0 0 0 0 134 0 0 68 67 222 0 0 0 0 0 0 0 0 0 0 0", __type="u16", __count="32"), E.unk1("0 0 0 0 0 0 36 0 0 59 77 0 0 0 0 134 0 0 68 67 222 0 0 0 0 0 0 0 0 0 0 0", __type="u16", __count="32"),

View File

@ -5,6 +5,7 @@ import os
import jaconv import jaconv
import subprocess import subprocess
import re import re
import cutlet
from tkinter import filedialog as fd from tkinter import filedialog as fd
from tkinter import messagebox from tkinter import messagebox
from tkinter.messagebox import showinfo,askyesno from tkinter.messagebox import showinfo,askyesno
@ -65,7 +66,7 @@ class Application(tkinter.Frame):
self.has_battle_var = BooleanVar() self.has_battle_var = BooleanVar()
self.is_jacket_var = BooleanVar() self.is_jacket_var = BooleanVar()
self.new_chart_format = BooleanVar() self.new_chart_format = BooleanVar()
self.hariai_in_game = BooleanVar()
# first menu # first menu
self.menu_bar= tkinter.Menu(parent) self.menu_bar= tkinter.Menu(parent)
self.menu_file = tkinter.Menu(self.menu_bar, tearoff=False) self.menu_file = tkinter.Menu(self.menu_bar, tearoff=False)
@ -223,14 +224,14 @@ class Application(tkinter.Frame):
self.tag_chara_1.grid(column=0, row=18,sticky="W",pady = 2) self.tag_chara_1.grid(column=0, row=18,sticky="W",pady = 2)
self.box_chara_1 = tkinter.Entry(parent) self.box_chara_1 = tkinter.Entry(parent)
self.box_chara_1.grid(column=1, row=18,sticky='ew') self.box_chara_1.grid(column=1, row=18,sticky='ew')
self.sel_chara_1 = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.chara_selection(parent,self.box_chara_1)) self.sel_chara_1 = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.chara_selection(parent,self.box_chara_1,0))
self.sel_chara_1.grid(column=2, row=18,sticky="W") self.sel_chara_1.grid(column=2, row=18,sticky="W")
#Chara 2 #Chara 2
self.tag_chara_2 = tkinter.Label(parent, text=self.tr["Chara 2"]) self.tag_chara_2 = tkinter.Label(parent, text=self.tr["Chara 2"])
self.tag_chara_2.grid(column=0, row=19,sticky="W",pady = 2) self.tag_chara_2.grid(column=0, row=19,sticky="W",pady = 2)
self.box_chara_2 = tkinter.Entry(parent) self.box_chara_2 = tkinter.Entry(parent)
self.box_chara_2.grid(column=1, row=19,sticky='ew') self.box_chara_2.grid(column=1, row=19,sticky='ew')
self.sel_chara_2 = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.chara_selection(parent,self.box_chara_2)) self.sel_chara_2 = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.chara_selection(parent,self.box_chara_2,0))
self.sel_chara_2.grid(column=2, row=19,sticky="W") self.sel_chara_2.grid(column=2, row=19,sticky="W")
#Has battle hyper #Has battle hyper
self.tag_battle_hyper = tkinter.Label(parent, text=self.tr["Has battle hyper"]) self.tag_battle_hyper = tkinter.Label(parent, text=self.tr["Has battle hyper"])
@ -372,19 +373,27 @@ class Application(tkinter.Frame):
self.find_hariai.grid(column=7, row=25,sticky="W") self.find_hariai.grid(column=7, row=25,sticky="W")
self.clean_hariai = tkinter.Button(parent,text=self.tr["Clean"],command=lambda: self.clean_image(parent,"hariai",self.box_hariai)) self.clean_hariai = tkinter.Button(parent,text=self.tr["Clean"],command=lambda: self.clean_image(parent,"hariai",self.box_hariai))
self.clean_hariai.grid(column=8, row=25,sticky="w",columnspan=1) self.clean_hariai.grid(column=8, row=25,sticky="w",columnspan=1)
#Hariai from game
self.tag_game_hariai = tkinter.Label(parent, text=self.tr["From game files"])
self.tag_game_hariai.grid(column=5, row=26,sticky="W",pady = 2)
self.check_game_hariai = tkinter.Checkbutton(parent,onvalue=True, offvalue=False,variable=self.hariai_in_game)
self.check_game_hariai.grid(column=6, row=26,sticky='ew')
self.game_hariai = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.chara_selection(parent,self.box_hariai,2))
self.game_hariai.grid(column=7, row=26,sticky="w",columnspan=1)
#Output folder #Output folder
self.tag_output = tkinter.Label(parent, text=self.tr["Output folder"]) self.tag_output = tkinter.Label(parent, text=self.tr["Output folder"])
self.tag_output.grid(column=5, row=26,sticky="W",pady = 2) self.tag_output.grid(column=5, row=27,sticky="W",pady = 2)
self.box_output= tkinter.Entry(parent) self.box_output= tkinter.Entry(parent)
self.box_output.grid(column=6, row=26,sticky='ew') self.box_output.grid(column=6, row=27,sticky='ew')
self.find_output = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.select_directory(self.box_output)) self.find_output = tkinter.Button(parent,text=self.tr["Open"],command=lambda: self.select_directory(self.box_output))
self.find_output.grid(column=7, row=26,sticky="W") self.find_output.grid(column=7, row=27,sticky="W")
#Create Mod #Create Mod
self.create_mod = tkinter.Button(parent,text=self.tr["Create Mod"],command=lambda:self.generate_mod()) self.create_mod = tkinter.Button(parent,text=self.tr["Create Mod"],command=lambda:self.generate_mod())
self.create_mod.grid(column=6, row=28,sticky="EW") self.create_mod.grid(column=6, row=29,sticky="EW")
#Banner display #Banner display
self.tag_image_banner=tkinter.Label(parent, text=self.tr["Banner"]) self.tag_image_banner=tkinter.Label(parent, text=self.tr["Banner"])
@ -455,6 +464,7 @@ class Application(tkinter.Frame):
self.box_to_param("--metadata-chara2",self.box_chara_2) self.box_to_param("--metadata-chara2",self.box_chara_2)
self.bool_to_param("--metadata-has-battle-hyper",self.has_battle_var) self.bool_to_param("--metadata-has-battle-hyper",self.has_battle_var)
self.bool_to_param("--metadata-hariai-is-jacket",self.is_jacket_var) self.bool_to_param("--metadata-hariai-is-jacket",self.is_jacket_var)
self.bool_to_param("--metadata-hariai-in-game",self.hariai_in_game)
self.box_to_param("--metadata-folder",self.value_inside_folder) self.box_to_param("--metadata-folder",self.value_inside_folder)
self.box_to_param("--lvl-bp",self.value_inside_bp_lv) self.box_to_param("--lvl-bp",self.value_inside_bp_lv)
self.box_to_param("--lvl-ep",self.value_inside_ep_lv) self.box_to_param("--lvl-ep",self.value_inside_ep_lv)
@ -557,6 +567,7 @@ class Application(tkinter.Frame):
return 0 return 0
widget.delete(0,"end") widget.delete(0,"end")
widget.insert(0,filename) widget.insert(0,filename)
self.hariai_in_game.set(False)
@ -727,6 +738,7 @@ class Application(tkinter.Frame):
data["New chart format"]=self.new_chart_format.get() data["New chart format"]=self.new_chart_format.get()
data["Background"]=self.box_background.get() data["Background"]=self.box_background.get()
data["Hariai"]=self.box_hariai.get() data["Hariai"]=self.box_hariai.get()
data["Hariai in game"]=self.hariai_in_game.get()
data["Output folder"]=self.box_output.get() data["Output folder"]=self.box_output.get()
return(json.dumps(data)) return(json.dumps(data))
@ -741,6 +753,15 @@ class Application(tkinter.Frame):
return default return default
return val return val
def set_bool(self, data, name: str, default: bool = False) -> bool:
val = data.get(name)
if val is None:
return default
if type(val) != bool:
return default
return val
def p2b_to_fields(self,data,parent): def p2b_to_fields(self,data,parent):
@ -798,8 +819,17 @@ class Application(tkinter.Frame):
self.insert_image(parent,data["Banner"],self.box_banner,"banner") self.insert_image(parent,data["Banner"],self.box_banner,"banner")
if(data["Background"]!=''): if(data["Background"]!=''):
self.insert_image(parent,data["Background"],self.box_background,"bg") self.insert_image(parent,data["Background"],self.box_background,"bg")
hariai_is_in_game = self.set_bool(data,"Hariai in game")
self.hariai_in_game.set(hariai_is_in_game)
if(data["Hariai"]!=''): if(data["Hariai"]!=''):
self.insert_image(parent,data["Hariai"],self.box_hariai,"hariai") if hariai_is_in_game == False:
self.insert_image(parent,data["Hariai"],self.box_hariai,"hariai")
else:
self.box_hariai.delete(0,"end")
self.box_hariai.insert(0,data["Hariai"])
self.menu_file.entryconfig(2, state=ACTIVE) self.menu_file.entryconfig(2, state=ACTIVE)
def new_fields(self,parent): def new_fields(self,parent):
@ -847,6 +877,7 @@ class Application(tkinter.Frame):
self.new_chart_format.set(False) self.new_chart_format.set(False)
self.replace_value(self.box_background,"") self.replace_value(self.box_background,"")
self.replace_value(self.box_hariai,"") self.replace_value(self.box_hariai,"")
self.hariai_in_game.set(False)
self.replace_value(self.box_output,"") self.replace_value(self.box_output,"")
#clean images #clean images
@ -933,7 +964,7 @@ class Application(tkinter.Frame):
elif save == False: elif save == False:
parent.destroy() parent.destroy()
def chara_selection(self,parent,widget): def chara_selection(self,parent,widget,pos):
# Toplevel object which will # Toplevel object which will
# be treated as a new window # be treated as a new window
ctWin = Toplevel(parent) ctWin = Toplevel(parent)
@ -943,18 +974,28 @@ class Application(tkinter.Frame):
ctWin.geometry("200x200") ctWin.geometry("200x200")
self.grid_columnconfigure(0, weight=0) self.grid_columnconfigure(0, weight=0)
self.grid_columnconfigure(1, weight=0) self.grid_columnconfigure(1, weight=0)
self.grid_columnconfigure(2, weight=0)
self.grid_columnconfigure(3, weight=0)
self.grid_rowconfigure(0, weight=0) self.grid_rowconfigure(0, weight=0)
self.grid_rowconfigure(1, weight=0) self.grid_rowconfigure(1, weight=0)
self.grid_rowconfigure(2, weight=0)
self.grid_rowconfigure(3, weight=0)
#creating text box #creating text box
e = Entry(ctWin) e = Entry(ctWin)
e.pack(side='top', fill='x', expand=True) e.pack(side='top', fill='x', expand=True)
e.bind('<KeyRelease>', self.checkkey) e.bind('<KeyRelease>', self.checkkey)
#buttons
btn_romaji = Button(ctWin,text="romaji",command=lambda: self.list_to_romaji())
btn_romaji.pack()
btn_katakana = Button(ctWin,text="katakana",command=lambda: self.list_to_katakana())
btn_katakana.pack()
#creating list box #creating list box
self.lb = Listbox(ctWin) self.lb = Listbox(ctWin)
self.lb.pack(side='top', fill='x', expand=True) self.lb.pack(side='top', fill='x', expand=True)
self.lb.bind('<<ListboxSelect>>', lambda eff: self.onselect(eff,widget)) self.lb.bind('<<ListboxSelect>>', lambda eff: self.onselect(eff,widget,pos))
self.update(self.l) self.update(self.l)
@ -962,6 +1003,18 @@ class Application(tkinter.Frame):
ctWin.grab_set() ctWin.grab_set()
parent.wait_window(ctWin) parent.wait_window(ctWin)
def list_to_romaji(self):
new_list = []
katsu = cutlet.Cutlet()
for line in self.l:
new_list.append([line[0],katsu.romaji(line[1]),line[2]])
self.l = new_list
self.update(self.l)
def list_to_katakana(self):
self.l=self.chara_txt_to_data()
self.update(self.l)
# Function for checking the # Function for checking the
# key pressed and updating # key pressed and updating
# the listbox # the listbox
@ -975,7 +1028,7 @@ class Application(tkinter.Frame):
else: else:
data = [] data = []
for item in self.l: for item in self.l:
if value.lower() in item.lower(): if value.lower() in ''.join(str(x) for x in item).lower():
data.append(item) data.append(item)
# update data in listbox # update data in listbox
@ -990,12 +1043,15 @@ class Application(tkinter.Frame):
for item in data: for item in data:
self.lb.insert('end', item) self.lb.insert('end', item)
def onselect(self,event,widget): def onselect(self,event,widget,pos):
# Note here that Tkinter passes an event object to onselect() # Note here that Tkinter passes an event object to onselect()
w = event.widget w = event.widget
index = int(w.curselection()[0]) index = int(w.curselection()[0])
value = w.get(index) value = w.get(index)
self.replace_value(widget,value) self.replace_value(widget,value[pos])
# Hariai in game
if pos == 2:
self.hariai_in_game.set(True)
def chara_txt_to_data(self): def chara_txt_to_data(self):
# Using readlines() # Using readlines()
@ -1004,7 +1060,10 @@ class Application(tkinter.Frame):
charas = [] charas = []
# Strips the newline character # Strips the newline character
for line in Lines: for line in Lines:
charas.append(line.split(',')[0].replace("'",'').strip()) chara_anim = line.split(',')[0].replace("'",'').strip()
ha = line.split(',')[15].replace("'",'').strip()
chara_name = line.split(',')[10].replace("'",'').strip()
charas.append([chara_anim,chara_name,ha])
return charas return charas

View File

@ -3,3 +3,5 @@ pydub==0.23.1
jaconv==0.3 jaconv==0.3
lxml==4.9.1 lxml==4.9.1
Pillow==8.3.1 Pillow==8.3.1
cutlet
unidic-lite