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.

149 lines
7.0 KiB

# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
# Magicbane Emulator Project © 2013 - 2022
# www.magicbane.com
from collections import OrderedDict
from arcane.enums.arc_object import *
from arcane.enums.hashes import hash_to_string, string_to_hash
from arcane.util import ResStream
from .common.SparseData import SparseData
class SoundEvent:
def load_binary(self, stream: ResStream):
self.sound_type = stream.read_dword()
self.sound_event = stream.read_qword()
def save_binary(self, stream: ResStream):
stream.write_dword(self.sound_type)
stream.write_qword(self.sound_event)
def load_json(self, data):
self.sound_type = STRING_TO_SOUND_TYPE[data['sound_type']]
self.sound_event = data['sound_event']
def save_json(self):
data = OrderedDict()
data['sound_type'] = SOUND_TYPE_TO_STRING[self.sound_type]
data['sound_event'] = self.sound_event
return data
class ArcObj:
def load_binary(self, stream: ResStream):
self.obj_name = stream.read_string()
self.obj_pickable = stream.read_bool()
self.obj_gravity = stream.read_float()
self.obj_cull_distance = stream.read_float()
self.obj_scale = stream.read_tuple()
self.obj_render_object = stream.read_qword()
self.obj_double_fusion = stream.read_bool()
self.obj_forward_vector = stream.read_tuple()
self.obj_tracking_name = stream.read_string()
self.obj_max_tracking_distance = stream.read_float()
self.obj_icon = stream.read_qword()
self.obj_gravity_f = stream.read_float()
num_sound_events = stream.read_dword()
self.obj_sound_events = [SoundEvent() for _ in range(num_sound_events)]
for sound_event in self.obj_sound_events:
sound_event.load_binary(stream)
num_hard_points = stream.read_dword()
self.obj_arc_hardpoint_list = [
[
stream.read_dword(),
stream.read_dword(),
[stream.read_float() for _ in range(10)]
] for _ in range(num_hard_points)
]
self.obj_sparse_data = SparseData()
self.obj_sparse_data.load_binary(stream)
self.obj_render_object_low_detail = stream.read_qword()
self.obj_default_alignment = stream.read_tuple()
self.obj_sound_table = stream.read_dword()
def save_binary(self, stream: ResStream):
stream.write_string(self.obj_name)
stream.write_bool(self.obj_pickable)
stream.write_float(self.obj_gravity)
stream.write_float(self.obj_cull_distance)
stream.write_tuple(self.obj_scale)
stream.write_qword(self.obj_render_object)
stream.write_bool(self.obj_double_fusion)
stream.write_tuple(self.obj_forward_vector)
stream.write_string(self.obj_tracking_name)
stream.write_float(self.obj_max_tracking_distance)
stream.write_qword(self.obj_icon)
stream.write_float(self.obj_gravity_f)
stream.write_dword(len(self.obj_sound_events))
for sound_event in self.obj_sound_events:
sound_event.save_binary(stream)
stream.write_dword(len(self.obj_arc_hardpoint_list))
for n, m, points in self.obj_arc_hardpoint_list:
stream.write_dword(n)
stream.write_dword(m)
for i in range(10):
stream.write_float(points[i])
self.obj_sparse_data.save_binary(stream)
stream.write_qword(self.obj_render_object_low_detail)
stream.write_tuple(self.obj_default_alignment)
stream.write_dword(self.obj_sound_table)
def load_json(self, data):
self.obj_name = data['obj_name']
self.obj_pickable = data['obj_pickable']
self.obj_gravity = data['obj_gravity']
self.obj_cull_distance = data['obj_cull_distance']
self.obj_scale = data['obj_scale']
self.obj_render_object = data['obj_render_object']
self.obj_double_fusion = data['obj_double_fusion']
self.obj_forward_vector = data['obj_forward_vector']
self.obj_tracking_name = data['obj_tracking_name']
self.obj_max_tracking_distance = data['obj_max_tracking_distance']
self.obj_icon = data['obj_icon']
self.obj_gravity_f = data['obj_gravity_f']
self.obj_sound_events = []
for sound_data in data['obj_sound_events']:
sound_event = SoundEvent()
sound_event.load_json(sound_data)
self.obj_sound_events.append(sound_event)
self.obj_arc_hardpoint_list = []
for point_list in data['obj_arc_hardpoint_list']:
self.obj_arc_hardpoint_list.append(point_list)
self.obj_sparse_data = SparseData()
self.obj_sparse_data.load_json(data['obj_sparse_data'])
self.obj_render_object_low_detail = data['obj_render_object_low_detail']
self.obj_default_alignment = data['obj_default_alignment']
self.obj_sound_table = string_to_hash(data['obj_sound_table'])
return data
def save_json(self):
data = OrderedDict()
data['obj_name'] = self.obj_name
data['obj_pickable'] = self.obj_pickable
data['obj_gravity'] = self.obj_gravity
data['obj_cull_distance'] = self.obj_cull_distance
data['obj_scale'] = self.obj_scale
data['obj_render_object'] = self.obj_render_object
data['obj_double_fusion'] = self.obj_double_fusion
data['obj_forward_vector'] = self.obj_forward_vector
data['obj_tracking_name'] = self.obj_tracking_name
data['obj_max_tracking_distance'] = self.obj_max_tracking_distance
data['obj_icon'] = self.obj_icon
data['obj_gravity_f'] = self.obj_gravity_f
data['obj_sound_events'] = []
for sound_event in self.obj_sound_events:
data['obj_sound_events'].append(sound_event.save_json())
data['obj_arc_hardpoint_list'] = []
for point_list in self.obj_arc_hardpoint_list:
data['obj_arc_hardpoint_list'].append(point_list)
data['obj_sparse_data'] = self.obj_sparse_data.save_json()
data['obj_render_object_low_detail'] = self.obj_render_object_low_detail
data['obj_default_alignment'] = self.obj_default_alignment
data['obj_sound_table'] = hash_to_string(self.obj_sound_table)
return data