bcsfe 3.5.0__tar.gz → 3.5.2__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 (212) hide show
  1. {bcsfe-3.5.0/src/bcsfe.egg-info → bcsfe-3.5.2}/PKG-INFO +1 -1
  2. {bcsfe-3.5.0 → bcsfe-3.5.2}/pyproject.toml +3 -0
  3. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/__init__.py +8 -3
  4. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/color.py +4 -0
  5. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/dialog_creator.py +59 -61
  6. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/basic_items.py +32 -16
  7. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/cat_editor.py +10 -4
  8. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/enemy_editor.py +5 -2
  9. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/event_tickets.py +4 -1
  10. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/map.py +1 -1
  11. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/max_all.py +20 -21
  12. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/rare_ticket_trade.py +1 -1
  13. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/file_dialog.py +1 -1
  14. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/main.py +2 -1
  15. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/__init__.py +70 -4
  16. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/battle/battle_items.py +1 -1
  17. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/battle/enemy.py +1 -1
  18. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/battle/slots.py +1 -1
  19. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/beacon_base.py +3 -3
  20. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/gatya.py +3 -3
  21. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/my_sale.py +3 -3
  22. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/talent_orbs.py +6 -3
  23. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/upgrade.py +8 -4
  24. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/gamoto/base_materials.py +3 -1
  25. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/gamoto/cat_shrine.py +8 -2
  26. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/gamoto/gamatoto.py +8 -2
  27. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/gamoto/ototo.py +7 -7
  28. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/event.py +18 -6
  29. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/story.py +57 -42
  30. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/bc_csv.py +2 -2
  31. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/config.py +1 -1
  32. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/path.py +8 -5
  33. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/event_data.py +1 -1
  34. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/game_data_getter.py +2 -1
  35. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/request.py +1 -1
  36. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/server_handler.py +2 -4
  37. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/input.properties +1 -0
  38. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/save.properties +2 -0
  39. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/map.properties +2 -2
  40. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/map.properties +1 -1
  41. {bcsfe-3.5.0 → bcsfe-3.5.2/src/bcsfe.egg-info}/PKG-INFO +1 -1
  42. {bcsfe-3.5.0 → bcsfe-3.5.2}/LICENSE +0 -0
  43. {bcsfe-3.5.0 → bcsfe-3.5.2}/MANIFEST.in +0 -0
  44. {bcsfe-3.5.0 → bcsfe-3.5.2}/README.md +0 -0
  45. {bcsfe-3.5.0 → bcsfe-3.5.2}/setup.cfg +0 -0
  46. {bcsfe-3.5.0 → bcsfe-3.5.2}/setup.py +0 -0
  47. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/__main__.py +0 -0
  48. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/__init__.py +0 -0
  49. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/color_hex.py +0 -0
  50. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/__init__.py +0 -0
  51. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/aku_realm.py +0 -0
  52. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/clear_tutorial.py +0 -0
  53. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/fixes.py +0 -0
  54. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/edits/storage.py +0 -0
  55. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/feature_handler.py +0 -0
  56. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/recent_saves.py +0 -0
  57. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/save_management.py +0 -0
  58. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/cli/server_cli.py +0 -0
  59. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/country_code.py +0 -0
  60. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/crypto.py +0 -0
  61. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/__init__.py +0 -0
  62. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/battle/__init__.py +0 -0
  63. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/battle/cleared_slots.py +0 -0
  64. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/__init__.py +0 -0
  65. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/cat.py +0 -0
  66. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/drop_chara.py +0 -0
  67. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/gambling.py +0 -0
  68. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/gatya_item.py +0 -0
  69. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/item_pack.py +0 -0
  70. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/login_bonuses.py +0 -0
  71. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/matatabi.py +0 -0
  72. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/medals.py +0 -0
  73. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/mission.py +0 -0
  74. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/nyanko_club.py +0 -0
  75. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/officer_pass.py +0 -0
  76. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/playtime.py +0 -0
  77. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/powerup.py +0 -0
  78. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/scheme_items.py +0 -0
  79. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/special_skill.py +0 -0
  80. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/stamp.py +0 -0
  81. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/unlock_popups.py +0 -0
  82. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/catbase/user_rank_rewards.py +0 -0
  83. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/gamoto/__init__.py +0 -0
  84. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/gamoto/catamins.py +0 -0
  85. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/localizable.py +0 -0
  86. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/__init__.py +0 -0
  87. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/aku.py +0 -0
  88. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/challenge.py +0 -0
  89. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/chapters.py +0 -0
  90. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/dojo.py +0 -0
  91. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/enigma.py +0 -0
  92. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/ex_stage.py +0 -0
  93. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/gauntlets.py +0 -0
  94. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/item_reward_stage.py +0 -0
  95. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/legend_quest.py +0 -0
  96. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/map_names.py +0 -0
  97. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/map_option.py +0 -0
  98. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/map_reset.py +0 -0
  99. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/outbreaks.py +0 -0
  100. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/timed_score.py +0 -0
  101. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/tower.py +0 -0
  102. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/uncanny.py +0 -0
  103. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game/map/zero_legends.py +0 -0
  104. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/game_version.py +0 -0
  105. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/__init__.py +0 -0
  106. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/adb_handler.py +0 -0
  107. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/command.py +0 -0
  108. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/data.py +0 -0
  109. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/git_handler.py +0 -0
  110. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/json_file.py +0 -0
  111. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/root_handler.py +0 -0
  112. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/save.py +0 -0
  113. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/thread_helper.py +0 -0
  114. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/waydroid.py +0 -0
  115. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/io/yaml.py +0 -0
  116. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/locale_handler.py +0 -0
  117. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/log.py +0 -0
  118. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/max_value_helper.py +0 -0
  119. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/__init__.py +0 -0
  120. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/client_info.py +0 -0
  121. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/headers.py +0 -0
  122. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/managed_item.py +0 -0
  123. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/server/updater.py +0 -0
  124. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/core/theme_handler.py +0 -0
  125. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/config.properties +0 -0
  126. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/files.properties +0 -0
  127. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/locale.properties +0 -0
  128. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/main.properties +0 -0
  129. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/server.properties +0 -0
  130. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/theme.properties +0 -0
  131. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/core/updater.properties +0 -0
  132. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/bannable_items.properties +0 -0
  133. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/cats.properties +0 -0
  134. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/enemy.properties +0 -0
  135. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/fixes.properties +0 -0
  136. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/gambling.properties +0 -0
  137. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/gamototo.properties +0 -0
  138. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/gatya.properties +0 -0
  139. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/gold_pass.properties +0 -0
  140. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/items.properties +0 -0
  141. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/medals.properties +0 -0
  142. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/missions.properties +0 -0
  143. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/playtime.properties +0 -0
  144. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/scheme_items.properties +0 -0
  145. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/special_skills.properties +0 -0
  146. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/talent_orbs.properties +0 -0
  147. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/treasures.properties +0 -0
  148. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/en/edits/user_rank.properties +0 -0
  149. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/config.properties +0 -0
  150. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/files.properties +0 -0
  151. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/input.properties +0 -0
  152. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/locale.properties +0 -0
  153. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/main.properties +0 -0
  154. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/save.properties +0 -0
  155. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/server.properties +0 -0
  156. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/theme.properties +0 -0
  157. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/core/updater.properties +0 -0
  158. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/bannable_items.properties +0 -0
  159. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/cats.properties +0 -0
  160. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/enemy.properties +0 -0
  161. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/fixes.properties +0 -0
  162. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/gambling.properties +0 -0
  163. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/gamototo.properties +0 -0
  164. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/gatya.properties +0 -0
  165. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/gold_pass.properties +0 -0
  166. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/items.properties +0 -0
  167. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/map.properties +0 -0
  168. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/medals.properties +0 -0
  169. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/missions.properties +0 -0
  170. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/playtime.properties +0 -0
  171. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/scheme_items.properties +0 -0
  172. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/special_skills.properties +0 -0
  173. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/talent_orbs.properties +0 -0
  174. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/treasures.properties +0 -0
  175. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/edits/user_rank.properties +0 -0
  176. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/tw/metadata.json +0 -0
  177. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/config.properties +0 -0
  178. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/files.properties +0 -0
  179. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/input.properties +0 -0
  180. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/locale.properties +0 -0
  181. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/main.properties +0 -0
  182. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/save.properties +0 -0
  183. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/server.properties +0 -0
  184. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/theme.properties +0 -0
  185. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/core/updater.properties +0 -0
  186. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/bannable_items.properties +0 -0
  187. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/cats.properties +0 -0
  188. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/enemy.properties +0 -0
  189. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/fixes.properties +0 -0
  190. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/gambling.properties +0 -0
  191. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/gamototo.properties +0 -0
  192. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/gatya.properties +0 -0
  193. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/gold_pass.properties +0 -0
  194. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/items.properties +0 -0
  195. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/medals.properties +0 -0
  196. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/missions.properties +0 -0
  197. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/playtime.properties +0 -0
  198. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/scheme_items.properties +0 -0
  199. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/special_skills.properties +0 -0
  200. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/talent_orbs.properties +0 -0
  201. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/treasures.properties +0 -0
  202. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/edits/user_rank.properties +0 -0
  203. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/locales/vi/metadata.json +0 -0
  204. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/themes/default.json +0 -0
  205. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/files/themes/discord.json +0 -0
  206. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe/py.typed +0 -0
  207. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe.egg-info/SOURCES.txt +0 -0
  208. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe.egg-info/dependency_links.txt +0 -0
  209. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe.egg-info/entry_points.txt +0 -0
  210. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe.egg-info/requires.txt +0 -0
  211. {bcsfe-3.5.0 → bcsfe-3.5.2}/src/bcsfe.egg-info/top_level.txt +0 -0
  212. {bcsfe-3.5.0 → bcsfe-3.5.2}/tests/test_parse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bcsfe
3
- Version: 3.5.0
3
+ Version: 3.5.2
4
4
  Summary: A save file editor for The Battle Cats
5
5
  Author: fieryhenry
6
6
  License-Expression: GPL-3.0-or-later
@@ -33,5 +33,8 @@ version = { attr = "bcsfe.__version__" }
33
33
  [tool.setuptools]
34
34
  package-dir = { "" = "src" }
35
35
 
36
+ [tool.pyright]
37
+ typeCheckingMode = "strict"
38
+
36
39
  [project.scripts]
37
40
  bcsfe = "bcsfe:run"
@@ -1,15 +1,20 @@
1
- __version__ = "3.5.0"
1
+ from __future__ import annotations
2
+
3
+ __version__ = "3.5.2"
2
4
 
3
5
  __app_name__ = "bcsfe"
4
6
 
5
- from importlib.resources.abc import Traversable
7
+ try:
8
+ from importlib.resources.abc import Traversable
9
+ except ImportError:
10
+ pass
6
11
 
7
12
  from bcsfe import core, cli
8
13
 
9
14
  __all__ = ["core", "cli"]
10
15
 
11
16
 
12
- def copy_to_data_dir(base_path: Traversable, path: Traversable):
17
+ def copy_to_data_dir(base_path: "Traversable", path: "Traversable"):
13
18
  if path.is_dir():
14
19
  for item in path.iterdir():
15
20
  copy_to_data_dir(base_path, item)
@@ -3,6 +3,10 @@ from typing import Any
3
3
  from bcsfe import core
4
4
  from bcsfe.cli import color_hex
5
5
  import enum
6
+ import os
7
+
8
+ if os.name == "nt":
9
+ os.system("color")
6
10
 
7
11
 
8
12
  class ColorHex(enum.Enum):
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from collections.abc import Callable, Sequence
2
+ from collections.abc import Callable
3
3
  from typing import Any, Generic, TypeVar
4
4
 
5
5
  from bcsfe import core
@@ -146,16 +146,12 @@ def yes_no_raw(dialog: str) -> bool | None:
146
146
 
147
147
 
148
148
  def range_multi_input_key(
149
- dialog: str, max: MaxValue | int, min: int = 0, escape: bool = True, **kwargs: Any
149
+ dialog: str, max: MaxValue, min: int = 0, escape: bool = True, **kwargs: Any
150
150
  ) -> list[int] | None:
151
151
  return range_multi_input_raw(core.localize(dialog, escape, **kwargs), max, min)
152
152
 
153
153
 
154
- def range_basic_parse(
155
- usr_input: str, max: MaxValue | int, min: int = 0
156
- ) -> list[int] | None:
157
- if isinstance(max, int):
158
- max = MaxValue.specific(max)
154
+ def range_basic_parse(usr_input: str, max: MaxValue, min: int = 0) -> list[int] | None:
159
155
  nums: list[int] = []
160
156
  for part in usr_input.split(" "):
161
157
  if part.isdigit():
@@ -164,8 +160,8 @@ def range_basic_parse(
164
160
  color.color_print_key("invalid_input_int", min=min, max=max.max)
165
161
  return None
166
162
  nums.append(int(part))
167
- elif "," in part:
168
- min_v, max_v = part.split(",", 1)
163
+ elif "-" in part:
164
+ min_v, max_v = part.split("-", 1)
169
165
  if not min_v.isdigit() or not max_v.isdigit():
170
166
  return None
171
167
  min_i = int(min_v)
@@ -182,11 +178,7 @@ def range_basic_parse(
182
178
  return nums
183
179
 
184
180
 
185
- def range_multi_input_raw(
186
- dialog: str, max: MaxValue | int, min: int = 0
187
- ) -> list[int] | None:
188
- if isinstance(max, int):
189
- max = MaxValue.specific(max)
181
+ def range_multi_input_raw(dialog: str, max: MaxValue, min: int = 0) -> list[int] | None:
190
182
  usr_input = color.color_input(dialog)
191
183
  if usr_input == core.localize("quit_key"):
192
184
  return None
@@ -199,8 +191,8 @@ def range_multi_input_raw(
199
191
  color.color_print_key("invalid_input_int", min=min, max=max.max)
200
192
  continue
201
193
  nums.append(int(part))
202
- elif "," in part:
203
- min_v, max_v = part.split(",", 1)
194
+ elif "-" in part:
195
+ min_v, max_v = part.split("-", 1)
204
196
  if not min_v.isdigit() or not max_v.isdigit():
205
197
  color.color_print_key("invalid_range", val=part)
206
198
  continue
@@ -416,45 +408,64 @@ def basic_keys_pick_key_entry(
416
408
 
417
409
 
418
410
  class MaxValue:
419
- def __init__(self, max: int, show: bool = True):
411
+ def __init__(self, max: int, bits: int, show: bool = True):
420
412
  self.max = max
421
413
  self.show = show
414
+ self.bits = bits
422
415
 
423
416
  def hide_max(self) -> MaxValue:
424
417
  self.show = False
425
418
  return self
426
419
 
427
420
  @staticmethod
428
- def specific(max: int) -> MaxValue:
429
- return MaxValue(max)
421
+ def always_cap(max: int) -> MaxValue:
422
+ return MaxValue(max, 32)
423
+
424
+ @staticmethod
425
+ def specific(max: int, bits: int) -> MaxValue:
426
+ if core.core_data.config.get_bool(core.ConfigKey.DISABLE_MAXES):
427
+ return MaxValue.none(bits).hide_max()
428
+ return MaxValue(max, bits)
430
429
 
431
430
  @staticmethod
432
431
  def none(bits: int) -> MaxValue:
433
- return MaxValue((2**bits) - 1)
432
+ return MaxValue((2**bits) - 1, bits)
433
+
434
+ @staticmethod
435
+ def new_bits(max: int | None, bits: int) -> MaxValue:
436
+ if max is None:
437
+ return MaxValue.none(bits)
438
+ return MaxValue.specific(max, bits)
439
+
440
+ @staticmethod
441
+ def i32(max: int | None = None) -> MaxValue:
442
+ return MaxValue.new_bits(max, 31)
434
443
 
435
444
  @staticmethod
436
- def i32() -> MaxValue:
437
- return MaxValue.none(31)
445
+ def u32(max: int | None = None) -> MaxValue:
446
+ return MaxValue.new_bits(max, 32)
438
447
 
439
448
  @staticmethod
440
- def u32() -> MaxValue:
441
- return MaxValue.none(32)
449
+ def i16(max: int | None = None) -> MaxValue:
450
+ return MaxValue.new_bits(max, 15)
442
451
 
443
452
  @staticmethod
444
- def i16() -> MaxValue:
445
- return MaxValue.none(15)
453
+ def u16(max: int | None = None) -> MaxValue:
454
+ return MaxValue.new_bits(max, 16)
446
455
 
447
456
  @staticmethod
448
- def u16() -> MaxValue:
449
- return MaxValue.none(16)
457
+ def i8(max: int | None = None) -> MaxValue:
458
+ return MaxValue.new_bits(max, 7)
459
+
460
+ @staticmethod
461
+ def u8(max: int | None = None) -> MaxValue:
462
+ return MaxValue.new_bits(max, 8)
450
463
 
451
464
  def clamp(self, v: int) -> int:
452
465
  return min(self.max, v)
453
466
 
454
467
 
455
- def edit_int_raw(item_name: str, current_value: int, max: MaxValue | int) -> int:
456
- if isinstance(max, int):
457
- max = MaxValue.specific(max)
468
+ def edit_int_raw(item_name: str, current_value: int, max: MaxValue) -> int:
458
469
  if max.show:
459
470
  key = "input"
460
471
  else:
@@ -481,7 +492,7 @@ def edit_str_raw(item_name: str, current_value: str) -> str:
481
492
 
482
493
  def int_input_key(
483
494
  dialog: str,
484
- _max: MaxValue | int,
495
+ _max: MaxValue,
485
496
  min: int = 0,
486
497
  default: int | None = None,
487
498
  auto_clamp: bool = False,
@@ -499,13 +510,11 @@ def str_input_key(dialog: str, escape: bool = True, **kwargs: Any) -> str | None
499
510
 
500
511
  def int_input_raw(
501
512
  dialog: str,
502
- _max: MaxValue | int,
513
+ _max: MaxValue,
503
514
  _min: int = 0,
504
515
  default: int | None = None,
505
516
  auto_clamp: bool = False,
506
517
  ) -> int | None:
507
- if isinstance(_max, int):
508
- _max = MaxValue.specific(_max)
509
518
  quit_key = core.localize("quit_key")
510
519
  while True:
511
520
  inp = color.color_input(dialog)
@@ -542,7 +551,7 @@ def str_input_raw(dialog: str) -> str | None:
542
551
  def edit_int_key(
543
552
  item_key: str,
544
553
  current_value: int,
545
- max: MaxValue | int,
554
+ max: MaxValue,
546
555
  escape: bool = True,
547
556
  **kwargs: Any,
548
557
  ) -> int:
@@ -563,13 +572,11 @@ class CumulativeMax:
563
572
  self.max = max
564
573
 
565
574
  @staticmethod
566
- def specific(max: int) -> CumulativeMax:
567
- return CumulativeMax(MaxValue.specific(max))
575
+ def specific(max: int, bits: int) -> CumulativeMax:
576
+ return CumulativeMax(MaxValue.specific(max, bits))
568
577
 
569
578
  @staticmethod
570
- def new(max: int | MaxValue):
571
- if isinstance(max, int):
572
- return CumulativeMax.specific(max)
579
+ def new(max: MaxValue):
573
580
  return CumulativeMax(max)
574
581
 
575
582
  def get(self, current_values: list[int], ids: list[int] | int) -> MaxValue:
@@ -580,7 +587,7 @@ class CumulativeMax:
580
587
  for id in ids:
581
588
  v += current_values[id]
582
589
 
583
- return MaxValue.specific(self.max.max - sum(current_values) + v)
590
+ return MaxValue.specific(self.max.max - sum(current_values) + v, self.max.bits)
584
591
 
585
592
 
586
593
  class MultiMax:
@@ -588,16 +595,8 @@ class MultiMax:
588
595
  self.maxes = maxes
589
596
 
590
597
  @staticmethod
591
- def new(maxes: Sequence[MaxValue | int]) -> MultiMax:
592
- new: list[MaxValue] = []
593
-
594
- for m in maxes:
595
- if isinstance(m, int):
596
- new.append(MaxValue.specific(m))
597
- else:
598
- new.append(m)
599
-
600
- return MultiMax(new)
598
+ def new(maxes: list[MaxValue]) -> MultiMax:
599
+ return MultiMax(maxes)
601
600
 
602
601
  def get(self, id: int) -> MaxValue | None:
603
602
  if id < 0 or id >= len(self.maxes):
@@ -605,7 +604,7 @@ class MultiMax:
605
604
  return self.maxes[id]
606
605
 
607
606
  def maximal(self, ids: list[int]) -> MaxValue:
608
- m = MaxValue.specific(0)
607
+ m = MaxValue.specific(0, 0)
609
608
  for id in ids:
610
609
  m_v = self.get(id)
611
610
  if m_v is None:
@@ -620,7 +619,7 @@ def edit_ints_key(
620
619
  group_name: str,
621
620
  item_names: list[str],
622
621
  current_values: list[int],
623
- max: MultiMax | CumulativeMax | MaxValue | int,
622
+ max: MultiMax | CumulativeMax | MaxValue,
624
623
  escape: bool = True,
625
624
  **kwargs: Any,
626
625
  ) -> list[int]:
@@ -633,7 +632,7 @@ def edit_ints_raw(
633
632
  group_name: str,
634
633
  item_names: list[str],
635
634
  current_values: list[int],
636
- max: MultiMax | CumulativeMax | MaxValue | int,
635
+ max: MultiMax | CumulativeMax | MaxValue,
637
636
  ) -> list[int]:
638
637
  entries = multi_select_indexes_key(
639
638
  [
@@ -672,7 +671,7 @@ def edit_ints_raw(
672
671
 
673
672
  def edit_individual(
674
673
  current_values: list[int],
675
- max: MaxValue | MultiMax | CumulativeMax | int,
674
+ max: MaxValue | MultiMax | CumulativeMax,
676
675
  entries: list[int],
677
676
  names: list[str],
678
677
  ):
@@ -693,18 +692,17 @@ def edit_individual(
693
692
 
694
693
  def edit_many(
695
694
  current_values: list[int],
696
- max: MaxValue | MultiMax | CumulativeMax | int,
695
+ max: MaxValue | MultiMax | CumulativeMax,
697
696
  entries: list[int],
698
697
  group_name: str,
699
698
  names: list[str],
700
699
  ):
701
- if isinstance(max, int):
702
- max = MaxValue.specific(max)
703
-
704
700
  if isinstance(max, MultiMax):
705
701
  _max = max.maximal(entries)
706
702
  elif isinstance(max, CumulativeMax):
707
- _max = MaxValue.specific(max.get(current_values, entries).max // len(entries))
703
+ _max = MaxValue.specific(
704
+ max.get(current_values, entries).max // len(entries), max.max.bits
705
+ )
708
706
  else:
709
707
  _max = max
710
708
  val = int_input_key(
@@ -30,7 +30,7 @@ class BasicItems:
30
30
  save_file.catfood = dialog_creator.edit_int_raw(
31
31
  BasicItems.get_name(name, "catfood"),
32
32
  save_file.catfood,
33
- core.core_data.max_value_manager.catfood,
33
+ dialog_creator.MaxValue.i32(core.core_data.max_value_manager.catfood),
34
34
  )
35
35
  change = save_file.catfood - original_amount
36
36
  core.BackupMetaData(save_file).add_managed_item(
@@ -43,7 +43,7 @@ class BasicItems:
43
43
  save_file.xp = dialog_creator.edit_int_raw(
44
44
  BasicItems.get_name(name, "xp"),
45
45
  save_file.xp,
46
- core.core_data.max_value_manager.xp,
46
+ dialog_creator.MaxValue.i32(core.core_data.max_value_manager.xp),
47
47
  )
48
48
 
49
49
  @staticmethod
@@ -52,7 +52,9 @@ class BasicItems:
52
52
  save_file.normal_tickets = dialog_creator.edit_int_raw(
53
53
  BasicItems.get_name(name, "normal_tickets"),
54
54
  save_file.normal_tickets,
55
- core.core_data.max_value_manager.normal_tickets,
55
+ dialog_creator.MaxValue.i32(
56
+ core.core_data.max_value_manager.normal_tickets
57
+ ),
56
58
  )
57
59
 
58
60
  @staticmethod
@@ -62,7 +64,9 @@ class BasicItems:
62
64
  save_file.hundred_million_ticket = dialog_creator.edit_int_raw(
63
65
  BasicItems.get_name(name, "100_million_tickets"),
64
66
  save_file.hundred_million_ticket,
65
- core.core_data.max_value_manager.hundred_million_tickets,
67
+ dialog_creator.MaxValue.i32(
68
+ core.core_data.max_value_manager.hundred_million_tickets
69
+ ),
66
70
  )
67
71
 
68
72
  @staticmethod
@@ -102,7 +106,7 @@ class BasicItems:
102
106
  save_file.rare_tickets = dialog_creator.edit_int_raw(
103
107
  BasicItems.get_name(name, "rare_tickets"),
104
108
  save_file.rare_tickets,
105
- core.core_data.max_value_manager.rare_tickets,
109
+ dialog_creator.MaxValue.i32(core.core_data.max_value_manager.rare_tickets),
106
110
  )
107
111
  change = save_file.rare_tickets - original_amount
108
112
  core.BackupMetaData(save_file).add_managed_item(
@@ -125,7 +129,9 @@ class BasicItems:
125
129
  save_file.platinum_tickets = dialog_creator.edit_int_raw(
126
130
  BasicItems.get_name(name, "platinum_tickets"),
127
131
  save_file.platinum_tickets,
128
- core.core_data.max_value_manager.platinum_tickets,
132
+ dialog_creator.MaxValue.i32(
133
+ core.core_data.max_value_manager.platinum_tickets
134
+ ),
129
135
  )
130
136
  change = save_file.platinum_tickets - original_amount
131
137
  core.BackupMetaData(save_file).add_managed_item(
@@ -142,7 +148,9 @@ class BasicItems:
142
148
  save_file.legend_tickets = dialog_creator.edit_int_raw(
143
149
  BasicItems.get_name(name, "legend_tickets"),
144
150
  save_file.legend_tickets,
145
- core.core_data.max_value_manager.legend_tickets,
151
+ dialog_creator.MaxValue.i32(
152
+ core.core_data.max_value_manager.legend_tickets
153
+ ),
146
154
  )
147
155
  change = save_file.legend_tickets - original_amount
148
156
  core.BackupMetaData(save_file).add_managed_item(
@@ -161,7 +169,7 @@ class BasicItems:
161
169
  save_file.platinum_shards = dialog_creator.edit_int_raw(
162
170
  BasicItems.get_name(name, "platinum_shards"),
163
171
  save_file.platinum_shards,
164
- max_value,
172
+ dialog_creator.MaxValue.i32(max_value),
165
173
  )
166
174
 
167
175
  @staticmethod
@@ -170,7 +178,7 @@ class BasicItems:
170
178
  save_file.np = dialog_creator.edit_int_raw(
171
179
  BasicItems.get_name(name, "np"),
172
180
  save_file.np,
173
- core.core_data.max_value_manager.np,
181
+ dialog_creator.MaxValue.i32(core.core_data.max_value_manager.np),
174
182
  )
175
183
 
176
184
  @staticmethod
@@ -179,7 +187,7 @@ class BasicItems:
179
187
  save_file.leadership = dialog_creator.edit_int_raw(
180
188
  BasicItems.get_name(name, "leadership"),
181
189
  save_file.leadership,
182
- core.core_data.max_value_manager.leadership,
190
+ dialog_creator.MaxValue.i16(core.core_data.max_value_manager.leadership),
183
191
  )
184
192
 
185
193
  @staticmethod
@@ -208,7 +216,7 @@ class BasicItems:
208
216
  "catamins",
209
217
  names,
210
218
  save_file.catamins,
211
- core.core_data.max_value_manager.catamins,
219
+ dialog_creator.MaxValue.i32(core.core_data.max_value_manager.catamins),
212
220
  )
213
221
  save_file.catamins = values
214
222
 
@@ -231,7 +239,7 @@ class BasicItems:
231
239
  "catseyes",
232
240
  names,
233
241
  save_file.catseyes,
234
- core.core_data.max_value_manager.catseyes,
242
+ dialog_creator.MaxValue.i32(core.core_data.max_value_manager.catseyes),
235
243
  )
236
244
  save_file.catseyes = values
237
245
 
@@ -256,7 +264,9 @@ class BasicItems:
256
264
  "treasure_chests",
257
265
  names,
258
266
  save_file.treasure_chests,
259
- core.core_data.max_value_manager.treasure_chests,
267
+ dialog_creator.MaxValue.i32(
268
+ core.core_data.max_value_manager.treasure_chests
269
+ ),
260
270
  )
261
271
  save_file.treasure_chests = values
262
272
 
@@ -285,9 +295,13 @@ class BasicItems:
285
295
 
286
296
  if save_file.game_version < 110400:
287
297
  max_value = core.core_data.max_value_manager.catfruit_old
288
- max = dialog_creator.CumulativeMax.new(max_value)
298
+ max = dialog_creator.CumulativeMax.new(
299
+ dialog_creator.MaxValue.i32(max_value)
300
+ )
289
301
  else:
290
- max_value = core.core_data.max_value_manager.catfruit_new
302
+ max_value = dialog_creator.MaxValue.i32(
303
+ core.core_data.max_value_manager.catfruit_new
304
+ )
291
305
  max = max_value
292
306
 
293
307
  names = names[: len(save_file.catfruit)]
@@ -371,7 +385,9 @@ class BasicItems:
371
385
  "labyrinth_medals",
372
386
  names,
373
387
  save_file.labyrinth_medals,
374
- core.core_data.max_value_manager.labyrinth_medals,
388
+ dialog_creator.MaxValue.i32(
389
+ core.core_data.max_value_manager.labyrinth_medals
390
+ ),
375
391
  )
376
392
  save_file.labyrinth_medals = values
377
393
 
@@ -114,7 +114,9 @@ class CatEditor:
114
114
  return current_cats, False
115
115
 
116
116
  if current_cats:
117
- mode_id = dialog_creator.int_input_key("and_mode_q", 3)
117
+ mode_id = dialog_creator.int_input_key(
118
+ "and_mode_q", dialog_creator.MaxValue.always_cap(3)
119
+ )
118
120
  if mode_id is None:
119
121
  mode = SelectMode.OR
120
122
  elif mode_id == 1:
@@ -138,7 +140,8 @@ class CatEditor:
138
140
 
139
141
  def select_id(self) -> list[core.Cat] | None:
140
142
  cat_ids = dialog_creator.range_multi_input_key(
141
- "enter_cat_ids", len(self.save_file.cats.cats) - 1
143
+ "enter_cat_ids",
144
+ dialog_creator.MaxValue.always_cap(len(self.save_file.cats.cats) - 1),
142
145
  )
143
146
  if cat_ids is None:
144
147
  return None
@@ -326,7 +329,8 @@ class CatEditor:
326
329
  .add_new_key(
327
330
  "by_id",
328
331
  lambda _: dialog_creator.range_multi_input_key(
329
- "select_gatya_banner", len(gset) - 1
332
+ "select_gatya_banner",
333
+ dialog_creator.MaxValue.always_cap(len(gset) - 1),
330
334
  ),
331
335
  )
332
336
  .add_new_key("by_name", lambda _: self.select_gatya_banner_name()),
@@ -570,7 +574,9 @@ class CatEditor:
570
574
  "talents",
571
575
  talent_names,
572
576
  current_levels,
573
- dialog_creator.MultiMax.new(max_levels),
577
+ dialog_creator.MultiMax.new(
578
+ [dialog_creator.MaxValue.i32(max_level) for max_level in max_levels]
579
+ ),
574
580
  )
575
581
  current_levels = values
576
582
  for i, id in enumerate(ids):
@@ -55,7 +55,9 @@ class EnemyEditor:
55
55
  return None
56
56
 
57
57
  if current_enemies:
58
- mode_id = dialog_creator.int_input_key("and_mode_q", 3)
58
+ mode_id = dialog_creator.int_input_key(
59
+ "and_mode_q", dialog_creator.MaxValue.always_cap(3)
60
+ )
59
61
  if mode_id is None:
60
62
  mode = SelectMode.OR
61
63
  elif mode_id == 1:
@@ -101,7 +103,8 @@ class EnemyEditor:
101
103
 
102
104
  def select_id(self) -> list[core.Enemy] | None:
103
105
  enemy_ids = dialog_creator.range_multi_input_key(
104
- "enter_enemy_ids", len(self.save_file.enemy_guide) - 1
106
+ "enter_enemy_ids",
107
+ dialog_creator.MaxValue.always_cap(len(self.save_file.enemy_guide) - 1),
105
108
  )
106
109
  if enemy_ids is None:
107
110
  return None
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
  from bcsfe import cli, core
3
+ from bcsfe.cli import dialog_creator
3
4
  from bcsfe.core.game.catbase.gatya import GatyaEventType
4
5
  from bcsfe.core.server.event_data import split_hhmm, split_yyyymmdd
5
6
 
@@ -108,7 +109,9 @@ class EventTickets:
108
109
  "event_tickets",
109
110
  event_names,
110
111
  values,
111
- max=core.core_data.max_value_manager.event_tickets,
112
+ max=dialog_creator.MaxValue.i32(
113
+ core.core_data.max_value_manager.event_tickets
114
+ ),
112
115
  )
113
116
 
114
117
  for (event_item, gset, gatya_item), value in zip(event_ticket_items, values):
@@ -490,7 +490,7 @@ def edit_chapters2_progress(
490
490
  if map_option is None:
491
491
  return None
492
492
 
493
- if clear_all == 0:
493
+ if clear_all:
494
494
  max_stars = get_max_max_stars(
495
495
  map_option, base_index, map_choices, chapters, type
496
496
  )
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
3
  from bcsfe import core
5
4
 
6
5
 
@@ -104,23 +103,23 @@ def max_normal_tickets(save_file: core.SaveFile):
104
103
  save_file.normal_tickets = core.core_data.max_value_manager.normal_tickets
105
104
 
106
105
 
107
- def max_all(save_file: core.SaveFile):
108
- maxes = core.core_data.max_value_manager
109
- features: dict[str, Callable[[core.SaveFile], None]] = {
110
- "catfood": max_catfood,
111
- "xp": max_xp,
112
- "normal_tickets": max_normal_tickets,
113
- "rare_tickets": max_rare_tickets,
114
- "platinum_tickets": max_plat_tickets,
115
- "legend_tickets": max_legend_tickets,
116
- "platinum_shards": max_plat_shards,
117
- "np": max_np,
118
- "leadership": max_leadership,
119
- "battle_items": max_battle_items,
120
- "catseyes": max_catseyes,
121
- "catamins": max_catamins,
122
- "labyrinth_medals": max_labyrinth_medals,
123
- "100_million_ticket": max_100_million_ticket,
124
- "treasure_chests": max_treasure_chests,
125
- }
126
- # TODO: finish
106
+ # def max_all(save_file: core.SaveFile):
107
+ # maxes = core.core_data.max_value_manager
108
+ # features: dict[str, Callable[[core.SaveFile], None]] = {
109
+ # "catfood": max_catfood,
110
+ # "xp": max_xp,
111
+ # "normal_tickets": max_normal_tickets,
112
+ # "rare_tickets": max_rare_tickets,
113
+ # "platinum_tickets": max_plat_tickets,
114
+ # "legend_tickets": max_legend_tickets,
115
+ # "platinum_shards": max_plat_shards,
116
+ # "np": max_np,
117
+ # "leadership": max_leadership,
118
+ # "battle_items": max_battle_items,
119
+ # "catseyes": max_catseyes,
120
+ # "catamins": max_catamins,
121
+ # "labyrinth_medals": max_labyrinth_medals,
122
+ # "100_million_ticket": max_100_million_ticket,
123
+ # "treasure_chests": max_treasure_chests,
124
+ # }
125
+ # TODO: finish
@@ -17,7 +17,7 @@ class RareTicketTrade:
17
17
  return
18
18
  to_add = dialog_creator.int_input_key(
19
19
  "rare_ticket_trade_enter",
20
- max_amount,
20
+ dialog_creator.MaxValue.i32(max_amount),
21
21
  max=max_amount,
22
22
  current=current_amount,
23
23
  )
@@ -49,7 +49,7 @@ class FileDialog:
49
49
 
50
50
  files_str_ls = [file.basename() for file in files]
51
51
 
52
- dialog_creator.single_select_key(
52
+ return dialog_creator.single_select_key(
53
53
  dialog_creator.Actions[Optional[str]]
54
54
  .new()
55
55
  .add_new_raw(files_str_ls, lambda index: files[index].to_str())
@@ -13,6 +13,7 @@ from bcsfe.cli import (
13
13
  dialog_creator,
14
14
  )
15
15
  from bcsfe import core
16
+ import json
16
17
 
17
18
 
18
19
  class Main:
@@ -289,7 +290,7 @@ class Main:
289
290
  return None
290
291
  try:
291
292
  json_data = core.JsonFile.from_data(path.read()).as_object()
292
- except (core.JSONDecodeError, UnicodeDecodeError):
293
+ except (json.JSONDecodeError, UnicodeDecodeError):
293
294
  color.color_print_key("parse_json_fail")
294
295
  return None
295
296
  try: