{
"id": "net.anisota.beta.game.progress",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"level",
"totalXP",
"progressPercentage",
"xpToNextLevel",
"createdAt"
],
"properties": {
"level": {
"type": "integer",
"minimum": 1,
"description": "Current player level"
},
"stats": {
"ref": "#stats",
"type": "ref"
},
"cardUri": {
"type": "string",
"description": "URI of the card that was advanced when triggerSource is card_advance"
},
"totalXP": {
"type": "integer",
"minimum": 0,
"description": "Total experience points accumulated"
},
"metadata": {
"ref": "#metadata",
"type": "ref"
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the progress record was created"
},
"sessionId": {
"type": "string",
"description": "Session ID when this progress was recorded (for linking with log records)"
},
"sessionUri": {
"type": "string",
"description": "URI of the session record when this progress was recorded"
},
"previousLevel": {
"type": "integer",
"minimum": 1,
"description": "Previous level before this update (for tracking level progression)"
},
"triggerSource": {
"enum": [
"card_advance",
"post",
"post_to_list",
"specimen_discover",
"specimen_catch_new",
"specimen_catch_repeat",
"level_up",
"manual_save",
"session_end"
],
"type": "string",
"description": "What action triggered this progress save"
},
"xpToNextLevel": {
"type": "integer",
"minimum": 0,
"description": "Experience points needed to reach the next level"
},
"currentStamina": {
"type": "string",
"description": "Current stamina level when this progress was recorded (decimal string, e.g. '85.5')"
},
"relatedLogUris": {
"type": "array",
"items": {
"type": "string"
},
"description": "URIs of related game log records that contributed to this progress"
},
"progressPercentage": {
"type": "string",
"description": "Progress percentage to the next level (decimal string, e.g. '75.5')"
},
"xpGainedSinceLastSave": {
"type": "integer",
"minimum": 0,
"description": "Experience points gained since the last progress save"
}
}
},
"description": "Record representing a player's level progression and game statistics"
},
"stats": {
"type": "object",
"properties": {
"postsViewed": {
"type": "integer",
"minimum": 0,
"description": "Total posts viewed"
},
"itemsCollected": {
"type": "integer",
"minimum": 0,
"description": "Total items collected"
},
"postsReadToday": {
"type": "integer",
"minimum": 0,
"description": "Posts read today (resets daily)"
},
"postsReadTotal": {
"type": "integer",
"minimum": 0,
"description": "Total posts read (all time, cumulative)"
},
"lastPostReadDate": {
"type": "string",
"format": "datetime",
"description": "Date when posts read today was last updated (for daily reset tracking)"
},
"shufflesPerformed": {
"type": "integer",
"minimum": 0,
"description": "Total shuffles performed"
},
"specimensCollected": {
"type": "integer",
"minimum": 0,
"description": "Total specimens collected"
},
"dailyRewardsClaimed": {
"type": "integer",
"minimum": 0,
"description": "Total daily rewards claimed"
}
},
"description": "Game-specific statistics and metrics"
},
"metadata": {
"type": "object",
"properties": {
"platform": {
"type": "string",
"description": "Platform where the level up occurred (web, mobile, etc.)"
},
"clientVersion": {
"type": "string",
"description": "Version of the client when this progress was recorded"
}
},
"description": "Additional metadata about this progress update"
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}