You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

869 lines
26 KiB
Plaintext

2 years ago
[gd_scene load_steps=13 format=3 uid="uid://dfbykrvyqnqr5"]
[ext_resource type="Script" path="res://addons/MetroidvaniaSystem/Database/MapEditor.gd" id="1_i7yda"]
[ext_resource type="Script" path="res://addons/MetroidvaniaSystem/Database/MapOverlay.gd" id="2_w1wnt"]
[sub_resource type="ButtonGroup" id="ButtonGroup_pv7fp"]
[sub_resource type="GDScript" id="GDScript_dsps8"]
resource_name = "RoomLayout"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/SubEditor.gd\"
var erase_mode: bool
func _editor_init() -> void:
room_only_cursor = false
func _update_theme():
theme_cache.cursor_color = get_theme_color(&\"cursor_color\", &\"MetSys\")
func _editor_input(event: InputEvent):
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed:
drag_from = get_cursor_pos()
else:
var rect := get_rect_between(drag_from, get_cursor_pos())
update_rooms(rect)
drag_from = EDITOR_SCRIPT.NULL_VECTOR2I
elif event.button_index == MOUSE_BUTTON_RIGHT:
if event.pressed:
drag_from = get_cursor_pos()
erase_mode = true
theme_cache.cursor_color = get_theme_color(&\"cursor_color_erase\", &\"MetSys\")
queue_redraw()
else:
var rect := get_rect_between(drag_from, get_cursor_pos())
erase_rooms(rect)
erase_mode = false
theme_cache.cursor_color = get_theme_color(&\"cursor_color\", &\"MetSys\")
drag_from = EDITOR_SCRIPT.NULL_VECTOR2I
func update_rooms(rect: Rect2i):
var map_data: MetroidvaniaSystem.MapData = MetSys.map_data
for x in range(rect.position.x, rect.end.x):
for y in range(rect.position.y, rect.end.y):
var coords := Vector3i(x, y, editor.current_layer)
var cell = map_data.get_cell_at(coords)
if cell:
remove_assign(coords)
if x != rect.end.x - 1:
cell.borders[0] = -1
if y != rect.end.y - 1:
cell.borders[1] = -1
if x != rect.position.x:
cell.borders[2] = -1
if y != rect.position.y:
cell.borders[3] = -1
else:
cell = map_data.create_cell_at(coords)
if x == rect.end.x - 1:
cell.borders[0] = 0
if y == rect.end.y - 1:
cell.borders[1] = 0
if x == rect.position.x:
cell.borders[2] = 0
if y == rect.position.y:
cell.borders[3] = 0
mark_modified()
editor.map.queue_redraw()
func erase_rooms(rect: Rect2i):
var map_data: MetroidvaniaSystem.MapData = MetSys.map_data
for x in range(rect.position.x, rect.end.x):
for y in range(rect.position.y, rect.end.y):
var coords := Vector3i(x, y, editor.current_layer)
var cell_data := map_data.get_cell_at(coords)
if not cell_data:
continue
if x == rect.end.x - 1:
close_border(Vector2i(x + 1, y), 2)
if y == rect.end.y - 1:
close_border(Vector2i(x, y + 1), 3)
if x == rect.position.x:
close_border(Vector2i(x - 1, y), 0)
if y == rect.position.y:
close_border(Vector2i(x, y - 1), 1)
map_data.erase_cell(coords)
mark_modified()
editor.map.queue_redraw()
func remove_assign(coords: Vector3i):
var assigned_scene: String = MetSys.map_data.cells[coords].assigned_scene
MetSys.map_data.assigned_scenes.erase(assigned_scene)
func close_border(pos: Vector2i, border: int):
var cell: MetroidvaniaSystem.MapData.CellData = MetSys.map_data.get_cell_at(get_coords(pos))
if cell:
cell.borders[border] = 0
"
[sub_resource type="GDScript" id="GDScript_tlx5u"]
resource_name = "CellColor"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/CellPaintEditor.gd\"
func _editor_init() -> void:
super()
can_pick = true
func _editor_enter():
super()
%Colors.show()
func _editor_exit():
super()
%Colors.hide()
func modify_cell(cell_data: MetroidvaniaSystem.MapData.CellData, mode: int) -> bool:
if mode == MODE_PICK:
if cell_data.color.a > 0:
%CurrentColor.color = cell_data.color
else:
var target_color := Color.TRANSPARENT
if mode == MODE_DRAW:
target_color = %CurrentColor.color
if cell_data.color != target_color:
cell_data.color = target_color
return true
return false
"
[sub_resource type="GDScript" id="GDScript_ujwfx"]
resource_name = "CellSymbol"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/CellPaintEditor.gd\"
var symbol_group: ButtonGroup
func _editor_init() -> void:
can_pick = true
super()
symbol_group = ButtonGroup.new()
reload_symbols()
MetSys.settings.theme_changed.connect(reload_symbols)
MetSys.theme_modified.connect(func(changes: Array[String]):
if \"symbols\" in changes:
reload_symbols())
func reload_symbols():
for symbol in %SymbolContainer.get_children():
symbol.free()
for symbol in MetSys.settings.theme.symbols:
add_symbol(symbol)
func _editor_enter():
super()
%Symbols.show()
func _editor_exit():
super()
%Symbols.hide()
func modify_cell(cell_data: MetroidvaniaSystem.MapData.CellData, mode: int) -> bool:
if mode == MODE_PICK:
if cell_data.symbol > -1:
symbol_group.get_buttons()[cell_data.symbol].button_pressed = true
return false
var target_symbol := -1
if mode == MODE_DRAW:
target_symbol = symbol_group.get_pressed_button().get_index()
if cell_data.symbol != target_symbol:
cell_data.symbol = target_symbol
return true
return false
func add_symbol(texture: Texture2D):
var button := Button.new()
button.icon = texture
button.toggle_mode = true
button.button_group = symbol_group
if not symbol_group.get_pressed_button():
button.button_pressed = true
%SymbolContainer.add_child(button)
"
[sub_resource type="GDScript" id="GDScript_a80ln"]
resource_name = "CellGroup"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/CellPaintEditor.gd\"
var cell_groups: Dictionary
var drawing: int
func _editor_init() -> void:
super()
room_only_cursor = true
cell_groups = MetSys.map_data.cell_groups
func _update_theme():
theme_cache.group_color = get_theme_color(&\"group_color\", &\"MetSys\")
func _editor_enter():
super()
%Groups.show()
func _editor_exit():
super()
%Groups.hide()
func _editor_draw(map_overlay: CanvasItem):
super(map_overlay)
for p in cell_groups.get(%CurrentGroup.value as int, []):
map_overlay.draw_rect(Rect2(Vector2(p.x, p.y) * MetSys.CELL_SIZE, MetSys.CELL_SIZE), theme_cache.group_color)
func modify_coords(coords: Vector3i, mode: int) -> bool:
var current_group: int = %CurrentGroup.value
if mode == MODE_DRAW:
if not current_group in cell_groups:
cell_groups[current_group] = []
if not coords in cell_groups[current_group]:
cell_groups[current_group].append(coords)
return true
else:
if coords in cell_groups[current_group]:
cell_groups[current_group].erase(coords)
return true
return false
func draw_group():
if drawing == 0:
return
var coords := get_coords(get_cursor_pos())
var current_group: int = %CurrentGroup.value
if drawing & MOUSE_BUTTON_MASK_LEFT != 0:
var cell_data: MetroidvaniaSystem.MapData.CellData = MetSys.map_data.get_cell_at(coords)
if not cell_data:
return
if not current_group in cell_groups:
cell_groups[current_group] = []
if not coords in cell_groups[current_group]:
cell_groups[current_group].append(coords)
mark_modified()
editor.map_overlay.queue_redraw()
elif drawing & MOUSE_BUTTON_MASK_RIGHT != 0:
if not current_group in cell_groups:
return
var cell_data: MetroidvaniaSystem.MapData.CellData = MetSys.map_data.get_cell_at(coords)
if not cell_data:
return
cell_groups[current_group].erase(coords)
mark_modified()
editor.map_overlay.queue_redraw()
"
[sub_resource type="GDScript" id="GDScript_ilxbw"]
resource_name = "BorderType"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/BorderPaintEditor.gd\"
var border_group: ButtonGroup
func _editor_init() -> void:
use_cursor = false
can_pick = true
super()
border_group = ButtonGroup.new()
reload_borders()
MetSys.settings.theme_changed.connect(reload_borders)
MetSys.theme_modified.connect(func(changes: Array[String]):
if \"borders\" in changes or \"vertical_borders\" or \"vertical_borders\" in changes:
reload_borders())
func reload_borders():
for symbol in %BorderContainer.get_children():
symbol.free()
if MetSys.settings.theme.rectangle:
add_border(MetSys.settings.theme.vertical_wall)
add_border(MetSys.settings.theme.vertical_passage)
for border in MetSys.settings.theme.vertical_borders:
add_border(border)
else:
add_border(MetSys.settings.theme.wall)
add_border(MetSys.settings.theme.passage)
for border in MetSys.settings.theme.borders:
add_border(border)
func _editor_enter():
super()
%Borders.show()
func _editor_exit():
super()
%Borders.hide()
func modify_border(cell_data: MetroidvaniaSystem.MapData.CellData, border: int, mode: int) -> bool:
if cell_data.borders[border] == -1:
return false
if mode == MODE_PICK:
border_group.get_buttons()[cell_data.borders[border]].button_pressed = true
else:
var target_border := 0
if mode == MODE_DRAW:
target_border = border_group.get_pressed_button().get_index()
if cell_data.borders[border] != target_border:
cell_data.borders[border] = target_border
return true
return false
func add_border(texture: Texture2D):
var button := Button.new()
button.icon = texture
button.toggle_mode = true
button.button_group = border_group
button.custom_minimum_size.x = MetSys.CELL_SIZE.x
button.icon_alignment = HORIZONTAL_ALIGNMENT_RIGHT
if not border_group.get_pressed_button():
button.button_pressed = true
%BorderContainer.add_child(button)
"
[sub_resource type="GDScript" id="GDScript_a3fsx"]
resource_name = "BorderColor"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/BorderPaintEditor.gd\"
func _editor_init():
can_pick = true
super()
func _editor_enter():
super()
%Colors.show()
func _editor_exit():
super()
%Colors.hide()
func modify_border(cell_data: MetroidvaniaSystem.MapData.CellData, border: int, mode: int) -> bool:
if cell_data.borders[border] == -1:
return false
if mode == MODE_PICK:
if cell_data.border_colors[border].a > 0:
%CurrentColor.color = cell_data.border_colors[border]
else:
var target_color := Color.TRANSPARENT
if mode == MODE_DRAW:
target_color = %CurrentColor.color
if cell_data.border_colors[border] != target_color:
cell_data.border_colors[border] = target_color
return true
return false
"
[sub_resource type="GDScript" id="GDScript_p75ne"]
resource_name = "SceneAssign"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/SubEditor.gd\"
func _editor_init() -> void:
use_cursor = false
func _update_theme():
theme_cache.assigned_scene = get_theme_color(&\"assigned_scene\", &\"MetSys\")
func _editor_input(event: InputEvent):
if event is InputEventMouseMotion:
var hr := highlighted_room
highlighted_room = MetSys.map_data.get_whole_room(get_coords(get_cursor_pos()))
if highlighted_room != hr:
editor.map_overlay.queue_redraw()
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed:
if not highlighted_room.is_empty():
if %FileDialog.root_subfolder.is_empty():
%FileDialog.root_subfolder = MetSys.settings.map_root_folder.trim_prefix(\"res://\")
%FileDialog.popup_centered_ratio(0.6)
elif event.button_index == MOUSE_BUTTON_RIGHT:
var first := true
for p in highlighted_room:
if first:
var assigned_scene: String = MetSys.map_data.get_cell_at(p).assigned_scene
MetSys.map_data.assigned_scenes.erase(assigned_scene)
first = false
MetSys.map_data.get_cell_at(p).assigned_scene = \"\"
MetSys.room_assign_updated.emit()
mark_modified()
editor.map_overlay.queue_redraw()
func _editor_draw(map_overlay: CanvasItem):
super(map_overlay)
for coords in MetSys.map_data.assigned_scenes.values():
if coords[0].z != editor.current_layer:
continue
for p in coords:
map_overlay.draw_rect(Rect2(Vector2(p.x, p.y) * MetSys.CELL_SIZE, MetSys.CELL_SIZE), theme_cache.assigned_scene)
if not highlighted_room.is_empty():
map_overlay.draw_set_transform_matrix(Transform2D())
map_overlay.draw_string(get_theme_font(&\"font\", &\"Label\"), Vector2(0, 40),
MetSys.map_data.get_cell_at(highlighted_room.front()).assigned_scene)
func on_map_selected(path: String) -> void:
path = path.trim_prefix(MetSys.settings.map_root_folder)
MetSys.map_data.assigned_scenes[path] = []
for coords in highlighted_room:
MetSys.map_data.get_cell_at(coords).assigned_scene = path
MetSys.map_data.assigned_scenes[path].append(coords)
MetSys.room_assign_updated.emit()
mark_modified()
editor.map_overlay.queue_redraw()
"
[sub_resource type="GDScript" id="GDScript_gb3rf"]
resource_name = "CustomElements"
script/source = "@tool
extends \"res://addons/MetroidvaniaSystem/Database/SubEditor.gd\"
var current_element: String
var custom_elements: Dictionary
func _editor_init() -> void:
room_only_cursor = false
custom_elements = MetSys.map_data.custom_elements
MetSys.settings.custom_elements_changed.connect(reload_custom_elements)
reload_custom_elements()
func _update_theme():
theme_cache.active_custom_element = get_theme_color(&\"active_custom_element\", &\"MetSys\")
theme_cache.inactive_custom_element = get_theme_color(&\"inactive_custom_element\", &\"MetSys\")
theme_cache.custom_element_marker = get_theme_color(&\"custom_element_marker\", &\"MetSys\")
func reload_custom_elements():
for element in %CustomElementContainer.get_children():
element.queue_free()
current_element = \"\"
if not MetSys.settings.custom_elements or MetSys.settings.custom_elements.custom_elements.is_empty():
%NoElements.show()
return
else:
%NoElements.hide()
var element_group := ButtonGroup.new()
for element in MetSys.settings.custom_elements.custom_elements:
var button := CheckBox.new()
button.text = str(element).capitalize()
button.button_group = element_group
button.pressed.connect(set_current_element.bind(element))
%CustomElementContainer.add_child(button)
if not element_group.get_pressed_button():
button.button_pressed = true
set_current_element(element)
func _editor_enter():
%CustomElements.show()
func _editor_exit():
%CustomElements.hide()
func set_current_element(element: String):
current_element = element
editor.map_overlay.queue_redraw()
func _editor_draw(map_overlay: CanvasItem):
super(map_overlay)
for coords in custom_elements:
if coords.z != editor.current_layer:
continue
var element_color: Color
var element: Dictionary = custom_elements[coords]
if element.name == current_element:
element_color = theme_cache.active_custom_element
else:
element_color = theme_cache.inactive_custom_element
map_overlay.draw_rect(Rect2(Vector2(coords.x, coords.y) * MetSys.CELL_SIZE, Vector2(element.size) * MetSys.CELL_SIZE), element_color)
var square := minf(MetSys.CELL_SIZE.x, MetSys.CELL_SIZE.y)
map_overlay.draw_rect(Rect2((Vector2(coords.x, coords.y) + Vector2(0.5, 0.5)) * MetSys.CELL_SIZE - Vector2.ONE * square * 0.5, Vector2.ONE * square).grow(-square * 0.2), theme_cache.custom_element_marker)
func _editor_input(event: InputEvent):
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed:
drag_from = get_cursor_pos()
else:
var rect := get_rect_between(drag_from, get_cursor_pos())
add_element(rect)
mark_modified()
drag_from = EDITOR_SCRIPT.NULL_VECTOR2I
elif event.button_index == MOUSE_BUTTON_RIGHT:
if event.pressed:
var coords := Vector3i(get_cursor_pos().x, get_cursor_pos().y, editor.current_layer)
if coords in MetSys.map_data.custom_elements:
MetSys.map_data.custom_elements.erase(coords)
mark_modified()
editor.map.queue_redraw()
func add_element(rect: Rect2i):
var element: Dictionary
element.name = current_element
element.size = rect.size
element.data = %CustomData.text
var coords := Vector3i(rect.position.x, rect.position.y, editor.current_layer)
MetSys.map_data.custom_elements[coords] = element
editor.map.queue_redraw()
"
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xiyo8"]
content_margin_left = 4.0
content_margin_right = 4.0
bg_color = Color(0, 0, 0, 0.501961)
[node name="MapEditor" type="HBoxContainer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_i7yda")
mode_group = SubResource("ButtonGroup_pv7fp")
metadata/_edit_lock_ = true
[node name="PanelContainer" type="PanelContainer" parent="."]
custom_minimum_size = Vector2(200, 0)
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer"]
layout_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Layer" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_filter = 2
metadata/_edit_lock_ = true
[node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"]
layout_mode = 2
text = "当前层"
horizontal_alignment = 1
[node name="CurrentLayer" type="SpinBox" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 4
[node name="Label2" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"]
layout_mode = 2
text = "预览层"
horizontal_alignment = 1
[node name="SpinBox2" type="SpinBox" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"]
layout_mode = 2
size_flags_horizontal = 4
min_value = -1.0
value = -1.0
[node name="RecenterButton" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Layer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 4
text = "重置相机"
[node name="HSeparator" type="HSeparator" parent="PanelContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
[node name="Modes" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
alignment = 1
[node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
text = "模式"
horizontal_alignment = 1
[node name="RoomLayout" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "房间布局"
script = SubResource("GDScript_dsps8")
[node name="CellColor" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "地块颜色"
script = SubResource("GDScript_tlx5u")
[node name="CellSymbol" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "地块符号"
script = SubResource("GDScript_ujwfx")
[node name="CellGroup" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "地块组"
script = SubResource("GDScript_a80ln")
[node name="BorderType" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "边缘类型"
script = SubResource("GDScript_ilxbw")
[node name="BorderColor" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "边缘颜色"
script = SubResource("GDScript_a3fsx")
[node name="SceneAssign" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "场景分配"
script = SubResource("GDScript_p75ne")
[node name="CustomElements" type="Button" parent="PanelContainer/ScrollContainer/VBoxContainer/Modes"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_pv7fp")
text = "自定义元素"
script = SubResource("GDScript_gb3rf")
[node name="HSeparator2" type="HSeparator" parent="PanelContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
[node name="EditControls" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 0
mouse_filter = 2
alignment = 2
metadata/_edit_lock_ = true
[node name="Symbols" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"]
unique_name_in_owner = true
visible = false
layout_mode = 2
[node name="SymbolContainer" type="HFlowContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Symbols"]
unique_name_in_owner = true
layout_mode = 2
[node name="Borders" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"]
unique_name_in_owner = true
visible = false
layout_mode = 2
[node name="BorderContainer" type="HFlowContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Borders"]
unique_name_in_owner = true
layout_mode = 2
[node name="Groups" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"]
unique_name_in_owner = true
visible = false
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Groups"]
layout_mode = 2
text = "Group ID"
horizontal_alignment = 1
[node name="CurrentGroup" type="SpinBox" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Groups"]
unique_name_in_owner = true
layout_mode = 2
[node name="Colors" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"]
unique_name_in_owner = true
visible = false
layout_mode = 2
[node name="CurrentColor" type="ColorPickerButton" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Colors"]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
edit_alpha = false
[node name="CustomElements" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"]
unique_name_in_owner = true
visible = false
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements"]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements/HBoxContainer"]
layout_mode = 2
text = "Data"
[node name="CustomData" type="LineEdit" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
[node name="NoElements" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements"]
unique_name_in_owner = true
layout_mode = 2
text = "No Custom Elements Registered"
autowrap_mode = 2
[node name="CustomElementContainer" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/CustomElements"]
unique_name_in_owner = true
layout_mode = 2
[node name="Shortcuts" type="VBoxContainer" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls"]
unique_name_in_owner = true
layout_mode = 2
[node name="ShortcutPick" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Shortcuts"]
unique_name_in_owner = true
layout_mode = 2
text = "Ctrl+Click: 从地图拾取"
autowrap_mode = 2
[node name="Label2" type="Label" parent="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Shortcuts"]
layout_mode = 2
text = "Shift+Click: 为整个房间设置"
autowrap_mode = 2
[node name="MapOverlay" type="Control" parent="."]
texture_filter = 1
clip_contents = true
layout_mode = 2
size_flags_horizontal = 3
focus_mode = 2
script = ExtResource("2_w1wnt")
[node name="ColorRect" type="ColorRect" parent="MapOverlay"]
modulate = Color(0, 0, 0, 0.12549)
show_behind_parent = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="Grid" type="Control" parent="MapOverlay"]
unique_name_in_owner = true
show_behind_parent = true
clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
mouse_filter = 2
[node name="Map" type="Control" parent="MapOverlay"]
unique_name_in_owner = true
show_behind_parent = true
clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
mouse_filter = 2
[node name="GhostMap" type="Control" parent="MapOverlay"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0.12549)
show_behind_parent = true
clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
mouse_filter = 2
[node name="StatusLabel" type="Label" parent="MapOverlay"]
unique_name_in_owner = true
layout_mode = 0
offset_right = 1.0
offset_bottom = 23.0
theme_override_styles/normal = SubResource("StyleBoxFlat_xiyo8")
vertical_alignment = 1
[node name="FileDialog" type="FileDialog" parent="."]
unique_name_in_owner = true
title = "Open a File"
size = Vector2i(345, 162)
ok_button_text = "打开"
file_mode = 0
filters = PackedStringArray("*.tscn")
[connection signal="value_changed" from="PanelContainer/ScrollContainer/VBoxContainer/Layer/SpinBox2" to="." method="preview_layer_changed"]
[connection signal="value_changed" from="PanelContainer/ScrollContainer/VBoxContainer/EditControls/Groups/CurrentGroup" to="MapOverlay" method="queue_redraw" unbinds=1]
[connection signal="draw" from="MapOverlay/Grid" to="." method="_on_grid_draw"]
[connection signal="draw" from="MapOverlay/GhostMap" to="." method="_on_ghost_map_draw"]
[connection signal="file_selected" from="FileDialog" to="PanelContainer/ScrollContainer/VBoxContainer/Modes/SceneAssign" method="on_map_selected"]