More decorations! (for dungeon preset)

This commit is contained in:
Jayant Jain 2014-08-12 10:33:11 +05:30
parent 5d8264e887
commit b6e53d87c7

View file

@ -24,7 +24,7 @@ clusters = {
'margin': 1
}
'wood': {
'thangs': ['Firewood 1', 'Firewood 2', 'Firewood 3', 'Barrel']
'thangs': ['Firewood 1', 'Firewood 2', 'Firewood 3']
'margin': 1
}
'farm': {
@ -39,6 +39,18 @@ clusters = {
'thangs': ['Gargoyle', 'Rock Cluster 1', 'Rock Cluster 2', 'Rock Cluster 3']
'margin': 1
}
'torch': {
'thangs': ['Torch']
'margin': 0
}
'chains': {
'thangs': ['Chains']
'margin': 0
}
'barrel': {
'thangs': ['Barrel']
'margin': 1
}
'doors': {
'thangs': ['Dungeon Door']
'margin': -1
@ -75,6 +87,7 @@ presets = {
'borders':'dungeon_wall'
'borderNoise':0
'borderSize':4
'borderThickness':1
'floors':'dungeon_floor'
'decorations': {
'Room': {
@ -84,6 +97,13 @@ presets = {
'thickness': [2,2]
'cluster': 'dungeon_wall'
}
'Barrels': {
'num': [1,1]
'width': [8, 12]
'height': [8, 12]
'numBarrels': [4,6]
'cluster': 'barrel'
}
'cave': {
'num':[1,1]
'width': 10
@ -100,6 +120,7 @@ presets = {
'borders':'indoor_wall'
'borderNoise':0
'borderSize':4
'borderThickness':1
'floors':'indoor_floor'
'decorations': {
'Room': {
@ -124,6 +145,7 @@ presets = {
'borders':'trees'
'borderNoise':1
'borderSize':0
'borderThickness':3
'floors':'grass_floor'
'decorations': {
'house': {
@ -156,10 +178,12 @@ presetSizes = {
'small': {
'x':80
'y':68
'sizeFactor':1
}
'large': {
'x':160
'y':136
'sizeFactor':2
}
}
@ -171,7 +195,6 @@ thangSizes = {
'borderSize': {
'x':4
'y':4
'thickness':3
}
}
@ -221,7 +244,8 @@ module.exports = class TerrainRandomizeModal extends ModalView
randomizeBorder: (preset, presetSize, noiseFactor=1) ->
for i in _.range(0, presetSize.x, thangSizes.borderSize.x)
for j in _.range(thangSizes.borderSize.thickness)
for j in _.range(preset.borderThickness)
# Bottom wall
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
@ -231,6 +255,8 @@ module.exports = class TerrainRandomizeModal extends ModalView
'margin': clusters[preset.borders].margin
}
continue
# Top wall
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
@ -241,8 +267,38 @@ module.exports = class TerrainRandomizeModal extends ModalView
}
continue
# Double wall on top
if preset.type is 'dungeon'
@addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
'x': i + preset.borderSize/2
'y': presetSize.y - 3 * preset.borderSize/2
}
'margin': clusters[preset.borders].margin
}
if ( i / preset.borderSize ) % 2 and i isnt presetSize.x - thangSizes.borderSize.x
@addThang {
'id': @getRandomThang(clusters['torch'].thangs)
'pos': {
'x': i + preset.borderSize
'y': presetSize.y - preset.borderSize
}
'margin': clusters['torch'].margin
}
else if ( i / preset.borderSize ) % 2 is 0 and i and _.random(100) < 30
@addThang {
'id': @getRandomThang(clusters['chains'].thangs)
'pos': {
'x': i + preset.borderSize
'y': presetSize.y - preset.borderSize
}
'margin': clusters['chains'].margin
}
for i in _.range(0, presetSize.y, thangSizes.borderSize.y)
for j in _.range(3)
for j in _.range(preset.borderThickness)
# Left wall
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
@ -252,6 +308,8 @@ module.exports = class TerrainRandomizeModal extends ModalView
'margin': clusters[preset.borders].margin
}
continue
# Right wall
while not @addThang {
'id': @getRandomThang(clusters[preset.borders].thangs)
'pos': {
@ -263,9 +321,8 @@ module.exports = class TerrainRandomizeModal extends ModalView
continue
randomizeDecorations: (preset, presetSize)->
if presetSize is presetSizes['small'] then sizeFactor = 1 else sizeFactor = 2
for name, decoration of preset.decorations
for num in _.range(sizeFactor * _.random(decoration.num[0], decoration.num[1]))
for num in _.range(presetSize.sizeFactor * _.random(decoration.num[0], decoration.num[1]))
if @['build'+name] isnt undefined
@['build'+name](preset, presetSize, decoration)
continue
@ -291,15 +348,14 @@ module.exports = class TerrainRandomizeModal extends ModalView
continue
buildRoom: (preset, presetSize, room) ->
if presetSize is presetSizes['small'] then sizeFactor = 1 else sizeFactor = 2
while true
rect = {
'width':sizeFactor * (room.width[0] + preset.borderSize * _.random(0, (room.width[1] - room.width[0])/preset.borderSize))
'height':sizeFactor * (room.height[0] + preset.borderSize * _.random(0, (room.height[1] - room.height[0])/preset.borderSize))
'width':presetSize.sizeFactor * (room.width[0] + preset.borderSize * _.random(0, (room.width[1] - room.width[0])/preset.borderSize))
'height':presetSize.sizeFactor * (room.height[0] + preset.borderSize * _.random(0, (room.height[1] - room.height[0])/preset.borderSize))
}
roomThickness = _.random(room.thickness[0], room.thickness[1])
rect.x = _.random(rect.width/2 + preset.borderSize * (roomThickness+1.5), presetSize.x - rect.width/2 - preset.borderSize * (roomThickness+1.5))
rect.y = _.random(rect.height/2 + preset.borderSize * (roomThickness+2.5), presetSize.y - rect.height/2 - preset.borderSize * (roomThickness+2.5))
rect.y = _.random(rect.height/2 + preset.borderSize * (roomThickness+2.5), presetSize.y - rect.height/2 - preset.borderSize * (roomThickness+3.5))
# Snap room walls to the wall grid.
rect.x = Math.round((rect.x - preset.borderSize / 2) / preset.borderSize) * preset.borderSize + preset.borderSize / 2
rect.y = Math.round((rect.y - preset.borderSize / 2) / preset.borderSize) * preset.borderSize + preset.borderSize / 2
@ -318,6 +374,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
for t in _.range(0, roomThickness+1)
for i in _.range(rect.x - rect.width/2 - (t-1) * preset.borderSize, rect.x + rect.width/2 + t * preset.borderSize, preset.borderSize)
# Bottom wall
thang = {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
@ -331,6 +388,18 @@ module.exports = class TerrainRandomizeModal extends ModalView
thang.pos.y -= preset.borderSize/3
@addThang thang unless i is bottomDoorX and t isnt roomThickness and bottomDoor
if t is roomThickness and i isnt rect.x - rect.width/2 - (t-1) * preset.borderSize and preset.type is 'dungeon'
if ( i isnt bottomDoorX and i isnt bottomDoorX + preset.borderSize ) or not bottomDoor
@addThang {
'id': @getRandomThang(clusters['torch'].thangs)
'pos': {
'x': thang.pos.x - preset.borderSize / 2
'y': thang.pos.y + preset.borderSize / 2
}
'margin': clusters['torch'].margin
}
# Top wall
thang = {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
@ -346,6 +415,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
for t in _.range(0, roomThickness)
for i in _.range(rect.y - rect.height/2 - t * preset.borderSize, rect.y + rect.height/2 + (t+1) * preset.borderSize, preset.borderSize)
# Left wall
@addThang {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
@ -355,6 +425,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
'margin': clusters[room.cluster].margin
}
# Right wall
@addThang {
'id': @getRandomThang(clusters[room.cluster].thangs)
'pos': {
@ -364,6 +435,35 @@ module.exports = class TerrainRandomizeModal extends ModalView
'margin': clusters[room.cluster].margin
}
buildBarrels: (preset, presetSize, decoration) ->
rect = {
'width':presetSize.sizeFactor * ( _.random( decoration.width[0], decoration.width[1] ) )
'height':presetSize.sizeFactor * ( _.random( decoration.height[0], decoration.height[1] ) )
}
x = [ rect.width/2 + preset.borderSize , presetSize.x - rect.width/2 - preset.borderSize ]
y = [ rect.height/2 + preset.borderSize , presetSize.y - rect.height/2 - 2 * preset.borderSize ]
for i in x
for j in y
if _.random(100) < 40
rect = {
'x': i
'y': j
'width': rect.width
'height': rect.height
}
if @addRect rect
for num in _.range( _.random( decoration.numBarrels[0], decoration.numBarrels[1] ) )
while not @addThang {
'id': @getRandomThang(clusters[decoration.cluster].thangs)
'pos': {
'x': _.random(rect.x - rect.width/2, rect.x + rect.width/2)
'y': _.random(rect.y - rect.height/2, rect.y + rect.height/2)
}
'margin': clusters[decoration.cluster].margin
}
continue
addThang: (thang) ->
if @falseCount > 100
console.log 'infinite loop', thang