summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwl <isaclien9752@gmail.com>2025-09-29 12:54:17 -0400
committerOwl <isaclien9752@gmail.com>2025-09-29 12:54:17 -0400
commit3ee4e9d9f74ae99cb17ca45a511b66dcd755d1b9 (patch)
treef9c3abfa3897097fa42adc5a3163608d76b04496
parent70e647076418d114111aa76b5d3639a5b4271e94 (diff)
downloadblenxy-3ee4e9d9f74ae99cb17ca45a511b66dcd755d1b9.tar.gz
blenxy-3ee4e9d9f74ae99cb17ca45a511b66dcd755d1b9.zip
some small bcsv thingsHEADmaster
-rw-r--r--bcsv_editing.py2
-rw-r--r--bcsv_funcs.py27
-rw-r--r--bcsv_hashes.txt27
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