ksaa 2025.9.post2__py3-none-any.whl → 2025.11__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.
- kaa/__init__.py +0 -0
- kaa/application/__init__.py +0 -0
- kaa/application/core/misc_core.py +4 -1
- kaa/application/services/__init__.py +0 -0
- kaa/application/services/config_service.py +101 -0
- kaa/application/services/feedback_service.py +121 -0
- kaa/application/services/produce_solution_service.py +83 -0
- kaa/application/services/task_service.py +145 -0
- kaa/application/services/update_service.py +208 -0
- kaa/application/ui/__init__.py +0 -0
- kaa/application/ui/common.py +123 -0
- kaa/application/ui/components/alert.py +251 -0
- kaa/application/ui/components/alert.pyi +257 -0
- kaa/application/ui/components/categorized_select.pyi +697 -0
- kaa/application/ui/facade.py +189 -0
- kaa/application/ui/gradio_view.py +135 -0
- kaa/application/ui/views/__init__.py +0 -0
- kaa/application/ui/views/feedback_view.py +65 -0
- kaa/application/ui/views/produce_view.py +251 -0
- kaa/application/ui/views/settings_view.py +581 -0
- kaa/application/ui/views/status_view.py +171 -0
- kaa/application/ui/views/task_view.py +102 -0
- kaa/application/ui/views/update_view.py +106 -0
- kaa/config/schema.py +26 -6
- kaa/errors.py +75 -0
- kaa/main/dmm_host.py +60 -60
- kaa/main/gr.py +60 -3115
- kaa/main/kaa.py +11 -3
- kaa/metadata.py +10 -0
- kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
- kaa/resources/game.db +0 -0
- kaa/resources/game_ver.txt +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
- kaa/sprites/0cdd57aa-9bdd-4c83-9565-de7c229b34e3.png +0 -0
- kaa/sprites/16f04ca1-05a3-49c7-88ae-a0d02c1ec2ec.png +0 -0
- kaa/sprites/20ca6d42-c19e-4c3e-b82c-f6642bbe5069.png +0 -0
- kaa/sprites/276c0178-65af-4b69-a3c3-d04253b9ed91.png +0 -0
- kaa/sprites/32de6ba0-859f-4f40-a57e-92bed913e3a7.png +0 -0
- kaa/sprites/38613745-1cf2-4bf1-9f58-0474b1e46895.png +0 -0
- kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
- kaa/sprites/44097699-487f-4932-846a-095a427f4ed8.png +0 -0
- kaa/sprites/459f532f-115c-4527-a897-affa7ddcbd76.png +0 -0
- kaa/sprites/46cb87f6-26f7-45f0-b10c-6491f115077e.png +0 -0
- kaa/sprites/4b02f8d4-7847-47a5-8f01-7ab5123709e5.png +0 -0
- kaa/sprites/4b7426e9-395a-410c-bb99-c6f0a7b81208.png +0 -0
- kaa/sprites/4c243ed4-9ac2-42ba-89c6-946ffef84120.png +0 -0
- kaa/sprites/527c3803-1ddd-4f6b-a896-815d3c2e4caa.png +0 -0
- kaa/sprites/54d67100-70c7-4a00-afaa-a80771d34893.png +0 -0
- kaa/sprites/5588396d-dd38-4ef1-8c37-3041a750b1cc.png +0 -0
- kaa/sprites/5933f6ab-7af4-4731-aac8-d95939a3fbbf.png +0 -0
- kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
- kaa/sprites/5c735cc5-7801-44e9-a8f1-2d44df4fa919.png +0 -0
- kaa/sprites/678073ec-6700-4d94-af41-b392af11201b.png +0 -0
- kaa/sprites/6a27faad-df3b-49d9-a20f-64ae8e8f9e22.png +0 -0
- kaa/sprites/6b63fca9-a1ec-490e-96e9-fc0beeeb8851.png +0 -0
- kaa/sprites/6baaecdd-2817-4ba3-a2da-346ef9ef92fd.png +0 -0
- kaa/sprites/6c82d28f-913c-4444-baa6-2e37c7e24bc6.png +0 -0
- kaa/sprites/6d302c9d-72cd-49b5-bb11-c39140ffbdd1.png +0 -0
- kaa/sprites/6e603eb6-2336-46d2-ad01-2ba2fc3d4cbd.png +0 -0
- kaa/sprites/7156a1b5-cdd7-446e-9caf-d9f6b313ef4d.png +0 -0
- kaa/sprites/7469d458-d308-4469-8bf1-b63e1ddc6a3c.png +0 -0
- kaa/sprites/78868e34-1c2a-40ee-b08c-c89e6a3aea54.png +0 -0
- kaa/sprites/7c8e37b7-173f-4c03-8f11-bbd47f2a02c2.png +0 -0
- kaa/sprites/7ce3a2d5-efa7-4091-b012-f2870d9df422.png +0 -0
- kaa/sprites/7db2d761-ab44-4b3b-85aa-9b9758f97d5d.png +0 -0
- kaa/sprites/7ddaa9db-2287-43ba-8531-065e618ac8ef.png +0 -0
- kaa/sprites/7def2661-0847-4459-88c6-5270c2e8a32c.png +0 -0
- kaa/sprites/821c86c1-bc35-40bc-95db-f66935a92299.png +0 -0
- kaa/sprites/8448237d-2db5-49ca-8d55-9fc0e56639a7.png +0 -0
- kaa/sprites/89663a2f-c6d3-4bb7-9935-a54d11d0a382.png +0 -0
- kaa/sprites/8a312cf5-c670-4a52-a03b-fe55e78f8f07.png +0 -0
- kaa/sprites/8b6a1eed-341d-4be1-b0ae-9adc52ed4543.png +0 -0
- kaa/sprites/8e024c75-c872-4e18-bb80-0c5894612815.png +0 -0
- kaa/sprites/92f7ef0b-7931-4cd3-afda-c553232eb443.png +0 -0
- kaa/sprites/9803a197-d873-43cc-9656-d63513e92fad.png +0 -0
- kaa/sprites/9934f05f-ee5f-4131-b08d-aa61d5f3505a.png +0 -0
- kaa/sprites/993f2140-77be-4fe2-8e11-f71c4531bc9a.png +0 -0
- kaa/sprites/9a8bfa87-0e37-4d54-888f-b79f8778d232.png +0 -0
- kaa/sprites/9b7eaa4c-2b67-4426-80da-b7538a87ed96.png +0 -0
- kaa/sprites/9bc6607d-ce44-467e-a5f4-b3cf30210c13.png +0 -0
- kaa/sprites/9db5de82-8fba-4b69-8faf-ffe7fcea32f8.png +0 -0
- kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
- kaa/sprites/a1251011-00a9-402b-82da-1d2744db26cf.png +0 -0
- kaa/sprites/a31e08c1-d3c3-4a99-a882-4a10de9ba815.png +0 -0
- kaa/sprites/a408adaa-bfab-4aaf-acf7-08a4a3ebdd4c.png +0 -0
- kaa/sprites/a408cdfd-e394-4ada-9f0e-5878e41b8e52.png +0 -0
- kaa/sprites/a4723b5b-2466-4ea4-b7ef-4185bb4dda74.png +0 -0
- kaa/sprites/a5ba613c-46f4-4442-88e1-fbda4dd65a55.png +0 -0
- kaa/sprites/a88e3da2-98d3-4a64-b7ac-040847028a83.png +0 -0
- kaa/sprites/a9868db0-b355-470e-9bbe-033c5efa4b5e.png +0 -0
- kaa/sprites/a9f020e9-0e4b-4ddc-b8b8-386009578c15.png +0 -0
- kaa/sprites/aa369159-cc3b-40f2-9fca-bca5b579cf97.png +0 -0
- kaa/sprites/aad1ac7d-cfa1-4459-9d46-d39c080bd78e.png +0 -0
- kaa/sprites/ab9e39ae-0856-4254-a6b6-585e82f8bf3b.png +0 -0
- kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
- kaa/sprites/aff3d8ac-d648-434c-9adb-6c1a10aa04b9.png +0 -0
- kaa/sprites/affc5006-4b67-4490-9fa7-557a7fecb133.png +0 -0
- kaa/sprites/b002896d-5093-48e5-9e01-d18bfb240961.png +0 -0
- kaa/sprites/b00b5890-3743-4064-8311-c5e35b3afbe6.png +0 -0
- kaa/sprites/b26ac4ff-42a0-45aa-b818-7d7603b52f12.png +0 -0
- kaa/sprites/b2a04604-15d4-4ff6-86f7-0823e642103f.png +0 -0
- kaa/sprites/b33bb89c-cabb-4fe0-822f-d911e8b42f82.png +0 -0
- kaa/sprites/b5584de5-650e-4fde-b743-ccbd02eab196.png +0 -0
- kaa/sprites/b5f80604-d7d3-49e0-9934-58f75c393ffb.png +0 -0
- kaa/sprites/b70b958a-9480-4b9b-86a4-5ea099535c36.png +0 -0
- kaa/sprites/b93b3c36-79a3-4c1a-944a-20fe6a88c46d.png +0 -0
- kaa/sprites/ba7676fe-4982-4e92-822d-9c1a623420ac.png +0 -0
- kaa/sprites/bb953e97-7185-4c2c-b177-48d743e90d96.png +0 -0
- kaa/sprites/bd176e60-3bb2-453f-b2ef-45305b7f21c1.png +0 -0
- kaa/sprites/c0478a52-d6c5-4029-848f-e3e22b2de858.png +0 -0
- kaa/sprites/c05baa1e-02c3-4d02-904f-76086edbb97f.png +0 -0
- kaa/sprites/c295af98-0b43-4f18-bbc3-e59d23055f1b.png +0 -0
- kaa/sprites/c424f4a1-d032-478d-ac82-b1127a429e52.png +0 -0
- kaa/sprites/c5356ad6-0f1e-42be-b090-059f33ea7cee.png +0 -0
- kaa/sprites/c54d4b7e-887c-4753-8a9e-6914fc408232.png +0 -0
- kaa/sprites/c68f1282-4d86-4b1a-b76b-dcf42f3f906b.png +0 -0
- kaa/sprites/c71f900b-9689-4800-89a0-e3371d33f47a.png +0 -0
- kaa/sprites/c7cad813-2326-4662-9f55-0a15e1dad3dc.png +0 -0
- kaa/sprites/c95e8a90-dd6e-4cca-b74b-85ee90dbd5c1.png +0 -0
- kaa/sprites/c98d6bc7-45ca-4877-8cd1-6f36d6a86a02.png +0 -0
- kaa/sprites/ca258eea-e69a-43c3-ad4c-ac7da0099011.png +0 -0
- kaa/sprites/cb8d5df6-300b-48e5-ae0b-2b4750c9c092.png +0 -0
- kaa/sprites/cc727107-139b-4092-bafb-4bc9787bcdfd.png +0 -0
- kaa/sprites/cd601176-0336-41c7-8d3f-31ddf8cf708d.png +0 -0
- kaa/sprites/cda022d1-7898-4006-95c5-b55eceda9d95.png +0 -0
- kaa/sprites/ce22506b-7410-4039-94de-dc1bdba8ac00.png +0 -0
- kaa/sprites/cea2d5c4-6e79-425e-9e98-7e7dbdee960b.png +0 -0
- kaa/sprites/cf302432-c592-4b6f-a6de-53c3e1bef23e.png +0 -0
- kaa/sprites/d0d9f650-bb30-4743-81f3-cd7ea8211d5c.png +0 -0
- kaa/sprites/d14a1c6c-339a-4dfe-9078-950d3518bc3b.png +0 -0
- kaa/sprites/d277a9c3-2b2c-42fc-9fbb-a836413c8cf4.png +0 -0
- kaa/sprites/d50d4438-65bc-4849-9a11-7e8b796e1b9d.png +0 -0
- kaa/sprites/d5407f49-fecc-404e-915a-22c9fa16a79a.png +0 -0
- kaa/sprites/d73e9e03-b910-42c0-9953-34980bff09f5.png +0 -0
- kaa/sprites/d8485972-4e67-4190-8d95-60fd3c68b2ce.png +0 -0
- kaa/sprites/d963e76b-3c25-4bc7-a307-78d97728a819.png +0 -0
- kaa/sprites/dab08e98-9053-4e2a-9e74-cf30298fea22.png +0 -0
- kaa/sprites/db25f60d-4772-44f9-85dc-aba4b20cffa2.png +0 -0
- kaa/sprites/dcbeb7cd-cd57-4daf-b023-ff2c7ef1621a.png +0 -0
- kaa/sprites/dd6f31d1-510d-4425-a160-958e7e984382.png +0 -0
- kaa/sprites/de047f08-cef2-4b22-846e-fba2a06f8996.png +0 -0
- kaa/sprites/df11b01f-2ab1-4bfb-831f-bb8dae6a092b.png +0 -0
- kaa/sprites/e2f64c10-4db0-47c8-b23d-94802493d6fb.png +0 -0
- kaa/sprites/e4be69f6-6030-4fd8-8a36-fd3938d1734b.png +0 -0
- kaa/sprites/e4d0719b-d127-41a0-a250-492f79bf5625.png +0 -0
- kaa/sprites/e5196344-d61a-48ff-bc48-63f8f63c3788.png +0 -0
- kaa/sprites/e6f8f2a8-39e3-45e1-8a52-f2dc250bcd95.png +0 -0
- kaa/sprites/e70ce43b-9b3b-4aa0-8b9c-1d5cc4a1d5b0.png +0 -0
- kaa/sprites/e7c00f25-b15a-4403-a201-07b9b168e9f5.png +0 -0
- kaa/sprites/e82b9645-ee3f-4f63-922e-c1d703344baf.png +0 -0
- kaa/sprites/e9fad64b-e4e2-46cb-a820-b2860b38da03.png +0 -0
- kaa/sprites/eab111a6-80bf-45c1-9a74-b44ca76508b7.png +0 -0
- kaa/sprites/ec0d03db-7c66-46b7-86cc-4acaa6eba1c9.png +0 -0
- kaa/sprites/edd2d38d-9071-4094-8931-1a68b6ebe1b8.png +0 -0
- kaa/sprites/eeff3d53-5a40-44c2-9d09-8f246157c72b.png +0 -0
- kaa/sprites/ef0db31a-fc44-4972-af7e-21c50f0b139c.png +0 -0
- kaa/sprites/f1fa2fc3-c3d4-4040-90f1-7941b98dcee5.png +0 -0
- kaa/sprites/f31531b4-79ea-41dc-b23f-e445b818139c.png +0 -0
- kaa/sprites/f35e19ca-7de7-4721-af53-b5f95c5e74fe.png +0 -0
- kaa/sprites/f5e1e7ed-fd35-42c3-97ed-5e9214a50733.png +0 -0
- kaa/sprites/f7246b84-e70b-47d3-8166-90f0dc4f2bb6.png +0 -0
- kaa/sprites/f7e8e937-1eda-4bd3-a3cf-d306cb1973e2.png +0 -0
- kaa/sprites/f8babf59-d55e-40c2-a0b7-5d743ab71799.png +0 -0
- kaa/sprites/f9697f23-07cf-4a14-8b22-d1fc95386c16.png +0 -0
- kaa/sprites/fad8b65b-7d9e-49d8-9f71-6d078aa672ca.png +0 -0
- kaa/sprites/fb017237-bac6-4b73-9437-4518e764ef45.png +0 -0
- kaa/sprites/fc86085c-d708-498a-bfa6-92e1a1364c60.png +0 -0
- kaa/tasks/R.py +140 -128
- kaa/tasks/common.py +5 -0
- kaa/tasks/daily/contest.py +2 -1
- kaa/tasks/daily/purchase.py +34 -2
- kaa/tasks/daily/upgrade_support_card.py +12 -2
- kaa/tasks/produce/cards.py +5 -4
- kaa/tasks/produce/common.py +202 -105
- kaa/tasks/produce/in_purodyuusu.py +35 -17
- kaa/tasks/produce/non_lesson_actions.py +10 -33
- kaa/tasks/produce/p_drink.py +5 -1
- kaa/tasks/produce/produce.py +12 -1
- kaa/tasks/start_game.py +61 -5
- kaa/util/reactive.py +182 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/METADATA +31 -27
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/RECORD +354 -176
- /kaa/sprites/{3504b421-58f2-4ca0-869e-764335d60406.png → 001486b2-f627-4ece-8c93-4dfec47da9b3.png} +0 -0
- /kaa/sprites/{7dc79a8b-bd59-4c93-a638-e49bca276c00.png → 011e352f-6e8b-4225-b104-d1b2ccf0761c.png} +0 -0
- /kaa/sprites/{69f15152-8ee9-4e39-9bfa-6cd1b051bc1e.png → 0240342e-b6f3-4ed6-8da5-a64092e6fcde.png} +0 -0
- /kaa/sprites/{15801cb7-24f6-4504-921b-5e5a37bdc064.png → 02df555c-b19c-4776-8f1b-d1a7e2ed2f82.png} +0 -0
- /kaa/sprites/{55a2ba58-2412-4c39-9c6e-2627092623a2.png → 0343a3b8-8cd6-47af-b956-760dd2c79711.png} +0 -0
- /kaa/sprites/{d62dab9b-d36d-490e-bca5-bfd4b66911d7.png → 04c287ed-9ab1-4cd1-af07-8ab61f7f49bc.png} +0 -0
- /kaa/sprites/{8d99cd97-ae34-488f-b62e-54d54f75e4e8.png → 05d7740b-c6ea-453a-b805-7d0a5fe18184.png} +0 -0
- /kaa/sprites/{66ccbeba-3291-4f1c-8669-d691f24ea9ed.png → 06a7097c-fef6-4f2c-bece-26eed414708e.png} +0 -0
- /kaa/sprites/{609a340b-2cfa-4cef-9e55-fb60c7cabdbb.png → 072b167f-a2f6-4458-815e-a92ca2e6c9eb.png} +0 -0
- /kaa/sprites/{e881ee18-154e-4f0c-91fe-4699d156671d.png → 0899a6e7-6617-4f11-a7a2-9ba377ad6cba.png} +0 -0
- /kaa/sprites/{689eebfd-984c-45c9-812f-26cf9c756bed.png → 0950d760-6d88-4265-b28c-0790a782a749.png} +0 -0
- /kaa/sprites/{76d5d7f7-b23d-4802-8f91-7058f7adcffd.png → 0a019c0d-26fa-4441-b281-b73060722bc9.png} +0 -0
- /kaa/sprites/{ac194536-54e4-49e7-992c-fc82ba401f10.png → 0a27a783-0ef8-4f99-8c26-cf89768b5146.png} +0 -0
- /kaa/sprites/{06ee3b1e-5c99-4ebf-8a23-d6f59cda32b8.png → 0af981f5-bcc9-48eb-a392-50f79ec5149a.png} +0 -0
- /kaa/sprites/{e7709d81-890b-438f-8acb-50492d63022e.png → 0afb71f5-0752-47af-9ba2-85bdbe4fcbf7.png} +0 -0
- /kaa/sprites/{62cc930f-acc2-424a-975f-164009a555f8.png → 0b83c2e5-ebb4-4a69-8b5f-658774d4c5a6.png} +0 -0
- /kaa/sprites/{ad63136d-2360-45e6-b7ef-00e01612c7ce.png → 0be5a84d-eb1e-4bb3-afcd-923e104190f4.png} +0 -0
- /kaa/sprites/{be2985ff-c3ac-4d94-9751-c652dd561db2.png → 0c192ca4-dd10-49b4-b0be-9b1fb4637910.png} +0 -0
- /kaa/sprites/{bca22a82-f72b-46ca-be06-c1e18b7ad27c.png → 0cae32b3-0248-49ad-98dd-d06a89308797.png} +0 -0
- /kaa/sprites/{a694f6e8-6ef9-4761-816a-ad586ce93654.png → 0d1fd6f0-3a6f-4008-a31a-8189dd09be50.png} +0 -0
- /kaa/sprites/{cde4da05-d654-4217-8443-752bc0709742.png → 0d2143fa-7e81-4e7a-8a94-c3839719de5b.png} +0 -0
- /kaa/sprites/{901b48f9-d7b7-46c2-85fa-b07e427ffdaa.png → 0dbb752b-e60a-459d-80fa-f5b49e8b8e4d.png} +0 -0
- /kaa/sprites/{80fa9c6e-fe05-4d3e-ae50-6b7e9a237e0b.png → 0e63e0b7-6874-46e9-86de-8c23e6491f24.png} +0 -0
- /kaa/sprites/{603c5369-9247-404d-bc6d-4719d11de6ea.png → 0f4ac9ae-5e4d-4f3f-b9e0-b76570f2b040.png} +0 -0
- /kaa/sprites/{7f90beb9-8712-4a53-a818-ff7a5e82d71d.png → 0f8026e8-62a9-49e5-97a6-0d78f33dcfcf.png} +0 -0
- /kaa/sprites/{6bcebf50-764b-4bf2-be8e-ba241d8550d7.png → 0f80ac6f-bdf8-4927-8393-c554209f517a.png} +0 -0
- /kaa/sprites/{4396a9b8-b7f0-45f3-8a8f-85773a10eecb.png → 116d3f3a-0255-47ed-b656-c26b41a5cfa8.png} +0 -0
- /kaa/sprites/{9a0172aa-9489-4985-9c65-c5f6db0a0325.png → 130cd7fd-767e-4177-9087-71f418f154dd.png} +0 -0
- /kaa/sprites/{333a1e30-82d3-45b9-8e48-4c127bcb5ec6.png → 138a527b-2191-4f0f-9e36-1d08bbf6ffb1.png} +0 -0
- /kaa/sprites/{cee6ca8f-219c-448d-9ba6-d6722f27b600.png → 1472da80-4cbb-41e1-94e8-3ea3defd3b6f.png} +0 -0
- /kaa/sprites/{94121408-8cd2-46fc-bf27-33b207e4cba8.png → 14875449-7478-4969-a2d5-91ce34c9d1e4.png} +0 -0
- /kaa/sprites/{15da6f78-d89f-480c-9cce-c95e009fd15a.png → 1539fcff-8842-478f-98a8-0d1a885d1b43.png} +0 -0
- /kaa/sprites/{97329116-4d2e-40d7-af96-938afdac4e60.png → 16113270-3f35-498a-a29a-52f190d77cc1.png} +0 -0
- /kaa/sprites/{545068ad-6f17-40d8-99e1-d26bd5700c67.png → 1617c180-ce9f-461a-bfdc-390337ecb205.png} +0 -0
- /kaa/sprites/{e38a2f35-9ac5-4363-bd6d-09893907ea71.png → 16cf9d8b-4f8e-47ce-a63d-fe9bfc3f31e8.png} +0 -0
- /kaa/sprites/{4fc6fae5-386d-434c-893d-5450bd5a6396.png → 1b485aa9-f0c0-4b49-ba75-363a8d6e292c.png} +0 -0
- /kaa/sprites/{4995d301-375b-4d23-a6e5-b26a771fcbe4.png → 1d560b06-feac-413d-bf90-07ac045f11fb.png} +0 -0
- /kaa/sprites/{e16b116c-6a2c-4e5d-8105-8dfc8c4c730f.png → 1d92cb8e-49a7-4166-9682-a5807e0c7912.png} +0 -0
- /kaa/sprites/{be04f096-c46b-4784-8e6c-c1217764f6dd.png → 1dadf765-ddd0-4768-9e91-6d3d08d0ca0d.png} +0 -0
- /kaa/sprites/{d0652541-e289-4bcd-98ec-a88715f5adef.png → 20cbf6b8-01db-45fe-a790-dbb7dd639b1d.png} +0 -0
- /kaa/sprites/{8c4f60d1-d707-4ae5-bd94-d96661ea7bbc.png → 20d01fc0-9a54-4ef5-9983-2bb8414dd94d.png} +0 -0
- /kaa/sprites/{011c52b9-613d-4865-afd3-1f0ddab2bc5b.png → 20e1e948-6920-44cd-965e-9e1e37b3fbf2.png} +0 -0
- /kaa/sprites/{5ee1b47b-f20d-431b-a0bb-d203b9f3e15b.png → 23922edd-22aa-4514-ba99-65bcd72c2ad1.png} +0 -0
- /kaa/sprites/{3d57da0a-b166-4acd-9a8a-b247ba5ad13a.png → 24c2db22-24e2-484e-8c16-8b1c9fe3ed14.png} +0 -0
- /kaa/sprites/{f5145781-949e-4012-9ea9-b0a277dac72b.png → 26683d54-74a9-4e7b-a839-c2e0850d1458.png} +0 -0
- /kaa/sprites/{2987cb9c-5975-41b3-87f7-cc26efdcee74.png → 27bcc513-9bab-468a-97b8-ed16f918e2a4.png} +0 -0
- /kaa/sprites/{c24394f6-ed02-4fb4-8d58-40a7e51b259d.png → 284a19c3-2c06-48a5-8f78-b4682e8ae19e.png} +0 -0
- /kaa/sprites/{da615a2f-3334-462c-8535-40067ad1c857.png → 2927cceb-29dc-4c35-8614-1df42fc0733b.png} +0 -0
- /kaa/sprites/{0a430b29-9841-407a-a102-ea6420beeaae.png → 2c5784df-e89b-4b95-a4b9-bac083c0ec08.png} +0 -0
- /kaa/sprites/{3867054e-a686-4dab-89fb-6a9def58dfe1.png → 2dfa926c-83c5-4f40-adfe-ff04ce448264.png} +0 -0
- /kaa/sprites/{d1a6547e-7c58-4500-a7f4-cf462f44395f.png → 2f7f70ea-f3f0-4d14-8885-1a735ff00545.png} +0 -0
- /kaa/sprites/{4a5e8c39-4e80-4202-9886-be1a58073fd6.png → 307fcb37-7a90-4a3e-bd3a-64a691aeb5d5.png} +0 -0
- /kaa/sprites/{151dc2ce-fce4-4741-ac6e-cc8213f54137.png → 3114b2d5-0a96-4eba-9143-b09eabb63612.png} +0 -0
- /kaa/sprites/{1aa14c42-8682-4a75-b4a2-4715481a2381.png → 31168fe2-8601-4de6-aa40-81e7ce452391.png} +0 -0
- /kaa/sprites/{f3400d73-4f61-4027-b5d8-03765a63a186.png → 31b025df-ed25-4bc4-a94a-d05388e9156e.png} +0 -0
- /kaa/sprites/{0c211c20-096e-4572-8e74-3867904db1f6.png → 32af48d2-fb5b-4288-930f-eb36edfe2116.png} +0 -0
- /kaa/sprites/{0803c844-7085-4492-ad68-0ce3b11f9840.png → 34e50d77-7b95-4bb7-8c62-ad6801dc0e55.png} +0 -0
- /kaa/sprites/{bd5b168a-de03-46b3-b1b7-9fa9667f4642.png → 3658a26d-98d3-462a-abf4-4d8b74aeb134.png} +0 -0
- /kaa/sprites/{562deb0a-99bd-4e95-80ff-f933a73c28ad.png → 36f11c55-e110-44b7-a800-85f4d7584560.png} +0 -0
- /kaa/sprites/{9c827df9-2e47-4bec-95b7-8ccad6377a28.png → 38bb2a90-b2a9-4f85-9025-662e83ab1ed1.png} +0 -0
- /kaa/sprites/{eebbccac-25a9-465e-b7c8-3bfdaf0bf0b9.png → 38f70a7e-5f7e-4ee6-a7c5-5f8014734719.png} +0 -0
- /kaa/sprites/{6f79221a-8c47-423e-ac72-27d97c559d63.png → 3aceddce-09db-422a-8023-e08d41070cc8.png} +0 -0
- /kaa/sprites/{3fe4ec28-3b2a-4042-ace1-ceec5c8f48b1.png → 3c224540-1571-435a-b8e6-2317e4411438.png} +0 -0
- /kaa/sprites/{f2913d0b-342c-4de0-8235-fe3f1c580d2e.png → 3d9a9493-7616-4b2b-867e-44e776d831c0.png} +0 -0
- /kaa/sprites/{a8bef06b-9287-4f54-b96e-19463031d26f.png → 3fd694ea-8396-4cf3-9ba6-eaf95b61e8c8.png} +0 -0
- /kaa/sprites/{fd16e035-699c-4dc9-9721-61443cd6fd63.png → 4055dbef-1523-43b7-9183-6b2721b4307b.png} +0 -0
- /kaa/sprites/{606d4740-8af9-40f6-af18-ad9f73cecf68.png → 4059ec2d-cd20-4dd3-8586-e49a4cfa8717.png} +0 -0
- /kaa/sprites/{9ea3c9b4-80f3-44b9-90e3-cfc406f814be.png → 4280fa1d-4223-4fc4-85f9-caf6157cb004.png} +0 -0
- /kaa/sprites/{436ec8e4-aa4a-4b1f-940a-2ab55baa098d.png → 43bc2116-7fe3-4b20-8c8b-3ab2a2b5dd7d.png} +0 -0
- /kaa/sprites/{39815c36-38c5-4066-aff5-2177c232b4f4.png → 43d3fe01-27c0-4d3f-a908-aebd00ab219d.png} +0 -0
- /kaa/sprites/{9c6378a9-62ed-4881-bc6f-2166bbb470c7.png → 45062c9b-a31d-457b-83a2-9b6891384a15.png} +0 -0
- /kaa/sprites/{e630b33a-e73e-4271-96b9-860b94fb48ca.png → 4516d0e4-9280-4f91-ba7d-fc8af83a9996.png} +0 -0
- /kaa/sprites/{916391a4-09b7-409c-ba25-391b61a65e62.png → 458b8bbe-9fa5-48d4-907b-66d36baf16a1.png} +0 -0
- /kaa/sprites/{9092a171-66f0-47dc-99dd-bb5d7359077a.png → 45af668c-2324-4fe4-83e0-11d65cfaa086.png} +0 -0
- /kaa/sprites/{297fb9e0-9553-40fb-ad08-f5ab718ef119.png → 45bdb006-bea5-4a1f-bf1a-c3bcb2e99abd.png} +0 -0
- /kaa/sprites/{1bf95df3-255f-4e89-9b17-0af77f4affd6.png → 47186b16-f478-4a53-8e49-a132ee4c78db.png} +0 -0
- /kaa/sprites/{1f6805bb-dff1-4d4c-82bf-74563056cc81.png → 4876c6f3-17a5-4858-b1d1-ebb5619516c5.png} +0 -0
- /kaa/sprites/{b2c8ac50-87a3-4cdd-a895-9704a9674163.png → 491bd489-7a08-47b4-b1b7-5d0f44cedbca.png} +0 -0
- /kaa/sprites/{484594b4-06a2-4ec3-8a85-e7af3b012125.png → 4a853ac5-24d5-44ac-8ddf-9f501c60a9be.png} +0 -0
- /kaa/sprites/{f6e26f3c-2548-4507-8651-53917e0fe82a.png → 4b88639e-1f17-4e11-90b6-bb122f8cb5ab.png} +0 -0
- /kaa/sprites/{935d8115-245f-42ff-ad74-55f4e6d140b1.png → 4dc5f817-86bc-4433-aeb5-b02c7b63fa8c.png} +0 -0
- /kaa/sprites/{b379d704-fc45-42f9-a45c-d81a6c5ee951.png → 4e3a9fd3-86aa-4e14-ae48-46e53a553da2.png} +0 -0
- /kaa/sprites/{7df9b645-ff88-4459-8ba7-450da538cfd9.png → 4e7f7b91-344c-4fb2-95fe-004831e81b11.png} +0 -0
- /kaa/sprites/{24b3cf5c-0586-41cc-abfb-df48de07fa77.png → 511232f6-01d6-482a-81a3-2bf79a6e88ed.png} +0 -0
- /kaa/sprites/{101a9c54-ab8c-4b5d-a4e0-686b93b4e1d9.png → 546cb160-f99b-4cda-9719-02b38a5393a0.png} +0 -0
- /kaa/sprites/{74e4c222-0006-4295-99d0-a01aa8b94dc2.png → 56bc2743-5dd9-4d09-a681-af9d1fec568b.png} +0 -0
- /kaa/sprites/{d11f07b1-f2e9-4c41-9ad9-81529121afd4.png → 5701ecbe-7fed-435c-b409-75f8b0f2df51.png} +0 -0
- /kaa/sprites/{6dd4ca2b-69ca-4099-9e69-2144ce9a4d28.png → 58de1cf0-4270-4987-9dc7-3f584f1119d1.png} +0 -0
- /kaa/sprites/{48eb2e27-7419-4136-9642-7af1a6f83ed9.png → 5a337f99-8554-48bf-acb7-364259fbf1b7.png} +0 -0
- /kaa/sprites/{ccad6a54-73f6-48b8-a86f-16b9e0f46e41.png → 5cb4deb9-2ec5-4452-aba4-390eae2071c7.png} +0 -0
- /kaa/sprites/{f136dd9f-43c8-44cc-b081-1f86d7ce38d4.png → 5d42f16f-3475-4ffb-ac85-3c86fa8fba46.png} +0 -0
- /kaa/sprites/{52aba1bd-1e82-46a7-8003-0aac11586a38.png → 6c5698a4-b211-4f38-83a7-51b5f3a36911.png} +0 -0
- /kaa/sprites/{0ec56b89-81f2-478d-907e-b04aab199e86.png → 771d1e17-8ef4-417a-b482-26db514e17c6.png} +0 -0
- /kaa/sprites/{c23c29cc-ef42-46d8-8b58-283b74a254cc.png → 7833fa1e-c842-4efd-a696-c67150a1dfa8.png} +0 -0
- /kaa/sprites/{2bb41b59-61f8-4109-a550-faa6a14708de.png → 791b3367-fb7c-48b5-9a0f-877908e51c4a.png} +0 -0
- /kaa/sprites/{47cbfa79-0b33-4ccc-b762-21e3a141a7bc.png → 7bb874a3-3fac-4138-83bd-d6461c5793d3.png} +0 -0
- /kaa/sprites/{fc77cc87-f8eb-4b33-834c-ee5d2af5ca44.png → 7d4d06a8-7903-4803-a20b-7f45ffbe9ca7.png} +0 -0
- /kaa/sprites/{b581ae5b-cb67-4bf9-8ffe-72b8ba56d887.png → 81553259-3b0a-42f7-b7b9-2c6e1dfec6c4.png} +0 -0
- /kaa/sprites/{eda88516-ac6b-4f26-b074-f8e6e2ae42a5.png → 827cec52-d883-46d1-b24b-c11c82b1b459.png} +0 -0
- /kaa/sprites/{9966acd5-973a-4afb-a006-c1fa66cfe679.png → 8473bc42-1909-4d70-b80d-7eba085c9978.png} +0 -0
- /kaa/sprites/{c16ae471-7d60-4c1f-9981-1090414a7ea0.png → 84797a78-97f3-44fa-b3c0-132c914f534a.png} +0 -0
- /kaa/sprites/{df54b1e4-035c-4937-9360-19b4733826e6.png → 861bd6b8-cca7-46b1-9346-83af080e211b.png} +0 -0
- /kaa/sprites/{436b9822-c946-4d2e-a432-8f3159705b37.png → 8f5081e4-ed3d-445b-bcf6-2e40c7d08298.png} +0 -0
- /kaa/sprites/{5bb33faa-8236-4e17-92bd-ad709795f261.png → 91dbaa9c-7881-4687-bd64-8f25c201d98c.png} +0 -0
- /kaa/sprites/{95e11d11-f330-4906-a128-6492f95176e8.png → 93f3f6a9-e9d2-45b7-a2b3-1e8b64d10e9b.png} +0 -0
- /kaa/sprites/{dd59548d-0800-49d3-8701-b2b2e8512c36.png → 943cde40-f190-40b6-9235-4439fbb4ae50.png} +0 -0
- /kaa/sprites/{7678902c-57df-4cf8-87ef-11c85f02214b.png → 97f3fb5a-fce2-4cc5-9da5-f0496e9dd294.png} +0 -0
- /kaa/sprites/{d051b4c3-354e-4d69-95f6-14f5017ed79e.png → 98a68736-c4ec-4af1-ac64-40eb48f9c000.png} +0 -0
- /kaa/sprites/{a9029026-7a7e-4f8e-9620-bd451bfdf284.png → 9af13381-661d-41cf-b704-e4a9c3691e14.png} +0 -0
- /kaa/sprites/{5a892ef3-543b-4fad-bdca-5358314d6be7.png → 9b91dc78-49e8-41b2-9500-c27cb46023c4.png} +0 -0
- /kaa/sprites/{920ea830-31a8-4256-b247-7b9507030783.png → 9d0bf64a-2684-43fa-b9bf-552e60c717b4.png} +0 -0
- /kaa/sprites/{b37685c3-74a8-4393-ad79-c445ab2d77be.png → a32fa779-2fb9-488e-9153-0b99e4352281.png} +0 -0
- /kaa/sprites/{9f81bc0f-da2c-4321-a185-b2d8a3f0d390.png → a6269fe5-e719-43ad-b674-ea728e43066b.png} +0 -0
- /kaa/sprites/{2beaba86-119e-4a1c-8cf4-e03c4d0d957a.png → a8ca6a10-ba0a-4416-a27b-3323d38040ab.png} +0 -0
- /kaa/sprites/{f258af39-e8be-4e19-aafc-bfedce9793c0.png → acaea032-45b8-4ad8-8b54-ff011750af80.png} +0 -0
- /kaa/sprites/{ed7adff5-1604-4ade-ac2b-a30167ef457c.png → ae5a051e-37f5-4e54-bfc7-64c445ad6fcc.png} +0 -0
- /kaa/sprites/{30604b47-7c8b-4dd5-b926-fd33bad575c7.png → af5a6ae7-a355-492e-86a8-62fa2b06bb54.png} +0 -0
- /kaa/sprites/{36e6c1ea-8de5-4640-8340-b8f532ef40c0.png → b406baf0-fa0b-4125-adc6-d370582a6104.png} +0 -0
- /kaa/sprites/{42bfc60c-0249-4910-ad04-80e559b52c6b.png → b62f9c30-1faf-47fc-be8f-36db3806c5dc.png} +0 -0
- /kaa/sprites/{56bcde1a-5cd7-493d-a2cd-2a63394c0c36.png → ba1983ce-bf63-4022-9ef3-dcf97030e6c5.png} +0 -0
- /kaa/sprites/{8e648675-1a52-4926-92cf-64c7cb5c2a59.png → ba971684-1fe3-47e1-8bdb-d20a0011ea68.png} +0 -0
- /kaa/sprites/{3af1e6de-e718-4a09-8ee9-88be21cd4b3d.png → bdbed86f-553c-458e-9435-d587005b367d.png} +0 -0
- /kaa/sprites/{e2944d47-159f-4200-b476-8d5db41d30c0.png → bee41ab5-c62e-4a79-a8d0-40f9efbc7e40.png} +0 -0
- /kaa/sprites/{bfaf3273-76bf-457a-88b7-6816af742a30.png → c344b05d-2707-43b0-9e3e-4ec433558dcb.png} +0 -0
- /kaa/sprites/{7df273dc-69f7-45b9-a782-b221783f851b.png → c3c495a2-1530-439f-a10e-76ca5d929cce.png} +0 -0
- /kaa/sprites/{76262c30-a2ee-45ba-8279-ca682cee0bd6.png → ccac6d8e-bca2-4ab6-b88b-c0f5ba83df84.png} +0 -0
- /kaa/sprites/{574b2741-c4ac-4ee4-a544-f4f499e4a21e.png → ce7cec02-4039-4171-87ed-37eccc4ac832.png} +0 -0
- /kaa/sprites/{6dead493-c4e6-4ba9-ac56-abe8c511abbd.png → f72e9d65-68e7-4bb6-be44-4b5ed71f0bce.png} +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/WHEEL +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/entry_points.txt +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/licenses/LICENSE +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/top_level.txt +0 -0
|
@@ -10,7 +10,7 @@ from kaa.game_ui import dialog
|
|
|
10
10
|
|
|
11
11
|
from kaa.tasks import R
|
|
12
12
|
from kaa.config import conf
|
|
13
|
-
from ..produce.common import
|
|
13
|
+
from ..produce.common import ProduceInterrupt
|
|
14
14
|
from kaa.game_ui.commu_event_buttons import CommuEventButtonUI
|
|
15
15
|
from kotonebot.util import Countdown
|
|
16
16
|
from kotonebot.backend.loop import Loop
|
|
@@ -57,12 +57,7 @@ def enter_study():
|
|
|
57
57
|
device.double_click(image.expect_wait(R.InPurodyuusu.ButtonIconStudy))
|
|
58
58
|
# 等待进入页面。中间可能会出现未读交流
|
|
59
59
|
# [screenshots/produce/action_study2.png]
|
|
60
|
-
|
|
61
|
-
if not image.find(R.InPurodyuusu.IconTitleStudy):
|
|
62
|
-
logger.debug("Waiting for 授業 screen.")
|
|
63
|
-
fast_acquisitions()
|
|
64
|
-
else:
|
|
65
|
-
break
|
|
60
|
+
ProduceInterrupt().until(R.InPurodyuusu.IconTitleStudy)
|
|
66
61
|
# 首先需要判断是不是自习课
|
|
67
62
|
# [kotonebot-resource\sprites\jp\in_purodyuusu\screenshot_study_self_study.png]
|
|
68
63
|
if image.find_multi([
|
|
@@ -105,11 +100,7 @@ def enter_study():
|
|
|
105
100
|
device.click(target_btn)
|
|
106
101
|
else:
|
|
107
102
|
device.double_click(target_btn)
|
|
108
|
-
|
|
109
|
-
if fast_acquisitions() is None:
|
|
110
|
-
logger.info("Waiting for acquisitions finished.")
|
|
111
|
-
else:
|
|
112
|
-
break
|
|
103
|
+
ProduceInterrupt().resolve()
|
|
113
104
|
logger.info("授業 completed.")
|
|
114
105
|
|
|
115
106
|
|
|
@@ -126,13 +117,9 @@ def enter_allowance():
|
|
|
126
117
|
logger.info("Double clicking on 活動支給.")
|
|
127
118
|
device.double_click(image.expect(R.InPurodyuusu.ButtonTextAllowance), interval=1)
|
|
128
119
|
# 等待进入页面
|
|
129
|
-
|
|
130
|
-
if not image.find(R.InPurodyuusu.IconTitleAllowance):
|
|
131
|
-
logger.debug("Waiting for 活動支給 screen.")
|
|
132
|
-
fast_acquisitions()
|
|
133
|
-
else:
|
|
134
|
-
break
|
|
120
|
+
ProduceInterrupt().until(R.InPurodyuusu.IconTitleAllowance)
|
|
135
121
|
# 领取奖励
|
|
122
|
+
pi = ProduceInterrupt()
|
|
136
123
|
for _ in Loop():
|
|
137
124
|
# TODO: 检测是否在行动页面应当单独一个函数
|
|
138
125
|
if image.find_multi([
|
|
@@ -145,7 +132,7 @@ def enter_allowance():
|
|
|
145
132
|
device.click()
|
|
146
133
|
sleep(0.5) # 防止点击了第一个箱子后立马点击了第二个
|
|
147
134
|
continue
|
|
148
|
-
if
|
|
135
|
+
if pi.handle():
|
|
149
136
|
continue
|
|
150
137
|
logger.info("活動支給 completed.")
|
|
151
138
|
|
|
@@ -164,13 +151,7 @@ def enter_consult():
|
|
|
164
151
|
device.double_click(image.expect(R.InPurodyuusu.ButtonIconConsult), interval=1)
|
|
165
152
|
|
|
166
153
|
# 等待进入页面
|
|
167
|
-
|
|
168
|
-
if not image.find(R.InPurodyuusu.IconTitleConsult):
|
|
169
|
-
device.screenshot()
|
|
170
|
-
logger.debug("Waiting for 相談 screen.")
|
|
171
|
-
fast_acquisitions()
|
|
172
|
-
else:
|
|
173
|
-
break
|
|
154
|
+
ProduceInterrupt().until(R.InPurodyuusu.IconTitleConsult)
|
|
174
155
|
# # 尝试固定购买第一个物品
|
|
175
156
|
# device.click(R.InPurodyuusu.PointConsultFirstItem)
|
|
176
157
|
# sleep(0.5)
|
|
@@ -282,12 +263,7 @@ def enter_outing():
|
|
|
282
263
|
logger.info("Double clicking on おでかけ.")
|
|
283
264
|
device.double_click(image.expect(R.InPurodyuusu.ButtonIconOuting))
|
|
284
265
|
# 等待进入页面
|
|
285
|
-
|
|
286
|
-
if not image.find(R.InPurodyuusu.TitleIconOuting):
|
|
287
|
-
logger.debug("Waiting for おでかけ screen.")
|
|
288
|
-
fast_acquisitions()
|
|
289
|
-
else:
|
|
290
|
-
break
|
|
266
|
+
ProduceInterrupt().until(R.InPurodyuusu.TitleIconOuting)
|
|
291
267
|
# 固定选中第二个选项
|
|
292
268
|
# TODO: 可能需要二次处理外出事件
|
|
293
269
|
# [kotonebot-resource\sprites\jp\in_purodyuusu\screenshot_outing.png]
|
|
@@ -301,10 +277,11 @@ def enter_outing():
|
|
|
301
277
|
device.click(target_btn)
|
|
302
278
|
else:
|
|
303
279
|
device.double_click(target_btn)
|
|
280
|
+
pi = ProduceInterrupt()
|
|
304
281
|
for _ in Loop():
|
|
305
282
|
if at_action_scene():
|
|
306
283
|
break
|
|
307
|
-
elif
|
|
284
|
+
elif pi.handle():
|
|
308
285
|
pass
|
|
309
286
|
# [screenshots\produce\outing_ap_confirm.png]
|
|
310
287
|
elif image.find(R.Common.ButtonSelect2):
|
kaa/tasks/produce/p_drink.py
CHANGED
|
@@ -17,6 +17,9 @@ POSTIONS = [
|
|
|
17
17
|
def acquire_p_drink():
|
|
18
18
|
"""
|
|
19
19
|
领取 P 饮料
|
|
20
|
+
|
|
21
|
+
前置:领取饮料弹窗
|
|
22
|
+
|
|
20
23
|
:param index: 要领取的 P 饮料的索引。从 0 开始。
|
|
21
24
|
"""
|
|
22
25
|
# TODO: 随机领取一个饮料改成根据具体情况确定最佳
|
|
@@ -26,7 +29,8 @@ def acquire_p_drink():
|
|
|
26
29
|
logger.info("Skip claiming PDrink.")
|
|
27
30
|
device.click()
|
|
28
31
|
sleep(0.3)
|
|
29
|
-
|
|
32
|
+
if image.find(R.InPurodyuusu.ButtonDontClaim):
|
|
33
|
+
device.click()
|
|
30
34
|
else:
|
|
31
35
|
# 点击饮料
|
|
32
36
|
device.click(POSTIONS[0])
|
kaa/tasks/produce/produce.py
CHANGED
|
@@ -219,6 +219,15 @@ def do_produce(
|
|
|
219
219
|
for _ in Loop():
|
|
220
220
|
if image.find(R.Produce.ButtonProduce):
|
|
221
221
|
device.click()
|
|
222
|
+
# 强化月间处理
|
|
223
|
+
elif conf().produce.enable_fever_month == 'on' and image.find(R.Produce.SwitchEventModeOff):
|
|
224
|
+
logger.info('Fever month checked on.')
|
|
225
|
+
device.click()
|
|
226
|
+
sleep(0.5)
|
|
227
|
+
elif conf().produce.enable_fever_month == 'off' and image.find(R.Produce.SwitchEventModeOn):
|
|
228
|
+
logger.info('Fever month checked off.')
|
|
229
|
+
device.click()
|
|
230
|
+
sleep(0.5)
|
|
222
231
|
elif image.find_multi(target_buttons):
|
|
223
232
|
device.click()
|
|
224
233
|
elif image.find(R.Produce.ButtonPIdolOverview):
|
|
@@ -233,7 +242,8 @@ def do_produce(
|
|
|
233
242
|
# [kotonebot-resource\sprites\jp\produce\screenshot_no_enough_ap_2.png]
|
|
234
243
|
# [kotonebot-resource\sprites\jp\produce\screenshot_no_enough_ap_3.png]
|
|
235
244
|
logger.info('AP insufficient. Try to use AP drink.')
|
|
236
|
-
for _ in Loop():
|
|
245
|
+
for _ in Loop(interval=1):
|
|
246
|
+
# HACK: 这里设置 interval 是 #91 的临时 workaround
|
|
237
247
|
if image.find(R.Produce.ButtonUse, colored=True):
|
|
238
248
|
device.click()
|
|
239
249
|
elif image.find(R.Produce.ButtonRefillAP):
|
|
@@ -418,6 +428,7 @@ if __name__ == '__main__':
|
|
|
418
428
|
|
|
419
429
|
conf().produce.enabled = True
|
|
420
430
|
conf().produce.produce_count = 1
|
|
431
|
+
conf().produce.enable_fever_month = 'ignore'
|
|
421
432
|
produce_solution().data.mode = 'pro'
|
|
422
433
|
# produce_solution().data.idol = 'i_card-skin-hski-3-002'
|
|
423
434
|
produce_solution().data.memory_set = 1
|
kaa/tasks/start_game.py
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"""启动游戏,领取登录奖励,直到首页为止"""
|
|
2
|
-
import json
|
|
3
2
|
import os
|
|
3
|
+
import re
|
|
4
|
+
import json
|
|
4
5
|
import ctypes
|
|
5
6
|
import logging
|
|
7
|
+
import subprocess
|
|
6
8
|
|
|
7
9
|
from kotonebot.util import Countdown
|
|
8
10
|
from kotonebot.backend.loop import Loop
|
|
@@ -14,7 +16,8 @@ from .actions.loading import loading
|
|
|
14
16
|
from kaa.config import Priority, conf
|
|
15
17
|
from .actions.scenes import at_home, goto_home
|
|
16
18
|
from .actions.commu import handle_unread_commu
|
|
17
|
-
from kaa.
|
|
19
|
+
from kaa.tasks.common import skip
|
|
20
|
+
from kaa.errors import ElevationRequiredError, GameUpdateNeededError, DmmGameLaunchError
|
|
18
21
|
|
|
19
22
|
logger = logging.getLogger(__name__)
|
|
20
23
|
|
|
@@ -48,6 +51,49 @@ def locate_game_path() -> str | None:
|
|
|
48
51
|
config.save()
|
|
49
52
|
return game_path
|
|
50
53
|
|
|
54
|
+
def start_windows_bypass():
|
|
55
|
+
"""
|
|
56
|
+
绕过 DMMPlayer 直接启动游戏。
|
|
57
|
+
"""
|
|
58
|
+
appdata = os.getenv('APPDATA')
|
|
59
|
+
if not appdata:
|
|
60
|
+
raise DmmGameLaunchError('APPDATA not found.')
|
|
61
|
+
log_path = os.path.join(appdata, 'dmmgameplayer5', 'logs', 'dll.log')
|
|
62
|
+
|
|
63
|
+
if not os.path.exists(log_path):
|
|
64
|
+
raise DmmGameLaunchError(f'DMMGamePlayer log file not found at {log_path}')
|
|
65
|
+
|
|
66
|
+
last_launch_line = None
|
|
67
|
+
with open(log_path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
68
|
+
for line in f:
|
|
69
|
+
if "Execute of:: gakumas exe" in line:
|
|
70
|
+
last_launch_line = line
|
|
71
|
+
|
|
72
|
+
if not last_launch_line:
|
|
73
|
+
raise DmmGameLaunchError('Could not find any run records for "Gakumas" in the DMM log. Please launch the game normally once through the DMM client.')
|
|
74
|
+
|
|
75
|
+
regex = r'exe:\s*(?P<exe_path>.*?gakumas\.exe).*?/viewer_id=(?P<viewer_id>[^\s]+).*?/open_id=(?P<open_id>[^\s]+).*?/pf_access_token=(?P<pf_token>[^\s]+)'
|
|
76
|
+
match = re.search(regex, last_launch_line)
|
|
77
|
+
|
|
78
|
+
if not match:
|
|
79
|
+
raise DmmGameLaunchError('Failed to extract complete launch information from the log. The log format may have changed.')
|
|
80
|
+
|
|
81
|
+
game_info = match.groupdict()
|
|
82
|
+
exe_path = game_info['exe_path']
|
|
83
|
+
working_dir = os.path.dirname(exe_path)
|
|
84
|
+
args = [
|
|
85
|
+
exe_path,
|
|
86
|
+
f"/viewer_id={game_info['viewer_id']}",
|
|
87
|
+
f"/open_id={game_info['open_id']}",
|
|
88
|
+
f"/pf_access_token={game_info['pf_token']}"
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
# CREATE_NO_WINDOW to avoid console popup
|
|
93
|
+
subprocess.Popen(args, cwd=working_dir, creationflags=0x08000000)
|
|
94
|
+
except Exception as e:
|
|
95
|
+
raise DmmGameLaunchError(f'Failed to start the game directly: {e}')
|
|
96
|
+
|
|
51
97
|
# TODO: 这个函数功能和 kaa\tasks\actions\scenes.py 中的 goto_home 重复了,后续需要合并
|
|
52
98
|
@action('启动游戏.进入首页', screenshot_mode='manual-inherit')
|
|
53
99
|
def wait_for_home():
|
|
@@ -93,7 +139,7 @@ def wait_for_home():
|
|
|
93
139
|
device.click()
|
|
94
140
|
|
|
95
141
|
if should_click and click_cd.expired():
|
|
96
|
-
|
|
142
|
+
skip()
|
|
97
143
|
click_cd.reset()
|
|
98
144
|
|
|
99
145
|
@action('启动游戏.Android', screenshot_mode='manual-inherit')
|
|
@@ -172,8 +218,18 @@ def windows_launch():
|
|
|
172
218
|
logger.debug('Game already started.')
|
|
173
219
|
return
|
|
174
220
|
|
|
175
|
-
|
|
176
|
-
|
|
221
|
+
for _ in [1]:
|
|
222
|
+
if conf().start_game.dmm_bypass:
|
|
223
|
+
logger.info('Bypassing DMM launcher to start game directly...')
|
|
224
|
+
try:
|
|
225
|
+
start_windows_bypass()
|
|
226
|
+
break
|
|
227
|
+
except DmmGameLaunchError:
|
|
228
|
+
logger.exception('Failed to bypass DMM launcher, fallback to DMM launcher...')
|
|
229
|
+
|
|
230
|
+
logger.info('Starting game via DMM launcher...')
|
|
231
|
+
os.startfile('dmmgameplayer://play/GCL/gakumas/cl/win')
|
|
232
|
+
|
|
177
233
|
# 等待游戏窗口出现
|
|
178
234
|
for _ in Loop(auto_screenshot=False):
|
|
179
235
|
if ahk.find_window(title='gakumas', title_match_mode=3):
|
kaa/util/reactive.py
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
from typing import TypeVar, Generic, Any, Callable, Optional, cast
|
|
2
|
+
|
|
3
|
+
# T: 原始对象的类型 (Root)
|
|
4
|
+
# V: 属性值的类型 (Leaf)
|
|
5
|
+
T = TypeVar("T")
|
|
6
|
+
V = TypeVar("V")
|
|
7
|
+
|
|
8
|
+
class PathRecorder(Generic[T]):
|
|
9
|
+
"""
|
|
10
|
+
记录路径操作(属性访问 或 索引访问)
|
|
11
|
+
"""
|
|
12
|
+
# FIX: 显式声明 path 可以为 None
|
|
13
|
+
def __init__(self, root: Any = None, path: Optional[list[tuple[str, Any]]] = None):
|
|
14
|
+
self._root = root
|
|
15
|
+
# path 存储操作记录: ('attr', 'name') 或 ('item', 'key')
|
|
16
|
+
self._path: list[tuple[str, Any]] = path if path is not None else []
|
|
17
|
+
|
|
18
|
+
def __getattr__(self, name: str) -> "PathRecorder":
|
|
19
|
+
# 记录 .attr 操作
|
|
20
|
+
return PathRecorder(self._root, self._path + [('attr', name)])
|
|
21
|
+
|
|
22
|
+
def __getitem__(self, key: Any) -> "PathRecorder":
|
|
23
|
+
# 记录 [key] 操作
|
|
24
|
+
return PathRecorder(self._root, self._path + [('item', key)])
|
|
25
|
+
|
|
26
|
+
# 内部接口
|
|
27
|
+
def _get_recorder_info(self) -> tuple[Any, list[tuple[str, Any]]]:
|
|
28
|
+
return self._root, self._path
|
|
29
|
+
|
|
30
|
+
def of(obj: T) -> T:
|
|
31
|
+
"""
|
|
32
|
+
Proxy 入口。类型标记返回 T 以获得 IDE 提示,运行时返回 Recorder。
|
|
33
|
+
"""
|
|
34
|
+
return cast(T, PathRecorder(root=obj))
|
|
35
|
+
|
|
36
|
+
def _traverse(target: Any, path: list[tuple[str, Any]]) -> tuple[Any, str, Any]:
|
|
37
|
+
"""
|
|
38
|
+
辅助函数:遍历路径,返回 (parent_container, last_op_type, last_key)
|
|
39
|
+
"""
|
|
40
|
+
current = target
|
|
41
|
+
|
|
42
|
+
# 遍历直到倒数第二个节点(获取父容器)
|
|
43
|
+
for op_type, key in path[:-1]:
|
|
44
|
+
if op_type == 'attr':
|
|
45
|
+
current = getattr(current, key)
|
|
46
|
+
elif op_type == 'item':
|
|
47
|
+
current = current[key]
|
|
48
|
+
|
|
49
|
+
# 获取最后一个操作的信息
|
|
50
|
+
last_op, last_key = path[-1]
|
|
51
|
+
return current, last_op, last_key
|
|
52
|
+
|
|
53
|
+
def getter(proxy: V) -> Callable[[], V]:
|
|
54
|
+
"""
|
|
55
|
+
创建一个 getter 函数。
|
|
56
|
+
"""
|
|
57
|
+
# 运行时检查
|
|
58
|
+
if not isinstance(proxy, PathRecorder):
|
|
59
|
+
raise TypeError("getter argument must be a proxy object created by of()")
|
|
60
|
+
|
|
61
|
+
# 显式转换类型以通过静态检查
|
|
62
|
+
recorder = cast(PathRecorder, proxy)
|
|
63
|
+
root, path = recorder._get_recorder_info()
|
|
64
|
+
|
|
65
|
+
if not path:
|
|
66
|
+
return lambda: cast(V, root)
|
|
67
|
+
|
|
68
|
+
def _getter_impl() -> V:
|
|
69
|
+
parent, last_op, last_key = _traverse(root, path)
|
|
70
|
+
|
|
71
|
+
if last_op == 'attr':
|
|
72
|
+
return getattr(parent, last_key)
|
|
73
|
+
elif last_op == 'item':
|
|
74
|
+
return parent[last_key]
|
|
75
|
+
|
|
76
|
+
# FIX: 抛出异常而不是返回 None,以满足返回类型 V
|
|
77
|
+
raise ValueError(f"Unknown operation type: {last_op}")
|
|
78
|
+
|
|
79
|
+
return _getter_impl
|
|
80
|
+
|
|
81
|
+
def setter(proxy: V) -> Callable[[V], None]:
|
|
82
|
+
"""
|
|
83
|
+
创建一个 setter 函数。
|
|
84
|
+
"""
|
|
85
|
+
if not isinstance(proxy, PathRecorder):
|
|
86
|
+
raise TypeError("setter argument must be a proxy object created by of()")
|
|
87
|
+
|
|
88
|
+
recorder = cast(PathRecorder, proxy)
|
|
89
|
+
root, path = recorder._get_recorder_info()
|
|
90
|
+
|
|
91
|
+
if not path:
|
|
92
|
+
raise ValueError("Cannot set root object directly")
|
|
93
|
+
|
|
94
|
+
def _setter_impl(value: V) -> None:
|
|
95
|
+
parent, last_op, last_key = _traverse(root, path)
|
|
96
|
+
|
|
97
|
+
if last_op == 'attr':
|
|
98
|
+
setattr(parent, last_key, value)
|
|
99
|
+
elif last_op == 'item':
|
|
100
|
+
parent[last_key] = value
|
|
101
|
+
else:
|
|
102
|
+
raise ValueError(f"Unknown operation type: {last_op}")
|
|
103
|
+
|
|
104
|
+
return _setter_impl
|
|
105
|
+
|
|
106
|
+
class Ref(Generic[T]):
|
|
107
|
+
"""
|
|
108
|
+
持有对特定数据路径的引用,支持读写。
|
|
109
|
+
Ref 接收一个 path recorder 代理对象。
|
|
110
|
+
"""
|
|
111
|
+
def __init__(self, proxy: T):
|
|
112
|
+
self._getter_fn = getter(proxy)
|
|
113
|
+
self._setter_fn = setter(proxy)
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def value(self) -> T:
|
|
117
|
+
return self._getter_fn()
|
|
118
|
+
|
|
119
|
+
@value.setter
|
|
120
|
+
def value(self, new_value: T) -> None:
|
|
121
|
+
self._setter_fn(new_value)
|
|
122
|
+
|
|
123
|
+
def ref(proxy: T) -> Ref[T]:
|
|
124
|
+
"""
|
|
125
|
+
创建一个引用对象 (Ref),用于直接读写路径记录器的目标值。
|
|
126
|
+
|
|
127
|
+
Example:
|
|
128
|
+
name_ref = ref(of(user).name)
|
|
129
|
+
name_ref.value = "Bob"
|
|
130
|
+
"""
|
|
131
|
+
return Ref(proxy)
|
|
132
|
+
|
|
133
|
+
if __name__ == "__main__":
|
|
134
|
+
class Address:
|
|
135
|
+
def __init__(self, city):
|
|
136
|
+
self.city = city
|
|
137
|
+
def __repr__(self):
|
|
138
|
+
return f"Address(city='{self.city}')"
|
|
139
|
+
|
|
140
|
+
class User:
|
|
141
|
+
def __init__(self, name, city):
|
|
142
|
+
self.name = name
|
|
143
|
+
self.addresses = {"home": Address(city)}
|
|
144
|
+
def __repr__(self):
|
|
145
|
+
return f"User(name='{self.name}', addresses={self.addresses})"
|
|
146
|
+
|
|
147
|
+
data = User("Alice", "New York")
|
|
148
|
+
print(f"Original Data: {data}")
|
|
149
|
+
|
|
150
|
+
# 1. 测试 Getter (混合 属性 和 字典索引)
|
|
151
|
+
get_city = getter(of(data).addresses["home"].city)
|
|
152
|
+
print(f"Getter result: {get_city()}") # Output: New York
|
|
153
|
+
|
|
154
|
+
# 2. 测试 Setter
|
|
155
|
+
set_city = setter(of(data).addresses["home"].city)
|
|
156
|
+
set_city("San Francisco")
|
|
157
|
+
print(f"After Setter: {data.addresses['home'].city}") # Output: San Francisco
|
|
158
|
+
|
|
159
|
+
# 3. 测试 Ref (引用)
|
|
160
|
+
print("-" * 30)
|
|
161
|
+
print("Testing Ref...")
|
|
162
|
+
|
|
163
|
+
# 创建一个指向 user.name 的 Ref
|
|
164
|
+
name_ref = ref(of(data).name)
|
|
165
|
+
|
|
166
|
+
print(f"Ref initial value: {name_ref.value}") # Alice
|
|
167
|
+
|
|
168
|
+
# 修改 Ref,应该影响原始对象
|
|
169
|
+
name_ref.value = "Bob"
|
|
170
|
+
print(f"Ref value set to 'Bob'.")
|
|
171
|
+
print(f"Original object name: {data.name}") # Bob
|
|
172
|
+
|
|
173
|
+
# 修改原始对象,Ref 应该能感知
|
|
174
|
+
data.name = "Charlie"
|
|
175
|
+
print(f"Original object name set to 'Charlie'.")
|
|
176
|
+
print(f"Ref value: {name_ref.value}") # Charlie
|
|
177
|
+
|
|
178
|
+
# 复杂路径 Ref
|
|
179
|
+
city_ref = ref(of(data).addresses["home"].city)
|
|
180
|
+
print(f"City Ref value: {city_ref.value}") # San Francisco
|
|
181
|
+
city_ref.value = "Tokyo"
|
|
182
|
+
print(f"City Ref set to 'Tokyo'. Original: {data.addresses['home'].city}")
|
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ksaa
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.11
|
|
4
4
|
Summary: Kotones Auto Assistant(kaa) is a script for game 'Gakuen Idol M@ster' that automates the dailies and produces.
|
|
5
|
-
Requires-Python: ~=3.10
|
|
5
|
+
Requires-Python: ~=3.10.0
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
License-File: LICENSE
|
|
8
|
-
Requires-Dist: opencv-python
|
|
9
|
-
Requires-Dist: rapidocr_onnxruntime
|
|
10
|
-
Requires-Dist: av
|
|
11
|
-
Requires-Dist: scikit-image
|
|
12
|
-
Requires-Dist: thefuzz
|
|
13
|
-
Requires-Dist: adbutils
|
|
14
|
-
Requires-Dist: uiautomator2
|
|
15
|
-
Requires-Dist: fastapi
|
|
16
|
-
Requires-Dist: uvicorn
|
|
17
|
-
Requires-Dist: python-multipart
|
|
18
|
-
Requires-Dist: websockets
|
|
19
|
-
Requires-Dist: psutil
|
|
20
|
-
Requires-Dist: gradio
|
|
21
|
-
Requires-Dist: pydantic
|
|
8
|
+
Requires-Dist: opencv-python~=4.10
|
|
9
|
+
Requires-Dist: rapidocr_onnxruntime~=1.4
|
|
10
|
+
Requires-Dist: av~=14.0
|
|
11
|
+
Requires-Dist: scikit-image~=0.25
|
|
12
|
+
Requires-Dist: thefuzz~=0.22
|
|
13
|
+
Requires-Dist: adbutils~=2.8
|
|
14
|
+
Requires-Dist: uiautomator2~=3.2
|
|
15
|
+
Requires-Dist: fastapi~=0.115.6
|
|
16
|
+
Requires-Dist: uvicorn~=0.34.0
|
|
17
|
+
Requires-Dist: python-multipart~=0.0.20
|
|
18
|
+
Requires-Dist: websockets~=14.1
|
|
19
|
+
Requires-Dist: psutil~=6.1
|
|
20
|
+
Requires-Dist: gradio~=6.0
|
|
21
|
+
Requires-Dist: pydantic~=2.10
|
|
22
22
|
Requires-Dist: ksaa-res==0.2.0
|
|
23
|
-
Requires-Dist: typing-extensions
|
|
24
|
-
Requires-Dist: python-dotenv
|
|
25
|
-
Requires-Dist: onnxruntime
|
|
23
|
+
Requires-Dist: typing-extensions~=4.12
|
|
24
|
+
Requires-Dist: python-dotenv~=1.0.1
|
|
25
|
+
Requires-Dist: onnxruntime~=1.14.0
|
|
26
26
|
Requires-Dist: numpy<2.0
|
|
27
|
-
Requires-Dist: pywin32==310
|
|
28
|
-
Requires-Dist: ahk
|
|
29
|
-
Requires-Dist: win11toast
|
|
30
|
-
Requires-Dist: keyboard
|
|
31
|
-
Requires-Dist: kotonebot[android
|
|
27
|
+
Requires-Dist: pywin32==310; sys_platform == "win32"
|
|
28
|
+
Requires-Dist: ahk~=1.8.3; sys_platform == "win32"
|
|
29
|
+
Requires-Dist: win11toast~=0.35; sys_platform == "win32"
|
|
30
|
+
Requires-Dist: keyboard~=0.13.5
|
|
31
|
+
Requires-Dist: kotonebot[android]==0.5.0
|
|
32
|
+
Requires-Dist: kotonebot[windows]==0.5.0; sys_platform == "win32"
|
|
32
33
|
Dynamic: license-file
|
|
33
34
|
|
|
34
35
|
# Kotone's Auto Assistant 琴音小助手
|
|
@@ -123,6 +124,8 @@ kaa
|
|
|
123
124
|
main 分支为开发分支与测试版发布分支,release 分支为稳定版发布分支。所有 PR 都应提交到 main 分支。
|
|
124
125
|
其他分支均为临时分支,请不要提交到这些分支。
|
|
125
126
|
|
|
127
|
+
提交 PR 前建议你先进行覆盖率自测,详见“开发指南 ##测试”。
|
|
128
|
+
|
|
126
129
|
## 路线图
|
|
127
130
|
下面是待实现的功能:
|
|
128
131
|
(带删除线标记的为已完成)
|
|
@@ -195,9 +198,10 @@ kaa 本体及框架(kotonebot 文件夹)、相关辅助脚本(tools 文件
|
|
|
195
198
|
|
|
196
199
|
kaa 的开发主要用到了以下开源项目:
|
|
197
200
|
* [GkmasObjectManager
|
|
198
|
-
](https://github.com/AllenHeartcore/GkmasObjectManager)
|
|
201
|
+
](https://github.com/AllenHeartcore/GkmasObjectManager)(GPLv3):用于提取游戏图像资源。
|
|
199
202
|
* [gakumasu-diff](https://github.com/vertesan/gakumasu-diff):游戏数据。
|
|
200
203
|
|
|
201
204
|
kaa 的开发还参考了以下开源项目:
|
|
202
|
-
* [EmulatorExtras](https://github.com/MaaXYZ/EmulatorExtras)
|
|
203
|
-
* [blue_archive_auto_script](https://github.com/pur1fying/blue_archive_auto_script)
|
|
205
|
+
* [EmulatorExtras](https://github.com/MaaXYZ/EmulatorExtras)(No License):MuMu 与雷电模拟器的截图与控制接口定义。
|
|
206
|
+
* [blue_archive_auto_script](https://github.com/pur1fying/blue_archive_auto_script)(GPLv3):MuMu 与雷电模拟器的截图与控制接口的 Python 实现,以及各模拟器的控制实现。
|
|
207
|
+
* [Gakumas_Launcher](https://github.com/a4nqi3n/Gakumas_Launcher)(Unlicense license):绕开 DMMPlayer 直接启动游戏本体的方式。
|