4 Commits
Author SHA1 Message Date
Braxton Atkinson 750299a617 test(libSceNpUniversalDataSystem): cover locale-independent describe output 2026-10-20 12:27:13 -05:00
Braxton Atkinson 941ca91d18 fix(libSceNpUniversalDataSystem): keep float text locale-independent 2026-10-20 12:27:12 -05:00
Yunus Shaikh 4362803457 feat(libSceNpUniversalDataSystem): unlock trophies through the title's statistics
Events other than the trophy events go through the title's
sce_sys/uds/udsNN.ucp: stats_definition.json gives the statistics that
keep their latest uint32 or uint64 value, and stats_extraction.json the
event property ($.name, dotted for nested objects) that sets each one.
Statistics are kept per user and service label in
_trophy/<user id>_<service label>.stats.txt next to the unlocks.

After each event that sets a statistic, every trophy's unlockCondition
(ge, gt, le or lt against its targetValue) is checked on the values that
event set and the stored values of the other statistics, so a later
event setting the same statistic cannot hide what this one reached.
Reached trophies unlock through the same path as _UnlockTrophy.
Progressive trophies report their statistic as progress, and
APS5_TRACE_UDS prints each statistic an event sets. A missing udsNN.ucp
is ignored and a malformed one is logged once.
2026-10-17 23:28:56 +00:00
Yunus Shaikh 98c700ea02 feat(libSceNpUniversalDataSystem): keep event properties and record posted trophy unlocks
Events and property objects keep their typed properties instead of
dropping them. PostEvent records an _UnlockTrophy event with an int32
_trophy_id for the user and service label of its context, logs why a
trophy event is ignored, and prints every posted event with
APS5_TRACE_UDS.
2026-10-17 23:28:11 +00:00