ksaa 2025.5.16.0__py3-none-any.whl → 2025.5.23.0__py3-none-any.whl
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.
- kotonebot/__init__.py +0 -2
- kotonebot/backend/bot.py +19 -34
- kotonebot/backend/color.py +20 -17
- kotonebot/backend/context/context.py +41 -8
- kotonebot/backend/core.py +7 -30
- kotonebot/backend/dispatch.py +1 -1
- kotonebot/backend/image.py +26 -26
- kotonebot/backend/ocr.py +18 -17
- kotonebot/backend/preprocessor.py +0 -1
- kotonebot/client/__init__.py +8 -1
- kotonebot/client/device.py +7 -20
- kotonebot/client/factory.py +33 -5
- kotonebot/client/host/__init__.py +8 -1
- kotonebot/client/host/custom.py +7 -2
- kotonebot/client/host/leidian_host.py +200 -0
- kotonebot/client/host/mumu12_host.py +169 -0
- kotonebot/client/host/protocol.py +68 -38
- kotonebot/client/implements/adb.py +1 -1
- kotonebot/client/protocol.py +1 -1
- kotonebot/config/base_config.py +8 -3
- kotonebot/interop/win/reg.py +37 -0
- kotonebot/kaa/common.py +18 -2
- kotonebot/kaa/game_ui/badge.py +6 -6
- kotonebot/kaa/game_ui/common.py +6 -6
- kotonebot/kaa/game_ui/commu_event_buttons.py +4 -3
- kotonebot/kaa/game_ui/idols_overview.py +6 -6
- kotonebot/kaa/game_ui/schedule.py +162 -0
- kotonebot/kaa/game_ui/scrollable.py +7 -6
- kotonebot/kaa/kaa_context.py +8 -0
- kotonebot/kaa/main/cli.py +7 -0
- kotonebot/kaa/main/dmm_host.py +53 -0
- kotonebot/kaa/main/gr.py +497 -298
- kotonebot/kaa/main/kaa.py +77 -1
- kotonebot/kaa/metadata.py +21 -0
- kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
- kotonebot/kaa/resources/game.db +0 -0
- kotonebot/kaa/resources/game_ver.txt +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-amao-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-amao-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-amao-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-012_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-012_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hrnm-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-012_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hski-3-012_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kcna-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-kllj-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-shro-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-005_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-005_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ssmk-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-1-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-1-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-1-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-1-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-2-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-2-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-000_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-000_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-001_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-001_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-003_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-003_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-004_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-004_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-006_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-006_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-007_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-007_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-008_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-009_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-009_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-010_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-010_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-011_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-011_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-012_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-ttmr-3-012_1.png +0 -0
- kotonebot/kaa/sprites/4503db6b-7224-4b81-9971-e7cfa56e10f2.png +0 -0
- kotonebot/kaa/tasks/R.py +137 -133
- kotonebot/kaa/tasks/daily/contest.py +123 -89
- kotonebot/kaa/tasks/daily/mission_reward.py +4 -4
- kotonebot/kaa/tasks/end_game.py +2 -9
- kotonebot/kaa/tasks/produce/cards.py +7 -6
- kotonebot/kaa/tasks/produce/common.py +16 -12
- kotonebot/kaa/tasks/produce/in_purodyuusu.py +5 -5
- kotonebot/kaa/tasks/produce/p_drink.py +4 -3
- kotonebot/kaa/tasks/produce/produce.py +5 -3
- kotonebot/kaa/tasks/start_game.py +2 -2
- kotonebot/primitives/__init__.py +17 -0
- kotonebot/primitives/geometry.py +290 -0
- kotonebot/primitives/visual.py +63 -0
- kotonebot/util.py +20 -20
- {ksaa-2025.5.16.0.dist-info → ksaa-2025.5.23.0.dist-info}/METADATA +1 -1
- ksaa-2025.5.23.0.dist-info/RECORD +645 -0
- {ksaa-2025.5.16.0.dist-info → ksaa-2025.5.23.0.dist-info}/WHEEL +1 -1
- ksaa-2025.5.16.0.dist-info/RECORD +0 -358
- /kotonebot/{client/host/mumu_host.py → interop/win/__init__.py} +0 -0
- /kotonebot/kaa/sprites/{d9d3b9b8-39b5-49fc-ad91-b3b6a1e270fa.png → 03a1da2f-c46d-47ce-a4a5-dbe3dee15154.png} +0 -0
- /kotonebot/kaa/sprites/{c31fa18a-3af7-4a0d-aad4-b0c62f6b3d14.png → 0590d364-2d8a-4743-b3c6-8b06a8902eba.png} +0 -0
- /kotonebot/kaa/sprites/{443ad895-1036-4ab1-b983-c3d9a2c7226d.png → 059e36cb-256b-409d-af50-2d6bbcda2991.png} +0 -0
- /kotonebot/kaa/sprites/{0ac97790-df7e-4ec1-8642-99c83706a6ca.png → 0712678b-e13f-49c2-b144-4a3d3e342836.png} +0 -0
- /kotonebot/kaa/sprites/{95e6fce9-3b7f-4632-8995-f61555fe4f7c.png → 0888b793-4084-479b-a3bb-1ad5e0de1f63.png} +0 -0
- /kotonebot/kaa/sprites/{2ebc9910-ffcf-4ee8-bcbd-12208b9512da.png → 0941ec23-b5c7-4513-b5d6-3e65a84eaec6.png} +0 -0
- /kotonebot/kaa/sprites/{3d26b141-6763-4411-9ed6-404cc86d0f8b.png → 0a9cf832-adb9-4f8e-9e19-a7283934ee51.png} +0 -0
- /kotonebot/kaa/sprites/{3e299105-9996-40f4-9635-9756f3ff5890.png → 10dd5320-7d5c-4901-a9aa-3a8cdd6eee0f.png} +0 -0
- /kotonebot/kaa/sprites/{1a02dd8a-0e4c-4bb4-9270-58081f569c6b.png → 13530bef-a2cc-4ae4-b435-b56d370a08a4.png} +0 -0
- /kotonebot/kaa/sprites/{a5d12211-9613-446a-ac70-00c4268e845b.png → 17d6c160-56a9-46f3-bc08-e85e85984c29.png} +0 -0
- /kotonebot/kaa/sprites/{13057f1f-7340-4609-a50f-3b00b3d8be6e.png → 18412951-a2a4-4098-ac93-e36f951fe6a3.png} +0 -0
- /kotonebot/kaa/sprites/{14787e5f-9244-4f75-896f-e06d1c50ccdf.png → 191af9b6-75ec-4b9c-9cd8-acb8073670fc.png} +0 -0
- /kotonebot/kaa/sprites/{8f68d079-0bea-4dae-9a75-b5a4d6c5ce14.png → 1ab5a8b6-4a8d-4964-b867-e030dbcb8cea.png} +0 -0
- /kotonebot/kaa/sprites/{07df5a1f-b7a3-4bbc-9b5a-66834e045f7c.png → 21e349ce-6b24-4978-800b-64bb023dac4c.png} +0 -0
- /kotonebot/kaa/sprites/{09dfc448-db96-4de8-ac00-ff9f65faa234.png → 22a9c3ad-79f8-4840-badc-679ffb563862.png} +0 -0
- /kotonebot/kaa/sprites/{ca72955d-a875-4099-a05c-a6c05abb5bde.png → 24e2bee3-a981-4acb-a6d4-ba558ecdb447.png} +0 -0
- /kotonebot/kaa/sprites/{0b925b55-6768-474c-a164-77d343c5a5cc.png → 24f4e1b3-3697-48c8-b253-147c32099c7d.png} +0 -0
- /kotonebot/kaa/sprites/{4bcc6f68-ad84-442f-949c-8881b999b99b.png → 2683cb88-4e76-48df-875e-571c1be71262.png} +0 -0
- /kotonebot/kaa/sprites/{ecbbddd8-4f8d-4cd2-a3f8-5f3aa9f31693.png → 292d2da1-f9a0-43e3-9ae2-b0d9dbc0eade.png} +0 -0
- /kotonebot/kaa/sprites/{4b83bf6a-d158-4fca-a226-dd22867f3b7b.png → 2aa3af38-e76b-46bd-b607-a1e0fa203e53.png} +0 -0
- /kotonebot/kaa/sprites/{edab4736-e1ea-485f-b54e-a188a70d9f62.png → 2ab660e8-865a-41d9-acec-ab6b002f85bf.png} +0 -0
- /kotonebot/kaa/sprites/{d61d8f0d-dbfd-484d-a5eb-b64f9017cc28.png → 2e01ea79-ed1b-46c6-a60d-61762e70356e.png} +0 -0
- /kotonebot/kaa/sprites/{bd9f1e28-ec69-4b5f-bbca-b47d23a4cfb6.png → 2fd3276f-de84-4696-83fd-233f6b8f3b65.png} +0 -0
- /kotonebot/kaa/sprites/{2585f6f2-ab8d-42ac-a34e-9c7b97ff35fe.png → 3011e930-0a44-411a-a51c-9674559a7a79.png} +0 -0
- /kotonebot/kaa/sprites/{3081df2a-ad37-4fe7-9af6-82178a66ac28.png → 305f4efc-44aa-40a3-829a-cbfb11667e70.png} +0 -0
- /kotonebot/kaa/sprites/{13f5018a-374a-4a57-91fc-773e15541a87.png → 315be5ba-6a88-477d-829a-36d1a0c20d5b.png} +0 -0
- /kotonebot/kaa/sprites/{bc4aac55-16cf-4d73-aeb0-41c63116c2a8.png → 31e62cdf-febe-41d5-a9cb-864dd979c110.png} +0 -0
- /kotonebot/kaa/sprites/{f4a2ad25-d5af-435c-863c-e537bfc007ec.png → 32173834-1127-4d24-ae38-7e39aa285383.png} +0 -0
- /kotonebot/kaa/sprites/{26e4ae32-63b3-4018-8bd7-67bf7975693d.png → 3899fdd3-1e6c-426f-84fc-07fc7f142285.png} +0 -0
- /kotonebot/kaa/sprites/{cd5a9174-8e78-494d-8a59-b4036ea47235.png → 3a9e305c-3bfb-4e03-b516-5d2f1fdde3ac.png} +0 -0
- /kotonebot/kaa/sprites/{79b72a12-5ca1-4d9d-b110-03d85082ea2c.png → 3af1f5c7-bc33-48c8-96bd-9de2060a6cd2.png} +0 -0
- /kotonebot/kaa/sprites/{858a892b-b416-46ac-a794-2d8d54fc75aa.png → 3da30a90-8e12-4467-9c2a-9f329b12fff3.png} +0 -0
- /kotonebot/kaa/sprites/{17daea0a-8d57-4da2-a8cc-e0e9121b5e9b.png → 3ea127da-166d-4ff1-9748-b52985b7a426.png} +0 -0
- /kotonebot/kaa/sprites/{675c3811-a589-4586-b9b7-22342ff7469b.png → 3f0d4968-8c48-4f6a-ba8c-55fda72dc7e0.png} +0 -0
- /kotonebot/kaa/sprites/{a7be4b5c-f118-4738-8a2a-488479f94775.png → 41d5bd29-838b-4365-a2b8-0c7d3e6d8040.png} +0 -0
- /kotonebot/kaa/sprites/{31c40070-8b76-476e-ade5-fc159f924157.png → 442d7deb-2dec-4b61-afb9-00c21a756724.png} +0 -0
- /kotonebot/kaa/sprites/{b8d57489-74d7-4657-818e-865f60fa5d30.png → 4575ec70-0147-4287-b2ab-e78e9622072c.png} +0 -0
- /kotonebot/kaa/sprites/{1911a19a-83b1-42d4-b04b-96ca67b2da39.png → 4586b495-4151-434b-ba97-693f31cfe017.png} +0 -0
- /kotonebot/kaa/sprites/{4ca90fd6-fd9b-4eb7-b9d7-83e7ac77a641.png → 49dcd6ac-407a-415a-a237-2425a9aed30d.png} +0 -0
- /kotonebot/kaa/sprites/{37a8fa3f-d6d6-46c8-8489-4a6ee0496eef.png → 4b2aa727-048b-4120-81a2-3c11e2492146.png} +0 -0
- /kotonebot/kaa/sprites/{61db88d2-63d3-4078-abc6-34457c00c218.png → 4c315af5-32b9-43a4-8e7d-15cf353bcb03.png} +0 -0
- /kotonebot/kaa/sprites/{c3a4297d-3db5-4e20-be48-2fd25d1bed17.png → 4c9a62ad-7c12-4093-b8c9-b9074112bc41.png} +0 -0
- /kotonebot/kaa/sprites/{35a1eb9e-606f-4fa4-8a70-918c66966c02.png → 4d1dc493-9d1a-46a8-86a3-61b6eeb44166.png} +0 -0
- /kotonebot/kaa/sprites/{bca88684-b9c6-49dc-ac92-814fe92148dd.png → 52792418-b921-43ce-a359-5fe0c16e78d2.png} +0 -0
- /kotonebot/kaa/sprites/{6b9db525-2802-4808-9995-b3a140629164.png → 54bd3138-a66a-45ee-950b-72e2aeb99143.png} +0 -0
- /kotonebot/kaa/sprites/{4fb71269-89d1-4e8a-b7cc-792ab2939bfc.png → 59c4b7d6-b97d-4ef0-bd8c-fc4a524a2ec8.png} +0 -0
- /kotonebot/kaa/sprites/{b312d4fc-0852-4bdc-bcaa-2b363b0bf5c0.png → 5a31f717-083b-4086-9eaf-ed131982f22f.png} +0 -0
- /kotonebot/kaa/sprites/{0aa9b79e-66c2-47b0-8ed6-65bac3414978.png → 5bb9b015-9895-4180-917f-cb01e549e3fd.png} +0 -0
- /kotonebot/kaa/sprites/{a8a81cd1-4c22-4775-8ae5-d1f62bc57304.png → 5c68a4a5-c221-4095-ad60-bc15fd207b8b.png} +0 -0
- /kotonebot/kaa/sprites/{639c3876-8b07-432a-a68f-a6d7224e5f05.png → 5ca2f04c-16ce-491a-ac5f-fe1426a3ba7f.png} +0 -0
- /kotonebot/kaa/sprites/{4e5fce30-4af9-43ef-9616-efa6ed54cd01.png → 5eba9fd5-edc8-4621-b97f-d2654cf9b64e.png} +0 -0
- /kotonebot/kaa/sprites/{8fc1bd07-e694-484b-a6e2-e1b3f69eff18.png → 5f9b7109-335e-4b5a-b0e9-34590b693976.png} +0 -0
- /kotonebot/kaa/sprites/{96457160-95bf-48f4-a55b-0555a90a153f.png → 5fbede88-6f22-43c7-a6c5-e457470c30ce.png} +0 -0
- /kotonebot/kaa/sprites/{296c5ced-cb5b-433f-9afe-8158991d71b8.png → 62cecda6-30aa-4e25-b74a-fe7726d3cd75.png} +0 -0
- /kotonebot/kaa/sprites/{3860250d-829a-4000-adeb-6c5e646b1059.png → 65946928-f48f-48fa-b561-f44b8db7f5ef.png} +0 -0
- /kotonebot/kaa/sprites/{787d1557-7329-40a3-b543-6326cff0b95c.png → 66f9d590-ae1d-4c29-8b2b-72be465457ae.png} +0 -0
- /kotonebot/kaa/sprites/{03b42595-7196-4671-b6ea-1e93def3277b.png → 6763a087-099a-425c-875d-1586f5d3d624.png} +0 -0
- /kotonebot/kaa/sprites/{be3d4c92-55d2-49c2-bac8-caab183bf23a.png → 6995892d-5f99-4e40-9849-3f9ef8bf7bdb.png} +0 -0
- /kotonebot/kaa/sprites/{8c9a212d-8e2a-4244-9b45-17022b960e6c.png → 6b6f0f50-086b-498b-89bc-b2abc0e2b723.png} +0 -0
- /kotonebot/kaa/sprites/{b2f70e7b-8c88-4a78-86f8-3456028b9b22.png → 6b7cb3b3-edff-4668-acaa-92cc3fa035f9.png} +0 -0
- /kotonebot/kaa/sprites/{2c9d6bcf-7b64-4d2c-a55d-aa33a67823fc.png → 6c793707-0535-4146-b53c-3d8c1c0d8c2f.png} +0 -0
- /kotonebot/kaa/sprites/{31e65902-3be2-4f2e-9070-d744588262cc.png → 6e213f63-8915-4d69-922a-03e5f09c409d.png} +0 -0
- /kotonebot/kaa/sprites/{26ea9d6d-390e-41d8-b698-d6ec717a75d0.png → 71c7edb4-f638-4b87-a066-5ac6d0ceafcc.png} +0 -0
- /kotonebot/kaa/sprites/{7dd54352-336a-4074-9ca9-301d3da480e1.png → 7283ab2c-0c5c-4d60-b86f-2e8382a2dca0.png} +0 -0
- /kotonebot/kaa/sprites/{4aace3d3-ea8e-455c-a13b-949db602f803.png → 73b64703-2352-4a86-b40f-1e6e416fdd58.png} +0 -0
- /kotonebot/kaa/sprites/{2c7f7e34-d744-43cb-8922-551e19ba1afc.png → 789ac59e-aeae-4f4b-9086-e075e7a05718.png} +0 -0
- /kotonebot/kaa/sprites/{d0f33568-3680-4094-9db1-ebe688904c2f.png → 7ccc662f-6727-49eb-a7de-fe28e14b949f.png} +0 -0
- /kotonebot/kaa/sprites/{5512d8e2-cd55-4cd1-9907-ba83aed0e286.png → 7d7f5644-3de6-48b2-bb12-6ab61657997a.png} +0 -0
- /kotonebot/kaa/sprites/{f59828c3-f7ca-4f0e-bd0f-d52a7f8a4973.png → 8488a18d-98fb-4cb6-bc63-3055e746e3df.png} +0 -0
- /kotonebot/kaa/sprites/{3b5797e4-fedc-486b-a783-82f1c3975d9c.png → 84b1a4ed-f9d3-4627-a35a-0f38096b919c.png} +0 -0
- /kotonebot/kaa/sprites/{cc69f584-8c89-4e8b-ab23-1f33cd828f8f.png → 85ea2edc-b508-4b23-bcc8-1277e8cb05b2.png} +0 -0
- /kotonebot/kaa/sprites/{47829c45-453c-4a3e-abaa-bf5c899514b7.png → 86033fa1-a02d-4307-8d01-ae37a873f650.png} +0 -0
- /kotonebot/kaa/sprites/{fc945167-368e-44a8-9e48-78df2facfea9.png → 88708972-934e-4954-a502-87996823dc16.png} +0 -0
- /kotonebot/kaa/sprites/{479009fa-8b2b-47af-b13e-218a33454169.png → 8b4a0233-ace4-4551-931f-ff15e33c1c2c.png} +0 -0
- /kotonebot/kaa/sprites/{00a671bd-7568-44fe-9b33-93968e12091c.png → 8cd7630c-b343-42e1-8e12-bbddcc338e56.png} +0 -0
- /kotonebot/kaa/sprites/{260c0f15-6024-4324-b83f-0ac39d7545c5.png → 947645a0-bce3-4807-8459-9f8cd958f09e.png} +0 -0
- /kotonebot/kaa/sprites/{6e84d59d-040d-44c9-9242-9d49450290b6.png → 95eeb164-9d4e-4cf6-b205-a8341a9b6bb0.png} +0 -0
- /kotonebot/kaa/sprites/{795edf1b-4a7a-448d-855d-2b2e9f0052f7.png → 9b4c05d7-868d-49c8-95d4-c0a84d39c025.png} +0 -0
- /kotonebot/kaa/sprites/{a0efd483-dc41-4eee-9c1c-c4874d71d11e.png → 9c965862-ec78-4b66-b9d8-8e606b502e5d.png} +0 -0
- /kotonebot/kaa/sprites/{bbb8bae0-17ee-465c-b91b-1e13e719e150.png → 9ce1fe0c-4aae-4efe-83fa-bf431ab62ab8.png} +0 -0
- /kotonebot/kaa/sprites/{4dad344d-069c-44bd-ae10-33baca3544bb.png → 9db57c4d-d7d8-45a9-8a7c-b68e0bb113c8.png} +0 -0
- /kotonebot/kaa/sprites/{f5be4683-5767-4caf-b5b9-d68be444f39d.png → 9dfa0e51-2460-4c3c-8ea3-9fa6bc09c8aa.png} +0 -0
- /kotonebot/kaa/sprites/{2e802f45-46e9-4918-bd3e-e195fc829ab4.png → 9f617ed4-118a-4ba0-a8bd-fe0c6b21d586.png} +0 -0
- /kotonebot/kaa/sprites/{0c5cbe4a-f54a-4f02-8bbe-24cbd1748918.png → 9fa1e7cb-e8b8-43c7-96e7-33ea86c60932.png} +0 -0
- /kotonebot/kaa/sprites/{ffa5f117-778d-4d2a-90fb-b39acbe7ae4e.png → a0f13530-e3b0-459e-bcd5-18730e361485.png} +0 -0
- /kotonebot/kaa/sprites/{c7267425-2c38-45b2-b022-754e30829f96.png → a1189ca3-e642-4ed7-b935-40f63da46986.png} +0 -0
- /kotonebot/kaa/sprites/{a6dfdbfa-84f9-4207-8add-96c1eefbe88b.png → a3cd94c6-978a-4092-bc1f-da669a9472e7.png} +0 -0
- /kotonebot/kaa/sprites/{0c3144d0-26cf-47dc-b522-05f73a824f8b.png → a5b8f5ab-df6c-43db-adf7-5989220e48ca.png} +0 -0
- /kotonebot/kaa/sprites/{e6bffe23-f409-48e1-b0ec-b67e18d130b5.png → a642cdd7-4ae6-4b30-be1b-db518541452d.png} +0 -0
- /kotonebot/kaa/sprites/{ced15441-68b2-4d9c-99a2-4e8e4c4a131e.png → a66f022a-87e1-4607-b5f1-8dd4a110f48e.png} +0 -0
- /kotonebot/kaa/sprites/{b548f674-d84b-4b0f-b98f-1783500c5afd.png → a6dedf3b-32fb-4ac0-b035-8466b375710d.png} +0 -0
- /kotonebot/kaa/sprites/{6acca92d-1e23-4a8e-9c29-50c437459665.png → a970297a-c7f1-42cd-a0ce-42f20a2c5571.png} +0 -0
- /kotonebot/kaa/sprites/{9945a88e-b74a-4bd8-a19d-ddb24c9f54d6.png → a9df4cf5-c960-48eb-96c0-2beb97ef0964.png} +0 -0
- /kotonebot/kaa/sprites/{79448912-8204-4924-b05c-60a258d50341.png → aad5dc2d-8121-4f5e-8f4e-2a7b5cea8200.png} +0 -0
- /kotonebot/kaa/sprites/{461e1cae-891d-4080-945d-9cfb6caf2678.png → ac475d95-aa46-49f7-afda-e5bbbd3ef11b.png} +0 -0
- /kotonebot/kaa/sprites/{e860fe86-3a3c-4a33-b7e7-f63ebe735d17.png → ad1655b1-93c1-4cee-88ad-83a833dbbfc1.png} +0 -0
- /kotonebot/kaa/sprites/{cde8a738-047d-4a23-b223-6035f24cb80d.png → ae4a4dfd-01bc-4a8a-8807-241b0d158f2e.png} +0 -0
- /kotonebot/kaa/sprites/{2d04264f-89ee-4c89-8ee6-1a8a951fb125.png → b343a359-8311-499f-b96d-1a47f07916c3.png} +0 -0
- /kotonebot/kaa/sprites/{c18d85a8-a32c-4b49-8d08-5c876c23340c.png → b38b3a91-49f6-4699-a3f0-dd7de89b2a42.png} +0 -0
- /kotonebot/kaa/sprites/{2f7dd696-1f17-4bce-8c31-090720d7076b.png → b3e0fc29-1664-4301-a92d-7b3371d566dc.png} +0 -0
- /kotonebot/kaa/sprites/{c0fed709-68ab-457c-bbe9-814e557a75b6.png → b4569380-d0ba-48e2-b697-2fd0c3169819.png} +0 -0
- /kotonebot/kaa/sprites/{1c5215e4-0f52-4aa0-9631-72b25637e367.png → b62eeea5-48e7-47c3-bf00-355870190b40.png} +0 -0
- /kotonebot/kaa/sprites/{3f245cbd-bcf3-4d71-8f2e-5deb67e32161.png → b71b7873-29c1-4d7a-895b-9ca7f5c0313a.png} +0 -0
- /kotonebot/kaa/sprites/{8fca7893-14bb-4757-9a8d-474f4844bf7e.png → b89facd5-f362-4ca8-b6be-b66f53a4081a.png} +0 -0
- /kotonebot/kaa/sprites/{999e635c-7c0f-46c6-a5cb-b443c57c728a.png → b9350939-5437-49b6-9ef4-eee3b9bd49e2.png} +0 -0
- /kotonebot/kaa/sprites/{36fc34e4-6f06-4838-9c9c-547be7991d72.png → baaf7380-6da7-4234-8368-d90f711e9ccd.png} +0 -0
- /kotonebot/kaa/sprites/{6149054f-3daa-4d6a-a3aa-9eeb720c884c.png → bb681200-a6a1-49f3-a17b-0b8afbeaf69a.png} +0 -0
- /kotonebot/kaa/sprites/{a1d9ac58-de0e-4902-9186-60f94744a4bf.png → c409f292-8a99-4f34-b465-c42d6ed04cc7.png} +0 -0
- /kotonebot/kaa/sprites/{6d0a5233-c4e1-4f5e-9700-4ec3fc82b2fd.png → c4510fd6-237c-4578-bee4-9e5c73fc5830.png} +0 -0
- /kotonebot/kaa/sprites/{d626d60a-ec86-4cab-956e-77f296a2299b.png → c5e79a80-3ebd-4786-a8c9-ede13e110a92.png} +0 -0
- /kotonebot/kaa/sprites/{0f390754-f060-4af3-8e91-f60f1a9e7897.png → c8ec4f98-3025-4366-9221-6fb69fd930d7.png} +0 -0
- /kotonebot/kaa/sprites/{99a196e1-0988-4872-9867-64199ea07762.png → cb8414fe-5ee1-4ae2-914c-f19d6271d8a6.png} +0 -0
- /kotonebot/kaa/sprites/{03a4cc77-35ad-45f9-a72e-0514ed2a2bfe.png → cc55d4ca-6d9a-40fd-be6b-8776d9381979.png} +0 -0
- /kotonebot/kaa/sprites/{c8413601-dfa2-40e0-91f2-763b7d89a114.png → ccd3e45a-67f9-4528-9c1e-3b271681a4f3.png} +0 -0
- /kotonebot/kaa/sprites/{4f362851-9cb3-4e57-91a1-b71debd75c82.png → cf43d0d1-beb1-46e8-a0aa-be6d87d381ba.png} +0 -0
- /kotonebot/kaa/sprites/{b0cad7f2-80b5-4684-9f57-29eb0069fa05.png → d3bbcccd-6b1f-4468-9e1d-78d9e3c5b50d.png} +0 -0
- /kotonebot/kaa/sprites/{3e689d22-6785-465c-9081-1500e5e7a97a.png → d443e15b-0869-404b-89cc-04a27f8602e6.png} +0 -0
- /kotonebot/kaa/sprites/{45a77857-0942-4971-89c6-02142b9bf4b4.png → d4d253c9-4fbf-4a62-b6c1-95ed1f35f752.png} +0 -0
- /kotonebot/kaa/sprites/{07e157fd-ab89-46f4-80b9-ed414df5c453.png → db4308dd-294f-43e8-af8e-744125548b24.png} +0 -0
- /kotonebot/kaa/sprites/{ce1f7653-ad09-4674-9e92-78f1db47b3b4.png → dc8be9f6-a45d-4d7f-bda1-f0cd7d5171cd.png} +0 -0
- /kotonebot/kaa/sprites/{b774e32d-03e4-4aee-9d58-8d25bbdd833d.png → de629d6b-4d58-4065-8c21-435b6edcd205.png} +0 -0
- /kotonebot/kaa/sprites/{b387c86e-cf0e-4f54-8691-46d446b09d4e.png → dede75f5-1b61-44c4-9a4d-5751ac529337.png} +0 -0
- /kotonebot/kaa/sprites/{69a4dcf1-839a-4a55-8c68-69c43a666ee9.png → df643943-b856-4b6c-b898-bab41cea1cf2.png} +0 -0
- /kotonebot/kaa/sprites/{8ed37cbb-dc66-4c69-91e8-62ead7eb0175.png → e11102ca-c2b1-4a7a-8995-0823ad354dbb.png} +0 -0
- /kotonebot/kaa/sprites/{b2132dc4-40f7-446b-9042-d76c15366498.png → e82e7eac-f541-42c7-97fc-7e7f5684e862.png} +0 -0
- /kotonebot/kaa/sprites/{5f06d649-ec0f-4edb-9016-e23d7934e8ca.png → eb617da8-23bf-462a-98fc-d89e9a3063a2.png} +0 -0
- /kotonebot/kaa/sprites/{a9a1f783-55e3-4786-9063-5c5772324978.png → ef59c2b1-a915-4fe2-85b1-26dfb965a865.png} +0 -0
- /kotonebot/kaa/sprites/{d19877d6-85cd-46a1-b10b-cd593afdb34f.png → f0e5c302-65c2-4976-b3ca-771b4ddd1922.png} +0 -0
- /kotonebot/kaa/sprites/{98b4eac1-666e-4c90-9a16-f3b597a118bf.png → f3075a74-6297-418d-918a-896361e23703.png} +0 -0
- /kotonebot/kaa/sprites/{87567103-95f8-468b-8b99-c5d33b4efd45.png → f34ea72e-ce20-4d30-b332-a2be3cb656ce.png} +0 -0
- /kotonebot/kaa/sprites/{fece9bdd-05d8-452a-81b4-96f7ad4792ef.png → f3874241-8c5f-4508-9577-f2966d4557dc.png} +0 -0
- /kotonebot/kaa/sprites/{10e6f171-6fb3-4a03-bdaf-2964b52ec78d.png → f40db0e0-09a3-48d0-a222-6b23984357a7.png} +0 -0
- /kotonebot/kaa/sprites/{c38f7c08-06a4-40a9-a0ce-9b36b1f988b2.png → fe4bc939-7302-4b48-a6d3-e4e25b8fe112.png} +0 -0
- {ksaa-2025.5.16.0.dist-info → ksaa-2025.5.23.0.dist-info}/entry_points.txt +0 -0
- {ksaa-2025.5.16.0.dist-info → ksaa-2025.5.23.0.dist-info}/top_level.txt +0 -0
|
@@ -7,11 +7,11 @@ from kotonebot.kaa.common import conf
|
|
|
7
7
|
from kotonebot.kaa.game_ui import WhiteFilter
|
|
8
8
|
from ..actions.scenes import at_home, goto_home
|
|
9
9
|
from ..actions.loading import wait_loading_end
|
|
10
|
-
from kotonebot import device, image, ocr, color, action, task, user, rect_expand, sleep, contains
|
|
10
|
+
from kotonebot import device, image, ocr, color, action, task, user, rect_expand, sleep, contains, Interval
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
14
|
-
@action('前往竞赛页面')
|
|
14
|
+
@action('前往竞赛页面', screenshot_mode='manual-inherit')
|
|
15
15
|
def goto_contest() -> bool:
|
|
16
16
|
"""
|
|
17
17
|
前置条件:位于首页 \n
|
|
@@ -19,103 +19,134 @@ def goto_contest() -> bool:
|
|
|
19
19
|
|
|
20
20
|
:return: 是否存在未完成的挑战
|
|
21
21
|
"""
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
it = Interval()
|
|
23
|
+
has_ongoing_contest = None
|
|
24
|
+
while True:
|
|
25
|
+
device.screenshot()
|
|
26
|
+
it.wait()
|
|
27
|
+
|
|
28
|
+
if image.find(R.Common.ButtonContest):
|
|
29
|
+
device.click()
|
|
30
|
+
elif image.find(R.Daily.TextRoadToIdol):
|
|
31
|
+
# 已进入竞赛 Tab
|
|
32
|
+
if image.find(R.Daily.TextContestLastOngoing):
|
|
33
|
+
logger.info('Ongoing contest found.')
|
|
34
|
+
has_ongoing_contest = True
|
|
35
|
+
else:
|
|
36
|
+
has_ongoing_contest = False
|
|
37
|
+
# 点击进入竞赛页面
|
|
38
|
+
logger.debug('Clicked on Contest.')
|
|
39
|
+
device.click(R.Daily.PointContest)
|
|
40
|
+
continue
|
|
41
|
+
|
|
42
|
+
# 有未完成的挑战
|
|
43
|
+
if has_ongoing_contest is True:
|
|
44
|
+
if image.find(R.Daily.ButtonContestChallengeStart):
|
|
45
|
+
logger.info('Challenging.')
|
|
46
|
+
break
|
|
47
|
+
# 新开挑战
|
|
48
|
+
elif has_ongoing_contest is False:
|
|
49
|
+
if image.find(R.Daily.ButtonContestRanking):
|
|
50
|
+
logger.info('Now at pick contestant screen.')
|
|
51
|
+
break
|
|
52
|
+
# 跳过奖励领取
|
|
30
53
|
# [kotonebot-resource\sprites\jp\daily\screenshot_contest_season_reward.png]
|
|
31
54
|
# [screenshots/contest/acquire2.png]
|
|
32
55
|
device.click(R.Daily.PointDissmissContestReward)
|
|
33
|
-
sleep(1)
|
|
34
|
-
# [screenshots/contest/main.png]
|
|
35
|
-
else:
|
|
36
|
-
image.expect_wait(R.Daily.ButtonContestChallengeStart)
|
|
37
56
|
return has_ongoing_contest
|
|
38
57
|
|
|
39
|
-
@action('
|
|
40
|
-
def
|
|
58
|
+
@action('处理竞赛挑战', screenshot_mode='manual-inherit')
|
|
59
|
+
def handle_challenge() -> bool:
|
|
41
60
|
"""
|
|
42
|
-
选择并挑战
|
|
43
61
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
:param has_ongoing_contest: 是否有中断未完成的挑战
|
|
48
|
-
:return: 如果返回假,说明今天挑战次数已经用完了
|
|
62
|
+
前置条件:- \n
|
|
63
|
+
结束状态:位于竞赛选择对手界面
|
|
64
|
+
:return: 是否命中任何处理
|
|
49
65
|
"""
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
if not has_ongoing_contest:
|
|
53
|
-
image.expect_wait(R.Daily.ButtonContestRanking)
|
|
54
|
-
sleep(3) # 等待动画
|
|
55
|
-
# 随机选一个对手 [screenshots/contest/main.png]
|
|
56
|
-
logger.debug('Clicking on contestant.')
|
|
57
|
-
contestant_list = image.find_all(R.Daily.TextContestOverallStats)
|
|
58
|
-
if contestant_list is None or len(contestant_list) == 0:
|
|
59
|
-
logger.info('No contestant found. Today\'s challenge points used up.')
|
|
60
|
-
return False
|
|
61
|
-
# 按照y坐标从上到下排序对手列表
|
|
62
|
-
contestant_list.sort(key=lambda x: x.position[1])
|
|
63
|
-
if len(contestant_list) != 3:
|
|
64
|
-
logger.warning('Cannot find all 3 contestants.')
|
|
65
|
-
# 选择配置文件中对应的对手顺序(1最强,3最弱)
|
|
66
|
-
target = conf().contest.select_which_contestant
|
|
67
|
-
if target >= 1 and target <= 3 and target <= len(contestant_list):
|
|
68
|
-
target -= 1 # [1, 3]映射至[0, 2]
|
|
69
|
-
else:
|
|
70
|
-
target = 0 # 出错则默认选择第一个
|
|
71
|
-
contestant = contestant_list[target]
|
|
72
|
-
logger.info('Picking up contestant #%d.', target + 1)
|
|
73
|
-
device.click(contestant)
|
|
74
|
-
# 挑战开始 [screenshots/contest/start1.png]
|
|
66
|
+
# 挑战开始 [screenshots/contest/start1.png]
|
|
67
|
+
if image.find(R.Daily.ButtonContestStart, threshold=0.75): # TODO: 为什么默认阈值找不到?
|
|
75
68
|
logger.debug('Clicking on start button.')
|
|
76
|
-
device.click(
|
|
77
|
-
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if image.find(R.Daily.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
logger.debug('Waiting for challenge start screen.')
|
|
69
|
+
device.click()
|
|
70
|
+
|
|
71
|
+
# 记忆未编成 [screenshots/contest/no_memo.png]
|
|
72
|
+
if image.find(R.Daily.TextContestNoMemory):
|
|
73
|
+
logger.debug('Memory not set. Using auto-compilation.')
|
|
74
|
+
user.warning('竞赛未编成', _('记忆未编成。将使用自动编成。'), once=True)
|
|
75
|
+
if image.find(R.Daily.ButtonContestChallenge):
|
|
76
|
+
device.click()
|
|
77
|
+
return True
|
|
78
|
+
|
|
87
79
|
# 勾选跳过所有
|
|
88
|
-
|
|
80
|
+
# [screenshots/contest/contest2.png]
|
|
81
|
+
if image.find(R.Common.CheckboxUnchecked, colored=True):
|
|
89
82
|
logger.debug('Checking skip all.')
|
|
90
83
|
device.click()
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
84
|
+
return True
|
|
85
|
+
|
|
86
|
+
# 跳过所有
|
|
87
|
+
# [screenshots/contest/contest1.png]
|
|
88
|
+
if image.find(R.Daily.ButtonIconSkip, preprocessors=[WhiteFilter()]):
|
|
89
|
+
logger.debug('Skipping all.')
|
|
90
|
+
device.click()
|
|
91
|
+
return True
|
|
92
|
+
|
|
93
|
+
if image.find(R.Common.ButtonNextNoIcon):
|
|
94
|
+
logger.debug('Clicking on next.')
|
|
95
|
+
device.click()
|
|
96
|
+
|
|
97
|
+
# 終了 [screenshots/contest/after_contest3.png]
|
|
98
|
+
if image.find(R.Common.ButtonEnd):
|
|
99
|
+
logger.debug('Clicking on end.')
|
|
100
|
+
device.click()
|
|
101
|
+
return True
|
|
102
|
+
|
|
105
103
|
# 可能出现的奖励弹窗 [screenshots/contest/after_contest4.png]
|
|
106
|
-
sleep(1)
|
|
107
104
|
if image.find(R.Common.ButtonClose):
|
|
108
105
|
logger.debug('Clicking on close.')
|
|
109
106
|
device.click()
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
@action('选择对手')
|
|
111
|
+
def handle_pick_contestant(has_ongoing_contest: bool = False) -> tuple[bool, bool]:
|
|
112
|
+
"""
|
|
113
|
+
选择并挑战
|
|
114
|
+
|
|
115
|
+
前置条件:位于竞赛界面 \n
|
|
116
|
+
结束状态:位于竞赛界面
|
|
117
|
+
|
|
118
|
+
:param has_ongoing_contest: 是否有中断未完成的挑战
|
|
119
|
+
:return: 二元组。第一个值表示是否命中任何处理。
|
|
120
|
+
第二个值表示是否应该继续挑战,为 False 表示今天挑战次数已经用完了。
|
|
121
|
+
"""
|
|
122
|
+
if image.find(R.Daily.ButtonContestRanking):
|
|
123
|
+
# 无进行中挑战,说明要选择对手
|
|
124
|
+
if not has_ongoing_contest:
|
|
125
|
+
# 随机选一个对手 [screenshots/contest/main.png]
|
|
126
|
+
logger.debug('Clicking on contestant.')
|
|
127
|
+
contestant_list = image.find_all(R.Daily.TextContestOverallStats)
|
|
128
|
+
if contestant_list is None or len(contestant_list) == 0:
|
|
129
|
+
logger.info('No contestant found. Today\'s challenge points used up.')
|
|
130
|
+
return True, False
|
|
131
|
+
# 按照y坐标从上到下排序对手列表
|
|
132
|
+
contestant_list.sort(key=lambda x: x.position[1])
|
|
133
|
+
if len(contestant_list) != 3:
|
|
134
|
+
logger.warning('Cannot find all 3 contestants.')
|
|
135
|
+
# 选择配置文件中对应的对手顺序(1最强,3最弱)
|
|
136
|
+
target = conf().contest.select_which_contestant
|
|
137
|
+
if target >= 1 and target <= 3 and target <= len(contestant_list):
|
|
138
|
+
target -= 1 # [1, 3]映射至[0, 2]
|
|
139
|
+
else:
|
|
140
|
+
target = 0 # 出错则默认选择第一个
|
|
141
|
+
contestant = contestant_list[target]
|
|
142
|
+
logger.info('Picking up contestant #%d.', target + 1)
|
|
143
|
+
device.click(contestant)
|
|
144
|
+
sleep(2)
|
|
145
|
+
return True, True
|
|
146
|
+
return False, True
|
|
115
147
|
|
|
116
148
|
@task('竞赛')
|
|
117
149
|
def contest():
|
|
118
|
-
""""""
|
|
119
150
|
if not conf().contest.enabled:
|
|
120
151
|
logger.info('Contest is disabled.')
|
|
121
152
|
return
|
|
@@ -129,17 +160,20 @@ def contest():
|
|
|
129
160
|
logger.info('No action needed.')
|
|
130
161
|
return
|
|
131
162
|
has_ongoing_contest = goto_contest()
|
|
132
|
-
while
|
|
133
|
-
|
|
163
|
+
while True:
|
|
164
|
+
device.screenshot()
|
|
165
|
+
handled, should_continue = handle_pick_contestant(has_ongoing_contest)
|
|
166
|
+
if not should_continue:
|
|
167
|
+
break
|
|
168
|
+
if not handled:
|
|
169
|
+
handled = handle_challenge()
|
|
170
|
+
if not handled:
|
|
171
|
+
device.click(10, 10)
|
|
134
172
|
has_ongoing_contest = False
|
|
135
173
|
goto_home()
|
|
136
174
|
logger.info('Contest all finished.')
|
|
137
|
-
|
|
138
175
|
|
|
139
176
|
if __name__ == '__main__':
|
|
140
|
-
import
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
logger.setLevel(logging.DEBUG)
|
|
144
|
-
|
|
145
|
-
contest()
|
|
177
|
+
from kotonebot.kaa.main import Kaa
|
|
178
|
+
from kotonebot.backend.context import tasks_from_id
|
|
179
|
+
Kaa('config.json').run(tasks_from_id(['contest']))
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import logging
|
|
3
3
|
|
|
4
4
|
from kotonebot.kaa.tasks import R
|
|
5
|
+
|
|
6
|
+
from kotonebot.primitives import Rect
|
|
5
7
|
from kotonebot.kaa.common import conf, Priority
|
|
6
8
|
from ..actions.loading import wait_loading_end
|
|
7
9
|
from ..actions.scenes import at_home, goto_home
|
|
@@ -70,8 +72,8 @@ def claim_pass_reward():
|
|
|
70
72
|
# [screenshots/mission/daily.png]
|
|
71
73
|
pass_rect = image.expect_wait(R.Daily.ButtonIconPass, timeout=1).rect
|
|
72
74
|
# 向右扩展 150px,向上扩展 35px
|
|
73
|
-
color_rect = (pass_rect
|
|
74
|
-
if not color.find('#ff1249', rect=color_rect):
|
|
75
|
+
color_rect = (pass_rect.x1, pass_rect.y1 - 35, pass_rect.w + 150, pass_rect.h + 35)
|
|
76
|
+
if not color.find('#ff1249', rect=Rect(xywh=color_rect)):
|
|
75
77
|
logger.info('No pass reward to claim.')
|
|
76
78
|
return
|
|
77
79
|
logger.info('Claiming pass reward.')
|
|
@@ -130,8 +132,6 @@ if __name__ == '__main__':
|
|
|
130
132
|
logging.basicConfig(level=logging.INFO, format='[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s] [%(lineno)d] %(message)s')
|
|
131
133
|
logging.getLogger('kotonebot').setLevel(logging.DEBUG)
|
|
132
134
|
logger.setLevel(logging.DEBUG)
|
|
133
|
-
from .common import conf
|
|
134
|
-
conf().mission_reward.enabled = True
|
|
135
135
|
|
|
136
136
|
# if image.find(R.Common.CheckboxUnchecked):
|
|
137
137
|
# logger.debug('Checking skip all.')
|
kotonebot/kaa/tasks/end_game.py
CHANGED
|
@@ -6,6 +6,7 @@ import _thread
|
|
|
6
6
|
import threading
|
|
7
7
|
|
|
8
8
|
from kotonebot.ui import user
|
|
9
|
+
from ..kaa_context import instance
|
|
9
10
|
from kotonebot.kaa.common import Priority, conf
|
|
10
11
|
from kotonebot import task, action, config, device
|
|
11
12
|
|
|
@@ -56,15 +57,7 @@ def end_game():
|
|
|
56
57
|
|
|
57
58
|
# 关闭模拟器
|
|
58
59
|
if conf().end_game.kill_emulator:
|
|
59
|
-
|
|
60
|
-
if emulator_path is None:
|
|
61
|
-
logger.warning("Emulator path is not set. Skipping")
|
|
62
|
-
user.info("「关闭模拟器」功能需要配置「模拟器 exe 文件路径」。")
|
|
63
|
-
else:
|
|
64
|
-
exe_name = os.path.basename(emulator_path)
|
|
65
|
-
os.system(f"taskkill /f /im {exe_name}")
|
|
66
|
-
logger.info("Emulator closed")
|
|
67
|
-
# TODO: 实现关闭模拟器
|
|
60
|
+
instance().stop()
|
|
68
61
|
|
|
69
62
|
# 关机
|
|
70
63
|
if conf().end_game.shutdown:
|
|
@@ -10,7 +10,8 @@ from kotonebot.kaa.tasks import R
|
|
|
10
10
|
from kotonebot.kaa.common import conf
|
|
11
11
|
from kotonebot.kaa.game_ui import dialog
|
|
12
12
|
from kotonebot.kaa.util.trace import trace
|
|
13
|
-
from kotonebot import
|
|
13
|
+
from kotonebot.primitives import RectTuple, Rect
|
|
14
|
+
from kotonebot import action, Interval, Countdown, device, image, sleep, ocr, contains, use_screenshot, color
|
|
14
15
|
|
|
15
16
|
class SkillCard(NamedTuple):
|
|
16
17
|
available: bool
|
|
@@ -159,7 +160,7 @@ def do_cards(
|
|
|
159
160
|
if no_remaining_card and no_card_cd.expired():
|
|
160
161
|
logger.debug('No remaining card detected. Skip this turn.')
|
|
161
162
|
# TODO: HARD CODEDED
|
|
162
|
-
SKIP_POSITION = (621, 739, 85, 85)
|
|
163
|
+
SKIP_POSITION = Rect(621, 739, 85, 85)
|
|
163
164
|
device.click(SKIP_POSITION)
|
|
164
165
|
no_card_cd.reset()
|
|
165
166
|
continue
|
|
@@ -185,7 +186,7 @@ def do_cards(
|
|
|
185
186
|
continue
|
|
186
187
|
card_rects = calc_card_position(card_count)
|
|
187
188
|
card_rect = card_rects[0]
|
|
188
|
-
device.double_click(card_rect[:4])
|
|
189
|
+
device.double_click(Rect(xywh=card_rect[:4]))
|
|
189
190
|
sleep(2)
|
|
190
191
|
timeout_cd.reset()
|
|
191
192
|
# 结束条件
|
|
@@ -277,7 +278,7 @@ def handle_recommended_card(
|
|
|
277
278
|
def skill_card_count(img: MatLike | None = None):
|
|
278
279
|
"""获取当前持有的技能卡数量"""
|
|
279
280
|
img = use_screenshot(img)
|
|
280
|
-
x, y, w, h = R.InPurodyuusu.BoxCardLetter
|
|
281
|
+
x, y, w, h = R.InPurodyuusu.BoxCardLetter.xywh
|
|
281
282
|
img = img[y:y+h, x:x+w]
|
|
282
283
|
count = image.raw().count(img, R.InPurodyuusu.A)
|
|
283
284
|
count += image.raw().count(img, R.InPurodyuusu.M)
|
|
@@ -346,7 +347,7 @@ def detect_recommended_card(
|
|
|
346
347
|
right_score,
|
|
347
348
|
top_score,
|
|
348
349
|
bottom_score,
|
|
349
|
-
(x, y, w, h)
|
|
350
|
+
Rect(x, y, w, h)
|
|
350
351
|
))
|
|
351
352
|
img = original_image.copy()
|
|
352
353
|
# cv2.imshow(f"card detect {return_value}", cv2.cvtColor(glow_area, cv2.COLOR_HSV2BGR))
|
|
@@ -376,7 +377,7 @@ def detect_recommended_card(
|
|
|
376
377
|
)
|
|
377
378
|
# 跟踪检测结果
|
|
378
379
|
if conf().trace.recommend_card_detection:
|
|
379
|
-
x, y, w, h = filtered_results[0].rect
|
|
380
|
+
x, y, w, h = filtered_results[0].rect.xywh
|
|
380
381
|
cv2.rectangle(original_image, (x, y), (x+w, y+h), (0, 0, 255), 3)
|
|
381
382
|
trace('rec-card', original_image, {
|
|
382
383
|
'card_count': card_count,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from typing import Literal
|
|
2
2
|
from logging import getLogger
|
|
3
3
|
|
|
4
|
-
from kotonebot.kaa.tasks import R
|
|
5
4
|
from kotonebot import (
|
|
6
5
|
ocr,
|
|
7
6
|
device,
|
|
@@ -10,6 +9,8 @@ from kotonebot import (
|
|
|
10
9
|
sleep,
|
|
11
10
|
Interval,
|
|
12
11
|
)
|
|
12
|
+
from kotonebot.primitives import Rect
|
|
13
|
+
from kotonebot.kaa.tasks import R
|
|
13
14
|
from .p_drink import acquire_p_drink
|
|
14
15
|
from kotonebot.util import measure_time
|
|
15
16
|
from kotonebot.kaa.common import conf
|
|
@@ -89,16 +90,17 @@ def select_p_item():
|
|
|
89
90
|
# 前置条件 [screenshots/produce/in_produce/claim_p_item.png]
|
|
90
91
|
|
|
91
92
|
POSTIONS = [
|
|
92
|
-
(157, 820, 128, 128), # x, y, w, h
|
|
93
|
-
(296, 820, 128, 128),
|
|
94
|
-
(435, 820, 128, 128),
|
|
93
|
+
Rect(157, 820, 128, 128), # x, y, w, h
|
|
94
|
+
Rect(296, 820, 128, 128),
|
|
95
|
+
Rect(435, 820, 128, 128),
|
|
95
96
|
] # TODO: HARD CODED
|
|
96
97
|
device.click(POSTIONS[0])
|
|
97
98
|
sleep(0.5)
|
|
98
99
|
device.click(ocr.expect_wait('受け取る'))
|
|
99
100
|
|
|
101
|
+
|
|
100
102
|
@action('技能卡自选强化', screenshot_mode='manual-inherit')
|
|
101
|
-
def
|
|
103
|
+
def handle_skill_card_enhance():
|
|
102
104
|
"""
|
|
103
105
|
前置条件:技能卡强化对话框\n
|
|
104
106
|
结束状态:技能卡强化动画结束后瞬间
|
|
@@ -107,24 +109,26 @@ def hanlde_skill_card_enhance():
|
|
|
107
109
|
"""
|
|
108
110
|
# 前置条件 [kotonebot-resource\sprites\jp\in_purodyuusu\screenshot_skill_card_enhane.png]
|
|
109
111
|
# 结束状态 [screenshots/produce/in_produce/skill_card_enhance.png]
|
|
110
|
-
cards = image.
|
|
112
|
+
cards = image.find_all_multi([
|
|
111
113
|
R.InPurodyuusu.A,
|
|
112
114
|
R.InPurodyuusu.M
|
|
113
115
|
])
|
|
114
116
|
if cards is None:
|
|
115
117
|
logger.info("No skill cards found")
|
|
116
118
|
return False
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
cards = sorted(cards, key=lambda x: (x.position[1], x.position[0]))
|
|
120
|
+
it = Interval(0.5)
|
|
121
|
+
for card in reversed(cards):
|
|
122
|
+
device.click(card)
|
|
123
|
+
it.wait()
|
|
121
124
|
device.screenshot()
|
|
122
125
|
if image.find(R.InPurodyuusu.ButtonEnhance, colored=True):
|
|
123
126
|
logger.debug("Enhance button found")
|
|
124
127
|
device.click()
|
|
128
|
+
it.wait()
|
|
125
129
|
break
|
|
126
|
-
it.wait()
|
|
127
130
|
logger.debug("Handle skill card enhance finished.")
|
|
131
|
+
return True
|
|
128
132
|
|
|
129
133
|
@action('技能卡自选删除', screenshot_mode='manual-inherit')
|
|
130
134
|
def handle_skill_card_removal():
|
|
@@ -220,7 +224,7 @@ def fast_acquisitions() -> AcquisitionType | None:
|
|
|
220
224
|
|
|
221
225
|
# 技能卡自选强化
|
|
222
226
|
if image.find(R.InPurodyuusu.IconTitleSkillCardEnhance):
|
|
223
|
-
if
|
|
227
|
+
if handle_skill_card_enhance():
|
|
224
228
|
return "PSkillCardEnhanceSelect"
|
|
225
229
|
device.click(10, 10)
|
|
226
230
|
|
|
@@ -2,6 +2,7 @@ import logging
|
|
|
2
2
|
from typing_extensions import assert_never
|
|
3
3
|
from typing import Literal
|
|
4
4
|
|
|
5
|
+
from kotonebot.kaa.game_ui.schedule import Schedule
|
|
5
6
|
from kotonebot.kaa.tasks import R
|
|
6
7
|
from ..actions import loading
|
|
7
8
|
from kotonebot.kaa.game_ui import WhiteFilter, dialog
|
|
@@ -33,11 +34,10 @@ def handle_sp_lesson():
|
|
|
33
34
|
前置条件:行动页面\n
|
|
34
35
|
结束状态:练习场景,以及中间可能出现的加载、支援卡奖励、交流等
|
|
35
36
|
"""
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
device.double_click(pt[0] + 30, pt[1] + 30)
|
|
37
|
+
schedule = Schedule()
|
|
38
|
+
if schedule.have_lesson():
|
|
39
|
+
lesson = schedule.select_lesson()
|
|
40
|
+
device.double_click(lesson.rect)
|
|
41
41
|
return True
|
|
42
42
|
else:
|
|
43
43
|
return False
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
from logging import getLogger
|
|
2
2
|
|
|
3
3
|
from kotonebot.kaa.tasks import R
|
|
4
|
+
from kotonebot.primitives import Rect
|
|
4
5
|
from kotonebot import device, image, action, sleep
|
|
5
6
|
|
|
6
7
|
logger = getLogger(__name__)
|
|
7
8
|
|
|
8
9
|
# 三个饮料的坐标
|
|
9
10
|
POSTIONS = [
|
|
10
|
-
(157, 820, 128, 128), # x, y, w, h
|
|
11
|
-
(296, 820, 128, 128),
|
|
12
|
-
(435, 820, 128, 128),
|
|
11
|
+
Rect(157, 820, 128, 128), # x, y, w, h
|
|
12
|
+
Rect(296, 820, 128, 128),
|
|
13
|
+
Rect(435, 820, 128, 128),
|
|
13
14
|
] # TODO: HARD CODED
|
|
14
15
|
|
|
15
16
|
@action('领取 P 饮料')
|
|
@@ -15,7 +15,7 @@ from ..actions.scenes import at_home, goto_home
|
|
|
15
15
|
from kotonebot.kaa.game_ui.idols_overview import locate_idol
|
|
16
16
|
from ..produce.in_purodyuusu import hajime_pro, hajime_regular, hajime_master, resume_pro_produce, resume_regular_produce, \
|
|
17
17
|
resume_master_produce
|
|
18
|
-
from kotonebot import device, image, ocr, task, action, sleep, contains
|
|
18
|
+
from kotonebot import device, image, ocr, task, action, sleep, contains, regex
|
|
19
19
|
|
|
20
20
|
logger = logging.getLogger(__name__)
|
|
21
21
|
|
|
@@ -159,7 +159,7 @@ def resume_produce():
|
|
|
159
159
|
current_week = int(weeks[0])
|
|
160
160
|
break
|
|
161
161
|
retry_count += 1
|
|
162
|
-
logger.warning(f'Failed to detect weeks. Retrying... ({retry_count}/{max_retries})')
|
|
162
|
+
logger.warning(f'Failed to detect weeks. week_text="{week_text}". Retrying... ({retry_count}/{max_retries})')
|
|
163
163
|
sleep(0.5)
|
|
164
164
|
device.screenshot()
|
|
165
165
|
|
|
@@ -209,10 +209,12 @@ def do_produce(
|
|
|
209
209
|
|
|
210
210
|
# 0. 进入培育页面
|
|
211
211
|
mode_text = mode.upper()
|
|
212
|
+
if mode_text == 'MASTER':
|
|
213
|
+
mode_text = 'MASTER|MIASTER'
|
|
212
214
|
logger.info(f'Enter produce page. Mode: {mode_text}')
|
|
213
215
|
result = (SimpleDispatcher('enter_produce')
|
|
214
216
|
.click(R.Produce.ButtonProduce)
|
|
215
|
-
.click(
|
|
217
|
+
.click(regex(mode_text))
|
|
216
218
|
.until(R.Produce.ButtonPIdolOverview, result=True)
|
|
217
219
|
.until(R.Produce.TextAPInsufficient, result=False)
|
|
218
220
|
).run()
|
|
@@ -112,7 +112,7 @@ def windows_launch():
|
|
|
112
112
|
ahk_path = str(resources.files('kaa.res.bin') / 'AutoHotkey.exe')
|
|
113
113
|
ahk = AHK(executable_path=ahk_path)
|
|
114
114
|
|
|
115
|
-
if ahk.find_window(title='gakumas'):
|
|
115
|
+
if ahk.find_window(title='gakumas', title_match_mode=3): # 3=精确匹配
|
|
116
116
|
logger.debug('Game already started.')
|
|
117
117
|
return
|
|
118
118
|
|
|
@@ -121,7 +121,7 @@ def windows_launch():
|
|
|
121
121
|
# 等待游戏窗口出现
|
|
122
122
|
it = Interval()
|
|
123
123
|
while True:
|
|
124
|
-
if ahk.find_window(title='gakumas'):
|
|
124
|
+
if ahk.find_window(title='gakumas', title_match_mode=3):
|
|
125
125
|
logger.debug('Game window found.')
|
|
126
126
|
break
|
|
127
127
|
logger.debug('Waiting for game window...')
|
kotonebot/primitives/__init__.py
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from .visual import Image, Template
|
|
2
|
+
from .geometry import Point, Rect, Size, Vector2D, Vector3D, is_point, is_rect
|
|
3
|
+
from .geometry import RectTuple, PointTuple
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
'Image',
|
|
7
|
+
'Template',
|
|
8
|
+
'Point',
|
|
9
|
+
'Rect',
|
|
10
|
+
'Size',
|
|
11
|
+
'Vector2D',
|
|
12
|
+
'Vector3D',
|
|
13
|
+
'is_point',
|
|
14
|
+
'is_rect',
|
|
15
|
+
'RectTuple',
|
|
16
|
+
'PointTuple'
|
|
17
|
+
]
|