PyLibMS 4.2.0__tar.gz → 4.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. pylibms-4.2.1/MANIFEST.in +1 -0
  2. {pylibms-4.2.0 → pylibms-4.2.1}/PKG-INFO +1 -1
  3. {pylibms-4.2.0 → pylibms-4.2.1}/PyLibMS.egg-info/PKG-INFO +1 -1
  4. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/definitions/flowchart.py +1 -0
  5. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/definitions/node.py +22 -26
  6. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/definitions/node_type.py +5 -5
  7. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/flw3.py +13 -9
  8. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Tomodachi Life NA-EU.yaml +6 -1
  9. {pylibms-4.2.0 → pylibms-4.2.1}/pyproject.toml +1 -1
  10. pylibms-4.2.0/MANIFEST.in +0 -2
  11. {pylibms-4.2.0 → pylibms-4.2.1}/LICENSE +0 -0
  12. {pylibms-4.2.0 → pylibms-4.2.1}/PyLibMS.egg-info/SOURCES.txt +0 -0
  13. {pylibms-4.2.0 → pylibms-4.2.1}/PyLibMS.egg-info/dependency_links.txt +0 -0
  14. {pylibms-4.2.0 → pylibms-4.2.1}/PyLibMS.egg-info/requires.txt +0 -0
  15. {pylibms-4.2.0 → pylibms-4.2.1}/PyLibMS.egg-info/top_level.txt +0 -0
  16. {pylibms-4.2.0 → pylibms-4.2.1}/README.md +0 -0
  17. {pylibms-4.2.0 → pylibms-4.2.1}/lms/__init__.py +0 -0
  18. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/__init__.py +0 -0
  19. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/field/__init__.py +0 -0
  20. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/field/io.py +0 -0
  21. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/field/lms_datatype.py +0 -0
  22. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/field/lms_field.py +0 -0
  23. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/lms_constants.py +0 -0
  24. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/lms_exceptions.py +0 -0
  25. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/lms_fileinfo.py +0 -0
  26. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/stream/fileinfo.py +0 -0
  27. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/stream/hashtable.py +0 -0
  28. {pylibms-4.2.0 → pylibms-4.2.1}/lms/common/stream/section.py +0 -0
  29. {pylibms-4.2.0 → pylibms-4.2.1}/lms/fileio/encoding.py +0 -0
  30. {pylibms-4.2.0 → pylibms-4.2.1}/lms/fileio/io.py +0 -0
  31. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/__init__.py +0 -0
  32. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/definitions/__init__.py +0 -0
  33. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/definitions/lms_nodeexceptions.py +0 -0
  34. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/msbf.py +0 -0
  35. {pylibms-4.2.0 → pylibms-4.2.1}/lms/flowchart/msbfio.py +0 -0
  36. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/__init__.py +0 -0
  37. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/definitions/__init__.py +0 -0
  38. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/definitions/field/__init__.py +0 -0
  39. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/lms_messagetext.py +0 -0
  40. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/msbt.py +0 -0
  41. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/msbtentry.py +0 -0
  42. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/msbtio.py +0 -0
  43. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/section/__init__.py +0 -0
  44. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/section/atr1.py +0 -0
  45. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/section/nli1.py +0 -0
  46. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/section/tsy1.py +0 -0
  47. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/section/txt2.py +0 -0
  48. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/tag/__init__.py +0 -0
  49. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/tag/io/param_io.py +0 -0
  50. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/tag/io/tag_io.py +0 -0
  51. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/tag/lms_tag.py +0 -0
  52. {pylibms-4.2.0 → pylibms-4.2.1}/lms/message/tag/lms_tagexceptions.py +0 -0
  53. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/__init__.py +0 -0
  54. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/definitions/__init__.py +0 -0
  55. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/definitions/attribute.py +0 -0
  56. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/definitions/color.py +0 -0
  57. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/definitions/style.py +0 -0
  58. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/definitions/tag.py +0 -0
  59. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/msbp.py +0 -0
  60. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/msbpread.py +0 -0
  61. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/ali2.py +0 -0
  62. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/ati2.py +0 -0
  63. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/clr1.py +0 -0
  64. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/string.py +0 -0
  65. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/syl3.py +0 -0
  66. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/tag2.py +0 -0
  67. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/tgg2.py +0 -0
  68. {pylibms-4.2.0 → pylibms-4.2.1}/lms/project/section/tgp2.py +0 -0
  69. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/__init__.py +0 -0
  70. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/config.py +0 -0
  71. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/definitions/__init__.py +0 -0
  72. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/definitions/attribute.py +0 -0
  73. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/definitions/nodes.py +0 -0
  74. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/definitions/tags.py +0 -0
  75. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/definitions/value.py +0 -0
  76. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Badge Arcade.yaml +0 -0
  77. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Brain Age Concentration Training.yaml +0 -0
  78. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Kirby Planet Robobot.yaml +0 -0
  79. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Super Mario 3D Land.yaml +0 -0
  80. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Super Mario 3D World + Bowsers Fury.yaml +0 -0
  81. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Super Mario Odyssey.yaml +0 -0
  82. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/The Legend of Zelda Echos of Wisdom.yaml +0 -0
  83. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/The Legend of Zelda a Link Between Worlds.yaml +0 -0
  84. {pylibms-4.2.0 → pylibms-4.2.1}/lms/titleconfig/presets/Tomodachi Life Living The Dream.yaml +0 -0
  85. {pylibms-4.2.0 → pylibms-4.2.1}/setup.cfg +0 -0
@@ -0,0 +1 @@
1
+ include README.md LICENSE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyLibMS
3
- Version: 4.2.0
3
+ Version: 4.2.1
4
4
  Summary: Python library built for the libMessageStudio (LMS) proprietary file formats from Nintendo. Supports MSBT, MSBP, and MSBF.
5
5
  Author: AbdyyEee
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyLibMS
3
- Version: 4.2.0
3
+ Version: 4.2.1
4
4
  Summary: Python library built for the libMessageStudio (LMS) proprietary file formats from Nintendo. Supports MSBT, MSBP, and MSBF.
5
5
  Author: AbdyyEee
6
6
  License-Expression: MIT
@@ -16,6 +16,7 @@ class LMS_Flowchart:
16
16
  for node in entry_point.get_descendents():
17
17
  self._nodes[node.id] = node
18
18
 
19
+
19
20
  def __iter__(self) -> Iterator[LMS_BaseNode]:
20
21
  return iter(self._nodes.values())
21
22
 
@@ -27,15 +27,14 @@ class LMS_BaseNode:
27
27
  id: int | None,
28
28
  node_type: LMS_NodeType,
29
29
  parameter_type: LMS_NodeParameterType,
30
- parameter_value: LMS_NodeParameter | None,
31
- stream_next_id: int | None = None):
30
+ parameter_value: LMS_NodeParameter | None):
32
31
  self.id = id
33
32
  self._node_type = node_type
34
33
 
35
34
  self._parameter_type = parameter_type
36
35
  self._parameter_value = parameter_value
37
36
 
38
- self._stream_next_id: int | None = stream_next_id
37
+ self._stream_next_id: int | None = None
39
38
  self._next_node: LMS_BaseNode | None = None
40
39
 
41
40
  @property
@@ -76,14 +75,6 @@ class LMS_BaseNode:
76
75
  if not isinstance(value, self._parameter_type.builtin_type):
77
76
  raise TypeError(f"Wrong value provided! Expected {self._parameter_type.builtin_type} got {type(value)}")
78
77
 
79
- sliced_datatype = {
80
- LMS_NodeParameterType.PARAM_16_16: (LMS_DataType.UINT16, LMS_DataType.UINT16),
81
- LMS_NodeParameterType.PARAM_16_8_8: (LMS_DataType.UINT16, LMS_DataType.UINT8, LMS_DataType.UINT8),
82
- LMS_NodeParameterType.PARAM_8_8_16: (LMS_DataType.UINT8, LMS_DataType.UINT8, LMS_DataType.UINT16),
83
- LMS_NodeParameterType.PARAM_8_8_8_8: (LMS_DataType.UINT8, LMS_DataType.UINT8, LMS_DataType.UINT8,
84
- LMS_DataType.UINT8)
85
- }
86
-
87
78
  match self._parameter_type:
88
79
  case LMS_NodeParameterType.STRING:
89
80
  self._parameter_value = value
@@ -92,7 +83,8 @@ class LMS_BaseNode:
92
83
  self._parameter_value = value
93
84
  case _:
94
85
  for i, parameter in enumerate(value):
95
- verify_number_from_datatype(parameter, sliced_datatype[self._parameter_type][i])
86
+ verify_number_from_datatype(parameter,
87
+ self._parameter_type.sliced_datatype[self._parameter_type][i])
96
88
 
97
89
  self._parameter_value = value
98
90
 
@@ -100,8 +92,6 @@ class LMS_BaseNode:
100
92
  """Set the next node for the instance.
101
93
 
102
94
  :param node: the node object, None for no next node."""
103
- # Once next_node is properly set, stream_id is never accessed again
104
- # While it does become stale, there is no point to altering it afterward
105
95
  self._next_node = node
106
96
  return node
107
97
 
@@ -143,7 +133,6 @@ class LMS_MessageNode(LMS_BaseNode):
143
133
 
144
134
  def __init__(self,
145
135
  id: int | None,
146
- stream_next_node: int,
147
136
  msbt_index: int,
148
137
  label_index: int,
149
138
  msbt: MSBT | None = None
@@ -153,7 +142,6 @@ class LMS_MessageNode(LMS_BaseNode):
153
142
  LMS_NodeType.MESSAGE,
154
143
  LMS_NodeParameterType.NONE,
155
144
  None,
156
- stream_next_node
157
145
  )
158
146
 
159
147
  self.msbt_index = msbt_index
@@ -211,13 +199,20 @@ class LMS_BranchNode(LMS_BaseNode):
211
199
  LMS_NodeType.BRANCH,
212
200
  parameter_type,
213
201
  parameter_value,
214
- NO_NEXT_NODE
215
202
  )
216
203
 
217
204
  self._condition_id = condition_id
218
205
  self._branches: dict[int, LMS_BaseNode | None] = {}
219
206
  self._definition = definition
220
207
 
208
+ def __repr__(self):
209
+ if self._definition is None:
210
+ return super().__repr__()
211
+ return f"{self._definition.name}({ {field.name: field.value for field in self._parameter_value} } {self.id}"
212
+
213
+ def set_next_node(self, node: LMS_BaseNode | None) -> LMS_BaseNode | None:
214
+ raise NotImplementedError("Use function set_branch_case to alter the flow of a branch node!")
215
+
221
216
  @classmethod
222
217
  def new(cls,
223
218
  parameter_type: LMS_NodeParameterType,
@@ -345,19 +340,22 @@ class LMS_EventNode(LMS_BaseNode):
345
340
  parameter_type: LMS_NodeParameterType,
346
341
  parameter_value: LMS_FieldMap | int | str | tuple[int, ...],
347
342
  action_id: int,
348
- stream_next_id: int | None = None,
349
343
  definition: NodeDefinition | None = None,
350
344
  ):
351
345
  super().__init__(
352
346
  id,
353
347
  LMS_NodeType.EVENT,
354
348
  parameter_type,
355
- parameter_value,
356
- stream_next_id)
349
+ parameter_value)
357
350
 
358
351
  self._action_id = action_id
359
352
  self._definition = definition
360
353
 
354
+ def __repr__(self):
355
+ if self._definition is None:
356
+ return super().__repr__()
357
+ return f"{self._definition.name}({ {field.name: field.value for field in self._parameter_value} } {self.id}"
358
+
361
359
  @classmethod
362
360
  def new(cls, parameter_type: LMS_NodeParameterType, parameter_value: int | str | tuple[int, ...], action_id: int):
363
361
  """
@@ -409,13 +407,12 @@ class LMS_EntryNode(LMS_BaseNode):
409
407
  Class that represents an entry node. Node that is at the start of a flowchart.
410
408
  """
411
409
 
412
- def __init__(self, id: int, stream_next_id=None, flowchart_name: str = ""):
410
+ def __init__(self, id: int, flowchart_name: str = ""):
413
411
  super().__init__(
414
412
  id,
415
413
  LMS_NodeType.ENTRY,
416
414
  LMS_NodeParameterType.NONE,
417
- None,
418
- stream_next_id)
415
+ None)
419
416
 
420
417
  self.flowchart_name = flowchart_name
421
418
 
@@ -425,13 +422,12 @@ class LMS_JumpNode(LMS_BaseNode):
425
422
  Class that represents a jump node. Node that jumps to another flowchart.
426
423
  """
427
424
 
428
- def __init__(self, id: int, next_flowchart_id: int, unknown_short0a: int):
425
+ def __init__(self, id: int, unknown_short0a: int):
429
426
  super().__init__(
430
427
  id,
431
428
  LMS_NodeType.JUMP,
432
429
  LMS_NodeParameterType.NONE,
433
- None,
434
- next_flowchart_id)
430
+ None)
435
431
 
436
432
  self.next_flowchart: LMS_EntryNode | None = None
437
433
 
@@ -54,21 +54,21 @@ class LMS_NodeParameterType(IntEnum):
54
54
  NONE = -1
55
55
 
56
56
  @property
57
- def sliced_datatype(self):
58
- """The parameter type split into the raw datatypes. Not valid for PARAM_32_0, PARAM_32_1, and STRING."""
57
+ def sliced_datatype(self) -> tuple[LMS_DataType, ...]:
58
+ """The parameter type split into the raw datatypes. Not valid for STRING."""
59
59
  if self in [
60
60
  LMS_NodeParameterType.NONE,
61
- LMS_NodeParameterType.PARAM_32_0,
62
- LMS_NodeParameterType.PARAM_32_1,
63
61
  LMS_NodeParameterType.STRING]:
64
62
  raise TypeError(f"There is no sliced datatypes for {self} parameter types!")
65
63
 
66
64
  return {
65
+ LMS_NodeParameterType.PARAM_32_0: (LMS_DataType.UINT32,),
67
66
  LMS_NodeParameterType.PARAM_16_16: (LMS_DataType.UINT16, LMS_DataType.UINT16),
68
67
  LMS_NodeParameterType.PARAM_16_8_8: (LMS_DataType.UINT16, LMS_DataType.UINT8, LMS_DataType.UINT8),
69
68
  LMS_NodeParameterType.PARAM_8_8_16: (LMS_DataType.UINT8, LMS_DataType.UINT8, LMS_DataType.UINT16),
70
69
  LMS_NodeParameterType.PARAM_8_8_8_8: (LMS_DataType.UINT8, LMS_DataType.UINT8, LMS_DataType.UINT8,
71
- LMS_DataType.UINT8)
70
+ LMS_DataType.UINT8),
71
+ LMS_NodeParameterType.PARAM_32_1: (LMS_DataType.UINT32,)
72
72
  }[self]
73
73
 
74
74
  @property
@@ -28,6 +28,8 @@ def read_flw3(reader: FileReader, config: NodeConfig | None, msbt: MSBT | None,
28
28
 
29
29
  nodes: list[LMS_BaseNode] = []
30
30
  entry_nodes: list[LMS_EntryNode] = []
31
+
32
+ next_id_map: dict[LMS_BaseNode, int | None] = {}
31
33
  branch_metadata: dict[LMS_BranchNode, dict] = {}
32
34
 
33
35
  for i in range(node_count):
@@ -45,7 +47,7 @@ def read_flw3(reader: FileReader, config: NodeConfig | None, msbt: MSBT | None,
45
47
  stream_next_id = read_next_node_id(reader)
46
48
  file_index = reader.read_uint16()
47
49
  message_index = reader.read_uint16()
48
- node = LMS_MessageNode(i, stream_next_id, file_index, message_index, msbt)
50
+ node = LMS_MessageNode(i, file_index, message_index, msbt)
49
51
  reader.skip(2)
50
52
  case LMS_NodeType.BRANCH:
51
53
  # There is no next node id as the next node is determined by the branches
@@ -78,27 +80,29 @@ def read_flw3(reader: FileReader, config: NodeConfig | None, msbt: MSBT | None,
78
80
  definition = get_config_definition(config, LMS_NodeType.EVENT, parameter_type, event_id)
79
81
  parameter_value = evaluate_node_parameter(reader, section_start, parameter_type, definition)
80
82
 
81
- node = LMS_EventNode(i, parameter_type, parameter_value, event_id, stream_next_id, definition)
83
+ node = LMS_EventNode(i, parameter_type, parameter_value, event_id, definition)
82
84
  reader.seek(end)
83
85
  case LMS_NodeType.ENTRY:
84
86
  reader.seek(node_data)
85
87
  stream_next_id = read_next_node_id(reader)
86
- node = LMS_EntryNode(i, stream_next_id)
88
+ node = LMS_EntryNode(i)
87
89
  entry_nodes.append(node)
88
90
  reader.skip(6)
89
91
  case LMS_NodeType.JUMP:
90
92
  reader.seek(node_data)
91
- next_flowchart_id = read_next_node_id(reader)
93
+ stream_next_id = read_next_node_id(reader)
92
94
  unknown_short0a = reader.read_uint16()
93
- node = LMS_JumpNode(i, next_flowchart_id, unknown_short0a)
95
+ node = LMS_JumpNode(i, unknown_short0a)
94
96
  reader.skip(4)
95
97
 
98
+ next_id_map[node] = stream_next_id
96
99
  nodes.append(node)
97
100
 
98
101
  node_map: dict[int, LMS_BaseNode] = {node.id: node for node in nodes}
99
102
  branch_ids = [read_next_node_id(reader) for _ in range(branch_table_id_count)]
100
103
 
101
104
  for node in nodes:
105
+ next_node_id = next_id_map[node]
102
106
 
103
107
  if isinstance(node, LMS_BranchNode):
104
108
  case_count, starting_index = branch_metadata[node]
@@ -112,13 +116,13 @@ def read_flw3(reader: FileReader, config: NodeConfig | None, msbt: MSBT | None,
112
116
 
113
117
  continue
114
118
  elif isinstance(node, LMS_JumpNode):
115
- node.next_flowchart = node_map[node.next_node_id]
119
+ node.next_flowchart = node_map[next_node_id]
116
120
  continue
117
121
 
118
- if node.next_node_id is None:
122
+ if next_node_id is None:
119
123
  continue
120
124
 
121
- node.set_next_node(node_map[node.next_node_id])
125
+ node.set_next_node(node_map[next_node_id])
122
126
 
123
127
  return node_count, entry_nodes
124
128
 
@@ -159,7 +163,7 @@ def evaluate_node_parameter(reader: FileReader,
159
163
  })
160
164
 
161
165
  for i, param_definition in enumerate(definition.parameter_definitions):
162
- stream_map = {1: reader.read_uint8, 2: reader.read_uint16, 3: reader.read_uint32}
166
+ stream_map = {1: reader.read_uint8, 2: reader.read_uint16, 4: reader.read_uint32}
163
167
  result[param_definition.name] = read_field(reader, param_definition,
164
168
  stream_map[parameter_type.sliced_datatype[i].stream_size])
165
169
 
@@ -8,7 +8,7 @@ node_definitions:
8
8
  - name: exp
9
9
  - id: 1
10
10
  name: SwitchVariable
11
- case_format: "var == {case}"
11
+ case_format: "var == $case"
12
12
  parameter_type: string
13
13
  parameters:
14
14
  - name: var
@@ -29,6 +29,11 @@ node_definitions:
29
29
  parameter_type: string
30
30
  parameters:
31
31
  - name: var
32
+ - id: 82
33
+ name: SetFlag
34
+ parameter_type: p32_1
35
+ parameters:
36
+ - name: flag
32
37
  - id: 90
33
38
  name: LoadSEGroup
34
39
  parameter_type: string
@@ -7,7 +7,7 @@ include = ["lms*"]
7
7
 
8
8
  [project]
9
9
  name = "PyLibMS"
10
- version = "4.2.0"
10
+ version = "4.2.1"
11
11
  requires-python = ">=3.10"
12
12
  description = "Python library built for the libMessageStudio (LMS) proprietary file formats from Nintendo. Supports MSBT, MSBP, and MSBF."
13
13
  readme = "README.md"
pylibms-4.2.0/MANIFEST.in DELETED
@@ -1,2 +0,0 @@
1
- include README.md LICENSE
2
- recursive-include lms/titleconfig/presets *.yaml
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes