Skip to content

Release 1.36.2#3289

Merged
ipdae merged 44 commits into
mainfrom
release/1.36.2
May 22, 2026
Merged

Release 1.36.2#3289
ipdae merged 44 commits into
mainfrom
release/1.36.2

Conversation

@ipdae
Copy link
Copy Markdown
Contributor

@ipdae ipdae commented May 22, 2026

Release 1.36.2

Changes

Highlights

  • PAEV 예외 정보 보존: ActionEvaluationMarshaller가 원래 액션 예외의 런타임 타입과 InnerException 체인을 직렬화하도록 수정 — Libplanet의 TxExecution 언랩 단계에서 실제 액션 예외 이름을 복원 가능. 레거시(Text) 포맷과의 역호환성 유지.
  • 테이블 데이터 업데이트 (v200420 / v200430): 다수 CSV(스테이지, 퀘스트, 코스튬, 크리스털, 스테이크 등) 구글 시트 기준 동기화.

Version

  • Lib9c: 1.36.1 → 1.36.2

🤖 Generated with Claude Code

jaeho0103 and others added 30 commits April 3, 2026 18:01
ipdae and others added 14 commits April 27, 2026 20:39
- 21 tables updated from Google Sheet
- RuneSheet: added 10053 (Freya PETPOP), 10054 (Breaker)
- SkillSheet/StatBuffSheet/SkillBuffSheet: new skills added
- MaterialItemSheet: transcendence materials added
- InfiniteTower*: expanded to floor 46+
- BuffLimitSheet/SynthesizeSheet/EventDungeon*: data updates
- CollectionSheet: 15 new transcendence collections
When ActionEvaluationMarshaller.Unmarshal reconstructed an evaluation,
it created a generic `new Exception(typeName)`, which collapsed the
original action exception type into `System.Exception`. Downstream
consumers (e.g. Libplanet's TxExecution, surfaced through
NineChronicles.Headless's transactionResult.exceptionNames) then
recorded every PAEV-evaluated failure as "System.Exception" instead of
the actual action exception.

Resolve the recorded FullName against loaded assemblies and instantiate
the matching Exception subtype via FormatterServices.GetUninitializedObject
so GetType().FullName round-trips correctly. Falls back to a generic
Exception when the type cannot be resolved.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After v200430, stage 451 is no longer a clone of base stage 1 — its
SweepRequiredCP and combat stats are now those of a real mid-game
stage. Boost the test avatar via a synthetic in-memory CollectionSheet
row (no production CSV touched) so the seven failing tests can clear
the new CP threshold and simulator battles, and derive sweep play
count from the stage's CostAP instead of a hard-coded constant.
Action exceptions thrown inside the plugin are wrapped by Libplanet in
UnexpectedlyTerminatedActionException whose InnerException is the real
cause. The marshaller previously serialized only the outermost type
name, so when Libplanet's TxExecution constructor ran its
`InnerException ?? exception` unwrap step on the deserialized object,
the inner was null and the wrapper type leaked through as
"Libplanet.Action.UnexpectedlyTerminatedActionException".

Marshal the full outer->inner chain as a Bencodex list and reconstruct
it on the host side by writing each reconstructed inner into
Exception._innerException via reflection. Falls back to the legacy
single-Text format on read for forward compatibility with plugin DLLs
that pre-date this change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The check-items-without-docs-increased lint job failed because the three new public test methods lacked XML doc comments, pushing the project's undocumented-item count above the base branch's.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ype-in-marshaller

Preserve original exception type in ActionEvaluationMarshaller
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ipdae ipdae merged commit c9e1641 into main May 22, 2026
28 of 29 checks passed
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.

2 participants