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
@@ -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 fast_acquisitions
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
- for _ in Loop():
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
- for _ in Loop():
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
- for _ in Loop():
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 fast_acquisitions() is not None:
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
- for _ in Loop():
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
- for _ in Loop():
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 fast_acquisitions():
284
+ elif pi.handle():
308
285
  pass
309
286
  # [screenshots\produce\outing_ap_confirm.png]
310
287
  elif image.find(R.Common.ButtonSelect2):
@@ -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
- device.click(image.expect_wait(R.InPurodyuusu.ButtonDontClaim))
32
+ if image.find(R.InPurodyuusu.ButtonDontClaim):
33
+ device.click()
30
34
  else:
31
35
  # 点击饮料
32
36
  device.click(POSTIONS[0])
@@ -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.errors import ElevationRequiredError, GameUpdateNeededError
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
- device.click(10, 10)
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
- logger.info('Starting game...')
176
- os.startfile('dmmgameplayer://play/GCL/gakumas/cl/win')
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.9.post2
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==4.10.0.84
9
- Requires-Dist: rapidocr_onnxruntime==1.4.3
10
- Requires-Dist: av==14.0.1
11
- Requires-Dist: scikit-image==0.25.0
12
- Requires-Dist: thefuzz==0.22.1
13
- Requires-Dist: adbutils==2.8.0
14
- Requires-Dist: uiautomator2==3.2.8
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.1
20
- Requires-Dist: gradio==5.21.0
21
- Requires-Dist: pydantic==2.10.4
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==4.12.2
24
- Requires-Dist: python-dotenv==1.0.1
25
- Requires-Dist: onnxruntime==1.14.0
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==1.8.3
29
- Requires-Dist: win11toast==0.35
30
- Requires-Dist: keyboard==0.13.5
31
- Requires-Dist: kotonebot[android,windows]==0.3.1
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):用于提取游戏图像资源,以 GPLv3 协议开源。
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)MuMu 与雷电模拟器的截图与控制接口定义。
203
- * [blue_archive_auto_script](https://github.com/pur1fying/blue_archive_auto_script)MuMu 与雷电模拟器的截图与控制接口的 Python 实现,以及各模拟器的控制实现。
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 直接启动游戏本体的方式。