mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-02-26 22:44:49 -05:00
Merge branch 'master' into production
This commit is contained in:
commit
ae7e84e11b
14 changed files with 94 additions and 44 deletions
Binary file not shown.
Before Width: | Height: | Size: 168 KiB |
Binary file not shown.
Before Width: | Height: | Size: 156 KiB |
Binary file not shown.
Before Width: | Height: | Size: 856 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 MiB |
|
@ -1,31 +1,31 @@
|
||||||
SpriteBuilder = require 'lib/sprites/SpriteBuilder'
|
SpriteBuilder = require 'lib/sprites/SpriteBuilder'
|
||||||
|
|
||||||
floors = ['Dungeon Floor', 'Indoor Floor', 'Grass', 'Grass01', 'Grass02', 'Grass03', 'Grass04', 'Grass05', 'Goal Trigger', 'Obstacle']
|
floors = ['Dungeon Floor', 'Indoor Floor', 'Grass', 'Grass01', 'Grass02', 'Grass03', 'Grass04', 'Grass05', 'Goal Trigger', 'Obstacle', 'Sand 01', 'Sand 02', 'Sand 03', 'Sand 04', 'Sand 05', 'Sand 06']
|
||||||
|
|
||||||
module.exports = class SingularSprite extends createjs.Sprite
|
module.exports = class SingularSprite extends createjs.Sprite
|
||||||
childMovieClips: null
|
childMovieClips: null
|
||||||
|
|
||||||
constructor: (@spriteSheet, @thangType, @spriteSheetPrefix, @resolutionFactor=SPRITE_RESOLUTION_FACTOR) ->
|
constructor: (@spriteSheet, @thangType, @spriteSheetPrefix, @resolutionFactor=SPRITE_RESOLUTION_FACTOR) ->
|
||||||
super(@spriteSheet)
|
super(@spriteSheet)
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
@removeAllEventListeners()
|
@removeAllEventListeners()
|
||||||
|
|
||||||
gotoAndPlay: (actionName) -> @goto(actionName, false)
|
gotoAndPlay: (actionName) -> @goto(actionName, false)
|
||||||
gotoAndStop: (actionName) -> @goto(actionName, true)
|
gotoAndStop: (actionName) -> @goto(actionName, true)
|
||||||
_gotoAndPlay: createjs.Sprite.prototype.gotoAndPlay
|
_gotoAndPlay: createjs.Sprite.prototype.gotoAndPlay
|
||||||
_gotoAndStop: createjs.Sprite.prototype.gotoAndStop
|
_gotoAndStop: createjs.Sprite.prototype.gotoAndStop
|
||||||
|
|
||||||
goto: (actionName, @paused=true) ->
|
goto: (actionName, @paused=true) ->
|
||||||
@actionNotSupported = false
|
@actionNotSupported = false
|
||||||
|
|
||||||
action = @thangType.getActions()[actionName]
|
action = @thangType.getActions()[actionName]
|
||||||
randomStart = actionName.startsWith('move')
|
randomStart = actionName.startsWith('move')
|
||||||
reg = action.positions?.registration or @thangType.get('positions')?.registration or {x:0, y:0}
|
reg = action.positions?.registration or @thangType.get('positions')?.registration or {x:0, y:0}
|
||||||
|
|
||||||
if action.animation
|
if action.animation
|
||||||
@framerate = (action.framerate ? 20) * (action.speed ? 1)
|
@framerate = (action.framerate ? 20) * (action.speed ? 1)
|
||||||
|
|
||||||
func = if @paused then '_gotoAndStop' else '_gotoAndPlay'
|
func = if @paused then '_gotoAndStop' else '_gotoAndPlay'
|
||||||
animationName = @spriteSheetPrefix + actionName
|
animationName = @spriteSheetPrefix + actionName
|
||||||
@[func](animationName)
|
@[func](animationName)
|
||||||
|
@ -73,6 +73,6 @@ module.exports = class SingularSprite extends createjs.Sprite
|
||||||
@baseScaleY = @scaleY
|
@baseScaleY = @scaleY
|
||||||
@currentAnimation = actionName
|
@currentAnimation = actionName
|
||||||
return
|
return
|
||||||
|
|
||||||
notifyActionNeedsRender: (action) ->
|
notifyActionNeedsRender: (action) ->
|
||||||
@lank?.trigger('action-needs-render', @lank, action)
|
@lank?.trigger('action-needs-render', @lank, action)
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
change_hero: "Change Hero" # Go back from choose inventory to choose hero
|
change_hero: "Change Hero" # Go back from choose inventory to choose hero
|
||||||
choose_inventory: "Equip Items"
|
choose_inventory: "Equip Items"
|
||||||
buy_gems: "Buy Gems"
|
buy_gems: "Buy Gems"
|
||||||
|
campaign_desert: "Desert Campaign"
|
||||||
campaign_forest: "Forest Campaign"
|
campaign_forest: "Forest Campaign"
|
||||||
campaign_dungeon: "Dungeon Campaign"
|
campaign_dungeon: "Dungeon Campaign"
|
||||||
subscription_required: "Subscription Required"
|
subscription_required: "Subscription Required"
|
||||||
|
|
|
@ -9,6 +9,7 @@ module.exports = class Level extends CocoModel
|
||||||
@levels:
|
@levels:
|
||||||
'dungeons-of-kithgard': '5411cb3769152f1707be029c'
|
'dungeons-of-kithgard': '5411cb3769152f1707be029c'
|
||||||
'defense-of-plainswood': '541b67f71ccc8eaae19f3c62'
|
'defense-of-plainswood': '541b67f71ccc8eaae19f3c62'
|
||||||
|
'the-mighty-sand-yak': '5480b9d01bf0b10000711c5f'
|
||||||
urlRoot: '/db/level'
|
urlRoot: '/db/level'
|
||||||
|
|
||||||
serialize: (supermodel, session, otherSession, cached=false) ->
|
serialize: (supermodel, session, otherSession, cached=false) ->
|
||||||
|
|
|
@ -143,7 +143,7 @@ me.getLanguageCodeArray = ->
|
||||||
return Language.languageCodes
|
return Language.languageCodes
|
||||||
|
|
||||||
me.getLanguagesObject = -> return Language
|
me.getLanguagesObject = -> return Language
|
||||||
|
|
||||||
me.extendTranslationCoverageProperties = (schema) ->
|
me.extendTranslationCoverageProperties = (schema) ->
|
||||||
schema.properties = {} unless schema.properties?
|
schema.properties = {} unless schema.properties?
|
||||||
schema.properties.i18nCoverage = { title: 'i18n Coverage', type: 'array', items: { type: 'string' }}
|
schema.properties.i18nCoverage = { title: 'i18n Coverage', type: 'array', items: { type: 'string' }}
|
||||||
|
@ -207,7 +207,7 @@ me.activity = me.object {description: 'Stats on an activity'},
|
||||||
last: me.date()
|
last: me.date()
|
||||||
count: {type: 'integer', minimum: 0}
|
count: {type: 'integer', minimum: 0}
|
||||||
|
|
||||||
me.terrainString = me.shortString {enum: ['Grass', 'Dungeon', 'Indoor'], title: 'Terrain', description: 'Which terrain type this is.'}
|
me.terrainString = me.shortString {enum: ['Grass', 'Dungeon', 'Indoor', 'Desert'], title: 'Terrain', description: 'Which terrain type this is.'}
|
||||||
|
|
||||||
me.HeroConfigSchema = me.object {description: 'Which hero the player is using, equipped with what inventory.'},
|
me.HeroConfigSchema = me.object {description: 'Which hero the player is using, equipped with what inventory.'},
|
||||||
inventory:
|
inventory:
|
||||||
|
|
|
@ -118,11 +118,15 @@
|
||||||
position: absolute
|
position: absolute
|
||||||
|
|
||||||
.left-wing
|
.left-wing
|
||||||
@include wing-background('/images/level/loading_left_wing.png', right)
|
@include wing-background('/images/level/loading_left_wing_1920.jpg', right)
|
||||||
|
@media screen and ( max-width: 1366px )
|
||||||
|
@include wing-background('/images/level/loading_left_wing_1366.jpg', right)
|
||||||
left: -50%
|
left: -50%
|
||||||
@include transition(all $UNVEIL_TIME ease)
|
@include transition(all $UNVEIL_TIME ease)
|
||||||
|
|
||||||
.right-wing
|
.right-wing
|
||||||
@include wing-background('/images/level/loading_right_wing.png', left)
|
@include wing-background('/images/level/loading_right_wing_1920.jpg', left)
|
||||||
|
@media screen and ( max-width: 1366px )
|
||||||
|
@include wing-background('/images/level/loading_right_wing_1366.jpg', left)
|
||||||
right: -50%
|
right: -50%
|
||||||
@include transition(all $UNVEIL_TIME ease)
|
@include transition(all $UNVEIL_TIME ease)
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
$mapHeight: 1536
|
$mapHeight: 1536
|
||||||
$forestMapWidth: 2500
|
$forestMapWidth: 2500
|
||||||
$dungeonMapWidth: 2350
|
$dungeonMapWidth: 2350
|
||||||
|
$desertMapWidth: 2350
|
||||||
|
$desertMapSeaBackground: rgba(113, 186, 208, 1)
|
||||||
|
$desertMapSeaBackgroundTransparent: rgba(113, 186, 208, 0)
|
||||||
$forestMapSeaBackground: rgba(113, 186, 208, 1)
|
$forestMapSeaBackground: rgba(113, 186, 208, 1)
|
||||||
$forestMapSeaBackgroundTransparent: rgba(113, 186, 208, 0)
|
$forestMapSeaBackgroundTransparent: rgba(113, 186, 208, 0)
|
||||||
$dungeonMapCaveBackground: rgba(68, 54, 45, 1)
|
$dungeonMapCaveBackground: rgba(68, 54, 45, 1)
|
||||||
|
@ -60,6 +63,21 @@ $gameControlMargin: 30px
|
||||||
&.left-gradient
|
&.left-gradient
|
||||||
left: 0
|
left: 0
|
||||||
|
|
||||||
|
&.desert
|
||||||
|
background-color: $desertMapSeaBackground
|
||||||
|
|
||||||
|
.top-gradient
|
||||||
|
background: linear-gradient(to bottom, $desertMapSeaBackground 0%, $desertMapSeaBackgroundTransparent 100%)
|
||||||
|
|
||||||
|
.right-gradient
|
||||||
|
background: linear-gradient(to left, $desertMapSeaBackground 0%, $desertMapSeaBackgroundTransparent 100%)
|
||||||
|
|
||||||
|
.bottom-gradient
|
||||||
|
background: linear-gradient(to top, $desertMapSeaBackground 0%, $desertMapSeaBackgroundTransparent 100%)
|
||||||
|
|
||||||
|
.left-gradient
|
||||||
|
background: linear-gradient(to right, $desertMapSeaBackground 0%, $desertMapSeaBackgroundTransparent 100%)
|
||||||
|
|
||||||
&.forest
|
&.forest
|
||||||
background-color: $forestMapSeaBackground
|
background-color: $forestMapSeaBackground
|
||||||
|
|
||||||
|
@ -96,7 +114,23 @@ $gameControlMargin: 30px
|
||||||
.map-background
|
.map-background
|
||||||
width: 100%
|
width: 100%
|
||||||
height: 100%
|
height: 100%
|
||||||
|
background-size: 100%
|
||||||
@include user-select(none)
|
@include user-select(none)
|
||||||
|
|
||||||
|
&.map-dungeon
|
||||||
|
background-image: url('/images/pages/play/map_dungeon_1920.jpg')
|
||||||
|
@media screen and ( max-width: 1366px )
|
||||||
|
background-image: url('/images/pages/play/map_dungeon_1366.jpg')
|
||||||
|
|
||||||
|
&.map-forest
|
||||||
|
background-image: url('/images/pages/play/map_forest_1920.jpg')
|
||||||
|
@media screen and ( max-width: 1366px )
|
||||||
|
background-image: url('/images/pages/play/map_forest_1366.jpg')
|
||||||
|
|
||||||
|
&.map-desert
|
||||||
|
background-image: url('/images/pages/play/map_desert_1920.jpg')
|
||||||
|
@media screen and ( max-width: 1366px )
|
||||||
|
background-image: url('/images/pages/play/map_desert_1366.jpg')
|
||||||
|
|
||||||
.level, .level-shadow
|
.level, .level-shadow
|
||||||
position: absolute
|
position: absolute
|
||||||
|
@ -259,6 +293,16 @@ $gameControlMargin: 30px
|
||||||
&:hover
|
&:hover
|
||||||
text-decoration: none
|
text-decoration: none
|
||||||
|
|
||||||
|
&#desert-link
|
||||||
|
left: 90%
|
||||||
|
top: 18.5%
|
||||||
|
transform: scaleY(-1.5) scaleX(1.5)
|
||||||
|
|
||||||
|
&#forest-back-link
|
||||||
|
left: 4%
|
||||||
|
top: 74.5%
|
||||||
|
transform: rotate(216deg)
|
||||||
|
|
||||||
&#forest-link
|
&#forest-link
|
||||||
left: 94.5%
|
left: 94.5%
|
||||||
top: 7%
|
top: 7%
|
||||||
|
|
|
@ -2,7 +2,7 @@ extends /templates/core/modal-base
|
||||||
block modal-header-content
|
block modal-header-content
|
||||||
#victory-header.out
|
#victory-header.out
|
||||||
#victory-title
|
#victory-title
|
||||||
if me.get('preferredLanguage') && me.get('preferredLanguage').split('-')[0] == 'en'
|
if !me.get('preferredLanguage') || me.get('preferredLanguage').split('-')[0] == 'en'
|
||||||
img(src="/images/pages/play/level/modal/victory_word.png", draggable="false")
|
img(src="/images/pages/play/level/modal/victory_word.png", draggable="false")
|
||||||
else
|
else
|
||||||
h1(data-i18n="play_level.victory") Victory
|
h1(data-i18n="play_level.victory") Victory
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
.gradient.vertical-gradient.right-gradient
|
.gradient.vertical-gradient.right-gradient
|
||||||
.gradient.horizontal-gradient.bottom-gradient
|
.gradient.horizontal-gradient.bottom-gradient
|
||||||
.gradient.vertical-gradient.left-gradient
|
.gradient.vertical-gradient.left-gradient
|
||||||
img.map-background(src="/images/pages/play/map_" + mapType + ".jpg", alt="", draggable="false")
|
.map-background(class="map-"+mapType alt="", draggable="false")
|
||||||
|
|
||||||
- var seenNext = nextLevel;
|
- var seenNext = nextLevel;
|
||||||
each level in campaign.levels
|
each level in campaign.levels
|
||||||
|
@ -44,6 +44,11 @@
|
||||||
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'
|
||||||
a#dungeon-link.glyphicon.glyphicon-share-alt.campaign-switch(href="/play/dungeon", data-i18n="[title]play.campaign_dungeon")
|
a#dungeon-link.glyphicon.glyphicon-share-alt.campaign-switch(href="/play/dungeon", data-i18n="[title]play.campaign_dungeon")
|
||||||
|
if desertIsAvailable
|
||||||
|
a#desert-link.glyphicon.glyphicon-share-alt.campaign-switch(href="/play/desert", data-i18n="[title]play.campaign_desert")
|
||||||
|
if mapType === 'desert'
|
||||||
|
a#forest-back-link.glyphicon.glyphicon-share-alt.campaign-switch(href="/play/forest", data-i18n="[title]play.campaign_forest")
|
||||||
|
|
||||||
|
|
||||||
.game-controls.header-font
|
.game-controls.header-font
|
||||||
button.btn.items(data-toggle='coco-modal', data-target='play/modal/PlayItemsModal', data-i18n="[title]play.items")
|
button.btn.items(data-toggle='coco-modal', data-target='play/modal/PlayItemsModal', data-i18n="[title]play.items")
|
||||||
|
|
|
@ -434,7 +434,7 @@ module.exports = class ThangTypeEditView extends RootView
|
||||||
@lastKind = kind
|
@lastKind = kind
|
||||||
Backbone.Mediator.publish 'editor:thang-type-kind-changed', kind: kind
|
Backbone.Mediator.publish 'editor:thang-type-kind-changed', kind: kind
|
||||||
if kind in ['Doodad', 'Floor', 'Wall'] and not @treema.data.terrains
|
if kind in ['Doodad', 'Floor', 'Wall'] and not @treema.data.terrains
|
||||||
@treema.set '/terrains', ['Grass', 'Dungeon', 'Indoor'] # So editors know to set them.
|
@treema.set '/terrains', ['Grass', 'Dungeon', 'Indoor', 'Desert'] # So editors know to set them.
|
||||||
|
|
||||||
onSelectNode: (e, selected) =>
|
onSelectNode: (e, selected) =>
|
||||||
selected = selected[0]
|
selected = selected[0]
|
||||||
|
|
|
@ -41,7 +41,7 @@ module.exports = class WorldMapView extends RootView
|
||||||
constructor: (options, @terrain) ->
|
constructor: (options, @terrain) ->
|
||||||
if options and application.isIPAdApp # TODO: later only clear the SuperModel if it has received a memory warning (not in app store yet)
|
if options and application.isIPAdApp # TODO: later only clear the SuperModel if it has received a memory warning (not in app store yet)
|
||||||
options.supermodel = null
|
options.supermodel = null
|
||||||
@terrain ?= 'dungeon' # or 'forest'
|
@terrain ?= 'dungeon' # or 'forest', 'desert'
|
||||||
super options
|
super options
|
||||||
@nextLevel = @getQueryVariable 'next'
|
@nextLevel = @getQueryVariable 'next'
|
||||||
@levelStatusMap = {}
|
@levelStatusMap = {}
|
||||||
|
@ -154,6 +154,7 @@ 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 (Level.levels['defense-of-plainswood'] in (me.get('earned')?.levels or []))
|
context.forestIsAvailable = @startedForestLevel or (Level.levels['defense-of-plainswood'] in (me.get('earned')?.levels or []))
|
||||||
|
context.desertIsAvailable = @startedDesertLevel or (Level.levels['the-mighty-sand-yak'] in (me.get('earned')?.levels or []))
|
||||||
context.requiresSubscription = @requiresSubscription
|
context.requiresSubscription = @requiresSubscription
|
||||||
context
|
context
|
||||||
|
|
||||||
|
@ -191,9 +192,11 @@ module.exports = class WorldMapView extends RootView
|
||||||
|
|
||||||
onSessionsLoaded: (e) ->
|
onSessionsLoaded: (e) ->
|
||||||
forestLevels = (f.id for f in forest)
|
forestLevels = (f.id for f in forest)
|
||||||
|
desertLevels = (f.id for f in desert)
|
||||||
for session in @sessions.models
|
for session in @sessions.models
|
||||||
@levelStatusMap[session.get('levelID')] = if session.get('state')?.complete then 'complete' else 'started'
|
@levelStatusMap[session.get('levelID')] = if session.get('state')?.complete then 'complete' else 'started'
|
||||||
@startedForestLevel = true if session.get('levelID') in forestLevels
|
@startedForestLevel = true if session.get('levelID') in forestLevels
|
||||||
|
@startedDesertLevel = true if session.get('levelID') in desertLevels
|
||||||
if @nextLevel and @levelStatusMap[@nextLevel] is 'complete'
|
if @nextLevel and @levelStatusMap[@nextLevel] is 'complete'
|
||||||
@nextLevel = null
|
@nextLevel = null
|
||||||
@render()
|
@render()
|
||||||
|
@ -282,7 +285,7 @@ module.exports = class WorldMapView extends RootView
|
||||||
|
|
||||||
onWindowResize: (e) =>
|
onWindowResize: (e) =>
|
||||||
mapHeight = iPadHeight = 1536
|
mapHeight = iPadHeight = 1536
|
||||||
mapWidth = if @terrain is 'dungeon' then 2350 else 2500
|
mapWidth = {dungeon: 2350, forest: 2500, desert: 2350}[@terrain] or 2350
|
||||||
aspectRatio = mapWidth / mapHeight
|
aspectRatio = mapWidth / mapHeight
|
||||||
pageWidth = $(window).width()
|
pageWidth = $(window).width()
|
||||||
pageHeight = $(window).height()
|
pageHeight = $(window).height()
|
||||||
|
@ -303,7 +306,7 @@ module.exports = class WorldMapView extends RootView
|
||||||
|
|
||||||
playAmbientSound: ->
|
playAmbientSound: ->
|
||||||
return if @ambientSound
|
return if @ambientSound
|
||||||
return unless file = {dungeon: 'ambient-dungeon', forest: 'ambient-map-grass'}[@terrain]
|
return unless file = {dungeon: 'ambient-dungeon', forest: 'ambient-map-grass', desert: 'ambient-desert'}[@terrain]
|
||||||
src = "/file/interface/#{file}#{AudioPlayer.ext}"
|
src = "/file/interface/#{file}#{AudioPlayer.ext}"
|
||||||
unless AudioPlayer.getStatus(src)?.loaded
|
unless AudioPlayer.getStatus(src)?.loaded
|
||||||
AudioPlayer.preloadSound src
|
AudioPlayer.preloadSound src
|
||||||
|
@ -647,7 +650,6 @@ forest = [
|
||||||
continue: 'patrol-buster'
|
continue: 'patrol-buster'
|
||||||
x: 24
|
x: 24
|
||||||
y: 35
|
y: 35
|
||||||
adventurer: true
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'Patrol Buster'
|
name: 'Patrol Buster'
|
||||||
|
@ -659,6 +661,7 @@ forest = [
|
||||||
continue: 'thornbush-farm'
|
continue: 'thornbush-farm'
|
||||||
x: 34
|
x: 34
|
||||||
y: 25
|
y: 25
|
||||||
|
adventurer: true
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'Endangered Burl'
|
name: 'Endangered Burl'
|
||||||
|
@ -813,7 +816,6 @@ forest = [
|
||||||
continue: 'touch-of-death'
|
continue: 'touch-of-death'
|
||||||
x: 47
|
x: 47
|
||||||
y: 71
|
y: 71
|
||||||
adventurer: true
|
|
||||||
requiresSubscription: true
|
requiresSubscription: true
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -826,7 +828,6 @@ forest = [
|
||||||
continue: 'bonemender'
|
continue: 'bonemender'
|
||||||
x: 52
|
x: 52
|
||||||
y: 70
|
y: 70
|
||||||
adventurer: true
|
|
||||||
requiresSubscription: true
|
requiresSubscription: true
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -839,7 +840,6 @@ forest = [
|
||||||
continue: 'coinucopia'
|
continue: 'coinucopia'
|
||||||
x: 58
|
x: 58
|
||||||
y: 67
|
y: 67
|
||||||
adventurer: true
|
|
||||||
requiresSubscription: true
|
requiresSubscription: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -872,7 +872,7 @@ forest = [
|
||||||
original: '54626472f3c64b7b0598590c'
|
original: '54626472f3c64b7b0598590c'
|
||||||
description: 'This level exercises: flag position, object members.'
|
description: 'This level exercises: flag position, object members.'
|
||||||
nextLevels:
|
nextLevels:
|
||||||
continue: 'deadly-pursuit'
|
continue: 'rich-forager'
|
||||||
x: 65.5
|
x: 65.5
|
||||||
y: 91
|
y: 91
|
||||||
}
|
}
|
||||||
|
@ -895,11 +895,9 @@ forest = [
|
||||||
original: '546283ddfdd66af405fa8209'
|
original: '546283ddfdd66af405fa8209'
|
||||||
description: 'This level exercises: if/else if, collection, combat.'
|
description: 'This level exercises: if/else if, collection, combat.'
|
||||||
nextLevels:
|
nextLevels:
|
||||||
continue: 'multiplayer-treasure-grove'
|
continue: 'siege-of-stonehold'
|
||||||
x: 80
|
x: 80
|
||||||
y: 88
|
y: 88
|
||||||
adventurer: true
|
|
||||||
requiresSubscription: true
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'Siege of Stonehold'
|
name: 'Siege of Stonehold'
|
||||||
|
@ -923,7 +921,6 @@ forest = [
|
||||||
description: 'Mix collection, flags, and combat in this multiplayer coin-gathering arena.'
|
description: 'Mix collection, flags, and combat in this multiplayer coin-gathering arena.'
|
||||||
x: 56.5
|
x: 56.5
|
||||||
y: 20
|
y: 20
|
||||||
adventurer: true
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'Dueling Grounds'
|
name: 'Dueling Grounds'
|
||||||
|
@ -935,7 +932,9 @@ forest = [
|
||||||
y: 23
|
y: 23
|
||||||
adventurer: true
|
adventurer: true
|
||||||
}
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
desert = [
|
||||||
{
|
{
|
||||||
name: 'The Dunes'
|
name: 'The Dunes'
|
||||||
type: 'hero'
|
type: 'hero'
|
||||||
|
@ -945,8 +944,8 @@ forest = [
|
||||||
nextLevels:
|
nextLevels:
|
||||||
continue: 'the-mighty-sand-yak'
|
continue: 'the-mighty-sand-yak'
|
||||||
disabled: not me.isAdmin()
|
disabled: not me.isAdmin()
|
||||||
x: 88.66
|
x: 8.47
|
||||||
y: 62.61
|
y: 21.93
|
||||||
adventurer: true
|
adventurer: true
|
||||||
requiresSubscription: true
|
requiresSubscription: true
|
||||||
}
|
}
|
||||||
|
@ -955,38 +954,34 @@ forest = [
|
||||||
type: 'hero'
|
type: 'hero'
|
||||||
id: 'the-mighty-sand-yak'
|
id: 'the-mighty-sand-yak'
|
||||||
original: '5480b9d01bf0b10000711c5f'
|
original: '5480b9d01bf0b10000711c5f'
|
||||||
description: 'In addition to sand, there are also yaks. Sandy yaks. Yak attack, back to back, man that\'s whack.'
|
description: 'Test your nerves by dodging huge sand yaks on the open dunes!'
|
||||||
nextLevels:
|
nextLevels:
|
||||||
continue: 'oasis'
|
continue: 'oasis'
|
||||||
disabled: not me.isAdmin()
|
disabled: not me.isAdmin()
|
||||||
x: 81.00
|
x: 16.56
|
||||||
y: 55.37
|
y: 27.77
|
||||||
adventurer: true
|
adventurer: true
|
||||||
requiresSubscription: true
|
requiresSubscription: false
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'Oasis'
|
name: 'Oasis'
|
||||||
type: 'hero'
|
type: 'hero'
|
||||||
id: 'oasis'
|
id: 'oasis'
|
||||||
original: '5480ba761bf0b10000711c64'
|
original: '5480ba761bf0b10000711c64'
|
||||||
description: 'There is a bit of water in the desert, too. Probably.'
|
description: 'Run a gauntlet of sand yaks to reach oasis and quench your thirst!'
|
||||||
#nextLevels:
|
#nextLevels:
|
||||||
# continue: ''
|
# continue: ''
|
||||||
disabled: not me.isAdmin()
|
disabled: not me.isAdmin()
|
||||||
x: 92.56
|
x: 23.35
|
||||||
y: 40.88
|
y: 31.60
|
||||||
adventurer: true
|
adventurer: true
|
||||||
requiresSubscription: true
|
requiresSubscription: false
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
WorldMapView.campaigns = campaigns = [
|
WorldMapView.campaigns = campaigns = [
|
||||||
#{id: 'beginner', name: 'Beginner Campaign', description: '... in which you learn the wizardry of programming.', levels: tutorials, color: "rgb(255, 80, 60)"}
|
|
||||||
#{id: 'multiplayer', name: 'Multiplayer Arenas', description: '... in which you code head-to-head against other players.', levels: arenas, color: "rgb(80, 5, 60)"}
|
|
||||||
#{id: 'dev', name: 'Random Harder Levels', description: '... in which you learn the interface while doing something a little harder.', levels: experienced, color: "rgb(80, 60, 255)"}
|
|
||||||
#{id: 'classic_algorithms' ,name: 'Classic Algorithms', description: '... in which you learn the most popular algorithms in Computer Science.', levels: classicAlgorithms, color: "rgb(110, 80, 120)"}
|
|
||||||
#{id: 'player_created', name: 'Player-Created', description: '... in which you battle against the creativity of your fellow <a href=\"/contribute#artisan\">Artisan Wizards</a>.', levels: playerCreated, color: "rgb(160, 160, 180)"}
|
|
||||||
{id: 'dungeon', name: 'Dungeon Campaign', levels: dungeon }
|
{id: 'dungeon', name: 'Dungeon Campaign', levels: dungeon }
|
||||||
{id: 'forest', name: 'Forest Campaign', levels: forest }
|
{id: 'forest', name: 'Forest Campaign', levels: forest }
|
||||||
|
{id: 'desert', name: 'Desert Campaign', levels: desert }
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in a new issue