RomResourceGenerator.gd 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. class_name ResourceGenerator
  2. extends AssetRipper
  3. @onready var progress_bar: ProgressBar = %ProgressBar
  4. @onready var error: Label = %Error
  5. func _ready() -> void:
  6. Global.get_node("GameHUD").hide()
  7. rom = FileAccess.get_file_as_bytes(Global.rom_path)
  8. prg_rom_size = rom[4] * 16384
  9. chr_rom = rom.slice(16 + prg_rom_size)
  10. await get_tree().create_timer(1, false).timeout
  11. generate_resource_pack()
  12. func _exit_tree() -> void:
  13. Global.get_node("GameHUD").show()
  14. func done() -> void:
  15. if not Settings.file.visuals.resource_packs.has(Global.ROM_PACK_NAME):
  16. Settings.file.visuals.resource_packs.insert(0, Global.ROM_PACK_NAME)
  17. await get_tree().create_timer(0.5).timeout
  18. Global.transition_to_scene("res://Scenes/Levels/TitleScreen.tscn")
  19. func generate_resource_pack() -> void:
  20. DirAccess.make_dir_recursive_absolute(Global.ROM_ASSETS_PATH)
  21. var pack_json: String = FileAccess.get_file_as_string("res://Resources/AssetRipper/ResourcePack/pack_info.json")
  22. var pack_dict: Dictionary = JSON.parse_string(pack_json)
  23. pack_dict.set("version", Global.ROM_ASSETS_VERSION)
  24. var pack_file := FileAccess.open(Global.ROM_ASSETS_PATH + "/pack_info.json", FileAccess.WRITE)
  25. pack_file.store_line(JSON.stringify(pack_dict))
  26. pack_file.close()
  27. var list_json: String = FileAccess.get_file_as_string(SPRITE_LIST_PATH)
  28. var list_dict: Dictionary = JSON.parse_string(list_json)
  29. var sprite_list: Array = list_dict.get("sprites", [])
  30. progress_bar.max_value = sprite_list.size()
  31. var sprites_handled: int = 0
  32. for sprite_path in sprite_list:
  33. var json_path: String = png_path_to_json(sprite_path)
  34. var sprite_image: Image
  35. print("Running:" + sprite_path)
  36. if sprite_path.begins_with("res://"):
  37. sprite_image = load(sprite_path).get_image()
  38. else:
  39. sprite_image = Image.load_from_file(sprite_path)
  40. sprite_image.convert(Image.FORMAT_RGBA8)
  41. if FileAccess.file_exists(json_path):
  42. var json_string: String = FileAccess.get_file_as_string(json_path)
  43. var json_dict: Dictionary = JSON.parse_string(json_string)
  44. paste_sprite(sprite_image, json_dict)
  45. var destination_path: String = get_destination_path(sprite_path)
  46. if not DirAccess.dir_exists_absolute(destination_path.get_base_dir()):
  47. DirAccess.make_dir_recursive_absolute(destination_path.get_base_dir())
  48. sprite_image.save_png(destination_path)
  49. sprites_handled += 1
  50. progress_bar.value = sprites_handled
  51. await get_tree().process_frame
  52. if sprites_handled < sprite_list.size():
  53. error.show()
  54. ## uncomment this once the initial jsons are fully setup so that the game won't
  55. ## boot if the resource pack loading is borked
  56. OS.move_to_trash(Global.ROM_ASSETS_PATH)
  57. else:
  58. done()
  59. func paste_sprite(sprite_image: Image, json_dict: Dictionary):
  60. var columns: int = str_to_var(json_dict.get("columns", "4"))
  61. var sheet_size: Vector2i = str_to_var(json_dict.get("sheet_size", "Vector2i(16, 16)"))
  62. var palette_base: String = json_dict.get("palette_base", "Tile")
  63. var palette_var: Variant = str_to_var(json_dict.get("palettes", "{}"))
  64. var palette_lists: Dictionary
  65. if typeof(palette_var) == TYPE_ARRAY:
  66. palette_lists[palette_base] = palette_var
  67. elif typeof(palette_var) == TYPE_DICTIONARY:
  68. palette_lists = palette_var
  69. var tile_list: Dictionary = str_to_var(json_dict.get("tiles", "{}"))
  70. var img_size: Vector2i = sprite_image.get_size()
  71. for palette_name in palette_lists.keys():
  72. var cur_column: int = 0
  73. var offset := Vector2.ZERO
  74. var pal_json: String = FileAccess.get_file_as_string(
  75. PALETTES_FOLDER % [DEFAULT_PALETTE_GROUP, palette_name])
  76. var pal_dict: Dictionary = JSON.parse_string(pal_json).palettes
  77. for palette_id: String in palette_lists[palette_name]:
  78. var palette: Array = pal_dict.get(palette_id, PREVIEW_PALETTE)
  79. for tile_pos: Vector2 in tile_list:
  80. var tile_dict: Dictionary = tile_list[tile_pos]
  81. var tile_palette: String = tile_dict.get("palette", palette_base)
  82. if tile_palette == palette_name:
  83. var destination: Vector2 = tile_pos + offset
  84. if destination.x < img_size.x and destination.y < img_size.y:
  85. draw_tile(
  86. true,
  87. sprite_image,
  88. tile_dict.get("index", 0),
  89. destination,
  90. palette,
  91. tile_dict.get("flip_h", false),
  92. tile_dict.get("flip_v", false)
  93. )
  94. cur_column += 1
  95. if cur_column >= columns:
  96. cur_column = 0
  97. offset.x = 0
  98. offset.y += sheet_size.y
  99. else:
  100. offset.x += sheet_size.x
  101. func get_destination_path(sprite_path: String) -> String:
  102. return sprite_path.replace("res://Assets/", Global.ROM_ASSETS_PATH + "/")