mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-13 13:35:30 -04:00
Starting to show opponent code languages.
This commit is contained in:
parent
bd47b3bc83
commit
1a016394fe
14 changed files with 60 additions and 13 deletions
app
lib/surface
schemas/models
styles/play/ladder
templates/play/ladder
views/play
server
|
@ -106,7 +106,7 @@ module.exports = class SpriteBoss extends CocoClass
|
|||
|
||||
createOpponentWizard: (opponent) ->
|
||||
# TODO: colorize name and cloud by team, colorize wizard by user's color config, level-specific wizard spawn points
|
||||
sprite = @createWizardSprite thangID: opponent.id, name: opponent.name
|
||||
sprite = @createWizardSprite thangID: opponent.id, name: opponent.name, codeLanguage: opponent.codeLanguage
|
||||
if not opponent.levelSlug or opponent.levelSlug is 'brawlwood'
|
||||
sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28}
|
||||
else if opponent.levelSlug is 'dungeon-arena'
|
||||
|
|
|
@ -54,6 +54,11 @@ module.exports = class WizardSprite extends IndieSprite
|
|||
@updateRotation()
|
||||
# Don't call general update() because Thang isn't built yet
|
||||
|
||||
setNameLabel: (name) ->
|
||||
if @options.codeLanguage and @options.codeLanguage isnt 'javascript' and not @isSelf
|
||||
name += " (#{@options.codeLanguage})" # TODO: move on second line, capitalize properly
|
||||
super name
|
||||
|
||||
onPlayerStatesChanged: (e) ->
|
||||
for playerID, state of e.states
|
||||
continue unless playerID is @thang.id
|
||||
|
|
|
@ -239,6 +239,9 @@ _.extend LevelSessionSchema.properties,
|
|||
title: 'Opponent Rank'
|
||||
description: 'The opponent\'s ranking in a given match'
|
||||
type: 'number'
|
||||
codeLanguage:
|
||||
type: 'string'
|
||||
description: 'What submittedCodeLanguage the opponent used during the match'
|
||||
|
||||
c.extendBasicProperties LevelSessionSchema, 'level.session'
|
||||
c.extendPermissionsProperties LevelSessionSchema, 'level.session'
|
||||
|
|
|
@ -50,3 +50,9 @@
|
|||
|
||||
td
|
||||
padding: 1px 2px
|
||||
|
||||
.code-language-cell
|
||||
padding: 0 10px
|
||||
background: transparent url(/images/pages/home/language_logo_javascript.png) no-repeat center center
|
||||
background-size: contain
|
||||
height: 19px
|
||||
|
|
|
@ -37,3 +37,9 @@
|
|||
|
||||
td
|
||||
padding: 1px 2px
|
||||
|
||||
.code-language-cell
|
||||
padding: 0 10px
|
||||
background: transparent url(/images/pages/home/language_logo_javascript.png) no-repeat center center
|
||||
background-size: contain
|
||||
height: 19px
|
||||
|
|
|
@ -95,7 +95,17 @@
|
|||
span
|
||||
position: relative
|
||||
top: 1px
|
||||
|
||||
|
||||
.code-language
|
||||
position: absolute
|
||||
background: transparent url(/images/pages/home/language_logo_javascript.png) no-repeat center center
|
||||
background-size: contain
|
||||
width: 40px
|
||||
height: 40px
|
||||
right: -5px
|
||||
top: -15px
|
||||
display: block
|
||||
|
||||
.my-name
|
||||
border-right: 15px solid transparent
|
||||
left: 0
|
||||
|
@ -145,4 +155,4 @@
|
|||
top: 35px
|
||||
font-size: 40px
|
||||
font-weight: bolder
|
||||
color: black
|
||||
color: black
|
||||
|
|
|
@ -4,13 +4,13 @@ div#columns.row
|
|||
div(id="histogram-display-#{team.name}", class="histogram-display",data-team-name=team.name)
|
||||
table.table.table-bordered.table-condensed.table-hover
|
||||
tr
|
||||
th
|
||||
th(colspan=2)
|
||||
th(colspan=3, style="color: #{team.primaryColor}")
|
||||
span= team.name
|
||||
span
|
||||
span(data-i18n="ladder.leaderboard") Leaderboard
|
||||
tr
|
||||
th
|
||||
th(colspan=2)
|
||||
th(data-i18n="general.score") Score
|
||||
th(data-i18n="general.name").name-col-cell Name
|
||||
th
|
||||
|
@ -21,6 +21,7 @@ div#columns.row
|
|||
for session, rank in topSessions
|
||||
- var myRow = session.get('creator') == me.id
|
||||
tr(class=myRow ? "success" : "", data-player-id=session.get('creator'), data-session-id=session.id)
|
||||
td.code-language-cell(style="background-image: url(/images/pages/home/language_logo_" + session.get('submittedCodeLanguage') + ".png)")
|
||||
td.rank-cell= rank + 1
|
||||
td.score-cell= Math.round(session.get('totalScore') * 100)
|
||||
td.name-col-cell= session.get('creatorName') || "Anonymous"
|
||||
|
@ -34,6 +35,7 @@ div#columns.row
|
|||
for session in team.leaderboard.nearbySessions()
|
||||
- var myRow = session.get('creator') == me.id
|
||||
tr(class=myRow ? "success" : "", data-player-id=session.get('creator'), data-session-id=session.id)
|
||||
td.code-language-cell(style="background-image: url(/images/pages/home/language_logo_" + session.get('submittedCodeLanguage') + ".png)")
|
||||
td.rank-cell= session.rank
|
||||
td.score-cell= Math.round(session.get('totalScore') * 100)
|
||||
td.name-col-cell= session.get('creatorName') || "Anonymous"
|
||||
|
|
|
@ -4,7 +4,7 @@ div#columns.row
|
|||
table.table.table-bordered.table-condensed
|
||||
|
||||
tr
|
||||
th(colspan=4, style="color: #{team.primaryColor}")
|
||||
th(colspan=5, style="color: #{team.primaryColor}")
|
||||
span(data-i18n="ladder.summary_your") Your
|
||||
|#{team.name}
|
||||
|
|
||||
|
@ -16,16 +16,17 @@ div#columns.row
|
|||
|
||||
if team.session
|
||||
tr
|
||||
th(colspan=4)
|
||||
th(colspan=5)
|
||||
.ladder-submission-view(data-session-id=team.session.id)
|
||||
|
||||
if team.scoreHistory
|
||||
tr
|
||||
th(colspan=4, style="color: #{team.primaryColor}")
|
||||
th(colspan=5, style="color: #{team.primaryColor}")
|
||||
div(class="score-chart-wrapper", data-team-name=team.name, id="score-chart-#{team.name}")
|
||||
|
||||
tr
|
||||
th(data-i18n="general.result") Result
|
||||
th
|
||||
th(data-i18n="general.opponent") Opponent
|
||||
th(data-i18n="general.when") When
|
||||
th
|
||||
|
@ -38,6 +39,7 @@ div#columns.row
|
|||
span(data-i18n="general.loss").loss Loss
|
||||
if match.state === 'tie'
|
||||
span(data-i18n="general.tie").tie Tie
|
||||
td.code-language-cell(style="background-image: url(/images/pages/home/language_logo_" + match.codeLanguage + ".png)")
|
||||
td.name-cell= match.opponentName || "Anonymous"
|
||||
td.time-cell= match.when
|
||||
td.battle-cell
|
||||
|
|
|
@ -33,6 +33,7 @@ block modal-body-content
|
|||
span= myName
|
||||
div.opponent-name.name-label
|
||||
span(data-i18n="ladder.simple_ai") Simple AI
|
||||
//span.code-language(style="background-image: url(/images/pages/home/language_logo_javascript.png)")
|
||||
div.difficulty
|
||||
span(data-i18n="ladder.warmup") Warmup
|
||||
div(data-i18n="ladder.vs").vs VS
|
||||
|
@ -48,6 +49,8 @@ block modal-body-content
|
|||
span= myName
|
||||
div.opponent-name.name-label
|
||||
span= challengers.easy.opponentName
|
||||
if challengers.easy.codeLanguage
|
||||
span.code-language(style="background-image: url(/images/pages/home/language_logo_" + challengers.easy.codeLanguage + ".png)")
|
||||
div.difficulty
|
||||
span(data-i18n="general.easy") Easy
|
||||
div(data-i18n="ladder.vs").vs VS
|
||||
|
@ -63,6 +66,8 @@ block modal-body-content
|
|||
span= myName
|
||||
div.opponent-name.name-label
|
||||
span= challengers.medium.opponentName
|
||||
if challengers.medium.codeLanguage
|
||||
span.code-language(style="background-image: url(/images/pages/home/language_logo_" + challengers.medium.codeLanguage + ".png)")
|
||||
div.difficulty
|
||||
span(data-i18n="general.medium") Medium
|
||||
div(data-i18n="ladder.vs").vs VS
|
||||
|
@ -78,6 +83,8 @@ block modal-body-content
|
|||
span= myName
|
||||
div.opponent-name.name-label
|
||||
span= challengers.hard.opponentName
|
||||
if challengers.hard.codeLanguage
|
||||
span.code-language(style="background-image: url(/images/pages/home/language_logo_" + challengers.hard.codeLanguage + ".png)")
|
||||
div.difficulty
|
||||
span(data-i18n="general.hard") Hard
|
||||
div(data-i18n="ladder.vs").vs VS
|
||||
|
|
|
@ -73,6 +73,7 @@ module.exports = class MyMatchesTabView extends CocoView
|
|||
sessionID: opponent.sessionID
|
||||
stale: match.date < submitDate
|
||||
fresh: fresh
|
||||
codeLanguage: match.codeLanguage
|
||||
}
|
||||
|
||||
for team in @teams
|
||||
|
|
|
@ -24,14 +24,14 @@ module.exports = class LadderPlayModal extends View
|
|||
indentGuides: false
|
||||
behaviors: false
|
||||
liveCompletion: true
|
||||
|
||||
|
||||
constructor: (options, @level, @session, @team) ->
|
||||
super(options)
|
||||
@nameMap = {}
|
||||
@otherTeam = if team is 'ogres' then 'humans' else 'ogres'
|
||||
@startLoadingChallengersMaybe()
|
||||
@wizardType = ThangType.loadUniversalWizard()
|
||||
|
||||
|
||||
updateLanguage: ->
|
||||
aceConfig = _.cloneDeep me.get('aceConfig') ? {}
|
||||
aceConfig = _.defaults aceConfig, @defaultAceConfig
|
||||
|
@ -176,7 +176,8 @@ module.exports = class LadderPlayModal extends View
|
|||
return unless session
|
||||
return {
|
||||
sessionID: session.id
|
||||
opponentID: session.get('creator')
|
||||
opponentID: session.get 'creator'
|
||||
codeLanguage: session.get 'submittedCodeLanguage'
|
||||
}
|
||||
|
||||
challengeInfoFromMatches: (matches) ->
|
||||
|
@ -186,6 +187,7 @@ module.exports = class LadderPlayModal extends View
|
|||
return {
|
||||
sessionID: opponent.sessionID
|
||||
opponentID: opponent.userID
|
||||
codeLanguage: opponent.codeLanguage
|
||||
}
|
||||
|
||||
class ChallengersData
|
||||
|
|
|
@ -287,7 +287,7 @@ module.exports = class PlayLevelView extends View
|
|||
@surface.showLevel()
|
||||
if @otherSession
|
||||
# TODO: colorize name and cloud by team, colorize wizard by user's color config
|
||||
@surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team'), levelSlug: @level.get('slug')
|
||||
@surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team'), levelSlug: @level.get('slug'), codeLanguage: @otherSession.get('submittedCodeLanguage')
|
||||
@loadingView?.unveil()
|
||||
|
||||
onLoadingViewUnveiled: (e) ->
|
||||
|
|
|
@ -155,7 +155,7 @@ LevelHandler = class LevelHandler extends Handler
|
|||
|
||||
sortParameters =
|
||||
'totalScore': req.query.order
|
||||
selectProperties = ['totalScore', 'creatorName', 'creator']
|
||||
selectProperties = ['totalScore', 'creatorName', 'creator', 'submittedCodeLanguage']
|
||||
|
||||
query = Session
|
||||
.find(sessionsQueryParameters)
|
||||
|
|
|
@ -579,6 +579,7 @@ addMatchToSessions = (newScoreObject, callback) ->
|
|||
matchObject.opponents[sessionID].totalScore = session.totalScore
|
||||
matchObject.opponents[sessionID].metrics = {}
|
||||
matchObject.opponents[sessionID].metrics.rank = Number(newScoreObject[sessionID]?.gameRanking ? 0)
|
||||
matchObject.opponents[sessionID].codeLanguage = newScoreObject[sessionID].submittedCodeLanguage
|
||||
|
||||
#log.info "Match object computed, result: #{matchObject}"
|
||||
#log.info 'Writing match object to database...'
|
||||
|
@ -595,6 +596,7 @@ updateMatchesInSession = (matchObject, sessionID, callback) ->
|
|||
opponentsClone = _.omit opponentsClone, sessionID
|
||||
opponentsArray = _.toArray opponentsClone
|
||||
currentMatchObject.opponents = opponentsArray
|
||||
currentMatchObject.codeLanguage = matchObject.opponents[opponentsArray[0].sessionID].codeLanguage
|
||||
LevelSession.findOne {'_id': sessionID}, (err, session) ->
|
||||
session = session.toObject()
|
||||
currentMatchObject.playtime = session.playtime ? 0
|
||||
|
@ -770,6 +772,7 @@ retrieveOldSessionData = (sessionID, callback) ->
|
|||
'meanStrength': session.meanStrength ? 25
|
||||
'totalScore': session.totalScore ? (25 - 1.8*(25/3))
|
||||
'id': sessionID
|
||||
'submittedCodeLanguage': session.submittedCodeLanguage
|
||||
callback err, oldScoreObject
|
||||
|
||||
markSessionAsDoneRanking = (sessionID, cb) ->
|
||||
|
|
Loading…
Add table
Reference in a new issue