2014-04-12 13:51:02 -04:00
c = require ' ./../schemas '
2014-04-12 04:35:56 -04:00
LevelSessionPlayerSchema = c . object
id: c . objectId
links: [
{
rel: ' extra '
2014-06-30 22:16:26 -04:00
href: ' /db/user/{($)} '
2014-04-12 04:35:56 -04:00
}
]
time:
type: ' Number '
changes:
type: ' Number '
2014-07-17 19:30:56 -04:00
LevelSessionLevelSchema = c . object { required: [ ' original ' , ' majorVersion ' ] , links: [ { rel: ' db ' , href: ' /db/level/{(original)}/version/{(majorVersion)} ' } ] } ,
2014-04-12 04:35:56 -04:00
original: c . objectId ( { } )
majorVersion:
type: ' integer '
minimum: 0
LevelSessionSchema = c . object
2014-06-30 22:16:26 -04:00
title: ' Session '
description: ' A single session for a given level. '
2014-08-23 19:06:41 -04:00
default:
2014-09-25 16:17:41 -04:00
codeLanguage: ' python '
submittedCodeLanguage: ' python '
2014-08-23 19:06:41 -04:00
playtime: 0
2014-04-12 04:35:56 -04:00
_ . extend LevelSessionSchema . properties ,
# denormalization
2015-01-30 17:45:34 -05:00
browser:
type: ' object '
2014-04-12 04:35:56 -04:00
creatorName:
type: ' string '
levelName:
type: ' string '
levelID:
type: ' string '
creator: c . objectId
links:
[
{
rel: ' extra '
2014-06-30 22:16:26 -04:00
href: ' /db/user/{($)} '
2014-04-12 04:35:56 -04:00
}
]
created: c . date
title: ' Created '
readOnly: true
changed: c . date
title: ' Changed '
readOnly: true
2016-07-08 20:04:24 -04:00
2016-05-09 12:32:51 -04:00
dateFirstCompleted: { } # c.stringDate
# title: 'Completed'
# readOnly: true
2014-04-12 04:35:56 -04:00
team: c . shortString ( )
level: LevelSessionLevelSchema
2014-09-20 18:18:21 -04:00
heroConfig: c . HeroConfigSchema
2014-04-12 04:35:56 -04:00
state: c . object { } ,
complete:
type: ' boolean '
scripts: c . object { } ,
ended:
type: ' object '
additionalProperties:
type: ' number '
currentScript:
type: [
' null '
' string '
]
currentScriptOffset:
type: ' number '
2015-11-10 18:22:09 -05:00
selected: # Not tracked any more, delete with old level types
2014-04-12 04:35:56 -04:00
type: [
' null '
' string '
]
playing:
2015-11-10 18:22:09 -05:00
type: ' boolean ' # Not tracked any more, delete with old level types
2014-04-12 04:35:56 -04:00
frame:
2015-11-10 18:22:09 -05:00
type: ' number ' # Not tracked any more, delete with old level types
2015-04-08 15:00:12 -04:00
thangs: # ... what is this? Is this used?
2014-04-12 04:35:56 -04:00
type: ' object '
additionalProperties:
title: ' Thang '
type: ' object '
properties:
methods:
type: ' object '
additionalProperties:
title: ' Thang Method '
type: ' object '
properties:
metrics:
type: ' object '
source:
type: ' string '
2014-08-08 07:08:13 -04:00
goalStates:
type: ' object '
description: ' Maps Goal ID on a goal state object '
additionalProperties:
title: ' Goal State '
type: ' object '
properties:
status: enum: [ ' failure ' , ' incomplete ' , ' success ' ]
2014-10-18 20:32:01 -04:00
submissionCount:
description: ' How many times the session has been submitted for real-time playback (can affect the random seed). '
type: ' integer '
minimum: 0
2015-01-05 13:44:17 -05:00
difficulty:
description: ' The highest difficulty level beaten, for use in increasing-difficulty replayable levels. '
type: ' integer '
minimum: 0
lastUnsuccessfulSubmissionTime: c . date
description: ' The last time that real-time submission was started without resulting in a win. '
2014-10-18 20:32:01 -04:00
flagHistory:
description: ' The history of flag events during the last real-time playback submission. '
type: ' array '
items: c . object { required: [ ' player ' , ' color ' , ' time ' , ' active ' ] } ,
player: { type: ' string ' }
team: { type: ' string ' }
color: { type: ' string ' , enum: [ ' green ' , ' black ' , ' violet ' ] }
time: { type: ' number ' , minimum: 0 }
active: { type: ' boolean ' }
pos: c . object { required: [ ' x ' , ' y ' ] } ,
x: { type: ' number ' }
y: { type: ' number ' }
2014-11-15 19:56:18 -05:00
source: { type: ' string ' , enum: [ ' click ' ] } # Do not store 'code' flag events in the session.
2015-01-31 00:36:36 -05:00
topScores: c . array { } ,
c . object { } ,
type: c . shortString ( ' enum ' : [ ' time ' , ' damage-taken ' , ' damage-dealt ' , ' gold-collected ' , ' difficulty ' ] )
date: c . date
description: ' When the submission achieving this score happened. '
score: { type: ' number ' } # Store 'time' and 'damage-taken' as negative numbers so the index works.
2014-04-12 04:35:56 -04:00
code:
type: ' object '
2014-04-15 18:01:54 -04:00
additionalProperties:
type: ' object '
additionalProperties:
type: ' string '
2014-08-30 16:43:56 -04:00
format: ' code '
2014-06-30 22:16:26 -04:00
2016-02-08 17:24:08 -05:00
codeLogs:
type: ' array '
2014-05-14 19:41:01 -04:00
codeLanguage:
type: ' string '
2014-06-30 22:16:26 -04:00
2014-05-16 17:13:59 -04:00
playtime:
type: ' number '
title: ' Playtime '
description: ' The total playtime on this session '
2014-06-30 22:16:26 -04:00
2014-04-12 04:35:56 -04:00
teamSpells:
type: ' object '
additionalProperties:
type: ' array '
players:
type: ' object '
chat:
type: ' array '
2015-11-17 18:25:22 -05:00
ladderAchievementDifficulty:
type: ' integer '
minimum: 0
description: ' What ogre AI difficulty, 0-4, this human session has beaten in a multiplayer arena. '
2014-04-12 04:35:56 -04:00
meanStrength:
type: ' number '
standardDeviation:
2014-06-30 22:16:26 -04:00
type: ' number '
2014-04-12 04:35:56 -04:00
minimum: 0
totalScore:
type: ' number '
submitted:
type: ' boolean '
submitDate: c . date
title: ' Submitted '
submittedCode:
type: ' object '
2014-04-15 18:01:54 -04:00
additionalProperties:
type: ' object '
additionalProperties:
type: ' string '
2014-08-30 16:43:56 -04:00
format: ' code '
2014-05-13 13:49:02 -04:00
submittedCodeLanguage:
type: ' string '
2014-06-30 22:16:26 -04:00
2014-04-12 04:35:56 -04:00
isRanking:
type: ' boolean '
description: ' Whether this session is still in the first ranking chain after being submitted. '
2015-04-12 14:34:19 -04:00
randomSimulationIndex:
type: ' number '
description: ' A random updated every time the game is randomly simulated for a uniform random distribution of simulations (see # 2448). '
minimum: 0
maximum: 1
2014-04-12 04:35:56 -04:00
unsubscribed:
type: ' boolean '
description: ' Whether the player has opted out of receiving email updates about ladder rankings for this session. '
numberOfWinsAndTies:
type: ' number '
numberOfLosses:
type: ' number '
scoreHistory:
type: ' array '
title: ' Score History '
description: ' A list of objects representing the score history of a session '
items:
title: ' Score History Point '
description: ' An array with the format [unix timestamp, totalScore] '
type: ' array '
items:
type: ' number '
matches:
type: ' array '
title: ' Matches '
description: ' All of the matches a submitted session has played in its current state. '
items:
type: ' object '
properties:
date: c . date
title: ' Date computed '
description: ' The date a match was computed. '
2014-05-16 17:13:59 -04:00
playtime:
title: ' Playtime so far '
2015-04-08 15:00:12 -04:00
description: ' The total seconds of playtime on this session when the match was computed. Not currently tracked. '
2014-05-16 17:13:59 -04:00
type: ' number '
2014-04-12 04:35:56 -04:00
metrics:
type: ' object '
title: ' Metrics '
description: ' Various information about the outcome of a match. '
properties:
rank:
title: ' Rank '
description: ' A 0-indexed ranking representing the player \' s standing in the outcome of a match '
type: ' number '
opponents:
type: ' array '
title: ' Opponents '
description: ' An array containing information about the opponents \' sessions in a given match. '
items:
type: ' object '
properties:
sessionID:
title: ' Opponent Session ID '
description: ' The session ID of an opponent. '
2014-06-30 22:16:26 -04:00
type: [ ' object ' , ' string ' , ' null ' ]
2014-04-12 04:35:56 -04:00
userID:
title: ' Opponent User ID '
description: ' The user ID of an opponent '
2014-06-30 22:16:26 -04:00
type: [ ' object ' , ' string ' , ' null ' ]
2014-05-16 17:13:59 -04:00
name:
title: ' Opponent name '
description: ' The name of the opponent '
2014-06-30 22:16:26 -04:00
type: [ ' string ' , ' null ' ]
2014-05-16 17:13:59 -04:00
totalScore:
title: ' Opponent total score '
description: ' The totalScore of a user when the match was computed '
2014-06-30 22:16:26 -04:00
type: [ ' number ' , ' string ' , ' null ' ]
2014-04-12 04:35:56 -04:00
metrics:
type: ' object '
properties:
rank:
title: ' Opponent Rank '
description: ' The opponent \' s ranking in a given match '
type: ' number '
2014-07-13 23:19:51 -04:00
codeLanguage:
2014-10-31 21:05:29 -04:00
type: [ ' string ' , ' null ' ] # 'null' in case an opponent session got corrupted, don't care much here
2014-07-13 23:19:51 -04:00
description: ' What submittedCodeLanguage the opponent used during the match '
2015-02-11 23:24:12 -05:00
simulator: { type: ' object ' , description: ' Holds info on who simulated the match, and with what tools. ' }
2015-02-12 21:40:38 -05:00
randomSeed: { description: ' Stores the random seed that was used during this match. ' }
2014-04-12 04:35:56 -04:00
2015-08-15 08:38:47 -04:00
leagues:
c . array { description: ' Multiplayer data for the league corresponding to Clans and CourseInstances the player is a part of. ' } ,
c . object { } ,
leagueID: { type: ' string ' , description: ' The _id of a Clan or CourseInstance the user belongs to. ' }
stats: c . object { description: ' Multiplayer match statistics corresponding to this entry in the league. ' }
2015-12-06 12:20:30 -05:00
lastOpponentSubmitDate: c . date { description: ' The submitDate of the last league session we selected to play against (for playing through league opponents in order). ' }
2015-08-15 08:38:47 -04:00
LevelSessionSchema.properties.leagues.items.properties.stats.properties = _ . pick LevelSessionSchema . properties , ' meanStrength ' , ' standardDeviation ' , ' totalScore ' , ' numberOfWinsAndTies ' , ' numberOfLosses ' , ' scoreHistory ' , ' matches '
2014-04-12 04:35:56 -04:00
c . extendBasicProperties LevelSessionSchema , ' level.session '
c . extendPermissionsProperties LevelSessionSchema , ' level.session '
module.exports = LevelSessionSchema