From d59cb76ee743912276682519812c1dfb29331f04 Mon Sep 17 00:00:00 2001 From: Brian Savage Date: Tue, 26 Sep 2023 16:51:59 -0400 Subject: [PATCH 1/2] Add variables for int and float types --- evfl/entry_point.py | 46 ++++++++++++++++++++++++++++++++++++++++++--- evfl/enums.py | 5 +++++ evfl/repr_util.py | 2 +- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/evfl/entry_point.py b/evfl/entry_point.py index d1034a4..10504d3 100644 --- a/evfl/entry_point.py +++ b/evfl/entry_point.py @@ -1,15 +1,47 @@ from evfl.common import StringHolder import evfl.event from evfl.util import * +from evfl.dic import DicReader +from evfl.enums import VariableType +import os + +class Variable(BinaryObject): + __slots__ = ['num', 'type', 'value'] + def __init__(self) -> None: + super().__init__() + self.type: VariableType + def _do_read(self, stream: ReadStream) -> None: + offset = stream.tell() + stream.seek( 8, os.SEEK_CUR ) + self.num = stream.read_u16() + self.type = stream.read_u16() + assert self.type == VariableType.kInteger or self.type == VariableType.kFloat + stream.seek( offset ) + if self.type == VariableType.kInteger: + self.value = stream.read_s32() + elif self.type == VariableType.kFloat: + self.value = stream.read_f32() + stream.seek(12, os.SEEK_CUR) + + def _do_write(self, stream: WriteStream) -> None: + if self.type == VariableType.kInteger: + stream.write(s32(self.value)) + if self.type == VariableType.kFloat: + stream.write(f32(self.value)) + stream.write(u32(0)) + stream.write(u16(self.num)) + stream.write(u16(self.type)) + stream.write(u32(0)) class EntryPoint(BinaryObject): - __slots__ = ['name', 'main_event', '_sub_flow_event_indices', '_sub_flow_event_indices_offset_writer'] + __slots__ = ['name', 'main_event', '_sub_flow_event_indices', '_sub_flow_event_indices_offset_writer', 'items'] def __init__(self, name: str) -> None: super().__init__() self.name = name self.main_event: Index[evfl.event.Event] = Index() self._sub_flow_event_indices: typing.List[int] = [] self._sub_flow_event_indices_offset_writer: typing.Optional[PlaceholderWriter] = None + self.items = {} def _do_read(self, stream: ReadStream) -> None: sub_flow_event_indices_offset = stream.read_u64() @@ -19,13 +51,21 @@ def _do_read(self, stream: ReadStream) -> None: x1a = stream.read_u16() self.main_event._idx = stream.read_u16() x1e = stream.read_u16() - assert x8 == 0 and x1a == 0 and x1e == 0 and ptr_x10 == 0 + assert x1e == 0 if num_sub_flow_event_indices > 0: assert sub_flow_event_indices_offset != 0 with SeekContext(stream, sub_flow_event_indices_offset): self._sub_flow_event_indices = [stream.read_u16() for i in range(num_sub_flow_event_indices)] - + if x1a > 0: + with SeekContext(stream, x8): + dic = DicReader() + dic.read(stream) + with SeekContext(stream, ptr_x10): + for item in dic.items: + v = Variable() + v._do_read(stream) + self.items[item] = v.value def _do_write(self, stream: WriteStream) -> None: self._sub_flow_event_indices_offset_writer = stream.write_placeholder_ptr_if(bool(self._sub_flow_event_indices), register=True) stream.write(u64(0)) # x8 diff --git a/evfl/enums.py b/evfl/enums.py index f401cfb..5155f96 100644 --- a/evfl/enums.py +++ b/evfl/enums.py @@ -71,3 +71,8 @@ class BuildResultType(enum.IntEnum): kInvalidOperation = 1 kResFlowchartNotFound = 2 kEntryPointNotFound = 3 + +class VariableType(enum.IntEnum): + kInteger = 2 + kFloat = 4 + diff --git a/evfl/repr_util.py b/evfl/repr_util.py index 1f6c1b2..db75ab6 100644 --- a/evfl/repr_util.py +++ b/evfl/repr_util.py @@ -99,7 +99,7 @@ def traverse(entry_event: Event, join_stack: typing.List[Event]) -> None: handle_next(nid, data.nxt.v, join_stack, queue) for i, entry in enumerate(flow.flowchart.entry_points): - builder.add_node(-1000-i, 'entry', {'name': entry.name}) + builder.add_node(-1000-i, 'entry', {'name': entry.name, 'variables': entry.items}) if entry.main_event.v: builder.add_edge(-1000-i, event_idx_map[entry.main_event.v]) traverse(entry.main_event.v, []) From a6660564c753a55e9248d2d0251c87a535cc66b3 Mon Sep 17 00:00:00 2001 From: Brian Savage Date: Tue, 26 Sep 2023 16:55:35 -0400 Subject: [PATCH 2/2] Fix formatting issues --- evfl/entry_point.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/evfl/entry_point.py b/evfl/entry_point.py index 10504d3..4f082dc 100644 --- a/evfl/entry_point.py +++ b/evfl/entry_point.py @@ -5,18 +5,21 @@ from evfl.enums import VariableType import os + class Variable(BinaryObject): - __slots__ = ['num', 'type', 'value'] + __slots__ = ["num", "type", "value"] + def __init__(self) -> None: super().__init__() self.type: VariableType + def _do_read(self, stream: ReadStream) -> None: offset = stream.tell() - stream.seek( 8, os.SEEK_CUR ) + stream.seek(8, os.SEEK_CUR) self.num = stream.read_u16() self.type = stream.read_u16() assert self.type == VariableType.kInteger or self.type == VariableType.kFloat - stream.seek( offset ) + stream.seek(offset) if self.type == VariableType.kInteger: self.value = stream.read_s32() elif self.type == VariableType.kFloat: @@ -33,6 +36,7 @@ def _do_write(self, stream: WriteStream) -> None: stream.write(u16(self.type)) stream.write(u32(0)) + class EntryPoint(BinaryObject): __slots__ = ['name', 'main_event', '_sub_flow_event_indices', '_sub_flow_event_indices_offset_writer', 'items'] def __init__(self, name: str) -> None: