From c54b75611d1ea00be94a95a4392b99b945171128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 2 Apr 2026 15:34:18 +0800 Subject: [PATCH 01/21] Go Test --- backend/go/README.md | 53 +++ backend/go/cmd/dcalc/main.go | 52 +++ backend/go/go.mod | 20 + backend/go/go.sum | 53 +++ backend/go/internal/config/config.go | 90 +++++ backend/go/internal/httpserver/router.go | 301 ++++++++++++++ backend/go/internal/model/response.go | 15 + backend/go/internal/service/adventure.go | 137 +++++++ backend/go/internal/service/cache.go | 44 ++ backend/go/internal/service/calc.go | 34 ++ backend/go/internal/service/character.go | 21 + backend/go/internal/service/colg.go | 304 ++++++++++++++ .../service/equipment_catalog_sqlite.go | 295 ++++++++++++++ backend/go/internal/service/openapi.go | 264 ++++++++++++ backend/go/internal/service/python_adapter.go | 83 ++++ backend/go/internal/service/skilltree.go | 376 ++++++++++++++++++ backend/go/internal/service/token.go | 62 +++ backend/go/python_bridge.py | 77 ++++ 18 files changed, 2281 insertions(+) create mode 100644 backend/go/README.md create mode 100644 backend/go/cmd/dcalc/main.go create mode 100644 backend/go/go.mod create mode 100644 backend/go/go.sum create mode 100644 backend/go/internal/config/config.go create mode 100644 backend/go/internal/httpserver/router.go create mode 100644 backend/go/internal/model/response.go create mode 100644 backend/go/internal/service/adventure.go create mode 100644 backend/go/internal/service/cache.go create mode 100644 backend/go/internal/service/calc.go create mode 100644 backend/go/internal/service/character.go create mode 100644 backend/go/internal/service/colg.go create mode 100644 backend/go/internal/service/equipment_catalog_sqlite.go create mode 100644 backend/go/internal/service/openapi.go create mode 100644 backend/go/internal/service/python_adapter.go create mode 100644 backend/go/internal/service/skilltree.go create mode 100644 backend/go/internal/service/token.go create mode 100644 backend/go/python_bridge.py diff --git a/backend/go/README.md b/backend/go/README.md new file mode 100644 index 00000000..6d7e37dc --- /dev/null +++ b/backend/go/README.md @@ -0,0 +1,53 @@ +# dcalc Go 重构骨架 + +这个目录是对现有 Python 后端的并行 Go 重构,不直接替换原服务。 + +当前已迁移: + +- 通用响应结构与 HTTP 入口 +- CORS、压缩、中间件基础设施 +- 冒险团职业列表与 token 生成 +- openapi 静态数据读取接口 +- 基于 alter_token 的技能详情接口 +- colg 金价查询接口 +- /api/character 静态职业与装备目录信息 +- /api/skillTree/ 编码解码逻辑(Go 实现) +- Python 适配层(职业工厂依赖收口) + +兼容性说明: + +- jobInfo 接口保持与 Python 一致,返回目录名风格的 jobId 和 jobGrowId +- skills 和 skillDetail 路由同时兼容目录名参数与 Neople UUID 参数 + +当前未迁移: + +- 角色构建与伤害计算公式本体 +- DNFHelper 集成 +- MCP 服务 + +当前架构: + +- skillTree 的 base64/zlib/binary 解码已经迁移到 Go +- createCharacter 依赖通过 go/python_bridge.py 适配层收口 +- calc 域已拆出 CharacterFactory 与 EquipmentCatalogRepository 边界,便于后续逐步替换 Python 依赖 + +运行: + +```bash +cd go +go run ./cmd/dcalc +``` + +可选环境变量: + +- PORT +- DEBUG_MODE +- COLG_TOKEN +- HELPER_TOKEN +- HELPER_ID + +建议迁移顺序: + +1. 先把 createCharacter 工厂后的领域模型拆成 Go interface 和 package。 +2. 再迁装备/套装/技能数据库读取层。 +3. 最后逐职业迁技能公式与计算逻辑。 diff --git a/backend/go/cmd/dcalc/main.go b/backend/go/cmd/dcalc/main.go new file mode 100644 index 00000000..1ca45b94 --- /dev/null +++ b/backend/go/cmd/dcalc/main.go @@ -0,0 +1,52 @@ +package main + +import ( + "log" + "net/http" + + "dcalc-go/internal/config" + "dcalc-go/internal/httpserver" + "dcalc-go/internal/service" +) + +func main() { + cfg, err := config.Load() + if err != nil { + log.Fatalf("load config: %v", err) + } + + cache := service.NewCache() + adventureService, err := service.NewAdventureService(cfg.ProjectRoot, cache) + if err != nil { + log.Fatalf("load adventure data: %v", err) + } + + openAPIService := service.NewOpenAPIService(cfg.ProjectRoot, cache, adventureService) + colgService := service.NewColgService(cache, cfg) + tokenService := service.NewTokenService(adventureService) + characterFactory := service.NewPythonCharacterFactory(cfg) + characterService := service.NewCharacterService(cache, characterFactory) + skillTreeService, err := service.NewSkillTreeService(cfg.ProjectRoot, adventureService, characterFactory) + if err != nil { + log.Fatalf("load skill tree service: %v", err) + } + equipmentRepository := service.NewSQLiteEquipmentCatalogRepository(cfg.ProjectRoot) + calcService := service.NewCalcService(characterFactory, equipmentRepository) + + router := httpserver.NewRouter(httpserver.Dependencies{ + Config: cfg, + AdventureService: adventureService, + OpenAPIService: openAPIService, + ColgService: colgService, + TokenService: tokenService, + CharacterService: characterService, + SkillTreeService: skillTreeService, + CalcService: calcService, + }) + + addr := ":" + cfg.Port + log.Printf("dcalc go server listening on %s", addr) + if err := http.ListenAndServe(addr, router); err != nil { + log.Fatalf("listen and serve: %v", err) + } +} diff --git a/backend/go/go.mod b/backend/go/go.mod new file mode 100644 index 00000000..f73c8732 --- /dev/null +++ b/backend/go/go.mod @@ -0,0 +1,20 @@ +module dcalc-go + +go 1.25.0 + +require ( + github.com/go-chi/chi/v5 v5.2.3 + modernc.org/sqlite v1.48.0 +) + +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + golang.org/x/sys v0.42.0 // indirect + modernc.org/libc v1.70.0 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect +) diff --git a/backend/go/go.sum b/backend/go/go.sum new file mode 100644 index 00000000..3a9318dc --- /dev/null +++ b/backend/go/go.sum @@ -0,0 +1,53 @@ +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= +github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= +modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw= +modernc.org/ccgo/v4 v4.32.0/go.mod h1:6F08EBCx5uQc38kMGl+0Nm0oWczoo1c7cgpzEry7Uc0= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= +modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.70.0 h1:U58NawXqXbgpZ/dcdS9kMshu08aiA6b7gusEusqzNkw= +modernc.org/libc v1.70.0/go.mod h1:OVmxFGP1CI/Z4L3E0Q3Mf1PDE0BucwMkcXjjLntvHJo= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.48.0 h1:ElZyLop3Q2mHYk5IFPPXADejZrlHu7APbpB0sF78bq4= +modernc.org/sqlite v1.48.0/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/backend/go/internal/config/config.go b/backend/go/internal/config/config.go new file mode 100644 index 00000000..4d9d881c --- /dev/null +++ b/backend/go/internal/config/config.go @@ -0,0 +1,90 @@ +package config + +import ( + "fmt" + "os" + "path/filepath" + "strconv" +) + +type Config struct { + Port string + DebugMode bool + ColgToken string + HelperToken string + HelperID string + PythonExec string + ProjectRoot string +} + +func Load() (Config, error) { + projectRoot, err := detectProjectRoot() + if err != nil { + return Config{}, err + } + + return Config{ + Port: envOrDefault("PORT", "27173"), + DebugMode: envBoolOrDefault("DEBUG_MODE", true), + ColgToken: os.Getenv("COLG_TOKEN"), + HelperToken: os.Getenv("HELPER_TOKEN"), + HelperID: os.Getenv("HELPER_ID"), + PythonExec: pythonExecOrDefault(projectRoot), + ProjectRoot: projectRoot, + }, nil +} + +func pythonExecOrDefault(projectRoot string) string { + if value := os.Getenv("PYTHON_EXEC"); value != "" { + return value + } + venvPython := filepath.Join(projectRoot, ".venv", "bin", "python") + if fileExists(venvPython) { + return venvPython + } + return "python3" +} + +func detectProjectRoot() (string, error) { + wd, err := os.Getwd() + if err != nil { + return "", err + } + + current := wd + for { + if fileExists(filepath.Join(current, "openapi", "jobs.json")) { + return current, nil + } + + parent := filepath.Dir(current) + if parent == current { + return "", fmt.Errorf("unable to locate project root from %s", wd) + } + current = parent + } +} + +func fileExists(path string) bool { + _, err := os.Stat(path) + return err == nil +} + +func envOrDefault(key, fallback string) string { + if value := os.Getenv(key); value != "" { + return value + } + return fallback +} + +func envBoolOrDefault(key string, fallback bool) bool { + value := os.Getenv(key) + if value == "" { + return fallback + } + parsed, err := strconv.ParseBool(value) + if err != nil { + return fallback + } + return parsed +} diff --git a/backend/go/internal/httpserver/router.go b/backend/go/internal/httpserver/router.go new file mode 100644 index 00000000..22312201 --- /dev/null +++ b/backend/go/internal/httpserver/router.go @@ -0,0 +1,301 @@ +package httpserver + +import ( + "encoding/json" + "errors" + "io" + "net/http" + "strconv" + "strings" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" + + "dcalc-go/internal/config" + "dcalc-go/internal/model" + "dcalc-go/internal/service" +) + +type Dependencies struct { + Config config.Config + AdventureService *service.AdventureService + OpenAPIService *service.OpenAPIService + ColgService *service.ColgService + TokenService *service.TokenService + CharacterService *service.CharacterService + SkillTreeService *service.SkillTreeService + CalcService *service.CalcService +} + +func NewRouter(dep Dependencies) http.Handler { + r := chi.NewRouter() + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + r.Use(middleware.Compress(5, "application/json")) + r.Use(cors) + + r.Get("/healthz", func(w http.ResponseWriter, _ *http.Request) { + writeJSON(w, http.StatusOK, model.Success(map[string]any{"service": "dcalc-go", "debug": dep.Config.DebugMode})) + }) + + r.Route("/api", func(r chi.Router) { + r.Get("/adventure", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.AdventureService.AdventureList() + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/token/get/{alter}", func(w http.ResponseWriter, r *http.Request) { + token, err := dep.TokenService.Create(chi.URLParam(r, "alter"), r.URL.Query().Get("equVersion")) + if err != nil { + writeJSON(w, http.StatusBadRequest, model.Error(400, err.Error(), nil)) + return + } + writeJSON(w, http.StatusOK, model.Success(token)) + }) + + r.Get("/character", func(w http.ResponseWriter, r *http.Request) { + payload, ok := requireAlterToken(w, r, dep.TokenService) + if !ok { + return + } + data, err := dep.CharacterService.StaticInfo(payload.Alter, payload.EquVersion) + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Post("/calc", func(w http.ResponseWriter, r *http.Request) { + payload, ok := requireAlterToken(w, r, dep.TokenService) + if !ok { + return + } + + var body map[string]any + if err := json.NewDecoder(r.Body).Decode(&body); err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, http.ErrBodyNotAllowed) { + writeJSON(w, http.StatusBadRequest, model.Error(400, "invalid request body", nil)) + return + } + + data, err := dep.CalcService.Calculate(payload.Alter, payload.EquVersion, body) + if err != nil { + writeNotImplemented(w, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/skill/{skillId}/{level}", func(w http.ResponseWriter, r *http.Request) { + payload, ok := requireAlterToken(w, r, dep.TokenService) + if !ok { + return + } + level, err := strconv.Atoi(chi.URLParam(r, "level")) + if err != nil { + writeJSON(w, http.StatusBadRequest, model.Error(400, "level must be an integer", nil)) + return + } + data, err := dep.OpenAPIService.SkillDetailByAlter(payload.Alter, chi.URLParam(r, "skillId"), level) + if err != nil { + writeJSON(w, http.StatusNotFound, model.Error(404, err.Error(), nil)) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/dnfhelper/{uid}/", func(w http.ResponseWriter, _ *http.Request) { + writeJSON(w, http.StatusNotImplemented, model.Error(501, "dnfhelper integration is pending migration", nil)) + }) + + r.Post("/skillTree/", func(w http.ResponseWriter, r *http.Request) { + payload, ok := requireAlterToken(w, r, dep.TokenService) + if !ok { + return + } + + var body map[string]any + if err := json.NewDecoder(r.Body).Decode(&body); err != nil && !errors.Is(err, io.EOF) { + writeJSON(w, http.StatusBadRequest, model.Error(400, "invalid request body", nil)) + return + } + code, _ := body["code"].(string) + result, err := dep.SkillTreeService.Parse(code, payload.EquVersion) + if err != nil { + writeJSON(w, http.StatusInternalServerError, model.Error(500, "解析技能加点失败", nil)) + return + } + if result.Job["class"] != payload.Alter { + writeJSON(w, http.StatusInternalServerError, model.Error(500, "技能加点代码职业与登录职业不匹配", nil)) + return + } + writeJSON(w, http.StatusOK, model.Success(result)) + }) + + r.Route("/open", func(r chi.Router) { + r.Get("/skills/", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.OpenAPIService.SearchSkills(r.URL.Query().Get("skillName")) + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/jobInfo/", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.OpenAPIService.JobsInfo(r.URL.Query().Get("jobName")) + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/skillData/summary/", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.OpenAPIService.SkillDataSummary( + r.URL.Query().Get("job"), + splitCSV(r.URL.Query().Get("skills")), + splitCSV(r.URL.Query().Get("weapons")), + ) + if err != nil { + writeError(w, http.StatusInternalServerError, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/gold/realtime/", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.ColgService.RealTimeGold(r.Context()) + if err != nil { + writeError(w, http.StatusBadGateway, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/gold/history/", func(w http.ResponseWriter, r *http.Request) { + region, err := strconv.Atoi(r.URL.Query().Get("region")) + if err != nil { + writeJSON(w, http.StatusBadRequest, model.Error(400, "region must be an integer", nil)) + return + } + timeRange := 7 + if raw := r.URL.Query().Get("timeRange"); raw != "" { + parsed, err := strconv.Atoi(raw) + if err != nil { + writeJSON(w, http.StatusBadRequest, model.Error(400, "timeRange must be an integer", nil)) + return + } + timeRange = parsed + } + + data, err := dep.ColgService.HistoryGold(r.Context(), region, timeRange) + if err != nil { + writeJSON(w, http.StatusBadRequest, model.Error(404, err.Error(), nil)) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/gold/official/", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.ColgService.OfficialGold(r.Context()) + if err != nil { + writeError(w, http.StatusBadGateway, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/{jobId}/{jobGrowId}/skills/", func(w http.ResponseWriter, r *http.Request) { + data, err := dep.OpenAPIService.SkillsByJob(chi.URLParam(r, "jobId"), chi.URLParam(r, "jobGrowId")) + if err != nil { + writeError(w, http.StatusNotFound, err) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + + r.Get("/{jobId}/{jobGrowId}/{skillId}/", func(w http.ResponseWriter, r *http.Request) { + var level *int + if raw := r.URL.Query().Get("level"); raw != "" { + parsed, err := strconv.Atoi(raw) + if err != nil { + writeJSON(w, http.StatusBadRequest, model.Error(400, "level must be an integer", nil)) + return + } + level = &parsed + } + data, err := dep.OpenAPIService.SkillDetail(chi.URLParam(r, "jobId"), chi.URLParam(r, "jobGrowId"), chi.URLParam(r, "skillId"), level) + if err != nil { + writeJSON(w, http.StatusNotFound, model.Error(404, err.Error(), nil)) + return + } + writeJSON(w, http.StatusOK, model.Success(data)) + }) + }) + }) + + return r +} + +func requireAlterToken(w http.ResponseWriter, r *http.Request, tokens *service.TokenService) (service.AlterTokenPayload, bool) { + token := r.Header.Get("alter_token") + if token == "" { + writeJSON(w, http.StatusUnauthorized, model.Error(401, "missing alter_token header", nil)) + return service.AlterTokenPayload{}, false + } + payload, err := tokens.Parse(token) + if err != nil { + writeJSON(w, http.StatusUnauthorized, model.Error(401, "invalid alter_token header", nil)) + return service.AlterTokenPayload{}, false + } + return payload, true +} + +func writeNotImplemented(w http.ResponseWriter, err error) { + writeJSON(w, http.StatusNotImplemented, model.Error(501, err.Error(), nil)) +} + +func writeError(w http.ResponseWriter, status int, err error) { + writeJSON(w, status, model.Error(status, err.Error(), nil)) +} + +func writeJSON(w http.ResponseWriter, status int, payload model.Envelope) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(status) + _ = json.NewEncoder(w).Encode(payload) +} + +func cors(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type, alter_token") + w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") + if r.Method == http.MethodOptions { + w.WriteHeader(http.StatusNoContent) + return + } + next.ServeHTTP(w, r) + }) +} + +func splitCSV(value string) []string { + if value == "" { + return nil + } + parts := strings.Split(value, ",") + result := make([]string, 0, len(parts)) + for _, part := range parts { + trimmed := strings.TrimSpace(part) + if trimmed != "" { + result = append(result, trimmed) + } + } + return result +} diff --git a/backend/go/internal/model/response.go b/backend/go/internal/model/response.go new file mode 100644 index 00000000..d7529c16 --- /dev/null +++ b/backend/go/internal/model/response.go @@ -0,0 +1,15 @@ +package model + +type Envelope struct { + Code int `json:"code"` + Message string `json:"message"` + Data any `json:"data"` +} + +func Success(data any) Envelope { + return Envelope{Code: 200, Message: "Success", Data: data} +} + +func Error(code int, message string, data any) Envelope { + return Envelope{Code: code, Message: message, Data: data} +} diff --git a/backend/go/internal/service/adventure.go b/backend/go/internal/service/adventure.go new file mode 100644 index 00000000..036c6bf7 --- /dev/null +++ b/backend/go/internal/service/adventure.go @@ -0,0 +1,137 @@ +package service + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + "time" +) + +type AdventureService struct { + projectRoot string + cache *Cache + jobs []Job + tokenToJob map[string]string +} + +type Job struct { + Name string `json:"name"` + JobID string `json:"jobId"` + Title string `json:"title"` + Children []JobChild `json:"children"` +} + +type JobChild struct { + Name string `json:"name"` + JobGrowID string `json:"jobGrowId"` + Title string `json:"title"` +} + +type AdventureParent struct { + ID int `json:"id"` + Name string `json:"name"` + Title string `json:"title"` + Children []AdventureChild `json:"children"` +} + +type AdventureChild struct { + ID int `json:"id"` + Name string `json:"name"` + Title string `json:"title"` + Open bool `json:"open"` + Value string `json:"value"` +} + +func NewAdventureService(projectRoot string, cache *Cache) (*AdventureService, error) { + jobsPath := filepath.Join(projectRoot, "openapi", "jobs.json") + content, err := os.ReadFile(jobsPath) + if err != nil { + return nil, err + } + + var jobs []Job + if err := json.Unmarshal(content, &jobs); err != nil { + return nil, err + } + + svc := &AdventureService{ + projectRoot: projectRoot, + cache: cache, + jobs: jobs, + tokenToJob: make(map[string]string), + } + + for parentIndex, parent := range jobs { + for childIndex, child := range parent.Children { + token := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%02d%02d00", parentIndex, childIndex))) + svc.tokenToJob[token] = "GF." + parent.Name + "." + child.Name + } + } + + return svc, nil +} + +func (s *AdventureService) Jobs() []Job { + jobs := make([]Job, len(s.jobs)) + copy(jobs, s.jobs) + return jobs +} + +func (s *AdventureService) AdventureList() ([]AdventureParent, error) { + return GetOrLoad(s.cache, "adventure:list", 10*time.Minute, func() ([]AdventureParent, error) { + result := make([]AdventureParent, 0, len(s.jobs)) + for parentIndex, parent := range s.jobs { + children := make([]AdventureChild, 0, len(parent.Children)) + for childIndex, child := range parent.Children { + children = append(children, AdventureChild{ + ID: childIndex, + Name: child.Name, + Title: child.Title, + Open: true, + Value: base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%02d%02d00", parentIndex, childIndex))), + }) + } + result = append(result, AdventureParent{ + ID: parentIndex, + Name: parent.Name, + Title: parent.Title, + Children: children, + }) + } + return result, nil + }) +} + +func (s *AdventureService) AlterByToken(token string) (string, error) { + alter, ok := s.tokenToJob[token] + if !ok { + return "", fmt.Errorf("invalid adventure token") + } + return alter, nil +} + +func (s *AdventureService) ResolveDirectories(jobIdentifier string, jobGrowIdentifier string) (string, string, error) { + for _, job := range s.jobs { + jobMatched := jobIdentifier == job.Name || jobIdentifier == job.JobID + if !jobMatched { + continue + } + for _, child := range job.Children { + if jobGrowIdentifier == child.Name || jobGrowIdentifier == child.JobGrowID { + return job.Name, child.Name, nil + } + } + } + return "", "", fmt.Errorf("unknown job path: %s/%s", jobIdentifier, jobGrowIdentifier) +} + +func (s *AdventureService) DirectoriesFromAlter(alter string) (string, string, error) { + parts := strings.Split(alter, ".") + if len(parts) != 3 || parts[0] != "GF" { + return "", "", fmt.Errorf("invalid alter value: %s", alter) + } + return parts[1], parts[2], nil +} diff --git a/backend/go/internal/service/cache.go b/backend/go/internal/service/cache.go new file mode 100644 index 00000000..0e0ce5d7 --- /dev/null +++ b/backend/go/internal/service/cache.go @@ -0,0 +1,44 @@ +package service + +import ( + "sync" + "time" +) + +type Cache struct { + mu sync.RWMutex + items map[string]cacheItem +} + +type cacheItem struct { + value any + expiresAt time.Time +} + +func NewCache() *Cache { + return &Cache{items: make(map[string]cacheItem)} +} + +func GetOrLoad[T any](cache *Cache, key string, ttl time.Duration, loader func() (T, error)) (T, error) { + var zero T + + cache.mu.RLock() + item, ok := cache.items[key] + cache.mu.RUnlock() + if ok && (item.expiresAt.IsZero() || item.expiresAt.After(time.Now())) { + if value, castOK := item.value.(T); castOK { + return value, nil + } + } + + value, err := loader() + if err != nil { + return zero, err + } + + cache.mu.Lock() + cache.items[key] = cacheItem{value: value, expiresAt: time.Now().Add(ttl)} + cache.mu.Unlock() + + return value, nil +} diff --git a/backend/go/internal/service/calc.go b/backend/go/internal/service/calc.go new file mode 100644 index 00000000..c5e981dd --- /dev/null +++ b/backend/go/internal/service/calc.go @@ -0,0 +1,34 @@ +package service + +import "errors" + +var ErrNotImplemented = errors.New("calculation domain has not been migrated to Go yet") + +type EquipmentCatalogRepository interface { + Catalog(alter string, equVersion string) (map[string]any, error) +} + +type CalcService struct { + factory CharacterFactory + equipment EquipmentCatalogRepository +} + +func NewCalcService(factory CharacterFactory, equipment EquipmentCatalogRepository) *CalcService { + return &CalcService{factory: factory, equipment: equipment} +} + +func (s *CalcService) CharacterInfo(alter string, equVersion string) (any, error) { + return s.factory.CharacterInfo(alter, equVersion) +} + +func (s *CalcService) Calculate(_ string, _ string, _ map[string]any) (any, error) { + return nil, ErrNotImplemented +} + +func (s *CalcService) SkillTree(_ string, _ string) (any, error) { + return nil, ErrNotImplemented +} + +func (s *CalcService) DNFHelper(_ string, _ string) (any, error) { + return nil, ErrNotImplemented +} diff --git a/backend/go/internal/service/character.go b/backend/go/internal/service/character.go new file mode 100644 index 00000000..64dc0151 --- /dev/null +++ b/backend/go/internal/service/character.go @@ -0,0 +1,21 @@ +package service + +import ( + "time" +) + +type CharacterService struct { + cache *Cache + factory CharacterFactory +} + +func NewCharacterService(cache *Cache, factory CharacterFactory) *CharacterService { + return &CharacterService{cache: cache, factory: factory} +} + +func (s *CharacterService) StaticInfo(alter string, equVersion string) (map[string]any, error) { + key := "character:static:" + alter + ":" + equVersion + return GetOrLoad(s.cache, key, 15*time.Minute, func() (map[string]any, error) { + return s.factory.CharacterInfo(alter, equVersion) + }) +} diff --git a/backend/go/internal/service/colg.go b/backend/go/internal/service/colg.go new file mode 100644 index 00000000..30dad321 --- /dev/null +++ b/backend/go/internal/service/colg.go @@ -0,0 +1,304 @@ +package service + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "dcalc-go/internal/config" +) + +type ColgService struct { + cache *Cache + config config.Config + client *http.Client +} + +var regionMap = map[string]int{ + "跨1": 1, + "跨2": 2, + "跨3A": 3, + "跨3B": 4, + "跨4": 5, + "跨5": 6, + "跨6": 7, + "跨7": 8, +} + +func NewColgService(cache *Cache, cfg config.Config) *ColgService { + return &ColgService{ + cache: cache, + config: cfg, + client: &http.Client{Timeout: 12 * time.Second}, + } +} + +func (s *ColgService) RealTimeGold(ctx context.Context) ([]map[string]any, error) { + if s.config.ColgToken == "" { + return nil, fmt.Errorf("COLG_TOKEN is required") + } + + return GetOrLoad(s.cache, "colg:realtime", 30*time.Minute, func() ([]map[string]any, error) { + result := make([]map[string]any, 0, len(regionMap)) + now := time.Now().Format("2006-01-02") + for regionName, regionID := range regionMap { + data, err := s.requestTrendData(ctx, regionID, now, now) + if err != nil { + return nil, err + } + xValues, _ := data["x"].([]any) + yValues, _ := data["y"].([]any) + if len(xValues) == 0 || len(yValues) == 0 { + continue + } + result = append(result, map[string]any{ + "updataTime": formatBeijingTime(int64FromAny(xValues[len(xValues)-1])), + "region": regionName, + "goldPrice": float64FromAny(yValues[len(yValues)-1]), + }) + } + return result, nil + }) +} + +func (s *ColgService) HistoryGold(ctx context.Context, region int, timeRange int) (map[string]any, error) { + if s.config.ColgToken == "" { + return nil, fmt.Errorf("COLG_TOKEN is required") + } + if timeRange <= 0 { + timeRange = 7 + } + + regionName := "" + for name, id := range regionMap { + if id == region { + regionName = name + break + } + } + if regionName == "" { + return nil, fmt.Errorf("invalid region") + } + + endDate := time.Now() + startDate := endDate.AddDate(0, 0, -(timeRange - 1)) + trend, err := s.requestTrendData(ctx, region, startDate.Format("2006-01-02"), endDate.Format("2006-01-02")) + if err != nil { + return nil, err + } + + xValues, _ := trend["x"].([]any) + yValues, _ := trend["y"].([]any) + y1Values, _ := trend["y1"].([]any) + rows := make([]map[string]any, 0, len(xValues)) + minValue := 0.0 + maxValue := 0.0 + for index := range xValues { + avg := float64FromAny(yValues[index]) + zero := float64FromAny(y1Values[index]) + if index == 0 || avg < minValue { + minValue = avg + } + if zero < minValue { + minValue = zero + } + if index == 0 || avg > maxValue { + maxValue = avg + } + if zero > maxValue { + maxValue = zero + } + rows = append(rows, map[string]any{ + "date": strings.Split(formatBeijingTime(int64FromAny(xValues[index])), " ")[0], + "avg": avg, + "zero": zero, + }) + } + + title := fmt.Sprintf("DNF%s近%d天金币价格趋势分析", regionName, timeRange) + echarts := map[string]any{ + "title": map[string]any{"text": title, "left": "center"}, + "toolbox": map[string]any{"feature": map[string]any{"saveAsImage": map[string]any{}, "dataView": map[string]any{"readOnly": true}, "magicType": map[string]any{"type": []string{"line", "bar"}}}}, + "tooltip": map[string]any{"trigger": "axis", "axisPointer": map[string]any{"type": "cross", "label": map[string]any{"backgroundColor": "#6a7985"}}}, + "legend": map[string]any{"data": []string{"平均金价", "12时金价"}, "bottom": 0}, + "xAxis": map[string]any{"type": "category", "name": "日期", "boundaryGap": false, "data": extractField(rows, "date")}, + "yAxis": map[string]any{"type": "value", "name": "价格 (万金币/1人民币)", "min": floorToFive(minValue), "max": floorToFive(maxValue) + 5, "axisLabel": map[string]any{"formatter": "{value} 万金币"}}, + "series": []map[string]any{ + {"name": "平均金价", "type": "line", "smooth": true, "data": extractField(rows, "avg"), "markPoint": map[string]any{"data": []map[string]any{{"type": "max", "name": "最大值"}, {"type": "min", "name": "最小值"}}}}, + {"name": "12时金价", "type": "line", "smooth": true, "data": extractField(rows, "zero"), "markLine": map[string]any{"data": []map[string]any{{"type": "average", "name": "平均值"}}}}, + }, + } + + return map[string]any{"region": regionName, "data": rows, "echartsData": echarts}, nil +} + +func (s *ColgService) OfficialGold(ctx context.Context) ([]map[string]any, error) { + if s.config.HelperToken == "" || s.config.HelperID == "" { + return nil, fmt.Errorf("HELPER_TOKEN and HELPER_ID are required") + } + + return GetOrLoad(s.cache, "colg:official", 30*time.Minute, func() ([]map[string]any, error) { + servers := []string{"1", "2", "3A", "3B", "4", "5", "6", "7"} + result := make([]map[string]any, 0, len(servers)) + for _, server := range servers { + data, err := s.requestOfficialGold(ctx, server) + if err != nil { + return nil, err + } + result = append(result, data) + } + return result, nil + }) +} + +func (s *ColgService) requestTrendData(ctx context.Context, region int, startTime string, endTime string) (map[string]any, error) { + payload := map[string]any{ + "token": s.config.ColgToken, + "area": region, + "time_type": "other", + "start_time": startTime, + "end_time": endTime, + } + body, err := json.Marshal(payload) + if err != nil { + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://poservice.colg.cn/api/v1/trend/getCoinTrendDataKol", bytes.NewReader(body)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := s.client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + content, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var payloadResp map[string]any + if err := json.Unmarshal(content, &payloadResp); err != nil { + return nil, err + } + data, _ := payloadResp["data"].(map[string]any) + return data, nil +} + +func (s *ColgService) requestOfficialGold(ctx context.Context, server string) (map[string]any, error) { + form := url.Values{} + form.Set("r", "godRank/godDealRank") + form.Set("userId", s.config.HelperID) + form.Set("token", s.config.HelperToken) + form.Set("serverNo", server) + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://dzhu.qq.com/zangyi/activity/app", strings.NewReader(form.Encode())) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + resp, err := s.client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + content, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var payloadResp map[string]any + if err := json.Unmarshal(content, &payloadResp); err != nil { + return nil, err + } + data, _ := payloadResp["data"].(map[string]any) + return map[string]any{ + "updataTime": time.Now().Format("2006-01-02 15:04:05"), + "region": "跨" + server, + "goldDealRank": extractPrices(data["godDealRank"]), + "goldTopDealRank": extractPrices(data["godTopDealRank"]), + }, nil +} + +func extractPrices(value any) []int { + rows, _ := value.([]any) + result := make([]int, 0, len(rows)) + for _, row := range rows { + rowMap, _ := row.(map[string]any) + result = append(result, intFromAnyString(rowMap["price"])) + } + return result +} + +func extractField(rows []map[string]any, key string) []any { + result := make([]any, 0, len(rows)) + for _, row := range rows { + result = append(result, row[key]) + } + return result +} + +func formatBeijingTime(ts int64) string { + return time.Unix(ts, 0).UTC().Add(8 * time.Hour).Format("2006-01-02 15:04:05") +} + +func floorToFive(value float64) float64 { + return float64(int(value/5) * 5) +} + +func float64FromAny(value any) float64 { + switch typed := value.(type) { + case float64: + return typed + case float32: + return float64(typed) + case int: + return float64(typed) + case int64: + return float64(typed) + case json.Number: + parsed, _ := typed.Float64() + return parsed + default: + return 0 + } +} + +func int64FromAny(value any) int64 { + switch typed := value.(type) { + case int64: + return typed + case int: + return int64(typed) + case float64: + return int64(typed) + case json.Number: + parsed, _ := typed.Int64() + return parsed + default: + return 0 + } +} + +func intFromAnyString(value any) int { + switch typed := value.(type) { + case string: + parsed, _ := strconv.Atoi(typed) + return parsed + default: + return int(float64FromAny(value)) + } +} diff --git a/backend/go/internal/service/equipment_catalog_sqlite.go b/backend/go/internal/service/equipment_catalog_sqlite.go new file mode 100644 index 00000000..6f204cd1 --- /dev/null +++ b/backend/go/internal/service/equipment_catalog_sqlite.go @@ -0,0 +1,295 @@ +package service + +import ( + "database/sql" + "fmt" + "path/filepath" + "strconv" + "strings" + + _ "modernc.org/sqlite" +) + +type SQLiteEquipmentCatalogRepository struct { + projectRoot string +} + +func NewSQLiteEquipmentCatalogRepository(projectRoot string) *SQLiteEquipmentCatalogRepository { + return &SQLiteEquipmentCatalogRepository{projectRoot: projectRoot} +} + +func (r *SQLiteEquipmentCatalogRepository) Catalog(_ string, equVersion string) (map[string]any, error) { + if equVersion == "" { + equVersion = "0" + } + + dbPath := filepath.Join(r.projectRoot, "dataFiles", fmt.Sprintf("dcalc_%s.db", equVersion)) + db, err := sql.Open("sqlite", dbPath) + if err != nil { + return nil, err + } + defer db.Close() + + equips, err := queryEquipRows(db, "equ") + if err != nil { + return nil, err + } + stones, err := queryEquipRows(db, "stone") + if err != nil { + return nil, err + } + suits, err := querySuitRows(db) + if err != nil { + return nil, err + } + enchants, err := queryEnchantRows(db, "enchant") + if err != nil { + return nil, err + } + emblems, err := queryEnchantRows(db, "emblem") + if err != nil { + return nil, err + } + jades, err := queryJadeRows(db) + if err != nil { + return nil, err + } + + return map[string]any{ + "equips": equips, + "suits": suits, + "stones": stones, + "enchants": enchants, + "emblems": emblems, + "jades": jades, + "avatar": map[string]any{}, + "options": map[string]any{}, + "sundry": []any{}, + }, nil +} + +func queryEquipRows(db *sql.DB, table string) ([]map[string]any, error) { + query := fmt.Sprintf("SELECT id,name,rarity,itemType,itemDetailType,Point,categorize,imageUrl,detail,bufferDetail,STR,INT,Vitality,Spirit,AtkP,AtkM,AtkI,SkillAttack,Attack,Buffer,suit FROM %s", table) + rows, err := db.Query(query) + if err != nil { + return nil, err + } + defer rows.Close() + + result := make([]map[string]any, 0) + for rows.Next() { + var ( + id, name, rarity, itemType, itemDetailType, point, categorize, imageURL, detail, bufferDetail sql.NullString + strV, intV, vitV, spiV, atkPV, atkMV, atkIV, skillAttackV, attackV, bufferV, suitV sql.NullString + ) + if err := rows.Scan(&id, &name, &rarity, &itemType, &itemDetailType, &point, &categorize, &imageURL, &detail, &bufferDetail, &strV, &intV, &vitV, &spiV, &atkPV, &atkMV, &atkIV, &skillAttackV, &attackV, &bufferV, &suitV); err != nil { + return nil, err + } + + entry := map[string]any{ + "id": nullString(id), + "name": nullString(name), + "rarity": nullString(rarity), + "itemType": nullString(itemType), + "itemDetailType": nullString(itemDetailType), + "categorize": nullString(categorize), + "imageUrl": nullString(imageURL), + "detail": nullString(detail), + "bufferDetail": nullString(bufferDetail), + "Point": numberListOrDefault(nullString(point)), + "STR": numberListOrDefault(nullString(strV)), + "INT": numberListOrDefault(nullString(intV)), + "Vitality": numberListOrDefault(nullString(vitV)), + "Spirit": numberListOrDefault(nullString(spiV)), + "AtkP": numberListOrDefault(nullString(atkPV)), + "AtkM": numberListOrDefault(nullString(atkMV)), + "AtkI": numberListOrDefault(nullString(atkIV)), + "SkillAttack": numberListOrDefault(nullString(skillAttackV)), + "Attack": numberListOrDefault(nullString(attackV)), + "Buffer": numberListOrDefault(nullString(bufferV)), + "suit": suitListOrDefault(nullString(suitV)), + } + + maxAdaptation := 0 + for _, key := range []string{"Point", "STR", "INT", "Vitality", "Spirit", "AtkP", "AtkM", "AtkI", "SkillAttack", "Attack", "Buffer"} { + if values, ok := entry[key].([]float64); ok && len(values)-1 > maxAdaptation { + maxAdaptation = len(values) - 1 + } + } + entry["max_adaptation"] = maxAdaptation + result = append(result, entry) + } + return result, rows.Err() +} + +func querySuitRows(db *sql.DB) ([]map[string]any, error) { + rows, err := db.Query("SELECT id,suitId,suitName,rarity,name,point,level,count,SkillAttack,Attack,Buffer,imageUrl,value,bufferValue,fame FROM suit") + if err != nil { + return nil, err + } + defer rows.Close() + + result := make([]map[string]any, 0) + for rows.Next() { + var ( + id, suitID, point, level, count, fame sql.NullInt64 + suitName, rarity, name, imageURL, value, bufferValue sql.NullString + skillAttack, attack, buffer sql.NullFloat64 + ) + if err := rows.Scan(&id, &suitID, &suitName, &rarity, &name, &point, &level, &count, &skillAttack, &attack, &buffer, &imageURL, &value, &bufferValue, &fame); err != nil { + return nil, err + } + result = append(result, map[string]any{ + "id": nullInt64(id), + "suitId": nullInt64(suitID), + "suitName": nullString(suitName), + "rarity": nullString(rarity), + "name": nullString(name), + "point": nullInt64(point), + "level": nullInt64(level), + "count": nullInt64(count), + "SkillAttack": nullFloat64(skillAttack), + "Attack": nullFloat64(attack), + "Buffer": nullFloat64(buffer), + "imageUrl": nullString(imageURL), + "value": nullString(value), + "bufferValue": nullString(bufferValue), + "fame": nullInt64(fame), + }) + } + return result, rows.Err() +} + +func queryEnchantRows(db *sql.DB, table string) ([]map[string]any, error) { + query := fmt.Sprintf("SELECT id,detail,categorize,itemType,fame,rarity FROM %s", table) + rows, err := db.Query(query) + if err != nil { + return nil, err + } + defer rows.Close() + + result := make([]map[string]any, 0) + for rows.Next() { + var id, fame sql.NullInt64 + var detail, categorize, itemType, rarity sql.NullString + if err := rows.Scan(&id, &detail, &categorize, &itemType, &fame, &rarity); err != nil { + return nil, err + } + result = append(result, map[string]any{ + "id": nullInt64(id), + "detail": nullString(detail), + "categorize": splitCSV(nullString(categorize)), + "position": splitCSV(nullString(itemType)), + "fame": nullInt64(fame), + "rarity": nullString(rarity), + }) + } + return result, rows.Err() +} + +func queryJadeRows(db *sql.DB) ([]map[string]any, error) { + rows, err := db.Query("SELECT id,name,min,max,unit,pre FROM jade") + if err != nil { + return nil, err + } + defer rows.Close() + + result := make([]map[string]any, 0) + for rows.Next() { + var id, minV, maxV sql.NullInt64 + var name, unit sql.NullString + var pre sql.NullFloat64 + if err := rows.Scan(&id, &name, &minV, &maxV, &unit, &pre); err != nil { + return nil, err + } + result = append(result, map[string]any{ + "id": nullInt64(id), + "name": nullString(name), + "min": nullInt64(minV), + "max": nullInt64(maxV), + "unit": nullString(unit), + "pre": nullFloat64(pre), + }) + } + return result, rows.Err() +} + +func numberListOrDefault(raw string) []float64 { + raw = strings.TrimSpace(raw) + if raw == "" { + return []float64{0} + } + parts := strings.Split(raw, ",") + result := make([]float64, 0, len(parts)) + for _, part := range parts { + value, err := strconv.ParseFloat(strings.TrimSpace(part), 64) + if err != nil { + result = append(result, 0) + continue + } + result = append(result, value) + } + if len(result) == 0 { + return []float64{0} + } + return result +} + +func suitListOrDefault(raw string) []string { + raw = strings.TrimSpace(raw) + if raw == "" { + return []string{} + } + parts := strings.Split(raw, ",") + result := make([]string, 0, len(parts)) + for _, part := range parts { + part = strings.TrimSpace(part) + if part == "" { + continue + } + value, err := strconv.ParseFloat(part, 64) + if err != nil { + result = append(result, part) + continue + } + result = append(result, strconv.Itoa(int(value))) + } + return result +} + +func splitCSV(raw string) []string { + raw = strings.TrimSpace(raw) + if raw == "" { + return []string{} + } + parts := strings.Split(raw, ",") + result := make([]string, 0, len(parts)) + for _, part := range parts { + part = strings.TrimSpace(part) + if part != "" { + result = append(result, part) + } + } + return result +} + +func nullString(value sql.NullString) string { + if !value.Valid { + return "" + } + return value.String +} + +func nullInt64(value sql.NullInt64) int64 { + if !value.Valid { + return 0 + } + return value.Int64 +} + +func nullFloat64(value sql.NullFloat64) float64 { + if !value.Valid { + return 0 + } + return value.Float64 +} diff --git a/backend/go/internal/service/openapi.go b/backend/go/internal/service/openapi.go new file mode 100644 index 00000000..3db1a75b --- /dev/null +++ b/backend/go/internal/service/openapi.go @@ -0,0 +1,264 @@ +package service + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "regexp" + "strings" + "time" +) + +var placeholderPattern = regexp.MustCompile(`<(?:(?:int)|(?:float\d*))>`) +var filenameJobPrefix = regexp.MustCompile(`^\d+(?:-\d+){0,2}`) + +type OpenAPIService struct { + projectRoot string + cache *Cache + adventure *AdventureService +} + +func NewOpenAPIService(projectRoot string, cache *Cache, adventure *AdventureService) *OpenAPIService { + return &OpenAPIService{projectRoot: projectRoot, cache: cache, adventure: adventure} +} + +func (s *OpenAPIService) SearchSkills(skillName string) ([]map[string]any, error) { + skills, err := GetOrLoad(s.cache, "openapi:skills", 30*time.Minute, func() ([]map[string]any, error) { + var data []map[string]any + if err := s.readJSON(filepath.Join(s.projectRoot, "openapi", "data", "skills.json"), &data); err != nil { + return nil, err + } + return data, nil + }) + if err != nil { + return nil, err + } + + normalized := normalizeWhitespace(skillName) + if normalized == "" { + return skills, nil + } + + filtered := make([]map[string]any, 0) + for _, skill := range skills { + name, _ := skill["skillName"].(string) + if strings.Contains(normalizeWhitespace(name), normalized) { + filtered = append(filtered, skill) + } + } + return filtered, nil +} + +func (s *OpenAPIService) JobsInfo(jobName string) ([]map[string]string, error) { + jobName = strings.NewReplacer("(", "(", ")", ")").Replace(jobName) + result := make([]map[string]string, 0) + for _, job := range s.adventure.Jobs() { + for _, child := range job.Children { + if jobName == "" || strings.Contains(child.Title, jobName) || strings.Contains(child.Name, jobName) { + result = append(result, map[string]string{ + "jobId": job.Name, + "jobName": job.Title, + "jobGrowId": child.Name, + "jobGrowName": child.Title, + }) + } + } + } + return result, nil +} + +func (s *OpenAPIService) SkillsByJob(jobID string, jobGrowID string) (any, error) { + jobDir, jobGrowDir, err := s.adventure.ResolveDirectories(jobID, jobGrowID) + if err != nil { + return nil, err + } + + var data any + path := filepath.Join(s.projectRoot, "openapi", "data", jobDir, jobGrowDir, "cn", "skill_tree.json") + if err := s.readJSON(path, &data); err != nil { + return nil, err + } + return data, nil +} + +func (s *OpenAPIService) SkillDetail(jobID string, jobGrowID string, skillID string, level *int) (any, error) { + jobDir, jobGrowDir, err := s.adventure.ResolveDirectories(jobID, jobGrowID) + if err != nil { + return nil, err + } + + var skillInfo map[string]any + path := filepath.Join(s.projectRoot, "openapi", "data", jobDir, jobGrowDir, "cn", "skillDetail", skillID+".json") + if err := s.readJSON(path, &skillInfo); err != nil { + return nil, err + } + + if levelInfo, ok := skillInfo["levelInfo"].(map[string]any); ok { + if optionDesc, ok := levelInfo["optionDesc"].(string); ok { + levelInfo["optionDesc"] = replacePlaceholders(optionDesc) + } + } + + if level == nil { + return skillInfo, nil + } + + maxLevel := intFromAny(skillInfo["maxLevel"]) + bounded := *level + if bounded < 0 { + bounded = 0 + } + if maxLevel > 0 && bounded > maxLevel { + bounded = maxLevel + } + + levelInfo, ok := skillInfo["levelInfo"].(map[string]any) + if !ok { + return skillInfo, nil + } + rows, ok := levelInfo["rows"].([]any) + if !ok { + return skillInfo, nil + } + + for _, row := range rows { + rowMap, ok := row.(map[string]any) + if !ok || intFromAny(rowMap["level"]) != bounded { + continue + } + + for key, value := range rowMap { + levelInfo[key] = value + } + detail, _ := levelInfo["optionDesc"].(string) + if optionValue, ok := levelInfo["optionValue"].(map[string]any); ok { + for key, value := range optionValue { + detail = strings.ReplaceAll(detail, "{"+key+"}", fmt.Sprint(value)) + } + } + levelInfo["detail"] = detail + delete(levelInfo, "rows") + skillInfo["attribute"] = levelInfo + delete(skillInfo, "levelInfo") + break + } + + return skillInfo, nil +} + +func (s *OpenAPIService) SkillDetailByAlter(alter string, skillID string, level int) (any, error) { + jobDir, jobGrowDir, err := s.adventure.DirectoriesFromAlter(alter) + if err != nil { + return nil, err + } + return s.SkillDetail(jobDir, jobGrowDir, skillID, &level) +} + +func (s *OpenAPIService) SkillDataSummary(job string, skills []string, weapons []string) ([]map[string]any, error) { + job = strings.NewReplacer("(", "(", ")", ")").Replace(job) + entries, err := os.ReadDir(filepath.Join(s.projectRoot, "openapi", "summary")) + if err != nil { + return nil, err + } + + skillFilter := make(map[string]struct{}) + for _, skill := range skills { + if skill != "" { + skillFilter[skill] = struct{}{} + } + } + weaponFilter := make(map[string]struct{}) + for _, weapon := range weapons { + if weapon != "" { + weaponFilter[weapon] = struct{}{} + } + } + + result := make([]map[string]any, 0) + for _, entry := range entries { + if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".json") || !strings.Contains(entry.Name(), job) { + continue + } + + parts := strings.Split(strings.TrimSuffix(entry.Name(), ".json"), "_") + weapon := "通用" + if len(parts) > 1 && parts[len(parts)-1] != "" { + weapon = parts[len(parts)-1] + } + if len(weaponFilter) > 0 { + if _, ok := weaponFilter[weapon]; !ok { + continue + } + } + + var rows []map[string]any + if err := s.readJSON(filepath.Join(s.projectRoot, "openapi", "summary", entry.Name()), &rows); err != nil { + return nil, err + } + + jobTitle := strings.TrimPrefix(parts[0], filenameJobPrefix.FindString(parts[0])) + for _, row := range rows { + if len(skillFilter) > 0 { + skillName, _ := row["技能名称"].(string) + if _, ok := skillFilter[skillName]; !ok { + continue + } + } + copied := cloneMap(row) + copied["武器类型"] = weapon + copied["职业"] = jobTitle + result = append(result, copied) + } + } + + return result, nil +} + +func (s *OpenAPIService) readJSON(path string, dest any) error { + content, err := os.ReadFile(path) + if err != nil { + return err + } + if err := json.Unmarshal(content, dest); err != nil { + return fmt.Errorf("unmarshal %s: %w", path, err) + } + return nil +} + +func replacePlaceholders(template string) string { + count := 0 + return placeholderPattern.ReplaceAllStringFunc(template, func(_ string) string { + count++ + return fmt.Sprintf("{value%d}", count) + }) +} + +func normalizeWhitespace(value string) string { + return strings.Join(strings.Fields(value), "") +} + +func intFromAny(value any) int { + switch typed := value.(type) { + case int: + return typed + case int32: + return int(typed) + case int64: + return int(typed) + case float64: + return int(typed) + case float32: + return int(typed) + default: + return 0 + } +} + +func cloneMap(source map[string]any) map[string]any { + cloned := make(map[string]any, len(source)) + for key, value := range source { + cloned[key] = value + } + return cloned +} diff --git a/backend/go/internal/service/python_adapter.go b/backend/go/internal/service/python_adapter.go new file mode 100644 index 00000000..70c9858f --- /dev/null +++ b/backend/go/internal/service/python_adapter.go @@ -0,0 +1,83 @@ +package service + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "os/exec" + "path/filepath" + "time" + + "dcalc-go/internal/config" +) + +type CharacterSkillMeta struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + LearnLv int `json:"learnLv"` + MaxLearnLv int `json:"maxLearnLv"` + HasVP bool `json:"hasVP"` + HasUP bool `json:"hasUP"` + UUID string `json:"uuid"` +} + +type CharacterFactory interface { + CharacterInfo(alter string, equVersion string) (map[string]any, error) + CharacterSkills(alter string, equVersion string) ([]CharacterSkillMeta, error) +} + +type PythonCharacterFactory struct { + pythonExec string + projectRoot string + scriptPath string +} + +func NewPythonCharacterFactory(cfg config.Config) *PythonCharacterFactory { + return &PythonCharacterFactory{ + pythonExec: cfg.PythonExec, + projectRoot: cfg.ProjectRoot, + scriptPath: filepath.Join(cfg.ProjectRoot, "go", "python_bridge.py"), + } +} + +func (p *PythonCharacterFactory) CharacterInfo(alter string, equVersion string) (map[string]any, error) { + result := map[string]any{} + if err := p.invoke("character-info", alter, equVersion, &result); err != nil { + return nil, err + } + return result, nil +} + +func (p *PythonCharacterFactory) CharacterSkills(alter string, equVersion string) ([]CharacterSkillMeta, error) { + var result []CharacterSkillMeta + if err := p.invoke("character-skills", alter, equVersion, &result); err != nil { + return nil, err + } + return result, nil +} + +func (p *PythonCharacterFactory) invoke(command string, alter string, equVersion string, out any) error { + if equVersion == "" { + equVersion = "0" + } + + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + + cmd := exec.CommandContext(ctx, p.pythonExec, p.scriptPath, p.projectRoot, command, alter, equVersion) + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("python bridge failed: %w, stdout=%s, stderr=%s", err, stdout.String(), stderr.String()) + } + + if err := json.Unmarshal(stdout.Bytes(), out); err != nil { + return fmt.Errorf("unmarshal python bridge output: %w, raw=%s", err, stdout.String()) + } + return nil +} diff --git a/backend/go/internal/service/skilltree.go b/backend/go/internal/service/skilltree.go new file mode 100644 index 00000000..6e9ff251 --- /dev/null +++ b/backend/go/internal/service/skilltree.go @@ -0,0 +1,376 @@ +package service + +import ( + "bytes" + "compress/zlib" + "encoding/base64" + "encoding/binary" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "unicode/utf16" +) + +type SkillTreeService struct { + adventure *AdventureService + factory CharacterFactory + indexToUID map[int][]string +} + +type decodedSkillCode struct { + Header skillCodeHeader + Skills []skillLearnItem + Evolutions []skillChoice + Enhancements []skillChoice +} + +type skillCodeHeader struct { + Name string + Level int + JobBytes [2]int +} + +type skillLearnItem struct { + SkillIndex int + Level int + SkillType int +} + +type skillChoice struct { + SkillIndex int + Type int +} + +type LearnedSkill struct { + Lv int `json:"lv"` + Up int `json:"up"` + VP int `json:"vp"` + Name string `json:"name"` +} + +type SkillTreeResult struct { + Name string `json:"name"` + Level int `json:"level"` + Job map[string]string `json:"job"` + Skills map[string]LearnedSkill `json:"skills"` +} + +var roleMap = map[int]int{ + 0: 0, + 1: 3, + 2: 4, + 3: 7, + 4: 8, + 5: 5, + 6: 10, + 7: 2, + 8: 6, + 9: 15, + 10: 15, + 11: 1, + 12: 11, + 13: 12, + 14: 9, + 15: 13, + 16: 14, +} + +func NewSkillTreeService(projectRoot string, adventure *AdventureService, factory CharacterFactory) (*SkillTreeService, error) { + indexToUID, err := loadSkillIndexMap(filepath.Join(projectRoot, "dataFiles", "skillMap.json")) + if err != nil { + return nil, err + } + return &SkillTreeService{adventure: adventure, factory: factory, indexToUID: indexToUID}, nil +} + +func (s *SkillTreeService) Parse(code string, equVersion string) (SkillTreeResult, error) { + decoded, err := decodeSkillCode(code) + if err != nil { + return SkillTreeResult{}, err + } + + alter, err := alterFromJobBytes(decoded.Header.JobBytes[0], decoded.Header.JobBytes[1], s.adventure) + if err != nil { + return SkillTreeResult{}, err + } + + skills, err := s.factory.CharacterSkills(alter, equVersion) + if err != nil { + return SkillTreeResult{}, err + } + + skillByUUID := make(map[string][]CharacterSkillMeta) + for _, skill := range skills { + skillByUUID[skill.UUID] = append(skillByUUID[skill.UUID], skill) + } + + indexCandidates := make(map[int][]CharacterSkillMeta) + for _, item := range decoded.Skills { + if _, exists := indexCandidates[item.SkillIndex]; exists { + continue + } + indexCandidates[item.SkillIndex] = s.buildCandidates(item.SkillIndex, skillByUUID) + } + + learned := make(map[string]LearnedSkill) + for _, item := range decoded.Skills { + candidates := indexCandidates[item.SkillIndex] + chosen := chooseSkillCandidate(candidates, item.SkillType) + if chosen == nil { + continue + } + current, exists := learned[chosen.ID] + if !exists || current.Lv < item.Level { + learned[chosen.ID] = LearnedSkill{Lv: item.Level, Up: 0, VP: 0, Name: chosen.Name} + } + } + + for _, evo := range decoded.Evolutions { + for _, skill := range indexCandidates[evo.SkillIndex] { + if !skill.HasVP { + continue + } + if learnedSkill, ok := learned[skill.ID]; ok { + learnedSkill.VP = evo.Type + learned[skill.ID] = learnedSkill + } + } + } + + for _, up := range decoded.Enhancements { + for _, skill := range indexCandidates[up.SkillIndex] { + if !skill.HasUP { + continue + } + if learnedSkill, ok := learned[skill.ID]; ok { + learnedSkill.Up = up.Type + learned[skill.ID] = learnedSkill + } + } + } + + for _, skill := range skills { + if _, exists := learned[skill.ID]; exists { + continue + } + level := 0 + if skill.LearnLv == 50 || skill.LearnLv == 85 || skill.Name == "基础精通" { + level = skill.MaxLearnLv + } + learned[skill.ID] = LearnedSkill{Lv: level, Up: 0, VP: 0, Name: skill.Name} + } + + return SkillTreeResult{ + Name: decoded.Header.Name, + Level: decoded.Header.Level, + Job: map[string]string{"class": alter}, + Skills: learned, + }, nil +} + +func (s *SkillTreeService) buildCandidates(index int, skillByUUID map[string][]CharacterSkillMeta) []CharacterSkillMeta { + uuids := s.indexToUID[index] + seen := make(map[string]struct{}) + candidates := make([]CharacterSkillMeta, 0) + for _, uuid := range uuids { + for _, skill := range skillByUUID[uuid] { + if _, exists := seen[skill.ID]; exists { + continue + } + seen[skill.ID] = struct{}{} + candidates = append(candidates, skill) + } + } + if len(candidates) > 1 { + filtered := make([]CharacterSkillMeta, 0) + for _, skill := range candidates { + if skill.LearnLv == 50 || skill.LearnLv == 85 { + continue + } + filtered = append(filtered, skill) + } + if len(filtered) > 0 { + return filtered + } + } + return candidates +} + +func chooseSkillCandidate(candidates []CharacterSkillMeta, skillType int) *CharacterSkillMeta { + if len(candidates) == 0 { + return nil + } + if len(candidates) == 1 { + return &candidates[0] + } + wantedType := "passive" + if skillType == 1 { + wantedType = "active" + } + for i := range candidates { + if candidates[i].Type == wantedType { + return &candidates[i] + } + } + return &candidates[0] +} + +func loadSkillIndexMap(path string) (map[int][]string, error) { + content, err := os.ReadFile(path) + if err != nil { + return nil, err + } + + uuidToIndexes := map[string][]int{} + if err := json.Unmarshal(content, &uuidToIndexes); err != nil { + return nil, err + } + + indexToUUID := make(map[int][]string) + for uuid, indexes := range uuidToIndexes { + for _, idx := range indexes { + indexToUUID[idx] = append(indexToUUID[idx], uuid) + } + } + return indexToUUID, nil +} + +func alterFromJobBytes(roleByte int, jobByte int, adventure *AdventureService) (string, error) { + parent, ok := roleMap[roleByte] + if !ok { + return "", fmt.Errorf("unsupported role byte: %d", roleByte) + } + + jobID := jobByte - 1 + if roleByte == 9 { + jobID = 1 + } + if roleByte == 10 { + jobID = 0 + } + + token := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%02d%02d00", parent, jobID))) + return adventure.AlterByToken(token) +} + +func decodeSkillCode(encoded string) (decodedSkillCode, error) { + result := decodedSkillCode{} + + compressed, err := base64.StdEncoding.DecodeString(encoded) + if err != nil { + return result, fmt.Errorf("decode base64: %w", err) + } + + r, err := zlib.NewReader(bytes.NewReader(compressed)) + if err != nil { + return result, fmt.Errorf("create zlib reader: %w", err) + } + defer r.Close() + + raw, err := io.ReadAll(r) + if err != nil { + return result, fmt.Errorf("read zlib stream: %w", err) + } + if len(raw) < 14 { + return result, fmt.Errorf("invalid skill code payload") + } + + nameLen := int(raw[13]) + if 14+nameLen > len(raw) { + return result, fmt.Errorf("invalid name length in skill code") + } + + result.Header = skillCodeHeader{ + Name: decodeUTF16LE(raw[14 : 14+nameLen]), + Level: int(raw[5]), + JobBytes: [2]int{int(raw[2]), int(raw[3])}, + } + + data := raw[14+nameLen:] + if len(data)%2 == 1 { + data = append(data, 0) + } + + uint16s := make([]uint16, 0, len(data)/2) + for i := 0; i < len(data); i += 2 { + uint16s = append(uint16s, binary.LittleEndian.Uint16(data[i:i+2])) + } + if len(uint16s) == 0 { + return result, nil + } + + high := make([]byte, len(uint16s)) + low := make([]byte, len(uint16s)) + for i, value := range uint16s { + high[i] = byte(value >> 8) + low[i] = byte(value & 0xFF) + } + + pairCount := int(high[0]) + for i := 0; i < pairCount; i++ { + base := 1 + i*2 + if base+1 >= len(high) { + break + } + result.Skills = append(result.Skills, skillLearnItem{ + SkillIndex: int(high[base]), + Level: int(high[base+1]), + SkillType: int(low[base+1]), + }) + } + + sectionStart := (1 + pairCount*2) * 2 + if sectionStart >= len(data) { + return result, nil + } + sec2 := data[sectionStart:] + if len(sec2) < 2 { + return result, nil + } + + offset := 1 + evoCount := int(sec2[offset]) + offset++ + for i := 0; i < evoCount; i++ { + if offset+3 > len(sec2) { + break + } + result.Evolutions = append(result.Evolutions, skillChoice{ + SkillIndex: int(sec2[offset]), + Type: int(sec2[offset+2]) + 1, + }) + offset += 3 + } + + if offset >= len(sec2) { + return result, nil + } + enhCount := int(sec2[offset]) + offset++ + for i := 0; i < enhCount; i++ { + if offset+3 > len(sec2) { + break + } + result.Enhancements = append(result.Enhancements, skillChoice{ + SkillIndex: int(sec2[offset]), + Type: int(sec2[offset+2]) + 1, + }) + offset += 3 + } + + return result, nil +} + +func decodeUTF16LE(value []byte) string { + if len(value)%2 == 1 { + value = append(value, 0) + } + words := make([]uint16, 0, len(value)/2) + for i := 0; i < len(value); i += 2 { + words = append(words, binary.LittleEndian.Uint16(value[i:i+2])) + } + return strings.TrimSpace(string(utf16.Decode(words))) +} diff --git a/backend/go/internal/service/token.go b/backend/go/internal/service/token.go new file mode 100644 index 00000000..d3df0753 --- /dev/null +++ b/backend/go/internal/service/token.go @@ -0,0 +1,62 @@ +package service + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "time" +) + +const tokenTTL = 6 * time.Hour + +type TokenService struct { + adventure *AdventureService +} + +type AlterTokenPayload struct { + Alter string `json:"alter"` + EquVersion string `json:"equVersion"` + Time int64 `json:"time"` +} + +func NewTokenService(adventure *AdventureService) *TokenService { + return &TokenService{adventure: adventure} +} + +func (s *TokenService) Create(alterToken string, equVersion string) (string, error) { + if equVersion == "" { + equVersion = "0" + } + + alter, err := s.adventure.AlterByToken(alterToken) + if err != nil { + return "", err + } + + payload := AlterTokenPayload{ + Alter: alter, + EquVersion: equVersion, + Time: time.Now().UnixMilli(), + } + content, err := json.Marshal(payload) + if err != nil { + return "", err + } + + return base64.RawURLEncoding.EncodeToString(content), nil +} + +func (s *TokenService) Parse(token string) (AlterTokenPayload, error) { + var payload AlterTokenPayload + content, err := base64.RawURLEncoding.DecodeString(token) + if err != nil { + return payload, fmt.Errorf("decode token: %w", err) + } + if err := json.Unmarshal(content, &payload); err != nil { + return payload, fmt.Errorf("unmarshal token: %w", err) + } + if payload.Time <= 0 || time.Since(time.UnixMilli(payload.Time)) > tokenTTL { + return AlterTokenPayload{}, fmt.Errorf("token expired") + } + return payload, nil +} diff --git a/backend/go/python_bridge.py b/backend/go/python_bridge.py new file mode 100644 index 00000000..7088324b --- /dev/null +++ b/backend/go/python_bridge.py @@ -0,0 +1,77 @@ +import json +import os +import sys + + +def _fail(message: str) -> None: + print(json.dumps({'error': message}, ensure_ascii=False)) + sys.exit(1) + + +def _parse_args() -> tuple[str, str, str, str]: + if len(sys.argv) < 5: + _fail('usage: python_bridge.py ') + project_root = sys.argv[1] + command = sys.argv[2] + alter = sys.argv[3] + equ_version = sys.argv[4] + return project_root, command, alter, equ_version + + +def _ensure_path(project_root: str) -> None: + if project_root not in sys.path: + sys.path.insert(0, project_root) + sys.argv[0] = os.path.join(project_root, 'main.py') + os.chdir(project_root) + + +def _load_character(alter: str, equ_version: str): + from core.basic.character import createCharacter + + character = createCharacter(alter, equ_version or '0') + if character is None: + raise RuntimeError(f'failed to create character for {alter}') + return character + + +def _character_info(alter: str, equ_version: str): + character = _load_character(alter, equ_version) + return character.getInfo() + + +def _character_skills(alter: str, equ_version: str): + info = _character_info(alter, equ_version) + skills = info.get('skills', []) + return [ + { + 'id': str(skill.get('id', '')), + 'name': skill.get('name', ''), + 'type': skill.get('type', ''), + 'learnLv': int(skill.get('learnLv', 0)), + 'maxLearnLv': int(skill.get('maxLearnLv', 0)), + 'hasVP': bool(skill.get('hasVP', False)), + 'hasUP': bool(skill.get('hasUP', False)), + 'uuid': skill.get('uuid', ''), + } + for skill in skills + ] + + +def main() -> None: + project_root, command, alter, equ_version = _parse_args() + _ensure_path(project_root) + + try: + if command == 'character-info': + data = _character_info(alter, equ_version) + elif command == 'character-skills': + data = _character_skills(alter, equ_version) + else: + _fail(f'unknown command: {command}') + print(json.dumps(data, ensure_ascii=False)) + except Exception as ex: + _fail(str(ex)) + + +if __name__ == '__main__': + main() From 4bc2aef1ffa8854e11439b74f12274f8c670e088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Fri, 3 Apr 2026 18:03:54 +0800 Subject: [PATCH 02/21] dev --- backend/core/basic/character/__init__.py | 43 +++ backend/core/basic/character/base.py | 338 ++++++++++++++++++ backend/core/basic/character/calc_buffer.py | 64 ++++ backend/core/basic/character/calc_carry.py | 103 ++++++ backend/core/basic/character/calc_equip.py | 314 ++++++++++++++++ backend/core/basic/character/info.py | 120 +++++++ backend/core/basic/character/jade.py | 12 + .../basic/{character.py => character_old.py} | 12 + backend/core/basic/equipment.py | 17 +- backend/core/basic/roleinfo.py | 34 +- backend/dataFiles/dcalc_0.db | Bin 1007616 -> 1007616 bytes backend/test.py | 27 +- 12 files changed, 1057 insertions(+), 27 deletions(-) create mode 100644 backend/core/basic/character/__init__.py create mode 100644 backend/core/basic/character/base.py create mode 100644 backend/core/basic/character/calc_buffer.py create mode 100644 backend/core/basic/character/calc_carry.py create mode 100644 backend/core/basic/character/calc_equip.py create mode 100644 backend/core/basic/character/info.py create mode 100644 backend/core/basic/character/jade.py rename backend/core/basic/{character.py => character_old.py} (98%) diff --git a/backend/core/basic/character/__init__.py b/backend/core/basic/character/__init__.py new file mode 100644 index 00000000..6106bb9a --- /dev/null +++ b/backend/core/basic/character/__init__.py @@ -0,0 +1,43 @@ +""" +core.basic.character 包 +- jade.py : Jade(辟邪玉)数据类 +- base.py : CharacterBase — 属性声明、__init__、基础状态设置、技能操作 +- calc_equip.py : CalcEquipMixin — 套装/装备/时装/基础强化/辟邪玉/杂项计算 + calc 主入口 +- calc_carry.py : CalcCarryMixin — 输出角色伤害系数与技能伤害计算 +- calc_buffer.py : CalcBufferMixin — 辅助角色 Buff 技能计算 +- info.py : CharacterInfoMixin — 前端展示信息查询 +""" + +import importlib + +from .jade import Jade +from .calc_equip import CalcEquipMixin +from .calc_carry import CalcCarryMixin +from .calc_buffer import CalcBufferMixin +from .info import CharacterInfoMixin + + +class Character(CalcEquipMixin, CalcCarryMixin, CalcBufferMixin, CharacterInfoMixin): + """ + 角色类,通过多重继承组合各模块能力。 + + MRO(方法解析顺序): + Character → CalcEquipMixin → CalcCarryMixin → CalcBufferMixin + → CharacterInfoMixin → CharacterBase → CharacterProperty + """ + + +def createCharacter(alter: str, equVersion: str = '0') -> 'Character': + character: Character = None + module_name = 'core.character.' + alter + if equVersion is None or equVersion == '': + equVersion = '0' + try: + character = importlib.import_module(module_name).classChange(equVersion) + except Exception as ex: + print(ex) + print('create character ' + module_name + ' error.') + return character + + +__all__ = ['Character', 'Jade', 'createCharacter'] diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py new file mode 100644 index 00000000..7609349c --- /dev/null +++ b/backend/core/basic/character/base.py @@ -0,0 +1,338 @@ +from collections.abc import Mapping +from typing import Any, Literal + +from core.abstract.character import CharacterProperty +from core.basic.skill import Skill +from core.basic.equipment import EquEffect +from ..formula import 获取基础属性, 获取唤醒属性 +from ..roleinfo import CharacterEquipInfo, get_key_by_value, CharacterOathInfo +from .jade import Jade + + +class CharacterBase(CharacterProperty): + # region 额外类属性(CharacterProperty 中未声明的) + + BindAwake: int + """绑定觉醒等级""" + skills: list['Skill'] = [] + skills_dict: dict[str, 'Skill'] = {} + equVersion: str = '0' + """装备版本""" + charEquipInfo: dict[str, 'CharacterEquipInfo'] + """装备打造信息""" + charOathInfo: list['CharacterOathInfo'] + """誓约打造信息""" + equ_effect: list['EquEffect'] = [] + """装备效果列表""" + equ_options: dict[str, int] = {} + """装备选项列表""" + EquEffectRatio = 1.0 + """装备效果倍率""" + max_point = 0 + """套装效果点数""" + buffer: bool = False + + # region 职业属性 + 实际名称: str = '' + 名称: str = '' + 角色: str = '' + 角色类型: str = '' + 职业: str = '' + 武器选项: list[str] = [] + 副武器选项: list[str] = [] + 输出类型选项: list[str] = [] + 防具精通属性: list[str] = [] + 输出类型: str = '物理百分比' + # endregion + + # endregion + + # region 跨 Mixin 方法前向声明(供静态类型检查使用,由对应 Mixin 实现) + + def load_skills(self) -> None: + """加载技能(由 CalcEquipMixin 实现)""" + + def calc_carry_skills(self, DSB: bool, BUFF: bool) -> list: + """计算输出技能(由 CalcCarryMixin 实现)""" + return [] + + def get_carry_info(self) -> list: + """获取输出信息(由 CalcCarryMixin 实现)""" + return [] + + def calc_buffer_skills(self) -> list: + """计算辅助技能(由 CalcBufferMixin 实现)""" + return [] + + def get_buffer_info(self) -> list: + """获取辅助信息(由 CalcBufferMixin 实现)""" + return [] + + # endregion + + def __init__(self, equVersion, moduleName) -> None: + self.equVersion = equVersion + self.moduleName = moduleName + # 工会四维 + self.STR = 0 + 120 + self.INT = 0 + 120 + self.Spirit = 0 + 120 + self.Vitality = 0 + 120 + # 唤醒的情况下的基础数据 + self.AtkP = 0 + 65 + self.AtkM = 0 + 65 + self.AtkI = 1116 + 65 + self.PAtkP = 1.0 + self.PAtkM = 1.0 + self.PAtkI = 1.0 + self.ElementA = { + '火': False, + '冰': False, + '光': False, + '暗': False, + } + self.ElementDB = { + '火': 13, + '冰': 13, + '光': 13, + '暗': 13, + } + self.ElementR = { + '火': 0, + '冰': 0, + '光': 0, + '暗': 0, + } + self.Abnormal = { + '出血': False, + '灼伤': False, + '感电': False, + '中毒': False, + } + self.CriticalM = 0 + self.CriticalP = 0 + self.SkillAttack = 1 + self.SpeedA = 0 + self.SpeedM = 0 + self.SpeedR = 0 + self.HitP = 0 + self.Hit = 0 + self.MonsterInfo = { + 'DefenseP': 0, + 'DefenseM': 0, + '火抗': 0, + '冰抗': 0, + '光抗': 0, + '暗抗': 0, + } + self.Buffer = 0 + self.BufferP = 1.0 + self.Attack = 0 + self.AttackP = 1.0 + self.ElementIncrease = 1.0 + self.equs = {} + self.jade_effect = Jade() + self.equ_effect = [] + self.equ_options = {} + self.max_point = 0 + self.skills = [] + self.skills_dict = {} + self.load_skills() + + # region 角色属性设置 + + def SetBaseStatus(self) -> None: + """设角色基础属性""" + temp = 获取基础属性(self.角色, self.职业) + 唤醒 = 获取唤醒属性() + for index, i in enumerate([get_key_by_value(i) for i in ['力量', '体力', '智力', '精神']]): + setattr(self, i, getattr(self, i) + temp[index] + 唤醒) + + def SetStatus( + self, + 力量=0, + 智力=0, + 力智=0, + 体力=0, + 精神=0, + 体精=0, + 四维=0, + 物攻=0, + 魔攻=0, + 独立=0, + 三攻=0, + 技攻=0, + 全属强=0, + 全属抗=0, + 移动速度=0, + 攻击速度=0, + 施放速度=0, + 三速=0, + 命中=0, + 命中率=0, + 物暴=0, + 魔暴=0, + 攻击强化=0, + 攻击强化P=0, + 增益量=0, + 增益量P=0, + **kwargs: Mapping[ + Literal[ + 'STR', + 'INT', + 'AtkP', + 'AtkM', + 'AtkI', + 'PAtkP', + 'PAtkM', + 'PAtkI', + 'PATKIPDamage', + 'PDamageC', + 'PSTR', + 'PINT', + 'PDamageB', + 'ElementA', + 'ElementDB', + 'ElementR', + 'CriticalMP', + 'CriticalM', + 'CriticalPP', + 'CriticalP', + 'EquipmentSkillAttack', + 'SkillAttack', + 'SpeedA', + 'SpeedM', + 'SpeedR', + 'HitP', + 'Hit', + 'Attack', + 'AttackP', + 'Buffer', + 'BufferP', + 'Spirit', + 'Vitality', + 'EquEffectRatio', + '火强', + '冰强', + '光强', + '暗强', + '火属性抗性', + '冰属性抗性', + '光属性抗性', + '暗属性抗性', + '火属性攻击', + '冰属性攻击', + '光属性攻击', + '暗属性攻击', + ], + Any, + ], + ) -> None: + """设置角色属性""" + self.STR += 力量 + kwargs.get('STR', 0) + 四维 + 力智 + self.INT += 智力 + kwargs.get('INT', 0) + 四维 + 力智 + self.Spirit += 精神 + kwargs.get('Spirit', 0) + 四维 + 体精 + self.Vitality += 体力 + kwargs.get('Vitality', 0) + 四维 + 体精 + self.AtkP += 物攻 + kwargs.get('AtkP', 0) + 三攻 + self.AtkM += 魔攻 + kwargs.get('AtkM', 0) + 三攻 + self.AtkI += 独立 + kwargs.get('AtkI', 0) + 三攻 + self.PAtkP *= kwargs.get('PAtkP', 1.0) + self.PAtkM *= kwargs.get('PAtkM', 1.0) + self.PAtkI *= kwargs.get('PAtkI', 1.0) + for elem in ['火', '冰', '光', '暗']: + self.ElementA[elem] = kwargs.get(f'{elem}属性攻击', False) or kwargs.get('ElementA', {}).get(elem, False) or self.ElementA[elem] + self.ElementDB[elem] += kwargs.get(f'{elem}强', 0) + kwargs.get('ElementDB', {}).get(elem, 0) + 全属强 + self.ElementR[elem] += kwargs.get(f'{elem}抗', 0) + kwargs.get('ElementR', {}).get(elem, 0) + 全属抗 + self.CriticalM += kwargs.get('CriticalM', 0) + 魔暴 + self.CriticalP += kwargs.get('CriticalP', 0) + 物暴 + self.SkillAttack *= (1 + 技攻) * (1 + kwargs.get('SkillAttack', 0)) + self.SpeedA += 攻击速度 + kwargs.get('SpeedA', 0) + 三速 + self.SpeedM += 移动速度 + kwargs.get('SpeedM', 0) + 三速 + self.SpeedR += 施放速度 + kwargs.get('SpeedR', 0) + 三速 + self.HitP += 命中率 + kwargs.get('HitP', 0) + self.Hit += 命中 + kwargs.get('Hit', 0) + self.Attack += 攻击强化 + kwargs.get('Attack', 0) + self.AttackP += 攻击强化P + kwargs.get('AttackP', 0.0) + self.Buffer += 增益量 + kwargs.get('Buffer', 0) + self.BufferP += 增益量P + kwargs.get('BufferP', 0) + self.EquEffectRatio += kwargs.get('EquEffectRatio', 0.0) + + def AddElementDB(self, element: str, value: float, type: int = 0) -> None: + """ + 增加属性强化 + type: 0 站街 1 进图 + """ + if element not in self.ElementDB: + raise ValueError(f'Invalid element: {element}') + if type == 0: + value = value * (1 + self.jade_effect.ElementIncrease) + if type == 1: + value = int(value * (1 + self.jade_effect.ElementIncrease)) + self.ElementDB[element] += value + + def AddSkillLv(self, min: int, max: int, lv: int, type=-1, exceptSkills: list[str] = []) -> None: + """ + 增加技能等级 + type: -1 全部, 0 被动, 1 主动 + """ + skillType = 'all' if type == -1 else ('active' if type == 1 else 'passive') + for skill in self.skills: + if min <= skill.learnLv <= max: + if (skillType == 'all' or skill.type == skillType) and skill.lv > 0 and skill.name not in exceptSkills: + skill.lv += lv + + def SetSkillCD(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None: + """设置技能CD""" + for skill in self.skills: + if min <= skill.learnLv <= max and (skill.type == 'active' or skill.damage) and skill.learnLv not in exclude: + skill.cdReduce *= 1 - cd + + def SetSkillCDRecover(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None: + """设置技能CD恢复""" + for skill in self.skills: + if min <= skill.learnLv <= max and (skill.type == 'active' or skill.damage) and skill.learnLv not in exclude: + skill.cdRecover += cd + + def SetSkillRation(self, min=1, max=100, ratio=1, type=-1) -> None: + """设置技能倍率 + 0 修改技能面板 1 不修改技能面板 + type: -1 全部, 0 被动, 1 主动 + """ + for skill in self.skills: + if min <= skill.learnLv <= max and skill.damage and skill.type == 'active': + if type == 0: + skill.skillRation *= 1 + ratio + else: + skill.skillDamage *= 1 + ratio + + # endregion + + # region 技能查询 + + def GetSkillByName(self, name) -> 'Skill': + """通过技能名获取技能""" + return self.skills_dict.get(name, None) + + def GetSkillByID(self, id: str) -> 'Skill': + """通过技能ID获取技能""" + skill = list(filter(lambda x: str(x.id) == id, self.skills)) + return skill[0] if len(skill) > 0 else None + + def GetSkillByUUID(self, uuid: str) -> 'Skill': + """通过技能UUID获取技能""" + skill = list(filter(lambda x: str(x.uuid) == uuid, self.skills)) + return skill[0] if len(skill) > 0 else None + + def GetSkillNames(self, type: Literal['active', 'passive', 'all'] = 'all', damage: Literal[True, False, 'all'] = 'all') -> list[str]: + """获取技能名字""" + return [skill.name for skill in self.skills if (type == 'all' or skill.type == type) and (damage == 'all' or skill.damage == damage)] + + def GetWeaponType(self) -> tuple[str, str]: + """获取武器类型""" + weapon = self.charEquipInfo['武器'].equInfo + if weapon is None: + return None, None + else: + return weapon.itemDetailType, weapon.categorize + + # endregion diff --git a/backend/core/basic/character/calc_buffer.py b/backend/core/basic/character/calc_buffer.py new file mode 100644 index 00000000..ebfa4b75 --- /dev/null +++ b/backend/core/basic/character/calc_buffer.py @@ -0,0 +1,64 @@ +from core.basic.property import CharacterInfo +from ..roleinfo import get_key_by_value +from .base import CharacterBase + + +class CalcBufferMixin(CharacterBase): + """辅助角色 Buff 技能计算相关方法""" + + # region 辅助计算项 + + def calc_buffer_skills(self): + skillInfos = [] + # 适用属性 + main = getattr(self, get_key_by_value(self.适用属性)) + # 增益量 + buffer_power = self.Buffer * self.BufferP + # buff系数 + buff_ratio_new = (main / 2993 + 1) * (buffer_power / 4800 + 1) if buffer_power > 0 else 0 + buff_ratio_old = main / 2993 + 1 + # 觉醒系数 + awake_ratio_new = ((main + 7500) / 7500 + 1) * ((buffer_power + 68000) / 8500 + 1) if buffer_power > 0 else 0 + awake_ratio_old = main / 7500 + 1 + for i in self.skills: + if i.lv > 0 and i.hasUP and i.up is not None and i.up > 0: + self.SetStatus(四维=40) + if i.buffer and i.lv > 0: + info = i.skillInfo() + value = info[0] + if i.buffType == 'buff' or i.buffType == 'buffSub': + value1 = (info[1][0] + info[1][2]) * info[1][1] * buff_ratio_old + info[1][0] * buff_ratio_new + value2 = (info[2][0] + info[2][2]) * info[2][1] * buff_ratio_old + info[2][0] * buff_ratio_new + elif i.buffType == 'awake' or i.buffType == 'awakeSub': + value1 = (info[1][0] + info[1][2]) * info[1][1] * awake_ratio_old + info[1][0] * awake_ratio_new + value2 = (info[2][0] + info[2][2]) * info[2][1] * awake_ratio_old + info[2][0] * awake_ratio_new + else: + value1 = (info[1][0] + info[1][2]) * info[1][1] + value2 = (info[2][0] + info[2][2]) * info[2][1] + value3 = info[3] + value4 = info[4] + if i.buffType == 'awake' and self.bindAwake == 50: + pass + else: + skillInfos.append( + { + 'name': i.name, + 'cd': value4, + 'icon': i.icon, + 'lv': i.lv, + 'buff': [value, value1, value2, value3], + 'type': i.type, + } + ) + return skillInfos + + def get_buffer_info(self): + attrs = [get_key_by_value(self.适用属性), 'Buffer', 'BufferP'] + info = [] + for attr in attrs: + temp = getattr(CharacterInfo, attr) + value = getattr(self, attr) + info.append({'name': temp.name, 'value': temp.value(value)}) + return info + + # endregion diff --git a/backend/core/basic/character/calc_carry.py b/backend/core/basic/character/calc_carry.py new file mode 100644 index 00000000..956d41d5 --- /dev/null +++ b/backend/core/basic/character/calc_carry.py @@ -0,0 +1,103 @@ +from ..formula import 获取基础属性 +from core.basic.property import CharacterInfo +from .base import CharacterBase + + +class CalcCarryMixin(CharacterBase): + """输出角色技能伤害计算相关方法""" + + # region 输出计算项 + + def calc_damage_ration(self, DSB: bool, BUFF: bool): + """计算属性系数""" + attrs = [] + if self.输出类型 == '物理百分比': + attrs.extend(['STR', 'AtkP', 'PAtkP']) + if self.输出类型 == '魔法百分比': + attrs.extend(['INT', 'AtkM', 'PAtkM']) + if self.输出类型 == '物理固伤': + attrs.extend(['STR', 'AtkI', 'PAtkI']) + if self.输出类型 == '魔法固伤': + attrs.extend(['INT', 'AtkI', 'PAtkI']) + # 力智系数 + value0_1 = getattr(self, attrs[0]) + value0_2 = 获取基础属性(self.角色, self.职业)[0] if attrs[0] == 'STR' else 获取基础属性(self.角色, self.职业)[1] + # 系统奶及奶系增幅 + value = value0_1 + ((value0_1 - value0_2) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) + ratio_0: float = value / 250 + 1 + # 物理/魔法/独立攻击力 + ratio_1: float = getattr(self, attrs[1]) + 30000 * (1 if BUFF else 0) + # 技能 物理/魔法/独立攻击力% + ratio_2: float = getattr(self, attrs[2]) + # 属强系数 + ratio_3 = max(self.ElementDB.values()) * 0.0045 + 1.05 + # 暴击系数 + ratio_4 = 1.5 + # BUFF系数 + ratio_5 = self.buff + # 技攻系数 + ratio_6 = self.SkillAttack * (self.jade_effect.SkillAttack + 1) + # 攻击强化 + ratio_7 = 1 + self.Attack / 100 * (self.AttackP + self.jade_effect.AttackP) + # 防御系数,暂定145沙袋防御 + monster_defense = 81417275817 + ratio_8 = 1 - monster_defense / (monster_defense + 200 * 100) + # 杂项 + ratio_9 = 1.0 * self.ElementIncrease + return (ratio_0, ratio_1, ratio_2, ratio_3, ratio_4, ratio_5, ratio_6, ratio_7, ratio_8, ratio_9) + + def calc_carry_skills(self, DSB: bool, BUFF: bool): + skillInfos = [] + for i in self.skills: + if i.damage and i.lv > 0: + for mode in i.mode: + temp = i.skillInfo(mode) + if temp[0] > 0: + skillInfos.append( + { + 'name': i.name, + 'icon': i.icon, + 'lv': i.lv, + 'data': temp[0], + 'ratio': temp[1], + 'cd': temp[2], + 'mode': mode, + 'learnLv': i.learnLv, + 'type': i.type, + } + ) + ratios = self.calc_damage_ration(DSB, BUFF) + ratio_char_skill = ratios[0] * ratios[1] * ratios[2] * ratios[3] * ratios[4] * ratios[5] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000 + ratuio_equ_skill = ratios[0] * ratios[1] * ratios[3] * ratios[4] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000 + for i in skillInfos: + i['damage'] = ratio_char_skill * i['data'] * i['ratio'] / 100 + for i in self.equ_effect: + skillInfos.append({'name': i.name, 'icon': i.icon, 'lv': 0, 'data': i.data, 'ratio': 10.0, 'cd': i.cd, 'damage': ratuio_equ_skill * i.data * 10 * self.EquEffectRatio / 100, 'mode': ''}) + return skillInfos + + def get_carry_info(self): + attrs = [] + if self.输出类型 == '物理百分比': + attrs.extend(['STR', 'AtkP']) + if self.输出类型 == '魔法百分比': + attrs.extend(['INT', 'AtkM']) + if self.输出类型 == '物理固伤': + attrs.extend(['STR', 'AtkI']) + if self.输出类型 == '魔法固伤': + attrs.extend(['INT', 'AtkI']) + info = [] + attrs.extend(['Attack', 'AttackP', 'SkillAttack', 'EquEffectRatio', 'ElementDB']) + for attr in attrs: + temp = getattr(CharacterInfo, attr) + if attr.startswith('Atk'): + info.append({'name': temp.name, 'value': temp.value(getattr(self, attr) * getattr(self, f'P{attr}'))}) + else: + value = getattr(self, attr) + if attr == 'SkillAttack': + value *= self.jade_effect.SkillAttack + 1 + if attr == 'AttackP': + value += self.jade_effect.AttackP + info.append({'name': temp.name, 'value': temp.value(value)}) + return info + + # endregion diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py new file mode 100644 index 00000000..7c435776 --- /dev/null +++ b/backend/core/basic/character/calc_equip.py @@ -0,0 +1,314 @@ +import sys +from uuid import uuid1 + +from core.basic.equipment import get_equipment +from ..formula import 增幅计算, 强化技攻, 武器强化计算, 精通计算, 耳环计算, 左右计算, 锻造计算 +from ..roleinfo import CharacterEquipInfo, CharacterOathInfo, get_key_by_value +from .base import CharacterBase + + +class CalcEquipMixin(CharacterBase): + """装备计算、角色初始化相关方法""" + + # region 打造信息导入 + + def SetDetail(self, info: dict[str, dict]) -> None: + """打造信息导入""" + self.charEquipInfo = {} + self.charOathInfo = [] + self.bindAwake = info.get('bindAwake', 50) + for key in info['equips']: + self.charEquipInfo[key] = CharacterEquipInfo(info['equips'][key], self.equVersion, key) + for key in info['oaths']: + # 导入誓约打造信息、誓约信息 + self.charOathInfo.append(CharacterOathInfo(info['oaths'][key], self.equVersion, key)) + + def calc_init(self, setInfo: dict[str, dict]): + self.equ_options = setInfo.get('options', {}) + self.setInfo = setInfo + self.SetDetail(setInfo) + self.SetSkills(setInfo.get('skills', {})) + + def SetSkills(self, skills: dict[str, dict]): + """设置技能等级""" + for key in skills: + skill = self.GetSkillByID(key) + if skill is not None: + if skill.hasUP: + skill.up = skills[key].get('up', 0) + if skill.hasVP: + skill.vp = skills[key].get('vp', 0) + skill.lv += skills[key].get('lv', 0) + + def load_skills(self) -> None: + """加载技能""" + module = sys.modules[self.moduleName] + for name in dir(module): + memberClass = getattr(module, name) + if isinstance(memberClass, type) and memberClass.__name__.startswith('Skill'): + skill = memberClass(char=self) + self.skills_dict[skill.name] = skill + self.skills.append(skill) + + # endregion + + # region 套装 / 装备 / 时装 / 基础属性 / 辟邪玉 / 杂项 + + def calc_suits(self): + """套装效果统计""" + suitInfo = {} + oathSuitInfo = {} + equs = get_equipment(self.equVersion) + for item in filter(lambda x: x.equInfo is not None, self.charEquipInfo.values()): + partEqu = item.equInfo + # partFusion = item.fusionInfo + if partEqu is not None: + for suit in partEqu.suit: + if suitInfo.get(suit, None) is None: + suitInfo[suit] = {'point': 0, 'count': 0} + if partEqu.Point == 0: + suitInfo[suit]['count'] += 1 + else: + suitInfo[suit]['point'] += partEqu.Point + for item in self.charOathInfo: + partOath = item.oathInfo + if partOath is not None: + for suit in partOath.suit: + if oathSuitInfo.get(suit, None) is None: + oathSuitInfo[suit] = {'point': 0, 'count': 0} + if partOath.Point == 0: + oathSuitInfo[suit]['count'] += 1 + else: + oathSuitInfo[suit]['point'] += partOath.Point + max_point_suit = max((suit for suit in suitInfo if suitInfo[suit]['point'] > 0), key=lambda suit: suitInfo[suit]['point'], default=None) + max_point_oath_suit = max((suit for suit in oathSuitInfo if oathSuitInfo[suit]['point'] > 0), key=lambda suit: oathSuitInfo[suit]['point'], default=None) + zero_point_suits = [suit for suit in suitInfo if suitInfo[suit]['point'] == 0] + # 套装没有到太初的时候,优先把誓约套装的点数加到装备套装上,以达到更高的套装等级 + if 0 < suitInfo[max_point_suit]['point'] < 2550: + suitInfo[max_point_suit]['point'] += min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) + oathSuitInfo[max_point_oath_suit]['point'] -= min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) + pass + suits = zero_point_suits + ([max_point_suit] if max_point_suit is not None else []) + suitList = [] + oathSuitList = [] + res = [] + for suit in suits: + if suitInfo[suit]['point'] == 0: + suitList += equs.get_suit_info(suit, 0, suitInfo[suit]['count']) + else: + suitList += equs.get_suit_info(suit, suitInfo[suit]['point'], 0) + if len(suitList) == 0: + continue + temp = suitList[-1] + res.append( + { + 'id': temp.id, + 'name': temp.name, + 'rarity': temp.rarity, + 'point': suitInfo[suit]['point'], + 'count': suitInfo[suit]['count'], + 'level': temp.level, + 'imageUrl': temp.imageUrl, + 'value': temp.value, + } + ) + + for suit in oathSuitInfo: + if oathSuitInfo[suit]['point'] == 0: + oathSuitList += equs.get_oath_suit_info(suit, 0, oathSuitInfo[suit]['count']) + else: + oathSuitList += equs.get_oath_suit_info(suit, oathSuitInfo[suit]['point'], 0) + if len(oathSuitList) == 0: + continue + print(oathSuitList[0].__dict__) + suits_effect = [i.id for i in suitList] + for i in suits_effect: + func = equs.funs.execture(f'suit_{i}') + suit = next((x for x in equs.suits if str(x.id) == str(i)), None) + if func is not None: + func(self) + if suit is not None: + filtered_dict = {k: v for k, v in suit.__dict__.items() if k[0].isupper()} + self.SetStatus(**filtered_dict) + self.max_point = max([i['point'] for i in res], default=0) + if self.max_point >= 2550: + skillAttack = (self.max_point - 2550) // 70 * 0.01 + buffer = (self.max_point - 2550) // 70 * 100 + self.SetStatus(SkillAttack=skillAttack, Buffer=buffer) + return res + + def calc_equs(self): + """计算装备基础效果、附魔""" + effects = get_equipment(self.equVersion).funs + # for detail in [(item.equInfo, item.fusionInfo, item.enchant, item.emblem_0, item.emblem_1) for item in filter(lambda x: x.equInfo is not None, self.charEquipInfo.values())]: + for detail in [(item.equInfo, item.enchant) for item in filter(lambda x: x.equInfo is not None, self.charEquipInfo.values())]: + equ = detail[0] + if equ is None or equ.itemType == '副武器': + continue + enchat = detail[1] + fun = effects.execture(f'equ_{equ.id}') + if fun is None: + continue + filtered_dict = {k: v for k, v in equ.__dict__.items() if k[0].isupper()} + self.SetStatus(**filtered_dict) + fun(self) + fun = effects.execture(f'enchant_{enchat}') + if fun is not None: + fun(self) + # emblem_0 = detail[3] + # emblem_1 = detail[4] + # if str(emblem_0).isdigit(): + # fun = effects.execture(f'emblem_{emblem_0}') + # if fun is not None: + # fun(self) + # else: + # skill = self.GetSkillByName(emblem_0) + # if skill is not None: + # skill.lv += 1 + # self.SetStatus(四维=8) + # fun = effects.execture(f'emblem_{emblem_1}') + # if fun is not None: + # fun(self) + # if fusion is None: + # continue + # fun = effects.execture(f'stone_{fusion.id}') + # filtered_dict = {k: v for k, v in fusion.__dict__.items() if k[0].isupper()} + # self.SetStatus(**filtered_dict) + # if fun is not None: + # fun(self) + + def calc_oaths(self): + pass + + def calc_avatar(self, avatar: dict): + """计算时装效果""" + equ = get_equipment(self.equVersion) + dress = {key: value for key, value in avatar.items() if key in ['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} + equ.funs.calc_dress_effect(dress, self) + avatarElse = {key: value for key, value in avatar.items() if key not in ['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} + for key in avatarElse: + value = avatarElse[key].get('enchant', None) + emblem_0 = avatarElse[key].get('emblem_0', None) + emblem_1 = avatarElse[key].get('emblem_1', None) + if value is not None: + fun = equ.funs.execture(f'enchant_{value}') + if fun is not None: + fun(self) + for i in [emblem_0, emblem_1]: + if i is None: + continue + fun = equ.funs.execture(f'emblem_{i}') + if fun is not None: + fun(self) + + def calc_weapon(self, cur: 'CharacterEquipInfo'): + """武器强化、锻造计算""" + value = 锻造计算(115, '史诗', cur.refine) + self.SetStatus(AtkI=value) + if '传世武器' in cur.equInfo.categorize: + value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '物理', 1.12) + self.SetStatus(AtkP=value, AtkM=value) + else: + value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '物理') + self.SetStatus(AtkP=value) + value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '魔法') + self.SetStatus(AtkM=value) + + def calc_basic(self): + """计算基础属性:防具精通、增幅、强化等""" + for part in ['上衣', '头肩', '下装', '腰带', '鞋']: + cur = self.charEquipInfo[part] + if cur.equInfo is None: + continue + equ = cur.equInfo + reinforce = self.charEquipInfo[part].reinforce + if equ is None: + continue + for key in self.防具精通属性: + value = 精通计算(115, equ.rarity, reinforce, equ.itemDetailType, self.防具类型, self.buffer, key) + key = get_key_by_value(key) + setattr(self, key, getattr(self, key) + value) + for part in self.charEquipInfo.keys(): + cur = self.charEquipInfo[part] + if cur.equInfo is None: + continue + if cur.reinforceType == 1: + value = 增幅计算(115, '史诗', cur.reinforce) + self.SetStatus(STR=value, INT=value, Spirit=value, Vitality=value) + value = 强化技攻(cur.reinforce, cur.reinforceType, part) + self.SetStatus(SkillAttack=value) + if '武器' in part: + self.calc_weapon(cur) + if part == '耳环': + value = 耳环计算(115, '史诗', cur.reinforce) + self.SetStatus(AtkM=value, AtkP=value, AtkI=value) + if part in ['辅助装备', '魔法石']: + value = 左右计算(115, '史诗', cur.reinforce) + self.SetStatus(STR=value, INT=value, Spirit=value, Vitality=value) + + def calc_jade(self, jades): + """计算辟邪玉效果""" + funs = get_equipment(self.equVersion).funs + for key in jades: + jade = jades[key] + fun = funs.execture(f'jade_{jade.get("id", 0)}') + if fun is not None: + fun(self, jade.get('value', 0)) + + def calc_sundry(self, sundry: dict): + """计算杂项效果""" + funs = get_equipment(self.equVersion).funs + funs.execture('sundry_0')( + self, + sundry.get('medal_rarity', 0), + sundry.get('medal_reinforce', 0), + [sundry.get('medal_gem_0', 0), sundry.get('medal_gem_1', 0), sundry.get('medal_gem_2', 0), sundry.get('medal_gem_3', 0)], + ) + funs.execture('sundry_6')(self, sundry.get('adventure', 1)) + funs.execture('sundry_5')(self, sundry.get('fog', 1)) + funs.execture('sundry_7')(self, sundry.get('marriage_house', 0), sundry.get('marriage_ring', 0)) + funs.execture('sundry_9')(self, sundry.get('contract', 0)) + funs.execture('sundry_10')( + self, + sundry.get('collection_type', 0), + sundry.get('collection_num_0', 0), + sundry.get('collection_num_1', 0), + ) + funs.execture('sundry_13')(self, sundry.get('costume_card', 0)) + + # endregion + + # region 主计算入口 + + def calc(self, setInfo: dict[str, dict]): + self.calc_init(setInfo) + self.SetBaseStatus() + self.calc_jade(setInfo.get('jades', [])) + self.calc_avatar(setInfo.get('avatar', {})) + self.calc_basic() + self.calc_sundry(setInfo.get('sundry', {})) + suit = self.calc_suits() + self.calc_equs() + self.calc_oaths() + skillInfos = [] + if self.buffer: + skillInfos = self.calc_buffer_skills() + info = self.get_buffer_info() + else: + if len(self.输出类型选项) > 1: + temp = self.输出类型选项[0] + if '固伤' in temp: + if self.INT > self.STR: + self.输出类型 = '魔法固伤' + else: + self.输出类型 = '物理固伤' + else: + if self.INT > self.STR and self.AtkM > self.AtkP: + self.输出类型 = '魔法百分比' + else: + self.输出类型 = '物理百分比' + skillInfos = self.calc_carry_skills(setInfo.get('DSB', False), setInfo.get('BUFF', False)) + info = self.get_carry_info() + return {'uuid': uuid1().hex, 'skills': skillInfos, 'info': info, 'suits': suit, 'buffer': self.buffer} + + # endregion diff --git a/backend/core/basic/character/info.py b/backend/core/basic/character/info.py new file mode 100644 index 00000000..ca24b24f --- /dev/null +++ b/backend/core/basic/character/info.py @@ -0,0 +1,120 @@ +from core.basic.equipment import get_equipment +from core.basic.property import CharacterInfo +from .base import CharacterBase + + +class CharacterInfoMixin(CharacterBase): + """角色信息查询相关方法(用于前端展示)""" + + def getInfo(self): + """返回到前端信息""" + info = {} + info['role'] = self.role + info['alter'] = self.name + info['equVersion'] = self.equVersion + info['name'] = self.nameCN + info['weapons'] = self.武器选项 + info['subweapons'] = self.副武器选项 + info['buffer'] = self.buffer + if self.buffer: + info['properties'] = self.防具精通属性 + info['properties'] = self.输出类型选项 + skillInfo = [] + skill_clothes = [] + platinum = [] + for skill in self.skills: + if 15 <= skill.learnLv <= 70 and skill.learnLv not in [48, 50]: + platinum.append(skill.name) + if skill.learnLv <= 95: + skill_clothes.append(skill.name) + skillInfo.append( + { + 'id': skill.id, + 'name': skill.name, + 'icon': skill.icon, + 'type': skill.type, + 'learnLv': skill.learnLv, + 'masterLv': skill.masterLv, + 'maxLearnLv': skill.calculate_lv(), + 'maxLv': skill.maxLv, + 'position': skill.position, + 'line': skill.line, + 'bind': skill.bind, + 'hasVP': skill.hasVP, + 'hasUP': skill.hasUP, + 'upType': skill.upType, + 'uuid': skill.uuid, + 'vps': [{'name': i['name'], 'desc': i['desc']} for i in skill.vps], + } + ) + info['skills'] = skillInfo + equInfos = get_equipment(self.equVersion) + equs = [] + suits = [] + stones = [] + for i in equInfos.equs: + if i.itemType == '武器' and i.itemDetailType not in self.武器选项: + continue + equs.append(i.__dict__) + for i in equInfos.suits: + suits.append(i.__dict__) + for i in equInfos.stones: + stones.append(i.__dict__) + info['equips'] = equs + info['suits'] = suits + info['stones'] = stones + key = '辅助' if self.buffer else '输出' + info['enchants'] = list(filter(lambda x: key in x['categorize'], equInfos.enchants)) + info['emblems'] = [i for i in equInfos.emblems] + info['avatar'] = equInfos.funs.get_dress_list(skill_clothes) + info['jades'] = equInfos.jades + info['options'] = equInfos.funs.options + info['sundry'] = equInfos.funs.sundryList + for skill in platinum: + info['emblems'].append( + { + 'id': skill, + 'fame': 232, + 'position': ['辅助装备', '魔法石'], + 'detail': skill + ' Lv+1' + ' 四维 + 8', + 'categorize': ['技能'], + 'rarity': '白金', + } + ) + return info + + def getBasicInos(self): + res = [] + attrs = [] + if self.输出类型.includes('物理'): + attrs = ['STR', 'PSTR', 'AtkP', 'PAtkP', 'CriticalPP', 'CriticalP'] + if self.输出类型.includes('魔法'): + attrs = ['INT', 'PINT', 'AtkM', 'PAtkM', 'CriticalMP', 'CriticalM'] + for attr in attrs + ['PDamage', 'PDamageC', 'PDamageB', 'SpeedA', 'SpeedM', 'SpeedR']: + temp = getattr(CharacterInfo, attr) + res.append( + { + 'name': temp.name, + 'value': temp.value(getattr(self, attr)), + 'icon': temp.icon, + } + ) + keys = ['火', '冰', '光', '暗'] + for index in range(0, 4): + temp = getattr(CharacterInfo, f'ElementDB{index}') + res.append( + { + 'name': temp.name, + 'value': temp.value(getattr(self, 'ElementDB')[keys[index]]), + 'icon': temp.icon, + } + ) + temp = getattr(CharacterInfo, f'ElementR{index}') + res.append( + { + 'name': temp.name, + 'value': temp.value(getattr(self, 'ElementR')[keys[index]]), + 'icon': temp.icon, + } + ) + return res diff --git a/backend/core/basic/character/jade.py b/backend/core/basic/character/jade.py new file mode 100644 index 00000000..301e6a7f --- /dev/null +++ b/backend/core/basic/character/jade.py @@ -0,0 +1,12 @@ +class Jade: + ElementIncrease: float + """属性增幅""" + AttackP: float + """攻击强化%""" + SkillAttack: float + """技能攻击力%""" + + def __init__(self) -> None: + self.ElementIncrease = 0.0 + self.AttackP = 0.0 + self.SkillAttack = 0.0 diff --git a/backend/core/basic/character.py b/backend/core/basic/character_old.py similarity index 98% rename from backend/core/basic/character.py rename to backend/core/basic/character_old.py index e1654a97..f140d5b2 100644 --- a/backend/core/basic/character.py +++ b/backend/core/basic/character_old.py @@ -1,3 +1,15 @@ +# ⚠️ 此文件已被 character/ 包目录取代。 +# Python 会优先加载 character/__init__.py,此文件不会被 import 执行。 +# +# 模块拆分结构(位于 core/basic/character/): +# jade.py — Jade 辟邪玉类 +# base.py — CharacterBase(属性 / __init__ / 基础状态方法 / 技能操作) +# calc_equip.py — CalcEquipMixin(套装/装备/时装/强化/辟邪玉/杂项 + calc 主入口) +# calc_carry.py — CalcCarryMixin(输出伤害计算) +# calc_buffer.py — CalcBufferMixin(辅助 Buff 技能计算) +# info.py — CharacterInfoMixin(前端信息查询) +# __init__.py — 组装 Character 类 + createCharacter 工厂函数 + from functools import cache import importlib import sys diff --git a/backend/core/basic/equipment.py b/backend/core/basic/equipment.py index 1c652067..39f18b9c 100644 --- a/backend/core/basic/equipment.py +++ b/backend/core/basic/equipment.py @@ -89,15 +89,16 @@ class Equipments: self.emblems = [] self.suits: list[Suit] = [] self.suit_dict: dict[str, Suit] = {} - self.oath_suits: list[Suit] = [] + self.oath_suits: list[OathSuit] = [] + self.oath_suit_dict: dict[str, OathSuit] = {} self.init_equs() self.init_suits() self.init_enchants() self.init_stones() self.init_emblem() self.init_jades() - # self.init_oaths() - # self.init_oath_suits() + self.init_oaths() + self.init_oath_suits() self.engine.dispose() def init_equs(self): @@ -235,7 +236,9 @@ class Equipments: buffers = parse_to_number_list(suit['Buffer'], [0]) suit['Buffer'] = 0 if i - 1 >= len(buffers) else buffers[i - 1] suit['skills'] = [OathSuitSkill(**{k: v for k, v in skill.__dict__.items() if not k.startswith('_')}) for skill in skills] - self.oath_suits.append(suit) + oath_suit = OathSuit(**suit) + self.oath_suits.append(oath_suit) + self.oath_suit_dict.setdefault(str(suit['suitId']), []).append(oath_suit) pass pass @@ -263,7 +266,7 @@ class Equipments: result[suit.count] = suit return list(result.values()) - def get_oath_suit_info(self, suitId: str | int, point: int = 0, count: int = 0) -> list[Suit]: + def get_oath_suit_info(self, suitId: str | int, point: int = 0, count: int = 0) -> list['OathSuit']: """根据套装点数返回对应适用的誓约套装属性\n 新套装只需要传入suitID和point即可,count默认为0\n 老套装需要传入suitID和count即可,point默认为0 @@ -271,8 +274,8 @@ class Equipments: if suitId not in self.oath_suit_dict: return [] # 先筛选出点数小于等于point和数量小于等于count的套装 - suits: list[Suit] = [suit for suit in self.oath_suit_dict[str(suitId)] if suit.point <= point and suit.count <= count] - result: dict[int, Suit] = {} + suits: list[OathSuit] = [suit for suit in self.oath_suit_dict[str(suitId)] if suit.point <= point and suit.count <= count] + result: dict[int, OathSuit] = {} # 取每种count套装中点数最高的 for suit in suits: if suit.count not in result or suit.point > result[suit.count].point: diff --git a/backend/core/basic/roleinfo.py b/backend/core/basic/roleinfo.py index 6087d36e..413af6d5 100644 --- a/backend/core/basic/roleinfo.py +++ b/backend/core/basic/roleinfo.py @@ -13,32 +13,32 @@ class CharacterEquipInfo: """强化类型""" enchant: str """附魔""" - emblem_0: str - """徽章1""" - emblem_1: str - """徽章2""" - fusion: int | None - """贴膜ID""" + # emblem_0: str + # """徽章1""" + # emblem_1: str + # """徽章2""" + # fusion: int | None + # """贴膜ID""" refine: int | None """锻造等级""" - weaponFusion: int | None - """武器融合详情""" + # weaponFusion: int | None + # """武器融合详情""" adaptation: int """调适等级""" equInfo: Union['Equ', None] """装备信息""" - fusionInfo: Union['Equ', None] - """贴膜信息""" + # fusionInfo: Union['Equ', None] + # """贴膜信息""" precision: float """秘宝精度""" def __init__(self, info={}, equVerison=0, part='') -> None: - info['fusion'] = info.get('fusion', None) + # info['fusion'] = info.get('fusion', None) info['precision'] = info.get('precision', 0) - info['weaponFusion'] = info.get('weaponFusion', None) + # info['weaponFusion'] = info.get('weaponFusion', None) self.__dict__.update(info) equ = get_equipment(equVerison).equ_dict.get(self.id, None) - fusion = get_equipment(equVerison).stone_dict.get(self.fusion, None) + # fusion = get_equipment(equVerison).stone_dict.get(self.fusion, None) if equ is not None and (equ.itemType == part or equ.itemDetailType == part or (equ.itemType == '武器' and part == '副武器')): self.equInfo = equ.adapt(self.adaptation) self.adaptation = min(self.adaptation, self.equInfo.max_adaptation) @@ -46,10 +46,10 @@ class CharacterEquipInfo: self.equInfo.itemType = '副武器' else: self.equInfo = None - if fusion is not None and (fusion.itemType == part or fusion.itemDetailType == part): - self.fusionInfo = fusion.adapt(self.adaptation) - else: - self.fusionInfo = None + # if fusion is not None and (fusion.itemType == part or fusion.itemDetailType == part): + # self.fusionInfo = fusion.adapt(self.adaptation) + # else: + # self.fusionInfo = None class CharacterOathInfo: diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 04374e7b4bfbe45e6b4f5003f51cb6df6981151d..7c990bbb24589c2e25da23dd566e9e48b3996eb1 100644 GIT binary patch delta 2223 zcmZYAZ%h+s90%~b{;t>mz1HX2($>;a?0|t6V zyKkT8obRX;X zvQyfJ+B)V(CIerANz+dML!YJYPDY#F<%OMIyVvC^u5@#eNCOvhP?TQ$I|1|Pgoglf za0p58>0xL`8Mh1}H&^R$aW0nx?i94~!qx&J_*o6I+-QLrEUtX{ZIdMB&W*B`KY`!_ z)a@WZ@-I3dfigS+lK;pd=OZE{{~M>2Qo2c%$ofAUbb*M)u1a*h|8_fwsM|(>-`@qfG%FBu@WKqoo=|!3zZgClzg`b=6GS7S&>RI{$JbSD(W*4Ao=$^ z(2BZ@GT`wKk^a|s;SeuuF%Tj7PrNY63x2&SO8(qtnBaw=P8H?-_ZPw?bd)7P^7r{5 zj{3C<)RO+s`XGg$#VAr9QBtgaxP%4rCBjQmq)}z>`uP9FLk@M&1W5jZ9~#f*#&h(I zoMz|~ydDD6bHFSz0eHGyy0kehFhMbNiZTu9<8+EyW|rv`omz-CMd`&<8frBRJ4_$M z*9YjtIhRxC^7-g-I-5RzqIWQz?Qa>$WR*|YpNK`1u|P7quQ3(~D$T(_sWA`;W_p5w zWUMV&T2)sl>q66yFqS4eItE+y~8iI_N7nuZfp~C8E}Y^0q_<`f2@0Oznk&p#i|fEDjB5bIHrEGP^v~3dJ>8 zC#`q-#PVqwV&W*CR>YJVHWz@cd0D0>^AA1mGs+8%V?mB0DthDP?5+Ny# zg{-veg!AQ@ET!93QC9sECyQ78HUcF7mY+?ax3|g=adUC9>I&Q7Broi(P-H*JcOQY< zSjzL|fh>`iH_BT7e{X`%(MTBqlKQP%n& zOTd)B!%slTuL{?OE5l*=Lu^ifPkhh`#b~%t{-wMPE632`B&6|X>mx$8q1~<0W?Qpa z73F|>+zQvFqxJdrMcWe40X*$5G65Es4woL60dFuy-5+%8duG!a`!0OwR^h6_bsSga zg)62DSIl2tvGgCp_ioae@RDh>u3FDq?pbW+7SqZ?(cJeYbb7ax9l{ex9l&@2+sg~} zuMi;v=ykIR{XlNG!WdOx#58H{lYGsg*4dvJ}cv*aGgldS8 P{2#pR)OeR=yvzDOeC}0TeRrE-cJ5yGea?B` zbI&>VUOL8o9pk?KnF*T_LXTmbhLH}VW*|EsZ$>#Qwx4b|k}}HGx{`utLf10iYXlWyuDN^YD+@{*)H-_j@<{@_DQjIW}N;JjW|a-1>e zrP5NT>YUPf1e~*H{GUv{_IBrCAZff#vV6X%Pt)E3AgP8Jc_}KGu&-Yx4GtZ66CF}w zqAIg(XN64G%M3W2l2g;azjGxf=KH7tLac`n6PXFDVk*SfyVMZf&%}rx$kQ$ga`6l> zxr!c;Ym+np8SyzBQMpJ@Jtnqpv>xQv%8J*{Oqg8Ou45qQ5o1J`d$4OnChKfE$YXM^ z?XHqZ(5e9_O*&iMsog6CBL0bJ!Z;U@m2?X;VRDJRLm=le$A~U>u6M6Y0!9XOxxqc9 zG6`e-xtA@jW=}OH(0R46xK*-}X3|a4Sx40LsijL3bP_A-l|2J8SUvM&?2i^*JXT$}BRjkorq>z1n)Y_@T` z(O-BHH=$KRIe(YGJK%Q+!Y}-L5Mr~eES{(7`I4k1dWdw(75teRV>$~(?{pfzj@9rp zTrm`Fb((z>?*~*cQ$uRa^%o9Jc6*gVaq<|1@8u~~{ zrS-RPJ|?C%)CzGo$%-eL`RKcXj^4r}pyQntL(vYVf!p|)Oq!o#geCWY5`cY?qycqP z>k$m`JJfyAhYo?@ft2^>YZj2FQr*Hs7EHwm6Xh;rHyxY6MbO+~v;}-N$x3my?xZGH z+e`G(1U>;l7H3UIk<0jmOx|%bq6bNfuHpvRXPFv-D6{k!=*g?N0vi0G-r$*YnGKV4 zT*C)JGBaa3`UVg*-5f@kq<90DL1NN$!V*K9ZeYj^ba@a~St~1O;wAZNWnrR|H}NdG_&3f-Pko0&5J(EMXMucw6PG!O$nQl0SB-3~mP_VRu6pY8 zg}>a-MXH0m*C2?W3+Lf?M2M7z_^n)F=ez`yGdY>-p4%Q=)701!Y!AJ$Dcr8lc}prv z{FNoHO8?7cC9YKcF;#+mF8w;hJ8AhEK8fB5!PmVY?=-dr+rsTz=!FoUNGF241Glz> zH@4FSVLl+N4K_E@&M@yw$`-9ISL&NBn>Mzmx++UnR%Ut%3f!XA-P5{(hap5-H{kxt z(fE2?o*|n0k%YUDblCX7{?J||hD58;7Zx-WD^nR_V?yNa4Xh=QypaRs;#I_1if0eOHRu(Q~Hmt_$YQ!;6Soq>}G^bV^lgV2}jIe6b)nXl-)LxBfCw25< zpq4sOJ*w|OCwCZXWF@1J*)YkbI#E4iG76@nKgRKXnbhPn!Xy`6#LJ+QJu1=eZMMoo z7o(l5-+g(^hDqW}SiSsm$aHiD5bVkvMwp~Dfh#!D?J{<|Ox-SXx6AUC%WC_Tt342B rdpE%Xd#4Hp52Fai4_(8yuHm>d!(wQK+8FA8IXyzX7!m62PyYQ6$X5Mc diff --git a/backend/test.py b/backend/test.py index e50ff94a..e5c9a404 100644 --- a/backend/test.py +++ b/backend/test.py @@ -2,8 +2,29 @@ from core.basic.character import createCharacter char = createCharacter('GF.gunner_female.spitfire_female') -char.calc_init({'oaths': {'0': {'id': '2010201', 'adaptation': 3}, '11': {'id': '2050200', 'adaptation': 0}}, 'equips': {}}) +char.calc_init( + { + 'oaths': {'0': {'id': '2010201', 'adaptation': 3}, '1': {'id': '2010201', 'adaptation': 3}, '2': {'id': '2010201', 'adaptation': 3}, '3': {'id': '2010201', 'adaptation': 3}, '4': {'id': '2010201', 'adaptation': 3}, '11': {'id': '2010200', 'adaptation': 0}}, + 'equips': { + '武器': {'id': '88', 'reinforce': 14, 'reinforceType': 1, 'enchant': 512, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 8, 'adaptation': 3, 'precision': 100}, + '称号': {'id': '3017', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1201, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, + '上衣': {'id': '999', 'reinforce': 13, 'reinforceType': 1, 'enchant': 105, 'emblem_0': 1, 'emblem_1': 1, 'fusion': '26', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '头肩': {'id': '1001', 'reinforce': 14, 'reinforceType': 1, 'enchant': 5, 'emblem_0': 0, 'emblem_1': 0, 'fusion': '28', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '下装': {'id': '1000', 'reinforce': 14, 'reinforceType': 1, 'enchant': 202, 'emblem_0': 1, 'emblem_1': 1, 'fusion': '27', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '鞋': {'id': '1003', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'emblem_0': 11, 'emblem_1': 11, 'fusion': '30', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '腰带': {'id': '1002', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'emblem_0': 4, 'emblem_1': 4, 'fusion': '29', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '项链': {'id': '477', 'reinforce': 13, 'reinforceType': 1, 'enchant': 609, 'emblem_0': 0, 'emblem_1': 0, 'fusion': '180', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '手镯': {'id': '483', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'emblem_0': 11, 'emblem_1': 11, 'fusion': '302', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '戒指': {'id': '489', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'emblem_0': 4, 'emblem_1': 4, 'fusion': '304', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '辅助装备': {'id': '492', 'reinforce': 14, 'reinforceType': 1, 'enchant': 905, 'emblem_0': '兵器研究', 'emblem_1': 0, 'fusion': '182', 'refine': 3, 'adaptation': 3, 'precision': 100}, + '魔法石': {'id': '495', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1003, 'emblem_0': '兵器研究', 'emblem_1': 0, 'fusion': '184', 'refine': 3, 'adaptation': 3, 'precision': 100}, + '耳环': {'id': '498', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1104, 'emblem_0': 0, 'emblem_1': 0, 'fusion': '186', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '宠物': {'id': '4022', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1304, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, + }, + } +) +char.calc_suits() -for oath in char.charOathInfo: - print(oath.id, oath.adaptation, oath.oathInfo.position, oath.oathInfo.max_adaptation, oath.oathInfo.Point) +# for oath in char.charOathInfo: +# print(oath.id, oath.adaptation, oath.oathInfo.position, oath.oathInfo.max_adaptation, oath.oathInfo.Point) From aecd68f2e570796fd0d402e79d499476d8a198e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Fri, 3 Apr 2026 18:09:54 +0800 Subject: [PATCH 03/21] dev --- backend/dataFiles/dcalc_0.db | Bin 1007616 -> 1007616 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 7c990bbb24589c2e25da23dd566e9e48b3996eb1..947c4c940522c552eea20e384dc384f85f9035a5 100644 GIT binary patch delta 119 zcmZoTVB2uOc7ilx)kGO*#;V4I)&$1Z1g5PC%nR4^^R8r&V(4Mu&*HnnXV1HSyTAtK znY`Q#3=C`x42`@j68zH(w=#<{Mzo*a%M8RUK+FonY(UHo#2i4(3B+7L%nigmK+L=S J^j<#GMF52gEvo&Qo)&$1Z1g5PC%nR4^GcYhnG4wF-XYpO(v*%s8U0?(A zOkUL7|H85yDy_Xq?S%8=oh}nRc9f&!Am=lP(fS4PId4QOA K`{})Wri%dCB`)Xy From 3148d9a7b88f57694267bbb5619ef690bdecd9de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 9 Apr 2026 16:05:49 +0800 Subject: [PATCH 04/21] dev --- frontendNew/.editorconfig | 8 + frontendNew/.gitattributes | 1 + frontendNew/.gitignore | 39 + frontendNew/.oxfmtrc.json | 5 + frontendNew/.oxlintrc.json | 10 + frontendNew/.vscode/extensions.json | 8 + frontendNew/README.md | 48 + frontendNew/components.json | 23 + frontendNew/env.d.ts | 1 + frontendNew/eslint.config.ts | 26 + frontendNew/index.html | 13 + frontendNew/package.json | 58 + frontendNew/pnpm-lock.yaml | 5842 +++++++++++++++++ frontendNew/pnpm-workspace.yaml | 18 + frontendNew/postcss.config.js | 6 + frontendNew/public/favicon.ico | Bin 0 -> 4286 bytes frontendNew/src/App.vue | 14 + .../src/components/ui/button/Button.vue | 28 + frontendNew/src/components/ui/button/index.ts | 38 + frontendNew/src/index.css | 142 + frontendNew/src/lib/utils.ts | 7 + frontendNew/src/main.ts | 13 + frontendNew/src/router/index.ts | 8 + frontendNew/src/stores/counter.ts | 12 + frontendNew/tailwind.config.ts | 13 + frontendNew/tsconfig.app.json | 18 + frontendNew/tsconfig.json | 17 + frontendNew/tsconfig.node.json | 27 + frontendNew/vite.config.ts | 20 + 29 files changed, 6463 insertions(+) create mode 100644 frontendNew/.editorconfig create mode 100644 frontendNew/.gitattributes create mode 100644 frontendNew/.gitignore create mode 100644 frontendNew/.oxfmtrc.json create mode 100644 frontendNew/.oxlintrc.json create mode 100644 frontendNew/.vscode/extensions.json create mode 100644 frontendNew/README.md create mode 100644 frontendNew/components.json create mode 100644 frontendNew/env.d.ts create mode 100644 frontendNew/eslint.config.ts create mode 100644 frontendNew/index.html create mode 100644 frontendNew/package.json create mode 100644 frontendNew/pnpm-lock.yaml create mode 100644 frontendNew/pnpm-workspace.yaml create mode 100644 frontendNew/postcss.config.js create mode 100644 frontendNew/public/favicon.ico create mode 100644 frontendNew/src/App.vue create mode 100644 frontendNew/src/components/ui/button/Button.vue create mode 100644 frontendNew/src/components/ui/button/index.ts create mode 100644 frontendNew/src/index.css create mode 100644 frontendNew/src/lib/utils.ts create mode 100644 frontendNew/src/main.ts create mode 100644 frontendNew/src/router/index.ts create mode 100644 frontendNew/src/stores/counter.ts create mode 100644 frontendNew/tailwind.config.ts create mode 100644 frontendNew/tsconfig.app.json create mode 100644 frontendNew/tsconfig.json create mode 100644 frontendNew/tsconfig.node.json create mode 100644 frontendNew/vite.config.ts diff --git a/frontendNew/.editorconfig b/frontendNew/.editorconfig new file mode 100644 index 00000000..3b510aa6 --- /dev/null +++ b/frontendNew/.editorconfig @@ -0,0 +1,8 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 100 diff --git a/frontendNew/.gitattributes b/frontendNew/.gitattributes new file mode 100644 index 00000000..6313b56c --- /dev/null +++ b/frontendNew/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/frontendNew/.gitignore b/frontendNew/.gitignore new file mode 100644 index 00000000..cd68f140 --- /dev/null +++ b/frontendNew/.gitignore @@ -0,0 +1,39 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# Vite +*.timestamp-*-*.mjs diff --git a/frontendNew/.oxfmtrc.json b/frontendNew/.oxfmtrc.json new file mode 100644 index 00000000..4bddb675 --- /dev/null +++ b/frontendNew/.oxfmtrc.json @@ -0,0 +1,5 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "semi": false, + "singleQuote": true +} diff --git a/frontendNew/.oxlintrc.json b/frontendNew/.oxlintrc.json new file mode 100644 index 00000000..d5648b96 --- /dev/null +++ b/frontendNew/.oxlintrc.json @@ -0,0 +1,10 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["eslint", "typescript", "unicorn", "oxc", "vue"], + "env": { + "browser": true + }, + "categories": { + "correctness": "error" + } +} diff --git a/frontendNew/.vscode/extensions.json b/frontendNew/.vscode/extensions.json new file mode 100644 index 00000000..55ad03cf --- /dev/null +++ b/frontendNew/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "oxc.oxc-vscode" + ] +} diff --git a/frontendNew/README.md b/frontendNew/README.md new file mode 100644 index 00000000..f54076a8 --- /dev/null +++ b/frontendNew/README.md @@ -0,0 +1,48 @@ +# frontendNew + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +pnpm install +``` + +### Compile and Hot-Reload for Development + +```sh +pnpm dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +pnpm build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +pnpm lint +``` diff --git a/frontendNew/components.json b/frontendNew/components.json new file mode 100644 index 00000000..f5060e92 --- /dev/null +++ b/frontendNew/components.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "default", + "base": "reka", + "font": "inter", + "typescript": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "composables": "@/composables" + }, + "registries": {} +} \ No newline at end of file diff --git a/frontendNew/env.d.ts b/frontendNew/env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/frontendNew/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontendNew/eslint.config.ts b/frontendNew/eslint.config.ts new file mode 100644 index 00000000..89fdc89a --- /dev/null +++ b/frontendNew/eslint.config.ts @@ -0,0 +1,26 @@ +import { globalIgnores } from 'eslint/config' +import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' +import pluginVue from 'eslint-plugin-vue' +import pluginOxlint from 'eslint-plugin-oxlint' +import skipFormatting from 'eslint-config-prettier/flat' + +// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: +// import { configureVueProject } from '@vue/eslint-config-typescript' +// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) +// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup + +export default defineConfigWithVueTs( + { + name: 'app/files-to-lint', + files: ['**/*.{vue,ts,mts,tsx}'], + }, + + globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), + + ...pluginVue.configs['flat/essential'], + vueTsConfigs.recommended, + + ...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'), + + skipFormatting, +) diff --git a/frontendNew/index.html b/frontendNew/index.html new file mode 100644 index 00000000..9e5fc8f0 --- /dev/null +++ b/frontendNew/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/frontendNew/package.json b/frontendNew/package.json new file mode 100644 index 00000000..a618cbce --- /dev/null +++ b/frontendNew/package.json @@ -0,0 +1,58 @@ +{ + "name": "frontendnew", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint": "run-s lint:*", + "lint:oxlint": "oxlint . --fix", + "lint:eslint": "eslint . --fix --cache", + "format": "oxfmt src/" + }, + "dependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-vue-next": "^1.0.0", + "pinia": "^3.0.4", + "radix-vue": "^1.9.17", + "reka-ui": "^2.9.5", + "shadcn-vue": "^2.5.3", + "tailwind-merge": "^3.5.0", + "tailwindcss-animate": "^1.0.7", + "tw-animate-css": "^1.4.0", + "vue": "^3.5.31", + "vue-router": "^5.0.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.2.2", + "@tsconfig/node24": "^24.0.4", + "@types/node": "^24.12.0", + "@vitejs/plugin-vue": "^6.0.5", + "@vitejs/plugin-vue-jsx": "^5.1.5", + "@vue/eslint-config-typescript": "^14.7.0", + "@vue/tsconfig": "^0.9.1", + "autoprefixer": "^10.4.27", + "eslint": "^10.1.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-oxlint": "~1.57.0", + "eslint-plugin-vue": "~10.8.0", + "jiti": "^2.6.1", + "npm-run-all2": "^8.0.4", + "oxfmt": "^0.42.0", + "oxlint": "~1.57.0", + "postcss": "^8.5.9", + "tailwindcss": "^4.2.2", + "typescript": "~6.0.0", + "vite": "^8.0.3", + "vite-plugin-vue-devtools": "^8.1.1", + "vue-tsc": "^3.2.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } +} diff --git a/frontendNew/pnpm-lock.yaml b/frontendNew/pnpm-lock.yaml new file mode 100644 index 00000000..0a19b46b --- /dev/null +++ b/frontendNew/pnpm-lock.yaml @@ -0,0 +1,5842 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + vue: beta + '@vue/compiler-core': beta + '@vue/compiler-dom': beta + '@vue/compiler-sfc': beta + '@vue/compiler-ssr': beta + '@vue/compiler-vapor': beta + '@vue/reactivity': beta + '@vue/runtime-core': beta + '@vue/runtime-dom': beta + '@vue/runtime-vapor': beta + '@vue/server-renderer': beta + '@vue/shared': beta + '@vue/compat': beta + +importers: + + .: + dependencies: + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-vue-next: + specifier: ^1.0.0 + version: 1.0.0(vue@3.6.0-beta.9(typescript@6.0.2)) + pinia: + specifier: ^3.0.4 + version: 3.0.4(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2)) + radix-vue: + specifier: ^1.9.17 + version: 1.9.17(vue@3.6.0-beta.9(typescript@6.0.2)) + reka-ui: + specifier: ^2.9.5 + version: 2.9.5(vue@3.6.0-beta.9(typescript@6.0.2)) + shadcn-vue: + specifier: ^2.5.3 + version: 2.5.3(eslint@10.2.0(jiti@2.6.1))(vue@3.6.0-beta.9(typescript@6.0.2)) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.2.2) + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + vue: + specifier: beta + version: 3.6.0-beta.9(typescript@6.0.2) + vue-router: + specifier: ^5.0.4 + version: 5.0.4(pinia@3.0.4(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2)))(vue@3.6.0-beta.9(typescript@6.0.2)) + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 + '@tsconfig/node24': + specifier: ^24.0.4 + version: 24.0.4 + '@types/node': + specifier: ^24.12.0 + version: 24.12.2 + '@vitejs/plugin-vue': + specifier: ^6.0.5 + version: 6.0.5(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3))(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vitejs/plugin-vue-jsx': + specifier: ^5.1.5 + version: 5.1.5(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3))(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vue/eslint-config-typescript': + specifier: ^14.7.0 + version: 14.7.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.2.0(jiti@2.6.1))))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@vue/tsconfig': + specifier: ^0.9.1 + version: 0.9.1(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.9) + eslint: + specifier: ^10.1.0 + version: 10.2.0(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@10.2.0(jiti@2.6.1)) + eslint-plugin-oxlint: + specifier: ~1.57.0 + version: 1.57.0(oxlint@1.57.0) + eslint-plugin-vue: + specifier: ~10.8.0 + version: 10.8.0(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.2.0(jiti@2.6.1))) + jiti: + specifier: ^2.6.1 + version: 2.6.1 + npm-run-all2: + specifier: ^8.0.4 + version: 8.0.4 + oxfmt: + specifier: ^0.42.0 + version: 0.42.0 + oxlint: + specifier: ~1.57.0 + version: 1.57.0 + postcss: + specifier: ^8.5.9 + version: 8.5.9 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 + typescript: + specifier: ~6.0.0 + version: 6.0.2 + vite: + specifier: ^8.0.3 + version: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + vite-plugin-vue-devtools: + specifier: ^8.1.1 + version: 8.1.1(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3))(vue@3.6.0-beta.9(typescript@6.0.2)) + vue-tsc: + specifier: ^3.2.6 + version: 3.2.6(typescript@6.0.2) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.0-alpha.12': + resolution: {integrity: sha512-AzWmrp4uJ+DcXVH0uoUpJVhRqxNirC0BbXsZ82AQuVod41CoaV5G+cwcvtYusrIIxv7BIJb6ce0dQ9L0wAl1iA==} + engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} + hasBin: true + + '@babel/plugin-proposal-decorators@7.29.0': + resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.28.6': + resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.28.5': + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@dotenvx/dotenvx@1.61.0': + resolution: {integrity: sha512-utL3cpZoFzflyqUkjYbxYujI6STBTmO5LFn4bbin/NZnRWN6wQ7eErhr3/Vpa5h/jicPFC6kTa42r940mQftJQ==} + hasBin: true + + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + + '@hono/node-server@1.19.13': + resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@internationalized/date@3.12.0': + resolution: {integrity: sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ==} + + '@internationalized/number@3.6.5': + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/types@0.124.0': + resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + + '@oxfmt/binding-android-arm-eabi@0.42.0': + resolution: {integrity: sha512-dsqPTYsozeokRjlrt/b4E7Pj0z3eS3Eg74TWQuuKbjY4VttBmA88rB7d50Xrd+TZ986qdXCNeZRPEzZHAe+jow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.42.0': + resolution: {integrity: sha512-t+aAjHxcr5eOBphFHdg1ouQU9qmZZoRxnX7UOJSaTwSoKsb6TYezNKO0YbWytGXCECObRqNcUxPoPr0KaraAIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.42.0': + resolution: {integrity: sha512-ulpSEYMKg61C5bRMZinFHrKJYRoKGVbvMEXA5zM1puX3O9T6Q4XXDbft20yrDijpYWeuG59z3Nabt+npeTsM1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.42.0': + resolution: {integrity: sha512-ttxLKhQYPdFiM8I/Ri37cvqChE4Xa562nNOsZFcv1CKTVLeEozXjKuYClNvxkXmNlcF55nzM80P+CQkdFBu+uQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.42.0': + resolution: {integrity: sha512-Og7QS3yI3tdIKYZ58SXik0rADxIk2jmd+/YvuHRyKULWpG4V2fR5V4hvKm624Mc0cQET35waPXiCQWvjQEjwYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': + resolution: {integrity: sha512-jwLOw/3CW4H6Vxcry4/buQHk7zm9Ne2YsidzTL1kpiMe4qqrRCwev3dkyWe2YkFmP+iZCQ7zku4KwjcLRoh8ew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.42.0': + resolution: {integrity: sha512-XwXu2vkMtiq2h7tfvN+WA/9/5/1IoGAVCFPiiQUvcAuG3efR97KNcRGM8BetmbYouFotQ2bDal3yyjUx6IPsTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.42.0': + resolution: {integrity: sha512-ea7s/XUJoT7ENAtUQDudFe3nkSM3e3Qpz4nJFRdzO2wbgXEcjnchKLEsV3+t4ev3r8nWxIYr9NRjPWtnyIFJVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.42.0': + resolution: {integrity: sha512-+JA0YMlSdDqmacygGi2REp57c3fN+tzARD8nwsukx9pkCHK+6DkbAA9ojS4lNKsiBjIW8WWa0pBrBWhdZEqfuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.42.0': + resolution: {integrity: sha512-VfnET0j4Y5mdfCzh5gBt0NK28lgn5DKx+8WgSMLYYeSooHhohdbzwAStLki9pNuGy51y4I7IoW8bqwAaCMiJQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.42.0': + resolution: {integrity: sha512-gVlCbmBkB0fxBWbhBj9rcxezPydsQHf4MFKeHoTSPicOQ+8oGeTQgQ8EeesSybWeiFPVRx3bgdt4IJnH6nOjAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.42.0': + resolution: {integrity: sha512-zN5OfstL0avgt/IgvRu0zjQzVh/EPkcLzs33E9LMAzpqlLWiPWeMDZyMGFlSRGOdDjuNmlZBCgj0pFnK5u32TQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.42.0': + resolution: {integrity: sha512-9X6+H2L0qMc2sCAgO9HS03bkGLMKvOFjmEdchaFlany3vNZOjnVui//D8k/xZAtQv2vaCs1reD5KAgPoIU4msA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.42.0': + resolution: {integrity: sha512-BajxJ6KQvMMdpXGPWhBGyjb2Jvx4uec0w+wi6TJZ6Tv7+MzPwe0pO8g5h1U0jyFgoaF7mDl6yKPW3ykWcbUJRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.42.0': + resolution: {integrity: sha512-0wV284I6vc5f0AqAhgAbHU2935B4bVpncPoe5n/WzVZY/KnHgqxC8iSFGeSyLWEgstFboIcWkOPck7tqbdHkzA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.42.0': + resolution: {integrity: sha512-p4BG6HpGnhfgHk1rzZfyR6zcWkE7iLrWxyehHfXUy4Qa5j3e0roglFOdP/Nj5cJJ58MA3isQ5dlfkW2nNEpolw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.42.0': + resolution: {integrity: sha512-mn//WV60A+IetORDxYieYGAoQso4KnVRRjORDewMcod4irlRe0OSC7YPhhwaexYNPQz/GCFk+v9iUcZ2W22yxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.42.0': + resolution: {integrity: sha512-3gWltUrvuz4LPJXWivoAxZ28Of2O4N7OGuM5/X3ubPXCEV8hmgECLZzjz7UYvSDUS3grfdccQwmjynm+51EFpw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.42.0': + resolution: {integrity: sha512-Wg4TMAfQRL9J9AZevJ/ZNy3uyyDztDYQtGr4P8UyyzIhLhFrdSmz1J/9JT+rv0fiCDLaFOBQnj3f3K3+a5PzDQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.57.0': + resolution: {integrity: sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.57.0': + resolution: {integrity: sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.57.0': + resolution: {integrity: sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.57.0': + resolution: {integrity: sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.57.0': + resolution: {integrity: sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + resolution: {integrity: sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + resolution: {integrity: sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.57.0': + resolution: {integrity: sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.57.0': + resolution: {integrity: sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + resolution: {integrity: sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + resolution: {integrity: sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.57.0': + resolution: {integrity: sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.57.0': + resolution: {integrity: sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.57.0': + resolution: {integrity: sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.57.0': + resolution: {integrity: sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.57.0': + resolution: {integrity: sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.57.0': + resolution: {integrity: sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.57.0': + resolution: {integrity: sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.57.0': + resolution: {integrity: sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rolldown/binding-android-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.15': + resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + + '@tanstack/virtual-core@3.13.23': + resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} + + '@tanstack/vue-virtual@3.13.23': + resolution: {integrity: sha512-b5jPluAR6U3eOq6GWAYSpj3ugnAIZgGR0e6aGAgyRse0Yu6MVQQ0ZWm9SArSXWtageogn6bkVD8D//c4IjW3xQ==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + + '@ts-morph/common@0.28.1': + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + + '@tsconfig/node24@24.0.4': + resolution: {integrity: sha512-2A933l5P5oCbv6qSxHs7ckKwobs8BDAe9SJ/Xr2Hy+nDlwmLE1GhFh/g/vXGRZWgxBg9nX/5piDtHR9Dkw/XuA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript-eslint/eslint-plugin@8.58.1': + resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.58.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.58.1': + resolution: {integrity: sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.58.1': + resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.58.1': + resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.58.1': + resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.58.1': + resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.58.1': + resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.58.1': + resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.58.1': + resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.58.1': + resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unovue/detypes@0.8.5': + resolution: {integrity: sha512-Yz4JeWOHGa+w/3YudVdng8hgN/VGW9cvp8xmFkmPPFzalGblLPPSpIRiwVo853yLstMZO2LLwe0vOoLAQsUQXw==} + engines: {node: '>=18'} + hasBin: true + + '@vitejs/plugin-vue-jsx@5.1.5': + resolution: {integrity: sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@6.0.5': + resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue-macros/common@3.1.2': + resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==} + engines: {node: '>=20.19.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-helper-vue-transform-on@2.0.1': + resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-jsx@2.0.1': + resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/babel-plugin-resolve-type@2.0.1': + resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.6.0-beta.9': + resolution: {integrity: sha512-/qlfk4cbU//tgdwWeAbl4kBvH5ZocjJ6CMGigzRKk1So/0jl6kRpFxVbc6oNsYYH6Xj28ByA+msAes1FjExejg==} + + '@vue/compiler-dom@3.6.0-beta.9': + resolution: {integrity: sha512-Bh2h+Co2Vl85jhNjR+yBU1oIujqQ3XIhF7FzODBStvp8yn2WvsXmm5QlvnE7q+smJkfglTbfFcaou8fjR0Y4ag==} + + '@vue/compiler-sfc@3.6.0-beta.9': + resolution: {integrity: sha512-13MwFqrIN+AFxR5uT88WYaMTxXycpNNI75sIllz5blXbFaBsDfiegQZj10Pj5G3cgH7WFy2Trs1rTlXrmSgG/w==} + + '@vue/compiler-ssr@3.6.0-beta.9': + resolution: {integrity: sha512-ufzHVMJoMz7QzMFop03a8KpWAWUh4hiof/tJXvxiDClIFUY7P5OrKk644fV9qlWgTP7V+eQvA7kVSEVRUgYjvA==} + + '@vue/compiler-vapor@3.6.0-beta.9': + resolution: {integrity: sha512-1WWCcRjkH/scYJ8dsjNp8+NDf4f9SwQgOcd4Hbl5p0srNPflqrQYvAaJh4N2Szxj5FdkXw2t5uiK35TpFM5uKA==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-api@8.1.1': + resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} + + '@vue/devtools-core@8.1.1': + resolution: {integrity: sha512-bCCsSABp1/ot4j8xJEycM6Mtt2wbuucfByr6hMgjbYhrtlscOJypZKvy8f1FyWLYrLTchB5Qz216Lm92wfbq0A==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-kit@8.1.1': + resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/devtools-shared@8.1.1': + resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==} + + '@vue/eslint-config-typescript@14.7.0': + resolution: {integrity: sha512-iegbMINVc+seZ/QxtzWiOBozctrHiF2WvGedruu2EbLujg9VuU0FQiNcN2z1ycuaoKKpF4m2qzB5HDEMKbxtIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 || ^10.0.0 + eslint-plugin-vue: ^9.28.0 || ^10.0.0 + typescript: '>=4.8.4' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@3.2.6': + resolution: {integrity: sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==} + + '@vue/reactivity@3.6.0-beta.9': + resolution: {integrity: sha512-Mo0GjZB/q7LUJplPjBdKqAAk4mawkzvnk2nNf9CEetp4RQJP5/e/DdmgjYBsr/+UVX5ShasCalwdyknuuIepdw==} + + '@vue/runtime-core@3.6.0-beta.9': + resolution: {integrity: sha512-IPbO/cmw0BSHec17fSE8Mbtv0UFBiiiGhvlUGiJWTa/eOlbiO+mZ9/PRRUQ+v/tkKuwFSzKye7KOKj5aFO1dgQ==} + + '@vue/runtime-dom@3.6.0-beta.9': + resolution: {integrity: sha512-+WV0V1s/uf9iFwZt41lOtJHbIqKyYdEO+nmW0UOnQLjG9ELz6rKuZ92fEim6NPcKCsucv2BoB1mK9T82khYqgg==} + + '@vue/runtime-vapor@3.6.0-beta.9': + resolution: {integrity: sha512-UlAziGF77byUa84RgkIdCT4bleZbB4UvQvmxdGHFfscGylSABBZHAMR8WJIwBsy1MsZnlpRSSeDAYB20RicrhQ==} + peerDependencies: + '@vue/runtime-dom': 3.6.0-beta.9 + + '@vue/server-renderer@3.6.0-beta.9': + resolution: {integrity: sha512-qyz37g6pmwHvtXbe7CWKm5+VTmCs4mHrC1uDw4OVZlvwDDZb9pWMzW0kOrzhj1iI6sZ4D9k5fYQIdzBqB7aOqw==} + peerDependencies: + vue: 3.6.0-beta.9 + + '@vue/shared@3.6.0-beta.9': + resolution: {integrity: sha512-nY6DXeelJsmveeNk5YZYGd8q0ulWXACL8Qs/qvkPC4HQkyhPgf+Ja00AkG2hYsEI8Uixia2UpQl4CbObzw0hag==} + + '@vue/tsconfig@0.9.1': + resolution: {integrity: sha512-buvjm+9NzLCJL29KY1j1991YYJ5e6275OiK+G4jtmfIb+z4POywbdm0wXusT9adVWqe0xqg70TbI7+mRx4uU9w==} + peerDependencies: + typescript: '>= 5.8' + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true + + '@vuedx/template-ast-types@0.7.1': + resolution: {integrity: sha512-Mqugk/F0lFN2u9bhimH6G1kSu2hhLi2WoqgCVxrMvgxm2kDc30DtdvVGRq+UgEmKVP61OudcMtZqkUoGQeFBUQ==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@14.2.1': + resolution: {integrity: sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@14.2.1': + resolution: {integrity: sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@14.2.1': + resolution: {integrity: sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==} + peerDependencies: + vue: ^3.5.0 + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + alien-signals@3.1.2: + resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + + ast-types-x@1.18.0: + resolution: {integrity: sha512-ZtfIlyTCmnAXPCQo4mSDtFsHL7L3q0sJfpVYPmy5uYPjs+fynzOuc1Cg6yQ9fF6h61RjEWtOlRFwV1Kc80Qs6A==} + engines: {node: '>=4'} + + ast-walker-scope@0.8.3: + resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==} + engines: {node: '>=20.19.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.16: + resolution: {integrity: sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==} + engines: {node: '>=6.0.0'} + hasBin: true + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001787: + resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + css@3.0.0: + resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-diff@1.0.2: + resolution: {integrity: sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dotenv@17.4.1: + resolution: {integrity: sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.334: + resolution: {integrity: sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-oxlint@1.57.0: + resolution: {integrity: sha512-+c1ZqIKq6pJ/BzZkpFxkuk+40EFXSb57t8AytjEnCqeCW6WecHzeBOIukfq6nHOxIrzX+uJ0ulN70Fj8YaR50g==} + peerDependencies: + oxlint: ~1.57.0 + + eslint-plugin-vue@10.8.0: + resolution: {integrity: sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.2.0: + resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + express-rate-limit@8.3.2: + resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + engines: {node: '>=14.14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + + giget@3.2.0: + resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hono@4.12.12: + resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} + engines: {node: '>=16.9.0'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + identifier-regex@1.0.1: + resolution: {integrity: sha512-ZrYyM0sozNPZlvBvE7Oq9Bn44n0qKGrYu5sQ0JzMUnjIhpgWYE2JB6aBoFwEYdPjqj7jPyxXTMJiHDOxDfd8yw==} + engines: {node: '>=18'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-identifier@1.0.1: + resolution: {integrity: sha512-HQ5v4rEJ7REUV54bCd2l5FaD299SGDEn2UPoVXaTHAyGviLq2menVUD2udi3trQ32uvB6LdAh/0ck2EuizrtpA==} + engines: {node: '>=18'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jose@6.2.2: + resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@4.0.0: + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + engines: {node: ^18.17.0 || >=20.5.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.sortedlastindex@4.1.0: + resolution: {integrity: sha512-s8xEQdsp2Tu5zUqVdFSe9C0kR8YlnAJYLqMdkh+pIRBRxF6/apWseLdHl3/+jv2I61dhPwtI/Ff+EqvCpc+N8w==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + lru-cache@11.3.3: + resolution: {integrity: sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-vue-next@1.0.0: + resolution: {integrity: sha512-V6SPvx1IHTj/UY+FrIYWV5faISsPSb8BnWSFDxAtezWKvWc9ZZ40PDrdu1/Qb5vg4lHWr1hs1BAMGVGm6V1Xdg==} + peerDependencies: + vue: '>=3.0.1' + + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.7: + resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-html-parser@7.1.0: + resolution: {integrity: sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ==} + + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-run-all2@8.0.4: + resolution: {integrity: sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==} + engines: {node: ^20.5.0 || >=22.0.0, npm: '>= 10'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nypm@0.6.5: + resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} + engines: {node: '>=18'} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@9.3.0: + resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} + engines: {node: '>=20'} + + oxfmt@0.42.0: + resolution: {integrity: sha512-QhejGErLSMReNuZ6vxgFHDyGoPbjTRNi6uGHjy0cvIjOQFqD6xmr/T+3L41ixR3NIgzcNiJ6ylQKpvShTgDfqg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint@1.57.0: + resolution: {integrity: sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.15.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss-less@6.0.0: + resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==} + engines: {node: '>=12'} + peerDependencies: + postcss: ^8.3.5 + + postcss-sass@0.5.0: + resolution: {integrity: sha512-qtu8awh1NMF3o9j/x9j3EZnd+BlF66X6NZYl12BdKoG2Z4hmydOt/dZj2Nq+g0kfk2pQy3jeYFBmvG9DBwynGQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-styl@0.12.3: + resolution: {integrity: sha512-8I7Cd8sxiEITIp32xBK4K/Aj1ukX6vuWnx8oY/oAH35NfQI4OZaY5nd68Yx8HeN5S49uhQ6DL0rNk0ZBu/TaLg==} + engines: {node: ^8.10.0 || ^10.13.0 || ^11.10.1 || >=12.13.0} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.9: + resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix-vue@1.9.17: + resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} + peerDependencies: + vue: '>= 3.2.0' + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + + read-package-json-fast@4.0.0: + resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} + engines: {node: ^18.17.0 || >=20.5.0} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recast-x@1.0.5: + resolution: {integrity: sha512-CkfWKhQiYsMQYaWUkHdERXUxT2jJLBoa5y7zFv3dUAE7Ly5oU/0hsqrENyEfrCL03pDsQYbnoz17Cbagx/c2OA==} + engines: {node: '>= 4'} + + reka-ui@2.9.5: + resolution: {integrity: sha512-6cZGIMgEeslpFLJ7IihaCSMPp1cJgl2eDkZ2vBMdl+HPUVBaV/iDPMWu3abT2KUkj1lir+oyHq5KelOTT9OheQ==} + peerDependencies: + vue: '>= 3.4.0' + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown@1.0.0-rc.15: + resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shadcn-vue@2.5.3: + resolution: {integrity: sha512-TvZgwEzvuEEil8KB3ZEs+J++OkjOithDOGU/Uz1GRTCRQr0/Vh1D+RXvDDu1tWCh16FJYenSdHA6504igDKX4Q==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.6.0: + resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stdin-discarder@0.3.1: + resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} + engines: {node: '>=18'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + + stringify-object@6.0.0: + resolution: {integrity: sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==} + engines: {node: '>=20'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + stylus@0.57.0: + resolution: {integrity: sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==} + hasBin: true + + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + engines: {node: '>=6'} + + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-morph@27.0.2: + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typescript-eslint@8.58.1: + resolution: {integrity: sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici@7.24.7: + resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} + engines: {node: '>=20.18.1'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 + + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-devtools@8.1.1: + resolution: {integrity: sha512-9qTpOmZ2vHpvlI9hdVXAQ1Ry4I8GcBArU7aPi0qfIaV7fQIXy0L1nb6X4mFY2Gw0dYshHuLbIl0Ulb572SCjsQ==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + + vite-plugin-vue-inspector@5.4.0: + resolution: {integrity: sha512-Iq/024CydcE46FZqWPU4t4lw4uYOdLnFSO1RNxJVt2qY9zxIjmnkBqhHnYaReWM82kmNnaXs7OkfgRrV2GEjyw==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + vite@8.0.8: + resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@10.4.0: + resolution: {integrity: sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + + vue-metamorph@3.3.4: + resolution: {integrity: sha512-WZ1xzHrmYh9UiZ7OC9eG1ASzgSybEB10jhop+k5KzMY9I1JmRKdreqUYzbV3hOnOMvLhyDn7y6f62mLE2jHFSg==} + hasBin: true + + vue-router@5.0.4: + resolution: {integrity: sha512-lCqDLCI2+fKVRl2OzXuzdSWmxXFLQRxQbmHugnRpTMyYiT+hNaycV0faqG5FBHDXoYrZ6MQcX87BvbY8mQ20Bg==} + peerDependencies: + '@pinia/colada': '>=0.21.2' + '@vue/compiler-sfc': ^3.5.17 + pinia: ^3.0.4 + vue: ^3.5.0 + peerDependenciesMeta: + '@pinia/colada': + optional: true + '@vue/compiler-sfc': + optional: true + pinia: + optional: true + + vue-tsc@3.2.6: + resolution: {integrity: sha512-gYW/kWI0XrwGzd0PKc7tVB/qpdeAkIZLNZb10/InizkQjHjnT8weZ/vBarZoj4kHKbUTZT/bAVgoOr8x4NsQ/Q==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.6.0-beta.9: + resolution: {integrity: sha512-K/+HT52OAZvaNDDMvT+Lfk36e/97PsyJyDWXM0FDfLQKGbEDXsd4pSQz+BJViGssLcltQLSTlSqQlZ6fkGo5CA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-spinner@1.1.0: + resolution: {integrity: sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/parser@8.0.0-alpha.12': {} + + '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@dotenvx/dotenvx@1.61.0': + dependencies: + commander: 11.1.0 + dotenv: 17.4.1 + eciesjs: 0.4.18 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.4) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.4 + which: 4.0.0 + yocto-spinner: 1.1.0 + + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0(jiti@2.6.1))': + dependencies: + eslint: 10.2.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.5': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@floating-ui/vue@1.1.11(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.6.0-beta.9(typescript@6.0.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@hono/node-server@1.19.13(hono@4.12.12)': + dependencies: + hono: 4.12.12 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@internationalized/date@3.12.0': + dependencies: + '@swc/helpers': 0.5.21 + + '@internationalized/number@3.6.5': + dependencies: + '@swc/helpers': 0.5.21 + + '@isaacs/cliui@9.0.0': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.13(hono@4.12.12) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.3.2(express@5.2.1) + hono: 4.12.12 + jose: 6.2.2 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@oxc-project/types@0.124.0': {} + + '@oxfmt/binding-android-arm-eabi@0.42.0': + optional: true + + '@oxfmt/binding-android-arm64@0.42.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.42.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.42.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.42.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.42.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.42.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.42.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.42.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.42.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.42.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.42.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.57.0': + optional: true + + '@oxlint/binding-android-arm64@1.57.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.57.0': + optional: true + + '@oxlint/binding-darwin-x64@1.57.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.57.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.57.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.57.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.57.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.57.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.57.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.57.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.57.0': + optional: true + + '@polka/url@1.0.0-next.29': {} + + '@rolldown/binding-android-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.15': {} + + '@rolldown/pluginutils@1.0.0-rc.2': {} + + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.9 + tailwindcss: 4.2.2 + + '@tanstack/virtual-core@3.13.23': {} + + '@tanstack/vue-virtual@3.13.23(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@tanstack/virtual-core': 3.13.23 + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@ts-morph/common@0.28.1': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.16 + + '@tsconfig/node24@24.0.4': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@24.12.2': + dependencies: + undici-types: 7.16.0 + + '@types/web-bluetooth@0.0.20': {} + + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.1 + eslint: 10.2.0(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.1 + debug: 4.4.3 + eslint: 10.2.0(jiti@2.6.1) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.58.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) + '@typescript-eslint/types': 8.58.1 + debug: 4.4.3 + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.58.1': + dependencies: + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/visitor-keys': 8.58.1 + + '@typescript-eslint/tsconfig-utils@8.58.1(typescript@6.0.2)': + dependencies: + typescript: 6.0.2 + + '@typescript-eslint/type-utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + debug: 4.4.3 + eslint: 10.2.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.58.1': {} + + '@typescript-eslint/typescript-estree@8.58.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/project-service': 8.58.1(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/visitor-keys': 8.58.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + eslint: 10.2.0(jiti@2.6.1) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.58.1': + dependencies: + '@typescript-eslint/types': 8.58.1 + eslint-visitor-keys: 5.0.1 + + '@unovue/detypes@0.8.5': + dependencies: + '@babel/core': 7.29.0 + '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) + '@vue/compiler-dom': 3.6.0-beta.9 + '@vue/compiler-sfc': 3.6.0-beta.9 + '@vuedx/template-ast-types': 0.7.1 + fast-glob: 3.3.3 + prettier: 3.8.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue-jsx@5.1.5(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3))(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.15 + '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + vue: 3.6.0-beta.9(typescript@6.0.2) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.5(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3))(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.2 + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue-macros/common@3.1.2(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@vue/compiler-sfc': 3.6.0-beta.9 + ast-kit: 2.2.0 + local-pkg: 1.1.2 + magic-string-ast: 1.0.3 + unplugin-utils: 0.3.1 + optionalDependencies: + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-helper-vue-transform-on@2.0.1': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.0)': + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.0) + '@vue/shared': 3.6.0-beta.9 + optionalDependencies: + '@babel/core': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.0)': + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@vue/babel-helper-vue-transform-on': 2.0.1 + '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.0) + '@vue/shared': 3.6.0-beta.9 + optionalDependencies: + '@babel/core': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.0)': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/parser': 7.29.2 + '@vue/compiler-sfc': 3.6.0-beta.9 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/parser': 7.29.2 + '@vue/compiler-sfc': 3.6.0-beta.9 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.6.0-beta.9': + dependencies: + '@babel/parser': 7.29.2 + '@vue/shared': 3.6.0-beta.9 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.6.0-beta.9': + dependencies: + '@vue/compiler-core': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + + '@vue/compiler-sfc@3.6.0-beta.9': + dependencies: + '@babel/parser': 7.29.2 + '@vue/compiler-core': 3.6.0-beta.9 + '@vue/compiler-dom': 3.6.0-beta.9 + '@vue/compiler-ssr': 3.6.0-beta.9 + '@vue/compiler-vapor': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.9 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.6.0-beta.9': + dependencies: + '@vue/compiler-dom': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + + '@vue/compiler-vapor@3.6.0-beta.9': + dependencies: + '@babel/parser': 7.29.2 + '@vue/compiler-dom': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-api@8.1.1': + dependencies: + '@vue/devtools-kit': 8.1.1 + + '@vue/devtools-core@8.1.1(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@vue/devtools-kit': 8.1.1 + '@vue/devtools-shared': 8.1.1 + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-kit@8.1.1': + dependencies: + '@vue/devtools-shared': 8.1.1 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/devtools-shared@8.1.1': {} + + '@vue/eslint-config-typescript@14.7.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.2.0(jiti@2.6.1))))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + eslint: 10.2.0(jiti@2.6.1) + eslint-plugin-vue: 10.8.0(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.2.0(jiti@2.6.1))) + fast-glob: 3.3.3 + typescript-eslint: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + vue-eslint-parser: 10.4.0(eslint@10.2.0(jiti@2.6.1)) + optionalDependencies: + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@vue/language-core@3.2.6': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + alien-signals: 3.1.2 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.4 + + '@vue/reactivity@3.6.0-beta.9': + dependencies: + '@vue/shared': 3.6.0-beta.9 + + '@vue/runtime-core@3.6.0-beta.9': + dependencies: + '@vue/reactivity': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + + '@vue/runtime-dom@3.6.0-beta.9': + dependencies: + '@vue/reactivity': 3.6.0-beta.9 + '@vue/runtime-core': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + csstype: 3.2.3 + + '@vue/runtime-vapor@3.6.0-beta.9(@vue/runtime-dom@3.6.0-beta.9)': + dependencies: + '@vue/reactivity': 3.6.0-beta.9 + '@vue/runtime-dom': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + + '@vue/server-renderer@3.6.0-beta.9(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@vue/compiler-ssr': 3.6.0-beta.9 + '@vue/shared': 3.6.0-beta.9 + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@vue/shared@3.6.0-beta.9': {} + + '@vue/tsconfig@0.9.1(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2))': + optionalDependencies: + typescript: 6.0.2 + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@vuedx/template-ast-types@0.7.1': + dependencies: + '@vue/compiler-core': 3.6.0-beta.9 + + '@vueuse/core@10.11.1(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.6.0-beta.9(typescript@6.0.2)) + vue-demi: 0.14.10(vue@3.6.0-beta.9(typescript@6.0.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@14.2.1(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.2.1 + '@vueuse/shared': 14.2.1(vue@3.6.0-beta.9(typescript@6.0.2)) + vue: 3.6.0-beta.9(typescript@6.0.2) + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@14.2.1': {} + + '@vueuse/shared@10.11.1(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + vue-demi: 0.14.10(vue@3.6.0-beta.9(typescript@6.0.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@14.2.1(vue@3.6.0-beta.9(typescript@6.0.2))': + dependencies: + vue: 3.6.0-beta.9(typescript@6.0.2) + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv@6.14.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@3.1.2: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.29.2 + pathe: 2.0.3 + + ast-types-x@1.18.0: + dependencies: + tslib: 2.8.1 + + ast-walker-scope@0.8.3: + dependencies: + '@babel/parser': 7.29.2 + ast-kit: 2.2.0 + + astral-regex@2.0.0: {} + + atob@2.1.2: {} + + autoprefixer@10.4.27(postcss@8.5.9): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001787 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.16: {} + + birpc@2.9.0: {} + + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.1 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + brace-expansion@1.1.13: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.16 + caniuse-lite: 1.0.30001787 + electron-to-chromium: 1.5.334 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + c12@3.3.4: + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.1 + exsolve: 1.0.8 + giget: 3.2.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.0 + rc9: 3.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001787: {} + + chalk@5.6.2: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + citty@0.2.2: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-progress@3.12.0: + dependencies: + string-width: 4.2.3 + + cli-spinners@3.4.0: {} + + clsx@2.1.1: {} + + code-block-writer@13.0.3: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@11.1.0: {} + + commander@14.0.3: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.4: {} + + consola@3.4.2: {} + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + convert-hrtime@5.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + css@3.0.0: + dependencies: + inherits: 2.0.4 + source-map: 0.6.1 + source-map-resolve: 0.6.0 + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-uri-component@0.2.2: {} + + dedent@1.7.2: {} + + deep-diff@1.0.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + defu@6.1.7: {} + + depd@2.0.0: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: {} + + diff@8.0.4: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv@17.4.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eciesjs@0.4.18: + dependencies: + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.334: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.2 + + entities@4.5.0: {} + + entities@7.0.1: {} + + error-stack-parser-es@1.0.5: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.1.8(eslint@10.2.0(jiti@2.6.1)): + dependencies: + eslint: 10.2.0(jiti@2.6.1) + + eslint-plugin-oxlint@1.57.0(oxlint@1.57.0): + dependencies: + jsonc-parser: 3.3.1 + oxlint: 1.57.0 + + eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.2.0(jiti@2.6.1))): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + eslint: 10.2.0(jiti@2.6.1) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 7.1.1 + semver: 7.7.4 + vue-eslint-parser: 10.4.0(eslint@10.2.0(jiti@2.6.1)) + xml-name-validator: 4.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.2.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + express-rate-limit@8.3.2(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.1.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.1 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.8: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forwarded@0.2.0: {} + + fraction.js@5.3.4: {} + + fresh@2.0.0: {} + + fs-extra@11.3.4: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function-timeout@1.0.2: {} + + fuzzysort@3.1.0: {} + + gensync@1.0.0-beta.2: {} + + get-east-asian-width@1.5.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-own-enumerable-keys@1.0.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-tsconfig@4.13.7: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@3.2.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hono@4.12.12: {} + + hookable@5.5.3: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + human-signals@2.1.0: {} + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + identifier-regex@1.0.1: + dependencies: + reserved-identifiers: 1.2.0 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.1.0: {} + + ipaddr.js@1.9.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-identifier@1.0.1: + dependencies: + identifier-regex: 1.0.1 + super-regex: 1.1.0 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-obj@3.0.0: {} + + is-promise@4.0.0: {} + + is-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-unicode-supported@2.1.0: {} + + is-what@5.5.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + isexe@3.1.5: {} + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + jiti@2.6.1: {} + + jose@6.2.2: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@4.0.0: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + kolorist@1.8.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.18.1: {} + + lodash.sortedlastindex@4.1.0: {} + + lodash.truncate@4.4.2: {} + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + lru-cache@11.3.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-vue-next@1.0.0(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + vue: 3.6.0-beta.9(typescript@6.0.2) + + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.21 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + memorystream@0.3.1: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.13 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + mitt@3.0.1: {} + + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + nanoid@5.1.7: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + node-fetch-native@1.6.7: {} + + node-html-parser@7.1.0: + dependencies: + css-select: 5.2.2 + he: 1.2.0 + + node-releases@2.0.37: {} + + npm-normalize-package-bin@4.0.0: {} + + npm-run-all2@8.0.4: + dependencies: + ansi-styles: 6.2.3 + cross-spawn: 7.0.6 + memorystream: 0.3.1 + picomatch: 4.0.4 + pidtree: 0.6.0 + read-package-json-fast: 4.0.0 + shell-quote: 1.8.3 + which: 5.0.0 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nypm@0.6.5: + dependencies: + citty: 0.2.2 + pathe: 2.0.3 + tinyexec: 1.1.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-treeify@1.1.33: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + + ohash@2.0.11: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@9.3.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.1 + string-width: 8.2.0 + + oxfmt@0.42.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.42.0 + '@oxfmt/binding-android-arm64': 0.42.0 + '@oxfmt/binding-darwin-arm64': 0.42.0 + '@oxfmt/binding-darwin-x64': 0.42.0 + '@oxfmt/binding-freebsd-x64': 0.42.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.42.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.42.0 + '@oxfmt/binding-linux-arm64-gnu': 0.42.0 + '@oxfmt/binding-linux-arm64-musl': 0.42.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.42.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.42.0 + '@oxfmt/binding-linux-riscv64-musl': 0.42.0 + '@oxfmt/binding-linux-s390x-gnu': 0.42.0 + '@oxfmt/binding-linux-x64-gnu': 0.42.0 + '@oxfmt/binding-linux-x64-musl': 0.42.0 + '@oxfmt/binding-openharmony-arm64': 0.42.0 + '@oxfmt/binding-win32-arm64-msvc': 0.42.0 + '@oxfmt/binding-win32-ia32-msvc': 0.42.0 + '@oxfmt/binding-win32-x64-msvc': 0.42.0 + + oxlint@1.57.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.57.0 + '@oxlint/binding-android-arm64': 1.57.0 + '@oxlint/binding-darwin-arm64': 1.57.0 + '@oxlint/binding-darwin-x64': 1.57.0 + '@oxlint/binding-freebsd-x64': 1.57.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.57.0 + '@oxlint/binding-linux-arm-musleabihf': 1.57.0 + '@oxlint/binding-linux-arm64-gnu': 1.57.0 + '@oxlint/binding-linux-arm64-musl': 1.57.0 + '@oxlint/binding-linux-ppc64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-musl': 1.57.0 + '@oxlint/binding-linux-s390x-gnu': 1.57.0 + '@oxlint/binding-linux-x64-gnu': 1.57.0 + '@oxlint/binding-linux-x64-musl': 1.57.0 + '@oxlint/binding-openharmony-arm64': 1.57.0 + '@oxlint/binding-win32-arm64-msvc': 1.57.0 + '@oxlint/binding-win32-ia32-msvc': 1.57.0 + '@oxlint/binding-win32-x64-msvc': 1.57.0 + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-timeout@6.1.4: {} + + package-json-from-dist@1.0.1: {} + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.3.3 + minipass: 7.1.3 + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + perfect-debounce@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pidtree@0.6.0: {} + + pinia@3.0.4(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.6.0-beta.9(typescript@6.0.2) + optionalDependencies: + typescript: 6.0.2 + + pkce-challenge@5.0.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss-less@6.0.0(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + postcss-sass@0.5.0: + dependencies: + gonzales-pe: 4.3.0 + postcss: 8.5.9 + + postcss-scss@4.0.9(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-styl@0.12.3: + dependencies: + debug: 4.4.3 + fast-diff: 1.3.0 + lodash.sortedlastindex: 4.1.0 + postcss: 8.5.9 + stylus: 0.57.0 + transitivePeerDependencies: + - supports-color + + postcss-value-parser@4.2.0: {} + + postcss@8.5.9: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.8.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + qs@6.15.1: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + radix-vue@1.9.17(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.6.0-beta.9(typescript@6.0.2)) + '@internationalized/date': 3.12.0 + '@internationalized/number': 3.6.5 + '@tanstack/vue-virtual': 3.13.23(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vueuse/core': 10.11.1(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vueuse/shared': 10.11.1(vue@3.6.0-beta.9(typescript@6.0.2)) + aria-hidden: 1.2.6 + defu: 6.1.7 + fast-deep-equal: 3.1.3 + nanoid: 5.1.7 + vue: 3.6.0-beta.9(typescript@6.0.2) + transitivePeerDependencies: + - '@vue/composition-api' + + range-parser@1.2.1: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + + read-package-json-fast@4.0.0: + dependencies: + json-parse-even-better-errors: 4.0.0 + npm-normalize-package-bin: 4.0.0 + + readdirp@5.0.0: {} + + recast-x@1.0.5: + dependencies: + ast-types: ast-types-x@1.18.0 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + reka-ui@2.9.5(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.6.0-beta.9(typescript@6.0.2)) + '@internationalized/date': 3.12.0 + '@internationalized/number': 3.6.5 + '@tanstack/vue-virtual': 3.13.23(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vueuse/core': 14.2.1(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vueuse/shared': 14.2.1(vue@3.6.0-beta.9(typescript@6.0.2)) + aria-hidden: 1.2.6 + defu: 6.1.7 + ohash: 2.0.11 + vue: 3.6.0-beta.9(typescript@6.0.2) + transitivePeerDependencies: + - '@vue/composition-api' + + require-from-string@2.0.2: {} + + reserved-identifiers@1.2.0: {} + + resolve-pkg-maps@1.0.0: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rolldown@1.0.0-rc.15: + dependencies: + '@oxc-project/types': 0.124.0 + '@rolldown/pluginutils': 1.0.0-rc.15 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-x64': 1.0.0-rc.15 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + sax@1.2.4: {} + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.7.4: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shadcn-vue@2.5.3(eslint@10.2.0(jiti@2.6.1))(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + '@dotenvx/dotenvx': 1.61.0 + '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) + '@unovue/detypes': 0.8.5 + '@vue/compiler-sfc': 3.6.0-beta.9 + c12: 3.3.4 + commander: 14.0.3 + consola: 3.4.2 + dedent: 1.7.2 + deepmerge: 4.3.1 + diff: 8.0.4 + fs-extra: 11.3.4 + fuzzysort: 3.1.0 + get-tsconfig: 4.13.7 + giget: 3.2.0 + magic-string: 0.30.21 + nypm: 0.6.5 + ofetch: 1.5.1 + open: 10.2.0 + ora: 9.3.0 + pathe: 2.0.3 + postcss: 8.5.9 + postcss-selector-parser: 7.1.1 + prompts: 2.4.2 + reka-ui: 2.9.5(vue@3.6.0-beta.9(typescript@6.0.2)) + semver: 7.7.4 + stringify-object: 6.0.0 + tailwindcss: 4.2.2 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 + ts-morph: 27.0.2 + undici: 7.24.7 + validate-npm-package-name: 5.0.1 + vue-metamorph: 3.3.4(eslint@10.2.0(jiti@2.6.1)) + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@vue/composition-api' + - babel-plugin-macros + - eslint + - magicast + - supports-color + - vue + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + source-map-js@1.2.1: {} + + source-map-resolve@0.6.0: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + speakingurl@14.0.1: {} + + statuses@2.0.2: {} + + stdin-discarder@0.3.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + + stringify-object@6.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-identifier: 1.0.1 + is-obj: 3.0.0 + is-regexp: 3.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@2.0.0: {} + + stylus@0.57.0: + dependencies: + css: 3.0.0 + debug: 4.4.3 + glob: 7.2.3 + safer-buffer: 2.1.2 + sax: 1.2.4 + source-map: 0.7.6 + transitivePeerDependencies: + - supports-color + + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + table@6.9.0: + dependencies: + ajv: 8.18.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tailwind-merge@3.5.0: {} + + tailwindcss-animate@1.0.7(tailwindcss@4.2.2): + dependencies: + tailwindcss: 4.2.2 + + tailwindcss@4.2.2: {} + + tapable@2.3.2: {} + + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + + tiny-invariant@1.3.3: {} + + tinyexec@1.1.1: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinypool@2.1.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + ts-api-utils@2.5.0(typescript@6.0.2): + dependencies: + typescript: 6.0.2 + + ts-morph@27.0.2: + dependencies: + '@ts-morph/common': 0.28.1 + code-block-writer: 13.0.3 + + tslib@2.8.1: {} + + tw-animate-css@1.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typescript-eslint@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + eslint: 10.2.0(jiti@2.6.1) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + typescript@6.0.2: {} + + ufo@1.6.3: {} + + undici-types@7.16.0: {} + + undici@7.24.7: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.4 + + unplugin@3.0.0: + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + validate-npm-package-name@5.0.1: {} + + vary@1.1.2: {} + + vite-dev-rpc@1.1.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)): + dependencies: + birpc: 2.9.0 + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + vite-hot-client: 2.1.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)) + + vite-hot-client@2.1.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)): + dependencies: + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + + vite-plugin-inspect@11.3.3(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)): + dependencies: + ansis: 4.2.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.1.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + vite-dev-rpc: 1.1.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-devtools@8.1.1(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3))(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + '@vue/devtools-core': 8.1.1(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vue/devtools-kit': 8.1.1 + '@vue/devtools-shared': 8.1.1 + sirv: 3.0.2 + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + vite-plugin-inspect: 11.3.3(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)) + vite-plugin-vue-inspector: 5.4.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + + vite-plugin-vue-inspector@5.4.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3)): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) + '@vue/compiler-dom': 3.6.0-beta.9 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + + vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.3): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.9 + rolldown: 1.0.0-rc.15 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + fsevents: 2.3.3 + jiti: 2.6.1 + stylus: 0.57.0 + yaml: 2.8.3 + + vscode-uri@3.1.0: {} + + vue-demi@0.14.10(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + vue: 3.6.0-beta.9(typescript@6.0.2) + + vue-eslint-parser@10.4.0(eslint@10.2.0(jiti@2.6.1)): + dependencies: + debug: 4.4.3 + eslint: 10.2.0(jiti@2.6.1) + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + + vue-metamorph@3.3.4(eslint@10.2.0(jiti@2.6.1)): + dependencies: + '@babel/parser': 8.0.0-alpha.12 + ast-types-x: 1.18.0 + chalk: 5.6.2 + cli-progress: 3.12.0 + commander: 14.0.3 + deep-diff: 1.0.2 + fs-extra: 11.3.4 + glob: 11.1.0 + lodash-es: 4.18.1 + magic-string: 0.30.21 + micromatch: 4.0.8 + node-html-parser: 7.1.0 + postcss: 8.5.9 + postcss-less: 6.0.0(postcss@8.5.9) + postcss-sass: 0.5.0 + postcss-scss: 4.0.9(postcss@8.5.9) + postcss-styl: 0.12.3 + recast-x: 1.0.5 + table: 6.9.0 + vue-eslint-parser: 10.4.0(eslint@10.2.0(jiti@2.6.1)) + transitivePeerDependencies: + - eslint + - supports-color + + vue-router@5.0.4(pinia@3.0.4(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2)))(vue@3.6.0-beta.9(typescript@6.0.2)): + dependencies: + '@babel/generator': 7.29.1 + '@vue-macros/common': 3.1.2(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vue/devtools-api': 8.1.1 + ast-walker-scope: 0.8.3 + chokidar: 5.0.0 + json5: 2.2.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.2 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.4 + scule: 1.3.0 + tinyglobby: 0.2.16 + unplugin: 3.0.0 + unplugin-utils: 0.3.1 + vue: 3.6.0-beta.9(typescript@6.0.2) + yaml: 2.8.3 + optionalDependencies: + pinia: 3.0.4(typescript@6.0.2)(vue@3.6.0-beta.9(typescript@6.0.2)) + + vue-tsc@3.2.6(typescript@6.0.2): + dependencies: + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.2.6 + typescript: 6.0.2 + + vue@3.6.0-beta.9(typescript@6.0.2): + dependencies: + '@vue/compiler-dom': 3.6.0-beta.9 + '@vue/compiler-sfc': 3.6.0-beta.9 + '@vue/runtime-dom': 3.6.0-beta.9 + '@vue/runtime-vapor': 3.6.0-beta.9(@vue/runtime-dom@3.6.0-beta.9) + '@vue/server-renderer': 3.6.0-beta.9(vue@3.6.0-beta.9(typescript@6.0.2)) + '@vue/shared': 3.6.0-beta.9 + optionalDependencies: + typescript: 6.0.2 + + web-worker@1.5.0: {} + + webpack-virtual-modules@0.6.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.5 + + which@5.0.0: + dependencies: + isexe: 3.1.5 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + xml-name-validator@4.0.0: {} + + yallist@3.1.1: {} + + yaml@2.8.3: {} + + yocto-queue@0.1.0: {} + + yocto-spinner@1.1.0: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} diff --git a/frontendNew/pnpm-workspace.yaml b/frontendNew/pnpm-workspace.yaml new file mode 100644 index 00000000..0318eae2 --- /dev/null +++ b/frontendNew/pnpm-workspace.yaml @@ -0,0 +1,18 @@ +overrides: + 'vue': 'beta' + '@vue/compiler-core': 'beta' + '@vue/compiler-dom': 'beta' + '@vue/compiler-sfc': 'beta' + '@vue/compiler-ssr': 'beta' + '@vue/compiler-vapor': 'beta' + '@vue/reactivity': 'beta' + '@vue/runtime-core': 'beta' + '@vue/runtime-dom': 'beta' + '@vue/runtime-vapor': 'beta' + '@vue/server-renderer': 'beta' + '@vue/shared': 'beta' + '@vue/compat': 'beta' + +peerDependencyRules: + allowAny: + - 'vue' diff --git a/frontendNew/postcss.config.js b/frontendNew/postcss.config.js new file mode 100644 index 00000000..f69c5d41 --- /dev/null +++ b/frontendNew/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + autoprefixer: {}, + }, +}; diff --git a/frontendNew/public/favicon.ico b/frontendNew/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/frontendNew/src/App.vue b/frontendNew/src/App.vue new file mode 100644 index 00000000..e4f10684 --- /dev/null +++ b/frontendNew/src/App.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/frontendNew/src/components/ui/button/Button.vue b/frontendNew/src/components/ui/button/Button.vue new file mode 100644 index 00000000..093188c1 --- /dev/null +++ b/frontendNew/src/components/ui/button/Button.vue @@ -0,0 +1,28 @@ + + + diff --git a/frontendNew/src/components/ui/button/index.ts b/frontendNew/src/components/ui/button/index.ts new file mode 100644 index 00000000..3b23ad45 --- /dev/null +++ b/frontendNew/src/components/ui/button/index.ts @@ -0,0 +1,38 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export { default as Button } from "./Button.vue" + +export const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + "default": "h-9 px-4 py-2", + "xs": "h-7 rounded px-2", + "sm": "h-8 rounded-md px-3 text-xs", + "lg": "h-10 rounded-md px-8", + "icon": "h-9 w-9", + "icon-sm": "size-8", + "icon-lg": "size-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +) + +export type ButtonVariants = VariantProps diff --git a/frontendNew/src/index.css b/frontendNew/src/index.css new file mode 100644 index 00000000..686b840a --- /dev/null +++ b/frontendNew/src/index.css @@ -0,0 +1,142 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'); + +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.25 0.042 242); + --card: oklch(1 0 0); + --card-foreground: oklch(0.25 0.042 242); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.25 0.042 242); + --primary: oklch(0.588 0.139 242); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.955 0.014 242); + --secondary-foreground: oklch(0.25 0.069 242); + --muted: oklch(0.97 0.003 242); + --muted-foreground: oklch(0.52 0.028 242); + --accent: oklch(0.965 0.004 242); + --accent-foreground: oklch(0.25 0.042 242); + --destructive: oklch(0.584 0.239 28.5); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.925 0.007 242); + --input: oklch(0.925 0.007 242); + --ring: oklch(0.588 0.139 242 / 0.9); + --chart-1: oklch(0.25 0.139 242); + --chart-2: oklch(0.35 0.139 242); + --chart-3: oklch(0.55 0.139 242); + --chart-4: oklch(0.75 0.139 242); + --chart-5: oklch(0.85 0.13 242); + --sidebar: oklch(0.984 0.003 242); + --sidebar-foreground: oklch(0.25 0.042 242); + --sidebar-primary: oklch(0.588 0.139 242); + --sidebar-primary-foreground: oklch(1 0 0); + --sidebar-accent: oklch(0.965 0.004 242); + --sidebar-accent-foreground: oklch(0.25 0.042 242); + --sidebar-border: oklch(0.925 0.007 242); + --sidebar-ring: oklch(0.925 0.007 242); + --font-sans: 'Nunito Sans', sans-serif; + --font-heading: 'Lora', sans-serif; + --radius: 0.625rem; + --shadow-2xs: 0 1px 0 0 oklch(0.55 0.021 242 / 0.05); + --shadow-xs: 0 1px 2px 0 oklch(0.55 0.021 242 / 0.05); + --shadow-sm: 0 1px 3px 0 oklch(0.55 0.021 242 / 0.1), 0 1px 2px -1px oklch(0.55 0.021 242 / 0.1); + --shadow-md: + 0 4px 6px -1px oklch(0.55 0.021 242 / 0.1), 0 2px 4px -2px oklch(0.55 0.021 242 / 0.1); + --shadow-lg: + 0 10px 15px -3px oklch(0.55 0.021 242 / 0.1), 0 4px 6px -4px oklch(0.55 0.021 242 / 0.1); + --shadow-xl: 0 20px 25px -5px oklch(0 0 0 / 0.1), 0 8px 10px -6px oklch(0.55 0.021 242 / 0.1); + --shadow-2xl: 0 25px 50px -12px oklch(0.55 0.021 242 / 0.15); +} + +.dark { + --background: oklch(0.15 0.014 242); + --foreground: oklch(0.98 0 0); + --card: oklch(0.17 0.014 242); + --card-foreground: oklch(0.98 0 0); + --popover: oklch(0.18 0.014 242); + --popover-foreground: oklch(0.98 0 0); + --primary: oklch(0.588 0.139 242); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.668 0.139 242 / 0.25); + --secondary-foreground: oklch(0.9 0.139 242); + --muted: oklch(0.25 0.01 242); + --muted-foreground: oklch(0.75 0.021 242); + --accent: oklch(0.38 0.014 242); + --accent-foreground: oklch(0.98 0 0); + --destructive: oklch(0.69 0.2 23.9); + --destructive-foreground: oklch(0 0 0); + --border: oklch(0.29 0.01 242); + --input: oklch(0.29 0.01 242); + --ring: oklch(0.668 0.139 242); + --chart-1: oklch(0.35 0.139 242); + --chart-2: oklch(0.55 0.139 242); + --chart-3: oklch(0.75 0.139 242); + --chart-4: oklch(0.9 0.139 242); + --chart-5: oklch(0.99 0.11 242); + --sidebar: oklch(0.11 0.01 242); + --sidebar-foreground: oklch(0.98 0 0); + --sidebar-primary: oklch(1 0 0); + --sidebar-primary-foreground: oklch(0.2 0.01 242); + --sidebar-accent: oklch(0.24 0.01 242); + --sidebar-accent-foreground: oklch(0.98 0 0); + --sidebar-border: oklch(0.28 0.01 242); + --sidebar-ring: oklch(0.668 0.139 242); + --shadow-2xs: 0 1px 3px 0 hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0 hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1); + --shadow-md: 0 1px 3px 0 hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1); + --shadow-lg: 0 1px 3px 0 hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1); + --shadow-xl: 0 1px 3px 0 hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1); + --shadow-2xl: 0 1px 3px 0 hsl(0 0% 0% / 0.25); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/frontendNew/src/lib/utils.ts b/frontendNew/src/lib/utils.ts new file mode 100644 index 00000000..c66a9d9c --- /dev/null +++ b/frontendNew/src/lib/utils.ts @@ -0,0 +1,7 @@ +import type { ClassValue } from "clsx" +import { clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/frontendNew/src/main.ts b/frontendNew/src/main.ts new file mode 100644 index 00000000..e4719183 --- /dev/null +++ b/frontendNew/src/main.ts @@ -0,0 +1,13 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' +import './index.css' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) + +app.mount('#app') diff --git a/frontendNew/src/router/index.ts b/frontendNew/src/router/index.ts new file mode 100644 index 00000000..e1eab525 --- /dev/null +++ b/frontendNew/src/router/index.ts @@ -0,0 +1,8 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [], +}) + +export default router diff --git a/frontendNew/src/stores/counter.ts b/frontendNew/src/stores/counter.ts new file mode 100644 index 00000000..b6757ba5 --- /dev/null +++ b/frontendNew/src/stores/counter.ts @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/frontendNew/tailwind.config.ts b/frontendNew/tailwind.config.ts new file mode 100644 index 00000000..889cf8ff --- /dev/null +++ b/frontendNew/tailwind.config.ts @@ -0,0 +1,13 @@ +import type { Config } from 'tailwindcss' + +export default { + content: [ + './index.html', + './src/**/*.{vue,js,ts,jsx,tsx}', + './node_modules/shadcn-vue/lib/**/*.{js,ts,vue}', + ], + theme: { + extend: {}, + }, + plugins: [], +} satisfies Config diff --git a/frontendNew/tsconfig.app.json b/frontendNew/tsconfig.app.json new file mode 100644 index 00000000..c0f2d867 --- /dev/null +++ b/frontendNew/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + // Extra safety for array and object lookups, but may have false positives. + "noUncheckedIndexedAccess": true, + + // Path mapping for cleaner imports. + "paths": { + "@/*": ["./src/*"] + }, + + // `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking. + // Specified here to keep it out of the root directory. + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo" + } +} diff --git a/frontendNew/tsconfig.json b/frontendNew/tsconfig.json new file mode 100644 index 00000000..bfe39bf3 --- /dev/null +++ b/frontendNew/tsconfig.json @@ -0,0 +1,17 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/frontendNew/tsconfig.node.json b/frontendNew/tsconfig.node.json new file mode 100644 index 00000000..c9b2badc --- /dev/null +++ b/frontendNew/tsconfig.node.json @@ -0,0 +1,27 @@ +// TSConfig for modules that run in Node.js environment via either transpilation or type-stripping. +{ + "extends": "@tsconfig/node24/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + // Most tools use transpilation instead of Node.js's native type-stripping. + // Bundler mode provides a smoother developer experience. + "module": "preserve", + "moduleResolution": "bundler", + + // Include Node.js types and avoid accidentally including other `@types/*` packages. + "types": ["node"], + + // Disable emitting output during `vue-tsc --build`, which is used for type-checking only. + "noEmit": true, + + // `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking. + // Specified here to keep it out of the root directory. + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo" + } +} diff --git a/frontendNew/vite.config.ts b/frontendNew/vite.config.ts new file mode 100644 index 00000000..d49d7084 --- /dev/null +++ b/frontendNew/vite.config.ts @@ -0,0 +1,20 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) From d63ba6155276c039fe38dbc5aceb636104785731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 9 Apr 2026 19:24:26 +0800 Subject: [PATCH 05/21] dev --- backend/database/models.py | 9 ++++----- backend/generate/equ.py | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/backend/database/models.py b/backend/database/models.py index 639afed3..bc0fd396 100644 --- a/backend/database/models.py +++ b/backend/database/models.py @@ -16,12 +16,11 @@ class SuitData(Base): suitName = Column(Text) rarity = Column(Text) name = Column(Text) - point = Column(Integer) - level = Column(Integer) + point = Column(Text) count = Column(Integer) - SkillAttack = Column(Float) - Attack = Column(Float) - Buffer = Column(Float) + SkillAttack = Column(Text) + Attack = Column(Text) + Buffer = Column(Text) imageUrl = Column(Text) value = Column(Text) bufferValue = Column(Text) diff --git a/backend/generate/equ.py b/backend/generate/equ.py index e46b1dca..6b8a0bcc 100644 --- a/backend/generate/equ.py +++ b/backend/generate/equ.py @@ -1,5 +1,5 @@ from database.connect import get_db_engine as get_engine -from database.models import Session, EquData, SuitData +from database.models import Session, EquData engine = get_engine('0') From 0b2035f459da59202ec75bd45e7e2474d0295ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 9 Apr 2026 19:26:19 +0800 Subject: [PATCH 06/21] dev --- backend/dataFiles/dcalc_0.db | Bin 1007616 -> 1150976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 947c4c940522c552eea20e384dc384f85f9035a5..da873c9c16e11881c230430c8eac10ebcea4e1ec 100644 GIT binary patch delta 18183 zcmb_@d3+RA_HW%=RlQVqr#k8Ggb)G=$R^PAlC4o7fdq&w=>#xgO~Ss25D6fQl1fNG z5CmH&R}7BgJRL_cYPk#}Ix`M$Tu^c5r$0q;<~jPCLB*MQ>O4{2xwp3NSn1#UVNfo^FamtT;ahfSbQHCnZ0Z&tMNPc-NCC_B za0Ne#?spk1o?*mG;u-NwPhs~9qF1o70pG?=t6L+*5kL+&RMF3y!L#}FzcsGEVHy1Q zhsxtS;dkW!hQT))zG?7{f^P(TBjLLmzA^9(f$u8#NI$ZYq3{La8w_6|d?{u2IPjPo$oV6hTfW`g*=_>K6rcv1XJ{Ihso zd`~XD8lnB8v;f*E(p+e(rCHF+A!wG6kxR%)%_T<=5uZB9c^~BpSZ|iiIffB`DLUPsxCgtM zoMY^dE7>9TB|C_`0V!i*?78d#as%_j@Yhr;swf zg&Urc?O_ivHdN2JHaMzLJ@=mNQ(+LQhaMG3sc&ZUdCY7~RK(Ypv^VG2bMo_1XP~ut z$qmbik`jf~{|!&BtE!k&RWPSw(u}Ht!TNtzu9UJtq*SkBcOb;bnca9^Zu_i$_MAWf z@4CepiF9X9%3qYS5A$=X8s?0aLrd9!e0BmmO#ZBlt@Mr-3JM0VUA}d20r|BsQrWPU zJ;>cz&Sg9CXvPy17TSJhyN^eD)asee~*tGM4ZB1VlUSel94>jbxg+BoT-?EpWE^WfLfK1M#YlpV>nkC%qa7ZRvk{^(BhgYsbl!NCnY3@!Q9RpeI_<;^ns zQQ34iDo4t*_n=AiSB0|l0Q~CO`_PZ1XMy_Tt@lIETOJ^TymXZGukS=-*Z^6KooQs; zH#;uztI#aw3iBkKW*fdverXo^N?BZn9_3mDMwsE26Kq<9QKTMzv6Cied*dI zEO%BphT3`lQ*ID$U=AfJ;_JAM$x^Yr|4~%0{oyystp+Y3z{Ull?fB7(aS8h6j z&M9LLqP3XvCLDGK&#YoRBZRnp3ww!K1*2TA^c#jgcPecK=sm3byB1oq0EIiqT^@8K z?g9wTWIW|UoBcHRUpN!a;|fyVo`c4^lslWzY1%u>jviq$T<(A{$T89uVK1Ubpx+%x znOA`iaLT!Ae34~4Ha5#2PsLSAa0-5eRX%9O|3U+aTwKfpjOTgRP0mraLHudHiD$TO zt{kst9)R`jRAvsq?;vHO7r%{^!h!f>qbmc+|%)b+geT8JY* zt%sjx_k8~???{w?yX?pY#JM^A1LHpJ+-aMDe*n}MxM$1z6`-`^rPjpu_hjd0X<(RRc( zk^h`O#E;`vvoii2`X?#`QD0HoR^VGejh5n*nC%SK$+-=1T$k(cYAliwICKZ&86eEy zzeIAl%`*?^ayVl5EZio4_77B}9R3!qbtuOWewtTF0sn<@9kWlue*w|`5i8xVqF+0d z|Md^l$lZlGuMK_70I@C<_SzrieuF-SPOl-hvw5?8t$=4K$L)B&gYBrjbvFVusvY3Ii@F!5!?8CQS7D8^-->=MGy8e*>7mV&xSFn#}fm^-ia)=fw{vv6-rj z4ltf}7wd@dO<1nIM%)J{{tu)qd<;L#D~}z+Z`zL+*u1JdnLjX|3BnHh3*5KNA7CTT zDNp_$kKvTEJMnH_k?zH(v2serui)e5wh&Metf7q9)&%}VTn1|xftAuMbjEY%Y3^s- z32(L&O=sNyc1Vt^?eEyP*$3PHz`4+L=om&y-7>V3SE_GB3Q*B%bTg-Xx)Isgu5Mdb zx4o;|(berd-YqmGML;O`|5F6?O~y{tkAy%dhlD^VTY{hj1*8?w`lTh%`Xq==P?j_w z+Dr*T6y%j=LMuuTWugpeGPE8EVin|;ilB8#5M3gHgh0qiLLlTIArP{Y5D3{I1Va2a zXgCOg5W9i7hCvuYAcV*?3<-g*kPzrc5(51I!!nmi2=qM(f&LE(f&NWGpzlZo`mNaI zb#-~&$Gx7As2`ikd>}PBvxIOrDGz~@>jQkz>VkU!!49y)C2>9}F zXCdQY5-ktrCI;Re@P}iuP$XDV77B)<(UK7SQ*xrGB{3cO@-zBGWrbs*;z+QFqQVh^ z>RF$d2^deG7=O4d0y9MjCQ?>LFu@DjOzt$O(kRRnqNtK0g1Y)U4dv<+l@%^24uyj- z3(N%|_@`&$-LSsxf{yWlB-$HQN%T)Vai8B8E-nI06#9l^bW8a&5-o{}MEUb= z(n3~L$B0jgi$#y;ZTDTSdZEALylp=FCsYUISA_hXXs|lP&_E6m?K%*xT-(Bp3J^X5 zj);-*4MLK?-i*&Fi*Mo<5olpwP#~pnury4JFru?k3Y00(q4YqFS^X+A0o54HG~Anv zY#%pBN0Rk+5Q-w|2J5B#6o% zePPN_rPNk6j*>TQ=Pvrj4X{Q8!jzkeffJJ0DQT)$o(arN+MHh{r=l>SQB_kszc6q& zW!3c8OfaC+lxc#NWL1-E+N{cJNdPO#s_B;wU_o4JSk}sTb_m}&3i;`{6%=j>_IJ)1 zZtgJ;@AYX4mn$#01!n~!U{H}@Sus(aBEzEK6kSN!b1S|X)Nb}LeE_06y$0|{z^1@q z6A7C(m4cr$RL2ty>V*$PU@wtiF}Ot-z%Z+n0nk;+10M4{sCvC3>4uTQY};M7GX4YpR=$w?EloUpi2|LmP!_nVaBdh3IT!C{ z+iSow!mYSKKH7qFvUCk1Yg08ydAS8I##sx-l9MGkLw5jGYN<90f?8kGH_*OT8na+b zAAK#9Wx;6czEq}~{o^9(fB}s=sdq8ryPr;f zO*mx~K2@oGDxa1>xM1+9a&$jTuif;XU_52Q2K&#s3(OM`+}sz~6B?%uIG(z@+u4q> zxnxFO8DO%C!E_X#6@G=&Xt*V|yP)K)otN)u>;$e*HA6%KjTHG5>H0We(l^ z4Qy#TtWR~+F&bTJj#~NXUc3}^psFMtG7zSIx-3NXNB7g}tXi^kCF6R-elNQc)NvjQ z(i@*VUT^97B2>jA^tPm___HJMS=JxAHa(6;Q6U=1YNW3ON8>lijMt<`QnrtUi2`VJ zuYB?wKx!F`SIGLEwiCAN`OEx6{4{O}yA9uo9%Ehsb$G}xEw5Hhwv?(v`w&7B(s*2? znMZ^MBF243ZYjan%efP9F(9Y)g{1eLP%#b8^&3wLa%x{l8c&o_b2e=vdCn=;NZk&o z`lv)7k}q6~5BQc==?HQuG543LxdY;6Rc|1_JRa}QYN#aSIyAS`bOs=f{_@U=xWA=G zXqc=4Opjm!tlUDwq;voa-_THz24LkN>dQ@l<{*qEjj*_n+*UDB*D=ET2ZnZpbxyb= z3?v(Y@DOeYg!r{<$-MUzpoIBI4&8(AR(=`9H(=1z3Hm66{d?O+fZS3b)~B(7c}=0r zl0#x82U^EuD4uohA;SC4J8bWBLy%lp=z1*?kMHw$Mr-wRB!k~JQPb00`SMbnM}sC9 zn=a7^nuy9>t=!#!L)aIMr-jpNNF=prV5|7fXqI1Rx-R} zrLp+4Ww3aaHj7p2(`l2yzw}L=nFi=nlPqLLm{;XYIkOReLkQPbrKSf1E78*}w-X&{` zoo^z6s#15Ug|88MXc}P+Sc7lLYM7@PyGd9enj&kiYA}gGyY$e$mNZr0M_((3y5734 zB{|JC`)cGw){r>8D>Zs8o?}WQ5AUCB*v!p0;5;9pq@rLHvUmn3Dcv{VMJzDI>}23i zn1ZrUSt-3<>B$n+RyC%mOADtCz9cnUV!+4ZY{F!Aw1dgu+z!F*@Y?+B8MFhUhZV@b zt9p6z*t^$~JzbiLbL9s=AbX;&JQ7aIhA2-~;C~=r^|CZLEo2MPpu?aabjr6I3S|m!-A}aSN;c56GY6*vq15$N{MkdLc1G4$$#SU{fp8BEilf2|^Rh=3P}ou1Jfd`I{(>evME>$@~ca z6G0vIMJ8i}yH?n0zk_=Oy$H1MDCBciZYBfjO13vZb|3cOuzah4-PUPHhlz|jqzj)75qnN8wh(1^6zQh zmOS1;rzY${a?U>yx&G4R8LbwW*)tgQ3hQgysw2r3dLgsav>A98BL+Nv8FBv3x|?+r z4O}Vb8;1)a9I39QB+Q=0_$D~nEy=K6I-x~=DakVBEQhtn1^EI#5F5XuDps6=WE`P1{WZg-AFJNp$Q?_IKZKDpvtOwds-y5ky0A* znl=K+A6a;A&`&@I8CRC@lCVYyI8Qs*+FSWHb`LrTyJkM^5>{287M4-AdMO|lu9}F7CMRot&%N0n%+T6NPqy1p;#JvgT(7-QXuR- zH{2>o?T!3Ti|&*M;avlA!Aiji^jc}Q+9yg|2l~wWDe3c{R`=ASqZD%Y4+8KpAKww>0EnjvWnc9 zZx~|Jo4if_`eoEl-uWgkxD3vp_a1SR$CT$^L7%bO%aFlLhT!r#viSjcFsO$YXOov9 z`VkTJxNW$u9=Y;_&rl$T+?v9{See>r_a;a+gVb-9fBX#D6we<~Asxt-ejv3z6pliX zC>%8_M7;)*oqt0vq5xKFp$uIDWexCBVS}Ts*5XXJ7Wwq+Jm(7si%Md&F^KyoBX!&) zIrNbNfuCxy#^i9HBzH>vI;E;4c}W9rL0pW-=3K--ja?w|?@{*dp^{f0lI-$!-jMi_ z*WoDl-Ht@9tWjEA8VN$98U3@*qc}_O;(v$FQHi-YM!a&Y*q~;*Kjp1w(0|~-P$}d8 zVHi@}D2hgCV?@iwFn^-w?nxfULV*Zphl@*SV?2uJEovgIegdJTKAhS175x+6eo+1D&bEJ_E_Wcgwz+V1yC zxh5Q{WvOsI&?JOpmdteYHsBYnqBY9o7drQ#eJIce$!L}FBq}fw)=Z<7#;p;SbQ3Ts zMB^rN4y$0ZR`Qz&jdTpeNDJoKQ!Dw@1BRq0=<9)6Lto{vg!1GQuklWIG#HH*>CtAh zguVeq9U^7vnn7&GO3`(1S_T1YneI(b+^*?)rVj7RPI5G-3YHg)g=0qOnWUgZuLii$ zR3_u^oj*_dk*hMQ^6{Sqd@y4X_%=Upj@jptV_BXG&TvU&E(Th91V#?1(}Bvd$UX{h5+h*zW_b#`3)~YRPb|yx#|0P5+mX zK-37ljM=wcMK0_a%sD3G1$VXUylaDt6^;laot*t6+jD$^TZg-ub3m+520E&xBBJ}_ zb00cw{c2p!1z>he`;ThSsg zxWQ5+8QZ>9n{=2gJd6r-*;1=BWeeEJ^7e<(#z1?a6xQ+Ng3$}FUzCVZ7%{D!1RpGg zbU4jf_MTo9E{*a{;illnrp439wuF|bOlOpYFO-5N9`cu|^XuM-);sk`*Id4DjYO;E zlyrIBW5&GV3D z$Oq2wj)J68{H}G9RvA|ne-ABR0BiM^7av4^`HM4raxs4AK{NpSCrR2n5zSZ(Ce|t` zrPR!fvD};OO`#A}10)Nnqvb!7-t^5)R)0^lZ>h-8m6ttp3t%j1q z@9>lh4)}f?a7eWB+c#D%prrD=fu)t-G*}C^C)oQiG2~KHsUTWSHDs-HQldT}Gm@Bq z1$zW+NgAwnhb{siPa<9V;6&N*5Nf2z;xtH_ks+6Ml0!CFo~(Eg(*6kG0^|Od^K*U; z@8zE1=CfDWhnWk&Os{5lmP?cM*n<=#cjvcHC)u75#C%WAM|nQgv{I9U(ipTvnYje< z*w-NG)kD)vDEN&VQJ$r(G)O-!ADRd&gK3bG>W5kgmV~gdng(g28iJLY_GlukOs8I& zU?McrF%XtP+ct@o-pA)wQ}x|n-(IhCx_b?}N`B*asdq(k9*syjx)wc-iSp9|d|yha zMQtf2rPQ>dqeS&-0lqJ!bugu>FZt^n_?sMo@r)B%?Z4zc#{$^mcPP7azBEnO0%D81 zXBt{?WG+zx>c&gxOBv10C|BxHI}S{erltUUsgLGl!s@FM{q`p73S=V#Oi4e0>cV^F z<5C8wN-!q=ULZy8Lw}&~@ z^0(~WPHATHuzN@8A}!JiBt8qZpiXhwd5*O|AjMIpEiIio4b7RGhK zb-;Cv@VRhUm}L8bRT%k`Oix30*Cc5^j5%~@uKEu6wrG15ymfEB*kA6hKw0{8ttctZ z8EUP(T!AhTo0^vvs^$b~&}b;M2Ca}9OlU6dHLDghMQM>v51I(_E9{F)q(Dp8s|QSU zwdZS4mZc+zOQcFm00v2$04qNbmq@9$FMx#`h)Z+&23UE48fmr(P`!Y$BughSK&neV z_}goBBkwOCD1&I~{41$WK-HSu7-}TvPm)(l8TSj$R{rmJDX9KzoV}Zq7V9TKRX?Vm zd*X>-W%<>*BYjeBSdt6}(AG2S)Kh@wrA0cL+CU0gyDkv3NxCj1!9nR3Cc}Fjzn+Vu zS8n6VplQw|X+avO{w|TeK-aDd%1agKYYcz1<>t`ijC+gYOMW?e9K>)RFhGg4Bzd@f zx$RS_`j6Jwvm`=a<{7tfB7?-NQ^Vy@m7DAN=+ozMfR~z+huGUo7O)GFFrx($okNpk z0itY53s+#Mavy6fGOmbK&H27E~ffU}iC{EiSL{bD`Y%o^ykJBzFPJPzDdN(ZH@MiPXV| zj)!M)G+wDDSKC888kYF@TL@R^JDONDsfO26@a6?XaHI;}2TtcyTAnpHHBoqeRnOix zH&gVD>Ch^zQrk3WH3>agTBoCFq}^-HG_s)2Ty)fjDcKsFWAbYt) zO5_A!aH|Qh;@0I7DUtUDu;A9^((1keR@}NwT4e&X2%DZ5?7@m#Z{wwvy511wJrL6v zATM#?LZ&8e;QTkCf!qb{zFWVq(0pzQnltXTG-aDSwl{eNR65zsST#gsqr~|^KJ0C zF(oNc_c^6n7FQpj=$RiC30h8S)CO{Qil*ryIsFSbgTxc6mhV8qCye`fXNzql{segE zZP|}{NVKA{NLf4Dj>YH+v`g;bQ|41uV^P3p=bIuJs$y2Q41G~3Kr0Q&p zbzqF9G{faeH@NtT3q2_{L3JI^c+fN|J5qNxu*tFm)`d5k5gL)IoE`V4?4eR3F9R&F V^i?;c<4cJ1(4tx80*^k%{}*1+SakpZ delta 3455 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 From c882a64ec9da8e4b8b7d125f79f4939e54677626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Fri, 10 Apr 2026 18:25:08 +0800 Subject: [PATCH 07/21] dev --- backend/core/abstract/character.py | 15 +- backend/core/basic/character/base.py | 35 +- backend/core/basic/character/calc_equip.py | 75 +- backend/core/basic/character_old.py | 2 +- backend/core/basic/equipment.py | 22 +- backend/core/equipment/version_0/__init__.py | 37 +- .../core/equipment/version_0/oathSuitSkill.py | 1009 ++++++++ backend/core/equipment/version_0/suit.py | 2051 +---------------- backend/dataFiles/dcalc_0.db | Bin 1150976 -> 1150976 bytes backend/database/models.py | 15 +- backend/test.py | 3 +- 11 files changed, 1230 insertions(+), 2034 deletions(-) create mode 100644 backend/core/equipment/version_0/oathSuitSkill.py diff --git a/backend/core/abstract/character.py b/backend/core/abstract/character.py index fcb455c8..040a1c36 100644 --- a/backend/core/abstract/character.py +++ b/backend/core/abstract/character.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from typing import Any, Literal, Mapping + class CharacterProperty(ABC): """ 抽象类,用于定义Character的接口和属性 @@ -152,7 +153,8 @@ class CharacterProperty(ABC): 攻击强化P=0, 增益量=0, 增益量P=0, - **kwargs: Mapping[Literal[ + **kwargs: Mapping[ + Literal[ 'STR', 'INT', 'AtkP', @@ -187,7 +189,9 @@ class CharacterProperty(ABC): 'Spirit', 'Vitality', 'EquEffectRatio', - ], Any], + ], + Any, + ], ) -> None: """设置角色属性""" pass @@ -198,7 +202,7 @@ class CharacterProperty(ABC): pass @abstractmethod - def AddSkillLv(self, min: int, max: int, lv: int, type=-1,exceptSkills:list[str]=[]) -> None: + def AddSkillLv(self, min: int, max: int, lv: int, type=-1, exceptSkills: list[str] = []) -> None: """增加技能等级""" pass @@ -236,3 +240,8 @@ class CharacterProperty(ABC): def calc(self, setInfo: dict[str, dict]) -> dict: """计算角色属性""" pass + + @abstractmethod + def GetReinforceSum(self) -> list[int]: + """获取强化总和""" + pass diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py index 7609349c..a0eec733 100644 --- a/backend/core/basic/character/base.py +++ b/backend/core/basic/character/base.py @@ -3,7 +3,7 @@ from typing import Any, Literal from core.abstract.character import CharacterProperty from core.basic.skill import Skill -from core.basic.equipment import EquEffect +from core.basic.equipment import EquEffect, OathSuit, OathSuitSkill, Suit from ..formula import 获取基础属性, 获取唤醒属性 from ..roleinfo import CharacterEquipInfo, get_key_by_value, CharacterOathInfo from .jade import Jade @@ -22,6 +22,14 @@ class CharacterBase(CharacterProperty): """装备打造信息""" charOathInfo: list['CharacterOathInfo'] """誓约打造信息""" + charOathSkillId: int + """誓约技能ID""" + suitInfo: list['Suit'] + """套装信息""" + oathSuitInfo: list['OathSuit'] + """誓约套装信息""" + oathSkillInfo: list['OathSuitSkill'] + """誓约技能信息""" equ_effect: list['EquEffect'] = [] """装备效果列表""" equ_options: dict[str, int] = {} @@ -336,3 +344,28 @@ class CharacterBase(CharacterProperty): return weapon.itemDetailType, weapon.categorize # endregion + + def GetReinforceSum(self) -> list[int]: + """获取强化总和""" + reinforce_0 = 0 + """防具""" + reinforce_1 = 0 + """首饰""" + reinforce_2 = 0 + """特殊装备""" + reinforce_3 = 0 + """武器""" + for part in self.charEquipInfo.keys(): + if self.charEquipInfo[part] is None: + continue + num = self.charEquipInfo[part].reinforce + # if part == '武器': + # reinforce_3 += num + if part in ['上衣', '头肩', '下装', '腰带', '鞋']: + reinforce_0 += num + if part in ['手镯', '项链', '戒指']: + reinforce_1 += num + if part in ['耳环', '辅助装备', '魔法石']: + reinforce_2 += num + reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 + return [reinforce, reinforce_0, reinforce_1, reinforce_2, reinforce_3] diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index 7c435776..a4f36770 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -1,7 +1,7 @@ import sys from uuid import uuid1 -from core.basic.equipment import get_equipment +from core.basic.equipment import OathSuit, Suit, get_equipment from ..formula import 增幅计算, 强化技攻, 武器强化计算, 精通计算, 耳环计算, 左右计算, 锻造计算 from ..roleinfo import CharacterEquipInfo, CharacterOathInfo, get_key_by_value from .base import CharacterBase @@ -22,6 +22,7 @@ class CalcEquipMixin(CharacterBase): for key in info['oaths']: # 导入誓约打造信息、誓约信息 self.charOathInfo.append(CharacterOathInfo(info['oaths'][key], self.equVersion, key)) + self.charOathSkillId = info.get('oathSkill', 1) def calc_init(self, setInfo: dict[str, dict]): self.equ_options = setInfo.get('options', {}) @@ -89,8 +90,8 @@ class CalcEquipMixin(CharacterBase): oathSuitInfo[max_point_oath_suit]['point'] -= min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) pass suits = zero_point_suits + ([max_point_suit] if max_point_suit is not None else []) - suitList = [] - oathSuitList = [] + suitList: list[Suit] = [] + oathSuitList: list[OathSuit] = [] res = [] for suit in suits: if suitInfo[suit]['point'] == 0: @@ -99,20 +100,20 @@ class CalcEquipMixin(CharacterBase): suitList += equs.get_suit_info(suit, suitInfo[suit]['point'], 0) if len(suitList) == 0: continue - temp = suitList[-1] - res.append( - { - 'id': temp.id, - 'name': temp.name, - 'rarity': temp.rarity, - 'point': suitInfo[suit]['point'], - 'count': suitInfo[suit]['count'], - 'level': temp.level, - 'imageUrl': temp.imageUrl, - 'value': temp.value, - } - ) - + self.suitInfo = suitList + temp = suitList[-1] + res.append( + { + 'id': temp.id, + 'name': temp.name, + 'rarity': temp.rarity, + 'point': suitInfo[suit]['point'], + 'count': suitInfo[suit]['count'], + 'level': temp.level, + 'imageUrl': temp.imageUrl, + 'value': temp.value, + } + ) for suit in oathSuitInfo: if oathSuitInfo[suit]['point'] == 0: oathSuitList += equs.get_oath_suit_info(suit, 0, oathSuitInfo[suit]['count']) @@ -120,17 +121,47 @@ class CalcEquipMixin(CharacterBase): oathSuitList += equs.get_oath_suit_info(suit, oathSuitInfo[suit]['point'], 0) if len(oathSuitList) == 0: continue - print(oathSuitList[0].__dict__) - suits_effect = [i.id for i in suitList] - for i in suits_effect: + for suit in suitList: + i = suit.id func = equs.funs.execture(f'suit_{i}') suit = next((x for x in equs.suits if str(x.id) == str(i)), None) - if func is not None: - func(self) + # 誓约和套装进行匹配 + # 如果存在誓约和套装是同一个套装 + # 则直接不执行原套装效果,执行誓约套装增强的效果 + oathEffect = next((x for x in oathSuitList if x.suitId == suit.suitId), None) if suit is not None: filtered_dict = {k: v for k, v in suit.__dict__.items() if k[0].isupper()} self.SetStatus(**filtered_dict) + if func is not None and oathEffect is None: + print(f'套装 {suit.name} 生效') + func(self) + else: + # 当存在套装和誓约不匹配的时候,誓约技能只能是1号位 + self.charOathSkillId = 1 + oathSkillEffect = [] self.max_point = max([i['point'] for i in res], default=0) + self.oathSuitInfo = [] + self.oathSkillInfo = [] + # 当套装点数达到太初时,誓约技能生效 + if self.max_point >= 2550: + for oathSuit in oathSuitList: + skill = next((x for x in oathSuit.skills if x.skillId == self.charOathSkillId), None) + # 誓约套装效果生效 + filtered_dict = {k: v for k, v in oathSuit.__dict__.items() if k[0].isupper()} + self.SetStatus(**filtered_dict) + if skill is not None: + oathSkillEffect.append(skill) + # 誓约技能效果生效 + filtered_dict = {k: v for k, v in skill.__dict__.items() if k[0].isupper()} + self.SetStatus(**filtered_dict) + self.oathSkillInfo.append(skill) + self.oathSuitInfo.append(oathSuit) + + for skill in oathSkillEffect: + func = equs.funs.execture(f'oath_skill_{skill.id}') + if func is not None: + print(f'誓约技能 {skill.name} 生效') + func(self) if self.max_point >= 2550: skillAttack = (self.max_point - 2550) // 70 * 0.01 buffer = (self.max_point - 2550) // 70 * 100 diff --git a/backend/core/basic/character_old.py b/backend/core/basic/character_old.py index f140d5b2..8d7a1da6 100644 --- a/backend/core/basic/character_old.py +++ b/backend/core/basic/character_old.py @@ -20,7 +20,7 @@ from core.abstract.character import CharacterProperty from core.basic.property import CharacterInfo from core.basic.skill import Skill -from core.basic.equipment import get_equipment, EquEffect, Equ +from core.basic.equipment import Suit, get_equipment, EquEffect, Equ, OathSuit # from core.basic.equipment import equipments # from core.basic.skill import Skill, ActiveSkill, PassiveSkill diff --git a/backend/core/basic/equipment.py b/backend/core/basic/equipment.py index 39f18b9c..8f522b70 100644 --- a/backend/core/basic/equipment.py +++ b/backend/core/basic/equipment.py @@ -151,9 +151,22 @@ class Equipments: with Session(self.engine) as session: db_list = session.query(SuitData).all() for item in db_list: - suit = Suit(**{k: v for k, v in item.__dict__.items() if not k.startswith('_')}) - self.suits.append(suit) - self.suit_dict.setdefault(str(suit.suitId), []).append(suit) + lvs = len(item.point.split(',')) + suits = {k: v for k, v in item.__dict__.items() if not k.startswith('_')} + for i in range(1, lvs + 1): + suit = {k: v for k, v in suits.items()} + suit['point'] = int(suit['point'].split(',')[i - 1]) + suit['level'] = i + skillAttaks = parse_to_number_list(suit['SkillAttack'], [0]) + suit['SkillAttack'] = 0 if i - 1 >= len(skillAttaks) else skillAttaks[i - 1] + attacks = parse_to_number_list(suit['Attack'], [0]) + suit['Attack'] = 0 if i - 1 >= len(attacks) else attacks[i - 1] + buffers = parse_to_number_list(suit['Buffer'], [0]) + suit['Buffer'] = 0 if i - 1 >= len(buffers) else buffers[i - 1] + suit_obj = Suit(**suit) + self.suits.append(suit_obj) + self.suit_dict.setdefault(str(suit['suitId']), []).append(suit_obj) + pass pass def init_enchants(self): @@ -357,6 +370,9 @@ class OathSuitSkill: bufferValue: str def __init__(self, **kwargs): + for key in ['SkillAttack', 'Attack', 'Buffer']: + if kwargs.get(key) is None: + kwargs[key] = 0 self.__dict__.update(kwargs) diff --git a/backend/core/equipment/version_0/__init__.py b/backend/core/equipment/version_0/__init__.py index 935f0e09..8702d1df 100644 --- a/backend/core/equipment/version_0/__init__.py +++ b/backend/core/equipment/version_0/__init__.py @@ -6,10 +6,18 @@ from . import emblem from . import enchant from . import sundry from . import suit +from . import oathSuitSkill from .register import execture -options = [{'id': 1, 'name': '龙战八荒', 'options': ['BUFF OFF', 'BUFF ON', '期望']}, {'id': 2, 'name': '混沌净化', 'options': ['净化', '堕落']}, {'id': 3, 'name': '群猎美学', 'options': ['单刷', '组队']}, {'id': 4, 'name': '魔攻核', 'options': ['普通', '追击']}, {'id': 5, 'name': '传世手杖', 'options': ['BUFF ON', 'BUFF OFF', '期望']}, {'id': 6, 'name': '传世嵌合弓', 'options': ['本能飞跃', '非理性着陆']}] +options = [ + {'id': 1, 'name': '龙战八荒', 'options': ['BUFF OFF', 'BUFF ON', '期望']}, + {'id': 2, 'name': '混沌净化', 'options': ['净化', '堕落']}, + {'id': 3, 'name': '群猎美学', 'options': ['单刷', '组队']}, + {'id': 4, 'name': '魔攻核', 'options': ['普通', '追击']}, + {'id': 5, 'name': '传世手杖', 'options': ['BUFF ON', 'BUFF OFF', '期望']}, + {'id': 6, 'name': '传世嵌合弓', 'options': ['本能飞跃', '非理性着陆']}, +] sundryList = { 'medal_rarity': {'id': 0, 'options': [{'name': f'品质:{i}', 'value': idx} for idx, i in enumerate(['普通', '高级', '稀有', '神器', '传说', '史诗'])]}, @@ -28,4 +36,29 @@ sundryList = { 'costume_card': {'id': 13, 'options': [{'name': f'{i}', 'value': idx} for idx, i in enumerate(['无', '四维(3)|三速(1%)'])]}, } -__all__ = [get_dress_list, calc_dress_effect, options, execture, sundryList, equ, stone, jade, emblem, enchant, sundry, suit] +__all__ = [get_dress_list, calc_dress_effect, options, execture, sundryList, equ, stone, jade, emblem, enchant, sundry, suit, oathSuitSkill] + + +def get_reinforce_sum(char): + reinforce_0 = 0 + """防具""" + reinforce_1 = 0 + """首饰""" + reinforce_2 = 0 + """特殊装备""" + reinforce_3 = 0 + """武器""" + for part in char.charEquipInfo.keys(): + if char.charEquipInfo[part] is None: + continue + num = char.charEquipInfo[part].reinforce + # if part == '武器': + # reinforce_3 += num + if part in ['上衣', '头肩', '下装', '腰带', '鞋']: + reinforce_0 += num + if part in ['手镯', '项链', '戒指']: + reinforce_1 += num + if part in ['耳环', '辅助装备', '魔法石']: + reinforce_2 += num + reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 + return reinforce diff --git a/backend/core/equipment/version_0/oathSuitSkill.py b/backend/core/equipment/version_0/oathSuitSkill.py new file mode 100644 index 00000000..74ed0cf0 --- /dev/null +++ b/backend/core/equipment/version_0/oathSuitSkill.py @@ -0,0 +1,1009 @@ +from core.abstract.character import CharacterProperty +from core.basic.equipment import EquEffect +from .register import register + + +def check_suit(char: CharacterProperty, suitId: int) -> bool: + return next((x for x in char.suitInfo if x.suitId == suitId), None) is not None + + +# region 潜影暗袭 + + +@register +def oath_skill_2010101(char: CharacterProperty): + pass + + +@register +def oath_skill_2010102(char: CharacterProperty): + pass + + +@register +def oath_skill_2010103(char: CharacterProperty): + pass + + +@register +def oath_skill_2010201(char: CharacterProperty): + pass + + +@register +def oath_skill_2010202(char: CharacterProperty): + pass + + +@register +def oath_skill_2010203(char: CharacterProperty): + pass + + +@register +def oath_skill_2010301(char: CharacterProperty): + pass + + +@register +def oath_skill_2010302(char: CharacterProperty): + pass + + +@register +def oath_skill_2010303(char: CharacterProperty): + pass + + +@register +def oath_skill_2010401(char: CharacterProperty): + pass + + +@register +def oath_skill_2010402(char: CharacterProperty): + pass + + +@register +def oath_skill_2010403(char: CharacterProperty): + pass + + +@register +def oath_skill_2010501(char: CharacterProperty): + pass + + +@register +def oath_skill_2010502(char: CharacterProperty): + pass + + +@register +def oath_skill_2010503(char: CharacterProperty): + pass + + +# endregion + + +# region 精灵国度 +@register +def oath_skill_2020101(char: CharacterProperty): + pass + + +@register +def oath_skill_2020102(char: CharacterProperty): + pass + + +@register +def oath_skill_2020103(char: CharacterProperty): + pass + + +@register +def oath_skill_2020201(char: CharacterProperty): + pass + + +@register +def oath_skill_2020202(char: CharacterProperty): + pass + + +@register +def oath_skill_2020203(char: CharacterProperty): + pass + + +@register +def oath_skill_2020301(char: CharacterProperty): + pass + + +@register +def oath_skill_2020302(char: CharacterProperty): + pass + + +@register +def oath_skill_2020303(char: CharacterProperty): + pass + + +@register +def oath_skill_2020401(char: CharacterProperty): + pass + + +@register +def oath_skill_2020402(char: CharacterProperty): + pass + + +@register +def oath_skill_2020403(char: CharacterProperty): + pass + + +@register +def oath_skill_2020501(char: CharacterProperty): + pass + + +@register +def oath_skill_2020502(char: CharacterProperty): + pass + + +@register +def oath_skill_2020503(char: CharacterProperty): + pass + + +# endregion + + +# region 理想之黄金乡 +@register +def oath_skill_2030101(char: CharacterProperty): + pass + + +@register +def oath_skill_2030102(char: CharacterProperty): + pass + + +@register +def oath_skill_2030103(char: CharacterProperty): + pass + + +@register +def oath_skill_2030201(char: CharacterProperty): + pass + + +@register +def oath_skill_2030202(char: CharacterProperty): + pass + + +@register +def oath_skill_2030203(char: CharacterProperty): + pass + + +@register +def oath_skill_2030301(char: CharacterProperty): + pass + + +@register +def oath_skill_2030302(char: CharacterProperty): + pass + + +@register +def oath_skill_2030303(char: CharacterProperty): + pass + + +@register +def oath_skill_2030401(char: CharacterProperty): + pass + + +@register +def oath_skill_2030402(char: CharacterProperty): + pass + + +@register +def oath_skill_2030403(char: CharacterProperty): + pass + + +@register +def oath_skill_2030501(char: CharacterProperty): + # 所有速度+7% + # 技能范围+14% + # 所受伤害-14% + + # 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 + # - 每+11,技能伤害+0.5%(最多可叠加12次) + # - 防具:每+5,所受伤害-0.5%(最多可叠加12次) + # - 首饰:每+3,技能范围+1%(最多可叠加12次) + # - 特殊装备:每+3,所有速度+1%(最多可叠加12次) + + # 穿戴[黄金乡:永恒国度]套装时,根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果: + # - 110以上:技能伤害+0.5% + # - 121以上:技能伤害+1.5% + # - 132以上:技能伤害+2.5%,赋予霸体,删除[淘金热] + char.SetStatus(SpeedA=0.07, SpeedM=0.07, SpeedR=0.07) + reinforce, reinforce_0, reinforce_1, reinforce_2 = char.GetReinforceSum() + char.SetStatus(SkillAttack=0.005 * min(reinforce_1 // 3, 12)) + char.SetStatus(SpeedA=0.01 * min(reinforce_2 // 3, 12)) + char.SetStatus(SpeedM=0.01 * min(reinforce_2 // 3, 12)) + char.SetStatus(SpeedR=0.01 * min(reinforce_2 // 3, 12)) + if check_suit(char, 16203): + print('穿戴黄金乡') + char.SetStatus(SkillRange=0.02 * min(reinforce // 11, 12)) + # char.SetStatus(DamageReduce=0.01 * min(reinforce_0 // 5, 7)) + char.SetStatus(SkillAttack=0.01 * min(reinforce_1 // 3, 12)) + char.SetStatus(SpeedA=0.02 * min(reinforce_2 // 3, 12)) + char.SetStatus(SpeedM=0.02 * min(reinforce_2 // 3, 12)) + char.SetStatus(SpeedR=0.02 * min(reinforce_2 // 3, 12)) + if char.buffer: + char.SetSkillCD(cd=0.02 * min(reinforce // 1, 12)) + if reinforce >= 110: + char.SetStatus(SkillAttack=0.02 * min((reinforce - 110) // 11, 2)) + if char.buffer: + char.SetStatus(Buffer=1500 * min((reinforce - 110) // 11, 2)) + # TODO + # 穿戴[黄金乡:永恒国度]套装时,根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果: + # - 110以上:技能伤害+0.5% + # - 121以上:技能伤害+1.5% + # - 132以上:技能伤害+2.5%,赋予霸体,删除[淘金热] + pass + + +@register +def oath_skill_2030502(char: CharacterProperty): + char.SetStatus(SkillAttack=0.132, SpeedA=0.22, SpeedM=0.22, SpeedR=0.22) + pass + + +@register +def oath_skill_2030503(char: CharacterProperty): + reinforce, reinforce_0, reinforce_1, reinforce_2 = char.GetReinforceSum() + if reinforce >= 121: + char.SetStatus(SkillAttack=0.1, SpeedA=0.3, SpeedM=0.3, SpeedR=0.3) + pass + + +# endregion + +# region 龙战八荒 + + +@register +def oath_skill_2040101(char: CharacterProperty): + pass + + +@register +def oath_skill_2040102(char: CharacterProperty): + pass + + +@register +def oath_skill_2040103(char: CharacterProperty): + pass + + +@register +def oath_skill_2040201(char: CharacterProperty): + pass + + +@register +def oath_skill_2040202(char: CharacterProperty): + pass + + +@register +def oath_skill_2040203(char: CharacterProperty): + pass + + +@register +def oath_skill_2040301(char: CharacterProperty): + pass + + +@register +def oath_skill_2040302(char: CharacterProperty): + pass + + +@register +def oath_skill_2040303(char: CharacterProperty): + pass + + +@register +def oath_skill_2040401(char: CharacterProperty): + pass + + +@register +def oath_skill_2040402(char: CharacterProperty): + pass + + +@register +def oath_skill_2040403(char: CharacterProperty): + pass + + +@register +def oath_skill_2040501(char: CharacterProperty): + pass + + +@register +def oath_skill_2040502(char: CharacterProperty): + pass + + +@register +def oath_skill_2040503(char: CharacterProperty): + pass + + +# endregion + +# region 暗黑净化 + + +@register +def oath_skill_2050101(char: CharacterProperty): + pass + + +@register +def oath_skill_2050102(char: CharacterProperty): + pass + + +@register +def oath_skill_2050103(char: CharacterProperty): + pass + + +@register +def oath_skill_2050201(char: CharacterProperty): + pass + + +@register +def oath_skill_2050202(char: CharacterProperty): + pass + + +@register +def oath_skill_2050203(char: CharacterProperty): + pass + + +@register +def oath_skill_2050301(char: CharacterProperty): + pass + + +@register +def oath_skill_2050302(char: CharacterProperty): + pass + + +@register +def oath_skill_2050303(char: CharacterProperty): + pass + + +@register +def oath_skill_2050401(char: CharacterProperty): + pass + + +@register +def oath_skill_2050402(char: CharacterProperty): + pass + + +@register +def oath_skill_2050403(char: CharacterProperty): + pass + + +@register +def oath_skill_2050501(char: CharacterProperty): + pass + + +@register +def oath_skill_2050502(char: CharacterProperty): + pass + + +@register +def oath_skill_2050503(char: CharacterProperty): + pass + + +# endregion + +# region 天命者的气运 + + +@register +def oath_skill_2060101(char: CharacterProperty): + pass + + +@register +def oath_skill_2060102(char: CharacterProperty): + pass + + +@register +def oath_skill_2060103(char: CharacterProperty): + pass + + +@register +def oath_skill_2060201(char: CharacterProperty): + pass + + +@register +def oath_skill_2060202(char: CharacterProperty): + pass + + +@register +def oath_skill_2060203(char: CharacterProperty): + pass + + +@register +def oath_skill_2060301(char: CharacterProperty): + pass + + +@register +def oath_skill_2060302(char: CharacterProperty): + pass + + +@register +def oath_skill_2060303(char: CharacterProperty): + pass + + +@register +def oath_skill_2060401(char: CharacterProperty): + pass + + +@register +def oath_skill_2060402(char: CharacterProperty): + pass + + +@register +def oath_skill_2060403(char: CharacterProperty): + pass + + +@register +def oath_skill_2060501(char: CharacterProperty): + pass + + +@register +def oath_skill_2060502(char: CharacterProperty): + pass + + +@register +def oath_skill_2060503(char: CharacterProperty): + pass + + +# endregion + +# region 究极能量 + + +@register +def oath_skill_2070101(char: CharacterProperty): + pass + + +@register +def oath_skill_2070102(char: CharacterProperty): + pass + + +@register +def oath_skill_2070103(char: CharacterProperty): + pass + + +@register +def oath_skill_2070201(char: CharacterProperty): + pass + + +@register +def oath_skill_2070202(char: CharacterProperty): + pass + + +@register +def oath_skill_2070203(char: CharacterProperty): + pass + + +@register +def oath_skill_2070301(char: CharacterProperty): + pass + + +@register +def oath_skill_2070302(char: CharacterProperty): + pass + + +@register +def oath_skill_2070303(char: CharacterProperty): + pass + + +@register +def oath_skill_2070401(char: CharacterProperty): + pass + + +@register +def oath_skill_2070402(char: CharacterProperty): + pass + + +@register +def oath_skill_2070403(char: CharacterProperty): + pass + + +@register +def oath_skill_2070501(char: CharacterProperty): + pass + + +@register +def oath_skill_2070502(char: CharacterProperty): + pass + + +@register +def oath_skill_2070503(char: CharacterProperty): + pass + + +# endregion + +# region 造化自然 + + +@register +def oath_skill_2080101(char: CharacterProperty): + pass + + +@register +def oath_skill_2080102(char: CharacterProperty): + pass + + +@register +def oath_skill_2080103(char: CharacterProperty): + pass + + +@register +def oath_skill_2080201(char: CharacterProperty): + pass + + +@register +def oath_skill_2080202(char: CharacterProperty): + pass + + +@register +def oath_skill_2080203(char: CharacterProperty): + pass + + +@register +def oath_skill_2080301(char: CharacterProperty): + pass + + +@register +def oath_skill_2080302(char: CharacterProperty): + pass + + +@register +def oath_skill_2080303(char: CharacterProperty): + pass + + +@register +def oath_skill_2080401(char: CharacterProperty): + pass + + +@register +def oath_skill_2080402(char: CharacterProperty): + pass + + +@register +def oath_skill_2080403(char: CharacterProperty): + pass + + +@register +def oath_skill_2080501(char: CharacterProperty): + pass + + +@register +def oath_skill_2080502(char: CharacterProperty): + pass + + +@register +def oath_skill_2080503(char: CharacterProperty): + pass + + +# endregion + +# region 诸神黄昏之女武神 + + +@register +def oath_skill_2090101(char: CharacterProperty): + pass + + +@register +def oath_skill_2090102(char: CharacterProperty): + pass + + +@register +def oath_skill_2090103(char: CharacterProperty): + pass + + +@register +def oath_skill_2090201(char: CharacterProperty): + pass + + +@register +def oath_skill_2090202(char: CharacterProperty): + pass + + +@register +def oath_skill_2090203(char: CharacterProperty): + pass + + +@register +def oath_skill_2090301(char: CharacterProperty): + pass + + +@register +def oath_skill_2090302(char: CharacterProperty): + pass + + +@register +def oath_skill_2090303(char: CharacterProperty): + pass + + +@register +def oath_skill_2090401(char: CharacterProperty): + pass + + +@register +def oath_skill_2090402(char: CharacterProperty): + pass + + +@register +def oath_skill_2090403(char: CharacterProperty): + pass + + +@register +def oath_skill_2090501(char: CharacterProperty): + pass + + +@register +def oath_skill_2090502(char: CharacterProperty): + pass + + +@register +def oath_skill_2090503(char: CharacterProperty): + pass + + +# endregion + +# region 青丘灵珠 + + +@register +def oath_skill_2100101(char: CharacterProperty): + pass + + +@register +def oath_skill_2100102(char: CharacterProperty): + pass + + +@register +def oath_skill_2100103(char: CharacterProperty): + pass + + +@register +def oath_skill_2100201(char: CharacterProperty): + pass + + +@register +def oath_skill_2100202(char: CharacterProperty): + pass + + +@register +def oath_skill_2100203(char: CharacterProperty): + pass + + +@register +def oath_skill_2100301(char: CharacterProperty): + pass + + +@register +def oath_skill_2100302(char: CharacterProperty): + pass + + +@register +def oath_skill_2100303(char: CharacterProperty): + pass + + +@register +def oath_skill_2100401(char: CharacterProperty): + pass + + +@register +def oath_skill_2100402(char: CharacterProperty): + pass + + +@register +def oath_skill_2100403(char: CharacterProperty): + pass + + +@register +def oath_skill_2100501(char: CharacterProperty): + pass + + +@register +def oath_skill_2100502(char: CharacterProperty): + pass + + +@register +def oath_skill_2100503(char: CharacterProperty): + pass + + +# endregion + +# region 群猎美学 + + +@register +def oath_skill_2110101(char: CharacterProperty): + pass + + +@register +def oath_skill_2110102(char: CharacterProperty): + pass + + +@register +def oath_skill_2110103(char: CharacterProperty): + pass + + +@register +def oath_skill_2110201(char: CharacterProperty): + pass + + +@register +def oath_skill_2110202(char: CharacterProperty): + pass + + +@register +def oath_skill_2110203(char: CharacterProperty): + pass + + +@register +def oath_skill_2110301(char: CharacterProperty): + pass + + +@register +def oath_skill_2110302(char: CharacterProperty): + pass + + +@register +def oath_skill_2110303(char: CharacterProperty): + pass + + +@register +def oath_skill_2110401(char: CharacterProperty): + pass + + +@register +def oath_skill_2110402(char: CharacterProperty): + pass + + +@register +def oath_skill_2110403(char: CharacterProperty): + pass + + +@register +def oath_skill_2110501(char: CharacterProperty): + pass + + +@register +def oath_skill_2110502(char: CharacterProperty): + pass + + +@register +def oath_skill_2110503(char: CharacterProperty): + pass + + +# endregion + +# region 冥思者的魔力领域 + + +@register +def oath_skill_2120101(char: CharacterProperty): + pass + + +@register +def oath_skill_2120102(char: CharacterProperty): + pass + + +@register +def oath_skill_2120103(char: CharacterProperty): + pass + + +@register +def oath_skill_2120201(char: CharacterProperty): + pass + + +@register +def oath_skill_2120202(char: CharacterProperty): + pass + + +@register +def oath_skill_2120203(char: CharacterProperty): + pass + + +@register +def oath_skill_2120301(char: CharacterProperty): + pass + + +@register +def oath_skill_2120302(char: CharacterProperty): + pass + + +@register +def oath_skill_2120303(char: CharacterProperty): + pass + + +@register +def oath_skill_2120401(char: CharacterProperty): + pass + + +@register +def oath_skill_2120402(char: CharacterProperty): + pass + + +@register +def oath_skill_2120403(char: CharacterProperty): + pass + + +@register +def oath_skill_2120501(char: CharacterProperty): + pass + + +@register +def oath_skill_2120502(char: CharacterProperty): + pass + + +@register +def oath_skill_2120503(char: CharacterProperty): + pass + + +# endregion diff --git a/backend/core/equipment/version_0/suit.py b/backend/core/equipment/version_0/suit.py index 3adebbad..42250c26 100644 --- a/backend/core/equipment/version_0/suit.py +++ b/backend/core/equipment/version_0/suit.py @@ -14,42 +14,6 @@ def suit_1(char: CharacterProperty): pass -@register -def suit_2(char: CharacterProperty): - # DCALC_REMOVE: suit_2 - 潜影之初心 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_3(char: CharacterProperty): - # DCALC_REMOVE: suit_3 - 潜影之初心 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_4(char: CharacterProperty): - # DCALC_REMOVE: suit_4 - 潜影之初心 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_5(char: CharacterProperty): - # DCALC_REMOVE: suit_5 - 潜影之初心 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_6(char: CharacterProperty): # DCALC_REMOVE: suit_6 - 潜影之藏锋 @@ -59,42 +23,6 @@ def suit_6(char: CharacterProperty): pass -@register -def suit_7(char: CharacterProperty): - # DCALC_REMOVE: suit_7 - 潜影之藏锋 - # level: 2 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 [潜影藏锋][装备主动技能] - 强制中断角色动作(觉醒技能除外) - 冷却时间5秒 - # rarity: 神器 - pass - - -@register -def suit_8(char: CharacterProperty): - # DCALC_REMOVE: suit_8 - 潜影之藏锋 - # level: 3 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 [潜影藏锋][装备主动技能] - 强制中断角色动作(觉醒技能除外) - 冷却时间5秒 - # rarity: 神器 - pass - - -@register -def suit_9(char: CharacterProperty): - # DCALC_REMOVE: suit_9 - 潜影之藏锋 - # level: 4 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 [潜影藏锋][装备主动技能] - 强制中断角色动作(觉醒技能除外) - 冷却时间5秒 - # rarity: 神器 - pass - - -@register -def suit_10(char: CharacterProperty): - # DCALC_REMOVE: suit_10 - 潜影之藏锋 - # level: 5 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 [潜影藏锋][装备主动技能] - 强制中断角色动作(觉醒技能除外) - 冷却时间5秒 - # rarity: 神器 - pass - - @register def suit_11(char: CharacterProperty): # DCALC_REMOVE: suit_11 - 潜影之伏击 @@ -105,46 +33,6 @@ def suit_11(char: CharacterProperty): pass -@register -def suit_12(char: CharacterProperty): - # DCALC_REMOVE: suit_12 - 潜影之伏击 - # level: 2 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能]存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗3个[影子]层数 - 强制中断角色动作(觉醒技能除外) - # rarity: 传说 - suit_11(char) - pass - - -@register -def suit_13(char: CharacterProperty): - # DCALC_REMOVE: suit_13 - 潜影之伏击 - # level: 3 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能]存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗3个[影子]层数 - 强制中断角色动作(觉醒技能除外) - # rarity: 传说 - suit_11(char) - pass - - -@register -def suit_14(char: CharacterProperty): - # DCALC_REMOVE: suit_14 - 潜影之伏击 - # level: 4 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能]存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗3个[影子]层数 - 强制中断角色动作(觉醒技能除外) - # rarity: 传说 - suit_11(char) - pass - - -@register -def suit_15(char: CharacterProperty): - # DCALC_REMOVE: suit_15 - 潜影之伏击 - # level: 5 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能]存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗3个[影子]层数 - 强制中断角色动作(觉醒技能除外) - # rarity: 传说 - suit_11(char) - pass - - @register def suit_16(char: CharacterProperty): # DCALC_REMOVE: suit_16 - 潜影之灭迹 @@ -155,46 +43,6 @@ def suit_16(char: CharacterProperty): pass -@register -def suit_17(char: CharacterProperty): - # DCALC_REMOVE: suit_17 - 潜影之灭迹 - # level: 2 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能] 存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗2个[影子]层数 - 强制中断角色动作(觉醒技能除外) [追击替罪羊][装备主动技能] - 消耗7个[影子]层数 - 强制中断角色动作(觉醒技能除外) - 瞬移到最强大的敌人背后 - 追击范围:600px - 冷却时间:8秒 - # rarity: 史诗 - suit_11(char) - pass - - -@register -def suit_18(char: CharacterProperty): - # DCALC_REMOVE: suit_18 - 潜影之灭迹 - # level: 3 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能] 存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗2个[影子]层数 - 强制中断角色动作(觉醒技能除外) [追击替罪羊][装备主动技能] - 消耗7个[影子]层数 - 强制中断角色动作(觉醒技能除外) - 瞬移到最强大的敌人背后 - 追击范围:600px - 冷却时间:8秒 - # rarity: 史诗 - suit_11(char) - pass - - -@register -def suit_19(char: CharacterProperty): - # DCALC_REMOVE: suit_19 - 潜影之灭迹 - # level: 4 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能] 存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗2个[影子]层数 - 强制中断角色动作(觉醒技能除外) [追击替罪羊][装备主动技能] - 消耗7个[影子]层数 - 强制中断角色动作(觉醒技能除外) - 瞬移到最强大的敌人背后 - 追击范围:600px - 冷却时间:8秒 - # rarity: 史诗 - suit_11(char) - pass - - -@register -def suit_20(char: CharacterProperty): - # DCALC_REMOVE: suit_20 - 潜影之灭迹 - # level: 5 - # value: 逆转与影子的因果关系,实现超乎寻常的动作。 施放技能时,获得[影子]层数。(最多叠加10次) 所有速度 +15% [潜影灭迹][装备主动技能] 存在[影子]层数时,施放装备技能时发动以下效果。 - 消耗2个[影子]层数 - 强制中断角色动作(觉醒技能除外) [追击替罪羊][装备主动技能] - 消耗7个[影子]层数 - 强制中断角色动作(觉醒技能除外) - 瞬移到最强大的敌人背后 - 追击范围:600px - 冷却时间:8秒 - # rarity: 史诗 - suit_11(char) - pass - - @register def suit_21(char: CharacterProperty): # DCALC_REMOVE: suit_21 - 潜影之幽冥代理 @@ -218,42 +66,6 @@ def suit_22(char: CharacterProperty): pass -@register -def suit_23(char: CharacterProperty): - # DCALC_REMOVE: suit_23 - 精灵元气 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_24(char: CharacterProperty): - # DCALC_REMOVE: suit_24 - 精灵元气 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_25(char: CharacterProperty): - # DCALC_REMOVE: suit_25 - 精灵元气 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_26(char: CharacterProperty): - # DCALC_REMOVE: suit_26 - 精灵元气 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_27(char: CharacterProperty): # DCALC_REMOVE: suit_27 - 初阶精灵 @@ -264,46 +76,6 @@ def suit_27(char: CharacterProperty): pass -@register -def suit_28(char: CharacterProperty): - # DCALC_REMOVE: suit_28 - 初阶精灵 - # level: 2 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 - # rarity: 神器 - suit_27(char) - pass - - -@register -def suit_29(char: CharacterProperty): - # DCALC_REMOVE: suit_29 - 初阶精灵 - # level: 3 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 - # rarity: 神器 - suit_27(char) - pass - - -@register -def suit_30(char: CharacterProperty): - # DCALC_REMOVE: suit_30 - 初阶精灵 - # level: 4 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 - # rarity: 神器 - suit_27(char) - pass - - -@register -def suit_31(char: CharacterProperty): - # DCALC_REMOVE: suit_31 - 初阶精灵 - # level: 5 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 - # rarity: 神器 - suit_27(char) - pass - - @register def suit_32(char: CharacterProperty): # DCALC_REMOVE: suit_32 - 高阶精灵 @@ -316,46 +88,6 @@ def suit_32(char: CharacterProperty): pass -@register -def suit_33(char: CharacterProperty): - # DCALC_REMOVE: suit_33 - 高阶精灵 - # level: 2 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [停止攻击开关][装备主动技能]控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:102700% - # rarity: 传说 - suit_32(char) - pass - - -@register -def suit_34(char: CharacterProperty): - # DCALC_REMOVE: suit_34 - 高阶精灵 - # level: 3 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [停止攻击开关][装备主动技能]控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:102700% - # rarity: 传说 - suit_32(char) - pass - - -@register -def suit_35(char: CharacterProperty): - # DCALC_REMOVE: suit_35 - 高阶精灵 - # level: 4 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [停止攻击开关][装备主动技能]控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:102700% - # rarity: 传说 - suit_32(char) - pass - - -@register -def suit_36(char: CharacterProperty): - # DCALC_REMOVE: suit_36 - 高阶精灵 - # level: 5 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [停止攻击开关][装备主动技能]控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:102700% - # rarity: 传说 - suit_32(char) - pass - - @register def suit_37(char: CharacterProperty): # DCALC_REMOVE: suit_37 - 贵族精灵 @@ -370,46 +102,6 @@ def suit_37(char: CharacterProperty): pass -@register -def suit_38(char: CharacterProperty): - # DCALC_REMOVE: suit_38 - 贵族精灵 - # level: 2 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [风灵希尔珂] 每2秒施放一次刀风:伤害量20,500% 移动速度 +15% [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:158200% - # rarity: 史诗 - suit_37(char) - pass - - -@register -def suit_39(char: CharacterProperty): - # DCALC_REMOVE: suit_39 - 贵族精灵 - # level: 3 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [风灵希尔珂] 每2秒施放一次刀风:伤害量20,500% 移动速度 +15% [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:158200% - # rarity: 史诗 - suit_37(char) - pass - - -@register -def suit_40(char: CharacterProperty): - # DCALC_REMOVE: suit_40 - 贵族精灵 - # level: 4 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [风灵希尔珂] 每2秒施放一次刀风:伤害量20,500% 移动速度 +15% [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:158200% - # rarity: 史诗 - suit_37(char) - pass - - -@register -def suit_41(char: CharacterProperty): - # DCALC_REMOVE: suit_41 - 贵族精灵 - # level: 5 - # value: 召唤精灵一起战斗。 [火灵安珀] 每2秒施放一次火花:伤害量19,200% 每3秒恢复1%的生命值 [水灵阿库娅] 每3秒施放一次水弹:伤害量24,000% 每3秒恢复1%的魔法值 [风灵希尔珂] 每2秒施放一次刀风:伤害量20,500% 移动速度 +15% [停止攻击开关][装备主动技能] 控制精灵们的攻击。 - 攻击中止/继续攻击 - 冷却时间1秒 [元素释放][装备主动技能] 对精灵下达协同攻击指令。 - 消耗150精灵之魂 - 攻击时,精灵之魂 +10(冷却时间1秒) - 被击时,精灵之魂 -5(冷却时间1秒) - 元素释放伤害量:158200% - # rarity: 史诗 - suit_37(char) - pass - - @register def suit_42(char: CharacterProperty): # DCALC_REMOVE: suit_42 - 皇室精灵 @@ -438,69 +130,13 @@ def suit_43(char: CharacterProperty): pass -@register -def suit_44(char: CharacterProperty): - # DCALC_REMOVE: suit_44 - 黄金乡 : 雏形 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_45(char: CharacterProperty): - # DCALC_REMOVE: suit_45 - 黄金乡 : 雏形 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_46(char: CharacterProperty): - # DCALC_REMOVE: suit_46 - 黄金乡 : 雏形 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_47(char: CharacterProperty): - # DCALC_REMOVE: suit_47 - 黄金乡 : 雏形 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_48(char: CharacterProperty): # DCALC_REMOVE: suit_48 - 黄金乡 : 构想 # level: 1 # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加7次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加7次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加7次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加7次) # rarity: 神器 - reinforce_0 = 0 - """防具""" - reinforce_1 = 0 - """首饰""" - reinforce_2 = 0 - """特殊装备""" - reinforce_3 = 0 - """武器""" - for part in char.charEquipInfo.keys(): - if char.charEquipInfo[part] is None: - continue - num = char.charEquipInfo[part].reinforce - # if part == '武器': - # reinforce_3 += num - if part in ['上衣', '头肩', '下装', '腰带', '鞋']: - reinforce_0 += num - if part in ['手镯', '项链', '戒指']: - reinforce_1 += num - if part in ['耳环', '辅助装备', '魔法石']: - reinforce_2 += num - reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 + reinforce, reinforce_0, reinforce_1, reinforce_2 = char.GetReinforceSum() char.SetStatus(SkillRange=0.02 * min(reinforce // 11, 7)) # char.SetStatus(DamageReduce=0.01 * min(reinforce_0 // 5, 7)) char.SetStatus(SkillAttack=0.01 * min(reinforce_1 // 3, 7)) @@ -510,73 +146,13 @@ def suit_48(char: CharacterProperty): pass -@register -def suit_49(char: CharacterProperty): - # DCALC_REMOVE: suit_49 - 黄金乡 : 构想 - # level: 2 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加7次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加7次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加7次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加7次) - # rarity: 神器 - suit_48(char) - pass - - -@register -def suit_50(char: CharacterProperty): - # DCALC_REMOVE: suit_50 - 黄金乡 : 构想 - # level: 3 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加7次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加7次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加7次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加7次) - # rarity: 神器 - suit_48(char) - pass - - -@register -def suit_51(char: CharacterProperty): - # DCALC_REMOVE: suit_51 - 黄金乡 : 构想 - # level: 4 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加7次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加7次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加7次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加7次) - # rarity: 神器 - suit_48(char) - pass - - -@register -def suit_52(char: CharacterProperty): - # DCALC_REMOVE: suit_52 - 黄金乡 : 构想 - # level: 5 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加7次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加7次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加7次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加7次) - # rarity: 神器 - suit_48(char) - pass - - @register def suit_53(char: CharacterProperty): # DCALC_REMOVE: suit_53 - 黄金乡 : 梦想成真 # level: 1 # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) # rarity: 传说 - reinforce_0 = 0 - """防具""" - reinforce_1 = 0 - """首饰""" - reinforce_2 = 0 - """特殊装备""" - reinforce_3 = 0 - """武器""" - for part in char.charEquipInfo.keys(): - if char.charEquipInfo[part] is None: - continue - num = char.charEquipInfo[part].reinforce - # if part == '武器': - # reinforce_3 += num - if part in ['上衣', '头肩', '下装', '腰带', '鞋']: - reinforce_0 += num - if part in ['手镯', '项链', '戒指']: - reinforce_1 += num - if part in ['耳环', '辅助装备', '魔法石']: - reinforce_2 += num - reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 + reinforce, reinforce_0, reinforce_1, reinforce_2 = char.GetReinforceSum() char.SetStatus(SkillRange=0.02 * min(reinforce // 11, 12)) # char.SetStatus(DamageReduce=0.01 * min(reinforce_0 // 5, 7)) char.SetStatus(SkillAttack=0.01 * min(reinforce_1 // 3, 12)) @@ -589,73 +165,13 @@ def suit_53(char: CharacterProperty): pass -@register -def suit_54(char: CharacterProperty): - # DCALC_REMOVE: suit_54 - 黄金乡 : 梦想成真 - # level: 2 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) - # rarity: 传说 - suit_53(char) - pass - - -@register -def suit_55(char: CharacterProperty): - # DCALC_REMOVE: suit_55 - 黄金乡 : 梦想成真 - # level: 3 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) - # rarity: 传说 - suit_53(char) - pass - - -@register -def suit_56(char: CharacterProperty): - # DCALC_REMOVE: suit_56 - 黄金乡 : 梦想成真 - # level: 4 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) - # rarity: 传说 - suit_53(char) - pass - - -@register -def suit_57(char: CharacterProperty): - # DCALC_REMOVE: suit_57 - 黄金乡 : 梦想成真 - # level: 5 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) - # rarity: 传说 - suit_53(char) - pass - - @register def suit_58(char: CharacterProperty): # DCALC_REMOVE: suit_58 - 黄金乡 : 璀璨理想 # level: 1 # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 超过110时,每11点,技能伤害 +2%(最多叠加2次) - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害-1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) [淘银热] 根据防具/首饰/特殊装备的强化/增幅数值总和,降落相应数量的银币进行攻击(冷却时间10秒) * 银币伤害量信息 - 低于88:17000% - 88~109:18700% - 110~131:21250% - 132以上:25500% # rarity: 史诗 - reinforce_0 = 0 - """防具""" - reinforce_1 = 0 - """首饰""" - reinforce_2 = 0 - """特殊装备""" - reinforce_3 = 0 - """武器""" - for part in char.charEquipInfo.keys(): - if char.charEquipInfo is None: - continue - num = char.charEquipInfo[part].reinforce - # if part == '武器': - # reinforce_3 += num - if part in ['上衣', '头肩', '下装', '腰带', '鞋']: - reinforce_0 += num - if part in ['手镯', '项链', '戒指']: - reinforce_1 += num - if part in ['耳环', '辅助装备', '魔法石']: - reinforce_2 += num - reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 + reinforce, reinforce_0, reinforce_1, reinforce_2 = char.GetReinforceSum() char.SetStatus(SkillRange=0.02 * min(reinforce // 11, 12)) # char.SetStatus(DamageReduce=0.01 * min(reinforce_0 // 5, 7)) char.SetStatus(SkillAttack=0.01 * min(reinforce_1 // 3, 12)) @@ -683,73 +199,13 @@ def suit_58(char: CharacterProperty): pass -@register -def suit_59(char: CharacterProperty): - # DCALC_REMOVE: suit_59 - 黄金乡 : 璀璨理想 - # level: 2 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 超过110时,每11点,技能伤害 +2%(最多叠加2次) - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害-1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) [淘银热] 根据防具/首饰/特殊装备的强化/增幅数值总和,降落相应数量的银币进行攻击(冷却时间10秒) * 银币伤害量信息 - 低于88:17000% - 88~109:18700% - 110~131:21250% - 132以上:25500% - # rarity: 史诗 - suit_58(char) - pass - - -@register -def suit_60(char: CharacterProperty): - # DCALC_REMOVE: suit_60 - 黄金乡 : 璀璨理想 - # level: 3 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 超过110时,每11点,技能伤害 +2%(最多叠加2次) - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害-1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) [淘银热] 根据防具/首饰/特殊装备的强化/增幅数值总和,降落相应数量的银币进行攻击(冷却时间10秒) * 银币伤害量信息 - 低于88:17000% - 88~109:18700% - 110~131:21250% - 132以上:25500% - # rarity: 史诗 - suit_58(char) - pass - - -@register -def suit_61(char: CharacterProperty): - # DCALC_REMOVE: suit_61 - 黄金乡 : 璀璨理想 - # level: 4 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 超过110时,每11点,技能伤害 +2%(最多叠加2次) - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害-1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) [淘银热] 根据防具/首饰/特殊装备的强化/增幅数值总和,降落相应数量的银币进行攻击(冷却时间10秒) * 银币伤害量信息 - 低于88:17000% - 88~109:18700% - 110~131:21250% - 132以上:25500% - # rarity: 史诗 - suit_58(char) - pass - - -@register -def suit_62(char: CharacterProperty): - # DCALC_REMOVE: suit_62 - 黄金乡 : 璀璨理想 - # level: 5 - # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 超过110时,每11点,技能伤害 +2%(最多叠加2次) - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害-1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2% (最多叠加12次) [淘银热] 根据防具/首饰/特殊装备的强化/增幅数值总和,降落相应数量的银币进行攻击(冷却时间10秒) * 银币伤害量信息 - 低于88:17000% - 88~109:18700% - 110~131:21250% - 132以上:25500% - # rarity: 史诗 - suit_58(char) - pass - - @register def suit_63(char: CharacterProperty): # DCALC_REMOVE: suit_63 - 黄金乡 : 永恒国度 # level: 1 # value: 根据装备的强化/增幅数值,发动额外的能力。 根据防具/首饰/特殊装备的强化/增幅数值总和,适用以下效果。 - 超过110时,每11点,技能伤害 +2%(最多叠加2次) - 数值总和每达到+11时,技能范围 +2% (最多叠加12次) - 防具:数值每达到+5,所受物理/魔法伤害 -1% (最多叠加12次) - 首饰:数值每达到+3,技能伤害 +1% (最多叠加12次) - 特殊装备:数值每达到+3,所有速度 +2%(最多叠加12次) [淘银热] 根据防具/首饰/特殊装备的强化/增幅数值总和,降落相应数量的银币进行攻击(冷却时间10秒) * 银币伤害量信息 - 低于88:17000% - 88~109:18700% - 110~131:21250% - 132以上:25500% [太初的记忆] 套装积分达到2550后,每增加70点套装积分,可以获得以下效果。 - 技能伤害 增加 1% - 增益量 +100 # rarity: 太初 - reinforce_0 = 0 - """防具""" - reinforce_1 = 0 - """首饰""" - reinforce_2 = 0 - """特殊装备""" - reinforce_3 = 0 - """武器""" - for part in char.charEquipInfo.keys(): - if char.charEquipInfo[part] is None: - continue - num = char.charEquipInfo[part].reinforce - # if part == '武器': - # reinforce_3 += num - if part in ['上衣', '头肩', '下装', '腰带', '鞋']: - reinforce_0 += num - if part in ['手镯', '项链', '戒指']: - reinforce_1 += num - if part in ['耳环', '辅助装备', '魔法石']: - reinforce_2 += num - reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 + reinforce, reinforce_0, reinforce_1, reinforce_2 = char.GetReinforceSum() char.SetStatus(SkillRange=0.02 * min(reinforce // 11, 12)) # char.SetStatus(DamageReduce=0.01 * min(reinforce_0 // 5, 7)) char.SetStatus(SkillAttack=0.01 * min(reinforce_1 // 3, 12)) @@ -790,42 +246,6 @@ def suit_64(char: CharacterProperty): pass -@register -def suit_65(char: CharacterProperty): - # DCALC_REMOVE: suit_65 - 蒙昧未觉之螭龙 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_66(char: CharacterProperty): - # DCALC_REMOVE: suit_66 - 蒙昧未觉之螭龙 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_67(char: CharacterProperty): - # DCALC_REMOVE: suit_67 - 蒙昧未觉之螭龙 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_68(char: CharacterProperty): - # DCALC_REMOVE: suit_68 - 蒙昧未觉之螭龙 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_69(char: CharacterProperty): # DCALC_REMOVE: suit_69 - 鸿蒙初开之虬龙 @@ -836,46 +256,6 @@ def suit_69(char: CharacterProperty): pass -@register -def suit_70(char: CharacterProperty): - # DCALC_REMOVE: suit_70 - 鸿蒙初开之虬龙 - # level: 2 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少1个。 - 不会减少到少于1个 所有速度 +10% - # rarity: 神器 - suit_69(char) - pass - - -@register -def suit_71(char: CharacterProperty): - # DCALC_REMOVE: suit_71 - 鸿蒙初开之虬龙 - # level: 3 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少1个。 - 不会减少到少于1个 所有速度 +10% - # rarity: 神器 - suit_69(char) - pass - - -@register -def suit_72(char: CharacterProperty): - # DCALC_REMOVE: suit_72 - 鸿蒙初开之虬龙 - # level: 4 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少1个。 - 不会减少到少于1个 所有速度 +10% - # rarity: 神器 - suit_69(char) - pass - - -@register -def suit_73(char: CharacterProperty): - # DCALC_REMOVE: suit_73 - 鸿蒙初开之虬龙 - # level: 5 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少1个。 - 不会减少到少于1个 所有速度 +10% - # rarity: 神器 - suit_69(char) - pass - - @register def suit_74(char: CharacterProperty): # DCALC_REMOVE: suit_74 - 鸡鸣拂晓之蛟龙 @@ -887,46 +267,6 @@ def suit_74(char: CharacterProperty): pass -@register -def suit_75(char: CharacterProperty): - # DCALC_REMOVE: suit_75 - 鸡鸣拂晓之蛟龙 - # level: 2 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少2个。 - 不会减少到少于1个 所有速度 +10% [蛟龙腾霄] 攻击时,蛟龙腾霄。 (冷却时间10秒) * 蛟龙腾霄伤害量:14,400% - # rarity: 传说 - suit_74(char) - pass - - -@register -def suit_76(char: CharacterProperty): - # DCALC_REMOVE: suit_76 - 鸡鸣拂晓之蛟龙 - # level: 3 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少2个。 - 不会减少到少于1个 所有速度 +10% [蛟龙腾霄] 攻击时,蛟龙腾霄。 (冷却时间10秒) * 蛟龙腾霄伤害量:14,400% - # rarity: 传说 - suit_74(char) - pass - - -@register -def suit_77(char: CharacterProperty): - # DCALC_REMOVE: suit_77 - 鸡鸣拂晓之蛟龙 - # level: 4 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少2个。 - 不会减少到少于1个 所有速度 +10% [蛟龙腾霄] 攻击时,蛟龙腾霄。 (冷却时间10秒) * 蛟龙腾霄伤害量:14,400% - # rarity: 传说 - suit_74(char) - pass - - -@register -def suit_78(char: CharacterProperty): - # DCALC_REMOVE: suit_78 - 鸡鸣拂晓之蛟龙 - # level: 5 - # value: 通过释放龙之力来增强自己。 [虬龙之火] 无色小晶块消耗量减少2个。 - 不会减少到少于1个 所有速度 +10% [蛟龙腾霄] 攻击时,蛟龙腾霄。 (冷却时间10秒) * 蛟龙腾霄伤害量:14,400% - # rarity: 传说 - suit_74(char) - pass - - @register def suit_79(char: CharacterProperty): # DCALC_REMOVE: suit_79 - 朝露晨辉之烛龙 @@ -948,46 +288,6 @@ def suit_79(char: CharacterProperty): pass -@register -def suit_80(char: CharacterProperty): - # DCALC_REMOVE: suit_80 - 朝露晨辉之烛龙 - # level: 2 - # value: 通过释放龙之力来增强自己。 [烛龙之火] 无色小晶块消耗量减少3个。 - 不会减少到少于1个 所有速度 +10% [烛龙腾霄] 攻击时,烛龙腾霄。(冷却时间10秒) * 烛龙腾霄伤害量:14,400% [荧惑如意珠][装备主动技能] 将[烛龙之火]变更为[烛龙的如意珠],效果持续30秒。 - 冷却时间60秒 [烛龙的如意珠] - 所有速度 +30% - 技能伤害 +3% - 无色小晶块技能的消耗量固定30个 - 施放消耗无色小晶块的技能时,发动白龙强袭(冷却时间3秒) * 白龙强袭伤害量:10980% - # rarity: 史诗 - suit_79(char) - pass - - -@register -def suit_81(char: CharacterProperty): - # DCALC_REMOVE: suit_81 - 朝露晨辉之烛龙 - # level: 3 - # value: 通过释放龙之力来增强自己。 [烛龙之火] 无色小晶块消耗量减少3个。 - 不会减少到少于1个 所有速度 +10% [烛龙腾霄] 攻击时,烛龙腾霄。(冷却时间10秒) * 烛龙腾霄伤害量:14,400% [荧惑如意珠][装备主动技能] 将[烛龙之火]变更为[烛龙的如意珠],效果持续30秒。 - 冷却时间60秒 [烛龙的如意珠] - 所有速度 +30% - 技能伤害 +3% - 无色小晶块技能的消耗量固定30个 - 施放消耗无色小晶块的技能时,发动白龙强袭(冷却时间3秒) * 白龙强袭伤害量:10980% - # rarity: 史诗 - suit_79(char) - pass - - -@register -def suit_82(char: CharacterProperty): - # DCALC_REMOVE: suit_82 - 朝露晨辉之烛龙 - # level: 4 - # value: 通过释放龙之力来增强自己。 [烛龙之火] 无色小晶块消耗量减少3个。 - 不会减少到少于1个 所有速度 +10% [烛龙腾霄] 攻击时,烛龙腾霄。(冷却时间10秒) * 烛龙腾霄伤害量:14,400% [荧惑如意珠][装备主动技能] 将[烛龙之火]变更为[烛龙的如意珠],效果持续30秒。 - 冷却时间60秒 [烛龙的如意珠] - 所有速度 +30% - 技能伤害 +3% - 无色小晶块技能的消耗量固定30个 - 施放消耗无色小晶块的技能时,发动白龙强袭(冷却时间3秒) * 白龙强袭伤害量:10980% - # rarity: 史诗 - suit_79(char) - pass - - -@register -def suit_83(char: CharacterProperty): - # DCALC_REMOVE: suit_83 - 朝露晨辉之烛龙 - # level: 5 - # value: 通过释放龙之力来增强自己。 [烛龙之火] 无色小晶块消耗量减少3个。 - 不会减少到少于1个 所有速度 +10% [烛龙腾霄] 攻击时,烛龙腾霄。(冷却时间10秒) * 烛龙腾霄伤害量:14,400% [荧惑如意珠][装备主动技能] 将[烛龙之火]变更为[烛龙的如意珠],效果持续30秒。 - 冷却时间60秒 [烛龙的如意珠] - 所有速度 +30% - 技能伤害 +3% - 无色小晶块技能的消耗量固定30个 - 施放消耗无色小晶块的技能时,发动白龙强袭(冷却时间3秒) * 白龙强袭伤害量:10980% - # rarity: 史诗 - suit_79(char) - pass - - @register def suit_84(char: CharacterProperty): # DCALC_REMOVE: suit_84 - 明光耀世之应龙 @@ -1019,42 +319,6 @@ def suit_85(char: CharacterProperty): pass -@register -def suit_86(char: CharacterProperty): - # DCALC_REMOVE: suit_86 - 混沌净化:初始 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_87(char: CharacterProperty): - # DCALC_REMOVE: suit_87 - 混沌净化:初始 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_88(char: CharacterProperty): - # DCALC_REMOVE: suit_88 - 混沌净化:初始 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_89(char: CharacterProperty): - # DCALC_REMOVE: suit_89 - 混沌净化:初始 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_90(char: CharacterProperty): # DCALC_REMOVE: suit_90 - 混沌净化:挣扎 @@ -1066,46 +330,6 @@ def suit_90(char: CharacterProperty): pass -@register -def suit_91(char: CharacterProperty): - # DCALC_REMOVE: suit_91 - 混沌净化:挣扎 - # level: 2 - # value: [净化] - 技能冷却时间 -30.0%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - # rarity: 神器 - suit_90(char) - pass - - -@register -def suit_92(char: CharacterProperty): - # DCALC_REMOVE: suit_92 - 混沌净化:挣扎 - # level: 3 - # value: [净化] - 技能冷却时间 -30.0%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - # rarity: 神器 - suit_90(char) - pass - - -@register -def suit_93(char: CharacterProperty): - # DCALC_REMOVE: suit_93 - 混沌净化:挣扎 - # level: 4 - # value: [净化] - 技能冷却时间 -30.0%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - # rarity: 神器 - suit_90(char) - pass - - -@register -def suit_94(char: CharacterProperty): - # DCALC_REMOVE: suit_94 - 混沌净化:挣扎 - # level: 5 - # value: [净化] - 技能冷却时间 -30.0%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - # rarity: 神器 - suit_90(char) - pass - - @register def suit_95(char: CharacterProperty): # DCALC_REMOVE: suit_95 - 混沌净化:失衡 @@ -1122,46 +346,6 @@ def suit_95(char: CharacterProperty): pass -@register -def suit_96(char: CharacterProperty): - # DCALC_REMOVE: suit_96 - 混沌净化:失衡 - # level: 2 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - # rarity: 传说 - suit_95(char) - pass - - -@register -def suit_97(char: CharacterProperty): - # DCALC_REMOVE: suit_97 - 混沌净化:失衡 - # level: 3 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - # rarity: 传说 - suit_95(char) - pass - - -@register -def suit_98(char: CharacterProperty): - # DCALC_REMOVE: suit_98 - 混沌净化:失衡 - # level: 4 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - # rarity: 传说 - suit_95(char) - pass - - -@register -def suit_99(char: CharacterProperty): - # DCALC_REMOVE: suit_99 - 混沌净化:失衡 - # level: 5 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - # rarity: 传说 - suit_95(char) - pass - - @register def suit_100(char: CharacterProperty): # DCALC_REMOVE: suit_100 - 混沌净化:协调 @@ -1172,46 +356,6 @@ def suit_100(char: CharacterProperty): pass -@register -def suit_101(char: CharacterProperty): - # DCALC_REMOVE: suit_101 - 混沌净化:协调 - # level: 2 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - 每10秒生成最大生命值10%的保护罩 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - 跳跃时可以再跳跃一次 - # rarity: 史诗 - suit_95(char) - pass - - -@register -def suit_102(char: CharacterProperty): - # DCALC_REMOVE: suit_102 - 混沌净化:协调 - # level: 3 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - 每10秒生成最大生命值10%的保护罩 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - 跳跃时可以再跳跃一次 - # rarity: 史诗 - suit_95(char) - pass - - -@register -def suit_103(char: CharacterProperty): - # DCALC_REMOVE: suit_103 - 混沌净化:协调 - # level: 4 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - 每10秒生成最大生命值10%的保护罩 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - 跳跃时可以再跳跃一次 - # rarity: 史诗 - suit_95(char) - pass - - -@register -def suit_104(char: CharacterProperty): - # DCALC_REMOVE: suit_104 - 混沌净化:协调 - # level: 5 - # value: [暗黑净化][装备主动技能] 根据使用者的意愿调整净化与堕落状态。 - 进入地下城时,净化状态自动生效 - 冷却时间:300秒 [净化] - 技能伤害 +17.5% - 技能冷却时间 -30%(觉醒技能除外) - 特效伤害 +15% - 每秒恢复0.5%的生命值和魔法值 - 每10秒生成最大生命值10%的保护罩 [堕落] - 技能冷却时间 -55%(觉醒技能除外) - 特效伤害 +32.5% - 进入霸体状态 - 跳跃时可以再跳跃一次 - # rarity: 史诗 - suit_95(char) - pass - - @register def suit_105(char: CharacterProperty): # DCALC_REMOVE: suit_105 - 混沌净化:均衡 @@ -1235,42 +379,6 @@ def suit_106(char: CharacterProperty): pass -@register -def suit_107(char: CharacterProperty): - # DCALC_REMOVE: suit_107 - 天命者的微妙气运 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_108(char: CharacterProperty): - # DCALC_REMOVE: suit_108 - 天命者的微妙气运 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_109(char: CharacterProperty): - # DCALC_REMOVE: suit_109 - 天命者的微妙气运 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_110(char: CharacterProperty): - # DCALC_REMOVE: suit_110 - 天命者的微妙气运 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_111(char: CharacterProperty): # DCALC_REMOVE: suit_111 - 天命者的华丽气运 @@ -1282,46 +390,6 @@ def suit_111(char: CharacterProperty): pass -@register -def suit_112(char: CharacterProperty): - # DCALC_REMOVE: suit_112 - 天命者的华丽气运 - # level: 2 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +3% [天命所归] - 攻击时,有1%几率发动以下效果。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - # rarity: 神器 - suit_111(char) - pass - - -@register -def suit_113(char: CharacterProperty): - # DCALC_REMOVE: suit_113 - 天命者的华丽气运 - # level: 3 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +3% [天命所归] - 攻击时,有1%几率发动以下效果。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - # rarity: 神器 - suit_111(char) - pass - - -@register -def suit_114(char: CharacterProperty): - # DCALC_REMOVE: suit_114 - 天命者的华丽气运 - # level: 4 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +3% [天命所归] - 攻击时,有1%几率发动以下效果。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - # rarity: 神器 - suit_111(char) - pass - - -@register -def suit_115(char: CharacterProperty): - # DCALC_REMOVE: suit_115 - 天命者的华丽气运 - # level: 5 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +3% [天命所归] - 攻击时,有1%几率发动以下效果。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - # rarity: 神器 - suit_111(char) - pass - - @register def suit_116(char: CharacterProperty): # DCALC_REMOVE: suit_116 - 天命者的华丽气运 @@ -1329,54 +397,14 @@ def suit_116(char: CharacterProperty): # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +4.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 立即发动[第二次幸运] # rarity: 传说 char.SetStatus(SkillAttack=0.03) - char.AddElementDB('火',33,1) - char.AddElementDB('冰',33,1) - char.AddElementDB('光',33,1) - char.AddElementDB('暗',33,1) + char.AddElementDB('火', 33, 1) + char.AddElementDB('冰', 33, 1) + char.AddElementDB('光', 33, 1) + char.AddElementDB('暗', 33, 1) char.SetStatus(EquEffectRatio=0.045) pass -@register -def suit_117(char: CharacterProperty): - # DCALC_REMOVE: suit_117 - 天命者的耀眼气运 - # level: 2 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +4.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 立即发动[第二次幸运] - # rarity: 传说 - suit_116(char) - pass - - -@register -def suit_118(char: CharacterProperty): - # DCALC_REMOVE: suit_118 - 天命者的耀眼气运 - # level: 3 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +4.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 立即发动[第二次幸运] - # rarity: 传说 - suit_116(char) - pass - - -@register -def suit_119(char: CharacterProperty): - # DCALC_REMOVE: suit_119 - 天命者的耀眼气运 - # level: 4 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +4.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 立即发动[第二次幸运] - # rarity: 传说 - suit_116(char) - pass - - -@register -def suit_120(char: CharacterProperty): - # DCALC_REMOVE: suit_120 - 天命者的耀眼气运 - # level: 5 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 立即发动[第二次幸运] - # rarity: 传说 - suit_116(char) - pass - - @register def suit_121(char: CharacterProperty): # DCALC_REMOVE: suit_121 - 天命者的璀璨气运 @@ -1384,54 +412,14 @@ def suit_121(char: CharacterProperty): # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +13.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 当技能冷却时间生效中的技能超过3个时,初始化剩余冷却时间超过33秒的所有技能(觉醒技能除外,冷却时间33秒) - 立即发动[第二次幸运] [幸运之翼][装备主动技能] - [第二次幸运]、[天命所归]发动几率提高3倍,效果持续33秒 - 立即发动[第二次幸运] - [幸运之翼]结束时发动[天命所归],33秒后可以再次使用 # rarity: 史诗 char.SetStatus(SkillAttack=0.03) - char.AddElementDB('火',33,1) - char.AddElementDB('冰',33,1) - char.AddElementDB('光',33,1) - char.AddElementDB('暗',33,1) + char.AddElementDB('火', 33, 1) + char.AddElementDB('冰', 33, 1) + char.AddElementDB('光', 33, 1) + char.AddElementDB('暗', 33, 1) char.SetStatus(EquEffectRatio=0.135) pass -@register -def suit_122(char: CharacterProperty): - # DCALC_REMOVE: suit_122 - 天命者的璀璨气运 - # level: 2 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +13.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 当技能冷却时间生效中的技能超过3个时,初始化剩余冷却时间超过33秒的所有技能(觉醒技能除外,冷却时间33秒) - 立即发动[第二次幸运] [幸运之翼][装备主动技能] - [第二次幸运]、[天命所归]发动几率提高3倍,效果持续33秒 - 立即发动[第二次幸运] - [幸运之翼]结束时发动[天命所归],33秒后可以再次使用 - # rarity: 史诗 - suit_121(char) - pass - - -@register -def suit_123(char: CharacterProperty): - # DCALC_REMOVE: suit_123 - 天命者的璀璨气运 - # level: 3 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +13.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 当技能冷却时间生效中的技能超过3个时,初始化剩余冷却时间超过33秒的所有技能(觉醒技能除外,冷却时间33秒) - 立即发动[第二次幸运] [幸运之翼][装备主动技能] - [第二次幸运]、[天命所归]发动几率提高3倍,效果持续33秒 - 立即发动[第二次幸运] - [幸运之翼]结束时发动[天命所归],33秒后可以再次使用 - # rarity: 史诗 - suit_121(char) - pass - - -@register -def suit_124(char: CharacterProperty): - # DCALC_REMOVE: suit_124 - 天命者的璀璨气运 - # level: 4 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +13.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 当技能冷却时间生效中的技能超过3个时,初始化剩余冷却时间超过33秒的所有技能(觉醒技能除外,冷却时间33秒) - 立即发动[第二次幸运] [幸运之翼][装备主动技能] - [第二次幸运]、[天命所归]发动几率提高3倍,效果持续33秒 - 立即发动[第二次幸运] - [幸运之翼]结束时发动[天命所归],33秒后可以再次使用 - # rarity: 史诗 - suit_121(char) - pass - - -@register -def suit_125(char: CharacterProperty): - # DCALC_REMOVE: suit_125 - 天命者的璀璨气运 - # level: 5 - # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +13.5% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 当技能冷却时间生效中的技能超过3个时,初始化剩余冷却时间超过33秒的所有技能(觉醒技能除外,冷却时间33秒) - 立即发动[第二次幸运] [幸运之翼][装备主动技能] - [第二次幸运]、[天命所归]发动几率提高3倍,效果持续33秒 - 立即发动[第二次幸运] - [幸运之翼]结束时发动[天命所归],33秒后可以再次使用 - # rarity: 史诗 - suit_121(char) - pass - - @register def suit_126(char: CharacterProperty): # DCALC_REMOVE: suit_126 - 天命者的梦幻气运 @@ -1439,10 +427,10 @@ def suit_126(char: CharacterProperty): # value: 幸运蝴蝶以一定几率初始化技能冷却时间,从而提供更多的技能使用机会。 [第一次幸运] - 技能伤害 +3% - 特效伤害 +19% [第二次幸运] - 攻击时,有3%的几率使所有属性强化 +33(持续时间33秒;发动机会冷却时间1秒) [天命所归] - 攻击时,有3%几率发动[天命所归]。(发动机会冷却时间1秒) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最长的1个技能(觉醒技能除外) - 剩余冷却时间33秒以下的技能中,初始化剩余时间最短的1个技能(觉醒技能除外) - 存在3个以上冷却中的技能时,初始化剩余冷却时间超过33秒的所有技能(觉醒技能除外,冷却时间33秒) - 立即发动[第二次幸运] [幸运之翼][装备主动技能] - 立即发动[第二次幸运] - [第二次幸运]、[天命所归]发动几率提高3倍,效果持续33秒 - [幸运之翼]结束时,发动[天命所归],可33秒后可以再次施放。 [太初的记忆] 套装积分达到2550后,每增加70点套装积分,可以获得以下效果。 - 技能伤害 增加 1% - 增益量 +100 # rarity: 太初 char.SetStatus(SkillAttack=0.03) - char.AddElementDB('火',33,1) - char.AddElementDB('冰',33,1) - char.AddElementDB('光',33,1) - char.AddElementDB('暗',33,1) + char.AddElementDB('火', 33, 1) + char.AddElementDB('冰', 33, 1) + char.AddElementDB('光', 33, 1) + char.AddElementDB('暗', 33, 1) char.SetStatus(EquEffectRatio=0.19) pass @@ -1460,42 +448,6 @@ def suit_127(char: CharacterProperty): pass -@register -def suit_128(char: CharacterProperty): - # DCALC_REMOVE: suit_128 - 最初的能量 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_129(char: CharacterProperty): - # DCALC_REMOVE: suit_129 - 最初的能量 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_130(char: CharacterProperty): - # DCALC_REMOVE: suit_130 - 最初的能量 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_131(char: CharacterProperty): - # DCALC_REMOVE: suit_131 - 最初的能量 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_132(char: CharacterProperty): # DCALC_REMOVE: suit_132 - 涌动的能量 @@ -1503,54 +455,14 @@ def suit_132(char: CharacterProperty): # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +30% - 85级技能攻击力 +30% - 85级技能冷却时间 -30% - 50级技能冷却时间 -30% - 特效伤害 +13% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 # rarity: 神器 if not char.buffer: - char.SetSkillCD(50,50,0.3,[]) - char.SetSkillCD(85,85,0.3,[]) - char.SetSkillRation(100,100,0.3) - char.SetSkillRation(85,85,0.3) + char.SetSkillCD(50, 50, 0.3, []) + char.SetSkillCD(85, 85, 0.3, []) + char.SetSkillRation(100, 100, 0.3) + char.SetSkillRation(85, 85, 0.3) char.SetStatus(EquEffectRatio=0.13) pass -@register -def suit_133(char: CharacterProperty): - # DCALC_REMOVE: suit_133 - 涌动的能量 - # level: 2 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +30% - 85级技能攻击力 +30% - 85级技能冷却时间 -30% - 50级技能冷却时间 -30% - 特效伤害 +13% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 - # rarity: 神器 - suit_132(char) - pass - - -@register -def suit_134(char: CharacterProperty): - # DCALC_REMOVE: suit_134 - 涌动的能量 - # level: 3 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +30% - 85级技能攻击力 +30% - 85级技能冷却时间 -30% - 50级技能冷却时间 -30% - 特效伤害 +13% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 - # rarity: 神器 - suit_132(char) - pass - - -@register -def suit_135(char: CharacterProperty): - # DCALC_REMOVE: suit_135 - 涌动的能量 - # level: 4 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +30% - 85级技能攻击力 +30% - 85级技能冷却时间 -30% - 50级技能冷却时间 -30% - 特效伤害 +13% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 - # rarity: 神器 - suit_132(char) - pass - - -@register -def suit_136(char: CharacterProperty): - # DCALC_REMOVE: suit_136 - 涌动的能量 - # level: 5 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +30% - 85级技能攻击力 +30% - 85级技能冷却时间 -30% - 50级技能冷却时间 -30% - 特效伤害 +13% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 - # rarity: 神器 - suit_132(char) - pass - - @register def suit_137(char: CharacterProperty): # DCALC_REMOVE: suit_137 - 满溢的能量 @@ -1558,55 +470,15 @@ def suit_137(char: CharacterProperty): # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +40% - 85级技能攻击力 +40% - 100级技能冷却时间 -50% - 85级技能冷却时间 -40%- 50级技能冷却时间 -50% - 特效伤害 +16.5% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值5%的保护罩(最多10%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 # rarity: 传说 if not char.buffer: - char.SetSkillCD(50,50,0.5,[]) - char.SetSkillCD(85,85,0.4,[]) - char.SetSkillCD(100,100,0.5,[]) - char.SetSkillRation(100,100,0.4) - char.SetSkillRation(85,85,0.4) + char.SetSkillCD(50, 50, 0.5, []) + char.SetSkillCD(85, 85, 0.4, []) + char.SetSkillCD(100, 100, 0.5, []) + char.SetSkillRation(100, 100, 0.4) + char.SetSkillRation(85, 85, 0.4) char.SetStatus(EquEffectRatio=0.165) pass -@register -def suit_138(char: CharacterProperty): - # DCALC_REMOVE: suit_138 - 满溢的能量 - # level: 2 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +40% - 85级技能攻击力 +40% - 100级技能冷却时间 -50% - 85级技能冷却时间 -40%- 50级技能冷却时间 -50% - 特效伤害 +16.5% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值5%的保护罩(最多10%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 传说 - suit_137(char) - pass - - -@register -def suit_139(char: CharacterProperty): - # DCALC_REMOVE: suit_139 - 满溢的能量 - # level: 3 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +40% - 85级技能攻击力 +40% - 100级技能冷却时间 -50% - 85级技能冷却时间 -40%- 50级技能冷却时间 -50% - 特效伤害 +16.5% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值5%的保护罩(最多10%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 传说 - suit_137(char) - pass - - -@register -def suit_140(char: CharacterProperty): - # DCALC_REMOVE: suit_140 - 满溢的能量 - # level: 4 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +40% - 85级技能攻击力 +40% - 100级技能冷却时间 -50% - 85级技能冷却时间 -40%- 50级技能冷却时间 -50% - 特效伤害 +16.5% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值5%的保护罩(最多10%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 传说 - suit_137(char) - pass - - -@register -def suit_141(char: CharacterProperty): - # DCALC_REMOVE: suit_141 - 满溢的能量 - # level: 5 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +40% - 85级技能攻击力 +40% - 100级技能冷却时间 -50% - 85级技能冷却时间 -40%- 50级技能冷却时间 -50% - 特效伤害 +16.5% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值5%的保护罩(最多10%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 传说 - suit_137(char) - pass - - @register def suit_142(char: CharacterProperty): # DCALC_REMOVE: suit_142 - 极限的能量 @@ -1614,12 +486,12 @@ def suit_142(char: CharacterProperty): # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +60% - 85级技能攻击力 +50%- 50级技能攻击力 +10% - 100级技能冷却时间 -60% - 85级技能冷却时间 -50%- 50级技能冷却时间 -70% - 特效伤害 +23% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [抵达极限的能量] 施放[三觉技能]时,合算[抵达极限的能量]。 - 能量释放伤害量:331000% - 该伤害量为特效伤害 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值10%的保护罩(最多20%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 # rarity: 史诗 if not char.buffer: - char.SetSkillCD(50,50,0.7,[]) - char.SetSkillCD(85,85,0.5,[]) - char.SetSkillCD(100,100,0.6,[]) - char.SetSkillRation(100,100,0.6) - char.SetSkillRation(85,85,0.5) - char.SetSkillRation(50,50,0.1) + char.SetSkillCD(50, 50, 0.7, []) + char.SetSkillCD(85, 85, 0.5, []) + char.SetSkillCD(100, 100, 0.6, []) + char.SetSkillRation(100, 100, 0.6) + char.SetSkillRation(85, 85, 0.5) + char.SetSkillRation(50, 50, 0.1) char.SetStatus(EquEffectRatio=0.23) cd = 0 for item in char.skills: @@ -1629,46 +501,6 @@ def suit_142(char: CharacterProperty): pass -@register -def suit_143(char: CharacterProperty): - # DCALC_REMOVE: suit_143 - 极限的能量 - # level: 2 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +60% - 85级技能攻击力 +50%- 50级技能攻击力 +10% - 100级技能冷却时间 -60% - 85级技能冷却时间 -50%- 50级技能冷却时间 -70% - 特效伤害 +23% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [抵达极限的能量] 施放[三觉技能]时,合算[抵达极限的能量]。 - 能量释放伤害量:331000% - 该伤害量为特效伤害 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值10%的保护罩(最多20%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 史诗 - suit_142(char) - pass - - -@register -def suit_144(char: CharacterProperty): - # DCALC_REMOVE: suit_144 - 极限的能量 - # level: 3 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +60% - 85级技能攻击力 +50%- 50级技能攻击力 +10% - 100级技能冷却时间 -60% - 85级技能冷却时间 -50%- 50级技能冷却时间 -70% - 特效伤害 +23% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [抵达极限的能量] 施放[三觉技能]时,合算[抵达极限的能量]。 - 能量释放伤害量:331000% - 该伤害量为特效伤害 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值10%的保护罩(最多20%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 史诗 - suit_142(char) - pass - - -@register -def suit_145(char: CharacterProperty): - # DCALC_REMOVE: suit_145 - 极限的能量 - # level: 4 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +60% - 85级技能攻击力 +50%- 50级技能攻击力 +10% - 100级技能冷却时间 -60% - 85级技能冷却时间 -50%- 50级技能冷却时间 -70% - 特效伤害 +23% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [抵达极限的能量] 施放[三觉技能]时,合算[抵达极限的能量]。 - 能量释放伤害量:331000% - 该伤害量为特效伤害 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值10%的保护罩(最多20%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 史诗 - suit_142(char) - pass - - -@register -def suit_146(char: CharacterProperty): - # DCALC_REMOVE: suit_146 - 极限的能量 - # level: 5 - # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +60% - 85级技能攻击力 +50%- 50级技能攻击力 +10% - 100级技能冷却时间 -60% - 85级技能冷却时间 -50%- 50级技能冷却时间 -70% - 特效伤害 +23% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [抵达极限的能量] 施放[三觉技能]时,合算[抵达极限的能量]。 - 能量释放伤害量:331000% - 该伤害量为特效伤害 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值10%的保护罩(最多20%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 相同技能间存在30秒冷却时间 - # rarity: 史诗 - suit_142(char) - pass - - @register def suit_147(char: CharacterProperty): # DCALC_REMOVE: suit_147 - 超越极限的能量 @@ -1676,12 +508,12 @@ def suit_147(char: CharacterProperty): # value: 觉醒技能发挥出超越极限的破坏力。 [限制器解除] - 解除觉醒技能关联 - 100级技能攻击力 +76% - 85级技能攻击力 +60%- 50级技能攻击力 +15% - 100级技能冷却时间 -60% - 85级技能冷却时间 -60%- 50级技能冷却时间 -70% - 特效伤害 +27.5% * 组队时,辅助职业不适用解除觉醒技能关联、减少技能冷却时间的属性 [冲破极限] 施放[三觉技能]时,合算[冲破极限]。 - 能量释放伤害量:480000% - 该伤害量为特效伤害 [能量护盾] 施放50、85级技能时,发动以下效果。 - 获得生命值最大值15%的保护罩(最多30%),持续30秒 - 拥有保护罩时每秒恢复1%的魔法值 - 拥有保护罩时所有速度 +10% - 相同技能间存在30秒冷却时间 [太初的记忆] 套装积分达到2550后,每增加70点套装积分,可以获得以下效果。 - 技能伤害 增加 1% - 增益量 +100 # rarity: 太初 if not char.buffer: - char.SetSkillCD(50,50,0.7,[]) - char.SetSkillCD(85,85,0.6,[]) - char.SetSkillCD(100,100,0.6,[]) - char.SetSkillRation(100,100,0.76) - char.SetSkillRation(85,85,0.6) - char.SetSkillRation(50,50,0.15) + char.SetSkillCD(50, 50, 0.7, []) + char.SetSkillCD(85, 85, 0.6, []) + char.SetSkillCD(100, 100, 0.6, []) + char.SetSkillRation(100, 100, 0.76) + char.SetSkillRation(85, 85, 0.6) + char.SetSkillRation(50, 50, 0.15) char.SetStatus(EquEffectRatio=0.275) cd = 0 for item in char.skills: @@ -1704,42 +536,6 @@ def suit_148(char: CharacterProperty): pass -@register -def suit_149(char: CharacterProperty): - # DCALC_REMOVE: suit_149 - 自然的造化 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_150(char: CharacterProperty): - # DCALC_REMOVE: suit_150 - 自然的造化 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_151(char: CharacterProperty): - # DCALC_REMOVE: suit_151 - 自然的造化 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_152(char: CharacterProperty): - # DCALC_REMOVE: suit_152 - 自然的造化 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_153(char: CharacterProperty): # DCALC_REMOVE: suit_153 - 自然的干预 @@ -1750,46 +546,6 @@ def suit_153(char: CharacterProperty): pass -@register -def suit_154(char: CharacterProperty): - # DCALC_REMOVE: suit_154 - 自然的干预 - # level: 2 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 [无可违背的自然 - 干预] 攻击时引发自然爆炸攻击敌人。 (冷却时间5秒) - 自然燃烧伤害12750% - # rarity: 神器 - char.equ_effect.append(EquEffect(name='自燃爆炸', icon='/equipment/suit/6.png', cd=5, data=12750)) - pass - - -@register -def suit_155(char: CharacterProperty): - # DCALC_REMOVE: suit_155 - 自然的干预 - # level: 3 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 [无可违背的自然 - 干预] 攻击时引发自然爆炸攻击敌人。 (冷却时间5秒) - 自然燃烧伤害12750% - # rarity: 神器 - suit_154(char) - pass - - -@register -def suit_156(char: CharacterProperty): - # DCALC_REMOVE: suit_156 - 自然的干预 - # level: 4 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 [无可违背的自然 - 干预] 攻击时引发自然爆炸攻击敌人。 (冷却时间5秒) - 自然燃烧伤害12750% - # rarity: 神器 - suit_154(char) - pass - - -@register -def suit_157(char: CharacterProperty): - # DCALC_REMOVE: suit_157 - 自然的干预 - # level: 5 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 [无可违背的自然 - 干预] 攻击时引发自然爆炸攻击敌人。 (冷却时间5秒) - 自然燃烧伤害12750% - # rarity: 神器 - suit_154(char) - pass - - @register def suit_158(char: CharacterProperty): # DCALC_REMOVE: suit_158 - 自然的震怒 @@ -1800,46 +556,6 @@ def suit_158(char: CharacterProperty): pass -@register -def suit_159(char: CharacterProperty): - # DCALC_REMOVE: suit_159 - 自然的震怒 - # level: 2 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% [无可违背的自然 - 干预] 攻击时产生小型旋风,攻击小范围的敌人,并吸附敌人。 (冷却时间5秒) - 小型旋风伤害33300% - # rarity: 传说 - suit_158(char) - pass - - -@register -def suit_160(char: CharacterProperty): - # DCALC_REMOVE: suit_160 - 自然的震怒 - # level: 3 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% [无可违背的自然 - 干预] 攻击时产生小型旋风,攻击小范围的敌人,并吸附敌人。 (冷却时间5秒) - 小型旋风伤害33300% - # rarity: 传说 - suit_158(char) - pass - - -@register -def suit_161(char: CharacterProperty): - # DCALC_REMOVE: suit_161 - 自然的震怒 - # level: 4 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% [无可违背的自然 - 干预] 攻击时产生小型旋风,攻击小范围的敌人,并吸附敌人。 (冷却时间5秒) - 小型旋风伤害33300% - # rarity: 传说 - suit_158(char) - pass - - -@register -def suit_162(char: CharacterProperty): - # DCALC_REMOVE: suit_162 - 自然的震怒 - # level: 5 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% [无可违背的自然 - 干预] 攻击时产生小型旋风,攻击小范围的敌人,并吸附敌人。 (冷却时间5秒) - 小型旋风伤害33300% - # rarity: 传说 - suit_158(char) - pass - - @register def suit_163(char: CharacterProperty): # DCALC_REMOVE: suit_163 - 自然的制裁 @@ -1851,46 +567,6 @@ def suit_163(char: CharacterProperty): pass -@register -def suit_164(char: CharacterProperty): - # DCALC_REMOVE: suit_164 - 自然的制裁 - # level: 2 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% 所有技能范围 +5% [无可违背的自然 - 干预] 攻击时引发落雷,攻击并吸附大范围敌人。 (冷却时间5秒) - 落雷伤害55500% - # rarity: 史诗 - suit_163(char) - pass - - -@register -def suit_165(char: CharacterProperty): - # DCALC_REMOVE: suit_165 - 自然的制裁 - # level: 3 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% 所有技能范围 +5% [无可违背的自然 - 干预] 攻击时引发落雷,攻击并吸附大范围敌人。 (冷却时间5秒) - 落雷伤害55500% - # rarity: 史诗 - suit_163(char) - pass - - -@register -def suit_166(char: CharacterProperty): - # DCALC_REMOVE: suit_166 - 自然的制裁 - # level: 4 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% 所有技能范围 +5% [无可违背的自然 - 干预] 攻击时引发落雷,攻击并吸附大范围敌人。 (冷却时间5秒) - 落雷伤害55500% - # rarity: 史诗 - suit_163(char) - pass - - -@register -def suit_167(char: CharacterProperty): - # DCALC_REMOVE: suit_167 - 自然的制裁 - # level: 5 - # value: 利用无可违背的自然之力,对敌人造成巨大伤害。 所有速度 +5% 所有技能范围 +5% [无可违背的自然 - 干预] 攻击时引发落雷,攻击并吸附大范围敌人。 (冷却时间5秒) - 落雷伤害55500% - # rarity: 史诗 - suit_163(char) - pass - - @register def suit_168(char: CharacterProperty): # DCALC_REMOVE: suit_168 - 自然的灾变 @@ -1916,42 +592,6 @@ def suit_169(char: CharacterProperty): pass -@register -def suit_170(char: CharacterProperty): - # DCALC_REMOVE: suit_170 - 女武神 - 英勇的战士 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_171(char: CharacterProperty): - # DCALC_REMOVE: suit_171 - 女武神 - 英勇的战士 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_172(char: CharacterProperty): - # DCALC_REMOVE: suit_172 - 女武神 - 英勇的战士 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_173(char: CharacterProperty): - # DCALC_REMOVE: suit_173 - 女武神 - 英勇的战士 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_174(char: CharacterProperty): # DCALC_REMOVE: suit_174 - 女武神 - 战场的先锋 @@ -1962,46 +602,6 @@ def suit_174(char: CharacterProperty): pass -@register -def suit_175(char: CharacterProperty): - # DCALC_REMOVE: suit_175 - 女武神 - 战场的先锋 - # level: 2 - # value: 可以借用来自女武神的力量,获得全新的力量。 [破阵][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 - # rarity: 神器 - suit_174(char) - pass - - -@register -def suit_176(char: CharacterProperty): - # DCALC_REMOVE: suit_176 - 女武神 - 战场的先锋 - # level: 3 - # value: 可以借用来自女武神的力量,获得全新的力量。 [破阵][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 - # rarity: 神器 - suit_174(char) - pass - - -@register -def suit_177(char: CharacterProperty): - # DCALC_REMOVE: suit_177 - 女武神 - 战场的先锋 - # level: 4 - # value: 可以借用来自女武神的力量,获得全新的力量。 [破阵][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 - # rarity: 神器 - suit_174(char) - pass - - -@register -def suit_178(char: CharacterProperty): - # DCALC_REMOVE: suit_178 - 女武神 - 战场的先锋 - # level: 5 - # value: 可以借用来自女武神的力量,获得全新的力量。 [破阵][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 - # rarity: 神器 - suit_174(char) - pass - - @register def suit_179(char: CharacterProperty): # DCALC_REMOVE: suit_179 - 女武神 - 逆袭的战魂 @@ -2013,46 +613,6 @@ def suit_179(char: CharacterProperty): pass -@register -def suit_180(char: CharacterProperty): - # DCALC_REMOVE: suit_180 - 女武神 - 逆袭的战魂 - # level: 2 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 - # rarity: 传说 - suit_179(char) - pass - - -@register -def suit_181(char: CharacterProperty): - # DCALC_REMOVE: suit_181 - 女武神 - 逆袭的战魂 - # level: 3 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 - # rarity: 传说 - suit_179(char) - pass - - -@register -def suit_182(char: CharacterProperty): - # DCALC_REMOVE: suit_182 - 女武神 - 逆袭的战魂 - # level: 4 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 - # rarity: 传说 - suit_179(char) - pass - - -@register -def suit_183(char: CharacterProperty): - # DCALC_REMOVE: suit_183 - 女武神 - 逆袭的战魂 - # level: 5 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 - # rarity: 传说 - suit_179(char) - pass - - @register def suit_184(char: CharacterProperty): # DCALC_REMOVE: suit_184 - 女武神 - 不灭的英雄 @@ -2065,45 +625,6 @@ def suit_184(char: CharacterProperty): pass -@register -def suit_185(char: CharacterProperty): - # DCALC_REMOVE: suit_185 - 女武神 - 不灭的英雄 - # level: 2 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 施放无色小晶块技能时,获得“女武神的意志”。(最多8个) [天罚] 充满“女武神意志”后发动攻击,可召唤女武神,对四周敌人施以天罚。 - 天罚伤害:200400% - 冷却时间20秒 - # rarity: 史诗 - suit_184(char) - pass - - -@register -def suit_186(char: CharacterProperty): - # DCALC_REMOVE: suit_186 - 女武神 - 不灭的英雄 - # level: 3 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 施放无色小晶块技能时,获得“女武神的意志”。(最多8个) [天罚] 充满“女武神意志”后发动攻击,可召唤女武神,对四周敌人施以天罚。 - 天罚伤害:200400% - 冷却时间20秒 - # rarity: 史诗 - suit_184(char) - pass - -@register -def suit_187(char: CharacterProperty): - # DCALC_REMOVE: suit_187 - 女武神 - 不灭的英雄 - # level: 4 - # value: 借用女武神的一部分神秘力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 施放无色小晶块技能时,获得“女武神的意志”。(最多8个) [天罚] 充满“女武神意志”后发动攻击,可召唤女武神,对四周敌人施以天罚。 - 天罚伤害:200400% - 冷却时间20秒 - # rarity: 史诗 - suit_184(char) - pass - - -@register -def suit_188(char: CharacterProperty): - # DCALC_REMOVE: suit_188 - 女武神 - 不灭的英雄 - # level: 5 - # value: 可以借用来自女武神的力量,获得全新的力量。 [突破][装备发动属性] 与女武神融合,向前方突进。 - 正面突破伤害:10200% - 冷却时间8秒 [审判][装备发动属性] 与女武神融合,移动到最强的敌人后方进行攻击。 - 审判伤害:19000% - 追击范围:800px - 冷却时间:15秒 施放无色小晶块技能时,获得“女武神的意志”。(最多8个) [天罚] 充满“女武神意志”后发动攻击,可召唤女武神,对四周敌人施以天罚。 - 天罚伤害:200400% - 冷却时间20秒 - # rarity: 史诗 - suit_184(char) - pass - - @register def suit_189(char: CharacterProperty): # DCALC_REMOVE: suit_189 - 女武神 - 英灵的引导者 @@ -2130,42 +651,6 @@ def suit_190(char: CharacterProperty): pass -@register -def suit_191(char: CharacterProperty): - # DCALC_REMOVE: suit_191 - 黯淡的青丘灵珠 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_192(char: CharacterProperty): - # DCALC_REMOVE: suit_192 - 黯淡的青丘灵珠 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_193(char: CharacterProperty): - # DCALC_REMOVE: suit_193 - 黯淡的青丘灵珠 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_194(char: CharacterProperty): - # DCALC_REMOVE: suit_194 - 黯淡的青丘灵珠 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_195(char: CharacterProperty): # DCALC_REMOVE: suit_195 - 微光的青丘灵珠 @@ -2176,46 +661,6 @@ def suit_195(char: CharacterProperty): pass -@register -def suit_196(char: CharacterProperty): - # DCALC_REMOVE: suit_196 - 微光的青丘灵珠 - # level: 2 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +5(冷却时间1秒) - 灵珠最多可填充1个 - 青丘灵珠增益效果生效时,无法充能灵珠 - 进入地下城时,灵珠能量填充100 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 神器 - suit_195(char) - pass - - -@register -def suit_197(char: CharacterProperty): - # DCALC_REMOVE: suit_197 - 微光的青丘灵珠 - # level: 3 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +5(冷却时间1秒) - 灵珠最多可填充1个 - 青丘灵珠增益效果生效时,无法充能灵珠 - 进入地下城时,灵珠能量填充100 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 神器 - suit_195(char) - pass - - -@register -def suit_198(char: CharacterProperty): - # DCALC_REMOVE: suit_198 - 微光的青丘灵珠 - # level: 4 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +5(冷却时间1秒) - 灵珠最多可填充1个 - 青丘灵珠增益效果生效时,无法充能灵珠 - 进入地下城时,灵珠能量填充100 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 神器 - suit_195(char) - pass - - -@register -def suit_199(char: CharacterProperty): - # DCALC_REMOVE: suit_199 - 微光的青丘灵珠 - # level: 5 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +5(冷却时间1秒) - 灵珠最多可填充1个 - 青丘灵珠增益效果生效时,无法充能灵珠 - 进入地下城时,灵珠能量填充100 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 神器 - suit_195(char) - pass - - @register def suit_200(char: CharacterProperty): # DCALC_REMOVE: suit_200 - 清澈的青丘灵珠 @@ -2226,46 +671,6 @@ def suit_200(char: CharacterProperty): pass -@register -def suit_201(char: CharacterProperty): - # DCALC_REMOVE: suit_201 - 清澈的青丘灵珠 - # level: 2 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +6(冷却时间1秒) - 每秒灵珠能量 +1 - 灵珠最多可填充2个 - 青丘灵珠增益效果生效时,可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 传说 - suit_200(char) - pass - - -@register -def suit_202(char: CharacterProperty): - # DCALC_REMOVE: suit_202 - 清澈的青丘灵珠 - # level: 3 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +6(冷却时间1秒) - 每秒灵珠能量 +1 - 灵珠最多可填充2个 - 青丘灵珠增益效果生效时,可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 传说 - suit_200(char) - pass - - -@register -def suit_203(char: CharacterProperty): - # DCALC_REMOVE: suit_203 - 清澈的青丘灵珠 - # level: 4 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +6(冷却时间1秒) - 每秒灵珠能量 +1 - 灵珠最多可填充2个 - 青丘灵珠增益效果生效时,可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 传说 - suit_200(char) - pass - - -@register -def suit_204(char: CharacterProperty): - # DCALC_REMOVE: suit_204 - 清澈的青丘灵珠 - # level: 5 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +6(冷却时间1秒) - 每秒灵珠能量 +1 - 灵珠最多可填充2个 - 青丘灵珠增益效果生效时,可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 - # rarity: 传说 - suit_200(char) - pass - - @register def suit_205(char: CharacterProperty): # DCALC_REMOVE: suit_205 - 耀眼的青丘灵珠 @@ -2276,46 +681,6 @@ def suit_205(char: CharacterProperty): pass -@register -def suit_206(char: CharacterProperty): - # DCALC_REMOVE: suit_206 - 耀眼的青丘灵珠 - # level: 2 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +8(冷却时间1秒) - 每秒灵珠能量 +3 - 灵珠最多可填充3个 - 青丘灵珠增益效果生效时,也可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 [青丘灵珠开关][装备主动技能] - 灵珠全部填满时,自动使用青丘灵珠增益效果(冷却时间1秒) - 再次使用时,关闭自动使用功能 - # rarity: 史诗 - suit_205(char) - pass - - -@register -def suit_207(char: CharacterProperty): - # DCALC_REMOVE: suit_207 - 耀眼的青丘灵珠 - # level: 3 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +8(冷却时间1秒) - 每秒灵珠能量 +3 - 灵珠最多可填充3个 - 青丘灵珠增益效果生效时,也可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 [青丘灵珠开关][装备主动技能] - 灵珠全部填满时,自动使用青丘灵珠增益效果(冷却时间1秒) - 再次使用时,关闭自动使用功能 - # rarity: 史诗 - suit_205(char) - pass - - -@register -def suit_208(char: CharacterProperty): - # DCALC_REMOVE: suit_208 - 耀眼的青丘灵珠 - # level: 4 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +8(冷却时间1秒) - 每秒灵珠能量 +3 - 灵珠最多可填充3个 - 青丘灵珠增益效果生效时,也可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 [青丘灵珠开关][装备主动技能] - 灵珠全部填满时,自动使用青丘灵珠增益效果(冷却时间1秒) - 再次使用时,关闭自动使用功能 - # rarity: 史诗 - suit_205(char) - pass - - -@register -def suit_209(char: CharacterProperty): - # DCALC_REMOVE: suit_209 - 耀眼的青丘灵珠 - # level: 5 - # value: 借用青丘狐的灵珠之力,瞬间变强。 [青丘灵珠]激活 - 攻击时,灵珠能量 +8(冷却时间1秒) - 每秒灵珠能量 +3 - 灵珠最多可填充3个 - 青丘灵珠增益效果生效时,也可以充能灵珠 - 进入地下城时,灵珠能量填充200 [青丘灵珠][装备主动技能] - 发动时,消耗能量充满的所有灵珠,激活增益效果 - 每消耗1个灵珠,技能伤害 +10% - 增益效果持续时间30秒 - 冷却时间30秒 [青丘灵珠开关][装备主动技能] - 灵珠全部填满时,自动使用青丘灵珠增益效果(冷却时间1秒) - 再次使用时,关闭自动使用功能 - # rarity: 史诗 - suit_205(char) - pass - - @register def suit_210(char: CharacterProperty): # DCALC_REMOVE: suit_210 - 梦幻的青丘灵珠 @@ -2339,214 +704,58 @@ def suit_211(char: CharacterProperty): pass -@register -def suit_212(char: CharacterProperty): - # DCALC_REMOVE: suit_212 - 群猎之风 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_213(char: CharacterProperty): - # DCALC_REMOVE: suit_213 - 群猎之风 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_214(char: CharacterProperty): - # DCALC_REMOVE: suit_214 - 群猎之风 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_215(char: CharacterProperty): - # DCALC_REMOVE: suit_215 - 群猎之风 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_216(char: CharacterProperty): # DCALC_REMOVE: suit_216 - 群猎之林 # level: 1 # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。 (最多叠加1次) - 所有速度 +10% [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:3,825% - 使被命中的敌人进入崩裂状态,持续30秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +7.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 # rarity: 神器 - if char.equ_options.get('3',0) == 0: + if char.equ_options.get('3', 0) == 0: char.SetStatus(SkillAttack=0.074) else: - char.SetStatus(SkillAttack=0.08,SpeedA=0.1,SpeedM=0.1,SpeedR=0.1) + char.SetStatus(SkillAttack=0.08, SpeedA=0.1, SpeedM=0.1, SpeedR=0.1) char.equ_effect.append(EquEffect(name='酣畅狩猎', icon='/equipment/skill/15.png', cd=10, data=3825)) pass -@register -def suit_217(char: CharacterProperty): - # DCALC_REMOVE: suit_217 - 群猎之林 - # level: 2 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。 (最多叠加1次) - 所有速度 +10% [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:3,825% - 使被命中的敌人进入崩裂状态,持续30秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +7.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 神器 - suit_216(char) - pass - - -@register -def suit_218(char: CharacterProperty): - # DCALC_REMOVE: suit_218 - 群猎之林 - # level: 3 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。 (最多叠加1次) - 所有速度 +10% [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:3,825% - 使被命中的敌人进入崩裂状态,持续30秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +7.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 神器 - suit_216(char) - pass - - -@register -def suit_219(char: CharacterProperty): - # DCALC_REMOVE: suit_219 - 群猎之林 - # level: 4 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。 (最多叠加1次) - 所有速度 +10% [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:3,825% - 使被命中的敌人进入崩裂状态,持续30秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +7.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 神器 - suit_216(char) - pass - - -@register -def suit_220(char: CharacterProperty): - # DCALC_REMOVE: suit_220 - 群猎之林 - # level: 5 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。 (最多叠加1次) - 所有速度 +10% [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:3,825% - 使被命中的敌人进入崩裂状态,持续30秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +7.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 神器 - suit_216(char) - pass - - @register def suit_221(char: CharacterProperty): # DCALC_REMOVE: suit_221 - 群猎之光 # level: 1 # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +15% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:5,738% - 使被命中的敌人进入崩裂状态,持续45秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 # rarity: 传说 - if char.equ_options.get('3',0) == 0: + if char.equ_options.get('3', 0) == 0: char.SetStatus(SkillAttack=0.144) else: - char.SetStatus(SkillAttack=0.08,SpeedA=0.15,SpeedM=0.15,SpeedR=0.15) + char.SetStatus(SkillAttack=0.08, SpeedA=0.15, SpeedM=0.15, SpeedR=0.15) char.equ_effect.append(EquEffect(name='酣畅狩猎', icon='/equipment/skill/15.png', cd=10, data=5738)) pass -@register -def suit_222(char: CharacterProperty): - # DCALC_REMOVE: suit_222 - 群猎之光 - # level: 2 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +15% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:5,738% - 使被命中的敌人进入崩裂状态,持续45秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 传说 - suit_221(char) - pass - - -@register -def suit_223(char: CharacterProperty): - # DCALC_REMOVE: suit_223 - 群猎之光 - # level: 3 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +15% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:5,738% - 使被命中的敌人进入崩裂状态,持续45秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 传说 - suit_221(char) - pass - - -@register -def suit_224(char: CharacterProperty): - # DCALC_REMOVE: suit_224 - 群猎之光 - # level: 4 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +15% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:5,738% - 使被命中的敌人进入崩裂状态,持续45秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 传说 - suit_221(char) - pass - - -@register -def suit_225(char: CharacterProperty): - # DCALC_REMOVE: suit_225 - 群猎之光 - # level: 5 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +15% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:5,738% - 使被命中的敌人进入崩裂状态,持续45秒 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 传说 - suit_221(char) - pass - - @register def suit_226(char: CharacterProperty): # DCALC_REMOVE: suit_226 - 群猎之星 # level: 1 # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +20% - 所受物理/魔法伤害- 10% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:6,750% - 使被命中的敌人进入最大层数的崩裂状态,持续60秒 - 冷却时间30秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 # rarity: 史诗 - if char.equ_options.get('3',0) == 0: + if char.equ_options.get('3', 0) == 0: char.SetStatus(SkillAttack=0.144) else: - char.SetStatus(SkillAttack=0.08,SpeedA=0.2,SpeedM=0.0,SpeedR=0.0) + char.SetStatus(SkillAttack=0.08, SpeedA=0.2, SpeedM=0.0, SpeedR=0.0) char.equ_effect.append(EquEffect(name='酣畅狩猎', icon='/equipment/skill/15.png', cd=30, data=6750)) pass -@register -def suit_227(char: CharacterProperty): - # DCALC_REMOVE: suit_227 - 群猎之星 - # level: 2 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +20% - 所受物理/魔法伤害- 10% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:6,750% - 使被命中的敌人进入最大层数的崩裂状态,持续60秒 - 冷却时间30秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 史诗 - suit_226(char) - pass - - -@register -def suit_228(char: CharacterProperty): - # DCALC_REMOVE: suit_228 - 群猎之星 - # level: 3 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +20% - 所受物理/魔法伤害- 10% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:6,750% - 使被命中的敌人进入最大层数的崩裂状态,持续60秒 - 冷却时间30秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 史诗 - suit_226(char) - pass - - -@register -def suit_229(char: CharacterProperty): - # DCALC_REMOVE: suit_229 - 群猎之星 - # level: 4 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +20% - 所受物理/魔法伤害- 10% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:6,750% - 使被命中的敌人进入最大层数的崩裂状态,持续60秒 - 冷却时间30秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 史诗 - suit_226(char) - pass - - -@register -def suit_230(char: CharacterProperty): - # DCALC_REMOVE: suit_230 - 群猎之星 - # level: 5 - # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +20% - 所受物理/魔法伤害- 10% - 每10秒恢复10000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 发出吼叫震慑敌人。 - 伤害量:6,750% - 使被命中的敌人进入最大层数的崩裂状态,持续60秒 - 冷却时间30秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +14.4% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 - # rarity: 史诗 - suit_226(char) - pass - - @register def suit_231(char: CharacterProperty): # DCALC_REMOVE: suit_231 - 群猎之神 # level: 1 # value: 与同伴在一起时,会变得更强。 [组队挑战时适用] [群猎之力] 给队员赋予光环,获得以下效果。(最多叠加1次) - 所有速度 +30% - 所受物理/魔法伤害- 15% - 每10秒恢复10,000点的生命值和魔法值,持续10秒 [酣畅狩猎][装备主动技能] 散发出威慑敌人的气势。 - 施放时,每秒使500px范围内的敌人进入最大层数的崩裂状态,持续60秒 - 再次施放时,不再使敌人进入崩裂状态 - 冷却时间10秒 (敌人进入崩裂状态时,所受伤害根据叠加层数(1/2/3)增加(5/7/8)%) ([群猎之力]、[酣畅狩猎]效果对辅助职业无效) [单人挑战时适用] - 技能伤害 +18.1% - 适用[群猎之力]效果 - 不适用[酣畅狩猎]效果 [太初的记忆] 套装积分达到2550后,每增加70点套装积分,可以获得以下效果。 - 技能伤害 增加 1% - 增益量 +100 # rarity: 太初 - if char.equ_options.get('3',0) == 0: + if char.equ_options.get('3', 0) == 0: char.SetStatus(SkillAttack=0.181) else: - char.SetStatus(SkillAttack=0.08,SpeedA=0.3,SpeedM=0.3,SpeedR=0.3) + char.SetStatus(SkillAttack=0.08, SpeedA=0.3, SpeedM=0.3, SpeedR=0.3) pass @@ -2563,146 +772,30 @@ def suit_232(char: CharacterProperty): pass -@register -def suit_233(char: CharacterProperty): - # DCALC_REMOVE: suit_233 - 魔力领域 - 初始 - # level: 2 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_234(char: CharacterProperty): - # DCALC_REMOVE: suit_234 - 魔力领域 - 初始 - # level: 3 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_235(char: CharacterProperty): - # DCALC_REMOVE: suit_235 - 魔力领域 - 初始 - # level: 4 - # value: - - # rarity: 稀有 - pass - - -@register -def suit_236(char: CharacterProperty): - # DCALC_REMOVE: suit_236 - 魔力领域 - 初始 - # level: 5 - # value: - - # rarity: 稀有 - pass - - @register def suit_237(char: CharacterProperty): # DCALC_REMOVE: suit_237 - 魔力领域 - 入静 # level: 1 # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时,召唤普通模式魔攻核。 [命令:转换][装备主动技能] 转换魔攻核的攻击模式。 - 普通模式/追击模式 - 冷却时间:5秒 [魔攻核:普通模式] 每秒发射魔力波动。 - 魔力波动伤害量:19200% - 魔力波动范围:150px [魔攻核:追击模式] 追击最强的敌人,每秒发射魔力波动。 - 魔力波动伤害量:13714% - 魔力波动范围:150px # rarity: 神器 - if char.equ_options.get('4',0) == 0: + if char.equ_options.get('4', 0) == 0: char.equ_effect.append(EquEffect(name='普通模式', icon='/equipment/skill/57.png', cd=1, data=19200)) else: char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=13714)) pass -@register -def suit_238(char: CharacterProperty): - # DCALC_REMOVE: suit_238 - 魔力领域 - 入静 - # level: 2 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时,召唤普通模式魔攻核。 [命令:转换][装备主动技能] 转换魔攻核的攻击模式。 - 普通模式/追击模式 - 冷却时间:5秒 [魔攻核:普通模式] 每秒发射魔力波动。 - 魔力波动伤害量:19200% - 魔力波动范围:150px [魔攻核:追击模式] 追击最强的敌人,每秒发射魔力波动。 - 魔力波动伤害量:13714% - 魔力波动范围:150px - # rarity: 神器 - suit_237(char) - pass - - -@register -def suit_239(char: CharacterProperty): - # DCALC_REMOVE: suit_239 - 魔力领域 - 入静 - # level: 3 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时,召唤普通模式魔攻核。 [命令:转换][装备主动技能] 转换魔攻核的攻击模式。 - 普通模式/追击模式 - 冷却时间:5秒 [魔攻核:普通模式] 每秒发射魔力波动。 - 魔力波动伤害量:19200% - 魔力波动范围:150px [魔攻核:追击模式] 追击最强的敌人,每秒发射魔力波动。 - 魔力波动伤害量:13714% - 魔力波动范围:150px - # rarity: 神器 - suit_237(char) - pass - - -@register -def suit_240(char: CharacterProperty): - # DCALC_REMOVE: suit_240 - 魔力领域 - 入静 - # level: 4 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时,召唤普通模式魔攻核。 [命令:转换][装备主动技能] 转换魔攻核的攻击模式。 - 普通模式/追击模式 - 冷却时间:5秒 [魔攻核:普通模式] 每秒发射魔力波动。 - 魔力波动伤害量:19200% - 魔力波动范围:150px [魔攻核:追击模式] 追击最强的敌人,每秒发射魔力波动。 - 魔力波动伤害量:13714% - 魔力波动范围:150px - # rarity: 神器 - suit_237(char) - pass - - -@register -def suit_241(char: CharacterProperty): - # DCALC_REMOVE: suit_241 - 魔力领域 - 入静 - # level: 5 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时,召唤普通模式魔攻核。 [命令:转换][装备主动技能] 转换魔攻核的攻击模式。 - 普通模式/追击模式 - 冷却时间:5秒 [魔攻核:普通模式] 每秒发射魔力波动。 - 魔力波动伤害量:19200% - 魔力波动范围:150px [魔攻核:追击模式] 追击最强的敌人,每秒发射魔力波动。 - 魔力波动伤害量:13714% - 魔力波动范围:150px - # rarity: 神器 - suit_237(char) - pass - - @register def suit_242(char: CharacterProperty): # DCALC_REMOVE: suit_242 - 魔力领域 - 入真 # level: 1 # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 35000% - 魔力波动范围 : 150px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 21000% - 魔力波动范围 : 150px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 7000% - 冷却时间 : 1秒 # rarity: 传说 - if char.equ_options.get('4',0) == 0: + if char.equ_options.get('4', 0) == 0: char.equ_effect.append(EquEffect(name='普通模式', icon='/equipment/skill/57.png', cd=1, data=35000)) char.SetStatus(SpeedM=0.25) else: - char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=21000+7000)) - pass - - -@register -def suit_243(char: CharacterProperty): - # DCALC_REMOVE: suit_243 - 魔力领域 - 入真 - # level: 2 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 35000% - 魔力波动范围 : 150px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 21000% - 魔力波动范围 : 150px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 7000% - 冷却时间 : 1秒 - # rarity: 传说 - suit_242(char) - pass - - -@register -def suit_244(char: CharacterProperty): - # DCALC_REMOVE: suit_244 - 魔力领域 - 入真 - # level: 3 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 35000% - 魔力波动范围 : 150px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 21000% - 魔力波动范围 : 150px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 7000% - 冷却时间 : 1秒 - # rarity: 传说 - suit_242(char) - pass - - -@register -def suit_245(char: CharacterProperty): - # DCALC_REMOVE: suit_245 - 魔力领域 - 入真 - # level: 4 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 35000% - 魔力波动范围 : 150px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 21000% - 魔力波动范围 : 150px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 7000% - 冷却时间 : 1秒 - # rarity: 传说 - suit_242(char) - pass - - -@register -def suit_246(char: CharacterProperty): - # DCALC_REMOVE: suit_246 - 魔力领域 - 入真 - # level: 5 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 35000% - 魔力波动范围 : 150px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 21000% - 魔力波动范围 : 150px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 7000% - 冷却时间 : 1秒 - # rarity: 传说 - suit_242(char) + char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=21000 + 7000)) pass @@ -2712,51 +805,11 @@ def suit_247(char: CharacterProperty): # level: 1 # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 52500% - 魔力波动范围 : 200px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 31000% - 魔力波动范围 : 200px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 11000% - 冷却时间 : 1秒 # rarity: 史诗 - if char.equ_options.get('4',0) == 0: + if char.equ_options.get('4', 0) == 0: char.equ_effect.append(EquEffect(name='普通模式', icon='/equipment/skill/57.png', cd=1, data=52500)) char.SetStatus(SpeedM=0.25) else: - char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=31000+11000)) - pass - - -@register -def suit_248(char: CharacterProperty): - # DCALC_REMOVE: suit_248 - 魔力领域 - 入定 - # level: 2 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 52500% - 魔力波动范围 : 200px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 31000% - 魔力波动范围 : 200px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 11000% - 冷却时间 : 1秒 - # rarity: 史诗 - suit_247(char) - pass - - -@register -def suit_249(char: CharacterProperty): - # DCALC_REMOVE: suit_249 - 魔力领域 - 入定 - # level: 3 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 52500% - 魔力波动范围 : 200px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 31000% - 魔力波动范围 : 200px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 11000% - 冷却时间 : 1秒 - # rarity: 史诗 - suit_247(char) - pass - - -@register -def suit_250(char: CharacterProperty): - # DCALC_REMOVE: suit_250 - 魔力领域 - 入定 - # level: 4 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 52500% - 魔力波动范围 : 200px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 31000% - 魔力波动范围 : 200px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 11000% - 冷却时间 : 1秒 - # rarity: 史诗 - suit_247(char) - pass - - -@register -def suit_251(char: CharacterProperty): - # DCALC_REMOVE: suit_251 - 魔力领域 - 入定 - # level: 5 - # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 52500% - 魔力波动范围 : 200px - 移动速度 +25% - 进入霸体状态 [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 31000% - 魔力波动范围 : 200px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 11000% - 冷却时间 : 1秒 - # rarity: 史诗 - suit_247(char) + char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=31000 + 11000)) pass @@ -2766,11 +819,11 @@ def suit_252(char: CharacterProperty): # level: 1 # value: 操控魔攻核攻击敌人。 [魔攻核] 进入地下城时, 召唤普通模式魔攻核。 [命令 : 转换] [装备主动技能] 转换魔攻核的攻击模式。 - 普通模式 / 追击模式 - 删除[追踪印记] - 冷却时间 : 5秒 [魔攻核 : 普通模式] 每秒发射魔力波动。 - 魔力波动伤害量 : 67000% - 魔力波动范围 : 300px - 移动速度 +25% - 进入霸体状态 - 所受物理/魔法伤害 -10% [魔攻核 : 追击模式] 追击最强的敌人, 每秒发射魔力波动。 - 魔力波动伤害量 : 40000% - 魔力波动范围 : 200px - 对追踪目标赋予[追踪印记] [魔攻弹 : 追击模式] 攻击时, 对赋予[追踪印记]的敌人发射魔力飞弹。 - 魔力飞弹伤害量 : 13600% - 冷却时间 : 1秒 [太初的记忆] 套装积分达到2550后,每增加70点套装积分,可以获得以下效果。 - 技能伤害 增加 1% - 增益量 +100 # rarity: 太初 - if char.equ_options.get('4',0) == 0: + if char.equ_options.get('4', 0) == 0: char.equ_effect.append(EquEffect(name='普通模式', icon='/equipment/skill/57.png', cd=1, data=67000)) char.SetStatus(SpeedM=0.25) else: - char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=40000+13600)) + char.equ_effect.append(EquEffect(name='追击模式', icon='/equipment/skill/57.png', cd=1, data=40000 + 13600)) pass diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index da873c9c16e11881c230430c8eac10ebcea4e1ec..da5ca8c24c5d4d25bafc24f2e98949dc39414214 100644 GIT binary patch delta 38523 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 SY<1Vr;9?g3%l|09Fa3YRlwnK& diff --git a/backend/database/models.py b/backend/database/models.py index bc0fd396..650ccc1c 100644 --- a/backend/database/models.py +++ b/backend/database/models.py @@ -2,7 +2,7 @@ # import sys from sqlalchemy import Column, Integer, Text, Float from sqlalchemy import create_engine -from sqlalchemy.orm import Session,declarative_base +from sqlalchemy.orm import Session, declarative_base Base = declarative_base() metadata = Base.metadata @@ -26,6 +26,7 @@ class SuitData(Base): bufferValue = Column(Text) fame = Column(Integer) + class EquData(Base): """ 装备属性映射 @@ -56,6 +57,7 @@ class EquData(Base): Buffer = Column(Text) suit = Column(Text) + class StoneData(Base): """ 装备属性映射 @@ -86,6 +88,7 @@ class StoneData(Base): Buffer = Column(Text) suit = Column(Text) + class EnchantData(Base): __tablename__ = 'enchant' @@ -96,6 +99,7 @@ class EnchantData(Base): fame = Column(Integer) rarity = Column(Text) + class EmblemData(Base): __tablename__ = 'emblem' @@ -106,6 +110,7 @@ class EmblemData(Base): fame = Column(Integer) rarity = Column(Text) + class JadeData(Base): __tablename__ = 'jade' @@ -116,11 +121,13 @@ class JadeData(Base): unit = Column(Text) pre = Column(Float) + class OathData(Base): """ 誓约属性映射 首字母大写的属性为调适可能会影响到的属性 """ + __tablename__ = 'oath' id = Column(Integer, primary_key=True) @@ -145,11 +152,13 @@ class OathData(Base): suit = Column(Text) wearUrl = Column(Text) + class PrimerData(Base): """ 誓约属性映射 首字母大写的属性为调适可能会影响到的属性 """ + __tablename__ = 'primer' id = Column(Integer, primary_key=True) @@ -174,6 +183,7 @@ class PrimerData(Base): suit = Column(Text) wearUrl = Column(Text) + class OathSuitData(Base): __tablename__ = 'oathSuit' @@ -190,6 +200,7 @@ class OathSuitData(Base): Attack = Column(Text) Buffer = Column(Text) + class OathSuitSkillData(Base): __tablename__ = 'oathSuitSkill' @@ -204,4 +215,4 @@ class OathSuitSkillData(Base): Attack = Column(Float) Buffer = Column(Float) value = Column(Text) - bufferValue = Column(Text) \ No newline at end of file + bufferValue = Column(Text) diff --git a/backend/test.py b/backend/test.py index e5c9a404..d20f9bcd 100644 --- a/backend/test.py +++ b/backend/test.py @@ -4,7 +4,8 @@ char = createCharacter('GF.gunner_female.spitfire_female') char.calc_init( { - 'oaths': {'0': {'id': '2010201', 'adaptation': 3}, '1': {'id': '2010201', 'adaptation': 3}, '2': {'id': '2010201', 'adaptation': 3}, '3': {'id': '2010201', 'adaptation': 3}, '4': {'id': '2010201', 'adaptation': 3}, '11': {'id': '2010200', 'adaptation': 0}}, + 'oaths': {'0': {'id': '2030201', 'adaptation': 3}, '1': {'id': '2030201', 'adaptation': 3}, '2': {'id': '2030201', 'adaptation': 3}, '3': {'id': '2030201', 'adaptation': 3}, '4': {'id': '2030201', 'adaptation': 3}, '11': {'id': '2030200', 'adaptation': 0}}, + 'oathSkill': 1, 'equips': { '武器': {'id': '88', 'reinforce': 14, 'reinforceType': 1, 'enchant': 512, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 8, 'adaptation': 3, 'precision': 100}, '称号': {'id': '3017', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1201, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, From 4cbb4260a6de265d3a80ebf554b9bfef084ab539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Mon, 13 Apr 2026 20:13:20 +0800 Subject: [PATCH 08/21] dev --- backend/core/basic/character/base.py | 2 +- backend/core/basic/character/calc_equip.py | 2 +- .../core/equipment/version_0/oathSuitSkill.py | 11 +++++++++-- backend/dataFiles/dcalc_0.db | Bin 1150976 -> 1150976 bytes 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py index a0eec733..d6b77be5 100644 --- a/backend/core/basic/character/base.py +++ b/backend/core/basic/character/base.py @@ -368,4 +368,4 @@ class CharacterBase(CharacterProperty): if part in ['耳环', '辅助装备', '魔法石']: reinforce_2 += num reinforce = reinforce_0 + reinforce_1 + reinforce_2 + reinforce_3 - return [reinforce, reinforce_0, reinforce_1, reinforce_2, reinforce_3] + return [reinforce, reinforce_0, reinforce_1, reinforce_2] diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index a4f36770..cbb6ca69 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -160,7 +160,7 @@ class CalcEquipMixin(CharacterBase): for skill in oathSkillEffect: func = equs.funs.execture(f'oath_skill_{skill.id}') if func is not None: - print(f'誓约技能 {skill.name} 生效') + print(f'誓约技能 {skill.id} 生效') func(self) if self.max_point >= 2550: skillAttack = (self.max_point - 2550) // 70 * 0.01 diff --git a/backend/core/equipment/version_0/oathSuitSkill.py b/backend/core/equipment/version_0/oathSuitSkill.py index 74ed0cf0..20822a7c 100644 --- a/backend/core/equipment/version_0/oathSuitSkill.py +++ b/backend/core/equipment/version_0/oathSuitSkill.py @@ -1,9 +1,15 @@ +import inspect + from core.abstract.character import CharacterProperty from core.basic.equipment import EquEffect from .register import register -def check_suit(char: CharacterProperty, suitId: int) -> bool: +def check_suit(char: CharacterProperty) -> bool: + caller_frame = inspect.stack()[1] + fun_name = caller_frame.function + suitId = int(fun_name.split('_')[-1]) % 10000 + 16000 + print(f'检查套装 {suitId}') return next((x for x in char.suitInfo if x.suitId == suitId), None) is not None @@ -170,6 +176,7 @@ def oath_skill_2020503(char: CharacterProperty): # region 理想之黄金乡 @register def oath_skill_2030101(char: CharacterProperty): + oath_skill_2030501(char) pass @@ -250,7 +257,7 @@ def oath_skill_2030501(char: CharacterProperty): char.SetStatus(SpeedA=0.01 * min(reinforce_2 // 3, 12)) char.SetStatus(SpeedM=0.01 * min(reinforce_2 // 3, 12)) char.SetStatus(SpeedR=0.01 * min(reinforce_2 // 3, 12)) - if check_suit(char, 16203): + if check_suit(char): print('穿戴黄金乡') char.SetStatus(SkillRange=0.02 * min(reinforce // 11, 12)) # char.SetStatus(DamageReduce=0.01 * min(reinforce_0 // 5, 7)) diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index da5ca8c24c5d4d25bafc24f2e98949dc39414214..620c726bae4092c9a5da8b75057231219dce74dc 100644 GIT binary patch delta 128 zcmZoz;MTCfZGtr8Zf6#mUa*6ijn&Y=)WD$q^j>BlW&vVWAZ7z%b|B^eVoo6D0%C3;<^f_} QAm#&N{_Ust3YcC30A__VTL1t6 delta 127 zcmZoz;MTCfZGtr8q=_=ljFTD@S`!#s6PUIpFfUxs&%2UAilK*rKa1}QpFQvT?E)K^ zXYz70Ffgz&Ff{VANbpZD+{!G*7}0)uFEbFc05K~NvjH(X5OV-AClGT1F*gwN05LBR P^8qpc_S1U>OfLZd2Cgz1 From cf218ec3d8c753e566c8085e56383f2811227ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Tue, 14 Apr 2026 14:00:39 +0800 Subject: [PATCH 09/21] dev --- backend/core/equipment/version_0/emblem.py | 624 +++++++++++++++------ 1 file changed, 468 insertions(+), 156 deletions(-) diff --git a/backend/core/equipment/version_0/emblem.py b/backend/core/equipment/version_0/emblem.py index 65d1fac9..3e51d4e7 100644 --- a/backend/core/equipment/version_0/emblem.py +++ b/backend/core/equipment/version_0/emblem.py @@ -1,235 +1,547 @@ from core.abstract.character import CharacterProperty from .register import register -emblem_func_list = {} @register -def emblem_1(char: CharacterProperty): +def emblem_2101(char: CharacterProperty): # DCALC_REMOVE: emblem_1 - # 力智+20 暴击+1.9% - # rarity: 玲珑 - char.SetStatus(力智=20) - pass - - -@register -def emblem_2(char: CharacterProperty): - # DCALC_REMOVE: emblem_2 - # 力智+15 暴击+1.5% - # rarity: 玲珑 - char.SetStatus(力智=15) - pass - - -@register -def emblem_3(char: CharacterProperty): - # DCALC_REMOVE: emblem_3 - # 力智+10 暴击+1.1% - # rarity: 玲珑 - char.SetStatus(力智=10) - pass - - -@register -def emblem_4(char: CharacterProperty): - # DCALC_REMOVE: emblem_4 - # 力智+35 - # rarity: 玲珑 + # 力智 +35 + # rarity: 灿烂 (红色) char.SetStatus(力智=35) pass @register -def emblem_5(char: CharacterProperty): - # DCALC_REMOVE: emblem_5 - # 体精+35 - # rarity: 玲珑 +def emblem_2102(char: CharacterProperty): + # DCALC_REMOVE: emblem_2 + # 体精 +35 + # rarity: 灿烂 (红色) char.SetStatus(体精=35) pass @register -def emblem_6(char: CharacterProperty): - # DCALC_REMOVE: emblem_6 - # 体精+25 - # rarity: 玲珑 - char.SetStatus(体精=25) +def emblem_2103(char: CharacterProperty): + # DCALC_REMOVE: emblem_3 + # 四维 +15 + # rarity: 灿烂 (红色) + char.SetStatus(四维=15) pass @register -def emblem_7(char: CharacterProperty): - # DCALC_REMOVE: emblem_7 - # 体精+17 - # rarity: 玲珑 - char.SetStatus(体精=17) - pass - - -@register -def emblem_8(char: CharacterProperty): - # DCALC_REMOVE: emblem_8 - # 力智+30 - # rarity: 玲珑 - char.SetStatus(力智=30) - pass - - -@register -def emblem_9(char: CharacterProperty): - # DCALC_REMOVE: emblem_9 - # 攻速+2% - # rarity: 玲珑 - char.SetStatus(攻速=0.02) - pass - - -@register -def emblem_10(char: CharacterProperty): - # DCALC_REMOVE: emblem_10 - # 体精+30 - # rarity: 玲珑 - char.SetStatus(体精=30) - pass - - -@register -def emblem_11(char: CharacterProperty): - # DCALC_REMOVE: emblem_11 - # 三攻+20 - # rarity: 玲珑 - char.SetStatus(三攻=20) - pass - - -@register -def emblem_12(char: CharacterProperty): - # DCALC_REMOVE: emblem_12 - # 力智+30 - # rarity: 玲珑 - char.SetStatus(力智=30) - pass - - -@register -def emblem_13(char: CharacterProperty): - # DCALC_REMOVE: emblem_13 - # 体精+30 - # rarity: 玲珑 - char.SetStatus(体精=30) - pass - - -@register -def emblem_14(char: CharacterProperty): - # DCALC_REMOVE: emblem_14 - # 力智+25 - # rarity: 灿烂 +def emblem_2201(char: CharacterProperty): + # DCALC_REMOVE: emblem_4 + # 力智 +25 + # rarity: 灿烂 (黄色) char.SetStatus(力智=25) pass @register -def emblem_15(char: CharacterProperty): +def emblem_2202(char: CharacterProperty): + # DCALC_REMOVE: emblem_5 + # 体精 +25 + # rarity: 灿烂 (黄色) + char.SetStatus(体精=25) + pass + + +@register +def emblem_2203(char: CharacterProperty): + # DCALC_REMOVE: emblem_6 + # 攻速 +1.5% 四维 +10 + # rarity: 灿烂 (黄色) + char.SetStatus(攻速=0.015, 四维=10) + pass + + +@register +def emblem_2204(char: CharacterProperty): + # DCALC_REMOVE: emblem_7 + # 施放 +2.2% 四维 +10 + # rarity: 灿烂 (黄色) + char.SetStatus(施放=0.022, 四维=10) + pass + + +@register +def emblem_2205(char: CharacterProperty): + # DCALC_REMOVE: emblem_8 + # 四维 +10 + # rarity: 灿烂 (黄色) + char.SetStatus(四维=10) + pass + + +@register +def emblem_2301(char: CharacterProperty): + # DCALC_REMOVE: emblem_9 + # 力智 +25 + # rarity: 灿烂 (绿色) + char.SetStatus(力智=25) + pass + + +@register +def emblem_2302(char: CharacterProperty): + # DCALC_REMOVE: emblem_10 + # 体精 +25 + # rarity: 灿烂 (绿色) + char.SetStatus(体精=25) + pass + + +@register +def emblem_2303(char: CharacterProperty): + # DCALC_REMOVE: emblem_11 + # 暴击 +3% 四维 +10 + # rarity: 灿烂 (绿色) + char.SetStatus(暴击=0.030, 四维=10) + pass + + +@register +def emblem_2304(char: CharacterProperty): + # DCALC_REMOVE: emblem_12 + # 四维 +10 + # rarity: 灿烂 (绿色) + char.SetStatus(四维=10) + pass + + +@register +def emblem_2401(char: CharacterProperty): + # DCALC_REMOVE: emblem_13 + # 三攻 +30 + # rarity: 灿烂 (蓝色) + char.SetStatus(三攻=30) + pass + + +@register +def emblem_2402(char: CharacterProperty): + # DCALC_REMOVE: emblem_14 + # 移动 +1.5% 四维 +10 + # rarity: 灿烂 (蓝色) + char.SetStatus(移动=0.015, 四维=10) + pass + + +@register +def emblem_2403(char: CharacterProperty): # DCALC_REMOVE: emblem_15 - # 力智+15 - # rarity: 灿烂 - char.SetStatus(力智=15) + # 四维 +10 + # rarity: 灿烂 (蓝色) + char.SetStatus(四维=10) pass @register -def emblem_16(char: CharacterProperty): +def emblem_2501(char: CharacterProperty): # DCALC_REMOVE: emblem_16 - # 攻速+1.5% - # rarity: 灿烂 - char.SetStatus(攻速=0.015) + # 四维 +10 + # rarity: 灿烂 (彩色) + char.SetStatus(四维=10) pass @register -def emblem_17(char: CharacterProperty): +def emblem_2601(char: CharacterProperty): # DCALC_REMOVE: emblem_17 - # 体精+15 - # rarity: 灿烂 - char.SetStatus(体精=15) + # 力智 +20 暴击 +1.5% + # rarity: 灿烂 (红绿) + char.SetStatus(力智=20, 暴击=0.015) pass @register -def emblem_18(char: CharacterProperty): +def emblem_2602(char: CharacterProperty): # DCALC_REMOVE: emblem_18 - # 三攻+15 - # rarity: 灿烂 - char.SetStatus(三攻=15) + # 力智 +20 + # rarity: 灿烂 (红绿) + char.SetStatus(力智=20) pass @register -def emblem_19(char: CharacterProperty): +def emblem_2701(char: CharacterProperty): # DCALC_REMOVE: emblem_19 - # 体精+15 - # rarity: 灿烂 - char.SetStatus(体精=15) + # 四维 +10 + # rarity: 灿烂 (黄蓝) + char.SetStatus(四维=10) pass @register -def emblem_20(char: CharacterProperty): +def emblem_3101(char: CharacterProperty): # DCALC_REMOVE: emblem_20 - # 力智+17 - # rarity: 华丽 - char.SetStatus(力智=17) + # 力智 +50 + # rarity: 玲珑 (红色) + char.SetStatus(力智=50) pass @register -def emblem_21(char: CharacterProperty): +def emblem_3102(char: CharacterProperty): # DCALC_REMOVE: emblem_21 - # 力智+10 - # rarity: 华丽 - char.SetStatus(力智=10) + # 体精 +50 + # rarity: 玲珑 (红色) + char.SetStatus(体精=50) pass @register -def emblem_22(char: CharacterProperty): +def emblem_3103(char: CharacterProperty): # DCALC_REMOVE: emblem_22 - # 攻速+1.1% - # rarity: 华丽 - char.SetStatus(攻速=0.011) + # 四维 +20 + # rarity: 玲珑 (红色) + char.SetStatus(四维=20) pass @register -def emblem_23(char: CharacterProperty): +def emblem_3201(char: CharacterProperty): # DCALC_REMOVE: emblem_23 - # 体精+10 - # rarity: 华丽 - char.SetStatus(体精=10) + # 力智 +40 + # rarity: 玲珑 (黄色) + char.SetStatus(力智=40) pass @register -def emblem_24(char: CharacterProperty): +def emblem_3202(char: CharacterProperty): # DCALC_REMOVE: emblem_24 - # 三攻+10 - # rarity: 华丽 - char.SetStatus(三攻=10) + # 体精 +40 + # rarity: 玲珑 (黄色) + char.SetStatus(体精=40) pass @register -def emblem_25(char: CharacterProperty): +def emblem_3203(char: CharacterProperty): # DCALC_REMOVE: emblem_25 - # 体精+10 - # rarity: 华丽 - char.SetStatus(体精=10) + # 攻速 +2% 四维 +15 + # rarity: 玲珑 (黄色) + char.SetStatus(攻速=0.020, 四维=15) pass -for i in range(0, 3000): - try: - if str(i) not in emblem_func_list.keys(): - emblem_func_list[str(i)] = eval(f'emblem_{i}') - except Exception: + +@register +def emblem_3204(char: CharacterProperty): + # DCALC_REMOVE: emblem_26 + # 施放 +3% 四维 +15 + # rarity: 玲珑 (黄色) + char.SetStatus(施放=0.030, 四维=15) + pass + + +@register +def emblem_3205(char: CharacterProperty): + # DCALC_REMOVE: emblem_27 + # 四维 +15 + # rarity: 玲珑 (黄色) + char.SetStatus(四维=15) + pass + + +@register +def emblem_3301(char: CharacterProperty): + # DCALC_REMOVE: emblem_28 + # 力智 +40 + # rarity: 玲珑 (绿色) + char.SetStatus(力智=40) + pass + + +@register +def emblem_3302(char: CharacterProperty): + # DCALC_REMOVE: emblem_29 + # 体精 +40 + # rarity: 玲珑 (绿色) + char.SetStatus(体精=40) + pass + + +@register +def emblem_3303(char: CharacterProperty): + # DCALC_REMOVE: emblem_30 + # 暴击 +4% 四维 +15 + # rarity: 玲珑 (绿色) + char.SetStatus(暴击=0.040, 四维=15) + pass + + +@register +def emblem_3304(char: CharacterProperty): + # DCALC_REMOVE: emblem_31 + # 四维 +15 + # rarity: 玲珑 (绿色) + char.SetStatus(四维=15) + pass + + +@register +def emblem_3401(char: CharacterProperty): + # DCALC_REMOVE: emblem_32 + # 三攻 +40 + # rarity: 玲珑 (蓝色) + char.SetStatus(三攻=40) + pass + + +@register +def emblem_3402(char: CharacterProperty): + # DCALC_REMOVE: emblem_33 + # 移动 +2% 四维 +15 + # rarity: 玲珑 (蓝色) + char.SetStatus(移动=0.020, 四维=15) + pass + + +@register +def emblem_3403(char: CharacterProperty): + # DCALC_REMOVE: emblem_34 + # 四维 +15 + # rarity: 玲珑 (蓝色) + char.SetStatus(四维=15) + pass + + +@register +def emblem_3501(char: CharacterProperty): + # DCALC_REMOVE: emblem_35 + # 四维 +15 + # rarity: 玲珑 (彩色) + char.SetStatus(四维=15) + pass + + +@register +def emblem_3601(char: CharacterProperty): + # DCALC_REMOVE: emblem_36 + # 力智 +25 暴击 +1.9% + # rarity: 玲珑 (红绿) + char.SetStatus(力智=25, 暴击=0.019) + pass + + +@register +def emblem_3602(char: CharacterProperty): + # DCALC_REMOVE: emblem_37 + # 力智 +25 + # rarity: 玲珑 (红绿) + char.SetStatus(力智=25) + pass + + +@register +def emblem_3701(char: CharacterProperty): + # DCALC_REMOVE: emblem_38 + # 四维 +15 + # rarity: 玲珑 (黄蓝) + char.SetStatus(四维=15) + pass + + +@register +def emblem_4101(char: CharacterProperty): + # DCALC_REMOVE: emblem_39 + # 力智 +70 + # rarity: 神圣 (红色) + char.SetStatus(力智=70) + pass + + +@register +def emblem_4102(char: CharacterProperty): + # DCALC_REMOVE: emblem_40 + # 体精 +70 + # rarity: 神圣 (红色) + char.SetStatus(体精=70) + pass + + +@register +def emblem_4103(char: CharacterProperty): + # DCALC_REMOVE: emblem_41 + # 四维 +25 + # rarity: 神圣 (红色) + char.SetStatus(四维=25) + pass + + +@register +def emblem_4201(char: CharacterProperty): + # DCALC_REMOVE: emblem_42 + # 力智 +55 + # rarity: 神圣 (黄色) + char.SetStatus(力智=55) + pass + + +@register +def emblem_4202(char: CharacterProperty): + # DCALC_REMOVE: emblem_43 + # 体精 +55 + # rarity: 神圣 (黄色) + char.SetStatus(体精=55) + pass + + +@register +def emblem_4203(char: CharacterProperty): + # DCALC_REMOVE: emblem_44 + # 攻速 +2.5% 四维 +20 + # rarity: 神圣 (黄色) + char.SetStatus(攻速=0.025, 四维=20) + pass + + +@register +def emblem_4204(char: CharacterProperty): + # DCALC_REMOVE: emblem_45 + # 施放 +4% 四维 +20 + # rarity: 神圣 (黄色) + char.SetStatus(施放=0.040, 四维=20) + pass + + +@register +def emblem_4205(char: CharacterProperty): + # DCALC_REMOVE: emblem_46 + # 四维 +20 + # rarity: 神圣 (黄色) + char.SetStatus(四维=20) + pass + + +@register +def emblem_4301(char: CharacterProperty): + # DCALC_REMOVE: emblem_47 + # 力智 +55 + # rarity: 神圣 (绿色) + char.SetStatus(力智=55) + pass + + +@register +def emblem_4302(char: CharacterProperty): + # DCALC_REMOVE: emblem_48 + # 体精 +55 + # rarity: 神圣 (绿色) + char.SetStatus(体精=55) + pass + + +@register +def emblem_4303(char: CharacterProperty): + # DCALC_REMOVE: emblem_49 + # 暴击 +3% 四维 +20 + # rarity: 神圣 (绿色) + char.SetStatus(暴击=0.030, 四维=20) + pass + + +@register +def emblem_4304(char: CharacterProperty): + # DCALC_REMOVE: emblem_50 + # 四维 +20 + # rarity: 神圣 (绿色) + char.SetStatus(四维=20) + pass + + +@register +def emblem_4401(char: CharacterProperty): + # DCALC_REMOVE: emblem_51 + # 三攻 +60 + # rarity: 神圣 (蓝色) + char.SetStatus(三攻=60) + pass + + +@register +def emblem_4402(char: CharacterProperty): + # DCALC_REMOVE: emblem_52 + # 移动 +2.5% 四维 +20 + # rarity: 神圣 (蓝色) + char.SetStatus(移动=0.025, 四维=20) + pass + + +@register +def emblem_4403(char: CharacterProperty): + # DCALC_REMOVE: emblem_53 + # 四维 +20 + # rarity: 神圣 (蓝色) + char.SetStatus(四维=20) + pass + + +@register +def emblem_4501(char: CharacterProperty): + # DCALC_REMOVE: emblem_54 + # 四维 +20 + # rarity: 神圣 (彩色) + char.SetStatus(四维=20) + pass + + +@register +def emblem_4601(char: CharacterProperty): + # DCALC_REMOVE: emblem_55 + # 力智 +30 暴击 +2.5% + # rarity: 神圣 (红绿) + char.SetStatus(力智=30, 暴击=0.025) + pass + + +@register +def emblem_4602(char: CharacterProperty): + # DCALC_REMOVE: emblem_56 + # 力智 +30 + # rarity: 神圣 (红绿) + char.SetStatus(力智=30) + pass + + +@register +def emblem_4701(char: CharacterProperty): + # DCALC_REMOVE: emblem_57 + # 四维 +20 + # rarity: 神圣 (黄蓝) + char.SetStatus(四维=20) + pass + + +@register +def emblem_combine(char: CharacterProperty, position: str, lv: int, emblem_list: list[int | str]): + bufferP = [0.001, 0.002, 0.004, 0.006, 0.008, 0.01, 0.013, 0.016, 0.019, 0.022, 0.025, 0.026, 0.027, 0.028, 0.029, 0.03] + buffer = [10, 30, 60, 90, 120, 150, 180, 210, 240270, 300, 320, 340, 360, 380, 400] + skillAttack = [0.002, 0.004, 0.008, 0.012, 0.016, 0.02, 0.023, 0.026, 0.029, 0.032, 0.035, 0.036, 0.037, 0.038, 0.039, 0.04] + attackP = [0.005, 0.009, 0.013, 0.017, 0.021, 0.025, 0.028, 0.031, 0.034, 0.037, 0.04, 0.042, 0.044, 0.046, 0.048, 0.05] + # 固有属性 + if position == '彩色': + char.SetStatus(BufferP=bufferP[lv - 1], SkillAttack=skillAttack[lv - 1]) + else: + char.SetStatus(Buffer=buffer[lv - 1], AttackP=attackP[lv - 1]) + rarity = (lv - 1) // 5 + emblems = list(filter(lambda x: int(x) > 0, emblem_list)) or [] + emblem_raritys = [int(i) // 1000 for i in emblems] + # 稀有 + if rarity == 0: + skillAttack = [0.001, 0.001, 0.002, 0.002] + buffer = [] + for i in emblem_raritys: + pass + pass + # 神器 + elif rarity == 1: + pass + # 传说 + elif rarity == 2: + pass + # 史诗 + elif rarity == 3: pass From 221042b67e21df5487d3fd2eab2fed275de668bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Wed, 15 Apr 2026 01:20:19 +0800 Subject: [PATCH 10/21] dev --- backend/core/basic/character/calc_equip.py | 4 +++- backend/core/basic/formula.py | 28 ++++++++++++++-------- backend/core/equipment/version_0/emblem.py | 15 ++++++++---- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index cbb6ca69..a202d37d 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -234,7 +234,9 @@ class CalcEquipMixin(CharacterBase): def calc_weapon(self, cur: 'CharacterEquipInfo'): """武器强化、锻造计算""" - value = 锻造计算(115, '史诗', cur.refine) + value_1 = 锻造计算(115, '史诗', cur.refine, cur.equInfo.itemDetailType, 1.12 if '传世武器' in cur.equInfo.categorize else 0) + value_2 = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '独立', 1.12 if '传世武器' in cur.equInfo.categorize else 0) + value = max(value_1, value_2) self.SetStatus(AtkI=value) if '传世武器' in cur.equInfo.categorize: value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '物理', 1.12) diff --git a/backend/core/basic/formula.py b/backend/core/basic/formula.py index 8bd1306c..52e886b8 100644 --- a/backend/core/basic/formula.py +++ b/backend/core/basic/formula.py @@ -127,16 +127,17 @@ def 勋章计算(装备等级, 品质, 强化等级): # region 武器 武器强化系数 = (0, 2, 2.6, 3.6, 4.7, 5.8, 6.9, 8.2, 11, 14.6, 18.7, 26.9, 36.7, 43, 49.2, 55.4, 61.7, 68, 74.3, 80.6, 86.9, 93.2, 99.5, 105.8, 112.1, 118.3, 124.6, 130.9, 137.1, 143.4, 149.7, 156.0) -武器锻造系数 = (0, 2, 3, 4, 6, 8, 13, 18, 25, 32, 41) +# 武器锻造系数 = (0, 2, 3, 4, 6, 8, 13, 18, 25, 32, 41) +武器锻造系数 = (0, 2.6, 3.6, 5.8, 8.2, 11, 18.7, 26.9, 42.1) 武器成长系数 = {'普通': 0.4, '高级': 0.7, '稀有': 1, '神器': 1.25, '勇者': 1.1, '传说': 1.35, '史诗': 1.45, '神话': 1.55} 武器品级加分 = {'普通': 8, '高级': 8, '稀有': 10, '神器': 12, '勇者': 11, '传说': 13, '史诗': 14, '神话': 15} 武器类型系数 = { '短剑': (1.095, 1.115, 1.11), - '太刀': (1.095, 1.105, 1.1), - '钝器': (1.11, 1.095, 1.1), - '巨剑': (1.12, 1.09, 1.1), - '光剑': (1.093, 1.09, 1.1), - '手套': (1.095, 1.115, 1.1), + '太刀': (1.095, 1.105, 1.11), + '钝器': (1.11, 1.095, 1.11), + '巨剑': (1.12, 1.09, 1.11), + '光剑': (1.093, 1.09, 1.11), + '手套': (1.095, 1.115, 1.11), '臂铠': (1.12, 1.09, 1.11), '爪': (1.1, 1.1, 1.11), '拳套': (1.105, 1.095, 1.11), @@ -178,17 +179,24 @@ def 勋章计算(装备等级, 品质, 强化等级): def 武器强化计算(装备等级, 品质, 强化等级, 武器类型, 类型, 默认系数=0): - index = 0 if 类型 == '物理' else (1 if 类型 == '魔法' else ()) + index = 0 + if 类型 == '物理': + index = 0 + elif 类型 == '魔法': + index = 1 + elif 类型 == '独立': + index = 2 武器系数 = max(武器类型系数[武器类型][index], 默认系数) return int((装备等级 + 武器品级加分[品质]) / 8 * 武器成长系数[品质] * 武器强化系数[强化等级] * 武器系数) -def 锻造计算(装备等级, 品质, 锻造等级): - return round((装备等级 + 武器品级加分[品质]) / 8 * 武器成长系数[品质] * 武器锻造系数[锻造等级]) +def 锻造计算(装备等级, 品质, 锻造等级, 武器类型, 默认系数=0): + 武器系数 = max(武器类型系数[武器类型][2], 默认系数) + return int((装备等级 + 武器品级加分[品质]) / 8 * 武器成长系数[品质] * 武器锻造系数[锻造等级] * 武器系数) def 锻造四维(装备等级, 品质, 锻造等级): - return round((装备等级 + 武器品级加分[品质]) / 80 * 武器成长系数[品质] * 武器锻造系数[锻造等级]) + return round((装备等级 + 武器品级加分[品质]) / 130 * 武器成长系数[品质] * 武器锻造系数[锻造等级]) 武器冷却惩罚系数 = { diff --git a/backend/core/equipment/version_0/emblem.py b/backend/core/equipment/version_0/emblem.py index 3e51d4e7..624028ee 100644 --- a/backend/core/equipment/version_0/emblem.py +++ b/backend/core/equipment/version_0/emblem.py @@ -532,16 +532,23 @@ def emblem_combine(char: CharacterProperty, position: str, lv: int, emblem_list: # 稀有 if rarity == 0: skillAttack = [0.001, 0.001, 0.002, 0.002] - buffer = [] - for i in emblem_raritys: - pass - pass + buffer = [10, 10, 20, 20] # 神器 elif rarity == 1: + skillAttack = [0.001, 0.002, 0.003, 0.004] + buffer = [10, 20, 30, 40] pass # 传说 elif rarity == 2: + skillAttack = [0.002, 0.003, 0.004, 0.005] + buffer = [20, 30, 40, 50] pass # 史诗 elif rarity == 3: + skillAttack = [0.002, 0.003, 0.005, 0.006] + buffer = [20, 30, 50, 60] pass + for i in emblem_raritys: + char.SetStatus(SkillAttack=skillAttack[i - 1], Buffer=buffer[i - 1]) + pass + pass From 3881f66472a153086aebddb4e275a7e83615d457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Wed, 15 Apr 2026 01:25:57 +0800 Subject: [PATCH 11/21] dev --- backend/test.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/backend/test.py b/backend/test.py index d20f9bcd..61db32bd 100644 --- a/backend/test.py +++ b/backend/test.py @@ -7,21 +7,22 @@ char.calc_init( 'oaths': {'0': {'id': '2030201', 'adaptation': 3}, '1': {'id': '2030201', 'adaptation': 3}, '2': {'id': '2030201', 'adaptation': 3}, '3': {'id': '2030201', 'adaptation': 3}, '4': {'id': '2030201', 'adaptation': 3}, '11': {'id': '2030200', 'adaptation': 0}}, 'oathSkill': 1, 'equips': { - '武器': {'id': '88', 'reinforce': 14, 'reinforceType': 1, 'enchant': 512, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 8, 'adaptation': 3, 'precision': 100}, - '称号': {'id': '3017', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1201, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, - '上衣': {'id': '999', 'reinforce': 13, 'reinforceType': 1, 'enchant': 105, 'emblem_0': 1, 'emblem_1': 1, 'fusion': '26', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '头肩': {'id': '1001', 'reinforce': 14, 'reinforceType': 1, 'enchant': 5, 'emblem_0': 0, 'emblem_1': 0, 'fusion': '28', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '下装': {'id': '1000', 'reinforce': 14, 'reinforceType': 1, 'enchant': 202, 'emblem_0': 1, 'emblem_1': 1, 'fusion': '27', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '鞋': {'id': '1003', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'emblem_0': 11, 'emblem_1': 11, 'fusion': '30', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '腰带': {'id': '1002', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'emblem_0': 4, 'emblem_1': 4, 'fusion': '29', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '项链': {'id': '477', 'reinforce': 13, 'reinforceType': 1, 'enchant': 609, 'emblem_0': 0, 'emblem_1': 0, 'fusion': '180', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '手镯': {'id': '483', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'emblem_0': 11, 'emblem_1': 11, 'fusion': '302', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '戒指': {'id': '489', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'emblem_0': 4, 'emblem_1': 4, 'fusion': '304', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '辅助装备': {'id': '492', 'reinforce': 14, 'reinforceType': 1, 'enchant': 905, 'emblem_0': '兵器研究', 'emblem_1': 0, 'fusion': '182', 'refine': 3, 'adaptation': 3, 'precision': 100}, - '魔法石': {'id': '495', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1003, 'emblem_0': '兵器研究', 'emblem_1': 0, 'fusion': '184', 'refine': 3, 'adaptation': 3, 'precision': 100}, - '耳环': {'id': '498', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1104, 'emblem_0': 0, 'emblem_1': 0, 'fusion': '186', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '宠物': {'id': '4022', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1304, 'emblem_0': 0, 'emblem_1': 0, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, + '武器': {'id': '88', 'reinforce': 14, 'reinforceType': 1, 'enchant': 512, 'fusion': 0, 'refine': 8, 'adaptation': 3, 'precision': 100}, + '称号': {'id': '3017', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1201, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, + '上衣': {'id': '999', 'reinforce': 13, 'reinforceType': 1, 'enchant': 105, 'fusion': '26', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '头肩': {'id': '1001', 'reinforce': 14, 'reinforceType': 1, 'enchant': 5, 'fusion': '28', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '下装': {'id': '1000', 'reinforce': 14, 'reinforceType': 1, 'enchant': 202, 'fusion': '27', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '鞋': {'id': '1003', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'fusion': '30', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '腰带': {'id': '1002', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'fusion': '29', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '项链': {'id': '477', 'reinforce': 13, 'reinforceType': 1, 'enchant': 609, 'fusion': '180', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '手镯': {'id': '483', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'fusion': '302', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '戒指': {'id': '489', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'fusion': '304', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '辅助装备': {'id': '492', 'reinforce': 14, 'reinforceType': 1, 'enchant': 905, 'fusion': '182', 'refine': 3, 'adaptation': 3, 'precision': 100}, + '魔法石': {'id': '495', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1003, 'fusion': '184', 'refine': 3, 'adaptation': 3, 'precision': 100}, + '耳环': {'id': '498', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1104, 'fusion': '186', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '宠物': {'id': '4022', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1304, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, }, + 'emblems': {'彩色': {'lv': 1, 'items': ['4401', '4401', '4401', '4401', '4401', '4401']}, '红色': {'lv': 2, 'items': ['4101', '4101', '4101', '4101']}, '蓝色': {'lv': 2, 'items': []}, '绿色': {'lv': 3, 'items': []}, '黄色': {'lv': 4, 'items': []}}, } ) From 97da529e35912c3d53d2d6446bc99f43c0adfab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 16 Apr 2026 15:15:33 +0800 Subject: [PATCH 12/21] dev --- backend/core/basic/character/base.py | 4 +- backend/core/basic/character/calc_equip.py | 27 +- backend/core/basic/roleinfo.py | 12 + backend/core/equipment/version_0/emblem.py | 10 +- backend/core/equipment/version_0/oath.py | 543 +++++++++++++++++++++ backend/test.py | 47 +- 6 files changed, 613 insertions(+), 30 deletions(-) create mode 100644 backend/core/equipment/version_0/oath.py diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py index d6b77be5..e814442f 100644 --- a/backend/core/basic/character/base.py +++ b/backend/core/basic/character/base.py @@ -5,7 +5,7 @@ from core.abstract.character import CharacterProperty from core.basic.skill import Skill from core.basic.equipment import EquEffect, OathSuit, OathSuitSkill, Suit from ..formula import 获取基础属性, 获取唤醒属性 -from ..roleinfo import CharacterEquipInfo, get_key_by_value, CharacterOathInfo +from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, get_key_by_value, CharacterOathInfo from .jade import Jade @@ -20,6 +20,8 @@ class CharacterBase(CharacterProperty): """装备版本""" charEquipInfo: dict[str, 'CharacterEquipInfo'] """装备打造信息""" + charEmblemInfo: list['CharacterEmblemInfo'] + """徽章打造信息""" charOathInfo: list['CharacterOathInfo'] """誓约打造信息""" charOathSkillId: int diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index a202d37d..50f9c70d 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -3,7 +3,7 @@ from uuid import uuid1 from core.basic.equipment import OathSuit, Suit, get_equipment from ..formula import 增幅计算, 强化技攻, 武器强化计算, 精通计算, 耳环计算, 左右计算, 锻造计算 -from ..roleinfo import CharacterEquipInfo, CharacterOathInfo, get_key_by_value +from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, CharacterOathInfo, get_key_by_value from .base import CharacterBase @@ -16,12 +16,21 @@ class CalcEquipMixin(CharacterBase): """打造信息导入""" self.charEquipInfo = {} self.charOathInfo = [] + self.charEmblemInfo = [] self.bindAwake = info.get('bindAwake', 50) for key in info['equips']: self.charEquipInfo[key] = CharacterEquipInfo(info['equips'][key], self.equVersion, key) for key in info['oaths']: # 导入誓约打造信息、誓约信息 self.charOathInfo.append(CharacterOathInfo(info['oaths'][key], self.equVersion, key)) + # 异常处理 彩色等级自动取最小值 + minEmblemLv = min([info['emblems'][key]['lv'] for key in ['红色', '蓝色', '绿色', '黄色']], default=1) + info['emblems']['彩色']['lv'] = minEmblemLv + for key in info['emblems']: + # 导入徽章打造信息、徽章信息 + info['emblems'][key]['part'] = key + self.charEmblemInfo.append(CharacterEmblemInfo(info['emblems'][key])) + pass self.charOathSkillId = info.get('oathSkill', 1) def calc_init(self, setInfo: dict[str, dict]): @@ -208,7 +217,22 @@ class CalcEquipMixin(CharacterBase): # if fun is not None: # fun(self) + def calc_emblems(self): + """计算徽章效果""" + effects = get_equipment(self.equVersion).funs + emblemCombine = effects.execture('emblem_combine') + for emblem in self.charEmblemInfo: + for item in emblem.items: + fun = effects.execture(f'emblem_{item}') + if fun is not None: + fun(self) + emblemCombine(self, emblem.part, emblem.lv, emblem.items) + pass + pass + def calc_oaths(self): + """计算装备基础效果""" + effects = get_equipment(self.equVersion).funs pass def calc_avatar(self, avatar: dict): @@ -320,6 +344,7 @@ class CalcEquipMixin(CharacterBase): self.calc_avatar(setInfo.get('avatar', {})) self.calc_basic() self.calc_sundry(setInfo.get('sundry', {})) + self.calc_emblems() suit = self.calc_suits() self.calc_equs() self.calc_oaths() diff --git a/backend/core/basic/roleinfo.py b/backend/core/basic/roleinfo.py index 413af6d5..c9252ad8 100644 --- a/backend/core/basic/roleinfo.py +++ b/backend/core/basic/roleinfo.py @@ -71,6 +71,18 @@ class CharacterOathInfo: self.oathInfo = None +class CharacterEmblemInfo: + part: str + """星徽部位""" + items: list[str] + """徽章id列表""" + lv: int + """星徽等级""" + + def __init__(self, info={}) -> None: + self.__dict__.update(info) + + class CharacterWeaponInfo(CharacterEquipInfo): refine: int """锻造等级""" diff --git a/backend/core/equipment/version_0/emblem.py b/backend/core/equipment/version_0/emblem.py index 624028ee..bd2fcadb 100644 --- a/backend/core/equipment/version_0/emblem.py +++ b/backend/core/equipment/version_0/emblem.py @@ -516,7 +516,7 @@ def emblem_4701(char: CharacterProperty): @register -def emblem_combine(char: CharacterProperty, position: str, lv: int, emblem_list: list[int | str]): +def emblem_combine(char: CharacterProperty, position: str, lv: int = 1, emblem_list: list[int | str] = []): bufferP = [0.001, 0.002, 0.004, 0.006, 0.008, 0.01, 0.013, 0.016, 0.019, 0.022, 0.025, 0.026, 0.027, 0.028, 0.029, 0.03] buffer = [10, 30, 60, 90, 120, 150, 180, 210, 240270, 300, 320, 340, 360, 380, 400] skillAttack = [0.002, 0.004, 0.008, 0.012, 0.016, 0.02, 0.023, 0.026, 0.029, 0.032, 0.035, 0.036, 0.037, 0.038, 0.039, 0.04] @@ -548,7 +548,9 @@ def emblem_combine(char: CharacterProperty, position: str, lv: int, emblem_list: skillAttack = [0.002, 0.003, 0.005, 0.006] buffer = [20, 30, 50, 60] pass + SkillAttack = 0 + Buffer = 0 for i in emblem_raritys: - char.SetStatus(SkillAttack=skillAttack[i - 1], Buffer=buffer[i - 1]) - pass - pass + SkillAttack += skillAttack[i - 1] + Buffer += buffer[i - 1] + char.SetStatus(SkillAttack=SkillAttack, Buffer=Buffer) diff --git a/backend/core/equipment/version_0/oath.py b/backend/core/equipment/version_0/oath.py new file mode 100644 index 00000000..bee80f95 --- /dev/null +++ b/backend/core/equipment/version_0/oath.py @@ -0,0 +1,543 @@ +from core.basic.equipment import EquEffect +from core.abstract.character import CharacterProperty +from .register import register + + +@register +def oath_2010100(char: CharacterProperty): + pass + + +@register +def oath_2010200(char: CharacterProperty): + pass + + +@register +def oath_2010201(char: CharacterProperty): + pass + + +@register +def oath_2010300(char: CharacterProperty): + pass + + +@register +def oath_2010301(char: CharacterProperty): + pass + + +@register +def oath_2010400(char: CharacterProperty): + pass + + +@register +def oath_2010401(char: CharacterProperty): + pass + + +@register +def oath_2010500(char: CharacterProperty): + pass + + +@register +def oath_2010501(char: CharacterProperty): + pass + + +@register +def oath_2020100(char: CharacterProperty): + pass + + +@register +def oath_2020200(char: CharacterProperty): + pass + + +@register +def oath_2020201(char: CharacterProperty): + pass + + +@register +def oath_2020300(char: CharacterProperty): + pass + + +@register +def oath_2020301(char: CharacterProperty): + pass + + +@register +def oath_2020400(char: CharacterProperty): + pass + + +@register +def oath_2020401(char: CharacterProperty): + pass + + +@register +def oath_2020500(char: CharacterProperty): + pass + + +@register +def oath_2020501(char: CharacterProperty): + pass + + +@register +def oath_2030100(char: CharacterProperty): + pass + + +@register +def oath_2030200(char: CharacterProperty): + pass + + +@register +def oath_2030201(char: CharacterProperty): + pass + + +@register +def oath_2030300(char: CharacterProperty): + pass + + +@register +def oath_2030301(char: CharacterProperty): + pass + + +@register +def oath_2030400(char: CharacterProperty): + pass + + +@register +def oath_2030401(char: CharacterProperty): + pass + + +@register +def oath_2030500(char: CharacterProperty): + pass + + +@register +def oath_2030501(char: CharacterProperty): + pass + + +@register +def oath_2040100(char: CharacterProperty): + pass + + +@register +def oath_2040200(char: CharacterProperty): + pass + + +@register +def oath_2040201(char: CharacterProperty): + pass + + +@register +def oath_2040300(char: CharacterProperty): + pass + + +@register +def oath_2040301(char: CharacterProperty): + pass + + +@register +def oath_2040400(char: CharacterProperty): + pass + + +@register +def oath_2040401(char: CharacterProperty): + pass + + +@register +def oath_2040500(char: CharacterProperty): + pass + + +@register +def oath_2040501(char: CharacterProperty): + pass + + +@register +def oath_2050100(char: CharacterProperty): + pass + + +@register +def oath_2050200(char: CharacterProperty): + pass + + +@register +def oath_2050201(char: CharacterProperty): + pass + + +@register +def oath_2050300(char: CharacterProperty): + pass + + +@register +def oath_2050301(char: CharacterProperty): + pass + + +@register +def oath_2050400(char: CharacterProperty): + pass + + +@register +def oath_2050401(char: CharacterProperty): + pass + + +@register +def oath_2050500(char: CharacterProperty): + pass + + +@register +def oath_2050501(char: CharacterProperty): + pass + + +@register +def oath_2060100(char: CharacterProperty): + pass + + +@register +def oath_2060200(char: CharacterProperty): + pass + + +@register +def oath_2060201(char: CharacterProperty): + pass + + +@register +def oath_2060300(char: CharacterProperty): + pass + + +@register +def oath_2060301(char: CharacterProperty): + pass + + +@register +def oath_2060400(char: CharacterProperty): + pass + + +@register +def oath_2060401(char: CharacterProperty): + pass + + +@register +def oath_2060500(char: CharacterProperty): + pass + + +@register +def oath_2060501(char: CharacterProperty): + pass + + +@register +def oath_2070100(char: CharacterProperty): + pass + + +@register +def oath_2070200(char: CharacterProperty): + pass + + +@register +def oath_2070201(char: CharacterProperty): + pass + + +@register +def oath_2070300(char: CharacterProperty): + pass + + +@register +def oath_2070301(char: CharacterProperty): + pass + + +@register +def oath_2070400(char: CharacterProperty): + pass + + +@register +def oath_2070401(char: CharacterProperty): + pass + + +@register +def oath_2070500(char: CharacterProperty): + pass + + +@register +def oath_2070501(char: CharacterProperty): + pass + + +@register +def oath_2080100(char: CharacterProperty): + pass + + +@register +def oath_2080200(char: CharacterProperty): + pass + + +@register +def oath_2080201(char: CharacterProperty): + pass + + +@register +def oath_2080300(char: CharacterProperty): + pass + + +@register +def oath_2080301(char: CharacterProperty): + pass + + +@register +def oath_2080400(char: CharacterProperty): + pass + + +@register +def oath_2080401(char: CharacterProperty): + pass + + +@register +def oath_2080500(char: CharacterProperty): + pass + + +@register +def oath_2080501(char: CharacterProperty): + pass + + +@register +def oath_2090100(char: CharacterProperty): + pass + + +@register +def oath_2090200(char: CharacterProperty): + pass + + +@register +def oath_2090201(char: CharacterProperty): + pass + + +@register +def oath_2090300(char: CharacterProperty): + pass + + +@register +def oath_2090301(char: CharacterProperty): + pass + + +@register +def oath_2090400(char: CharacterProperty): + pass + + +@register +def oath_2090401(char: CharacterProperty): + pass + + +@register +def oath_2090500(char: CharacterProperty): + pass + + +@register +def oath_2090501(char: CharacterProperty): + pass + + +@register +def oath_2100100(char: CharacterProperty): + pass + + +@register +def oath_2100200(char: CharacterProperty): + pass + + +@register +def oath_2100201(char: CharacterProperty): + pass + + +@register +def oath_2100300(char: CharacterProperty): + pass + + +@register +def oath_2100301(char: CharacterProperty): + pass + + +@register +def oath_2100400(char: CharacterProperty): + pass + + +@register +def oath_2100401(char: CharacterProperty): + pass + + +@register +def oath_2100500(char: CharacterProperty): + pass + + +@register +def oath_2100501(char: CharacterProperty): + pass + + +@register +def oath_2110100(char: CharacterProperty): + pass + + +@register +def oath_2110200(char: CharacterProperty): + pass + + +@register +def oath_2110201(char: CharacterProperty): + pass + + +@register +def oath_2110300(char: CharacterProperty): + pass + + +@register +def oath_2110301(char: CharacterProperty): + pass + + +@register +def oath_2110400(char: CharacterProperty): + pass + + +@register +def oath_2110401(char: CharacterProperty): + pass + + +@register +def oath_2110500(char: CharacterProperty): + pass + + +@register +def oath_2110501(char: CharacterProperty): + pass + + +@register +def oath_2120100(char: CharacterProperty): + pass + + +@register +def oath_2120200(char: CharacterProperty): + pass + + +@register +def oath_2120201(char: CharacterProperty): + pass + + +@register +def oath_2120300(char: CharacterProperty): + pass + + +@register +def oath_2120301(char: CharacterProperty): + pass + + +@register +def oath_2120400(char: CharacterProperty): + pass + + +@register +def oath_2120401(char: CharacterProperty): + pass + + +@register +def oath_2120500(char: CharacterProperty): + pass + + +@register +def oath_2120501(char: CharacterProperty): + pass diff --git a/backend/test.py b/backend/test.py index 61db32bd..c8337630 100644 --- a/backend/test.py +++ b/backend/test.py @@ -2,31 +2,30 @@ from core.basic.character import createCharacter char = createCharacter('GF.gunner_female.spitfire_female') -char.calc_init( - { - 'oaths': {'0': {'id': '2030201', 'adaptation': 3}, '1': {'id': '2030201', 'adaptation': 3}, '2': {'id': '2030201', 'adaptation': 3}, '3': {'id': '2030201', 'adaptation': 3}, '4': {'id': '2030201', 'adaptation': 3}, '11': {'id': '2030200', 'adaptation': 0}}, - 'oathSkill': 1, - 'equips': { - '武器': {'id': '88', 'reinforce': 14, 'reinforceType': 1, 'enchant': 512, 'fusion': 0, 'refine': 8, 'adaptation': 3, 'precision': 100}, - '称号': {'id': '3017', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1201, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, - '上衣': {'id': '999', 'reinforce': 13, 'reinforceType': 1, 'enchant': 105, 'fusion': '26', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '头肩': {'id': '1001', 'reinforce': 14, 'reinforceType': 1, 'enchant': 5, 'fusion': '28', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '下装': {'id': '1000', 'reinforce': 14, 'reinforceType': 1, 'enchant': 202, 'fusion': '27', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '鞋': {'id': '1003', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'fusion': '30', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '腰带': {'id': '1002', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'fusion': '29', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '项链': {'id': '477', 'reinforce': 13, 'reinforceType': 1, 'enchant': 609, 'fusion': '180', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '手镯': {'id': '483', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'fusion': '302', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '戒指': {'id': '489', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'fusion': '304', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '辅助装备': {'id': '492', 'reinforce': 14, 'reinforceType': 1, 'enchant': 905, 'fusion': '182', 'refine': 3, 'adaptation': 3, 'precision': 100}, - '魔法石': {'id': '495', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1003, 'fusion': '184', 'refine': 3, 'adaptation': 3, 'precision': 100}, - '耳环': {'id': '498', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1104, 'fusion': '186', 'refine': 0, 'adaptation': 3, 'precision': 100}, - '宠物': {'id': '4022', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1304, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, - }, - 'emblems': {'彩色': {'lv': 1, 'items': ['4401', '4401', '4401', '4401', '4401', '4401']}, '红色': {'lv': 2, 'items': ['4101', '4101', '4101', '4101']}, '蓝色': {'lv': 2, 'items': []}, '绿色': {'lv': 3, 'items': []}, '黄色': {'lv': 4, 'items': []}}, - } -) +setInfo = { + 'oaths': {'0': {'id': '2030201', 'adaptation': 3}, '1': {'id': '2030201', 'adaptation': 3}, '2': {'id': '2030201', 'adaptation': 3}, '3': {'id': '2030201', 'adaptation': 3}, '4': {'id': '2030201', 'adaptation': 3}, '11': {'id': '2030200', 'adaptation': 0}}, + 'oathSkill': 1, + 'equips': { + '武器': {'id': '88', 'reinforce': 14, 'reinforceType': 1, 'enchant': 512, 'fusion': 0, 'refine': 8, 'adaptation': 3, 'precision': 100}, + '称号': {'id': '3017', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1201, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, + '上衣': {'id': '999', 'reinforce': 13, 'reinforceType': 1, 'enchant': 105, 'fusion': '26', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '头肩': {'id': '1001', 'reinforce': 14, 'reinforceType': 1, 'enchant': 5, 'fusion': '28', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '下装': {'id': '1000', 'reinforce': 14, 'reinforceType': 1, 'enchant': 202, 'fusion': '27', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '鞋': {'id': '1003', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'fusion': '30', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '腰带': {'id': '1002', 'reinforce': 14, 'reinforceType': 1, 'enchant': 309, 'fusion': '29', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '项链': {'id': '477', 'reinforce': 13, 'reinforceType': 1, 'enchant': 609, 'fusion': '180', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '手镯': {'id': '483', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'fusion': '302', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '戒指': {'id': '489', 'reinforce': 14, 'reinforceType': 1, 'enchant': 609, 'fusion': '304', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '辅助装备': {'id': '492', 'reinforce': 14, 'reinforceType': 1, 'enchant': 905, 'fusion': '182', 'refine': 3, 'adaptation': 3, 'precision': 100}, + '魔法石': {'id': '495', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1003, 'fusion': '184', 'refine': 3, 'adaptation': 3, 'precision': 100}, + '耳环': {'id': '498', 'reinforce': 14, 'reinforceType': 1, 'enchant': 1104, 'fusion': '186', 'refine': 0, 'adaptation': 3, 'precision': 100}, + '宠物': {'id': '4022', 'reinforce': 0, 'reinforceType': 0, 'enchant': 1304, 'fusion': 0, 'refine': 0, 'adaptation': 3, 'precision': 100}, + }, + 'emblems': {'彩色': {'lv': 1, 'items': ['4401', '4401', '4401', '4401', '4401', '4401']}, '红色': {'lv': 2, 'items': ['4101', '4101', '4101', '4101']}, '蓝色': {'lv': 2, 'items': []}, '绿色': {'lv': 3, 'items': []}, '黄色': {'lv': 4, 'items': []}}, +} -char.calc_suits() + +char.calc(setInfo) # for oath in char.charOathInfo: # print(oath.id, oath.adaptation, oath.oathInfo.position, oath.oathInfo.max_adaptation, oath.oathInfo.Point) From dbf33477d939bab548fe2ffd2897d24049282a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= <8441078+i_melon@user.noreply.gitee.com> Date: Sun, 19 Apr 2026 15:47:44 +0800 Subject: [PATCH 13/21] dev --- backend/core/basic/character/base.py | 7 +- backend/core/basic/character/calc_equip.py | 23 +++-- backend/core/basic/character/info.py | 12 ++- backend/core/basic/equipment.py | 56 +++++++------ backend/dataFiles/dcalc_0.db | Bin 1150976 -> 860160 bytes backend/database/models.py | 13 ++- frontend/src/api/info/type.ts | 8 +- .../components/dnf/Equipment/List/index.vue | 54 ++++++------ .../src/pages/Character/Equipment/Index.vue | 2 +- .../Character/EquipmentDictionary/Index.vue | 25 +++--- .../EquipmentDictionary/formatData.ts | 79 +++++++++++++----- frontend/src/stores/info.ts | 12 ++- 12 files changed, 182 insertions(+), 109 deletions(-) diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py index e814442f..1a329239 100644 --- a/backend/core/basic/character/base.py +++ b/backend/core/basic/character/base.py @@ -1,4 +1,5 @@ from collections.abc import Mapping +import sys from typing import Any, Literal from core.abstract.character import CharacterProperty @@ -91,7 +92,7 @@ class CharacterBase(CharacterProperty): # 唤醒的情况下的基础数据 self.AtkP = 0 + 65 self.AtkM = 0 + 65 - self.AtkI = 1116 + 65 + self.AtkI = 0 + 65 self.PAtkP = 1.0 self.PAtkM = 1.0 self.PAtkI = 1.0 @@ -239,6 +240,10 @@ class CharacterBase(CharacterProperty): ], ) -> None: """设置角色属性""" + # if kwargs.get('SkillAttack', 0) != 0: + # frame = sys._getframe(1) # 1 表示上一级调用帧 + # caller_name = frame.f_code.co_name + # print(caller_name, kwargs.get('SkillAttack', 0)) self.STR += 力量 + kwargs.get('STR', 0) + 四维 + 力智 self.INT += 智力 + kwargs.get('INT', 0) + 四维 + 力智 self.Spirit += 精神 + kwargs.get('Spirit', 0) + 四维 + 体精 diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index 50f9c70d..6b97a919 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -18,18 +18,25 @@ class CalcEquipMixin(CharacterBase): self.charOathInfo = [] self.charEmblemInfo = [] self.bindAwake = info.get('bindAwake', 50) + if info.get('emblems', None) is None: + info['emblems'] = {} + if info.get('oaths', None) is None: + info['oaths'] = {} for key in info['equips']: self.charEquipInfo[key] = CharacterEquipInfo(info['equips'][key], self.equVersion, key) for key in info['oaths']: # 导入誓约打造信息、誓约信息 self.charOathInfo.append(CharacterOathInfo(info['oaths'][key], self.equVersion, key)) - # 异常处理 彩色等级自动取最小值 - minEmblemLv = min([info['emblems'][key]['lv'] for key in ['红色', '蓝色', '绿色', '黄色']], default=1) - info['emblems']['彩色']['lv'] = minEmblemLv - for key in info['emblems']: - # 导入徽章打造信息、徽章信息 - info['emblems'][key]['part'] = key - self.charEmblemInfo.append(CharacterEmblemInfo(info['emblems'][key])) + try: + # 异常处理 彩色等级自动取最小值 + minEmblemLv = min([info['emblems'][key]['lv'] for key in ['红色', '蓝色', '绿色', '黄色']], default=1) + info['emblems']['彩色']['lv'] = minEmblemLv + for key in info['emblems']: + # 导入徽章打造信息、徽章信息 + info['emblems'][key]['part'] = key + self.charEmblemInfo.append(CharacterEmblemInfo(info['emblems'][key])) + pass + except Exception as e: pass self.charOathSkillId = info.get('oathSkill', 1) @@ -94,7 +101,7 @@ class CalcEquipMixin(CharacterBase): max_point_oath_suit = max((suit for suit in oathSuitInfo if oathSuitInfo[suit]['point'] > 0), key=lambda suit: oathSuitInfo[suit]['point'], default=None) zero_point_suits = [suit for suit in suitInfo if suitInfo[suit]['point'] == 0] # 套装没有到太初的时候,优先把誓约套装的点数加到装备套装上,以达到更高的套装等级 - if 0 < suitInfo[max_point_suit]['point'] < 2550: + if 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get('max_point_oath_suit', None) is not None: suitInfo[max_point_suit]['point'] += min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) oathSuitInfo[max_point_oath_suit]['point'] -= min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) pass diff --git a/backend/core/basic/character/info.py b/backend/core/basic/character/info.py index ca24b24f..ca8583cc 100644 --- a/backend/core/basic/character/info.py +++ b/backend/core/basic/character/info.py @@ -51,18 +51,22 @@ class CharacterInfoMixin(CharacterBase): equInfos = get_equipment(self.equVersion) equs = [] suits = [] - stones = [] + oaths = [] + # stones = [] for i in equInfos.equs: if i.itemType == '武器' and i.itemDetailType not in self.武器选项: continue equs.append(i.__dict__) for i in equInfos.suits: suits.append(i.__dict__) - for i in equInfos.stones: - stones.append(i.__dict__) + for i in equInfos.oaths: + oaths.append(i.__dict__) + # for i in equInfos.stones: + # stones.append(i.__dict__) + info['oaths'] = oaths info['equips'] = equs info['suits'] = suits - info['stones'] = stones + # info['stones'] = stones key = '辅助' if self.buffer else '输出' info['enchants'] = list(filter(lambda x: key in x['categorize'], equInfos.enchants)) info['emblems'] = [i for i in equInfos.emblems] diff --git a/backend/core/basic/equipment.py b/backend/core/basic/equipment.py index 8f522b70..052b3fcd 100644 --- a/backend/core/basic/equipment.py +++ b/backend/core/basic/equipment.py @@ -80,10 +80,10 @@ class Equipments: self.equs: list[Equ] = [] self.oaths: list[Oath] = [] self.oath_dict: dict[str, Oath] = {} - self.stones: list[Equ] = [] + # self.stones: list[Equ] = [] self.funs = self.init_func() self.equ_dict: dict[str, Equ] = {} - self.stone_dict: dict[str, Equ] = {} + # self.stone_dict: dict[str, Equ] = {} self.jades = [] self.enchants = [] self.emblems = [] @@ -94,7 +94,7 @@ class Equipments: self.init_equs() self.init_suits() self.init_enchants() - self.init_stones() + # self.init_stones() self.init_emblem() self.init_jades() self.init_oaths() @@ -124,27 +124,27 @@ class Equipments: self.equs.append(equ) self.equ_dict[equ.id] = equ - def init_stones(self): - """从数据库中获取所有装备信息""" - with Session(self.engine) as session: - db_list = session.query(StoneData).all() - keys = [key for key in StoneData.__dict__.keys() if key[0].isupper()] + ['suit'] - for item in db_list: - max_adaptation = 0 - item.id = str(item.id) - for attr in keys: - if attr == 'suit': - value = parse_to_number_list(getattr(item, attr), []) - value = [str(int(i)) for i in value] - else: - value = parse_to_number_list(getattr(item, attr)) - max_adaptation = max(max_adaptation, len(value) - 1) - setattr(item, attr, value) - stone_dict = {k: v for k, v in item.__dict__.items() if not k.startswith('_')} - stone_dict['max_adaptation'] = max_adaptation - stone = Equ(**stone_dict) - self.stones.append(stone) - self.stone_dict[stone.id] = stone + # def init_stones(self): + # """从数据库中获取所有装备信息""" + # with Session(self.engine) as session: + # db_list = session.query(StoneData).all() + # keys = [key for key in StoneData.__dict__.keys() if key[0].isupper()] + ['suit'] + # for item in db_list: + # max_adaptation = 0 + # item.id = str(item.id) + # for attr in keys: + # if attr == 'suit': + # value = parse_to_number_list(getattr(item, attr), []) + # value = [str(int(i)) for i in value] + # else: + # value = parse_to_number_list(getattr(item, attr)) + # max_adaptation = max(max_adaptation, len(value) - 1) + # setattr(item, attr, value) + # stone_dict = {k: v for k, v in item.__dict__.items() if not k.startswith('_')} + # stone_dict['max_adaptation'] = max_adaptation + # stone = Equ(**stone_dict) + # self.stones.append(stone) + # self.stone_dict[stone.id] = stone def init_suits(self): """从数据库中获取所有套装信息""" @@ -188,9 +188,9 @@ class Equipments: db_list = session.query(EmblemData).all() for item in db_list: emblem = {k: v for k, v in item.__dict__.items() if not k.startswith('_')} - emblem['position'] = [] if emblem['itemType'] is None else emblem['itemType'].split(',') - emblem['categorize'] = [] if emblem['categorize'] is None else emblem['categorize'].split(',') - del emblem['itemType'] + # emblem['position'] = [] if emblem['itemType'] is None else emblem['itemType'].split(',') + # emblem['categorize'] = [] if emblem['categorize'] is None else emblem['categorize'].split(',') + # del emblem['itemType'] self.emblems.append(emblem) pass pass @@ -336,6 +336,8 @@ class Oath: Buffer: list[float] | float wearUrl: list[str] max_adaptation: int + itemType: str + itemDetailType: str def __init__(self, **kwargs): self.__dict__.update(kwargs) diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 620c726bae4092c9a5da8b75057231219dce74dc..3bf8aaa8ee2c8382ec7c375bbe2400a9ce1dbbfe 100644 GIT binary patch literal 860160 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

=nzEUxa6u47b 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�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%0DEn@BHaPy9caH773n6{ajTSi8KKF8Ls~eGA3I_ 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 OueiM8o#;x+tN$NjZkr -

+
{ return infoStore.equips.find((e) => e.id == id) } -const stones = (id: string) => { - return infoStore.stones.find((e) => e.id == id) -} +// const oaths = (id: string) => { +// return infoStore.oaths.find((e) => e.id == id) +// } const infoStyle = (part: string) => { let x = 10 @@ -117,30 +117,30 @@ const infoStyle = (part: string) => { return style } -const fusionStyle = (part: string) => { - let x = 0 - let y = 15 - let index = infoStore.parts.findIndex((p) => p == part) +// const fusionStyle = (part: string) => { +// let x = 0 +// let y = 15 +// let index = infoStore.parts.findIndex((p) => p == part) - if (index >= 5 && index <= 12) { - x += 179 - index -= 5 - } +// if (index >= 5 && index <= 12) { +// x += 179 +// index -= 5 +// } - if (index == 13) { - index = 5 - } +// if (index == 13) { +// index = 5 +// } - x += (index % 2) * 39 - y += Math.floor(index / 2) * 34 +// x += (index % 2) * 39 +// y += Math.floor(index / 2) * 34 - return { - left: `${x}px`, - top: `${y}px`, - zIndex: 7, - transform: 'scale(0.6)', - } -} +// return { +// left: `${x}px`, +// top: `${y}px`, +// zIndex: 7, +// transform: 'scale(0.6)', +// } +// } const choosePart = (part: string) => { partModelValue.value = part } diff --git a/frontend/src/pages/Character/Equipment/Index.vue b/frontend/src/pages/Character/Equipment/Index.vue index 55c71165..9f6679ef 100644 --- a/frontend/src/pages/Character/Equipment/Index.vue +++ b/frontend/src/pages/Character/Equipment/Index.vue @@ -18,7 +18,7 @@ - + 套装 通宝 diff --git a/frontend/src/pages/Character/EquipmentDictionary/Index.vue b/frontend/src/pages/Character/EquipmentDictionary/Index.vue index 4b6a3985..795c9c63 100644 --- a/frontend/src/pages/Character/EquipmentDictionary/Index.vue +++ b/frontend/src/pages/Character/EquipmentDictionary/Index.vue @@ -15,10 +15,10 @@
|
- 融合石 + 誓约
{ if (type.value == 'equ') { return infoStore.equips.find((a) => a.id == curEquId.value) } else { - return infoStore.stones.find((a) => a.id == curEquId.value) + return infoStore.oaths.find((a) => a.id == curEquId.value) } }) @@ -215,7 +215,7 @@ const curSuitInfo = computed(() => { const chooseCategory = (cat: string) => { type.value = cat - if (type.value == 'stone' && curSuit.value == -1) { + if (type.value == 'oath' && curSuit.value == -1) { curSuit.value = 16203 } } @@ -240,14 +240,14 @@ const suitList = computed(() => { const equs = computed(() => { // 筛选出装备 - const total = (type.value == 'equ' ? infoStore.equips : infoStore.stones).filter( + const total = (type.value == 'equ' ? infoStore.equips : infoStore.oaths).filter( (a) => (!curRarity.value || a.rarity === curRarity.value) && (choose_part.value.length === 0 || choose_part.value.includes(a.itemDetailType || a.itemType)) && (a.suit.length == 0 || (curSuit.value == -1 && a.suit.length > 1 && type.value == 'equ') || - (a.suit.length > 1 && type.value == 'stone') || + (a.suit.length > 1 && type.value == 'oath') || (a.suit.includes(curSuit.value.toString()) && a.suit.length === 1)), ) @@ -258,7 +258,10 @@ const equs = computed(() => { suitList.value.find((a) => a.value == curSuit.value)?.name, ) } else { - return formatStone(total, suitList.value.find((a) => a.value == curSuit.value)?.name) + return formatOath( + total as unknown as IOathInfo[], + suitList.value.find((a) => a.value == curSuit.value), + ) } }) @@ -272,7 +275,7 @@ const isActive = computed(() => { return configStore.config.equips[item.itemDetailType].id == item.id } } else { - return configStore.config.equips[item.itemDetailType].fusion == item.id + // return configStore.config.equips[item.itemDetailType].fusion == item.id } } }) diff --git a/frontend/src/pages/Character/EquipmentDictionary/formatData.ts b/frontend/src/pages/Character/EquipmentDictionary/formatData.ts index e4f091f1..51f76446 100644 --- a/frontend/src/pages/Character/EquipmentDictionary/formatData.ts +++ b/frontend/src/pages/Character/EquipmentDictionary/formatData.ts @@ -1,4 +1,4 @@ -import type { IEquipment } from '@/api/info/type' +import type { IEquipment, IOathInfo } from '@/api/info/type' export const rowCount = 10 @@ -7,23 +7,25 @@ export const formatEqu = (total: IEquipment[], subweapons?: string[], curSuit?: const item_weapon = total.filter((a) => a.itemType == '武器') ?? [] const weapons: (IEquipment | undefined)[] = [] if (item_weapon.length > 0) { - Array.from(new Set(item_weapon.map((item) => item.rarity))).filter(a=>!['稀有','神器'].includes(a)).forEach((rarity) => { - const weapon = item_weapon - .filter((item) => item.rarity === rarity) - .sort((a, b) => { - if (a.categorize == b.categorize) { - return a.itemDetailType.localeCompare(b.itemDetailType) - } - return b.categorize.localeCompare(a.categorize) - }) - weapons.push( - ...weapon.filter((a) => !['传世武器升级', '狄瑞吉传世武器'].includes(a.categorize)), - ) - const remind = weapons.length % rowCount - if (remind > 0) { - weapons.push(...Array(rowCount - remind).fill(undefined)) - } - }) + Array.from(new Set(item_weapon.map((item) => item.rarity))) + .filter((a) => !['稀有', '神器'].includes(a)) + .forEach((rarity) => { + const weapon = item_weapon + .filter((item) => item.rarity === rarity) + .sort((a, b) => { + if (a.categorize == b.categorize) { + return a.itemDetailType.localeCompare(b.itemDetailType) + } + return b.categorize.localeCompare(a.categorize) + }) + weapons.push( + ...weapon.filter((a) => !['传世武器升级', '狄瑞吉传世武器'].includes(a.categorize)), + ) + const remind = weapons.length % rowCount + if (remind > 0) { + weapons.push(...Array(rowCount - remind).fill(undefined)) + } + }) if (item_weapon.some((a) => a.categorize === '传世武器升级')) { const length = item_weapon.filter((a) => a.categorize === '传世武器升级').length weapons.push(...Array(length).fill(undefined)) @@ -88,9 +90,13 @@ export const formatEqu = (total: IEquipment[], subweapons?: string[], curSuit?: (equip) => equip.categorize.includes('套装') || equip.categorize.includes('通宝'), ) const suits: (IEquipment | undefined)[] = [] - const raritiyList = Array.from(new Set(item_suits.map((item) => item.rarity))).filter(a=>!['稀有','神器'].includes(a)) + const raritiyList = Array.from(new Set(item_suits.map((item) => item.rarity))).filter( + (a) => !['稀有', '神器'].includes(a), + ) raritiyList.forEach((rarity) => { - const armor = item_suits.filter((item) => item.rarity === rarity && item.itemType === '防具' && !item.name.includes("侵蚀")) + const armor = item_suits.filter( + (item) => item.rarity === rarity && item.itemType === '防具' && !item.name.includes('侵蚀'), + ) if (armor.length > 0) { suits.push(...armor, undefined) } @@ -119,7 +125,9 @@ export const formatEqu = (total: IEquipment[], subweapons?: string[], curSuit?: suits.push(...Array(rowCount - (suits.length % rowCount)).fill(undefined)) } - const armorUpgrade = item_suits.filter((item) => item.rarity === rarity && item.itemType === '防具' && item.name.includes("侵蚀")) + const armorUpgrade = item_suits.filter( + (item) => item.rarity === rarity && item.itemType === '防具' && item.name.includes('侵蚀'), + ) if (armorUpgrade.length > 0) { suits.push(...armorUpgrade) } @@ -283,3 +291,32 @@ export const formatStone = (total: IEquipment[], curSuit?: string) => { // }, ] } + +export const formatOath = ( + total: IOathInfo[], + curSuit?: { name: string; value: number; imageUrl: string }, +) => { + // oath + const oath = total.filter((equip) => equip.itemDetailType == '誓约') + oath.push(...Array(rowCount - (oath.length % rowCount)).fill(undefined)) + // primer + const primer = [] + const primerItem = total.filter((equip) => equip.itemDetailType == '星蕴石') + for (let i = 0; i < 11; i++) { + const temp = primerItem.filter((a) => a.position.includes(i.toString())) + primer.push( + ...temp, + ...Array(temp.length == 0 ? rowCount : rowCount - (temp.length % rowCount)).fill(undefined), + ) + } + return [ + { + name: `${curSuit?.name} 誓约`, + equs: oath, + }, + { + name: `${curSuit?.name} 星蕴石`, + equs: primer, + }, + ] +} diff --git a/frontend/src/stores/info.ts b/frontend/src/stores/info.ts index 64527b7d..ec631a1b 100644 --- a/frontend/src/stores/info.ts +++ b/frontend/src/stores/info.ts @@ -18,7 +18,7 @@ export const useInfoStore = defineStore('infoStore', () => { const emblems = computed(() => infos.value?.emblems ?? []) - const stones = computed(() => infos.value?.stones ?? []) + // const stones = computed(() => infos.value?.stones ?? []) const avatars = computed(() => infos.value?.avatar ?? {}) @@ -28,6 +28,8 @@ export const useInfoStore = defineStore('infoStore', () => { const options = computed(() => infos.value?.options ?? []) + const oaths = computed(() => infos.value?.oaths ?? []) + const standardUUID = ref() const setStandard = ( @@ -39,7 +41,9 @@ export const useInfoStore = defineStore('infoStore', () => { }[], ) => { if (!result) { - !!standardUUID.value && sessionStorage.removeItem(standardUUID.value) + if (!!standardUUID.value) { + sessionStorage.removeItem(standardUUID.value) + } standardUUID.value = undefined } else { standardUUID.value = result.uuid @@ -106,13 +110,13 @@ export const useInfoStore = defineStore('infoStore', () => { enchants, emblems, parts, - stones, + oaths, avatarParts, avatars, jades, setStandard, standard, sundries, - options + options, } }) From cda93965e399477bccaaab64784d702b4eae461e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Mon, 20 Apr 2026 00:00:48 +0800 Subject: [PATCH 14/21] dev --- backend/api/routes/info.py | 60 +++--- backend/core/basic/character/calc_equip.py | 2 +- backend/core/open/helper.py | 27 +-- backend/dataFiles/dcalc_0.db | Bin 860160 -> 860160 bytes backend/openapi | 2 +- frontend/src/api/calc/type.ts | 1 + frontend/src/api/info/type.ts | 6 +- .../components/calc/autocomplete/index.vue | 9 +- .../src/components/calc/cascader/index.vue | 14 +- .../src/components/calc/iconselect/index.vue | 13 +- frontend/src/components/calc/select/index.vue | 14 +- .../components/dnf/Equipment/Icon/index.vue | 5 +- .../components/dnf/Equipment/Info/index.vue | 18 +- .../components/dnf/Equipment/List/index.vue | 2 +- .../components/dnf/Equipment/Oath/index.vue | 182 ++++++++++++++++++ .../Equipment/components/StoneOld.vue | 60 ------ .../Character/Equipment/components/Weapon.vue | 1 - .../Character/EquipmentDictionary/Index.vue | 10 +- .../EquipmentDictionary/formatData.ts | 6 +- .../Character/Forge/components/Avatars.vue | 60 ++---- .../Character/Forge/components/Emblems.vue | 5 + .../Character/Forge/components/Equipments.vue | 95 +++------ .../Character/Forge/components/Jades.vue | 41 ++-- .../Character/Forge/components/Oaths.vue | 77 ++++++++ .../Character/Forge/components/Sundry.vue | 4 +- frontend/src/pages/Character/Forge/index.vue | 10 +- frontend/src/pages/Character/Result/Index.vue | 62 +++++- .../Character/Result/components/Info.vue | 95 ++++++--- frontend/src/pages/IndexView.vue | 20 +- frontend/src/stores/config.ts | 34 +++- frontend/src/stores/info.ts | 25 ++- frontend/src/utils/position.ts | 32 +++ images | 2 +- 33 files changed, 677 insertions(+), 317 deletions(-) create mode 100644 frontend/src/components/dnf/Equipment/Oath/index.vue delete mode 100644 frontend/src/pages/Character/Equipment/components/StoneOld.vue create mode 100644 frontend/src/pages/Character/Forge/components/Emblems.vue create mode 100644 frontend/src/pages/Character/Forge/components/Oaths.vue create mode 100644 frontend/src/utils/position.ts diff --git a/backend/api/routes/info.py b/backend/api/routes/info.py index 2a23f3e5..9a7d83f5 100644 --- a/backend/api/routes/info.py +++ b/backend/api/routes/info.py @@ -2,11 +2,11 @@ import re from api.core.Auth import createToken from api.core.Gzip import register_gzip_request import json -from fastapi import APIRouter,Request, Depends, Body +from fastapi import APIRouter, Request, Depends, Body from typing import Annotated from api.core.Response import Return, response from api.core.Redis import get_redis_info -from api.dp import RedisDep,AltersDep +from api.dp import RedisDep, AltersDep from core.character.adventure import get_adv_list from core.basic.character import createCharacter from core.open.helper import get_user_info_by_id @@ -17,6 +17,7 @@ router = APIRouter() register_gzip_request(router) + def replace_placeholders(template): # 匹配 、、、 等 pattern = re.compile(r'<(int|float\d*)>') @@ -30,44 +31,43 @@ def replace_placeholders(template): return pattern.sub(repl, template) - @router.get('/adventure') -async def get_adventure_info(request: Request,redis:RedisDep): +async def get_adventure_info(request: Request, redis: RedisDep): adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adv_list) return response(data=adventure_info) -@router.get("/token/get/{alter}") -async def getToken(redis:RedisDep, - alter: str, request: Request, version: str = None, equVersion: str = "0" -): + +@router.get('/token/get/{alter}') +async def getToken(redis: RedisDep, alter: str, request: Request, version: str = None, equVersion: str = '0'): token = createToken(alter, equVersion, redis) return response(data=token) -@router.get("/character") -async def get_character_info( - request: Request, state: AltersDep ,redis:RedisDep -): + +@router.get('/character') +async def get_character_info(request: Request, state: AltersDep, redis: RedisDep): character = createCharacter(state.alter, state.equVersion) + def get_character(): return character.getInfo() - info = get_redis_info(redis, f"dcalc:character:{state.alter}:{state.equVersion}", get_character) + + info = get_redis_info(redis, f'dcalc:character:{state.alter}:{state.equVersion}', get_character) # info = character.getInfo() return response(data=info) -@router.get("/skill/{skillId}/{level}") -async def get_skill_info( - state: AltersDep, skillId: str, level: int, redis: RedisDep -): + +@router.get('/skill/{skillId}/{level}') +async def get_skill_info(state: AltersDep, skillId: str, level: int, redis: RedisDep): """ 获取技能信息 """ alter = state.alter - jobId = alter.split(".")[1] - jobGrowId = alter.split(".")[2] + jobId = alter.split('.')[1] + jobGrowId = alter.split('.')[2] skill_info = {} key = f'openapi:{jobId}:{jobGrowId}:{skillId}' try: + def get_skill_info(): # This function should retrieve the skill info based on job and jobGrow # For now, we return a placeholder dictionary @@ -97,25 +97,27 @@ async def get_skill_info( return response(data=skill_info) -@router.get("/dnfhelper/{uid}/") +@router.get('/dnfhelper/{uid}/') async def get_info_by_dnfhelper(uid: str, state: AltersDep, redis: RedisDep): try: - result = await get_user_info_by_id(uid,state) + result = await get_user_info_by_id(uid, state) return response(data=result) except Exception as e: if isinstance(e, ResponseException): return response(code=500, message=str(e), data=None) - return response(code=500, message="Failed to fetch DNFHelper info", data=None) + print(e) + return response(code=500, message='Failed to fetch DNFHelper info', data=None) -@router.post("/skillTree/") -async def get_skill_by_code(state: AltersDep, code = Body(None)): + +@router.post('/skillTree/') +async def get_skill_by_code(state: AltersDep, code=Body(None)): try: - skills = get_skill_tree_info(code.get("code", "")) - if skills.get("job",{}).get("class","") != state.alter: - return response(code=500, message="技能加点代码职业与登录职业不匹配", data=None) + skills = get_skill_tree_info(code.get('code', '')) + if skills.get('job', {}).get('class', '') != state.alter: + return response(code=500, message='技能加点代码职业与登录职业不匹配', data=None) return response(data=skills) except Exception as e: - print(f"Error fetching skill tree info: {e}") + print(f'Error fetching skill tree info: {e}') if isinstance(e, ResponseException): return response(code=500, message=str(e), data=None) - return response(code=500, message="解析技能加点失败", data=None) \ No newline at end of file + return response(code=500, message='解析技能加点失败', data=None) diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index 6b97a919..3b097376 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -101,7 +101,7 @@ class CalcEquipMixin(CharacterBase): max_point_oath_suit = max((suit for suit in oathSuitInfo if oathSuitInfo[suit]['point'] > 0), key=lambda suit: oathSuitInfo[suit]['point'], default=None) zero_point_suits = [suit for suit in suitInfo if suitInfo[suit]['point'] == 0] # 套装没有到太初的时候,优先把誓约套装的点数加到装备套装上,以达到更高的套装等级 - if 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get('max_point_oath_suit', None) is not None: + if suitInfo is not None and 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get('max_point_oath_suit', None) is not None: suitInfo[max_point_suit]['point'] += min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) oathSuitInfo[max_point_oath_suit]['point'] -= min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) pass diff --git a/backend/core/open/helper.py b/backend/core/open/helper.py index 01359612..a8c62fee 100644 --- a/backend/core/open/helper.py +++ b/backend/core/open/helper.py @@ -79,12 +79,12 @@ job_mapping = { async def get_user_info_by_id(user_id: str, alter: AltersDep): if alter is None: - raise ResponseException("登录过期或无效Token,请刷新后重试") + raise ResponseException('登录过期或无效Token,请刷新后重试') name = next((k for k, v in job_mapping.items() if v == alter.origin), '') # 通过OCR助手获取用户信息 helper_info = await get_main_user_info_by_id(user_id, name) if helper_info is None: - raise ResponseException("当前助手ID不存在或已隐藏,请确认后重试") + raise ResponseException('当前助手ID不存在或已隐藏,请确认后重试') else: return trans_to_dcalc_set(helper_info, alter) pass @@ -93,7 +93,7 @@ async def get_user_info_by_id(user_id: str, alter: AltersDep): def trans_to_dcalc_set(detail, alter: AltersDep): job = job_mapping.get(detail.get('job', ''), '') if job != alter.origin: - raise ResponseException("未能匹配到当前职业对应的角色信息,请确认后重试") + raise ResponseException('未能匹配到当前职业对应的角色信息,请确认后重试') basic = get_equipment('0') basicAvatars = basic.funs.get_dress_list([]) equs = detail.get('equs', []) @@ -126,9 +126,9 @@ def trans_to_dcalc_set(detail, alter: AltersDep): # 贴膜 if dcalcEqu: info['id'] = dcalcEqu.id - dcalcEquFusion = next((item for item in basic.stones if item.name == equ.get('upgrade', '')), None) - if dcalcEquFusion: - info['fusion'] = dcalcEquFusion.id + # dcalcEquFusion = next((item for item in basic.stones if item.name == equ.get('upgrade', '')), None) + # if dcalcEquFusion: + # info['fusion'] = dcalcEquFusion.id info['enchant'] = getEnchatIdByName(equ.get('enchant', ''), equ.get('posName', ''), basic.enchants) emblems = [getEmblemIdByName(i.get('detail', ''), i.get('categorize', ''), i.get('rarity', ''), basic.emblems) for i in equ.get('emblems', [])] info['emblem_0'] = emblems[0] if len(emblems) > 0 else 0 @@ -167,7 +167,7 @@ def trans_to_dcalc_set(detail, alter: AltersDep): if item.get('posName', '') == '皮肤': match = re.search(r'\[(\d+)级\]', item.get('name', '')) lv = int(match.group(1)) if match else None - if lv : + if lv: item['enchant'] = f'Lv{lv}主动+1|全属强(12)|四维(55)' if item.get('posName', '') == '光环': # 先默认这个了 不管了 @@ -182,11 +182,14 @@ def trans_to_dcalc_set(detail, alter: AltersDep): 'equips': equips, 'avatars': avatar, 'avatarLink': detail.get('avatarLink', ''), - 'dressInfo': [{ - 'dress': i.get('name', ''), - 'clone': i.get('clone', ''), - 'part': i.get('posName', ''), - } for i in detail.get('avatars', [])] + 'dressInfo': [ + { + 'dress': i.get('name', ''), + 'clone': i.get('clone', ''), + 'part': i.get('posName', ''), + } + for i in detail.get('avatars', []) + ], } # 处理装备 # 处理时装 diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 3bf8aaa8ee2c8382ec7c375bbe2400a9ce1dbbfe..5e7cf4030aa248f5e7060b82d708fe5ee399e662 100644 GIT binary patch delta 2436 zcmZveZA?>F7{`0t+qe6a7Q8LR0``g`;7~86j5;kFD2aO`RmtSTG*&23d1=K9SZIOD zB5r0*=(fuunbTx1CR>8C$^1riiTg04aWQ5y*>u^mjOj$P4`w5A&%NcImSK~pC%wP_ zIp^Q=ob#MJG~*tcai7S|y022HZeYBPVZ{iKmX>SptJe1%J=Zi5GHLMbE=an%Uc$UdDP5ioXsdVT`+mzBGfV0m~F-x zW2NC6L!JJHzFv1zw_p3WwwHcPM`*KVOk-9bRcoj*Do=GXk;U(12f3_VyM0yRa!aMx zZnxP~DuZ}@FLbhklYk1Fg=Hm>>4!!(v_b}D*u!SG*zFP+@xvZ#T%Avd*S0|Z@xuXY zT$7g~N}r*9&}EHNx#=W1zrGQ|Y@dSwGXJqg2(rQDGLRgT`3+6bkQ2)xz`HPsi?86_ z;!9VV67ftER5@ezr%K9sUQ(8e+pjWtVqO5YI{UNJm9j5M;z}xAN##TUY8--%C>5iU zvW(}&hc}rbk!ywuHfSXxVmjCi4UQN~K+3e6cVqAT+t^#v0#%OavXp3HVO=Oe+oJC$ z6b-k4*V&hqE?RKxPCCX$yxR2oCrf;CQ?Qp9darq;I~4ze*IfXshuKeV$!Mh1&gyQ>Wv*qD(3 zGX3Q?>=8AjfHM1*c4%|<>r-H1au=?JoIh;DYi+n1v+YpB3Ob@BZeHlX)o9fcKvrYA z19my1Gy%#!cVWIUXL2Jx{LPRrzTAmpM>R{7;^|IkVDYg3qdO@Py`S+6Cr3k zKWX5XnSOu=aLM=x#?|ksR_o%r_>|+$U79xJQb(q;_`}qmVf!+@JwKm1LJ9tT?SYVA zXx-Tz6qMGmWk+pweJxjCUGqvUSD-vD;EEZJD+o3faP_qf^~J7=ijq?4Nn0S2{wU#_ z%}!L_&P%*8YfXIiqr=+e?+OZ$7Z>$QjNZ2zrOx3{uu~ZOd1Yd5R+p&zB|CBb*KDf< zn*AMtMZ&{Nj8hm1jPn>%7}FSEV;D#3 zXAINzGse$1;Lw}%)I};w)cn}|CKlNDGwh~u(>nMR9LzD}yz#KnWH@2S(vRtjbdx%l z_Po|bU!k{XE^12Er_@F0?{|vr*(_zU(3@VTR&+tY8fP{ULU!|b7etUex0I|o2$9^l zeq)N*k{iZVChuo)_in~5J~#-Qu$p>^itL`}1+1pQN*Tx}OF1W(1w2^;&k{hqZ0Lp# zcA#P@n3O=&oeq-6x~vEHbay!cWb(-#Xj&e0NkG11l;Y>Y@>s!(cY2v(@wHx9>xh*R zjp9SnNOjO0#S(X^7pih%{8L5c;=N(4@HL09RQ7F1Nys`$2a^|H9g)U41e;i4JrNP7 zSrI()ht|mebLLf?ibo^Rk{dUb5<>j(8)bikqfEJ2)d$tqxapZCD)HSu=*P^iO()4! zTiq{ZR#QTVV#b9d%lF4Pj(o2lJZ!L77A>lbo+vapV?_j{e0h?!2pjSA8NAWHi^5h% zY|T@Z(j`*&A+F4h7+#S5h3TS&OT?2bo7hOh<%?HiQ0)*_6J^S_N47n228Z(v;I-GW ziim7>{7CN#9}K|jxKj%V!S{|NVFn?LWaU!w4ifn-Xeu*2XZhb3z9m&3@iCwHATveq RA&2L9gdT!vddM_?>OUXM2IT+% delta 2176 zcmZvdYitx%6vt`T{GUQIm?sgaqF)Mn7oLKop8DeIvAb?ri7ol68`k`S3e; z?*E?uId@tnb6X~J+niCi8HV`|;!OxU#KHFT9Q|!3^Qoo_`#TR0ayH)fRvXJ{g!=%Q z4=z-n5+oPiuf6Q*ZLq8Kk1=80noUhjjJUn7OpLtTe^#@uXTzsjmk70gXSP^#^qR0P7Fv{Q<+JfRX=3 z(=D4Px%fmLlyeaM5T_v|i1#2SAl`?#2yy9T=_Gf#bP|nZ4cct{UVn*cphP)bk&9_y zgx3U%^^{ex^jR{@<7UjC=Zj3AoAS{FO64wc1;$T}PZ+KkcIkiB``GKOPdBf7MLVml z(%jV4GRsVZ6ouXPR>l?O6vg<&SYeA-6dewR5u~y1Lv~!Zo&t|Uh>0N}t7o4bSFck* zHmq=nf+!Nu-}9^kx9ZkX;&rSNvG+wFY+Q(_YdU*t;&7|h8BUb_-FP#0V=Q-lVakwp zoyoW3#x*pFYUw{yZpRg|3LxsKmJNMncHI0Z1zvT-H~Ojoh>?Kr2XOR}a1boS>-`l@ zT<4%b-Q0~mI2#n+{lSzhc?LWn#7>i_kfs45B!&ViECsY{ zlg27txJefQ+;A#zNO{S3Z*XzawXtnZ+@K9*#so`4Qb-d&xWgq&CF6OZOhc2Xvaa!c z+pq;@JxW6`Dw?vuS&58WGyv@{t0;rB#;aWM3vDN4>bQ#v^yYz8zyKT~S z>!P(Mw7g~suCfm`@i3wfJul~z4HLa#!y)I*pabAIzm+1j;O=bFepvqc8B?zO*9xLEQ9U5-V-%?em3PmfYG{Bh3Q-zh)lT{6IRqVWY%?XQ zAh~!R9dzPjo(SU3R$P#UDpQI)H;R`Y`k4hp z=GRTKlxt9(Upa3Pl{s;9HYKVuH!LQlvK}=h%ik}ef>_*)|2Hc~o<43$m7iWh1y0@dB1zgZ zAx9I#Nl?PjG9rVVKnYclv_k4|D4r6B2oL;##j string[] | Promise @@ -55,10 +56,12 @@ export default defineComponent({ function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom('body') + dropdownPosition.value = { - w: width, - x: left, - y: top + height + 2, + w: width / zoom, + x: left / zoom, + y: (top + height + 2) / zoom, } } } diff --git a/frontend/src/components/calc/cascader/index.vue b/frontend/src/components/calc/cascader/index.vue index 492ddd63..f5f59345 100644 --- a/frontend/src/components/calc/cascader/index.vue +++ b/frontend/src/components/calc/cascader/index.vue @@ -4,6 +4,7 @@ import type { CSSProperties, PropType } from 'vue' import { Teleport, Transition, computed, defineComponent, onDeactivated, ref, watch } from 'vue' import { onClickOutside, useVModel } from '@vueuse/core' +import { getElementZoom } from '@/utils/position' interface ICascaderItem { label: string id?: string | number @@ -74,18 +75,19 @@ export default defineComponent({ function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom('body') if (window.innerHeight - top > 160) { dropdownPosition.value = { - w: width, - x: left, - y: top + height + 2, + w: width / zoom, + x: left / zoom, + y: (top + height + 2) / zoom, z: 0, } } else { dropdownPosition.value = { - w: width, - x: left, - z: window.innerHeight - top + 2, + w: width / zoom, + x: left / zoom, + z: (window.innerHeight - top + 2) / zoom, y: 0, } } diff --git a/frontend/src/components/calc/iconselect/index.vue b/frontend/src/components/calc/iconselect/index.vue index 7452f786..1c6c66d2 100644 --- a/frontend/src/components/calc/iconselect/index.vue +++ b/frontend/src/components/calc/iconselect/index.vue @@ -13,6 +13,7 @@ import { } from 'vue' import { onClickOutside } from '@vueuse/core' +import { getElementZoom } from '@/utils/position' export default defineComponent({ name: 'IIconselect', @@ -72,20 +73,24 @@ export default defineComponent({ const dropdownPosition = ref({ x: 0, y: 0, w: 0 }) // 下拉框位置 const dropdownStyle = computed(() => { + const zoom = getElementZoom(appendToRef.value) + return { left: `${dropdownPosition.value.x}px`, top: `${dropdownPosition.value.y}px`, - width: `${columnNum.value * 32 + 11}px`, + width: `${(columnNum.value * 32 + 11) / zoom}px`, } }) function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom(appendToRef.value) + dropdownPosition.value = { - w: width, - x: left - 2, - y: (top + height + 2), + w: width / zoom, + x: (left - 2) / zoom, + y: (top + height + 2) / zoom, } } } diff --git a/frontend/src/components/calc/select/index.vue b/frontend/src/components/calc/select/index.vue index 777f31f7..89aef50e 100644 --- a/frontend/src/components/calc/select/index.vue +++ b/frontend/src/components/calc/select/index.vue @@ -15,6 +15,7 @@ import { import { onClickOutside, useVModel } from '@vueuse/core' import { classPropType, labelPropType } from '@/components/hooks/types' +import { getElementZoom } from '@/utils/position' export default defineComponent({ name: 'ISelect', @@ -98,18 +99,19 @@ export default defineComponent({ function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom(appendToRef.value) if (window.innerHeight - top > 160) { dropdownPosition.value = { - w: width, - x: left, - y: (top + height + 2), + w: width / zoom, + x: left / zoom, + y: (top + height + 2) / zoom, z: 0, } } else { dropdownPosition.value = { - w: width, - x: left, - z: (window.innerHeight - top + 2), + w: width / zoom, + x: left / zoom, + z: (window.innerHeight - top + 2) / zoom, y: 0, } } diff --git a/frontend/src/components/dnf/Equipment/Icon/index.vue b/frontend/src/components/dnf/Equipment/Icon/index.vue index ec52e5cf..ec22fd50 100644 --- a/frontend/src/components/dnf/Equipment/Icon/index.vue +++ b/frontend/src/components/dnf/Equipment/Icon/index.vue @@ -3,7 +3,9 @@
@@ -21,6 +23,7 @@ import { getImageURL } from '@/utils/images' const props = defineProps<{ equipment?: IEquipment inactive?: boolean + useDisplayUrl?: boolean }>() const rarity = computed(() => { diff --git a/frontend/src/components/dnf/Equipment/Info/index.vue b/frontend/src/components/dnf/Equipment/Info/index.vue index ee635072..c5e056a5 100644 --- a/frontend/src/components/dnf/Equipment/Info/index.vue +++ b/frontend/src/components/dnf/Equipment/Info/index.vue @@ -38,16 +38,12 @@
-
+