1
Fork 0
mirror of https://github.com/Steffo99/particle-clash.git synced 2024-11-24 00:24:18 +00:00

Complete (more or less) the game

This commit is contained in:
Steffo 2022-10-02 14:36:34 +02:00
parent 98aded7b07
commit 85bc924680
Signed by: steffo
GPG key ID: 6965406171929D01
21 changed files with 923 additions and 120 deletions

View file

@ -1,7 +1,8 @@
{
"files.exclude": {
"**/.import": true,
"**/*.tscn": true
"**/*.import": true,
"**/*.tscn": true,
"**/*.tres": true,
},
"editor.insertSpaces": false,
"editor.renderWhitespace": "all"

39
default_bus_layout.tres Normal file
View file

@ -0,0 +1,39 @@
[gd_resource type="AudioBusLayout" load_steps=3 format=2]
[sub_resource type="AudioEffectPanner" id=1]
resource_name = "Panner"
pan = -0.4
[sub_resource type="AudioEffectPanner" id=2]
resource_name = "Panner"
pan = 0.4
[resource]
bus/1/name = "Sound"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = 0.0
bus/1/send = "Master"
bus/2/name = "Left"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = 0.0
bus/2/send = "Sound"
bus/2/effect/0/effect = SubResource( 1 )
bus/2/effect/0/enabled = true
bus/3/name = "Right"
bus/3/solo = false
bus/3/mute = false
bus/3/bypass_fx = false
bus/3/volume_db = 0.0
bus/3/send = "Sound"
bus/3/effect/0/effect = SubResource( 2 )
bus/3/effect/0/enabled = true
bus/4/name = "Music"
bus/4/solo = false
bus/4/mute = false
bus/4/bypass_fx = false
bus/4/volume_db = 0.0
bus/4/send = "Master"

View file

@ -10,7 +10,7 @@ config_version=4
[application]
config/name="Atomic Fusion"
config/name="Particle Clash"
run/main_scene="res://src/Main.tscn"
boot_splash/show_image=false
config/icon="res://src/sprites/atom.png"
@ -73,6 +73,16 @@ p2_rotate={
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":16777221,"unicode":0,"echo":false,"script":null)
]
}
mute_music={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":77,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
]
}
mute_sound={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":78,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
]
}
[physics]

View file

@ -6,6 +6,9 @@ func _on_LeftColorPicker_color_changed(color: Color):
$Gameplay/LeftPlayArea/Tiles.self_modulate = color
$Gameplay/LeftPlayArea/Label.self_modulate = color
$Gameplay/Minimap/Left.self_modulate = color
$Transitions/LeftTransition.color = color
$Results/Container/Scores/Left.self_modulate = color
$Results/Container/Rounds/Left.self_modulate = color
func _on_RightColorPicker_color_changed(color: Color):
$Background/Right.modulate = color
@ -13,77 +16,299 @@ func _on_RightColorPicker_color_changed(color: Color):
$Gameplay/RightPlayArea/Tiles.self_modulate = color
$Gameplay/RightPlayArea/Label.self_modulate = color
$Gameplay/Minimap/Right.self_modulate = color
$Transitions/RightTransition.color = color
$Results/Container/Scores/Right.self_modulate = color
$Results/Container/Rounds/Right.self_modulate = color
const SHAPE = [
# Cross
const SHAPES = [
# # Good intro level
# [
# " RRBB ",
# "RRBRBB",
# "RBRBRB",
# "BRBRBR",
# "BBRBRR",
# " BBRR "
# ],
# # With a trick
# [
# " RBBR ",
# "RBRRBR",
# "BRWWRB",
# "BRWWRB",
# "RBRRBR",
# " RBBR "
# ],
# # The Gap
# [
# " RRBB ",
# "RBBRRB",
# "BRRBBR",
# "RBB RB",
# "BRRBBR",
# " BBRR "
# ],
# # Larger
# [
# " GGBB ",
# " GRRYYB ",
# "GRRRYYYB",
# "GRRRYYYB",
# "YBBBGGGR",
# "YBBBGGGR",
# " YBBGGR ",
# " YYRR "
# ],
# # Donut
# [
# " RBBR ",
# " RBRRBR ",
# "RBRBBRBR",
# "BRB BRB",
# "BRB BRB",
# "RBRBBRBR",
# " RBRRBR ",
# " RBBR "
# ],
# # Huge
# [
# " BBBRRR ",
# " 22222222 ",
# "R22222222B",
# "R222 2222B",
# "R222222 2B",
# "B2 222222R",
# "B2222 222R",
# "B22222222R",
# " 22222222 ",
# " RRRBBB "
# ]
]
const RANDOM_SHAPES = [
# # Smol 2
# [
# " 2222 ",
# "222222",
# "222222",
# "222222",
# "222222",
# " 2222 ",
# ],
# # Smol 3
# [
# " 3333 ",
# "333333",
# "333333",
# "333333",
# "333333",
# " 3333 ",
# ],
# # Smol 4
# [
# " 4444 ",
# "444444",
# "444444",
# "444444",
# "444444",
# " 4444 ",
# ],
# # Larger 3
# [
# " 3333 ",
# " 333333 ",
# "33333333",
# "33333333",
# "33333333",
# "33333333",
# " 333333 ",
# " 3333 "
# ],
# # Larger 4
# [
# " 4444 ",
# " 444444 ",
# "44444444",
# "44444444",
# "44444444",
# "44444444",
# " 444444 ",
# " 4444 "
# ],
# # Larger 5
# [
# " 5555 ",
# " 555555 ",
# "55555555",
# "55555555",
# "55555555",
# "55555555",
# " 555555 ",
# " 5555 "
# ],
# # Donut 3
# [
# " 3333 ",
# " 333333 ",
# "33333333",
# "333 333",
# "333 333",
# "33333333",
# " 333333 ",
# " 3333 "
# ],
# # Huge mix
# [
# " 2222 ",
# " 233332 ",
# " 23555532 ",
# "2355555532",
# "2355555532",
# "2355555532",
# "2355555532",
# " 23555532 ",
# " 233332 ",
# " 2222 "
# ],
# Huge 3
[
" GG ",
" YY ",
" YGGY ",
"RBRWWRBR",
"RBRWWRBR",
" YGGY ",
" YY ",
" GG "
],
# Larger
[
" GGBB ",
" GRRYYB ",
"GRRRYYYB",
"GRRRYYYB",
"YBBBGGGR",
"YBBBGGGR",
" YBBGGR ",
" YYRR "
],
# Donut
[
" RBBR ",
" RBRRBR ",
"RBRBBRBR",
"BRB BRB",
"BRB BRB",
"RBRBBRBR",
" RBRRBR ",
" RBBR "
],
# Good intro level
[
" RRBB ",
"RRBRBB",
"RBRBRB",
"BRBRBR",
"BBRBRR",
" BBRR "
],
# With a trick
[
" RBBR ",
"RBRRBR",
"BRWWRB",
"BRWWRB",
"RBRRBR",
" RBBR "
],
# TODO: Find solution?
[
" RRBB ",
"RBBRRB",
"BRRBBR",
"RBB RB",
"BRRBBR",
" BBRR "
],
" 3333 ",
" 33333333 ",
" 33333333 ",
"3333333333",
"3333333333",
"3333333333",
"3333333333",
" 33333333 ",
" 33333333 ",
" 3333 "
]
]
func _on_Button_button_up():
$Menu.visible = false
$Gameplay.visible = true
$Gameplay/LeftPlayArea.tiles_init(SHAPE[0])
$Transitions/MenuTransition/Fade.play("FadeIn")
func init_round():
var shape = SHAPES.pop_front()
if shape == null:
shape = RANDOM_SHAPES[rng.randi_range(0, len(RANDOM_SHAPES)) - 1]
var current_time = OS.get_unix_time()
print("Using %d as seed" % current_time)
$Gameplay/LeftPlayArea.tiles_init(shape, current_time)
$Gameplay/LeftPlayArea.cursor_init()
$Gameplay/RightPlayArea.tiles_init(SHAPE[0])
$Gameplay/RightPlayArea.tiles_init(shape, current_time)
$Gameplay/RightPlayArea.cursor_init()
func start_round():
$Gameplay/Timer.start()
$Gameplay/LeftPlayArea.can_act = true
$Gameplay/RightPlayArea.can_act = true
$Gameplay/Music/MusicBase.play()
if len($Gameplay/LeftPlayArea/Tiles.shape) >= 6:
$Gameplay/Music/MusicSine.play()
if len($Gameplay/LeftPlayArea/Tiles.shape) >= 8:
$Gameplay/Music/MusicSquare.play()
if len($Gameplay/LeftPlayArea/Tiles.shape) >= 10:
$Gameplay/Music/MusicSaw.play()
func _on_MenuFade_animation_finished(anim_name: String):
if anim_name == "FadeIn":
$Gameplay.visible = true
init_round()
$Transitions/MenuTransition/Fade.play("FadeOut")
elif anim_name == "FadeOut":
start_round()
var which_transition
var left_rounds = 0
var right_rounds = 0
var completed_rounds = 0
func _on_PlayTimer_timeout():
$Gameplay/LeftPlayArea.can_act = false
$Gameplay/RightPlayArea.can_act = false
var left_score = $Gameplay/LeftPlayArea.score
var right_score = $Gameplay/RightPlayArea.score
completed_rounds += 1
if left_score > right_score:
$Results/Container/Winner.text = "Left wins the round!"
left_rounds += 1
which_transition = "Left"
$Transitions/LeftTransition/Fade.play("FadeIn")
elif left_score < right_score:
$Results/Container/Winner.text = "Right wins the round!"
right_rounds += 1
which_transition = "Right"
$Transitions/RightTransition/Fade.play("FadeIn")
else:
$Results/Container/Winner.text = "It's a tie!"
which_transition = "Tie"
$Transitions/TieTransition/Fade.play("FadeIn")
$Results/Container/Scores/Left.text = "%d" % left_score
$Results/Container/Scores/Right.text = "%d" % right_score
$Results/Container/Rounds/Left.text = "%d" % left_rounds
$Results/Container/Rounds/Right.text = "%d" % right_rounds
func _on_SideFade_animation_finished(anim_name: String):
if anim_name == "FadeIn":
$Results.visible = true
$Results/Timer.start()
elif anim_name == "FadeOut":
start_round()
func _on_ResultsTimer_timeout():
$Results.visible = false
init_round()
if which_transition == "Left":
$Transitions/LeftTransition/Fade.play("FadeOut")
if which_transition == "Right":
$Transitions/RightTransition/Fade.play("FadeOut")
if which_transition == "Tie":
$Transitions/TieTransition/Fade.play("FadeOut")
var rng = RandomNumberGenerator.new()
func _ready():
# Now this is a good hack
rng.seed = OS.get_datetime()["minute"]
func _process(_delta):
if Input.is_action_just_pressed("mute_music"):
var bus = AudioServer.get_bus_index("Music")
if AudioServer.get_bus_volume_db(bus) == 0:
AudioServer.set_bus_volume_db(bus, -80)
else:
AudioServer.set_bus_volume_db(bus, 0)
if Input.is_action_just_pressed("mute_sound"):
var bus = AudioServer.get_bus_index("Sound")
if AudioServer.get_bus_volume_db(bus) == 0:
AudioServer.set_bus_volume_db(bus, -80)
else:
AudioServer.set_bus_volume_db(bus, 0)

View file

@ -1,9 +1,198 @@
[gd_scene load_steps=5 format=2]
[gd_scene load_steps=18 format=2]
[ext_resource path="res://src/scenes/Menu.tscn" type="PackedScene" id=1]
[ext_resource path="res://src/scenes/Gameplay.tscn" type="PackedScene" id=2]
[ext_resource path="res://src/scenes/Background.tscn" type="PackedScene" id=3]
[ext_resource path="res://src/Main.gd" type="Script" id=5]
[ext_resource path="res://src/scenes/Results.tscn" type="PackedScene" id=6]
[sub_resource type="Animation" id=2]
resource_name = "FadeIn"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
}
[sub_resource type="Animation" id=1]
resource_name = "FadeOut"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=3]
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=5]
resource_name = "FadeIn"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
}
[sub_resource type="Animation" id=4]
resource_name = "FadeOut"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=6]
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=8]
resource_name = "FadeIn"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
}
[sub_resource type="Animation" id=7]
resource_name = "FadeOut"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=9]
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=10]
resource_name = "FadeIn"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
}
[sub_resource type="Animation" id=11]
resource_name = "FadeOut"
step = 0.0166667
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=12]
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[node name="Main" type="Node2D"]
script = ExtResource( 5 )
@ -13,27 +202,160 @@ position = Vector2( 800, 450 )
[node name="Menu" parent="." instance=ExtResource( 1 )]
[node name="ColorPicker" parent="Menu/VBoxContainer/Colors/Left Player" index="1"]
margin_left = 0.0
margin_top = 34.0
margin_right = 420.0
margin_bottom = 508.0
[node name="Title" parent="Menu/VBoxContainer" index="0"]
margin_top = 78.0
margin_right = 1600.0
margin_bottom = 136.0
[node name="ColorPicker" parent="Menu/VBoxContainer/Colors/Right Player" index="1"]
margin_left = 0.0
margin_top = 34.0
margin_right = 420.0
margin_bottom = 508.0
[node name="Title2" parent="Menu/VBoxContainer" index="1"]
margin_top = 140.0
margin_right = 1600.0
margin_bottom = 170.0
[node name="Padding" parent="Menu/VBoxContainer" index="2"]
margin_top = 174.0
margin_right = 1600.0
margin_bottom = 214.0
[node name="Colors" parent="Menu/VBoxContainer" index="3"]
margin_top = 218.0
margin_right = 1600.0
margin_bottom = 726.0
[node name="Left Player" parent="Menu/VBoxContainer/Colors" index="0"]
margin_left = 304.0
margin_right = 724.0
[node name="Vs" parent="Menu/VBoxContainer/Colors" index="1"]
margin_left = 728.0
margin_right = 872.0
[node name="Right Player" parent="Menu/VBoxContainer/Colors" index="2"]
margin_left = 876.0
margin_right = 1296.0
[node name="Padding2" parent="Menu/VBoxContainer" index="4"]
margin_top = 730.0
margin_right = 1600.0
margin_bottom = 770.0
[node name="Button" parent="Menu/VBoxContainer" index="5"]
margin_left = 720.0
margin_top = 774.0
margin_right = 880.0
margin_bottom = 822.0
[node name="Gameplay" parent="." instance=ExtResource( 2 )]
visible = false
[node name="SoundMove" parent="Gameplay/LeftPlayArea/Tiles/Cursor" index="0"]
bus = "Left"
[node name="SoundOk" parent="Gameplay/LeftPlayArea/Tiles/Cursor" index="1"]
bus = "Left"
[node name="SoundMove" parent="Gameplay/RightPlayArea/Tiles/Cursor" index="0"]
bus = "Right"
[node name="SoundOk" parent="Gameplay/RightPlayArea/Tiles/Cursor" index="1"]
bus = "Right"
[node name="Transitions" type="Control" parent="."]
margin_right = 1600.0
margin_bottom = 900.0
mouse_filter = 2
[node name="MenuTransition" type="ColorRect" parent="Transitions"]
modulate = Color( 1, 1, 1, 0 )
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
[node name="Fade" type="AnimationPlayer" parent="Transitions/MenuTransition"]
anims/FadeIn = SubResource( 2 )
anims/FadeOut = SubResource( 1 )
anims/RESET = SubResource( 3 )
[node name="LeftTransition" type="ColorRect" parent="Transitions"]
modulate = Color( 1, 1, 1, 0 )
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
color = Color( 1, 0.7, 0.7, 1 )
[node name="Fade" type="AnimationPlayer" parent="Transitions/LeftTransition"]
anims/FadeIn = SubResource( 5 )
anims/FadeOut = SubResource( 4 )
anims/RESET = SubResource( 6 )
[node name="RightTransition" type="ColorRect" parent="Transitions"]
modulate = Color( 1, 1, 1, 0 )
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
color = Color( 0.7, 0.7, 1, 1 )
[node name="Fade" type="AnimationPlayer" parent="Transitions/RightTransition"]
anims/FadeIn = SubResource( 8 )
anims/FadeOut = SubResource( 7 )
anims/RESET = SubResource( 9 )
[node name="TieTransition" type="ColorRect" parent="Transitions"]
modulate = Color( 1, 1, 1, 0 )
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
[node name="Fade" type="AnimationPlayer" parent="Transitions/TieTransition"]
anims/FadeIn = SubResource( 10 )
anims/FadeOut = SubResource( 11 )
anims/RESET = SubResource( 12 )
[node name="Results" parent="." instance=ExtResource( 6 )]
visible = false
[node name="Winner" parent="Results/Container" index="0"]
margin_top = 331.0
margin_bottom = 389.0
[node name="Padding1" parent="Results/Container" index="1"]
margin_top = 393.0
margin_bottom = 425.0
[node name="ScoreLabel" parent="Results/Container" index="2"]
margin_top = 429.0
margin_bottom = 430.0
[node name="Scores" parent="Results/Container" index="3"]
margin_top = 434.0
margin_bottom = 464.0
[node name="Padding2" parent="Results/Container" index="4"]
margin_top = 468.0
margin_bottom = 500.0
[node name="RoundsLabel" parent="Results/Container" index="5"]
margin_top = 504.0
margin_bottom = 534.0
custom_colors/font_outline_modulate = Color( 0, 0, 0, 1 )
[node name="Rounds" parent="Results/Container" index="6"]
margin_top = 538.0
margin_bottom = 568.0
[connection signal="color_changed" from="Menu/VBoxContainer/Colors/Left Player/ColorPicker" to="." method="_on_LeftColorPicker_color_changed"]
[connection signal="color_changed" from="Menu/VBoxContainer/Colors/Right Player/ColorPicker" to="." method="_on_RightColorPicker_color_changed"]
[connection signal="button_up" from="Menu/VBoxContainer/Button" to="." method="_on_Button_button_up"]
[connection signal="timeout" from="Gameplay/Timer" to="." method="_on_PlayTimer_timeout"]
[connection signal="animation_finished" from="Transitions/MenuTransition/Fade" to="." method="_on_MenuFade_animation_finished"]
[connection signal="animation_finished" from="Transitions/LeftTransition/Fade" to="." method="_on_SideFade_animation_finished"]
[connection signal="animation_finished" from="Transitions/RightTransition/Fade" to="." method="_on_SideFade_animation_finished"]
[connection signal="animation_finished" from="Transitions/TieTransition/Fade" to="." method="_on_SideFade_animation_finished"]
[connection signal="timeout" from="Results/Timer" to="." method="_on_ResultsTimer_timeout"]
[editable path="Background"]
[editable path="Menu"]
[editable path="Gameplay"]
[editable path="Gameplay/LeftPlayArea"]
[editable path="Gameplay/RightPlayArea"]
[editable path="Results"]

View file

@ -3,7 +3,7 @@
[ext_resource path="res://src/sprites/background.png" type="Texture" id=1]
[node name="Background" type="Node2D"]
modulate = Color( 0.117647, 0.117647, 0.117647, 1 )
modulate = Color( 0.25, 0.25, 0.25, 1 )
[node name="Left" type="Sprite" parent="."]
modulate = Color( 1, 0.701961, 0.701961, 1 )

View file

@ -5,8 +5,3 @@ func _process(_delta):
var timer = $Timer
$Minimap/Left.position.x = (1 - timer.time_left / timer.wait_time) * (get_viewport().size.x / 2)
$Minimap/Right.position.x = get_viewport().size.x - (1 - timer.time_left / timer.wait_time) * (get_viewport().size.x / 2)
func _on_Timer_timeout():
$LeftPlayArea.can_act = false
$RightPlayArea.can_act = false

View file

@ -1,9 +1,13 @@
[gd_scene load_steps=5 format=2]
[gd_scene load_steps=9 format=2]
[ext_resource path="res://src/scenes/Gameplay.gd" type="Script" id=1]
[ext_resource path="res://src/sprites/atom.png" type="Texture" id=2]
[ext_resource path="res://src/music/2-atoms-sine.ogg" type="AudioStream" id=3]
[ext_resource path="res://src/music/2-atoms-square.ogg" type="AudioStream" id=4]
[ext_resource path="res://src/music/2-atoms-base.ogg" type="AudioStream" id=5]
[ext_resource path="res://src/scenes/Play Area.tscn" type="PackedScene" id=6]
[ext_resource path="res://src/scenes/Timer.tscn" type="PackedScene" id=7]
[ext_resource path="res://src/music/2-atoms-saw.ogg" type="AudioStream" id=8]
[node name="Gameplay" type="Node2D"]
script = ExtResource( 1 )
@ -29,6 +33,24 @@ self_modulate = Color( 0.701961, 0.701961, 1, 1 )
[node name="Timer" parent="." instance=ExtResource( 7 )]
one_shot = true
[node name="Music" type="Node" parent="."]
[node name="MusicBase" type="AudioStreamPlayer" parent="Music"]
stream = ExtResource( 5 )
bus = "Music"
[node name="MusicSine" type="AudioStreamPlayer" parent="Music"]
stream = ExtResource( 3 )
bus = "Music"
[node name="MusicSquare" type="AudioStreamPlayer" parent="Music"]
stream = ExtResource( 4 )
bus = "Music"
[node name="MusicSaw" type="AudioStreamPlayer" parent="Music"]
stream = ExtResource( 8 )
bus = "Music"
[node name="Minimap" type="Node2D" parent="."]
position = Vector2( 0, 16 )
@ -43,7 +65,5 @@ position = Vector2( 1600, 0 )
scale = Vector2( 0.5, 0.5 )
texture = ExtResource( 2 )
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
[editable path="LeftPlayArea"]
[editable path="RightPlayArea"]

View file

@ -31,7 +31,7 @@ margin_top = 528.0
margin_right = 3200.0
margin_bottom = 586.0
custom_fonts/font = SubResource( 3 )
text = "Atomic Clash"
text = "Particle Clash"
align = 1
[node name="Title2" type="Label" parent="VBoxContainer"]

View file

@ -1,11 +1,11 @@
extends Sprite
var can_act = true
var can_act = false
func tiles_init(shape):
$Tiles.set_shape(shape)
func tiles_init(shape, sd):
$Tiles.set_shape(shape, sd)
check_matches()
@ -87,9 +87,16 @@ func cursor_rotate():
$Tiles.atoms[cursor_pos.y+1][cursor_pos.x] = bottom_right
# Optimizable
check_matches()
var old_score = score
var new_score = check_matches()
if new_score > old_score:
$Tiles/Cursor/SoundOk.play()
else:
$Tiles/Cursor/SoundMove.play()
var score
func check_matches():
# Horizontally
var size = $Tiles.size
@ -134,8 +141,7 @@ func check_matches():
a4.linked = true
y += 1
var score = 0
score = 0
for row in $Tiles.atoms:
for col in row:
if col == null:
@ -145,6 +151,7 @@ func check_matches():
$Label.text = "%d" % score
return score
export(String) var player

View file

@ -1,10 +1,12 @@
[gd_scene load_steps=8 format=2]
[gd_scene load_steps=10 format=2]
[ext_resource path="res://src/sprites/huge-atom.png" type="Texture" id=1]
[ext_resource path="res://src/scenes/Play Area.gd" type="Script" id=2]
[ext_resource path="res://src/sounds/2-atoms-ok.ogg" type="AudioStream" id=3]
[ext_resource path="res://src/sprites/spinner.png" type="Texture" id=4]
[ext_resource path="res://src/fonts/Xolonium-Bold.ttf" type="DynamicFontData" id=5]
[ext_resource path="res://src/scenes/tiles/Tiles.tscn" type="PackedScene" id=6]
[ext_resource path="res://src/sounds/2-atoms-move.ogg" type="AudioStream" id=7]
[sub_resource type="DynamicFont" id=2]
size = 48
@ -36,3 +38,9 @@ valign = 2
[node name="Cursor" type="Sprite" parent="Tiles"]
position = Vector2( -43, -43 )
texture = ExtResource( 4 )
[node name="SoundMove" type="AudioStreamPlayer" parent="Tiles/Cursor"]
stream = ExtResource( 7 )
[node name="SoundOk" type="AudioStreamPlayer" parent="Tiles/Cursor"]
stream = ExtResource( 3 )

118
src/scenes/Results.tscn Normal file
View file

@ -0,0 +1,118 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://src/fonts/Xolonium-Bold.ttf" type="DynamicFontData" id=1]
[ext_resource path="res://src/themes/results_theme.tres" type="Theme" id=2]
[sub_resource type="DynamicFont" id=1]
size = 48
outline_size = 2
outline_color = Color( 0, 0, 0, 1 )
font_data = ExtResource( 1 )
[node name="Results" type="Control"]
margin_right = 1600.0
margin_bottom = 900.0
theme = ExtResource( 2 )
[node name="Container" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
alignment = 1
[node name="Winner" type="Label" parent="Container"]
margin_top = 317.0
margin_right = 1600.0
margin_bottom = 375.0
custom_fonts/font = SubResource( 1 )
text = "%s wins the round!"
align = 1
[node name="Padding1" type="HBoxContainer" parent="Container"]
margin_top = 379.0
margin_right = 1600.0
margin_bottom = 411.0
rect_min_size = Vector2( 0, 32 )
alignment = 1
[node name="ScoreLabel" type="Label" parent="Container"]
margin_top = 415.0
margin_right = 1600.0
margin_bottom = 445.0
text = "Round score:"
align = 1
[node name="Scores" type="HBoxContainer" parent="Container"]
margin_top = 449.0
margin_right = 1600.0
margin_bottom = 479.0
alignment = 1
[node name="Left" type="Label" parent="Container/Scores"]
self_modulate = Color( 1, 0.701961, 0.701961, 1 )
margin_left = 748.0
margin_right = 790.0
margin_bottom = 30.0
text = "%d"
align = 1
[node name="Dash" type="Label" parent="Container/Scores"]
margin_left = 794.0
margin_right = 805.0
margin_bottom = 30.0
text = "-"
align = 1
[node name="Right" type="Label" parent="Container/Scores"]
self_modulate = Color( 0.7, 0.7, 1, 1 )
margin_left = 809.0
margin_right = 851.0
margin_bottom = 30.0
text = "%d"
align = 1
[node name="Padding2" type="HBoxContainer" parent="Container"]
margin_top = 483.0
margin_right = 1600.0
margin_bottom = 515.0
rect_min_size = Vector2( 0, 32 )
alignment = 1
[node name="RoundsLabel" type="Label" parent="Container"]
margin_top = 519.0
margin_right = 1600.0
margin_bottom = 549.0
text = "Rounds won:"
align = 1
[node name="Rounds" type="HBoxContainer" parent="Container"]
margin_top = 553.0
margin_right = 1600.0
margin_bottom = 583.0
alignment = 1
[node name="Left" type="Label" parent="Container/Rounds"]
self_modulate = Color( 1, 0.701961, 0.701961, 1 )
margin_left = 748.0
margin_right = 790.0
margin_bottom = 30.0
text = "%d"
align = 1
[node name="Dash" type="Label" parent="Container/Rounds"]
margin_left = 794.0
margin_right = 805.0
margin_bottom = 30.0
text = "-"
align = 1
[node name="Right" type="Label" parent="Container/Rounds"]
self_modulate = Color( 0.7, 0.7, 1, 1 )
margin_left = 809.0
margin_right = 851.0
margin_bottom = 30.0
text = "%d"
align = 1
[node name="Timer" type="Timer" parent="."]
wait_time = 3.0
one_shot = true

View file

@ -1,21 +1,4 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://src/music/2-atoms-sine.ogg" type="AudioStream" id=1]
[ext_resource path="res://src/music/2-atoms-square.ogg" type="AudioStream" id=2]
[ext_resource path="res://src/music/2-atoms-saw.ogg" type="AudioStream" id=3]
[ext_resource path="res://src/music/2-atoms-base.ogg" type="AudioStream" id=4]
[gd_scene format=2]
[node name="Timer" type="Timer"]
wait_time = 10.0
[node name="AudioBase" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 4 )
[node name="AudioSine" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 1 )
[node name="AudioSquare" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 2 )
[node name="AudioSaw" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 3 )

View file

@ -5,38 +5,53 @@ const COLORS = {
"R": Color.red,
"G": Color.green,
"B": Color.blue,
"Y": Color.yellow,
"C": Color.cyan,
"M": Color.magenta,
"Y": Color.yellow,
"W": Color.white,
"K": Color.black,
}
const ATOM = preload("res://src/scenes/Atom.tscn")
const TILE_SIZE = 86
const TILE_OFFSET = TILE_SIZE / 2
var shape setget set_shape
var shape
var size
var atoms = []
func set_shape(val):
var rng
func set_shape(val, sd):
var new_size = len(val)
var rescale_to = clamp(6 / float(new_size), 0, 1)
clear()
for atom in $Atoms.get_children():
atom.queue_free()
rng = RandomNumberGenerator.new()
rng.set_seed(sd)
atoms = []
var y = - (new_size / 2)
var offset = new_size / 2
var y = - offset
for row in val:
var atoms_row = []
var x = - (new_size / 2)
var x = - offset
for col in row:
if col != " ":
set_cell(x, y, 0)
var atom = ATOM.instance()
var random_amount = int(col)
if random_amount > 0:
var keys = COLORS.keys()
col = keys[rng.randi() % min(len(keys), random_amount)]
val[y+offset][x+offset] = col
atom.self_modulate = COLORS[col]
atom.position = Vector2(x * TILE_SIZE + TILE_SIZE / 2, y * TILE_SIZE + TILE_SIZE / 2)
add_child(atom)
atom.position = Vector2(x * TILE_SIZE + TILE_OFFSET, y * TILE_SIZE + TILE_OFFSET)
$Atoms.add_child(atom)
atoms_row.append(atom)
else:
atoms_row.append(null)

View file

@ -26,3 +26,5 @@ cell_size = Vector2( 86, 86 )
cell_tile_origin = 1
format = 1
script = ExtResource( 2 )
[node name="Atoms" type="Node2D" parent="."]

BIN
src/sounds/2-atoms-move.ogg (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -0,0 +1,15 @@
[remap]
importer="ogg_vorbis"
type="AudioStreamOGGVorbis"
path="res://.import/2-atoms-move.ogg-9aff9ecc31b438bca63464d86950467a.oggstr"
[deps]
source_file="res://src/sounds/2-atoms-move.ogg"
dest_files=[ "res://.import/2-atoms-move.ogg-9aff9ecc31b438bca63464d86950467a.oggstr" ]
[params]
loop=false
loop_offset=0

BIN
src/sounds/2-atoms-ok.ogg (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -0,0 +1,15 @@
[remap]
importer="ogg_vorbis"
type="AudioStreamOGGVorbis"
path="res://.import/2-atoms-ok.ogg-a135787d3dc656cf002152792228d563.oggstr"
[deps]
source_file="res://src/sounds/2-atoms-ok.ogg"
dest_files=[ "res://.import/2-atoms-ok.ogg-a135787d3dc656cf002152792228d563.oggstr" ]
[params]
loop=false
loop_offset=0

View file

@ -0,0 +1,10 @@
[gd_resource type="Theme" load_steps=3 format=2]
[ext_resource path="res://src/fonts/Xolonium-Regular.ttf" type="DynamicFontData" id=1]
[sub_resource type="DynamicFont" id=1]
size = 24
font_data = ExtResource( 1 )
[resource]
default_font = SubResource( 1 )

View file

@ -0,0 +1,12 @@
[gd_resource type="Theme" load_steps=3 format=2]
[ext_resource path="res://src/fonts/Xolonium-Regular.ttf" type="DynamicFontData" id=1]
[sub_resource type="DynamicFont" id=1]
size = 24
outline_size = 1
outline_color = Color( 0, 0, 0, 1 )
font_data = ExtResource( 1 )
[resource]
default_font = SubResource( 1 )