bcsfe 3.3.0__tar.gz → 3.5.0__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.
- bcsfe-3.5.0/MANIFEST.in +1 -0
- {bcsfe-3.3.0/src/bcsfe.egg-info → bcsfe-3.5.0}/PKG-INFO +8 -7
- {bcsfe-3.3.0 → bcsfe-3.5.0}/README.md +7 -3
- {bcsfe-3.3.0 → bcsfe-3.5.0}/pyproject.toml +1 -9
- bcsfe-3.5.0/src/bcsfe/__init__.py +35 -0
- bcsfe-3.5.0/src/bcsfe/__main__.py +102 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/__init__.py +2 -0
- bcsfe-3.5.0/src/bcsfe/cli/color.py +178 -0
- bcsfe-3.5.0/src/bcsfe/cli/color_hex.py +301 -0
- bcsfe-3.5.0/src/bcsfe/cli/dialog_creator.py +724 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/aku_realm.py +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/basic_items.py +86 -109
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/cat_editor.py +352 -302
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/clear_tutorial.py +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/enemy_editor.py +39 -43
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/event_tickets.py +7 -8
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/fixes.py +3 -3
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/map.py +262 -187
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/max_all.py +17 -37
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/rare_ticket_trade.py +8 -7
- bcsfe-3.5.0/src/bcsfe/cli/edits/storage.py +250 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/feature_handler.py +47 -49
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/file_dialog.py +33 -36
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/main.py +20 -26
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/recent_saves.py +8 -7
- bcsfe-3.5.0/src/bcsfe/cli/save_management.py +526 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/server_cli.py +24 -22
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/__init__.py +63 -8
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/country_code.py +6 -8
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/battle/battle_items.py +24 -17
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/battle/slots.py +2 -4
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/cat.py +2 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/gambling.py +2 -2
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/gatya.py +12 -24
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/medals.py +7 -8
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/mission.py +6 -10
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/nyanko_club.py +6 -9
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/officer_pass.py +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/playtime.py +10 -10
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/scheme_items.py +19 -19
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/special_skill.py +83 -80
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/talent_orbs.py +55 -53
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/upgrade.py +6 -6
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/user_rank_rewards.py +9 -16
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/gamoto/base_materials.py +5 -10
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/gamoto/cat_shrine.py +43 -54
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/gamoto/gamatoto.py +45 -42
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/gamoto/ototo.py +56 -74
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/aku.py +2 -2
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/challenge.py +5 -3
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/dojo.py +3 -4
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/enigma.py +6 -9
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/event.py +32 -37
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/outbreaks.py +10 -10
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/story.py +311 -239
- bcsfe-3.5.0/src/bcsfe/core/game/map/uncanny.py +130 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/zero_legends.py +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/adb_handler.py +5 -7
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/config.py +212 -186
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/git_handler.py +4 -6
- bcsfe-3.5.0/src/bcsfe/core/io/json_file.py +30 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/path.py +54 -26
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/root_handler.py +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/save.py +20 -9
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/waydroid.py +26 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/yaml.py +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/locale_handler.py +10 -10
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/log.py +11 -18
- bcsfe-3.5.0/src/bcsfe/core/max_value_helper.py +136 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/game_data_getter.py +11 -13
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/request.py +4 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/server_handler.py +12 -10
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/updater.py +6 -7
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/theme_handler.py +14 -21
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/config.properties +1 -4
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/input.properties +5 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/locale.properties +7 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/save.properties +6 -16
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/server.properties +3 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/cats.properties +2 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/items.properties +1 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/map.properties +3 -3
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/missions.properties +2 -2
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/special_skills.properties +1 -1
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/config.properties +92 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/files.properties +9 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/input.properties +31 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/locale.properties +33 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/main.properties +111 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/save.properties +106 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/server.properties +58 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/theme.properties +24 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/core/updater.properties +19 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/bannable_items.properties +30 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/cats.properties +160 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/enemy.properties +17 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/fixes.properties +13 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/gambling.properties +3 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/gamototo.properties +56 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/gatya.properties +8 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/gold_pass.properties +6 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/items.properties +64 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/map.properties +178 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/medals.properties +8 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/missions.properties +7 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/playtime.properties +7 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/scheme_items.properties +6 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/special_skills.properties +10 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/talent_orbs.properties +26 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/treasures.properties +24 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/edits/user_rank.properties +9 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/tw/metadata.json +4 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/config.properties +92 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/vi/core/files.properties +1 -1
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/input.properties +33 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/locale.properties +118 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/main.properties +75 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/save.properties +73 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/server.properties +31 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/theme.properties +24 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/core/updater.properties +20 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/bannable_items.properties +31 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/cats.properties +154 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/enemy.properties +18 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/fixes.properties +13 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/vi/edits/gambling.properties +4 -3
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/gamototo.properties +56 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/gatya.properties +9 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/gold_pass.properties +7 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/items.properties +65 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/map.properties +177 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/medals.properties +9 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/missions.properties +8 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/playtime.properties +8 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/vi/edits/scheme_items.properties +1 -1
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/vi/edits/special_skills.properties +3 -3
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/talent_orbs.properties +24 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/treasures.properties +25 -0
- bcsfe-3.5.0/src/bcsfe/files/locales/vi/edits/user_rank.properties +10 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/vi/metadata.json +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0/src/bcsfe.egg-info}/PKG-INFO +8 -7
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe.egg-info/SOURCES.txt +29 -1
- bcsfe-3.5.0/src/bcsfe.egg-info/requires.txt +4 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/tests/test_parse.py +0 -3
- bcsfe-3.3.0/MANIFEST.in +0 -3
- bcsfe-3.3.0/src/bcsfe/__init__.py +0 -12
- bcsfe-3.3.0/src/bcsfe/__main__.py +0 -66
- bcsfe-3.3.0/src/bcsfe/cli/color.py +0 -179
- bcsfe-3.3.0/src/bcsfe/cli/dialog_creator.py +0 -721
- bcsfe-3.3.0/src/bcsfe/cli/edits/storage.py +0 -214
- bcsfe-3.3.0/src/bcsfe/cli/save_management.py +0 -639
- bcsfe-3.3.0/src/bcsfe/core/game/map/uncanny.py +0 -104
- bcsfe-3.3.0/src/bcsfe/core/io/json_file.py +0 -45
- bcsfe-3.3.0/src/bcsfe/core/max_value_helper.py +0 -70
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/config.properties +0 -97
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/input.properties +0 -32
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/locale.properties +0 -33
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/main.properties +0 -113
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/save.properties +0 -107
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/server.properties +0 -51
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/theme.properties +0 -25
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/core/updater.properties +0 -20
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/bannable_items.properties +0 -31
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/cats.properties +0 -166
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/enemy.properties +0 -18
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/fixes.properties +0 -14
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/gamototo.properties +0 -55
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/gatya.properties +0 -9
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/gold_pass.properties +0 -7
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/items.properties +0 -56
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/map.properties +0 -158
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/medals.properties +0 -9
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/missions.properties +0 -8
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/playtime.properties +0 -8
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/talent_orbs.properties +0 -25
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/treasures.properties +0 -25
- bcsfe-3.3.0/src/bcsfe/files/locales/vi/edits/user_rank.properties +0 -10
- bcsfe-3.3.0/src/bcsfe/files/max_values.json +0 -26
- bcsfe-3.3.0/src/bcsfe.egg-info/requires.txt +0 -7
- {bcsfe-3.3.0 → bcsfe-3.5.0}/LICENSE +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/setup.cfg +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/setup.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/cli/edits/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/crypto.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/battle/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/battle/cleared_slots.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/battle/enemy.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/beacon_base.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/drop_chara.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/gatya_item.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/item_pack.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/login_bonuses.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/matatabi.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/my_sale.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/powerup.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/stamp.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/catbase/unlock_popups.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/gamoto/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/gamoto/catamins.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/localizable.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/chapters.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/ex_stage.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/gauntlets.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/item_reward_stage.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/legend_quest.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/map_names.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/map_option.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/map_reset.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/timed_score.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game/map/tower.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/game_version.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/bc_csv.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/command.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/data.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/io/thread_helper.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/__init__.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/client_info.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/event_data.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/headers.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/core/server/managed_item.py +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/files.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/main.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/theme.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/core/updater.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/bannable_items.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/enemy.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/fixes.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/gambling.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/gamototo.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/gatya.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/gold_pass.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/medals.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/playtime.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/scheme_items.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/talent_orbs.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/treasures.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/locales/en/edits/user_rank.properties +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/themes/default.json +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/files/themes/discord.json +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe/py.typed +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe.egg-info/dependency_links.txt +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe.egg-info/entry_points.txt +0 -0
- {bcsfe-3.3.0 → bcsfe-3.5.0}/src/bcsfe.egg-info/top_level.txt +0 -0
bcsfe-3.5.0/MANIFEST.in
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
recursive-include src/bcsfe/files *
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bcsfe
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.0
|
|
4
4
|
Summary: A save file editor for The Battle Cats
|
|
5
5
|
Author: fieryhenry
|
|
6
6
|
License-Expression: GPL-3.0-or-later
|
|
@@ -18,12 +18,9 @@ Classifier: Operating System :: OS Independent
|
|
|
18
18
|
Requires-Python: >=3.9
|
|
19
19
|
Description-Content-Type: text/markdown
|
|
20
20
|
License-File: LICENSE
|
|
21
|
-
Requires-Dist: aenum
|
|
22
|
-
Requires-Dist: colored==1.4.4
|
|
23
21
|
Requires-Dist: pyjwt
|
|
24
22
|
Requires-Dist: requests
|
|
25
23
|
Requires-Dist: pyyaml
|
|
26
|
-
Requires-Dist: beautifulsoup4
|
|
27
24
|
Requires-Dist: argparse
|
|
28
25
|
Dynamic: license-file
|
|
29
26
|
|
|
@@ -35,6 +32,8 @@ Dynamic: license-file
|
|
|
35
32
|
|
|
36
33
|
BCSFE is a python command line save editor for The Battle Cats.
|
|
37
34
|
|
|
35
|
+
Please submit issues and pull requests on [codeberg](https://codeberg.org/fieryhenry/BCSFE-Python)
|
|
36
|
+
|
|
38
37
|
Join the [discord server](https://discord.gg/DvmMgvn5ZB) if you want to suggest
|
|
39
38
|
new features, report bugs or get help on how to use the editor (please read the
|
|
40
39
|
below tutorials first before asking for help).
|
|
@@ -56,6 +55,8 @@ test/develop new features
|
|
|
56
55
|
|
|
57
56
|
- HungJoesifer for Vietnamese localization
|
|
58
57
|
|
|
58
|
+
- LinYuAn for Traditional Chinese localization
|
|
59
|
+
|
|
59
60
|
### Themes
|
|
60
61
|
|
|
61
62
|
- HungJoesifer for the `discord` inspired theme
|
|
@@ -330,7 +331,7 @@ Once you have installed and ran the editor, you can now begin to edit your save
|
|
|
330
331
|
|
|
331
332
|
1. In `The Battle Cats` enter the `Change Account / Device` menu in the `Settings` on the main menu.
|
|
332
333
|
|
|
333
|
-
2. Then enter the `
|
|
334
|
+
2. Then enter the `Change Device` -> `Retrieve Data from Old Device` menu.
|
|
334
335
|
|
|
335
336
|
3. Then click / tap `Save Data to Server`, this should give you a transfer code and a confirmation
|
|
336
337
|
code.
|
|
@@ -359,8 +360,8 @@ may also fail, if it does then try again.
|
|
|
359
360
|
11. Back in-game, tap the `Close Game` button, then tap `Cancel Data Transfer` (and also possibly
|
|
360
361
|
`Start Game From Beginning`)
|
|
361
362
|
|
|
362
|
-
12. Go back into the `Change Account / Device` menu and then go into the `Resume Data Transfer`
|
|
363
|
-
menu
|
|
363
|
+
12. Go back into the `Change Account / Device` menu and then go into the `Resume Data Transfer` ->
|
|
364
|
+
`Transfer Data to New Device` menu
|
|
364
365
|
|
|
365
366
|
13. Enter the new codes, and tap `Resume Transfer`
|
|
366
367
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
BCSFE is a python command line save editor for The Battle Cats.
|
|
8
8
|
|
|
9
|
+
Please submit issues and pull requests on [codeberg](https://codeberg.org/fieryhenry/BCSFE-Python)
|
|
10
|
+
|
|
9
11
|
Join the [discord server](https://discord.gg/DvmMgvn5ZB) if you want to suggest
|
|
10
12
|
new features, report bugs or get help on how to use the editor (please read the
|
|
11
13
|
below tutorials first before asking for help).
|
|
@@ -27,6 +29,8 @@ test/develop new features
|
|
|
27
29
|
|
|
28
30
|
- HungJoesifer for Vietnamese localization
|
|
29
31
|
|
|
32
|
+
- LinYuAn for Traditional Chinese localization
|
|
33
|
+
|
|
30
34
|
### Themes
|
|
31
35
|
|
|
32
36
|
- HungJoesifer for the `discord` inspired theme
|
|
@@ -301,7 +305,7 @@ Once you have installed and ran the editor, you can now begin to edit your save
|
|
|
301
305
|
|
|
302
306
|
1. In `The Battle Cats` enter the `Change Account / Device` menu in the `Settings` on the main menu.
|
|
303
307
|
|
|
304
|
-
2. Then enter the `
|
|
308
|
+
2. Then enter the `Change Device` -> `Retrieve Data from Old Device` menu.
|
|
305
309
|
|
|
306
310
|
3. Then click / tap `Save Data to Server`, this should give you a transfer code and a confirmation
|
|
307
311
|
code.
|
|
@@ -330,8 +334,8 @@ may also fail, if it does then try again.
|
|
|
330
334
|
11. Back in-game, tap the `Close Game` button, then tap `Cancel Data Transfer` (and also possibly
|
|
331
335
|
`Start Game From Beginning`)
|
|
332
336
|
|
|
333
|
-
12. Go back into the `Change Account / Device` menu and then go into the `Resume Data Transfer`
|
|
334
|
-
menu
|
|
337
|
+
12. Go back into the `Change Account / Device` menu and then go into the `Resume Data Transfer` ->
|
|
338
|
+
`Transfer Data to New Device` menu
|
|
335
339
|
|
|
336
340
|
13. Enter the new codes, and tap `Resume Transfer`
|
|
337
341
|
|
|
@@ -17,15 +17,7 @@ classifiers = [
|
|
|
17
17
|
"Programming Language :: Python :: 3.9",
|
|
18
18
|
"Operating System :: OS Independent",
|
|
19
19
|
]
|
|
20
|
-
dependencies = [
|
|
21
|
-
"aenum",
|
|
22
|
-
"colored==1.4.4",
|
|
23
|
-
"pyjwt",
|
|
24
|
-
"requests",
|
|
25
|
-
"pyyaml",
|
|
26
|
-
"beautifulsoup4",
|
|
27
|
-
"argparse",
|
|
28
|
-
]
|
|
20
|
+
dependencies = ["pyjwt", "requests", "pyyaml", "argparse"]
|
|
29
21
|
dynamic = ["version"]
|
|
30
22
|
keywords = ["battle cats", "save editor", "hacking"]
|
|
31
23
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
__version__ = "3.5.0"
|
|
2
|
+
|
|
3
|
+
__app_name__ = "bcsfe"
|
|
4
|
+
|
|
5
|
+
from importlib.resources.abc import Traversable
|
|
6
|
+
|
|
7
|
+
from bcsfe import core, cli
|
|
8
|
+
|
|
9
|
+
__all__ = ["core", "cli"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def copy_to_data_dir(base_path: Traversable, path: Traversable):
|
|
13
|
+
if path.is_dir():
|
|
14
|
+
for item in path.iterdir():
|
|
15
|
+
copy_to_data_dir(base_path, item)
|
|
16
|
+
else:
|
|
17
|
+
to_add = str(path)
|
|
18
|
+
base_s = str(base_path)
|
|
19
|
+
if to_add.startswith(base_s):
|
|
20
|
+
to_add = to_add[len(base_s) :]
|
|
21
|
+
if to_add.startswith("/") or to_add.startswith("\\"):
|
|
22
|
+
to_add = to_add[1:]
|
|
23
|
+
|
|
24
|
+
new_path = core.Path.get_data_folder().add(to_add)
|
|
25
|
+
data = path.read_bytes()
|
|
26
|
+
|
|
27
|
+
new_path.parent().generate_dirs()
|
|
28
|
+
|
|
29
|
+
new_path.write(core.Data(data))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def run():
|
|
33
|
+
from bcsfe import __main__
|
|
34
|
+
|
|
35
|
+
__main__.main()
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import traceback
|
|
3
|
+
|
|
4
|
+
from bcsfe import cli, copy_to_data_dir
|
|
5
|
+
|
|
6
|
+
from bcsfe import core, __app_name__, __version__
|
|
7
|
+
|
|
8
|
+
import bcsfe
|
|
9
|
+
import argparse
|
|
10
|
+
|
|
11
|
+
from importlib import resources
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def migrate(force: bool):
|
|
15
|
+
v_path = core.Path.get_data_folder().add("version.txt")
|
|
16
|
+
if not v_path.exists():
|
|
17
|
+
v_path.write(core.Data(__version__))
|
|
18
|
+
vers = None
|
|
19
|
+
else:
|
|
20
|
+
vers = v_path.read().to_str().strip()
|
|
21
|
+
if vers != __version__ or force:
|
|
22
|
+
p = resources.files(__app_name__).joinpath("files")
|
|
23
|
+
copy_to_data_dir(p, p)
|
|
24
|
+
v_path.write(core.Data(__version__))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def main():
|
|
28
|
+
parser = argparse.ArgumentParser(bcsfe.__app_name__)
|
|
29
|
+
|
|
30
|
+
parser.add_argument(
|
|
31
|
+
"--version", "-v", action="store_true", help="display the version and exit"
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"--input-path", "-i", type=str, help="input path to save file to edit"
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
"--game-data-dir", "-g", type=str, help="path to store the game data to"
|
|
38
|
+
)
|
|
39
|
+
parser.add_argument(
|
|
40
|
+
"--transfer-backup-path",
|
|
41
|
+
type=str,
|
|
42
|
+
help="path to save the backup SAVE_DATA after transfering to",
|
|
43
|
+
)
|
|
44
|
+
parser.add_argument(
|
|
45
|
+
"--config-path",
|
|
46
|
+
"-c",
|
|
47
|
+
type=str,
|
|
48
|
+
default=None,
|
|
49
|
+
help=f"path to the config file. If unspecified defaults to {core.Config.get_config_path()}",
|
|
50
|
+
)
|
|
51
|
+
parser.add_argument(
|
|
52
|
+
"--log-path",
|
|
53
|
+
"-l",
|
|
54
|
+
type=str,
|
|
55
|
+
default=None,
|
|
56
|
+
help=f"path to the log file. If unspecified defaults to {core.Logger.get_log_path()}",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--force-migrate",
|
|
60
|
+
action="store_true",
|
|
61
|
+
help=f"copy all data from bcsfe/src/files to {core.Path.get_data_folder()}",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
args = parser.parse_args()
|
|
65
|
+
if args.version:
|
|
66
|
+
print(bcsfe.__version__)
|
|
67
|
+
exit()
|
|
68
|
+
|
|
69
|
+
if args.config_path is not None:
|
|
70
|
+
core.set_config_path(core.Path(args.config_path))
|
|
71
|
+
|
|
72
|
+
if args.log_path is not None:
|
|
73
|
+
core.set_log_path(core.Path(args.log_path))
|
|
74
|
+
|
|
75
|
+
if args.transfer_backup_path is not None:
|
|
76
|
+
core.set_transfer_backup_path(core.Path(args.transfer_backup_path))
|
|
77
|
+
|
|
78
|
+
if args.game_data_dir is not None:
|
|
79
|
+
core.set_game_data_path(core.Path(args.game_data_dir))
|
|
80
|
+
|
|
81
|
+
migrate(args.force_migrate)
|
|
82
|
+
|
|
83
|
+
core.core_data.init_data()
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
cli.main.Main().main(args.input_path)
|
|
87
|
+
except KeyboardInterrupt:
|
|
88
|
+
cli.main.Main.leave()
|
|
89
|
+
except Exception as e:
|
|
90
|
+
tb = traceback.format_exc()
|
|
91
|
+
cli.color.color_print_key(
|
|
92
|
+
"error", error=e, version=bcsfe.__version__, traceback=tb
|
|
93
|
+
)
|
|
94
|
+
try:
|
|
95
|
+
cli.main.Main.exit_editor()
|
|
96
|
+
except Exception:
|
|
97
|
+
pass
|
|
98
|
+
except KeyboardInterrupt:
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
main()
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any
|
|
3
|
+
from bcsfe import core
|
|
4
|
+
from bcsfe.cli import color_hex
|
|
5
|
+
import enum
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ColorHex(enum.Enum):
|
|
9
|
+
GREEN = "#008000"
|
|
10
|
+
G = GREEN
|
|
11
|
+
RED = "#FF0000"
|
|
12
|
+
R = RED
|
|
13
|
+
DARK_YELLOW = "#D7C32A"
|
|
14
|
+
DY = DARK_YELLOW
|
|
15
|
+
BLACK = "#000000"
|
|
16
|
+
BL = BLACK
|
|
17
|
+
WHITE = "#FFFFFF"
|
|
18
|
+
W = WHITE
|
|
19
|
+
CYAN = "#00FFFF"
|
|
20
|
+
C = CYAN
|
|
21
|
+
DARK_GREY = "#A9A9A9"
|
|
22
|
+
DG = DARK_GREY
|
|
23
|
+
BLUE = "#0000FF"
|
|
24
|
+
B = BLUE
|
|
25
|
+
YELLOW = "#FFFF00"
|
|
26
|
+
Y = YELLOW
|
|
27
|
+
MAGENTA = "#FF00FF"
|
|
28
|
+
M = MAGENTA
|
|
29
|
+
DARK_BLUE = "#00008B"
|
|
30
|
+
DB = DARK_BLUE
|
|
31
|
+
DARK_CYAN = "#008B8B"
|
|
32
|
+
DC = DARK_CYAN
|
|
33
|
+
DARK_MAGENTA = "#8B008B"
|
|
34
|
+
DM = DARK_MAGENTA
|
|
35
|
+
DARK_RED = "#8B0000"
|
|
36
|
+
DR = DARK_RED
|
|
37
|
+
DARK_GREEN = "#006400"
|
|
38
|
+
DGN = DARK_GREEN
|
|
39
|
+
LIGHT_GREY = "#D3D3D3"
|
|
40
|
+
LG = LIGHT_GREY
|
|
41
|
+
ORANGE = "#FFA500"
|
|
42
|
+
O = ORANGE
|
|
43
|
+
|
|
44
|
+
@staticmethod
|
|
45
|
+
def from_name(name: str) -> str:
|
|
46
|
+
if not name:
|
|
47
|
+
return ""
|
|
48
|
+
try:
|
|
49
|
+
return getattr(ColorHex, name.upper()).value
|
|
50
|
+
except AttributeError:
|
|
51
|
+
return ""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def __parse_color(color_name: str) -> str:
|
|
55
|
+
if not color_name:
|
|
56
|
+
return ""
|
|
57
|
+
first_char = color_name[0]
|
|
58
|
+
if first_char == "#":
|
|
59
|
+
return color_name
|
|
60
|
+
if first_char != "@":
|
|
61
|
+
return ColorHex.from_name(color_name)
|
|
62
|
+
|
|
63
|
+
if len(color_name) < 2:
|
|
64
|
+
return ""
|
|
65
|
+
second_char = color_name[1]
|
|
66
|
+
if len(color_name) >= 3:
|
|
67
|
+
third_char = color_name[2]
|
|
68
|
+
else:
|
|
69
|
+
third_char = ""
|
|
70
|
+
theme_handler = core.core_data.theme_manager
|
|
71
|
+
if second_char == "p":
|
|
72
|
+
return theme_handler.get_primary_color()
|
|
73
|
+
if second_char == "s" and third_char != "u":
|
|
74
|
+
return theme_handler.get_secondary_color()
|
|
75
|
+
if second_char == "t":
|
|
76
|
+
return theme_handler.get_tertiary_color()
|
|
77
|
+
if second_char == "q":
|
|
78
|
+
return theme_handler.get_quaternary_color()
|
|
79
|
+
if second_char == "e":
|
|
80
|
+
return theme_handler.get_error_color()
|
|
81
|
+
if second_char == "w":
|
|
82
|
+
return theme_handler.get_warning_color()
|
|
83
|
+
if second_char == "s" and third_char == "u":
|
|
84
|
+
return theme_handler.get_success_color()
|
|
85
|
+
return theme_handler.get_theme_color(color_name[1:])
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def __parse(text: str) -> list[tuple[str, str]]:
|
|
89
|
+
txt = "<@p>" + text + "</>"
|
|
90
|
+
output: list[tuple[str, str]] = []
|
|
91
|
+
i = 0
|
|
92
|
+
tags: list[str] = []
|
|
93
|
+
inside_tag = False
|
|
94
|
+
in_closing_tag = False
|
|
95
|
+
tag_text = ""
|
|
96
|
+
text = ""
|
|
97
|
+
special_chars = core.LocalManager.get_special_chars()
|
|
98
|
+
while i < len(txt):
|
|
99
|
+
char = txt[i]
|
|
100
|
+
if char == "\\" and i + 1 < len(txt) and txt[i + 1] in special_chars:
|
|
101
|
+
i += 1
|
|
102
|
+
char = txt[i]
|
|
103
|
+
text += char
|
|
104
|
+
i += 1
|
|
105
|
+
continue
|
|
106
|
+
if tags:
|
|
107
|
+
tag = tags[-1]
|
|
108
|
+
else:
|
|
109
|
+
tag = ""
|
|
110
|
+
if char == ">" and inside_tag:
|
|
111
|
+
inside_tag = False
|
|
112
|
+
if not in_closing_tag:
|
|
113
|
+
tags.append(tag_text)
|
|
114
|
+
if in_closing_tag:
|
|
115
|
+
in_closing_tag = False
|
|
116
|
+
tag_text = ""
|
|
117
|
+
if char == "<" and not inside_tag:
|
|
118
|
+
inside_tag = True
|
|
119
|
+
if text:
|
|
120
|
+
color = __parse_color(tag)
|
|
121
|
+
output.append((text, color))
|
|
122
|
+
text = ""
|
|
123
|
+
tag_text = ""
|
|
124
|
+
if char == "/" and inside_tag:
|
|
125
|
+
in_closing_tag = True
|
|
126
|
+
if tags:
|
|
127
|
+
tags.pop()
|
|
128
|
+
if not inside_tag and char != ">" and char != "<":
|
|
129
|
+
text += char
|
|
130
|
+
if inside_tag and char != "<" and char != ">":
|
|
131
|
+
tag_text += char
|
|
132
|
+
i += 1
|
|
133
|
+
return output
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def color_print(text: str, end: str = "\n"):
|
|
137
|
+
print(colorize(text), end=end)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def color_print_key(key: str, end: str = "\n", escape: bool = True, **kwargs: Any):
|
|
141
|
+
color_print(core.localize(key, escape=escape, **kwargs), end)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def __fg(color: str):
|
|
145
|
+
color = color_hex.hex_to_ansi(color)
|
|
146
|
+
esc = "\x1b["
|
|
147
|
+
code = esc + "38;5;"
|
|
148
|
+
end = "m"
|
|
149
|
+
return code + color.lower() + end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def __stylize(text: str, style: str):
|
|
153
|
+
esc = "\x1b["
|
|
154
|
+
end = "m"
|
|
155
|
+
terminator = esc + "0" + end
|
|
156
|
+
return style + f"{text}{terminator}"
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def colorize(text: str) -> str:
|
|
160
|
+
text_data = __parse(text)
|
|
161
|
+
out: str = ""
|
|
162
|
+
|
|
163
|
+
for txt, color in text_data:
|
|
164
|
+
if not color:
|
|
165
|
+
out += txt
|
|
166
|
+
continue
|
|
167
|
+
|
|
168
|
+
out += __stylize(txt, __fg(color))
|
|
169
|
+
|
|
170
|
+
return out
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def color_input(text: str) -> str:
|
|
174
|
+
return input(colorize(text))
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def color_input_key(key: str, escape: bool = True, **kwargs: Any) -> str:
|
|
178
|
+
return color_input(core.localize(key, escape, **kwargs))
|