mbEditorPro2.0 release
This commit is contained in:
@@ -0,0 +1,260 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# Magicbane Emulator Project © 2013 - 2022
|
||||
# www.magicbane.com
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from arcane.enums.hashes import hash_to_string, string_to_hash
|
||||
from arcane.util import ResStream
|
||||
|
||||
|
||||
class AttributeValue:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.attr_type = stream.read_dword()
|
||||
self.attr_value = stream.read_dword()
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.attr_type)
|
||||
stream.write_dword(self.attr_value)
|
||||
|
||||
def load_json(self, data):
|
||||
self.attr_type = string_to_hash(data['attr_type'])
|
||||
self.attr_value = data['attr_value']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['attr_type'] = hash_to_string(self.attr_type)
|
||||
data['attr_value'] = self.attr_value
|
||||
return data
|
||||
|
||||
|
||||
class PowerArgument:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.power_arguments = [
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.power_arguments[0])
|
||||
stream.write_dword(self.power_arguments[1])
|
||||
|
||||
def load_json(self, data):
|
||||
self.power_arguments = data['power_arguments']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['power_arguments'] = self.power_arguments
|
||||
return data
|
||||
|
||||
|
||||
class SkillLevel:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.skill_type = stream.read_dword()
|
||||
self.skill_level = stream.read_dword()
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.skill_type)
|
||||
stream.write_dword(self.skill_level)
|
||||
|
||||
def load_json(self, data):
|
||||
self.skill_type = string_to_hash(data['skill_type'])
|
||||
self.skill_level = data['skill_level']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['skill_type'] = hash_to_string(self.skill_type)
|
||||
data['skill_level'] = self.skill_level
|
||||
return data
|
||||
|
||||
|
||||
class ResourceInfo:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.resource_type = stream.read_dword()
|
||||
self.resource_value = stream.read_dword()
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.resource_type)
|
||||
stream.write_dword(self.resource_value)
|
||||
|
||||
def load_json(self, data):
|
||||
self.resource_type = string_to_hash(data['resource_type'])
|
||||
self.resource_value = data['resource_value']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['resource_type'] = hash_to_string(self.resource_type)
|
||||
data['resource_value'] = self.resource_value
|
||||
return data
|
||||
|
||||
|
||||
class PowerAction:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.power_type = stream.read_dword()
|
||||
|
||||
num_grants = stream.read_dword()
|
||||
self.power_actions = [PowerArgument() for _ in range(num_grants)]
|
||||
for power in self.power_actions:
|
||||
power.load_binary(stream)
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.power_type)
|
||||
stream.write_dword(len(self.power_actions))
|
||||
for power in self.power_actions:
|
||||
power.save_binary(stream)
|
||||
|
||||
def load_json(self, data):
|
||||
self.power_type = string_to_hash(data['power_type'])
|
||||
self.power_actions = []
|
||||
for power_data in data['power_actions']:
|
||||
power = PowerArgument()
|
||||
power.load_json(power_data)
|
||||
self.power_actions.append(power)
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['power_type'] = hash_to_string(self.power_type)
|
||||
data['power_actions'] = []
|
||||
for power in self.power_actions:
|
||||
data['power_actions'].append(power.save_json())
|
||||
return data
|
||||
|
||||
|
||||
class PowerGrant:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.power_type = stream.read_dword()
|
||||
self.power_value = stream.read_dword()
|
||||
num_attrs = stream.read_dword()
|
||||
self.power_granted_attrs = [
|
||||
[
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
] for _ in range(num_attrs)
|
||||
]
|
||||
num_skills = stream.read_dword()
|
||||
self.power_granted_skills = [
|
||||
[
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
] for _ in range(num_skills)
|
||||
]
|
||||
num_powers = stream.read_dword()
|
||||
self.power_granted_powers = [
|
||||
[
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
] for _ in range(num_powers)
|
||||
]
|
||||
num_monster_types = stream.read_dword()
|
||||
self.power_monster_types = [
|
||||
stream.read_dword() for _ in range(num_monster_types)
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.power_type)
|
||||
stream.write_dword(self.power_value)
|
||||
stream.write_dword(len(self.power_granted_attrs))
|
||||
for attr in self.power_granted_attrs:
|
||||
stream.write_dword(attr[0])
|
||||
stream.write_dword(attr[1])
|
||||
stream.write_dword(len(self.power_granted_skills))
|
||||
for skill in self.power_granted_skills:
|
||||
stream.write_dword(skill[0])
|
||||
stream.write_dword(skill[1])
|
||||
stream.write_dword(len(self.power_granted_powers))
|
||||
for power in self.power_granted_powers:
|
||||
stream.write_dword(power[0])
|
||||
stream.write_dword(power[1])
|
||||
stream.write_dword(len(self.power_monster_types))
|
||||
for value in self.power_monster_types:
|
||||
stream.write_dword(value)
|
||||
|
||||
def load_json(self, data):
|
||||
self.power_type = string_to_hash(data['power_type'])
|
||||
self.power_value = data['power_value']
|
||||
self.power_granted_attrs = data['power_granted_attrs']
|
||||
self.power_granted_skills = data['power_granted_skills']
|
||||
self.power_granted_powers = data['power_granted_powers']
|
||||
self.power_monster_types = data['power_monster_types']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['power_type'] = hash_to_string(self.power_type)
|
||||
data['power_value'] = self.power_value
|
||||
data['power_granted_attrs'] = self.power_granted_attrs
|
||||
data['power_granted_skills'] = self.power_granted_skills
|
||||
data['power_granted_powers'] = self.power_granted_powers
|
||||
data['power_monster_types'] = self.power_monster_types
|
||||
return data
|
||||
|
||||
|
||||
class SkillGrant:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.skill_type = stream.read_dword()
|
||||
self.skill_value = stream.read_dword()
|
||||
num_attrs = stream.read_dword()
|
||||
self.skill_granted_attrs = [
|
||||
[
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
] for _ in range(num_attrs)
|
||||
]
|
||||
num_skills = stream.read_dword()
|
||||
self.skill_granted_skills = [
|
||||
[
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
] for _ in range(num_skills)
|
||||
]
|
||||
num_powers = stream.read_dword()
|
||||
self.skill_granted_powers = [
|
||||
[
|
||||
stream.read_dword(),
|
||||
stream.read_dword(),
|
||||
] for _ in range(num_powers)
|
||||
]
|
||||
num_monster_types = stream.read_dword()
|
||||
self.skill_monster_types = [
|
||||
stream.read_dword() for _ in range(num_monster_types)
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.skill_type)
|
||||
stream.write_dword(self.skill_value)
|
||||
stream.write_dword(len(self.skill_granted_attrs))
|
||||
for attr in self.skill_granted_attrs:
|
||||
stream.write_dword(attr[0])
|
||||
stream.write_dword(attr[1])
|
||||
stream.write_dword(len(self.skill_granted_skills))
|
||||
for skill in self.skill_granted_skills:
|
||||
stream.write_dword(skill[0])
|
||||
stream.write_dword(skill[1])
|
||||
stream.write_dword(len(self.skill_granted_powers))
|
||||
for power in self.skill_granted_powers:
|
||||
stream.write_dword(power[0])
|
||||
stream.write_dword(power[1])
|
||||
stream.write_dword(len(self.skill_monster_types))
|
||||
for value in self.skill_monster_types:
|
||||
stream.write_dword(value)
|
||||
|
||||
def load_json(self, data):
|
||||
self.skill_type = string_to_hash(data['skill_type'])
|
||||
self.skill_value = data['skill_value']
|
||||
self.skill_granted_attrs = data['skill_granted_attrs']
|
||||
self.skill_granted_skills = data['skill_granted_skills']
|
||||
self.skill_granted_powers = data['skill_granted_powers']
|
||||
self.skill_monster_types = data['skill_monster_types']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['skill_type'] = hash_to_string(self.skill_type)
|
||||
data['skill_value'] = self.skill_value
|
||||
data['skill_granted_attrs'] = self.skill_granted_attrs
|
||||
data['skill_granted_skills'] = self.skill_granted_skills
|
||||
data['skill_granted_powers'] = self.skill_granted_powers
|
||||
data['skill_monster_types'] = self.skill_monster_types
|
||||
return data
|
||||
@@ -0,0 +1,42 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# Magicbane Emulator Project © 2013 - 2022
|
||||
# www.magicbane.com
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from arcane.enums.hashes import hash_to_string, string_to_hash
|
||||
from arcane.util import ResStream
|
||||
|
||||
|
||||
class ClassRequired:
|
||||
def load_binary(self, stream: ResStream):
|
||||
classs = stream.read_dword()
|
||||
self.class_restrict = stream.read_bool()
|
||||
self.class_values = [
|
||||
stream.read_dword() for _ in range(classs)
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(len(self.class_values))
|
||||
stream.write_bool(self.class_restrict)
|
||||
for cls in self.class_values:
|
||||
stream.write_dword(cls)
|
||||
|
||||
def load_json(self, data):
|
||||
self.class_restrict = data['restrict']
|
||||
self.class_values = []
|
||||
for cls in data['classes']:
|
||||
self.class_values.append(string_to_hash(cls))
|
||||
return data
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['restrict'] = self.class_restrict
|
||||
data['classes'] = []
|
||||
for cls in self.class_values:
|
||||
data['classes'].append(hash_to_string(cls))
|
||||
return data
|
||||
@@ -0,0 +1,41 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# Magicbane Emulator Project © 2013 - 2022
|
||||
# www.magicbane.com
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from arcane.enums.hashes import hash_to_string, string_to_hash
|
||||
from arcane.util import ResStream
|
||||
|
||||
|
||||
class DiscRequired:
|
||||
def load_binary(self, stream: ResStream):
|
||||
discs = stream.read_dword()
|
||||
self.disc_restrict = stream.read_bool()
|
||||
self.disc_values = [
|
||||
stream.read_dword() for _ in range(discs)
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(len(self.disc_values))
|
||||
stream.write_bool(self.disc_restrict)
|
||||
for disc in self.disc_values:
|
||||
stream.write_dword(disc)
|
||||
|
||||
def load_json(self, data):
|
||||
self.disc_restrict = data['restrict']
|
||||
self.disc_values = []
|
||||
for disc in data['discs']:
|
||||
self.disc_values.append(string_to_hash(disc))
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['restrict'] = self.disc_restrict
|
||||
data['discs'] = []
|
||||
for disc in self.disc_values:
|
||||
data['discs'].append(hash_to_string(disc))
|
||||
return data
|
||||
@@ -0,0 +1,67 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# Magicbane Emulator Project © 2013 - 2022
|
||||
# www.magicbane.com
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from arcane.enums.common.arc_inventory import *
|
||||
from arcane.util import ResStream
|
||||
|
||||
|
||||
class Inventory:
|
||||
def load_binary(self, stream: ResStream):
|
||||
self.inventory_type = stream.read_dword()
|
||||
|
||||
if self.inventory_type == INVENTORY_TYPE_GOLD:
|
||||
self.inventory_gold = [
|
||||
stream.read_float(),
|
||||
stream.read_float(),
|
||||
stream.read_float(),
|
||||
]
|
||||
elif self.inventory_type == INVENTORY_TYPE_ITEM:
|
||||
self.inventory_items = [
|
||||
stream.read_float(),
|
||||
stream.read_qword(),
|
||||
]
|
||||
elif self.inventory_type == INVENTORY_TYPE_BOOTYTABLE:
|
||||
self.inventory_table = [
|
||||
stream.read_float(),
|
||||
stream.read_dword(),
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(self.inventory_type)
|
||||
if self.inventory_type == INVENTORY_TYPE_GOLD:
|
||||
stream.write_float(self.inventory_gold[0])
|
||||
stream.write_float(self.inventory_gold[1])
|
||||
stream.write_float(self.inventory_gold[2])
|
||||
elif self.inventory_type == INVENTORY_TYPE_ITEM:
|
||||
stream.write_float(self.inventory_items[0])
|
||||
stream.write_qword(self.inventory_items[1])
|
||||
elif self.inventory_type == INVENTORY_TYPE_BOOTYTABLE:
|
||||
stream.write_float(self.inventory_table[0])
|
||||
stream.write_dword(self.inventory_table[1])
|
||||
|
||||
def load_json(self, data):
|
||||
self.inventory_type = STRING_TO_INVENTORY_TYPE[data['type']]
|
||||
if self.inventory_type == INVENTORY_TYPE_GOLD:
|
||||
self.inventory_gold = data['gold']
|
||||
elif self.inventory_type == INVENTORY_TYPE_ITEM:
|
||||
self.inventory_items = data['items']
|
||||
elif self.inventory_type == INVENTORY_TYPE_BOOTYTABLE:
|
||||
self.inventory_table = data['table']
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['type'] = INVENTORY_TYPE_TO_STRING[self.inventory_type]
|
||||
if self.inventory_type == INVENTORY_TYPE_GOLD:
|
||||
data['gold'] = self.inventory_gold
|
||||
elif self.inventory_type == INVENTORY_TYPE_ITEM:
|
||||
data['items'] = self.inventory_items
|
||||
elif self.inventory_type == INVENTORY_TYPE_BOOTYTABLE:
|
||||
data['table'] = self.inventory_table
|
||||
return data
|
||||
@@ -0,0 +1,41 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# Magicbane Emulator Project © 2013 - 2022
|
||||
# www.magicbane.com
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from arcane.enums.hashes import hash_to_string, string_to_hash
|
||||
from arcane.util import ResStream
|
||||
|
||||
|
||||
class RaceRequired:
|
||||
def load_binary(self, stream: ResStream):
|
||||
races = stream.read_dword()
|
||||
self.race_restrict = stream.read_bool()
|
||||
self.race_values = [
|
||||
stream.read_dword() for _ in range(races)
|
||||
]
|
||||
|
||||
def save_binary(self, stream: ResStream):
|
||||
stream.write_dword(len(self.race_values))
|
||||
stream.write_bool(self.race_restrict)
|
||||
for race in self.race_values:
|
||||
stream.write_dword(race)
|
||||
|
||||
def load_json(self, data):
|
||||
self.race_restrict = data['restrict']
|
||||
self.race_values = []
|
||||
for race in data['races']:
|
||||
self.race_values.append(string_to_hash(race))
|
||||
|
||||
def save_json(self):
|
||||
data = OrderedDict()
|
||||
data['restrict'] = self.race_restrict
|
||||
data['races'] = []
|
||||
for race in self.race_values:
|
||||
data['races'].append(hash_to_string(race))
|
||||
return data
|
||||
@@ -0,0 +1,108 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# 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
|
||||
@@ -0,0 +1,7 @@
|
||||
# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
|
||||
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
|
||||
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
|
||||
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
|
||||
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
|
||||
# Magicbane Emulator Project © 2013 - 2022
|
||||
# www.magicbane.com
|
||||
Reference in New Issue
Block a user