File renaming pass

This commit is contained in:
effie 2025-06-28 15:55:28 +10:00
parent ea31a0363b
commit e76a7b1f83
14 changed files with 309 additions and 265 deletions

1
game.gd Normal file
View File

@ -0,0 +1 @@
extends Node

1
game.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://b2ytri51qn3r0

50
game.tscn Normal file
View File

@ -0,0 +1,50 @@
[gd_scene load_steps=4 format=3 uid="uid://x8xo5b1b3q41"]
[ext_resource type="Script" uid="uid://b2ytri51qn3r0" path="res://game.gd" id="1_feb5d"]
[ext_resource type="PackedScene" uid="uid://0d1d5e1u2fys" path="res://places/place_manager.tscn" id="2_fc0e3"]
[ext_resource type="Script" uid="uid://cgfibq8ku7tey" path="res://interface/game_cam.gd" id="3_7jktm"]
[node name="Game" type="Node"]
script = ExtResource("1_feb5d")
[node name="InterfaceLayer" type="CanvasLayer" parent="."]
[node name="SelectToggle" type="CheckButton" parent="InterfaceLayer"]
offset_left = 1008.0
offset_top = 18.0
offset_right = 1120.0
offset_bottom = 49.0
text = "Building"
[node name="BuildButton" type="Button" parent="InterfaceLayer"]
offset_left = 1033.0
offset_top = 59.0
offset_right = 1081.0
offset_bottom = 90.0
text = "Build"
[node name="DestroyButton" type="Button" parent="InterfaceLayer"]
offset_left = 1031.0
offset_top = 105.0
offset_right = 1079.0
offset_bottom = 136.0
text = "Destroy
"
[node name="CancelButton" type="Button" parent="InterfaceLayer"]
offset_left = 1031.0
offset_top = 145.0
offset_right = 1091.0
offset_bottom = 176.0
text = "Cancel"
[node name="GameCam" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 16.504, 23.621, 15.103)
script = ExtResource("3_7jktm")
[node name="PlaceManager" parent="." instance=ExtResource("2_fc0e3")]
[connection signal="toggled" from="InterfaceLayer/SelectToggle" to="PlaceManager" method="_on_build_toggle"]
[connection signal="pressed" from="InterfaceLayer/BuildButton" to="PlaceManager" method="_on_build_button_pressed"]
[connection signal="pressed" from="InterfaceLayer/DestroyButton" to="PlaceManager" method="_on_destroy_button_pressed"]
[connection signal="pressed" from="InterfaceLayer/CancelButton" to="PlaceManager" method="_on_cancel_button_pressed"]

26
interface/game_cam.gd Normal file
View File

@ -0,0 +1,26 @@
extends Camera3D
@export var cam_max_pan_speed = 0.5
@export var cam_max_zoom_speed = 2
func _process(delta: float) -> void:
move_camera()
func move_camera():
if Input.is_action_pressed("main_cam_up"):
position.z = position.z - cam_max_pan_speed
if Input.is_action_pressed("main_cam_right"):
position.x = position.x + cam_max_pan_speed
if Input.is_action_pressed("main_cam_down"):
position.z = position.z + cam_max_pan_speed
if Input.is_action_pressed("main_cam_left"):
position.x = position.x - cam_max_pan_speed
if Input.is_action_just_released("main_cam_in"):
fov = fov - cam_max_zoom_speed
if Input.is_action_just_released("main_cam_out"):
fov = fov + cam_max_zoom_speed

View File

@ -0,0 +1 @@
uid://cgfibq8ku7tey

View File

@ -1,46 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://x8xo5b1b3q41"]
[ext_resource type="PackedScene" uid="uid://0d1d5e1u2fys" path="res://map/map_manager.tscn" id="1_ig7tw"]
[node name="Main" type="Node"]
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="SelectToggle" type="CheckButton" parent="CanvasLayer"]
offset_left = 1008.0
offset_top = 18.0
offset_right = 1120.0
offset_bottom = 49.0
text = "Building"
[node name="BuildButton" type="Button" parent="CanvasLayer"]
offset_left = 1033.0
offset_top = 59.0
offset_right = 1081.0
offset_bottom = 90.0
text = "Build"
[node name="DestroyButton" type="Button" parent="CanvasLayer"]
offset_left = 1031.0
offset_top = 105.0
offset_right = 1079.0
offset_bottom = 136.0
text = "Destroy
"
[node name="CancelButton" type="Button" parent="CanvasLayer"]
offset_left = 1031.0
offset_top = 145.0
offset_right = 1091.0
offset_bottom = 176.0
text = "Cancel"
[node name="MapManager" parent="." instance=ExtResource("1_ig7tw")]
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 16.504, 23.621, 15.103)
[connection signal="toggled" from="CanvasLayer/SelectToggle" to="MapManager" method="_build_toggled"]
[connection signal="pressed" from="CanvasLayer/BuildButton" to="MapManager" method="_on_build_button_pressed"]
[connection signal="pressed" from="CanvasLayer/DestroyButton" to="MapManager" method="_on_destroy_button_pressed"]
[connection signal="pressed" from="CanvasLayer/CancelButton" to="MapManager" method="_on_cancel_button_pressed"]

View File

@ -1,197 +0,0 @@
extends Node3D
var gridsize = 32
var astar_grid_room = AStarGrid2D.new()
var load_tile = preload("res://tiles/base_tile/tile.tscn")
var tile_dict = {}
var selection_drag_dict = {}
var selection_dict = {}
var tile_count_x_hist = null
var tile_count_z_hist = null
var build_forbidden = false
func _ready():
# Sets up a simple 2D grid of blank tiles.
for x in range(gridsize):
for z in range (gridsize):
var pos = Vector3i(x + 0.5,0 ,z + 0.5)
var tile = load_tile.instantiate()
tile.set_position(pos)
tile.type = 0
tile_dict[pos] = tile
add_child(tile)
func build_selection(b):
if build_forbidden:
print("No fucking building aaaaaa")
return
# When the build or destroy button is clicked, changes the selected tiles to match the button's request
for i in selection_dict:
var tile_selected = tile_dict[i]
tile_selected.build_this_tile(b)
selection_dict.clear()
for i in tile_dict:
if not selection_dict.has(i):
var tile_selected = tile_dict[i]
tile_selected.select_this_tile(false)
func clear_selection():
# When the clear button is clicked, it clears the selected tiles without doing anything.
for i in tile_dict:
var tile_selected = tile_dict[i]
tile_selected.select_this_tile(false)
selection_dict.clear()
func end_select_drag():
# Locks in the dragged tiles on mouse-up
tile_count_x_hist = 0
tile_count_z_hist = 0
selection_dict.merge(selection_drag_dict)
if not verify_room():
build_forbidden = true
selection_drag_dict.clear()
func draw_tile_click(start_pos):
var build_start_pos: Vector3i = start_pos.snapped(Vector3i(1, 1, 1))
tile_count_x_hist = 0
tile_count_z_hist = 0
select_tile(build_start_pos)
func init_select_drag(float_build_start_pos, float_build_mouse_pos):
var select_drag_array = []
var build_start_pos: Vector3i = float_build_start_pos.snapped(Vector3i(1.0, 1.0, 1.0))
var build_mouse_pos: Vector3i = float_build_mouse_pos.snapped(Vector3i(1.0, 1.0, 1.0))
var tile_count_x = build_mouse_pos.x - build_start_pos.x
var tile_count_z = build_mouse_pos.z - build_start_pos.z
if not tile_count_x_hist == tile_count_x or not tile_count_z_hist == tile_count_z:
tile_count_x_hist = tile_count_x
tile_count_z_hist = tile_count_z
for x in range(min(0, tile_count_x), max(0, tile_count_x) + 1):
for z in range(min(0, tile_count_z), max(0, tile_count_z) + 1):
var select_drag_pos = build_start_pos + Vector3i(x, 0, z)
select_drag_array.append(select_drag_pos)
draw_select_drag(select_drag_array)
func draw_select_drag(array):
selection_drag_dict.clear()
for i in tile_dict:
if not selection_dict.has(i):
var tile_selected = tile_dict[i]
tile_selected.select_this_tile(false)
for i in array:
var id = i
select_tile(id)
func select_tile(pos):
if tile_dict.has(pos):
var tile = tile_dict[pos]
tile.select_this_tile(true)
selection_drag_dict[pos] = tile
func verify_room():
if selection_dict == selection_drag_dict:
return true
var verify_array = selection_dict.keys()
var verify_queue_array = [verify_array[0]]
var verify_checked_array = []
while verify_array:
if not verify_queue_array:
return false
var verify_pos = verify_queue_array[0]
if selection_dict.has(Vector3i(verify_pos.x + 1, 0, verify_pos.z)):
if not verify_checked_array.has(Vector3i(verify_pos.x + 1, 0, verify_pos.z)):
if not verify_queue_array.has(Vector3i(verify_pos.x + 1, 0, verify_pos.z)):
verify_queue_array.append(Vector3i(verify_pos.x + 1, 0, verify_pos.z))
if selection_dict.has(Vector3i(verify_pos.x - 1, 0, verify_pos.z)):
if not verify_checked_array.has(Vector3i(verify_pos.x - 1, 0, verify_pos.z)):
if not verify_queue_array.has(Vector3i(verify_pos.x - 1, 0, verify_pos.z)):
verify_queue_array.append(Vector3i(verify_pos.x - 1, 0, verify_pos.z))
if selection_dict.has(Vector3i(verify_pos.x, 0, verify_pos.z + 1)):
if not verify_checked_array.has(Vector3i(verify_pos.x, 0, verify_pos.z + 1)):
if not verify_queue_array.has(Vector3i(verify_pos.x, 0, verify_pos.z + 1)):
verify_queue_array.append(Vector3i(verify_pos.x, 0, verify_pos.z + 1))
if selection_dict.has(Vector3i(verify_pos.x, 0, verify_pos.z - 1)):
if not verify_checked_array.has(Vector3i(verify_pos.x, 0, verify_pos.z - 1)):
if not verify_queue_array.has(Vector3i(verify_pos.x, 0, verify_pos.z - 1)):
verify_queue_array.append(Vector3i(verify_pos.x, 0, verify_pos.z - 1))
verify_checked_array.append(verify_pos)
verify_queue_array.erase(verify_pos)
verify_array.erase(verify_pos)
return true
#if verify_dict.has(Vector3i(verify_pos.x + 1, 0, verify_pos.z)) && not verified.has(Vector3i(verify_pos.x + 1, 0, verify_pos.z)):
#verified.append(verify_pos)
#verify_pos = Vector3i(verify_pos.x + 1, 0, verify_pos.z)
#elif verify_dict.has(Vector3i(verify_pos.x - 1, 0, verify_pos.z)):
#verified.append(verify_pos)
#verify_pos = Vector3i(verify_pos.x - 1, 0, verify_pos.z)
#elif verify_dict.has(Vector3i(verify_pos.x, 0, verify_pos.z + 1)):
#verified.append(verify_pos)
#verify_pos = Vector3i(verify_pos.x, 0, verify_pos.z + 1)
#elif verify_dict.has(Vector3i(verify_pos.x, 0, verify_pos.z - 1)):
#verified.append(verify_pos)
#verify_pos = Vector3i(verify_pos.x, 0, verify_pos.z - 1)
#else:
#verify_dict.erase(verify_pos)
#if verify_dict:
#print(verify_dict)
#return false
return true
#if selection_dict.has(Vector3i(verify_pos.x + 1, 0, verify_pos.z)) or (selection_dict.has(Vector3i(verify_pos.x - 1, 0, verify_pos.z))) or (selection_dict.has(Vector3i(verify_pos.x, 0, verify_pos.z + 1))) or (selection_dict.has(Vector3i(verify_pos.x, 0, verify_pos.z - 1))):
#verify_dict.erase(verify_pos)

178
places/base_place/place.gd Normal file
View File

@ -0,0 +1,178 @@
extends Node3D
var tile_grid_size = 64
var astar_grid_room = AStarGrid2D.new()
var load_tile = preload("res://tiles/base_tile/tile.tscn")
var tile_dict = {}
var selection_drag_dict = {}
var selection_dict = {}
var tile_count_x_hist = null
var tile_count_z_hist = null
var build_forbidden = false
func _ready():
# Sets up a simple 2D grid of blank tiles.
for x in range(tile_grid_size):
for z in range (tile_grid_size):
var pos = Vector3i(x + 0.5,0 ,z + 0.5)
var tile = load_tile.instantiate()
tile.set_position(pos)
tile.type = 0
tile_dict[pos] = tile
add_child(tile)
func build_selection(b):
# When the build or destroy button is clicked, changes the selected tiles to match the button's request
if build_forbidden:
print("can't build")
return
for i in selection_dict:
var tile_selected = tile_dict[i]
tile_selected.build_this_tile(b)
selection_dict.clear()
for i in tile_dict:
if not selection_dict.has(i):
var tile_selected = tile_dict[i]
tile_selected.select_this_tile(false)
func clear_selection():
# When the clear button is clicked, it clears the selected tiles without doing anything.
for i in tile_dict:
var tile_selected = tile_dict[i]
tile_selected.select_this_tile(false)
selection_dict.clear()
func end_select_drag():
# Adds dragged tiles to the current selection on mouse-up
tile_count_x_hist = 0
tile_count_z_hist = 0
selection_dict.merge(selection_drag_dict)
if verify_room():
build_forbidden = false
else:
build_forbidden = true
selection_drag_dict.clear()
func draw_tile_click(start_pos):
# starts a selection drag
var build_start_pos: Vector3i = start_pos.snapped(Vector3i(1, 1, 1))
tile_count_x_hist = 0
tile_count_z_hist = 0
if tile_dict.has(build_start_pos):
select_tile(build_start_pos)
func init_select_drag(float_build_start_pos, float_build_mouse_pos):
# Creats an array of dragged tiles between mouse start and current position
var select_drag_array = []
var build_start_pos: Vector3i = float_build_start_pos.snapped(Vector3i(1.0, 1.0, 1.0))
var build_mouse_pos: Vector3i = float_build_mouse_pos.snapped(Vector3i(1.0, 1.0, 1.0))
var tile_count_x = build_mouse_pos.x - build_start_pos.x
var tile_count_z = build_mouse_pos.z - build_start_pos.z
if not tile_count_x_hist == tile_count_x or not tile_count_z_hist == tile_count_z:
tile_count_x_hist = tile_count_x
tile_count_z_hist = tile_count_z
for x in range(min(0, tile_count_x), max(0, tile_count_x) + 1):
for z in range(min(0, tile_count_z), max(0, tile_count_z) + 1):
var select_drag_pos = build_start_pos + Vector3i(x, 0, z)
if tile_dict.has(select_drag_pos):
select_drag_array.append(select_drag_pos)
if select_drag_array:
draw_select_drag(select_drag_array)
func draw_select_drag(array):
# Clears previous drag, then calls tile selection on all currently dragged tiles
selection_drag_dict.clear()
for i in tile_dict:
if not selection_dict.has(i):
var tile_selected = tile_dict[i]
tile_selected.select_this_tile(false)
for i in array:
var id = i
select_tile(id)
func select_tile(pos):
# Tells tiles to be selected
var tile = tile_dict[pos]
tile.select_this_tile(true)
selection_drag_dict[pos] = tile
func verify_room():
# Verifies that a given selection is fully contiguous
if selection_dict == selection_drag_dict:
return true
var verify_array = selection_dict.keys()
var verify_queue_array = [verify_array[0]]
var verify_checked_array = []
while verify_array:
if not verify_queue_array:
print("no good")
return false
var verify_pos = verify_queue_array.pop_back()
var verify_neighbor_array = [
Vector3i(verify_pos.x + 1, 0, verify_pos.z),
Vector3i(verify_pos.x - 1, 0, verify_pos.z),
Vector3i(verify_pos.x, 0, verify_pos.z + 1),
Vector3i(verify_pos.x, 0, verify_pos.z - 1)
]
for n in verify_neighbor_array:
if selection_dict.has(n):
if not verify_checked_array.has(n):
if not verify_queue_array.has(n):
verify_queue_array.append(n)
verify_checked_array.append(verify_pos)
verify_array.erase(verify_pos)
print("all good")
return true

View File

@ -1,9 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://bujuwgn3y42ek"] [gd_scene load_steps=2 format=3 uid="uid://bujuwgn3y42ek"]
[ext_resource type="Script" uid="uid://n4vvqmlmq5fp" path="res://map/base_map/grid.gd" id="1_2j6sh"] [ext_resource type="Script" uid="uid://n4vvqmlmq5fp" path="res://places/base_place/place.gd" id="1_5eudc"]
[node name="TestWorld" type="Node3D"] [node name="TestPlace" type="Node3D"]
script = ExtResource("1_2j6sh") script = ExtResource("1_5eudc")
[node name="Grid" type="Node3D" parent="."] [node name="Grid" type="Node3D" parent="."]

View File

@ -1,7 +1,7 @@
extends Node3D extends Node3D
var load_map = preload("res://map/base_map/test_map.tscn") var load_place = preload("res://places/base_place/test_place.tscn")
var map = load_map.instantiate() var place = load_place.instantiate()
var build_enabled = false var build_enabled = false
var is_building = false var is_building = false
@ -9,42 +9,42 @@ var is_building = false
var build_start_pos = null var build_start_pos = null
func _ready(): func _ready():
add_child(map) add_child(place)
func _input(event): func _input(event):
pass pass
func _build_toggled(toggled_on): func _on_build_toggle(toggled_on):
build_enabled = toggled_on build_enabled = toggled_on
func toggle_building(event): func toggle_building(event):
is_building = event.button_mask is_building = event.button_mask
func _on_area_3d_input_event(_camera, event, event_position, _normal, _shade_id): func _on_area_3d_input_event(_camera, event, event_position, _normal, _shade_id):
# Checks input events from the mouse plane
if event.is_action_pressed("select") && build_enabled: if event.is_action_pressed("select") && build_enabled:
build_start_pos = event_position build_start_pos = event_position
toggle_building(event) toggle_building(event)
map.draw_tile_click(build_start_pos) place.draw_tile_click(build_start_pos)
if is_building: if is_building:
if event.button_mask: if event.button_mask:
var build_mouse_pos = event_position var build_mouse_pos = event_position
map.init_select_drag(build_start_pos, build_mouse_pos) place.init_select_drag(build_start_pos, build_mouse_pos)
if not event.button_mask: if not event.button_mask:
toggle_building(event) toggle_building(event)
map.end_select_drag() place.end_select_drag()
pass
func _on_cancel_button_pressed() -> void: func _on_cancel_button_pressed() -> void:
map.clear_selection() place.clear_selection()
func _on_build_button_pressed() -> void: func _on_build_button_pressed() -> void:
map.build_selection(true) place.build_selection(true)
func _on_destroy_button_pressed() -> void: func _on_destroy_button_pressed() -> void:
map.build_selection(false) place.build_selection(false)

View File

@ -1,22 +1,22 @@
[gd_scene load_steps=4 format=3 uid="uid://0d1d5e1u2fys"] [gd_scene load_steps=4 format=3 uid="uid://0d1d5e1u2fys"]
[ext_resource type="Script" uid="uid://d24sr2dat4lj0" path="res://map/map_manager.gd" id="1_rcbs8"] [ext_resource type="Script" uid="uid://d24sr2dat4lj0" path="res://places/place_manager.gd" id="1_rcbs8"]
[sub_resource type="BoxShape3D" id="BoxShape3D_rcbs8"] [sub_resource type="BoxShape3D" id="BoxShape3D_rcbs8"]
size = Vector3(256, 0, 256) size = Vector3(256, 0, 256)
[sub_resource type="PrismMesh" id="PrismMesh_rcbs8"] [sub_resource type="PrismMesh" id="PrismMesh_rcbs8"]
[node name="MapManager" type="Node3D"] [node name="PlaceManager" type="Node3D"]
script = ExtResource("1_rcbs8") script = ExtResource("1_rcbs8")
[node name="Area3D" type="Area3D" parent="."] [node name="FloorPlane" type="Area3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] [node name="CollisionShape3D" type="CollisionShape3D" parent="FloorPlane"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 128, 0, 128) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 128, 0, 128)
shape = SubResource("BoxShape3D_rcbs8") shape = SubResource("BoxShape3D_rcbs8")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Area3D"] [node name="MeshInstance3D" type="MeshInstance3D" parent="FloorPlane"]
mesh = SubResource("PrismMesh_rcbs8") mesh = SubResource("PrismMesh_rcbs8")
[connection signal="input_event" from="Area3D" to="." method="_on_area_3d_input_event"] [connection signal="input_event" from="FloorPlane" to="." method="_on_area_3d_input_event"]

View File

@ -22,6 +22,36 @@ select={
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
] ]
} }
main_cam_up={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":79,"key_label":0,"unicode":111,"location":0,"echo":false,"script":null)
]
}
main_cam_right={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
]
}
main_cam_down={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
]
}
main_cam_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":73,"key_label":0,"unicode":105,"location":0,"echo":false,"script":null)
]
}
main_cam_in={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
main_cam_out={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
[physics] [physics]