A/B test hiding locked levels in world map

This commit is contained in:
Matt Lott 2014-11-30 22:11:36 -08:00
parent c9a6949a15
commit 23e60116d5
3 changed files with 40 additions and 25 deletions
app

View file

@ -124,6 +124,15 @@ module.exports = class User extends CocoModel
application.tracker.identify gemPromptGroup: @gemPromptGroup unless me.isAdmin() application.tracker.identify gemPromptGroup: @gemPromptGroup unless me.isAdmin()
@gemPromptGroup @gemPromptGroup
getHideLockedLevelsGroup: ->
return @hideLockedLevelsGroup if @hideLockedLevelsGroup
group = if me.isAdmin() then 0 else me.get('testGroupNumber') % 2
@hideLockedLevelsGroup = switch group
when 0 then 'show'
when 1 then 'hide'
application.tracker.identify hideLockedLevelsGroup: @hideLockedLevelsGroup unless me.isAdmin()
@hideLockedLevelsGroup
tiersByLevel = [-1, 0, 0.05, 0.14, 0.18, 0.32, 0.41, 0.5, 0.64, 0.82, 0.91, 1.04, 1.22, 1.35, 1.48, 1.65, 1.78, 1.96, 2.1, 2.24, 2.38, 2.55, 2.69, 2.86, 3.03, 3.16, 3.29, 3.42, 3.58, 3.74, 3.89, 4.04, 4.19, 4.32, 4.47, 4.64, 4.79, 4.96, tiersByLevel = [-1, 0, 0.05, 0.14, 0.18, 0.32, 0.41, 0.5, 0.64, 0.82, 0.91, 1.04, 1.22, 1.35, 1.48, 1.65, 1.78, 1.96, 2.1, 2.24, 2.38, 2.55, 2.69, 2.86, 3.03, 3.16, 3.29, 3.42, 3.58, 3.74, 3.89, 4.04, 4.19, 4.32, 4.47, 4.64, 4.79, 4.96,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15
] ]

View file

@ -10,30 +10,32 @@
if !level.hidden if !level.hidden
- var next = level.id == nextLevel || (!seenNext && levelStatusMap[level.id] != "complete" && !level.locked && !level.disabled && (!level.practice || me.getBranchingGroup() == 'all-practice')); - var next = level.id == nextLevel || (!seenNext && levelStatusMap[level.id] != "complete" && !level.locked && !level.disabled && (!level.practice || me.getBranchingGroup() == 'all-practice'));
- seenNext = seenNext || next; - seenNext = seenNext || next;
div(style="left: #{level.x}%; bottom: #{level.y}%; background-color: #{level.color}", class="level" + (next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.id] || "", data-level-id=level.id, title=level.name + (level.disabled ? ' (Coming Soon to Adventurers)' : '')) //- A/B Test hiding locked levels
a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.id}", disabled=level.disabled, data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name) if !hideLockedLevels || !level.locked
div(style="left: #{level.x}%; bottom: #{level.y}%", class="level-shadow" + (next ? " next" : "") + " " + levelStatusMap[level.id] || "") div(style="left: #{level.x}%; bottom: #{level.y}%; background-color: #{level.color}", class="level" + (next ? " next" : "") + (level.disabled ? " disabled" : "") + (level.locked ? " locked" : "") + " " + levelStatusMap[level.id] || "", data-level-id=level.id, title=level.name + (level.disabled ? ' (Coming Soon to Adventurers)' : ''))
.level-info-container(data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name) a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.id}", disabled=level.disabled, data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name)
div(class="level-info " + (levelStatusMap[level.id] || "")) div(style="left: #{level.x}%; bottom: #{level.y}%", class="level-shadow" + (next ? " next" : "") + " " + levelStatusMap[level.id] || "")
h3= level.name + (level.disabled ? " (Coming soon!)" : (level.locked ? " (Locked)" : "")) .level-info-container(data-level-id=level.id, data-level-path=level.levelPath || 'level', data-level-name=level.name)
.level-description= level.description div(class="level-info " + (levelStatusMap[level.id] || ""))
if level.disabled h3= level.name + (level.disabled ? " (Coming soon!)" : (level.locked ? " (Locked)" : ""))
p .level-description= level.description
span.spr(data-i18n="play.awaiting_levels_adventurer_prefix") We release five levels per week. if level.disabled
a.spr(href="/contribute/adventurer") p
strong(data-i18n="play.awaiting_levels_adventurer") Sign up as an Adventurer span.spr(data-i18n="play.awaiting_levels_adventurer_prefix") We release five levels per week.
span.spl(data-i18n="play.awaiting_levels_adventurer_suffix") to be the first to play new levels. a.spr(href="/contribute/adventurer")
strong(data-i18n="play.awaiting_levels_adventurer") Sign up as an Adventurer
- var playCount = levelPlayCountMap[level.id] span.spl(data-i18n="play.awaiting_levels_adventurer_suffix") to be the first to play new levels.
if playCount && playCount.sessions > 20
div - var playCount = levelPlayCountMap[level.id]
span.spr #{playCount.sessions} if playCount && playCount.sessions > 20
span(data-i18n="play.players") players div
span.spr , #{Math.round(playCount.playtime / 3600)} span.spr #{playCount.sessions}
span(data-i18n="play.hours_played") hours played span(data-i18n="play.players") players
.campaign-label(style="color: #{campaign.color}")= campaign.name span.spr , #{Math.round(playCount.playtime / 3600)}
if isIPadApp && !level.disabled && !level.locked span(data-i18n="play.hours_played") hours played
button.btn.btn-success.btn-lg.start-level(data-i18n="common.play") Play .campaign-label(style="color: #{campaign.color}")= campaign.name
if isIPadApp && !level.disabled && !level.locked
button.btn.btn-success.btn-lg.start-level(data-i18n="common.play") Play
if mapType === 'dungeon' && forestIsAvailable if mapType === 'dungeon' && forestIsAvailable
a#forest-link.glyphicon.glyphicon-share-alt.campaign-switch(href="/play/forest", data-i18n="[title]play.campaign_forest") a#forest-link.glyphicon.glyphicon-share-alt.campaign-switch(href="/play/forest", data-i18n="[title]play.campaign_forest")
if mapType === 'forest' if mapType === 'forest'

View file

@ -69,7 +69,9 @@ module.exports = class WorldMapView extends RootView
@hadEverChosenHero = me.get('heroConfig')?.thangType @hadEverChosenHero = me.get('heroConfig')?.thangType
@listenTo me, 'change:purchased', -> @renderSelectors('#gems-count') @listenTo me, 'change:purchased', -> @renderSelectors('#gems-count')
@listenTo me, 'change:spent', -> @renderSelectors('#gems-count') @listenTo me, 'change:spent', -> @renderSelectors('#gems-count')
window.tracker?.trackEvent 'Loaded World Map', category: 'World Map', ['Google Analytics'] # A/B Test hiding locked levels
# window.tracker?.trackEvent 'Loaded World Map', category: 'World Map', ['Google Analytics']
window.tracker?.trackEvent 'Loaded World Map', category: 'World Map', hideLockedLevelsGroup: me.getHideLockedLevelsGroup()
# If it's a new player who didn't appear to come from Hour of Code, we register her here without setting the hourOfCode property. # If it's a new player who didn't appear to come from Hour of Code, we register her here without setting the hourOfCode property.
elapsed = (new Date() - new Date(me.get('dateCreated'))) elapsed = (new Date() - new Date(me.get('dateCreated')))
@ -135,6 +137,8 @@ module.exports = class WorldMapView extends RootView
context.mapType = _.string.slugify @terrain context.mapType = _.string.slugify @terrain
context.nextLevel = @nextLevel context.nextLevel = @nextLevel
context.forestIsAvailable = @startedForestLevel or '541b67f71ccc8eaae19f3c62' in (me.get('earned')?.levels or []) context.forestIsAvailable = @startedForestLevel or '541b67f71ccc8eaae19f3c62' in (me.get('earned')?.levels or [])
# A/B Test hiding locked levels
context.hideLockedLevels = me.getHideLockedLevelsGroup() is 'hide'
context context
afterRender: -> afterRender: ->