ql-stats-models
Version:
Document schemas for Quake Live Statistics and Ranks
553 lines (508 loc) • 25.2 kB
JavaScript
var Promise = require('bluebird'),
mongoose = require('mongoose'),
Schema = mongoose.Schema,
gameStatsSchemaDefinition = require('./schemas/stats-schema-definition');
/*
My goal with this schema is to have the api consumer create a game stats document from the quake live event data,
and use the game stats document to increment dependent counter like player och global overall stats.
Create game stats object,
use the game stats id object as reference to it's parent document
update parent document
*/
module.exports = function (db) {
var GameStats,
gameStatsSchema = new Schema(gameStatsSchemaDefinition);
gameStatsSchema.statics.updateWithGameStats = function (source, targets) {
var query = {
_id: {
$in: targets
}
},
update = {
$inc: {
count: 1,
play_time: source.play_time,
win: source.win,
lose: source.lose,
quit: source.quit,
kills: source.kills,
deaths: source.deaths,
damage_dealt: source.damage_dealt,
damage_taken: source.damage_taken,
accuracy: source.accuracy,
assists: source.assists,
captures: source.captures,
combokill: source.combokill,
defends: source.defends,
excellent: source.excellent,
firstfrag: source.firstfrag,
headshot: source.headshot,
humiliation: source.humiliation,
impressive: source.impressive,
midair: source.midair,
perfect: source.perfect,
perforated: source.perforated,
quadgod: source.quadgod,
rampage: source.rampage,
revenge: source.revenge,
ammo: source.ammo,
armor: source.armor,
armor_regen: source.armor_regen,
battlesuit: source.battlesuit,
doubler: source.doubler,
flight: source.flight,
green_armor: source.green_armor,
guard: source.guard,
haste: source.haste,
health: source.health,
invis: source.invis,
invulnerability: source.invulnerability,
kamikaze: source.kamikaze,
medkit: source.medkit,
mega_health: source.mega_health,
other_holdable: source.other_holdable,
other_powerup: source.other_powerup,
portal: source.portal,
quad: source.quad,
red_armor: source.red_armor,
regen: source.regen,
scout: source.scout,
teleporter: source.teleporter,
yellow_armor: source.yellow_armor,
gauntlet_d: source.gauntlet_d,
gauntlet_dg: source.gauntlet_dg,
gauntlet_dr: source.gauntlet_dr,
gauntlet_h: source.gauntlet_h,
gauntlet_k: source.gauntlet_k,
gauntlet_p: source.gauntlet_p,
gauntlet_s: source.gauntlet_s,
gauntlet_t: source.gauntlet_t,
rocket_p: source.rocket_p,
rocket_k: source.rocket_k,
rocket_d: source.rocket_d,
rocket_s: source.rocket_s,
rocket_h: source.rocket_h,
rocket_t: source.rocket_t,
rocket_dg: source.rocket_dg,
rocket_dr: source.rocket_dr,
lightning_p: source.lightning_p,
lightning_k: source.lightning_k,
lightning_d: source.lightning_d,
lightning_s: source.lightning_s,
lightning_h: source.lightning_h,
lightning_t: source.lightning_t,
lightning_dg: source.lightning_dg,
lightning_dr: source.lightning_dr,
railgun_p: source.railgun_p,
railgun_k: source.railgun_k,
railgun_d: source.railgun_d,
railgun_s: source.railgun_s,
railgun_h: source.railgun_h,
railgun_t: source.railgun_t,
railgun_dg: source.railgun_dg,
railgun_dr: source.railgun_dr,
plasma_p: source.plasma_p,
plasma_k: source.plasma_k,
plasma_d: source.plasma_d,
plasma_s: source.plasma_s,
plasma_h: source.plasma_h,
plasma_t: source.plasma_t,
plasma_dg: source.plasma_dg,
plasma_dr: source.plasma_dr,
grenade_p: source.grenade_p,
grenade_k: source.grenade_k,
grenade_d: source.grenade_d,
grenade_s: source.grenade_s,
grenade_h: source.grenade_h,
grenade_t: source.grenade_t,
grenade_dg: source.grenade_dg,
grenade_dr: source.grenade_dr,
bfg_p: source.bfg_p,
bfg_k: source.bfg_k,
bfg_d: source.bfg_d,
bfg_s: source.bfg_s,
bfg_h: source.bfg_h,
bfg_t: source.bfg_t,
bfg_dg: source.bfg_dg,
bfg_dr: source.bfg_dr,
hmg_p: source.hmg_p,
hmg_k: source.hmg_k,
hmg_d: source.hmg_d,
hmg_s: source.hmg_s,
hmg_h: source.hmg_h,
hmg_t: source.hmg_t,
hmg_dg: source.hmg_dg,
hmg_dr: source.hmg_dr,
chaingun_p: source.chaingun_p,
chaingun_k: source.chaingun_k,
chaingun_d: source.chaingun_d,
chaingun_s: source.chaingun_s,
chaingun_h: source.chaingun_h,
chaingun_t: source.chaingun_t,
chaingun_dg: source.chaingun_dg,
chaingun_dr: source.chaingun_dr,
nailgun_p: source.nailgun_p,
nailgun_k: source.nailgun_k,
nailgun_d: source.nailgun_d,
nailgun_s: source.nailgun_s,
nailgun_h: source.nailgun_h,
nailgun_t: source.nailgun_t,
nailgun_dg: source.nailgun_dg,
nailgun_dr: source.nailgun_dr,
proximitymine_p: source.proximitymine_p,
proximitymine_k: source.proximitymine_k,
proximitymine_d: source.proximitymine_d,
proximitymine_s: source.proximitymine_s,
proximitymine_h: source.proximitymine_h,
proximitymine_t: source.proximitymine_t,
proximitymine_dg: source.proximitymine_dg,
proximitymine_dr: source.proximitymine_dr,
shotgun_p: source.shotgun_p,
shotgun_k: source.shotgun_k,
shotgun_d: source.shotgun_d,
shotgun_s: source.shotgun_s,
shotgun_h: source.shotgun_h,
shotgun_t: source.shotgun_t,
shotgun_dg: source.shotgun_dg,
shotgun_dr: source.shotgun_dr,
other_p: source.other_p,
other_k: source.other_k,
other_d: source.other_d,
other_s: source.other_s,
other_h: source.other_h,
other_t: source.other_t,
other_dg: source.other_dg,
other_dr: source.other_dr
}
};
return GameStats.update(query, update, { multi: true })
};
gameStatsSchema.statics.createWithPlayerStats = function (playerStats) {
var gameStats = new GameStats({
// general
count: 1,
play_time: playerStats.DATA.PLAY_TIME,
win: playerStats.DATA.WIN,
quit: playerStats.DATA.QUIT,
lose: playerStats.DATA.LOSE,
kills: playerStats.DATA.KILLS,
deaths: playerStats.DATA.DEATHS,
damage_dealt: playerStats.DATA.DAMAGE.DEALT,
damage_taken: playerStats.DATA.DAMAGE.TAKEN,
max_streak: playerStats.DATA.MAX_STREAK,
// medals
accuracy: playerStats.DATA.MEDALS.ACCURACY,
assists: playerStats.DATA.MEDALS.ASSISTS,
captures: playerStats.DATA.MEDALS.CAPTURES,
combokill: playerStats.DATA.MEDALS.COMBOKILL,
defends: playerStats.DATA.MEDALS.DEFENDS,
excellent: playerStats.DATA.MEDALS.EXCELLENT,
firstfrag: playerStats.DATA.MEDALS.FIRSTFRAG,
headshot: playerStats.DATA.MEDALS.HEADSHOT,
humiliation: playerStats.DATA.MEDALS.HUMILIATION,
impressive: playerStats.DATA.MEDALS.IMPRESSIVE,
midair: playerStats.DATA.MEDALS.MIDAIR,
perfect: playerStats.DATA.MEDALS.PERFECT,
perforated: playerStats.DATA.MEDALS.PERFORATED,
quadgod: playerStats.DATA.MEDALS.QUADGOD,
rampage: playerStats.DATA.MEDALS.RAMPAGE,
revenge: playerStats.DATA.MEDALS.REVENGE,
// pickups
ammo: playerStats.DATA.PICKUPS.AMMO,
armor: playerStats.DATA.PICKUPS.ARMOR,
armor_regen: playerStats.DATA.PICKUPS.ARMOR_REGEN,
battlesuit: playerStats.DATA.PICKUPS.BATTLESUIT,
doubler: playerStats.DATA.PICKUPS.DOUBLER,
flight: playerStats.DATA.PICKUPS.FLIGHT,
green_armor: playerStats.DATA.PICKUPS.GREEN_ARMOR,
guard: playerStats.DATA.PICKUPS.GUARD,
haste: playerStats.DATA.PICKUPS.HASTE,
health: playerStats.DATA.PICKUPS.HEALTH,
invis: playerStats.DATA.PICKUPS.INVIS,
invulnerability: playerStats.DATA.PICKUPS.INVULNERABILITY,
kamikaze: playerStats.DATA.PICKUPS.KAMIKAZE,
medkit: playerStats.DATA.PICKUPS.MEDKIT,
mega_health: playerStats.DATA.PICKUPS.MEGA_HEALTH,
other_holdable: playerStats.DATA.PICKUPS.OTHER_HOLDABLE,
other_powerup: playerStats.DATA.PICKUPS.OTHER_POWERUP,
portal: playerStats.DATA.PICKUPS.PORTAL,
quad: playerStats.DATA.PICKUPS.QUAD,
red_armor: playerStats.DATA.PICKUPS.RED_ARMOR,
regen: playerStats.DATA.PICKUPS.REGEN,
scout: playerStats.DATA.PICKUPS.SCOUT,
teleporter: playerStats.DATA.PICKUPS.TELEPORTER,
yellow_armor: playerStats.DATA.PICKUPS.YELLOW_ARMOR,
// weapons
gauntlet_d: playerStats.DATA.WEAPONS.GAUNTLET.D,
gauntlet_dg: playerStats.DATA.WEAPONS.GAUNTLET.DG,
gauntlet_dr: playerStats.DATA.WEAPONS.GAUNTLET.DR,
gauntlet_h: playerStats.DATA.WEAPONS.GAUNTLET.H,
gauntlet_k: playerStats.DATA.WEAPONS.GAUNTLET.K,
gauntlet_p: playerStats.DATA.WEAPONS.GAUNTLET.P,
gauntlet_s: playerStats.DATA.WEAPONS.GAUNTLET.S,
gauntlet_t: playerStats.DATA.WEAPONS.GAUNTLET.T,
rocket_p: playerStats.DATA.WEAPONS.ROCKET.P,
rocket_k: playerStats.DATA.WEAPONS.ROCKET.K,
rocket_d: playerStats.DATA.WEAPONS.ROCKET.D,
rocket_s: playerStats.DATA.WEAPONS.ROCKET.S,
rocket_h: playerStats.DATA.WEAPONS.ROCKET.H,
rocket_t: playerStats.DATA.WEAPONS.ROCKET.T,
rocket_dg: playerStats.DATA.WEAPONS.ROCKET.DG,
rocket_dr: playerStats.DATA.WEAPONS.ROCKET.DR,
lightning_p: playerStats.DATA.WEAPONS.LIGHTNING.P,
lightning_k: playerStats.DATA.WEAPONS.LIGHTNING.K,
lightning_d: playerStats.DATA.WEAPONS.LIGHTNING.D,
lightning_s: playerStats.DATA.WEAPONS.LIGHTNING.S,
lightning_h: playerStats.DATA.WEAPONS.LIGHTNING.H,
lightning_t: playerStats.DATA.WEAPONS.LIGHTNING.T,
lightning_dg: playerStats.DATA.WEAPONS.LIGHTNING.DG,
lightning_dr: playerStats.DATA.WEAPONS.LIGHTNING.DR,
railgun_p: playerStats.DATA.WEAPONS.RAILGUN.P,
railgun_k: playerStats.DATA.WEAPONS.RAILGUN.K,
railgun_d: playerStats.DATA.WEAPONS.RAILGUN.D,
railgun_s: playerStats.DATA.WEAPONS.RAILGUN.S,
railgun_h: playerStats.DATA.WEAPONS.RAILGUN.H,
railgun_t: playerStats.DATA.WEAPONS.RAILGUN.T,
railgun_dg: playerStats.DATA.WEAPONS.RAILGUN.DG,
railgun_dr: playerStats.DATA.WEAPONS.RAILGUN.DR,
plasma_p: playerStats.DATA.WEAPONS.PLASMA.P,
plasma_k: playerStats.DATA.WEAPONS.PLASMA.K,
plasma_d: playerStats.DATA.WEAPONS.PLASMA.D,
plasma_s: playerStats.DATA.WEAPONS.PLASMA.S,
plasma_h: playerStats.DATA.WEAPONS.PLASMA.H,
plasma_t: playerStats.DATA.WEAPONS.PLASMA.T,
plasma_dg: playerStats.DATA.WEAPONS.PLASMA.DG,
plasma_dr: playerStats.DATA.WEAPONS.PLASMA.DR,
grenade_p: playerStats.DATA.WEAPONS.GRENADE.P,
grenade_k: playerStats.DATA.WEAPONS.GRENADE.K,
grenade_d: playerStats.DATA.WEAPONS.GRENADE.D,
grenade_s: playerStats.DATA.WEAPONS.GRENADE.S,
grenade_h: playerStats.DATA.WEAPONS.GRENADE.H,
grenade_t: playerStats.DATA.WEAPONS.GRENADE.T,
grenade_dg: playerStats.DATA.WEAPONS.GRENADE.DG,
grenade_dr: playerStats.DATA.WEAPONS.GRENADE.DR,
bfg_p: playerStats.DATA.WEAPONS.BFG.P,
bfg_k: playerStats.DATA.WEAPONS.BFG.K,
bfg_d: playerStats.DATA.WEAPONS.BFG.D,
bfg_s: playerStats.DATA.WEAPONS.BFG.S,
bfg_h: playerStats.DATA.WEAPONS.BFG.H,
bfg_t: playerStats.DATA.WEAPONS.BFG.T,
bfg_dg: playerStats.DATA.WEAPONS.BFG.DG,
bfg_dr: playerStats.DATA.WEAPONS.BFG.DR,
hmg_p: playerStats.DATA.WEAPONS.HMG.P,
hmg_k: playerStats.DATA.WEAPONS.HMG.K,
hmg_d: playerStats.DATA.WEAPONS.HMG.D,
hmg_s: playerStats.DATA.WEAPONS.HMG.S,
hmg_h: playerStats.DATA.WEAPONS.HMG.H,
hmg_t: playerStats.DATA.WEAPONS.HMG.T,
hmg_dg: playerStats.DATA.WEAPONS.HMG.DG,
hmg_dr: playerStats.DATA.WEAPONS.HMG.DR,
chaingun_p: playerStats.DATA.WEAPONS.CHAINGUN.P,
chaingun_k: playerStats.DATA.WEAPONS.CHAINGUN.K,
chaingun_d: playerStats.DATA.WEAPONS.CHAINGUN.D,
chaingun_s: playerStats.DATA.WEAPONS.CHAINGUN.S,
chaingun_h: playerStats.DATA.WEAPONS.CHAINGUN.H,
chaingun_t: playerStats.DATA.WEAPONS.CHAINGUN.T,
chaingun_dg: playerStats.DATA.WEAPONS.CHAINGUN.DG,
chaingun_dr: playerStats.DATA.WEAPONS.CHAINGUN.DR,
nailgun_p: playerStats.DATA.WEAPONS.NAILGUN.P,
nailgun_k: playerStats.DATA.WEAPONS.NAILGUN.K,
nailgun_d: playerStats.DATA.WEAPONS.NAILGUN.D,
nailgun_s: playerStats.DATA.WEAPONS.NAILGUN.S,
nailgun_h: playerStats.DATA.WEAPONS.NAILGUN.H,
nailgun_t: playerStats.DATA.WEAPONS.NAILGUN.T,
nailgun_dg: playerStats.DATA.WEAPONS.NAILGUN.DG,
nailgun_dr: playerStats.DATA.WEAPONS.NAILGUN.DR,
proximitymine_p: playerStats.DATA.WEAPONS.PROXMINE.P,
proximitymine_k: playerStats.DATA.WEAPONS.PROXMINE.K,
proximitymine_d: playerStats.DATA.WEAPONS.PROXMINE.D,
proximitymine_s: playerStats.DATA.WEAPONS.PROXMINE.S,
proximitymine_h: playerStats.DATA.WEAPONS.PROXMINE.H,
proximitymine_t: playerStats.DATA.WEAPONS.PROXMINE.T,
proximitymine_dg: playerStats.DATA.WEAPONS.PROXMINE.DG,
proximitymine_dr: playerStats.DATA.WEAPONS.PROXMINE.DR,
shotgun_p: playerStats.DATA.WEAPONS.SHOTGUN.P,
shotgun_k: playerStats.DATA.WEAPONS.SHOTGUN.K,
shotgun_d: playerStats.DATA.WEAPONS.SHOTGUN.D,
shotgun_s: playerStats.DATA.WEAPONS.SHOTGUN.S,
shotgun_h: playerStats.DATA.WEAPONS.SHOTGUN.H,
shotgun_t: playerStats.DATA.WEAPONS.SHOTGUN.T,
shotgun_dg: playerStats.DATA.WEAPONS.SHOTGUN.DG,
shotgun_dr: playerStats.DATA.WEAPONS.SHOTGUN.DR,
other_p: playerStats.DATA.WEAPONS.OTHER_WEAPON.P,
other_k: playerStats.DATA.WEAPONS.OTHER_WEAPON.K,
other_d: playerStats.DATA.WEAPONS.OTHER_WEAPON.D,
other_s: playerStats.DATA.WEAPONS.OTHER_WEAPON.S,
other_h: playerStats.DATA.WEAPONS.OTHER_WEAPON.H,
other_t: playerStats.DATA.WEAPONS.OTHER_WEAPON.T,
other_dg: playerStats.DATA.WEAPONS.OTHER_WEAPON.DG,
other_dr: playerStats.DATA.WEAPONS.OTHER_WEAPON.DR
});
return gameStats.save().then();
};
gameStatsSchema.methods.incrementWithGameStats = function (gameStats) {
var incrementQuery = {
$inc: {
// general
count: 1,
play_time: gameStats.play_time,
win: gameStats.win,
quit: gameStats.quit,
lose: gameStats.lose,
kills: gameStats.kills,
deaths: gameStats.deaths,
damage_dealt: gameStats.damage_dealt,
damage_taken: gameStats.damage_taken,
max_streak: gameStats.max_streak,
//
accuracy: gameStats.accuracy,
assists: gameStats.assists,
captures: gameStats.captures,
combokill: gameStats.combokill,
defends: gameStats.defends,
excellent: gameStats.excellent,
firstfrag: gameStats.firstfrag,
headshot: gameStats.headshot,
humiliation: gameStats.humiliation,
impressive: gameStats.impressive,
midair: gameStats.midair,
perfect: gameStats.perfect,
perforated: gameStats.perforated,
quadgod: gameStats.quadgod,
rampage: gameStats.rampage,
revenge: gameStats.revenge,
// ammo: gameStats.ammo,
armor: gameStats.armor,
armor_regen: gameStats.armor_regen,
battlesuit: gameStats.battlesuit,
doubler: gameStats.doubler,
flight: gameStats.flight,
green_armor: gameStats.green_armor,
guard: gameStats.guard,
haste: gameStats.haste,
health: gameStats.health,
invis: gameStats.invis,
invulnerability: gameStats.invulnerability,
kamikaze: gameStats.kamikaze,
medkit: gameStats.medkit,
mega_health: gameStats.mega_health,
other_holdable: gameStats.other_holdable,
other_powerup: gameStats.other_powerup,
portal: gameStats.portal,
quad: gameStats.quad,
red_armor: gameStats.red_armor,
regen: gameStats.regen,
scout: gameStats.scout,
teleporter: gameStats.teleporter,
yellow_armor: gameStats.yellow_armor,
gauntlet_d: gameStats.gauntlet_d,
gauntlet_dg: gameStats.gauntlet_dg,
gauntlet_dr: gameStats.gauntlet_dr,
gauntlet_h: gameStats.gauntlet_h,
gauntlet_k: gameStats.gauntlet_k,
gauntlet_p: gameStats.gauntlet_p,
gauntlet_s: gameStats.gauntlet_s,
gauntlet_t: gameStats.gauntlet_t,
rocket_p: gameStats.rocket_p,
rocket_k: gameStats.rocket_k,
rocket_d: gameStats.rocket_d,
rocket_s: gameStats.rocket_s,
rocket_h: gameStats.rocket_h,
rocket_t: gameStats.rocket_t,
rocket_dg: gameStats.rocket_dg,
rocket_dr: gameStats.rocket_dr,
lightning_p: gameStats.lightning_p,
lightning_k: gameStats.lightning_k,
lightning_d: gameStats.lightning_d,
lightning_s: gameStats.lightning_s,
lightning_h: gameStats.lightning_h,
lightning_t: gameStats.lightning_t,
lightning_dg: gameStats.lightning_dg,
lightning_dr: gameStats.lightning_dr,
railgun_p: gameStats.railgun_p,
railgun_k: gameStats.railgun_k,
railgun_d: gameStats.railgun_d,
railgun_s: gameStats.railgun_s,
railgun_h: gameStats.railgun_h,
railgun_t: gameStats.railgun_t,
railgun_dg: gameStats.railgun_dg,
railgun_dr: gameStats.railgun_dr,
plasma_p: gameStats.plasma_p,
plasma_k: gameStats.plasma_k,
plasma_d: gameStats.plasma_d,
plasma_s: gameStats.plasma_s,
plasma_h: gameStats.plasma_h,
plasma_t: gameStats.plasma_t,
plasma_dg: gameStats.plasma_dg,
plasma_dr: gameStats.plasma_dr,
grenade_p: gameStats.grenade_p,
grenade_k: gameStats.grenade_k,
grenade_d: gameStats.grenade_d,
grenade_s: gameStats.grenade_s,
grenade_h: gameStats.grenade_h,
grenade_t: gameStats.grenade_t,
grenade_dg: gameStats.grenade_dg,
grenade_dr: gameStats.grenade_dr,
bfg_p: gameStats.bfg_p,
bfg_k: gameStats.bfg_k,
bfg_d: gameStats.bfg_d,
bfg_s: gameStats.bfg_s,
bfg_h: gameStats.bfg_h,
bfg_t: gameStats.bfg_t,
bfg_dg: gameStats.bfg_dg,
bfg_dr: gameStats.bfg_dr,
hmg_p: gameStats.hmg_p,
hmg_k: gameStats.hmg_k,
hmg_d: gameStats.hmg_d,
hmg_s: gameStats.hmg_s,
hmg_h: gameStats.hmg_h,
hmg_t: gameStats.hmg_t,
hmg_dg: gameStats.hmg_dg,
hmg_dr: gameStats.hmg_dr,
chaingun_p: gameStats.chaingun_p,
chaingun_k: gameStats.chaingun_k,
chaingun_d: gameStats.chaingun_d,
chaingun_s: gameStats.chaingun_s,
chaingun_h: gameStats.chaingun_h,
chaingun_t: gameStats.chaingun_t,
chaingun_dg: gameStats.chaingun_dg,
chaingun_dr: gameStats.chaingun_dr,
nailgun_p: gameStats.nailgun_p,
nailgun_k: gameStats.nailgun_k,
nailgun_d: gameStats.nailgun_d,
nailgun_s: gameStats.nailgun_s,
nailgun_h: gameStats.nailgun_h,
nailgun_t: gameStats.nailgun_t,
nailgun_dg: gameStats.nailgun_dg,
nailgun_dr: gameStats.nailgun_dr,
proximitymine_p: gameStats.proximitymine_p,
proximitymine_k: gameStats.proximitymine_k,
proximitymine_d: gameStats.proximitymine_d,
proximitymine_s: gameStats.proximitymine_s,
proximitymine_h: gameStats.proximitymine_h,
proximitymine_t: gameStats.proximitymine_t,
proximitymine_dg: gameStats.proximitymine_dg,
proximitymine_dr: gameStats.proximitymine_dr,
shotgun_p: gameStats.shotgun_p,
shotgun_k: gameStats.shotgun_k,
shotgun_d: gameStats.shotgun_d,
shotgun_s: gameStats.shotgun_s,
shotgun_h: gameStats.shotgun_h,
shotgun_t: gameStats.shotgun_t,
shotgun_dg: gameStats.shotgun_dg,
shotgun_dr: gameStats.shotgun_dr,
other_p: gameStats.other_p,
other_k: gameStats.other_k,
other_d: gameStats.other_d,
other_s: gameStats.other_s,
other_h: gameStats.other_h,
other_t: gameStats.other_t,
other_dg: gameStats.other_dg,
other_dr: gameStats.other_dr
}
};
return this.update(incrementQuery);
};
GameStats = db.model('GameStats', gameStatsSchema);
return GameStats;
};