8 Commits

Author SHA1 Message Date
Segey Lapin
9d6f2fc79b Building generation complete, city goes next 2020-04-20 23:11:34 +03:00
Segey Lapin
72452dcb4c Proper door layout; started multiple floors 2020-04-20 01:31:57 +03:00
Segey Lapin
585a9bdae1 Made fully-connected room set 2020-04-19 06:36:45 +03:00
Segey Lapin
153878d792 Interior algorithm taking its shape 2020-04-19 04:20:13 +03:00
Segey Lapin
b7a9e2e0b2 Fixed bug with front door placement 2020-04-16 09:50:31 +03:00
Segey Lapin
4e3135559f Fixed quest system path indicator 2020-04-15 14:54:49 +03:00
Segey Lapin
32c5212209 Implemented simple quest system 2020-04-15 12:16:14 +03:00
Segey Lapin
078cc47b91 Removed stale script 2020-04-14 16:53:09 +03:00
30 changed files with 5353 additions and 393 deletions

View File

@@ -1,11 +1,54 @@
extends Node
signal new_day
var raycasts_count = 100
var raycast_queue = []
var astar: AStar
var interior
func _ready():
set_save_slot(0)
enum periods {MORNING, DAY, EVENING, NIGHT}
var game_day: int = 0
var day_period: int = periods.MORNING
var game_hour: int = 0
var game_minute: int = 0
var acc_time:float = 0.0
var time_active = false
func _process(delta):
if time_active:
update_time(delta)
func update_time(delta):
acc_time += delta
if acc_time >= 1.0:
game_minute += 1
acc_time -= 1.0
if game_minute == 60:
game_minute = 0
game_hour += 1
if game_hour == 24:
game_hour = 0
game_day += 1
emit_signal("new_day")
match(game_hour):
23,0,1,2,3:
day_period = periods.NIGHT
4,5,6,7,8,9,10,11:
day_period = periods.MORNING
12,13,14,15,16:
day_period = periods.DAY
17,18,19,20,21,22:
day_period = periods.EVENING
func start_time():
time_active = true
func stop_time():
time_active = false
func visibility_check(ch1, ch2):
var direction: Vector3 = -ch1.global_transform.basis[2].normalized()
var to_ch2: Vector3 = (ch2.global_transform.origin - ch1.global_transform.origin).normalized()
@@ -38,6 +81,10 @@ func save_characters():
spawner.set_meta("stats", stats)
func save_game():
print("save game")
save_data.game_day = game_day
save_data.game_hour = game_hour
save_data.day_period = day_period
assert(save_slot.length() > 0)
var fd = File.new()
fd.open(save_slot, File.WRITE)
@@ -51,4 +98,7 @@ func load_game():
var data = fd.get_as_text()
var parse: = JSON.parse(data)
save_data = parse.result
game_day = save_data.game_day
game_hour = save_data.game_hour
day_period = save_data.day_period
fd.close()

View File

@@ -1,39 +0,0 @@
extends Node
enum {STATE_INIT, STATE_SIM, STATE_PAUSE}
var state = STATE_INIT
func _ready():
pass # Replace with function body.
var bone_ids = []
#func _physics_process(delta):
# match(state):
# STATE_INIT:
# for k in get_tree().get_nodes_in_group("female"):
# if !k.is_in_group("characters"):
# continue
# var sk: Skeleton = k.get_skeleton()
# if bone_ids.size() == 0:
# for c in range(sk.get_bone_count()):
# var bn = sk.get_bone_name(c)
# if bn.begins_with("skirt"):
# var pose = sk.get_bone_global_pose(c)
# sk.set_bone_global_pose_override(c, pose, 1.0)
# bone_ids.push_back(c)
# if bone_ids.size() > 0:
# state = STATE_SIM
# STATE_SIM:
# for k in get_tree().get_nodes_in_group("female"):
# if !k.is_in_group("characters"):
# continue
# var sk: Skeleton = k.get_skeleton()
# for c in bone_ids:
# var pose = sk.get_bone_global_pose(c)
# pose.origin.y -= 200.0 * delta
# sk.set_bone_global_pose_override(c, pose,1.0)
# state = STATE_PAUSE
# STATE_PAUSE:
# yield(get_tree().create_timer(0.1), "timeout")
# state = STATE_SIM

View File

@@ -0,0 +1,235 @@
extends Node
signal new_quest
var quests = []
func save():
var data = []
for k in quests:
data.push_back(k.save())
global.save_data.quests = data
func restore_quest(d):
var q = Quest.new(d.title, d.desc)
func restore():
for k in global.save_data.quests:
quests.push_back(restore_quest(k))
var quest_triggers = [
{
"title": "Something is not right.",
"desc": "You wake up from noise. Explore the building to find the source.",
"trigger": ["once", 0, 0, 10],
"objectives": [
["walkto_room", "Check enterance.", "Check enterance room.", "exit_room", 8.0],
["walkto_exit", "Check enteranc edoor is ok.", "Check the door.", 3.0]
]
}
]
class QuestObjective extends Reference:
var _title
var _desc
var quest
var complete = false
var active = false
func update():
pass
func activate():
active = true
func finish():
active = false
func set_quest(q):
quest = q
func _init(title, desc):
_title = title
_desc = desc
func save():
var save_data = {}
save_data.create = ["obj", _desc, _title]
save_data.active = active
save_data.complete = complete
return save_data
class Quest extends Reference:
signal quest_complete
var _title
var _description
var objectives = []
var children = []
var complete = false
var cur_objective: int = -1
func _init(title, desc):
_title = title
_description = desc
func add_objective(obj):
objectives.push_back(obj)
func remove_objective(obj):
objectives.erase(obj)
func add_child(obj):
children.push_back(obj)
func remove_child(obj: Quest):
children.erase(obj)
func save():
var save_data = {}
save_data.title = _title
save_data.desc = _description
return save_data
func update():
for k in children:
k.update()
for k in objectives:
k.update()
var old_objective:int = cur_objective
complete = true
for k in range(objectives.size()):
if !objectives[k].complete:
cur_objective = k
complete = false
break
for k in children:
if !k.complete:
complete = false
if complete:
emit_signal("quest_complete", self)
if cur_objective != old_objective:
if old_objective >= 0:
objectives[old_objective].finish()
objectives[cur_objective].activate()
func get_title():
return _title
func get_description():
return _title
class ObjectiveWalkto extends QuestObjective:
var where = Vector3()
var radius = 0.0
var indicator = preload("res://ui/quest_indicator.tscn")
var ind_i: Node2D
var old_pos = Vector3()
func _init(t, d, w, r).(t, d):
where = w
radius = r
func activate():
active = true
ind_i = indicator.instance()
var player_pos: Vector3 = global.player.global_transform.origin
var base = global.astar.get_closest_point(player_pos)
var tgt = global.astar.get_closest_point(where)
var path = global.astar.get_point_path(base, tgt)
if path.size() > 1:
ind_i.target = path[1] + Vector3(0, 1, 0) * 0.3
else:
ind_i.target = where + Vector3(0, 1, 0) * 0.3
global.get_viewport().add_child(ind_i)
print(_title, "ACTIVATED")
old_pos = player_pos
func finish():
active = false
ind_i.queue_free()
print(_title, " FINISHED")
func update():
if !active:
return
var player_pos: Vector3 = global.player.global_transform.origin
if old_pos.distance_to(player_pos) > 0.5:
var base = global.astar.get_closest_point(player_pos)
var tgt = global.astar.get_closest_point(where)
var path = global.astar.get_point_path(base, tgt)
if path.size() > 1:
var ind = 0
var pt = path[ind]
while ind < path.size() - 1:
pt = path[ind]
if pt.distance_to(player_pos) > 2.0:
ind_i.target = pt + Vector3(0, 1, 0) * 0.3
break
ind += 1
else:
ind_i.target = where + Vector3(0, 1, 0) * 0.3
old_pos = player_pos
if old_pos.distance_to(where) < radius:
complete = true
func save():
var save_data = {}
save_data.create = ["walkto_room", _title, _desc, where, radius]
save_data.active = active
save_data.complete = complete
return save_data
func _ready():
set_process(false)
func check_trigger(t):
var t_type = t[0]
match(t_type):
"once":
var t_day = t[1]
var t_hour = t[2]
var t_minute = t[3]
if global.game_day != t_day:
return false
if global.game_hour != t_hour:
return false
if int(global.game_minute / 10) != int(t_minute / 10):
return false
return true
return false
func create_objective(v):
var o_type = v[0]
match(o_type):
"walkto_room":
var o_title = v[1]
var o_desc = v[2]
var o_meta = v[3]
var o_radius = v[4]
var where = Vector3()
var rooms = global.get_tree().get_nodes_in_group("room")
var room_set = false
for e in rooms:
print(e.name)
if e.has_meta(o_meta):
where = e.global_transform.origin
room_set = true
break
assert(room_set == true)
var obj = ObjectiveWalkto.new(o_title, o_desc, where, o_radius)
return obj
"walkto_exit":
var o_title = v[1]
var o_desc = v[2]
var o_radius = v[3]
var where = global.interior.exit_doors[0].global_transform.origin
var obj = ObjectiveWalkto.new(o_title, o_desc, where, o_radius)
return obj
return null
var up_time = 0.0
var state: int = 0
func activate():
set_process(true)
func _process(delta):
up_time += delta
if up_time > 1000.0:
up_time = 0.0
if int(up_time * 10.0) % 10 == 1:
var processed = []
while quest_triggers.size() > 0:
var k = quest_triggers.pop_front()
if check_trigger(k.trigger):
print("quest triggered: ", k.title)
var q = Quest.new(k.title, k.desc)
quests.push_back(q)
for r in k.objectives:
var obj = create_objective(r)
if obj:
q.add_objective(obj)
emit_signal("new_quest", q)
else:
processed.push_back(k)
quest_triggers = processed
for k in quests:
k.update()

View File

@@ -0,0 +1,22 @@
extends Node
signal level_up
signal new_quest
var money: int = 2000
var master_node
var current_room
var team = {}
var line = {}
var training = false
# warning-ignore:unused_class_variable
var quests : = []
# warning-ignore:unused_class_variable
var team_train_count : = 0
# warning-ignore:unused_class_variable
var arrow: Spatial
# warning-ignore:unused_class_variable
var next_scene: String
var player_visual = {
"gender": "male"
}

View File

@@ -0,0 +1,817 @@
extends Spatial
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
var wall = preload("res://scenes/maps/wall.escn")
var window = preload("res://scenes/maps/window.tscn")
var door = preload("res://scenes/maps/door.tscn")
var entry = preload("res://scenes/maps/door-outside.tscn")
var fl = preload("res://scenes/maps/floor.escn")
var stairs = preload("res://scenes/maps/stairs-small.escn")
# Called when the node enters the scene tree for the first time.
var rnd: RandomNumberGenerator
var contour = [
Vector2(-10, -10), Vector2(10, -10),
Vector2(10, 10), Vector2(-10, 10)
]
var spaces = [
"entry",
"window",
"corridoor"
]
#var adj = {
# "entry": ["hall"],
# "hall": ["hall1", "kitchen", "toilet1", "bathroom1", "hall2"],
#}
class Floor extends Reference:
const FLAG_WALL_LEFT = (1 << 0)
const FLAG_WALL_UP = (1 << 1)
const FLAG_WALL_RIGHT = (1 << 2)
const FLAG_WALL_DOWN = (1 << 3)
const FLAG_FLOOR = (1 << 4)
const FLAG_ENTRY_LEFT = (1 << 5)
const FLAG_ENTRY_UP = (1 << 6)
const FLAG_ENTRY_RIGHT = (1 << 7)
const FLAG_ENTRY_DOWN = (1 << 8)
const FLAG_WINDOW_LEFT = (1 << 9)
const FLAG_WINDOW_UP = (1 << 10)
const FLAG_WINDOW_RIGHT = (1 << 11)
const FLAG_WINDOW_DOWN = (1 << 12)
const FLAG_DOOR_LEFT = (1 << 13)
const FLAG_DOOR_UP = (1 << 14)
const FLAG_DOOR_RIGHT = (1 << 15)
const FLAG_DOOR_DOWN = (1 << 16)
const FLAG_STAIRS = (1 << 17)
const FLAG_WALL_MASK = (FLAG_WALL_LEFT | FLAG_WALL_UP | FLAG_WALL_RIGHT | FLAG_WALL_DOWN)
const FLAG_ENTRY_MASK = (FLAG_ENTRY_LEFT | FLAG_ENTRY_UP | FLAG_ENTRY_RIGHT | FLAG_ENTRY_DOWN)
const FLAG_WINDOW_MASK = (FLAG_WINDOW_LEFT | FLAG_WINDOW_UP | FLAG_WINDOW_RIGHT | FLAG_WINDOW_DOWN)
const FLAG_DOOR_MASK = (FLAG_DOOR_LEFT | FLAG_DOOR_UP | FLAG_DOOR_RIGHT | FLAG_DOOR_DOWN)
const FLAG_LEFT_MASK = (FLAG_WALL_LEFT | FLAG_ENTRY_LEFT | FLAG_WINDOW_LEFT | FLAG_DOOR_LEFT)
const FLAG_UP_MASK = (FLAG_WALL_UP | FLAG_ENTRY_UP | FLAG_WINDOW_UP | FLAG_DOOR_UP)
const FLAG_RIGHT_MASK = (FLAG_WALL_RIGHT | FLAG_ENTRY_RIGHT | FLAG_WINDOW_RIGHT | FLAG_DOOR_RIGHT)
const FLAG_DOWN_MASK = (FLAG_WALL_DOWN | FLAG_ENTRY_DOWN | FLAG_WINDOW_DOWN | FLAG_DOOR_DOWN)
var wall_length = 2.0
var grid_areas = []
var grid_walls = []
var grid_rect: = Rect2()
var grid_size = 2.0
var size_x:int = 0
var size_y:int = 0
var windows = []
var walls_tiles = []
var enterance
var enterance_tile = -1
var stairs_pos: Vector2
var stairs_tile: int
const big_stairs_w = 10
const big_stairs_h = 8
const small_stairs_w = 4
const small_stairs_h = 4
func copy():
var ret = Floor.new()
ret.wall_length = wall_length
ret.grid_areas = grid_areas.duplicate()
ret.grid_walls = grid_walls.duplicate()
ret.grid_rect = grid_rect
ret.grid_size = grid_size
ret.size_x = size_x
ret.size_y = size_y
ret.windows = windows.duplicate()
ret.walls_tiles = walls_tiles.duplicate()
ret.enterance = enterance
ret.enterance_tile = enterance_tile
ret.stairs_pos = stairs_pos
ret.stairs_tile = stairs_tile
return ret
func init_grid(contour):
for k in range(contour.size()):
var p1 = contour[k]
var p2 = contour[(k + 1) % contour.size()]
for x in contour:
grid_rect = grid_rect.expand(x)
size_x = grid_rect.size.x / grid_size + 2
size_y = grid_rect.size.y / grid_size + 2
grid_areas.resize(size_x * size_y)
grid_walls.resize(size_x * size_y)
for t in range(size_x * size_y):
grid_areas[t] = 0
grid_walls[t] = 0
func init_walls(contour):
for y in range(size_y):
for x in range(size_x):
var point_flags = 0
var px = float(x) * grid_size + grid_rect.position.x - grid_size
var py = float(y) * grid_size + grid_rect.position.y - grid_size
var p0 = Vector2(px - 0.1, py - 0.1)
var p1 = Vector2(px - 0.1 + grid_size + 0.1, py)
var p2 = Vector2(px + grid_size + 0.1, py + grid_size + 0.1)
var p3 = Vector2(px - 0.1, py + grid_size + 0.1)
var p4 = p0 + Vector2(grid_size * 0.5, grid_size * 0.5) + Vector2(0.1, 0.1)
var p01 = p0.linear_interpolate(p1, 0.5)
var p12 = p1.linear_interpolate(p2, 0.5)
var p23 = p2.linear_interpolate(p3, 0.5)
var p30 = p3.linear_interpolate(p0, 0.5)
if Geometry.is_point_in_polygon(p0, PoolVector2Array(contour)):
point_flags |= 1
if Geometry.is_point_in_polygon(p1, PoolVector2Array(contour)):
point_flags |= 2
if Geometry.is_point_in_polygon(p2, PoolVector2Array(contour)):
point_flags |= 4
if Geometry.is_point_in_polygon(p3, PoolVector2Array(contour)):
point_flags |= 8
if Geometry.is_point_in_polygon(p4, PoolVector2Array(contour)):
point_flags |= 16
if Geometry.is_point_in_polygon(p01, PoolVector2Array(contour)):
point_flags |= 32
if Geometry.is_point_in_polygon(p12, PoolVector2Array(contour)):
point_flags |= 64
if Geometry.is_point_in_polygon(p23, PoolVector2Array(contour)):
point_flags |= 128
if Geometry.is_point_in_polygon(p30, PoolVector2Array(contour)):
point_flags |= 256
if point_flags == 0:
grid_areas[y * size_x + x] = 0xffff
else:
grid_areas[y * size_x + x] = 0
grid_walls[y * size_x + x] = point_flags
func grid2pos(x: int, y: int):
var px = float(x) * grid_size + grid_rect.position.x - grid_size
var py = float(y) * grid_size + grid_rect.position.y - grid_size
return Vector2(px, py)
func convert_walls():
for y in range(size_y):
for x in range(size_x):
var left = false
var right = false
var up = false
var down = false
var f = false
var point_flags = grid_walls[y * size_x + x]
var px = float(x) * grid_size + grid_rect.position.x - grid_size
var py = float(y) * grid_size + grid_rect.position.y - grid_size
var p0 = Vector2(px, py)
var p1 = Vector2(px + grid_size, py)
var p2 = Vector2(px + grid_size, py + grid_size)
var p3 = Vector2(px, py + grid_size)
match(point_flags):
0x1ff:
f = true
0x01, 0x02, 0x4, 0x08, 0x108, 0x84, 0x8c, 0x88, 0x0, 0x22, 0x23, 0x21, 0x046:
f = false
0x109, 0x101, 0x12b, 0x18d, 0x042, 0x06, 0xe4, 0x67, 0x40, 0x64, 0xc6:
f = false
0x80, 0xc, 0x1ce, 0x100, 0x1a9, 0x9, 0x161, 0x3, 0x20:
f = false
0xd6, 0xde:
f = true
up = true
left = true
0x19c, 0x1de, 0x1df, 0x1da:
f = true
up = true
0x19a, 0x19b, 0x198:
f = true
up = true
right = true
0xf4, 0xf6, 0xf7, 0xff, 0xfe, 0x1fe:
f = true
left = true
0x1b3, 0x1bb, 0x1bf, 0x199, 0x1bd, 0x1b9:
f = true
right = true
0x1fd, 0x1fb, 0x1f7, 0x1f6:
f = true
0x72, 0x76:
f = true
left = true
down = true
0x73, 0x152, 0x173, 0x17b, 0x177, 0x172, 0x17f:
f = true
down = true
0x131, 0x133, 0x139:
f = true
right = true
down = true
0x52, 0x56:
f = true
down = true
up = true
left = true
0x96:
f = true
left = true
right = true
up = true
0x11a, 0x110:
f = true
up = true
right = true
down = true
0x33:
f = true
left = true
right = true
down = true
_:
if point_flags & 0x10 != 0:
print("%03x" % (point_flags))
else:
print("skip %03x" % (point_flags))
if up:
if y > 0:
if grid_walls[(y - 1) * size_x + x] & 16 != 0:
up = false
if down:
if y < size_y - 1:
if grid_walls[(y + 1) * size_x + x] & 16 != 0:
down = false
if left:
if x > 0:
if grid_walls[y * size_x + x - 1] & 16 != 0:
left = false
if right:
if x < size_x - 1:
if grid_walls[y * size_x + x + 1] & 16 != 0:
right = false
if !up && f:
if y > 0:
if grid_walls[(y - 1) * size_x + x] & 16 == 0:
up = true
if !down && f:
if y < size_y - 1:
if grid_walls[(y + 1) * size_x + x] & 16 == 0:
down = true
if !left && f:
if x > 0:
if grid_walls[y * size_x + x - 1] & 16 == 0:
left = true
if !right && f:
if x < size_x - 1:
if grid_walls[y * size_x + x + 1] & 16 == 0:
right = true
point_flags = 0
if left:
point_flags |= 1
if up:
point_flags |= 2
if right:
point_flags |= 4
if down:
point_flags |= 8
if f:
point_flags |= 16
grid_walls[y * size_x + x] = point_flags
if point_flags & 0xf != 0:
walls_tiles.push_back(y * size_x + x)
func create_entry_door(rnd):
var tile = walls_tiles[rnd.randi() % walls_tiles.size()]
var point_flags = grid_walls[tile]
var flags = [
[FLAG_WALL_LEFT, FLAG_ENTRY_LEFT],
[FLAG_WALL_UP, FLAG_ENTRY_UP],
[FLAG_WALL_RIGHT, FLAG_ENTRY_RIGHT],
[FLAG_WALL_DOWN, FLAG_ENTRY_DOWN]
]
var rflags = []
for p in flags:
if point_flags & p[0] != 0:
rflags.push_back(p)
var f = rflags[rnd.randi() % rflags.size()]
point_flags &= ~f[0]
point_flags |= f[1]
grid_walls[tile] = point_flags
enterance_tile = tile
func allocate_stairs(area_code: int):
var stairs_w = small_stairs_w
var stairs_h = small_stairs_h
var stairs_grid_w = int((stairs_w + grid_size * 0.5) / grid_size)
var stairs_grid_h = int((stairs_h + grid_size * 0.5) / grid_size)
print("size_x ", size_x)
print("size_y ", size_y)
print("stairs grid size: ", stairs_grid_w, " ", stairs_grid_h)
var candidates = []
var candidates_tile = []
for i in range(size_y - stairs_grid_h):
for j in range(size_x - stairs_grid_w):
var ok = true
for ii in range(stairs_grid_h):
for jj in range(stairs_grid_w):
if grid_walls[(i + ii) * size_x + j + jj] != FLAG_FLOOR:
ok = false
break
if grid_areas[(i + ii) * size_x + j + jj] != 0:
ok = false
break
if ok:
candidates_tile.push_back(i * size_x + j)
var pos = grid2pos(j, i) + Vector2(stairs_w, stairs_h) * 0.5
print("stairs tile: ", i * size_x +j, " pos: ", pos)
candidates.push_back(pos)
assert(candidates_tile.size() > 0)
var pos = 0
for xpos in range(1, candidates_tile.size(), 1):
if abs(enterance_tile - candidates_tile[xpos]) < abs(enterance_tile - candidates_tile[pos]):
pos = xpos
stairs_tile = candidates_tile[pos]
stairs_pos = candidates[pos]
print("result: tile: ", stairs_tile, " pos: ", stairs_pos)
for i in range(stairs_grid_h):
for j in range(stairs_grid_w):
grid_areas[stairs_tile + i * size_x + j] = area_code
grid_walls[stairs_tile + i * size_x + j] |= FLAG_STAIRS
func remove_stairs_floor():
var stairs_w = small_stairs_w
var stairs_h = small_stairs_h
var stairs_grid_w = int((stairs_w + grid_size * 0.5) / grid_size)
var stairs_grid_h = int((stairs_h + grid_size * 0.5) / grid_size)
for i in range(stairs_grid_h):
for j in range(stairs_grid_w):
grid_walls[stairs_tile + i * size_x + j] &= ~FLAG_FLOOR
func clear_entry_door():
if enterance_tile < 0:
return
var point_flags = grid_walls[enterance_tile]
var flags = [
[FLAG_ENTRY_LEFT, FLAG_WALL_LEFT, FLAG_WINDOW_LEFT],
[FLAG_ENTRY_UP, FLAG_WALL_UP, FLAG_WINDOW_UP],
[FLAG_ENTRY_RIGHT, FLAG_WALL_RIGHT, FLAG_WINDOW_RIGHT],
[FLAG_ENTRY_DOWN, FLAG_WALL_DOWN, FLAG_WINDOW_DOWN]
]
var rflags = []
for p in flags:
if point_flags & p[0] != 0:
rflags.push_back(p)
for f in rflags:
point_flags &= ~f[0]
point_flags |= f[1]
grid_walls[enterance_tile] = point_flags
enterance_tile = -1
func create_windows(rnd, pwindow: float):
for tile in walls_tiles:
var point_flags = grid_walls[tile]
var flags = [
[1, 512],
[2, 1024],
[4, 2048],
[8, 4096]
]
var rflags = []
for p in flags:
if point_flags & p[0] != 0:
if rnd.randf() > 1.0 - pwindow:
rflags.push_back(p)
for f in rflags:
point_flags &= ~f[0]
point_flags |= f[1]
grid_walls[tile] = point_flags
func tile_distance(tile1: int, tile2: int):
var last_x = tile1 % size_x
var last_y = int(tile1 / size_x)
var cur_x = tile2 % size_x
var cur_y = int(tile2 / size_x)
var dst = Vector2(cur_x - last_x, cur_y - last_y).length()
return int(dst)
func init_areas():
for t in range(grid_walls.size()):
if grid_walls[t] & FLAG_FLOOR:
grid_areas[t] = 0x0
else:
grid_areas[t] = 0xffff
func create_areas(min_d: int = 4, start_code: int = 1) -> int:
var created_roots = []
var area_code: int = start_code
for t in [FLAG_ENTRY_MASK, FLAG_WINDOW_MASK]:
var p = walls_tiles.duplicate()
while p.size() > 0:
var tile = p.pop_front()
var point_flags = grid_walls[tile]
if point_flags & FLAG_STAIRS != 0:
continue
if (point_flags & t != 0):
if t == FLAG_ENTRY_MASK:
print("entry")
if created_roots.empty():
grid_areas[tile] = area_code
if t == FLAG_ENTRY_MASK:
enterance = area_code
area_code += 1
created_roots.push_back(tile)
else:
var mdst = 1000000000
for e in created_roots:
var dst = tile_distance(e, tile)
if mdst > dst:
mdst = dst
print(mdst)
if mdst >= min_d:
grid_areas[tile] = area_code
if t == FLAG_ENTRY_MASK:
enterance = area_code
area_code += 1
created_roots.push_back(tile)
assert(enterance != null)
return area_code
func grow_areas_left():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if x > 0:
var code_left = grid_areas[tile - 1]
if code_left == 0:
grid_areas[tile - 1] = code
count += 1
return false if count == 0 else true
func grow_areas_right():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if x < size_x - 1:
var code_right = grid_areas[tile + 1]
if code_right == 0:
grid_areas[tile + 1] = code
count += 1
return false if count == 0 else true
func grow_areas_up():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if y > 0:
var code_up = grid_areas[tile - size_x]
if code_up == 0:
grid_areas[tile - size_x] = code
count += 1
return false if count == 0 else true
func grow_areas_down():
var count = 0
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
if y < size_y - 1:
var code_down = grid_areas[tile + size_x]
if code_down == 0:
grid_areas[tile + size_x] = code
count += 1
print(grid_areas)
print(grid_walls)
return false if count == 0 else true
func add_adj(adj, ncode, ncode2, ntile, ntile2, adj_type):
print("add_adj ", ncode)
if adj.has(ncode):
if adj[ncode].has(ncode2):
adj[ncode][ncode2].push_back([ntile, ntile2, adj_type])
else:
adj[ncode][ncode2] = [[ntile, ntile2, adj_type]]
else:
adj[ncode] = {}
adj[ncode][ncode2] = [[ntile, ntile2, adj_type]]
func build_area_adj():
var adj = {}
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
print(tile, " ", code, " ", point_flags)
if x > 0:
var code_left = grid_areas[tile - 1]
if code_left != code && code_left != 0xffff:
add_adj(adj, code, code_left, tile, tile - 1, FLAG_DOOR_LEFT)
if x < size_x - 1:
var code_right = grid_areas[tile + 1]
if code_right != code && code_right != 0xffff:
add_adj(adj, code, code_right, tile, tile + 1, FLAG_DOOR_RIGHT)
if y > 0:
var code_up = grid_areas[tile - size_x]
if code_up != code && code_up != 0xffff:
add_adj(adj, code, code_up, tile, tile - size_x, FLAG_DOOR_UP)
if y < size_y - 1:
var code_down = grid_areas[tile + size_x]
if code_down != code && code_down != 0xffff:
add_adj(adj, code, code_down, tile, tile + size_x, FLAG_DOOR_DOWN)
assert(!adj.empty())
return adj
func build_area_walls():
for tile in range(grid_areas.size()):
var code = grid_areas[tile]
var point_flags = grid_walls[tile]
var old_point_flags = point_flags
if code == 0xffff:
continue
if (point_flags & FLAG_FLOOR) == 0:
continue
var x = tile % size_x
var y = int(tile / size_x)
var leftm = point_flags & FLAG_LEFT_MASK
var rightm = point_flags & FLAG_RIGHT_MASK
var upm = point_flags & FLAG_UP_MASK
var downm = point_flags & FLAG_DOWN_MASK
if (leftm == 0) && x > 0:
var left_code = grid_areas[tile - 1]
if code != left_code:
var left_flags = grid_walls[tile - 1]
if (point_flags & FLAG_LEFT_MASK == 0) && (left_flags & FLAG_RIGHT_MASK == 0):
point_flags |= FLAG_WALL_LEFT
if (rightm == 0) && x < size_x - 1:
var right_code = grid_areas[tile + 1]
if code != right_code:
var right_flags = grid_walls[tile + 1]
if (point_flags & FLAG_RIGHT_MASK == 0) && (right_flags & FLAG_LEFT_MASK == 0):
point_flags |= FLAG_WALL_RIGHT
if upm == 0 && y > 0:
var up_code = grid_areas[tile - size_x]
if code != up_code:
var up_flags = grid_walls[tile - size_x]
if (point_flags & FLAG_UP_MASK == 0) && (up_flags & FLAG_DOWN_MASK == 0):
point_flags |= FLAG_WALL_UP
if downm == 0 && y < size_y - 1:
var down_code = grid_areas[tile + size_x]
if code != down_code:
var down_flags = grid_walls[tile + size_x]
if (point_flags & FLAG_DOWN_MASK == 0) && (down_flags & FLAG_UP_MASK == 0):
point_flags |= FLAG_WALL_DOWN
# if old_point_flags != point_flags:
# print("point flags %04x" % (old_point_flags), " after %04x" % (point_flags))
grid_walls[tile] = point_flags
func make_door_graph():
var adj = build_area_adj()
var unreached = []
var reached = []
var pairs = {}
var spanning_tree = {}
for k in adj.keys():
for l in adj[k].keys():
if pairs.has(k):
if !l in pairs[k]:
pairs[k].push_back(l)
else:
pairs[k] = [l]
if !k in unreached:
unreached.push_back(k)
if !l in unreached:
unreached.push_back(l)
var vstart = enterance
reached.push_back(vstart)
unreached.erase(vstart)
while unreached.size() > 0:
var record = 100000
var rindex = -1
var uindex = -1
for ri in range(reached.size()):
for ui in range(unreached.size()):
var rval = reached[ri]
var dist = 1 if unreached[ui] in pairs[rval] else 10000
if dist < record:
record = dist
rindex = ri
uindex = ui
if uindex >= 0:
var rvalue = reached[rindex]
var uvalue = unreached[uindex]
if spanning_tree.has(rvalue):
if !uvalue in spanning_tree[rvalue]:
spanning_tree[rvalue].push_back(uvalue)
else:
spanning_tree[rvalue] = [uvalue]
reached.push_back(unreached[uindex])
unreached.remove(uindex)
else:
assert(false)
pairs = {}
for k in spanning_tree.keys():
for l in spanning_tree[k]:
if pairs.has(k):
pairs[k].push_back(l)
else:
pairs[k] = [l]
if pairs.has(l):
pairs[l].push_back(k)
else:
pairs[l] = [k]
var new_adj = {}
for k in adj.keys():
for l in adj[k].keys():
if pairs.has(k) && l in pairs[k]:
if !new_adj.has(k):
new_adj[k] = {}
new_adj[k][l] = adj[k][l]
print("new adj: ", new_adj)
return new_adj
func build_doors():
var adj = make_door_graph()
var queue = [enterance]
var seen = []
while queue.size() > 0:
var item = queue.pop_front()
if item in seen:
continue
seen.push_back(item)
for e in adj[item].keys():
var data = adj[item][e][0]
var tile = data[0]
var point_flags = grid_walls[tile]
var rtype = data[2]
match(rtype):
FLAG_DOOR_LEFT:
point_flags &= ~FLAG_LEFT_MASK
FLAG_DOOR_UP:
point_flags &= ~FLAG_UP_MASK
FLAG_DOOR_RIGHT:
point_flags &= ~FLAG_RIGHT_MASK
FLAG_DOOR_DOWN:
point_flags &= ~FLAG_DOWN_MASK
point_flags |= rtype
grid_walls[tile] = point_flags
if !e in seen:
queue.push_back(e)
func instance_wall(base: Spatial, what, p0, p1):
var obj = what.instance()
base.add_child(obj)
var v = p1 - p0
var xform = Transform().rotated(Vector3(0, 1, 0), -v.angle())
var p = p0 + v * 0.5
xform.origin = Vector3(p.x, 0, p.y)
obj.transform = xform
func display_walls(base: Spatial, objdata: Dictionary):
for y in range(size_y):
for x in range(size_x):
var point_flags = grid_walls[y * size_x + x]
var px = float(x) * grid_size + grid_rect.position.x - grid_size
var py = float(y) * grid_size + grid_rect.position.y - grid_size
var p0 = Vector2(px, py)
var p1 = Vector2(px + grid_size, py)
var p2 = Vector2(px + grid_size, py + grid_size)
var p3 = Vector2(px, py + grid_size)
var obje
var objects = {
FLAG_WALL_MASK: objdata.wall,
FLAG_ENTRY_MASK: objdata.entry,
FLAG_WINDOW_MASK: objdata.window,
FLAG_DOOR_MASK: objdata.door
}
for k in objects.keys():
if point_flags & k != 0:
obje = objects[k]
if point_flags & (k & FLAG_LEFT_MASK) != 0:
instance_wall(base, obje, p3, p0)
if point_flags & (k & FLAG_UP_MASK) != 0:
instance_wall(base, obje, p0, p1)
if point_flags & (k & FLAG_RIGHT_MASK) != 0:
instance_wall(base, obje, p1, p2)
if point_flags & (k & FLAG_DOWN_MASK) != 0:
instance_wall(base, obje, p2, p3)
if point_flags & FLAG_FLOOR != 0:
var fd = objdata.floor.instance()
base.add_child(fd)
var xform = Transform()
var p = p0
xform.origin = Vector3(p.x, 0, p.y)
fd.transform = xform
assert(stairs_pos != null)
if stairs_pos:
var fd = objdata.stairs.instance()
base.add_child(fd)
var xform = Transform()
var p = stairs_pos
xform.origin = Vector3(p.x, 0, p.y)
fd.transform = xform
func debug_contour():
$debug.begin(Mesh.PRIMITIVE_LINES)
for k in range(contour.size()):
var p1 = contour[k]
var p2 = contour[(k + 1) % contour.size()]
$debug.add_vertex(Vector3(p1.x, 3.0, p1.y))
$debug.add_vertex(Vector3(p2.x, 3.0, p2.y))
$debug.end()
#onready var building_floor = Floor.new()
var cur_pos: = Vector2()
func debug_walls(fl):
$debug.begin(Mesh.PRIMITIVE_LINES)
for y in range(fl.size_y):
for x in range(fl.size_x):
var gpos = fl.grid2pos(x, y)
var px = gpos.x
var py = gpos.y
var p0 = Vector2(px, py)
var p1 = Vector2(px + fl.grid_size, py)
var p2 = Vector2(px + fl.grid_size, py + fl.grid_size)
var p3 = Vector2(px, py + fl.grid_size)
$debug.add_vertex(Vector3(p0.x, 0.1, p0.y))
$debug.add_vertex(Vector3(p1.x, 0.1, p1.y))
$debug.add_vertex(Vector3(p1.x, 0.1, p1.y))
$debug.add_vertex(Vector3(p2.x, 0.1, p2.y))
$debug.add_vertex(Vector3(p2.x, 0.1, p2.y))
$debug.add_vertex(Vector3(p3.x, 0.1, p3.y))
$debug.add_vertex(Vector3(p3.x, 0.1, p3.y))
$debug.add_vertex(Vector3(p0.x, 0.1, p0.y))
$debug.end()
func _ready():
rnd = RandomNumberGenerator.new()
rnd.seed = OS.get_unix_time()
var state = 0
var objd = {
"wall": wall,
"window": window,
"door": door,
"floor": fl,
"entry": entry,
"stairs": stairs
}
var floors = []
var nfloors = 40
var floor_bases = []
var area_code = 1
func _process(delta):
match(state):
0:
for k in range(nfloors):
floors.push_back(Floor.new())
var b = Spatial.new()
add_child(b)
b.translation.y = 3.0 * float(k)
floor_bases.push_back(b)
floors[0].init_grid(contour)
floors[0].init_walls(contour)
floors[0].convert_walls()
floors[0].create_entry_door(rnd)
floors[0].create_windows(rnd, 0.6)
floors[0].init_areas()
floors[0].allocate_stairs(area_code)
area_code += 1
for k in range(0, nfloors, 1):
if k > 0:
floors[k] = floors[0].copy()
floors[k].clear_entry_door()
area_code = floors[k].create_areas(4, area_code)
state = 1
1:
var b1 = false
var b2 = false
var b3 = false
var b4 = false
for k in range(nfloors):
var tb1 = floors[k].grow_areas_left()
if tb1:
b1 = true
var tb2 = floors[k].grow_areas_up()
if tb2:
b2 = true
var tb3 = floors[k].grow_areas_right()
if tb3:
b3 = true
var tb4 = floors[k].grow_areas_down()
if tb4:
b4 = true
if !b1 && !b2 && !b3 && !b4:
state = 2
2:
for k in range(nfloors):
floors[k].build_doors()
floors[k].build_area_walls()
floors[k].remove_stairs_floor()
floors[k].display_walls(floor_bases[k], objd)
state = 3

19
proto3/godot/city/cam.gd Normal file
View File

@@ -0,0 +1,19 @@
extends Camera
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Input.is_action_pressed("walk_forward"):
global_translate(Vector3(0, 0, -1) * 10.0 * delta)
if Input.is_action_pressed("walk_back"):
global_translate(Vector3(0, 0, 1) * 10.0 * delta)

View File

@@ -0,0 +1,38 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://city/building.gd" type="Script" id=1]
[ext_resource path="res://city/cam.gd" type="Script" id=2]
[sub_resource type="SpatialMaterial" id=1]
albedo_color = Color( 0.180392, 0.737255, 0.490196, 1 )
[sub_resource type="PlaneMesh" id=2]
material = SubResource( 1 )
size = Vector2( 200, 200 )
[sub_resource type="SpatialMaterial" id=3]
flags_unshaded = true
flags_vertex_lighting = true
vertex_color_use_as_albedo = true
params_line_width = 3.0
params_point_size = 3.0
[node name="contour_building_gen" type="Spatial"]
[node name="cam" type="Camera" parent="."]
transform = Transform( 1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 10, 10 )
script = ExtResource( 2 )
[node name="MeshInstance" type="MeshInstance" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.843487, 0 )
mesh = SubResource( 2 )
material/0 = null
[node name="building" type="Spatial" parent="."]
script = ExtResource( 1 )
[node name="debug" type="ImmediateGeometry" parent="building"]
material_override = SubResource( 3 )
[node name="DirectionalLight" type="DirectionalLight" parent="."]
transform = Transform( 1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, 0, 20, 0 )

View File

@@ -0,0 +1,21 @@
extends Spatial
var graph = {
"entry": ["corridoor", "stairs"],
"corridoor": ["corridoor", "flat-door"]
}
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://city/spaces_building_gen.gd" type="Script" id=1]
[node name="spaces_building_gen" type="Spatial"]
script = ExtResource( 1 )

View File

@@ -0,0 +1,35 @@
extends Node2D
var graph = {
"entry": ["corridoor", "stairs"],
"corridoor": ["corridoor", "flat-door"]
}
var grid = []
var spaces = []
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var space_color = []
var xdim = 10
var ydim = 10
func _ready():
$Camera2D.current = true
grid.resize(10 * 10)
for e in graph.keys():
for k in [e] + graph[e]:
if !k in spaces:
spaces.push_back(k)
space_color.push_back(Color(randf(), randf(), randf(), 1))
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _draw():
draw_rect(Rect2(-10, -10, 20, 20), Color(1, 0, 0, 1))

View File

@@ -0,0 +1,8 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://city/spaces_building_gen_2d.gd" type="Script" id=1]
[node name="spaces_building_gen_2d" type="Node2D"]
script = ExtResource( 1 )
[node name="Camera2D" type="Camera2D" parent="."]

View File

@@ -217,7 +217,7 @@ grabbing="*res://autoloads/grabbing.gd"
global="*res://autoloads/global.gd"
rpg="*res://autoloads/rpg.gd"
combat="*res://autoloads/combat.gd"
phy_bones="*res://autoloads/phy_bones.gd"
quests="*res://autoloads/quests.gd"
[input]

View File

@@ -1,5 +1,11 @@
extends Spatial
var loading
func new_quest(q):
var title = q.get_title()
var desc = q.get_description()
print("title: ", title)
print("desc: ", desc)
func _ready():
loading = preload("res://ui/loading.tscn").instance()
get_tree().get_root().add_child(loading)
@@ -12,6 +18,9 @@ func _ready():
global.set_save_slot(0)
e = $dungeon.connect("prepared", self, "start_ai")
assert(e == OK)
e = quests.connect("new_quest", self, "new_quest")
assert(e == OK)
global.interior = $dungeon
var default_meta = {
"grabbing": false,
@@ -31,6 +40,14 @@ var player_meta = {
func start_ai():
print("prepared")
$"meta-ai".start()
global.interior = $dungeon
quests.activate()
func save():
global.save_characters()
$dungeon.save()
quests.save()
global.save_game()
func spawn_player(spawner):
print("spawned player")
@@ -50,6 +67,7 @@ func spawn_player(spawner):
player.set_meta("spawner", spawner)
player.add_to_group("player")
$cam_target/cam_rot/offset/Camera.current = true
global.start_time()
func spawn_npc(spawner):
var npc
var g
@@ -221,3 +239,5 @@ func _process(delta):
$cam_target.rotate_y(-angle * delta)
else:
cam_fixup_cooldown -= delta
if Input.is_action_just_pressed("save_game"):
save()

View File

@@ -13,27 +13,30 @@ var room = preload("res://scenes/maps/interior2.tscn")
var bed = preload("res://scenes/furniture/bed.tscn")
var table_chairs = preload("res://scenes/furniture/table_chairs.tscn")
var closet = preload("res://scenes/furniture/closet.tscn")
var size_x = 4
var size_y = 5
var floors = 5
var size_x = 2
var size_y = 2
var floors = 2
var w = 10
var h = 8
var dungeon = []
var dungeon_save = {}
var spawn_save = {}
var prepared = false
var map = []
var exit_doors = []
var stairs_x = 0
var stairs_y = 0
func save():
global.save_characters()
for k in range(dungeon.size()):
dungeon[k].save()
dungeon_save[str(k)] = dungeon[k].save_data
global.save_data.dungeon = dungeon_save
global.save_game()
var window_rooms = []
var doors = {}
func build_rooms():
print("build_rooms")
var stairs_x = randi() % size_x
var stairs_y = randi() % size_y
stairs_x = randi() % size_x
stairs_y = randi() % size_y
for k in range(floors):
var cur_x = stairs_x
@@ -43,38 +46,23 @@ func build_rooms():
var visited = []
while cur_room:
var choice = randi() % 4
match(choice):
0:
if cur_x > 0:
cur_room.open_path(cur_room.OPEN_LEFT)
cur_x -= 1
1:
if cur_x < size_x - 1:
cur_room.open_path(cur_room.OPEN_RIGHT)
cur_x += 1
2:
if cur_y > 0:
cur_room.open_path(cur_room.OPEN_UP)
cur_y -= 1
3:
if cur_y < size_y - 1:
cur_room.open_path(cur_room.OPEN_DOWN)
cur_y += 1
if !cur_room in visited:
visited.push_back(cur_room)
cur_room = dungeon[k * size_x * size_y + cur_y * size_x + cur_x]
match(choice):
0:
cur_room.open_path(cur_room.OPEN_RIGHT)
1:
cur_room.open_path(cur_room.OPEN_LEFT)
2:
cur_room.open_path(cur_room.OPEN_DOWN)
3:
cur_room.open_path(cur_room.OPEN_UP)
# print(cur_x, " ", cur_y)
if visited.size() == size_x * size_y:
break
var sel = [cur_room.OPEN_LEFT, cur_room.OPEN_RIGHT, cur_room.OPEN_UP, cur_room.OPEN_DOWN]
var rsel = [cur_room.OPEN_RIGHT, cur_room.OPEN_LEFT, cur_room.OPEN_DOWN, cur_room.OPEN_UP]
var selx = [-1, 1, 0, 0]
var sely = [0, 0, -1, 1]
var nx = cur_x + selx[choice]
var ny = cur_y + sely[choice]
if nx >= 0 && nx < size_x && ny >= 0 && ny < size_y:
cur_room.open_path(sel[choice])
if !cur_room in visited:
visited.push_back(cur_room)
var old_room = cur_room
cur_x = nx
cur_y = ny
cur_room = dungeon[k * size_x * size_y + cur_y * size_x + cur_x]
cur_room.open_path(rsel[choice])
if visited.size() == size_x * size_y:
break
print("base rooms done")
for fl in range(floors):
for k in range(size_x):
@@ -91,11 +79,41 @@ func build_rooms():
dungeon[right].open_window(dungeon[right].OPEN_RIGHT)
window_rooms.push_back(left)
window_rooms.push_back(right)
func build_exits():
var street_exits = []
while street_exits.size() == 0:
var fl = 0
for k in range(size_x):
var up = fl * size_x * size_y + k
var down = fl * size_x * size_y + (size_y - 1) * size_x + k
for h in [up, down]:
print(h)
if street_exits.size() < 1:
if dungeon[h].has_meta("master_room"):
continue
if randf() > 0.7:
var d = dungeon[h].OPEN_UP if h == up else dungeon[h].OPEN_DOWN
dungeon[h].outside_doors.push_back(d)
dungeon[h].set_meta("exit_room", true)
print("exit room: ", h)
street_exits.push_back(h)
for k in range(size_y):
var left = fl * size_x * size_y + k * size_x
var right = fl * size_x * size_y + k * size_x + size_x - 1
for h in [left, right]:
print(h)
if street_exits.size() < 1:
if dungeon[h].has_meta("master_room"):
continue
if randf() > 0.7:
var d = dungeon[h].OPEN_LEFT if h == left else dungeon[h].OPEN_RIGHT
dungeon[h].outside_doors.push_back(d)
dungeon[h].set_meta("exit_room", true)
print("exit room: ", h)
street_exits.push_back(h)
print("rooms build complete")
var special_rooms = {
"exit_room": {
"alloc": size_x * size_y
},
"master_room": {
"alloc": floors * size_x * size_y
},
@@ -108,6 +126,10 @@ var special_rooms = {
}
func alloc_special_rooms():
var allocated = []
for e in range(floors):
var id = e * size_x * size_y + stairs_y * size_x + stairs_x
allocated.push_back(id)
dungeon[id].set_meta("stairs", e)
for k in special_rooms.keys():
if special_rooms[k].has("id"):
allocated.push_back(special_rooms[k].id)
@@ -128,8 +150,6 @@ func alloc_special_rooms():
dungeon[room_id].add_child(player_spawn)
player_spawn.name = "player-spawn"
player_spawn.add_to_group("spawn")
if k == "exit_room":
print("exit room: ", room_id)
func build_special_rooms():
print("build_special_rooms")
@@ -144,9 +164,12 @@ var dungeon_ids = []
func _process(_delta):
match(state):
0:
global.save_data.dungeon_seed = OS.get_unix_time()
global.load_game()
seed(global.save_data.dungeon_seed)
if global.save_data.has("dungeon"):
dungeon_save = global.save_data.dungeon
seed(global.save_data.dungeon_seed)
state = 1
1:
dungeon.resize(floors * size_x * size_y)
@@ -162,21 +185,30 @@ func _process(_delta):
if dungeon_save.empty():
state = 20
else:
state = 30
state = 40
20:
print("build rooms")
build_rooms()
state = 21
21:
print("build special rooms")
build_special_rooms()
state = 22
22:
state = 31
31:
print("build exits")
build_exits()
state = 32
32:
print("build room nodes")
for r in dungeon:
r.create_rooms()
state = 23
23:
exit_doors = get_tree().get_nodes_in_group("exit_door")
state = 33
33:
print("spawn furniture")
furniture_nodes = get_tree().get_nodes_in_group("furniture")
state = 24
24:
state = 34
34:
if furniture_nodes.size() > 0:
var k = furniture_nodes.pop_front()
if k.name.begins_with("fc"):
@@ -198,22 +230,19 @@ func _process(_delta):
k.rotate_y(randf() * PI / 24.0)
else:
save()
state = 40
30:
state = 50
40:
dungeon_ids = range(dungeon.size())
state = 31
31:
state = 41
41:
if dungeon_ids.size() > 0:
var k = dungeon_ids.pop_front()
dungeon[k].save_data = dungeon_save[str(k)]
dungeon[k].restore()
else:
state = 40
40:
state = 50
50:
print("loaded")
state = 50
state = 60
prepared = true
emit_signal("prepared")
_:
if Input.is_action_just_pressed("save_game"):
save()

View File

@@ -0,0 +1,140 @@
[gd_scene load_steps=1 format=2]
[sub_resource id=1 type="Shader"]
resource_name = "Shader Nodetree"
code = "shader_type spatial;
render_mode blend_mix, depth_draw_always, cull_back, diffuse_burley, specular_schlick_ggx;
void node_bsdf_principled(vec4 color, float subsurface, vec4 subsurface_color,
float metallic, float specular, float roughness, float clearcoat,
float clearcoat_roughness, float anisotropy, float transmission,
float IOR, out vec3 albedo, out float sss_strength_out,
out float metallic_out, out float specular_out,
out float roughness_out, out float clearcoat_out,
out float clearcoat_gloss_out, out float anisotropy_out,
out float transmission_out, out float ior) {
metallic = clamp(metallic, 0.0, 1.0);
transmission = clamp(transmission, 0.0, 1.0);
subsurface = subsurface * (1.0 - metallic);
albedo = mix(color.rgb, subsurface_color.rgb, subsurface);
sss_strength_out = subsurface;
metallic_out = metallic;
specular_out = pow((IOR - 1.0)/(IOR + 1.0), 2)/0.08;
roughness_out = roughness;
clearcoat_out = clearcoat * (1.0 - transmission);
clearcoat_gloss_out = 1.0 - clearcoat_roughness;
anisotropy_out = clamp(anisotropy, 0.0, 1.0);
transmission_out = (1.0 - transmission) * (1.0 - metallic);
ior = IOR;
}
void vertex () {
}
void fragment () {
// node: 'Principled BSDF'
// type: 'ShaderNodeBsdfPrincipled'
// input sockets handling
vec4 node0_in0_basecolor = vec4(0.06881529837846756, 0.005524288397282362,
0.003115540137514472, 1.0);
float node0_in1_subsurface = float(0.0);
vec3 node0_in2_subsurfaceradius = vec3(1.0, 0.20000000298023224,
0.10000000149011612);
vec4 node0_in3_subsurfacecolor = vec4(0.800000011920929, 0.800000011920929,
0.800000011920929, 1.0);
float node0_in4_metallic = float(0.0);
float node0_in5_specular = float(0.5);
float node0_in6_speculartint = float(0.0);
float node0_in7_roughness = float(0.4000000059604645);
float node0_in8_anisotropic = float(0.0);
float node0_in9_anisotropicrotation = float(0.0);
float node0_in10_sheen = float(0.0);
float node0_in11_sheentint = float(0.5);
float node0_in12_clearcoat = float(0.0);
float node0_in13_clearcoatroughness = float(0.029999999329447746);
float node0_in14_ior = float(1.4500000476837158);
float node0_in15_transmission = float(0.0);
float node0_in16_transmissionroughness = float(0.0);
vec4 node0_in17_emission = vec4(0.0, 0.0, 0.0, 1.0);
float node0_in18_alpha = float(1.0);
vec3 node0_in19_normal = NORMAL;
vec3 node0_in20_clearcoatnormal = vec3(0.0, 0.0, 0.0);
vec3 node0_in21_tangent = TANGENT;
// output sockets definitions
vec3 node0_bsdf_out0_albedo;
float node0_bsdf_out1_sss_strength;
float node0_bsdf_out3_specular;
float node0_bsdf_out2_metallic;
float node0_bsdf_out4_roughness;
float node0_bsdf_out5_clearcoat;
float node0_bsdf_out6_clearcoat_gloss;
float node0_bsdf_out7_anisotropy;
float node0_bsdf_out8_transmission;
float node0_bsdf_out9_ior;
node_bsdf_principled(node0_in0_basecolor, node0_in1_subsurface,
node0_in3_subsurfacecolor, node0_in4_metallic, node0_in5_specular,
node0_in7_roughness, node0_in12_clearcoat, node0_in13_clearcoatroughness,
node0_in8_anisotropic, node0_in15_transmission, node0_in14_ior,
node0_bsdf_out0_albedo, node0_bsdf_out1_sss_strength, node0_bsdf_out2_metallic,
node0_bsdf_out3_specular, node0_bsdf_out4_roughness, node0_bsdf_out5_clearcoat,
node0_bsdf_out6_clearcoat_gloss, node0_bsdf_out7_anisotropy,
node0_bsdf_out8_transmission, node0_bsdf_out9_ior);
ALBEDO = node0_bsdf_out0_albedo;
SSS_STRENGTH = node0_bsdf_out1_sss_strength;
SPECULAR = node0_bsdf_out3_specular;
METALLIC = node0_bsdf_out2_metallic;
ROUGHNESS = node0_bsdf_out4_roughness;
CLEARCOAT = node0_bsdf_out5_clearcoat;
CLEARCOAT_GLOSS = node0_bsdf_out6_clearcoat_gloss;
NORMAL = node0_in19_normal;
// uncomment it when you need it
// TRANSMISSION = vec3(1.0, 1.0, 1.0) * node0_bsdf_out8_transmission;
// uncomment it when you are modifing TANGENT
// TANGENT = normalize(cross(cross(node0_in21_tangent, NORMAL), NORMAL));
// BINORMAL = cross(TANGENT, NORMAL);
// uncomment it when you have tangent(UV) set
// ANISOTROPY = node0_bsdf_out7_anisotropy;
}
"
[sub_resource id=2 type="ShaderMaterial"]
resource_name = ""
shader = SubResource(1)
[sub_resource id=3 type="ArrayMesh"]
resource_name = "floor"
surfaces/0 = {
"material":SubResource(2),
"primitive":4,
"arrays":[
Vector3Array(1.99, 2.23517e-08, 0.01, 0.01, 2.23517e-08, 1.99, 0.01, 2.23517e-08, 0.01, 0.0, -0.19, 1.99, 0.0, -0.00999998, 0.01, 0.0, -0.00999998, 1.99, 1.99, -0.19, 2.0, 0.01, -0.00999998, 2.0, 1.99, -0.00999998, 2.0, 0.01, -0.2, 0.01, 1.99, -0.2, 1.99, 1.99, -0.2, 0.01, 2.0, -0.19, 0.01, 2.0, -0.00999998, 1.99, 2.0, -0.00999998, 0.01, 1.99, -0.19, 0.0, 1.99, -0.2, 0.01, 2.0, -0.19, 0.01, 1.99, 2.23517e-08, 0.01, 1.99, -0.00999998, 0.0, 2.0, -0.00999998, 0.01, 2.0, -0.19, 1.99, 1.99, -0.2, 1.99, 1.99, -0.19, 2.0, 2.0, -0.00999998, 1.99, 1.99, -0.00999998, 2.0, 1.99, 2.23517e-08, 1.99, 0.01, -0.19, 0.0, 0.0, -0.19, 0.01, 0.01, -0.2, 0.01, 0.0, -0.00999998, 0.01, 0.01, -0.00999998, 0.0, 0.01, 2.23517e-08, 0.01, 0.0, -0.19, 1.99, 0.01, -0.19, 2.0, 0.01, -0.2, 1.99, 0.01, 2.23517e-08, 1.99, 0.01, -0.00999998, 2.0, 0.0, -0.00999998, 1.99, 0.01, 2.23517e-08, 1.99, 0.0, -0.00999998, 0.01, 0.01, 2.23517e-08, 0.01, 0.01, 2.23517e-08, 0.01, 1.99, -0.00999998, 0.0, 1.99, 2.23517e-08, 0.01, 2.0, -0.00999998, 0.01, 1.99, -0.19, 0.0, 2.0, -0.19, 0.01, 0.01, -0.19, 2.0, 0.0, -0.00999998, 1.99, 0.01, -0.00999998, 2.0, 1.99, -0.00999998, 2.0, 2.0, -0.19, 1.99, 1.99, -0.19, 2.0, 0.01, -0.00999998, 0.0, 0.0, -0.19, 0.01, 0.01, -0.19, 0.0, 0.01, -0.2, 1.99, 1.99, -0.19, 2.0, 1.99, -0.2, 1.99, 1.99, -0.2, 1.99, 2.0, -0.19, 0.01, 1.99, -0.2, 0.01, 1.99, 2.23517e-08, 1.99, 0.01, -0.00999998, 2.0, 0.01, 2.23517e-08, 1.99, 0.01, -0.2, 0.01, 0.0, -0.19, 1.99, 0.01, -0.2, 1.99, 1.99, -0.2, 0.01, 0.01, -0.19, 0.0, 0.01, -0.2, 0.01, 1.99, 2.23517e-08, 0.01, 2.0, -0.00999998, 1.99, 1.99, 2.23517e-08, 1.99, 0.01, -0.19, 0.0, 1.99, -0.00999998, 0.0, 0.01, -0.00999998, 0.0, 1.99, 2.23517e-08, 1.99, 0.0, -0.19, 0.01, 0.01, -0.19, 2.0, 0.01, -0.2, 1.99, 2.0, -0.19, 1.99, 0.0, -0.00999998, 1.99, 0.01, -0.00999998, 0.0, 2.0, -0.00999998, 0.01, 1.99, -0.00999998, 0.0, 1.99, -0.19, 0.0, 0.01, -0.19, 2.0, 0.0, -0.19, 1.99, 0.0, -0.00999998, 1.99, 1.99, -0.00999998, 2.0, 2.0, -0.00999998, 1.99, 2.0, -0.19, 1.99, 0.01, -0.00999998, 0.0, 0.0, -0.00999998, 0.01, 0.0, -0.19, 0.01, 0.01, -0.2, 1.99, 0.01, -0.19, 2.0, 1.99, -0.19, 2.0, 1.99, -0.2, 1.99, 2.0, -0.19, 1.99, 2.0, -0.19, 0.01, 1.99, 2.23517e-08, 1.99, 1.99, -0.00999998, 2.0, 0.01, -0.00999998, 2.0, 0.01, -0.2, 0.01, 0.0, -0.19, 0.01, 0.0, -0.19, 1.99, 1.99, -0.19, 0.0, 2.0, -0.00999998, 0.01, 1.99, -0.19, 0.0),
Vector3Array(0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -0.577356, 0.577353, 0.577342, -0.577356, 0.577353, 0.577342, -0.577356, 0.577353, 0.577342, -0.577354, -0.577354, 0.577343, -0.577354, -0.577354, 0.577343, -0.577354, -0.577354, 0.577343, -0.577351, 0.577361, -0.577339, -0.577351, 0.577361, -0.577339, -0.577351, 0.577361, -0.577339, -0.577351, -0.577361, -0.577339, -0.577351, -0.577361, -0.577339, -0.577351, -0.577361, -0.577339, 0.577351, 0.57735, 0.57735, 0.577351, 0.57735, 0.57735, 0.577351, 0.57735, 0.57735, 0.57735, -0.57735, 0.57735, 0.57735, -0.57735, 0.57735, 0.57735, -0.57735, 0.57735, 0.577354, 0.577342, -0.577354, 0.577354, 0.577342, -0.577354, 0.577354, 0.577342, -0.577354, 0.577354, -0.577343, -0.577354, 0.577354, -0.577343, -0.577354, 0.577354, -0.577343, -0.577354, 0.707107, -0.707107, 0.0, 0.707107, -0.707107, 0.0, 0.707107, -0.707107, 0.0, 0.0, -0.707107, 0.707107, 0.0, -0.707107, 0.707107, 0.0, -0.707107, 0.707107, -0.707107, 0.0, 0.707107, -0.707107, 0.0, 0.707107, -0.707107, 0.0, 0.707107, 0.707106, 0.0, -0.707107, 0.707106, 0.0, -0.707107, 0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, 0.707107, 0.0, 0.707107, 0.707107, 0.0, 0.707107, 0.707107, 0.0, 0.707107, 0.0, 0.707101, -0.707112, 0.0, 0.707101, -0.707112, 0.0, 0.707101, -0.707112, -0.707106, 0.707107, 0.0, -0.707106, 0.707107, 0.0, -0.707106, 0.707107, 0.0, 0.0, -0.707102, -0.707112, 0.0, -0.707102, -0.707112, 0.0, -0.707102, -0.707112, 0.707106, 0.707108, 0.0, 0.707106, 0.707108, 0.0, 0.707106, 0.707108, 0.0, 0.0, 0.707107, 0.707107, 0.0, 0.707107, 0.707107, 0.0, 0.707107, 0.707107, -0.707107, -0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, -0.707106, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.707107, -0.707107, 0.0, 0.0, -0.707107, 0.707107, -0.707107, 0.0, 0.707107, -0.707107, 0.0, 0.707107, -0.707107, 0.0, 0.707107, 0.707106, 0.0, -0.707107, 0.707106, 0.0, -0.707107, 0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, -0.707106, 0.0, -0.707107, 0.707107, 0.0, 0.707107, 0.707107, 0.0, 0.707107, 0.707107, 0.0, 0.707107, 0.0, 0.70711, -0.707104, 0.0, 0.70711, -0.707104, 0.0, 0.70711, -0.707104, -0.707108, 0.707105, 0.0, -0.707108, 0.707105, 0.0, -0.707108, 0.707105, 0.0, 0.0, -0.70711, -0.707103, 0.0, -0.70711, -0.707103, 0.0, -0.70711, -0.707103, 0.707108, 0.707106, 0.0, 0.707108, 0.707106, 0.0, 0.707108, 0.707106, 0.0, 0.0, 0.707107, 0.707107, -0.707107, -0.707106, 0.0, 0.0, 0.0, 1.0),
FloatArray(-1.49949e-07, 0.0, 1.0, 1.0, -1.49949e-07, 0.0, 1.0, 1.0, -1.2163e-07, 0.0, 1.0, 1.0, 0.0, -1.0, -2.82773e-07, 1.0, 0.0, -1.0, -1.73203e-08, 1.0, 0.0, -1.0, -3.00093e-07, 1.0, 4.87539e-09, -1.0, 0.0, 1.0, 2.98626e-10, -1.0, 0.0, 1.0, 5.17401e-09, -1.0, 0.0, 1.0, -6.08149e-08, 0.0, -1.0, 1.0, -6.08149e-08, 0.0, -1.0, 1.0, -1.2163e-07, 0.0, -1.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 4.59712e-06, 0.707102, -0.707111, 1.0, 4.59712e-06, 0.707102, -0.707111, 1.0, 4.59712e-06, 0.707102, -0.707111, 1.0, -4.60837e-06, 0.707102, 0.707111, 1.0, -4.60837e-06, 0.707102, 0.707111, 1.0, -4.60837e-06, 0.707102, 0.707111, 1.0, -0.70711, -0.707103, -4.21548e-06, 1.0, -0.70711, -0.707103, -4.21548e-06, 1.0, -0.70711, -0.707103, -4.21548e-06, 1.0, 0.707111, -0.707103, 4.43916e-06, 1.0, 0.707111, -0.707103, 4.43916e-06, 1.0, 0.707111, -0.707103, 4.43916e-06, 1.0, -8.44653e-06, 0.707111, -0.707102, 1.0, -8.44653e-06, 0.707111, -0.707102, 1.0, -8.44653e-06, 0.707111, -0.707102, 1.0, -0.707103, -0.707111, -8.42933e-06, 1.0, -0.707103, -0.707111, -8.42933e-06, 1.0, -0.707103, -0.707111, -8.42933e-06, 1.0, 0.707102, -0.707112, 4.68611e-06, 1.0, 0.707102, -0.707112, 4.68611e-06, 1.0, 0.707102, -0.707112, 4.68611e-06, 1.0, -3.90413e-06, -0.707116, 0.707098, 1.0, -3.90413e-06, -0.707116, 0.707098, 1.0, -3.90413e-06, -0.707116, 0.707098, 1.0, -1.20532e-07, -1.20532e-07, 1.0, 1.0, -1.20416e-07, -1.20416e-07, 1.0, 1.0, -1.20415e-07, -1.20415e-07, 1.0, 1.0, 8.39109e-06, 0.707107, 0.707107, 1.0, 3.82867e-08, 0.707107, 0.707107, 1.0, 0.0, 0.707107, 0.707107, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 5.17402e-09, -1.0, -5.17401e-09, 1.0, 5.17402e-09, -1.0, -5.17401e-09, 1.0, 5.17402e-09, -1.0, -5.17401e-09, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, -0.707112, -0.707101, 1.0, 0.0, -0.707112, -0.707101, 1.0, 0.0, -0.707112, -0.707101, 1.0, -1.20414e-07, -1.20413e-07, -1.0, 1.0, -1.20414e-07, -1.20413e-07, -1.0, 1.0, -1.20414e-07, -1.20413e-07, -1.0, 1.0, -8.51452e-06, -0.707112, 0.707102, 1.0, -8.51452e-06, -0.707112, 0.707102, 1.0, -8.51452e-06, -0.707112, 0.707102, 1.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0, -1.0, 1.0, -7.73467e-08, 0.707107, -0.707107, 1.0, -1.69517e-05, 0.707107, -0.707107, 1.0, -1.7029e-05, 0.707107, -0.707107, 1.0, -1.7859e-07, 1.7859e-07, 1.0, 1.0, -1.7827e-07, 1.7827e-07, 1.0, 1.0, -1.78268e-07, 1.78268e-07, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, -1.78268e-07, 0.0, 1.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, -1.0, 1.0, 0.0, -1.0, 0.0, 1.0, -1.20533e-07, -1.20533e-07, 1.0, 1.0, 8.42937e-06, 0.707107, 0.707107, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, -0.707104, -0.70711, 1.0, 0.0, -0.707104, -0.70711, 1.0, 0.0, -0.707104, -0.70711, 1.0, -1.20347e-07, -1.20348e-07, -1.0, 1.0, -1.20347e-07, -1.20348e-07, -1.0, 1.0, -1.20347e-07, -1.20348e-07, -1.0, 1.0, -1.97563e-07, -0.707103, 0.70711, 1.0, -1.97563e-07, -0.707103, 0.70711, 1.0, -1.97563e-07, -0.707103, 0.70711, 1.0, -1.20534e-07, 1.20534e-07, -1.0, 1.0, -1.20534e-07, 1.20534e-07, -1.0, 1.0, -1.20534e-07, 1.20534e-07, -1.0, 1.0, 0.0, 0.707107, -0.707107, 1.0, -1.78592e-07, 1.78592e-07, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0),
null, ; no Vertex Colors,
Vector2Array(0.00357143, 0.9975, 0.710714, 0.5025, 0.00357151, 0.5025, 0.782143, 0.9975, 0.717857, 0.5025, 0.717857, 0.9975, 0.853571, 0.9975, 0.789286, 0.5025, 0.789286, 0.9975, 0.710714, 0.0025, 0.00357142, 0.4975, 0.710714, 0.4975, 0.996429, 0.9975, 0.932143, 0.5025, 0.932143, 0.9975, 0.860714, 0.9975, 0.857143, 0.9975, 0.860714, 1.0, 0.00357143, 0.9975, 4.25747e-10, 0.9975, 0.00357142, 1.0, 0.996429, 0.5025, 1.0, 0.5025, 0.996429, 0.5, 0.932143, 0.5025, 0.932143, 0.5, 0.928572, 0.5025, 0.860714, 0.5025, 0.860714, 0.5, 0.857143, 0.5025, 0.717857, 0.5025, 0.717857, 0.5, 0.714286, 0.5025, 0.782143, 0.9975, 0.782143, 1.0, 0.785714, 0.9975, 0.710714, 0.5025, 0.714285, 0.5025, 0.710714, 0.5, 0.710714, 0.5025, 0.00357151, 0.5, 0.00357151, 0.5025, 0.00357151, 0.5025, 4.25747e-10, 0.9975, 0.00357143, 0.9975, 0.932143, 0.9975, 0.996429, 1.0, 0.996429, 0.9975, 0.853571, 0.5025, 0.789286, 0.5, 0.789286, 0.5025, 0.789286, 0.9975, 0.853571, 1.0, 0.853571, 0.9975, 0.925, 0.5025, 0.860714, 0.5, 0.860714, 0.5025, 0.00357154, 0.0025, 5.81859e-10, 0.4975, 0.00357142, 0.4975, 0.00357142, 0.4975, 0.710714, 0.5, 0.710714, 0.4975, 0.710714, 0.9975, 0.714285, 0.5025, 0.710714, 0.5025, 0.710714, 0.0025, 0.00357154, 0.0, 0.00357154, 0.0025, 0.710714, 0.4975, 0.714285, 0.00250006, 0.710714, 0.0025, 0.00357143, 0.9975, 0.710714, 1.0, 0.710714, 0.9975, 0.860714, 0.5025, 0.925, 0.9975, 0.925, 0.5025, 0.710714, 0.9975, 0.782143, 0.5025, 0.853571, 0.5025, 0.00357154, 0.0025, 0.996429, 0.5025, 0.710714, 0.5, 8.47237e-08, 0.5025, 0.932143, 0.9975, 0.932143, 1.0, 0.996429, 1.0, 0.853571, 0.5025, 0.853571, 0.5, 0.789286, 0.5, 0.789286, 0.9975, 0.789286, 1.0, 0.853571, 1.0, 0.925, 0.5025, 0.925, 0.5, 0.860714, 0.5, 0.00357154, 0.0025, 1.1579e-07, 0.0025, 5.81859e-10, 0.4975, 0.00357142, 0.4975, 0.00357142, 0.5, 0.710714, 0.5, 0.710714, 0.9975, 0.714285, 0.9975, 0.714285, 0.5025, 0.710714, 0.0025, 0.710714, 5.96046e-08, 0.00357154, 0.0, 0.714285, 0.4975, 0.00357142, 1.0, 0.860714, 0.9975),
null, ; No UV2,
null, ; No Bones,
null, ; No Weights,
IntArray(0, 2, 1, 3, 5, 4, 6, 8, 7, 9, 11, 10, 12, 14, 13, 15, 17, 16, 18, 20, 19, 21, 23, 22, 24, 26, 25, 27, 29, 28, 30, 32, 31, 33, 35, 34, 36, 38, 37, 39, 41, 40, 42, 44, 43, 45, 47, 46, 48, 50, 49, 51, 53, 52, 54, 56, 55, 57, 59, 58, 60, 62, 61, 63, 65, 64, 66, 68, 67, 69, 71, 70, 72, 74, 73, 75, 77, 76, 0, 1, 78, 3, 4, 79, 6, 7, 80, 9, 10, 81, 12, 13, 82, 39, 40, 83, 42, 43, 84, 85, 87, 86, 88, 90, 89, 91, 93, 92, 94, 96, 95, 97, 99, 98, 100, 102, 101, 103, 105, 104, 106, 108, 107, 69, 70, 109, 72, 73, 110, 75, 76, 111)
],
"morph_arrays":[]
}
[node type="Spatial" name="Scene"]
[node name="floor-col" type="MeshInstance" parent="."]
mesh = SubResource(3)
visible = true
transform = Transform(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0)

File diff suppressed because it is too large Load Diff

View File

@@ -9,11 +9,12 @@ const BITLEFT = (1 << 2)
const BITRIGHT = (1 << 3)
var exits = []
var windows = []
var outside_doors = []
var door = preload("res://scenes/maps/door.tscn")
var jail_door = preload("res://scenes/maps/jail-door.tscn")
var window = preload("res://scenes/maps/window.tscn")
var outside_door = preload("res://scenes/maps/window.tscn")
var outside_door = preload("res://scenes/maps/door-outside.tscn")
var stairs = preload("res://scenes/maps/stairs.tscn")
var outside_door_placed = false
var tw2d
@@ -127,31 +128,46 @@ func _ready():
te2d = $c_modular/e2d.transform
tn2d = $c_modular/n2d.transform
ts2d = $c_modular/s2d.transform
var open_paths = {
OPEN_UP: {
"rm_walls": ["n2d", "iw4d"],
"rm": ["fc4"],
"bit": BITUP
},
OPEN_DOWN: {
"rm_walls": ["s2d", "iw11d"],
"rm": ["fc5"],
"bit": BITDOWN
},
OPEN_LEFT: {
"rm_walls": ["w2d", "iw17d"],
"rm": ["fc2"],
"bit": BITLEFT
},
OPEN_RIGHT: {
"rm_walls": ["e2d", "iw22d"],
"rm": ["fc3"],
"bit": BITRIGHT
},
}
func open_path(flag):
if flag == OPEN_UP:
$c_modular/n2d.queue_free()
$c_modular/iw4d.queue_free()
$fc4.queue_free()
bitflags |= BITUP
elif flag == OPEN_DOWN:
$c_modular/s2d.queue_free()
$c_modular/iw11d.queue_free()
$fc5.queue_free()
bitflags |= BITDOWN
elif flag == OPEN_LEFT:
$c_modular/w2d.queue_free()
$c_modular/iw17d.queue_free()
$fc2.queue_free()
bitflags |= BITLEFT
elif flag == OPEN_RIGHT:
$c_modular/e2d.queue_free()
$c_modular/iw22d.queue_free()
$fc3.queue_free()
bitflags |= BITRIGHT
if !flag in exits:
if exits.size() == 1 && !has_meta("master_room"):
$fc1.queue_free()
var kf = open_paths[flag]
bitflags |= kf.bit
exits.push_back(flag)
for e in kf.rm:
if get_node(e):
get_node(e).queue_free()
func create_paths():
for flag in exits:
var kf = open_paths[flag]
for e in kf.rm_walls:
$c_modular.get_node(e).queue_free()
for e in kf.rm:
if get_node(e):
get_node(e).queue_free()
if exits.size() == 1 && !has_meta("master_room"):
$fc1.queue_free()
func open_window(flag):
if !flag in windows:
windows.push_back(flag)
@@ -202,46 +218,85 @@ func master_room():
func wall2door(n):
var door_xform = n.transform
var door_i
for e in get_tree().get_nodes_in_group("door"):
var xpos = e.global_transform.origin
var ypos = n.global_transform.origin
if xpos.distance_to(ypos) < 1.3:
n.queue_free()
return
if has_meta("jail_room"):
door_i = jail_door.instance()
else:
door_i = door.instance()
add_child(door_i)
door_i.transform = door_xform
door_i.add_to_group("door")
n.queue_free()
func exit_door(n):
var xn = n.name
var exit_door_xform = n.transform
var xdoor_i = outside_door.instance()
add_child(xdoor_i)
xdoor_i.transform = exit_door_xform
xdoor_i.name = xn
n.queue_free()
xdoor_i.add_to_group("exit_door")
func wall2window(n):
var window_xform = n.transform
var xn = n.name
var window_i
# if has_meta("jail_room"):
# window_i = jail_window.instance()
# else:
# window_i = door.instance()
if has_meta("exit_room") && !outside_door_placed:
window_i = outside_door.instance()
outside_door_placed = true
else:
window_i = window.instance()
window_i = window.instance()
add_child(window_i)
window_i.name = xn
window_i.transform = window_xform
n.queue_free()
var bitdata = {
BITLEFT: {
"doors": ["iw17d"],
"path_remove": ["path_west"],
"nodes_remove": ["iw1", "iw2d", "iw3", "iw8", "iw9d", "iw10"]
},
BITRIGHT: {
"doors": ["iw22d"],
"path_remove": ["path_east"],
"nodes_remove": ["iw5", "iw6d", "iw7", "iw12", "iw13d", "iw14"]
},
BITUP: {
"doors": [],
"path_remove": ["path_north"],
"nodes_remove": ["iw15", "iw16d", "iw23d", "iw24"]
},
BITDOWN: {
"doors": [],
"path_remove": ["path_south"],
"nodes_remove": ["iw18d", "iw19", "iw20", "iw21d"]
}
}
var master_metas = ["master_room", "kitchen_room", "exit_room", "stairs"]
func create_rooms():
if has_meta("master_room"):
assert(exits.size() > 0)
create_paths()
var is_master_room = false
for m in master_metas:
if has_meta(m):
is_master_room = true
if is_master_room:
master_room()
elif has_meta("kitchen_room"):
master_room()
elif has_meta("exit_room"):
for e in get_children():
if e.is_in_group("furniture"):
e.queue_free()
elif has_meta("stairs"):
master_room()
var stairs_i = stairs.instance()
add_child(stairs_i)
for e in get_children():
if e.is_in_group("furniture"):
e.queue_free()
if get_meta("stairs") > 0:
$c_modular/floor.queue_free()
if has_meta("exit_room"):
assert(windows.size() > 0)
for e in get_children():
if e.is_in_group("furniture"):
e.queue_free()
if has_meta("stairs"):
var stairs_i = stairs.instance()
add_child(stairs_i)
for e in get_children():
if e.is_in_group("furniture"):
e.queue_free()
if get_meta("stairs") > 0:
$c_modular/floor.queue_free()
elif exits.size() == 1:
personal_room()
elif exits.size() == 4:
@@ -250,49 +305,26 @@ func create_rooms():
wall2door($c_modular/iw9d)
wall2door($c_modular/iw13d)
else:
if bitflags & BITLEFT == 0:
$c_modular/iw1.queue_free()
$c_modular/iw2d.queue_free()
$c_modular/iw3.queue_free()
$c_modular/iw8.queue_free()
$c_modular/iw9d.queue_free()
$c_modular/iw10.queue_free()
wall2door($c_modular/iw17d)
$path_west.queue_free()
if bitflags & BITRIGHT == 0:
$c_modular/iw5.queue_free()
$c_modular/iw6d.queue_free()
$c_modular/iw7.queue_free()
$c_modular/iw12.queue_free()
$c_modular/iw13d.queue_free()
$c_modular/iw14.queue_free()
wall2door($c_modular/iw22d)
$path_east.queue_free()
if bitflags & BITUP == 0:
$c_modular/iw15.queue_free()
$c_modular/iw16d.queue_free()
$c_modular/iw23d.queue_free()
$c_modular/iw24.queue_free()
$path_north.queue_free()
if bitflags & BITDOWN == 0:
$c_modular/iw18d.queue_free()
$c_modular/iw19.queue_free()
$c_modular/iw20.queue_free()
$c_modular/iw21d.queue_free()
$path_south.queue_free()
if OPEN_LEFT in windows:
wall2window($c_modular/w1)
wall2window($c_modular/w2d)
wall2window($c_modular/w3)
if OPEN_DOWN in windows:
wall2window($c_modular/s1)
wall2window($c_modular/s2d)
wall2window($c_modular/s3)
if OPEN_RIGHT in windows:
wall2window($c_modular/e1)
wall2window($c_modular/e2d)
wall2window($c_modular/e3)
if OPEN_UP in windows:
wall2window($c_modular/n1)
wall2window($c_modular/n2d)
wall2window($c_modular/n3)
for e in [BITLEFT, BITRIGHT, BITUP, BITDOWN]:
if bitflags & e == 0:
for g in bitdata[e].doors:
wall2door($c_modular.get_node(g))
for g in bitdata[e].path_remove:
get_node(g).queue_free()
for g in bitdata[e].nodes_remove:
$c_modular.get_node(g).queue_free()
var external = {
OPEN_LEFT: ["w1", "w2d", "w3"],
OPEN_DOWN: ["s1", "s2d", "s3"],
OPEN_RIGHT: ["e1", "e2d", "e3"],
OPEN_UP: ["n1", "n2d", "n3"]
}
for p in windows:
for q in external[p]:
var n = $c_modular.get_node(q)
if !p in outside_doors:
wall2window(n)
for p in outside_doors:
var q = external[p][1]
var n = $c_modular.get_node(q)
exit_door(n)

View File

@@ -57,7 +57,9 @@ _data = {
"tilts": PoolRealArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
}
[node name="interior2" instance=ExtResource( 1 )]
[node name="interior2" groups=[
"room",
] instance=ExtResource( 1 )]
script = ExtResource( 2 )
[node name="path_west" type="Path" parent="." index="1" groups=[

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,22 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=5 format=2]
[ext_resource path="res://scenes/maps/stairs.escn" type="PackedScene" id=1]
[sub_resource type="BoxShape" id=1]
extents = Vector3( 1.13086, 0.0458848, 0.64188 )
[sub_resource type="Curve3D" id=2]
_data = {
"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, -3.40015, 0.239252, 1.85913, 0, 0, 0, 0, 0, 0, -1.97383, 0.257656, 1.88403, 0, 0, 0, 0, 0, 0, -1.45852, 0.423293, 1.90918, 0, 0, 0, 0, 0, 0, -0.13343, 1.49073, 1.93433, 0, 0, 0, 0, 0, 0, 0.24645, 1.77444, 1.93433, 0, 0, 0, 0, 0, 0, 1.75415, 1.76855, 1.87302, 0, 0, 0, 0, 0, 0, 1.66716, 1.85563, 0.244141, 0, 0, 0, 0, 0, 0, 1.66137, 1.75269, -0.562487, 0, 0, 0, 0, 0, 0, 1.65557, 1.76514, -1.72805, 0, 0, 0, 0, 0, 0, 0.974322, 1.71509, -1.75141, 0, 0, 0, 0, 0, 0, 0.287957, 2.12817, -1.72775, 0, 0, 0, 0, 0, 0, -0.201176, 2.55396, -1.71986, 0, 0, 0, 0, 0, 0, -0.666642, 3.04525, -1.72119, 0, 0, 0, 0, 0, 0, -1.27411, 3.41605, -1.72168, 0, 0, 0, 0, 0, 0, -2.65473, 3.40816, -1.73389 ),
"tilts": PoolRealArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
}
[sub_resource type="Curve3D" id=3]
_data = {
"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, -4.5026, 0.332731, -0.0107422, 0, 0, 0, 0, 0, 0, -3.99813, 0.375664, -0.0107422, 0, 0, 0, 0, 0, 0, -4.07327, 0.375664, -1.81396, 0, 0, 0, 0, 0, 0, -4.084, 0.36493, -2.81201, 0, 0, 0, 0, 0, 0, -3.81567, 0.375664, -3.27344, 0, 0, 0, 0, 0, 0, -1.64755, 0.343464, -3.28418, 0, 0, 0, 0, 0, 0, -0.520562, 0.407863, -3.32715, 0, 0, 0, 0, 0, 0, 0.101966, 0.482996, -3.68164, 0, 0, 0, 0, 0, 0, 0.917692, 0.440063, -3.30566, 0, 0, 0, 0, 0, 0, 1.86222, 0.504463, -3.27344, 0, 0, 0, 0, 0, 0, 3.33267, 0.547396, -3.30566, 0, 0, 0, 0, 0, 0, 3.7298, 0.504463, -3.31641, 0, 0, 0, 0, 0, 0, 3.62247, 0.515196, -2.55469, 0, 0, 0, 0, 0, 0, 3.65467, 0.568862, -1.3418, 0, 0, 0, 0, 0, 0, 3.93373, 0.622528, -0.665527, 0, 0, 0, 0, 0, 0, 4.245, 0.547396, -0.236328, 0, 0, 0, 0, 0, 0, 4.55626, 0.547396, -0.0429688, 0, 0, 0, 0, 0, 0, 4.406, 0.558129, 0.0751953, 0, 0, 0, 0, 0, 0, 4.0518, 0.525929, 1.0625, 0, 0, 0, 0, 0, 0, 3.8586, 0.504463, 2.66187, 0, 0, 0, 0, 0, 0, 3.5688, 0.504463, 3.14478, 0, 0, 0, 0, 0, 0, 2.17348, 0.515196, 3.06982, 0, 0, 0, 0, 0, 0, 0.552762, 0.407863, 3.00537, 0, 0, 0, 0, 0, 0, 0.316631, 0.42933, 3.55273, 0, 0, 0, 0, 0, 0, -0.252232, 0.42933, 2.94092, 0, 0, 0, 0, 0, 0, -1.29336, 0.375664, 2.9624, 0, 0, 0, 0, 0, 0, -3.28974, 0.386397, 3.01611, 0, 0, 0, 0, 0, 0, -3.9552, 0.418597, 2.95166, 0, 0, 0, 0, 0, 0, -4.16987, 0.354197, 2.52222, 0, 0, 0, 0, 0, 0, -4.3416, 0.375664, 1.42749, 0, 0, 0, 0, 0, 0, -4.2128, 0.289798, 0.493652 ),
"tilts": PoolRealArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
}
[node name="stairs" instance=ExtResource( 1 )]
[node name="StaticBody" type="StaticBody" parent="." index="4"]
@@ -16,3 +28,18 @@ shape = SubResource( 1 )
[node name="CollisionShape2" type="CollisionShape" parent="StaticBody" index="1"]
transform = Transform( -0.768529, 0.639815, -3.25444e-07, 0.639815, 0.768529, 1.60706e-08, 2.60396e-07, -1.95874e-07, -1, -0.0615042, 2.2555, -1.95211 )
shape = SubResource( 1 )
[node name="Path" type="Path" parent="." index="5" groups=[
"path",
]]
curve = SubResource( 2 )
[node name="Path2" type="Path" parent="." index="6" groups=[
"path",
]]
curve = SubResource( 3 )
[node name="Path3" type="Path" parent="." index="7" groups=[
"path",
]]
curve = SubResource( 3 )

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -15,6 +15,7 @@ func start():
func _ready():
astar = AStar.new()
global.astar = astar
func calc_visible_lists():
for g in get_tree().get_nodes_in_group("npc"):

View File

@@ -1,92 +0,0 @@
extends Reference
class_name Quest
signal complete
signal failed
signal started
var _objectives = []
var _children = []
var _title: String
var _description: String
var _active: bool = false
var _complete: bool = false
var _next_quest: Quest
func _init(title: String, description: String):
_title = title
_description = description
func add_child(quest: Quest):
_children.push_back(quest)
func is_complete():
return _complete
func is_active():
return _active
func update():
if !_active:
return
# var m = get_meta("quest")
# if m != null:
# for k in _objectives:
# k.set_meta("quest", m)
for k in _objectives:
k.update()
for k in _children:
k.update()
_complete = true
for k in _objectives:
if !k.is_complete():
_complete = false
break
if !_complete:
print("quest: ", _title, " objectives incomplete")
return
for k in _children:
if !k.is_complete():
_complete = false
break
if !_complete:
print("quest: ", _title, " children incomplete")
if _complete:
emit_signal("complete", self)
_active = false
quest_complete()
func quest_complete_handler(quest: Quest):
var next = quest.get_next_quest()
if next != null:
add_child(next)
next.connect("complete", self, "quest_complete_handler")
next.start()
func start():
_active = true
for k in _children:
k.connect("complete", self, "quest_complete_handler")
k.start()
emit_signal("started", self)
print("children: ", _children)
print("quest: ", _title, " started")
func get_cur_task_text():
var ret: String = "No current task"
if _active:
for p in _children:
if p.is_active():
ret = p.get_cur_task_text()
return ret
for p in _objectives:
if !p.is_complete():
return get_title() + ": " + p.get_title()
return _title
return ret
func get_title():
return _title
func get_description():
return _description
func quest_complete():
print("quest: ", _title, " complete")
func add_objective(obj: QuestObjective):
if !obj in _objectives:
_objectives.push_back(obj)
func remove_objective(obj: QuestObjective):
if obj in _objectives:
_objectives.erase(obj)
func set_next_quest(obj: Quest):
_next_quest = obj
func get_next_quest() -> Quest:
return _next_quest

View File

@@ -1,14 +0,0 @@
extends Reference
class_name QuestObjective
var _complete: bool = false
var _title: String
func _init(title: String):
_title = title
func is_complete():
return _complete
func update():
pass
func get_title():
return _title

View File

@@ -1,29 +0,0 @@
extends Quest
class_name StatsQuest
var stat_check: Dictionary
class StatsCheckObjective extends QuestObjective:
var stat_check: Dictionary
func _init(title, stats: Dictionary).(title):
stat_check = stats
func update():
_complete = true
for k in stat_check.keys():
match(k):
"player_count":
if world.team.keys().size() < stat_check[k]:
_complete = false
print("player count: ", world.team.keys().size(), " < ", stat_check[k])
"cheerleader_count":
if world.cheer_team.keys().size() < stat_check[k]:
_complete = false
"team_train_count":
if world.team_train_count < stat_check[k]:
_complete = false
_:
_complete = false
func _init(title, desc, stats: Dictionary).(title, desc):
stat_check = stats
add_objective(StatsCheckObjective.new("Comply to team stats", stat_check))

View File

@@ -1,61 +0,0 @@
extends Quest
class_name WalkQuest
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var destination: Spatial
var quest_marker: Spatial
class WalkQuestObjective extends QuestObjective:
var dest: Spatial
var arrow: Spatial
var nav: Navigation
func _init(title, destination: Spatial).(title):
dest = destination
arrow = world.arrow
nav = world.arrow.get_node("/root/main/nav")
func update():
var org = world.master_node.global_transform.origin
var orgc = nav.get_closest_point(org)
var dst = dest.global_transform.origin
var dstc = nav.get_closest_point(dst)
var path = nav.get_simple_path(orgc, dstc)
var arrow_dir : = Vector3()
if path.size() > 1:
for e in path:
if (e - org).length() > 1.0:
arrow_dir = e - org
break
if arrow_dir.length() == 0 && arrow.visible:
arrow.hide()
elif arrow_dir.length() > 0:
if !arrow.visible:
arrow.show()
arrow_dir.y = 0
arrow.look_at(arrow.global_transform.origin + arrow_dir, Vector3.UP)
if org.distance_to(dest.global_transform.origin) < 2.5:
_complete = true
arrow.hide()
func _init(title, desc, dest).(title, desc):
destination = dest
add_objective(WalkQuestObjective.new("Walk to destination", dest))
func update():
.update()
func start():
.start()
quest_marker = load("res://markers/quest_marker.tscn").instance()
world.master_node.get_node("/root/main").add_child(quest_marker)
quest_marker.global_transform.origin = destination.global_transform.origin
print("destination: ", quest_marker.global_transform.origin)
if world.arrow:
world.arrow.show()
func quest_complete():
.quest_complete()
quest_marker.queue_free()
if world.arrow:
world.arrow.hide()

View File

@@ -0,0 +1,35 @@
extends Node2D
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var target: = Vector3()
var rect: = Rect2()
func _ready():
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
var pos = get_viewport().get_camera().unproject_position(target)
rect = get_viewport_rect()
rect = rect.grow(-8.0)
if get_viewport().get_camera().is_position_behind(target):
if visible:
hide()
else:
if rect.has_point(pos):
if !visible:
show()
else:
pos.x = clamp(pos.x, rect.position.x, rect.position.x + rect.size.x)
pos.y = clamp(pos.y, rect.position.y, rect.position.y + rect.size.y)
if position.distance_squared_to(pos) < 480.0:
position = position.linear_interpolate(pos, delta)
else:
position = pos

View File

@@ -0,0 +1,10 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://ui/textures/minimapIcon_exclamationRed.png" type="Texture" id=1]
[ext_resource path="res://ui/quest_indicator.gd" type="Script" id=2]
[node name="quest_indicator" type="Node2D"]
script = ExtResource( 2 )
[node name="Sprite" type="Sprite" parent="."]
texture = ExtResource( 1 )