diff --git a/Godot_v3.4.2-stable_win64.exe b/Godot_v3.4.2-stable_win64.exe new file mode 100644 index 0000000..66f3f00 Binary files /dev/null and b/Godot_v3.4.2-stable_win64.exe differ diff --git a/project/.gitignore b/project/.gitignore new file mode 100644 index 0000000..5aac285 --- /dev/null +++ b/project/.gitignore @@ -0,0 +1,16 @@ +# Godot 4+ specific ignores +.godot/ + +# Godot-specific ignores +.import/ +export.cfg +export_presets.cfg +icon.png.import + +# Imported translations (automatically generated from CSV files) +*.translation + +# Mono-specific ignores +.mono/ +data_*/ +mono_crash.*.json diff --git a/project/Assets/Dots/blue.svg b/project/Assets/Dots/blue.svg new file mode 100644 index 0000000..50f30ee --- /dev/null +++ b/project/Assets/Dots/blue.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/Assets/Dots/blue.svg.import b/project/Assets/Dots/blue.svg.import new file mode 100644 index 0000000..1af7791 --- /dev/null +++ b/project/Assets/Dots/blue.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/blue.svg-a42ad444b08fc2fd100f5c23f40200a1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Dots/blue.svg" +dest_files=[ "res://.import/blue.svg-a42ad444b08fc2fd100f5c23f40200a1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/Assets/Dots/green.svg b/project/Assets/Dots/green.svg new file mode 100644 index 0000000..91edda4 --- /dev/null +++ b/project/Assets/Dots/green.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/Assets/Dots/green.svg.import b/project/Assets/Dots/green.svg.import new file mode 100644 index 0000000..9c9c9c9 --- /dev/null +++ b/project/Assets/Dots/green.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/green.svg-1eed087a526827ecaabefae6a064e589.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Dots/green.svg" +dest_files=[ "res://.import/green.svg-1eed087a526827ecaabefae6a064e589.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/Assets/Dots/pink.svg b/project/Assets/Dots/pink.svg new file mode 100644 index 0000000..e936bcc --- /dev/null +++ b/project/Assets/Dots/pink.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/Assets/Dots/pink.svg.import b/project/Assets/Dots/pink.svg.import new file mode 100644 index 0000000..de59eb7 --- /dev/null +++ b/project/Assets/Dots/pink.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/pink.svg-bcf5fbe4009604c30372094ff14e7f7c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Dots/pink.svg" +dest_files=[ "res://.import/pink.svg-bcf5fbe4009604c30372094ff14e7f7c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/Assets/Dots/red.svg b/project/Assets/Dots/red.svg new file mode 100644 index 0000000..e6eb197 --- /dev/null +++ b/project/Assets/Dots/red.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/Assets/Dots/red.svg.import b/project/Assets/Dots/red.svg.import new file mode 100644 index 0000000..221403e --- /dev/null +++ b/project/Assets/Dots/red.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/red.svg-f35596819128c83df274f6d2808d304e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Dots/red.svg" +dest_files=[ "res://.import/red.svg-f35596819128c83df274f6d2808d304e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/Assets/Dots/yellow.svg b/project/Assets/Dots/yellow.svg new file mode 100644 index 0000000..42dcf4d --- /dev/null +++ b/project/Assets/Dots/yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/Assets/Dots/yellow.svg.import b/project/Assets/Dots/yellow.svg.import new file mode 100644 index 0000000..0ac4f7a --- /dev/null +++ b/project/Assets/Dots/yellow.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/yellow.svg-f2aa811297a648861c15d5c673f8d564.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Dots/yellow.svg" +dest_files=[ "res://.import/yellow.svg-f2aa811297a648861c15d5c673f8d564.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/LICENSE b/project/LICENSE new file mode 100644 index 0000000..6ba7f31 --- /dev/null +++ b/project/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Mehmet Akif Duba + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/project/README.md b/project/README.md new file mode 100644 index 0000000..12b6931 --- /dev/null +++ b/project/README.md @@ -0,0 +1,2 @@ +# Godot Engine Match3 Game Template +![screenshot](https://user-images.githubusercontent.com/31243845/140289774-6552bb39-0747-4c4a-bd5f-6e92ae855b99.png) diff --git a/project/Scenes/Dot.tscn b/project/Scenes/Dot.tscn new file mode 100644 index 0000000..d3373dd --- /dev/null +++ b/project/Scenes/Dot.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Scripts/Dot.gd" type="Script" id=1] + +[node name="Dot" type="Node2D"] +scale = Vector2( 0.5, 0.5 ) +script = ExtResource( 1 ) + +[node name="Sprite" type="Sprite" parent="."] + +[node name="Tween" type="Tween" parent="."] diff --git a/project/Scenes/Dots/blue_dot.tscn b/project/Scenes/Dots/blue_dot.tscn new file mode 100644 index 0000000..0468618 --- /dev/null +++ b/project/Scenes/Dots/blue_dot.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Assets/Dots/blue.svg" type="Texture" id=1] +[ext_resource path="res://Scenes/Dot.tscn" type="PackedScene" id=2] + +[node name="blue_dot" instance=ExtResource( 2 )] +color = "blue" + +[node name="Sprite" parent="." index="0"] +texture = ExtResource( 1 ) diff --git a/project/Scenes/Dots/green_dot.tscn b/project/Scenes/Dots/green_dot.tscn new file mode 100644 index 0000000..8e26274 --- /dev/null +++ b/project/Scenes/Dots/green_dot.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Assets/Dots/green.svg" type="Texture" id=1] +[ext_resource path="res://Scenes/Dot.tscn" type="PackedScene" id=2] + +[node name="green_dot" instance=ExtResource( 2 )] +color = "green" + +[node name="Sprite" parent="." index="0"] +texture = ExtResource( 1 ) diff --git a/project/Scenes/Dots/pink_dot.tscn b/project/Scenes/Dots/pink_dot.tscn new file mode 100644 index 0000000..dd3ad00 --- /dev/null +++ b/project/Scenes/Dots/pink_dot.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Assets/Dots/pink.svg" type="Texture" id=1] +[ext_resource path="res://Scenes/Dot.tscn" type="PackedScene" id=2] + +[node name="pink_dot" instance=ExtResource( 2 )] +color = "pink" + +[node name="Sprite" parent="." index="0"] +texture = ExtResource( 1 ) diff --git a/project/Scenes/Dots/red_dot.tscn b/project/Scenes/Dots/red_dot.tscn new file mode 100644 index 0000000..3aba2b4 --- /dev/null +++ b/project/Scenes/Dots/red_dot.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Assets/Dots/red.svg" type="Texture" id=1] +[ext_resource path="res://Scenes/Dot.tscn" type="PackedScene" id=2] + +[node name="red_dot" instance=ExtResource( 2 )] +color = "red" + +[node name="Sprite" parent="." index="0"] +texture = ExtResource( 1 ) diff --git a/project/Scenes/Dots/yellow_dot.tscn b/project/Scenes/Dots/yellow_dot.tscn new file mode 100644 index 0000000..9add19e --- /dev/null +++ b/project/Scenes/Dots/yellow_dot.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Assets/Dots/yellow.svg" type="Texture" id=1] +[ext_resource path="res://Scenes/Dot.tscn" type="PackedScene" id=2] + +[node name="yellow_dot" instance=ExtResource( 2 )] +color = "yellow" + +[node name="Sprite" parent="." index="0"] +texture = ExtResource( 1 ) diff --git a/project/Scenes/Game.tscn b/project/Scenes/Game.tscn new file mode 100644 index 0000000..b2737e2 --- /dev/null +++ b/project/Scenes/Game.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Scripts/Grid.gd" type="Script" id=1] + +[node name="Game" type="Node"] + +[node name="ColorRect" type="ColorRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0, 0, 0, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Grid" type="Node2D" parent="."] +script = ExtResource( 1 ) +width = 7 +height = 7 +offset = 70 +y_offset = -2 +empty_spaces = PoolVector2Array( 0, 0, 0, 6, 6, 6, 6, 0, 2, 3, 3, 3, 4, 3 ) diff --git a/project/Scripts/Dot.gd b/project/Scripts/Dot.gd new file mode 100644 index 0000000..85acf0e --- /dev/null +++ b/project/Scripts/Dot.gd @@ -0,0 +1,18 @@ +extends Node2D + +export (String) var color + +onready var move_tween = $Tween +onready var sprite = get_node("Sprite") +var matched = false + +func _ready(): + pass + +func move(target): + move_tween.interpolate_property(self, "position", position, target, 0.2, Tween.TRANS_LINEAR, Tween.EASE_OUT) + move_tween.start() + pass + +func dim(): + sprite.modulate = Color(1, 1, 1, 0.5) diff --git a/project/Scripts/Grid.gd b/project/Scripts/Grid.gd new file mode 100644 index 0000000..4084578 --- /dev/null +++ b/project/Scripts/Grid.gd @@ -0,0 +1,261 @@ +extends Node2D + +enum {wait, move} +var state + +export (int) var width +export (int) var height +export (int) var offset +export (int) var y_offset + +onready var x_start = ((OS.window_size.x / 2.0) - ((width/2.0) * offset ) + (offset / 2)) +onready var y_start = ((OS.window_size.y / 2.0) + ((height/2.0) * offset ) - (offset / 2)) + +export (PoolVector2Array) var empty_spaces + +onready var possible_dots = [ + preload("res://Scenes/Dots/blue_dot.tscn"), + preload("res://Scenes/Dots/green_dot.tscn"), + preload("res://Scenes/Dots/pink_dot.tscn"), + preload("res://Scenes/Dots/red_dot.tscn"), + preload("res://Scenes/Dots/yellow_dot.tscn"), +] + +var destroy_timer = Timer.new() +var collapse_timer = Timer.new() +var refill_timer = Timer.new() + +var all_dots = [] + +var dot_one = null +var dot_two = null +var last_place = Vector2(0,0) +var last_direction = Vector2(0,0) +var move_checked = false + + +var first_touch = Vector2(0,0) +var final_touch = Vector2(0,0) +var controlling = false + +func _ready(): + state = move + setup_timers() + randomize() + all_dots = make_2d_array() + spawn_dots() + +func setup_timers(): + destroy_timer.connect("timeout",self,"destroy_matches") + destroy_timer.set_one_shot(true) + destroy_timer.set_wait_time(0.2) + add_child(destroy_timer) + + collapse_timer.connect("timeout",self,"collapse_columns") + collapse_timer.set_one_shot(true) + collapse_timer.set_wait_time(0.2) + add_child(collapse_timer) + + refill_timer.connect("timeout",self,"refill_columns") + refill_timer.set_one_shot(true) + refill_timer.set_wait_time(0.2) + add_child(refill_timer) + +func restricted_fill(place): + if is_in_array(empty_spaces, place): + return true + return false + +func is_in_array(array, item): + for i in array.size(): + if array[i] == item: + return true + return false + +func make_2d_array(): + var array = [] + for i in width: + array.append([]) + for j in height: + array[i].append(null) + return array + +func spawn_dots(): + for i in width: + for j in height: + if !restricted_fill(Vector2(i, j)): + var rand = floor(rand_range(0, possible_dots.size())) + var dot = possible_dots[rand].instance() + var loops = 0 + while (match_at(i, j, dot.color) && loops < 100): + rand = floor(rand_range(0,possible_dots.size())) + loops += 1 + dot = possible_dots[rand].instance() + add_child(dot) + dot.position = grid_to_pixel(i, j) + all_dots[i][j] = dot + +func match_at(i, j, color): + if i > 1: + if all_dots[i - 1][j] != null && all_dots[i - 2][j] != null: + if all_dots[i - 1][j].color == color && all_dots[i - 2][j].color == color: + return true + if j > 1: + if all_dots[i][j - 1] != null && all_dots[i][j - 2] != null: + if all_dots[i][j - 1].color == color && all_dots[i][j - 2].color == color: + return true + pass + +func grid_to_pixel(column, row): + var new_x = x_start + offset * column + var new_y = y_start + -offset * row + return Vector2(new_x, new_y) + +func pixel_to_grid(pixel_x,pixel_y): + var new_x = round((pixel_x - x_start) / offset) + var new_y = round((pixel_y - y_start) / -offset) + return Vector2(new_x, new_y) + pass + +func is_in_grid(grid_position): + if grid_position.x >= 0 && grid_position.x < width: + if grid_position.y >= 0 && grid_position.y < height: + return true + return false + +func touch_input(): + if Input.is_action_just_pressed("ui_touch"): + if is_in_grid(pixel_to_grid(get_global_mouse_position().x,get_global_mouse_position().y)): + first_touch = pixel_to_grid(get_global_mouse_position().x,get_global_mouse_position().y) + controlling = true + if Input.is_action_just_released("ui_touch"): + if is_in_grid(pixel_to_grid(get_global_mouse_position().x,get_global_mouse_position().y)) && controlling: + controlling = false + final_touch = pixel_to_grid(get_global_mouse_position().x,get_global_mouse_position().y ) + touch_difference(first_touch, final_touch) + +func swap_dots(column, row, direction): + var first_dot = all_dots[column][row] + var other_dot = all_dots[column + direction.x][row + direction.y] + if first_dot != null && other_dot != null: + store_info(first_dot, other_dot, Vector2(column, row), direction) + state = wait + all_dots[column][row] = other_dot + all_dots[column + direction.x][row + direction.y] = first_dot + first_dot.move(grid_to_pixel(column + direction.x, row + direction.y)) + other_dot.move(grid_to_pixel(column, row)) + if !move_checked: + find_matches() + +func store_info(first_dot, other_dot, place, direciton): + dot_one = first_dot + dot_two = other_dot + last_place = place + last_direction = direciton + pass + +func swap_back(): + if dot_one != null && dot_two != null: + swap_dots(last_place.x, last_place.y, last_direction) + state = move + move_checked = false + +func touch_difference(grid_1, grid_2): + var difference = grid_2 - grid_1 + if abs(difference.x) > abs(difference.y): + if difference.x > 0: + swap_dots(grid_1.x, grid_1.y, Vector2(1, 0)) + elif difference.x < 0: + swap_dots(grid_1.x, grid_1.y, Vector2(-1, 0)) + elif abs(difference.y) > abs(difference.x): + if difference.y > 0: + swap_dots(grid_1.x, grid_1.y, Vector2(0, 1)) + elif difference.y < 0: + swap_dots(grid_1.x, grid_1.y, Vector2(0, -1)) + +func _process(_delta): + if state == move: + touch_input() + +func find_matches(): + for i in width: + for j in height: + if all_dots[i][j] != null: + var current_color = all_dots[i][j].color + if i > 0 && i < width -1: + if !is_piece_null(i - 1, j) && !is_piece_null(i + 1, j): + if all_dots[i - 1][j].color == current_color && all_dots[i + 1][j].color == current_color: + match_and_dim(all_dots[i - 1][j]) + match_and_dim(all_dots[i][j]) + match_and_dim(all_dots[i + 1][j]) + if j > 0 && j < height -1: + if !is_piece_null(i, j - 1) && !is_piece_null(i, j + 1): + if all_dots[i][j - 1].color == current_color && all_dots[i][j + 1].color == current_color: + match_and_dim(all_dots[i][j - 1]) + match_and_dim(all_dots[i][j]) + match_and_dim(all_dots[i][j + 1]) + destroy_timer.start() + +func is_piece_null(column, row): + if all_dots[column][row] == null: + return true + return false + +func match_and_dim(item): + item.matched = true + item.dim() + +func destroy_matches(): + var was_matched = false + for i in width: + for j in height: + if all_dots[i][j] != null: + if all_dots[i][j].matched: + was_matched = true + all_dots[i][j].queue_free() + all_dots[i][j] = null + move_checked = true + if was_matched: + collapse_timer.start() + else: + swap_back() + +func collapse_columns(): + for i in width: + for j in height: + if all_dots[i][j] == null && !restricted_fill(Vector2(i,j)): + for k in range(j + 1, height): + if all_dots[i][k] != null: + all_dots[i][k].move(grid_to_pixel(i, j)) + all_dots[i][j] = all_dots[i][k] + all_dots[i][k] = null + break + refill_timer.start() + +func refill_columns(): + for i in width: + for j in height: + if all_dots[i][j] == null && !restricted_fill(Vector2(i,j)): + var rand = floor(rand_range(0, possible_dots.size())) + var dot = possible_dots[rand].instance() + var loops = 0 + while (match_at(i, j, dot.color) && loops < 100): + rand = floor(rand_range(0,possible_dots.size())) + loops += 1 + dot = possible_dots[rand].instance() + add_child(dot) + dot.position = grid_to_pixel(i, j - y_offset) + dot.move(grid_to_pixel(i,j)) + all_dots[i][j] = dot + after_refill() + +func after_refill(): + for i in width: + for j in height: + if all_dots[i][j] != null: + if match_at(i, j, all_dots[i][j].color): + find_matches() + destroy_timer.start() + return + state = move + move_checked = false diff --git a/project/default_env.tres b/project/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/project/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/project/icon.png b/project/icon.png new file mode 100644 index 0000000..259942f Binary files /dev/null and b/project/icon.png differ diff --git a/project/project.godot b/project/project.godot new file mode 100644 index 0000000..60b6f47 --- /dev/null +++ b/project/project.godot @@ -0,0 +1,41 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ ] +_global_script_class_icons={ +} + +[application] + +config/name="Godot Match 3 Template" +run/main_scene="res://Scenes/Game.tscn" +boot_splash/bg_color=Color( 0, 0, 0, 1 ) +config/icon="res://icon.png" + +[display] + +window/size/width=540 +window/size/height=960 +window/handheld/orientation="portrait" +window/stretch/mode="2d" +window/stretch/aspect="keep_width" + +[input] + +ui_touch={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +} + +[rendering] + +quality/driver/driver_name="GLES2" +environment/default_environment="res://default_env.tres"