Refactor a lot of duplicated code

This commit is contained in:
Hamcha 2020-09-24 12:56:33 +02:00
parent da43ba87e2
commit b403ea7246
Signed by: hamcha
GPG key ID: 41467804B19A3315

View file

@ -12,10 +12,11 @@ const TileTabScene := preload("res://Scenes/Editor/TileTab.tscn")
const objects = { const objects = {
"Machines": [ "Machines": [
{ GameObjectComputer,
"scene": preload("res://Actors/Objects/Computer/Computer.tscn"), GameObjectDoor,
"script": GameObjectComputer GameObjectEngine,
} GameObjectLightbulb,
GameObjectPowerStorage
] ]
} }
@ -35,6 +36,16 @@ enum PlacingMode {
OBJECT OBJECT
} }
enum Tool {
NONE
TILE_FREEHAND,
TILE_RECT,
TILE_FILL,
OBJ_PLACE,
OBJ_EDIT,
OBJ_REMOVE
}
# Prevent input handler from running when other dialogs/actions are focused # Prevent input handler from running when other dialogs/actions are focused
var input_lock := false var input_lock := false
@ -49,8 +60,7 @@ var deleting := false
var placing_mode = PlacingMode.NONE 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_tool = Tool.NONE
var current_obj_action := "none"
# Cursor variables # Cursor variables
var cursor_pos := Vector2.ZERO var cursor_pos := Vector2.ZERO
@ -74,25 +84,17 @@ func _input(ev: InputEvent):
var old_pos = cursor_pos var old_pos = cursor_pos
cursor_pos = new_cursor_pos cursor_pos = new_cursor_pos
if placing or deleting: if placing or deleting:
handle_held_cursor_move(old_pos, new_cursor_pos) if current_tool != Tool.NONE:
tile_mouse_move(old_pos, cursor_pos)
cursor.position = cursor_pos * TILE_SIZE cursor.position = cursor_pos * TILE_SIZE
if ev is InputEventMouseButton: if ev is InputEventMouseButton:
var mouse := ev as InputEventMouseButton var mouse := ev as InputEventMouseButton
if mouse.pressed: if mouse.pressed:
match ev.button_index: match ev.button_index:
BUTTON_LEFT: BUTTON_LEFT, BUTTON_RIGHT:
if current_brush == "freehand": if current_tool != Tool.NONE:
if placing_layer != null: tile_pressed(ev.button_index, cursor_pos)
place_tiles(placing_layer, [cursor_pos], placing_tile_id)
placing = true
pressed_pos = cursor_pos
BUTTON_RIGHT:
if current_brush == "freehand":
if placing_layer != null:
place_tiles(placing_layer, [cursor_pos], -1)
pressed_pos = cursor_pos
deleting = true
BUTTON_WHEEL_UP: BUTTON_WHEEL_UP:
# Zoom in # Zoom in
var old_scale = map_node.scale var old_scale = map_node.scale
@ -117,36 +119,13 @@ func _input(ev: InputEvent):
dragging = true dragging = true
else: else:
match ev.button_index: match ev.button_index:
BUTTON_LEFT: BUTTON_LEFT, BUTTON_RIGHT:
match current_brush: if current_tool != Tool.NONE:
"rect": tile_released(ev.button_index, cursor_pos)
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
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
BUTTON_MIDDLE: BUTTON_MIDDLE:
dragging = false dragging = false
map_node.global_position = view_origin - (mouse_origin - ev.global_position) map_node.global_position = view_origin - (mouse_origin - ev.global_position)
func handle_held_cursor_move(old_pos: Vector2, new_pos: Vector2):
match current_brush:
"freehand":
var id = placing_tile_id
# If deleting, null tile instead
if deleting:
id = -1
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:
return return
@ -205,7 +184,7 @@ func add_object_list(name: String, objects: Array):
tab.connect("item_selected", self, "_item_selected", [tab]) tab.connect("item_selected", self, "_item_selected", [tab])
tab.name = name tab.name = name
for obj in objects: for obj in objects:
var editor_info = obj.script.editor_info() var editor_info = obj.editor_info()
tab.add_item(editor_info.name, editor_info.icon) tab.add_item(editor_info.name, editor_info.icon)
tab.set_item_metadata(tab.get_item_count()-1, editor_info) tab.set_item_metadata(tab.get_item_count()-1, editor_info)
$objects/tabs.add_child(tab) $objects/tabs.add_child(tab)
@ -245,21 +224,37 @@ 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
objects_panel.visible = false objects_panel.visible = false
obj_action_panel.visible = false obj_action_panel.visible = false
placing_mode = PlacingMode.NONE
match tool_type: match tool_type:
"tile": "tile":
layers_panel.visible = current_brush != "none" layers_panel.visible = tool_type(current_tool) == "brush"
brush_panel.visible = true brush_panel.visible = true
placing_mode = PlacingMode.TILEMAP placing_mode = PlacingMode.TILEMAP
"obj": "obj":
obj_action_panel.visible = true obj_action_panel.visible = true
objects_panel.visible = current_obj_action == "add" objects_panel.visible = tool_type(current_tool) == "obj"
placing_mode = PlacingMode.OBJECT
func _set_brush(brush_type: String): func _set_brush(brush_type: String):
current_brush = brush_type match brush_type:
layers_panel.visible = current_brush != "none" "freehand":
current_tool = Tool.TILE_FREEHAND
"rect":
current_tool = Tool.TILE_RECT
"fill":
current_tool = Tool.TILE_FILL
layers_panel.visible = true
func tool_type(brush):
match brush:
Tool.TILE_FILL, Tool.TILE_FREEHAND, Tool.TILE_RECT:
return "brush"
Tool.OBJ_EDIT, Tool.OBJ_PLACE, Tool.OBJ_REMOVE:
return "obj"
_:
return "none"
var ff_cells = {} var ff_cells = {}
var ff_origin = Vector2.ZERO var ff_origin = Vector2.ZERO
@ -307,5 +302,50 @@ func flood_fill(tilemap: TileMap, pos: Vector2, id: int):
tilemap.update_bitmask_region() tilemap.update_bitmask_region()
func _set_obj_action(action): func _set_obj_action(action):
current_obj_action = action match action:
objects_panel.visible = action == "add" "add":
current_tool = Tool.OBJ_PLACE
"edit":
current_tool = Tool.OBJ_EDIT
"remove":
current_tool = Tool.OBJ_REMOVE
objects_panel.visible = true
func tile_pressed(button: int, pos: Vector2):
match button:
BUTTON_LEFT:
placing = true
BUTTON_RIGHT:
deleting = true
match current_tool:
Tool.TILE_FREEHAND:
if placing_layer != null:
place_tiles(placing_layer, [pos], get_active_tile())
Tool.OBJ_PLACE:
pass
pressed_pos = pos
func tile_released(button: int, pos: Vector2):
match current_tool:
Tool.TILE_RECT:
if placing_layer != null:
place_rect(pressed_pos, cursor_pos, get_active_tile())
Tool.TILE_FILL:
if placing_layer != null:
flood_fill(placing_layer, cursor_pos, get_active_tile())
match button:
BUTTON_LEFT:
placing = false
BUTTON_RIGHT:
deleting = false
func tile_mouse_move(from: Vector2, to: Vector2):
match current_tool:
Tool.TILE_FREEHAND:
if placing_layer != null:
place_tiles(placing_layer, [to], get_active_tile())
func get_active_tile():
if deleting:
return -1
return placing_tile_id