You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
4.0 KiB
108 lines
4.0 KiB
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄ |
|
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪ |
|
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄ |
|
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌ |
|
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪ |
|
# Magicbane Emulator Project © 2013 - 2022 |
|
# www.magicbane.com |
|
|
|
from collections import OrderedDict |
|
|
|
from arcane.enums.arc_sparse import * |
|
from arcane.util import ResStream |
|
|
|
|
|
class SparseData: |
|
def __init__(self) -> None: |
|
self.sp_data = OrderedDict() |
|
|
|
def load_binary(self, stream: ResStream): |
|
sparse_tag = stream.read_dword() |
|
while sparse_tag: |
|
sparse_type = SPARSE_TAG_TO_SPARSE_TYPE[sparse_tag] |
|
value = None |
|
|
|
if sparse_type == SPARSE_VAL_LONG: |
|
value = stream.read_dword() |
|
|
|
elif sparse_type == SPARSE_VAL_FLOAT: |
|
value = stream.read_float() |
|
|
|
elif sparse_type == SPARSE_VAL_BOOL: |
|
value = stream.read_bool() |
|
|
|
elif sparse_type == SPARSE_UID: |
|
value = stream.read_dword() |
|
|
|
elif sparse_type == SPARSE_REF_VECTOR3: |
|
value = stream.read_tuple() |
|
|
|
elif sparse_type == SPARSE_REF_ARC_STRING: |
|
value = stream.read_string() |
|
|
|
elif sparse_type == SPARSE_REF_MERCHANT_DATA: |
|
value = [ |
|
stream.read_qword(), |
|
stream.read_qword(), |
|
stream.read_dword(), |
|
] |
|
|
|
elif sparse_type == SPARSE_REF_ARC_CACHE_ID: |
|
value = stream.read_qword() |
|
|
|
elif sparse_type == SPARSE_PTR_ACTION_RESPONSE: |
|
value = stream.read_dword() |
|
|
|
elif sparse_type == SPARSE_ENUM_ITEM_TYPE: |
|
value = stream.read_dword() |
|
|
|
self.sp_data[sparse_tag] = value |
|
sparse_tag = stream.read_dword() |
|
|
|
def save_binary(self, stream: ResStream): |
|
for tag, value in self.sp_data.items(): |
|
stream.write_dword(tag) |
|
|
|
sparse_type = SPARSE_TAG_TO_SPARSE_TYPE[tag] |
|
if sparse_type == SPARSE_VAL_LONG: |
|
stream.write_dword(value) |
|
|
|
elif sparse_type == SPARSE_VAL_FLOAT: |
|
stream.write_float(value) |
|
|
|
elif sparse_type == SPARSE_VAL_BOOL: |
|
stream.write_bool(value) |
|
|
|
elif sparse_type == SPARSE_UID: |
|
stream.write_dword(value) |
|
|
|
elif sparse_type == SPARSE_REF_VECTOR3: |
|
stream.write_tuple(value) |
|
|
|
elif sparse_type == SPARSE_REF_ARC_STRING: |
|
stream.write_string(value) |
|
|
|
elif sparse_type == SPARSE_REF_MERCHANT_DATA: |
|
stream.write_qword(value[0]) |
|
stream.write_qword(value[1]) |
|
stream.write_qword(value[2]) |
|
|
|
elif sparse_type == SPARSE_REF_ARC_CACHE_ID: |
|
stream.write_qword(value) |
|
|
|
elif sparse_type == SPARSE_PTR_ACTION_RESPONSE: |
|
stream.write_dword(value) |
|
|
|
elif sparse_type == SPARSE_ENUM_ITEM_TYPE: |
|
stream.write_dword(value) |
|
stream.write_dword(0) |
|
|
|
def load_json(self, data): |
|
for key, value in data.items(): |
|
self.sp_data[STRING_TO_SPARSE_TAG[key]] = value |
|
|
|
def save_json(self): |
|
data = OrderedDict() |
|
for tag, value in self.sp_data.items(): |
|
data[SPARSE_TAG_TO_STRING[tag]] = value |
|
return data
|
|
|