| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- class_name ResourceGenerator
- extends AssetRipper
- @onready var progress_bar: ProgressBar = %ProgressBar
- @onready var error: Label = %Error
- func _ready() -> void:
- Global.get_node("GameHUD").hide()
-
- rom = FileAccess.get_file_as_bytes(Global.rom_path)
- prg_rom_size = rom[4] * 16384
- chr_rom = rom.slice(16 + prg_rom_size)
- await get_tree().create_timer(1, false).timeout
- generate_resource_pack()
- func _exit_tree() -> void:
- Global.get_node("GameHUD").show()
- func done() -> void:
- if not Settings.file.visuals.resource_packs.has(Global.ROM_PACK_NAME):
- Settings.file.visuals.resource_packs.insert(0, Global.ROM_PACK_NAME)
-
- await get_tree().create_timer(0.5).timeout
- Global.transition_to_scene("res://Scenes/Levels/TitleScreen.tscn")
- func generate_resource_pack() -> void:
- DirAccess.make_dir_recursive_absolute(Global.ROM_ASSETS_PATH)
-
- var pack_json: String = FileAccess.get_file_as_string("res://Resources/AssetRipper/ResourcePack/pack_info.json")
- var pack_dict: Dictionary = JSON.parse_string(pack_json)
- pack_dict.set("version", Global.ROM_ASSETS_VERSION)
-
- var pack_file := FileAccess.open(Global.ROM_ASSETS_PATH + "/pack_info.json", FileAccess.WRITE)
- pack_file.store_line(JSON.stringify(pack_dict))
- pack_file.close()
-
- var list_json: String = FileAccess.get_file_as_string(SPRITE_LIST_PATH)
- var list_dict: Dictionary = JSON.parse_string(list_json)
-
- var sprite_list: Array = list_dict.get("sprites", [])
- progress_bar.max_value = sprite_list.size()
-
- var sprites_handled: int = 0
- for sprite_path in sprite_list:
- var json_path: String = png_path_to_json(sprite_path)
- var sprite_image: Image
- print("Running:" + sprite_path)
- if sprite_path.begins_with("res://"):
- sprite_image = load(sprite_path).get_image()
- else:
- sprite_image = Image.load_from_file(sprite_path)
- sprite_image.convert(Image.FORMAT_RGBA8)
- if FileAccess.file_exists(json_path):
- var json_string: String = FileAccess.get_file_as_string(json_path)
- var json_dict: Dictionary = JSON.parse_string(json_string)
-
- paste_sprite(sprite_image, json_dict)
-
- var destination_path: String = get_destination_path(sprite_path)
- if not DirAccess.dir_exists_absolute(destination_path.get_base_dir()):
- DirAccess.make_dir_recursive_absolute(destination_path.get_base_dir())
- sprite_image.save_png(destination_path)
-
- sprites_handled += 1
- progress_bar.value = sprites_handled
- await get_tree().process_frame
-
- if sprites_handled < sprite_list.size():
- error.show()
- ## uncomment this once the initial jsons are fully setup so that the game won't
- ## boot if the resource pack loading is borked
- OS.move_to_trash(Global.ROM_ASSETS_PATH)
- else:
- done()
- func paste_sprite(sprite_image: Image, json_dict: Dictionary):
- var columns: int = str_to_var(json_dict.get("columns", "4"))
- var sheet_size: Vector2i = str_to_var(json_dict.get("sheet_size", "Vector2i(16, 16)"))
- var palette_base: String = json_dict.get("palette_base", "Tile")
-
- var palette_var: Variant = str_to_var(json_dict.get("palettes", "{}"))
- var palette_lists: Dictionary
- if typeof(palette_var) == TYPE_ARRAY:
- palette_lists[palette_base] = palette_var
- elif typeof(palette_var) == TYPE_DICTIONARY:
- palette_lists = palette_var
-
- var tile_list: Dictionary = str_to_var(json_dict.get("tiles", "{}"))
- var img_size: Vector2i = sprite_image.get_size()
-
- for palette_name in palette_lists.keys():
- var cur_column: int = 0
- var offset := Vector2.ZERO
-
- var pal_json: String = FileAccess.get_file_as_string(
- PALETTES_FOLDER % [DEFAULT_PALETTE_GROUP, palette_name])
- var pal_dict: Dictionary = JSON.parse_string(pal_json).palettes
-
- for palette_id: String in palette_lists[palette_name]:
- var palette: Array = pal_dict.get(palette_id, PREVIEW_PALETTE)
-
- for tile_pos: Vector2 in tile_list:
- var tile_dict: Dictionary = tile_list[tile_pos]
- var tile_palette: String = tile_dict.get("palette", palette_base)
- if tile_palette == palette_name:
- var destination: Vector2 = tile_pos + offset
- if destination.x < img_size.x and destination.y < img_size.y:
- draw_tile(
- true,
- sprite_image,
- tile_dict.get("index", 0),
- destination,
- palette,
- tile_dict.get("flip_h", false),
- tile_dict.get("flip_v", false)
- )
-
- cur_column += 1
- if cur_column >= columns:
- cur_column = 0
- offset.x = 0
- offset.y += sheet_size.y
- else:
- offset.x += sheet_size.x
- func get_destination_path(sprite_path: String) -> String:
- return sprite_path.replace("res://Assets/", Global.ROM_ASSETS_PATH + "/")
|