From 31f5cc14ee2eb44633171c21543f662ce38c521a Mon Sep 17 00:00:00 2001 From: TommrraraSnow Date: Sat, 22 Nov 2025 13:48:45 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=BB=91?= =?UTF-8?q?=E8=89=B2=E5=92=8C=E6=8E=92=E5=BA=8F=E5=B7=A5=E5=85=B7=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=8A=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 31 +++++++++++++++++++++++++ uv.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a56a6a7c..9948a595 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,34 @@ ignore = ["E501"] exclude = ["build", "dist", ".venv", "__pypackages__"] per-file-ignores = { "__init__.py" = ["F401"] } +[tool.black] +line-length = 100 +target-version = ['py312'] +include = '\.pyi?$' +extend-exclude = ''' +/( + # directories + \.eggs + | \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | build + | dist +)/ +''' + +[tool.isort] +profile = "black" +line_length = 100 +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +use_parentheses = true +ensure_newline_before_comments = true +skip_glob = ["*/migrations/*", "venv/*", ".venv/*"] + [[tool.uv.index]] url = "https://pypi.tuna.tsinghua.edu.cn/simple" default = true @@ -86,6 +114,9 @@ dev = [ "pytest-asyncio>=1.1.0", "mypy>=1.17.1", "ruff>=0.12.12", + "black>=25.11.0", + "isort>=7.0.0", + "pre-commit>=4.2.0", ] [project.optional-dependencies] diff --git a/uv.lock b/uv.lock index 7837efa4..210467f0 100644 --- a/uv.lock +++ b/uv.lock @@ -66,9 +66,9 @@ wheels = [ name = "altgraph" version = "0.17.4" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418, upload-time = "2023-09-25T09:04:52.164Z" } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212, upload-time = "2023-09-25T09:04:50.691Z" }, ] [[package]] @@ -121,6 +121,35 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] +[[package]] +name = "black" +version = "25.11.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, +] + [[package]] name = "blinker" version = "1.9.0" @@ -476,6 +505,8 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, @@ -485,6 +516,8 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload-time = "2025-11-04T12:42:19.395Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload-time = "2025-11-04T12:42:21.174Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, @@ -492,6 +525,8 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload-time = "2025-11-04T12:42:25.341Z" }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, ] @@ -619,6 +654,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, ] +[[package]] +name = "isort" +version = "7.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/53/4f3c058e3bace40282876f9b553343376ee687f3c35a525dc79dbd450f88/isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187", size = 805049, upload-time = "2025-10-11T13:30:59.107Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", size = 94672, upload-time = "2025-10-11T13:30:57.665Z" }, +] + [[package]] name = "itsdangerous" version = "2.2.0" @@ -1423,6 +1467,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/f1/bfb6811df4745f92f14c47a29e50e89a36b1533130fcc56452d4660bd2d6/pythonnet-3.0.5-py3-none-any.whl", hash = "sha256:f6702d694d5d5b163c9f3f5cc34e0bed8d6857150237fae411fefb883a656d20", size = 297506, upload-time = "2024-12-13T08:30:40.661Z" }, ] +[[package]] +name = "pytokens" +version = "0.3.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/8d/a762be14dae1c3bf280202ba3172020b2b0b4c537f94427435f19c413b72/pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a", size = 17644, upload-time = "2025-11-05T13:36:35.34Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3", size = 12195, upload-time = "2025-11-05T13:36:33.183Z" }, +] + [[package]] name = "pytz" version = "2025.2" @@ -2005,7 +2058,9 @@ windows = [ [package.dev-dependencies] dev = [ + { name = "black" }, { name = "ipykernel" }, + { name = "isort" }, { name = "mypy" }, { name = "objprint" }, { name = "pyinstaller" }, @@ -2046,7 +2101,9 @@ provides-extras = ["windows"] [package.metadata.requires-dev] dev = [ + { name = "black", specifier = ">=25.11.0" }, { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "isort", specifier = ">=7.0.0" }, { name = "mypy", specifier = ">=1.17.1" }, { name = "objprint", specifier = ">=0.3.0" }, { name = "pyinstaller", specifier = ">=6.13.0" }, From 4119bb5892c853f29a9cb4937e996ee110ebd462 Mon Sep 17 00:00:00 2001 From: TommrraraSnow Date: Sat, 22 Nov 2025 13:52:43 +0800 Subject: [PATCH 2/5] Refactor imports and improve code formatting across multiple files - Organized import statements in various listener classes and event classes for better readability. - Enhanced code formatting by adding line breaks and consistent indentation. - Updated the `ListenerManager` class to improve clarity in listener group initialization. - Added pre-commit configuration for Ruff to enforce code style and linting. - Created a setup guide for pre-commit hooks to streamline development workflow. --- .pre-commit-config.yaml | 9 + SETUP_PRECOMMIT.md | 59 ++++++ alembic/versions/74ee1818bd42_init_schema.py | 112 +++++------ scripts/changelog.py | 175 +++++++++--------- tests/__init__.py | 2 +- tests/api/test_apl.py | 3 +- tests/api/test_apl_import_export.py | 10 +- tests/api/test_enemy_config.py | 1 + tests/api/test_session_op.py | 1 + tests/api/test_uds.py | 7 +- tests/conftest.py | 3 +- tests/simulator/__init__.py | 6 +- tests/simulator/safe_concurrent_teams.py | 84 ++++----- tests/simulator/test_isolated_teams.py | 22 ++- tests/simulator/test_parallel_mode.py | 8 +- tests/teams/__init__.py | 2 +- tests/teams/electric_teams.py | 16 +- tests/teams/fire_teams.py | 14 +- tests/teams/ice_teams.py | 9 +- tests/teams/physical_teams.py | 14 +- tests/teams/team_configs.py | 5 +- tests/teams/usage_example.py | 14 +- uv.lock | 123 ++++++++++++ zsim/api_src/models/apl.py | 3 +- zsim/api_src/services/database/apl_db.py | 37 +--- .../api_src/services/database/character_db.py | 17 +- zsim/api_src/services/database/enemy_db.py | 5 +- zsim/api_src/services/database/session_db.py | 27 +-- .../services/sim_controller/sim_controller.py | 38 ++-- zsim/data/csv_excel_sync.py | 3 +- zsim/data/str_to_num.py | 5 +- zsim/define.py | 1 - zsim/lib_webui/clean_results_cache.py | 2 +- zsim/lib_webui/constants.py | 4 +- zsim/lib_webui/doc_pages/page_apl_doc.py | 2 + zsim/lib_webui/doc_pages/page_char_support.py | 1 + zsim/lib_webui/doc_pages/page_contribution.py | 2 + zsim/lib_webui/process_apl_editor.py | 2 +- zsim/lib_webui/process_buff_result.py | 10 +- zsim/lib_webui/process_char_config.py | 3 +- zsim/lib_webui/process_dmg_result.py | 5 +- zsim/lib_webui/process_parallel_data.py | 4 +- zsim/lib_webui/process_simulator.py | 5 +- zsim/models/character/character_config.py | 1 + zsim/models/enemy/enemy_config.py | 3 +- zsim/models/event_enums.py | 12 +- zsim/models/session/session_create.py | 2 +- zsim/models/session/session_result.py | 1 - zsim/page_character_config.py | 6 +- zsim/script/APLSpawner/Spawner.py | 7 +- zsim/script/draw_anomaly_timeline.py | 2 +- zsim/setup.py | 2 +- .../Buff/Buff0Manager/Buff0ManagerClass.py | 4 +- zsim/sim_progress/Buff/BuffAddStrategy.py | 59 ++++-- zsim/sim_progress/Buff/BuffLoad.py | 4 +- .../Buff/BuffXLogic/AliceCinema6Trigger.py | 4 +- .../AlicePolarizedAssaultTrigger.py | 22 ++- .../Buff/BuffXLogic/AnomalyDebuffExitJudge.py | 1 - .../BuffXLogic/AstraYaoChordManagerTrigger.py | 3 +- .../Buff/BuffXLogic/AstralVoice.py | 2 +- .../BuffXLogic/CordisGerminaCritRateBonus.py | 2 +- .../BuffXLogic/CordisGerminaEleDmgBonus.py | 1 + .../CordisGerminaSNAAndQIgnoreDefense.py | 2 - .../DawnsBloom4SetTriggerNADmgBonus.py | 1 + .../BuffXLogic/FlamemakerShakerDmgBonus.py | 2 +- .../Buff/BuffXLogic/FlightOfFancy.py | 2 +- .../HugoCorePassiveSingleStunAtkBonus.py | 2 +- .../HugoCorePassiveTotalizeTrigger.py | 7 +- .../JaneCinema1APTransToDmgBonus.py | 7 +- .../BuffXLogic/MagneticStormAlphaAMBonus.py | 2 +- .../BuffXLogic/MagneticStormBravoApBonus.py | 2 +- .../MagneticStormCharlieSpRecover.py | 2 +- .../BuffXLogic/MetanukiMorphosisAPBonus.py | 3 +- .../MoonlightLullabyAllTeamDmgBonus.py | 2 +- .../QingmingBirdcageCompanionSheerAtkBonus.py | 7 +- .../BuffXLogic/RainforestGourmetATKBonus.py | 3 +- .../Buff/BuffXLogic/RoaringRideBuffTrigger.py | 2 +- .../SeedAdditionalAbilityTrigger.py | 8 +- .../BuffXLogic/SeedBesiegeBonusTrigger.py | 8 +- .../SeedCinema2BesiegeIgnoreDefenceTrigger.py | 10 +- .../SeedCinema2BesiegeIgnoreDefense.py | 6 +- .../Buff/BuffXLogic/SeedCinema4Bonus.py | 5 +- .../Buff/BuffXLogic/SeedCinema4Trigger.py | 8 +- .../Buff/BuffXLogic/SeedCinema6Trigger.py | 5 +- .../Buff/BuffXLogic/SeedDirectStrikeBonus.py | 2 +- .../BuffXLogic/SeedDirectStrikeTrigger.py | 8 +- .../Buff/BuffXLogic/SeedOnslaughtBonus.py | 6 +- .../BuffXLogic/YuzuhaCinem1EleResReduce.py | 3 +- .../Buff/BuffXLogic/YuzuhaCinema2Trigger.py | 6 +- .../YuzuhaCinema4QuickAssistTrigger.py | 8 +- .../BuffXLogic/YuzuhaCinema6SheelTrigger.py | 6 +- .../BuffXLogic/YuzuhaCorePassiveSweetScare.py | 3 +- .../BuffXLogic/YuzuhaHardCandyShotTrigger.py | 8 +- .../BuffXLogic/YuzuhaTanukiWishAtkBonus.py | 2 +- .../BuffXLogic/_buff_record_base_class.py | 2 +- zsim/sim_progress/Buff/JudgeTools/__init__.py | 3 +- zsim/sim_progress/Buff/ScheduleBuffSettle.py | 4 +- zsim/sim_progress/Character/Alice.py | 4 +- zsim/sim_progress/Character/Miyabi.py | 1 + .../Character/Seed/ExStateManager.py | 56 ++++-- zsim/sim_progress/Character/Seed/__init__.py | 9 +- .../sim_progress/Character/Vivian/__init__.py | 5 +- .../sim_progress/Character/Yuzuha/__init__.py | 14 +- zsim/sim_progress/Character/__init__.py | 2 +- zsim/sim_progress/Character/character.py | 5 +- .../Dot/Dots/AliceCoreSkillAssaultDot.py | 20 +- zsim/sim_progress/Dot/Dots/ViviansProphecy.py | 2 +- zsim/sim_progress/Enemy/QTEManager/QTEData.py | 6 +- zsim/sim_progress/Enemy/__init__.py | 11 +- .../APLModule/APLJudgeTools/__init__.py | 10 +- .../SubConditionUnit/StatusSubUnit.py | 1 + .../APLModule/SubConditionUnit/__init__.py | 6 +- .../Preload/APLModule/__init__.py | 4 +- zsim/sim_progress/Preload/PreloadDataClass.py | 9 +- .../Preload/PreloadEngine/APLEngine.py | 6 +- .../Preload/PreloadEngine/ConfirmEngine.py | 3 +- .../PreloadEngine/SwapCancelValidateEngine.py | 1 + .../Preload/PreloadEngine/__init__.py | 4 +- zsim/sim_progress/Preload/__init__.py | 4 +- zsim/sim_progress/Report/buff_handler.py | 6 +- .../sim_progress/ScheduledEvent/Calculator.py | 9 +- zsim/sim_progress/ScheduledEvent/constants.py | 8 +- .../ScheduledEvent/event_handlers/base.py | 4 +- .../event_handlers/handlers/skill.py | 4 +- zsim/sim_progress/Update/UpdateAnomaly.py | 4 +- zsim/sim_progress/Update/Update_Buff.py | 8 +- zsim/sim_progress/anomaly_bar/Anomalies.py | 1 + .../anomaly_bar/AnomalyBarClass.py | 10 +- .../anomaly_bar/CopyAnomalyForOutput.py | 2 - zsim/sim_progress/anomaly_bar/__init__.py | 8 +- zsim/sim_progress/data_struct/ActionStack.py | 1 + ...liceCinema1BladeEtquitteRecoverListener.py | 6 +- .../AliceCinema1DefReduceListener.py | 10 +- .../AliceCinema2DisorderDmgBonus.py | 10 +- ...eCoreSkillDisorderBasicMulBonusListener.py | 10 +- .../AliceCoreSkillPhyBuildupBonusListener.py | 14 +- .../AliceDisorderListener.py | 9 +- .../AliceDotTriggerListener.py | 11 +- .../AliceNAEnhancementListener.py | 9 +- .../BattleEventListener/BaseListenerClass.py | 5 +- .../CinderCobaltListener.py | 2 + .../FangedMetalListener.py | 12 +- .../HeartstringNocturneListener.py | 3 +- .../HormonePunkListener.py | 3 +- .../HugoCorePassiveBuffListener.py | 3 +- .../PracticedPerfectionPhyDmgBonusListener.py | 4 +- .../YixuanAnomalyListener.py | 2 +- .../ZanshinHerbCaseListener.py | 3 +- .../BattleEventListener/__init__.py | 11 +- .../NormalAttackManager/NAManagerClasses.py | 3 +- .../NormalAttackManager/__init__.py | 1 - .../data_struct/PolarizedAssaultEventClass.py | 70 ++++--- .../data_struct/SchedulePreload.py | 2 +- zsim/sim_progress/data_struct/__init__.py | 4 +- .../sim_progress/data_struct/data_analyzer.py | 63 +++---- .../special_state_class.py | 4 +- .../special_state_manager_class.py | 7 +- .../data_struct/monitor_list_class.py | 1 + zsim/sim_progress/data_struct/single_hit.py | 3 +- .../data_struct/sp_update_data.py | 4 +- .../summons_event/summons_event_class.py | 3 +- zsim/sim_progress/summons/summons_class.py | 3 +- zsim/utils/constants.py | 5 +- zsim/utils/process_buff_result.py | 7 +- zsim/utils/process_parallel_data.py | 1 + 165 files changed, 1046 insertions(+), 680 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 SETUP_PRECOMMIT.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..6afcc51c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.12.12 + hooks: + # Run the linter + - id: ruff + args: [--fix] + # Run the formatter + - id: ruff-format \ No newline at end of file diff --git a/SETUP_PRECOMMIT.md b/SETUP_PRECOMMIT.md new file mode 100644 index 00000000..08bb1983 --- /dev/null +++ b/SETUP_PRECOMMIT.md @@ -0,0 +1,59 @@ +# Pre-commit 设置指南 (Ruff 专用) + +## 安装和设置 + +1. **安装依赖** +```bash +uv sync +``` + +2. **安装 pre-commit hooks** +```bash +uv run pre-commit install +``` + +3. **手动运行所有检查** +```bash +uv run pre-commit run --all-files +``` + +## 配置的检查项 + +### Ruff 代码检查和格式化 +- **ruff**: Python 代码检查和自动修复 (`--fix`) +- **ruff-format**: Python 代码格式化 + +## 使用说明 + +### 每次 commit 时自动运行 +设置完成后,每次 `git commit` 都会自动运行 ruff 检查和格式化。 + +### 手动运行检查 +```bash +# 对所有文件运行检查 +uv run pre-commit run --all-files + +# 对暂存的文件运行检查 +uv run pre-commit run + +# 只运行检查(不格式化) +uv run ruff check + +# 只运行格式化 +uv run ruff format +``` + +### 更新 hooks +```bash +uv run pre-commit autoupdate +``` + +## 注意事项 + +1. **自动修复**:Ruff 会自动修复大部分代码问题和格式问题 +2. **性能**:Ruff 非常快速,通常在几秒内完成 +3. **配置**:所有 Ruff 配置都在 `pyproject.toml` 的 `[tool.ruff]` 部分 + +## 配置文件位置 +- 主配置:`.pre-commit-config.yaml` +- Ruff 配置:`pyproject.toml` 中的 `[tool.ruff]` 部分 \ No newline at end of file diff --git a/alembic/versions/74ee1818bd42_init_schema.py b/alembic/versions/74ee1818bd42_init_schema.py index 6c1c5a16..a591ec8f 100644 --- a/alembic/versions/74ee1818bd42_init_schema.py +++ b/alembic/versions/74ee1818bd42_init_schema.py @@ -23,63 +23,67 @@ def upgrade() -> None: """执行升级操作""" # ### commands auto generated by Alembic - please adjust! ### - op.create_table("apl_configs", - sa.Column("id", sa.String(length=64), nullable=False), - sa.Column("title", sa.String(length=255), nullable=False), - sa.Column("author", sa.String(length=255), nullable=True), - sa.Column("comment", sa.Text(), nullable=True), - sa.Column("create_time", sa.String(length=32), nullable=False), - sa.Column("latest_change_time", sa.String(length=32), nullable=False), - sa.Column("content", sa.Text(), nullable=False), - sa.PrimaryKeyConstraint("id") + op.create_table( + "apl_configs", + sa.Column("id", sa.String(length=64), nullable=False), + sa.Column("title", sa.String(length=255), nullable=False), + sa.Column("author", sa.String(length=255), nullable=True), + sa.Column("comment", sa.Text(), nullable=True), + sa.Column("create_time", sa.String(length=32), nullable=False), + sa.Column("latest_change_time", sa.String(length=32), nullable=False), + sa.Column("content", sa.Text(), nullable=False), + sa.PrimaryKeyConstraint("id"), ) - op.create_table("character_configs", - sa.Column("config_id", sa.String(length=128), nullable=False), - sa.Column("name", sa.String(length=255), nullable=False), - sa.Column("config_name", sa.String(length=255), nullable=False), - sa.Column("weapon", sa.String(length=255), nullable=False), - sa.Column("weapon_level", sa.Integer(), nullable=False), - sa.Column("cinema", sa.Integer(), nullable=False), - sa.Column("crit_balancing", sa.Boolean(), nullable=False), - sa.Column("crit_rate_limit", sa.Float(), nullable=False), - sa.Column("scATK_percent", sa.Integer(), nullable=False), - sa.Column("scATK", sa.Integer(), nullable=False), - sa.Column("scHP_percent", sa.Integer(), nullable=False), - sa.Column("scHP", sa.Integer(), nullable=False), - sa.Column("scDEF_percent", sa.Integer(), nullable=False), - sa.Column("scDEF", sa.Integer(), nullable=False), - sa.Column("scAnomalyProficiency", sa.Integer(), nullable=False), - sa.Column("scPEN", sa.Integer(), nullable=False), - sa.Column("scCRIT", sa.Integer(), nullable=False), - sa.Column("scCRIT_DMG", sa.Integer(), nullable=False), - sa.Column("drive4", sa.Text(), nullable=False), - sa.Column("drive5", sa.Text(), nullable=False), - sa.Column("drive6", sa.Text(), nullable=False), - sa.Column("equip_style", sa.String(length=255), nullable=False), - sa.Column("equip_set4", sa.String(length=255), nullable=True), - sa.Column("equip_set2_a", sa.String(length=255), nullable=True), - sa.Column("equip_set2_b", sa.String(length=255), nullable=True), - sa.Column("equip_set2_c", sa.String(length=255), nullable=True), - sa.Column("create_time", sa.String(length=32), nullable=False), - sa.Column("update_time", sa.String(length=32), nullable=False), - sa.PrimaryKeyConstraint("config_id") + op.create_table( + "character_configs", + sa.Column("config_id", sa.String(length=128), nullable=False), + sa.Column("name", sa.String(length=255), nullable=False), + sa.Column("config_name", sa.String(length=255), nullable=False), + sa.Column("weapon", sa.String(length=255), nullable=False), + sa.Column("weapon_level", sa.Integer(), nullable=False), + sa.Column("cinema", sa.Integer(), nullable=False), + sa.Column("crit_balancing", sa.Boolean(), nullable=False), + sa.Column("crit_rate_limit", sa.Float(), nullable=False), + sa.Column("scATK_percent", sa.Integer(), nullable=False), + sa.Column("scATK", sa.Integer(), nullable=False), + sa.Column("scHP_percent", sa.Integer(), nullable=False), + sa.Column("scHP", sa.Integer(), nullable=False), + sa.Column("scDEF_percent", sa.Integer(), nullable=False), + sa.Column("scDEF", sa.Integer(), nullable=False), + sa.Column("scAnomalyProficiency", sa.Integer(), nullable=False), + sa.Column("scPEN", sa.Integer(), nullable=False), + sa.Column("scCRIT", sa.Integer(), nullable=False), + sa.Column("scCRIT_DMG", sa.Integer(), nullable=False), + sa.Column("drive4", sa.Text(), nullable=False), + sa.Column("drive5", sa.Text(), nullable=False), + sa.Column("drive6", sa.Text(), nullable=False), + sa.Column("equip_style", sa.String(length=255), nullable=False), + sa.Column("equip_set4", sa.String(length=255), nullable=True), + sa.Column("equip_set2_a", sa.String(length=255), nullable=True), + sa.Column("equip_set2_b", sa.String(length=255), nullable=True), + sa.Column("equip_set2_c", sa.String(length=255), nullable=True), + sa.Column("create_time", sa.String(length=32), nullable=False), + sa.Column("update_time", sa.String(length=32), nullable=False), + sa.PrimaryKeyConstraint("config_id"), ) - op.create_table("enemy_configs", - sa.Column("config_id", sa.String(length=128), nullable=False), - sa.Column("enemy_index", sa.Integer(), nullable=False), - sa.Column("enemy_adjust", sa.Text(), nullable=False), - sa.Column("create_time", sa.String(length=32), nullable=False), - sa.Column("update_time", sa.String(length=32), nullable=False), - sa.PrimaryKeyConstraint("config_id") + op.create_table( + "enemy_configs", + sa.Column("config_id", sa.String(length=128), nullable=False), + sa.Column("enemy_index", sa.Integer(), nullable=False), + sa.Column("enemy_adjust", sa.Text(), nullable=False), + sa.Column("create_time", sa.String(length=32), nullable=False), + sa.Column("update_time", sa.String(length=32), nullable=False), + sa.PrimaryKeyConstraint("config_id"), ) - op.create_table("sessions", - sa.Column("session_id", sa.String(length=128), nullable=False), - sa.Column("session_name", sa.String(length=255), nullable=False), - sa.Column("create_time", sa.String(length=32), nullable=False), - sa.Column("status", sa.String(length=32), nullable=False), - sa.Column("session_run", sa.Text(), nullable=True), - sa.Column("session_result", sa.Text(), nullable=True), - sa.PrimaryKeyConstraint("session_id") + op.create_table( + "sessions", + sa.Column("session_id", sa.String(length=128), nullable=False), + sa.Column("session_name", sa.String(length=255), nullable=False), + sa.Column("create_time", sa.String(length=32), nullable=False), + sa.Column("status", sa.String(length=32), nullable=False), + sa.Column("session_run", sa.Text(), nullable=True), + sa.Column("session_result", sa.Text(), nullable=True), + sa.PrimaryKeyConstraint("session_id"), ) # ### end Alembic commands ### diff --git a/scripts/changelog.py b/scripts/changelog.py index 61ec5c4a..e51070d9 100755 --- a/scripts/changelog.py +++ b/scripts/changelog.py @@ -7,25 +7,24 @@ import argparse import subprocess import sys +import tomllib from datetime import datetime from pathlib import Path -from typing import List, Dict, Any - -import tomllib +from typing import Any, Dict, List def get_current_version() -> str: """获取当前版本号""" try: - result = subprocess.run(['uv', 'version', '--short'], capture_output=True, text=True) + result = subprocess.run(["uv", "version", "--short"], capture_output=True, text=True) return result.stdout.strip() except FileNotFoundError: # 读取 pyproject.toml - pyproject_path = Path('pyproject.toml') + pyproject_path = Path("pyproject.toml") if pyproject_path.exists(): - with open(pyproject_path, 'rb') as f: + with open(pyproject_path, "rb") as f: pyproject_data = tomllib.load(f) - return pyproject_data['project']['version'] + return pyproject_data["project"]["version"] return "unknown" @@ -33,23 +32,20 @@ def get_git_commits(since_tag: str | None = None) -> List[Dict[str, Any]]: """获取 git 提交记录""" try: if since_tag: - cmd = ['git', 'log', f'{since_tag}..HEAD', '--pretty=format:%H|%s|%an|%ae'] + cmd = ["git", "log", f"{since_tag}..HEAD", "--pretty=format:%H|%s|%an|%ae"] else: - cmd = ['git', 'log', '--pretty=format:%H|%s|%an|%ae'] - + cmd = ["git", "log", "--pretty=format:%H|%s|%an|%ae"] + result = subprocess.run(cmd, capture_output=True, text=True) commits = [] - - for line in result.stdout.strip().split('\n'): + + for line in result.stdout.strip().split("\n"): if line: - commit_hash, subject, author, email = line.split('|') - commits.append({ - 'hash': commit_hash, - 'subject': subject, - 'author': author, - 'email': email - }) - + commit_hash, subject, author, email = line.split("|") + commits.append( + {"hash": commit_hash, "subject": subject, "author": author, "email": email} + ) + return commits except subprocess.CalledProcessError: return [] @@ -58,67 +54,68 @@ def get_git_commits(since_tag: str | None = None) -> List[Dict[str, Any]]: def categorize_commits(commits: List[Dict[str, Any]]) -> Dict[str, List[str]]: """按类型分类提交""" categories = { - '✨ 新功能': [], - '🐛 问题修复': [], - '🔧 性能优化': [], - '📝 文档更新': [], - '🎨 界面优化': [], - '🧹 代码重构': [], - '🔒 安全修复': [], - '🧪 测试相关': [], - '📦 构建系统': [], - '🔄 其他更新': [] + "✨ 新功能": [], + "🐛 问题修复": [], + "🔧 性能优化": [], + "📝 文档更新": [], + "🎨 界面优化": [], + "🧹 代码重构": [], + "🔒 安全修复": [], + "🧪 测试相关": [], + "📦 构建系统": [], + "🔄 其他更新": [], } - + for commit in commits: - subject = commit['subject'] - + subject = commit["subject"] + # 跳过合并提交和版本发布提交 - if subject.startswith('Merge ') or subject.startswith('release:'): + if subject.startswith("Merge ") or subject.startswith("release:"): continue - + # 根据提交信息前缀分类 - if any(keyword in subject.lower() for keyword in ['feat:', 'add:', '新增', '添加']): - categories['✨ 新功能'].append(subject) - elif any(keyword in subject.lower() for keyword in ['fix:', 'bug', '修复', '问题']): - categories['🐛 问题修复'].append(subject) - elif any(keyword in subject.lower() for keyword in ['perf:', 'optim', '优化', '性能']): - categories['🔧 性能优化'].append(subject) - elif any(keyword in subject.lower() for keyword in ['docs:', 'readme', '文档']): - categories['📝 文档更新'].append(subject) - elif any(keyword in subject.lower() for keyword in ['ui:', 'style:', '界面', '样式']): - categories['🎨 界面优化'].append(subject) - elif any(keyword in subject.lower() for keyword in ['refactor:', '重构']): - categories['🧹 代码重构'].append(subject) - elif any(keyword in subject.lower() for keyword in ['security:', '安全']): - categories['🔒 安全修复'].append(subject) - elif any(keyword in subject.lower() for keyword in ['test:', '测试']): - categories['🧪 测试相关'].append(subject) - elif any(keyword in subject.lower() for keyword in ['build:', 'ci:', 'makefile', '构建']): - categories['📦 构建系统'].append(subject) + if any(keyword in subject.lower() for keyword in ["feat:", "add:", "新增", "添加"]): + categories["✨ 新功能"].append(subject) + elif any(keyword in subject.lower() for keyword in ["fix:", "bug", "修复", "问题"]): + categories["🐛 问题修复"].append(subject) + elif any(keyword in subject.lower() for keyword in ["perf:", "optim", "优化", "性能"]): + categories["🔧 性能优化"].append(subject) + elif any(keyword in subject.lower() for keyword in ["docs:", "readme", "文档"]): + categories["📝 文档更新"].append(subject) + elif any(keyword in subject.lower() for keyword in ["ui:", "style:", "界面", "样式"]): + categories["🎨 界面优化"].append(subject) + elif any(keyword in subject.lower() for keyword in ["refactor:", "重构"]): + categories["🧹 代码重构"].append(subject) + elif any(keyword in subject.lower() for keyword in ["security:", "安全"]): + categories["🔒 安全修复"].append(subject) + elif any(keyword in subject.lower() for keyword in ["test:", "测试"]): + categories["🧪 测试相关"].append(subject) + elif any(keyword in subject.lower() for keyword in ["build:", "ci:", "makefile", "构建"]): + categories["📦 构建系统"].append(subject) else: - categories['🔄 其他更新'].append(subject) - + categories["🔄 其他更新"].append(subject) + return categories def generate_changelog(version: str, previous_version: str | None = None) -> str: """生成更新日志""" - current_date = datetime.now().strftime('%Y-%m-%d') - + current_date = datetime.now().strftime("%Y-%m-%d") + # 获取提交记录 commits = get_git_commits(previous_version) categories = categorize_commits(commits) - + # 获取前端版本 try: - with open('electron-app/package.json', 'r') as f: + with open("electron-app/package.json", "r") as f: import json + package_data = json.load(f) - frontend_version = package_data['version'] + frontend_version = package_data["version"] except Exception: frontend_version = "unknown" - + # 生成 changelog changelog = f"""## 🎉 ZSim {version} Release @@ -130,7 +127,7 @@ def generate_changelog(version: str, previous_version: str | None = None) -> str ### 🚀 更新内容 """ - + # 添加各类更新 for category, items in categories.items(): if items: @@ -138,12 +135,18 @@ def generate_changelog(version: str, previous_version: str | None = None) -> str for item in items: changelog += f"- {item}\n" changelog += "\n" - + # 添加统计信息 - total_commits = len([c for c in commits if not c['subject'].startswith('Merge ') and not c['subject'].startswith('release:')]) + total_commits = len( + [ + c + for c in commits + if not c["subject"].startswith("Merge ") and not c["subject"].startswith("release:") + ] + ) changelog += "### 📊 统计信息\n" changelog += f"- 本次更新包含 {total_commits} 个提交\n" - + # 添加安装说明 changelog += f""" ### 📋 安装说明 @@ -163,62 +166,62 @@ def generate_changelog(version: str, previous_version: str | None = None) -> str --- """ - + return changelog def update_changelog_file(changelog_content: str): """更新 CHANGELOG.md 文件""" - changelog_path = Path('CHANGELOG.md') - + changelog_path = Path("CHANGELOG.md") + if changelog_path.exists(): # 读取现有内容 - with open(changelog_path, 'r', encoding='utf-8') as f: + with open(changelog_path, "r", encoding="utf-8") as f: existing_content = f.read() - + # 在开头添加新的 changelog new_content = changelog_content + "\n\n" + existing_content else: # 创建新文件 new_content = "# 📋 ZSim 更新日志\n\n" + changelog_content - + # 写入文件 - with open(changelog_path, 'w', encoding='utf-8') as f: + with open(changelog_path, "w", encoding="utf-8") as f: f.write(new_content) - + print(f"✅ 已更新 {changelog_path}") def main(): - parser = argparse.ArgumentParser(description='生成 ZSim 版本更新日志') - parser.add_argument('--version', '-v', help='指定版本号') - parser.add_argument('--previous', '-p', help='指定上一个版本号') - parser.add_argument('--output', '-o', help='输出文件路径') - parser.add_argument('--update-changelog', action='store_true', help='更新 CHANGELOG.md 文件') - + parser = argparse.ArgumentParser(description="生成 ZSim 版本更新日志") + parser.add_argument("--version", "-v", help="指定版本号") + parser.add_argument("--previous", "-p", help="指定上一个版本号") + parser.add_argument("--output", "-o", help="输出文件路径") + parser.add_argument("--update-changelog", action="store_true", help="更新 CHANGELOG.md 文件") + args = parser.parse_args() - + # 获取版本号 version = args.version or get_current_version() if version == "unknown": print("❌ 无法获取版本号,请手动指定") sys.exit(1) - + # 生成 changelog changelog_content = generate_changelog(version, args.previous) - + # 输出到文件或控制台 if args.output: - with open(args.output, 'w', encoding='utf-8') as f: + with open(args.output, "w", encoding="utf-8") as f: f.write(changelog_content) print(f"✅ 已保存到 {args.output}") else: print(changelog_content) - + # 更新 CHANGELOG.md if args.update_changelog: update_changelog_file(changelog_content) -if __name__ == '__main__': - main() \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/tests/__init__.py b/tests/__init__.py index 57510258..d63e8dac 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -"""测试模块初始化文件""" \ No newline at end of file +"""测试模块初始化文件""" diff --git a/tests/api/test_apl.py b/tests/api/test_apl.py index b760b664..03b35f06 100644 --- a/tests/api/test_apl.py +++ b/tests/api/test_apl.py @@ -4,12 +4,13 @@ """ import pytest + from zsim.api_src.models.apl import ( APLCharacterConfig, APLCharactersInfo, - APLLogicInfo, APLConfigCreateRequest, APLConfigUpdateRequest, + APLLogicInfo, ) diff --git a/tests/api/test_apl_import_export.py b/tests/api/test_apl_import_export.py index d6d12636..20964537 100644 --- a/tests/api/test_apl_import_export.py +++ b/tests/api/test_apl_import_export.py @@ -4,13 +4,15 @@ """ import os -import tomli_w +import shutil +import tempfile import tomllib + import pytest -import tempfile -import shutil +import tomli_w + from zsim.api_src.services.database.apl_db import APLDatabase -from zsim.define import DEFAULT_APL_DIR, COSTOM_APL_DIR +from zsim.define import COSTOM_APL_DIR, DEFAULT_APL_DIR class TestAPLImportExport: diff --git a/tests/api/test_enemy_config.py b/tests/api/test_enemy_config.py index b3642ead..c05a0e70 100644 --- a/tests/api/test_enemy_config.py +++ b/tests/api/test_enemy_config.py @@ -1,5 +1,6 @@ import pytest from fastapi.testclient import TestClient + from zsim.api import app from zsim.api_src.services.database.enemy_db import get_enemy_db from zsim.models.enemy.enemy_config import EnemyConfig diff --git a/tests/api/test_session_op.py b/tests/api/test_session_op.py index 2cfeb02d..7844a4f1 100644 --- a/tests/api/test_session_op.py +++ b/tests/api/test_session_op.py @@ -1,5 +1,6 @@ import pytest from fastapi.testclient import TestClient + from zsim.api import app from zsim.api_src.services.database.session_db import get_session_db from zsim.models.session.session_create import Session diff --git a/tests/api/test_uds.py b/tests/api/test_uds.py index 69c7cfea..eb93852f 100644 --- a/tests/api/test_uds.py +++ b/tests/api/test_uds.py @@ -4,13 +4,14 @@ """ import os -import sys -import time -import requests import platform import subprocess +import sys +import time from pathlib import Path +import requests + def test_uds_connection(): """测试UDS连接功能""" diff --git a/tests/conftest.py b/tests/conftest.py index cdf0d6ec..d60fd02f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,8 @@ import tempfile -import pytest from pathlib import Path +import pytest + @pytest.fixture def temp_config_dir(): diff --git a/tests/simulator/__init__.py b/tests/simulator/__init__.py index d6cb3855..7c74214d 100644 --- a/tests/simulator/__init__.py +++ b/tests/simulator/__init__.py @@ -5,8 +5,4 @@ from .test_parallel_mode import TestParallelMode from .test_queue_system import TestQueueSystem -__all__ = [ - 'TestBasicSimulator', - 'TestParallelMode', - 'TestQueueSystem' -] \ No newline at end of file +__all__ = ["TestBasicSimulator", "TestParallelMode", "TestQueueSystem"] diff --git a/tests/simulator/safe_concurrent_teams.py b/tests/simulator/safe_concurrent_teams.py index 9ab0c55e..e757082f 100644 --- a/tests/simulator/safe_concurrent_teams.py +++ b/tests/simulator/safe_concurrent_teams.py @@ -47,18 +47,10 @@ def run_simulation_in_process(common_cfg_dict, session_id, stop_tick=1000): del simulator gc.collect() - return { - "success": True, - "session_id": session_id, - "error": None - } + return {"success": True, "session_id": session_id, "error": None} except Exception as e: - return { - "success": False, - "session_id": session_id, - "error": str(e) - } + return {"success": False, "session_id": session_id, "error": str(e)} class TestSafeConcurrentTeams: @@ -95,7 +87,9 @@ async def test_teams_with_process_isolation(self): future_to_team = {} for i, (team_name, common_cfg) in enumerate(team_configs): - session_id = f"process-test-{uuid.uuid4().hex[:8]}-{team_name.replace(' ', '-')}" + session_id = ( + f"process-test-{uuid.uuid4().hex[:8]}-{team_name.replace(' ', '-')}" + ) # 创建会话 session = Session( @@ -111,10 +105,7 @@ async def test_teams_with_process_isolation(self): # 提交任务到进程池 future = executor.submit( - run_simulation_in_process, - common_cfg.model_dump(), - session_id, - 1000 + run_simulation_in_process, common_cfg.model_dump(), session_id, 1000 ) future_to_team[future] = (team_name, session_id) @@ -126,28 +117,30 @@ async def test_teams_with_process_isolation(self): if result["success"]: print(f"队伍 '{team_name}' 模拟成功") - results.append({ - "team_name": team_name, - "session_id": session_id, - "success": True - }) + results.append( + {"team_name": team_name, "session_id": session_id, "success": True} + ) else: print(f"队伍 '{team_name}' 模拟失败: {result['error']}") - results.append({ - "team_name": team_name, - "session_id": session_id, - "success": False, - "error": result["error"] - }) + results.append( + { + "team_name": team_name, + "session_id": session_id, + "success": False, + "error": result["error"], + } + ) except Exception as e: print(f"队伍 '{team_name}' 执行异常: {e}") - results.append({ - "team_name": team_name, - "session_id": session_id, - "success": False, - "error": str(e) - }) + results.append( + { + "team_name": team_name, + "session_id": session_id, + "success": False, + "error": str(e), + } + ) except Exception as e: print(f"进程池执行错误: {e}") @@ -176,8 +169,7 @@ async def test_teams_with_process_isolation(self): # 验证所有队伍都成功 assert len(successful_teams) == len(team_configs), ( - f"期望所有 {len(team_configs)} 个队伍都成功," - f"但只有 {len(successful_teams)} 个成功" + f"期望所有 {len(team_configs)} 个队伍都成功,但只有 {len(successful_teams)} 个成功" ) print(f"\n所有 {len(team_configs)} 个队伍在进程隔离环境下成功完成!") @@ -192,7 +184,7 @@ async def test_teams_sequential_with_delay(self): results = [] for i, (team_name, common_cfg) in enumerate(team_configs): - print(f"\n执行队伍 {i+1}/{len(team_configs)}: {team_name}") + print(f"\n执行队伍 {i + 1}/{len(team_configs)}: {team_name}") session_id = f"sequential-delay-{i}-{team_name.replace(' ', '-')}" @@ -200,10 +192,7 @@ async def test_teams_sequential_with_delay(self): # 使用进程隔离运行 with ProcessPoolExecutor(max_workers=1) as executor: future = executor.submit( - run_simulation_in_process, - common_cfg.model_dump(), - session_id, - 1000 + run_simulation_in_process, common_cfg.model_dump(), session_id, 1000 ) result = future.result(timeout=60) @@ -244,30 +233,27 @@ async def test_single_team_multiple_times(self): # 多次运行同一个队伍 for i in range(3): - print(f"第 {i+1} 次运行") + print(f"第 {i + 1} 次运行") session_id = f"multiple-test-{i}-{team_name.replace(' ', '-')}" try: with ProcessPoolExecutor(max_workers=1) as executor: future = executor.submit( - run_simulation_in_process, - common_cfg.model_dump(), - session_id, - 1000 + run_simulation_in_process, common_cfg.model_dump(), session_id, 1000 ) result = future.result(timeout=60) if result["success"]: - results.append(i+1) - print(f"第 {i+1} 次运行成功") + results.append(i + 1) + print(f"第 {i + 1} 次运行成功") else: - print(f"第 {i+1} 次运行失败: {result['error']}") - pytest.fail(f"第 {i+1} 次运行失败") + print(f"第 {i + 1} 次运行失败: {result['error']}") + pytest.fail(f"第 {i + 1} 次运行失败") except Exception as e: - print(f"第 {i+1} 次运行异常: {e}") + print(f"第 {i + 1} 次运行异常: {e}") raise # 延迟 diff --git a/tests/simulator/test_isolated_teams.py b/tests/simulator/test_isolated_teams.py index b1a860b3..85e290e9 100644 --- a/tests/simulator/test_isolated_teams.py +++ b/tests/simulator/test_isolated_teams.py @@ -90,12 +90,14 @@ async def test_teams_sequentially(self): # 验证结果 assert result is not None, f"队伍 '{team_name}' 模拟结果为空" - results.append({ - "team_name": team_name, - "session_id": session_id, - "duration": duration, - "success": True - }) + results.append( + { + "team_name": team_name, + "session_id": session_id, + "duration": duration, + "success": True, + } + ) print(f"=== 队伍 '{team_name}' 测试完成 ===\n") @@ -111,7 +113,9 @@ async def test_teams_sequentially(self): pass # 验证所有队伍都测试成功 - assert len(results) == len(team_configs), f"期望测试 {len(team_configs)} 个队伍,实际测试了 {len(results)} 个" + assert len(results) == len(team_configs), ( + f"期望测试 {len(team_configs)} 个队伍,实际测试了 {len(results)} 个" + ) # 输出测试结果摘要 print("\n=== 测试结果摘要 ===") @@ -137,12 +141,12 @@ async def test_single_team_isolation(self): # 多次运行同一个队伍,确保每次都是独立的 results = [] for i in range(3): - print(f"第 {i+1} 次运行队伍: {team_name}") + print(f"第 {i + 1} 次运行队伍: {team_name}") session_id = f"isolation-test-{i}-{team_name.replace(' ', '-')}" result = await self.run_single_team_simulation(team_name, common_cfg, session_id) - assert result is not None, f"第 {i+1} 次运行失败" + assert result is not None, f"第 {i + 1} 次运行失败" results.append(result) # 验证每次运行都是独立的(结果应该相似但不完全相同) diff --git a/tests/simulator/test_parallel_mode.py b/tests/simulator/test_parallel_mode.py index 4f353b1c..8d9fe92c 100644 --- a/tests/simulator/test_parallel_mode.py +++ b/tests/simulator/test_parallel_mode.py @@ -3,6 +3,7 @@ import pytest from pydantic import ValidationError + from zsim.api_src.services.sim_controller.sim_controller import SimController from zsim.models.session.session_create import Session from zsim.models.session.session_run import ( @@ -19,6 +20,7 @@ class TestParallelMode: def test_parallel_args_generation_attr_curve(self): """Test async generation of attribute curve parallel arguments.""" from ..test_simulator import TestSimulator + test_sim = TestSimulator() controller = SimController() @@ -40,6 +42,7 @@ def test_parallel_args_generation_attr_curve(self): def test_parallel_args_generation_weapon(self): """Test async generation of weapon parallel arguments.""" from ..test_simulator import TestSimulator + test_sim = TestSimulator() controller = SimController() @@ -79,6 +82,7 @@ def test_parallel_args_generation_weapon(self): def test_parallel_args_generation_edge_cases(self): """Test parallel argument generation edge cases.""" from ..test_simulator import TestSimulator + test_sim = TestSimulator() controller = SimController() @@ -109,6 +113,7 @@ def test_parallel_args_generation_edge_cases(self): def test_parallel_args_generation_invalid_mode(self): """Test parallel argument generation with invalid mode.""" from ..test_simulator import TestSimulator + test_sim = TestSimulator() controller = SimController() @@ -123,6 +128,7 @@ def test_parallel_args_generation_invalid_mode(self): def test_parallel_args_generation_missing_config(self): """Test parallel argument generation with missing configuration.""" from ..test_simulator import TestSimulator + test_sim = TestSimulator() with pytest.raises(ValidationError) as excinfo: @@ -132,4 +138,4 @@ def test_parallel_args_generation_missing_config(self): common_config=test_sim.create_test_common_config(), # Missing parallel_config ) - assert "并行模式下,parallel_config 不能为空" in str(excinfo.value) \ No newline at end of file + assert "并行模式下,parallel_config 不能为空" in str(excinfo.value) diff --git a/tests/teams/__init__.py b/tests/teams/__init__.py index 3c80db71..b3ae805a 100644 --- a/tests/teams/__init__.py +++ b/tests/teams/__init__.py @@ -13,5 +13,5 @@ "ElectricTeamConfigs", "TeamConfigBase", "TeamRegistry", - "auto_register_teams" + "auto_register_teams", ] diff --git a/tests/teams/electric_teams.py b/tests/teams/electric_teams.py index 08affce7..66de23b9 100644 --- a/tests/teams/electric_teams.py +++ b/tests/teams/electric_teams.py @@ -10,10 +10,7 @@ class ElectricTeamQingyiConfig(TeamConfigBase): """青衣雷属性队配置""" def __init__(self): - super().__init__( - team_name="青衣雷属性队", - description="青衣-丽娜-雅雷属性队伍" - ) + super().__init__(team_name="青衣雷属性队", description="青衣-丽娜-雅雷属性队伍") def create_config(self) -> CommonCfg: """创建青衣雷属性队配置""" @@ -68,11 +65,9 @@ def get_expected_characters(self) -> list: class ElectricTeamSeedZeroAnbiConfig(TeamConfigBase): """席德大安比队伍""" + def __init__(self): - super().__init__( - team_name="席德大安比队", - description="席德-大安比-扳机队伍" - ) + super().__init__(team_name="席德大安比队", description="席德-大安比-扳机队伍") # TODO:扳机的影画目前只支持到1画,不能给高! @@ -148,10 +143,7 @@ def get_seed_zeroanbi_team() -> ElectricTeamSeedZeroAnbiConfig: @staticmethod def get_all_configs() -> list: """获取所有雷属性队伍配置""" - return [ - ElectricTeamConfigs.get_qingyi_team(), - ElectricTeamConfigs.get_seed_zeroanbi_team() - ] + return [ElectricTeamConfigs.get_qingyi_team(), ElectricTeamConfigs.get_seed_zeroanbi_team()] # 自动注册 diff --git a/tests/teams/fire_teams.py b/tests/teams/fire_teams.py index 36936ee3..35a749b1 100644 --- a/tests/teams/fire_teams.py +++ b/tests/teams/fire_teams.py @@ -1,18 +1,16 @@ # -*- coding: utf-8 -*- """火属性队伍配置""" +from zsim.models.session.session_run import CharConfig, CommonCfg, EnemyConfig + from .team_configs import TeamConfigBase, TeamRegistry -from zsim.models.session.session_run import CommonCfg, CharConfig, EnemyConfig class FireTeamLighterConfig(TeamConfigBase): """莱特火属性队配置""" def __init__(self): - super().__init__( - team_name="莱特火属性队", - description="莱特-扳机-雨果火属性队伍" - ) + super().__init__(team_name="莱特火属性队", description="莱特-扳机-雨果火属性队伍") def create_config(self) -> CommonCfg: """创建莱特火属性队配置""" @@ -81,10 +79,8 @@ def get_lighter_team() -> FireTeamLighterConfig: @staticmethod def get_all_configs() -> list: """获取所有火属性队伍配置""" - return [ - FireTeamConfigs.get_lighter_team() - ] + return [FireTeamConfigs.get_lighter_team()] # 自动注册 -FireTeamConfigs.register_all() \ No newline at end of file +FireTeamConfigs.register_all() diff --git a/tests/teams/ice_teams.py b/tests/teams/ice_teams.py index 044a2d2d..e7d51085 100644 --- a/tests/teams/ice_teams.py +++ b/tests/teams/ice_teams.py @@ -10,10 +10,7 @@ class IceTeamExampleConfig(TeamConfigBase): """示例冰属性队配置""" def __init__(self): - super().__init__( - team_name="示例冰属性队", - description="角色1-角色2-角色3冰属性队伍" - ) + super().__init__(team_name="示例冰属性队", description="角色1-角色2-角色3冰属性队伍") def create_config(self) -> CommonCfg: """创建示例冰属性队配置""" @@ -82,9 +79,7 @@ def get_example_team() -> IceTeamExampleConfig: @staticmethod def get_all_configs() -> list: """获取所有冰属性队伍配置""" - return [ - IceTeamConfigs.get_example_team() - ] + return [IceTeamConfigs.get_example_team()] # # 自动注册 diff --git a/tests/teams/physical_teams.py b/tests/teams/physical_teams.py index 0e409471..a3d7f2db 100644 --- a/tests/teams/physical_teams.py +++ b/tests/teams/physical_teams.py @@ -1,18 +1,16 @@ # -*- coding: utf-8 -*- """物理队伍配置""" +from zsim.models.session.session_run import CharConfig, CommonCfg, EnemyConfig + from .team_configs import TeamConfigBase, TeamRegistry -from zsim.models.session.session_run import CommonCfg, CharConfig, EnemyConfig class PhysicalTeamVivianConfig(TeamConfigBase): """薇薇安物理队配置""" def __init__(self): - super().__init__( - team_name="薇薇安物理队", - description="薇薇安-柳-耀嘉音物理属性队伍" - ) + super().__init__(team_name="薇薇安物理队", description="薇薇安-柳-耀嘉音物理属性队伍") def create_config(self) -> CommonCfg: """创建薇薇安物理队配置""" @@ -81,10 +79,8 @@ def get_vivian_team() -> PhysicalTeamVivianConfig: @staticmethod def get_all_configs() -> list: """获取所有物理队伍配置""" - return [ - PhysicalTeamConfigs.get_vivian_team() - ] + return [PhysicalTeamConfigs.get_vivian_team()] # 自动注册 -PhysicalTeamConfigs.register_all() \ No newline at end of file +PhysicalTeamConfigs.register_all() diff --git a/tests/teams/team_configs.py b/tests/teams/team_configs.py index 8cc1a4b8..938b59cb 100644 --- a/tests/teams/team_configs.py +++ b/tests/teams/team_configs.py @@ -29,7 +29,7 @@ def get_team_info(self) -> Dict[str, Any]: return { "team_name": self.team_name, "description": self.description, - "characters": self.get_expected_characters() + "characters": self.get_expected_characters(), } @@ -74,8 +74,7 @@ def get_all_team_configs(cls) -> List[Tuple[str, CommonCfg]]: @classmethod def get_teams_by_attribute(cls, attribute: str) -> List[TeamConfigBase]: """根据属性获取团队配置""" - return [team for team in cls.get_all_teams() - if attribute.lower() in team.team_name.lower()] + return [team for team in cls.get_all_teams() if attribute.lower() in team.team_name.lower()] @classmethod def list_team_names(cls) -> List[str]: diff --git a/tests/teams/usage_example.py b/tests/teams/usage_example.py index fde09221..aa5089a3 100644 --- a/tests/teams/usage_example.py +++ b/tests/teams/usage_example.py @@ -1,10 +1,8 @@ # -*- coding: utf-8 -*- """团队配置使用示例""" -from .team_configs import TeamRegistry from .physical_teams import PhysicalTeamConfigs -from .fire_teams import FireTeamConfigs -from .electric_teams import ElectricTeamConfigs +from .team_configs import TeamRegistry def example_usage(): @@ -33,15 +31,13 @@ class ExampleNewTeamConfig: def create_new_team_config(self): """创建新队伍配置的示例""" + from zsim.models.session.session_run import CommonCfg + from .team_configs import TeamConfigBase - from zsim.models.session.session_run import CommonCfg, CharConfig, EnemyConfig class NewIceTeamConfig(TeamConfigBase): def __init__(self): - super().__init__( - team_name="冰属性新队伍", - description="冰属性队伍示例" - ) + super().__init__(team_name="冰属性新队伍", description="冰属性队伍示例") def create_config(self) -> CommonCfg: # 这里实现具体的配置逻辑 @@ -62,4 +58,4 @@ def get_expected_characters(self) -> list: if __name__ == "__main__": - example_usage() \ No newline at end of file + example_usage() diff --git a/uv.lock b/uv.lock index 210467f0..9a87e9cc 100644 --- a/uv.lock +++ b/uv.lock @@ -219,6 +219,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, ] +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.1" @@ -417,6 +426,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + [[package]] name = "dotenv" version = "0.9.9" @@ -451,6 +469,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" }, ] +[[package]] +name = "filelock" +version = "3.20.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, +] + [[package]] name = "flask" version = "3.0.3" @@ -567,6 +594,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] +[[package]] +name = "identify" +version = "2.6.15" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, +] + [[package]] name = "idna" version = "3.10" @@ -886,6 +922,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + [[package]] name = "numpy" version = "2.2.5" @@ -1101,6 +1146,22 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/21/4283323b3f07d5527d01c997bc5c15f96c98221e83b82ba70a0666fecb4c/polars-1.28.1-cp39-abi3-win_arm64.whl", hash = "sha256:35ca8ab1937e5c72496789968a53e138796e1f5156c832d52f846ef7332149d7", size = 31207900, upload-time = "2025-04-27T15:31:59.804Z" }, ] +[[package]] +name = "pre-commit" +version = "4.4.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/49/7845c2d7bf6474efd8e27905b51b11e6ce411708c91e829b93f324de9929/pre_commit-4.4.0.tar.gz", hash = "sha256:f0233ebab440e9f17cabbb558706eb173d19ace965c68cdce2c081042b4fab15", size = 197501, upload-time = "2025-11-08T21:12:11.607Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/11/574fe7d13acf30bfd0a8dd7fa1647040f2b8064f13f43e8c963b1e65093b/pre_commit-4.4.0-py2.py3-none-any.whl", hash = "sha256:b35ea52957cbf83dcc5d8ee636cbead8624e3a15fbfa61a370e42158ac8a5813", size = 226049, upload-time = "2025-11-08T21:12:10.228Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.51" @@ -1528,6 +1589,52 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + [[package]] name = "pyzmq" version = "26.4.0" @@ -1945,6 +2052,20 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, ] +[[package]] +name = "virtualenv" +version = "20.35.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/28/e6f1a6f655d620846bd9df527390ecc26b3805a0c5989048c210e22c5ca9/virtualenv-20.35.4.tar.gz", hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c", size = 6028799, upload-time = "2025-10-29T06:57:40.511Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b", size = 6005095, upload-time = "2025-10-29T06:57:37.598Z" }, +] + [[package]] name = "viztracer" version = "1.0.3" @@ -2063,6 +2184,7 @@ dev = [ { name = "isort" }, { name = "mypy" }, { name = "objprint" }, + { name = "pre-commit" }, { name = "pyinstaller" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -2106,6 +2228,7 @@ dev = [ { name = "isort", specifier = ">=7.0.0" }, { name = "mypy", specifier = ">=1.17.1" }, { name = "objprint", specifier = ">=0.3.0" }, + { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pyinstaller", specifier = ">=6.13.0" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-asyncio", specifier = ">=1.1.0" }, diff --git a/zsim/api_src/models/apl.py b/zsim/api_src/models/apl.py index f3648792..f4934d07 100644 --- a/zsim/api_src/models/apl.py +++ b/zsim/api_src/models/apl.py @@ -3,7 +3,8 @@ 定义APL API请求和响应的数据模型 """ -from typing import TypeVar, Generic +from typing import Generic, TypeVar + from pydantic import BaseModel, Field diff --git a/zsim/api_src/services/database/apl_db.py b/zsim/api_src/services/database/apl_db.py index ee90dd67..da35ba3a 100644 --- a/zsim/api_src/services/database/apl_db.py +++ b/zsim/api_src/services/database/apl_db.py @@ -21,7 +21,6 @@ class APLConfigORM(Base): - __tablename__ = "apl_configs" id: Mapped[str] = mapped_column(String(64), primary_key=True) @@ -72,9 +71,7 @@ def get_apl_config(self, config_id: str) -> dict[str, Any] | None: if not config_id or not isinstance(config_id, str): return None - return asyncio.get_event_loop().run_until_complete( - self._get_apl_config_async(config_id) - ) + return asyncio.get_event_loop().run_until_complete(self._get_apl_config_async(config_id)) async def _get_apl_config_async(self, config_id: str) -> dict[str, Any] | None: """异步获取特定APL配置。 @@ -88,9 +85,7 @@ async def _get_apl_config_async(self, config_id: str) -> dict[str, Any] | None: await self._ensure_initialized() async with get_async_session() as session: - result = await session.execute( - select(APLConfigORM).where(APLConfigORM.id == config_id) - ) + result = await session.execute(select(APLConfigORM).where(APLConfigORM.id == config_id)) record = result.scalar_one_or_none() if record is None: return None @@ -125,9 +120,7 @@ def create_apl_config(self, config_data: dict[str, Any]) -> str: ) return config_id - async def _create_apl_config_async( - self, config_id: str, config_data: dict[str, Any] - ) -> None: + async def _create_apl_config_async(self, config_id: str, config_data: dict[str, Any]) -> None: """异步创建APL配置。 Args: @@ -181,9 +174,7 @@ def update_apl_config(self, config_id: str, config_data: dict[str, Any]) -> bool self._update_apl_config_async(config_id, config_data) ) - async def _update_apl_config_async( - self, config_id: str, config_data: dict[str, Any] - ) -> bool: + async def _update_apl_config_async(self, config_id: str, config_data: dict[str, Any]) -> bool: """异步更新APL配置。 Args: @@ -196,9 +187,7 @@ async def _update_apl_config_async( await self._ensure_initialized() async with get_async_session() as session: - result = await session.execute( - select(APLConfigORM).where(APLConfigORM.id == config_id) - ) + result = await session.execute(select(APLConfigORM).where(APLConfigORM.id == config_id)) record = result.scalar_one_or_none() if record is None: return False @@ -233,9 +222,7 @@ def delete_apl_config(self, config_id: str) -> bool: if not config_id or not isinstance(config_id, str): return False - return asyncio.get_event_loop().run_until_complete( - self._delete_apl_config_async(config_id) - ) + return asyncio.get_event_loop().run_until_complete(self._delete_apl_config_async(config_id)) async def _delete_apl_config_async(self, config_id: str) -> bool: """异步删除APL配置。 @@ -249,9 +236,7 @@ async def _delete_apl_config_async(self, config_id: str) -> bool: await self._ensure_initialized() async with get_async_session() as session: - result = await session.execute( - delete(APLConfigORM).where(APLConfigORM.id == config_id) - ) + result = await session.execute(delete(APLConfigORM).where(APLConfigORM.id == config_id)) if result.rowcount == 0: await session.rollback() return False @@ -459,18 +444,14 @@ def _get_apl_from_dir(self, apl_dir: str, source_type: str) -> list[dict[str, An "author": general_info.get("author", ""), "comment": general_info.get("comment", ""), "create_time": general_info.get("create_time", ""), - "latest_change_time": general_info.get( - "latest_change_time", "" - ), + "latest_change_time": general_info.get("latest_change_time", ""), "source": source_type, "file_path": file_path, } ) return apl_list - def _get_apl_files_from_dir( - self, apl_dir: str, source_type: str - ) -> list[dict[str, Any]]: + def _get_apl_files_from_dir(self, apl_dir: str, source_type: str) -> list[dict[str, Any]]: """从指定目录获取APL文件列表。 Args: diff --git a/zsim/api_src/services/database/character_db.py b/zsim/api_src/services/database/character_db.py index ecbb3df0..90209034 100644 --- a/zsim/api_src/services/database/character_db.py +++ b/zsim/api_src/services/database/character_db.py @@ -16,7 +16,6 @@ class CharacterConfigORM(Base): - __tablename__ = "character_configs" config_id: Mapped[str] = mapped_column(String(128), primary_key=True) @@ -119,9 +118,7 @@ async def add_character_config(self, config: CharacterConfig) -> None: await session.rollback() raise exc - async def get_character_config( - self, name: str, config_name: str - ) -> CharacterConfig | None: + async def get_character_config(self, name: str, config_name: str) -> CharacterConfig | None: """根据角色名称和配置名称获取角色配置。 Args: @@ -136,9 +133,7 @@ async def get_character_config( config_id = f"{name}_{config_name}" async with get_async_session() as session: result = await session.execute( - select(CharacterConfigORM).where( - CharacterConfigORM.config_id == config_id - ) + select(CharacterConfigORM).where(CharacterConfigORM.config_id == config_id) ) record = result.scalar_one_or_none() if record is None: @@ -189,9 +184,7 @@ async def update_character_config(self, config: CharacterConfig) -> None: async with get_async_session() as session: result = await session.execute( - select(CharacterConfigORM).where( - CharacterConfigORM.config_id == config.config_id - ) + select(CharacterConfigORM).where(CharacterConfigORM.config_id == config.config_id) ) record = result.scalar_one_or_none() if record is None: @@ -241,9 +234,7 @@ async def delete_character_config(self, name: str, config_name: str) -> None: config_id = f"{name}_{config_name}" async with get_async_session() as session: await session.execute( - delete(CharacterConfigORM).where( - CharacterConfigORM.config_id == config_id - ) + delete(CharacterConfigORM).where(CharacterConfigORM.config_id == config_id) ) await session.commit() diff --git a/zsim/api_src/services/database/enemy_db.py b/zsim/api_src/services/database/enemy_db.py index bf9adb05..4bf006c4 100644 --- a/zsim/api_src/services/database/enemy_db.py +++ b/zsim/api_src/services/database/enemy_db.py @@ -16,7 +16,6 @@ class EnemyConfigORM(Base): - __tablename__ = "enemy_configs" config_id: Mapped[str] = mapped_column(String(128), primary_key=True) @@ -109,9 +108,7 @@ async def update_enemy_config(self, config: EnemyConfig) -> None: config.update_time = datetime.now() async with get_async_session() as session: result = await session.execute( - select(EnemyConfigORM).where( - EnemyConfigORM.config_id == config.config_id - ) + select(EnemyConfigORM).where(EnemyConfigORM.config_id == config.config_id) ) record = result.scalar_one_or_none() if record is None: diff --git a/zsim/api_src/services/database/session_db.py b/zsim/api_src/services/database/session_db.py index 8e169d48..31df0bd7 100644 --- a/zsim/api_src/services/database/session_db.py +++ b/zsim/api_src/services/database/session_db.py @@ -69,12 +69,7 @@ async def add_session(self, session_data: Session) -> None: else None ), session_result=( - json.dumps( - [ - result.model_dump() - for result in session_data.session_result - ] - ) + json.dumps([result.model_dump() for result in session_data.session_result]) if session_data.session_result else None ), @@ -109,9 +104,7 @@ async def get_session(self, session_id: str) -> Session | None: session_name=record.session_name, create_time=datetime.fromisoformat(record.create_time), status=record.status, - session_run=( - json.loads(record.session_run) if record.session_run else None - ), + session_run=(json.loads(record.session_run) if record.session_run else None), session_result=( json.loads(record.session_result) if record.session_result else None ), @@ -130,9 +123,7 @@ async def update_session(self, session_data: Session) -> None: await self._init_db() async with get_async_session() as session: result = await session.execute( - select(SessionORM).where( - SessionORM.session_id == session_data.session_id - ) + select(SessionORM).where(SessionORM.session_id == session_data.session_id) ) record = result.scalar_one_or_none() if record is None: @@ -146,9 +137,7 @@ async def update_session(self, session_data: Session) -> None: else None ) record.session_result = ( - json.dumps( - [result.model_dump() for result in session_data.session_result] - ) + json.dumps([result.model_dump() for result in session_data.session_result]) if session_data.session_result else None ) @@ -168,9 +157,7 @@ async def delete_session(self, session_id: str) -> None: await self._init_db() async with get_async_session() as session: - await session.execute( - delete(SessionORM).where(SessionORM.session_id == session_id) - ) + await session.execute(delete(SessionORM).where(SessionORM.session_id == session_id)) await session.commit() async def list_sessions(self) -> list[Session]: @@ -192,9 +179,7 @@ async def list_sessions(self) -> list[Session]: session_name=record.session_name, create_time=datetime.fromisoformat(record.create_time), status=record.status, - session_run=( - json.loads(record.session_run) if record.session_run else None - ), + session_run=(json.loads(record.session_run) if record.session_run else None), session_result=( json.loads(record.session_result) if record.session_result else None ), diff --git a/zsim/api_src/services/sim_controller/sim_controller.py b/zsim/api_src/services/sim_controller/sim_controller.py index 7d09a992..16d29366 100644 --- a/zsim/api_src/services/sim_controller/sim_controller.py +++ b/zsim/api_src/services/sim_controller/sim_controller.py @@ -144,27 +144,21 @@ async def execute_simulation(self) -> None: else session.session_run.stop_tick ) if stop_tick is None: - logger.warning( - f"会话 {session_id} 未设置 stop_tick,使用默认值 3600" - ) + logger.warning(f"会话 {session_id} 未设置 stop_tick,使用默认值 3600") stop_tick = 3600 def run_simulator( _common_cfg: CommonCfg, _sim_cfg: SimCfg | None, _stop_tick: int ) -> "Confirmation": simulator = Simulator() - return simulator.api_run_simulator( - _common_cfg, _sim_cfg, _stop_tick - ) + return simulator.api_run_simulator(_common_cfg, _sim_cfg, _stop_tick) # 创建模拟器实例并提交任务 future: asyncio.Future["Confirmation"] = event_loop.run_in_executor( self.executor, run_simulator, common_cfg, sim_cfg, stop_tick ) self._running_tasks.add(future) - future.add_done_callback( - lambda f: self._task_done_callback(f, session_id) - ) + future.add_done_callback(lambda f: self._task_done_callback(f, session_id)) # 让出控制权给其他协程 await asyncio.sleep(0) @@ -207,18 +201,14 @@ async def execute_simulation_test(self, max_tasks: int = 1) -> list[str]: else session.session_run.stop_tick ) if stop_tick is None: - logger.warning( - f"会话 {session_id} 未设置 stop_tick,使用默认值 3600" - ) + logger.warning(f"会话 {session_id} 未设置 stop_tick,使用默认值 3600") stop_tick = 3600 def run_simulator( _common_cfg: CommonCfg, _sim_cfg: SimCfg | None, _stop_tick: int ) -> "Confirmation": simulator = Simulator() - return simulator.api_run_simulator( - _common_cfg, _sim_cfg, _stop_tick - ) + return simulator.api_run_simulator(_common_cfg, _sim_cfg, _stop_tick) # 使用 ThreadPoolExecutor 避免序列化问题 with ThreadPoolExecutor() as thread_executor: @@ -366,9 +356,7 @@ def _run_simulator() -> "Confirmation": else: return await loop.run_in_executor(self.executor, _run_simulator) - def _task_done_callback( - self, future: asyncio.Future["Confirmation"], session_id: str - ) -> None: + def _task_done_callback(self, future: asyncio.Future["Confirmation"], session_id: str) -> None: """ 任务完成时的回调函数。 @@ -397,9 +385,9 @@ async def _update_session_status( # 处理模拟结果确认信息 if isinstance(result, dict) and "run_turn_uuid" in result: - processed_result: NormalModeResult | ParallelModeResult = ( - await self._process_simulation_result(result) - ) + processed_result: ( + NormalModeResult | ParallelModeResult + ) = await self._process_simulation_result(result) try: session.session_result = [processed_result] except Exception as e: @@ -525,13 +513,9 @@ def generate_parallel_args( func_cfg = parallel_cfg.func_config if func == "attr_curve" and isinstance(func_cfg, ParallelCfg.AttrCurveConfig): - yield from self._generate_attr_curve_args( - func_cfg, parallel_cfg, stop_tick, session_id - ) + yield from self._generate_attr_curve_args(func_cfg, parallel_cfg, stop_tick, session_id) elif func == "weapon" and isinstance(func_cfg, ParallelCfg.WeaponConfig): - yield from self._generate_weapon_args( - func_cfg, parallel_cfg, stop_tick, session_id - ) + yield from self._generate_weapon_args(func_cfg, parallel_cfg, stop_tick, session_id) else: error_msg = f"未知的func类型: {func}, 完整配置: {parallel_cfg}" logger.error(error_msg) diff --git a/zsim/data/csv_excel_sync.py b/zsim/data/csv_excel_sync.py index c7995329..ad5ebb93 100644 --- a/zsim/data/csv_excel_sync.py +++ b/zsim/data/csv_excel_sync.py @@ -1,7 +1,8 @@ -import pandas as pd import os import sys +import pandas as pd + def import_csv_to_excel(csv_file, sheet_name, writer): """将CSV文件导入到Excel工作表中""" diff --git a/zsim/data/str_to_num.py b/zsim/data/str_to_num.py index 9c246ee6..796bc8f4 100644 --- a/zsim/data/str_to_num.py +++ b/zsim/data/str_to_num.py @@ -1,8 +1,9 @@ -import os import csv -from tqdm import tqdm +import os from decimal import Decimal +from tqdm import tqdm + """ 用于将./data 目录下的csv重整 """ diff --git a/zsim/define.py b/zsim/define.py index fcb0275c..4345a207 100644 --- a/zsim/define.py +++ b/zsim/define.py @@ -34,7 +34,6 @@ saved_char_config = {} - # 修复:将char_config_file作为参数传递给initialize_config_files def initialize_config_files_with_paths(char_file, data_dir, config_path): """ diff --git a/zsim/lib_webui/clean_results_cache.py b/zsim/lib_webui/clean_results_cache.py index bd655147..5755671f 100644 --- a/zsim/lib_webui/clean_results_cache.py +++ b/zsim/lib_webui/clean_results_cache.py @@ -6,7 +6,7 @@ except ModuleNotFoundError: pass -from .constants import results_dir, IDDuplicateError +from .constants import IDDuplicateError, results_dir # 获取合法的结果缓存 diff --git a/zsim/lib_webui/constants.py b/zsim/lib_webui/constants.py index 0cac3b7b..61637803 100644 --- a/zsim/lib_webui/constants.py +++ b/zsim/lib_webui/constants.py @@ -71,7 +71,7 @@ def _init_skill_tag_mapping() -> dict[str, str]: return { _tag: f"{_text if _text else ''}{f' - {_instruction}' if _instruction else ''}" for _tag, _text, _instruction in zip( - mapping["skill_tag"], mapping["skill_text"], mapping["INSTRUCTION"] + mapping["skill_tag"], mapping["skill_text"], mapping["INSTRUCTION"], strict=False ) } except Exception as e: @@ -88,7 +88,7 @@ def _init_char_mapping() -> dict[str, str]: try: df = pl.scan_csv("./zsim/data/character.csv") mapping = df.select(["name", "CID"]).collect().to_dict(as_series=False) - return {name: str(cid) for name, cid in zip(mapping["name"], mapping["CID"])} + return {name: str(cid) for name, cid in zip(mapping["name"], mapping["CID"], strict=False)} except Exception as e: print(f"Warning: Failed to load character mapping: {e}") return {} diff --git a/zsim/lib_webui/doc_pages/page_apl_doc.py b/zsim/lib_webui/doc_pages/page_apl_doc.py index 28e534c2..b984295f 100644 --- a/zsim/lib_webui/doc_pages/page_apl_doc.py +++ b/zsim/lib_webui/doc_pages/page_apl_doc.py @@ -1,5 +1,7 @@ import os + import streamlit as st + from zsim.define import DOCS_DIR diff --git a/zsim/lib_webui/doc_pages/page_char_support.py b/zsim/lib_webui/doc_pages/page_char_support.py index f51705de..ab1bd485 100644 --- a/zsim/lib_webui/doc_pages/page_char_support.py +++ b/zsim/lib_webui/doc_pages/page_char_support.py @@ -2,6 +2,7 @@ import polars as pl import streamlit as st + from zsim.define import DOCS_DIR diff --git a/zsim/lib_webui/doc_pages/page_contribution.py b/zsim/lib_webui/doc_pages/page_contribution.py index 1c0bafaf..0f21fdd4 100644 --- a/zsim/lib_webui/doc_pages/page_contribution.py +++ b/zsim/lib_webui/doc_pages/page_contribution.py @@ -1,5 +1,7 @@ import os + import streamlit as st + from zsim.define import DOCS_DIR diff --git a/zsim/lib_webui/process_apl_editor.py b/zsim/lib_webui/process_apl_editor.py index fc1954ad..4f614101 100644 --- a/zsim/lib_webui/process_apl_editor.py +++ b/zsim/lib_webui/process_apl_editor.py @@ -1,12 +1,12 @@ import copy import os import time +import tomllib from typing import Any, Sequence import pandas as pd import streamlit as st import tomli_w -import tomllib from streamlit_ace import st_ace from zsim.define import ( diff --git a/zsim/lib_webui/process_buff_result.py b/zsim/lib_webui/process_buff_result.py index 30c389d7..3361850b 100644 --- a/zsim/lib_webui/process_buff_result.py +++ b/zsim/lib_webui/process_buff_result.py @@ -1,14 +1,16 @@ +import asyncio import json import os -import asyncio -import aiofiles -import aiofiles.os from typing import Any -import polars as pl +import aiofiles +import aiofiles.os import plotly.graph_objects as go +import polars as pl import streamlit as st + from zsim.define import results_dir + from .constants import BUFF_EFFECT_MAPPING diff --git a/zsim/lib_webui/process_char_config.py b/zsim/lib_webui/process_char_config.py index 63facdd1..4e59a012 100644 --- a/zsim/lib_webui/process_char_config.py +++ b/zsim/lib_webui/process_char_config.py @@ -1,7 +1,8 @@ import streamlit as st + from zsim.define import saved_char_config -from zsim.sim_progress.Character import character_factory from zsim.models.session.session_run import CharConfig +from zsim.sim_progress.Character import character_factory def display_character_panels(name_box: list[str], use_columns: bool = True) -> None: diff --git a/zsim/lib_webui/process_dmg_result.py b/zsim/lib_webui/process_dmg_result.py index 5a2d9506..a90d6e5d 100644 --- a/zsim/lib_webui/process_dmg_result.py +++ b/zsim/lib_webui/process_dmg_result.py @@ -4,10 +4,11 @@ import plotly.express as px import polars as pl import streamlit as st + from zsim.define import ANOMALY_MAPPING from zsim.sim_progress.Character.skill_class import lookup_name_or_cid -from .constants import element_mapping, results_dir, SKILL_TAG_MAPPING +from .constants import SKILL_TAG_MAPPING, element_mapping, results_dir def _load_dmg_data(rid: int | str) -> pl.DataFrame | None: @@ -417,7 +418,7 @@ def _find_consecutive_true_ranges(df: pl.DataFrame, column: str) -> list[tuple[i ticks = df["tick"].to_list() values = df[column].to_list() - for i, (tick, value) in enumerate(zip(ticks, values)): + for i, (tick, value) in enumerate(zip(ticks, values, strict=False)): if value: if start is None: start = tick diff --git a/zsim/lib_webui/process_parallel_data.py b/zsim/lib_webui/process_parallel_data.py index ef3d54a2..fead9bdd 100644 --- a/zsim/lib_webui/process_parallel_data.py +++ b/zsim/lib_webui/process_parallel_data.py @@ -14,11 +14,11 @@ from zsim.define import results_dir from zsim.lib_webui.process_buff_result import show_buff_result from zsim.lib_webui.process_dmg_result import show_dmg_result - -from .constants import stats_trans_mapping from zsim.utils.process_buff_result import prepare_buff_data_and_cache from zsim.utils.process_dmg_result import prepare_dmg_data_and_cache +from .constants import stats_trans_mapping + reversed_stats_trans_mapping = {v: k for k, v in stats_trans_mapping.items()} diff --git a/zsim/lib_webui/process_simulator.py b/zsim/lib_webui/process_simulator.py index d71e6341..65ada8ef 100644 --- a/zsim/lib_webui/process_simulator.py +++ b/zsim/lib_webui/process_simulator.py @@ -1,7 +1,8 @@ import json -from typing import Any, Iterator -import shutil import os +import shutil +from typing import Any, Iterator + import polars as pl import streamlit as st diff --git a/zsim/models/character/character_config.py b/zsim/models/character/character_config.py index 161053d1..597e6ea5 100644 --- a/zsim/models/character/character_config.py +++ b/zsim/models/character/character_config.py @@ -1,5 +1,6 @@ from datetime import datetime from typing import Optional + from pydantic import BaseModel, Field diff --git a/zsim/models/enemy/enemy_config.py b/zsim/models/enemy/enemy_config.py index 17f6ae55..efb342ed 100644 --- a/zsim/models/enemy/enemy_config.py +++ b/zsim/models/enemy/enemy_config.py @@ -1,5 +1,6 @@ from datetime import datetime -from typing import Dict, Any +from typing import Any, Dict + from pydantic import BaseModel, Field diff --git a/zsim/models/event_enums.py b/zsim/models/event_enums.py index ded8ac53..e4f813f1 100644 --- a/zsim/models/event_enums.py +++ b/zsim/models/event_enums.py @@ -32,8 +32,10 @@ class ListenerBroadcastSignal(Enum): STUN = "stun_event" # 失衡事件 PARRY = "parry_event" # 招架事件 BLOCK = "block_event" # 格挡事件(其他具备格挡功能的技能响应进攻事件) - DISORDER_SPAWN = "disorder_event_spawn" # 紊乱事件产生 - DISORDER_SETTLED = "disorder_event_settled" # 紊乱事件结算 - ASSAULT_STATE_ON = "assistant_state_on" # 畏缩状态上升沿或者刷新——等价于“队伍中任意角色对敌人施加物理异常状态” - ASSAULT_SPAWN = "assault_spawn" # 强击触发 - POLARIZED_ASSAULT_SPAWN = "polarized_assault" # 极性强击触发 + DISORDER_SPAWN = "disorder_event_spawn" # 紊乱事件产生 + DISORDER_SETTLED = "disorder_event_settled" # 紊乱事件结算 + ASSAULT_STATE_ON = ( + "assistant_state_on" # 畏缩状态上升沿或者刷新——等价于“队伍中任意角色对敌人施加物理异常状态” + ) + ASSAULT_SPAWN = "assault_spawn" # 强击触发 + POLARIZED_ASSAULT_SPAWN = "polarized_assault" # 极性强击触发 diff --git a/zsim/models/session/session_create.py b/zsim/models/session/session_create.py index a8eac846..44fbeaf1 100644 --- a/zsim/models/session/session_create.py +++ b/zsim/models/session/session_create.py @@ -4,8 +4,8 @@ from pydantic import BaseModel, Field -from .session_run import SessionRun from .session_result import NormalModeResult, ParallelModeResult +from .session_run import SessionRun def generate_session_id() -> str: diff --git a/zsim/models/session/session_result.py b/zsim/models/session/session_result.py index 3e1773a6..650f21aa 100644 --- a/zsim/models/session/session_result.py +++ b/zsim/models/session/session_result.py @@ -2,7 +2,6 @@ from pydantic import BaseModel, Field, RootModel - # --- Payloads for different result types --- diff --git a/zsim/page_character_config.py b/zsim/page_character_config.py index 290b2edd..da0927e4 100644 --- a/zsim/page_character_config.py +++ b/zsim/page_character_config.py @@ -10,14 +10,14 @@ def page_character_config(): if "name_box" in saved_char_config: default_chars = saved_char_config["name_box"] from zsim.lib_webui.constants import ( + char_profession_map, equip_set2_options, equip_set4_options, + profession_chars_map, + weapon_char_map, weapon_options, weapon_profession_map, weapon_rarity_map, - weapon_char_map, - char_profession_map, - profession_chars_map, ) col0, col1, col2, col3, col4, col5, col6, col7 = st.columns([1, 1, 1, 1, 1, 1, 1, 1]) diff --git a/zsim/script/APLSpawner/Spawner.py b/zsim/script/APLSpawner/Spawner.py index bfd40358..3d4430fe 100644 --- a/zsim/script/APLSpawner/Spawner.py +++ b/zsim/script/APLSpawner/Spawner.py @@ -1,14 +1,17 @@ import dash -from dash import Dash, dcc, html, Output, Input import dash_bootstrap_components as dbc import pandas as pd +from dash import Dash, Input, Output, dcc, html + from zsim.define import CHARACTER_DATA_PATH # 初始化角色数据 char_data = pd.read_csv(CHARACTER_DATA_PATH) full_char_name_list = char_data["name"].tolist() full_char_cid_list = char_data["CID"].tolist() -full_char_dict = {name: cid for name, cid in zip(full_char_name_list, full_char_cid_list)} +full_char_dict = { + name: cid for name, cid in zip(full_char_name_list, full_char_cid_list, strict=False) +} class Spawner: diff --git a/zsim/script/draw_anomaly_timeline.py b/zsim/script/draw_anomaly_timeline.py index d5ed7218..6ac4c40a 100644 --- a/zsim/script/draw_anomaly_timeline.py +++ b/zsim/script/draw_anomaly_timeline.py @@ -41,7 +41,7 @@ def find_consecutive_true_ranges(df, column): ticks = df["tick"].tolist() values = df[column].tolist() - for i, (tick, value) in enumerate(zip(ticks, values)): + for i, (tick, value) in enumerate(zip(ticks, values, strict=False)): if value: if start is None: start = tick diff --git a/zsim/setup.py b/zsim/setup.py index 08ece1e9..8f0d723a 100644 --- a/zsim/setup.py +++ b/zsim/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, Extension +from setuptools import Extension, setup module_LinkedList = Extension( "sim_progress.data_struct.LinkedList", diff --git a/zsim/sim_progress/Buff/Buff0Manager/Buff0ManagerClass.py b/zsim/sim_progress/Buff/Buff0Manager/Buff0ManagerClass.py index 45742cc7..c832d629 100644 --- a/zsim/sim_progress/Buff/Buff0Manager/Buff0ManagerClass.py +++ b/zsim/sim_progress/Buff/Buff0Manager/Buff0ManagerClass.py @@ -94,7 +94,9 @@ def initialize_buff_listener(self): else self.sim_instance.schedule_data.enemy ) self.sim_instance.listener_manager.listener_factory( - listener_owner=_obj, initiate_signal=_buff_0.ft.listener_id, sim_instance=self.sim_instance + listener_owner=_obj, + initiate_signal=_buff_0.ft.listener_id, + sim_instance=self.sim_instance, ) def __process_label(self): diff --git a/zsim/sim_progress/Buff/BuffAddStrategy.py b/zsim/sim_progress/Buff/BuffAddStrategy.py index e44f6b8c..d2174877 100644 --- a/zsim/sim_progress/Buff/BuffAddStrategy.py +++ b/zsim/sim_progress/Buff/BuffAddStrategy.py @@ -3,8 +3,8 @@ from .buff_class import Buff if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.Enemy import Enemy + from zsim.simulator.simulator_class import Simulator def _buff_filter(*args, **kwargs): @@ -56,26 +56,32 @@ def buff_add_strategy( for buff_name in buff_name_list: # FIXME: 这里可能存在Bug,指定受益人(benifit_list)可能与自动查找的逻辑冲突。 - selected_characters = confirm_selected_character(exist_buff_dict, buff_name, all_name_order_box, benifit_list) + selected_characters = confirm_selected_character( + exist_buff_dict, buff_name, all_name_order_box, benifit_list + ) if selected_characters is None: - print(f"【BuffAddStrategy警告】并未找到适用于{buff_name}的受益人!本次Buff添加将被跳过!") + print( + f"【BuffAddStrategy警告】并未找到适用于{buff_name}的受益人!本次Buff添加将被跳过!" + ) continue # 针对每位受益人,都执行一次Buff添加 for names in selected_characters: - let_buff_start(DYNAMIC_BUFF_DICT, buff_name, enemy, exist_buff_dict, names, specified_count, tick) + let_buff_start( + DYNAMIC_BUFF_DICT, buff_name, enemy, exist_buff_dict, names, specified_count, tick + ) # __check_buff_add_result(buff_name, selected_characters, exist_buff_dict, DYNAMIC_BUFF_DICT, sim_instance) def let_buff_start( - DYNAMIC_BUFF_DICT: dict[str, list[Buff]], - buff_name: str, - enemy: "Enemy", - exist_buff_dict: dict[str, dict[str, Buff]], - names: str, - specified_count: int, - tick: int - ): + DYNAMIC_BUFF_DICT: dict[str, list[Buff]], + buff_name: str, + enemy: "Enemy", + exist_buff_dict: dict[str, dict[str, Buff]], + names: str, + specified_count: int, + tick: int, +): """ 这个函数是buff_add_strategy函数的添加Buff的核心业务函数。 Args: @@ -88,6 +94,7 @@ def let_buff_start( tick: int: 当前时间 """ from copy import deepcopy + # 对于不同的Buff受益人,sub_exist_buff_dict是不同的,需要重新获取 sub_exist_buff_dict = exist_buff_dict[names] copyed_buff = sub_exist_buff_dict[buff_name] @@ -153,7 +160,12 @@ def get_selected_character(adding_buff_code, all_name_order_box, copyed_buff): return selected_characters -def confirm_selected_character(exist_buff_dict: dict[str, dict[str, Buff]], buff_name: str, all_name_order_box: dict[str, list[str]], benifit_list: list[str] = None) -> list[str] | None: +def confirm_selected_character( + exist_buff_dict: dict[str, dict[str, Buff]], + buff_name: str, + all_name_order_box: dict[str, list[str]], + benifit_list: list[str] = None, +) -> list[str] | None: """ 确认选中的角色是否存在。 Args: @@ -163,7 +175,6 @@ def confirm_selected_character(exist_buff_dict: dict[str, dict[str, Buff]], buff benifit_list: list[str]: 外部制定的受益者名单 """ for char_name, sub_dict in exist_buff_dict.items(): - # 首先判断Buff是否在当前检查角色(char_name)的收益列表中 if buff_name not in sub_dict: continue @@ -182,7 +193,13 @@ def confirm_selected_character(exist_buff_dict: dict[str, dict[str, Buff]], buff return None -def __check_buff_add_result(buff_name: str, selected_characters: list[str], exist_buff_dict: dict[str, dict[str, Buff]], DYNAMIC_BUFF_DICT: dict[str, list[Buff]], sim_instance: "Simulator"): +def __check_buff_add_result( + buff_name: str, + selected_characters: list[str], + exist_buff_dict: dict[str, dict[str, Buff]], + DYNAMIC_BUFF_DICT: dict[str, list[Buff]], + sim_instance: "Simulator", +): """ 检查Buff添加结果是否符合预期。 Args: @@ -198,9 +215,15 @@ def __check_buff_add_result(buff_name: str, selected_characters: list[str], exis assert isinstance(buffs, Buff) buff_0 = exist_buff_dict[char_name][buffs.ft.index] if buffs.ft.index == buff_name: - if all([buffs.dy.startticks == buff_0.dy.startticks, + if all( + [ + buffs.dy.startticks == buff_0.dy.startticks, buffs.dy.endticks == buff_0.dy.endticks, - buffs.dy.count == buff_0.dy.count]): - print(f"【BuffAddStrategy检查】{tick}tick:{char_name}成功添加了{buff_name}, 其层数为{buffs.dy.count},{buffs.dy.startticks} - {buffs.dy.endticks}") + buffs.dy.count == buff_0.dy.count, + ] + ): + print( + f"【BuffAddStrategy检查】{tick}tick:{char_name}成功添加了{buff_name}, 其层数为{buffs.dy.count},{buffs.dy.startticks} - {buffs.dy.endticks}" + ) return print(f"【BuffAddStrategy检查】{tick}tick:{char_name}未添加{buff_name}") diff --git a/zsim/sim_progress/Buff/BuffLoad.py b/zsim/sim_progress/Buff/BuffLoad.py index cc35fcdc..f56eee58 100644 --- a/zsim/sim_progress/Buff/BuffLoad.py +++ b/zsim/sim_progress/Buff/BuffLoad.py @@ -361,7 +361,9 @@ def save_cache_and_return(result: bool, *, cache=cache): all_match = simple_string_judge(judge_condition_dict, skill_now) else: try: - all_match = buff_now.logic.xjudge(loading_mission=mission, skill_node=mission.mission_node) + all_match = buff_now.logic.xjudge( + loading_mission=mission, skill_node=mission.mission_node + ) except TypeError: raise TypeError(f"{buff_now.ft.index}的xjudge方法参数错误!") result = all_match diff --git a/zsim/sim_progress/Buff/BuffXLogic/AliceCinema6Trigger.py b/zsim/sim_progress/Buff/BuffXLogic/AliceCinema6Trigger.py index 1087b1b7..9fc83405 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/AliceCinema6Trigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/AliceCinema6Trigger.py @@ -1,6 +1,7 @@ +from typing import TYPE_CHECKING + from .. import Buff, JudgeTools, check_preparation from ._buff_record_base_class import BuffRecordBaseClass as BRBC -from typing import TYPE_CHECKING if TYPE_CHECKING: pass @@ -48,6 +49,7 @@ def special_judge_logic(self, **kwargs): if skill_node is None: return False from zsim.sim_progress.Preload import SkillNode + assert isinstance(skill_node, SkillNode), "skill_node必须为SkillNode类型" # 首先过滤掉自己的技能 if skill_node.char_name == self.record.char.NAME: diff --git a/zsim/sim_progress/Buff/BuffXLogic/AlicePolarizedAssaultTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/AlicePolarizedAssaultTrigger.py index 0ddf6639..81c319b1 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/AlicePolarizedAssaultTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/AlicePolarizedAssaultTrigger.py @@ -1,18 +1,22 @@ -from .. import Buff, JudgeTools, check_preparation -from define import ALICE_REPORT from copy import deepcopy + +from define import ALICE_REPORT + from zsim.sim_progress.Preload import SkillNode +from .. import Buff, JudgeTools, check_preparation + class AlicePolarizedAssaultTriggerRecord: def __init__(self): self.char = None - self.allowed_skill_tag_list: list[str] = ["1401_SNA_3", "1401_Q"] # 合法的极性强击触发源 + self.allowed_skill_tag_list: list[str] = ["1401_SNA_3", "1401_Q"] # 合法的极性强击触发源 self.trigger_origin: "SkillNode | None" = None class AlicePolarizedAssaultTrigger(Buff.BuffLogic): """爱丽丝的极性强击触发器""" + def __init__(self, buff_instance): super().__init__(buff_instance) self.buff_instance: Buff = buff_instance @@ -52,7 +56,9 @@ def special_judge_logic(self, **kwargs) -> bool: return False if self.record.trigger_origin is not None: - raise ValueError(f"【极性强击触发器警告】存在尚未处理的触发源{self.record.trigger_origin.skill_tag}") + raise ValueError( + f"【极性强击触发器警告】存在尚未处理的触发源{self.record.trigger_origin.skill_tag}" + ) self.record.trigger_origin = skill_node # print(f"【测试】当前时间{tick},{skill_node.skill_tag}即将通过判定。preload_tick: {skill_node.preload_tick}, end_tick: {skill_node.end_tick},tick_list: {skill_node.tick_list}") return True @@ -62,6 +68,7 @@ def special_effect_logic(self, **kwargs): self.check_record_module() self.get_prepared(char_CID=1401) from zsim.sim_progress.data_struct import PolarizedAssaultEvent + sim_instance = self.buff_instance.sim_instance tick = sim_instance.tick enemy = sim_instance.schedule_data.enemy @@ -71,10 +78,13 @@ def special_effect_logic(self, **kwargs): execute_tick=tick, anomlay_bar=copyed_anomaly_bar, char_instance=self.record.char, - skill_node=self.record.trigger_origin) + skill_node=self.record.trigger_origin, + ) event_list = sim_instance.schedule_data.event_list event_list.append(event) if ALICE_REPORT: sim_instance.schedule_data.change_process_state() - print(f"【爱丽丝事件】{self.record.trigger_origin.skill.skill_text} 最后一Hit命中,创建了一个极性强击事件!") + print( + f"【爱丽丝事件】{self.record.trigger_origin.skill.skill_text} 最后一Hit命中,创建了一个极性强击事件!" + ) self.record.trigger_origin = None diff --git a/zsim/sim_progress/Buff/BuffXLogic/AnomalyDebuffExitJudge.py b/zsim/sim_progress/Buff/BuffXLogic/AnomalyDebuffExitJudge.py index fe2bea36..ae578948 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/AnomalyDebuffExitJudge.py +++ b/zsim/sim_progress/Buff/BuffXLogic/AnomalyDebuffExitJudge.py @@ -1,6 +1,5 @@ from .. import Buff, JudgeTools - anomaly_statement_dict = { "Buff-异常-霜寒": "frostbite", "Buff-异常-畏缩": "assault", diff --git a/zsim/sim_progress/Buff/BuffXLogic/AstraYaoChordManagerTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/AstraYaoChordManagerTrigger.py index fdfd556d..599a4401 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/AstraYaoChordManagerTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/AstraYaoChordManagerTrigger.py @@ -1,6 +1,7 @@ -from .. import Buff, JudgeTools, check_preparation, find_tick from zsim.define import ASTRAYAO_REPORT +from .. import Buff, JudgeTools, check_preparation, find_tick + class AstraYaoChordManagerTriggerRecord: def __init__(self): diff --git a/zsim/sim_progress/Buff/BuffXLogic/AstralVoice.py b/zsim/sim_progress/Buff/BuffXLogic/AstralVoice.py index eeca1a41..9bec5399 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/AstralVoice.py +++ b/zsim/sim_progress/Buff/BuffXLogic/AstralVoice.py @@ -67,8 +67,8 @@ def special_judge_logic(self, **kwargs): skill_node = kwargs.get("skill_node", None) if skill_node is None: return False - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode if isinstance(skill_node, SkillNode): pass diff --git a/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaCritRateBonus.py b/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaCritRateBonus.py index fd3436ae..594a3ce6 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaCritRateBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaCritRateBonus.py @@ -34,4 +34,4 @@ def check_record_module(self): def special_judge_logic(self, **kwargs): self.check_record_module() - self.get_prepared(equipper="机巧心种") \ No newline at end of file + self.get_prepared(equipper="机巧心种") diff --git a/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaEleDmgBonus.py b/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaEleDmgBonus.py index d31911d8..c27ea56f 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaEleDmgBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaEleDmgBonus.py @@ -40,6 +40,7 @@ def special_judge_logic(self, **kwargs): assert self.record is not None skill_node = kwargs.get("skill_node", None) from zsim.sim_progress.Preload import SkillNode + assert isinstance(skill_node, SkillNode) # 首先筛选掉没有佩戴机巧心种的角色的技能 if skill_node.char_name != self.record.char.NAME: diff --git a/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaSNAAndQIgnoreDefense.py b/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaSNAAndQIgnoreDefense.py index 57e3e8b1..5d548c25 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaSNAAndQIgnoreDefense.py +++ b/zsim/sim_progress/Buff/BuffXLogic/CordisGerminaSNAAndQIgnoreDefense.py @@ -46,5 +46,3 @@ def special_exit_logic(self, **kwargs): self.check_record_module() self.get_prepared(equipper="机巧心种", trigger_buff_0=("equipper", "机巧心种-电属性增伤")) return not self.xjudge - - diff --git a/zsim/sim_progress/Buff/BuffXLogic/DawnsBloom4SetTriggerNADmgBonus.py b/zsim/sim_progress/Buff/BuffXLogic/DawnsBloom4SetTriggerNADmgBonus.py index 17d54a4a..3d2f316b 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/DawnsBloom4SetTriggerNADmgBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/DawnsBloom4SetTriggerNADmgBonus.py @@ -45,6 +45,7 @@ def special_judge_logic(self, **kwargs): if skill_node is None: return False from zsim.sim_progress.Preload import SkillNode + assert isinstance(skill_node, SkillNode) # 筛选掉不是强化E和大招的技能 if skill_node.skill.trigger_buff_level not in [2, 6]: diff --git a/zsim/sim_progress/Buff/BuffXLogic/FlamemakerShakerDmgBonus.py b/zsim/sim_progress/Buff/BuffXLogic/FlamemakerShakerDmgBonus.py index 0e983245..6cc82d9f 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/FlamemakerShakerDmgBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/FlamemakerShakerDmgBonus.py @@ -44,8 +44,8 @@ def special_judge_logic(self, **kwargs): skill_node = kwargs.get("skill_node", None) if skill_node is None: return False - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode if isinstance(skill_node, SkillNode): pass diff --git a/zsim/sim_progress/Buff/BuffXLogic/FlightOfFancy.py b/zsim/sim_progress/Buff/BuffXLogic/FlightOfFancy.py index 28fed844..b5744dd7 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/FlightOfFancy.py +++ b/zsim/sim_progress/Buff/BuffXLogic/FlightOfFancy.py @@ -41,8 +41,8 @@ def special_judge_logic(self, **kwargs): skill_node = kwargs.get("skill_node", None) if skill_node is None: return False - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode if isinstance(skill_node, SkillNode): pass diff --git a/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveSingleStunAtkBonus.py b/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveSingleStunAtkBonus.py index 3faa2805..abce2b66 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveSingleStunAtkBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveSingleStunAtkBonus.py @@ -1,5 +1,5 @@ -from zsim.sim_progress.Buff import Buff, JudgeTools, check_preparation from zsim.define import HUGO_REPORT +from zsim.sim_progress.Buff import Buff, JudgeTools, check_preparation class HugoCorePassiveSingleStunAtkBonusRecord: diff --git a/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveTotalizeTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveTotalizeTrigger.py index d227ebad..8fd2e86e 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveTotalizeTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/HugoCorePassiveTotalizeTrigger.py @@ -1,6 +1,7 @@ -from .. import Buff, JudgeTools, check_preparation, find_tick -from zsim.sim_progress.Enemy import Enemy from zsim.define import HUGO_REPORT +from zsim.sim_progress.Enemy import Enemy + +from .. import Buff, JudgeTools, check_preparation, find_tick class HugoCorePassiveTotalizeTriggerRecord: @@ -198,8 +199,8 @@ def special_hit_logic(self, **kwargs): ) """再生成决算的skill_node""" - from zsim.sim_progress.Preload.SkillsQueue import spawn_node from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload.SkillsQueue import spawn_node if self.record.active_signal == 2: node_tag = self.record.E_totalize_tag diff --git a/zsim/sim_progress/Buff/BuffXLogic/JaneCinema1APTransToDmgBonus.py b/zsim/sim_progress/Buff/BuffXLogic/JaneCinema1APTransToDmgBonus.py index 40962471..1897526c 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/JaneCinema1APTransToDmgBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/JaneCinema1APTransToDmgBonus.py @@ -1,8 +1,11 @@ -from .. import Buff, JudgeTools, check_preparation, find_tick from zsim.sim_progress.ScheduledEvent.Calculator import ( - MultiplierData as Mul, Calculator as Cal, ) +from zsim.sim_progress.ScheduledEvent.Calculator import ( + MultiplierData as Mul, +) + +from .. import Buff, JudgeTools, check_preparation, find_tick class JaneCinema1APTransToDmgBonusRecord: diff --git a/zsim/sim_progress/Buff/BuffXLogic/MagneticStormAlphaAMBonus.py b/zsim/sim_progress/Buff/BuffXLogic/MagneticStormAlphaAMBonus.py index 575e669a..32685ddd 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/MagneticStormAlphaAMBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/MagneticStormAlphaAMBonus.py @@ -42,8 +42,8 @@ def special_judge_logic(self, **kwargs): skill_node = kwargs.get("skill_node", None) if skill_node is None: return False - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode if isinstance(skill_node, SkillNode): pass diff --git a/zsim/sim_progress/Buff/BuffXLogic/MagneticStormBravoApBonus.py b/zsim/sim_progress/Buff/BuffXLogic/MagneticStormBravoApBonus.py index aff751ff..d893693f 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/MagneticStormBravoApBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/MagneticStormBravoApBonus.py @@ -42,8 +42,8 @@ def special_judge_logic(self, **kwargs): skill_node = kwargs.get("skill_node", None) if skill_node is None: return False - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode if isinstance(skill_node, SkillNode): pass diff --git a/zsim/sim_progress/Buff/BuffXLogic/MagneticStormCharlieSpRecover.py b/zsim/sim_progress/Buff/BuffXLogic/MagneticStormCharlieSpRecover.py index 1018ce32..183325e4 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/MagneticStormCharlieSpRecover.py +++ b/zsim/sim_progress/Buff/BuffXLogic/MagneticStormCharlieSpRecover.py @@ -44,8 +44,8 @@ def special_judge_logic(self, **kwargs): skill_node = kwargs.get("skill_node", None) if skill_node is None: return False - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode if isinstance(skill_node, SkillNode): pass diff --git a/zsim/sim_progress/Buff/BuffXLogic/MetanukiMorphosisAPBonus.py b/zsim/sim_progress/Buff/BuffXLogic/MetanukiMorphosisAPBonus.py index 783dbb8b..cd36464b 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/MetanukiMorphosisAPBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/MetanukiMorphosisAPBonus.py @@ -1,6 +1,7 @@ -from .. import Buff, JudgeTools, check_preparation from typing import TYPE_CHECKING +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: from zsim.sim_progress.Preload import SkillNode diff --git a/zsim/sim_progress/Buff/BuffXLogic/MoonlightLullabyAllTeamDmgBonus.py b/zsim/sim_progress/Buff/BuffXLogic/MoonlightLullabyAllTeamDmgBonus.py index 77896026..19418069 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/MoonlightLullabyAllTeamDmgBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/MoonlightLullabyAllTeamDmgBonus.py @@ -35,4 +35,4 @@ def check_record_module(self): def special_judge_logic(self, **kwargs): self.check_record_module() - self.get_prepared(equipper="月光骑士颂") \ No newline at end of file + self.get_prepared(equipper="月光骑士颂") diff --git a/zsim/sim_progress/Buff/BuffXLogic/QingmingBirdcageCompanionSheerAtkBonus.py b/zsim/sim_progress/Buff/BuffXLogic/QingmingBirdcageCompanionSheerAtkBonus.py index 3bfbd543..b51e14a3 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/QingmingBirdcageCompanionSheerAtkBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/QingmingBirdcageCompanionSheerAtkBonus.py @@ -1,11 +1,12 @@ -from .. import Buff, JudgeTools, check_preparation from typing import TYPE_CHECKING +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator + from zsim.sim_progress.Character import Character from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Preload.PreloadDataClass import PreloadData - from zsim.sim_progress.Character import Character + from zsim.simulator.simulator_class import Simulator class QingmingBirdcageCompanionSheerAtkBonusRecord: diff --git a/zsim/sim_progress/Buff/BuffXLogic/RainforestGourmetATKBonus.py b/zsim/sim_progress/Buff/BuffXLogic/RainforestGourmetATKBonus.py index d8f55e7e..8c80b405 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/RainforestGourmetATKBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/RainforestGourmetATKBonus.py @@ -1,6 +1,7 @@ -from zsim.sim_progress.Buff import Buff, JudgeTools, check_preparation, find_tick import math +from zsim.sim_progress.Buff import Buff, JudgeTools, check_preparation, find_tick + class RainforestGourmetATKBonusRecord: def __init__(self): diff --git a/zsim/sim_progress/Buff/BuffXLogic/RoaringRideBuffTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/RoaringRideBuffTrigger.py index 67f621fd..1f7f6c5c 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/RoaringRideBuffTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/RoaringRideBuffTrigger.py @@ -49,8 +49,8 @@ def special_hit_logic(self, **kwargs): 1: f"Buff-武器-精{int(self.buff_instance.ft.refinement)}轰鸣座驾-精通提升", 2: f"Buff-武器-精{int(self.buff_instance.ft.refinement)}轰鸣座驾-属性异常积蓄", } - from zsim.sim_progress.RandomNumberGenerator import RNG from zsim.sim_progress.Buff.BuffAddStrategy import buff_add_strategy + from zsim.sim_progress.RandomNumberGenerator import RNG rng: RNG = self.buff_instance.sim_instance.rng_instance normalized_value = rng.random_float() diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedAdditionalAbilityTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/SeedAdditionalAbilityTrigger.py index 7d78bc3b..d5ee75eb 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedAdditionalAbilityTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedAdditionalAbilityTrigger.py @@ -9,7 +9,7 @@ class SeedAdditionalAbilityTriggerRecord(BRBC): def __init__(self): super().__init__() self.cd = 60 - self.energy_value = 2 # 回能值,2点能量。 + self.energy_value = 2 # 回能值,2点能量。 class SeedAdditionalAbilityTrigger(Buff.BuffLogic): @@ -47,6 +47,7 @@ def special_judge_logic(self, **kwargs): if skill_node is None: return False from zsim.sim_progress.Preload import SkillNode + assert isinstance(skill_node, SkillNode) preload_data = self.buff_instance.sim_instance.preload.preload_data # 当前操作角色不是席德时,直接返回False @@ -70,9 +71,12 @@ def special_hit_logic(self, **kwargs): assert isinstance(self.record, SeedAdditionalAbilityTriggerRecord), ( f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) - assert self.record.char.vanguard is not None, "席德在激活了组队被动的情况下没有指定正兵,请检查" + assert self.record.char.vanguard is not None, ( + "席德在激活了组队被动的情况下没有指定正兵,请检查" + ) vanguard = self.record.char.vanguard from zsim.sim_progress.data_struct.sp_update_data import ScheduleRefreshData + energy_value = self.record.energy_value refresh_data = ScheduleRefreshData( sp_target=(vanguard.NAME,), diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedBesiegeBonusTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/SeedBesiegeBonusTrigger.py index 069b19c2..207f69f1 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedBesiegeBonusTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedBesiegeBonusTrigger.py @@ -42,6 +42,7 @@ def special_judge_logic(self, **kwargs): f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) from zsim.sim_progress.Character.Seed import Seed + seed = self.record.char assert isinstance(seed, Seed) besiege_state_tuple = seed.besiege_active_check() @@ -55,6 +56,7 @@ def special_hit_logic(self, **kwargs): self.get_prepared(char_CID=1461) assert self.record is not None from zsim.sim_progress.Character.Seed import Seed + seed = self.record.char assert isinstance(seed, Seed) besiege_state_tuple = seed.besiege_active_check() @@ -66,4 +68,8 @@ def special_hit_logic(self, **kwargs): if besiege_state_tuple[1]: benefit_list.append(seed.vanguard.NAME) if seed.vanguard is not None else None if benefit_list: - buff_add_strategy(self.record.buff_index, benifit_list=benefit_list, sim_instance=self.buff_instance.sim_instance) + buff_add_strategy( + self.record.buff_index, + benifit_list=benefit_list, + sim_instance=self.buff_instance.sim_instance, + ) diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefenceTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefenceTrigger.py index 03e24f58..bf106d44 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefenceTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefenceTrigger.py @@ -39,6 +39,7 @@ def special_judge_logic(self, **kwargs): f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) from zsim.sim_progress.Character.Seed import Seed + seed = self.record.char assert isinstance(seed, Seed) besiege_state_tuple = seed.besiege_active_check() @@ -52,6 +53,7 @@ def special_hit_logic(self, **kwargs): self.get_prepared(char_CID=1461) assert self.record is not None from zsim.sim_progress.Character.Seed import Seed + seed = self.record.char assert isinstance(seed, Seed) besiege_state_tuple = seed.besiege_active_check() @@ -63,6 +65,8 @@ def special_hit_logic(self, **kwargs): if besiege_state_tuple[1]: benefit_list.append(seed.vanguard.NAME) if seed.vanguard is not None else None if benefit_list: - buff_add_strategy(self.record.buff_index, benifit_list=benefit_list, sim_instance=self.buff_instance.sim_instance) - - + buff_add_strategy( + self.record.buff_index, + benifit_list=benefit_list, + sim_instance=self.buff_instance.sim_instance, + ) diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefense.py b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefense.py index fb9fab3e..c0871563 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefense.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema2BesiegeIgnoreDefense.py @@ -40,13 +40,16 @@ def special_exit_logic(self, **kwargs): ) seed = self.record.char from zsim.sim_progress.Character.Seed import Seed + assert isinstance(seed, Seed), ( f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) besiege_tuple = seed.besiege_active_check() beneficiary = kwargs.get("beneficiary", None) if beneficiary is None: - print(f"【Buff退出警告】{self.buff_instance.ft.index} 的复杂逻辑模块未正确识别到输入参数“beneficiary”,遂终止Buff。请检查函数") + print( + f"【Buff退出警告】{self.buff_instance.ft.index} 的复杂逻辑模块未正确识别到输入参数“beneficiary”,遂终止Buff。请检查函数" + ) return True # 如果席德都没有指定正兵,那么肯定也不可能有围杀Buff if seed.vanguard is None: @@ -58,4 +61,3 @@ def special_exit_logic(self, **kwargs): else: # 别的角色不可能保留围杀Buff return True - diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Bonus.py b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Bonus.py index e8d8927e..6ab1a92e 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Bonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Bonus.py @@ -39,13 +39,16 @@ def special_exit_logic(self, **kwargs): ) seed = self.record.char from zsim.sim_progress.Character.Seed import Seed + assert isinstance(seed, Seed), ( f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) besiege_tuple = seed.besiege_active_check() beneficiary = kwargs.get("beneficiary", None) if beneficiary is None: - print(f"【Buff退出警告】{self.buff_instance.ft.index} 的复杂逻辑模块未正确识别到输入参数“beneficiary”,遂终止Buff。请检查函数") + print( + f"【Buff退出警告】{self.buff_instance.ft.index} 的复杂逻辑模块未正确识别到输入参数“beneficiary”,遂终止Buff。请检查函数" + ) return True # 如果席德都没有指定正兵,那么肯定也不可能有围杀Buff if seed.vanguard is None: diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Trigger.py b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Trigger.py index 17425723..23a7c6c1 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Trigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema4Trigger.py @@ -39,6 +39,7 @@ def special_judge_logic(self, **kwargs): f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) from zsim.sim_progress.Character.Seed import Seed + seed = self.record.char assert isinstance(seed, Seed) besiege_state_tuple = seed.besiege_active_check() @@ -52,6 +53,7 @@ def special_hit_logic(self, **kwargs): self.get_prepared(char_CID=1461) assert self.record is not None from zsim.sim_progress.Character.Seed import Seed + seed = self.record.char assert isinstance(seed, Seed) besiege_state_tuple = seed.besiege_active_check() @@ -63,4 +65,8 @@ def special_hit_logic(self, **kwargs): if besiege_state_tuple[1]: benefit_list.append(seed.vanguard.NAME) if seed.vanguard is not None else None if benefit_list: - buff_add_strategy(self.record.buff_index, benifit_list=benefit_list, sim_instance=self.buff_instance.sim_instance) + buff_add_strategy( + self.record.buff_index, + benifit_list=benefit_list, + sim_instance=self.buff_instance.sim_instance, + ) diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema6Trigger.py b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema6Trigger.py index 059f10a5..e72d5aef 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedCinema6Trigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedCinema6Trigger.py @@ -47,6 +47,7 @@ def special_judge_logic(self, **kwargs): if skill_node is None: return False from zsim.sim_progress.Preload import SkillNode + assert isinstance(skill_node, SkillNode) if skill_node.skill_tag != self.record.trigger_skill_tag: return False @@ -62,6 +63,7 @@ def special_start_logic(self, **kwargs): self.get_prepared(char_CID=1461) assert self.record is not None from zsim.sim_progress.data_struct.SchedulePreload import schedule_preload_event_factory + tick = self.buff_instance.sim_instance.tick preload_tick_list = [tick, tick, tick] skill_tag_list = [self.record.additional_damage_skill_tag] * 3 @@ -70,10 +72,9 @@ def special_start_logic(self, **kwargs): preload_tick_list=preload_tick_list, skill_tag_list=skill_tag_list, preload_data=preload_data, - sim_instance=self.buff_instance.sim_instance + sim_instance=self.buff_instance.sim_instance, ) self.record.last_active_tick = tick if SEED_REPORT: self.buff_instance.sim_instance.schedule_data.change_process_state() print("【席德6画】检测到席德发动了 落华·重戮,添加三次协同攻击!") - diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeBonus.py b/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeBonus.py index 9f329bd4..9fc5fe99 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeBonus.py @@ -40,6 +40,7 @@ def special_exit_logic(self, **kwargs): f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) from zsim.sim_progress.Character.Seed import Seed + seed: Seed = self.record.char if seed.vanguard is None: # 当席德的没有队友被指定为“正兵”时,明攻永远不可能触发。 @@ -47,4 +48,3 @@ def special_exit_logic(self, **kwargs): # 直接运行席德的围攻状态判断函数 direct_strike = seed.direct_strike_active return not direct_strike - diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeTrigger.py index 379cca0b..497a0bad 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedDirectStrikeTrigger.py @@ -42,6 +42,7 @@ def special_judge_logic(self, **kwargs): f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) from zsim.sim_progress.Character.Seed import Seed + seed: Seed = self.record.char if seed.vanguard is None: # 当席德的没有队友被指定为“正兵”时,明攻永远不可能触发。 @@ -56,4 +57,9 @@ def special_hit_logic(self, **kwargs): assert self.record is not None seed = self.record.char from zsim.sim_progress.Buff.BuffAddStrategy import buff_add_strategy - buff_add_strategy(self.record.buff_index, benifit_list=[seed.vanguard.NAME],sim_instance=self.buff_instance.sim_instance) + + buff_add_strategy( + self.record.buff_index, + benifit_list=[seed.vanguard.NAME], + sim_instance=self.buff_instance.sim_instance, + ) diff --git a/zsim/sim_progress/Buff/BuffXLogic/SeedOnslaughtBonus.py b/zsim/sim_progress/Buff/BuffXLogic/SeedOnslaughtBonus.py index c16501c0..cd349619 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/SeedOnslaughtBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/SeedOnslaughtBonus.py @@ -11,6 +11,7 @@ def __init__(self): class SeedOnslaughtBonus(Buff.BuffLogic): """席德的强袭Buff复杂逻辑""" + def __init__(self, buff_instance): super().__init__(buff_instance) self.buff_instance: Buff = buff_instance @@ -41,7 +42,9 @@ def special_judge_logic(self, **kwargs): assert self.record is not None, ( f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) - assert type(self.record.char) is Seed, f"当前record中的角色不是席德,而是{type(self.record.char).__name__}, CID为:{self.record.char.CID, self.record.char.NAME}" + assert type(self.record.char) is Seed, ( + f"当前record中的角色不是席德,而是{type(self.record.char).__name__}, CID为:{self.record.char.CID, self.record.char.NAME}" + ) return self.record.char.onslaught_active @@ -53,4 +56,3 @@ def special_exit_logic(self, **kwargs): f"【Buff初始化警告】{self.buff_instance.ft.index}的复杂逻辑模块未正确初始化,请检查函数" ) return not self.xjudge - diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinem1EleResReduce.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinem1EleResReduce.py index ccab0b0a..001fde91 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinem1EleResReduce.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinem1EleResReduce.py @@ -1,6 +1,7 @@ -from .. import Buff, JudgeTools, check_preparation from typing import TYPE_CHECKING +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: from ...Preload import SkillNode diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema2Trigger.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema2Trigger.py index aa100504..4cb97e69 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema2Trigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema2Trigger.py @@ -1,7 +1,9 @@ -from .. import Buff, JudgeTools, check_preparation -from zsim.define import YUZUHA_REPORT from typing import TYPE_CHECKING +from zsim.define import YUZUHA_REPORT + +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: from zsim.sim_progress.Preload import SkillNode diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema4QuickAssistTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema4QuickAssistTrigger.py index b0754f14..6136a9e1 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema4QuickAssistTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema4QuickAssistTrigger.py @@ -1,10 +1,12 @@ -from .. import Buff, JudgeTools, check_preparation -from zsim.define import YUZUHA_REPORT from typing import TYPE_CHECKING +from zsim.define import YUZUHA_REPORT + +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.data_struct.QuickAssistSystem import QuickAssistSystem + from zsim.sim_progress.Preload import SkillNode class YuzuhaCinema4QuickAssistTriggerRecord: diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema6SheelTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema6SheelTrigger.py index ecf09299..4c394a13 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema6SheelTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema6SheelTrigger.py @@ -1,7 +1,9 @@ -from .. import Buff, JudgeTools, check_preparation -from zsim.define import YUZUHA_REPORT from typing import TYPE_CHECKING +from zsim.define import YUZUHA_REPORT + +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: from zsim.sim_progress.Character.Yuzuha import Yuzuha from zsim.sim_progress.Preload import SkillNode diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCorePassiveSweetScare.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCorePassiveSweetScare.py index 4af97c02..f2b05f04 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCorePassiveSweetScare.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaCorePassiveSweetScare.py @@ -1,6 +1,7 @@ -from .. import Buff, JudgeTools, check_preparation from typing import TYPE_CHECKING +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: from ...Preload import SkillNode diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaHardCandyShotTrigger.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaHardCandyShotTrigger.py index 72b57aa7..3c81a10b 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaHardCandyShotTrigger.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaHardCandyShotTrigger.py @@ -1,11 +1,13 @@ -from .. import Buff, JudgeTools, check_preparation from typing import TYPE_CHECKING +from .. import Buff, JudgeTools, check_preparation + if TYPE_CHECKING: - from ...Preload import SkillNode - from ...Character.Yuzuha import Yuzuha from zsim.simulator.simulator_class import Simulator + from ...Character.Yuzuha import Yuzuha + from ...Preload import SkillNode + class YuzuhaHardCandyShotTriggerRecord: def __init__(self): diff --git a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaTanukiWishAtkBonus.py b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaTanukiWishAtkBonus.py index 5df7dc3e..0593697a 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/YuzuhaTanukiWishAtkBonus.py +++ b/zsim/sim_progress/Buff/BuffXLogic/YuzuhaTanukiWishAtkBonus.py @@ -1,5 +1,5 @@ -from .. import Buff, JudgeTools, check_preparation from ....define import YUZUHA_REPORT +from .. import Buff, JudgeTools, check_preparation class YuzuhaTanukiWishAtkBonusRecord: diff --git a/zsim/sim_progress/Buff/BuffXLogic/_buff_record_base_class.py b/zsim/sim_progress/Buff/BuffXLogic/_buff_record_base_class.py index 12d169fc..09f825c6 100644 --- a/zsim/sim_progress/Buff/BuffXLogic/_buff_record_base_class.py +++ b/zsim/sim_progress/Buff/BuffXLogic/_buff_record_base_class.py @@ -24,7 +24,7 @@ def __init__(self): self.char_obj_list: "list[Character] | None" = None self.na_skill_level: "int | None" = None self.trans_ratio: float = 0 - self.cd: int = 60 # 内置CD:1秒一次 + self.cd: int = 60 # 内置CD:1秒一次 self.last_active_tick: int = 0 # 上次触发的时间点 self.buff_index: str | None = None self.trigger_buff_0: "Buff | None" = None diff --git a/zsim/sim_progress/Buff/JudgeTools/__init__.py b/zsim/sim_progress/Buff/JudgeTools/__init__.py index 8e14043d..8d764683 100644 --- a/zsim/sim_progress/Buff/JudgeTools/__init__.py +++ b/zsim/sim_progress/Buff/JudgeTools/__init__.py @@ -1,4 +1,5 @@ from typing import TYPE_CHECKING + from .DetectEdges import detect_edge # noqa: F401 from .FindCharFromCID import find_char_from_CID from .FindCharFromName import find_char_from_name @@ -10,10 +11,10 @@ find_enemy, find_event_list, find_exist_buff_dict, + find_init_data, # noqa: F401, find_preload_data, find_stack, find_tick, # noqa: F401 - find_init_data, # noqa: F401, ) if TYPE_CHECKING: diff --git a/zsim/sim_progress/Buff/ScheduleBuffSettle.py b/zsim/sim_progress/Buff/ScheduleBuffSettle.py index 0bd3ab76..416cf5d2 100644 --- a/zsim/sim_progress/Buff/ScheduleBuffSettle.py +++ b/zsim/sim_progress/Buff/ScheduleBuffSettle.py @@ -7,8 +7,8 @@ from .BuffAdd import add_debuff_to_enemy if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.Load import LoadingMission + from zsim.simulator.simulator_class import Simulator def ScheduleBuffSettle( @@ -31,8 +31,8 @@ def ScheduleBuffSettle( if anomaly_bar.activated_by is not None: action_result = anomaly_bar.activated_by elif "skill_node" in kwargs: - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Load import LoadingMission + from zsim.sim_progress.Preload import SkillNode skill_node = kwargs["skill_node"] if isinstance(skill_node, SkillNode): diff --git a/zsim/sim_progress/Character/Alice.py b/zsim/sim_progress/Character/Alice.py index bbc3aad4..196c9d9e 100644 --- a/zsim/sim_progress/Character/Alice.py +++ b/zsim/sim_progress/Character/Alice.py @@ -1,6 +1,8 @@ from math import floor from typing import TYPE_CHECKING + from zsim.define import ALICE_REPORT + from .character import Character from .utils.filters import _skill_node_filter @@ -100,8 +102,8 @@ def special_resources(self, *args, **kwargs) -> None: def update_blade_etiquette(self, update_obj: "SkillNode | float | int") -> None: # 更新剑仪值的函数 - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.Preload import SkillNode + from zsim.simulator.simulator_class import Simulator assert isinstance(self.sim_instance, Simulator), "角色未正确初始化,请检查函数" if update_obj is None: diff --git a/zsim/sim_progress/Character/Miyabi.py b/zsim/sim_progress/Character/Miyabi.py index 801dc909..fec61c5e 100644 --- a/zsim/sim_progress/Character/Miyabi.py +++ b/zsim/sim_progress/Character/Miyabi.py @@ -1,4 +1,5 @@ from typing import Literal + from zsim.sim_progress.anomaly_bar import Disorder from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Report import report_to_log diff --git a/zsim/sim_progress/Character/Seed/ExStateManager.py b/zsim/sim_progress/Character/Seed/ExStateManager.py index 984c953a..25a89d66 100644 --- a/zsim/sim_progress/Character/Seed/ExStateManager.py +++ b/zsim/sim_progress/Character/Seed/ExStateManager.py @@ -9,6 +9,7 @@ class SeedEXState: """席德强化E释放的**当前**状态""" + IDLE = "idle" # 未开始强化E FIRST_CAST = "first" # 第一段 (E_EX_0) LOOPING = "looping" # 循环段 (E_EX_1) @@ -19,8 +20,11 @@ class SeedEXState: class SeedEXStateManager: def __init__(self, char_instance: Character): self.char = char_instance - assert self.char.NAME == "席德", f"SeedEXStateManager 仅支持席德, 当前角色为 {self.char.NAME}" + assert self.char.NAME == "席德", ( + f"SeedEXStateManager 仅支持席德, 当前角色为 {self.char.NAME}" + ) from . import Seed + assert type(self.char) is Seed self.e_ex_max_repeat_times: int = 10 if self.char.cinema < 2 else 20 self.allowed_list = ["1461_E_EX_0", "1461_E_EX_1", "1461_E_EX_2", "1461_SNA_1"] @@ -54,17 +58,33 @@ def update_ex_state(self, skill_node: "SkillNode"): return if skill_node.skill_tag in self.allowed_list: if skill_node.skill_tag == "1461_E_EX_0": - assert self.e_ex_state not in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" + assert self.e_ex_state not in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], ( + f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" + ) self.e_ex_state = SeedEXState.FIRST_CAST - self.repeat_count = 0 # 在检测到起手式时重置重复次数 + self.repeat_count = 0 # 在检测到起手式时重置重复次数 elif skill_node.skill_tag == "1461_E_EX_1": - assert self.e_ex_state not in [SeedEXState.IDLE, SeedEXState.INTRUPTED, SeedEXState.FINISH], f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" - assert self.repeat_count < self.e_ex_max_repeat_times, f"席德的强化E释放状态状态错误, 重复次数超过最大次数 {self.e_ex_max_repeat_times}" + assert self.e_ex_state not in [ + SeedEXState.IDLE, + SeedEXState.INTRUPTED, + SeedEXState.FINISH, + ], f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" + assert self.repeat_count < self.e_ex_max_repeat_times, ( + f"席德的强化E释放状态状态错误, 重复次数超过最大次数 {self.e_ex_max_repeat_times}" + ) self.repeat_count += 1 - self.e_ex_state = SeedEXState.LOOPING if self.repeat_count < self.e_ex_max_repeat_times else SeedEXState.FINISH + self.e_ex_state = ( + SeedEXState.LOOPING + if self.repeat_count < self.e_ex_max_repeat_times + else SeedEXState.FINISH + ) elif skill_node.skill_tag == "1461_E_EX_2": - assert self.e_ex_state in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" - assert self.repeat_count < self.e_ex_max_repeat_times, f"席德的强化E释放状态状态错误, 既然打出了E_EX_2就说明提前打断了强化E释放,此时释放次数({self.repeat_count}次)应小于最大次数{self.e_ex_max_repeat_times}" + assert self.e_ex_state in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], ( + f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" + ) + assert self.repeat_count < self.e_ex_max_repeat_times, ( + f"席德的强化E释放状态状态错误, 既然打出了E_EX_2就说明提前打断了强化E释放,此时释放次数({self.repeat_count}次)应小于最大次数{self.e_ex_max_repeat_times}" + ) # print(22222, f"{self.char.sim_instance.tick}tick:检测到1461_E_EX_2,强化E状态从{self.e_ex_state}切换到{SeedEXState.INTRUPTED}") self.e_ex_state = SeedEXState.INTRUPTED @@ -73,18 +93,30 @@ def update_ex_state(self, skill_node: "SkillNode"): # 若是传入了第一段重击,同时强化E状态为IDLE,说明此次SNA_1和强化E连段无关,直接返回 return else: - assert self.e_ex_state in [SeedEXState.FINISH, SeedEXState.INTRUPTED], f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" + assert self.e_ex_state in [SeedEXState.FINISH, SeedEXState.INTRUPTED], ( + f"席德的强化E释放状态状态错误, 当前状态为 {self.e_ex_state}" + ) self.e_ex_state = SeedEXState.IDLE if self.char.cinema >= 2: if SEED_REPORT: self.char.sim_instance.schedule_data.change_process_state() - print(f"【席德2画报告】检测到强化E结束,本次强化E共耗能{self.repeat_count * 5:.0f}点,将为本次自动衔接的 {skill_node.skill.skill_text} 提供{self.repeat_count * 5:.0f}%的增伤!") + print( + f"【席德2画报告】检测到强化E结束,本次强化E共耗能{self.repeat_count * 5:.0f}点,将为本次自动衔接的 {skill_node.skill.skill_text} 提供{self.repeat_count * 5:.0f}%的增伤!" + ) from zsim.sim_progress.Buff.BuffAddStrategy import buff_add_strategy + benefit_list = ["席德"] - buff_add_strategy(self.cinema_2_buff_index, benifit_list=benefit_list, specified_count=self.repeat_count, sim_instance=self.char.sim_instance) + buff_add_strategy( + self.cinema_2_buff_index, + benifit_list=benefit_list, + specified_count=self.repeat_count, + sim_instance=self.char.sim_instance, + ) else: - assert self.e_ex_state not in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], f"在传入其他无关技能时,席德的强化E状态处于未结算的情况,当前状态为{self.e_ex_state}" + assert self.e_ex_state not in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], ( + f"在传入其他无关技能时,席德的强化E状态处于未结算的情况,当前状态为{self.e_ex_state}" + ) if self.e_ex_state in [SeedEXState.FINISH, SeedEXState.INTRUPTED]: self.e_ex_state = SeedEXState.IDLE diff --git a/zsim/sim_progress/Character/Seed/__init__.py b/zsim/sim_progress/Character/Seed/__init__.py index 30106a61..6a645570 100644 --- a/zsim/sim_progress/Character/Seed/__init__.py +++ b/zsim/sim_progress/Character/Seed/__init__.py @@ -202,7 +202,9 @@ def special_resources(self, *args, **kwargs) -> None: if self.sna_quick_release: self.sna_quick_release = False else: - print("【席德测试】检测到位于强化E后自动衔接释放的SNA_1,本次释放不会消耗快速释放标记!") + print( + "【席德测试】检测到位于强化E后自动衔接释放的SNA_1,本次释放不会消耗快速释放标记!" + ) @property def steel_charge(self) -> float: @@ -341,6 +343,7 @@ def get_resources(self, *args, **kwargs) -> tuple[str | None, int | float | None def get_special_stats(self, *args, **kwargs) -> dict[str | None, object | None]: from .ExStateManager import SeedEXState + return { "钢能值足够": self.steel_charge_enough, "sna快速释放": self.sna_quick_release, @@ -351,7 +354,5 @@ def get_special_stats(self, *args, **kwargs) -> dict[str | None, object | None]: "明攻状态生效": self.direct_strike_active, "正兵": self.vanguard.NAME if self.vanguard else None, "强化E达到最大次数": self.e_ex_repeat_limit_reached, - "强化E连续释放": self.sesm.e_ex_state in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST] + "强化E连续释放": self.sesm.e_ex_state in [SeedEXState.LOOPING, SeedEXState.FIRST_CAST], } - - diff --git a/zsim/sim_progress/Character/Vivian/__init__.py b/zsim/sim_progress/Character/Vivian/__init__.py index 3707a3b7..97f2cc86 100644 --- a/zsim/sim_progress/Character/Vivian/__init__.py +++ b/zsim/sim_progress/Character/Vivian/__init__.py @@ -1,7 +1,8 @@ -from ..utils.filters import _skill_node_filter +from typing import TYPE_CHECKING + from ..character import Character +from ..utils.filters import _skill_node_filter from .FeatherManager import FeatherManager -from typing import TYPE_CHECKING if TYPE_CHECKING: from zsim.sim_progress.Preload import SkillNode diff --git a/zsim/sim_progress/Character/Yuzuha/__init__.py b/zsim/sim_progress/Character/Yuzuha/__init__.py index df225d11..16ab5b7d 100644 --- a/zsim/sim_progress/Character/Yuzuha/__init__.py +++ b/zsim/sim_progress/Character/Yuzuha/__init__.py @@ -1,15 +1,17 @@ -from zsim.sim_progress.Preload import SkillNode -from zsim.models.event_enums import PostInitObjectType as PIOT, SpecialStateUpdateSignal as SSUS +from typing import TYPE_CHECKING + from zsim.define import YUZUHA_REPORT +from zsim.models.event_enums import PostInitObjectType as PIOT +from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS +from zsim.sim_progress.Preload import SkillNode + +from ...data_struct.SchedulePreload import schedule_preload_event_factory from ..character import Character from ..utils.filters import _skill_node_filter -from typing import TYPE_CHECKING -from ...data_struct.SchedulePreload import schedule_preload_event_factory - if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.data_struct.enemy_special_state_manager.special_classes import SweetScare + from zsim.simulator.simulator_class import Simulator class Yuzuha(Character): diff --git a/zsim/sim_progress/Character/__init__.py b/zsim/sim_progress/Character/__init__.py index 579829fb..ab3d6722 100644 --- a/zsim/sim_progress/Character/__init__.py +++ b/zsim/sim_progress/Character/__init__.py @@ -27,7 +27,7 @@ "仪玄": "Yixuan", "柚叶": "Yuzuha", "爱丽丝": "Alice", - "席德": "Seed" + "席德": "Seed", } diff --git a/zsim/sim_progress/Character/character.py b/zsim/sim_progress/Character/character.py index 6cbf26d1..d904826e 100644 --- a/zsim/sim_progress/Character/character.py +++ b/zsim/sim_progress/Character/character.py @@ -832,9 +832,12 @@ def update_decibel(self, decibel_value: int | float): # if self.decibel == 3000 and self.NAME == '仪玄': # print(f"{self.NAME} 释放技能时喧响值已满3000点!") from zsim.sim_progress.ScheduledEvent.Calculator import cal_buff_total_bonus + dynamic_buff = self.sim_instance.global_stats.DYNAMIC_BUFF_DICT enabled_buff = tuple(dynamic_buff[self.NAME]) - buff_bonus_dict = cal_buff_total_bonus(enabled_buff=enabled_buff, judge_obj=None, sim_instance=self.sim_instance) + buff_bonus_dict = cal_buff_total_bonus( + enabled_buff=enabled_buff, judge_obj=None, sim_instance=self.sim_instance + ) decibel_get_ratio = buff_bonus_dict.get("喧响获得效率", 0) final_decibel_change_value = decibel_value * (1 + decibel_get_ratio) self.decibel += final_decibel_change_value diff --git a/zsim/sim_progress/Dot/Dots/AliceCoreSkillAssaultDot.py b/zsim/sim_progress/Dot/Dots/AliceCoreSkillAssaultDot.py index 3cc52de3..fd291e67 100644 --- a/zsim/sim_progress/Dot/Dots/AliceCoreSkillAssaultDot.py +++ b/zsim/sim_progress/Dot/Dots/AliceCoreSkillAssaultDot.py @@ -16,19 +16,26 @@ def __init__(self, bar: "AnomalyBar | None" = None, sim_instance: "Simulator | N raise ValueError("构造dot实例时必须传入有效的sim_instance实例") from zsim.sim_progress.anomaly_bar.AnomalyBarClass import AnomalyBar + # 正确性验证 - if any([bar is None, + if any( + [ + bar is None, bar is not None and not isinstance(bar, AnomalyBar), - bar.element_type != 0]): - raise ValueError("构造爱丽丝的核心被动Dot实例时,必须传入有效的 物理属性 anomlay_bar 实例") + bar.element_type != 0, + ] + ): + raise ValueError( + "构造爱丽丝的核心被动Dot实例时,必须传入有效的 物理属性 anomlay_bar 实例" + ) self.anomaly_data = bar self.anomaly_data.rename_tag = "爱丽丝强击Dot" - self.anomaly_data.scaling_factor = 0.025 # 缩放比例 + self.anomaly_data.scaling_factor = 0.025 # 缩放比例 @dataclass class DotFeature(Dot.DotFeature): sim_instance: "Simulator | None" - update_cd: int | float = 57 # dot的内置CD是0.95秒,换算为57帧 + update_cd: int | float = 57 # dot的内置CD是0.95秒,换算为57帧 index: str | None = "AliceCoreSkillAssaultDot" name: str | None = "爱丽丝物理异常Dot" dot_from: str | None = "爱丽丝" @@ -36,12 +43,13 @@ class DotFeature(Dot.DotFeature): max_count: int | None = 999999 incremental_step: int | None = 1 max_duration: int | None = 999999 - complex_exit_logic = True # 该dot为复杂退出逻辑 + complex_exit_logic = True # 该dot为复杂退出逻辑 def exit_judge(self, **kwargs): """爱丽丝物理异常Dot 的退出逻辑:敌人的只要不处于畏缩状态,就退出。""" enemy = kwargs.get("enemy", None) from zsim.sim_progress.Enemy import Enemy + if not isinstance(enemy, Enemy): raise TypeError("enemy参数必须是Enemy类的实例") if not enemy.dynamic.assault: diff --git a/zsim/sim_progress/Dot/Dots/ViviansProphecy.py b/zsim/sim_progress/Dot/Dots/ViviansProphecy.py index 197079d4..1a13f9a3 100644 --- a/zsim/sim_progress/Dot/Dots/ViviansProphecy.py +++ b/zsim/sim_progress/Dot/Dots/ViviansProphecy.py @@ -33,7 +33,7 @@ class DotFeature(Dot.DotFeature): max_count: int | None = 999999 incremental_step: int | None = 1 max_duration: int | None = 999999 - complex_exit_logic = True # 该dot为复杂退出逻辑 + complex_exit_logic = True # 该dot为复杂退出逻辑 def exit_judge(self, **kwargs): """薇薇安的预言 dot的退出逻辑:敌人只要处于异常状态,就不会退出。""" diff --git a/zsim/sim_progress/Enemy/QTEManager/QTEData.py b/zsim/sim_progress/Enemy/QTEManager/QTEData.py index d03f9f28..b41e17d3 100644 --- a/zsim/sim_progress/Enemy/QTEManager/QTEData.py +++ b/zsim/sim_progress/Enemy/QTEManager/QTEData.py @@ -56,7 +56,7 @@ def __init__(self, enemy_instance): "qte_triggered_times": SumStrategy, } self.preload_data = None - self.qte_answered_box: list[str | None] = [] # 响应过QTE的角色 + self.qte_answered_box: list[str | None] = [] # 响应过QTE的角色 def check_myself(self, single_hit: SingleHit | None = None) -> bool: """该函数用于检查自身目前的状态,即当前是彩色失衡还是灰色失衡;""" @@ -267,7 +267,9 @@ def receive_hit_while_stun(self, _single_hit: SingleHit): # 当角色响应了QTE时,需要将角色的skill_tag添加到qte_answered_box中 CID = _single_hit.skill_node.skill.char_obj.CID if CID in self.qte_data.qte_answered_box: - raise ValueError(f"一轮连续地QTE中,每名角色只允许响应一次QTE!当前轮次QTE中,已经有{self.qte_data.qte_answered_box}响应过了QTE,{CID} 企图响应QTE两次!") + raise ValueError( + f"一轮连续地QTE中,每名角色只允许响应一次QTE!当前轮次QTE中,已经有{self.qte_data.qte_answered_box}响应过了QTE,{CID} 企图响应QTE两次!" + ) self.qte_data.qte_answered_box.append(_single_hit.skill_node.skill.char_obj.CID) self.__is_hitted = True self.merge_single_qte() diff --git a/zsim/sim_progress/Enemy/__init__.py b/zsim/sim_progress/Enemy/__init__.py index 47cf008b..ff807d8b 100644 --- a/zsim/sim_progress/Enemy/__init__.py +++ b/zsim/sim_progress/Enemy/__init__.py @@ -4,6 +4,8 @@ import pandas as pd from zsim.define import ENEMY_ADJUSTMENT_PATH, ENEMY_DATA_PATH +from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS from zsim.sim_progress.anomaly_bar import ( AuricInkAnomaly, ElectricAnomaly, @@ -15,14 +17,12 @@ ) from zsim.sim_progress.anomaly_bar.AnomalyBarClass import AnomalyBar from zsim.sim_progress.data_struct import SingleHit +from zsim.sim_progress.data_struct.enemy_special_state_manager import SpecialStateManager from zsim.sim_progress.Report import report_to_log -from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS from .EnemyAttack import EnemyAttackMethod from .EnemyUniqueMechanic import unique_mechanic_factory from .QTEManager import QTEManager -from zsim.sim_progress.data_struct.enemy_special_state_manager import SpecialStateManager -from zsim.models.event_enums import ListenerBroadcastSignal as LBS if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator @@ -675,8 +675,9 @@ def assault(self, value: bool): if value: # 检查更新值并且广播给各监听器(目前只为爱丽丝核心被动Dot触发器服务) sim_instance = self.enemy.sim_instance - sim_instance.listener_manager.broadcast_event(signal=LBS.ASSAULT_STATE_ON, event=self.enemy.anomaly_bars_dict[0]) - + sim_instance.listener_manager.broadcast_event( + signal=LBS.ASSAULT_STATE_ON, event=self.enemy.anomaly_bars_dict[0] + ) def __str__(self): return f"失衡: {self.stun}, 失衡条: {self.stun_bar:.2f}, 冻结: {self.frozen}, 霜寒: {self.frostbite}, 畏缩: {self.assault}, 感电: {self.shock}, 灼烧: {self.burn}, 侵蚀:{self.corruption}, 烈霜霜寒:{self.frost_frostbite}" diff --git a/zsim/sim_progress/Preload/APLModule/APLJudgeTools/__init__.py b/zsim/sim_progress/Preload/APLModule/APLJudgeTools/__init__.py index a91dcc11..a9083c44 100644 --- a/zsim/sim_progress/Preload/APLModule/APLJudgeTools/__init__.py +++ b/zsim/sim_progress/Preload/APLModule/APLJudgeTools/__init__.py @@ -1,11 +1,11 @@ +from .CheckCID import check_cid from .CheckNumberType import check_number_type -from .FindCharacter import find_char -from .GetNestedValue import get_nested_value from .FindBuff import find_buff -from .GetLastAction import get_last_action -from .GetGameState import get_game_state from .FindBuff_0 import find_buff_0 -from .CheckCID import check_cid +from .FindCharacter import find_char +from .GetGameState import get_game_state +from .GetLastAction import get_last_action +from .GetNestedValue import get_nested_value from .GetPersonalNodeStack import get_personal_node_stack __all__ = [ diff --git a/zsim/sim_progress/Preload/APLModule/SubConditionUnit/StatusSubUnit.py b/zsim/sim_progress/Preload/APLModule/SubConditionUnit/StatusSubUnit.py index 716b372f..0f44e166 100644 --- a/zsim/sim_progress/Preload/APLModule/SubConditionUnit/StatusSubUnit.py +++ b/zsim/sim_progress/Preload/APLModule/SubConditionUnit/StatusSubUnit.py @@ -109,6 +109,7 @@ def handler(cls, char_cid, found_char_dict, game_state, sim_instance): quick_assist_available = char.dynamic.quick_assist_manager.quick_assist_available from zsim.sim_progress.Character.character import Character from zsim.simulator.simulator_class import Simulator + assert isinstance(char, Character) assert isinstance(sim_instance, Simulator) tick = sim_instance.tick diff --git a/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py b/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py index 0248bfd3..96ce3639 100644 --- a/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py +++ b/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py @@ -1,9 +1,9 @@ -from .BaseSubConditionUnit import BaseSubConditionUnit -from .StatusSubUnit import StatusSubUnit +from .ActionSubUnit import ActionSubUnit from .AttributeSubUnit import AttributeSubUnit +from .BaseSubConditionUnit import BaseSubConditionUnit from .BuffSubUnit import BuffSubUnit -from .ActionSubUnit import ActionSubUnit from .SpecialSubUnit import SpecialSubUnit +from .StatusSubUnit import StatusSubUnit __all__ = [ "BaseSubConditionUnit", diff --git a/zsim/sim_progress/Preload/APLModule/__init__.py b/zsim/sim_progress/Preload/APLModule/__init__.py index edfa2d12..9724ef14 100644 --- a/zsim/sim_progress/Preload/APLModule/__init__.py +++ b/zsim/sim_progress/Preload/APLModule/__init__.py @@ -1,7 +1,7 @@ -from .APLOperator import APLOperator -from .APLParser import APLParser from .APLClass import APLClass from .APLManager import APLManager +from .APLOperator import APLOperator +from .APLParser import APLParser __all__ = [ "APLOperator", diff --git a/zsim/sim_progress/Preload/PreloadDataClass.py b/zsim/sim_progress/Preload/PreloadDataClass.py index 8cee1bd3..4498832b 100644 --- a/zsim/sim_progress/Preload/PreloadDataClass.py +++ b/zsim/sim_progress/Preload/PreloadDataClass.py @@ -34,8 +34,12 @@ def __init__( from zsim.sim_progress.data_struct import NodeStack - self.personal_node_stack: dict[int, "NodeStack[SkillNode]"] = {} # 个人的技能栈(包括主动生成的和被动生成的) - self.personal_active_generation_node_stack: dict[int, "NodeStack[SkillNode]"] = {} # 个人的主动生成的技能栈 + self.personal_node_stack: dict[ + int, "NodeStack[SkillNode]" + ] = {} # 个人的技能栈(包括主动生成的和被动生成的) + self.personal_active_generation_node_stack: dict[ + int, "NodeStack[SkillNode]" + ] = {} # 个人的主动生成的技能栈 self.current_node_stack: "NodeStack" = NodeStack(length=5) # Preload阶段的总技能栈 self.latest_active_generation_node: SkillNode | None = ( None # 最近一次主动生成的skillnode,#TODO:可能是无用参数! @@ -67,6 +71,7 @@ def push_node_in_swap_cancel(self, node: SkillNode, tick: int): self.current_node_stack.push(node) if char_cid not in self.personal_node_stack: from zsim.sim_progress.data_struct import NodeStack + self.personal_node_stack[char_cid] = NodeStack(length=3) self.personal_active_generation_node_stack[char_cid] = NodeStack(length=3) diff --git a/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py b/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py index 981ea03f..980877b1 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py @@ -32,7 +32,7 @@ def __init__(self, data: "PreloadData", apl_path: str | None = None): self.apl = self.apl_manager.load_apl(apl_path, mode=0, preload_data=self.preload_data) self.latest_node: SkillNode | None = None - self._apl_want: tuple | None = None # APL引擎的想法 + self._apl_want: tuple | None = None # APL引擎的想法 @property def apl_want(self) -> tuple | None: @@ -47,7 +47,9 @@ def apl_want(self, value: tuple | None) -> None: if value != self.apl_want: print( f"{tick}tick:APL引擎的想法变化,{self.apl_want[0] if self.apl_want else None} → {skill_tag},来自于优先级 {apl_priority} 的单元,详细内容:{apl_unit.whole_line}" - ) if self.apl_want is not None else print(f"{tick}tick:APL引擎产生了第一个想法:{skill_tag}") + ) if self.apl_want is not None else print( + f"{tick}tick:APL引擎产生了第一个想法:{skill_tag}" + ) self._apl_want = value def run_myself(self, tick) -> SkillNode | None: diff --git a/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py b/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py index 99264848..3081d093 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py @@ -24,7 +24,7 @@ def __init__(self, data: "PreloadData"): self.external_update_signal = False self.external_add_skill_list = [] self.validators = [self._validate_timing] - self.name_box_first_change = True # 首次更改name_box的标志 + self.name_box_first_change = True # 首次更改name_box的标志 def run_myself(self, tick: int, **kwargs) -> bool: """依次执行 Node构造、验证、内外部数据交互""" @@ -131,7 +131,6 @@ def switch_char(self, this_node: SkillNode, char_data) -> None: char.dynamic.on_field = True self.name_box_first_change = False else: - char.dynamic.on_field = False def validate_node_execution(self, node: SkillNode, tick: int) -> bool: diff --git a/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py b/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py index 36a0cfe6..df767b00 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py @@ -130,6 +130,7 @@ def _validate_char_avaliable( try_get_char_latest_node = char_stack.get_effective_node() if try_get_char_latest_node is None: from zsim.sim_progress.Character.character import Character + char = self.data.char_data.find_char_obj(CID=cid) assert isinstance(char, Character) if char.dynamic.lasting_node.node is not None: diff --git a/zsim/sim_progress/Preload/PreloadEngine/__init__.py b/zsim/sim_progress/Preload/PreloadEngine/__init__.py index 61036b25..76809df0 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/__init__.py +++ b/zsim/sim_progress/Preload/PreloadEngine/__init__.py @@ -1,9 +1,9 @@ from .APLEngine import APLEngine +from .AttackAnswerEngine import AttackResponseEngine from .BasePreloadEngine import BasePreloadEngine -from .ForceAddEngine import ForceAddEngine from .ConfirmEngine import ConfirmEngine +from .ForceAddEngine import ForceAddEngine from .SwapCancelValidateEngine import SwapCancelValidateEngine -from .AttackAnswerEngine import AttackResponseEngine __all__ = [ "APLEngine", diff --git a/zsim/sim_progress/Preload/__init__.py b/zsim/sim_progress/Preload/__init__.py index b868355f..ab719b1b 100644 --- a/zsim/sim_progress/Preload/__init__.py +++ b/zsim/sim_progress/Preload/__init__.py @@ -1,11 +1,11 @@ # from . import SkillsQueue from . import watchdog -from .SkillsQueue import SkillNode -from .APLModule.APLParser import APLParser from .APLModule.APLClass import APLClass from .APLModule.APLJudgeTools import find_char, get_game_state +from .APLModule.APLParser import APLParser from .PreloadClass import PreloadClass from .PreloadDataClass import PreloadData +from .SkillsQueue import SkillNode __all__ = [ "watchdog", diff --git a/zsim/sim_progress/Report/buff_handler.py b/zsim/sim_progress/Report/buff_handler.py index 5ca81a1f..bde7ace6 100644 --- a/zsim/sim_progress/Report/buff_handler.py +++ b/zsim/sim_progress/Report/buff_handler.py @@ -23,7 +23,7 @@ def dump_buff_csv(result_id: str): # Check if buffered_data has any content if not buffered_data: return - + for char_name, char_data in buffered_data.items(): if not char_data: continue @@ -46,7 +46,7 @@ def dump_buff_csv(result_id: str): continue buff_report_file_path = f"{result_id}/buff_log/{char_name}.csv" - + # Ensure the directory exists try: os.makedirs(os.path.dirname(buff_report_file_path), exist_ok=True) @@ -58,7 +58,7 @@ def dump_buff_csv(result_id: str): df = pl.DataFrame(rows) if df.is_empty(): continue - + # Sort columns: time_tick first, then buff names alphabetically for deterministic output. buff_columns = sorted([col for col in df.columns if col != "time_tick"]) df = df.sort("time_tick").select(["time_tick"] + buff_columns) diff --git a/zsim/sim_progress/ScheduledEvent/Calculator.py b/zsim/sim_progress/ScheduledEvent/Calculator.py index 5c723de7..fc838456 100644 --- a/zsim/sim_progress/ScheduledEvent/Calculator.py +++ b/zsim/sim_progress/ScheduledEvent/Calculator.py @@ -148,7 +148,9 @@ def get_buff_bonus(self, dynamic_buff: dict, node: SkillNode | AnomalyBar | None char_name=self.char_name, ) except TypeError as err: - raise TypeError(f"参数错误!enabled_buff为{type(enabled_buff)},node为{type(node)}") from err + raise TypeError( + f"参数错误!enabled_buff为{type(enabled_buff)},node为{type(node)}" + ) from err return dynamic_statement class StaticStatement: @@ -1354,7 +1356,10 @@ def check_skill_node_mul(self, multipliers): self.skill_node.skill.skill_text, f"第{self.skill_node.loading_mission.hitted_count if self.skill_node.loading_mission else 1}次命中", ":", - [f"{__tag} : {__value:.2f}" for __tag, __value in zip(tag_list, multipliers, strict=True)], + [ + f"{__tag} : {__value:.2f}" + for __tag, __value in zip(tag_list, multipliers, strict=True) + ], ) def cal_dmg_crit(self) -> np.float64: diff --git a/zsim/sim_progress/ScheduledEvent/constants.py b/zsim/sim_progress/ScheduledEvent/constants.py index 454caa43..2f6882c1 100644 --- a/zsim/sim_progress/ScheduledEvent/constants.py +++ b/zsim/sim_progress/ScheduledEvent/constants.py @@ -56,10 +56,10 @@ def validate_constants(cls) -> None: # 优先级定义(数字越大优先级越低) PRIORITY = { - "HIGH": 0, # 高优先级,数字最小 - "MEDIUM": 500, # 中等优先级 - "LOW": 800, # 低优先级 - "VERY_LOW": 999, # 极低优先级,数字最大 + "HIGH": 0, # 高优先级,数字最小 + "MEDIUM": 500, # 中等优先级 + "LOW": 800, # 低优先级 + "VERY_LOW": 999, # 极低优先级,数字最大 } # 异常更新规则 diff --git a/zsim/sim_progress/ScheduledEvent/event_handlers/base.py b/zsim/sim_progress/ScheduledEvent/event_handlers/base.py index eeecf8a5..b0b1cc48 100644 --- a/zsim/sim_progress/ScheduledEvent/event_handlers/base.py +++ b/zsim/sim_progress/ScheduledEvent/event_handlers/base.py @@ -133,9 +133,7 @@ def _validate_context(self, context: EventContext) -> None: # Pydantic模型已经确保了数据的完整性和有效性 - def _handle_error( - self, error: Exception, operation: str, event: Any = None - ) -> None: + def _handle_error(self, error: Exception, operation: str, event: Any = None) -> None: """ 统一错误处理方法 diff --git a/zsim/sim_progress/ScheduledEvent/event_handlers/handlers/skill.py b/zsim/sim_progress/ScheduledEvent/event_handlers/handlers/skill.py index b02716af..56128198 100644 --- a/zsim/sim_progress/ScheduledEvent/event_handlers/handlers/skill.py +++ b/zsim/sim_progress/ScheduledEvent/event_handlers/handlers/skill.py @@ -114,7 +114,9 @@ def _process_skill_event( self._update_damage_effects(tick, enemy, data, event) self._broadcast_skill_event_to_char(event=event, sim_instance=sim_instance) - def _broadcast_skill_event_to_char(self, event: SkillNode | LoadingMission, sim_instance: Simulator) -> None: + def _broadcast_skill_event_to_char( + self, event: SkillNode | LoadingMission, sim_instance: Simulator + ) -> None: """广播技能事件到所有角色以触发特殊资源更新 Args: diff --git a/zsim/sim_progress/Update/UpdateAnomaly.py b/zsim/sim_progress/Update/UpdateAnomaly.py index 948710bd..3b7c3001 100644 --- a/zsim/sim_progress/Update/UpdateAnomaly.py +++ b/zsim/sim_progress/Update/UpdateAnomaly.py @@ -150,7 +150,9 @@ def update_anomaly( # 异常事件监听器广播 sim_instance.listener_manager.broadcast_event(event=active_bar, signal=LBS.ANOMALY) if active_bar.element_type in [0]: - sim_instance.listener_manager.broadcast_event(event=active_bar, signal=LBS.ASSAULT_SPAWN) + sim_instance.listener_manager.broadcast_event( + event=active_bar, signal=LBS.ASSAULT_SPAWN + ) """ 更新完毕,现在正式进入分支判断——触发同类异常 & 触发异类异常(紊乱)。 无论是哪个分支,都需要涉及enemy下的两大容器:enemy_debuff_list以及enemy_dot_list的修改, diff --git a/zsim/sim_progress/Update/Update_Buff.py b/zsim/sim_progress/Update/Update_Buff.py index 7ef913b2..126b1ee9 100644 --- a/zsim/sim_progress/Update/Update_Buff.py +++ b/zsim/sim_progress/Update/Update_Buff.py @@ -4,7 +4,9 @@ from zsim.sim_progress.Report import report_buff_to_queue, report_to_log -def update_time_related_effect(DYNAMIC_BUFF_DICT: dict, timetick, exist_buff_dict: dict, enemy: Enemy): +def update_time_related_effect( + DYNAMIC_BUFF_DICT: dict, timetick, exist_buff_dict: dict, enemy: Enemy +): """ 更新一些和时间相关的效果,异常条、Buff、Dot """ @@ -111,7 +113,9 @@ def KickOutBuff( ): buff.end(timetick, sub_exist_buff_dict) DYNAMIC_BUFF_DICT[charname].remove(buff) - report_to_log(f"[Buff END]:{timetick}:{charname} 的 {buff.ft.index} 结束,已从动态列表移除", level=4) + report_to_log( + f"[Buff END]:{timetick}:{charname} 的 {buff.ft.index} 结束,已从动态列表移除", level=4 + ) if buff.ft.is_debuff: enemy.dynamic.dynamic_debuff_list.remove(buff) diff --git a/zsim/sim_progress/anomaly_bar/Anomalies.py b/zsim/sim_progress/anomaly_bar/Anomalies.py index 7e117843..980302f4 100644 --- a/zsim/sim_progress/anomaly_bar/Anomalies.py +++ b/zsim/sim_progress/anomaly_bar/Anomalies.py @@ -1,4 +1,5 @@ from dataclasses import dataclass + from .AnomalyBarClass import AnomalyBar diff --git a/zsim/sim_progress/anomaly_bar/AnomalyBarClass.py b/zsim/sim_progress/anomaly_bar/AnomalyBarClass.py index b003392c..22faea0b 100644 --- a/zsim/sim_progress/anomaly_bar/AnomalyBarClass.py +++ b/zsim/sim_progress/anomaly_bar/AnomalyBarClass.py @@ -46,10 +46,10 @@ class AnomalyBar: UUID: uuid.UUID | None = None activated_by: "SkillNode | None" = None ndarray_box: list[tuple] | None = None - scaling_factor: float = 1.0 # 缩放比例,在计算伤害时会乘以该比例 + scaling_factor: float = 1.0 # 缩放比例,在计算伤害时会乘以该比例 settled: bool = False # 快照是否被结算过 - rename_tag: str | None = None # 重命名标签 - schedule_priority: int = 999 # 默认情况下,异常条的处理优先级为999,位于当前tick的最后。 + rename_tag: str | None = None # 重命名标签 + schedule_priority: int = 999 # 默认情况下,异常条的处理优先级为999,位于当前tick的最后。 @property def rename(self) -> bool: @@ -257,7 +257,9 @@ def __deepcopy__(self, memo): def anomaly_settled(self): """结算快照!""" if self.settled: - raise RuntimeError("【异常条结算警告】当前异常条快照已经被结算过一次了,请检查业务逻辑,找出重复结算的时间点!") + raise RuntimeError( + "【异常条结算警告】当前异常条快照已经被结算过一次了,请检查业务逻辑,找出重复结算的时间点!" + ) total_array = np.zeros((1, 1), dtype=np.float64) effective_buildup: np.float64 = np.float64(0) while self.ndarray_box: diff --git a/zsim/sim_progress/anomaly_bar/CopyAnomalyForOutput.py b/zsim/sim_progress/anomaly_bar/CopyAnomalyForOutput.py index 64d8a58f..bc1b926f 100644 --- a/zsim/sim_progress/anomaly_bar/CopyAnomalyForOutput.py +++ b/zsim/sim_progress/anomaly_bar/CopyAnomalyForOutput.py @@ -96,5 +96,3 @@ def __init__(self, Output_bar: AnomalyBar, active_by, sim_instance: "Simulator") def __hash__(self): """使对象可哈希""" return hash(self.UUID) - - diff --git a/zsim/sim_progress/anomaly_bar/__init__.py b/zsim/sim_progress/anomaly_bar/__init__.py index 8ed69e81..74c6550b 100644 --- a/zsim/sim_progress/anomaly_bar/__init__.py +++ b/zsim/sim_progress/anomaly_bar/__init__.py @@ -1,11 +1,11 @@ from .Anomalies import ( - PhysicalAnomaly, - FireAnomaly, - IceAnomaly, + AuricInkAnomaly, ElectricAnomaly, EtherAnomaly, + FireAnomaly, FrostAnomaly, - AuricInkAnomaly, + IceAnomaly, + PhysicalAnomaly, ) from .AnomalyBarClass import AnomalyBar from .CopyAnomalyForOutput import Disorder diff --git a/zsim/sim_progress/data_struct/ActionStack.py b/zsim/sim_progress/data_struct/ActionStack.py index 79e0bdf7..f71899d4 100644 --- a/zsim/sim_progress/data_struct/ActionStack.py +++ b/zsim/sim_progress/data_struct/ActionStack.py @@ -5,6 +5,7 @@ if TYPE_CHECKING: from zsim.sim_progress.Preload import SkillNode + NODE_T = TypeVar("NODE_T", bound=SkillNode) else: NODE_T = TypeVar("NODE_T", bound="SkillNode") diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1BladeEtquitteRecoverListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1BladeEtquitteRecoverListener.py index ffa335f9..d9fd1b04 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1BladeEtquitteRecoverListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1BladeEtquitteRecoverListener.py @@ -1,11 +1,13 @@ from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener -from zsim.define import ALICE_REPORT if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.Character.Alice import Alice + from zsim.simulator.simulator_class import Simulator class AliceCinema1BladeEtquitteRecoverListener(BaseListener): diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1DefReduceListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1DefReduceListener.py index 6ee0da22..7ebdd8e4 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1DefReduceListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema1DefReduceListener.py @@ -1,13 +1,15 @@ from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener -from zsim.define import ALICE_REPORT if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character - from zsim.sim_progress.Character.Alice import Alice from zsim.sim_progress.anomaly_bar import AnomalyBar + from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceCinema1DefReduceListener(BaseListener): diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema2DisorderDmgBonus.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema2DisorderDmgBonus.py index 82794053..03c7752b 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema2DisorderDmgBonus.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceCinema2DisorderDmgBonus.py @@ -1,13 +1,15 @@ from typing import TYPE_CHECKING -from zsim.models.event_enums import ListenerBroadcastSignal as LBS -from .BaseListenerClass import BaseListener + from zsim.define import ALICE_REPORT +from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from ...anomaly_bar.CopyAnomalyForOutput import Disorder, PolarityDisorder +from .BaseListenerClass import BaseListener if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceCinema2DisorderDmgBonus(BaseListener): diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillDisorderBasicMulBonusListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillDisorderBasicMulBonusListener.py index 7c66cf72..4c4962f0 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillDisorderBasicMulBonusListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillDisorderBasicMulBonusListener.py @@ -1,13 +1,15 @@ from typing import TYPE_CHECKING -from zsim.models.event_enums import ListenerBroadcastSignal as LBS -from .BaseListenerClass import BaseListener + from zsim.define import ALICE_REPORT +from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from ...anomaly_bar.CopyAnomalyForOutput import Disorder, PolarityDisorder +from .BaseListenerClass import BaseListener if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceCoreSkillDisorderBasicMulBonusListener(BaseListener): diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillPhyBuildupBonusListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillPhyBuildupBonusListener.py index 6839b703..17d92fa3 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillPhyBuildupBonusListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceCoreSkillPhyBuildupBonusListener.py @@ -1,13 +1,15 @@ from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener -from zsim.define import ALICE_REPORT if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character - from zsim.sim_progress.Character.Alice import Alice from zsim.sim_progress.anomaly_bar import AnomalyBar + from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceCoreSkillPhyBuildupBonusListener(BaseListener): @@ -43,4 +45,6 @@ def listener_active(self, **kwargs): buff_add_strategy(self.buff_index, benifit_list=["爱丽丝"], sim_instance=self.sim_instance) if ALICE_REPORT: self.sim_instance.schedule_data.change_process_state() - print(f"【爱丽丝事件】检测到爱丽丝触发{"强击" if signal == LBS.ASSAULT_SPAWN else "极性强击"},为爱丽丝添加 物理积蓄效率提高 的Buff") + print( + f"【爱丽丝事件】检测到爱丽丝触发{'强击' if signal == LBS.ASSAULT_SPAWN else '极性强击'},为爱丽丝添加 物理积蓄效率提高 的Buff" + ) diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceDisorderListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceDisorderListener.py index 0283bfe8..9d3c8e43 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceDisorderListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceDisorderListener.py @@ -1,12 +1,14 @@ from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener -from zsim.define import ALICE_REPORT if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceDisorderListener(BaseListener): @@ -40,5 +42,6 @@ def listener_active(self, **kwargs): f"【爱丽丝事件】紊乱监听器监听到紊乱结算,即将为爱丽丝回复{self.update_value}点剑仪值!" ) from zsim.sim_progress.Character.Alice import Alice + assert isinstance(self.char, Alice) self.char.update_blade_etiquette(update_obj=self.update_value) diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceDotTriggerListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceDotTriggerListener.py index 11baab58..55416847 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceDotTriggerListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceDotTriggerListener.py @@ -1,12 +1,14 @@ from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener -from zsim.define import ALICE_REPORT if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceDotTriggerListener(BaseListener): @@ -34,9 +36,10 @@ def listener_active(self, **kwargs): "【爱丽丝核心被动Dot监听器警告】敌人当前的状态不符合核心被动激活条件,请检查!" ) - from zsim.sim_progress.Update.UpdateAnomaly import spawn_normal_dot from copy import deepcopy + from zsim.sim_progress.Update.UpdateAnomaly import spawn_normal_dot + """ 解释:deepcopy的对象为何来自enemy.anomaly_bars_dict而非enemy.dynamic.active_anomaly_bar_dicts? 监听器的激活时间点位于enemy.dynamic.assault被赋值为True的时间点, diff --git a/zsim/sim_progress/data_struct/BattleEventListener/AliceNAEnhancementListener.py b/zsim/sim_progress/data_struct/BattleEventListener/AliceNAEnhancementListener.py index 08caeb0d..d39bc582 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/AliceNAEnhancementListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/AliceNAEnhancementListener.py @@ -1,12 +1,14 @@ from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener -from zsim.define import ALICE_REPORT if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator - from zsim.sim_progress.Character.character import Character from zsim.sim_progress.Character.Alice import Alice + from zsim.sim_progress.Character.character import Character + from zsim.simulator.simulator_class import Simulator class AliceNAEnhancementListener(BaseListener): @@ -30,5 +32,6 @@ def listener_active(self, **kwargs): self.sim_instance.schedule_data.change_process_state() print("【爱丽丝事件】监听到强击事件触发!爱丽丝获得1次强化A5次数") from zsim.sim_progress.Character.Alice import Alice + assert isinstance(self.char, Alice) self.char.na_enhancement_state = True diff --git a/zsim/sim_progress/data_struct/BattleEventListener/BaseListenerClass.py b/zsim/sim_progress/data_struct/BattleEventListener/BaseListenerClass.py index 2911484e..b0258ff8 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/BaseListenerClass.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/BaseListenerClass.py @@ -1,11 +1,12 @@ from abc import ABC, abstractmethod -from zsim.models.event_enums import ListenerBroadcastSignal as LBS from typing import TYPE_CHECKING +from zsim.models.event_enums import ListenerBroadcastSignal as LBS + if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.Character.character import Character from zsim.sim_progress.Enemy import Enemy + from zsim.simulator.simulator_class import Simulator class BaseListener(ABC): diff --git a/zsim/sim_progress/data_struct/BattleEventListener/CinderCobaltListener.py b/zsim/sim_progress/data_struct/BattleEventListener/CinderCobaltListener.py index 02c26e84..5012941f 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/CinderCobaltListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/CinderCobaltListener.py @@ -1,5 +1,7 @@ from typing import TYPE_CHECKING + from zsim.models.event_enums import ListenerBroadcastSignal as LBS + from .BaseListenerClass import BaseListener if TYPE_CHECKING: diff --git a/zsim/sim_progress/data_struct/BattleEventListener/FangedMetalListener.py b/zsim/sim_progress/data_struct/BattleEventListener/FangedMetalListener.py index 22584641..fd7fc870 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/FangedMetalListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/FangedMetalListener.py @@ -1,8 +1,9 @@ from typing import TYPE_CHECKING -from .BaseListenerClass import BaseListener from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from .BaseListenerClass import BaseListener + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator @@ -24,7 +25,12 @@ def listener_active(self, **kwargs): """獠牙重金属4的监听器激活时,为佩戴者添加增伤buff""" from zsim.sim_progress.Buff.BuffAddStrategy import buff_add_strategy from zsim.sim_progress.Character.character import Character + target = kwargs.get("target") - assert isinstance(target, Character), "獠牙重金属4的监听器激活时,传入激活函数的target参数必须是Character类" + assert isinstance(target, Character), ( + "獠牙重金属4的监听器激活时,传入激活函数的target参数必须是Character类" + ) benifit_list = [target.NAME] - buff_add_strategy(self.buff_index, benifit_list=benifit_list, sim_instance=self.sim_instance) + buff_add_strategy( + self.buff_index, benifit_list=benifit_list, sim_instance=self.sim_instance + ) diff --git a/zsim/sim_progress/data_struct/BattleEventListener/HeartstringNocturneListener.py b/zsim/sim_progress/data_struct/BattleEventListener/HeartstringNocturneListener.py index 98391a2e..5d4873d3 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/HeartstringNocturneListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/HeartstringNocturneListener.py @@ -1,8 +1,9 @@ from typing import TYPE_CHECKING -from .BaseListenerClass import BaseListener from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from .BaseListenerClass import BaseListener + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/data_struct/BattleEventListener/HormonePunkListener.py b/zsim/sim_progress/data_struct/BattleEventListener/HormonePunkListener.py index 8bd365e3..7ce10b30 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/HormonePunkListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/HormonePunkListener.py @@ -1,8 +1,9 @@ from typing import TYPE_CHECKING -from .BaseListenerClass import BaseListener from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from .BaseListenerClass import BaseListener + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/data_struct/BattleEventListener/HugoCorePassiveBuffListener.py b/zsim/sim_progress/data_struct/BattleEventListener/HugoCorePassiveBuffListener.py index 2acd81e6..3510719d 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/HugoCorePassiveBuffListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/HugoCorePassiveBuffListener.py @@ -1,8 +1,9 @@ from typing import TYPE_CHECKING -from .BaseListenerClass import BaseListener from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from .BaseListenerClass import BaseListener + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/data_struct/BattleEventListener/PracticedPerfectionPhyDmgBonusListener.py b/zsim/sim_progress/data_struct/BattleEventListener/PracticedPerfectionPhyDmgBonusListener.py index 901ec45e..0db595d1 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/PracticedPerfectionPhyDmgBonusListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/PracticedPerfectionPhyDmgBonusListener.py @@ -1,7 +1,9 @@ from typing import TYPE_CHECKING -from .BaseListenerClass import BaseListener + from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from .BaseListenerClass import BaseListener + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/data_struct/BattleEventListener/YixuanAnomalyListener.py b/zsim/sim_progress/data_struct/BattleEventListener/YixuanAnomalyListener.py index a808988c..e43e4522 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/YixuanAnomalyListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/YixuanAnomalyListener.py @@ -1,9 +1,9 @@ from typing import TYPE_CHECKING from zsim.define import YIXUAN_REPORT +from zsim.models.event_enums import ListenerBroadcastSignal as LBS from .BaseListenerClass import BaseListener -from zsim.models.event_enums import ListenerBroadcastSignal as LBS if TYPE_CHECKING: from zsim.sim_progress.Character.Yixuan import Yixuan diff --git a/zsim/sim_progress/data_struct/BattleEventListener/ZanshinHerbCaseListener.py b/zsim/sim_progress/data_struct/BattleEventListener/ZanshinHerbCaseListener.py index 21c8efd2..5410cc29 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/ZanshinHerbCaseListener.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/ZanshinHerbCaseListener.py @@ -1,8 +1,9 @@ from typing import TYPE_CHECKING -from .BaseListenerClass import BaseListener from zsim.models.event_enums import ListenerBroadcastSignal as LBS +from .BaseListenerClass import BaseListener + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/data_struct/BattleEventListener/__init__.py b/zsim/sim_progress/data_struct/BattleEventListener/__init__.py index 38d7e29b..7c3098e5 100644 --- a/zsim/sim_progress/data_struct/BattleEventListener/__init__.py +++ b/zsim/sim_progress/data_struct/BattleEventListener/__init__.py @@ -17,7 +17,9 @@ class ListenerManger: def __init__(self, sim_instance: "Simulator"): self.sim_instance = sim_instance - self._listeners_group: defaultdict[str | int, dict[str, BaseListener]] = defaultdict(dict) # 监听器组 的ID 可能是角色的CID(int),也可能是文本“enemy” + self._listeners_group: defaultdict[str | int, dict[str, BaseListener]] = defaultdict( + dict + ) # 监听器组 的ID 可能是角色的CID(int),也可能是文本“enemy” self.__listener_map: dict[str, str] = { "Hugo_1": "HugoCorePassiveBuffListener", "Hormone_Punk_1": "HormonePunkListener", @@ -36,7 +38,7 @@ def __init__(self, sim_instance: "Simulator"): "Alice_Cinema_1_B": "AliceCinema1BladeEtquitteRecoverListener", "Alice_Cinema_2_A": "AliceCinema2DisorderDmgBonus", "PracticedPerfection_1": "PracticedPerfectionPhyDmgBonusListener", - "Fanged_Metal_1": "FangedMetalListener" + "Fanged_Metal_1": "FangedMetalListener", } def add_listener(self, listener_owner: "Character | Enemy | None", listener: BaseListener): @@ -99,13 +101,16 @@ def listener_factory( except ModuleNotFoundError: raise ValueError("在初始化阶段调用监听器工厂函数时,找不到对应的监听器模块!") else: - raise ValueError(f"在初始化阶段调用监听器工厂函数时,未找到ID为 {initiate_signal} 的监听器类!") + raise ValueError( + f"在初始化阶段调用监听器工厂函数时,未找到ID为 {initiate_signal} 的监听器类!" + ) def get_listener( self, listener_owner: "Character | Enemy | None", listener_id: str ) -> BaseListener | None: """获取指定监听器""" from zsim.sim_progress.Character.character import Character + if listener_owner is None: raise TypeError("监听器所有者不能为空") diff --git a/zsim/sim_progress/data_struct/NormalAttackManager/NAManagerClasses.py b/zsim/sim_progress/data_struct/NormalAttackManager/NAManagerClasses.py index 9414aa25..60c4a991 100644 --- a/zsim/sim_progress/data_struct/NormalAttackManager/NAManagerClasses.py +++ b/zsim/sim_progress/data_struct/NormalAttackManager/NAManagerClasses.py @@ -47,9 +47,10 @@ class SeedNAManager(BaseNAManager): def __init__(self, char_obj: "Character | Seed", rule_inventory_dict: dict): super().__init__(char_obj, rule_inventory_dict) from zsim.sim_progress.Character.Seed import Seed + self.char: Seed = char_obj self.na_rule_inventory = rule_inventory_dict self.RULE_MAP = { "default": lambda: not self.char.steel_charge_enough, - "steel_charge_enough": lambda: self.char.steel_charge_enough + "steel_charge_enough": lambda: self.char.steel_charge_enough, } diff --git a/zsim/sim_progress/data_struct/NormalAttackManager/__init__.py b/zsim/sim_progress/data_struct/NormalAttackManager/__init__.py index fd34912a..91cda7fe 100644 --- a/zsim/sim_progress/data_struct/NormalAttackManager/__init__.py +++ b/zsim/sim_progress/data_struct/NormalAttackManager/__init__.py @@ -26,4 +26,3 @@ def na_manager_factory(char_obj) -> BaseNAManager: char_na_dict = all_default_na_dict.get(str(char_cid)) dict_input = {"default": char_na_dict} return BaseNAManager(char_obj, dict_input) - diff --git a/zsim/sim_progress/data_struct/PolarizedAssaultEventClass.py b/zsim/sim_progress/data_struct/PolarizedAssaultEventClass.py index 51db195c..ee72d49c 100644 --- a/zsim/sim_progress/data_struct/PolarizedAssaultEventClass.py +++ b/zsim/sim_progress/data_struct/PolarizedAssaultEventClass.py @@ -1,20 +1,25 @@ -from zsim.define import ELEMENT_TYPE_MAPPING as ETM, ALICE_REPORT -from zsim.models.event_enums import ListenerBroadcastSignal as LBS from copy import deepcopy from typing import TYPE_CHECKING + +from zsim.define import ALICE_REPORT +from zsim.define import ELEMENT_TYPE_MAPPING as ETM +from zsim.models.event_enums import ListenerBroadcastSignal as LBS + if TYPE_CHECKING: from zsim.sim_progress.anomaly_bar import AnomalyBar from zsim.sim_progress.anomaly_bar.CopyAnomalyForOutput import Disorder - from zsim.sim_progress.Preload import SkillNode from zsim.sim_progress.Character.character import Character + from zsim.sim_progress.Preload import SkillNode class PolarizedAssaultEvent: - def __init__(self, - execute_tick: int, - anomlay_bar: "AnomalyBar", - char_instance: "Character", - skill_node: "SkillNode"): + def __init__( + self, + execute_tick: int, + anomlay_bar: "AnomalyBar", + char_instance: "Character", + skill_node: "SkillNode", + ): """这是爱丽丝的极性强击事件,该事件拥有最低的优先级,保证自己能够在本tick的最后才被递归执行 Args: execute_tick: int: 该事件在Schedule阶段,被执行的tick @@ -22,24 +27,34 @@ def __init__(self, char_instance: Character: 爱丽丝的char实例 skill_node: SkillNode: 触发极性强击事件的触发源(应该是大招或是三蓄力普攻) """ - self.execute_tick = execute_tick # 被执行时间 - self.schedule_priority = 998 # 该事件永远在被执行tick的末轮递归中执行 - self.anomaly_bar: "AnomalyBar" = anomlay_bar # 强击异常条的深拷贝 - assert not self.anomaly_bar.settled, "【极性强击事件警告】构造极性强击事件时,传入的异常条必须是未结算的异常条!" + self.execute_tick = execute_tick # 被执行时间 + self.schedule_priority = 998 # 该事件永远在被执行tick的末轮递归中执行 + self.anomaly_bar: "AnomalyBar" = anomlay_bar # 强击异常条的深拷贝 + assert not self.anomaly_bar.settled, ( + "【极性强击事件警告】构造极性强击事件时,传入的异常条必须是未结算的异常条!" + ) self.anomaly_bar.anomaly_settled() self.anomaly_bar.rename_tag = "极性强击" self.char: "Character" = char_instance if self.char.NAME != "爱丽丝": - raise ValueError(f"【极性强击事件警告】构造极性强击事件时,传入的Char实例并非爱丽丝,而是{self.char.NAME}") - self.skill_node: "SkillNode" = skill_node # 极性强击触发源头 - self.allowed_skill_tag_list: list[str] = ["1401_SNA_3", "1401_Q"] # 合法的极性强击触发源 + raise ValueError( + f"【极性强击事件警告】构造极性强击事件时,传入的Char实例并非爱丽丝,而是{self.char.NAME}" + ) + self.skill_node: "SkillNode" = skill_node # 极性强击触发源头 + self.allowed_skill_tag_list: list[str] = ["1401_SNA_3", "1401_Q"] # 合法的极性强击触发源 if self.skill_node.skill_tag not in self.allowed_skill_tag_list: - raise ValueError(f"【极性强击事件警告】检测到非法的极性强击触发源:{skill_node.skill_tag}") + raise ValueError( + f"【极性强击事件警告】检测到非法的极性强击触发源:{skill_node.skill_tag}" + ) else: if skill_node.skill_tag == "1401_Q" and self.char.cinema < 2: - raise ValueError("【极性强击事件警告】检测到低于2画的爱丽丝企图用 大招 触发极性强击") + raise ValueError( + "【极性强击事件警告】检测到低于2画的爱丽丝企图用 大招 触发极性强击" + ) if self.anomaly_bar.element_type != 0: - raise ValueError(f"【极性强击事件警告】构造极性强击事件时,必须传入物理异常条的深拷贝!当前传入的异常条属性为:{ETM[self.anomaly_bar.element_type]}") + raise ValueError( + f"【极性强击事件警告】构造极性强击事件时,必须传入物理异常条的深拷贝!当前传入的异常条属性为:{ETM[self.anomaly_bar.element_type]}" + ) self.sim_instance = self.anomaly_bar.sim_instance def execute(self): @@ -47,21 +62,27 @@ def execute(self): # 先添加一次极性强击; event_list = self.sim_instance.schedule_data.event_list enemy = self.sim_instance.enemy - self.sim_instance.listener_manager.broadcast_event(event=self.anomaly_bar, signal=LBS.POLARIZED_ASSAULT_SPAWN) + self.sim_instance.listener_manager.broadcast_event( + event=self.anomaly_bar, signal=LBS.POLARIZED_ASSAULT_SPAWN + ) # if self.anomaly_bar.settled: event_list.append(self.anomaly_bar) if ALICE_REPORT: self.sim_instance.schedule_data.change_process_state() - print(f"【爱丽丝事件】{self.skill_node.skill.skill_text} 触发的极性强击事件结算!向事件列表添加一个强击异常!") + print( + f"【爱丽丝事件】{self.skill_node.skill.skill_text} 触发的极性强击事件结算!向事件列表添加一个强击异常!" + ) # 更新畏缩状态 from zsim.sim_progress.Update.UpdateAnomaly import anomaly_effect_active + anomaly_effect_active( bar=self.anomaly_bar, timenow=self.sim_instance.tick, enemy=enemy, new_anomaly=self.anomaly_bar, element_type=0, - sim_instance=self.sim_instance) + sim_instance=self.sim_instance, + ) # 再检测敌人是否处于异常状态下,如果敌人当前存在异常状态则立刻触发一次紊乱 active_anomaly_list = enemy.dynamic.get_active_anomaly() if not active_anomaly_list: @@ -77,13 +98,16 @@ def execute(self): """ from zsim.sim_progress.Update.UpdateAnomaly import spawn_output + disorder: "Disorder" = spawn_output( anomaly_bar=anomaly_bar_new, skill_node=self.skill_node, mode_number=1, - sim_instance=self.sim_instance + sim_instance=self.sim_instance, ) event_list.append(disorder) if ALICE_REPORT: self.sim_instance.schedule_data.change_process_state() - print(f"【爱丽丝事件】同时,极性强击事件结算了一次【{ETM[disorder.element_type]}】属性的紊乱!") \ No newline at end of file + print( + f"【爱丽丝事件】同时,极性强击事件结算了一次【{ETM[disorder.element_type]}】属性的紊乱!" + ) diff --git a/zsim/sim_progress/data_struct/SchedulePreload.py b/zsim/sim_progress/data_struct/SchedulePreload.py index be83d319..65d18ef7 100644 --- a/zsim/sim_progress/data_struct/SchedulePreload.py +++ b/zsim/sim_progress/data_struct/SchedulePreload.py @@ -1,8 +1,8 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from zsim.simulator.simulator_class import Simulator from zsim.sim_progress.Preload.PreloadDataClass import PreloadData + from zsim.simulator.simulator_class import Simulator class SchedulePreload: diff --git a/zsim/sim_progress/data_struct/__init__.py b/zsim/sim_progress/data_struct/__init__.py index d1784c5f..a189090d 100644 --- a/zsim/sim_progress/data_struct/__init__.py +++ b/zsim/sim_progress/data_struct/__init__.py @@ -4,12 +4,12 @@ from .DecibelManager.DecibelManagerClass import Decibelmanager from .EnemyAttackEvent import EnemyAttackEventManager from .LinkedList import LinkedList +from .PolarizedAssaultEventClass import PolarizedAssaultEvent from .QuickAssistSystem import QuickAssistEvent, QuickAssistSystem from .SchedulePreload import SchedulePreload, schedule_preload_event_factory from .single_hit import SingleHit from .sp_update_data import ScheduleRefreshData, SPUpdateData from .StunForcedTerminationEvent import StunForcedTerminationEvent -from .PolarizedAssaultEventClass import PolarizedAssaultEvent __all__ = [ "ActionStack", @@ -27,5 +27,5 @@ "SPUpdateData", "ScheduleRefreshData", "StunForcedTerminationEvent", - "PolarizedAssaultEvent" + "PolarizedAssaultEvent", ] diff --git a/zsim/sim_progress/data_struct/data_analyzer.py b/zsim/sim_progress/data_struct/data_analyzer.py index 3a0875c6..536100f5 100644 --- a/zsim/sim_progress/data_struct/data_analyzer.py +++ b/zsim/sim_progress/data_struct/data_analyzer.py @@ -20,7 +20,7 @@ def cal_buff_total_bonus( enabled_buff: Sequence["Buff"], judge_obj: "SkillNode | AnomalyBar | None" = None, sim_instance: "Simulator" = None, - char_name: str | None = None + char_name: str | None = None, ) -> dict[str, float]: """过滤并计算buff总加成。 @@ -42,6 +42,7 @@ def cal_buff_total_bonus( from zsim.sim_progress.anomaly_bar import AnomalyBar from zsim.sim_progress.Buff import Buff from zsim.sim_progress.Preload.SkillsQueue import SkillNode + # FIXME: # 已知bug:武器【时流贤者】的“对佩戴者造成的紊乱伤害增幅”的效果在部分紊乱、极性紊乱上会失效,原因未知,等待继续排查。 buff_obj: Buff @@ -52,9 +53,7 @@ def cal_buff_total_bonus( else: # 检查buff是否激活 if not buff_obj.dy.active: - report_to_log( - f"[Warning] 动态buff列表中混入了未激活buff: {str(buff_obj)},已跳过" - ) + report_to_log(f"[Warning] 动态buff列表中混入了未激活buff: {str(buff_obj)},已跳过") continue # 检查buff的标签是否与技能节点匹配 if judge_obj is not None: @@ -65,12 +64,15 @@ def cal_buff_total_bonus( 这些buff只有在特定条件被满足的情况下才会对当前技能生效——__check_skill_node() 和 __check_special_anomlay()这几个函数就是用来检查这个的。 总之,被continue跳过的Buff一定自带label或是其他的特殊判定条件,并且和当前的检查对象——judge_obj不相符,导致它对当前检测对象无法生效。 """ - if not __check_activation_origin(buff_obj=buff_obj, judge_obj=judge_obj, sim_instance=sim_instance, char_name=char_name): - continue - if isinstance(judge_obj, SkillNode) and not __check_skill_node( - buff_obj, judge_obj + if not __check_activation_origin( + buff_obj=buff_obj, + judge_obj=judge_obj, + sim_instance=sim_instance, + char_name=char_name, ): continue + if isinstance(judge_obj, SkillNode) and not __check_skill_node(buff_obj, judge_obj): + continue if isinstance(judge_obj, AnomalyBar) and not __check_special_anomly( buff_obj, judge_obj ): @@ -86,9 +88,7 @@ def cal_buff_total_bonus( for key, value in buff_obj.effect_dct.items(): # 如果键值对在动态语句字典中,则累加值,否则初始化并赋值 try: - dynamic_statement[key] = ( - dynamic_statement.get(key, 0) + value * count - ) + dynamic_statement[key] = dynamic_statement.get(key, 0) + value * count except TypeError: continue # effect_buff_list.append(buff_obj) @@ -159,7 +159,6 @@ def __check_skill_node(buff: "Buff", skill_node: "SkillNode") -> bool: for _tlk in ALLOWED_LABELS ] ): - has_relevant_labels = True label_satisfied = False @@ -184,16 +183,12 @@ def __check_skill_node(buff: "Buff", skill_node: "SkillNode") -> bool: # print(f'在技能 {skill_tag} 中,成功找到标签 {label_value},') label_satisfied = True - elif __check_label_key( - label_key=label_key, target_label_key="only_trigger_buff_level" - ): + elif __check_label_key(label_key=label_key, target_label_key="only_trigger_buff_level"): if skill_node.skill.trigger_buff_level in label_value: # print(f"{buff.ft.index}对技能{skill_tag}成功生效!") label_satisfied = True - elif __check_label_key( - label_key=label_key, target_label_key="only_back_attack" - ): + elif __check_label_key(label_key=label_key, target_label_key="only_back_attack"): from zsim.sim_progress.RandomNumberGenerator import RNG rng: RNG = buff.sim_instance.rng_instance @@ -201,26 +196,20 @@ def __check_skill_node(buff: "Buff", skill_node: "SkillNode") -> bool: if normalized_value <= BACK_ATTACK_RATE: label_satisfied = True - elif __check_label_key( - label_key=label_key, target_label_key="only_element" - ): + elif __check_label_key(label_key=label_key, target_label_key="only_element"): from zsim.define import ELEMENT_EQUIVALENCE_MAP + if not isinstance(label_value, list): raise TypeError( f"Buff {buff} 的标签 {label_key} 的值存在,对应Value为:{label_value} ,但不是列表类型,请检查初始化或者数据库。" ) for _ele_type in label_value: - if ( - skill_node.element_type - in ELEMENT_EQUIVALENCE_MAP[_ele_type] - ): + if skill_node.element_type in ELEMENT_EQUIVALENCE_MAP[_ele_type]: # 只要找到一种符合要求的元素,就满足这个label label_satisfied = True break - elif __check_label_key( - label_key=label_key, target_label_key="only_skill_type" - ): + elif __check_label_key(label_key=label_key, target_label_key="only_skill_type"): if skill_node.skill.skill_type in label_value: label_satisfied = True @@ -298,7 +287,8 @@ def __check_special_anomly(buff: "Buff", anomaly_node: "AnomalyBar") -> bool: EtherAnomaly, ElectricAnomaly, AuricInkAnomaly, - NewAnomaly] + NewAnomaly, + ], } # 获取buff的标签列表 buff_labels: dict[str, list[str] | str] = buff.ft.label @@ -313,7 +303,7 @@ def __check_special_anomly(buff: "Buff", anomaly_node: "AnomalyBar") -> bool: continue # 检查是否为允许的标签类型 if label_key in ALLOW_LABELS: - if label_key == "only_anomaly": # 特定异常类型的判断 + if label_key == "only_anomaly": # 特定异常类型的判断 # 输入为单个字符串 if isinstance(label_value, str): if label_value in SELECT_ANOMALY_MAP.keys(): @@ -332,7 +322,7 @@ def __check_special_anomly(buff: "Buff", anomaly_node: "AnomalyBar") -> bool: # buff.sim_instance.schedule_data.change_process_state() # print(f"{ELEMENT_TYPE_MAPPING[anomaly_node.element_type]}属性的{type(anomaly_node).__name__}对象成功与{buff.ft.index}匹配") return True - elif label_key == "specified_disorder_element_type": # 制定元素类型的紊乱判断 + elif label_key == "specified_disorder_element_type": # 制定元素类型的紊乱判断 # 首先,它得是个紊乱或是极性紊乱 if not isinstance(anomaly_node, Disorder | PolarityDisorder): continue @@ -349,12 +339,16 @@ def __check_special_anomly(buff: "Buff", anomaly_node: "AnomalyBar") -> bool: return True else: buff.sim_instance.schedule_data.change_process_state() - print(f"【data_analyzer警告】识别到暂无处理逻辑的标签类型:{label_key},故当前buff{buff.ft.index}无法对对象{type(anomaly_node).__name__}生效") + print( + f"【data_analyzer警告】识别到暂无处理逻辑的标签类型:{label_key},故当前buff{buff.ft.index}无法对对象{type(anomaly_node).__name__}生效" + ) return False return False -def __check_activation_origin(buff_obj: "Buff", judge_obj: "SkillNode | AnomalyBar", sim_instance: "Simulator", char_name: str): +def __check_activation_origin( + buff_obj: "Buff", judge_obj: "SkillNode | AnomalyBar", sim_instance: "Simulator", char_name: str +): """检查buff的label是否存在“only_active_by”,然后再检查当前被检项目与源头是否匹配。 - buff_obj: 被检查的buff - judge_obj: 被检查的对象,可能是SkillNode或者异常""" @@ -364,6 +358,7 @@ def __check_activation_origin(buff_obj: "Buff", judge_obj: "SkillNode | AnomalyB return True from zsim.sim_progress.anomaly_bar import AnomalyBar from zsim.sim_progress.Preload import SkillNode + CID_list = buff_obj.ft.label.get("only_active_by") # FIXME: 当队伍中同时存在两把“时流贤者”时,Buff源检验可能会出错,暂不确定。 if CID_list[0] == "self": @@ -374,7 +369,7 @@ def __check_activation_origin(buff_obj: "Buff", judge_obj: "SkillNode | AnomalyB 举例:如果某把武器会给三名队友上一个“自己触发的属性异常的伤害提升”的Buff,那么这里对比的就是触发源的角色以及当前buff的受益者。 所以这里的self指的是beneficiary """ - beneficiary = buff_obj.ft.beneficiary # Buff的实际受益者 + beneficiary = buff_obj.ft.beneficiary # Buff的实际受益者 if isinstance(judge_obj, SkillNode): skill_result = beneficiary == judge_obj.char_name return skill_result diff --git a/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_class.py b/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_class.py index 0442d452..dd56b3d4 100644 --- a/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_class.py +++ b/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_class.py @@ -1,9 +1,11 @@ -from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS from abc import ABC, abstractmethod from typing import TYPE_CHECKING +from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS + if TYPE_CHECKING: from zsim.sim_progress.Enemy import Enemy + from .special_state_manager_class import SpecialStateManager diff --git a/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_manager_class.py b/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_manager_class.py index 82d816be..75e746e2 100644 --- a/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_manager_class.py +++ b/zsim/sim_progress/data_struct/enemy_special_state_manager/special_state_manager_class.py @@ -1,8 +1,11 @@ import importlib -from .special_state_class import EnemySpecialState -from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS, PostInitObjectType as PIOT from typing import TYPE_CHECKING +from zsim.models.event_enums import PostInitObjectType as PIOT +from zsim.models.event_enums import SpecialStateUpdateSignal as SSUS + +from .special_state_class import EnemySpecialState + if TYPE_CHECKING: from zsim.sim_progress.Enemy import Enemy diff --git a/zsim/sim_progress/data_struct/monitor_list_class.py b/zsim/sim_progress/data_struct/monitor_list_class.py index 06eb9a16..8535eb1f 100644 --- a/zsim/sim_progress/data_struct/monitor_list_class.py +++ b/zsim/sim_progress/data_struct/monitor_list_class.py @@ -20,6 +20,7 @@ class MonitoredList(list): def append(self, item): # print(f"添加了{item.ft.index}dot") from zsim.sim_progress.anomaly_bar.AnomalyBarClass import AnomalyBar + if isinstance(item, AnomalyBar): if not item.settled: raise ValueError("不能添加未结算的异常条") diff --git a/zsim/sim_progress/data_struct/single_hit.py b/zsim/sim_progress/data_struct/single_hit.py index 933ffc73..65361586 100644 --- a/zsim/sim_progress/data_struct/single_hit.py +++ b/zsim/sim_progress/data_struct/single_hit.py @@ -1,7 +1,8 @@ from dataclasses import dataclass -import numpy as np from typing import TYPE_CHECKING +import numpy as np + if TYPE_CHECKING: from zsim.sim_progress.Preload import SkillNode diff --git a/zsim/sim_progress/data_struct/sp_update_data.py b/zsim/sim_progress/data_struct/sp_update_data.py index 4c7ab185..5cc241a6 100644 --- a/zsim/sim_progress/data_struct/sp_update_data.py +++ b/zsim/sim_progress/data_struct/sp_update_data.py @@ -22,7 +22,9 @@ def __cal_dynamic_sp_regen(enabled_buff: Generator): return dynamic_sp_regen, dynamic_sp_gain_ratio def get_sp_regen(self) -> float: - sp_regen = (self.static_sp_regen + self.dynamic_sp_regen[0]) * (self.dynamic_sp_regen[1] + 1) + sp_regen = (self.static_sp_regen + self.dynamic_sp_regen[0]) * ( + self.dynamic_sp_regen[1] + 1 + ) return sp_regen diff --git a/zsim/sim_progress/data_struct/summons_event/summons_event_class.py b/zsim/sim_progress/data_struct/summons_event/summons_event_class.py index a5d2844b..cfa16d30 100644 --- a/zsim/sim_progress/data_struct/summons_event/summons_event_class.py +++ b/zsim/sim_progress/data_struct/summons_event/summons_event_class.py @@ -1,7 +1,8 @@ from abc import ABC, abstractmethod -from zsim.sim_progress.summons.summons_class import Summons from typing import TYPE_CHECKING +from zsim.sim_progress.summons.summons_class import Summons + if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/summons/summons_class.py b/zsim/sim_progress/summons/summons_class.py index 3d15dd1e..0dc627f3 100644 --- a/zsim/sim_progress/summons/summons_class.py +++ b/zsim/sim_progress/summons/summons_class.py @@ -1,6 +1,7 @@ -from zsim.sim_progress.Character.character import Character from abc import ABC, abstractmethod +from zsim.sim_progress.Character.character import Character + class Summons(ABC): @abstractmethod diff --git a/zsim/utils/constants.py b/zsim/utils/constants.py index 48c5dc0e..95284d8f 100644 --- a/zsim/utils/constants.py +++ b/zsim/utils/constants.py @@ -1,4 +1,5 @@ import polars as pl + from zsim.define import ElementType @@ -67,7 +68,7 @@ def _init_skill_tag_mapping() -> dict[str, str]: return { _tag: f"{_text if _text else ''}{f' - {_instruction}' if _instruction else ''}" for _tag, _text, _instruction in zip( - mapping["skill_tag"], mapping["skill_text"], mapping["INSTRUCTION"] + mapping["skill_tag"], mapping["skill_text"], mapping["INSTRUCTION"], strict=False ) } except Exception as e: @@ -83,7 +84,7 @@ def _init_char_mapping() -> dict[str, str]: try: df = pl.scan_csv("./zsim/data/character.csv") mapping = df.select(["name", "CID"]).collect().to_dict(as_series=False) - return {name: str(cid) for name, cid in zip(mapping["name"], mapping["CID"])} + return {name: str(cid) for name, cid in zip(mapping["name"], mapping["CID"], strict=False)} except Exception as e: print(f"Warning: Failed to load character mapping: {e}") return {} diff --git a/zsim/utils/process_buff_result.py b/zsim/utils/process_buff_result.py index b90b8660..aa603364 100644 --- a/zsim/utils/process_buff_result.py +++ b/zsim/utils/process_buff_result.py @@ -1,11 +1,12 @@ +import asyncio import json import os -import asyncio -import aiofiles -import aiofiles.os from typing import Any +import aiofiles +import aiofiles.os import polars as pl + from zsim.define import results_dir diff --git a/zsim/utils/process_parallel_data.py b/zsim/utils/process_parallel_data.py index b0741289..4370234c 100644 --- a/zsim/utils/process_parallel_data.py +++ b/zsim/utils/process_parallel_data.py @@ -11,6 +11,7 @@ import plotly.graph_objects as go from zsim.define import results_dir + from .constants import stats_trans_mapping from .process_buff_result import prepare_buff_data_and_cache from .process_dmg_result import prepare_dmg_data_and_cache From 565b0c6e7e48b26634c1ad55c3d70ecbc01a8f6a Mon Sep 17 00:00:00 2001 From: TommrraraSnow Date: Sat, 22 Nov 2025 13:57:23 +0800 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84=E5=92=8C=E6=A0=BC=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AF=BC=E5=85=A5=E9=A1=BA=E5=BA=8F=EF=BC=8C?= =?UTF-8?q?=E7=AE=80=E5=8C=96API=E5=93=8D=E5=BA=94=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- zsim/api_src/routes/apl.py | 19 ++++--- zsim/api_src/routes/character_config.py | 66 +++++++++++++++++-------- 3 files changed, 59 insertions(+), 28 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9948a595..0ef2170f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ dependencies = [ line-length = 100 [tool.ruff.lint] -select = ["E", "F", "W", "B", "B9", "I", "Q"] +select = ["E", "F", "W", "I", "Q"] ignore = ["E501"] exclude = ["build", "dist", ".venv", "__pypackages__"] per-file-ignores = { "__init__.py" = ["F401"] } diff --git a/zsim/api_src/routes/apl.py b/zsim/api_src/routes/apl.py index c02dfccb..973b7673 100644 --- a/zsim/api_src/routes/apl.py +++ b/zsim/api_src/routes/apl.py @@ -4,19 +4,20 @@ """ from fastapi import APIRouter, HTTPException, status -from ..services.apl_service import APLService + from ..models.apl import ( + APIResponse, APLConfigCreateRequest, APLConfigUpdateRequest, + APLFileContent, APLFileCreateRequest, + APLFileInfo, APLFileUpdateRequest, - APLValidateRequest, APLParseRequest, - APIResponse, APLTemplateInfo, - APLFileInfo, - APLFileContent, + APLValidateRequest, ) +from ..services.apl_service import APLService router = APIRouter() apl_service = APLService() @@ -326,10 +327,14 @@ async def import_apl_config(file_path: str): try: config_id = apl_service.import_apl_config(file_path) if config_id: - return APIResponse(code=200, message="Success", data={"config_id": config_id, "message": "APL配置导入成功"}) + return APIResponse( + code=200, + message="Success", + data={"config_id": config_id, "message": "APL配置导入成功"}, + ) else: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="APL配置导入失败") except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"导入APL配置失败: {str(e)}" - ) \ No newline at end of file + ) diff --git a/zsim/api_src/routes/character_config.py b/zsim/api_src/routes/character_config.py index 3997989e..78826a2d 100644 --- a/zsim/api_src/routes/character_config.py +++ b/zsim/api_src/routes/character_config.py @@ -1,11 +1,12 @@ import logging -from fastapi import APIRouter, Depends, HTTPException -from typing import List from datetime import datetime +from typing import List + import polars as pl +from fastapi import APIRouter, Depends, HTTPException +from zsim.api_src.services.database.character_db import CharacterDB, get_character_db from zsim.models.character.character_config import CharacterConfig -from zsim.api_src.services.database.character_db import get_character_db, CharacterDB logger = logging.getLogger(__name__) router = APIRouter() @@ -30,12 +31,12 @@ async def get_character_info(name: str, db: CharacterDB = Depends(get_character_ try: df = pl.scan_csv("./zsim/data/character.csv") character_data = df.filter(pl.col("name") == name).collect() - + if character_data.height == 0: raise HTTPException(status_code=404, detail=f"Character {name} not found") - + row = character_data.row(0, named=True) - + # Map element number to element name using the mapping from constants.py element_mapping = { 0: "物理", @@ -46,7 +47,7 @@ async def get_character_info(name: str, db: CharacterDB = Depends(get_character_ 5: "烈霜", 6: "玄墨", } - + character_info = { "name": row["name"], "cid": row["CID"], @@ -73,7 +74,7 @@ async def get_character_info(name: str, db: CharacterDB = Depends(get_character_ "element": "以太", # 示例元素类型 "weapon_type": "音擎", # 示例武器类型 "rarity": 5, # 示例稀有度 - "description": f"{name}的角色描述信息" + "description": f"{name}的角色描述信息", } @@ -95,7 +96,14 @@ async def get_equipments(db: CharacterDB = Depends(get_character_db)): """获取所有可用装备列表""" try: df = pl.scan_csv("./zsim/data/equip_set_2pc.csv") - equipments = df.select("set_ID").filter(pl.col("set_ID").is_not_null()).unique().collect().to_series().to_list() + equipments = ( + df.select("set_ID") + .filter(pl.col("set_ID").is_not_null()) + .unique() + .collect() + .to_series() + .to_list() + ) # Filter out the "0" set which appears to be a placeholder equipments = [eq for eq in equipments if eq != "0"] return equipments @@ -110,7 +118,14 @@ async def get_equipment_sets(db: CharacterDB = Depends(get_character_db)): """获取装备套装信息""" try: df = pl.scan_csv("./zsim/data/equip_set_2pc.csv") - sets = df.select("set_ID").filter(pl.col("set_ID").is_not_null()).unique().collect().to_series().to_list() + sets = ( + df.select("set_ID") + .filter(pl.col("set_ID").is_not_null()) + .unique() + .collect() + .to_series() + .to_list() + ) # Filter out the "0" set which appears to be a placeholder sets = [s for s in sets if s != "0"] return sets @@ -121,19 +136,21 @@ async def get_equipment_sets(db: CharacterDB = Depends(get_character_db)): @router.post("/characters/{name}/configs", response_model=CharacterConfig) -async def create_character_config(name: str, config: CharacterConfig, db: CharacterDB = Depends(get_character_db)): +async def create_character_config( + name: str, config: CharacterConfig, db: CharacterDB = Depends(get_character_db) +): """为指定角色创建配置""" # 检查角色配置是否已存在 existing_config = await db.get_character_config(name, config.config_name) if existing_config: raise HTTPException(status_code=400, detail="角色配置已存在") - + # 设置角色名称和配置ID config.name = name config.config_id = f"{name}_{config.config_name}" config.create_time = datetime.now() config.update_time = datetime.now() - + # 添加到数据库 await db.add_character_config(config) return config @@ -146,7 +163,9 @@ async def list_character_configs(name: str, db: CharacterDB = Depends(get_charac @router.get("/characters/{name}/configs/{config_name}", response_model=CharacterConfig) -async def get_character_config(name: str, config_name: str, db: CharacterDB = Depends(get_character_db)): +async def get_character_config( + name: str, config_name: str, db: CharacterDB = Depends(get_character_db) +): """获取指定角色的特定配置""" config = await db.get_character_config(name, config_name) if not config: @@ -155,30 +174,37 @@ async def get_character_config(name: str, config_name: str, db: CharacterDB = De @router.put("/characters/{name}/configs/{config_name}", response_model=CharacterConfig) -async def update_character_config(name: str, config_name: str, config: CharacterConfig, db: CharacterDB = Depends(get_character_db)): +async def update_character_config( + name: str, + config_name: str, + config: CharacterConfig, + db: CharacterDB = Depends(get_character_db), +): """更新指定角色的特定配置""" # 检查角色配置是否存在 existing_config = await db.get_character_config(name, config_name) if not existing_config: raise HTTPException(status_code=404, detail="角色配置未找到") - + # 设置角色名称、配置名称和配置ID config.name = name config.config_name = config_name config.config_id = f"{name}_{config_name}" - + # 更新数据库 await db.update_character_config(config) return config @router.delete("/characters/{name}/configs/{config_name}", status_code=204) -async def delete_character_config(name: str, config_name: str, db: CharacterDB = Depends(get_character_db)): +async def delete_character_config( + name: str, config_name: str, db: CharacterDB = Depends(get_character_db) +): """删除指定角色的特定配置""" # 检查角色配置是否存在 existing_config = await db.get_character_config(name, config_name) if not existing_config: raise HTTPException(status_code=404, detail="角色配置未找到") - + # 从数据库删除 - await db.delete_character_config(name, config_name) \ No newline at end of file + await db.delete_character_config(name, config_name) From fd3e96a4128bcf08a58ef7f95516207ef635cb4f Mon Sep 17 00:00:00 2001 From: TommrraraSnow Date: Sat, 22 Nov 2025 14:27:10 +0800 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E9=A1=BA=E5=BA=8F=EF=BC=8C=E4=BC=98=E5=8C=96=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=AF=BC=E5=85=A5=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Preload/APLModule/SubConditionUnit/__init__.py | 2 +- zsim/sim_progress/Preload/PreloadDataClass.py | 3 +-- zsim/sim_progress/Preload/__init__.py | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py b/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py index 96ce3639..50627a45 100644 --- a/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py +++ b/zsim/sim_progress/Preload/APLModule/SubConditionUnit/__init__.py @@ -1,6 +1,6 @@ +from .BaseSubConditionUnit import BaseSubConditionUnit # noqa: I001 from .ActionSubUnit import ActionSubUnit from .AttributeSubUnit import AttributeSubUnit -from .BaseSubConditionUnit import BaseSubConditionUnit from .BuffSubUnit import BuffSubUnit from .SpecialSubUnit import SpecialSubUnit from .StatusSubUnit import StatusSubUnit diff --git a/zsim/sim_progress/Preload/PreloadDataClass.py b/zsim/sim_progress/Preload/PreloadDataClass.py index 4498832b..c9b74e33 100644 --- a/zsim/sim_progress/Preload/PreloadDataClass.py +++ b/zsim/sim_progress/Preload/PreloadDataClass.py @@ -1,8 +1,7 @@ from typing import TYPE_CHECKING, Iterable from zsim.models.event_enums import ListenerBroadcastSignal as LBS - -from . import SkillNode +from zsim.sim_progress.Preload.SkillsQueue import SkillNode if TYPE_CHECKING: from zsim.sim_progress.Character.skill_class import Skill diff --git a/zsim/sim_progress/Preload/__init__.py b/zsim/sim_progress/Preload/__init__.py index ab719b1b..67510d47 100644 --- a/zsim/sim_progress/Preload/__init__.py +++ b/zsim/sim_progress/Preload/__init__.py @@ -1,5 +1,4 @@ -# from . import SkillsQueue -from . import watchdog +from . import SkillsQueue, watchdog from .APLModule.APLClass import APLClass from .APLModule.APLJudgeTools import find_char, get_game_state from .APLModule.APLParser import APLParser @@ -9,6 +8,7 @@ __all__ = [ "watchdog", + "SkillsQueue", "SkillNode", "APLParser", "APLClass", From 79ed7512b084a56ae7296ebf7392827a5310c8c0 Mon Sep 17 00:00:00 2001 From: TommrraraSnow Date: Sat, 22 Nov 2025 14:35:18 +0800 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E7=BB=93=E6=9E=84=EF=BC=8C=E7=AE=80=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zsim/sim_progress/Preload/PreloadDataClass.py | 17 ++-- .../Preload/PreloadEngine/APLEngine.py | 6 +- .../Preload/PreloadEngine/ConfirmEngine.py | 4 +- .../Preload/PreloadEngine/ForceAddEngine.py | 2 +- .../PreloadEngine/SwapCancelValidateEngine.py | 88 +++++++++++++------ 5 files changed, 73 insertions(+), 44 deletions(-) diff --git a/zsim/sim_progress/Preload/PreloadDataClass.py b/zsim/sim_progress/Preload/PreloadDataClass.py index c9b74e33..14844612 100644 --- a/zsim/sim_progress/Preload/PreloadDataClass.py +++ b/zsim/sim_progress/Preload/PreloadDataClass.py @@ -1,15 +1,12 @@ from typing import TYPE_CHECKING, Iterable from zsim.models.event_enums import ListenerBroadcastSignal as LBS -from zsim.sim_progress.Preload.SkillsQueue import SkillNode + +from .SkillsQueue import SkillNode if TYPE_CHECKING: from zsim.sim_progress.Character.skill_class import Skill - from zsim.sim_progress.data_struct import ( - EnemyAttackEventManager, - NodeStack, - QuickAssistSystem, - ) + from zsim.sim_progress.data_struct import EnemyAttackEventManager, NodeStack, QuickAssistSystem from zsim.sim_progress.Load.loading_mission import LoadingMission from zsim.simulator.dataclasses import CharacterData, LoadData from zsim.simulator.simulator_class import Simulator @@ -39,7 +36,9 @@ def __init__( self.personal_active_generation_node_stack: dict[ int, "NodeStack[SkillNode]" ] = {} # 个人的主动生成的技能栈 - self.current_node_stack: "NodeStack" = NodeStack(length=5) # Preload阶段的总技能栈 + self.current_node_stack: "NodeStack[SkillNode]" = NodeStack( + length=5 + ) # Preload阶段的总技能栈 self.latest_active_generation_node: SkillNode | None = ( None # 最近一次主动生成的skillnode,#TODO:可能是无用参数! ) @@ -99,9 +98,7 @@ def push_node_in_swap_cancel(self, node: SkillNode, tick: int): self.quick_assist_system.update(tick, node, self.load_data.all_name_order_box) if self.atk_manager is not None and self.atk_manager.attacking: self.atk_manager.answered_action.append(node) - from zsim.sim_progress.Preload.APLModule.ActionReplaceManager import ( - ActionReplaceManager, - ) + from zsim.sim_progress.Preload.APLModule.ActionReplaceManager import ActionReplaceManager action_replace_manager: "ActionReplaceManager" = ( self.sim_instance.preload.strategy.apl_engine.apl.action_replace_manager diff --git a/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py b/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py index 980877b1..3bfb9987 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/APLEngine.py @@ -3,12 +3,12 @@ from zsim.define import APL_PATH, APL_THOUGHT_CHECK from zsim.define import APL_THOUGHT_CHECK_WINDOW as ATCW -from .. import SkillNode, SkillsQueue from ..APLModule import APLManager +from ..SkillsQueue import SkillNode, spawn_node from .BasePreloadEngine import BasePreloadEngine if TYPE_CHECKING: - from .. import PreloadData + from ..PreloadDataClass import PreloadData class APLEngine(BasePreloadEngine): @@ -58,7 +58,7 @@ def run_myself(self, tick) -> SkillNode | None: self.apl_want = (skill_tag, apl_priority, apl_unit) if skill_tag == "wait": return None - node = SkillsQueue.spawn_node( + node = spawn_node( skill_tag, tick, self.data.skills, diff --git a/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py b/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py index 3081d093..f5c35c05 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/ConfirmEngine.py @@ -3,8 +3,8 @@ from zsim.models.event_enums import ListenerBroadcastSignal as LBS from zsim.sim_progress.Report import report_to_log -from .. import SkillNode, SkillsQueue from ..PreloadEngine import BasePreloadEngine +from ..SkillsQueue import SkillNode, spawn_node if TYPE_CHECKING: from zsim.sim_progress.Character import Character @@ -67,7 +67,7 @@ def spawn_node_from_tag( apl_unit = template_node_from_apl.apl_unit else: apl_unit = None - node = SkillsQueue.spawn_node( + node = spawn_node( skill_tag, tick, self.data.skills, diff --git a/zsim/sim_progress/Preload/PreloadEngine/ForceAddEngine.py b/zsim/sim_progress/Preload/PreloadEngine/ForceAddEngine.py index 5af030b1..fc595905 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/ForceAddEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/ForceAddEngine.py @@ -1,8 +1,8 @@ from typing import TYPE_CHECKING -from .. import SkillNode from ..APLModule.APLJudgeTools import get_game_state from ..PreloadEngine import BasePreloadEngine +from ..SkillsQueue import SkillNode if TYPE_CHECKING: from zsim.simulator.simulator_class import Simulator diff --git a/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py b/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py index df767b00..773fa414 100644 --- a/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py +++ b/zsim/sim_progress/Preload/PreloadEngine/SwapCancelValidateEngine.py @@ -11,7 +11,7 @@ SWAP_CANCEL_MODE_LAG_TIME as SCLT, ) -from .. import SkillNode +from ..SkillsQueue import SkillNode from .BasePreloadEngine import BasePreloadEngine # EXPLAIN:关于SCK和LT的作用: @@ -123,7 +123,7 @@ def _validate_char_avaliable( 这样一来,get_effective_node()发现当前node_stack中全部都是附加伤害技能,就直接返回None,导致函数直接放行, 虽然整个SwapCancelValidateEngine内置多个校验器,但是关于角色是否“有空”的校验只有这一个, 这导致一旦本函数放行,后续的校验器将完全默认“角色有空”,最终导致某些场景下的错误判断。 - + 更新后,我在get_effective_node()的返回结果为None的情况下,进一步检查角色的dynamic.lasting_node.node是否为None。 如果dynamic.lasting_node.node也为None,那么说明角色当前确实没有任何动作,角色才是真正“有空的”。 """ @@ -258,7 +258,7 @@ def _validate_char_task_conflict( preload_data中,preload_action_list_before_confirm是一个列表, 其中记录了当前tick要被抛出的动作,其中,每个元素是一个元组, 元组的第一个元素是技能的tag,第二个元素是技能的主动类型,第三个元素是APL的优先级。 - + 对于当前函数来说,APL抛出的动作apl_skill_node尚未进入preload_action_list_before_confirm列表, 此时该列表中的所有技能都来自于ForceAddEngine强行添加。 """ @@ -284,9 +284,11 @@ def _validate_char_task_conflict( or "additional_damage" not in skill_info ): """但若当前tick被force_add 添加的skill_tag只是个普通技能,那么就要执行顶替。""" - print( - f"即将添加的衔接技能:{_tuples}被{skill_tag}顶替!" - ) if SWAP_CANCEL_MODE_DEBUG else None + ( + print(f"即将添加的衔接技能:{_tuples}被{skill_tag}顶替!") + if SWAP_CANCEL_MODE_DEBUG + else None + ) self.data.preload_action_list_before_confirm.remove(_tuples) return True break @@ -404,33 +406,63 @@ def _swap_cancel_debug_print( if mode == 0: print("APL返回的结果是wait!") elif mode == 1: - print(f"{skill_tag}所涉及角色当前没空!") if not skill_compare else print( - f"{skill_tag}所涉及角色当前没空!" - ) if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL else None + ( + print(f"{skill_tag}所涉及角色当前没空!") + if not skill_compare + else ( + print(f"{skill_tag}所涉及角色当前没空!") + if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL + else None + ) + ) elif mode == 2: - print( - f"{skill_tag}所涉及角色当前tick存在任务冲突,合轴失败!" - ) if not skill_compare else ( - print(f"{skill_tag}所涉所涉及角色当前tick存在任务冲突,合轴失败!及角色当前没空!") - if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL - else None + ( + print(f"{skill_tag}所涉及角色当前tick存在任务冲突,合轴失败!") + if not skill_compare + else ( + print( + f"{skill_tag}所涉所涉及角色当前tick存在任务冲突,合轴失败!及角色当前没空!" + ) + if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL + else None + ) ) elif mode == 3: - print( - f"{skill_tag}所涉及角色切人CD未就绪 或是 技能优先级低于前台技能,合轴失败!" - ) if not skill_compare else print( - f"{skill_tag}所涉及角色切人CD未就绪 或是 技能优先级低于前台技能,合轴失败!" - ) if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL else None + ( + print(f"{skill_tag}所涉及角色切人CD未就绪 或是 技能优先级低于前台技能,合轴失败!") + if not skill_compare + else ( + print( + f"{skill_tag}所涉及角色切人CD未就绪 或是 技能优先级低于前台技能,合轴失败!" + ) + if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL + else None + ) + ) elif mode == 4: - print(f"当前tick不满足{skill_tag}合轴所需的时间!") if not skill_compare else print( - f"当前tick不满足{skill_tag}合轴所需的时间!" - ) if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL else None + ( + print(f"当前tick不满足{skill_tag}合轴所需的时间!") + if not skill_compare + else ( + print(f"当前tick不满足{skill_tag}合轴所需的时间!") + if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL + else None + ) + ) elif mode == 5: if last_actively_generated_node: - print( - f"{skill_tag}的上一个主动动作{last_actively_generated_node.skill.skill_tag}的APL策略为不要合轴!" - ) if not skill_compare else print( - f"{skill_tag}的上一个主动动作{last_actively_generated_node.skill.skill_tag}的APL策略为不要合轴!" - ) if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL else None + ( + print( + f"{skill_tag}的上一个主动动作{last_actively_generated_node.skill.skill_tag}的APL策略为不要合轴!" + ) + if not skill_compare + else ( + print( + f"{skill_tag}的上一个主动动作{last_actively_generated_node.skill.skill_tag}的APL策略为不要合轴!" + ) + if skill_tag == SWAP_CANCEL_DEBUG_TARGET_SKILL + else None + ) + ) else: raise ValueError("mode参数错误!")