poi-plugin-koushu-rate 2.0.14 → 2.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +156 -45
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -40,6 +40,7 @@ const WEEKDAY_KEYS = ["monday", "tuesday", "wednesday", "thursday", "friday", "s
40
40
  const WEEKDAY_LABELS = { monday: "周一", tuesday: "周二", wednesday: "周三", thursday: "周四", friday: "周五", saturday: "周六", sunday: "周日" };
41
41
  const ALL_DAYS_KEY = "all";
42
42
 
43
+
43
44
  function japanWeekdayKey() {
44
45
  const japanNow = new Date(Date.now() + 9 * 60 * 60 * 1000)
45
46
  return ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"][japanNow.getUTCDay()]
@@ -505,6 +506,10 @@ const CSS = `
505
506
  border-color: #2d72d2;
506
507
  color: #fff;
507
508
  }
509
+ .kr2-plan-target-btn:disabled {
510
+ opacity: 0.4;
511
+ cursor: not-allowed;
512
+ }
508
513
  .kr2-level-max-blue {
509
514
  color: #4fc3f7;
510
515
  font-weight: 700;
@@ -858,6 +863,42 @@ const CSS = `
858
863
  .kr2-row:hover {
859
864
  background: #252a31;
860
865
  }
866
+ .kr2-row-not-improveable {
867
+ color: #abb3bf;
868
+ cursor: default;
869
+ }
870
+ .kr2-row-not-improveable .kr2-name,
871
+ .kr2-row-not-improveable .kr2-secretary,
872
+ .kr2-row-not-improveable .kr2-meta {
873
+ color: #abb3bf;
874
+ }
875
+ .kr2-reco-empty {
876
+ min-height: 34px;
877
+ }
878
+ .kr2-not-improveable-group {
879
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
880
+ }
881
+ .kr2-collapse-toggle {
882
+ width: 100%;
883
+ padding: 10px 14px;
884
+ border: 0;
885
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
886
+ background: #252a31;
887
+ color: #abb3bf;
888
+ text-align: center;
889
+ font-size: 14px;
890
+ cursor: pointer;
891
+ }
892
+ .kr2-collapse-toggle:hover {
893
+ background: #2f343c;
894
+ }
895
+ .kr2-improveable-group {
896
+ border-bottom: 1px solid rgba(255, 255, 255, 0.12);
897
+ }
898
+ .kr2-fav-btn:disabled {
899
+ opacity: 0.4;
900
+ cursor: default;
901
+ }
861
902
  .kr2-fav-btn {
862
903
  width: 24px;
863
904
  height: 24px;
@@ -1077,6 +1118,7 @@ const CSS = `
1077
1118
  align-items: flex-end;
1078
1119
  gap: 6px;
1079
1120
  }
1121
+
1080
1122
  .kr2-material-list {
1081
1123
  display: flex;
1082
1124
  flex-direction: column;
@@ -2280,6 +2322,33 @@ function buildRows(staticData, masterEquips, fallbackNames, akashi, recommendati
2280
2322
  if (ib >= 0) return 1
2281
2323
  return Number(a.id) - Number(b.id)
2282
2324
  })
2325
+ const improveableKeys = new Set(Object.keys(stepsByEquip))
2326
+ const nonImproveableIds = Object.keys(fallbackNames).filter((id) => !improveableKeys.has(id)).map(Number).sort((a, b) => a - b)
2327
+ for (const id of nonImproveableIds) {
2328
+ const key = String(id)
2329
+ const fallback = fallbackNames[key] || {}
2330
+ const master = masterEquips[key] || {}
2331
+ const category = CATEGORY_ALIASES[translateTypeName(fallback.type || master.api_type_name)] || "其他"
2332
+ const name = String(master.api_name || fallback.name || ("装备 " + id))
2333
+ rows.push({
2334
+ id: key,
2335
+ name,
2336
+ typeName: String(fallback.type || master.api_type_name || ""),
2337
+ icon: master.api_type && master.api_type[3] != null ? Number(master.api_type[3]) : (fallback.icon != null ? Number(fallback.icon) : 0),
2338
+ base: null,
2339
+ days: [],
2340
+ category,
2341
+ reco: false,
2342
+ akashiName: "",
2343
+ recommend: null,
2344
+ secretaries: null,
2345
+ searchText: normalizeText([name, category, id].join(" ")),
2346
+ phase0: null,
2347
+ phase1: null,
2348
+ upgrades: null,
2349
+ improveable: false,
2350
+ })
2351
+ }
2283
2352
  return rows
2284
2353
  }
2285
2354
 
@@ -2436,7 +2505,7 @@ function planCopyCosts(row, target, current, upgradeId) {
2436
2505
  const ensure = rec.tone === "ensure"
2437
2506
  const expected = Number.isFinite(rec.expected) ? rec.expected : step.consume_improvement_min / lv.p
2438
2507
  const screws = ensure ? step.consume_improvement_max : expected
2439
- const attempts = ensure ? 1 : expected
2508
+ const attempts = ensure ? 1 : 1 / lv.p
2440
2509
  const dev = ensure ? step.consume_development_max : step.consume_development_min * attempts
2441
2510
  out.screws += screws
2442
2511
  out.dev += dev
@@ -2456,7 +2525,7 @@ function planCopyCosts(row, target, current, upgradeId) {
2456
2525
  const ensure = rec.tone === "ensure"
2457
2526
  const expected = Number.isFinite(rec.expected) ? rec.expected : upg.consume_improvement_min / 0.62
2458
2527
  const screws = ensure ? upg.consume_improvement_max : expected
2459
- const attempts = ensure ? 1 : expected
2528
+ const attempts = ensure ? 1 : 1 / 0.62
2460
2529
  const dev = ensure ? upg.consume_development_max : upg.consume_development_min * attempts
2461
2530
  out.screws += screws
2462
2531
  out.dev += dev
@@ -2732,8 +2801,8 @@ function PlanningPage({ rows, inventoryByEquip, useItemCounts, selection, onTogg
2732
2801
  React.createElement(
2733
2802
  "div",
2734
2803
  { className: "kr2-plan-target-group" },
2735
- React.createElement("button", { type: "button", className: "kr2-plan-target-btn" + (!p.evoUpgradeId && p.target !== "max" ? " kr2-plan-target-active" : ""), onClick: () => onTarget(p.row.id, "6") }, "+6"),
2736
- React.createElement("button", { type: "button", className: "kr2-plan-target-btn" + (!p.evoUpgradeId && p.target === "max" ? " kr2-plan-target-active" : ""), onClick: () => onTarget(p.row.id, "max") }, "max"),
2804
+ React.createElement("button", { type: "button", disabled: p.row.improveable === false, className: "kr2-plan-target-btn" + (!p.evoUpgradeId && p.target !== "max" ? " kr2-plan-target-active" : ""), onClick: () => onTarget(p.row.id, "6") }, "+6"),
2805
+ React.createElement("button", { type: "button", disabled: p.row.improveable === false, className: "kr2-plan-target-btn" + (!p.evoUpgradeId && p.target === "max" ? " kr2-plan-target-active" : ""), onClick: () => onTarget(p.row.id, "max") }, "max"),
2737
2806
  React.createElement(EvolutionButton, { rowId: p.row.id, branches: p.row.upgrades || [], value: p.evoUpgradeId, onSelect: onEvo })
2738
2807
  )
2739
2808
  ),
@@ -2847,7 +2916,7 @@ class StrongPage extends React.Component {
2847
2916
  ? Object.assign({}, row, { id: row.id + ":evo:" + evoUpgrade.upgrade_id, name: evoUpgrade.targetName, category: evoUpgrade.targetCategory || row.category })
2848
2917
  : row
2849
2918
  const targetEquipId = evoUpgrade ? String(evoUpgrade.upgrade_id) : row.id
2850
- const targetLevelValue = evoUpgrade ? 0 : (sel.target === "max" ? 10 : 6)
2919
+ const targetLevelValue = evoUpgrade ? 0 : (row.improveable === false ? 0 : (sel.target === "max" ? 10 : 6))
2851
2920
  const bucket = demandMap[targetEquipId] || (demandMap[targetEquipId] = { equipId: targetEquipId, displayRow, demands: {} })
2852
2921
  bucket.demands[String(targetLevelValue)] = (bucket.demands[String(targetLevelValue)] || 0) + qty
2853
2922
  }
@@ -2979,6 +3048,7 @@ class LevelOneTable extends React.Component {
2979
3048
 
2980
3049
  render() {
2981
3050
  const phase = this.props.phase
3051
+ const kcDevData = this.props.kcDevData
2982
3052
  if (!phase) {
2983
3053
  return React.createElement(
2984
3054
  "div",
@@ -2989,6 +3059,7 @@ class LevelOneTable extends React.Component {
2989
3059
  const normal = phase.consume_improvement_min
2990
3060
  const materials = phase.materials || []
2991
3061
  const hasMaterials = materials.some((item) => item && (item.item_name || item.item_material_key || item.item_equipment_id != null))
3062
+
2992
3063
  const rows = []
2993
3064
  LEVEL_ONE_ROWS.forEach((rate) => {
2994
3065
  const key = rate.range
@@ -3008,6 +3079,7 @@ class LevelOneTable extends React.Component {
3008
3079
  "div",
3009
3080
  { className: "kr2-material-cell" },
3010
3081
  React.createElement(RateCell, { range: "素材详情", open: !!this.state.open[key], onToggle: () => this.toggle(key) }),
3082
+
3011
3083
  !!this.state.open[key]
3012
3084
  ? React.createElement(MaterialDetail, { materials, onMaterialClick: this.props.onMaterialClick, inventoryByEquip: this.props.inventoryByEquip, useItemCounts: this.props.useItemCounts, onInventoryClick: this.props.onInventoryClick })
3013
3085
  : null
@@ -3050,6 +3122,7 @@ class LevelTwoTable extends React.Component {
3050
3122
  const phase0 = this.props.phase0
3051
3123
  const phase1 = this.props.phase1
3052
3124
  const upgrades = this.props.upgrades || null
3125
+ const kcDevData = this.props.kcDevData
3053
3126
  const rows = []
3054
3127
  const pushRateRow = (step, range, label, key, p, subText, evolTarget, maxBlue) => {
3055
3128
  const normal = step ? step.consume_improvement_min : null
@@ -3057,6 +3130,7 @@ class LevelTwoTable extends React.Component {
3057
3130
  const rec = buildRecommendation(normal, certain, p)
3058
3131
  const materials = step ? step.materials || [] : []
3059
3132
  const hasMaterials = materials.some((item) => item && (item.item_name || item.item_material_key || item.item_equipment_id != null))
3133
+
3060
3134
  const rangeNode = maxBlue
3061
3135
  ? React.createElement("span", null, "★9→", React.createElement("span", { className: "kr2-level-max-blue" }, "max"))
3062
3136
  : range
@@ -3093,6 +3167,7 @@ class LevelTwoTable extends React.Component {
3093
3167
  "div",
3094
3168
  { className: "kr2-material-cell" },
3095
3169
  React.createElement(RateCell, { range: rec.text, open: !!this.state.open[key], onToggle: () => this.toggle(key), tone: rec.tone }),
3170
+
3096
3171
  !!this.state.open[key]
3097
3172
  ? React.createElement(MaterialDetail, { materials, onMaterialClick: this.props.onMaterialClick, inventoryByEquip: this.props.inventoryByEquip, useItemCounts: this.props.useItemCounts, onInventoryClick: this.props.onInventoryClick })
3098
3173
  : null
@@ -3171,13 +3246,13 @@ class LevelSection extends React.Component {
3171
3246
  }
3172
3247
  }
3173
3248
 
3174
- function EquipmentRow({ row, expanded, onToggle, onMaterialClick, inventoryByEquip, useItemCounts, onInventoryClick, isFavorite, onFavoriteClick, secretaryText }) {
3249
+ function EquipmentRow({ row, expanded, onToggle, onMaterialClick, inventoryByEquip, useItemCounts, onInventoryClick, isFavorite, onFavoriteClick, secretaryText, kcDevData }) {
3175
3250
  return React.createElement(
3176
3251
  "div",
3177
3252
  null,
3178
3253
  React.createElement(
3179
3254
  "div",
3180
- { className: "kr2-row", onClick: onToggle },
3255
+ { className: "kr2-row" + (row.improveable === false ? " kr2-row-not-improveable" : ""), onClick: row.improveable === false ? null : onToggle },
3181
3256
  React.createElement(
3182
3257
  "button",
3183
3258
  { className: "kr2-fav-btn" + (isFavorite ? " kr2-fav-active" : ""), onClick: (e) => { e.stopPropagation(); onFavoriteClick && onFavoriteClick(row.id) }, title: isFavorite ? "取消收藏" : "收藏" },
@@ -3187,33 +3262,35 @@ function EquipmentRow({ row, expanded, onToggle, onMaterialClick, inventoryByEqu
3187
3262
  "span",
3188
3263
  { className: "kr2-expand" },
3189
3264
  React.createElement(SlotitemIcon, { slotitemId: row.icon, className: "kr2-icon" }),
3190
- React.createElement("span", { className: "kr2-arrow" }, expanded ? "▼" : "▶")
3265
+ React.createElement("span", { className: "kr2-arrow" }, row.improveable === false ? "" : expanded ? "▼" : "▶")
3191
3266
  ),
3192
3267
  React.createElement("span", { className: "kr2-name" }, row.name),
3193
- React.createElement("span", { className: "kr2-secretary" }, secretaryText || "-"),
3268
+ React.createElement("span", { className: "kr2-secretary" }, row.improveable === false ? "" : (secretaryText || "-")),
3194
3269
  React.createElement(
3195
3270
  "span",
3196
3271
  { className: "kr2-meta" },
3197
- row.days && row.days.length >= 7 ? "每日可改修" : (row.days || []).map((d) => WEEKDAY_LABELS[d] || d).join("·")
3272
+ row.improveable === false ? "改修未开放" : (row.days && row.days.length >= 7 ? "每日可改修" : (row.days || []).map((d) => WEEKDAY_LABELS[d] || d).join("·"))
3198
3273
  ),
3199
- React.createElement(
3200
- "span",
3201
- { className: "kr2-reco" },
3202
- React.createElement(
3203
- "span",
3204
- { className: "kr2-reco-line" },
3205
- React.createElement("span", { className: "kr2-reco-label" }, "推荐星级"),
3206
- React.createElement("span", { className: "kr2-stars kr2-stars-priority" }, row.recommend && Number(row.recommend.priority) > 0 ? starText(row.recommend.priority) : "")
3207
- ),
3208
- React.createElement(
3209
- "span",
3210
- { className: "kr2-reco-line" },
3211
- React.createElement("span", { className: "kr2-reco-label" }, "活动强度"),
3212
- React.createElement("span", { className: "kr2-stars kr2-stars-activity" }, row.recommend && Number(row.recommend.activity) > 0 ? starText(row.recommend.activity) : "")
3213
- )
3214
- )
3274
+ row.improveable === false
3275
+ ? React.createElement("div", { className: "kr2-reco kr2-reco-empty" }, "")
3276
+ : React.createElement(
3277
+ "span",
3278
+ { className: "kr2-reco" },
3279
+ React.createElement(
3280
+ "span",
3281
+ { className: "kr2-reco-line" },
3282
+ React.createElement("span", { className: "kr2-reco-label" }, "推荐星级"),
3283
+ React.createElement("span", { className: "kr2-stars kr2-stars-priority" }, row.recommend && Number(row.recommend.priority) > 0 ? starText(row.recommend.priority) : "")
3284
+ ),
3285
+ React.createElement(
3286
+ "span",
3287
+ { className: "kr2-reco-line" },
3288
+ React.createElement("span", { className: "kr2-reco-label" }, "活动强度"),
3289
+ React.createElement("span", { className: "kr2-stars kr2-stars-activity" }, row.recommend && Number(row.recommend.activity) > 0 ? starText(row.recommend.activity) : "")
3290
+ )
3291
+ )
3215
3292
  ),
3216
- expanded
3293
+ row.improveable !== false && expanded
3217
3294
  ? React.createElement(
3218
3295
  "div",
3219
3296
  { className: "kr2-detail" },
@@ -3223,7 +3300,7 @@ function EquipmentRow({ row, expanded, onToggle, onMaterialClick, inventoryByEqu
3223
3300
  React.createElement(
3224
3301
  LevelSection,
3225
3302
  { title: "0→5", defaultOpen: false, resourceText: "成功率100% · 改修资材 " + (row.phase0 ? row.phase0.consume_improvement_min : "--") },
3226
- React.createElement(LevelOneTable, { phase: row.phase0, onMaterialClick, inventoryByEquip, useItemCounts, onInventoryClick })
3303
+ React.createElement(LevelOneTable, { phase: row.phase0, onMaterialClick, inventoryByEquip, useItemCounts, onInventoryClick, kcDevData })
3227
3304
  )
3228
3305
  ),
3229
3306
  React.createElement(
@@ -3232,7 +3309,7 @@ function EquipmentRow({ row, expanded, onToggle, onMaterialClick, inventoryByEqu
3232
3309
  React.createElement(
3233
3310
  LevelSection,
3234
3311
  { title: "6→max", defaultOpen: true, resourceText: "成功率 95 / 90 / 82 / 77 / 67 / 62 %" },
3235
- React.createElement(LevelTwoTable, { phase0: row.phase0, phase1: row.phase1, upgrades: row.upgrades, onMaterialClick, inventoryByEquip, useItemCounts, onInventoryClick })
3312
+ React.createElement(LevelTwoTable, { phase0: row.phase0, phase1: row.phase1, upgrades: row.upgrades, onMaterialClick, inventoryByEquip, useItemCounts, onInventoryClick, kcDevData })
3236
3313
  )
3237
3314
  )
3238
3315
  )
@@ -3481,6 +3558,8 @@ class KoushuRateApp extends React.Component {
3481
3558
  favoritesOnly: readFavoritesOnly(),
3482
3559
  starSort: readUiState().starSort || null,
3483
3560
  activeTab: "list",
3561
+ improveableOpen: true,
3562
+ nonImproveableOpen: false,
3484
3563
  planSelection: readPlanSelection(),
3485
3564
  includeDevExpected: readPlanIncludeDev(),
3486
3565
  }
@@ -3759,7 +3838,7 @@ class KoushuRateApp extends React.Component {
3759
3838
  const favoritesOnly = !!this.state.favoritesOnly
3760
3839
  let rows = this.state.rows.filter((row) => {
3761
3840
  if (favoritesOnly && !this.state.favorites[row.id]) return false
3762
- if (day !== ALL_DAYS_KEY && (row.days || []).indexOf(day) < 0) return false
3841
+ if (row.improveable !== false && day !== ALL_DAYS_KEY && (row.days || []).indexOf(day) < 0) return false
3763
3842
  if (category !== "all" && row.category !== category) return false
3764
3843
  return true
3765
3844
  })
@@ -3782,6 +3861,23 @@ class KoushuRateApp extends React.Component {
3782
3861
  })
3783
3862
  .map((item) => item.row)
3784
3863
  }
3864
+ const improveableRows = rows.filter((row) => row.improveable !== false)
3865
+ const notImproveableRows = rows.filter((row) => row.improveable === false)
3866
+ const renderEquipmentRow = (row) =>
3867
+ React.createElement(EquipmentRow, {
3868
+ key: row.id,
3869
+ row,
3870
+ expanded: !!this.state.expanded[row.id],
3871
+ onToggle: () => this.toggle(row.id),
3872
+ onMaterialClick: this.openKcDevPopup,
3873
+ inventoryByEquip,
3874
+ useItemCounts,
3875
+ onInventoryClick: this.openInventoryPopup,
3876
+ isFavorite: !!this.state.favorites[row.id],
3877
+ onFavoriteClick: this.toggleFavorite,
3878
+ secretaryText: secretaryText(row.secretaries, day),
3879
+ kcDevData: this.state.kcDevData,
3880
+ })
3785
3881
 
3786
3882
  return React.createElement(
3787
3883
  "div",
@@ -3931,21 +4027,36 @@ class KoushuRateApp extends React.Component {
3931
4027
  { className: "kr2-list", style: this.state.activeTab === "plan" || this.state.activeTab === "strong" ? { display: "none" } : null },
3932
4028
  rows.length === 0
3933
4029
  ? React.createElement("div", { className: "kr2-empty" }, favoritesOnly ? "还没有收藏装备" : "没有匹配的装备")
3934
- : rows.map((row) =>
3935
- React.createElement(EquipmentRow, {
3936
- key: row.id,
3937
- row,
3938
- expanded: !!this.state.expanded[row.id],
3939
- onToggle: () => this.toggle(row.id),
3940
- onMaterialClick: this.openKcDevPopup,
3941
- inventoryByEquip,
3942
- useItemCounts,
3943
- onInventoryClick: this.openInventoryPopup,
3944
- isFavorite: !!this.state.favorites[row.id],
3945
- onFavoriteClick: this.toggleFavorite,
3946
- secretaryText: secretaryText(row.secretaries, day),
3947
- })
3948
- )
4030
+ : [
4031
+ React.createElement(
4032
+ "div",
4033
+ { key: "improveable-group", className: "kr2-improveable-group" },
4034
+ React.createElement(
4035
+ "button",
4036
+ { type: "button", className: "kr2-collapse-toggle", onClick: () => this.setState((prev) => ({ improveableOpen: !prev.improveableOpen })) },
4037
+ this.state.improveableOpen ? "▼ " : "▶ ",
4038
+ "可改修装备 (",
4039
+ String(improveableRows.length),
4040
+ ")"
4041
+ ),
4042
+ this.state.improveableOpen ? improveableRows.map((row) => renderEquipmentRow(row)) : null
4043
+ ),
4044
+ notImproveableRows.length > 0
4045
+ ? React.createElement(
4046
+ "div",
4047
+ { key: "not-improveable-group", className: "kr2-not-improveable-group" },
4048
+ React.createElement(
4049
+ "button",
4050
+ { type: "button", className: "kr2-collapse-toggle", onClick: () => this.setState((prev) => ({ nonImproveableOpen: !prev.nonImproveableOpen })) },
4051
+ this.state.nonImproveableOpen ? "▼ " : "▶ ",
4052
+ "不可改修装备 (",
4053
+ String(notImproveableRows.length),
4054
+ ")"
4055
+ ),
4056
+ this.state.nonImproveableOpen ? notImproveableRows.map((row) => renderEquipmentRow(row)) : null
4057
+ )
4058
+ : null,
4059
+ ]
3949
4060
  ),
3950
4061
  this.state.activeTab === "plan"
3951
4062
  ? React.createElement(PlanningPage, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poi-plugin-koushu-rate",
3
- "version": "2.0.14",
3
+ "version": "2.0.16",
4
4
  "description": "全装备改修资材计算与推荐",
5
5
  "main": "index.js",
6
6
  "files": [