Created
November 28, 2022 16:34
-
-
Save Erotemic/c77b073d8c73a1cd6e355b5543c16f18 to your computer and use it in GitHub Desktop.
Revisions
-
Erotemic created this gist
Nov 28, 2022 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,235 @@ """ make VERSION=us -j16 build/us_pc/sm64.us SeeAlso: https://github.com/TechieAndroid/sm64redrawn """ import ubelt as ub import aifc import kwimage import os # NOQA input_dpath = ub.Path('~/code/sm64-port').expand() output_dpath = ub.Path('~/code/sm64-port-safe').expand() manifest_fpath = input_dpath / '.assets-local.txt' manifest_fpath.copy(output_dpath, overwrite=True) lines = manifest_fpath.read_text().split('\n') asset_fpaths = [ub.Path(p) for p in lines[2:-1]] def redo_image(in_fpath, out_fpath): import numpy as np data = kwimage.imread(in_fpath) shape = data.shape new_data = handle_text(fname, shape) if new_data is None: new_data = data.copy() rand_data = (np.random.rand(*data.shape) * 255).astype(np.uint8) new_data[:, :, 0:4] = rand_data[:, :, 0:4] # new_data[:, :, 0:4] = 0 kwimage.imwrite(out_fpath, new_data) return shape def build_char_name_map(): """ # Font Notes: textures ipl3_font_00.ia1.png = A ipl3_font_25.ia1.png = Z ipl3_font_26.ia1.png = 0 ipl3_font_35.ia1.png = 9 36-49 !"#'*+,-./;=?@ import kwplot kwplot.autompl() kwplot.imshow(img) # In textures/segment2/ Looks like rotated numbers and letters. segment2.00000.rgba16.png - Big 0 segment2.00200.rgba16.png - Big 1 segment2.00400.rgba16.png - Big 2 """ ipl_chars = [] for i in range(26): ipl_chars.append(chr(ord('A') + i)) for i in range(10): ipl_chars.append(chr(ord('0') + i)) ipl_chars.extend('!"#\'*+,-./;=?@') name_to_text_lut = {} for i, c in enumerate(ipl_chars): n = 'textures/ipl3_raw/ipl3_font_{:02d}.ia1.png'.format(i) name_to_text_lut[n] = { 'text': c, 'color': 'white', } # Big fancy letters segment_fmt = 'textures/segment2/segment2.{:03X}00.rgba16.png' for i in range(10): n = segment_fmt.format(i * 2) c = str(i) name_to_text_lut[n] = { 'text': c, 'color': 'orange', } for i in range(26): n = segment_fmt.format(20 + i * 2) c = chr(ord('A') + i) name_to_text_lut[n] = { 'text': c, 'color': 'orange', } # Sideways italic letters 'font_graphics.05B80.ia4.png' 'font_graphics.05BC0.ia4.png' fmt = 'textures/segment2/font_graphics.{:05X}.ia4.png' offset = 0x05B80 inc = 0x05BC0 - offset for i in range(26): n = fmt.format(offset + i * inc) c = chr(ord('A') + i) name_to_text_lut[n] = { 'text': c, 'color': 'white', 'rot': 1, 'scale': 0.5 } # Green letters with black background fmt = 'textures/segment2/segment2.{:05X}.rgba16.png' offset = 0x06380 inc = 0x06400 - 0x06380 for i in range(26): n = fmt.format(offset + i * inc) c = chr(ord('A') + i) name_to_text_lut[n] = { 'text': c, 'color': 'green', 'scale': 0.5, 'background': 'black', } name_to_text_lut['levels/castle_grounds/5.ia8.png'] = { # fixme 'text': 'Peach', 'color': 'white', } # 'levels/menu/main_menu_seg7_us.0AC40.ia8.png': 0 return name_to_text_lut name_to_text_lut = build_char_name_map() def handle_text(fname, shape): import numpy as np fname = str(fname) if fname in name_to_text_lut: info = name_to_text_lut[fname] c = info['text'] color = info['color'] rot = info.get('rot', 0) scale = info.get('scale', 1) bg = np.zeros(shape, dtype=np.uint8) h, w = shape[1], shape[0] if rot: h, w = w, h org = (w // 2, h // 2) img = kwimage.draw_text_on_image( bg, c, fontScale=0.6 * scale, thickness=1, org=org, halign='center', valign='center', color=color) if rot: img = np.rot90(img, k=3) img = np.flipud(img) return img def redo_audio(in_fpath, out_fpath): file = aifc.open(open(in_fpath, 'rb'), 'rb') params = file.getparams() data = file.readframes(params.nframes) # Random new sound new_data = os.urandom(len(data)) # Zero out all sounds # new_data = b'\x00' * len(data) new_file = aifc.open(open(out_fpath, 'wb'), 'wb') new_file.setparams(params) new_file.writeframes(new_data) return params ext_to_fpaths = ub.group_items(asset_fpaths, lambda x: x.suffix) metadata = ub.ddict(list) for fname in ext_to_fpaths['.aiff']: in_fpath = input_dpath / fname out_fpath = output_dpath / fname if in_fpath.exists(): out_fpath.parent.ensuredir() params = redo_audio(in_fpath, out_fpath) metadata['.aiff'].append({ 'fname': fname, 'params': params, }) for fname in ext_to_fpaths['.png']: in_fpath = input_dpath / fname out_fpath = output_dpath / fname if in_fpath.exists(): out_fpath.parent.ensuredir() shape = redo_image(in_fpath, out_fpath) metadata['.png'].append({ 'fname': fname, 'shape': shape, }) for fname in ext_to_fpaths['.m64']: in_fpath = input_dpath / fname out_fpath = output_dpath / fname if in_fpath.exists(): out_fpath.parent.ensuredir() # Figure out how to zero or randomize this # in_fpath.copy(out_fpath, overwrite=True) orig = in_fpath.read_bytes() new = b'\x00' * len(orig) out_fpath.write_bytes(new) metadata['.m64'].append({ 'fname': fname, 'num': len(orig) }) for fname in ext_to_fpaths['.bin']: in_fpath = input_dpath / fname out_fpath = output_dpath / fname if in_fpath.exists(): out_fpath.parent.ensuredir() # Figure out how to zero or randomize this # in_fpath.copy(out_fpath, overwrite=True) orig = in_fpath.read_bytes() new = b'\x00' * len(orig) out_fpath.write_bytes(new) metadata['.bin'].append({ 'fname': fname, 'num': len(orig) })