Files
academy2-game/objects/palace.gd
Segey Lapin d6c8a24f5a stuff
2021-10-26 21:52:15 +03:00

124 lines
4.3 KiB
GDScript

extends Spatial
var courtyard_tile: PackedScene = load("res://objects/courtyard-tile.scn")
var foundation_tile: PackedScene = load("res://objects/foundation.scn")
var room_tile: PackedScene = load("res://objects/block-room-corridoor.scn")
var tower_walls_tile: PackedScene = load("res://objects/tower-walls.scn")
var tower_floor_tile: PackedScene = load("res://objects/tower_floor.scn")
var stairs_tile: PackedScene = load("res://objects/stairs.scn")
var gate_bottom_tile: PackedScene = load("res://objects/gate_bottom.scn")
var gate_top_tile: PackedScene = load("res://objects/gate-top.scn")
var entry_tile: PackedScene = load("res://objects/block-room-entry.scn")
var roof_tile: PackedScene = load("res://objects/roof.scn")
var tower_roof_tile: PackedScene = load("res://objects/tower-roof.scn")
const tile_size = 8
const palace_size = 8
const layers = 4
func _ready():
var voffset = 0.0
for layer in range(layers):
match layer:
0:
voffset += 0.0
1:
voffset += 1
2:
voffset += 4
_:
voffset += 4
for i in range(palace_size):
for j in range(palace_size):
var x = i * tile_size - palace_size * tile_size / 2
var z = j * tile_size - palace_size * tile_size / 2
if layer == 0:
var ct = courtyard_tile.instance()
var xform = Transform(Basis(), Vector3(x, voffset, z))
if i > 0 && i < palace_size - 1:
if j > 0 && j < palace_size - 1:
call_deferred("place", ct, xform)
if i in [0, palace_size - 1] || j in [0, palace_size - 1]:
call_deferred("place", ct, xform)
else:
var ct = room_tile.instance()
var tower_angles = {
0:
{
0: -PI / 2.0,
palace_size - 1: 0
},
palace_size - 1:
{
0: PI,
palace_size - 1: PI / 2.0
}
}
var xform = Transform(Basis(), Vector3(x, voffset, z))
if i == 0 && !j in [0, palace_size - 1]:
xform.basis = Basis().rotated(Vector3.UP, -PI / 2.0)
spawn_wall(layer, i, j, xform)
elif i == palace_size - 1 && !j in [0, palace_size - 1]:
xform.basis = Basis().rotated(Vector3.UP, PI / 2.0)
spawn_wall(layer, i, j, xform)
elif !i in [0, palace_size - 1] && j == 0:
xform.basis = Basis().rotated(Vector3.UP, PI)
spawn_wall(layer, i, j, xform)
elif !i in [0, palace_size - 1] && j == palace_size - 1:
xform.basis = Basis()
spawn_wall(layer, i, j, xform)
elif tower_angles.has(i) && tower_angles[i].has(j):
xform.basis = Basis().rotated(Vector3.UP, tower_angles[i][j])
if layer == layers - 1:
var twr = tower_roof_tile.instance()
call_deferred("place", twr, xform)
else:
var tw = tower_walls_tile.instance()
call_deferred("place", tw, xform)
var st = stairs_tile.instance()
call_deferred("place", st, xform)
if layer == 1:
var tfl = tower_floor_tile.instance()
call_deferred("place", tfl, xform)
var car = Spatial.new()
car.add_to_group("spawn")
car.add_to_group("keep")
car.add_to_group("car")
add_child(car)
for e in range(5):
var major_f = Spatial.new()
major_f.add_to_group("spawn")
if e == 0:
major_f.add_to_group("male")
else:
major_f.add_to_group("female")
major_f.add_to_group("keep")
add_child(major_f)
major_f.global_transform = Transform(Basis(), Vector3(cos(PI / 3 * e) * 2.0, 0, sin(PI / 3 * e) * 2.0) + Vector3(10.0, 0, 0))
print("PALACE done")
func place(obj, where):
add_child(obj)
obj.transform = where
print("placed at ", where.origin)
func spawn_wall(layer:int, i: int, j: int, xform: Transform):
if layer == layers - 1:
var rt = roof_tile.instance()
call_deferred("place", rt, xform)
elif (j != palace_size / 2.0 && i != palace_size / 2.0)|| layer > 2:
var ct = room_tile.instance()
call_deferred("place", ct, xform)
elif (j == palace_size / 2.0 && i != palace_size / 2.0) && layer == 1:
var ent = entry_tile.instance()
call_deferred("place", ent, xform)
elif (j != palace_size / 2.0 && i == palace_size / 2.0) && layer == 1:
var gw = gate_bottom_tile.instance()
call_deferred("place", gw, xform)
elif (j != palace_size / 2.0 && i == palace_size / 2.0) && layer == 2:
var gw = gate_top_tile.instance()
call_deferred("place", gw, xform)
elif (j == palace_size / 2.0 && i != palace_size / 2.0) && layer == 2:
var ct = room_tile.instance()
call_deferred("place", ct, xform)