Repository for mbEditorPro 2.0
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.

273 lines
10 KiB

# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
# Magicbane Emulator Project © 2013 - 2022
# www.magicbane.com
import copy
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']
grants_copy = data['power_granted_skills']
for subarr in grants_copy:
subarr[0] = string_to_hash(subarr[0])
self.power_granted_skills = grants_copy
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
grants_copy = copy.deepcopy(self.power_granted_skills)
for subarr in grants_copy:
subarr[0] = hash_to_string(subarr[0])
data['power_granted_skills'] = grants_copy
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']
grants_copy = data['skill_granted_skills']
for subarr in grants_copy:
subarr[0] = string_to_hash(subarr[0])
self.skill_granted_skills = grants_copy
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
grants_copy = copy.deepcopy(self.skill_granted_skills)
for subarr in grants_copy:
subarr[0] = hash_to_string(subarr[0])
data['skill_granted_skills'] = grants_copy
data['skill_granted_powers'] = self.skill_granted_powers
data['skill_monster_types'] = self.skill_monster_types
return data