From 3ee4e9d9f74ae99cb17ca45a511b66dcd755d1b9 Mon Sep 17 00:00:00 2001 From: Owl Date: Mon, 29 Sep 2025 12:54:17 -0400 Subject: some small bcsv things --- bcsv_editing.py | 2 +- bcsv_funcs.py | 27 ++++++++++++++------------- bcsv_hashes.txt | 27 +++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/bcsv_editing.py b/bcsv_editing.py index 8aad5e8..91ecad5 100644 --- a/bcsv_editing.py +++ b/bcsv_editing.py @@ -775,7 +775,7 @@ class DATA_OT_smg_bcsv_table_import(bpy.types.Operator, bpy_extras.io_utils.Impo # try importing the BCSV table result = bcsv_funcs.read_bcsv_file(self.properties.filepath, self.endian_mode) # check how the reading went - if (type(result) == str): + if (type(result) == None): blender_funcs.disp_msg(result) return {"FINISHED"} diff --git a/bcsv_funcs.py b/bcsv_funcs.py index 26686e0..796d97c 100644 --- a/bcsv_funcs.py +++ b/bcsv_funcs.py @@ -322,15 +322,12 @@ def read_bcsv_file(filepath_or_stream, endian): value_offset = base_offset + (j * bcsv_raw_info.header.row_data_length) # grab the specific datatype value = None - # crazy this but I will do the bitmask and right shift even with a float - # treat integer variables as signed, it is actually a bit more readable - if (data_type == "LONG" or data_type == "LONG_2" or data_type == "STRING_OFFSET" or data_type == "FLOAT"): + # bitmask/bitshift wont be done on STRING/STRING_OFFSET/FLOAT types (it would be weird) + # treat integer variables as signed. It is actually a bit more readable + if (data_type in ["LONG", "LONG_2"]): value = struct.unpack(endian_ch + "I", bcsv_raw_info.data_pool[value_offset : value_offset + 4])[0] value = (value & bcsv_table_info.cols_info[i].bitmask) >> bcsv_table_info.cols_info[i].rshift - if (data_type == "LONG" or data_type == "LONG_2"): - value = struct.unpack(">i", struct.pack(">I", value))[0] - elif (data_type == "STRING"): - value = bcsv_raw_info.data_pool[value_offset : value_offset + 32].decode("cp932").replace("\0", "") + value = struct.unpack(">i", struct.pack(">I", value))[0] elif (data_type == "SHORT"): value = struct.unpack(endian_ch + "H", bcsv_raw_info.data_pool[value_offset : value_offset + 2])[0] value = (value & bcsv_table_info.cols_info[i].bitmask) >> bcsv_table_info.cols_info[i].rshift @@ -339,11 +336,15 @@ def read_bcsv_file(filepath_or_stream, endian): value = struct.unpack(endian_ch + "B", bcsv_raw_info.data_pool[value_offset : value_offset + 1])[0] value = (value & bcsv_table_info.cols_info[i].bitmask) >> bcsv_table_info.cols_info[i].rshift value = struct.unpack(">b", struct.pack(">B", value))[0] - - # check if the data type was a string offset or a float - if (data_type == "FLOAT"): - value = struct.unpack(">f", struct.pack(">I", value))[0] + elif (data_type == "FLOAT"): + value = struct.unpack(endian_ch + "f", bcsv_raw_info.data_pool[value_offset : value_offset + 4])[0] elif (data_type == "STRING_OFFSET"): + value = struct.unpack(endian_ch + "I", bcsv_raw_info.data_pool[value_offset : value_offset + 4])[0] + elif (data_type == "STRING"): + value = bcsv_raw_info.data_pool[value_offset : value_offset + 32].decode("cp932").replace("\0", "") + + # check if the data type was a string offset + if (data_type == "STRING_OFFSET"): string_offset = value string_length = 0 while (bcsv_raw_info.string_pool[string_offset + string_length] != 0): @@ -704,14 +705,14 @@ def create_smg_bcsv_raw(table, endian_ch, use_std_pad_size): # only for integers type_ch = None # LONG or LONG_2 - if (raw.columns_info[j].data_type == 0 or raw.columns_info[j].data_type == 3): type_ch = "I" + if (raw.columns_info[j].data_type in [0, 3]): type_ch = "I" # SHORT elif (raw.columns_info[j].data_type == 4): type_ch = "H" # CHAR elif (raw.columns_info[j].data_type == 5): type_ch = "B" # LONG, LONG_2, SHORT or CHAR - if (type_ch == "I" or type_ch == "H" or type_ch == "B"): + if (type_ch in ["I", "H", "B"]): # ~ print((table.rows_data[i][j] << raw.columns_info[j].data_rshift) & raw.columns_info[j].data_bitmask) tmp = struct.pack(endian_ch + type_ch, (table.rows_data[i][j] << raw.columns_info[j].data_rshift) & raw.columns_info[j].data_bitmask) diff --git a/bcsv_hashes.txt b/bcsv_hashes.txt index 56926e4..e1d1d87 100644 --- a/bcsv_hashes.txt +++ b/bcsv_hashes.txt @@ -21,6 +21,8 @@ ForceLowScenarioName6 0x2253AB52 ForceLowScenarioName7 0x2253AB53 GroupId 0x74B5F3DA IndirectFlag 0x393DE9FA +IsHidden 0xE375F394 +JointName 0x5B158215 LowFlag 0x7871E4C0 MapParts_ID 0x81497C36 MessageId 0x219D4362 @@ -35,6 +37,9 @@ Obj_arg6 0x08E9C308 Obj_arg7 0x08E9C309 ParentID 0x49E5F365 PlanetName 0xADF2B063 +RotateX 0xB5B9663D +RotateY 0xB5B9663E +RotateZ 0xB5B9663F SW_A 0x00270D26 SW_APPEAR 0x749DFBD0 SW_B 0x00270D27 @@ -42,11 +47,24 @@ SW_DEAD 0xC075815F SW_SLEEP 0x4F11491C ShapeModelNo 0x1176D409 Sound_code 0x6260CB3D +TransX 0x95CB4ED0 +TransY 0x95CB4ED1 +TransZ 0x95CB4ED2 ViewGroupId 0x74550D75 Wall_code 0xCE698322 WaterFlag 0x6AA7F503 ZoneName 0x3666C077 +angleA 0xABC4A1CE +angleB 0xABC4A1CF +axis.X 0xAC52894B +axis.Y 0xAC52894C +axis.Z 0xAC52894D +brother 0x08FDA4C0 camera_id 0xEB9DA075 +camint 0xAE79D1C0 +camtype 0x20C58F89 +child 0x05A3F51C +comment 0x38A5EE5F default 0x5C13D641 dir_x 0x05B2A146 dir_y 0x05B2A147 @@ -54,18 +72,27 @@ dir_z 0x05B2A148 dx 0x00000C94 dy 0x00000C95 dz 0x00000C96 +fovy 0x00300D4C +id 0x00000D1B l_id 0x003289CE mass 0x003306F4 name 0x00337A8B +parent 0xC4AB08AA pos_x 0x065E794D pos_y 0x065E794E pos_z 0x065E794F priority 0xBA8879A4 radius 0xC80E6C92 range 0x0674393D +rx 0x00000E46 +ry 0x00000E47 +rz 0x00000E48 scale_x 0x71E5EAC3 scale_y 0x71E5EAC4 scale_z 0x71E5EAC5 +sx 0x00000E65 +sy 0x00000E66 +sz 0x00000E67 tx 0x00000E84 ty 0x00000E85 type 0x00368F3A -- cgit v1.2.3-70-g09d2