ksaa 2025.11b1__py3-none-any.whl → 2025.11b3__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 (323) hide show
  1. kaa/application/core/feedback_service.py +121 -0
  2. kaa/application/core/misc_core.py +4 -1
  3. kaa/application/core/update_service.py +208 -0
  4. kaa/config/schema.py +6 -0
  5. kaa/errors.py +60 -0
  6. kaa/main/gr.py +106 -516
  7. kaa/main/kaa.py +11 -3
  8. kaa/metadata.py +10 -0
  9. kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  10. kaa/resources/game.db +0 -0
  11. kaa/resources/game_ver.txt +0 -0
  12. kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
  13. kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
  14. kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
  15. kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
  16. kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
  17. kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
  18. kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
  19. kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
  20. kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
  21. kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
  22. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
  23. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
  24. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
  25. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
  26. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
  27. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
  28. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
  29. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
  30. kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
  31. kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
  32. kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
  33. kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
  34. kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
  35. kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
  36. kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
  37. kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
  38. kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
  39. kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
  40. kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
  41. kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
  42. kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
  43. kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
  44. kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
  45. kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
  46. kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
  47. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
  48. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
  49. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
  50. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
  51. kaa/sprites/19513e9f-2cbb-4f66-84b7-2ad2faed252d.png +0 -0
  52. kaa/sprites/1ef5fa52-b6e1-42d0-947a-ce970eba057d.png +0 -0
  53. kaa/sprites/318abb8a-5950-4d22-ac42-77219b5bc1a0.png +0 -0
  54. kaa/sprites/321b7040-87d7-4f87-9b44-ad2972584a11.png +0 -0
  55. kaa/sprites/3ae72684-1d40-43cf-9508-511c010de64f.png +0 -0
  56. kaa/sprites/3e669188-5933-4502-b039-38f4d4649664.png +0 -0
  57. kaa/sprites/4370013d-f052-4314-94ff-a342d70754c3.png +0 -0
  58. kaa/sprites/4fb1d36c-5fb6-4fe5-9ba3-07e056eb1dfc.png +0 -0
  59. kaa/sprites/5247b052-5b45-4e64-b7fc-d566f5d4bc82.png +0 -0
  60. kaa/sprites/545a9032-a676-4d9d-ac74-2b2c9b330d1a.png +0 -0
  61. kaa/sprites/57741798-65dd-47eb-b4b1-b3f0e3c3e318.png +0 -0
  62. kaa/sprites/5e2b4bb9-f200-4723-96ac-5f907e28eaaa.png +0 -0
  63. kaa/sprites/5f6fafd9-43aa-443e-994e-f2688af5e238.png +0 -0
  64. kaa/sprites/61229c71-303b-4dc9-ba4e-6a14e5ab161e.png +0 -0
  65. kaa/sprites/62f93327-5946-4a48-aff8-a203483b0562.png +0 -0
  66. kaa/sprites/64dfeb35-61ad-4e9b-9847-a18530f02584.png +0 -0
  67. kaa/sprites/64f8ef99-4766-471b-aeb0-b109704d9615.png +0 -0
  68. kaa/sprites/677933e9-1481-4f01-95b4-d55bea51db8c.png +0 -0
  69. kaa/sprites/67edcd91-d2c1-418b-987a-e60263626f56.png +0 -0
  70. kaa/sprites/6c032aa7-20e3-4e2e-b1a4-1585141ba22b.png +0 -0
  71. kaa/sprites/6fadb00b-e32e-4c45-a738-f21b8f48c139.png +0 -0
  72. kaa/sprites/719297ec-82be-4820-8ecf-8bf6322b81fe.png +0 -0
  73. kaa/sprites/76970b91-7864-4413-bfc7-79c04a48dce7.png +0 -0
  74. kaa/sprites/7c62081d-097a-4514-a69d-69e96201e816.png +0 -0
  75. kaa/sprites/7e16af89-bb51-4889-8a7e-25715ff5faa1.png +0 -0
  76. kaa/sprites/7efce7bc-12a5-4a53-9a0a-9fa755649ebd.png +0 -0
  77. kaa/sprites/803fb770-6982-4460-8fe0-f9ccd67367c2.png +0 -0
  78. kaa/sprites/82200c8c-0916-4601-839a-945f96cc4ebc.png +0 -0
  79. kaa/sprites/8299e3e2-cfd5-4380-adce-a46c93b1be4d.png +0 -0
  80. kaa/sprites/83c27159-36d2-4ccf-ace7-e5d2169e7e52.png +0 -0
  81. kaa/sprites/8661bc83-9b0a-4555-8b21-2258b31c7f57.png +0 -0
  82. kaa/sprites/89437aca-7339-4795-b848-ec529b1e5e8d.png +0 -0
  83. kaa/sprites/8a0260f5-b32e-430e-bc98-7b5a77cab6ab.png +0 -0
  84. kaa/sprites/8c3bc157-022a-4bb1-be74-af1ad254e67f.png +0 -0
  85. kaa/sprites/8d09178a-251e-4f74-b023-12233417621b.png +0 -0
  86. kaa/sprites/8fbee6fe-9409-407e-8f55-d2d36ab37f6a.png +0 -0
  87. kaa/sprites/8fdc102b-d8f3-4d16-b8ef-1d804f5aff07.png +0 -0
  88. kaa/sprites/93e91dd0-0050-48b4-8bf8-c732cd76f0e3.png +0 -0
  89. kaa/sprites/993a33ac-994b-4eb0-9c1e-b9412d499d67.png +0 -0
  90. kaa/sprites/99a27ff1-bc1c-48a2-9f9b-0803338d1bd8.png +0 -0
  91. kaa/sprites/9a9a1f40-d308-4aa5-8d91-60342bc6a4e0.png +0 -0
  92. kaa/sprites/9f573ac2-9d28-4d92-8e3f-1b78031220dd.png +0 -0
  93. kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
  94. kaa/sprites/a2545c5c-b5cc-4fd2-93c1-04c74c17ee16.png +0 -0
  95. kaa/sprites/a2dd125b-9868-4e01-9a46-3b552c2ebdc9.png +0 -0
  96. kaa/sprites/a7f25aeb-d91b-47e0-ba1a-0c6382380102.png +0 -0
  97. kaa/sprites/a888e87e-49fe-405d-b074-3dda30304808.png +0 -0
  98. kaa/sprites/a9ba2741-38da-4448-ab80-f0e5b3c3847f.png +0 -0
  99. kaa/sprites/a9c5aeb0-c0c9-47da-8793-ffe8d172bea0.png +0 -0
  100. kaa/sprites/aba47934-f264-49f9-a72c-6ed90b112701.png +0 -0
  101. kaa/sprites/abe2757f-84f3-4967-bd05-79c17cb1f32c.png +0 -0
  102. kaa/sprites/acd741da-d4ab-4b76-a6a3-4a2fd25870ef.png +0 -0
  103. kaa/sprites/ad17ae00-f6ce-4f32-9386-9a8073b5e79a.png +0 -0
  104. kaa/sprites/ae73d26b-2d47-4921-a6ec-5bbea32773a3.png +0 -0
  105. kaa/sprites/b10281ae-cfaf-4400-b2fb-c8c2b432c8e7.png +0 -0
  106. kaa/sprites/b40bebbf-2800-40fb-b7a2-1c2d5995e747.png +0 -0
  107. kaa/sprites/b76add75-2187-428c-9ede-fb43086bacb6.png +0 -0
  108. kaa/sprites/b77a7e97-dc59-493d-9d76-4ea9c2876978.png +0 -0
  109. kaa/sprites/b9770cd2-b55f-44dc-965f-f29686fba7da.png +0 -0
  110. kaa/sprites/ba8ee2cd-f662-440c-90b3-1e4bfe7bab6b.png +0 -0
  111. kaa/sprites/bb3990c8-4618-4d96-9365-a4d1213b59f7.png +0 -0
  112. kaa/sprites/bbe59f62-c3e7-404c-a313-b50db70de7b5.png +0 -0
  113. kaa/sprites/bdb1460e-c5db-494a-a58a-688f72b6bdba.png +0 -0
  114. kaa/sprites/bdb72f31-5808-4451-827f-fffc3b616083.png +0 -0
  115. kaa/sprites/bf3ff37e-d4fc-42ee-87d6-db1e2040aed5.png +0 -0
  116. kaa/sprites/bff753bb-b02e-441b-89e5-14845f18c6f6.png +0 -0
  117. kaa/sprites/c035ac76-39e9-466b-a606-28bc52bc73e8.png +0 -0
  118. kaa/sprites/c05a600a-d79e-432d-a49f-5b2443d67bd4.png +0 -0
  119. kaa/sprites/c0801be3-f07a-4afc-ab0d-7f5d3c4afbd3.png +0 -0
  120. kaa/sprites/c2100faf-1234-49db-b6d4-5a08a4b08272.png +0 -0
  121. kaa/sprites/c6b0f9ba-a976-474b-b22d-6fe4391d9373.png +0 -0
  122. kaa/sprites/c78fb143-18e3-4697-a0c1-6151514f2a7c.png +0 -0
  123. kaa/sprites/c8c17304-e949-4dfc-b07d-9e7133483e31.png +0 -0
  124. kaa/sprites/c91874f4-363f-4997-a38e-3e486dfd8043.png +0 -0
  125. kaa/sprites/c9245201-4d29-4088-a5e0-f4e93d4494b5.png +0 -0
  126. kaa/sprites/cb0bbf0f-a25b-4ec4-99bd-f5742270a062.png +0 -0
  127. kaa/sprites/ccfab3e2-7b6d-4ae3-998b-4e5c1863884a.png +0 -0
  128. kaa/sprites/cdf310f0-b917-4f92-95a9-893af76e3c3a.png +0 -0
  129. kaa/sprites/cea8f98d-ba68-498f-bd3d-cc10f0d4575b.png +0 -0
  130. kaa/sprites/cec36685-85a7-4e84-bbbc-4df70b4f7bac.png +0 -0
  131. kaa/sprites/cf49878d-a1c5-4b9f-9502-1e0d9eaadc49.png +0 -0
  132. kaa/sprites/d23a600a-7002-4268-96a4-18dc54928ec6.png +0 -0
  133. kaa/sprites/d57f792a-f086-4fbe-b4d9-5db629a78d42.png +0 -0
  134. kaa/sprites/d6dd92b3-310f-4f5d-a8ef-b941c3659c0c.png +0 -0
  135. kaa/sprites/d8967770-c64a-4609-a0a5-f46ba81edceb.png +0 -0
  136. kaa/sprites/d91483a2-83fa-4664-8eda-52498c0e77bc.png +0 -0
  137. kaa/sprites/d9a636be-a017-4ef5-a70c-c374827008a0.png +0 -0
  138. kaa/sprites/dae37bd7-6a34-4eb4-8cd0-3c0c03b4575a.png +0 -0
  139. kaa/sprites/dc51eccf-9470-495a-9e38-59d4481adbd4.png +0 -0
  140. kaa/sprites/dcea5aae-322e-4cd4-b218-0eac48690755.png +0 -0
  141. kaa/sprites/dcf465c6-ad64-48e7-9c3c-7bc7cfc13a44.png +0 -0
  142. kaa/sprites/ddb59f04-91a0-4fbd-8921-be13acdab291.png +0 -0
  143. kaa/sprites/de81f919-4d01-4a4e-bdc1-ffe6e23a5c22.png +0 -0
  144. kaa/sprites/e05f2c16-926f-48be-bdd0-16182e879394.png +0 -0
  145. kaa/sprites/e2a0c1a6-c0cf-400e-99be-1ed0d35c6ed8.png +0 -0
  146. kaa/sprites/e30922ed-a02f-4ede-9968-1656be5a05b2.png +0 -0
  147. kaa/sprites/e388db01-0870-412d-b8bc-5a512ec997c8.png +0 -0
  148. kaa/sprites/e392856d-ac59-4414-8fb8-df93a1a99be4.png +0 -0
  149. kaa/sprites/e57db8c2-c050-43fb-8205-339aeb5875e8.png +0 -0
  150. kaa/sprites/e687c2ba-2c30-4fc8-804f-fea5815f6765.png +0 -0
  151. kaa/sprites/e6e66204-8a2f-4377-8674-b7d663ff0081.png +0 -0
  152. kaa/sprites/e79a2a08-3b58-4ab0-8c2b-769f30cc8591.png +0 -0
  153. kaa/sprites/ebe22aea-0318-49d8-ab07-ce2eef34265f.png +0 -0
  154. kaa/sprites/ed6df33a-c7aa-4542-a87b-9cc9cae0465c.png +0 -0
  155. kaa/sprites/ed854df1-878c-4e0b-8138-9b28d314ede6.png +0 -0
  156. kaa/sprites/ed98a341-5dff-4af7-a194-d28232d481a4.png +0 -0
  157. kaa/sprites/f0ed1dd3-b227-48c1-8c8c-858dbd84fcc7.png +0 -0
  158. kaa/sprites/f1eb4089-8cd1-4830-b00e-40535ddcd116.png +0 -0
  159. kaa/sprites/f237d88e-92ac-4ebf-85e1-80a696b5203a.png +0 -0
  160. kaa/sprites/f2f818c9-b0cf-436d-9d3e-6544c5399063.png +0 -0
  161. kaa/sprites/f333118a-81c2-417f-b54f-64dc4e8df613.png +0 -0
  162. kaa/sprites/f34e8026-bdfc-47e6-a0ed-49e587ef0f40.png +0 -0
  163. kaa/sprites/f3a5992b-dabf-4c2b-83e9-4c91c3b7aac8.png +0 -0
  164. kaa/sprites/f4195ceb-586a-4a8c-9424-4962239d2120.png +0 -0
  165. kaa/sprites/f485db66-2159-4d31-ba53-0fbb726e7f64.png +0 -0
  166. kaa/sprites/f7264cee-fea6-47b5-9f9b-8f3f31c03ea0.png +0 -0
  167. kaa/sprites/f7e34403-a53c-4d3f-935b-25b4acb7f7a5.png +0 -0
  168. kaa/sprites/f8d8c943-1b36-4391-a7fc-2a49f8966d53.png +0 -0
  169. kaa/sprites/f9157db8-d70b-4d46-9800-5a833ce7eda8.png +0 -0
  170. kaa/sprites/f9a353b2-958d-4aae-ade4-66bdc6481e35.png +0 -0
  171. kaa/sprites/fa5b5b92-9c60-4811-a44c-8e897c9632c3.png +0 -0
  172. kaa/sprites/fac7b90a-1174-477b-803b-28798647c307.png +0 -0
  173. kaa/sprites/fbbb73f9-880e-4c7f-9ec9-276bdab4b394.png +0 -0
  174. kaa/sprites/fce4a481-e71c-4dab-aeac-59ff8b18201b.png +0 -0
  175. kaa/sprites/fd8a7a5d-f021-4bfd-83f7-a2dd33325837.png +0 -0
  176. kaa/sprites/fda4b3eb-e31a-448b-8cb3-9126e1ab7deb.png +0 -0
  177. kaa/sprites/fda78372-04b4-4d55-92b1-aedec20d0913.png +0 -0
  178. kaa/sprites/fe993a91-1a49-488e-b7ff-c1b05b8f2b5f.png +0 -0
  179. kaa/sprites/ff8efb8f-e1a4-4202-a6e1-680eb44f58da.png +0 -0
  180. kaa/tasks/R.py +128 -128
  181. kaa/tasks/common.py +5 -0
  182. kaa/tasks/daily/contest.py +2 -1
  183. kaa/tasks/produce/cards.py +5 -4
  184. kaa/tasks/produce/common.py +201 -105
  185. kaa/tasks/produce/in_purodyuusu.py +14 -10
  186. kaa/tasks/produce/non_lesson_actions.py +10 -33
  187. kaa/tasks/produce/p_drink.py +5 -1
  188. kaa/tasks/produce/produce.py +2 -1
  189. kaa/tasks/start_game.py +2 -1
  190. {ksaa-2025.11b1.dist-info → ksaa-2025.11b3.dist-info}/METADATA +9 -6
  191. {ksaa-2025.11b1.dist-info → ksaa-2025.11b3.dist-info}/RECORD +323 -177
  192. /kaa/sprites/{fdf0da06-f088-424f-9941-8c883fea3db3.png → 03d0acec-15fd-4c21-82ce-122764def185.png} +0 -0
  193. /kaa/sprites/{68d9f340-a3d2-4708-8eb1-c1ed857decda.png → 03d22cb3-0193-4dcb-8a0d-98b7ca9c2b4c.png} +0 -0
  194. /kaa/sprites/{dce410ee-fa56-41c4-b75e-e1bff79cd94f.png → 0455e229-75c9-44ba-8729-745799746979.png} +0 -0
  195. /kaa/sprites/{ad94041c-f30b-40b9-b11a-1a26e9962274.png → 049ecbf6-d434-46fa-a42c-a447475269bb.png} +0 -0
  196. /kaa/sprites/{f6b042a8-a91e-4811-99f9-18bbb5197468.png → 04ea8503-cdd5-4b3e-a33b-63893b92f6ba.png} +0 -0
  197. /kaa/sprites/{847226a3-b7d2-4156-b732-9215a3e14f3a.png → 05251a85-2883-4098-842e-6544391de919.png} +0 -0
  198. /kaa/sprites/{9008fbb2-f23f-424f-9be7-5bae6a3697ab.png → 054db45e-1434-4604-91ec-7ac586ca11b5.png} +0 -0
  199. /kaa/sprites/{ae1e70bc-f735-4749-8c23-95735b91897a.png → 06cf74aa-635f-48ab-b965-36981f2063d3.png} +0 -0
  200. /kaa/sprites/{3b4f90c9-6de7-4ac3-8e41-5f8757bf3f3e.png → 0814c0fd-6f89-47d3-8089-e8cfde569750.png} +0 -0
  201. /kaa/sprites/{2cec1d6a-9e8c-49b3-b885-0b0d7c4b95ee.png → 08bde3ff-7554-4bdb-a7f0-193323489d5b.png} +0 -0
  202. /kaa/sprites/{91b30f5e-31b2-4756-a3f7-f0f82a335442.png → 09222fb0-78a6-4663-8c1f-1d44e881513d.png} +0 -0
  203. /kaa/sprites/{5431dc38-c257-40b3-8f7b-8bceaa7fe587.png → 0b436edb-8f6a-429d-87b7-5d4250f651ac.png} +0 -0
  204. /kaa/sprites/{338d7e71-98ce-4cd1-9954-bf7155150780.png → 0c266b0e-de7a-49c1-9709-b01fb5086f75.png} +0 -0
  205. /kaa/sprites/{8e019262-ad23-4cbb-84da-86b34775a91e.png → 0db579bf-d555-4468-8104-c2d2e68d33b1.png} +0 -0
  206. /kaa/sprites/{8be81341-a74d-42c8-8231-5d1854bc08e7.png → 114730f6-eddd-4381-b723-aee18cde0d90.png} +0 -0
  207. /kaa/sprites/{31f2de0a-567b-425a-9be6-536e4532d813.png → 11870372-dc78-4a80-8320-15bb24da6f25.png} +0 -0
  208. /kaa/sprites/{3fa5f81c-9223-44ba-bf07-71932350e845.png → 11bc7d35-e58d-4301-a0b0-f557dbd73c7b.png} +0 -0
  209. /kaa/sprites/{92c3de1b-eed1-45b9-82e0-c9e97bb479e7.png → 12455dbd-7d70-4435-a3ba-f40654e75c37.png} +0 -0
  210. /kaa/sprites/{aa1624ff-88b0-447b-8e2b-8a50fd9e4062.png → 12f330a6-4eab-4015-b0e3-4e1a35a7b676.png} +0 -0
  211. /kaa/sprites/{9991b19c-7330-42c4-9d7d-db3cb00103b7.png → 14a697d4-0b58-4644-bb2d-8823d2fefcb8.png} +0 -0
  212. /kaa/sprites/{49bde219-f9a3-41b5-84b8-e417160a0f40.png → 15605f7a-2206-436c-8a71-011d9f95cf4e.png} +0 -0
  213. /kaa/sprites/{ea430652-e263-4a15-bb6f-8a8807be6c8f.png → 15dd89cc-53ed-4c77-a355-62e3bd7a15dd.png} +0 -0
  214. /kaa/sprites/{5c310fe5-7e92-4167-9eba-6e8e14a2863a.png → 18b13508-c46f-4134-b991-975c0a1b9a74.png} +0 -0
  215. /kaa/sprites/{cd00a2d7-af48-48b1-b2e1-5360ceed249f.png → 1a5c147b-e28e-42ad-893a-7430d8f4fc35.png} +0 -0
  216. /kaa/sprites/{94d54ba7-0ccf-4fd9-a5bf-488bac1364c8.png → 1b3c84c5-16d1-43a7-8513-719bd7a10450.png} +0 -0
  217. /kaa/sprites/{2289d38f-dc98-4310-9f34-4cf5023f8545.png → 1b847790-90e2-44f8-b6d9-4814812006bd.png} +0 -0
  218. /kaa/sprites/{6c926e92-9af9-402d-8512-6417ca116928.png → 1e57ab88-9962-4024-81df-746529a758f9.png} +0 -0
  219. /kaa/sprites/{30e12bf1-8fa5-4de1-8d7b-28fa0fec0cb6.png → 205e03de-46d9-4983-a2ea-a7f7500d508f.png} +0 -0
  220. /kaa/sprites/{e4dc3b35-195c-415f-9484-c2459bd8675a.png → 20bd834e-c99c-4e80-92db-0740e5bbe746.png} +0 -0
  221. /kaa/sprites/{68e20ebf-02fd-46a1-88d7-b4472824e7bc.png → 218a6ab3-93f6-4bb1-9848-8c97ff695945.png} +0 -0
  222. /kaa/sprites/{ec3cad5f-e0c9-4577-8499-79b50248344e.png → 22071c63-a1bc-4163-8d5a-973b3d579c76.png} +0 -0
  223. /kaa/sprites/{e933cd55-e47a-4327-89d7-b25995cb4a3f.png → 2460d0c9-50e2-451b-b609-ad466b574395.png} +0 -0
  224. /kaa/sprites/{0af1d573-1dc7-427e-997d-173308ea3649.png → 264d021a-b322-4472-8a7b-5f1322aba993.png} +0 -0
  225. /kaa/sprites/{57c81080-7b53-4286-8fa5-848ad63e4774.png → 28335ba3-9a0f-46cd-b66d-047781773264.png} +0 -0
  226. /kaa/sprites/{d7750f81-de10-4d6f-9cc7-35223bda9d70.png → 28df544b-72f2-4ed8-8bf3-609ff99633d9.png} +0 -0
  227. /kaa/sprites/{81686816-c723-47d1-9824-a68d9ebe1bd4.png → 2a82e2d6-0722-433a-87fa-f1752ce0b9b7.png} +0 -0
  228. /kaa/sprites/{5ffd3f29-db4f-4f66-b9ed-be5a70b7ebf9.png → 2abce6a4-111f-42bb-9255-f98d544108de.png} +0 -0
  229. /kaa/sprites/{23b9cda9-8be8-438e-8e54-57d91a4bd875.png → 2d8e6464-aceb-41fd-9e78-7523738d5720.png} +0 -0
  230. /kaa/sprites/{1ad89ee4-1bb1-41d2-a92c-79caf6baa38a.png → 2f9e2dbb-66a1-4b13-9b9e-d62e10efa6d3.png} +0 -0
  231. /kaa/sprites/{c69dcdcf-42a7-420e-aa8e-bb8639ea80b6.png → 307b58f0-20c1-41bd-9eaa-1337fd0e6563.png} +0 -0
  232. /kaa/sprites/{55c3af20-58dc-4407-a383-312a57417c39.png → 3192a62f-224d-44b1-a0b9-b1fc22de8ec1.png} +0 -0
  233. /kaa/sprites/{645909d7-b960-46c7-b208-db44b6b7feec.png → 31b4c370-696f-4dfc-a918-839495520266.png} +0 -0
  234. /kaa/sprites/{7daaca55-e3fd-4e12-bf31-872105ceb726.png → 330c2207-af32-453b-8db7-889cda83e7cc.png} +0 -0
  235. /kaa/sprites/{5734e48a-1e58-42de-be7b-b7db67db4a01.png → 38186efc-850c-4d83-97bc-9417f1494b94.png} +0 -0
  236. /kaa/sprites/{8ed51be4-815c-4a3d-805e-030fdfa341e2.png → 38426696-ff13-4f20-9f74-b05855990153.png} +0 -0
  237. /kaa/sprites/{cfe3563d-a24b-4197-a0cb-5628bd990c08.png → 3a211792-1243-496a-b41e-0e3fd121cd5b.png} +0 -0
  238. /kaa/sprites/{179c0fff-ebd2-4a16-8db2-297552cca218.png → 3a4e2d8a-deca-4980-b6c2-37bfc17d2720.png} +0 -0
  239. /kaa/sprites/{2d0e9d49-365a-4bcb-a416-38b87defaa3c.png → 3a4ec054-2c48-4359-afb9-fa5ea8191d16.png} +0 -0
  240. /kaa/sprites/{51b95c81-4ff9-434c-ade2-3518e63337cb.png → 3c490171-6810-44f0-b28d-c6b664347a3c.png} +0 -0
  241. /kaa/sprites/{35341839-4469-4ab6-aa40-33642fe43e82.png → 3cda578a-fa75-4bbd-9cff-be4bc4355a58.png} +0 -0
  242. /kaa/sprites/{72634cb3-4c76-4ca2-8898-ebb837ec19e3.png → 3ea03db7-4de9-45c4-a07b-a9bbc2c63e70.png} +0 -0
  243. /kaa/sprites/{da48db0d-09d9-47c3-9e08-8b69ad547be6.png → 3ea8e354-2684-46f3-9f5a-43f094717c95.png} +0 -0
  244. /kaa/sprites/{3e087b8d-420d-48ff-b526-29c4a65d8cbe.png → 3eb9b21b-abbe-49fd-a3a9-6e1c1a6e91d9.png} +0 -0
  245. /kaa/sprites/{2234f709-1703-4589-905c-175f4db09b1b.png → 3fb84a71-ed15-4989-9598-34e7342f38f5.png} +0 -0
  246. /kaa/sprites/{39f6d657-3b3e-40aa-849b-7ad87a0be1d0.png → 3ffd2992-fa55-499c-8c3b-193518ebbe07.png} +0 -0
  247. /kaa/sprites/{464b1dd8-ca2e-41e9-a5b5-90545c584db7.png → 41ff9641-d200-4caa-bcfa-d8389a3438eb.png} +0 -0
  248. /kaa/sprites/{70768479-5d7a-4941-8774-ad556c47bee2.png → 455dcf19-63f5-4b0a-99e6-b23d3876d199.png} +0 -0
  249. /kaa/sprites/{694879e8-ecca-45e2-8ea4-1b447fd43ace.png → 45f09e08-53ea-4e08-97dc-70f689bab002.png} +0 -0
  250. /kaa/sprites/{dd873ac0-ffba-4335-9cf2-2162c6835ed8.png → 4729b509-0f4a-4e96-b186-ec56c680c9e6.png} +0 -0
  251. /kaa/sprites/{7d7df15f-707e-4e27-826f-21e42af1dae0.png → 4eb665ef-7741-40f9-8174-7b6ca66d045b.png} +0 -0
  252. /kaa/sprites/{8e5e968b-edad-4c03-abc8-3f2a7e8879ae.png → 4f370ff6-61d1-405a-b29e-e6d0b3072194.png} +0 -0
  253. /kaa/sprites/{f0462447-5226-4819-a39b-19ab90583f83.png → 504e4927-bfeb-43ee-aa5c-35cec664a4c8.png} +0 -0
  254. /kaa/sprites/{756f4ca7-acac-48e1-8bcd-1c5cd8937e3a.png → 51eb4be2-22fa-4683-82c7-513f5934f7b9.png} +0 -0
  255. /kaa/sprites/{87f3c1ae-5117-4871-a7d6-3f5ff0c9f9fb.png → 568608bd-a1fa-4faf-ae15-179563a7e84f.png} +0 -0
  256. /kaa/sprites/{978873bb-e4d0-451b-9126-6977144f5395.png → 56ac84af-4c85-4b69-b449-98981c1df292.png} +0 -0
  257. /kaa/sprites/{db6707a2-2964-4919-9992-4d801fa43dae.png → 5a49b6d2-2bcb-49bc-a28f-b8bd1441f60a.png} +0 -0
  258. /kaa/sprites/{01256311-237c-476f-96ce-4136dc4bfbd3.png → 5a677634-99cf-45b5-bc0c-94120872a518.png} +0 -0
  259. /kaa/sprites/{8e4d8a0f-4a9d-4562-9234-63806b11d85f.png → 5ec51718-1403-4a79-bd85-46e1fe04d8c9.png} +0 -0
  260. /kaa/sprites/{dc97fea3-898f-4135-9c40-ad41570ab4ae.png → 5f2d0b2b-8425-4dd8-8b85-d62f4b75286c.png} +0 -0
  261. /kaa/sprites/{f32a41a2-c482-41ba-b718-28f048f5148c.png → 5f4abae0-a1f0-4c8c-9d93-a8525caa9dd0.png} +0 -0
  262. /kaa/sprites/{31e3ac2b-ecd4-4c37-88bc-985ef32e73a3.png → 6005bf30-fd7c-401e-8efd-050fa97ad7f3.png} +0 -0
  263. /kaa/sprites/{3b4dc708-1d34-4a88-9fe3-d8de2ec1d5c8.png → 6069f8bc-2a06-45a4-95ca-1ac9d8fa3b04.png} +0 -0
  264. /kaa/sprites/{962aa0b9-1dd3-4260-a4fb-c069c26e5a84.png → 60896822-de58-4e07-b2d9-86a7f4068de1.png} +0 -0
  265. /kaa/sprites/{889a4153-b713-49cb-a4d5-e302bcdd002d.png → 622d700e-0fd8-4a92-a286-1e8143c70570.png} +0 -0
  266. /kaa/sprites/{b59c0e9b-1f20-4194-ab37-286f505fa656.png → 63b74752-73ce-4020-a7c8-0a71a9f67415.png} +0 -0
  267. /kaa/sprites/{4a081370-b0a1-4067-8470-e3007cc68a12.png → 648d43f6-b251-4d6f-a808-ae7325c91a59.png} +0 -0
  268. /kaa/sprites/{bfdc9b53-2fe5-43f1-8588-7ab71217d31c.png → 65f79941-1c78-496a-a67c-c50f4227bd34.png} +0 -0
  269. /kaa/sprites/{9e7eaa8e-3178-44da-a5ec-34b889f8facf.png → 6f50cd3b-6e46-46c5-99ed-26728d3212ad.png} +0 -0
  270. /kaa/sprites/{ab237c6d-c4d8-4716-8ef7-99b8e995c9a7.png → 6f6d7af3-8380-439b-9d26-3fbd5a103b49.png} +0 -0
  271. /kaa/sprites/{1befe09b-cb77-417a-b21e-7746804d4e03.png → 71913fde-c3db-463d-800d-e1b35fa2c8b4.png} +0 -0
  272. /kaa/sprites/{e7f2734f-9fdc-4521-8d7e-8b0fe270a223.png → 71976c1a-5df9-44a5-b4ea-08b5d617d813.png} +0 -0
  273. /kaa/sprites/{9f7150bc-c0b8-48d6-862c-456aaf518b2b.png → 72a8bcd2-3f32-4ee5-8295-eedf441d6a1a.png} +0 -0
  274. /kaa/sprites/{cd0e8663-2ea1-436a-b9fb-3caa0c3ed9e8.png → 73b6f3aa-5179-41d6-a82e-22e14aa8cd6a.png} +0 -0
  275. /kaa/sprites/{cba0646d-dffe-4c5b-a44d-1f8d827624a6.png → 7a74b5f5-7a04-4678-8e6e-57b5de127182.png} +0 -0
  276. /kaa/sprites/{5930140e-effe-4bcf-b0be-c20d3990d833.png → 7b4c3a81-8f09-4a00-90ee-d4df3f57e863.png} +0 -0
  277. /kaa/sprites/{cb6dffd9-6474-4d09-aee6-26352ea51d31.png → 7c4ca388-5167-478a-a32b-0e108edad888.png} +0 -0
  278. /kaa/sprites/{96704aa3-b5ad-4e34-bb88-fad766415362.png → 7d4709f8-6d0d-493f-819e-74cb0f7c166b.png} +0 -0
  279. /kaa/sprites/{fcc72120-2a77-4c26-a27e-e1027c6088c0.png → 7e8904fd-5863-471f-8e9a-d69d9ca72f8f.png} +0 -0
  280. /kaa/sprites/{023b8f4c-15ab-4845-b141-446c861ad475.png → 80800c2e-417d-4118-b726-93aaabfc08bd.png} +0 -0
  281. /kaa/sprites/{f0aef696-2106-46a4-8b7f-9f16b6c89d3f.png → 81b1b160-2d0f-42ad-924a-9572a54f343a.png} +0 -0
  282. /kaa/sprites/{13cb0309-b713-4725-b10b-26afe46eb9c0.png → 82259f79-2bef-442b-bf16-78cb4f22e3be.png} +0 -0
  283. /kaa/sprites/{43a367e1-91dd-495e-8c30-41903f75a99a.png → 861a4faa-2522-41e9-8e20-7bd9180bea5a.png} +0 -0
  284. /kaa/sprites/{01247ebe-8d63-4573-90f4-d8dc2b7ca14c.png → 87ed135a-2eb1-4e21-8928-d0307a22ea66.png} +0 -0
  285. /kaa/sprites/{1cf03f98-63e9-467c-804d-c74dd97b69bd.png → 8805fead-f7e2-4905-a42e-05ebba2fbe21.png} +0 -0
  286. /kaa/sprites/{16a0fd47-e85b-4848-8894-9d071ea993ac.png → 88be2dcc-68ca-4596-9b2c-544a196cab64.png} +0 -0
  287. /kaa/sprites/{a5694c76-3c5d-462e-81d5-1e0e6cef0ec9.png → 89841ff0-e834-4a7e-b9d5-00a9490b6b7f.png} +0 -0
  288. /kaa/sprites/{84cabff2-7a1b-4018-b74b-46f4db06304f.png → 8bf08bab-7c55-45e1-8433-c2213a323480.png} +0 -0
  289. /kaa/sprites/{e5e49b44-dcc2-4e77-9180-0d2beaa3f9ad.png → 8d416e23-04ef-47bd-8cc8-7f18d1bab736.png} +0 -0
  290. /kaa/sprites/{c1d502eb-c77f-45cb-86b5-11b4a8a3aef5.png → 8f9dd0f0-f9af-4eec-a89e-8f2c92f88a98.png} +0 -0
  291. /kaa/sprites/{424a0ef5-102d-4734-a731-2b3b3c7c9682.png → 9088f8c0-59f8-41c6-994c-ae283ac94c24.png} +0 -0
  292. /kaa/sprites/{91a50322-52d9-4516-9e46-bc121f20667d.png → 922af7d1-75e9-4ac8-a4e7-2dad8bb1ca87.png} +0 -0
  293. /kaa/sprites/{d81b1325-e57a-4f22-93e1-6ad4baa28935.png → 94ed55fe-3ef8-46bc-855a-a7b1dedab801.png} +0 -0
  294. /kaa/sprites/{913dbd4e-ebb1-4c9f-b145-9960cde59c17.png → 95d715c3-d569-48b5-be7b-c21cd2a160db.png} +0 -0
  295. /kaa/sprites/{dd7bd6cd-90f1-4773-9b68-5df7f2f84da5.png → 97a3791d-fa9d-453d-8081-c574fe88b823.png} +0 -0
  296. /kaa/sprites/{2204967a-a0ee-4dd3-aecb-4d531e8e954c.png → 9acd9a59-004f-4e1d-a208-0c293f2702d5.png} +0 -0
  297. /kaa/sprites/{572a921d-633f-4465-b177-7a0d9ad7e099.png → 9f3bfe36-8462-404f-94da-9bc324b1beed.png} +0 -0
  298. /kaa/sprites/{799fe395-2264-4bc5-b515-813dadda8fe1.png → 9f46f543-d7dc-4836-a210-125d686475f9.png} +0 -0
  299. /kaa/sprites/{5bf2a814-df85-4d0a-b4b5-8883ac2ee434.png → a34502b4-10bd-42ca-9ada-a9cdb57097dc.png} +0 -0
  300. /kaa/sprites/{043e753e-db15-45ba-8513-53c3fc9c7f3c.png → a3fe5859-62ba-403e-9367-65db0ad15943.png} +0 -0
  301. /kaa/sprites/{8f7b55d8-0143-4d27-bef8-560d4d510500.png → a42ac612-acbd-45cc-88fb-104ff9b7d2d8.png} +0 -0
  302. /kaa/sprites/{736a9daf-05d6-46ba-810b-5a8f509152d1.png → a4c6d967-0251-4b33-acb3-81d24f82d5a4.png} +0 -0
  303. /kaa/sprites/{edcec31d-d5de-4f22-b666-3e3c656e06d8.png → a6ed21f0-4da4-4065-bb59-062a70e132ca.png} +0 -0
  304. /kaa/sprites/{e9310e38-a418-4561-bf33-eb3e6dccf477.png → a97e2840-1575-4f2c-97df-6a720c644969.png} +0 -0
  305. /kaa/sprites/{d644faa3-ff16-417f-928c-4c62b040bfdb.png → ae0ce964-eb8f-45a1-aa4d-f47a5c8c720f.png} +0 -0
  306. /kaa/sprites/{256ffeba-8e9e-4cc5-8a1c-9eaee427f1a5.png → ae106b38-da4f-4b0d-b9c3-541fd58f4de7.png} +0 -0
  307. /kaa/sprites/{802db04f-77c2-46a4-a6eb-f81d48ea03ce.png → aeab8f9a-fe61-4c2d-a494-ffc19a9cae91.png} +0 -0
  308. /kaa/sprites/{37215a56-f8e1-4f22-a148-9894136f6ab1.png → affc87db-2f63-4e4a-855e-6ff608226f1e.png} +0 -0
  309. /kaa/sprites/{d1ea0ea6-4a6a-4036-b140-922c95a648b5.png → b02c15b5-04b4-40d9-bb13-267786e8e049.png} +0 -0
  310. /kaa/sprites/{22dc4cfe-8c66-4461-8660-e2d11bbe6154.png → b7f62cab-cc24-480e-bf4c-25c43a1e801e.png} +0 -0
  311. /kaa/sprites/{5906d986-d0e5-452d-a7c4-ddeb7af8751d.png → bd4cd421-f702-47c0-9f8b-77914973108c.png} +0 -0
  312. /kaa/sprites/{8bd22fe1-b544-4d2e-b74a-34f3cf0eb512.png → c4505a31-74c5-4b3d-bfcf-a67c3ef0039e.png} +0 -0
  313. /kaa/sprites/{e13fc34b-accc-4986-865d-f8d8410b45e9.png → c6b6b77b-2ec7-4fb7-8033-f4d061f4e9c8.png} +0 -0
  314. /kaa/sprites/{2b6d2eb0-bcf7-4bea-b037-6293d9c6d728.png → c76c6ccb-d099-4c3c-9eda-13be33aa48ae.png} +0 -0
  315. /kaa/sprites/{0562f69f-0300-4a2b-8252-63f3e7180e4c.png → cb15d9a3-78fe-4f03-bd23-90ba6169ddff.png} +0 -0
  316. /kaa/sprites/{2a8626df-056c-46a2-aaf3-0060a5aef6a3.png → d1bdfa3b-34df-488d-9f9b-8c7b04dd4ab3.png} +0 -0
  317. /kaa/sprites/{3aed50a2-d640-4178-9b8a-4dd7973eebf1.png → d8ba1932-978c-451c-a717-d7d2b6db35d9.png} +0 -0
  318. /kaa/sprites/{f635499a-943d-47da-952a-1feb58daa25b.png → e7630ccb-6824-49e3-986f-2a65a2c4a948.png} +0 -0
  319. /kaa/sprites/{847eb5c0-0350-4b7c-9c9c-43c796709795.png → ec35a0b8-1afa-48ff-ae66-9c1ef966348d.png} +0 -0
  320. {ksaa-2025.11b1.dist-info → ksaa-2025.11b3.dist-info}/WHEEL +0 -0
  321. {ksaa-2025.11b1.dist-info → ksaa-2025.11b3.dist-info}/entry_points.txt +0 -0
  322. {ksaa-2025.11b1.dist-info → ksaa-2025.11b3.dist-info}/licenses/LICENSE +0 -0
  323. {ksaa-2025.11b1.dist-info → ksaa-2025.11b3.dist-info}/top_level.txt +0 -0
@@ -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
 
@@ -257,109 +265,197 @@ def acquisition_date_change_dialog() -> AcquisitionType | None:
257
265
 
258
266
  return None
259
267
 
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()
268
+ # TODO: 这里要改善一下输出日志。
269
+ # Acquisitions finished. Handled: xxx(event name or 'none'). Checked: 12(number of acquisitions) / 12(number of acquisitions)
270
+ class ProduceInterrupt:
271
+ def __init__(self, *, timeout: float | None = None):
272
+ """
273
+ :param timeout: 超时时间,单位秒。默认为 None,表示使用配置文件中的时间。
274
+ """
275
+ timeout = timeout or conf().produce.interrupt_timeout
276
+ self.cd = Countdown(timeout)
277
+
278
+ @staticmethod
279
+ def _check_loading(img: MatLike) -> AcquisitionType | None:
280
+ """检查加载画面"""
281
+ if loading():
282
+ logger.info("Loading...")
283
+ return "Loading"
284
+ return None
285
+
286
+ @staticmethod
287
+ def _check_skip_commu(img: MatLike) -> AcquisitionType | None:
288
+ """检查跳过未读交流"""
289
+ logger.debug("Check skip commu...")
290
+ if produce_solution().data.skip_commu and handle_unread_commu(img):
291
+ return "SkipCommu"
292
+ return None
293
+
294
+ @staticmethod
295
+ def _check_pdrink_max(img: MatLike) -> AcquisitionType | None:
296
+ """检查P饮料到达上限"""
297
+ logger.debug("Check PDrink max...")
298
+ # TODO: 需要封装一个更好的实现方式。比如 wait_stable?
285
299
  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()
300
+ logger.debug("PDrink max found")
301
+ device.screenshot()
302
+ if image.find(R.InPurodyuusu.TextPDrinkMax):
303
+ # 有对话框标题,但是没找到确认按钮
304
+ # 可能是需要勾选一个饮料
305
+ # 也有可能是对话框正在往下退出
306
+ if not image.find(R.InPurodyuusu.ButtonLeave, colored=True):
307
+ logger.info("No leave button found, click checkbox")
308
+ if image.find(R.Common.CheckboxUnchecked, colored=True):
309
+ device.click()
310
+ sleep(0.2)
311
+ device.screenshot()
312
+ if leave := image.find(R.InPurodyuusu.ButtonLeave, colored=True):
313
+ logger.info("Leave button found")
314
+ device.click(leave)
315
+ return "PDrinkMax"
316
+ return None
317
+
318
+ @staticmethod
319
+ def _check_pdrink_max_confirm(img: MatLike) -> AcquisitionType | None:
320
+ """检查P饮料到达上限确认提示框"""
321
+ # [kotonebot-resource/sprites/jp/in_purodyuusu/screenshot_pdrink_max_confirm.png]
302
322
  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)
323
+ logger.debug("PDrink max confirm found")
324
+ device.screenshot()
325
+ if image.find(R.InPurodyuusu.TextPDrinkMaxConfirmTitle):
326
+ if confirm := image.find(R.Common.ButtonConfirm):
327
+ logger.info("Confirm button found")
328
+ device.click(confirm)
329
+ return "PDrinkMax"
330
+ return None
361
331
 
362
- return None
332
+ @staticmethod
333
+ def _check_skill_card_enhance(img: MatLike) -> AcquisitionType | None:
334
+ """检查技能卡自选强化"""
335
+ if image.find(R.InPurodyuusu.IconTitleSkillCardEnhance):
336
+ if handle_skill_card_enhance():
337
+ return "PSkillCardEnhanceSelect"
338
+ return None
339
+
340
+ @staticmethod
341
+ def _check_skill_card_removal(img: MatLike) -> AcquisitionType | None:
342
+ """检查技能卡自选删除"""
343
+ if image.find(R.InPurodyuusu.IconTitleSkillCardRemoval):
344
+ if handle_skill_card_removal():
345
+ return "PSkillCardRemoveSelect"
346
+ return None
347
+
348
+ @staticmethod
349
+ def _check_network_error(img: MatLike) -> AcquisitionType | None:
350
+ """检查网络中断弹窗"""
351
+ logger.debug("Check network error popup...")
352
+ if (image.find(R.Common.TextNetworkError)
353
+ and (btn_retry := image.find(R.Common.ButtonRetry))
354
+ ):
355
+ logger.info("Network error popup found")
356
+ device.click(btn_retry)
357
+ return "NetworkError"
358
+ return None
359
+
360
+ @staticmethod
361
+ def _check_award_select(img: MatLike) -> AcquisitionType | None:
362
+ """检查物品选择对话框"""
363
+ logger.debug("Check award select dialog...")
364
+ if image.find(R.InPurodyuusu.TextClaim):
365
+ logger.info("Award select dialog found.")
366
+
367
+ # P饮料选择
368
+ logger.debug("Check PDrink select...")
369
+ if image.find(R.InPurodyuusu.TextPDrink):
370
+ logger.info("PDrink select found")
371
+ acquire_p_drink()
372
+ return "PDrinkSelect"
373
+ # 技能卡选择
374
+ logger.debug("Check skill card select...")
375
+ if image.find(R.InPurodyuusu.TextSkillCard):
376
+ logger.info("Acquire skill card found")
377
+ acquire_skill_card()
378
+ return "PSkillCardSelect"
379
+ # P物品选择
380
+ logger.debug("Check PItem select...")
381
+ if image.find(R.InPurodyuusu.TextPItem):
382
+ logger.info("Acquire PItem found")
383
+ select_p_item()
384
+ return "PItemSelect"
385
+ return None
386
+
387
+ @staticmethod
388
+ def _check_date_change(img: MatLike) -> AcquisitionType | None:
389
+ """检查日期变更"""
390
+ result = acquisition_date_change_dialog()
391
+ if result is not None:
392
+ return result
393
+ return None
394
+
395
+ handlers = [
396
+ _check_loading,
397
+ _check_skip_commu,
398
+ _check_pdrink_max,
399
+ _check_pdrink_max_confirm,
400
+ _check_skill_card_enhance,
401
+ _check_skill_card_removal,
402
+ _check_network_error,
403
+ _check_award_select,
404
+ _check_date_change
405
+ ]
406
+
407
+ @classmethod
408
+ @action('处理培育事件', screenshot_mode='manual')
409
+ def check(cls) -> AcquisitionType | None:
410
+ """处理行动开始前和结束后可能需要处理的事件"""
411
+ img = device.screenshot()
412
+ logger.info("Acquisition stuffs...")
413
+
414
+ # 检查各个可能的中断事件
415
+ for handler in cls.handlers:
416
+ result = handler(img)
417
+ if result:
418
+ return result
419
+ skip()
420
+
421
+ return None
422
+
423
+ def resolve(self, end_condition: Callable[[], bool] | Image | None = None):
424
+ self.cd.reset().start()
425
+ result: Literal[False] | AcquisitionType | None = False
426
+ for l in Loop():
427
+ if end_condition is not None:
428
+ if callable(end_condition) and end_condition():
429
+ break
430
+ elif isinstance(end_condition, Image) and image.find(end_condition):
431
+ break
432
+ else:
433
+ if result is None:
434
+ break
435
+
436
+ if self.cd.expired():
437
+ raise UnrecoverableError("ProduceInterrupt.resolve timed out after 180 seconds")
438
+
439
+ img = l.screenshot
440
+ if img is None:
441
+ img = device.screenshot()
442
+ for handler in self.handlers:
443
+ result = handler(img)
444
+ if result:
445
+ break
446
+ skip()
447
+
448
+ def handle(self):
449
+ """处理中断事件,并检查是否超时。"""
450
+ if self.cd.expired():
451
+ raise UnrecoverableError('Unable to detect produce scene. Reseason: timed out.')
452
+ return self.check()
453
+
454
+ def until(self, end_img: Image):
455
+ """
456
+ 持续处理中断事件,直到指定图片出现为止。
457
+ """
458
+ return self.resolve(lambda: image.find(end_img) is not None)
363
459
 
364
460
  def until_acquisition_clear():
365
461
  """
@@ -369,7 +465,7 @@ def until_acquisition_clear():
369
465
  结束条件:任意
370
466
  """
371
467
  interval = Interval(0.6)
372
- while fast_acquisitions():
468
+ while ProduceInterrupt.check():
373
469
  interval.wait()
374
470
 
375
471
  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...")
@@ -750,8 +752,10 @@ def detect_produce_scene() -> ProduceStage:
750
752
  结束状态:游戏主页面\n
751
753
  """
752
754
  logger.info("Detecting current produce stage...")
753
-
755
+ cd = Countdown(conf().produce.interrupt_timeout).start()
754
756
  for _ in Loop():
757
+ if cd.expired():
758
+ raise UnrecoverableError('Unable to detect produce scene. Reseason: timed out.')
755
759
  # 行动场景
756
760
  texts = ocr.ocr()
757
761
  if (
@@ -769,7 +773,7 @@ def detect_produce_scene() -> ProduceStage:
769
773
  logger.info("Detection result: At exam scene.")
770
774
  return 'exam-ongoing'
771
775
  else:
772
- if fast_acquisitions():
776
+ if ProduceInterrupt.check():
773
777
  # 继续循环检测
774
778
  pass
775
779
  elif commu_event():
@@ -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])
@@ -242,7 +242,8 @@ def do_produce(
242
242
  # [kotonebot-resource\sprites\jp\produce\screenshot_no_enough_ap_2.png]
243
243
  # [kotonebot-resource\sprites\jp\produce\screenshot_no_enough_ap_3.png]
244
244
  logger.info('AP insufficient. Try to use AP drink.')
245
- for _ in Loop():
245
+ for _ in Loop(interval=1):
246
+ # HACK: 这里设置 interval 是 #91 的临时 workaround
246
247
  if image.find(R.Produce.ButtonUse, colored=True):
247
248
  device.click()
248
249
  elif image.find(R.Produce.ButtonRefillAP):
kaa/tasks/start_game.py CHANGED
@@ -16,6 +16,7 @@ from .actions.loading import loading
16
16
  from kaa.config import Priority, conf
17
17
  from .actions.scenes import at_home, goto_home
18
18
  from .actions.commu import handle_unread_commu
19
+ from kaa.tasks.common import skip
19
20
  from kaa.errors import ElevationRequiredError, GameUpdateNeededError, DmmGameLaunchError
20
21
 
21
22
  logger = logging.getLogger(__name__)
@@ -138,7 +139,7 @@ def wait_for_home():
138
139
  device.click()
139
140
 
140
141
  if should_click and click_cd.expired():
141
- device.click(10, 10)
142
+ skip()
142
143
  click_cd.reset()
143
144
 
144
145
  @action('启动游戏.Android', screenshot_mode='manual-inherit')
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ksaa
3
- Version: 2025.11b1
3
+ Version: 2025.11b3
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
8
  Requires-Dist: opencv-python==4.10.0.84
@@ -24,11 +24,12 @@ Requires-Dist: typing-extensions==4.12.2
24
24
  Requires-Dist: python-dotenv==1.0.1
25
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
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
30
  Requires-Dist: keyboard==0.13.5
31
- Requires-Dist: kotonebot[android,windows]==0.3.1
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
  (带删除线标记的为已完成)