Compare commits
8 Commits
7706ba0edf
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d6f2fc79b | ||
|
|
72452dcb4c | ||
|
|
585a9bdae1 | ||
|
|
153878d792 | ||
|
|
b7a9e2e0b2 | ||
|
|
4e3135559f | ||
|
|
32c5212209 | ||
|
|
078cc47b91 |
@@ -1,11 +1,54 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
signal new_day
|
||||||
|
|
||||||
var raycasts_count = 100
|
var raycasts_count = 100
|
||||||
var raycast_queue = []
|
var raycast_queue = []
|
||||||
|
var astar: AStar
|
||||||
|
|
||||||
|
var interior
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
set_save_slot(0)
|
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):
|
func visibility_check(ch1, ch2):
|
||||||
var direction: Vector3 = -ch1.global_transform.basis[2].normalized()
|
var direction: Vector3 = -ch1.global_transform.basis[2].normalized()
|
||||||
var to_ch2: Vector3 = (ch2.global_transform.origin - ch1.global_transform.origin).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)
|
spawner.set_meta("stats", stats)
|
||||||
|
|
||||||
func save_game():
|
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)
|
assert(save_slot.length() > 0)
|
||||||
var fd = File.new()
|
var fd = File.new()
|
||||||
fd.open(save_slot, File.WRITE)
|
fd.open(save_slot, File.WRITE)
|
||||||
@@ -51,4 +98,7 @@ func load_game():
|
|||||||
var data = fd.get_as_text()
|
var data = fd.get_as_text()
|
||||||
var parse: = JSON.parse(data)
|
var parse: = JSON.parse(data)
|
||||||
save_data = parse.result
|
save_data = parse.result
|
||||||
|
game_day = save_data.game_day
|
||||||
|
game_hour = save_data.game_hour
|
||||||
|
day_period = save_data.day_period
|
||||||
fd.close()
|
fd.close()
|
||||||
|
|||||||
@@ -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
|
|
||||||
235
proto3/godot/autoloads/quests.gd
Normal file
235
proto3/godot/autoloads/quests.gd
Normal 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()
|
||||||
|
|
||||||
22
proto3/godot/autoloads/world.gd
Normal file
22
proto3/godot/autoloads/world.gd
Normal 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"
|
||||||
|
}
|
||||||
|
|
||||||
817
proto3/godot/city/building.gd
Normal file
817
proto3/godot/city/building.gd
Normal 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
19
proto3/godot/city/cam.gd
Normal 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)
|
||||||
38
proto3/godot/city/contour_building_gen.tscn
Normal file
38
proto3/godot/city/contour_building_gen.tscn
Normal 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 )
|
||||||
21
proto3/godot/city/spaces_building_gen.gd
Normal file
21
proto3/godot/city/spaces_building_gen.gd
Normal 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
|
||||||
6
proto3/godot/city/spaces_building_gen.tscn
Normal file
6
proto3/godot/city/spaces_building_gen.tscn
Normal 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 )
|
||||||
35
proto3/godot/city/spaces_building_gen_2d.gd
Normal file
35
proto3/godot/city/spaces_building_gen_2d.gd
Normal 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))
|
||||||
8
proto3/godot/city/spaces_building_gen_2d.tscn
Normal file
8
proto3/godot/city/spaces_building_gen_2d.tscn
Normal 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="."]
|
||||||
@@ -217,7 +217,7 @@ grabbing="*res://autoloads/grabbing.gd"
|
|||||||
global="*res://autoloads/global.gd"
|
global="*res://autoloads/global.gd"
|
||||||
rpg="*res://autoloads/rpg.gd"
|
rpg="*res://autoloads/rpg.gd"
|
||||||
combat="*res://autoloads/combat.gd"
|
combat="*res://autoloads/combat.gd"
|
||||||
phy_bones="*res://autoloads/phy_bones.gd"
|
quests="*res://autoloads/quests.gd"
|
||||||
|
|
||||||
[input]
|
[input]
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
extends Spatial
|
extends Spatial
|
||||||
var loading
|
var loading
|
||||||
|
|
||||||
|
func new_quest(q):
|
||||||
|
var title = q.get_title()
|
||||||
|
var desc = q.get_description()
|
||||||
|
print("title: ", title)
|
||||||
|
print("desc: ", desc)
|
||||||
func _ready():
|
func _ready():
|
||||||
loading = preload("res://ui/loading.tscn").instance()
|
loading = preload("res://ui/loading.tscn").instance()
|
||||||
get_tree().get_root().add_child(loading)
|
get_tree().get_root().add_child(loading)
|
||||||
@@ -12,6 +18,9 @@ func _ready():
|
|||||||
global.set_save_slot(0)
|
global.set_save_slot(0)
|
||||||
e = $dungeon.connect("prepared", self, "start_ai")
|
e = $dungeon.connect("prepared", self, "start_ai")
|
||||||
assert(e == OK)
|
assert(e == OK)
|
||||||
|
e = quests.connect("new_quest", self, "new_quest")
|
||||||
|
assert(e == OK)
|
||||||
|
global.interior = $dungeon
|
||||||
|
|
||||||
var default_meta = {
|
var default_meta = {
|
||||||
"grabbing": false,
|
"grabbing": false,
|
||||||
@@ -31,6 +40,14 @@ var player_meta = {
|
|||||||
func start_ai():
|
func start_ai():
|
||||||
print("prepared")
|
print("prepared")
|
||||||
$"meta-ai".start()
|
$"meta-ai".start()
|
||||||
|
global.interior = $dungeon
|
||||||
|
quests.activate()
|
||||||
|
|
||||||
|
func save():
|
||||||
|
global.save_characters()
|
||||||
|
$dungeon.save()
|
||||||
|
quests.save()
|
||||||
|
global.save_game()
|
||||||
|
|
||||||
func spawn_player(spawner):
|
func spawn_player(spawner):
|
||||||
print("spawned player")
|
print("spawned player")
|
||||||
@@ -50,6 +67,7 @@ func spawn_player(spawner):
|
|||||||
player.set_meta("spawner", spawner)
|
player.set_meta("spawner", spawner)
|
||||||
player.add_to_group("player")
|
player.add_to_group("player")
|
||||||
$cam_target/cam_rot/offset/Camera.current = true
|
$cam_target/cam_rot/offset/Camera.current = true
|
||||||
|
global.start_time()
|
||||||
func spawn_npc(spawner):
|
func spawn_npc(spawner):
|
||||||
var npc
|
var npc
|
||||||
var g
|
var g
|
||||||
@@ -221,3 +239,5 @@ func _process(delta):
|
|||||||
$cam_target.rotate_y(-angle * delta)
|
$cam_target.rotate_y(-angle * delta)
|
||||||
else:
|
else:
|
||||||
cam_fixup_cooldown -= delta
|
cam_fixup_cooldown -= delta
|
||||||
|
if Input.is_action_just_pressed("save_game"):
|
||||||
|
save()
|
||||||
|
|||||||
@@ -13,27 +13,30 @@ var room = preload("res://scenes/maps/interior2.tscn")
|
|||||||
var bed = preload("res://scenes/furniture/bed.tscn")
|
var bed = preload("res://scenes/furniture/bed.tscn")
|
||||||
var table_chairs = preload("res://scenes/furniture/table_chairs.tscn")
|
var table_chairs = preload("res://scenes/furniture/table_chairs.tscn")
|
||||||
var closet = preload("res://scenes/furniture/closet.tscn")
|
var closet = preload("res://scenes/furniture/closet.tscn")
|
||||||
var size_x = 4
|
var size_x = 2
|
||||||
var size_y = 5
|
var size_y = 2
|
||||||
var floors = 5
|
var floors = 2
|
||||||
var w = 10
|
var w = 10
|
||||||
var h = 8
|
var h = 8
|
||||||
var dungeon = []
|
var dungeon = []
|
||||||
var dungeon_save = {}
|
var dungeon_save = {}
|
||||||
var spawn_save = {}
|
var spawn_save = {}
|
||||||
var prepared = false
|
var prepared = false
|
||||||
|
var map = []
|
||||||
|
var exit_doors = []
|
||||||
|
var stairs_x = 0
|
||||||
|
var stairs_y = 0
|
||||||
func save():
|
func save():
|
||||||
global.save_characters()
|
|
||||||
for k in range(dungeon.size()):
|
for k in range(dungeon.size()):
|
||||||
dungeon[k].save()
|
dungeon[k].save()
|
||||||
dungeon_save[str(k)] = dungeon[k].save_data
|
dungeon_save[str(k)] = dungeon[k].save_data
|
||||||
global.save_data.dungeon = dungeon_save
|
global.save_data.dungeon = dungeon_save
|
||||||
global.save_game()
|
|
||||||
var window_rooms = []
|
var window_rooms = []
|
||||||
|
var doors = {}
|
||||||
func build_rooms():
|
func build_rooms():
|
||||||
print("build_rooms")
|
print("build_rooms")
|
||||||
var stairs_x = randi() % size_x
|
stairs_x = randi() % size_x
|
||||||
var stairs_y = randi() % size_y
|
stairs_y = randi() % size_y
|
||||||
|
|
||||||
for k in range(floors):
|
for k in range(floors):
|
||||||
var cur_x = stairs_x
|
var cur_x = stairs_x
|
||||||
@@ -43,38 +46,23 @@ func build_rooms():
|
|||||||
var visited = []
|
var visited = []
|
||||||
while cur_room:
|
while cur_room:
|
||||||
var choice = randi() % 4
|
var choice = randi() % 4
|
||||||
match(choice):
|
var sel = [cur_room.OPEN_LEFT, cur_room.OPEN_RIGHT, cur_room.OPEN_UP, cur_room.OPEN_DOWN]
|
||||||
0:
|
var rsel = [cur_room.OPEN_RIGHT, cur_room.OPEN_LEFT, cur_room.OPEN_DOWN, cur_room.OPEN_UP]
|
||||||
if cur_x > 0:
|
var selx = [-1, 1, 0, 0]
|
||||||
cur_room.open_path(cur_room.OPEN_LEFT)
|
var sely = [0, 0, -1, 1]
|
||||||
cur_x -= 1
|
var nx = cur_x + selx[choice]
|
||||||
1:
|
var ny = cur_y + sely[choice]
|
||||||
if cur_x < size_x - 1:
|
if nx >= 0 && nx < size_x && ny >= 0 && ny < size_y:
|
||||||
cur_room.open_path(cur_room.OPEN_RIGHT)
|
cur_room.open_path(sel[choice])
|
||||||
cur_x += 1
|
if !cur_room in visited:
|
||||||
2:
|
visited.push_back(cur_room)
|
||||||
if cur_y > 0:
|
var old_room = cur_room
|
||||||
cur_room.open_path(cur_room.OPEN_UP)
|
cur_x = nx
|
||||||
cur_y -= 1
|
cur_y = ny
|
||||||
3:
|
cur_room = dungeon[k * size_x * size_y + cur_y * size_x + cur_x]
|
||||||
if cur_y < size_y - 1:
|
cur_room.open_path(rsel[choice])
|
||||||
cur_room.open_path(cur_room.OPEN_DOWN)
|
if visited.size() == size_x * size_y:
|
||||||
cur_y += 1
|
break
|
||||||
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
|
|
||||||
print("base rooms done")
|
print("base rooms done")
|
||||||
for fl in range(floors):
|
for fl in range(floors):
|
||||||
for k in range(size_x):
|
for k in range(size_x):
|
||||||
@@ -91,11 +79,41 @@ func build_rooms():
|
|||||||
dungeon[right].open_window(dungeon[right].OPEN_RIGHT)
|
dungeon[right].open_window(dungeon[right].OPEN_RIGHT)
|
||||||
window_rooms.push_back(left)
|
window_rooms.push_back(left)
|
||||||
window_rooms.push_back(right)
|
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")
|
print("rooms build complete")
|
||||||
var special_rooms = {
|
var special_rooms = {
|
||||||
"exit_room": {
|
|
||||||
"alloc": size_x * size_y
|
|
||||||
},
|
|
||||||
"master_room": {
|
"master_room": {
|
||||||
"alloc": floors * size_x * size_y
|
"alloc": floors * size_x * size_y
|
||||||
},
|
},
|
||||||
@@ -108,6 +126,10 @@ var special_rooms = {
|
|||||||
}
|
}
|
||||||
func alloc_special_rooms():
|
func alloc_special_rooms():
|
||||||
var allocated = []
|
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():
|
for k in special_rooms.keys():
|
||||||
if special_rooms[k].has("id"):
|
if special_rooms[k].has("id"):
|
||||||
allocated.push_back(special_rooms[k].id)
|
allocated.push_back(special_rooms[k].id)
|
||||||
@@ -128,8 +150,6 @@ func alloc_special_rooms():
|
|||||||
dungeon[room_id].add_child(player_spawn)
|
dungeon[room_id].add_child(player_spawn)
|
||||||
player_spawn.name = "player-spawn"
|
player_spawn.name = "player-spawn"
|
||||||
player_spawn.add_to_group("spawn")
|
player_spawn.add_to_group("spawn")
|
||||||
if k == "exit_room":
|
|
||||||
print("exit room: ", room_id)
|
|
||||||
|
|
||||||
func build_special_rooms():
|
func build_special_rooms():
|
||||||
print("build_special_rooms")
|
print("build_special_rooms")
|
||||||
@@ -144,9 +164,12 @@ var dungeon_ids = []
|
|||||||
func _process(_delta):
|
func _process(_delta):
|
||||||
match(state):
|
match(state):
|
||||||
0:
|
0:
|
||||||
|
global.save_data.dungeon_seed = OS.get_unix_time()
|
||||||
global.load_game()
|
global.load_game()
|
||||||
|
seed(global.save_data.dungeon_seed)
|
||||||
if global.save_data.has("dungeon"):
|
if global.save_data.has("dungeon"):
|
||||||
dungeon_save = global.save_data.dungeon
|
dungeon_save = global.save_data.dungeon
|
||||||
|
seed(global.save_data.dungeon_seed)
|
||||||
state = 1
|
state = 1
|
||||||
1:
|
1:
|
||||||
dungeon.resize(floors * size_x * size_y)
|
dungeon.resize(floors * size_x * size_y)
|
||||||
@@ -162,21 +185,30 @@ func _process(_delta):
|
|||||||
if dungeon_save.empty():
|
if dungeon_save.empty():
|
||||||
state = 20
|
state = 20
|
||||||
else:
|
else:
|
||||||
state = 30
|
state = 40
|
||||||
20:
|
20:
|
||||||
|
print("build rooms")
|
||||||
build_rooms()
|
build_rooms()
|
||||||
state = 21
|
state = 21
|
||||||
21:
|
21:
|
||||||
|
print("build special rooms")
|
||||||
build_special_rooms()
|
build_special_rooms()
|
||||||
state = 22
|
state = 31
|
||||||
22:
|
31:
|
||||||
|
print("build exits")
|
||||||
|
build_exits()
|
||||||
|
state = 32
|
||||||
|
32:
|
||||||
|
print("build room nodes")
|
||||||
for r in dungeon:
|
for r in dungeon:
|
||||||
r.create_rooms()
|
r.create_rooms()
|
||||||
state = 23
|
exit_doors = get_tree().get_nodes_in_group("exit_door")
|
||||||
23:
|
state = 33
|
||||||
|
33:
|
||||||
|
print("spawn furniture")
|
||||||
furniture_nodes = get_tree().get_nodes_in_group("furniture")
|
furniture_nodes = get_tree().get_nodes_in_group("furniture")
|
||||||
state = 24
|
state = 34
|
||||||
24:
|
34:
|
||||||
if furniture_nodes.size() > 0:
|
if furniture_nodes.size() > 0:
|
||||||
var k = furniture_nodes.pop_front()
|
var k = furniture_nodes.pop_front()
|
||||||
if k.name.begins_with("fc"):
|
if k.name.begins_with("fc"):
|
||||||
@@ -198,22 +230,19 @@ func _process(_delta):
|
|||||||
k.rotate_y(randf() * PI / 24.0)
|
k.rotate_y(randf() * PI / 24.0)
|
||||||
else:
|
else:
|
||||||
save()
|
save()
|
||||||
state = 40
|
state = 50
|
||||||
30:
|
40:
|
||||||
dungeon_ids = range(dungeon.size())
|
dungeon_ids = range(dungeon.size())
|
||||||
state = 31
|
state = 41
|
||||||
31:
|
41:
|
||||||
if dungeon_ids.size() > 0:
|
if dungeon_ids.size() > 0:
|
||||||
var k = dungeon_ids.pop_front()
|
var k = dungeon_ids.pop_front()
|
||||||
dungeon[k].save_data = dungeon_save[str(k)]
|
dungeon[k].save_data = dungeon_save[str(k)]
|
||||||
dungeon[k].restore()
|
dungeon[k].restore()
|
||||||
else:
|
else:
|
||||||
state = 40
|
state = 50
|
||||||
40:
|
50:
|
||||||
print("loaded")
|
print("loaded")
|
||||||
state = 50
|
state = 60
|
||||||
prepared = true
|
prepared = true
|
||||||
emit_signal("prepared")
|
emit_signal("prepared")
|
||||||
_:
|
|
||||||
if Input.is_action_just_pressed("save_game"):
|
|
||||||
save()
|
|
||||||
|
|||||||
140
proto3/godot/scenes/maps/floor.escn
Normal file
140
proto3/godot/scenes/maps/floor.escn
Normal 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)
|
||||||
1063
proto3/godot/scenes/maps/floor.escn.import
Normal file
1063
proto3/godot/scenes/maps/floor.escn.import
Normal file
File diff suppressed because it is too large
Load Diff
@@ -9,11 +9,12 @@ const BITLEFT = (1 << 2)
|
|||||||
const BITRIGHT = (1 << 3)
|
const BITRIGHT = (1 << 3)
|
||||||
var exits = []
|
var exits = []
|
||||||
var windows = []
|
var windows = []
|
||||||
|
var outside_doors = []
|
||||||
|
|
||||||
var door = preload("res://scenes/maps/door.tscn")
|
var door = preload("res://scenes/maps/door.tscn")
|
||||||
var jail_door = preload("res://scenes/maps/jail-door.tscn")
|
var jail_door = preload("res://scenes/maps/jail-door.tscn")
|
||||||
var window = preload("res://scenes/maps/window.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 stairs = preload("res://scenes/maps/stairs.tscn")
|
||||||
var outside_door_placed = false
|
var outside_door_placed = false
|
||||||
var tw2d
|
var tw2d
|
||||||
@@ -127,31 +128,46 @@ func _ready():
|
|||||||
te2d = $c_modular/e2d.transform
|
te2d = $c_modular/e2d.transform
|
||||||
tn2d = $c_modular/n2d.transform
|
tn2d = $c_modular/n2d.transform
|
||||||
ts2d = $c_modular/s2d.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):
|
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 !flag in exits:
|
||||||
if exits.size() == 1 && !has_meta("master_room"):
|
var kf = open_paths[flag]
|
||||||
$fc1.queue_free()
|
bitflags |= kf.bit
|
||||||
exits.push_back(flag)
|
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):
|
func open_window(flag):
|
||||||
if !flag in windows:
|
if !flag in windows:
|
||||||
windows.push_back(flag)
|
windows.push_back(flag)
|
||||||
@@ -202,46 +218,85 @@ func master_room():
|
|||||||
func wall2door(n):
|
func wall2door(n):
|
||||||
var door_xform = n.transform
|
var door_xform = n.transform
|
||||||
var door_i
|
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"):
|
if has_meta("jail_room"):
|
||||||
door_i = jail_door.instance()
|
door_i = jail_door.instance()
|
||||||
else:
|
else:
|
||||||
door_i = door.instance()
|
door_i = door.instance()
|
||||||
add_child(door_i)
|
add_child(door_i)
|
||||||
door_i.transform = door_xform
|
door_i.transform = door_xform
|
||||||
|
door_i.add_to_group("door")
|
||||||
n.queue_free()
|
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):
|
func wall2window(n):
|
||||||
var window_xform = n.transform
|
var window_xform = n.transform
|
||||||
|
var xn = n.name
|
||||||
var window_i
|
var window_i
|
||||||
# if has_meta("jail_room"):
|
window_i = window.instance()
|
||||||
# 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()
|
|
||||||
add_child(window_i)
|
add_child(window_i)
|
||||||
|
window_i.name = xn
|
||||||
window_i.transform = window_xform
|
window_i.transform = window_xform
|
||||||
n.queue_free()
|
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():
|
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()
|
master_room()
|
||||||
elif has_meta("kitchen_room"):
|
if has_meta("exit_room"):
|
||||||
master_room()
|
assert(windows.size() > 0)
|
||||||
elif has_meta("exit_room"):
|
for e in get_children():
|
||||||
for e in get_children():
|
if e.is_in_group("furniture"):
|
||||||
if e.is_in_group("furniture"):
|
e.queue_free()
|
||||||
e.queue_free()
|
if has_meta("stairs"):
|
||||||
elif has_meta("stairs"):
|
var stairs_i = stairs.instance()
|
||||||
master_room()
|
add_child(stairs_i)
|
||||||
var stairs_i = stairs.instance()
|
for e in get_children():
|
||||||
add_child(stairs_i)
|
if e.is_in_group("furniture"):
|
||||||
for e in get_children():
|
e.queue_free()
|
||||||
if e.is_in_group("furniture"):
|
if get_meta("stairs") > 0:
|
||||||
e.queue_free()
|
$c_modular/floor.queue_free()
|
||||||
if get_meta("stairs") > 0:
|
|
||||||
$c_modular/floor.queue_free()
|
|
||||||
elif exits.size() == 1:
|
elif exits.size() == 1:
|
||||||
personal_room()
|
personal_room()
|
||||||
elif exits.size() == 4:
|
elif exits.size() == 4:
|
||||||
@@ -250,49 +305,26 @@ func create_rooms():
|
|||||||
wall2door($c_modular/iw9d)
|
wall2door($c_modular/iw9d)
|
||||||
wall2door($c_modular/iw13d)
|
wall2door($c_modular/iw13d)
|
||||||
else:
|
else:
|
||||||
if bitflags & BITLEFT == 0:
|
for e in [BITLEFT, BITRIGHT, BITUP, BITDOWN]:
|
||||||
$c_modular/iw1.queue_free()
|
if bitflags & e == 0:
|
||||||
$c_modular/iw2d.queue_free()
|
for g in bitdata[e].doors:
|
||||||
$c_modular/iw3.queue_free()
|
wall2door($c_modular.get_node(g))
|
||||||
$c_modular/iw8.queue_free()
|
for g in bitdata[e].path_remove:
|
||||||
$c_modular/iw9d.queue_free()
|
get_node(g).queue_free()
|
||||||
$c_modular/iw10.queue_free()
|
for g in bitdata[e].nodes_remove:
|
||||||
wall2door($c_modular/iw17d)
|
$c_modular.get_node(g).queue_free()
|
||||||
$path_west.queue_free()
|
var external = {
|
||||||
if bitflags & BITRIGHT == 0:
|
OPEN_LEFT: ["w1", "w2d", "w3"],
|
||||||
$c_modular/iw5.queue_free()
|
OPEN_DOWN: ["s1", "s2d", "s3"],
|
||||||
$c_modular/iw6d.queue_free()
|
OPEN_RIGHT: ["e1", "e2d", "e3"],
|
||||||
$c_modular/iw7.queue_free()
|
OPEN_UP: ["n1", "n2d", "n3"]
|
||||||
$c_modular/iw12.queue_free()
|
}
|
||||||
$c_modular/iw13d.queue_free()
|
for p in windows:
|
||||||
$c_modular/iw14.queue_free()
|
for q in external[p]:
|
||||||
wall2door($c_modular/iw22d)
|
var n = $c_modular.get_node(q)
|
||||||
$path_east.queue_free()
|
if !p in outside_doors:
|
||||||
if bitflags & BITUP == 0:
|
wall2window(n)
|
||||||
$c_modular/iw15.queue_free()
|
for p in outside_doors:
|
||||||
$c_modular/iw16d.queue_free()
|
var q = external[p][1]
|
||||||
$c_modular/iw23d.queue_free()
|
var n = $c_modular.get_node(q)
|
||||||
$c_modular/iw24.queue_free()
|
exit_door(n)
|
||||||
$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)
|
|
||||||
|
|||||||
@@ -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 )
|
"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 )
|
script = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="path_west" type="Path" parent="." index="1" groups=[
|
[node name="path_west" type="Path" parent="." index="1" groups=[
|
||||||
|
|||||||
319
proto3/godot/scenes/maps/stairs-small.escn
Normal file
319
proto3/godot/scenes/maps/stairs-small.escn
Normal file
File diff suppressed because one or more lines are too long
1063
proto3/godot/scenes/maps/stairs-small.escn.import
Normal file
1063
proto3/godot/scenes/maps/stairs-small.escn.import
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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]
|
[ext_resource path="res://scenes/maps/stairs.escn" type="PackedScene" id=1]
|
||||||
|
|
||||||
[sub_resource type="BoxShape" id=1]
|
[sub_resource type="BoxShape" id=1]
|
||||||
extents = Vector3( 1.13086, 0.0458848, 0.64188 )
|
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="stairs" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
[node name="StaticBody" type="StaticBody" parent="." index="4"]
|
[node name="StaticBody" type="StaticBody" parent="." index="4"]
|
||||||
@@ -16,3 +28,18 @@ shape = SubResource( 1 )
|
|||||||
[node name="CollisionShape2" type="CollisionShape" parent="StaticBody" index="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 )
|
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 )
|
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 )
|
||||||
|
|||||||
140
proto3/godot/scenes/maps/wall.escn
Normal file
140
proto3/godot/scenes/maps/wall.escn
Normal file
File diff suppressed because one or more lines are too long
1063
proto3/godot/scenes/maps/wall.escn.import
Normal file
1063
proto3/godot/scenes/maps/wall.escn.import
Normal file
File diff suppressed because it is too large
Load Diff
@@ -15,6 +15,7 @@ func start():
|
|||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
astar = AStar.new()
|
astar = AStar.new()
|
||||||
|
global.astar = astar
|
||||||
|
|
||||||
func calc_visible_lists():
|
func calc_visible_lists():
|
||||||
for g in get_tree().get_nodes_in_group("npc"):
|
for g in get_tree().get_nodes_in_group("npc"):
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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))
|
|
||||||
@@ -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()
|
|
||||||
35
proto3/godot/ui/quest_indicator.gd
Normal file
35
proto3/godot/ui/quest_indicator.gd
Normal 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
|
||||||
|
|
||||||
10
proto3/godot/ui/quest_indicator.tscn
Normal file
10
proto3/godot/ui/quest_indicator.tscn
Normal 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 )
|
||||||
Reference in New Issue
Block a user