diff options
Diffstat (limited to 'extractor')
-rw-r--r-- | extractor/extractor_interface.gd | 28 | ||||
-rw-r--r-- | extractor/gnd_format.gd | 6 | ||||
-rw-r--r-- | extractor/grf.gd | 25 | ||||
-rw-r--r-- | extractor/rsm_format.gd | 12 | ||||
-rw-r--r-- | extractor/rsw_format.gd | 18 |
5 files changed, 54 insertions, 35 deletions
diff --git a/extractor/extractor_interface.gd b/extractor/extractor_interface.gd index 3afedfd..4d74a20 100644 --- a/extractor/extractor_interface.gd +++ b/extractor/extractor_interface.gd @@ -2,9 +2,11 @@ extends Control func _ready() -> void: - #var grf = GRF.open("res://client_data/data.grf") - #grf.extract()#"user://client_data") - #grf.convert()#"user://client_data") + pass + + var grf = GRF.open("res://client_data/data.grf") + #grf.extract("res://client_data") + grf.convert("res://client_data") #Sprite.from_bytes(FileAccess.get_file_as_bytes("res://client_data/data/sprite/cursors.spr")) #ActionFormat.from_bytes( @@ -22,12 +24,12 @@ func _ready() -> void: #FileAccess.get_file_as_bytes("res://client_data/data/int_land02.gnd") #) #) - var rsw = RSWFormat.from_bytes( - ByteStream.from_bytes( - #FileAccess.get_file_as_bytes("res://client_data/data/int_land02.rsw") - FileAccess.get_file_as_bytes("res://client_data/data/pay_dun00.rsw") - ) - ) + #var rsw = RSWFormat.from_bytes( + #ByteStream.from_bytes( + ##FileAccess.get_file_as_bytes("res://client_data/data/int_land02.rsw") + #FileAccess.get_file_as_bytes("res://client_data/data/pay_dun00.rsw") + #) + #) #RSMFormat.from_bytes( #ByteStream.from_bytes( ##FileAccess.get_file_as_bytes("res://client_data/data/model/prontera/chair_01.rsm") @@ -37,7 +39,7 @@ func _ready() -> void: #) #) - var scene_root := rsw.convert("pay_dun00", "res://client_data") - var scene := PackedScene.new() - scene.pack(scene_root) - ResourceSaver.save(scene, "res://extractor/test/pay_dun00.tscn") + #var scene_root := rsw.convert("pay_dun00", "res://client_data") + #var scene := PackedScene.new() + #scene.pack(scene_root) + #ResourceSaver.save(scene, "res://extractor/test/pay_dun00.tscn") diff --git a/extractor/gnd_format.gd b/extractor/gnd_format.gd index faad9ae..c49bce6 100644 --- a/extractor/gnd_format.gd +++ b/extractor/gnd_format.gd @@ -91,7 +91,7 @@ static func from_bytes(bytes: ByteStream) -> GNDFormat: gnd_format.texture_paths = [] for _n in gnd_format.texture_count: gnd_format.texture_paths.append( - bytes.get_string_from_ascii(gnd_format.texture_path_length) + bytes.get_string_from_ro(gnd_format.texture_path_length) ) gnd_format.light_map_slice_count = bytes.decode_s32() @@ -162,6 +162,10 @@ func convert(data_path: String) -> GridMap: var cubes := get_cubes() + var cache := {} + # TODO: use texture_index and surface uvs as key + # TODO: for deduplication of cell items (as long as other sides aren't accounted for..) + for x in width: for y in height: var cube = cubes[x + y * width] diff --git a/extractor/grf.gd b/extractor/grf.gd index fd0e6f7..5b7046f 100644 --- a/extractor/grf.gd +++ b/extractor/grf.gd @@ -156,7 +156,7 @@ class FileEntry: var file_access: FileAccess -static func open(path: String): +static func open(path: String) -> GRF: var grf = GRF.new() grf.file_access = FileAccess.open(path, FileAccess.ModeFlags.READ) @@ -227,12 +227,17 @@ func convert(destination: String = "res://client_data"): # BMP if file_path.ends_with(".bmp"): + #continue if not FileAccess.file_exists("%s/%s" % [destination, file_path]): continue # load existing bmp files, so language specific overwrites are kept var texture: CompressedTexture2D = load("%s/%s" % [destination, file_path]) + if not texture: + # TODO: check if .godot/imported file is there (alrdy sufficient?) + continue + var texture_image := texture.get_image() texture_image.decompress() var image := BMPTexture.convert_image( @@ -241,18 +246,19 @@ func convert(destination: String = "res://client_data"): ) image.save_png("%s/%s" % [destination, file_path.replace(".bmp", ".png")]) + continue # Sprite.spr and Action.act - var player_head_path_part = "¸Ó¸®Åë" - var player_body_path_part = "¸öÅë" + var player_head_path_part = "머리통" + var player_body_path_part = "몸통" - if file_path.ends_with(".spr") and file_path.contains(player_head_path_part): + if file_path.ends_with(".spr"): #and (file_path.contains(player_head_path_part) or file_path.contains(player_body_path_part)): continue var sprite = SpriteFormat.from_bytes(file_entry.get_contents(file_access)) sprite.save_to_file(base_file_directory_path) - elif file_path.ends_with(".act") and file_path.contains(player_head_path_part): #or file_path.contains(player_body_path_part): + elif file_path.ends_with(".act") and file_path.contains("cursors"): #and (file_path.contains(player_head_path_part) or file_path.contains(player_body_path_part)): #continue if not FileAccess.file_exists("%s/000.png.import" % base_file_directory_path): continue @@ -267,6 +273,7 @@ func convert(destination: String = "res://client_data"): ResourceSaver.save(scene, "%s/actions.tscn" % base_file_directory_path) + continue # Map.rsw and .gnd and .gat if file_path.ends_with(".rsw") and (file_path.contains("pay_dun") or file_path.contains("iz_int") or file_path.contains("int_land")): @@ -279,5 +286,9 @@ func convert(destination: String = "res://client_data"): static func decode_string(bytes: PackedByteArray): - # TODO: use iconv to decode EUC-KR - return bytes.get_string_from_ascii() + Engine.print_error_messages = false + var string := bytes.get_string_from_multibyte_char("EUC-KR") + Engine.print_error_messages = true + if string.is_empty(): + return bytes.get_string_from_ascii() + return string diff --git a/extractor/rsm_format.gd b/extractor/rsm_format.gd index c01826e..7f16368 100644 --- a/extractor/rsm_format.gd +++ b/extractor/rsm_format.gd @@ -92,17 +92,17 @@ static func from_bytes(bytes: ByteStream) -> RSMFormat: rsm_format.texture_names = [] as Array[String] for _n in rsm_format.texture_count: - rsm_format.texture_names.append(bytes.get_string_from_ascii(40)) + rsm_format.texture_names.append(bytes.get_string_from_ro(40)) if version.lower_than(2, 2): - rsm_format.root_node_name = bytes.get_string_from_ascii(40) + rsm_format.root_node_name = bytes.get_string_from_ro(40) if version.higher_than(2, 1): # >= 2.2 rsm_format.root_node_count = bytes.decode_u32() rsm_format.root_node_names = [] as Array[String] for _n in rsm_format.root_node_count: - rsm_format.root_node_names.append(bytes.get_string_from_ascii(40)) + rsm_format.root_node_names.append(bytes.get_string_from_ro(40)) rsm_format.node_count = bytes.decode_u32() rsm_format.nodes = [] as Array[ModelNode] @@ -253,7 +253,7 @@ class ModelNode: var node = ModelNode.new() node.node_name = bytes.get_string_from_utf8(40) - node.parent_node_name = bytes.get_string_from_ascii(40) + node.parent_node_name = bytes.get_string_from_ro(40) if version.lower_than(2, 3): # < 2.3 node.texture_count = bytes.decode_u32() @@ -267,7 +267,7 @@ class ModelNode: node.texture_names = [] as Array[String] for _n in node.texture_name_count: - node.texture_names.append(bytes.get_string_from_ascii(40)) + node.texture_names.append(bytes.get_string_from_ro(40)) node.offset_matrix = [] as Array[Vector3] for _in in 3: @@ -362,7 +362,7 @@ class ModelNode: node.translate(translation_2) if rotation_axis != Vector3.ZERO: - node.rotation = rotation_axis * rotation_angle + node.rotation = (rotation_axis * rotation_angle) * Vector3(1,-1,1) node.scale = scale diff --git a/extractor/rsw_format.gd b/extractor/rsw_format.gd index 85d873c..7e70850 100644 --- a/extractor/rsw_format.gd +++ b/extractor/rsw_format.gd @@ -122,12 +122,14 @@ func convert(name: String, data_path: String) -> Node3D: if not FileAccess.file_exists(model_file_path): continue - var rsm := RSMFormat.from_bytes(ByteStream.from_bytes(FileAccess.get_file_as_bytes(model_file_path))) + var rsm := RSMFormat.from_bytes(ByteStream.from_bytes( + FileAccess.get_file_as_bytes(model_file_path) + )) var model_root := Node3D.new() model_root.name = resource.name model_root.position = resource.get_position() * Vector3(-1, 1, 1) - model_root.rotation_degrees = resource.get_rotation() + model_root.rotation_degrees = resource.get_rotation() * Vector3(-1,1,-1) model_root.scale = resource.get_scale() node.add_child(model_root) @@ -397,11 +399,11 @@ class Animated3DModel extends MapResource: static func from_bytes(bytes: ByteStream) -> Animated3DModel: var resource = Animated3DModel.new() - resource.name = bytes.get_string_from_ascii(40) + resource.name = bytes.get_string_from_ro(40) resource.animation_type = bytes.decode_u32() resource.animation_speed_percent = bytes.decode_float() resource.collision_flags = bytes.decode_u32() - resource.model_file = bytes.get_string_from_ascii(80) + resource.model_file = bytes.get_string_from_ro(80) resource.root_node_name = bytes.get_string_from_utf8(80) resource.position_x = bytes.decode_float() resource.position_y = bytes.decode_float() @@ -462,7 +464,7 @@ class DynamicLightSource extends MapResource: static func from_bytes(bytes: ByteStream) -> DynamicLightSource: var resource = DynamicLightSource.new() - resource.name = bytes.get_string_from_ascii(80) + resource.name = bytes.get_string_from_ro(80) resource.position_x = bytes.decode_float() resource.position_y = bytes.decode_float() resource.position_z = bytes.decode_float() @@ -528,8 +530,8 @@ class SpatialAudioSource extends MapResource: static func from_bytes(bytes: ByteStream) -> SpatialAudioSource: var resource = SpatialAudioSource.new() - resource.name = bytes.get_string_from_ascii(80) - resource.audio_file = bytes.get_string_from_ascii(80) + resource.name = bytes.get_string_from_ro(80) + resource.audio_file = bytes.get_string_from_ro(80) resource.position_x = bytes.decode_float() resource.position_y = bytes.decode_float() resource.position_z = bytes.decode_float() @@ -593,7 +595,7 @@ class ParticleEffectEmitter extends MapResource: static func from_bytes(bytes: ByteStream) -> ParticleEffectEmitter: var resource = ParticleEffectEmitter.new() - resource.name = bytes.get_string_from_ascii(80) + resource.name = bytes.get_string_from_ro(80) resource.position_x = bytes.decode_float() resource.position_y = bytes.decode_float() resource.position_z = bytes.decode_float() |