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.

386 lines
19 KiB

# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
# Magicbane Emulator Project © 2013 - 2022
# www.magicbane.com
from collections import OrderedDict
from arcane.util import ResStream
class RankInfo:
def load_binary(self, stream: ResStream):
self.rank_hirelings = stream.read_dword()
self.rank_shrines = stream.read_dword()
self.rank_spires = stream.read_dword()
self.rank_barracks = stream.read_dword()
self.rank_rank = stream.read_dword()
self.rank_health = stream.read_dword()
self.rank_automatic = stream.read_bool()
self.rank_energy_k1 = stream.read_float()
self.rank_energy_k2 = stream.read_float()
self.rank_level_val = stream.read_float()
num_builiding_ids = stream.read_dword()
self.rank_building_id = [
[
stream.read_dword(),
stream.read_qword(),
] for _ in range(num_builiding_ids)
]
self.rank_formula = stream.read_dword()
num_placement_limits = stream.read_dword()
self.rank_placement_limit = [
[
stream.read_dword(),
stream.read_dword(),
] for _ in range(num_placement_limits)
]
def save_binary(self, stream: ResStream):
stream.write_dword(self.rank_hirelings)
stream.write_dword(self.rank_shrines)
stream.write_dword(self.rank_spires)
stream.write_dword(self.rank_barracks)
stream.write_dword(self.rank_rank)
stream.write_dword(self.rank_health)
stream.write_bool(self.rank_automatic)
stream.write_float(self.rank_energy_k1)
stream.write_float(self.rank_energy_k2)
stream.write_float(self.rank_level_val)
stream.write_dword(len(self.rank_building_id))
for building in self.rank_building_id:
stream.write_dword(building[0])
stream.write_qword(building[1])
stream.write_dword(self.rank_formula)
stream.write_dword(len(self.rank_placement_limit))
for placement in self.rank_placement_limit:
stream.write_dword(placement[0])
stream.write_dword(placement[1])
def load_json(self, data):
self.rank_hirelings = data['rank_hirelings']
self.rank_shrines = data['rank_shrines']
self.rank_spires = data['rank_spires']
self.rank_barracks = data['rank_barracks']
self.rank_rank = data['rank_rank']
self.rank_health = data['rank_health']
self.rank_automatic = data['rank_automatic']
self.rank_energy_k1 = data['rank_energy_k1']
self.rank_energy_k2 = data['rank_energy_k2']
self.rank_level_val = data['rank_level_val']
self.rank_building_id = data['rank_building_id']
self.rank_formula = data['rank_formula']
self.rank_placement_limit = data['rank_placement_limit']
def save_json(self):
data = OrderedDict()
data['rank_hirelings'] = self.rank_hirelings
data['rank_shrines'] = self.rank_shrines
data['rank_spires'] = self.rank_spires
data['rank_barracks'] = self.rank_barracks
data['rank_rank'] = self.rank_rank
data['rank_health'] = self.rank_health
data['rank_automatic'] = self.rank_automatic
data['rank_energy_k1'] = self.rank_energy_k1
data['rank_energy_k2'] = self.rank_energy_k2
data['rank_level_val'] = self.rank_level_val
data['rank_building_id'] = self.rank_building_id
data['rank_formula'] = self.rank_formula
data['rank_placement_limit'] = self.rank_placement_limit
return data
class ArcCityAssetTemplate():
def load_binary(self, stream: ResStream):
self.template_max_ranks = stream.read_dword()
self.template_start_rank = stream.read_dword()
self.template_asset_type = stream.read_dword()
self.template_trade_icon = stream.read_dword()
self.template_landmark = stream.read_dword()
self.template_is_maintenance = stream.read_bool()
self.template_has_keys = stream.read_bool()
self.template_use_hardpoints = stream.read_bool()
self.template_is_fort_asset = stream.read_bool()
self.template_is_building_of_war = stream.read_bool()
self.template_bow_can_place_on_grid = stream.read_bool()
self.template_requires_nation_tree_slot = stream.read_bool()
self.template_requires_guild_tree_slot = stream.read_bool()
self.template_use_fort_grid = stream.read_bool()
self.template_is_fort_start = stream.read_bool()
self.template_is_cap_asset = stream.read_bool()
self.template_zone_no_build = [
stream.read_float(),
stream.read_float(),
]
self.template_zone_influence = [
stream.read_float(),
stream.read_float(),
]
self.template_eject_loc = stream.read_tuple()
self.template_npc_load = stream.read_tuple()
self.template_fort_grid_offset = stream.read_tuple()
self.template_power_action_id = stream.read_dword()
self.template_zone_flag = stream.read_dword()
self.template_spire_event_rule = stream.read_dword()
self.template_maintenance_set = stream.read_dword()
self.template_damage_set = stream.read_dword()
self.template_energy_set = stream.read_dword()
self.template_use_trigger = stream.read_string()
self.template_unknown_check1 = stream.read_bool()
if self.template_unknown_check1:
pass
self.template_loot_trigger = stream.read_string()
self.template_unknown_check2 = stream.read_bool()
if self.template_unknown_check2:
pass
self.has_embedded_template = stream.read_bool()
if self.has_embedded_template:
self.template_embed_template = ArcCityAssetTemplate()
self.template_embed_template.load_binary(stream)
num_creators = stream.read_dword()
self.template_creator = [
stream.read_dword() for _ in range(num_creators)
]
num_terrains = stream.read_dword()
self.template_terrain = [
stream.read_dword() for _ in range(num_terrains)
]
num_valid_npc_types = stream.read_dword()
self.template_valid_npc_type = [
stream.read_dword() for _ in range(num_valid_npc_types)
]
num_valid_npc_cat = stream.read_dword()
self.template_valid_npc_cat = [
stream.read_dword() for _ in range(num_valid_npc_cat)
]
num_rank_info = stream.read_dword()
self.template_rank_info = [RankInfo() for _ in range(num_rank_info)]
for rank_info in self.template_rank_info:
rank_info.load_binary(stream)
num_cap_info = stream.read_dword()
self.template_cap_info = [
[
stream.read_dword(),
stream.read_dword(),
stream.read_qword(),
] for _ in range(num_cap_info)
]
num_event_rules = stream.read_dword()
self.template_event_rules = [
[
stream.read_dword(),
stream.read_dword(),
] for _ in range(num_event_rules)
]
num_archs = stream.read_dword()
self.template_architecture = [
stream.read_string() for _ in range(num_archs)
]
self.template_offering_type = stream.read_string()
self.template_placement_type = stream.read_dword()
num_offering_adjusts = stream.read_dword()
self.template_offering_adjustment = [
[
stream.read_dword(),
stream.read_float(),
] for _ in range(num_offering_adjusts)
]
num_resource_limit = stream.read_dword()
self.template_resource_limit = [
[
stream.read_dword(),
stream.read_dword(),
stream.read_dword(),
] for _ in range(num_resource_limit)
]
self.template_unknown = stream.read_dword()
def save_binary(self, stream: ResStream):
stream.write_dword(self.template_max_ranks)
stream.write_dword(self.template_start_rank)
stream.write_dword(self.template_asset_type)
stream.write_dword(self.template_trade_icon)
stream.write_dword(self.template_landmark)
stream.write_bool(self.template_is_maintenance)
stream.write_bool(self.template_has_keys)
stream.write_bool(self.template_use_hardpoints)
stream.write_bool(self.template_is_fort_asset)
stream.write_bool(self.template_is_building_of_war)
stream.write_bool(self.template_bow_can_place_on_grid)
stream.write_bool(self.template_requires_nation_tree_slot)
stream.write_bool(self.template_requires_guild_tree_slot)
stream.write_bool(self.template_use_fort_grid)
stream.write_bool(self.template_is_fort_start)
stream.write_bool(self.template_is_cap_asset)
stream.write_float(self.template_zone_no_build[0])
stream.write_float(self.template_zone_no_build[1])
stream.write_float(self.template_zone_influence[0])
stream.write_float(self.template_zone_influence[1])
stream.write_tuple(self.template_eject_loc)
stream.write_tuple(self.template_npc_load)
stream.write_tuple(self.template_fort_grid_offset)
stream.write_dword(self.template_power_action_id)
stream.write_dword(self.template_zone_flag)
stream.write_dword(self.template_spire_event_rule)
stream.write_dword(self.template_maintenance_set)
stream.write_dword(self.template_damage_set)
stream.write_dword(self.template_energy_set)
stream.write_string(self.template_use_trigger)
stream.write_bool(self.template_unknown_check1)
stream.write_string(self.template_loot_trigger)
stream.write_bool(self.template_unknown_check2)
stream.write_bool(self.has_embedded_template)
if self.has_embedded_template:
self.template_embed_template.save_binary(stream)
stream.write_dword(len(self.template_creator))
for creator in self.template_creator:
stream.write_dword(creator)
stream.write_dword(len(self.template_terrain))
for terrain in self.template_terrain:
stream.write_dword(terrain)
stream.write_dword(len(self.template_valid_npc_type))
for npc_type in self.template_valid_npc_type:
stream.write_dword(npc_type)
stream.write_dword(len(self.template_valid_npc_cat))
for npc_cat in self.template_valid_npc_cat:
stream.write_dword(npc_cat)
stream.write_dword(len(self.template_rank_info))
for rank_info in self.template_rank_info:
rank_info.save_binary(stream)
stream.write_dword(len(self.template_cap_info))
for cap in self.template_cap_info:
stream.write_dword(cap[0])
stream.write_dword(cap[1])
stream.write_qword(cap[2])
stream.write_dword(len(self.template_event_rules))
for event in self.template_event_rules:
stream.write_dword(event[0])
stream.write_dword(event[1])
stream.write_dword(len(self.template_architecture))
for arch in self.template_architecture:
stream.write_string(arch)
stream.write_string(self.template_offering_type)
stream.write_dword(self.template_placement_type)
stream.write_dword(len(self.template_offering_adjustment))
for adjust in self.template_offering_adjustment:
stream.write_dword(adjust[0])
stream.write_float(adjust[1])
stream.write_dword(len(self.template_resource_limit))
for resource in self.template_resource_limit:
stream.write_dword(resource[0])
stream.write_dword(resource[1])
stream.write_dword(resource[2])
stream.write_dword(self.template_unknown)
def load_json(self, data):
self.template_max_ranks = data['template_max_ranks']
self.template_start_rank = data['template_start_rank']
self.template_asset_type = data['template_asset_type']
self.template_trade_icon = data['template_trade_icon']
self.template_landmark = data['template_landmark']
self.template_is_maintenance = data['template_is_maintenance']
self.template_has_keys = data['template_has_keys']
self.template_use_hardpoints = data['template_use_hardpoints']
self.template_is_fort_asset = data['template_is_fort_asset']
self.template_is_building_of_war = data['template_is_building_of_war']
self.template_bow_can_place_on_grid = data['template_bow_can_place_on_grid']
self.template_requires_nation_tree_slot = data['template_requires_nation_tree_slot']
self.template_requires_guild_tree_slot = data['template_requires_guild_tree_slot']
self.template_use_fort_grid = data['template_use_fort_grid']
self.template_is_fort_start = data['template_is_fort_start']
self.template_is_cap_asset = data['template_is_cap_asset']
self.template_zone_no_build = data['template_zone_no_build']
self.template_zone_influence = data['template_zone_influence']
self.template_eject_loc = data['template_eject_loc']
self.template_npc_load = data['template_npc_load']
self.template_fort_grid_offset = data['template_fort_grid_offset']
self.template_power_action_id = data['template_power_action_id']
self.template_zone_flag = data['template_zone_flag']
self.template_spire_event_rule = data['template_spire_event_rule']
self.template_maintenance_set = data['template_maintenance_set']
self.template_damage_set = data['template_damage_set']
self.template_energy_set = data['template_energy_set']
self.template_use_trigger = data['template_use_trigger']
self.template_unknown_check1 = data['template_unknown_check1']
self.template_loot_trigger = data['template_loot_trigger']
self.template_unknown_check2 = data['template_unknown_check2']
self.has_embedded_template = data['has_embedded_template']
if self.has_embedded_template:
self.template_embed_template = ArcCityAssetTemplate()
self.template_embed_template.load_json(data['template_embed_template'])
self.template_creator = data['template_creator']
self.template_terrain = data['template_terrain']
self.template_valid_npc_type = data['template_valid_npc_type']
self.template_valid_npc_cat = data['template_valid_npc_cat']
self.template_rank_info = []
for rank_info_data in data['template_rank_info']:
rank_info = RankInfo()
rank_info.load_json(rank_info_data)
self.template_rank_info.append(rank_info)
self.template_cap_info = data['template_cap_info']
self.template_event_rules = data['template_event_rules']
self.template_architecture = data['template_architecture']
self.template_offering_type = data['template_offering_type']
self.template_placement_type = data['template_placement_type']
self.template_offering_adjustment = data['template_offering_adjustment']
self.template_resource_limit = data['template_resource_limit']
self.template_unknown = data['template_unknown']
def save_json(self):
data = OrderedDict()
data['template_max_ranks'] = self.template_max_ranks
data['template_start_rank'] = self.template_start_rank
data['template_asset_type'] = self.template_asset_type
data['template_trade_icon'] = self.template_trade_icon
data['template_landmark'] = self.template_landmark
data['template_is_maintenance'] = self.template_is_maintenance
data['template_has_keys'] = self.template_has_keys
data['template_use_hardpoints'] = self.template_use_hardpoints
data['template_is_fort_asset'] = self.template_is_fort_asset
data['template_is_building_of_war'] = self.template_is_building_of_war
data['template_bow_can_place_on_grid'] = self.template_bow_can_place_on_grid
data['template_requires_nation_tree_slot'] = self.template_requires_nation_tree_slot
data['template_requires_guild_tree_slot'] = self.template_requires_guild_tree_slot
data['template_use_fort_grid'] = self.template_use_fort_grid
data['template_is_fort_start'] = self.template_is_fort_start
data['template_is_cap_asset'] = self.template_is_cap_asset
data['template_zone_no_build'] = self.template_zone_no_build
data['template_zone_influence'] = self.template_zone_influence
data['template_eject_loc'] = self.template_eject_loc
data['template_npc_load'] = self.template_npc_load
data['template_fort_grid_offset'] = self.template_fort_grid_offset
data['template_power_action_id'] = self.template_power_action_id
data['template_zone_flag'] = self.template_zone_flag
data['template_spire_event_rule'] = self.template_spire_event_rule
data['template_maintenance_set'] = self.template_maintenance_set
data['template_damage_set'] = self.template_damage_set
data['template_energy_set'] = self.template_energy_set
data['template_use_trigger'] = self.template_use_trigger
data['template_unknown_check1'] = self.template_unknown_check1
data['template_loot_trigger'] = self.template_loot_trigger
data['template_unknown_check2'] = self.template_unknown_check2
data['has_embedded_template'] = self.has_embedded_template
if self.has_embedded_template:
data['template_embed_template'] = self.template_embed_template.save_json()
data['template_creator'] = self.template_creator
data['template_terrain'] = self.template_terrain
data['template_valid_npc_type'] = self.template_valid_npc_type
data['template_valid_npc_cat'] = self.template_valid_npc_cat
data['template_rank_info'] = []
for rank_info in self.template_rank_info:
data['template_rank_info'].append(rank_info.save_json())
data['template_cap_info'] = self.template_cap_info
data['template_event_rules'] = self.template_event_rules
data['template_architecture'] = self.template_architecture
data['template_offering_type'] = self.template_offering_type
data['template_placement_type'] = self.template_placement_type
data['template_offering_adjustment'] = self.template_offering_adjustment
data['template_resource_limit'] = self.template_resource_limit
data['template_unknown'] = self.template_unknown
return data