Skip to content

Commit

Permalink
Add cave generation work-in-progress
Browse files Browse the repository at this point in the history
  • Loading branch information
svntax committed Jun 17, 2016
1 parent 7d95441 commit 7e676dc
Show file tree
Hide file tree
Showing 10 changed files with 221 additions and 0 deletions.
Binary file modified Scenes/player.scn
Binary file not shown.
Binary file added Scenes/terrain.scn
Binary file not shown.
Binary file added Scenes/terrain_wall.scn
Binary file not shown.
63 changes: 63 additions & 0 deletions Scripts/auto_tile.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

extends StaticBody2D

# member variables here, example:
# var a=2
# var b="textvar"
var isTiled = false

func _ready():
# Called every time the node is added to the scene.
# Initialization here
set_fixed_process(true)

func _fixed_process(delta):
if(!isTiled):
"""var amount = 4
var up = get_parent().test_move(Vector2(0, -amount))
var down = get_parent().test_move(Vector2(0, amount))
var left = get_parent().test_move(Vector2(-amount, 0))
var right = get_parent().test_move(Vector2(amount, 0))
"""
var space_state = get_world_2d().get_direct_space_state()
var sprite = find_node("Sprite")
var pos = Vector2(sprite.get_pos().x + 16, sprite.get_pos().y + 16)
pos = get_pos()
var up = !space_state.intersect_ray( pos, Vector2(pos.x, pos.y - 32), [self]).empty()
var down = !space_state.intersect_ray( pos, Vector2(pos.x, pos.y + 32), [self]).empty()
var left = !space_state.intersect_ray( pos, Vector2(pos.x - 32, pos.y), [self]).empty()
var right = !space_state.intersect_ray( pos, Vector2(pos.x + 32, pos.y), [self]).empty()

#hard-coded for specific tileset
if(!up && down && left && right):
sprite.set_region_rect(Rect2(32, 0, 32, 32))
elif(up && !down && left && right):
sprite.set_region_rect(Rect2(64, 0, 32, 32))
elif(up && down && !left && right):
sprite.set_region_rect(Rect2(96, 0, 32, 32))
elif(up && down && left && !right):
sprite.set_region_rect(Rect2(0, 32, 32, 32))
elif (!up && down && left && !right):
sprite.set_region_rect(Rect2(32, 32, 32, 32))
elif (up && !down && left && !right):
sprite.set_region_rect(Rect2(64, 32, 32, 32))
elif (up && !down && !left && right):
sprite.set_region_rect(Rect2(96, 32, 32, 32))
elif(!up && down && !left && right):
sprite.set_region_rect(Rect2(0, 64, 32, 32))
elif(!up && down && !left && !right):
sprite.set_region_rect(Rect2(32, 64, 32, 32))
elif(!up && !down && left && !right):
sprite.set_region_rect(Rect2(64, 64, 32, 32))
elif(up && !down && !left && !right):
sprite.set_region_rect(Rect2(96, 64, 32, 32))
elif(!up && !down && !left && right):
sprite.set_region_rect(Rect2(0, 96, 32, 32))
elif(!up && !down && left && right):
sprite.set_region_rect(Rect2(32, 96, 32, 32))
elif(up && down && !left && !right):
sprite.set_region_rect(Rect2(64, 96, 32, 32))
elif(!up && !down && !left && !right):
sprite.set_region_rect(Rect2(96, 96, 32, 32))
isTiled = true

25 changes: 25 additions & 0 deletions Scripts/terrain_debug.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
extends Node2D

var r_pressed = false
var g_pressed = false

var scene = load("res://Scenes/terrain.scn")

var terrainNode

func _ready():
terrainNode = scene.instance()
add_child(terrainNode)
set_process_input(true)

func _input(event):
if(event.type == InputEvent.KEY):
if(event.scancode == KEY_R && !event.is_echo()):
if(!r_pressed):
terrainNode.queue_free()
remove_child(terrainNode)
terrainNode = scene.instance()
add_child(terrainNode)
r_pressed = !r_pressed


127 changes: 127 additions & 0 deletions Scripts/terrain_gen.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
extends Node2D

var TILE_SIZE = 32
var TERRAIN_WIDTH = 60
var TERRAIN_HEIGHT = 38
var INITIAL_CHANCE = 0.4

var MIN_FOR_ALIVE = 3
var MIN_FOR_DEAD = 4

var terrain = []

var r_pressed = false
var g_pressed = false

var scene = load("res://Scenes/terrain_wall.scn")

func _ready():
for i in range(TERRAIN_WIDTH):
terrain.append([])
for j in range(TERRAIN_HEIGHT):
terrain[i].append(0)

generateTerrain()
for i in range(3):
cellularAutomata()
spawnWalls()

set_process(true)
#set_process_input(true)

func _input(event):
if(event.type == InputEvent.KEY):
if(event.scancode == KEY_R && !event.is_echo()):
if(!r_pressed):
generateTerrain()
for i in range(3):
cellularAutomata()
spawnWalls()
update()
r_pressed = !r_pressed

"""if(event.scancode == KEY_G && !event.is_echo()):
if(!g_pressed):
cellularAutomata()
update()
g_pressed = !g_pressed """

func _draw():
#drawTerrain()
pass

func generateTerrain():
randomize()
for i in range(TERRAIN_WIDTH):
for j in range(TERRAIN_HEIGHT):
if(i == 0 || i == TERRAIN_WIDTH - 1 || j == 0 || j == TERRAIN_HEIGHT - 1):
terrain[i][j] = 1
elif(randf() < INITIAL_CHANCE):
terrain[i][j] = 1
else:
terrain[i][j] = 0

func cellularAutomata():
var newTerrain = []
for i in range(TERRAIN_WIDTH):
newTerrain.append([])
for j in range(TERRAIN_HEIGHT):
if(i == 0 || i == TERRAIN_WIDTH - 1 || j == 0 || j == TERRAIN_HEIGHT - 1):
newTerrain[i].append(1)
else:
newTerrain[i].append(0)
for i in range(1, TERRAIN_WIDTH - 1):
for j in range(1, TERRAIN_HEIGHT - 1):
var count = getNeighborsCount(terrain, i, j)
#old method - spacious
#if(count >= 5):
#newTerrain[i][j] = 1
if(terrain[i][j] == 1):
if(count-1 < MIN_FOR_ALIVE):
newTerrain[i][j] = 0
else:
newTerrain[i][j] = 1
else:
if(count > MIN_FOR_DEAD):
newTerrain[i][j] = 1
else:
newTerrain[i][j] = 0
terrain = newTerrain
update()

# assume that arr[row][col] is within the middle
func getNeighborsCount(var arr, var row, var col):
var count = 0
for i in [-1, 0, 1]:
for j in [-1, 0, 1]:
count += arr[row+i][col+j]
return count

func drawTerrain():
for i in range(TERRAIN_WIDTH):
for j in range(TERRAIN_HEIGHT):
var block = Rect2(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE)
if(terrain[i][j] == 1):
draw_rect(block, Color(0, 0, 0.7, 1))
pass
elif(terrain[i][j] == 0):
draw_rect(block, Color(0, 0, 0, 1))

func spawnWalls():
"""var walls = get_child(1)
if(walls != null):
while(get_child(1) != null):
get_child(1).queue_free()
remove_child(get_child(1))"""

for i in range(TERRAIN_WIDTH):
for j in range(TERRAIN_HEIGHT):
if(terrain[i][j] == 1):
var block = scene.instance()
var shape = RectangleShape2D.new()
shape.set_extents(Vector2(TILE_SIZE/2, TILE_SIZE/2))
block.set_pos(Vector2(i*TILE_SIZE, j*TILE_SIZE))
block.add_shape(shape)
add_child(block)
#elif(terrain[i][j] == 0):
#draw_rect(block, Color(1, 1, 1, 1))
Binary file added caveTileSet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions caveTileSet.png.flags
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
filter=false
gen_mipmaps=false
4 changes: 4 additions & 0 deletions engine.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
name="Godot-Jam-Procedural"
main_scene="res://test_scene.scn"
icon="res://icon.png"

[render]

default_clear_color=#ffffffff
Binary file modified test_scene.scn
Binary file not shown.

0 comments on commit 7e676dc

Please sign in to comment.