mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-11-04 08:35:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
class_name AssetRipper
 | 
						|
extends Node
 | 
						|
 | 
						|
const SPRITES_PATH: String = "res://Resources/AssetRipper/Sprites/"
 | 
						|
const SPRITE_LIST_PATH: String = "res://Resources/AssetRipper/SpriteList.json"
 | 
						|
 | 
						|
const DEFAULT_PALETTE_GROUP: String = "Default"
 | 
						|
const PREVIEW_PALETTE: Array[Color] = [
 | 
						|
	Color.TRANSPARENT,
 | 
						|
	Color.DIM_GRAY,
 | 
						|
	Color.WHITE,
 | 
						|
	Color.DARK_GRAY
 | 
						|
]
 | 
						|
const PALETTES_FOLDER: String = "res://Resources/AssetRipper/Palettes/%s/%s.json"
 | 
						|
 | 
						|
var rom: PackedByteArray
 | 
						|
var prg_rom_size: int
 | 
						|
var chr_rom: PackedByteArray
 | 
						|
 | 
						|
## UTIL
 | 
						|
func index_to_coords(index: int, max_x: int) -> Vector2i:
 | 
						|
	var x: int = wrapi(index, 0, max_x)
 | 
						|
	@warning_ignore("integer_division")
 | 
						|
	var y: int = floor(index / max_x)
 | 
						|
	return Vector2i(x, y)
 | 
						|
 | 
						|
func combine_bytes(byte0: int, byte1: int) -> PackedByteArray:
 | 
						|
	var output_value: PackedByteArray
 | 
						|
	for index in range(8):
 | 
						|
		var bit_mask: int = 1 << index
 | 
						|
		var shifted_byte0: int = (byte0 & bit_mask) >> index
 | 
						|
		var shifted_byte1: int = (byte1 & bit_mask) >> index << 1
 | 
						|
		output_value.insert(0, shifted_byte0 + shifted_byte1)
 | 
						|
	return output_value
 | 
						|
 | 
						|
func reverse_bits(num: int):
 | 
						|
	num = (num & 0xF0) >> 4 | (num & 0x0F) << 4
 | 
						|
	num = (num & 0xCC) >> 2 | (num & 0x33) << 2
 | 
						|
	num = (num & 0xAA) >> 1 | (num & 0x55) << 1
 | 
						|
	return num
 | 
						|
 | 
						|
func png_path_to_json(png_path: String) -> String:
 | 
						|
	return png_path.replace(
 | 
						|
		"res://Assets/Sprites/", "res://Resources/AssetRipper/Sprites/"
 | 
						|
	).replace(".png", ".json")
 | 
						|
 | 
						|
## TILE HANDLING
 | 
						|
func draw_tile(
 | 
						|
	chroma_key: bool,
 | 
						|
	image: Image, 
 | 
						|
	index: int, 
 | 
						|
	pos: Vector2i,
 | 
						|
	palette: PackedColorArray,
 | 
						|
	flip_h: bool = false, 
 | 
						|
	flip_v: bool = false
 | 
						|
) -> void:
 | 
						|
	var y = 0
 | 
						|
	var img_size: Vector2i = image.get_size()
 | 
						|
	var loaded_tile: Array[Array] = load_tile(index)
 | 
						|
	if flip_h:
 | 
						|
		for row in range(loaded_tile.size()):
 | 
						|
			for byte in range(loaded_tile[row].size()):
 | 
						|
				loaded_tile[row][byte] = reverse_bits(loaded_tile[row][byte])
 | 
						|
	if flip_v:
 | 
						|
		loaded_tile.reverse()
 | 
						|
	for row: Array in loaded_tile:
 | 
						|
		if y + pos.y < img_size.y:
 | 
						|
			var x = 0
 | 
						|
			for pixel: int in combine_bytes(row[0], row[1]):
 | 
						|
				if x + pos.x < img_size.x:
 | 
						|
					if not chroma_key or image.get_pixelv(Vector2i(x, y) + pos) == Color.GREEN:
 | 
						|
						image.set_pixelv(Vector2i(x, y) + pos, palette[pixel])
 | 
						|
				x += 1
 | 
						|
		y += 1
 | 
						|
 | 
						|
func load_tile(index: int) -> Array:
 | 
						|
	var address: int = 16*index
 | 
						|
	var data: Array[Array] = []
 | 
						|
	for i: int in range(8):
 | 
						|
		var byte0: int = chr_rom[address + i]
 | 
						|
		var byte1: int = chr_rom[address + i + 8]
 | 
						|
		data.append([byte0, byte1])
 | 
						|
	return data
 |