Skip to content

ZO: 2.5 sheets#3224

Open
priolette wants to merge 16 commits into
masterfrom
priolette/2.5-sheets
Open

ZO: 2.5 sheets#3224
priolette wants to merge 16 commits into
masterfrom
priolette/2.5-sheets

Conversation

@priolette

@priolette priolette commented May 31, 2026

Copy link
Copy Markdown
Collaborator

Describe your changes

  • Adds sheets for Zhao and Ye Shunguang.
  • Adds potential implementations for Grace, Burnice, Soldier 0 - Anby, Soldier 11.
  • Fixes ablooms

Issue or discord link

Testing/validation

Checklist before requesting a review (leave this PR as draft if any part of this list is not done.)

  • I have commented my code in hard-to understand areas.
  • I have made corresponding changes to README or wiki.
  • For front-end changes, I have updated the corresponding English translations.
  • I have run yarn run mini-ci locally to validate format and lint.
  • If I have added a new library or app, I have updated the deployment scripts to ignore changes as needed

Summary by CodeRabbit

  • New Features

    • Added anomaly move-multiplier and veil vulnerability cap stats.
    • Many character sheets gained new conditionals, fields and potential-based effects.
    • Introduced dual-slot skill-type tracking for richer damage categorization.
  • Bug Fixes

    • Fixed assist attack label/display.
    • Updated veil vulnerability calculation and anomaly effect routing.
  • Refactor

    • Reworked formula/buff wiring to use combat-focused anomaly multipliers and consolidated skill-type metadata across sheets.

@coderabbitai

coderabbitai Bot commented May 31, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7d50f2d6-df5f-4519-bcaa-47de1471d5b3

📥 Commits

Reviewing files that changed from the base of the PR and between 54abc0d and c725c23.

📒 Files selected for processing (1)
  • libs/zzz/formula/src/data/disc/disc.test.ts

Walkthrough

This PR introduces dual skill-type slots (skillType1/skillType2), moves anomaly move-multiplier stats into the combat namespace, adds veilVulnerabilityCap_/stunned_mult_ logic, and propagates these schema and wiring changes across formulas, metadata, character sheets, UI, executors, and tests.

Changes

Dual-Slot Skill Types and Anomaly Stat Refactor

Layer / File(s) Summary
Core type and stats
libs/zzz/formula/src/data/util/read.ts, libs/zzz/formula/src/data/util/sheet.ts, libs/zzz/formula/src/data/util/tag.ts, libs/zzz/formula/src/data/util/listing.ts
Tag and DmgTag now use skillType1/skillType2; stats adds anom_mv_mult_ and veilVulnerabilityCap_; ownTag regrouped accordingly.
Read API and helpers
libs/zzz/formula/src/data/util/read.ts
Read supports skillType1/skillType2, adds addWithSkillType(), and skill-type getters now return arrays.
Formula utils
libs/zzz/formula/src/data/char/util.ts
Default dmgTag init uses skillType1; anomaly multiplier conditionals reference own.final.anom_mv_mult_ instead of own.dmg.anom_mv_mult_.
Veil vulnerability / stunned logic
libs/zzz/consts/src/common.ts, libs/zzz/formula/src/data/common/dmg.ts
Add stunned_mult_/veilVulnerabilityCap_ labels and conditional stunned multiplier: when cap>0 use min(1+cap, enemy.stun_), else previous behavior.
Anomaly MV namespace migration
libs/zzz/formula/src/data/char/sheets/Alice.ts, libs/zzz/formula/src/data/char/sheets/Anton.ts, libs/zzz/formula/src/data/disc/sheets/ChaosJazz.ts
Buff registrations moved from dmg.anom_mv_mult_/ownBuff.dmg... to combat.anom_mv_mult_/ownBuff.combat...; metadata qt updated where applicable.
Executor dedup + locale tweak
libs/zzz/formula/src/executors/gen-desc/executor.ts, libs/zzz/dm-localization/src/executors/gen-locale/lib/dumpChars.ts
Deduplicate buff entries for swapped skillType1/skillType2 pairs; prepend empty string to potential descriptions array.
Generated metadata renames
libs/zzz/formula/src/meta/char/*/formulas.ts, libs/zzz/formula/src/meta/char/*/buffs.ts
Bulk rename skillTypeskillType1 across generated formulas/buffs; add skillType2 where needed (e.g., MixedFlameBlend).

Character Sheet Logic and UI Implementation Updates

Layer / File(s) Summary
Major sheet refactors
libs/zzz/formula/src/data/char/sheets/YeShunguang.ts, libs/zzz/formula/src/data/char/sheets/Zhao.ts
Rewrite sheets to use baseTag + explicit dmg overrides, add customDmg/customHeal, precompute mindscape-gated modifiers, and expand buff registrations.
Per-sheet helpers & tag migrations
libs/zzz/formula/src/data/char/sheets/Ellen.ts, libs/zzz/formula/src/data/char/sheets/Soldier11.ts, many sheets
Add local ability_check helpers, switch many damage/tag merges to use skillType1, and update buff adders to addWithSkillType(...) where needed.
Burnice & Grace expansions
libs/zzz/formula/src/data/char/sheets/Burnice.ts, libs/zzz/formula/src/data/char/sheets/Grace.ts, libs/zzz/formula/src/meta/char/Burnice/*, libs/zzz/formula/src/meta/char/Grace/*
Add abloom/zapConsumed conditionals, element-specific special/exSpecial anomaly MV buffs, and potential-scaled buffs (potential_anomMas, potential_common_dmg_, potential_electric_dmg_).
UI sheet updates
libs/zzz/formula-ui/src/char/sheets/*, libs/zzz/formula-ui/src/disc/sheets/ChaosJazz.tsx
Expand many sheet UI configs (YeShunguang, Zhao), add perSkillAbility/potential sections (Burnice, Grace, Soldier0Anby), update field keys to new buff names, and fix ChaosJazz title typo.
Tests & small metadata edits
libs/zzz/formula/src/data/disc/disc.test.ts, various meta/char/*/buffs.ts
Adjust test fixture to include potential: 0 and index assistSkill arrays; update small buff qt/tag edits and add Ellen buff metadata.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

ZO

Suggested reviewers

  • nguyentvan7

"Somnia's devlog:
I renamed every skillType at 2 AM, fed new caps to stunned math, and taught buffs to wear combat robes.
Sheets woke up smarter; metadata shuffled their dreams.
Patch compiles. Coffee refilled. Roll for more changes? 🎴☕"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'ZO: 2.5 sheets' is vague and lacks specificity about what changes are included. Consider using a more descriptive title like 'Add character sheets for Zhao, Ye Shunguang, and potential implementations' to better convey the scope and nature of changes.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch priolette/2.5-sheets

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
libs/zzz/formula/src/data/char/sheets/Vivian.ts (1)

217-235: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Keep the M1 anomaly/disorder bonus on the same unit scale.

Classic 3 a.m. gacha math bug: both buffs read dm.m1.anomaly_disorder_dmg_, but only the anomaly branch wraps it in percent(...). That makes one side scale differently from the other, so one of these two buffs is wrong.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libs/zzz/formula/src/data/char/sheets/Vivian.ts` around lines 217 - 235, The
two M1 buffs use the same source dm.m1.anomaly_disorder_dmg_ but scale
differently because the 'anomaly' branch wraps it in percent(...) while the
'disorder' branch does not; make their units consistent by wrapping
dm.m1.anomaly_disorder_dmg_ with percent(...) in the 'disorder' registration
(the registerBuff call that uses
teamBuff.combat.buff_.addWithDmgType('disorder', cmpGE(char.mindscape, 1,
prophecy.ifOn(...)))) so both branches use percent(dm.m1.anomaly_disorder_dmg_).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@libs/zzz/dm-localization/src/executors/gen-locale/lib/dumpChars.ts`:
- Around line 114-118: In dumpChars.ts the desc array is being shifted
incorrectly by desc.unshift('') causing an extra placeholder because name
already skips the first entry; remove the desc.unshift('') line (or stop
inserting the extra empty slot) so that desc = Object.values(data).map(pot =>
processText(pot.Desc)) aligns with the name selection (which uses
Object.values(data).filter((_, i) => i > 0)[0].Name); ensure
processText(pot.Desc) remains used and that no other code expects a leading
empty element.

In `@libs/zzz/formula-ui/src/char/sheets/YeShunguang.tsx`:
- Around line 39-43: The m4 block is currently showing the core veil-cap buff by
referencing buff.core_veilVulnerabilityCap_ (via fieldForBuff) instead of the
Mindscape-4 buff; update the m4 array to call fieldForBuff with the M4-specific
buff identifier (replace buff.core_veilVulnerabilityCap_ with the YeShunguang M4
buff, e.g., buff.yeShunguang_m4 or the actual M4 buff constant used elsewhere)
so the sheet displays the correct M4 effect.

In `@libs/zzz/formula/src/data/char/sheets/YeShunguang.ts`:
- Around line 231-235: The customDmg call for 'm6_dmg' is being passed directly
which nests its result instead of registering its entries; change the call site
(the customDmg invocation that uses 'm6_dmg', baseTag, damageType1: 'elemental',
cmpGE(char.mindscape, 6, prod(own.final.atk, percent(dm.m6.dmg)))) to spread the
returned array into the surrounding entries (i.e. use the spread operator on the
value returned by customDmg) so the m6_dmg entries are inserted rather than
nested.

In `@libs/zzz/formula/src/data/common/dmg.ts`:
- Around line 75-79: The cmpGT call currently applies the veil cap before the
isStunned.ifOn branch, causing non-stunned targets to use enemy.common.stun_
when own.final.veilVulnerabilityCap_ > 0; change the fourth argument so the stun
cap is applied only inside the stunned branch: compute the stunned branch as
min(sum(percent(1), own.final.veilVulnerabilityCap_), enemy.common.stun_) and
pass isStunned.ifOn(that_min_expression, enemy.common.unstun_) as the fourth
parameter to cmpGT so unstunned targets keep enemy.common.unstun_ intact while
stunned targets get clamped.

---

Outside diff comments:
In `@libs/zzz/formula/src/data/char/sheets/Vivian.ts`:
- Around line 217-235: The two M1 buffs use the same source
dm.m1.anomaly_disorder_dmg_ but scale differently because the 'anomaly' branch
wraps it in percent(...) while the 'disorder' branch does not; make their units
consistent by wrapping dm.m1.anomaly_disorder_dmg_ with percent(...) in the
'disorder' registration (the registerBuff call that uses
teamBuff.combat.buff_.addWithDmgType('disorder', cmpGE(char.mindscape, 1,
prophecy.ifOn(...)))) so both branches use percent(dm.m1.anomaly_disorder_dmg_).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: bf4ca6de-0d4a-4d76-aee9-01921ea22332

📥 Commits

Reviewing files that changed from the base of the PR and between 1688721 and 54abc0d.

⛔ Files ignored due to path filters (8)
  • libs/zzz/dm-localization/assets/locales/en/char_Burnice_gen.json is excluded by !**/*_gen.json
  • libs/zzz/dm-localization/assets/locales/en/char_Ellen_gen.json is excluded by !**/*_gen.json
  • libs/zzz/dm-localization/assets/locales/en/char_Grace_gen.json is excluded by !**/*_gen.json
  • libs/zzz/dm-localization/assets/locales/en/char_Harumasa_gen.json is excluded by !**/*_gen.json
  • libs/zzz/dm-localization/assets/locales/en/char_Lycaon_gen.json is excluded by !**/*_gen.json
  • libs/zzz/dm-localization/assets/locales/en/char_Soldier0Anby_gen.json is excluded by !**/*_gen.json
  • libs/zzz/dm-localization/assets/locales/en/char_Soldier11_gen.json is excluded by !**/*_gen.json
  • libs/zzz/stats/src/allStat_gen.json is excluded by !**/*_gen.json
📒 Files selected for processing (118)
  • libs/zzz/consts/src/common.ts
  • libs/zzz/dm-localization/src/executors/gen-locale/lib/dumpChars.ts
  • libs/zzz/formula-ui/src/char/sheets/Burnice.tsx
  • libs/zzz/formula-ui/src/char/sheets/Ellen.tsx
  • libs/zzz/formula-ui/src/char/sheets/Grace.tsx
  • libs/zzz/formula-ui/src/char/sheets/Soldier0Anby.tsx
  • libs/zzz/formula-ui/src/char/sheets/Soldier11.tsx
  • libs/zzz/formula-ui/src/char/sheets/Vivian.tsx
  • libs/zzz/formula-ui/src/char/sheets/YeShunguang.tsx
  • libs/zzz/formula-ui/src/char/sheets/Zhao.tsx
  • libs/zzz/formula-ui/src/disc/sheets/ChaosJazz.tsx
  • libs/zzz/formula/src/data/char/sheets/Alice.ts
  • libs/zzz/formula/src/data/char/sheets/Anton.ts
  • libs/zzz/formula/src/data/char/sheets/Burnice.ts
  • libs/zzz/formula/src/data/char/sheets/Ellen.ts
  • libs/zzz/formula/src/data/char/sheets/Evelyn.ts
  • libs/zzz/formula/src/data/char/sheets/Grace.ts
  • libs/zzz/formula/src/data/char/sheets/Soldier0Anby.ts
  • libs/zzz/formula/src/data/char/sheets/Soldier11.ts
  • libs/zzz/formula/src/data/char/sheets/Vivian.ts
  • libs/zzz/formula/src/data/char/sheets/YeShunguang.ts
  • libs/zzz/formula/src/data/char/sheets/Zhao.ts
  • libs/zzz/formula/src/data/char/util.ts
  • libs/zzz/formula/src/data/common/dmg.ts
  • libs/zzz/formula/src/data/disc/sheets/ChaosJazz.ts
  • libs/zzz/formula/src/data/util/listing.ts
  • libs/zzz/formula/src/data/util/read.ts
  • libs/zzz/formula/src/data/util/sheet.ts
  • libs/zzz/formula/src/data/util/tag.ts
  • libs/zzz/formula/src/executors/gen-desc/executor.ts
  • libs/zzz/formula/src/meta/char/Alice/buffs.ts
  • libs/zzz/formula/src/meta/char/Alice/formulas.ts
  • libs/zzz/formula/src/meta/char/Anby/formulas.ts
  • libs/zzz/formula/src/meta/char/Anton/buffs.ts
  • libs/zzz/formula/src/meta/char/Anton/formulas.ts
  • libs/zzz/formula/src/meta/char/Aria/formulas.ts
  • libs/zzz/formula/src/meta/char/AstraYao/formulas.ts
  • libs/zzz/formula/src/meta/char/Banyue/formulas.ts
  • libs/zzz/formula/src/meta/char/Ben/formulas.ts
  • libs/zzz/formula/src/meta/char/Billy/formulas.ts
  • libs/zzz/formula/src/meta/char/Burnice/buffs.ts
  • libs/zzz/formula/src/meta/char/Burnice/conditionals.ts
  • libs/zzz/formula/src/meta/char/Burnice/formulas.ts
  • libs/zzz/formula/src/meta/char/Caesar/formulas.ts
  • libs/zzz/formula/src/meta/char/Cissia/formulas.ts
  • libs/zzz/formula/src/meta/char/Corin/formulas.ts
  • libs/zzz/formula/src/meta/char/Dialyn/formulas.ts
  • libs/zzz/formula/src/meta/char/Ellen/buffs.ts
  • libs/zzz/formula/src/meta/char/Ellen/formulas.ts
  • libs/zzz/formula/src/meta/char/Evelyn/buffs.ts
  • libs/zzz/formula/src/meta/char/Evelyn/formulas.ts
  • libs/zzz/formula/src/meta/char/Grace/buffs.ts
  • libs/zzz/formula/src/meta/char/Grace/conditionals.ts
  • libs/zzz/formula/src/meta/char/Grace/formulas.ts
  • libs/zzz/formula/src/meta/char/Harumasa/formulas.ts
  • libs/zzz/formula/src/meta/char/Hugo/formulas.ts
  • libs/zzz/formula/src/meta/char/Jane/formulas.ts
  • libs/zzz/formula/src/meta/char/JuFufu/formulas.ts
  • libs/zzz/formula/src/meta/char/Koleda/formulas.ts
  • libs/zzz/formula/src/meta/char/Lighter/formulas.ts
  • libs/zzz/formula/src/meta/char/Lucia/formulas.ts
  • libs/zzz/formula/src/meta/char/Lucy/formulas.ts
  • libs/zzz/formula/src/meta/char/Lycaon/formulas.ts
  • libs/zzz/formula/src/meta/char/Manato/formulas.ts
  • libs/zzz/formula/src/meta/char/Miyabi/formulas.ts
  • libs/zzz/formula/src/meta/char/NangongYu/formulas.ts
  • libs/zzz/formula/src/meta/char/Nekomata/formulas.ts
  • libs/zzz/formula/src/meta/char/Nicole/formulas.ts
  • libs/zzz/formula/src/meta/char/OrphieMagus/formulas.ts
  • libs/zzz/formula/src/meta/char/PanYinhu/formulas.ts
  • libs/zzz/formula/src/meta/char/Piper/formulas.ts
  • libs/zzz/formula/src/meta/char/Promeia/formulas.ts
  • libs/zzz/formula/src/meta/char/Pulchra/formulas.ts
  • libs/zzz/formula/src/meta/char/Qingyi/formulas.ts
  • libs/zzz/formula/src/meta/char/Rina/formulas.ts
  • libs/zzz/formula/src/meta/char/Seed/formulas.ts
  • libs/zzz/formula/src/meta/char/Seth/formulas.ts
  • libs/zzz/formula/src/meta/char/Soldier0Anby/formulas.ts
  • libs/zzz/formula/src/meta/char/Soldier11/buffs.ts
  • libs/zzz/formula/src/meta/char/Soldier11/formulas.ts
  • libs/zzz/formula/src/meta/char/Soukaku/formulas.ts
  • libs/zzz/formula/src/meta/char/StarlightBilly/formulas.ts
  • libs/zzz/formula/src/meta/char/Sunna/formulas.ts
  • libs/zzz/formula/src/meta/char/Trigger/formulas.ts
  • libs/zzz/formula/src/meta/char/Vivian/buffs.ts
  • libs/zzz/formula/src/meta/char/Vivian/formulas.ts
  • libs/zzz/formula/src/meta/char/Yanagi/formulas.ts
  • libs/zzz/formula/src/meta/char/YeShunguang/buffs.ts
  • libs/zzz/formula/src/meta/char/YeShunguang/conditionals.ts
  • libs/zzz/formula/src/meta/char/YeShunguang/formulas.ts
  • libs/zzz/formula/src/meta/char/Yidhari/formulas.ts
  • libs/zzz/formula/src/meta/char/Yixuan/formulas.ts
  • libs/zzz/formula/src/meta/char/Yuzuha/formulas.ts
  • libs/zzz/formula/src/meta/char/Zhao/buffs.ts
  • libs/zzz/formula/src/meta/char/Zhao/conditionals.ts
  • libs/zzz/formula/src/meta/char/Zhao/formulas.ts
  • libs/zzz/formula/src/meta/char/ZhuYuan/formulas.ts
  • libs/zzz/formula/src/meta/disc/ChaosJazz/buffs.ts
  • libs/zzz/localization/assets/locales/en/char_Burnice.json
  • libs/zzz/localization/assets/locales/en/char_Grace.json
  • libs/zzz/localization/assets/locales/en/char_Zhao.json
  • libs/zzz/page-optimize/src/Teammates.tsx
  • libs/zzz/stats/Data/Characters/Burnice.json
  • libs/zzz/stats/Data/Characters/Ellen.json
  • libs/zzz/stats/Data/Characters/Grace.json
  • libs/zzz/stats/Data/Characters/Harumasa.json
  • libs/zzz/stats/Data/Characters/Lycaon.json
  • libs/zzz/stats/Data/Characters/Soldier0Anby.json
  • libs/zzz/stats/Data/Characters/Soldier11.json
  • libs/zzz/stats/src/executors/gen-stats/src/characterData.ts
  • libs/zzz/stats/src/mappedStats/char/maps/Burnice.ts
  • libs/zzz/stats/src/mappedStats/char/maps/Ellen.ts
  • libs/zzz/stats/src/mappedStats/char/maps/Grace.ts
  • libs/zzz/stats/src/mappedStats/char/maps/Soldier0Anby.ts
  • libs/zzz/stats/src/mappedStats/char/maps/Soldier11.ts
  • libs/zzz/stats/src/mappedStats/char/maps/YeShunguang.ts
  • libs/zzz/stats/src/mappedStats/char/maps/Zhao.ts
  • libs/zzz/ui/src/Character/CharacterSelectionModal.tsx

Comment on lines +114 to +118
const desc = Object.values(data).map((pot) => processText(pot.Desc))
desc.unshift('')
return {
name: Object.values(data).filter((_, i) => i > 0)[0].Name,
desc: Object.values(data).map((pot) => processText(pot.Desc)),
desc,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don’t prepend a second placeholder potential entry.

This looks like a sleepy indexing trap: name already skips Object.values(data)[0], so desc is already aligned around that first special entry. desc.unshift('') adds a second empty slot and shifts every real potential description by one index.

Suggested fix
-  const desc = Object.values(data).map((pot) => processText(pot.Desc))
-  desc.unshift('')
+  const desc = Object.values(data).map((pot) => processText(pot.Desc))
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const desc = Object.values(data).map((pot) => processText(pot.Desc))
desc.unshift('')
return {
name: Object.values(data).filter((_, i) => i > 0)[0].Name,
desc: Object.values(data).map((pot) => processText(pot.Desc)),
desc,
const desc = Object.values(data).map((pot) => processText(pot.Desc))
return {
name: Object.values(data).filter((_, i) => i > 0)[0].Name,
desc,
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libs/zzz/dm-localization/src/executors/gen-locale/lib/dumpChars.ts` around
lines 114 - 118, In dumpChars.ts the desc array is being shifted incorrectly by
desc.unshift('') causing an extra placeholder because name already skips the
first entry; remove the desc.unshift('') line (or stop inserting the extra empty
slot) so that desc = Object.values(data).map(pot => processText(pot.Desc))
aligns with the name selection (which uses Object.values(data).filter((_, i) =>
i > 0)[0].Name); ensure processText(pot.Desc) remains used and that no other
code expects a leading empty element.

Comment on lines +39 to +43
m4: [
{
type: 'fields',
fields: [fieldForBuff(buff.core_veilVulnerabilityCap_)],
},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

M4 is still wired to the core veil-cap buff.

My sleep-deprived gacha brain tripped on this: Line 42 points the m4 section at buff.core_veilVulnerabilityCap_, which is already shown in the core block. That makes the sheet display the core stat twice and hides the actual Mindscape 4 effect. Please bind this section to the M4-specific buff instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libs/zzz/formula-ui/src/char/sheets/YeShunguang.tsx` around lines 39 - 43,
The m4 block is currently showing the core veil-cap buff by referencing
buff.core_veilVulnerabilityCap_ (via fieldForBuff) instead of the Mindscape-4
buff; update the m4 array to call fieldForBuff with the M4-specific buff
identifier (replace buff.core_veilVulnerabilityCap_ with the YeShunguang M4
buff, e.g., buff.yeShunguang_m4 or the actual M4 buff constant used elsewhere)
so the sheet displays the correct M4 effect.

Comment on lines +231 to +235
customDmg(
'm6_dmg',
{ ...baseTag, damageType1: 'elemental' },
cmpGE(char.mindscape, 6, prod(own.final.atk, percent(dm.m6.dmg)))
),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Spread customDmg() here.

Sleep-deprived gacha note: this helper is used as an entry array everywhere else in the sheet pipeline, so passing it bare here nests the result instead of registering the m6_dmg entries.

Suggested fix
-  customDmg(
+  ...customDmg(
     'm6_dmg',
     { ...baseTag, damageType1: 'elemental' },
     cmpGE(char.mindscape, 6, prod(own.final.atk, percent(dm.m6.dmg)))
   ),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
customDmg(
'm6_dmg',
{ ...baseTag, damageType1: 'elemental' },
cmpGE(char.mindscape, 6, prod(own.final.atk, percent(dm.m6.dmg)))
),
...customDmg(
'm6_dmg',
{ ...baseTag, damageType1: 'elemental' },
cmpGE(char.mindscape, 6, prod(own.final.atk, percent(dm.m6.dmg)))
),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libs/zzz/formula/src/data/char/sheets/YeShunguang.ts` around lines 231 - 235,
The customDmg call for 'm6_dmg' is being passed directly which nests its result
instead of registering its entries; change the call site (the customDmg
invocation that uses 'm6_dmg', baseTag, damageType1: 'elemental',
cmpGE(char.mindscape, 6, prod(own.final.atk, percent(dm.m6.dmg)))) to spread the
returned array into the surrounding entries (i.e. use the spread operator on the
value returned by customDmg) so the m6_dmg entries are inserted rather than
nested.

Comment on lines +75 to +79
cmpGT(
own.final.veilVulnerabilityCap_,
0,
min(sum(percent(1), own.final.veilVulnerabilityCap_), enemy.common.stun_),
isStunned.ifOn(enemy.common.stun_, enemy.common.unstun_)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve the unstunned branch when applying the veil cap.

My 3 a.m. read: once veilVulnerabilityCap_ > 0, this bypasses isStunned.ifOn(...) entirely, so non-stunned targets still read from enemy.common.stun_. That overstates damage outside stun windows; the cap should only clamp the stunned branch.

🐇 Suggested fix
   ownBuff.dmg.stunned_mult_.add(
-    cmpGT(
-      own.final.veilVulnerabilityCap_,
-      0,
-      min(sum(percent(1), own.final.veilVulnerabilityCap_), enemy.common.stun_),
-      isStunned.ifOn(enemy.common.stun_, enemy.common.unstun_)
-    )
+    isStunned.ifOn(
+      cmpGT(
+        own.final.veilVulnerabilityCap_,
+        0,
+        min(sum(percent(1), own.final.veilVulnerabilityCap_), enemy.common.stun_),
+        enemy.common.stun_
+      ),
+      enemy.common.unstun_
+    )
   ),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libs/zzz/formula/src/data/common/dmg.ts` around lines 75 - 79, The cmpGT call
currently applies the veil cap before the isStunned.ifOn branch, causing
non-stunned targets to use enemy.common.stun_ when
own.final.veilVulnerabilityCap_ > 0; change the fourth argument so the stun cap
is applied only inside the stunned branch: compute the stunned branch as
min(sum(percent(1), own.final.veilVulnerabilityCap_), enemy.common.stun_) and
pass isStunned.ifOn(that_min_expression, enemy.common.unstun_) as the fourth
parameter to cmpGT so unstunned targets keep enemy.common.unstun_ intact while
stunned targets get clamped.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant