Add fill, start work on adding items
This commit is contained in:
parent
0fa89de972
commit
da43ba87e2
4 changed files with 219 additions and 22 deletions
|
@ -17,6 +17,16 @@ var open := false
|
||||||
onready var activationRange := $ActivationRange as ActivationRange
|
onready var activationRange := $ActivationRange as ActivationRange
|
||||||
onready var manager := $PowerManager as PowerManager
|
onready var manager := $PowerManager as PowerManager
|
||||||
|
|
||||||
|
static func editor_info():
|
||||||
|
var editor_icon = AtlasTexture.new()
|
||||||
|
editor_icon.atlas = preload("res://Graphics/tgstation/computer.png")
|
||||||
|
editor_icon.region = Rect2(0, 0, 32, 32)
|
||||||
|
return {
|
||||||
|
"name": "Computer",
|
||||||
|
"scene": load("res://Actors/Objects/Computer/Computer.tscn"),
|
||||||
|
"icon": editor_icon
|
||||||
|
}
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
if not Engine.editor_hint:
|
if not Engine.editor_hint:
|
||||||
activationRange.visible = true
|
activationRange.visible = true
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 411 B After Width: | Height: | Size: 548 B |
|
@ -10,10 +10,24 @@ const MAP_SCALE_MIN := 0.25
|
||||||
|
|
||||||
const TileTabScene := preload("res://Scenes/Editor/TileTab.tscn")
|
const TileTabScene := preload("res://Scenes/Editor/TileTab.tscn")
|
||||||
|
|
||||||
|
const objects = {
|
||||||
|
"Machines": [
|
||||||
|
{
|
||||||
|
"scene": preload("res://Actors/Objects/Computer/Computer.tscn"),
|
||||||
|
"script": GameObjectComputer
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
# Add tiles
|
||||||
add_tile_tab("Base", $map/tiles/base)
|
add_tile_tab("Base", $map/tiles/base)
|
||||||
|
add_tile_tab("Cables", $map/tiles/cables)
|
||||||
add_tile_tab("Floors", $map/tiles/floor)
|
add_tile_tab("Floors", $map/tiles/floor)
|
||||||
add_tile_tab("Walls", $map/tiles/walls)
|
add_tile_tab("Walls", $map/tiles/walls)
|
||||||
|
# Add objects
|
||||||
|
for cat in objects:
|
||||||
|
add_object_list(cat, objects[cat])
|
||||||
|
|
||||||
enum PlacingMode {
|
enum PlacingMode {
|
||||||
NONE,
|
NONE,
|
||||||
|
@ -36,6 +50,7 @@ var placing_mode = PlacingMode.NONE
|
||||||
var placing_layer = null
|
var placing_layer = null
|
||||||
var placing_tile_id := -1
|
var placing_tile_id := -1
|
||||||
var current_brush := "none"
|
var current_brush := "none"
|
||||||
|
var current_obj_action := "none"
|
||||||
|
|
||||||
# Cursor variables
|
# Cursor variables
|
||||||
var cursor_pos := Vector2.ZERO
|
var cursor_pos := Vector2.ZERO
|
||||||
|
@ -68,12 +83,15 @@ func _input(ev: InputEvent):
|
||||||
match ev.button_index:
|
match ev.button_index:
|
||||||
BUTTON_LEFT:
|
BUTTON_LEFT:
|
||||||
if current_brush == "freehand":
|
if current_brush == "freehand":
|
||||||
place_tiles([cursor_pos], placing_tile_id)
|
if placing_layer != null:
|
||||||
|
place_tiles(placing_layer, [cursor_pos], placing_tile_id)
|
||||||
placing = true
|
placing = true
|
||||||
pressed_pos = cursor_pos
|
pressed_pos = cursor_pos
|
||||||
BUTTON_RIGHT:
|
BUTTON_RIGHT:
|
||||||
if current_brush == "freehand":
|
if current_brush == "freehand":
|
||||||
place_tiles([cursor_pos], -1)
|
if placing_layer != null:
|
||||||
|
place_tiles(placing_layer, [cursor_pos], -1)
|
||||||
|
pressed_pos = cursor_pos
|
||||||
deleting = true
|
deleting = true
|
||||||
BUTTON_WHEEL_UP:
|
BUTTON_WHEEL_UP:
|
||||||
# Zoom in
|
# Zoom in
|
||||||
|
@ -100,10 +118,20 @@ func _input(ev: InputEvent):
|
||||||
else:
|
else:
|
||||||
match ev.button_index:
|
match ev.button_index:
|
||||||
BUTTON_LEFT:
|
BUTTON_LEFT:
|
||||||
if current_brush == "rect":
|
match current_brush:
|
||||||
place_rect(pressed_pos, cursor_pos, placing_tile_id)
|
"rect":
|
||||||
|
place_rect(pressed_pos, cursor_pos, placing_tile_id)
|
||||||
|
"fill":
|
||||||
|
if placing_layer != null:
|
||||||
|
flood_fill(placing_layer, cursor_pos, placing_tile_id)
|
||||||
placing = false
|
placing = false
|
||||||
BUTTON_RIGHT:
|
BUTTON_RIGHT:
|
||||||
|
match current_brush:
|
||||||
|
"rect":
|
||||||
|
place_rect(pressed_pos, cursor_pos, -1)
|
||||||
|
"fill":
|
||||||
|
if placing_layer != null:
|
||||||
|
flood_fill(placing_layer, cursor_pos, -1)
|
||||||
deleting = false
|
deleting = false
|
||||||
BUTTON_MIDDLE:
|
BUTTON_MIDDLE:
|
||||||
dragging = false
|
dragging = false
|
||||||
|
@ -116,7 +144,8 @@ func handle_held_cursor_move(old_pos: Vector2, new_pos: Vector2):
|
||||||
# If deleting, null tile instead
|
# If deleting, null tile instead
|
||||||
if deleting:
|
if deleting:
|
||||||
id = -1
|
id = -1
|
||||||
place_tiles([new_pos], id)
|
if placing_layer != null:
|
||||||
|
place_tiles(placing_layer, [new_pos], id)
|
||||||
|
|
||||||
func place_rect(a: Vector2, b: Vector2, id: int):
|
func place_rect(a: Vector2, b: Vector2, id: int):
|
||||||
if placing_layer == null:
|
if placing_layer == null:
|
||||||
|
@ -131,23 +160,27 @@ func place_rect(a: Vector2, b: Vector2, id: int):
|
||||||
y_ord = Vector2(b.y, a.y)
|
y_ord = Vector2(b.y, a.y)
|
||||||
var positions = []
|
var positions = []
|
||||||
for x in range(x_ord.x, x_ord.y+1):
|
for x in range(x_ord.x, x_ord.y+1):
|
||||||
layer.set_cellv(Vector2(x, a.y), id)
|
place_tile(layer, Vector2(x, a.y), id)
|
||||||
layer.set_cellv(Vector2(x, b.y), id)
|
place_tile(layer, Vector2(x, b.y), id)
|
||||||
for y in range(y_ord.x, y_ord.y+1):
|
for y in range(y_ord.x, y_ord.y+1):
|
||||||
layer.set_cellv(Vector2(a.x, y), id)
|
place_tile(layer, Vector2(a.x, y), id)
|
||||||
layer.set_cellv(Vector2(b.x, y), id)
|
place_tile(layer, Vector2(b.x, y), id)
|
||||||
layer.update_bitmask_region(a, b)
|
layer.update_bitmask_region(a, b)
|
||||||
|
|
||||||
func place_tiles(positions: Array, id: int):
|
func place_tile(tilemap: TileMap, pos: Vector2, id: int):
|
||||||
if placing_layer == null:
|
# Place tile
|
||||||
return
|
tilemap.set_cellv(pos, id)
|
||||||
var layer := placing_layer as TileMap
|
# If no base is under that tile, add it
|
||||||
|
if id != -1 and tilemap != $map/tiles/base:
|
||||||
|
if $map/tiles/base.get_cellv(pos) == -1:
|
||||||
|
$map/tiles/base.set_cellv(pos, 1)
|
||||||
|
|
||||||
|
func place_tiles(tilemap: TileMap, positions: Array, id: int):
|
||||||
for pos in positions:
|
for pos in positions:
|
||||||
# Place tile
|
place_tile(tilemap, pos, id)
|
||||||
layer.set_cellv(pos, id)
|
|
||||||
for pos in positions:
|
for pos in positions:
|
||||||
# Update bitmask
|
# Update bitmask
|
||||||
layer.update_bitmask_area(pos)
|
tilemap.update_bitmask_area(pos)
|
||||||
|
|
||||||
var group := ButtonGroup.new()
|
var group := ButtonGroup.new()
|
||||||
|
|
||||||
|
@ -167,6 +200,20 @@ func add_tab(name: String) -> TileTab:
|
||||||
$layers/tabs.add_child(tab)
|
$layers/tabs.add_child(tab)
|
||||||
return tab
|
return tab
|
||||||
|
|
||||||
|
func add_object_list(name: String, objects: Array):
|
||||||
|
var tab := ItemList.new()
|
||||||
|
tab.connect("item_selected", self, "_item_selected", [tab])
|
||||||
|
tab.name = name
|
||||||
|
for obj in objects:
|
||||||
|
var editor_info = obj.script.editor_info()
|
||||||
|
tab.add_item(editor_info.name, editor_info.icon)
|
||||||
|
tab.set_item_metadata(tab.get_item_count()-1, editor_info)
|
||||||
|
$objects/tabs.add_child(tab)
|
||||||
|
|
||||||
|
func _item_selected(idx: int, tab: ItemList):
|
||||||
|
var meta = tab.get_item_metadata(idx)
|
||||||
|
cursor_sprite.texture = meta.icon
|
||||||
|
|
||||||
func _toggle_tile_input(enable: bool):
|
func _toggle_tile_input(enable: bool):
|
||||||
input_lock = not enable
|
input_lock = not enable
|
||||||
|
|
||||||
|
@ -192,16 +239,73 @@ func make_tile_texture(tileset: TileSet, id: int) -> AtlasTexture:
|
||||||
return tile_icon
|
return tile_icon
|
||||||
|
|
||||||
onready var layers_panel = $layers
|
onready var layers_panel = $layers
|
||||||
|
onready var objects_panel = $objects
|
||||||
onready var brush_panel = $tools/brushPanel
|
onready var brush_panel = $tools/brushPanel
|
||||||
|
onready var obj_action_panel = $tools/objPanel
|
||||||
func _tool_selected(tool_type):
|
func _tool_selected(tool_type):
|
||||||
layers_panel.visible = false
|
layers_panel.visible = false
|
||||||
brush_panel.visible = false
|
brush_panel.visible = false
|
||||||
placing_mode = PlacingMode.NONE
|
placing_mode = PlacingMode.NONE
|
||||||
|
objects_panel.visible = false
|
||||||
|
obj_action_panel.visible = false
|
||||||
match tool_type:
|
match tool_type:
|
||||||
"tile":
|
"tile":
|
||||||
layers_panel.visible = true
|
layers_panel.visible = current_brush != "none"
|
||||||
brush_panel.visible = true
|
brush_panel.visible = true
|
||||||
placing_mode = PlacingMode.TILEMAP
|
placing_mode = PlacingMode.TILEMAP
|
||||||
|
"obj":
|
||||||
|
obj_action_panel.visible = true
|
||||||
|
objects_panel.visible = current_obj_action == "add"
|
||||||
|
|
||||||
func _set_brush(brush_type: String):
|
func _set_brush(brush_type: String):
|
||||||
current_brush = brush_type
|
current_brush = brush_type
|
||||||
|
layers_panel.visible = current_brush != "none"
|
||||||
|
|
||||||
|
var ff_cells = {}
|
||||||
|
var ff_origin = Vector2.ZERO
|
||||||
|
|
||||||
|
const BOUNDS_MAX_X = 40
|
||||||
|
const BOUNDS_MAX_Y = 40
|
||||||
|
|
||||||
|
# Sanity check: force bounds for cell
|
||||||
|
func ff_is_inbound(cell: Vector2):
|
||||||
|
return abs(cell.x-ff_origin.x) < BOUNDS_MAX_X and abs(cell.y-ff_origin.y) < BOUNDS_MAX_Y
|
||||||
|
|
||||||
|
func ff_is_valid(tilemap: TileMap, cell: Vector2, matching_tile: int) -> bool:
|
||||||
|
return ff_is_inbound(cell) and (not ff_cells.has(cell)) and tilemap.get_cellv(cell) == matching_tile
|
||||||
|
|
||||||
|
func ff_get_neighbours(tilemap: TileMap, cell: Vector2, matching_tile: int) -> Array:
|
||||||
|
var neighbours = [Vector2(cell.x, cell.y-1),Vector2(cell.x-1, cell.y),Vector2(cell.x+1, cell.y), Vector2(cell.x, cell.y+1)]
|
||||||
|
var out = []
|
||||||
|
for neighbour in neighbours:
|
||||||
|
# Have we checked this already?
|
||||||
|
if not ff_is_valid(tilemap, neighbour, matching_tile):
|
||||||
|
continue
|
||||||
|
out.push_back(neighbour)
|
||||||
|
return out
|
||||||
|
|
||||||
|
func flood_fill(tilemap: TileMap, pos: Vector2, id: int):
|
||||||
|
# Reset lists
|
||||||
|
ff_cells = {}
|
||||||
|
ff_origin = pos
|
||||||
|
var current_tile = tilemap.get_cellv(pos)
|
||||||
|
var queue = ff_get_neighbours(tilemap, pos, current_tile)
|
||||||
|
place_tile(tilemap, pos, id)
|
||||||
|
ff_cells[pos] = true
|
||||||
|
# Depth-first search
|
||||||
|
while not queue.empty():
|
||||||
|
var current = queue.pop_front()
|
||||||
|
# Have we checked this already?
|
||||||
|
if not ff_is_valid(tilemap, current, current_tile):
|
||||||
|
continue
|
||||||
|
var tile_id = tilemap.get_cellv(current)
|
||||||
|
if tile_id == current_tile:
|
||||||
|
ff_cells[current] = true
|
||||||
|
place_tile(tilemap, current, id)
|
||||||
|
for neighbour in ff_get_neighbours(tilemap, current, current_tile):
|
||||||
|
queue.push_front(neighbour)
|
||||||
|
tilemap.update_bitmask_region()
|
||||||
|
|
||||||
|
func _set_obj_action(action):
|
||||||
|
current_obj_action = action
|
||||||
|
objects_panel.visible = action == "add"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=25 format=2]
|
[gd_scene load_steps=28 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://Graphics/deepspace_mat.tres" type="Material" id=1]
|
[ext_resource path="res://Graphics/deepspace_mat.tres" type="Material" id=1]
|
||||||
[ext_resource path="res://Scenes/InEditorMap.gd" type="Script" id=2]
|
[ext_resource path="res://Scenes/InEditorMap.gd" type="Script" id=2]
|
||||||
|
@ -63,14 +63,26 @@ region = Rect2( 16, 0, 16, 16 )
|
||||||
atlas = ExtResource( 4 )
|
atlas = ExtResource( 4 )
|
||||||
region = Rect2( 0, 16, 16, 16 )
|
region = Rect2( 0, 16, 16, 16 )
|
||||||
|
|
||||||
[sub_resource type="AtlasTexture" id=11]
|
[sub_resource type="AtlasTexture" id=10]
|
||||||
atlas = ExtResource( 4 )
|
atlas = ExtResource( 4 )
|
||||||
region = Rect2( 32, 16, 16, 16 )
|
region = Rect2( 32, 16, 16, 16 )
|
||||||
|
|
||||||
[sub_resource type="AtlasTexture" id=10]
|
[sub_resource type="AtlasTexture" id=11]
|
||||||
atlas = ExtResource( 4 )
|
atlas = ExtResource( 4 )
|
||||||
region = Rect2( 16, 16, 16, 16 )
|
region = Rect2( 16, 16, 16, 16 )
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=12]
|
||||||
|
atlas = ExtResource( 4 )
|
||||||
|
region = Rect2( 0, 32, 16, 16 )
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=13]
|
||||||
|
atlas = ExtResource( 4 )
|
||||||
|
region = Rect2( 16, 32, 16, 16 )
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=14]
|
||||||
|
atlas = ExtResource( 4 )
|
||||||
|
region = Rect2( 32, 32, 16, 16 )
|
||||||
|
|
||||||
[node name="Control" type="Control"]
|
[node name="Control" type="Control"]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
|
@ -315,7 +327,7 @@ margin_bottom = 56.0
|
||||||
theme = ExtResource( 13 )
|
theme = ExtResource( 13 )
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
group = SubResource( 8 )
|
group = SubResource( 8 )
|
||||||
icon = SubResource( 11 )
|
icon = SubResource( 10 )
|
||||||
flat = false
|
flat = false
|
||||||
|
|
||||||
[node name="Fill" type="ToolButton" parent="tools/brushPanel/brush"]
|
[node name="Fill" type="ToolButton" parent="tools/brushPanel/brush"]
|
||||||
|
@ -325,7 +337,52 @@ margin_bottom = 86.0
|
||||||
theme = ExtResource( 13 )
|
theme = ExtResource( 13 )
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
group = SubResource( 8 )
|
group = SubResource( 8 )
|
||||||
icon = SubResource( 10 )
|
icon = SubResource( 11 )
|
||||||
|
flat = false
|
||||||
|
|
||||||
|
[node name="objPanel" type="PanelContainer" parent="tools"]
|
||||||
|
visible = false
|
||||||
|
margin_left = 59.0
|
||||||
|
margin_right = 93.0
|
||||||
|
margin_bottom = 94.0
|
||||||
|
size_flags_vertical = 0
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="brush" type="VBoxContainer" parent="tools/objPanel"]
|
||||||
|
margin_left = 4.0
|
||||||
|
margin_top = 4.0
|
||||||
|
margin_right = 30.0
|
||||||
|
margin_bottom = 90.0
|
||||||
|
|
||||||
|
[node name="add" type="ToolButton" parent="tools/objPanel/brush"]
|
||||||
|
margin_right = 26.0
|
||||||
|
margin_bottom = 26.0
|
||||||
|
theme = ExtResource( 13 )
|
||||||
|
toggle_mode = true
|
||||||
|
group = SubResource( 8 )
|
||||||
|
icon = SubResource( 12 )
|
||||||
|
flat = false
|
||||||
|
|
||||||
|
[node name="edit" type="ToolButton" parent="tools/objPanel/brush"]
|
||||||
|
margin_top = 30.0
|
||||||
|
margin_right = 26.0
|
||||||
|
margin_bottom = 56.0
|
||||||
|
theme = ExtResource( 13 )
|
||||||
|
toggle_mode = true
|
||||||
|
group = SubResource( 8 )
|
||||||
|
icon = SubResource( 13 )
|
||||||
|
flat = false
|
||||||
|
|
||||||
|
[node name="remove" type="ToolButton" parent="tools/objPanel/brush"]
|
||||||
|
margin_top = 60.0
|
||||||
|
margin_right = 26.0
|
||||||
|
margin_bottom = 86.0
|
||||||
|
theme = ExtResource( 13 )
|
||||||
|
toggle_mode = true
|
||||||
|
group = SubResource( 8 )
|
||||||
|
icon = SubResource( 14 )
|
||||||
flat = false
|
flat = false
|
||||||
|
|
||||||
[node name="layers" type="MarginContainer" parent="."]
|
[node name="layers" type="MarginContainer" parent="."]
|
||||||
|
@ -351,6 +408,29 @@ tab_align = 0
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[node name="objects" type="MarginContainer" parent="."]
|
||||||
|
visible = false
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
margin_left = 5.0
|
||||||
|
margin_top = -166.0
|
||||||
|
margin_right = 172.0
|
||||||
|
margin_bottom = -5.0
|
||||||
|
size_flags_vertical = 13
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="tabs" type="TabContainer" parent="objects"]
|
||||||
|
margin_right = 167.0
|
||||||
|
margin_bottom = 161.0
|
||||||
|
rect_min_size = Vector2( 0, 80 )
|
||||||
|
theme = ExtResource( 12 )
|
||||||
|
tab_align = 0
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
[connection signal="mouse_entered" from="background" to="." method="_toggle_tile_input" binds= [ true ]]
|
[connection signal="mouse_entered" from="background" to="." method="_toggle_tile_input" binds= [ true ]]
|
||||||
[connection signal="mouse_exited" from="background" to="." method="_toggle_tile_input" binds= [ false ]]
|
[connection signal="mouse_exited" from="background" to="." method="_toggle_tile_input" binds= [ false ]]
|
||||||
[connection signal="pressed" from="tools/toolsPanel/tools/placeTile" to="." method="_tool_selected" binds= [ "tile" ]]
|
[connection signal="pressed" from="tools/toolsPanel/tools/placeTile" to="." method="_tool_selected" binds= [ "tile" ]]
|
||||||
|
@ -358,3 +438,6 @@ __meta__ = {
|
||||||
[connection signal="pressed" from="tools/brushPanel/brush/FreeHand" to="." method="_set_brush" binds= [ "freehand" ]]
|
[connection signal="pressed" from="tools/brushPanel/brush/FreeHand" to="." method="_set_brush" binds= [ "freehand" ]]
|
||||||
[connection signal="pressed" from="tools/brushPanel/brush/Rect" to="." method="_set_brush" binds= [ "rect" ]]
|
[connection signal="pressed" from="tools/brushPanel/brush/Rect" to="." method="_set_brush" binds= [ "rect" ]]
|
||||||
[connection signal="pressed" from="tools/brushPanel/brush/Fill" to="." method="_set_brush" binds= [ "fill" ]]
|
[connection signal="pressed" from="tools/brushPanel/brush/Fill" to="." method="_set_brush" binds= [ "fill" ]]
|
||||||
|
[connection signal="pressed" from="tools/objPanel/brush/add" to="." method="_set_obj_action" binds= [ "add" ]]
|
||||||
|
[connection signal="pressed" from="tools/objPanel/brush/edit" to="." method="_set_obj_action" binds= [ "edit" ]]
|
||||||
|
[connection signal="pressed" from="tools/objPanel/brush/remove" to="." method="_set_obj_action" binds= [ "remove" ]]
|
||||||
|
|
Reference in a new issue