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.
Files changed (354) hide show
  1. kaa/__init__.py +0 -0
  2. kaa/application/__init__.py +0 -0
  3. kaa/application/core/misc_core.py +4 -1
  4. kaa/application/services/__init__.py +0 -0
  5. kaa/application/services/config_service.py +101 -0
  6. kaa/application/services/feedback_service.py +121 -0
  7. kaa/application/services/produce_solution_service.py +83 -0
  8. kaa/application/services/task_service.py +145 -0
  9. kaa/application/services/update_service.py +208 -0
  10. kaa/application/ui/__init__.py +0 -0
  11. kaa/application/ui/common.py +123 -0
  12. kaa/application/ui/components/alert.py +251 -0
  13. kaa/application/ui/components/alert.pyi +257 -0
  14. kaa/application/ui/components/categorized_select.pyi +697 -0
  15. kaa/application/ui/facade.py +189 -0
  16. kaa/application/ui/gradio_view.py +135 -0
  17. kaa/application/ui/views/__init__.py +0 -0
  18. kaa/application/ui/views/feedback_view.py +65 -0
  19. kaa/application/ui/views/produce_view.py +251 -0
  20. kaa/application/ui/views/settings_view.py +581 -0
  21. kaa/application/ui/views/status_view.py +171 -0
  22. kaa/application/ui/views/task_view.py +102 -0
  23. kaa/application/ui/views/update_view.py +106 -0
  24. kaa/config/schema.py +26 -6
  25. kaa/errors.py +75 -0
  26. kaa/main/dmm_host.py +60 -60
  27. kaa/main/gr.py +60 -3115
  28. kaa/main/kaa.py +11 -3
  29. kaa/metadata.py +10 -0
  30. kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  31. kaa/resources/game.db +0 -0
  32. kaa/resources/game_ver.txt +0 -0
  33. kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
  34. kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
  35. kaa/resources/idol_cards/i_card-skin-amao-3-015_1.png +0 -0
  36. kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
  37. kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
  38. kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
  39. kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
  40. kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
  41. kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
  42. kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
  43. kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
  44. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
  45. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
  46. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
  47. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
  48. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
  49. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
  50. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
  51. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
  52. kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
  53. kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
  54. kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
  55. kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
  56. kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
  57. kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
  58. kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
  59. kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
  60. kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
  61. kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
  62. kaa/resources/idol_cards/i_card-skin-kcna-3-014_0.png +0 -0
  63. kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
  64. kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
  65. kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
  66. kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
  67. kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
  68. kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
  69. kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
  70. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
  71. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
  72. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
  73. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
  74. kaa/sprites/0cdd57aa-9bdd-4c83-9565-de7c229b34e3.png +0 -0
  75. kaa/sprites/16f04ca1-05a3-49c7-88ae-a0d02c1ec2ec.png +0 -0
  76. kaa/sprites/20ca6d42-c19e-4c3e-b82c-f6642bbe5069.png +0 -0
  77. kaa/sprites/276c0178-65af-4b69-a3c3-d04253b9ed91.png +0 -0
  78. kaa/sprites/32de6ba0-859f-4f40-a57e-92bed913e3a7.png +0 -0
  79. kaa/sprites/38613745-1cf2-4bf1-9f58-0474b1e46895.png +0 -0
  80. kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
  81. kaa/sprites/44097699-487f-4932-846a-095a427f4ed8.png +0 -0
  82. kaa/sprites/459f532f-115c-4527-a897-affa7ddcbd76.png +0 -0
  83. kaa/sprites/46cb87f6-26f7-45f0-b10c-6491f115077e.png +0 -0
  84. kaa/sprites/4b02f8d4-7847-47a5-8f01-7ab5123709e5.png +0 -0
  85. kaa/sprites/4b7426e9-395a-410c-bb99-c6f0a7b81208.png +0 -0
  86. kaa/sprites/4c243ed4-9ac2-42ba-89c6-946ffef84120.png +0 -0
  87. kaa/sprites/527c3803-1ddd-4f6b-a896-815d3c2e4caa.png +0 -0
  88. kaa/sprites/54d67100-70c7-4a00-afaa-a80771d34893.png +0 -0
  89. kaa/sprites/5588396d-dd38-4ef1-8c37-3041a750b1cc.png +0 -0
  90. kaa/sprites/5933f6ab-7af4-4731-aac8-d95939a3fbbf.png +0 -0
  91. kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
  92. kaa/sprites/5c735cc5-7801-44e9-a8f1-2d44df4fa919.png +0 -0
  93. kaa/sprites/678073ec-6700-4d94-af41-b392af11201b.png +0 -0
  94. kaa/sprites/6a27faad-df3b-49d9-a20f-64ae8e8f9e22.png +0 -0
  95. kaa/sprites/6b63fca9-a1ec-490e-96e9-fc0beeeb8851.png +0 -0
  96. kaa/sprites/6baaecdd-2817-4ba3-a2da-346ef9ef92fd.png +0 -0
  97. kaa/sprites/6c82d28f-913c-4444-baa6-2e37c7e24bc6.png +0 -0
  98. kaa/sprites/6d302c9d-72cd-49b5-bb11-c39140ffbdd1.png +0 -0
  99. kaa/sprites/6e603eb6-2336-46d2-ad01-2ba2fc3d4cbd.png +0 -0
  100. kaa/sprites/7156a1b5-cdd7-446e-9caf-d9f6b313ef4d.png +0 -0
  101. kaa/sprites/7469d458-d308-4469-8bf1-b63e1ddc6a3c.png +0 -0
  102. kaa/sprites/78868e34-1c2a-40ee-b08c-c89e6a3aea54.png +0 -0
  103. kaa/sprites/7c8e37b7-173f-4c03-8f11-bbd47f2a02c2.png +0 -0
  104. kaa/sprites/7ce3a2d5-efa7-4091-b012-f2870d9df422.png +0 -0
  105. kaa/sprites/7db2d761-ab44-4b3b-85aa-9b9758f97d5d.png +0 -0
  106. kaa/sprites/7ddaa9db-2287-43ba-8531-065e618ac8ef.png +0 -0
  107. kaa/sprites/7def2661-0847-4459-88c6-5270c2e8a32c.png +0 -0
  108. kaa/sprites/821c86c1-bc35-40bc-95db-f66935a92299.png +0 -0
  109. kaa/sprites/8448237d-2db5-49ca-8d55-9fc0e56639a7.png +0 -0
  110. kaa/sprites/89663a2f-c6d3-4bb7-9935-a54d11d0a382.png +0 -0
  111. kaa/sprites/8a312cf5-c670-4a52-a03b-fe55e78f8f07.png +0 -0
  112. kaa/sprites/8b6a1eed-341d-4be1-b0ae-9adc52ed4543.png +0 -0
  113. kaa/sprites/8e024c75-c872-4e18-bb80-0c5894612815.png +0 -0
  114. kaa/sprites/92f7ef0b-7931-4cd3-afda-c553232eb443.png +0 -0
  115. kaa/sprites/9803a197-d873-43cc-9656-d63513e92fad.png +0 -0
  116. kaa/sprites/9934f05f-ee5f-4131-b08d-aa61d5f3505a.png +0 -0
  117. kaa/sprites/993f2140-77be-4fe2-8e11-f71c4531bc9a.png +0 -0
  118. kaa/sprites/9a8bfa87-0e37-4d54-888f-b79f8778d232.png +0 -0
  119. kaa/sprites/9b7eaa4c-2b67-4426-80da-b7538a87ed96.png +0 -0
  120. kaa/sprites/9bc6607d-ce44-467e-a5f4-b3cf30210c13.png +0 -0
  121. kaa/sprites/9db5de82-8fba-4b69-8faf-ffe7fcea32f8.png +0 -0
  122. kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
  123. kaa/sprites/a1251011-00a9-402b-82da-1d2744db26cf.png +0 -0
  124. kaa/sprites/a31e08c1-d3c3-4a99-a882-4a10de9ba815.png +0 -0
  125. kaa/sprites/a408adaa-bfab-4aaf-acf7-08a4a3ebdd4c.png +0 -0
  126. kaa/sprites/a408cdfd-e394-4ada-9f0e-5878e41b8e52.png +0 -0
  127. kaa/sprites/a4723b5b-2466-4ea4-b7ef-4185bb4dda74.png +0 -0
  128. kaa/sprites/a5ba613c-46f4-4442-88e1-fbda4dd65a55.png +0 -0
  129. kaa/sprites/a88e3da2-98d3-4a64-b7ac-040847028a83.png +0 -0
  130. kaa/sprites/a9868db0-b355-470e-9bbe-033c5efa4b5e.png +0 -0
  131. kaa/sprites/a9f020e9-0e4b-4ddc-b8b8-386009578c15.png +0 -0
  132. kaa/sprites/aa369159-cc3b-40f2-9fca-bca5b579cf97.png +0 -0
  133. kaa/sprites/aad1ac7d-cfa1-4459-9d46-d39c080bd78e.png +0 -0
  134. kaa/sprites/ab9e39ae-0856-4254-a6b6-585e82f8bf3b.png +0 -0
  135. kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
  136. kaa/sprites/aff3d8ac-d648-434c-9adb-6c1a10aa04b9.png +0 -0
  137. kaa/sprites/affc5006-4b67-4490-9fa7-557a7fecb133.png +0 -0
  138. kaa/sprites/b002896d-5093-48e5-9e01-d18bfb240961.png +0 -0
  139. kaa/sprites/b00b5890-3743-4064-8311-c5e35b3afbe6.png +0 -0
  140. kaa/sprites/b26ac4ff-42a0-45aa-b818-7d7603b52f12.png +0 -0
  141. kaa/sprites/b2a04604-15d4-4ff6-86f7-0823e642103f.png +0 -0
  142. kaa/sprites/b33bb89c-cabb-4fe0-822f-d911e8b42f82.png +0 -0
  143. kaa/sprites/b5584de5-650e-4fde-b743-ccbd02eab196.png +0 -0
  144. kaa/sprites/b5f80604-d7d3-49e0-9934-58f75c393ffb.png +0 -0
  145. kaa/sprites/b70b958a-9480-4b9b-86a4-5ea099535c36.png +0 -0
  146. kaa/sprites/b93b3c36-79a3-4c1a-944a-20fe6a88c46d.png +0 -0
  147. kaa/sprites/ba7676fe-4982-4e92-822d-9c1a623420ac.png +0 -0
  148. kaa/sprites/bb953e97-7185-4c2c-b177-48d743e90d96.png +0 -0
  149. kaa/sprites/bd176e60-3bb2-453f-b2ef-45305b7f21c1.png +0 -0
  150. kaa/sprites/c0478a52-d6c5-4029-848f-e3e22b2de858.png +0 -0
  151. kaa/sprites/c05baa1e-02c3-4d02-904f-76086edbb97f.png +0 -0
  152. kaa/sprites/c295af98-0b43-4f18-bbc3-e59d23055f1b.png +0 -0
  153. kaa/sprites/c424f4a1-d032-478d-ac82-b1127a429e52.png +0 -0
  154. kaa/sprites/c5356ad6-0f1e-42be-b090-059f33ea7cee.png +0 -0
  155. kaa/sprites/c54d4b7e-887c-4753-8a9e-6914fc408232.png +0 -0
  156. kaa/sprites/c68f1282-4d86-4b1a-b76b-dcf42f3f906b.png +0 -0
  157. kaa/sprites/c71f900b-9689-4800-89a0-e3371d33f47a.png +0 -0
  158. kaa/sprites/c7cad813-2326-4662-9f55-0a15e1dad3dc.png +0 -0
  159. kaa/sprites/c95e8a90-dd6e-4cca-b74b-85ee90dbd5c1.png +0 -0
  160. kaa/sprites/c98d6bc7-45ca-4877-8cd1-6f36d6a86a02.png +0 -0
  161. kaa/sprites/ca258eea-e69a-43c3-ad4c-ac7da0099011.png +0 -0
  162. kaa/sprites/cb8d5df6-300b-48e5-ae0b-2b4750c9c092.png +0 -0
  163. kaa/sprites/cc727107-139b-4092-bafb-4bc9787bcdfd.png +0 -0
  164. kaa/sprites/cd601176-0336-41c7-8d3f-31ddf8cf708d.png +0 -0
  165. kaa/sprites/cda022d1-7898-4006-95c5-b55eceda9d95.png +0 -0
  166. kaa/sprites/ce22506b-7410-4039-94de-dc1bdba8ac00.png +0 -0
  167. kaa/sprites/cea2d5c4-6e79-425e-9e98-7e7dbdee960b.png +0 -0
  168. kaa/sprites/cf302432-c592-4b6f-a6de-53c3e1bef23e.png +0 -0
  169. kaa/sprites/d0d9f650-bb30-4743-81f3-cd7ea8211d5c.png +0 -0
  170. kaa/sprites/d14a1c6c-339a-4dfe-9078-950d3518bc3b.png +0 -0
  171. kaa/sprites/d277a9c3-2b2c-42fc-9fbb-a836413c8cf4.png +0 -0
  172. kaa/sprites/d50d4438-65bc-4849-9a11-7e8b796e1b9d.png +0 -0
  173. kaa/sprites/d5407f49-fecc-404e-915a-22c9fa16a79a.png +0 -0
  174. kaa/sprites/d73e9e03-b910-42c0-9953-34980bff09f5.png +0 -0
  175. kaa/sprites/d8485972-4e67-4190-8d95-60fd3c68b2ce.png +0 -0
  176. kaa/sprites/d963e76b-3c25-4bc7-a307-78d97728a819.png +0 -0
  177. kaa/sprites/dab08e98-9053-4e2a-9e74-cf30298fea22.png +0 -0
  178. kaa/sprites/db25f60d-4772-44f9-85dc-aba4b20cffa2.png +0 -0
  179. kaa/sprites/dcbeb7cd-cd57-4daf-b023-ff2c7ef1621a.png +0 -0
  180. kaa/sprites/dd6f31d1-510d-4425-a160-958e7e984382.png +0 -0
  181. kaa/sprites/de047f08-cef2-4b22-846e-fba2a06f8996.png +0 -0
  182. kaa/sprites/df11b01f-2ab1-4bfb-831f-bb8dae6a092b.png +0 -0
  183. kaa/sprites/e2f64c10-4db0-47c8-b23d-94802493d6fb.png +0 -0
  184. kaa/sprites/e4be69f6-6030-4fd8-8a36-fd3938d1734b.png +0 -0
  185. kaa/sprites/e4d0719b-d127-41a0-a250-492f79bf5625.png +0 -0
  186. kaa/sprites/e5196344-d61a-48ff-bc48-63f8f63c3788.png +0 -0
  187. kaa/sprites/e6f8f2a8-39e3-45e1-8a52-f2dc250bcd95.png +0 -0
  188. kaa/sprites/e70ce43b-9b3b-4aa0-8b9c-1d5cc4a1d5b0.png +0 -0
  189. kaa/sprites/e7c00f25-b15a-4403-a201-07b9b168e9f5.png +0 -0
  190. kaa/sprites/e82b9645-ee3f-4f63-922e-c1d703344baf.png +0 -0
  191. kaa/sprites/e9fad64b-e4e2-46cb-a820-b2860b38da03.png +0 -0
  192. kaa/sprites/eab111a6-80bf-45c1-9a74-b44ca76508b7.png +0 -0
  193. kaa/sprites/ec0d03db-7c66-46b7-86cc-4acaa6eba1c9.png +0 -0
  194. kaa/sprites/edd2d38d-9071-4094-8931-1a68b6ebe1b8.png +0 -0
  195. kaa/sprites/eeff3d53-5a40-44c2-9d09-8f246157c72b.png +0 -0
  196. kaa/sprites/ef0db31a-fc44-4972-af7e-21c50f0b139c.png +0 -0
  197. kaa/sprites/f1fa2fc3-c3d4-4040-90f1-7941b98dcee5.png +0 -0
  198. kaa/sprites/f31531b4-79ea-41dc-b23f-e445b818139c.png +0 -0
  199. kaa/sprites/f35e19ca-7de7-4721-af53-b5f95c5e74fe.png +0 -0
  200. kaa/sprites/f5e1e7ed-fd35-42c3-97ed-5e9214a50733.png +0 -0
  201. kaa/sprites/f7246b84-e70b-47d3-8166-90f0dc4f2bb6.png +0 -0
  202. kaa/sprites/f7e8e937-1eda-4bd3-a3cf-d306cb1973e2.png +0 -0
  203. kaa/sprites/f8babf59-d55e-40c2-a0b7-5d743ab71799.png +0 -0
  204. kaa/sprites/f9697f23-07cf-4a14-8b22-d1fc95386c16.png +0 -0
  205. kaa/sprites/fad8b65b-7d9e-49d8-9f71-6d078aa672ca.png +0 -0
  206. kaa/sprites/fb017237-bac6-4b73-9437-4518e764ef45.png +0 -0
  207. kaa/sprites/fc86085c-d708-498a-bfa6-92e1a1364c60.png +0 -0
  208. kaa/tasks/R.py +140 -128
  209. kaa/tasks/common.py +5 -0
  210. kaa/tasks/daily/contest.py +2 -1
  211. kaa/tasks/daily/purchase.py +34 -2
  212. kaa/tasks/daily/upgrade_support_card.py +12 -2
  213. kaa/tasks/produce/cards.py +5 -4
  214. kaa/tasks/produce/common.py +202 -105
  215. kaa/tasks/produce/in_purodyuusu.py +35 -17
  216. kaa/tasks/produce/non_lesson_actions.py +10 -33
  217. kaa/tasks/produce/p_drink.py +5 -1
  218. kaa/tasks/produce/produce.py +12 -1
  219. kaa/tasks/start_game.py +61 -5
  220. kaa/util/reactive.py +182 -0
  221. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/METADATA +31 -27
  222. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/RECORD +354 -176
  223. /kaa/sprites/{3504b421-58f2-4ca0-869e-764335d60406.png → 001486b2-f627-4ece-8c93-4dfec47da9b3.png} +0 -0
  224. /kaa/sprites/{7dc79a8b-bd59-4c93-a638-e49bca276c00.png → 011e352f-6e8b-4225-b104-d1b2ccf0761c.png} +0 -0
  225. /kaa/sprites/{69f15152-8ee9-4e39-9bfa-6cd1b051bc1e.png → 0240342e-b6f3-4ed6-8da5-a64092e6fcde.png} +0 -0
  226. /kaa/sprites/{15801cb7-24f6-4504-921b-5e5a37bdc064.png → 02df555c-b19c-4776-8f1b-d1a7e2ed2f82.png} +0 -0
  227. /kaa/sprites/{55a2ba58-2412-4c39-9c6e-2627092623a2.png → 0343a3b8-8cd6-47af-b956-760dd2c79711.png} +0 -0
  228. /kaa/sprites/{d62dab9b-d36d-490e-bca5-bfd4b66911d7.png → 04c287ed-9ab1-4cd1-af07-8ab61f7f49bc.png} +0 -0
  229. /kaa/sprites/{8d99cd97-ae34-488f-b62e-54d54f75e4e8.png → 05d7740b-c6ea-453a-b805-7d0a5fe18184.png} +0 -0
  230. /kaa/sprites/{66ccbeba-3291-4f1c-8669-d691f24ea9ed.png → 06a7097c-fef6-4f2c-bece-26eed414708e.png} +0 -0
  231. /kaa/sprites/{609a340b-2cfa-4cef-9e55-fb60c7cabdbb.png → 072b167f-a2f6-4458-815e-a92ca2e6c9eb.png} +0 -0
  232. /kaa/sprites/{e881ee18-154e-4f0c-91fe-4699d156671d.png → 0899a6e7-6617-4f11-a7a2-9ba377ad6cba.png} +0 -0
  233. /kaa/sprites/{689eebfd-984c-45c9-812f-26cf9c756bed.png → 0950d760-6d88-4265-b28c-0790a782a749.png} +0 -0
  234. /kaa/sprites/{76d5d7f7-b23d-4802-8f91-7058f7adcffd.png → 0a019c0d-26fa-4441-b281-b73060722bc9.png} +0 -0
  235. /kaa/sprites/{ac194536-54e4-49e7-992c-fc82ba401f10.png → 0a27a783-0ef8-4f99-8c26-cf89768b5146.png} +0 -0
  236. /kaa/sprites/{06ee3b1e-5c99-4ebf-8a23-d6f59cda32b8.png → 0af981f5-bcc9-48eb-a392-50f79ec5149a.png} +0 -0
  237. /kaa/sprites/{e7709d81-890b-438f-8acb-50492d63022e.png → 0afb71f5-0752-47af-9ba2-85bdbe4fcbf7.png} +0 -0
  238. /kaa/sprites/{62cc930f-acc2-424a-975f-164009a555f8.png → 0b83c2e5-ebb4-4a69-8b5f-658774d4c5a6.png} +0 -0
  239. /kaa/sprites/{ad63136d-2360-45e6-b7ef-00e01612c7ce.png → 0be5a84d-eb1e-4bb3-afcd-923e104190f4.png} +0 -0
  240. /kaa/sprites/{be2985ff-c3ac-4d94-9751-c652dd561db2.png → 0c192ca4-dd10-49b4-b0be-9b1fb4637910.png} +0 -0
  241. /kaa/sprites/{bca22a82-f72b-46ca-be06-c1e18b7ad27c.png → 0cae32b3-0248-49ad-98dd-d06a89308797.png} +0 -0
  242. /kaa/sprites/{a694f6e8-6ef9-4761-816a-ad586ce93654.png → 0d1fd6f0-3a6f-4008-a31a-8189dd09be50.png} +0 -0
  243. /kaa/sprites/{cde4da05-d654-4217-8443-752bc0709742.png → 0d2143fa-7e81-4e7a-8a94-c3839719de5b.png} +0 -0
  244. /kaa/sprites/{901b48f9-d7b7-46c2-85fa-b07e427ffdaa.png → 0dbb752b-e60a-459d-80fa-f5b49e8b8e4d.png} +0 -0
  245. /kaa/sprites/{80fa9c6e-fe05-4d3e-ae50-6b7e9a237e0b.png → 0e63e0b7-6874-46e9-86de-8c23e6491f24.png} +0 -0
  246. /kaa/sprites/{603c5369-9247-404d-bc6d-4719d11de6ea.png → 0f4ac9ae-5e4d-4f3f-b9e0-b76570f2b040.png} +0 -0
  247. /kaa/sprites/{7f90beb9-8712-4a53-a818-ff7a5e82d71d.png → 0f8026e8-62a9-49e5-97a6-0d78f33dcfcf.png} +0 -0
  248. /kaa/sprites/{6bcebf50-764b-4bf2-be8e-ba241d8550d7.png → 0f80ac6f-bdf8-4927-8393-c554209f517a.png} +0 -0
  249. /kaa/sprites/{4396a9b8-b7f0-45f3-8a8f-85773a10eecb.png → 116d3f3a-0255-47ed-b656-c26b41a5cfa8.png} +0 -0
  250. /kaa/sprites/{9a0172aa-9489-4985-9c65-c5f6db0a0325.png → 130cd7fd-767e-4177-9087-71f418f154dd.png} +0 -0
  251. /kaa/sprites/{333a1e30-82d3-45b9-8e48-4c127bcb5ec6.png → 138a527b-2191-4f0f-9e36-1d08bbf6ffb1.png} +0 -0
  252. /kaa/sprites/{cee6ca8f-219c-448d-9ba6-d6722f27b600.png → 1472da80-4cbb-41e1-94e8-3ea3defd3b6f.png} +0 -0
  253. /kaa/sprites/{94121408-8cd2-46fc-bf27-33b207e4cba8.png → 14875449-7478-4969-a2d5-91ce34c9d1e4.png} +0 -0
  254. /kaa/sprites/{15da6f78-d89f-480c-9cce-c95e009fd15a.png → 1539fcff-8842-478f-98a8-0d1a885d1b43.png} +0 -0
  255. /kaa/sprites/{97329116-4d2e-40d7-af96-938afdac4e60.png → 16113270-3f35-498a-a29a-52f190d77cc1.png} +0 -0
  256. /kaa/sprites/{545068ad-6f17-40d8-99e1-d26bd5700c67.png → 1617c180-ce9f-461a-bfdc-390337ecb205.png} +0 -0
  257. /kaa/sprites/{e38a2f35-9ac5-4363-bd6d-09893907ea71.png → 16cf9d8b-4f8e-47ce-a63d-fe9bfc3f31e8.png} +0 -0
  258. /kaa/sprites/{4fc6fae5-386d-434c-893d-5450bd5a6396.png → 1b485aa9-f0c0-4b49-ba75-363a8d6e292c.png} +0 -0
  259. /kaa/sprites/{4995d301-375b-4d23-a6e5-b26a771fcbe4.png → 1d560b06-feac-413d-bf90-07ac045f11fb.png} +0 -0
  260. /kaa/sprites/{e16b116c-6a2c-4e5d-8105-8dfc8c4c730f.png → 1d92cb8e-49a7-4166-9682-a5807e0c7912.png} +0 -0
  261. /kaa/sprites/{be04f096-c46b-4784-8e6c-c1217764f6dd.png → 1dadf765-ddd0-4768-9e91-6d3d08d0ca0d.png} +0 -0
  262. /kaa/sprites/{d0652541-e289-4bcd-98ec-a88715f5adef.png → 20cbf6b8-01db-45fe-a790-dbb7dd639b1d.png} +0 -0
  263. /kaa/sprites/{8c4f60d1-d707-4ae5-bd94-d96661ea7bbc.png → 20d01fc0-9a54-4ef5-9983-2bb8414dd94d.png} +0 -0
  264. /kaa/sprites/{011c52b9-613d-4865-afd3-1f0ddab2bc5b.png → 20e1e948-6920-44cd-965e-9e1e37b3fbf2.png} +0 -0
  265. /kaa/sprites/{5ee1b47b-f20d-431b-a0bb-d203b9f3e15b.png → 23922edd-22aa-4514-ba99-65bcd72c2ad1.png} +0 -0
  266. /kaa/sprites/{3d57da0a-b166-4acd-9a8a-b247ba5ad13a.png → 24c2db22-24e2-484e-8c16-8b1c9fe3ed14.png} +0 -0
  267. /kaa/sprites/{f5145781-949e-4012-9ea9-b0a277dac72b.png → 26683d54-74a9-4e7b-a839-c2e0850d1458.png} +0 -0
  268. /kaa/sprites/{2987cb9c-5975-41b3-87f7-cc26efdcee74.png → 27bcc513-9bab-468a-97b8-ed16f918e2a4.png} +0 -0
  269. /kaa/sprites/{c24394f6-ed02-4fb4-8d58-40a7e51b259d.png → 284a19c3-2c06-48a5-8f78-b4682e8ae19e.png} +0 -0
  270. /kaa/sprites/{da615a2f-3334-462c-8535-40067ad1c857.png → 2927cceb-29dc-4c35-8614-1df42fc0733b.png} +0 -0
  271. /kaa/sprites/{0a430b29-9841-407a-a102-ea6420beeaae.png → 2c5784df-e89b-4b95-a4b9-bac083c0ec08.png} +0 -0
  272. /kaa/sprites/{3867054e-a686-4dab-89fb-6a9def58dfe1.png → 2dfa926c-83c5-4f40-adfe-ff04ce448264.png} +0 -0
  273. /kaa/sprites/{d1a6547e-7c58-4500-a7f4-cf462f44395f.png → 2f7f70ea-f3f0-4d14-8885-1a735ff00545.png} +0 -0
  274. /kaa/sprites/{4a5e8c39-4e80-4202-9886-be1a58073fd6.png → 307fcb37-7a90-4a3e-bd3a-64a691aeb5d5.png} +0 -0
  275. /kaa/sprites/{151dc2ce-fce4-4741-ac6e-cc8213f54137.png → 3114b2d5-0a96-4eba-9143-b09eabb63612.png} +0 -0
  276. /kaa/sprites/{1aa14c42-8682-4a75-b4a2-4715481a2381.png → 31168fe2-8601-4de6-aa40-81e7ce452391.png} +0 -0
  277. /kaa/sprites/{f3400d73-4f61-4027-b5d8-03765a63a186.png → 31b025df-ed25-4bc4-a94a-d05388e9156e.png} +0 -0
  278. /kaa/sprites/{0c211c20-096e-4572-8e74-3867904db1f6.png → 32af48d2-fb5b-4288-930f-eb36edfe2116.png} +0 -0
  279. /kaa/sprites/{0803c844-7085-4492-ad68-0ce3b11f9840.png → 34e50d77-7b95-4bb7-8c62-ad6801dc0e55.png} +0 -0
  280. /kaa/sprites/{bd5b168a-de03-46b3-b1b7-9fa9667f4642.png → 3658a26d-98d3-462a-abf4-4d8b74aeb134.png} +0 -0
  281. /kaa/sprites/{562deb0a-99bd-4e95-80ff-f933a73c28ad.png → 36f11c55-e110-44b7-a800-85f4d7584560.png} +0 -0
  282. /kaa/sprites/{9c827df9-2e47-4bec-95b7-8ccad6377a28.png → 38bb2a90-b2a9-4f85-9025-662e83ab1ed1.png} +0 -0
  283. /kaa/sprites/{eebbccac-25a9-465e-b7c8-3bfdaf0bf0b9.png → 38f70a7e-5f7e-4ee6-a7c5-5f8014734719.png} +0 -0
  284. /kaa/sprites/{6f79221a-8c47-423e-ac72-27d97c559d63.png → 3aceddce-09db-422a-8023-e08d41070cc8.png} +0 -0
  285. /kaa/sprites/{3fe4ec28-3b2a-4042-ace1-ceec5c8f48b1.png → 3c224540-1571-435a-b8e6-2317e4411438.png} +0 -0
  286. /kaa/sprites/{f2913d0b-342c-4de0-8235-fe3f1c580d2e.png → 3d9a9493-7616-4b2b-867e-44e776d831c0.png} +0 -0
  287. /kaa/sprites/{a8bef06b-9287-4f54-b96e-19463031d26f.png → 3fd694ea-8396-4cf3-9ba6-eaf95b61e8c8.png} +0 -0
  288. /kaa/sprites/{fd16e035-699c-4dc9-9721-61443cd6fd63.png → 4055dbef-1523-43b7-9183-6b2721b4307b.png} +0 -0
  289. /kaa/sprites/{606d4740-8af9-40f6-af18-ad9f73cecf68.png → 4059ec2d-cd20-4dd3-8586-e49a4cfa8717.png} +0 -0
  290. /kaa/sprites/{9ea3c9b4-80f3-44b9-90e3-cfc406f814be.png → 4280fa1d-4223-4fc4-85f9-caf6157cb004.png} +0 -0
  291. /kaa/sprites/{436ec8e4-aa4a-4b1f-940a-2ab55baa098d.png → 43bc2116-7fe3-4b20-8c8b-3ab2a2b5dd7d.png} +0 -0
  292. /kaa/sprites/{39815c36-38c5-4066-aff5-2177c232b4f4.png → 43d3fe01-27c0-4d3f-a908-aebd00ab219d.png} +0 -0
  293. /kaa/sprites/{9c6378a9-62ed-4881-bc6f-2166bbb470c7.png → 45062c9b-a31d-457b-83a2-9b6891384a15.png} +0 -0
  294. /kaa/sprites/{e630b33a-e73e-4271-96b9-860b94fb48ca.png → 4516d0e4-9280-4f91-ba7d-fc8af83a9996.png} +0 -0
  295. /kaa/sprites/{916391a4-09b7-409c-ba25-391b61a65e62.png → 458b8bbe-9fa5-48d4-907b-66d36baf16a1.png} +0 -0
  296. /kaa/sprites/{9092a171-66f0-47dc-99dd-bb5d7359077a.png → 45af668c-2324-4fe4-83e0-11d65cfaa086.png} +0 -0
  297. /kaa/sprites/{297fb9e0-9553-40fb-ad08-f5ab718ef119.png → 45bdb006-bea5-4a1f-bf1a-c3bcb2e99abd.png} +0 -0
  298. /kaa/sprites/{1bf95df3-255f-4e89-9b17-0af77f4affd6.png → 47186b16-f478-4a53-8e49-a132ee4c78db.png} +0 -0
  299. /kaa/sprites/{1f6805bb-dff1-4d4c-82bf-74563056cc81.png → 4876c6f3-17a5-4858-b1d1-ebb5619516c5.png} +0 -0
  300. /kaa/sprites/{b2c8ac50-87a3-4cdd-a895-9704a9674163.png → 491bd489-7a08-47b4-b1b7-5d0f44cedbca.png} +0 -0
  301. /kaa/sprites/{484594b4-06a2-4ec3-8a85-e7af3b012125.png → 4a853ac5-24d5-44ac-8ddf-9f501c60a9be.png} +0 -0
  302. /kaa/sprites/{f6e26f3c-2548-4507-8651-53917e0fe82a.png → 4b88639e-1f17-4e11-90b6-bb122f8cb5ab.png} +0 -0
  303. /kaa/sprites/{935d8115-245f-42ff-ad74-55f4e6d140b1.png → 4dc5f817-86bc-4433-aeb5-b02c7b63fa8c.png} +0 -0
  304. /kaa/sprites/{b379d704-fc45-42f9-a45c-d81a6c5ee951.png → 4e3a9fd3-86aa-4e14-ae48-46e53a553da2.png} +0 -0
  305. /kaa/sprites/{7df9b645-ff88-4459-8ba7-450da538cfd9.png → 4e7f7b91-344c-4fb2-95fe-004831e81b11.png} +0 -0
  306. /kaa/sprites/{24b3cf5c-0586-41cc-abfb-df48de07fa77.png → 511232f6-01d6-482a-81a3-2bf79a6e88ed.png} +0 -0
  307. /kaa/sprites/{101a9c54-ab8c-4b5d-a4e0-686b93b4e1d9.png → 546cb160-f99b-4cda-9719-02b38a5393a0.png} +0 -0
  308. /kaa/sprites/{74e4c222-0006-4295-99d0-a01aa8b94dc2.png → 56bc2743-5dd9-4d09-a681-af9d1fec568b.png} +0 -0
  309. /kaa/sprites/{d11f07b1-f2e9-4c41-9ad9-81529121afd4.png → 5701ecbe-7fed-435c-b409-75f8b0f2df51.png} +0 -0
  310. /kaa/sprites/{6dd4ca2b-69ca-4099-9e69-2144ce9a4d28.png → 58de1cf0-4270-4987-9dc7-3f584f1119d1.png} +0 -0
  311. /kaa/sprites/{48eb2e27-7419-4136-9642-7af1a6f83ed9.png → 5a337f99-8554-48bf-acb7-364259fbf1b7.png} +0 -0
  312. /kaa/sprites/{ccad6a54-73f6-48b8-a86f-16b9e0f46e41.png → 5cb4deb9-2ec5-4452-aba4-390eae2071c7.png} +0 -0
  313. /kaa/sprites/{f136dd9f-43c8-44cc-b081-1f86d7ce38d4.png → 5d42f16f-3475-4ffb-ac85-3c86fa8fba46.png} +0 -0
  314. /kaa/sprites/{52aba1bd-1e82-46a7-8003-0aac11586a38.png → 6c5698a4-b211-4f38-83a7-51b5f3a36911.png} +0 -0
  315. /kaa/sprites/{0ec56b89-81f2-478d-907e-b04aab199e86.png → 771d1e17-8ef4-417a-b482-26db514e17c6.png} +0 -0
  316. /kaa/sprites/{c23c29cc-ef42-46d8-8b58-283b74a254cc.png → 7833fa1e-c842-4efd-a696-c67150a1dfa8.png} +0 -0
  317. /kaa/sprites/{2bb41b59-61f8-4109-a550-faa6a14708de.png → 791b3367-fb7c-48b5-9a0f-877908e51c4a.png} +0 -0
  318. /kaa/sprites/{47cbfa79-0b33-4ccc-b762-21e3a141a7bc.png → 7bb874a3-3fac-4138-83bd-d6461c5793d3.png} +0 -0
  319. /kaa/sprites/{fc77cc87-f8eb-4b33-834c-ee5d2af5ca44.png → 7d4d06a8-7903-4803-a20b-7f45ffbe9ca7.png} +0 -0
  320. /kaa/sprites/{b581ae5b-cb67-4bf9-8ffe-72b8ba56d887.png → 81553259-3b0a-42f7-b7b9-2c6e1dfec6c4.png} +0 -0
  321. /kaa/sprites/{eda88516-ac6b-4f26-b074-f8e6e2ae42a5.png → 827cec52-d883-46d1-b24b-c11c82b1b459.png} +0 -0
  322. /kaa/sprites/{9966acd5-973a-4afb-a006-c1fa66cfe679.png → 8473bc42-1909-4d70-b80d-7eba085c9978.png} +0 -0
  323. /kaa/sprites/{c16ae471-7d60-4c1f-9981-1090414a7ea0.png → 84797a78-97f3-44fa-b3c0-132c914f534a.png} +0 -0
  324. /kaa/sprites/{df54b1e4-035c-4937-9360-19b4733826e6.png → 861bd6b8-cca7-46b1-9346-83af080e211b.png} +0 -0
  325. /kaa/sprites/{436b9822-c946-4d2e-a432-8f3159705b37.png → 8f5081e4-ed3d-445b-bcf6-2e40c7d08298.png} +0 -0
  326. /kaa/sprites/{5bb33faa-8236-4e17-92bd-ad709795f261.png → 91dbaa9c-7881-4687-bd64-8f25c201d98c.png} +0 -0
  327. /kaa/sprites/{95e11d11-f330-4906-a128-6492f95176e8.png → 93f3f6a9-e9d2-45b7-a2b3-1e8b64d10e9b.png} +0 -0
  328. /kaa/sprites/{dd59548d-0800-49d3-8701-b2b2e8512c36.png → 943cde40-f190-40b6-9235-4439fbb4ae50.png} +0 -0
  329. /kaa/sprites/{7678902c-57df-4cf8-87ef-11c85f02214b.png → 97f3fb5a-fce2-4cc5-9da5-f0496e9dd294.png} +0 -0
  330. /kaa/sprites/{d051b4c3-354e-4d69-95f6-14f5017ed79e.png → 98a68736-c4ec-4af1-ac64-40eb48f9c000.png} +0 -0
  331. /kaa/sprites/{a9029026-7a7e-4f8e-9620-bd451bfdf284.png → 9af13381-661d-41cf-b704-e4a9c3691e14.png} +0 -0
  332. /kaa/sprites/{5a892ef3-543b-4fad-bdca-5358314d6be7.png → 9b91dc78-49e8-41b2-9500-c27cb46023c4.png} +0 -0
  333. /kaa/sprites/{920ea830-31a8-4256-b247-7b9507030783.png → 9d0bf64a-2684-43fa-b9bf-552e60c717b4.png} +0 -0
  334. /kaa/sprites/{b37685c3-74a8-4393-ad79-c445ab2d77be.png → a32fa779-2fb9-488e-9153-0b99e4352281.png} +0 -0
  335. /kaa/sprites/{9f81bc0f-da2c-4321-a185-b2d8a3f0d390.png → a6269fe5-e719-43ad-b674-ea728e43066b.png} +0 -0
  336. /kaa/sprites/{2beaba86-119e-4a1c-8cf4-e03c4d0d957a.png → a8ca6a10-ba0a-4416-a27b-3323d38040ab.png} +0 -0
  337. /kaa/sprites/{f258af39-e8be-4e19-aafc-bfedce9793c0.png → acaea032-45b8-4ad8-8b54-ff011750af80.png} +0 -0
  338. /kaa/sprites/{ed7adff5-1604-4ade-ac2b-a30167ef457c.png → ae5a051e-37f5-4e54-bfc7-64c445ad6fcc.png} +0 -0
  339. /kaa/sprites/{30604b47-7c8b-4dd5-b926-fd33bad575c7.png → af5a6ae7-a355-492e-86a8-62fa2b06bb54.png} +0 -0
  340. /kaa/sprites/{36e6c1ea-8de5-4640-8340-b8f532ef40c0.png → b406baf0-fa0b-4125-adc6-d370582a6104.png} +0 -0
  341. /kaa/sprites/{42bfc60c-0249-4910-ad04-80e559b52c6b.png → b62f9c30-1faf-47fc-be8f-36db3806c5dc.png} +0 -0
  342. /kaa/sprites/{56bcde1a-5cd7-493d-a2cd-2a63394c0c36.png → ba1983ce-bf63-4022-9ef3-dcf97030e6c5.png} +0 -0
  343. /kaa/sprites/{8e648675-1a52-4926-92cf-64c7cb5c2a59.png → ba971684-1fe3-47e1-8bdb-d20a0011ea68.png} +0 -0
  344. /kaa/sprites/{3af1e6de-e718-4a09-8ee9-88be21cd4b3d.png → bdbed86f-553c-458e-9435-d587005b367d.png} +0 -0
  345. /kaa/sprites/{e2944d47-159f-4200-b476-8d5db41d30c0.png → bee41ab5-c62e-4a79-a8d0-40f9efbc7e40.png} +0 -0
  346. /kaa/sprites/{bfaf3273-76bf-457a-88b7-6816af742a30.png → c344b05d-2707-43b0-9e3e-4ec433558dcb.png} +0 -0
  347. /kaa/sprites/{7df273dc-69f7-45b9-a782-b221783f851b.png → c3c495a2-1530-439f-a10e-76ca5d929cce.png} +0 -0
  348. /kaa/sprites/{76262c30-a2ee-45ba-8279-ca682cee0bd6.png → ccac6d8e-bca2-4ab6-b88b-c0f5ba83df84.png} +0 -0
  349. /kaa/sprites/{574b2741-c4ac-4ee4-a544-f4f499e4a21e.png → ce7cec02-4039-4171-87ed-37eccc4ac832.png} +0 -0
  350. /kaa/sprites/{6dead493-c4e6-4ba9-ac56-abe8c511abbd.png → f72e9d65-68e7-4bb6-be44-4b5ed71f0bce.png} +0 -0
  351. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/WHEEL +0 -0
  352. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/entry_points.txt +0 -0
  353. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/licenses/LICENSE +0 -0
  354. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/top_level.txt +0 -0
@@ -31,8 +31,18 @@ def upgrade_support_card():
31
31
  device.click(image.expect_wait(R.Common.ButtonIdolSupportCard, timeout=5))
32
32
  sleep(2)
33
33
 
34
- # 往下滑,划到最底部
35
- Scrollable().to(1)
34
+ # 重试10次
35
+ for retry_idx in range(10):
36
+ logger.debug(f'Scrolling down to find low-level support cards, attempt {retry_idx + 1}/10')
37
+ # 往下滑,划到最底部
38
+ scrollbar = Scrollable()
39
+ scrollbar.to(1)
40
+ sleep(0.1)
41
+ scrollbar.update()
42
+ if scrollbar.position >= 0.99:
43
+ logger.debug('Successfully scrolled to the bottom.')
44
+ break
45
+ sleep(0.5)
36
46
 
37
47
  # 点击左上角第一张支援卡
38
48
  # 点击位置百分比: (0.18, 0.34)
@@ -1,4 +1,3 @@
1
- import logging
2
1
  from functools import partial
3
2
  from typing import Callable, NamedTuple, Literal
4
3
 
@@ -9,6 +8,7 @@ from cv2.typing import MatLike
9
8
  from kaa.db.drink import Drink
10
9
  from kaa.game_ui.drinks_overview import locate_all_drinks_in_3_drink_slots
11
10
  from kaa.tasks import R
11
+ from kaa.tasks.common import skip
12
12
  from kaa.config import conf
13
13
  from kaa.game_ui import dialog
14
14
  from kaa.tasks.produce.common import acquisition_date_change_dialog
@@ -16,6 +16,7 @@ from kaa.util.trace import trace
16
16
  from kotonebot.primitives import RectTuple, Rect
17
17
  from kotonebot import action, Interval, Countdown, device, image, sleep, ocr, contains, use_screenshot, color
18
18
  from kotonebot.backend.loop import Loop
19
+ from kotonebot import logging
19
20
 
20
21
  class SkillCard(NamedTuple):
21
22
  available: bool
@@ -143,7 +144,7 @@ def do_cards(
143
144
  DRINK_MAX_RETRIES = 5
144
145
 
145
146
  for _ in Loop(interval=1/30):
146
- device.click(10, 10)
147
+ skip()
147
148
  img = device.screenshot()
148
149
 
149
150
  # 技能卡自选移动对话框
@@ -420,7 +421,7 @@ def detect_recommended_card(
420
421
  filtered_results = list(filter(partial(threshold_predicate, card_count), results))
421
422
  if not filtered_results:
422
423
  max_result = max(results, key=lambda x: x.score)
423
- logger.info("Max card detect result (discarded): value=%d score=%.4f borders=(%.4f, %.4f, %.4f, %.4f)",
424
+ logger.verbose("Max card detect result (discarded): value=%d score=%.4f borders=(%.4f, %.4f, %.4f, %.4f)",
424
425
  max_result.type,
425
426
  max_result.score,
426
427
  max_result.left_score,
@@ -430,7 +431,7 @@ def detect_recommended_card(
430
431
  )
431
432
  return None
432
433
  filtered_results.sort(key=lambda x: x.score, reverse=True)
433
- logger.info("Max card detect result: value=%d score=%.4f borders=(%.4f, %.4f, %.4f, %.4f)",
434
+ logger.debug("Max card detect result: value=%d score=%.4f borders=(%.4f, %.4f, %.4f, %.4f)",
434
435
  filtered_results[0].type,
435
436
  filtered_results[0].score,
436
437
  filtered_results[0].left_score,
@@ -1,6 +1,7 @@
1
- from typing import Literal
2
1
  from logging import getLogger
2
+ from typing import Literal, Callable
3
3
 
4
+ from cv2.typing import MatLike
4
5
  from kotonebot import (
5
6
  ocr,
6
7
  device,
@@ -10,16 +11,23 @@ from kotonebot import (
10
11
  Loop,
11
12
  Interval,
12
13
  )
13
- from kaa.config.schema import produce_solution
14
- from kaa.tasks.start_game import wait_for_home
14
+ from kotonebot.util import Countdown
15
15
  from kotonebot.primitives import Rect
16
16
  from kaa.tasks import R
17
+ from kaa.tasks.common import skip
17
18
  from .p_drink import acquire_p_drink
18
19
  from kotonebot.util import measure_time
20
+ from kotonebot.backend.core import Image
21
+ from kotonebot.errors import UnrecoverableError
22
+
23
+ from kaa.tasks import R
19
24
  from kaa.config import conf
25
+ from .p_drink import acquire_p_drink
20
26
  from kaa.tasks.actions.loading import loading
21
- from kaa.game_ui import CommuEventButtonUI, dialog, badge
27
+ from kaa.config.schema import produce_solution
28
+ from kaa.tasks.start_game import wait_for_home
22
29
  from kaa.tasks.actions.commu import handle_unread_commu
30
+ from kaa.game_ui import CommuEventButtonUI, dialog, badge
23
31
 
24
32
  logger = getLogger(__name__)
25
33
 
@@ -77,6 +85,7 @@ def acquire_skill_card():
77
85
  if acquire_btn := image.find(R.InPurodyuusu.AcquireBtnDisabled):
78
86
  logger.debug("Click acquire button")
79
87
  device.click(acquire_btn)
88
+ sleep(0.2)
80
89
  break
81
90
 
82
91
  @action('选择P物品', screenshot_mode='auto')
@@ -257,109 +266,197 @@ def acquisition_date_change_dialog() -> AcquisitionType | None:
257
266
 
258
267
  return None
259
268
 
260
- @measure_time()
261
- @action('处理培育事件', screenshot_mode='manual')
262
- def fast_acquisitions() -> AcquisitionType | None:
263
- """处理行动开始前和结束后可能需要处理的事件"""
264
- img = device.screenshot()
265
- logger.info("Acquisition stuffs...")
266
-
267
- # 加载画面
268
- if loading():
269
- logger.info("Loading...")
270
- return "Loading"
271
- device.click(10, 10)
272
-
273
- # 跳过未读交流
274
- logger.debug("Check skip commu...")
275
- if produce_solution().data.skip_commu and handle_unread_commu(img):
276
- return "SkipCommu"
277
- device.click(10, 10)
278
-
279
- # P饮料到达上限
280
- logger.debug("Check PDrink max...")
281
- # TODO: 需要封装一个更好的实现方式。比如 wait_stable?
282
- if image.find(R.InPurodyuusu.TextPDrinkMax):
283
- logger.debug("PDrink max found")
284
- device.screenshot()
269
+ # TODO: 这里要改善一下输出日志。
270
+ # Acquisitions finished. Handled: xxx(event name or 'none'). Checked: 12(number of acquisitions) / 12(number of acquisitions)
271
+ class ProduceInterrupt:
272
+ def __init__(self, *, timeout: float | None = None):
273
+ """
274
+ :param timeout: 超时时间,单位秒。默认为 None,表示使用配置文件中的时间。
275
+ """
276
+ timeout = timeout or conf().produce.interrupt_timeout
277
+ self.cd = Countdown(timeout)
278
+
279
+ @staticmethod
280
+ def _check_loading(img: MatLike) -> AcquisitionType | None:
281
+ """检查加载画面"""
282
+ if loading():
283
+ logger.info("Loading...")
284
+ return "Loading"
285
+ return None
286
+
287
+ @staticmethod
288
+ def _check_skip_commu(img: MatLike) -> AcquisitionType | None:
289
+ """检查跳过未读交流"""
290
+ logger.debug("Check skip commu...")
291
+ if produce_solution().data.skip_commu and handle_unread_commu(img):
292
+ return "SkipCommu"
293
+ return None
294
+
295
+ @staticmethod
296
+ def _check_pdrink_max(img: MatLike) -> AcquisitionType | None:
297
+ """检查P饮料到达上限"""
298
+ logger.debug("Check PDrink max...")
299
+ # TODO: 需要封装一个更好的实现方式。比如 wait_stable?
285
300
  if image.find(R.InPurodyuusu.TextPDrinkMax):
286
- # 有对话框标题,但是没找到确认按钮
287
- # 可能是需要勾选一个饮料
288
- if not image.find(R.InPurodyuusu.ButtonLeave, colored=True):
289
- logger.info("No leave button found, click checkbox")
290
- device.click(image.expect(R.Common.CheckboxUnchecked, colored=True))
291
- sleep(0.2)
292
- device.screenshot()
293
- if leave := image.find(R.InPurodyuusu.ButtonLeave, colored=True):
294
- logger.info("Leave button found")
295
- device.click(leave)
296
- return "PDrinkMax"
297
- # P饮料到达上限 确认提示框
298
- # [kotonebot-resource\sprites\jp\in_purodyuusu\screenshot_pdrink_max_confirm.png]
299
- if image.find(R.InPurodyuusu.TextPDrinkMaxConfirmTitle):
300
- logger.debug("PDrink max confirm found")
301
- device.screenshot()
301
+ logger.debug("PDrink max found")
302
+ device.screenshot()
303
+ if image.find(R.InPurodyuusu.TextPDrinkMax):
304
+ # 有对话框标题,但是没找到确认按钮
305
+ # 可能是需要勾选一个饮料
306
+ # 也有可能是对话框正在往下退出
307
+ if not image.find(R.InPurodyuusu.ButtonLeave, colored=True):
308
+ logger.info("No leave button found, click checkbox")
309
+ if image.find(R.Common.CheckboxUnchecked, colored=True):
310
+ device.click()
311
+ sleep(0.2)
312
+ device.screenshot()
313
+ if leave := image.find(R.InPurodyuusu.ButtonLeave, colored=True):
314
+ logger.info("Leave button found")
315
+ device.click(leave)
316
+ return "PDrinkMax"
317
+ return None
318
+
319
+ @staticmethod
320
+ def _check_pdrink_max_confirm(img: MatLike) -> AcquisitionType | None:
321
+ """检查P饮料到达上限确认提示框"""
322
+ # [kotonebot-resource/sprites/jp/in_purodyuusu/screenshot_pdrink_max_confirm.png]
302
323
  if image.find(R.InPurodyuusu.TextPDrinkMaxConfirmTitle):
303
- if confirm := image.find(R.Common.ButtonConfirm):
304
- logger.info("Confirm button found")
305
- device.click(confirm)
306
- return "PDrinkMax"
307
- device.click(10, 10)
308
-
309
- # 技能卡自选强化
310
- if image.find(R.InPurodyuusu.IconTitleSkillCardEnhance):
311
- if handle_skill_card_enhance():
312
- return "PSkillCardEnhanceSelect"
313
- device.click(10, 10)
314
-
315
- # 技能卡自选删除
316
- if image.find(R.InPurodyuusu.IconTitleSkillCardRemoval):
317
- if handle_skill_card_removal():
318
- return "PSkillCardRemoveSelect"
319
- device.click(10, 10)
320
-
321
- # 网络中断弹窗
322
- logger.debug("Check network error popup...")
323
- if (image.find(R.Common.TextNetworkError)
324
- and (btn_retry := image.find(R.Common.ButtonRetry))
325
- ):
326
- logger.info("Network error popup found")
327
- device.click(btn_retry)
328
- return "NetworkError"
329
- device.click(10, 10)
330
-
331
- # 物品选择对话框
332
- logger.debug("Check award select dialog...")
333
- if image.find(R.InPurodyuusu.TextClaim):
334
- logger.info("Award select dialog found.")
335
-
336
- # P饮料选择
337
- logger.debug("Check PDrink select...")
338
- if image.find(R.InPurodyuusu.TextPDrink):
339
- logger.info("PDrink select found")
340
- acquire_p_drink()
341
- return "PDrinkSelect"
342
- # 技能卡选择
343
- logger.debug("Check skill card select...")
344
- if image.find(R.InPurodyuusu.TextSkillCard):
345
- logger.info("Acquire skill card found")
346
- acquire_skill_card()
347
- return "PSkillCardSelect"
348
- # P物品选择
349
- logger.debug("Check PItem select...")
350
- if image.find(R.InPurodyuusu.TextPItem):
351
- logger.info("Acquire PItem found")
352
- select_p_item()
353
- return "PItemSelect"
354
- device.click(10, 10)
355
-
356
- # 日期变更
357
- result = acquisition_date_change_dialog()
358
- if result is not None:
359
- return result
360
- device.click(10, 10)
324
+ logger.debug("PDrink max confirm found")
325
+ device.screenshot()
326
+ if image.find(R.InPurodyuusu.TextPDrinkMaxConfirmTitle):
327
+ if confirm := image.find(R.Common.ButtonConfirm):
328
+ logger.info("Confirm button found")
329
+ device.click(confirm)
330
+ return "PDrinkMax"
331
+ return None
361
332
 
362
- return None
333
+ @staticmethod
334
+ def _check_skill_card_enhance(img: MatLike) -> AcquisitionType | None:
335
+ """检查技能卡自选强化"""
336
+ if image.find(R.InPurodyuusu.IconTitleSkillCardEnhance):
337
+ if handle_skill_card_enhance():
338
+ return "PSkillCardEnhanceSelect"
339
+ return None
340
+
341
+ @staticmethod
342
+ def _check_skill_card_removal(img: MatLike) -> AcquisitionType | None:
343
+ """检查技能卡自选删除"""
344
+ if image.find(R.InPurodyuusu.IconTitleSkillCardRemoval):
345
+ if handle_skill_card_removal():
346
+ return "PSkillCardRemoveSelect"
347
+ return None
348
+
349
+ @staticmethod
350
+ def _check_network_error(img: MatLike) -> AcquisitionType | None:
351
+ """检查网络中断弹窗"""
352
+ logger.debug("Check network error popup...")
353
+ if (image.find(R.Common.TextNetworkError)
354
+ and (btn_retry := image.find(R.Common.ButtonRetry))
355
+ ):
356
+ logger.info("Network error popup found")
357
+ device.click(btn_retry)
358
+ return "NetworkError"
359
+ return None
360
+
361
+ @staticmethod
362
+ def _check_award_select(img: MatLike) -> AcquisitionType | None:
363
+ """检查物品选择对话框"""
364
+ logger.debug("Check award select dialog...")
365
+ if image.find(R.InPurodyuusu.TextClaim):
366
+ logger.info("Award select dialog found.")
367
+
368
+ # P饮料选择
369
+ logger.debug("Check PDrink select...")
370
+ if image.find(R.InPurodyuusu.TextPDrink):
371
+ logger.info("PDrink select found")
372
+ acquire_p_drink()
373
+ return "PDrinkSelect"
374
+ # 技能卡选择
375
+ logger.debug("Check skill card select...")
376
+ if image.find(R.InPurodyuusu.TextSkillCard):
377
+ logger.info("Acquire skill card found")
378
+ acquire_skill_card()
379
+ return "PSkillCardSelect"
380
+ # P物品选择
381
+ logger.debug("Check PItem select...")
382
+ if image.find(R.InPurodyuusu.TextPItem):
383
+ logger.info("Acquire PItem found")
384
+ select_p_item()
385
+ return "PItemSelect"
386
+ return None
387
+
388
+ @staticmethod
389
+ def _check_date_change(img: MatLike) -> AcquisitionType | None:
390
+ """检查日期变更"""
391
+ result = acquisition_date_change_dialog()
392
+ if result is not None:
393
+ return result
394
+ return None
395
+
396
+ handlers = [
397
+ _check_loading,
398
+ _check_skip_commu,
399
+ _check_pdrink_max,
400
+ _check_pdrink_max_confirm,
401
+ _check_skill_card_enhance,
402
+ _check_skill_card_removal,
403
+ _check_network_error,
404
+ _check_award_select,
405
+ _check_date_change
406
+ ]
407
+
408
+ @classmethod
409
+ @action('处理培育事件', screenshot_mode='manual')
410
+ def check(cls) -> AcquisitionType | None:
411
+ """处理行动开始前和结束后可能需要处理的事件"""
412
+ img = device.screenshot()
413
+ logger.info("Acquisition stuffs...")
414
+
415
+ # 检查各个可能的中断事件
416
+ for handler in cls.handlers:
417
+ result = handler(img)
418
+ if result:
419
+ return result
420
+ skip()
421
+
422
+ return None
423
+
424
+ def resolve(self, end_condition: Callable[[], bool] | Image | None = None):
425
+ self.cd.reset().start()
426
+ result: Literal[False] | AcquisitionType | None = False
427
+ for l in Loop():
428
+ if end_condition is not None:
429
+ if callable(end_condition) and end_condition():
430
+ break
431
+ elif isinstance(end_condition, Image) and image.find(end_condition):
432
+ break
433
+ else:
434
+ if result is None:
435
+ break
436
+
437
+ if self.cd.expired():
438
+ raise UnrecoverableError("ProduceInterrupt.resolve timed out after 180 seconds")
439
+
440
+ img = l.screenshot
441
+ if img is None:
442
+ img = device.screenshot()
443
+ for handler in self.handlers:
444
+ result = handler(img)
445
+ if result:
446
+ break
447
+ skip()
448
+
449
+ def handle(self):
450
+ """处理中断事件,并检查是否超时。"""
451
+ if self.cd.expired():
452
+ raise UnrecoverableError('Unable to detect produce scene. Reseason: timed out.')
453
+ return self.check()
454
+
455
+ def until(self, end_img: Image):
456
+ """
457
+ 持续处理中断事件,直到指定图片出现为止。
458
+ """
459
+ return self.resolve(lambda: image.find(end_img) is not None)
363
460
 
364
461
  def until_acquisition_clear():
365
462
  """
@@ -369,7 +466,7 @@ def until_acquisition_clear():
369
466
  结束条件:任意
370
467
  """
371
468
  interval = Interval(0.6)
372
- while fast_acquisitions():
469
+ while ProduceInterrupt.check():
373
470
  interval.wait()
374
471
 
375
472
  ORANGE_RANGE = ((14, 87, 23)), ((37, 211, 255))
@@ -2,9 +2,10 @@ import logging
2
2
  from typing_extensions import assert_never
3
3
  from typing import Literal
4
4
 
5
- from kaa.config.schema import produce_solution
5
+ from kaa.config.schema import conf, produce_solution
6
6
  from kaa.game_ui.schedule import Schedule
7
7
  from kaa.tasks import R
8
+ from kaa.tasks.common import skip
8
9
  from ..actions import loading
9
10
  from kaa.game_ui import WhiteFilter, dialog
10
11
  from ..actions.scenes import at_home
@@ -14,7 +15,7 @@ from kotonebot.errors import UnrecoverableError
14
15
  from kotonebot.util import Countdown, cropped
15
16
  from kotonebot.backend.loop import Loop
16
17
  from kaa.config import ProduceAction, RecommendCardDetectionMode
17
- from ..produce.common import until_acquisition_clear, commu_event, fast_acquisitions
18
+ from ..produce.common import until_acquisition_clear, commu_event, ProduceInterrupt
18
19
  from kotonebot import ocr, device, contains, image, regex, action, sleep, wait
19
20
  from ..produce.non_lesson_actions import (
20
21
  enter_allowance, allowance_available,
@@ -141,9 +142,10 @@ def handle_recommended_action(final_week: bool = False) -> ProduceAction | None:
141
142
  return recommended
142
143
 
143
144
 
144
- @action('等待进入行动场景')
145
+ @action('等待进入行动场景', screenshot_mode='manual')
145
146
  def until_action_scene(week_first: bool = False):
146
147
  """等待进入行动场景"""
148
+ pi = ProduceInterrupt()
147
149
  for _ in Loop(interval=0.2):
148
150
  if not image.find_multi([
149
151
  R.InPurodyuusu.TextPDiary, # 普通周
@@ -158,13 +160,13 @@ def until_action_scene(week_first: bool = False):
158
160
  # [screenshots/produce/in_produce/initial_commu_event.png]
159
161
  if week_first and commu_event():
160
162
  continue
161
- if fast_acquisitions():
163
+ if pi.handle():
162
164
  continue
163
165
  else:
164
166
  logger.info("Now at action scene.")
165
167
  return
166
168
 
167
- @action('等待进入练习场景')
169
+ @action('等待进入练习场景', screenshot_mode='manual')
168
170
  def until_practice_scene():
169
171
  """等待进入练习场景"""
170
172
  for _ in Loop():
@@ -173,7 +175,7 @@ def until_practice_scene():
173
175
  else:
174
176
  break
175
177
 
176
- @action('等待进入考试场景')
178
+ @action('等待进入考试场景', screenshot_mode='manual')
177
179
  def until_exam_scene():
178
180
  """等待进入考试场景"""
179
181
  # NOTE: is_exam_scene() 通过 OCR 剩余回合数判断是否处于考试场景。
@@ -342,7 +344,7 @@ def produce_end(has_live: bool = True):
342
344
  elif image.find(R.Produce.TextSkipLiveDialogTitle):
343
345
  logger.info("Confirming skip live.")
344
346
  device.click(image.expect_wait(R.Common.IconButtonCheck))
345
- device.click(10, 10)
347
+ skip()
346
348
  else:
347
349
  break
348
350
  # 选择封面
@@ -385,7 +387,7 @@ def produce_end(has_live: bool = True):
385
387
  break
386
388
  else:
387
389
  device.click_center()
388
- device.click(10, 10) # 为了兼容has_live==False的情况
390
+ skip() # 为了兼容has_live==False的情况
389
391
  sleep(2)
390
392
  # 后续动画
391
393
  logger.info("Waiting for memory generation animation completed...")
@@ -534,7 +536,7 @@ def handle_action(action: ProduceAction, final_week: bool = False) -> ProduceAct
534
536
  logger.warning("Unknown action: %s", action)
535
537
  return None
536
538
 
537
- def week_normal(week_first: bool = False):
539
+ def week_normal(week_first: bool = False) -> bool:
538
540
  until_action_scene(week_first)
539
541
  logger.info("Handling actions...")
540
542
  action: ProduceAction | None = None
@@ -570,7 +572,9 @@ def week_normal(week_first: bool = False):
570
572
  assert_never(action)
571
573
  until_action_scene()
572
574
 
573
- def week_final_lesson():
575
+ return True # 继续执行下一周
576
+
577
+ def week_final_lesson() -> bool:
574
578
  until_action_scene()
575
579
  action: ProduceAction | None = None
576
580
  actions = produce_solution().data.actions_order
@@ -597,6 +601,8 @@ def week_final_lesson():
597
601
  raise ValueError("Action is None.")
598
602
  case _:
599
603
  assert_never(action)
604
+
605
+ return True # 继续执行下一周
600
606
 
601
607
  def week_mid_and_final_exam_common():
602
608
  logger.info("Wait for exam scene...")
@@ -607,23 +613,27 @@ def week_mid_and_final_exam_common():
607
613
  sleep(0.5)
608
614
  loading.wait_loading_end()
609
615
 
610
- def week_mid_exam():
616
+ def week_mid_exam() -> bool:
611
617
  logger.info("Week mid exam started.")
612
618
 
613
619
  week_mid_and_final_exam_common()
614
620
 
615
621
  if exam('mid'):
616
622
  until_action_scene() # 考试通过
623
+ return True
617
624
  else:
618
625
  produce_end(has_live=False) # 考试不合格
626
+ return False
619
627
 
620
- def week_final_exam():
628
+ def week_final_exam() -> bool:
621
629
  logger.info("Week final exam started.")
622
630
 
623
631
  week_mid_and_final_exam_common()
624
632
 
625
633
  exam('final')
634
+
626
635
  produce_end()
636
+ return False
627
637
 
628
638
  @action('执行 Regular 培育', screenshot_mode='manual-inherit')
629
639
  def hajime_regular(week: int = -1, start_from: int = 1):
@@ -656,7 +666,9 @@ def hajime_regular(week: int = -1, start_from: int = 1):
656
666
  else:
657
667
  for i, w in enumerate(weeks[start_from-1:]):
658
668
  logger.info("Week %d started.", i + start_from)
659
- w()
669
+ if not w():
670
+ logger.info("Exit produce after week %d.", i + start_from)
671
+ break
660
672
 
661
673
  @action('执行 PRO 培育', screenshot_mode='manual-inherit')
662
674
  def hajime_pro(week: int = -1, start_from: int = 1):
@@ -690,7 +702,9 @@ def hajime_pro(week: int = -1, start_from: int = 1):
690
702
  else:
691
703
  for i, w in enumerate(weeks[start_from-1:]):
692
704
  logger.info("Week %d started.", i + start_from)
693
- w()
705
+ if not w():
706
+ logger.info("Exit produce after week %d.", i + start_from)
707
+ break
694
708
 
695
709
  @action("执行 MASTER 培育", screenshot_mode='manual-inherit')
696
710
  def hajime_master(week: int = -1, start_from: int = 1):
@@ -726,7 +740,9 @@ def hajime_master(week: int = -1, start_from: int = 1):
726
740
  else:
727
741
  for i, w in enumerate(weeks[start_from-1:]):
728
742
  logger.info("Week %d started.", i + start_from)
729
- w()
743
+ if not w():
744
+ logger.info("Exit produce after week %d.", i + start_from)
745
+ break
730
746
 
731
747
  @action('是否在考试场景')
732
748
  def is_exam_scene():
@@ -750,8 +766,10 @@ def detect_produce_scene() -> ProduceStage:
750
766
  结束状态:游戏主页面\n
751
767
  """
752
768
  logger.info("Detecting current produce stage...")
753
-
769
+ cd = Countdown(conf().produce.interrupt_timeout).start()
754
770
  for _ in Loop():
771
+ if cd.expired():
772
+ raise UnrecoverableError('Unable to detect produce scene. Reseason: timed out.')
755
773
  # 行动场景
756
774
  texts = ocr.ocr()
757
775
  if (
@@ -769,7 +787,7 @@ def detect_produce_scene() -> ProduceStage:
769
787
  logger.info("Detection result: At exam scene.")
770
788
  return 'exam-ongoing'
771
789
  else:
772
- if fast_acquisitions():
790
+ if ProduceInterrupt.check():
773
791
  # 继续循环检测
774
792
  pass
775
793
  elif commu_event():