mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-01 08:23:57 -04:00
Tagged Levels and ThangTypes by terrains. Terrains now control default pathfinding in AI System.
This commit is contained in:
parent
1edf3de651
commit
ba53cb06fe
8 changed files with 49 additions and 6 deletions
app
schemas
views/editor
level
thang
|
@ -245,6 +245,7 @@ _.extend LevelSchema.properties,
|
||||||
banner: {type: 'string', format: 'image-file', title: 'Banner'}
|
banner: {type: 'string', format: 'image-file', title: 'Banner'}
|
||||||
goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
|
goals: c.array {title: 'Goals', description: 'An array of goals which are visible to the player and can trigger scripts.'}, GoalSchema
|
||||||
type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero'])
|
type: c.shortString(title: 'Type', description: 'What kind of level this is.', 'enum': ['campaign', 'ladder', 'ladder-tutorial', 'hero'])
|
||||||
|
terrain: c.terrainString
|
||||||
showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
|
showsGuide: c.shortString(title: 'Shows Guide', description: 'If the guide is shown at the beginning of the level.', 'enum': ['first-time', 'always'])
|
||||||
|
|
||||||
c.extendBasicProperties LevelSchema, 'level'
|
c.extendBasicProperties LevelSchema, 'level'
|
||||||
|
|
|
@ -106,6 +106,7 @@ _.extend ThangTypeSchema.properties,
|
||||||
containers: c.object {title: 'Containers', additionalProperties: ContainerObjectSchema}
|
containers: c.object {title: 'Containers', additionalProperties: ContainerObjectSchema}
|
||||||
animations: c.object {title: 'Animations', additionalProperties: RawAnimationObjectSchema}
|
animations: c.object {title: 'Animations', additionalProperties: RawAnimationObjectSchema}
|
||||||
kind: c.shortString {enum: ['Unit', 'Floor', 'Wall', 'Doodad', 'Misc', 'Mark', 'Item'], default: 'Misc', title: 'Kind'}
|
kind: c.shortString {enum: ['Unit', 'Floor', 'Wall', 'Doodad', 'Misc', 'Mark', 'Item'], default: 'Misc', title: 'Kind'}
|
||||||
|
terrains: c.array {title: 'Terrains', description: 'If specified, limits this ThangType to levels with matching terrains.', uniqueItems: true}, c.terrainString
|
||||||
|
|
||||||
actions: c.object {title: 'Actions', additionalProperties: {$ref: '#/definitions/action'}}
|
actions: c.object {title: 'Actions', additionalProperties: {$ref: '#/definitions/action'}}
|
||||||
soundTriggers: c.object {title: 'Sound Triggers', additionalProperties: c.array({}, {$ref: '#/definitions/sound'})},
|
soundTriggers: c.object {title: 'Sound Triggers', additionalProperties: c.array({}, {$ref: '#/definitions/sound'})},
|
||||||
|
|
|
@ -200,3 +200,5 @@ me.activity = me.object {description: 'Stats on an activity'},
|
||||||
first: me.date()
|
first: me.date()
|
||||||
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.'}
|
||||||
|
|
|
@ -43,8 +43,16 @@ module.exports =
|
||||||
'level:reload-thang-type': c.object {required: ['thangType']},
|
'level:reload-thang-type': c.object {required: ['thangType']},
|
||||||
thangType: {type: 'object'}
|
thangType: {type: 'object'}
|
||||||
|
|
||||||
'editor:random-terrain-generated': c.object {required: ['thangs']},
|
'editor:random-terrain-generated': c.object {required: ['thangs', 'terrain']},
|
||||||
thangs: c.array {}, {type: 'object'}
|
thangs: c.array {}, {type: 'object'}
|
||||||
|
terrain: c.terrainString
|
||||||
|
|
||||||
|
'editor:terrain-changed': c.object {required: ['terrain']},
|
||||||
|
terrain:
|
||||||
|
oneOf: [
|
||||||
|
c.terrainString
|
||||||
|
{type: ['null', 'undefined']}
|
||||||
|
]
|
||||||
|
|
||||||
'editor:thang-type-kind-changed': c.object {required: ['kind']},
|
'editor:thang-type-kind-changed': c.object {required: ['kind']},
|
||||||
kind: {type: 'string'}
|
kind: {type: 'string'}
|
||||||
|
|
|
@ -87,6 +87,7 @@ clusters = {
|
||||||
|
|
||||||
presets = {
|
presets = {
|
||||||
'dungeon': {
|
'dungeon': {
|
||||||
|
'terrainName': 'Dungeon'
|
||||||
'type':'dungeon'
|
'type':'dungeon'
|
||||||
'borders':'dungeon_wall'
|
'borders':'dungeon_wall'
|
||||||
'borderNoise':0
|
'borderNoise':0
|
||||||
|
@ -128,6 +129,7 @@ presets = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
'indoor': {
|
'indoor': {
|
||||||
|
'terrainName': 'Indoor'
|
||||||
'type':'indoor'
|
'type':'indoor'
|
||||||
'borders':'indoor_wall'
|
'borders':'indoor_wall'
|
||||||
'borderNoise':0
|
'borderNoise':0
|
||||||
|
@ -161,6 +163,7 @@ presets = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
'grassy': {
|
'grassy': {
|
||||||
|
'terrainName': 'Grass'
|
||||||
'type':'grassy'
|
'type':'grassy'
|
||||||
'borders':'trees'
|
'borders':'trees'
|
||||||
'borderNoise':1
|
'borderNoise':1
|
||||||
|
@ -223,8 +226,8 @@ thangSizes = {
|
||||||
'borderSize': {
|
'borderSize': {
|
||||||
'x':4
|
'x':4
|
||||||
'y':4
|
'y':4
|
||||||
}
|
}}
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = class TerrainRandomizeModal extends ModalView
|
module.exports = class TerrainRandomizeModal extends ModalView
|
||||||
id: 'terrain-randomize-modal'
|
id: 'terrain-randomize-modal'
|
||||||
|
@ -243,7 +246,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
|
||||||
presetType = target.attr 'data-preset-type'
|
presetType = target.attr 'data-preset-type'
|
||||||
presetSize = target.attr 'data-preset-size'
|
presetSize = target.attr 'data-preset-size'
|
||||||
@randomizeThangs presetType, presetSize
|
@randomizeThangs presetType, presetSize
|
||||||
Backbone.Mediator.publish 'editor:random-terrain-generated', thangs: @thangs
|
Backbone.Mediator.publish 'editor:random-terrain-generated', thangs: @thangs, terrain: presets[presetType].terrainName
|
||||||
@hide()
|
@hide()
|
||||||
|
|
||||||
randomizeThangs: (presetName, presetSize) ->
|
randomizeThangs: (presetName, presetSize) ->
|
||||||
|
|
|
@ -13,12 +13,13 @@ module.exports = class SettingsTabView extends CocoView
|
||||||
# not thangs or scripts or the backend stuff
|
# not thangs or scripts or the backend stuff
|
||||||
editableSettings: [
|
editableSettings: [
|
||||||
'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals',
|
'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals',
|
||||||
'type', 'showsGuide', 'banner', 'employerDescription'
|
'type', 'terrain', 'showsGuide', 'banner', 'employerDescription'
|
||||||
]
|
]
|
||||||
|
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'editor:level-loaded': 'onLevelLoaded'
|
'editor:level-loaded': 'onLevelLoaded'
|
||||||
'editor:thangs-edited': 'onThangsEdited'
|
'editor:thangs-edited': 'onThangsEdited'
|
||||||
|
'editor:random-terrain-generated': 'onRandomTerrainGenerated'
|
||||||
|
|
||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
super options
|
super options
|
||||||
|
@ -47,6 +48,7 @@ module.exports = class SettingsTabView extends CocoView
|
||||||
@settingsTreema = @$el.find('#settings-treema').treema treemaOptions
|
@settingsTreema = @$el.find('#settings-treema').treema treemaOptions
|
||||||
@settingsTreema.build()
|
@settingsTreema.build()
|
||||||
@settingsTreema.open()
|
@settingsTreema.open()
|
||||||
|
@lastTerrain = data.terrain
|
||||||
|
|
||||||
getThangIDs: ->
|
getThangIDs: ->
|
||||||
(t.id for t in @level.get('thangs') ? [])
|
(t.id for t in @level.get('thangs') ? [])
|
||||||
|
@ -56,11 +58,17 @@ module.exports = class SettingsTabView extends CocoView
|
||||||
for key in @editableSettings
|
for key in @editableSettings
|
||||||
continue if @settingsTreema.data[key] is undefined
|
continue if @settingsTreema.data[key] is undefined
|
||||||
@level.set key, @settingsTreema.data[key]
|
@level.set key, @settingsTreema.data[key]
|
||||||
|
if (terrain = @settingsTreema.data.terrain) isnt @lastTerrain
|
||||||
|
@lastTerrain = terrain
|
||||||
|
Backbone.Mediator.publish 'editor:terrain-changed', terrain: terrain
|
||||||
|
|
||||||
onThangsEdited: (e) ->
|
onThangsEdited: (e) ->
|
||||||
# Update in-place so existing Treema nodes refer to the same array.
|
# Update in-place so existing Treema nodes refer to the same array.
|
||||||
@thangIDs?.splice(0, @thangIDs.length, @getThangIDs()...)
|
@thangIDs?.splice(0, @thangIDs.length, @getThangIDs()...)
|
||||||
|
|
||||||
|
onRandomTerrainGenerated: (e) ->
|
||||||
|
@settingsTreema.set '/terrain', e.terrain
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
@settingsTreema?.destroy()
|
@settingsTreema?.destroy()
|
||||||
super()
|
super()
|
||||||
|
|
|
@ -17,6 +17,7 @@ module.exports = class SystemsTabView extends CocoView
|
||||||
'editor:edit-level-system': 'editLevelSystem'
|
'editor:edit-level-system': 'editLevelSystem'
|
||||||
'editor:level-system-editing-ended': 'onLevelSystemEditingEnded'
|
'editor:level-system-editing-ended': 'onLevelSystemEditingEnded'
|
||||||
'editor:level-loaded': 'onLevelLoaded'
|
'editor:level-loaded': 'onLevelLoaded'
|
||||||
|
'editor:terrain-changed': 'onTerrainChanged'
|
||||||
|
|
||||||
events:
|
events:
|
||||||
'click #add-system-button': 'addLevelSystem'
|
'click #add-system-button': 'addLevelSystem'
|
||||||
|
@ -103,6 +104,20 @@ module.exports = class SystemsTabView extends CocoView
|
||||||
@removeSubView @levelSystemEditView
|
@removeSubView @levelSystemEditView
|
||||||
@levelSystemEditView = null
|
@levelSystemEditView = null
|
||||||
|
|
||||||
|
onTerrainChanged: (e) ->
|
||||||
|
defaultPathfinding = e.terrain in ['Dungeon', 'Indoor']
|
||||||
|
return unless AI = @systemsTreema.get 'original=528110f30268d018e3000001'
|
||||||
|
return if AI.config?.findsPaths is defaultPathfinding
|
||||||
|
AI.config ?= {}
|
||||||
|
AI.config.findsPaths = defaultPathfinding
|
||||||
|
@systemsTreema.set 'original=528110f30268d018e3000001', AI
|
||||||
|
noty {
|
||||||
|
text: "AI System defaulted pathfinding to #{defaultPathfinding} for terrain #{e.terrain}."
|
||||||
|
layout: 'topCenter'
|
||||||
|
timeout: 5000
|
||||||
|
type: 'information'
|
||||||
|
}
|
||||||
|
|
||||||
buildDefaultSystems: ->
|
buildDefaultSystems: ->
|
||||||
[
|
[
|
||||||
{original: '528112c00268d018e3000008', majorVersion: 0} # Event
|
{original: '528112c00268d018e3000008', majorVersion: 0} # Event
|
||||||
|
@ -120,6 +135,9 @@ module.exports = class SystemsTabView extends CocoView
|
||||||
{original: '528111b30268d018e3000004', majorVersion: 0} # Alliance
|
{original: '528111b30268d018e3000004', majorVersion: 0} # Alliance
|
||||||
{original: '528114e60268d018e300001a', majorVersion: 0} # UI
|
{original: '528114e60268d018e300001a', majorVersion: 0} # UI
|
||||||
{original: '528114040268d018e3000011', majorVersion: 0} # Physics
|
{original: '528114040268d018e3000011', majorVersion: 0} # Physics
|
||||||
|
{original: '52ae4f02a4dcd4415200000b', majorVersion: 0} # Display
|
||||||
|
{original: '52e953e81b2028d102000004', majorVersion: 0} # Effect
|
||||||
|
{original: '52f1354370fb890000000005', majorVersion: 0} # Magic
|
||||||
]
|
]
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
|
|
|
@ -393,6 +393,8 @@ module.exports = class ThangTypeEditView extends RootView
|
||||||
if (kind = @treema.data.kind) isnt @lastKind
|
if (kind = @treema.data.kind) isnt @lastKind
|
||||||
@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
|
||||||
|
@treema.set '/terrains', ['Grass', 'Dungeon', 'Indoor'] # So editors know to set them.
|
||||||
|
|
||||||
onSelectNode: (e, selected) =>
|
onSelectNode: (e, selected) =>
|
||||||
selected = selected[0]
|
selected = selected[0]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue