PyLibMS 3.3.7__tar.gz → 3.3.9__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 (72) hide show
  1. {pylibms-3.3.7 → pylibms-3.3.9}/PKG-INFO +1 -1
  2. {pylibms-3.3.7 → pylibms-3.3.9}/PyLibMS.egg-info/PKG-INFO +1 -1
  3. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/tag/io/param_io.py +3 -1
  4. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/string.py +0 -1
  5. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/config.py +7 -5
  6. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/definitions/tags.py +8 -12
  7. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Tomodachi Life Living the Dream Demo.yaml +172 -12
  8. {pylibms-3.3.7 → pylibms-3.3.9}/pyproject.toml +1 -1
  9. {pylibms-3.3.7 → pylibms-3.3.9}/LICENSE +0 -0
  10. {pylibms-3.3.7 → pylibms-3.3.9}/MANIFEST.in +0 -0
  11. {pylibms-3.3.7 → pylibms-3.3.9}/PyLibMS.egg-info/SOURCES.txt +0 -0
  12. {pylibms-3.3.7 → pylibms-3.3.9}/PyLibMS.egg-info/dependency_links.txt +0 -0
  13. {pylibms-3.3.7 → pylibms-3.3.9}/PyLibMS.egg-info/requires.txt +0 -0
  14. {pylibms-3.3.7 → pylibms-3.3.9}/PyLibMS.egg-info/top_level.txt +0 -0
  15. {pylibms-3.3.7 → pylibms-3.3.9}/README.md +0 -0
  16. {pylibms-3.3.7 → pylibms-3.3.9}/lms/__init__.py +0 -0
  17. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/__init__.py +0 -0
  18. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/lms_datatype.py +0 -0
  19. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/lms_exceptions.py +0 -0
  20. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/lms_fileinfo.py +0 -0
  21. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/stream/fileinfo.py +0 -0
  22. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/stream/hashtable.py +0 -0
  23. {pylibms-3.3.7 → pylibms-3.3.9}/lms/common/stream/section.py +0 -0
  24. {pylibms-3.3.7 → pylibms-3.3.9}/lms/fileio/encoding.py +0 -0
  25. {pylibms-3.3.7 → pylibms-3.3.9}/lms/fileio/io.py +0 -0
  26. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/__init__.py +0 -0
  27. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/definitions/__init__.py +0 -0
  28. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/definitions/field/__init__.py +0 -0
  29. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/definitions/field/io.py +0 -0
  30. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/definitions/field/lms_field.py +0 -0
  31. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/definitions/lms_messagetext.py +0 -0
  32. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/msbt.py +0 -0
  33. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/msbtentry.py +0 -0
  34. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/msbtio.py +0 -0
  35. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/section/__init__.py +0 -0
  36. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/section/atr1.py +0 -0
  37. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/section/nli1.py +0 -0
  38. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/section/tsy1.py +0 -0
  39. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/section/txt2.py +0 -0
  40. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/tag/__init__.py +0 -0
  41. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/tag/io/tag_io.py +0 -0
  42. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/tag/lms_tag.py +0 -0
  43. {pylibms-3.3.7 → pylibms-3.3.9}/lms/message/tag/lms_tagexceptions.py +0 -0
  44. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/__init__.py +0 -0
  45. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/definitions/__init__.py +0 -0
  46. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/definitions/attribute.py +0 -0
  47. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/definitions/color.py +0 -0
  48. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/definitions/style.py +0 -0
  49. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/definitions/tag.py +0 -0
  50. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/msbp.py +0 -0
  51. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/msbpread.py +0 -0
  52. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/ali2.py +0 -0
  53. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/ati2.py +0 -0
  54. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/clr1.py +0 -0
  55. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/syl3.py +0 -0
  56. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/tag2.py +0 -0
  57. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/tgg2.py +0 -0
  58. {pylibms-3.3.7 → pylibms-3.3.9}/lms/project/section/tgp2.py +0 -0
  59. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/__init__.py +0 -0
  60. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/definitions/__init__.py +0 -0
  61. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/definitions/attribute.py +0 -0
  62. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/definitions/value.py +0 -0
  63. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Badge Arcade.yaml +0 -0
  64. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Brain Age Concentration Training.yaml +0 -0
  65. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Kirby Planet Robobot.yaml +0 -0
  66. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Super Mario 3D Land.yaml +0 -0
  67. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Super Mario 3D World + Bowsers Fury.yaml +0 -0
  68. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Super Mario Odyssey.yaml +0 -0
  69. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/The Legend of Zelda Echos of Wisdom.yaml +0 -0
  70. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/The Legend of Zelda a Link Between Worlds.yaml +0 -0
  71. {pylibms-3.3.7 → pylibms-3.3.9}/lms/titleconfig/presets/Tomodachi Life.yaml +0 -0
  72. {pylibms-3.3.7 → pylibms-3.3.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyLibMS
3
- Version: 3.3.7
3
+ Version: 3.3.9
4
4
  Summary: Python library built for the libMessageStudio (LMS) proprietary file formats from Nintendo. Supports MSBT, MSBP, and soon to be MSBF.
5
5
  Author: AbdyyEee
6
6
  License: Copyright 2025 AbdyyEee
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyLibMS
3
- Version: 3.3.7
3
+ Version: 3.3.9
4
4
  Summary: Python library built for the libMessageStudio (LMS) proprietary file formats from Nintendo. Supports MSBT, MSBP, and soon to be MSBF.
5
5
  Author: AbdyyEee
6
6
  License: Copyright 2025 AbdyyEee
@@ -32,7 +32,9 @@ def read_decoded_parameters(
32
32
  value = read_field(reader, param)
33
33
  except Exception as e:
34
34
  raise LMS_TagReadingError(
35
- f"An error occurred reading tag '[{definition.group_name}:{definition.tag_name}]', parameter '{param.name}' at offset {param_offset}"
35
+ f"""An error occurred reading tag '[{definition.group_name}:{definition.tag_name}]', at offset {param_offset}.
36
+ Parameter details: name='{param.name}', datatype='{param.datatype}'
37
+ """
36
38
  ) from e
37
39
 
38
40
  parameters[param.name] = value
@@ -13,7 +13,6 @@ def read_strings(reader: FileReader, four_byte_count: bool) -> list[str]:
13
13
  for offset in reader.read_offset_array(count):
14
14
  reader.seek(offset)
15
15
  string = reader.read_encoded_string()
16
- print(string)
17
16
  string_list.append(string)
18
17
 
19
18
  return string_list
@@ -117,11 +117,14 @@ class TitleConfig:
117
117
  config["name"], config["description"], definitions
118
118
  )
119
119
 
120
- tag_definitions = []
120
+ tag_definitions: dict[int, list[TagDefinition]] = {}
121
121
  group_map = parsed_content[cls.TAG_KEY]["groups"]
122
122
 
123
123
  for tag_def in parsed_content[cls.TAG_KEY]["tags"]:
124
- tag_definitions.append(TagDefinition.from_dict(tag_def, group_map))
124
+ definition = TagDefinition.from_dict(tag_def, group_map)
125
+ if definition.group_id not in tag_definitions:
126
+ tag_definitions[definition.group_id] = []
127
+ tag_definitions[definition.group_id].append(definition)
125
128
 
126
129
  tag_config = TagConfig(group_map, tag_definitions)
127
130
 
@@ -169,11 +172,10 @@ class TitleConfig:
169
172
  "group_id": group.group_id,
170
173
  "tag_index": i,
171
174
  "description": "",
172
- "parameters": None if not tag_def.parameter_definitions else [],
173
175
  }
174
176
 
175
- if definition["parameters"] is None:
176
- continue
177
+ if tag_def.parameter_definitions:
178
+ definition["parameters"] = []
177
179
 
178
180
  for param_def in tag_def.parameter_definitions:
179
181
  param_definition: dict[str, str | list] = {
@@ -9,7 +9,7 @@ from lms.titleconfig.definitions.value import ValueDefinition
9
9
  class TagConfig:
10
10
  """Class that represents a tag structure definition."""
11
11
 
12
- def __init__(self, group_map: dict[int, str], definitions: list[TagDefinition]):
12
+ def __init__(self, group_map: dict[int, str], definitions: dict[int, list[TagDefinition]]):
13
13
  self._group_map = group_map
14
14
  self._definitions = definitions
15
15
 
@@ -18,23 +18,23 @@ class TagConfig:
18
18
  return self._group_map
19
19
 
20
20
  @property
21
- def definitions(self) -> list[TagDefinition]:
21
+ def definitions(self) -> dict[int, list[TagDefinition]]:
22
22
  return self._definitions
23
23
 
24
24
  def get_definition_by_names(self, group_name: str, tag_name: str) -> TagDefinition:
25
- group_index = None
25
+ group_id = None
26
26
  for i, name in self.group_map.items():
27
27
  if name == group_name:
28
- group_index = i
28
+ group_id = i
29
29
  break
30
30
 
31
- if group_index is None:
31
+ if group_id is None:
32
32
  raise KeyError(
33
33
  f"Group name '{group_name}' was not found! Is the group defined?"
34
34
  )
35
35
 
36
- for tag_def in self.definitions:
37
- if tag_def.group_id == group_index and tag_def.tag_name == tag_name:
36
+ for tag_def in self._definitions[group_id]:
37
+ if tag_def.group_id == group_id and tag_def.tag_name == tag_name:
38
38
  return tag_def
39
39
 
40
40
  raise KeyError(
@@ -47,11 +47,7 @@ class TagConfig:
47
47
  if group_id not in self._group_map:
48
48
  return None
49
49
 
50
- for tag_def in self.definitions:
51
- if tag_def.group_id == group_id and tag_def.tag_index == tag_index:
52
- return tag_def
53
-
54
- return None
50
+ return self._definitions[group_id][tag_index]
55
51
 
56
52
 
57
53
  @dataclass(frozen=True)
@@ -1,4 +1,4 @@
1
- game: Tomodachi Life Living The Dream Demo
1
+ game: Tomodachi Life Living the Dream Demo
2
2
  tag_definitions:
3
3
  groups:
4
4
  0: System
@@ -15,39 +15,43 @@ tag_definitions:
15
15
  - name: Ruby
16
16
  group_id: 0
17
17
  tag_index: 0
18
- description: ''
18
+ description: 'Inserts RUBY text above the text.'
19
19
  parameters:
20
20
  - name: rt
21
- description: ''
21
+ description: 'The ruby character to insert.'
22
22
  datatype: string
23
23
  - name: Font
24
24
  group_id: 0
25
25
  tag_index: 1
26
- description: ''
26
+ description: 'Sets a new font style for the current text.'
27
27
  parameters:
28
28
  - name: name
29
- description: ''
29
+ description: 'The font name.'
30
30
  datatype: string
31
31
  - name: Scale
32
32
  group_id: 0
33
33
  tag_index: 2
34
- description: ''
34
+ description: 'Scales the text.'
35
35
  parameters:
36
36
  - name: percent
37
- description: ''
37
+ description: 'Relative scale as a %.'
38
38
  datatype: uint16
39
39
  - name: Color
40
40
  group_id: 0
41
41
  tag_index: 3
42
- description: ''
42
+ description: 'Sets the color of the text'
43
43
  parameters:
44
- - name: name
45
- description: ''
46
- datatype: string
44
+ - name: id
45
+ description: 'The id of the color.'
46
+ datatype: int16
47
+ - name: PageBreak
48
+ group_id: 0
49
+ tag_index: 4
50
+ description: 'Displays text on a new page in the same label.'
47
51
  - name: Reference
48
52
  group_id: 0
49
53
  tag_index: 5
50
- description: ''
54
+ description: 'References text from a different file.'
51
55
  parameters:
52
56
  - name: mltxt
53
57
  description: ''
@@ -512,6 +516,18 @@ tag_definitions:
512
516
  list_items:
513
517
  - PairDetail
514
518
  - PairSpoken
519
+ - name: RelationMeterRank
520
+ group_id: 2
521
+ tag_index: 21
522
+ description: ''
523
+ - name: BloodRelation
524
+ group_id: 2
525
+ tag_index: 22
526
+ description: ''
527
+ - name: BloodRelationLong
528
+ group_id: 2
529
+ tag_index: 23
530
+ description: ''
515
531
  - name: MapObject
516
532
  group_id: 2
517
533
  tag_index: 24
@@ -562,6 +578,10 @@ tag_definitions:
562
578
  list_items:
563
579
  - Valid
564
580
  - Invalid
581
+ - name: IslandType
582
+ group_id: 2
583
+ tag_index: 28
584
+ description: ''
565
585
  - name: RoommateGroup
566
586
  group_id: 2
567
587
  tag_index: 29
@@ -635,6 +655,10 @@ tag_definitions:
635
655
  list_items:
636
656
  - Valid
637
657
  - Invalid
658
+ - name: Travel
659
+ group_id: 2
660
+ tag_index: 33
661
+ description: ''
638
662
  - name: BookText
639
663
  group_id: 2
640
664
  tag_index: 34
@@ -646,6 +670,14 @@ tag_definitions:
646
670
  list_items:
647
671
  - Valid
648
672
  - Invalid
673
+ - name: WordAttrGrammaticality
674
+ group_id: 2
675
+ tag_index: 35
676
+ description: ''
677
+ - name: WordAttrCount
678
+ group_id: 2
679
+ tag_index: 36
680
+ description: ''
649
681
  - name: RandomSetUGCText
650
682
  group_id: 2
651
683
  tag_index: 37
@@ -818,6 +850,26 @@ tag_definitions:
818
850
  - ParticipantMii1
819
851
  - ParticipantMii2
820
852
  - ParticipantMii3
853
+ - name: PlayerNicknameCommon
854
+ group_id: 5
855
+ tag_index: 1
856
+ description: ''
857
+ - name: EmotionSadness
858
+ group_id: 6
859
+ tag_index: 0
860
+ description: ''
861
+ - name: EmotionAnger
862
+ group_id: 6
863
+ tag_index: 1
864
+ description: ''
865
+ - name: EmotionShout
866
+ group_id: 6
867
+ tag_index: 2
868
+ description: ''
869
+ - name: EmotionWhisper
870
+ group_id: 6
871
+ tag_index: 3
872
+ description: ''
821
873
  - name: Break
822
874
  group_id: 6
823
875
  tag_index: 4
@@ -933,6 +985,14 @@ tag_definitions:
933
985
  datatype: list
934
986
  list_items:
935
987
  - Emphasis
988
+ - name: LipSyncOff
989
+ group_id: 8
990
+ tag_index: 1
991
+ description: ''
992
+ - name: TelopOff
993
+ group_id: 8
994
+ tag_index: 2
995
+ description: ''
936
996
  - name: Pulldown
937
997
  group_id: 9
938
998
  tag_index: 0
@@ -954,6 +1014,10 @@ tag_definitions:
954
1014
  - name: Neuter
955
1015
  description: ''
956
1016
  datatype: string
1017
+ - name: RegisteredTrademark
1018
+ group_id: 9
1019
+ tag_index: 1
1020
+ description: ''
957
1021
  - name: AMPM
958
1022
  group_id: 100
959
1023
  tag_index: 0
@@ -1819,6 +1883,14 @@ tag_definitions:
1819
1883
  - ParticipantMii1
1820
1884
  - ParticipantMii2
1821
1885
  - ParticipantMii3
1886
+ - name: FocusTelopSubject
1887
+ group_id: 200
1888
+ tag_index: 16
1889
+ description: ''
1890
+ - name: FocusTelopSubjectOnePerson
1891
+ group_id: 200
1892
+ tag_index: 17
1893
+ description: ''
1822
1894
  - name: ThirdPersonPronoun
1823
1895
  group_id: 200
1824
1896
  tag_index: 18
@@ -2254,6 +2326,22 @@ tag_definitions:
2254
2326
  list_items:
2255
2327
  - Singular
2256
2328
  - Plural
2329
+ - name: DefArt
2330
+ group_id: 201
2331
+ tag_index: 1
2332
+ description: ''
2333
+ - name: IndefArt
2334
+ group_id: 201
2335
+ tag_index: 2
2336
+ description: ''
2337
+ - name: Cap
2338
+ group_id: 201
2339
+ tag_index: 3
2340
+ description: ''
2341
+ - name: Decap
2342
+ group_id: 201
2343
+ tag_index: 4
2344
+ description: ''
2257
2345
  - name: Gender
2258
2346
  group_id: 201
2259
2347
  tag_index: 5
@@ -2304,6 +2392,14 @@ tag_definitions:
2304
2392
  - name: 'No'
2305
2393
  description: ''
2306
2394
  datatype: string
2395
+ - name: Case
2396
+ group_id: 201
2397
+ tag_index: 9
2398
+ description: ''
2399
+ - name: Declension
2400
+ group_id: 201
2401
+ tag_index: 10
2402
+ description: ''
2307
2403
  - name: Elision
2308
2404
  group_id: 201
2309
2405
  tag_index: 11
@@ -2315,6 +2411,26 @@ tag_definitions:
2315
2411
  - name: Elision
2316
2412
  description: ''
2317
2413
  datatype: string
2414
+ - name: CapAll
2415
+ group_id: 201
2416
+ tag_index: 12
2417
+ description: ''
2418
+ - name: IgnoreCap
2419
+ group_id: 201
2420
+ tag_index: 13
2421
+ description: ''
2422
+ - name: CapNext
2423
+ group_id: 201
2424
+ tag_index: 14
2425
+ description: ''
2426
+ - name: DecapAll
2427
+ group_id: 201
2428
+ tag_index: 15
2429
+ description: ''
2430
+ - name: DecapHyphenated
2431
+ group_id: 201
2432
+ tag_index: 16
2433
+ description: ''
2318
2434
  - name: CountN
2319
2435
  group_id: 201
2320
2436
  tag_index: 17
@@ -2455,6 +2571,46 @@ tag_definitions:
2455
2571
  - name: NeuterPlural
2456
2572
  description: ''
2457
2573
  datatype: string
2574
+ - name: CapSP
2575
+ group_id: 201
2576
+ tag_index: 21
2577
+ description: ''
2578
+ - name: PrepositionDefArt_It_a
2579
+ group_id: 201
2580
+ tag_index: 22
2581
+ description: ''
2582
+ - name: PrepositionDefArt_It_da
2583
+ group_id: 201
2584
+ tag_index: 23
2585
+ description: ''
2586
+ - name: PrepositionDefArt_It_di
2587
+ group_id: 201
2588
+ tag_index: 24
2589
+ description: ''
2590
+ - name: PrepositionDefArt_It_in
2591
+ group_id: 201
2592
+ tag_index: 25
2593
+ description: ''
2594
+ - name: PrepositionDefArt_It_su
2595
+ group_id: 201
2596
+ tag_index: 26
2597
+ description: ''
2598
+ - name: PrepositionDefArt_Es_a
2599
+ group_id: 201
2600
+ tag_index: 27
2601
+ description: ''
2602
+ - name: PrepositionDefArt_Es_de
2603
+ group_id: 201
2604
+ tag_index: 28
2605
+ description: ''
2606
+ - name: PrepositionDefArt_Fr_a
2607
+ group_id: 201
2608
+ tag_index: 29
2609
+ description: ''
2610
+ - name: PrepositionDefArt_Fr_de
2611
+ group_id: 201
2612
+ tag_index: 30
2613
+ description: ''
2458
2614
  - name: CountClockHour
2459
2615
  group_id: 201
2460
2616
  tag_index: 31
@@ -2501,6 +2657,10 @@ tag_definitions:
2501
2657
  - name: Plural
2502
2658
  description: ''
2503
2659
  datatype: string
2660
+ - name: CapNextIfNeed
2661
+ group_id: 201
2662
+ tag_index: 33
2663
+ description: ''
2504
2664
  - name: AS
2505
2665
  group_id: 300
2506
2666
  tag_index: 0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "PyLibMS"
7
- version = "3.3.7"
7
+ version = "3.3.9"
8
8
  requires-python = ">=3.12"
9
9
  description = "Python library built for the libMessageStudio (LMS) proprietary file formats from Nintendo. Supports MSBT, MSBP, and soon to be MSBF."
10
10
  readme = "README.md"
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