mbEditorPro2.0 release

This commit is contained in:
2022-12-25 08:47:00 -05:00
parent 30375c8413
commit 942b33a252
110 changed files with 3543 additions and 1089 deletions
@@ -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