168 lines
4.9 KiB
GDScript
168 lines
4.9 KiB
GDScript
extends Reference
|
|
|
|
static func build_house2(main_xform: Transform):
|
|
var rnd = streaming.get_place_rnd(main_xform)
|
|
print(main_xform.origin, " seed = ", rnd.state)
|
|
var l = 5 + 2 * (rnd.randi() % 5) - 1
|
|
var h = l - 1
|
|
var d = 3 + rnd.randi() % (l - 4 + 1)
|
|
var range_used = false
|
|
var objects = []
|
|
for k in range(l + 1):
|
|
var pos = Vector3(0, 0, k * 2)
|
|
var xform = Transform(Basis(), pos)
|
|
if k > 0:
|
|
var what
|
|
if k != d && rnd.randf() > 0.5 && !range_used:
|
|
what = "roof_floor_range"
|
|
range_used = true
|
|
else:
|
|
what = "roof_floor"
|
|
objects.push_back({"xform": xform, "data": [what]})
|
|
var xt = [Transform(Basis(), pos), Transform(Basis().rotated(Vector3.UP, PI), pos - Vector3(0, 0, 2))]
|
|
for x in range(xt.size()):
|
|
if x == 0 && k == d:
|
|
continue
|
|
if rnd.randf() > 0.5:
|
|
what = "wall_solid"
|
|
elif rnd.randf() > 0.5:
|
|
what = "window_narrow"
|
|
else:
|
|
what = "window_wide"
|
|
objects.push_back({"xform": xt[x], "data": [what]})
|
|
var obj_data = []
|
|
if k > 1 && k < l && rnd.randf() > 0.6:
|
|
objects.push_back({"xform": xform, "data": ["wall_internal"]})
|
|
|
|
match k:
|
|
0:
|
|
obj_data = ["side_wall", "bottom_side"]
|
|
1:
|
|
obj_data = ["bottom"]
|
|
2:
|
|
obj_data = ["bottom_wheels"]
|
|
d:
|
|
obj_data = ["entry", "bottom"]
|
|
h:
|
|
obj_data = ["bottom_wheels"]
|
|
l:
|
|
obj_data = ["side_wall_rotated", "bottom_side_rotated", "bottom"]
|
|
_:
|
|
obj_data = ["bottom"]
|
|
objects.push_back({"xform": xform, "data": obj_data})
|
|
return objects
|
|
|
|
static func build_walls(pos: Vector3, rnd: RandomNumberGenerator):
|
|
var objects = []
|
|
var xt = [Transform(Basis(), pos), Transform(Basis().rotated(Vector3.UP, PI), pos - Vector3(0, 0, 2))]
|
|
for x in range(xt.size()):
|
|
var obj_data = []
|
|
if rnd.randf() > 0.5:
|
|
obj_data.push_back("wall_solid")
|
|
elif rnd.randf() > 0.5:
|
|
obj_data.push_back("window_narrow")
|
|
else:
|
|
obj_data.push_back("window_wide")
|
|
objects.push_back({"xform": xt[x], "data": obj_data})
|
|
return objects
|
|
|
|
static func build_house(main_xform: Transform):
|
|
var rnd = streaming.get_place_rnd(main_xform)
|
|
var terminals = [
|
|
"side_wall",
|
|
"side_wall_rotated",
|
|
"room",
|
|
"entry",
|
|
"room_range",
|
|
"wheels_room"
|
|
]
|
|
var grammar = {
|
|
"start": ["side_wall", "room", "wheels_room", "rooms_entry", "wheels_room", "side_wall_rotated"],
|
|
"rooms_entry": ["rooms", "entry!", "rooms"],
|
|
"rooms": ["rooms#", ["room", "range!"]],
|
|
"entry!": ["entry"],
|
|
"range!": ["room_range"],
|
|
"rooms#": ["rooms"]
|
|
}
|
|
var seen = {}
|
|
var queue = ["start"]
|
|
var complete = false
|
|
while !complete:
|
|
complete = true
|
|
var data = []
|
|
for k in range(queue.size()):
|
|
var item = queue[k]
|
|
print("item=", item)
|
|
if !item in terminals:
|
|
complete = false
|
|
for de in grammar[item]:
|
|
var e
|
|
if typeof(de) == TYPE_ARRAY:
|
|
while true:
|
|
e = de[rnd.randi() % de.size()]
|
|
if !e.ends_with("!") || !seen.has(e):
|
|
break
|
|
else:
|
|
e = de
|
|
print("e=", e)
|
|
if e.ends_with("!"):
|
|
if seen.has(e):
|
|
continue
|
|
else:
|
|
seen[e] = 1
|
|
if e.ends_with("#"):
|
|
if queue.size() < 12:
|
|
if rnd.randf() >= 0.3:
|
|
data.push_back(e)
|
|
else:
|
|
data.push_back(e)
|
|
else:
|
|
data.push_back(item)
|
|
queue = data
|
|
if complete:
|
|
if !seen.has("entry!") || !seen.has("range!"):
|
|
complete = false
|
|
seen.clear()
|
|
queue = ["start"]
|
|
print("queue: ", queue)
|
|
var objects = []
|
|
for k in range(queue.size()):
|
|
var pos = Vector3(0, 0, k * 2)
|
|
var xform = Transform(Basis(), pos)
|
|
var xt = [Transform(Basis(), pos), Transform(Basis().rotated(Vector3.UP, PI), pos - Vector3(0, 0, 2))]
|
|
match queue[k]:
|
|
"side_wall":
|
|
objects.push_back({"xform": xform, "data": ["side_wall", "bottom_side"]})
|
|
"room":
|
|
objects.push_back({"xform": xform, "data": ["roof_floor", "bottom"]})
|
|
objects.append_array(build_walls(pos, rnd))
|
|
if rnd.randf() > 0.6:
|
|
objects.push_back({"xform": xform, "data": ["wall_internal"]})
|
|
"wheels_room":
|
|
objects.push_back({"xform": xform, "data": ["roof_floor", "bottom_wheels"]})
|
|
objects.append_array(build_walls(pos, rnd))
|
|
if rnd.randf() > 0.6:
|
|
objects.push_back({"xform": xform, "data": ["wall_internal"]})
|
|
"room_range":
|
|
objects.push_back({"xform": xform, "data": ["roof_floor_range", "bottom"]})
|
|
objects.append_array(build_walls(pos, rnd))
|
|
if rnd.randf() > 0.6:
|
|
objects.push_back({"xform": xform, "data": ["wall_internal"]})
|
|
"entry":
|
|
for x in range(xt.size()):
|
|
var obj_data = []
|
|
if x == 0:
|
|
continue
|
|
if rnd.randf() > 0.5:
|
|
obj_data.push_back("wall_solid")
|
|
elif rnd.randf() > 0.5:
|
|
obj_data.push_back("window_narrow")
|
|
else:
|
|
obj_data.push_back("window_wide")
|
|
objects.push_back({"xform": xt[x], "data": obj_data})
|
|
objects.push_back({"xform": xform, "data": ["roof_floor", "entry", "bottom"]})
|
|
"side_wall_rotated":
|
|
objects.append_array(build_walls(pos, rnd))
|
|
objects.push_back({"xform": xform, "data": ["roof_floor", "side_wall_rotated", "bottom_side_rotated", "bottom"]})
|
|
return objects
|