2014-06-24 06:30:29 -04:00
|
|
|
ModalView = require 'views/kinds/ModalView'
|
2014-07-13 20:31:09 -04:00
|
|
|
template = require 'templates/editor/level/modal/terrain_randomize'
|
2014-06-24 06:30:29 -04:00
|
|
|
CocoModel = require 'models/CocoModel'
|
|
|
|
|
2014-07-03 15:34:21 -04:00
|
|
|
clusters = {
|
|
|
|
'rocks': ['Rock 1', 'Rock 2', 'Rock 3', 'Rock 4', 'Rock 5', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3']
|
|
|
|
'trees': ['Tree 1', 'Tree 2', 'Tree 3', 'Tree 4']
|
|
|
|
'shrubs': ['Shrub 1', 'Shrub 2', 'Shrub 3']
|
|
|
|
'houses': ['House 1', 'House 2', 'House 3', 'House 4']
|
|
|
|
'animals': ['Cow', 'Horse']
|
|
|
|
'wood': ['Firewood 1', 'Firewood 2', 'Firewood 3', 'Barrel']
|
|
|
|
'farm': ['Farm']
|
|
|
|
}
|
|
|
|
|
2014-06-28 00:50:55 -04:00
|
|
|
presets = {
|
2014-07-03 15:34:21 -04:00
|
|
|
# 'dungeon': {
|
|
|
|
# 'type':'dungeon'
|
|
|
|
# 'borders':['Dungeon Wall']
|
|
|
|
# 'floors':['Dungeon Floor']
|
|
|
|
# 'decorations':[]
|
|
|
|
# }
|
|
|
|
'grassy': {
|
|
|
|
'type':'grassy'
|
|
|
|
'borders':['Tree 1', 'Tree 2', 'Tree 3']
|
2014-07-15 19:16:43 -04:00
|
|
|
'floors':['Grass']
|
|
|
|
# 'floors':['Grass01', 'Grass02', 'Grass03']
|
2014-07-03 15:34:21 -04:00
|
|
|
'decorations': {
|
|
|
|
'house': {
|
|
|
|
'num':[1,2] #min-max
|
|
|
|
'width': 20
|
|
|
|
'height': 20
|
|
|
|
'clusters': {
|
|
|
|
'houses':[1,1]
|
|
|
|
'trees':[1,2]
|
|
|
|
'shrubs':[0,3]
|
|
|
|
'rocks':[1,2]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
'farm': {
|
|
|
|
'num':[1,2] #min-max
|
|
|
|
'width': 20
|
|
|
|
'height': 20
|
|
|
|
'clusters': {
|
|
|
|
'farm':[1,1]
|
|
|
|
'shrubs':[2,3]
|
|
|
|
'wood':[2,4]
|
|
|
|
'animals':[2,3]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sizes = {
|
|
|
|
'small': {
|
|
|
|
'x':80
|
|
|
|
'y':68
|
|
|
|
}
|
|
|
|
'large': {
|
|
|
|
'x':160
|
|
|
|
'y':136
|
|
|
|
}
|
|
|
|
'floorSize': {
|
|
|
|
'x':20
|
2014-07-15 19:16:43 -04:00
|
|
|
'y':17
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
|
|
|
'borderSize': {
|
|
|
|
'x':4
|
|
|
|
'y':4
|
2014-07-15 19:16:43 -04:00
|
|
|
'thickness':3
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-13 20:31:09 -04:00
|
|
|
module.exports = class TerrainRandomizeModal extends ModalView
|
|
|
|
id: 'terrain-randomize-modal'
|
2014-06-24 06:30:29 -04:00
|
|
|
template: template
|
|
|
|
thangs = []
|
|
|
|
|
|
|
|
events:
|
2014-07-13 20:31:09 -04:00
|
|
|
'click .choose-option': 'onRandomize'
|
2014-06-24 06:30:29 -04:00
|
|
|
|
|
|
|
onRevertModel: (e) ->
|
|
|
|
id = $(e.target).val()
|
|
|
|
CocoModel.backedUp[id].revert()
|
|
|
|
$(e.target).closest('tr').remove()
|
|
|
|
@reloadOnClose = true
|
|
|
|
|
2014-07-13 20:31:09 -04:00
|
|
|
onRandomize: (e) ->
|
2014-06-28 00:50:55 -04:00
|
|
|
target = $(e.target)
|
|
|
|
presetType = target.attr 'data-preset-type'
|
|
|
|
presetSize = target.attr 'data-preset-size'
|
2014-07-13 20:31:09 -04:00
|
|
|
@randomizeThangs presetType, presetSize
|
|
|
|
Backbone.Mediator.publish('randomize:terrain-generated',
|
2014-06-26 09:02:31 -04:00
|
|
|
'thangs': @thangs
|
|
|
|
)
|
2014-07-10 16:13:51 -04:00
|
|
|
@hide()
|
2014-06-28 00:50:55 -04:00
|
|
|
|
2014-07-13 20:31:09 -04:00
|
|
|
randomizeThangs: (presetName, presetSize) ->
|
2014-06-28 00:50:55 -04:00
|
|
|
preset = presets[presetName]
|
|
|
|
presetSize = sizes[presetSize]
|
|
|
|
@thangs = []
|
2014-07-13 20:31:09 -04:00
|
|
|
@randomizeFloor preset, presetSize
|
|
|
|
@randomizeBorder preset, presetSize
|
|
|
|
@randomizeDecorations preset, presetSize
|
2014-06-28 00:50:55 -04:00
|
|
|
|
2014-07-13 20:31:09 -04:00
|
|
|
randomizeFloor: (preset, presetSize) ->
|
2014-06-28 00:50:55 -04:00
|
|
|
for i in _.range(0, presetSize.x, sizes.floorSize.x)
|
|
|
|
for j in _.range(0, presetSize.y, sizes.floorSize.y)
|
|
|
|
@thangs.push {
|
|
|
|
'id': @getRandomThang(preset.floors)
|
|
|
|
'pos': {
|
2014-07-15 19:16:43 -04:00
|
|
|
'x': i + sizes.floorSize.x/2
|
|
|
|
'y': j + sizes.floorSize.y/2
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-13 20:31:09 -04:00
|
|
|
randomizeBorder: (preset, presetSize) ->
|
2014-07-15 19:16:43 -04:00
|
|
|
for i in _.range(0+sizes.borderSize.x, presetSize.x, sizes.borderSize.x)
|
2014-07-13 22:41:33 -04:00
|
|
|
for j in _.range(sizes.borderSize.thickness)
|
|
|
|
@thangs.push {
|
|
|
|
'id': @getRandomThang(preset.borders)
|
|
|
|
'pos': {
|
|
|
|
'x': i + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
|
2014-07-15 19:16:43 -04:00
|
|
|
'y': 0 + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
|
2014-07-13 22:41:33 -04:00
|
|
|
}
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
2014-07-13 22:41:33 -04:00
|
|
|
@thangs.push {
|
|
|
|
'id': @getRandomThang(preset.borders)
|
|
|
|
'pos': {
|
|
|
|
'x': i + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
|
|
|
|
'y': presetSize.y - sizes.borderSize.y + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
|
|
|
|
}
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
|
|
|
|
2014-07-15 19:16:43 -04:00
|
|
|
for i in _.range(0, presetSize.y-sizes.borderSize.y, sizes.borderSize.y)
|
2014-07-13 22:41:33 -04:00
|
|
|
for j in _.range(3)
|
|
|
|
@thangs.push {
|
|
|
|
'id': @getRandomThang(preset.borders)
|
|
|
|
'pos': {
|
2014-07-15 19:16:43 -04:00
|
|
|
'x': 0+sizes.borderSize.x + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
|
2014-07-13 22:41:33 -04:00
|
|
|
'y': i + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
|
|
|
|
}
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
2014-07-13 22:41:33 -04:00
|
|
|
@thangs.push {
|
|
|
|
'id': @getRandomThang(preset.borders)
|
|
|
|
'pos': {
|
2014-07-15 19:16:43 -04:00
|
|
|
'x': presetSize.x + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
|
2014-07-13 22:41:33 -04:00
|
|
|
'y': i + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
|
|
|
|
}
|
2014-06-28 00:50:55 -04:00
|
|
|
}
|
|
|
|
|
2014-07-13 20:31:09 -04:00
|
|
|
randomizeDecorations: (preset, presetSize)->
|
2014-07-03 15:34:21 -04:00
|
|
|
for name, decoration of preset.decorations
|
|
|
|
for num in _.range(_.random(decoration.num[0], decoration.num[1]))
|
|
|
|
center =
|
|
|
|
{
|
|
|
|
'x':_.random(decoration.width, presetSize.x - decoration.width),
|
|
|
|
'y':_.random(decoration.height, presetSize.y - decoration.height)
|
|
|
|
}
|
|
|
|
min =
|
|
|
|
{
|
|
|
|
'x':center.x - decoration.width/2
|
|
|
|
'y':center.y - decoration.height/2
|
|
|
|
}
|
|
|
|
max =
|
|
|
|
{
|
|
|
|
'x':center.x + decoration.width/2
|
|
|
|
'y':center.y + decoration.height/2
|
|
|
|
}
|
|
|
|
for cluster, range of decoration.clusters
|
|
|
|
for i in _.range(_.random(range[0], range[1]))
|
|
|
|
@thangs.push {
|
|
|
|
'id':@getRandomThang(clusters[cluster])
|
|
|
|
'pos':{
|
|
|
|
'x':_.random(min.x, max.x)
|
|
|
|
'y':_.random(min.y, max.y)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-06-28 00:50:55 -04:00
|
|
|
getRandomThang: (thangList) ->
|
|
|
|
return thangList[_.random(0, thangList.length-1)]
|
2014-07-03 15:34:21 -04:00
|
|
|
|
2014-06-24 06:30:29 -04:00
|
|
|
getRenderData: ->
|
|
|
|
c = super()
|
|
|
|
models = _.values CocoModel.backedUp
|
|
|
|
models = (m for m in models when m.hasLocalChanges())
|
|
|
|
c.models = models
|
|
|
|
c
|
|
|
|
|
|
|
|
onHidden: ->
|
|
|
|
location.reload() if @reloadOnClose
|