diff --git a/BG.gd b/BG.gd
index 717bb5e..6d20fac 100644
--- a/BG.gd
+++ b/BG.gd
@@ -11,4 +11,16 @@ func _process(delta):
if $bg1.position.x < -550:
$bg1.position.x = 1600
if $bg2.position.x < -550:
- $bg2.position.x = 1600
\ No newline at end of file
+ $bg2.position.x = 1600
+
+ if $Sun.visible == true:
+ if $Sun.position.x < -2500:
+ $Sun.visible = false
+ $Sun.position.x = 1250
+ $Sun.position.x -= delta*2.5
+
+ if $Orange.visible == true:
+ if $Orange.position.x < -5000:
+ $Orange.visible = false
+ $Orange.position.x = 1600
+ $Orange.position.x -= delta*1.5
diff --git a/BG.tscn b/BG.tscn
new file mode 100644
index 0000000..e599596
--- /dev/null
+++ b/BG.tscn
@@ -0,0 +1,152 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://BG.gd" type="Script" id=1]
+[ext_resource path="res://art/backgrounds/SunBG.png" type="Texture" id=2]
+[ext_resource path="res://art/bg.png" type="Texture" id=3]
+[ext_resource path="res://art/backgrounds/orange.png" type="Texture" id=4]
+
+[node name="BG" type="Node2D"]
+
+z_index = -1
+script = ExtResource( 1 )
+_sections_unfolded = [ "Z Index" ]
+
+[node name="CanvasModulate" type="CanvasModulate" parent="." index="0"]
+
+visible = false
+color = Color( 0, 0, 0, 1 )
+
+[node name="BlackBG" type="ColorRect" parent="." index="1"]
+
+light_mask = 0
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1035.0
+margin_bottom = 602.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+color = Color( 0, 0, 0, 1 )
+_sections_unfolded = [ "Anchor", "Focus", "Grow Direction", "Hint", "Margin", "Material", "Mouse", "Pause", "Rect", "Size Flags", "Theme", "Visibility" ]
+
+[node name="Sun" type="Sprite" parent="." index="2"]
+
+visible = false
+position = Vector2( 1250, 154.764 )
+z_index = 1
+texture = ExtResource( 2 )
+_sections_unfolded = [ "Transform", "Z Index" ]
+
+[node name="bg1" type="Sprite" parent="." index="3"]
+
+editor/display_folded = true
+light_mask = 2
+position = Vector2( 577.646, 365.663 )
+scale = Vector2( 0.694364, 0.694364 )
+texture = ExtResource( 3 )
+_sections_unfolded = [ "Transform", "Visibility", "Z Index" ]
+
+[node name="Light2D" type="Light2D" parent="bg1" index="0"]
+
+visible = false
+enabled = true
+editor_only = false
+texture = ExtResource( 3 )
+offset = Vector2( 0, 0 )
+texture_scale = 1.0
+color = Color( 1, 1, 1, 1 )
+energy = 2.5
+mode = 0
+range_height = 0.0
+range_z_min = -1024
+range_z_max = 1024
+range_layer_min = 0
+range_layer_max = 0
+range_item_cull_mask = 2
+shadow_enabled = false
+shadow_color = Color( 0, 0, 0, 0 )
+shadow_buffer_size = 2048
+shadow_gradient_length = 0.0
+shadow_filter = 0
+shadow_filter_smooth = 0.0
+shadow_item_cull_mask = 2
+_sections_unfolded = [ "Range", "Shadow" ]
+
+[node name="bg2" type="Sprite" parent="." index="4"]
+
+editor/display_folded = true
+light_mask = 2
+position = Vector2( 1823.66, 361.868 )
+scale = Vector2( 0.6985, 0.6985 )
+texture = ExtResource( 3 )
+_sections_unfolded = [ "Transform", "Visibility", "Z Index" ]
+
+[node name="Light2D" type="Light2D" parent="bg2" index="0"]
+
+visible = false
+enabled = true
+editor_only = false
+texture = ExtResource( 3 )
+offset = Vector2( 0, 0 )
+texture_scale = 1.0
+color = Color( 1, 1, 1, 1 )
+energy = 2.5
+mode = 0
+range_height = 0.0
+range_z_min = -1024
+range_z_max = 1024
+range_layer_min = 0
+range_layer_max = 0
+range_item_cull_mask = 2
+shadow_enabled = false
+shadow_color = Color( 0, 0, 0, 0 )
+shadow_buffer_size = 2048
+shadow_gradient_length = 0.0
+shadow_filter = 0
+shadow_filter_smooth = 0.0
+shadow_item_cull_mask = 2
+_sections_unfolded = [ "Range", "Shadow" ]
+
+[node name="Orange" type="Sprite" parent="." index="5"]
+
+visible = false
+light_mask = 0
+position = Vector2( 1617.48, 325.617 )
+scale = Vector2( 0.694364, 0.694364 )
+texture = ExtResource( 4 )
+_sections_unfolded = [ "Material", "Transform", "Visibility", "Z Index" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Light2D" type="Light2D" parent="Orange" index="0"]
+
+enabled = true
+editor_only = false
+texture = ExtResource( 4 )
+offset = Vector2( 0, 0 )
+texture_scale = 1.0
+color = Color( 1, 1, 1, 1 )
+energy = 1.0
+mode = 3
+range_height = 0.0
+range_z_min = -1024
+range_z_max = 1024
+range_layer_min = 0
+range_layer_max = 0
+range_item_cull_mask = 1
+shadow_enabled = false
+shadow_color = Color( 0, 0, 0, 0 )
+shadow_buffer_size = 2048
+shadow_gradient_length = 0.0
+shadow_filter = 0
+shadow_filter_smooth = 0.0
+shadow_item_cull_mask = 1
+_sections_unfolded = [ "Transform", "Z Index" ]
+
+
diff --git a/Bad.gd b/Bad.gd
index 5d7ab59..4f3063c 100644
--- a/Bad.gd
+++ b/Bad.gd
@@ -56,4 +56,8 @@ func _process(delta):
if velocity.length() > 0:
velocity = velocity.normalized() * speed
+ if position.x < -100:
+ emit_signal("dead", 0)
+ queue_free()
+
position += velocity * delta
\ No newline at end of file
diff --git a/Bad.tscn b/Bad.tscn
index 53aa462..bec2dc8 100644
--- a/Bad.tscn
+++ b/Bad.tscn
@@ -1,6 +1,8 @@
[gd_scene format=2]
-[node name="BadClass" type="Area2D" index="0"]
+[node name="BadClass" type="Area2D" groups=[
+"enemies",
+]]
input_pickable = true
gravity_vec = Vector2( 0, 1 )
@@ -11,7 +13,7 @@ collision_layer = 2
collision_mask = 0
audio_bus_override = false
audio_bus_name = "Master"
-_sections_unfolded = [ "Collision" ]
+_sections_unfolded = [ "Audio Bus", "Collision", "Material", "Pause", "Pickable", "Transform", "Visibility", "Z Index" ]
[node name="CollisionBox" type="CollisionShape2D" parent="." index="0"]
diff --git a/Bad1.gd b/Bad1.gd
index 1d293d7..8717b26 100644
--- a/Bad1.gd
+++ b/Bad1.gd
@@ -29,10 +29,6 @@ var boss = false
var health = 50
var hit_timer = 1000
-func _on_Visibility_screen_exited():
- prints("bye-bye, bad bad")
- queue_free()
-
func _ready():
connect("area_entered", self, "hit")
pass
@@ -46,7 +42,7 @@ func hit(who):
$Line2D.set_point_position( 1, health_bar )
if health <= 0:
- emit_signal("dead", 15)
+ emit_signal("dead", 10) # was 12 # was 15
queue_free()
var velocity = Vector2()
@@ -65,4 +61,8 @@ func _process(delta):
if velocity.length() > 0:
velocity = velocity.normalized() * SPEED
- position += velocity * delta
\ No newline at end of file
+ position += velocity * delta
+
+ if position.x < -100:
+ emit_signal("dead", 0)
+ queue_free()
\ No newline at end of file
diff --git a/Bad1.tscn b/Bad1.tscn
index d2c4311..42762ce 100644
--- a/Bad1.tscn
+++ b/Bad1.tscn
@@ -19,7 +19,9 @@ animations = [ {
custom_solver_bias = 0.0
radius = 171.26
-[node name="Bad1" type="Area2D"]
+[node name="Bad1" type="Area2D" groups=[
+"enemies",
+]]
position = Vector2( 947.34, 293.528 )
scale = Vector2( 0.15, 0.15 )
diff --git a/BadLaser.gd b/BadLaser.gd
index 7c65800..4e0ea1e 100644
--- a/BadLaser.gd
+++ b/BadLaser.gd
@@ -29,6 +29,7 @@ var hit_timer = 1000
var can_shoot = true
var health_multi = 1
var boss = false
+var independent = true
func _on_Visibility_screen_exited():
prints("bye-bye, bad bad")
queue_free()
@@ -49,6 +50,9 @@ func _process(delta):
if health <= 0:
emit_signal("dead", 100)
queue_free()
+ if position.x < -100:
+ emit_signal("dead", 0)
+ queue_free()
$Rotatable.rotation_degrees += delta*fire_speed
@@ -98,8 +102,10 @@ func _process(delta):
var health_bar = Vector2(((health * 3.75) - 750), -1100)
$Line2D.set_point_position( 1, health_bar )
-
- position += velocity * delta
+
+ if independent == true:
+ print(independent)
+ position += velocity * delta
func shoot():
var laser = Laser.instance()
diff --git a/BadLaser.tscn b/BadLaser.tscn
index d790d1c..95fc806 100644
--- a/BadLaser.tscn
+++ b/BadLaser.tscn
@@ -1,14 +1,15 @@
-[gd_scene load_steps=8 format=2]
+[gd_scene load_steps=9 format=2]
[ext_resource path="res://BadLaser.gd" type="Script" id=1]
[ext_resource path="res://Laser.tscn" type="PackedScene" id=2]
-[ext_resource path="res://art/bad/laser/bad_laser_stationary.png" type="Texture" id=3]
-[ext_resource path="res://art/bad/laser/bad_laser_rotatable.png" type="Texture" id=4]
+[ext_resource path="res://art/bad/laser/bad_laser_bg.png" type="Texture" id=3]
+[ext_resource path="res://art/bad/laser/bad_laser_stationary.png" type="Texture" id=4]
+[ext_resource path="res://art/bad/laser/bad_laser_rotatable.png" type="Texture" id=5]
[sub_resource type="SpriteFrames" id=1]
animations = [ {
-"frames": [ ExtResource( 3 ) ],
+"frames": [ ExtResource( 4 ) ],
"loop": true,
"name": "New Anim",
"speed": 5.0
@@ -17,7 +18,7 @@ animations = [ {
[sub_resource type="SpriteFrames" id=2]
animations = [ {
-"frames": [ ExtResource( 4 ) ],
+"frames": [ ExtResource( 5 ) ],
"loop": true,
"name": "default",
"speed": 5.0
@@ -28,7 +29,9 @@ animations = [ {
custom_solver_bias = 0.0
radius = 867.264
-[node name="BadLaser" type="Area2D"]
+[node name="BadLaser" type="Area2D" groups=[
+"enemies",
+]]
position = Vector2( 947.34, 293.528 )
scale = Vector2( 0.07, 0.07 )
@@ -39,7 +42,7 @@ gravity = 98.0
linear_damp = 0.1
angular_damp = 1.0
collision_layer = 4
-collision_mask = 4
+collision_mask = 0
audio_bus_override = false
audio_bus_name = "Master"
script = ExtResource( 1 )
@@ -54,23 +57,30 @@ wait_time = 1.0
one_shot = false
autostart = false
-[node name="AnimatedSprite" type="AnimatedSprite" parent="." index="1"]
+[node name="BG" type="Sprite" parent="." index="1"]
+
+position = Vector2( 3.5857, 9.035 )
+scale = Vector2( 1.0195, 1.0195 )
+texture = ExtResource( 3 )
+
+[node name="AnimatedSprite" type="AnimatedSprite" parent="." index="2"]
frames = SubResource( 1 )
animation = "New Anim"
+_sections_unfolded = [ "Transform" ]
-[node name="Rotatable" type="AnimatedSprite" parent="." index="2"]
+[node name="Rotatable" type="AnimatedSprite" parent="." index="3"]
frames = SubResource( 2 )
animation = "default"
_sections_unfolded = [ "Transform" ]
-[node name="CollisionShape2D" type="CollisionShape2D" parent="." index="3"]
+[node name="CollisionShape2D" type="CollisionShape2D" parent="." index="4"]
position = Vector2( 0, -14.2857 )
shape = SubResource( 3 )
-[node name="Line2D" type="Line2D" parent="." index="4"]
+[node name="Line2D" type="Line2D" parent="." index="5"]
position = Vector2( 9.15527e-05, 33.3334 )
points = PoolVector2Array( -750, -1100, 143, -1100 )
diff --git a/BlackHole.gd b/BlackHole.gd
index 6e1c46d..d33363d 100644
--- a/BlackHole.gd
+++ b/BlackHole.gd
@@ -1,48 +1,62 @@
extends "res://Bad.gd"
-# class member variables go here, for example:
-# var a = 2
-# var b = "textvar"
-
var rot_speed = 1
+var dying = false
+var splitting = false
signal flash
func _ready():
- starting_health = 20000
+ starting_health = 5000
health = starting_health
speed = 10
kill_reward = 1000
boss = true
-var splitting = false
-
func _process(delta):
rotation += delta*rot_speed
if rotation > 2*PI:
rotation = 0
- if health < starting_health*0.88:
- $MainSprite.frame = 1
- if health < starting_health*0.76:
- $MainSprite.frame = 2
- if health < starting_health*0.64:
- $MainSprite.frame = 3
- if health < starting_health*0.52:
- $MainSprite.frame = 4
- if health < starting_health*0.40:
- $MainSprite.frame = 5
- if health < starting_health*0.28:
- $MainSprite.frame = 6
- if health < starting_health*0.16:
- $CollisionBox.disabled = true
+ if dying == true:
$TopHalf.visible = true
$BotHalf.visible = true
$MainSprite.visible = false
if rotation_degrees > 45 && rotation_degrees < 70:
+ if rot_speed != 0:
+ emit_signal("flash")
splitting = true
+ health = 999999
+ elif health < starting_health*0.16:
+ dying = true
+ #$CollisionBox.disabled = true
+ elif health < starting_health*0.28:
+ if $MainSprite.frame != 6:
+ emit_signal("flash")
+ $MainSprite.frame = 6
+ elif health < starting_health*0.40:
+ if $MainSprite.frame != 5:
+ emit_signal("flash")
+ $MainSprite.frame = 5
+ elif health < starting_health*0.52:
+ if $MainSprite.frame != 4:
+ emit_signal("flash")
+ $MainSprite.frame = 4
+ elif health < starting_health*0.64:
+ if $MainSprite.frame != 3:
+ emit_signal("flash")
+ $MainSprite.frame = 3
+ elif health < starting_health*0.76:
+ if $MainSprite.frame != 2:
+ emit_signal("flash")
+ $MainSprite.frame = 2
+ elif health < starting_health*0.88:
+ if $MainSprite.frame != 1:
+ emit_signal("flash")
+ $MainSprite.frame = 1
if splitting:
+ $CollisionBox.disabled = true
rot_speed = 0
$TopHalf.position.y -= delta*500
$TopHalf.position.x -= delta*250
diff --git a/BlackHole.tscn b/BlackHole.tscn
index 28f4b09..8d7277f 100644
--- a/BlackHole.tscn
+++ b/BlackHole.tscn
@@ -49,8 +49,9 @@ animations = [ {
position = Vector2( 1302.7, 306.846 )
scale = Vector2( 0.3, 0.3 )
+z_index = -1
+z_as_relative = false
script = ExtResource( 2 )
-_sections_unfolded = [ "Collision", "Transform" ]
[node name="CollisionBox" parent="." index="0"]
diff --git a/Bloob.gd b/Bloob.gd
index 6ad331b..bd3ef6c 100644
--- a/Bloob.gd
+++ b/Bloob.gd
@@ -44,9 +44,12 @@ var velocity = Vector2()
func _process(delta):
if health <= 0:
- emit_signal("dead", 50)
+ emit_signal("dead", 25) # was 40 # was 50
queue_free()
-
+ if position.x < -100:
+ emit_signal("dead", 0)
+ queue_free()
+
if hit_timer < 0.15:
hit_timer += delta
elif hit_timer < 0.25:
@@ -59,7 +62,7 @@ func _process(delta):
if velocity.length() > 0:
velocity = velocity.normalized() * SPEED
-# var health_bar = Vector2(((health * 3) - 157), -273)
-# $Line2D.set_point_position( 1, health_bar )
+ var health_bar = Vector2(((health * 2.5) - 157), -225)
+ $Line2D.set_point_position( 1, health_bar )
position += velocity * delta
\ No newline at end of file
diff --git a/Bloob.tscn b/Bloob.tscn
index 911c1ab..f08bcdb 100644
--- a/Bloob.tscn
+++ b/Bloob.tscn
@@ -18,7 +18,9 @@ animations = [ {
"speed": 5.0
} ]
-[node name="BadBlob" type="Area2D"]
+[node name="BadBlob" type="Area2D" groups=[
+"enemies",
+]]
scale = Vector2( 0.25, 0.25 )
z_index = -1
@@ -48,8 +50,8 @@ animation = "default"
[node name="Line2D" type="Line2D" parent="." index="2"]
position = Vector2( 112, 65.3334 )
-points = PoolVector2Array( -157, -273, 143, -273 )
-width = 12.0
+points = PoolVector2Array( -157, -225, 143, -225 )
+width = 8.0
default_color = Color( 0, 1, 0.0390625, 1 )
texture_mode = 31
joint_mode = 2
diff --git a/Image Sources/DiscardedBads.xcf b/Image Sources/DiscardedBads.xcf
new file mode 100644
index 0000000..8ed9ca2
Binary files /dev/null and b/Image Sources/DiscardedBads.xcf differ
diff --git a/Image Sources/ShootingDamageIcon.xcf b/Image Sources/ShootingDamageIcon.xcf
new file mode 100644
index 0000000..5952cf2
Binary files /dev/null and b/Image Sources/ShootingDamageIcon.xcf differ
diff --git a/Image Sources/SunBG.xcf b/Image Sources/SunBG.xcf
new file mode 100644
index 0000000..f9a0017
Binary files /dev/null and b/Image Sources/SunBG.xcf differ
diff --git a/Image Sources/bad1_base.png b/Image Sources/bad1_base.png
new file mode 100644
index 0000000..95cb7ff
Binary files /dev/null and b/Image Sources/bad1_base.png differ
diff --git a/Image Sources/bad1_hit.xcf b/Image Sources/bad1_hit.xcf
index 341370b..c5513e2 100644
Binary files a/Image Sources/bad1_hit.xcf and b/Image Sources/bad1_hit.xcf differ
diff --git a/Laser.gd b/Laser.gd
index 6894ced..fe19ed2 100644
--- a/Laser.gd
+++ b/Laser.gd
@@ -22,6 +22,7 @@ extends Area2D
signal hit
const DEFAULT_DAMAGE = 10
+const DEFAULT_FALLOFF = 1.2
export (int) var SPEED
export (int) var DAMAGE
@@ -30,6 +31,7 @@ var current_pen = 0
var friendly_laser = true
var damage = DEFAULT_DAMAGE
var boss = false
+var falloff = DEFAULT_FALLOFF
func _ready():
$AnimatedSprite.play()
@@ -41,6 +43,8 @@ func hit(who):
pass
elif current_pen > 0:
current_pen -= 1
+ modulate=Color("ca4747")
+ damage = damage/falloff
else:
hide()
queue_free()
diff --git a/Laser.tscn b/Laser.tscn
index e89973e..2f81b5c 100644
--- a/Laser.tscn
+++ b/Laser.tscn
@@ -19,8 +19,9 @@ animations = [ {
"speed": 20.0
} ]
-[node name="Laser" type="Area2D"]
+[node name="Laser" type="Area2D" index="0"]
+z_as_relative = false
input_pickable = true
gravity_vec = Vector2( 0, 1 )
gravity = 98.0
@@ -31,7 +32,7 @@ collision_mask = 7
audio_bus_override = false
audio_bus_name = "Master"
script = ExtResource( 1 )
-_sections_unfolded = [ "Collision", "Z Index" ]
+_sections_unfolded = [ "Collision", "Visibility", "Z Index" ]
SPEED = 1200
DAMAGE = 10
diff --git a/Main.gd b/Main.gd
index 1717f95..43aeca7 100644
--- a/Main.gd
+++ b/Main.gd
@@ -39,34 +39,101 @@ var player_info
var touchy_shooty = false
var my_info = { name = "sagethesagesage", color = "FFFFFF" }
var mainmenu
+var current_round = 1
+var spawning_done = false
var not_loading = false
-const BADDIE_WAIT_TIME_DEFAULT = 4
-
func _ready():
# Prepare black rectangle for fading in
$ColorRect.visible = true
- randomize()
-
if OS.has_touchscreen_ui_hint():
- $HowTo.visible = true
+ $HowTos/HowTo.visible = true
else:
- $HowToDesktop.visible = true
+ $HowTos/HowToDesktop.visible = true
# Launch the main menu on boot and pause the game
mainmenu = preload("res://MainMenu.tscn").instance()
add_child(mainmenu)
mainmenu.connect("multiplayer_menu", self, "_open_multiplayer_menu")
+ mainmenu.connect("start_game", self, "rounds")
get_tree().paused = true
-
- # Prepare timer for spawning enemies
- $BaddieTimer.wait_time = BADDIE_WAIT_TIME_DEFAULT
- $BaddieTimer.start()
-
+
# Seed randi for randomizing enemy spawn locations
randomize()
+ updatePoints()
+
+const DEFAULT_SPAWN_SPEED = 5
+func rounds(round_number):
+ $BG.visible = true
+
+ ##### WEAKER, LESS VALUABLE ENEMIES, AT HIGHER VOLUME, MAY BE MORE ENGAGING
+
+ # health, time, bad1s, badblobs, badlasers, badprisons
+ match round_number:
+ 1:
+ roundOfEnemies(.6,DEFAULT_SPAWN_SPEED*.75,5,0,0,0) # default
+ #roundOfEnemies(0.1,DEFAULT_SPAWN_SPEED,1,0,0,0)
+ rpc("set_wave_name", "Wave 1: Learning to fly")
+ 2:
+ roundOfEnemies(.6,DEFAULT_SPAWN_SPEED*.75,4,1,0,0)
+ #if get_tree().is_network_server() == true:
+ # rpc("bossMode", 1)
+ #else:
+ # bossMode(1)
+ rpc("set_wave_name", "Wave 2: Any colour you like")
+ 3:
+ roundOfEnemies(.6,DEFAULT_SPAWN_SPEED*.75,8,2,0,0)
+ rpc("set_wave_name", "Wave 3: Money")
+ 4:
+ roundOfEnemies(.6,DEFAULT_SPAWN_SPEED*.75,12,3,1,0)
+ rpc("set_wave_name", "Wave 4: YOU CAN BLOCK ENEMY LASERS WITH YOUR SHIP")
+ 5:
+ roundOfEnemies(.6,DEFAULT_SPAWN_SPEED*.5,15,3,0,0)
+ rpc("set_wave_name", "Wave 5: One of These Days")
+ 6:
+ roundOfEnemies(.7,DEFAULT_SPAWN_SPEED*.5,18,6,1,0)
+ rpc("set_wave_name", "Wave 6: Seamus")
+ 7:
+ roundOfEnemies(.8,DEFAULT_SPAWN_SPEED*.5,21,7,1,0)
+ rpc("set_wave_name", "Wave 7: ")
+ 8:
+ roundOfEnemies(.8,DEFAULT_SPAWN_SPEED*.75/(8/4),20,6,0,floor(8/8))
+ rpc("set_wave_name", "Wave 8: Free Four")
+ 9:
+ roundOfEnemies(.9, DEFAULT_SPAWN_SPEED*(0.5), 9*3, 9, floor(9/4), floor(9/8))
+ rpc("set_wave_name", str("Wave 9"))
+ 10:
+ rpc("set_wave_name", "Wave 10: What do you want from me?")
+ if get_tree().is_network_server() == true:
+ rpc("bossMode", 0)
+ else:
+ bossMode(0)
+ 11:
+ roundOfEnemies(1,DEFAULT_SPAWN_SPEED*.75/(11/4),11*3,11,floor(11/4),floor(11/8))
+ $WaveLabel.text = str("Wave ", 11)
+ $BG/Sun.visible = true
+ 15:
+ rpc("set_wave_name", "Wave 15: Eclipse")
+ if get_tree().is_network_server() == true:
+ rpc("bossMode", 1)
+ else:
+ bossMode(1)
+ 20:
+ roundOfEnemies((1+(20-11)/10), (DEFAULT_SPAWN_SPEED*(0.5)), 20*3, 20, floor(20/4), floor(20/8))
+ $BG/Orange.visible = true
+ var roundNo:
+ ############### health ##### spawn speed #################### bad1s#### blobs # lasers ######### prisons ######
+ roundOfEnemies((1+(roundNo-11)/10), (DEFAULT_SPAWN_SPEED*(0.5)), roundNo*3, roundNo, floor(roundNo/4), floor(roundNo/8))
+ rpc("set_wave_name", str("Wave ", roundNo))
+
+ ### Wave names ###
+ ### on rectangle's return: The Hero's Return
+ ### on Black boss appearance: Eclipse
+
+sync func set_wave_name(name):
+ $WaveLabel.text = str(name)
# Open the multiplayer section of the menu and pause the game
func _open_multiplayer_menu():
@@ -95,15 +162,13 @@ func _process(delta):
if Input.is_action_pressed("ui_accept"):
_on_HideHowTo_pressed()
- # Constantly update point display
- updatePoints()
-
# If you're in multiplayer,
if get_tree().has_network_peer():
# and not the host
if !get_tree().is_network_server():
# Stop spawning bads
- $BaddieTimer.stop()
+ #$BaddieTimer.stop()
+ pass
if (touchy_feely && (abs(touchy_feely.position.x - $Player.position.x) > 1)):
if (touchy_feely.position.x < 800):
@@ -119,11 +184,12 @@ func _process(delta):
if rectangle_opacity <= 0:
booting = false
$ColorRect.visible = false
+ $Music.playing = true
# Flash the screen white
if screen_flashing == true:
$ColorRect.color = Color(1, 1, 1, rectangle_opacity)
- rectangle_opacity -= delta/4
+ rectangle_opacity -= delta/3
if rectangle_opacity <= 0:
screen_flashing = false
$ColorRect.visible = false
@@ -132,66 +198,94 @@ func _process(delta):
func _on_bad_death(kill_money):
# Give players appropriate money
$Player.money += kill_money
+ updatePoints()
+
+ print(current_round)
+
+ if get_tree().is_network_server() || not get_tree().has_network_peer():
+ if get_tree().get_nodes_in_group("enemies").size() == 1 && spawning_done == true:
+ rpc("openPlayerMenu")
+ current_round +=1
+
+sync func openPlayerMenu():
+ $Player.upgradeMenu()
+
+func startNextRound():
+ if get_tree().is_network_server() || not get_tree().has_network_peer():
+ rounds(current_round)
+
+func roundOfEnemies(bad_health_multi, spawn_time, bad1s, badblobs, badlasers, badprisons):
+ spawning_done = false
+# each enemy type comes in as an integer
+# randomly dole out enemies until each is at 0
+ yield(get_tree().create_timer(1), "timeout")
+ var enemiesToBeSpawned = bad1s+badblobs+badlasers+badprisons
+ if enemiesToBeSpawned == 0:
+ return false
+
+ var bad_type
+ var badposition = Vector2()
+
+ while enemiesToBeSpawned > 0:
+ var nextEnemy = randi()%5
+ if (nextEnemy == 0 || nextEnemy == 4) && bad1s > 0 && get_tree().paused == false:
+ bad_type = 0
+ bad1s -= 1
+ yield(get_tree().create_timer(spawn_time), "timeout")
+ elif (nextEnemy == 1) && badblobs > 0 && get_tree().paused == false:
+ bad_type = 1
+ badblobs -= 1
+ yield(get_tree().create_timer(spawn_time), "timeout")
+ elif (nextEnemy == 2) && badlasers > 0 && get_tree().paused == false:
+ bad_type = 2
+ badlasers -= 1
+ yield(get_tree().create_timer(spawn_time), "timeout")
+ elif (nextEnemy == 3) && badprisons > 0 && get_tree().paused == false:
+ bad_type = 3
+ badprisons -= 1
+ yield(get_tree().create_timer(spawn_time), "timeout")
+ else: bad_type = 50000
+
+ enemiesToBeSpawned = bad1s+badblobs+badlasers+badprisons
+
+ if get_tree().paused == true:
+ yield(get_tree().create_timer(1), "timeout")
+
+ if bad_type < 50000:
+ badposition.x = 1100
+ badposition.y = (randi()%410) + 50
+ rpc("spawnBad", bad_type, badposition, bad_health_multi)
+
+ spawning_done = true
+ #$Player.upgradeMenu()
+
+func upgradeTurret(position):
+ print("upgradeTurret()")
+ rpc("remoteUpgradeTurret", position)
+
+####################
+# UPGRADE A TURRET #
+remote func remoteUpgradeTurret(position):
+ for child in get_children():
+ if "turret" in child.get_name():
+ print("turret")
+ if child.position == position:
+ child.upgradeTurret()
+ #child.damage = damage
+ #child.get_node("Range").scale = t_range
+ #child.get_node("ReloadTimer").wait_time = reload_time
+ print(child.damage, child.get_node("Range").scale, child.get_node("ReloadTimer").wait_time)
+ break
+# UPGRADE A TURRET #
+####################
+
#########################
# ENEMY SPAWNING SCRIPT #
#########################
-var a_round_of_bads = 50
-var sendblob = 1
var bad_health_multi = 1.5
-var total_bads_spawned = 0
-func BaddieTimer():
- #if total_bads_spawned%6 == 0: # 75 default
- # if get_tree().is_network_server():
- # total_bads_spawned += 1
- # rpc("bossMode")
- # else:
- # total_bads_spawned += 1
- # bossMode()
- #
- if bads_this_round <= a_round_of_bads && bad_spawning_enabled:
- var bad_type
- var badposition = Vector2()
-
- if sendblob%6 == 0:
- if get_tree().is_network_server():
- total_bads_spawned += 1
- sendblob += 1
- rpc("bossMode")
- else:
- total_bads_spawned += 1
- sendblob += 1
- bossMode()
- else:
- if sendblob%50 == 0:
- bad_type = 3
- sendblob += 1
- elif sendblob%20 == 0:
- bad_type = 2
- sendblob += 1
- elif sendblob%5 == 0:
- bad_type = 1
- sendblob += 1
- else:
- bad_type = 0
- sendblob += 1
-
- bads_this_round += 1
- if $BaddieTimer.wait_time > 1:
- $BaddieTimer.wait_time = $BaddieTimer.wait_time * 0.99
- if bads_this_round == a_round_of_bads:
- bad_health_multi *= 1.5
-
- badposition.x = 1200
- badposition.y = (randi()%410) + 50
- if get_tree().is_network_server():
- rpc("spawnBad", bad_type, badposition, bad_health_multi)
- else:
- spawnBad(bad_type, badposition, bad_health_multi)
- else:
- bads_this_round = 0
-sync func spawnBad(bad_type, position, health_multi):
+sync func spawnBad(bad_type, badposition, health_multi):
var bad
if bad_type == 0:
bad = FirstBad.instance()
@@ -205,43 +299,52 @@ sync func spawnBad(bad_type, position, health_multi):
# Increase BG speed with each enemy spawned
$BG.fly_speed *= 1.01
- # Add one to total of enemies spawned
- total_bads_spawned += 1
-
add_child(bad)
bad.connect("dead", self, "_on_bad_death")
if bad_type == 3:
bad.connect("health_up", self, "_on_health_up")
bad.health_multi = health_multi
- bad.position = position
+ bad.position = badposition
func _on_health_up(hp_increase):
$Mothership.health += hp_increase
$Mothership._update_health_bar()
func _on_PauseButton_pressed():
- $Player.upgradeMenu()
+ $Player.pauseMenu()
+ $ColorRect.visible = false
func updatePoints():
- $MoneyDisplay.text = str($Player.money, " points")
-
-func _on_Player_update_display():
- updatePoints()
+ $MoneyDisplay.text = str("$", $Player.money)
+ #$MoneyDisplay.text = str($Player.money, " points")
func _on_Mothership_game_over():
- $ShootButton.visible = false
+ for child in self.get_children():
+ print(child, child.name)
+ if ("Bad" in child.name):
+ child.queue_free()
+ elif (child.has_method("bossHealth")):
+ child.queue_free()
$Player.gameOver()
func _on_Player_restart_game():
+ print("_on_Player_restart_game()")
+ """
for child in self.get_children():
- if (child.has_method("_on_Visibility_screen_exited")):
+ print(child, child.name)
+ if ("Bad" in child.name):
child.queue_free()
- if (child.has_method("bossHealth")):
- child.queue_free()
- bads_this_round = 0
- total_bads_spawned = 0
- $BaddieTimer.wait_time = BADDIE_WAIT_TIME_DEFAULT
- $ShootButton.visible = true
+ elif (child.has_method("bossHealth")):
+ child.queue_free()"""
+ current_round = 1
+ spawning_done = true
+ updatePoints()
+ if get_tree().is_network_server() || not get_tree().has_network_peer():
+ rpc("hideGameOver")
+ rpc("openPlayerMenu")
+
+remote func hideGameOver():
+ $Player.restart_game()
var touchy_feely
@@ -249,10 +352,9 @@ var touchscreen_on = false
func _input(event):
if (event is InputEventScreenTouch || event is InputEventScreenDrag):
touchscreen_on = true
- if event.position.x < 800: #&& (abs (event.position.y - $Player.position.y) < 100) :
+ if event.position.x < 800:
$Player.position.x = event.position.x + 100*(event.position.x/800)
$Player.position.y = event.position.y - 100
- prints(event.index)
else:
touchy_shooty = true
@@ -260,6 +362,12 @@ func other_shooting_upgrade(id, other_bullet_delay):
prints("Other player shooting speed upgrade")
get_node(str(id)).timer.set_wait_time(other_bullet_delay)
+func other_damage_upgrade(id, other_laser_damage):
+ get_node(str(id)).laser_damage = other_laser_damage
+
+func other_laser_penetration_upgrade(id, other_laser_penetration):
+ get_node(str(id)).laser_penetration = other_laser_penetration
+
func other_ship_color_change(id, other_color):
prints("Other player color change")
get_node(str(id)).modulate(other_color)
@@ -271,34 +379,31 @@ func double_laser_upgrade(id):
# Show other player's movement
func _on_Player_multiplayer_movement(id, pos, other_is_shooting):
get_node(str(id)).position = pos
-
- if other_is_shooting:
- get_node(str(id)).shoot()
+ get_node(str(id)).is_shooting = other_is_shooting
# BOSS MODE #
# Disable enemy spawning
# Wait a few seconds for enemies to clear
# Call for boss launch
var bosstimer = null
-sync func bossMode():
+sync func bossMode(boss_type):
prints("bossMode()")
- bad_spawning_enabled = false
bosstimer = Timer.new()
- bosstimer.connect("timeout",self,"_launch_boss")
+ """bosstimer.connect("timeout",self,"_launch_boss", boss_type)
add_child(bosstimer) #to process
- bosstimer.wait_time = 15
+ bosstimer.wait_time = 3
bosstimer.one_shot = true
- bosstimer.start() #to start
-
-# Spawn the first boss
-func _launch_boss():
- prints("_launch_boss()")
+ bosstimer.start() #to start"""
+ yield(get_tree().create_timer(3), "timeout")
+
+
+ prints("_launch_boss(",boss_type,")")
var bad
- var which_boss = randi()%2
- if which_boss == 0:
+ if boss_type == 0:
bad = RectangleBoss.instance()
- elif which_boss == 1:
+ elif boss_type == 1:
bad = BlackHole.instance()
+ $Music.volume_db = -20
add_child(bad)
# Flash screen when signalled
@@ -310,7 +415,28 @@ func _launch_boss():
# Get boss health
bad.connect("boss_health", self, "getBossHealth")
-
+"""
+# Spawn the first boss
+func _launch_boss(boss_type):
+ prints("_launch_boss(",boss_type,")")
+ var bad
+ if boss_type == 0:
+ bad = RectangleBoss.instance()
+ elif boss_type == 1:
+ bad = BlackHole.instance()
+ $Music.volume_db = -20
+ add_child(bad)
+
+ # Flash screen when signalled
+ bad.connect("flash", self, "_flash_screen")
+ bad.show_behind_parent = true
+
+ # Boss death functions the same as regular death
+ bad.connect("dead", self, "_on_boss_death")
+
+ # Get boss health
+ bad.connect("boss_health", self, "getBossHealth")
+"""
func getBossHealth(currentHealth, totalHealth):
totalHealth = float(totalHealth)
var health_bar = Vector2(((currentHealth/totalHealth)*800)+100, 50)
@@ -324,8 +450,12 @@ func getBossHealth(currentHealth, totalHealth):
func _on_boss_death(kill_money):
# Give players appropriate money, and restart spawns
$Player.money += kill_money
+ updatePoints()
bad_spawning_enabled = true
bosstimer.stop()
+ rpc("openPlayerMenu")
+ current_round +=1
+ $Music.volume_db = 0
# Begins screen-flashing process
func _flash_screen():
@@ -337,7 +467,6 @@ func _flash_screen():
func _load_players(id, info):
player_info = info
prints("_load_players", player_info)
- #prints(player_info[id].name, "YEET", player_info[id].color)
func _start_multiplayer_game():
print(player_info)
@@ -348,15 +477,23 @@ func _start_multiplayer_game():
player.set_name(str(peer_id))
prints(str(peer_id), "yeetert")
add_child(player)
- #get_node("/").add_child(player)
player.setUsername(player_info[peer_id].name)
- #$MultiplayerTimer.start()
+ if get_tree().is_network_server():
+ rounds(1)
func _on_HideHowTo_pressed():
- $HowTo.visible = false
- $HowToDesktop.visible = false
- $HideHowTo.visible = false
+ $HowTos.visible = false
func _on_Player_other_ship_enable_rainbow(id):
prints("Other player entered rainbow mode")
- get_node(str(id)).enable_the_rainbow()
\ No newline at end of file
+ get_node(str(id)).enable_the_rainbow()
+
+func _on_Player_buy_turret(id, turret_position):
+ print("Main:buyTurret", turret_position)
+ var turret = preload("res://Turret.tscn").instance()
+ turret.connect("upgrade_turret", self, "upgradeTurret")
+ turret.set_name(str(id,"turret"))
+ add_child(turret)
+ turret.position = turret_position
+ turret.scale.x = 0.25
+ turret.scale.y = 0.25
\ No newline at end of file
diff --git a/Main.tscn b/Main.tscn
index 0741186..16cd1bf 100644
--- a/Main.tscn
+++ b/Main.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=20 format=2]
+[gd_scene load_steps=21 format=2]
[ext_resource path="res://Main.gd" type="Script" id=1]
[ext_resource path="res://Bad1.tscn" type="PackedScene" id=2]
@@ -7,22 +7,23 @@
[ext_resource path="res://Prison.tscn" type="PackedScene" id=5]
[ext_resource path="res://RectangleBoss.tscn" type="PackedScene" id=6]
[ext_resource path="res://BlackHole.tscn" type="PackedScene" id=7]
-[ext_resource path="res://BG.gd" type="Script" id=8]
-[ext_resource path="res://art/bg.png" type="Texture" id=9]
-[ext_resource path="res://Player.tscn" type="PackedScene" id=10]
-[ext_resource path="res://Mothership.tscn" type="PackedScene" id=11]
+[ext_resource path="res://BG.tscn" type="PackedScene" id=8]
+[ext_resource path="res://Player.tscn" type="PackedScene" id=9]
+[ext_resource path="res://Mothership.tscn" type="PackedScene" id=10]
+[ext_resource path="res://art/hand-numbs.ttf" type="DynamicFontData" id=11]
[ext_resource path="res://OtherPlayer.tscn" type="PackedScene" id=12]
-[ext_resource path="res://art/interface/how_to.png" type="Texture" id=13]
-[ext_resource path="res://art/interface/how_to_desktop.png" type="Texture" id=14]
-[ext_resource path="res://art/interface/pause.png" type="Texture" id=15]
+[ext_resource path="res://art/interface/pause.png" type="Texture" id=13]
+[ext_resource path="res://art/interface/how_to.png" type="Texture" id=14]
+[ext_resource path="res://art/interface/how_to_desktop.png" type="Texture" id=15]
+[ext_resource path="res://main_bg.ogg" type="AudioStream" id=16]
-[sub_resource type="ImageTexture" id=1]
+[sub_resource type="DynamicFont" id=1]
-flags = 7
-storage = 0
-lossy_quality = 0.7
-flags = 7
-size = Vector2( 0, 0 )
+size = 28
+use_mipmaps = false
+use_filter = false
+font_data = ExtResource( 11 )
+_sections_unfolded = [ "Font", "Settings" ]
[sub_resource type="SpriteFrames" id=2]
@@ -51,7 +52,7 @@ animations = [ {
"speed": 5.0
} ]
-[node name="Main" type="Node" index="0"]
+[node name="Main" type="Node"]
script = ExtResource( 1 )
_sections_unfolded = [ "Pause" ]
@@ -62,75 +63,45 @@ Prison = ExtResource( 5 )
RectangleBoss = ExtResource( 6 )
BlackHole = ExtResource( 7 )
-[node name="BG" type="Node2D" parent="." index="0"]
+[node name="BG" parent="." index="0" instance=ExtResource( 8 )]
-z_index = -1
-script = ExtResource( 8 )
-_sections_unfolded = [ "Z Index" ]
+[node name="Player" parent="." index="1" instance=ExtResource( 9 )]
-[node name="bg1" type="Sprite" parent="BG" index="0"]
-
-position = Vector2( 577.646, 365.663 )
-scale = Vector2( 0.694364, 0.694364 )
-texture = ExtResource( 9 )
-_sections_unfolded = [ "Transform" ]
-
-[node name="bg2" type="Sprite" parent="BG" index="1"]
-
-position = Vector2( 1823.66, 361.868 )
-scale = Vector2( 0.6985, 0.6985 )
-texture = ExtResource( 9 )
-_sections_unfolded = [ "Transform" ]
-
-[node name="Sprite" type="Sprite" parent="." index="1"]
-
-visible = false
-z_index = -5
-texture = SubResource( 1 )
-_sections_unfolded = [ "Z Index" ]
-
-[node name="Player" parent="." index="2" instance=ExtResource( 10 )]
-
-[node name="BaddieTimer" type="Timer" parent="." index="3"]
-
-process_mode = 1
-wait_time = 2.0
-one_shot = false
-autostart = false
-
-[node name="Mothership" parent="." index="4" instance=ExtResource( 11 )]
+[node name="Mothership" parent="." index="2" instance=ExtResource( 10 )]
position = Vector2( 18.327, 304.835 )
-[node name="MoneyDisplay" type="Label" parent="." index="5"]
+[node name="MoneyDisplay" type="Label" parent="." index="3"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 913.0
-margin_top = 536.0
+margin_top = 557.0
margin_right = 1006.0
-margin_bottom = 571.0
+margin_bottom = 592.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
+custom_fonts/font = SubResource( 1 )
+custom_colors/font_color = Color( 1, 1, 1, 1 )
text = "$0"
align = 2
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
-_sections_unfolded = [ "Size Flags", "custom_fonts" ]
+_sections_unfolded = [ "Size Flags", "custom_colors", "custom_fonts" ]
-[node name="OtherPlayer" parent="." index="6" instance=ExtResource( 12 )]
+[node name="OtherPlayer" parent="." index="4" instance=ExtResource( 12 )]
visible = false
_sections_unfolded = [ "Material", "Transform", "Visibility" ]
-[node name="BossHealth" type="Line2D" parent="." index="7"]
+[node name="BossHealth" type="Line2D" parent="." index="5"]
points = PoolVector2Array( 100, 50, 900, 50 )
width = 15.0
@@ -139,7 +110,7 @@ texture_mode = 31
sharp_limit = 2.0
round_precision = 8
-[node name="ColorRect" type="ColorRect" parent="." index="8"]
+[node name="ColorRect" type="ColorRect" parent="." index="6"]
visible = false
anchor_left = 0.0
@@ -157,91 +128,73 @@ size_flags_vertical = 1
color = Color( 0, 0, 0, 1 )
_sections_unfolded = [ "Visibility" ]
-[node name="HowTo" type="AnimatedSprite" parent="." index="9"]
+[node name="Pausing" type="Node2D" parent="." index="7"]
+
+editor/display_folded = true
+position = Vector2( 940, 36 )
+
+[node name="Pause" type="AnimatedSprite" parent="Pausing" index="0"]
+
+position = Vector2( 32.128, 31.044 )
+scale = Vector2( 0.199771, 0.199771 )
+frames = SubResource( 2 )
+animation = "default"
+
+[node name="PauseButton" type="Button" parent="Pausing" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 61.0
+margin_bottom = 64.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="HowTos" type="Node2D" parent="." index="8"]
+
+editor/display_folded = true
+_sections_unfolded = [ "Visibility", "Z Index" ]
+
+[node name="HowTo" type="AnimatedSprite" parent="HowTos" index="0"]
visible = false
position = Vector2( 482.397, 299.674 )
scale = Vector2( 0.42077, 0.42077 )
-frames = SubResource( 2 )
-animation = "default"
-_sections_unfolded = [ "Transform", "Visibility" ]
-
-[node name="HowToDesktop" type="AnimatedSprite" parent="." index="10"]
-
-visible = false
-position = Vector2( 482, 300 )
-scale = Vector2( 0.42, 0.42 )
frames = SubResource( 3 )
animation = "default"
_sections_unfolded = [ "Transform", "Visibility" ]
-[node name="ShootButton" type="Button" parent="." index="11"]
+[node name="HowToDesktop" type="AnimatedSprite" parent="HowTos" index="1"]
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
-margin_left = 785.0
-margin_top = 269.0
-margin_right = 1022.0
-margin_bottom = 599.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-focus_mode = 2
-mouse_filter = 0
-mouse_default_cursor_shape = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-disabled = true
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = true
-align = 1
-_sections_unfolded = [ "Theme" ]
-
-[node name="PauseButton" type="Button" parent="." index="12"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
-margin_left = 940.0
-margin_top = 36.0
-margin_right = 1001.0
-margin_bottom = 100.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-focus_mode = 2
-mouse_filter = 0
-mouse_default_cursor_shape = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = true
-align = 1
-
-[node name="Pause" type="AnimatedSprite" parent="." index="13"]
-
-position = Vector2( 972.128, 67.044 )
-scale = Vector2( 0.199771, 0.199771 )
+visible = false
+position = Vector2( 482, 300 )
+scale = Vector2( 0.42, 0.42 )
frames = SubResource( 4 )
animation = "default"
+_sections_unfolded = [ "Transform", "Visibility" ]
-[node name="HideHowTo" type="Button" parent="." index="14"]
+[node name="HideHowTo" type="Button" parent="HowTos" index="2"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
-margin_left = -50.0
-margin_top = -15.0
-margin_right = 1044.0
-margin_bottom = 623.0
+margin_left = -55.0
+margin_top = -29.0
+margin_right = 1039.0
+margin_bottom = 609.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
focus_mode = 2
@@ -258,36 +211,69 @@ flat = true
align = 1
_sections_unfolded = [ "Visibility" ]
+[node name="WaveLabel" type="Label" parent="." index="9"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 61.0
+margin_top = 19.0
+margin_right = 108.0
+margin_bottom = 33.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+text = "Wave 1"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+[node name="Music" type="AudioStreamPlayer" parent="." index="10"]
+
+stream = ExtResource( 16 )
+volume_db = 0.0
+autoplay = false
+mix_target = 0
+bus = "Master"
+
[connection signal="body_entered" from="Player" to="Player" method="_on_Player_body_entered"]
+[connection signal="buy_turret" from="Player" to="." method="_on_Player_buy_turret"]
+
[connection signal="double_laser_upgrade" from="Player" to="." method="double_laser_upgrade"]
[connection signal="multiplayer_movement" from="Player" to="." method="_on_Player_multiplayer_movement"]
+[connection signal="other_damage_upgrade" from="Player" to="." method="other_damage_upgrade"]
+
+[connection signal="other_laser_penetration_upgrade" from="Player" to="." method="other_laser_penetration_upgrade"]
+
[connection signal="other_ship_color_change" from="Player" to="." method="other_ship_color_change"]
[connection signal="other_ship_enable_rainbow" from="Player" to="." method="_on_Player_other_ship_enable_rainbow"]
[connection signal="other_shooting_upgrade" from="Player" to="." method="other_shooting_upgrade"]
-[connection signal="restart_game" from="Player" to="Mothership" method="_on_Player_restart_game"]
-
[connection signal="restart_game" from="Player" to="." method="_on_Player_restart_game"]
-[connection signal="update_display" from="Player" to="." method="_on_Player_update_display"]
+[connection signal="restart_game" from="Player" to="Mothership" method="_on_Player_restart_game"]
-[connection signal="timeout" from="BaddieTimer" to="." method="BaddieTimer"]
+[connection signal="start_next_round" from="Player" to="." method="startNextRound"]
+
+[connection signal="update_display" from="Player" to="." method="updatePoints"]
+
+[connection signal="upgrade_turret_range" from="Player" to="." method="upgradeTurretRange"]
[connection signal="body_shape_entered" from="Mothership" to="Mothership" method="_on_Mothership_body_shape_entered"]
[connection signal="game_over" from="Mothership" to="." method="_on_Mothership_game_over"]
-[connection signal="button_down" from="ShootButton" to="Player" method="shootDown"]
+[connection signal="pressed" from="Pausing/PauseButton" to="." method="_on_PauseButton_pressed"]
-[connection signal="button_up" from="ShootButton" to="Player" method="shootUp"]
-
-[connection signal="pressed" from="PauseButton" to="." method="_on_PauseButton_pressed"]
-
-[connection signal="pressed" from="HideHowTo" to="." method="_on_HideHowTo_pressed"]
+[connection signal="pressed" from="HowTos/HideHowTo" to="." method="_on_HideHowTo_pressed"]
diff --git a/MainMenu.gd b/MainMenu.gd
index d6cbcd9..81d55a8 100644
--- a/MainMenu.gd
+++ b/MainMenu.gd
@@ -20,6 +20,7 @@
extends Node
signal multiplayer_menu
+signal start_game
var clockwise = false
var rotation_multiplier = 1
@@ -73,7 +74,12 @@ func _process(delta):
func _on_Button_pressed():
#$Button.visible = false
+ emit_signal("start_game", 1)
now_quitting = true
func _on_Multiplayer_pressed():
- emit_signal("multiplayer_menu")
\ No newline at end of file
+ emit_signal("multiplayer_menu")
+
+func _on_Settings_pressed():
+ var settings = preload("res://Menus/Settings.tscn").instance()
+ add_child(settings)
\ No newline at end of file
diff --git a/MainMenu.tscn b/MainMenu.tscn
index 312bed9..15751e1 100644
--- a/MainMenu.tscn
+++ b/MainMenu.tscn
@@ -33,7 +33,7 @@ animations = [ {
"speed": 5.0
} ]
-[node name="Node" type="Node"]
+[node name="Node" type="Node" index="0"]
pause_mode = 2
script = ExtResource( 1 )
@@ -139,10 +139,36 @@ size_flags_vertical = 1
color = Color( 0, 0, 0, 0 )
_sections_unfolded = [ "Visibility" ]
-[node name="Settings" type="Node2D" parent="." index="7"]
+[node name="Settings?" type="Node2D" parent="." index="7"]
+
+[node name="Settings" type="Button" parent="." index="8"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 650.0
+margin_top = 400.0
+margin_right = 850.0
+margin_bottom = 570.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
[connection signal="pressed" from="StartEndlessMode" to="." method="_on_Button_pressed"]
[connection signal="pressed" from="Multiplayer" to="." method="_on_Multiplayer_pressed"]
+[connection signal="pressed" from="Settings" to="." method="_on_Settings_pressed"]
+
diff --git a/Menu.gd b/Menu.gd
new file mode 100644
index 0000000..46a6095
--- /dev/null
+++ b/Menu.gd
@@ -0,0 +1,9 @@
+extends Node
+
+func _ready():
+ # Called every time the node is added to the scene.
+ # Initialization here
+ pass
+
+func _on_BackButton_pressed():
+ queue_free()
diff --git a/Menus/Menu.gd b/Menus/Menu.gd
new file mode 100644
index 0000000..70848b4
--- /dev/null
+++ b/Menus/Menu.gd
@@ -0,0 +1,19 @@
+extends Node2D
+
+# class member variables go here, for example:
+# var a = 2
+# var b = "textvar"
+
+func _ready():
+ # Called every time the node is added to the scene.
+ # Initialization here
+ pass
+
+func _on_BackButton_pressed():
+ queue_free()
+
+func _on_PatreonLink_pressed():
+ OS.shell_open("https://www.patreon.com/fronter")
+
+func _on_LiberaLink_pressed():
+ OS.shell_open("https://www.liberapay.com/fronter")
diff --git a/Menus/Menu.tscn b/Menus/Menu.tscn
new file mode 100644
index 0000000..6c0e625
--- /dev/null
+++ b/Menus/Menu.tscn
@@ -0,0 +1,59 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://Menus/Menu.gd" type="Script" id=1]
+[ext_resource path="res://art/menu/back.png" type="Texture" id=2]
+
+[node name="Menu" type="Node2D"]
+
+z_index = 1
+z_as_relative = false
+script = ExtResource( 1 )
+_sections_unfolded = [ "Z Index" ]
+
+[node name="BG" type="ColorRect" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1024.0
+margin_bottom = 600.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+color = Color( 0, 0, 0, 1 )
+_sections_unfolded = [ "Rect" ]
+
+[node name="BackButton" type="Button" parent="." index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 4.0
+margin_top = 453.0
+margin_right = 279.0
+margin_bottom = 659.0
+rect_scale = Vector2( 0.7, 0.7 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+_sections_unfolded = [ "Rect" ]
+
+[connection signal="pressed" from="BackButton" to="." method="_on_BackButton_pressed"]
+
+
diff --git a/Menus/Settings.tscn b/Menus/Settings.tscn
new file mode 100644
index 0000000..a7349c8
--- /dev/null
+++ b/Menus/Settings.tscn
@@ -0,0 +1,75 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://Menus/Menu.tscn" type="PackedScene" id=1]
+[ext_resource path="res://Menus/patreon.png" type="Texture" id=2]
+[ext_resource path="res://Menus/libera.png" type="Texture" id=3]
+[ext_resource path="res://Menus/opens_externally.png" type="Texture" id=4]
+
+[node name="Menu" instance=ExtResource( 1 )]
+
+[node name="PatreonLink" type="Button" parent="." index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 641.0
+margin_top = 446.0
+margin_right = 1403.0
+margin_bottom = 565.0
+rect_scale = Vector2( 0.5, 0.5 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 2 )
+flat = true
+align = 1
+_sections_unfolded = [ "Rect" ]
+
+[node name="LiberaLink" type="Button" parent="." index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 641.0
+margin_top = 509.0
+margin_right = 1403.0
+margin_bottom = 628.0
+rect_scale = Vector2( 0.5, 0.5 )
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+icon = ExtResource( 3 )
+flat = true
+align = 1
+_sections_unfolded = [ "Rect" ]
+
+[node name="OpensExternally" type="Sprite" parent="." index="4"]
+
+position = Vector2( 824.133, 418.745 )
+scale = Vector2( 0.3, 0.3 )
+texture = ExtResource( 4 )
+_sections_unfolded = [ "Transform" ]
+
+[connection signal="pressed" from="PatreonLink" to="." method="_on_PatreonLink_pressed"]
+
+[connection signal="pressed" from="LiberaLink" to="." method="_on_LiberaLink_pressed"]
+
+
diff --git a/Menus/libera.png b/Menus/libera.png
new file mode 100644
index 0000000..9728c50
Binary files /dev/null and b/Menus/libera.png differ
diff --git a/Menus/opens_externally.png b/Menus/opens_externally.png
new file mode 100644
index 0000000..a864e76
Binary files /dev/null and b/Menus/opens_externally.png differ
diff --git a/Menus/patreon.png b/Menus/patreon.png
new file mode 100644
index 0000000..0325a38
Binary files /dev/null and b/Menus/patreon.png differ
diff --git a/Mothership.gd b/Mothership.gd
index f4570ae..f5bc21c 100644
--- a/Mothership.gd
+++ b/Mothership.gd
@@ -34,6 +34,7 @@ var double_laser = false
var can_shoot = true
var timer = null
var bullet_delay = 0.1
+var damage = 0
func _ready():
_update_health_bar()
@@ -43,17 +44,26 @@ func _process(delta):
#health = slave_health
pass
+ if $Line2D.default_color.r > 0:
+ $Line2D.default_color.r -= delta
+ if $Line2D.default_color.g < 180:
+ $Line2D.default_color.g += delta
+ if $Line2D.default_color.b > 0:
+ $Line2D.default_color.b -= delta
+
if health <= 100 && $BlownOut/WhoopsGuy.unit_offset < 1:
$BlownOut/WhoopsGuy.unit_offset += delta
func _on_Mothership_area_shape_entered(area_id, area, area_shape, self_shape):
#if not get_tree().has_network_peer():
- if not get_tree().is_network_server():
+ if get_tree().is_network_server() == false:
health -= 50
- if get_tree().is_network_server():
+ if get_tree().is_network_server() == true:
health -= 50
rset("slave_health", health)
+ $Line2D.default_color = Color("b70000")
+
if area.boss:
emit_signal("flash")
health = 0
@@ -77,5 +87,4 @@ func _on_Player_restart_game():
func _update_health_bar():
var health_bar = Vector2(((health * (.8)) + 100), 300)
- $Line2D.set_point_position( 1, health_bar )
- print(health)
\ No newline at end of file
+ $Line2D.set_point_position( 1, health_bar )
\ No newline at end of file
diff --git a/Mothership.tscn b/Mothership.tscn
index 59e3957..a237088 100644
--- a/Mothership.tscn
+++ b/Mothership.tscn
@@ -31,7 +31,7 @@ _data = {
}
_sections_unfolded = [ "Resource" ]
-[node name="Mothership" type="Area2D"]
+[node name="Mothership" type="Area2D" index="0"]
position = Vector2( 42.1613, 302.944 )
scale = Vector2( 0.263572, 0.240903 )
@@ -90,7 +90,7 @@ position = Vector2( 32.7402, 101.849 )
scale = Vector2( 3.33333, 3.33333 )
points = PoolVector2Array( 100, 300, 900, 300 )
width = 15.0
-default_color = Color( 0.037384, 0.683594, 0, 1 )
+default_color = Color( 0.0352941, 0.717647, 0, 1 )
texture_mode = 31
sharp_limit = 2.0
round_precision = 8
diff --git a/Networking.tscn b/Networking.tscn
index 71bbe74..f6592fa 100644
--- a/Networking.tscn
+++ b/Networking.tscn
@@ -419,6 +419,8 @@ animation = "default"
[node name="Lobby" type="Node" parent="." index="14"]
+editor/display_folded = true
+
[node name="RichTextLabel" type="RichTextLabel" parent="Lobby" index="0"]
anchor_left = 0.0
diff --git a/Node.gd b/Node.gd
index b315f4a..5df92e7 100644
--- a/Node.gd
+++ b/Node.gd
@@ -23,9 +23,9 @@ signal restart
var rectangle_opacity = 0
func _ready():
- # Called every time the node is added to the scene.
- # Initialization here
- pass
+ if get_tree().has_network_peer() && not get_tree().is_network_server():
+ $Restart.visible = false
+ $Button.disabled = true
func _process(delta):
$ColorRect.color = Color(0, 0, 0, rectangle_opacity)
@@ -37,7 +37,7 @@ func _process(delta):
func _on_Button_pressed():
emit_signal("restart")
- queue_free()
+ #queue_free()
func _on_Button_button_down():
$Restart.frame = 1
diff --git a/OtherPlayer.tscn b/OtherPlayer.tscn
index a93aa77..faf343b 100644
--- a/OtherPlayer.tscn
+++ b/OtherPlayer.tscn
@@ -85,8 +85,10 @@ func _ready():
var timer = null
+var damage = 0
var can_shoot = false
var shoot_down = false
+var is_shooting = false
func on_timeout_complete():
can_shoot = true
@@ -120,11 +122,15 @@ var rainbow_is_on = false
func _process(delta):
$Username.text = username
+ if is_shooting:
+ shoot()
+
if rainbow_is_on:
rainbow(delta)
pass
+var laser_damage = 10
func shoot():
if can_shoot:
var laser = Laser.instance()
@@ -132,6 +138,7 @@ func shoot():
laser.current_pen = laser_penetration
laser.position.y = position.y - 27
laser.position.x = position.x + 46
+ laser.damage = laser_damage
#MAYBE THE LASERS SHOULD BE THEIR OWN NODES
#Would allow for more simple additions in the future
@@ -141,6 +148,7 @@ func shoot():
laser2.position.y = position.y + 28
laser2.position.x = position.x + 46
laser2.current_pen = laser_penetration
+ laser2.damage = laser_damage
can_shoot = false
timer.start()
diff --git a/PauseMenu.gd b/PauseMenu.gd
new file mode 100644
index 0000000..a24a3c4
--- /dev/null
+++ b/PauseMenu.gd
@@ -0,0 +1,71 @@
+#
+# Copyright (C) 2018 Sage Vaillancourt, sagev9000@gmail.com
+#
+# This file is part of Fronter.
+#
+# Fronter is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Fronter is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Fronter. If not, see .
+#
+
+extends Node
+
+signal menu_closed
+signal change_color
+signal taste_the_rainbow
+
+func _ready():
+ $ColorRect.color = Color(0,0,0,1)
+
+func _process(delta):
+ if (Input.is_action_pressed("ui_quit")):
+ get_tree().quit()
+ #if Input.is_action_pressed("ui_accept"):
+ # _on_Button_pressed())
+
+func _on_Resume_pressed():
+ get_tree().paused = false
+ emit_signal("menu_closed")
+ queue_free()
+
+func _on_Goldenrod_pressed():
+ emit_signal("change_color", "daa520")
+
+func _on_Purple_pressed():
+ emit_signal("change_color", "800080")
+
+func _on_SlateBlue_pressed():
+ emit_signal("change_color", "708090")
+
+func _on_Salmon_pressed():
+ emit_signal("change_color", "e9967a")
+
+func _on_Crimson_pressed():
+ emit_signal("change_color", "dc143c")
+
+func _on_MediumSpringGreen_pressed():
+ emit_signal("change_color", "3cb371")
+
+func _on_Tomato_pressed():
+ emit_signal("change_color", "ff3e2d")
+ prints("put tomato in dere")
+
+func _on_DarkenedLawnGreen_pressed():
+ emit_signal("change_color", "7bd126")
+
+func _on_DeepSkyBlue_pressed():
+ emit_signal("change_color", "00bfff")
+
+#### NOT PAUSING GAME? ####
+func _on_Rainbow_pressed():
+ get_tree().paused = false
+ emit_signal("taste_the_rainbow")
\ No newline at end of file
diff --git a/PauseMenu.tscn b/PauseMenu.tscn
new file mode 100644
index 0000000..d4f21ba
--- /dev/null
+++ b/PauseMenu.tscn
@@ -0,0 +1,331 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://PauseMenu.gd" type="Script" id=1]
+[ext_resource path="res://art/ColorSelect.png" type="Texture" id=2]
+
+[sub_resource type="Theme" id=1]
+
+
+[node name="PauseMenu" type="Node"]
+
+pause_mode = 2
+script = ExtResource( 1 )
+_sections_unfolded = [ "Pause" ]
+
+[node name="ColorRect" type="ColorRect" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1026.0
+margin_bottom = 605.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+color = Color( 0, 0, 0, 1 )
+_sections_unfolded = [ "Visibility" ]
+
+[node name="Resume" type="Button" parent="." index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 287.0
+margin_top = 481.0
+margin_right = 770.0
+margin_bottom = 523.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+theme = SubResource( 1 )
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "Continue"
+flat = false
+align = 1
+
+[node name="ColorSelect" type="Node2D" parent="." index="2"]
+
+position = Vector2( 21, 0 )
+
+[node name="ColorSelectBG" type="Sprite" parent="ColorSelect" index="0"]
+
+editor/display_folded = true
+position = Vector2( 120, 210 )
+scale = Vector2( 0.179688, 0.179687 )
+texture = ExtResource( 2 )
+
+[node name="Goldenrod" type="Button" parent="ColorSelect/ColorSelectBG" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -501.0
+margin_top = -390.0
+margin_right = -167.0
+margin_bottom = -56.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Purple" type="Button" parent="ColorSelect/ColorSelectBG" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -167.0
+margin_top = -390.0
+margin_right = 167.0
+margin_bottom = -56.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="SlateBlue" type="Button" parent="ColorSelect/ColorSelectBG" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 167.0
+margin_top = -390.0
+margin_right = 501.0
+margin_bottom = -56.0001
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Salmon" type="Button" parent="ColorSelect/ColorSelectBG" index="3"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -501.0
+margin_top = -56.0
+margin_right = -167.0
+margin_bottom = 278.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Crimson" type="Button" parent="ColorSelect/ColorSelectBG" index="4"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -167.0
+margin_top = -56.0
+margin_right = 167.0
+margin_bottom = 278.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="MediumSpringGreen" type="Button" parent="ColorSelect/ColorSelectBG" index="5"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 167.0
+margin_top = -56.0
+margin_right = 501.0
+margin_bottom = 278.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Tomato" type="Button" parent="ColorSelect/ColorSelectBG" index="6"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 167.0
+margin_top = 278.0
+margin_right = 501.0
+margin_bottom = 668.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="DarkenedLawnGreen" type="Button" parent="ColorSelect/ColorSelectBG" index="7"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -167.0
+margin_top = 334.0
+margin_right = 167.0
+margin_bottom = 668.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="DeepSkyBlue" type="Button" parent="ColorSelect/ColorSelectBG" index="8"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -501.0
+margin_top = 334.0
+margin_right = -167.0
+margin_bottom = 668.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Rainbow" type="Button" parent="ColorSelect/ColorSelectBG" index="9"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -501.0
+margin_top = 668.0
+margin_right = 501.0
+margin_bottom = 1002.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[connection signal="pressed" from="Resume" to="." method="_on_Resume_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/Goldenrod" to="." method="_on_Goldenrod_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/Purple" to="." method="_on_Purple_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/SlateBlue" to="." method="_on_SlateBlue_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/Salmon" to="." method="_on_Salmon_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/Crimson" to="." method="_on_Crimson_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/MediumSpringGreen" to="." method="_on_MediumSpringGreen_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/Tomato" to="." method="_on_Tomato_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/DarkenedLawnGreen" to="." method="_on_DarkenedLawnGreen_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/DeepSkyBlue" to="." method="_on_DeepSkyBlue_pressed"]
+
+[connection signal="pressed" from="ColorSelect/ColorSelectBG/Rainbow" to="." method="_on_Rainbow_pressed"]
+
+
diff --git a/Player.gd b/Player.gd
index f3ef1a8..c0899e3 100644
--- a/Player.gd
+++ b/Player.gd
@@ -24,12 +24,17 @@ signal update_display # tells parent to update points display
signal refund # will tell parent a refund is occuring, for display
signal shooting_speed_upgrade # signals that a shooting speed upgrade has occured
signal other_shooting_upgrade
+signal other_damage_upgrade
signal double_laser_upgrade
+signal other_laser_penetration_upgrade
signal other_ship_color_change
signal other_ship_enable_rainbow
signal shooting_speed_fully_upgraded
signal restart_game
signal multiplayer_movement
+signal start_next_round
+signal buy_turret
+signal upgrade_turret_range
export (PackedScene) var Laser
@@ -40,12 +45,8 @@ export (PackedScene) var Laser
var ship_speed = 500
# first 5 tiers of shooting speed
-const BULLET_DELAY_TIER1 = 0.8
-const BULLET_DELAY_TIER2 = 0.5
-const BULLET_DELAY_TIER3 = 0.2
-const BULLET_DELAY_TIER4 = 0.1
-const BULLET_DELAY_TIER5 = 0.05
-
+#const BULLET_DELAY_DICT = {1:0.8, 2:0.5, 3:0.4, 4:0.2, 5:0.05} #original
+const BULLET_DELAY_DICT = {1:0.8, 2:0.6, 3:0.4, 4:0.2, 5:0.1}
# starting cost of shooting speed upgrades after tier 5
const SHOOTING_SPEED_UPGRADE_DEFAULT = 1500
@@ -53,32 +54,30 @@ const SHOOTING_SPEED_UPGRADE_DEFAULT = 1500
const BULLET_DELAY_MINIMUM = 0.01
# costs of shooting speed upgrades
-const BULLET_DELAY_TIER2_COST = 100
-const BULLET_DELAY_TIER3_COST = 200
-const BULLET_DELAY_TIER4_COST = 400
-const BULLET_DELAY_TIER5_COST = 1000
+const BULLET_DELAY_COST = {2:100, 3:400, 4:1000, 5:4000, 6:0}
# double laser cost
-const DOUBLE_LASER_COST = 2000
+const DOUBLE_LASER_COST = 6000
# 5 tiers of laser damage
-const LASER_DAMAGE_TIER1 = 10
-const LASER_DAMAGE_TIER2 = 12
-const LASER_DAMAGE_TIER3 = 15
-const LASER_DAMAGE_TIER4 = 20
-const LASER_DAMAGE_TIER5 = 50
+const LASER_DAMAGE_DICT = {1:10, 2:15, 3:20, 4:40, 5:50}
# costs of laser damage upgrades
-const LASER_DAMAGE_TIER2_COST = 200
-const LASER_DAMAGE_TIER3_COST = 500
-const LASER_DAMAGE_TIER4_COST = 1000
-const LASER_DAMAGE_TIER5_COST = 2000
+const LASER_DAMAGE_COST = {2:400, 3:1000, 4:2000, 5:6000, 6:0}
+# costs of laser penetration upgrades
+const LASER_PENETRATION_COST = {2:400, 3:1000, 4:2000, 5:6000, 6:0}
+
+# 5 tiers of laser penetration
+const LASER_PENETRATION_DICT = {1:0,2:1,3:2,4:3,5:5}
# the ship's starting position
const STARTING_POSITION = Vector2(130, 250)
# the amount of money the player starts with
-const STARTING_MONEY = 10000
+const STARTING_MONEY = 0#100000
+
+# cost to unlock turrets
+const UNLOCK_TURRETS_COST = 1000
#################################
@@ -95,13 +94,19 @@ var can_shoot = false
var timer = null
# sets the delay between shots to the default
-var bullet_delay = BULLET_DELAY_TIER1
-var bullet_delay_tier = 0
+var bullet_delay = BULLET_DELAY_DICT[1]
+var bullet_delay_tier = 1
# sets other shooting settings to their defaults
-var laser_penetration = 0
+var laser_penetration = LASER_PENETRATION_DICT[1]
+var laser_penetration_tier = 1
var double_laser = false
-var laser_damage = LASER_DAMAGE_TIER1
+var laser_damage = LASER_DAMAGE_DICT[1]
+var laser_damage_tier = 1
+
+# turret settings
+var turrets_unlocked = false
+var has_turret = false
# gives the player their starting points
var money = STARTING_MONEY
@@ -116,108 +121,209 @@ var refund_percentage = 1
# only really relevant to touchscreens
var menu_open = false
+var boss = false
+var damage = 0
+
# opens the upgrade menu
func upgradeMenu():
- menu_open = true
var upgmenu = preload("res://UpgradeMenu.tscn").instance()
+ menu_open = true
add_child(upgmenu)
upgmenu.connect("refund", self, "_refund_button")
- upgmenu.connect("bullet_delay_upgrade", self, "upgradeBulletDelay_button")
- upgmenu.connect("double_laser_upgrade", self, "doubleLaserUpgrade_button")
- upgmenu.connect("laser_penetration_upgrade", self, "laserPenetrationUpgrade_button")
- upgmenu.connect("menu_closed", self, "menuClosed")
+ upgmenu.connect("bullet_delay_upgrade", self, "upgradeBulletDelay")
+ upgmenu.connect("double_laser_upgrade", self, "doubleLaserUpgrade")
+ upgmenu.connect("laser_penetration_upgrade", self, "laserPenetrationUpgrade")
upgmenu.connect("change_color", self, "changeColor")
upgmenu.connect("taste_the_rainbow", self, "enable_the_rainbow")
+ upgmenu.connect("laser_damage_upgrade", self, "upgradeLaserDamage")
+ upgmenu.connect("menu_closed", self, "upgradeMenuClosed")
+ upgmenu.connect("unlock_turrets", self, "unlockTurrets")
+ upgmenu.connect("buy_turret", self, "buyTurret")
+ upgmenu.connect("turret_menu", self, "openTurretMenu")
+ upgmenu.laser_damage_tier = laser_damage_tier
upgmenu.bullet_delay_tier = bullet_delay_tier
+ upgmenu.laser_penetration_tier = laser_penetration_tier
+ upgmenu.turrets_unlocked = turrets_unlocked
+ upgmenu.has_turret = has_turret
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+# signalled on close of UpgradeMenu
+func upgradeMenuClosed():
+ menu_open = false
+ emit_signal("start_next_round")
+
+func pauseMenu():
+ menu_open = true
+ var pausemenu = preload("res://PauseMenu.tscn").instance()
+ add_child(pausemenu)
+ pausemenu.connect("change_color", self, "changeColor")
+ pausemenu.connect("menu_closed", self, "pauseMenuClosed")
+ pausemenu.connect("taste_the_rainbow", self, "enable_the_rainbow")
if !get_tree().has_network_peer():
get_tree().paused = true
-# signalled on close of UpgradeMenu
-func menuClosed():
+func pauseMenuClosed():
menu_open = false
+func openTurretMenu():
+ var turretmenu = preload("res://TurretMenu.tscn").instance()
+ add_child(turretmenu)
+ turretmenu.connect("buy_turret", self, "buyTurret")
+ turretmenu.connect("turret_range_upgrade", self, "turretRangeUpgrade")
+ turretmenu.screensize = screensize
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+func makePurchaseFor(cost):
+ if money >= cost:
+ money -= cost
+ emit_signal("update_display")
+ return true
+ else:
+ return false
+
#######################
# REQUESTING UPGRADES #
#######################
# all will request their upgrade
# all will pause the game if not in multiplayer
-
-func doubleLaserUpgrade_button():
- doubleLaserUpgrade()
- emit_signal("update_display")
- if !get_tree().has_network_peer():
- get_tree().paused = true
-
-func laserPenetrationUpgrade_button():
- laserPenetrationUpgrade()
- emit_signal("update_display")
- if !get_tree().has_network_peer():
- get_tree().paused = true
-
-func upgradeShipSpeed_button():
- upgradeShipSpeed()
- emit_signal("update_display")
- if !get_tree().has_network_peer():
- get_tree().paused = true
-
-func upgradeBulletDelay_button():
- upgradeBulletDelay()
- emit_signal("update_display")
- if !get_tree().has_network_peer():
- get_tree().paused = true
-
-#######################
-
-
-######################
-# PROVIDING UPGRADES #
-######################
# checks which tier the player is already on, and if they have enough points
# upgrades and charges the player, if possible
# increases the ship value by the amount spent, for refunds
# sends an rpc message about current state for a given upgrade
-# upgrades shooting speed
-func upgradeBulletDelay():
- if (bullet_delay == BULLET_DELAY_TIER1 && money >= BULLET_DELAY_TIER2_COST):
- bullet_delay = BULLET_DELAY_TIER2
- money -= BULLET_DELAY_TIER2_COST
- ship_value += BULLET_DELAY_TIER2_COST
- bullet_delay_tier = 1
- elif (bullet_delay == BULLET_DELAY_TIER2 && money >= BULLET_DELAY_TIER3_COST):
- bullet_delay = BULLET_DELAY_TIER3
- money -= BULLET_DELAY_TIER3_COST
- ship_value += BULLET_DELAY_TIER3_COST
- bullet_delay_tier = 2
- elif (bullet_delay == BULLET_DELAY_TIER3 && money >= BULLET_DELAY_TIER4_COST):
- bullet_delay = BULLET_DELAY_TIER4
- money -= BULLET_DELAY_TIER4_COST
- ship_value += BULLET_DELAY_TIER4_COST
- bullet_delay_tier = 3
- elif (bullet_delay == BULLET_DELAY_TIER4 && money >= BULLET_DELAY_TIER5_COST):
- bullet_delay = BULLET_DELAY_TIER5
- money -= BULLET_DELAY_TIER5_COST
- ship_value += BULLET_DELAY_TIER5_COST
- bullet_delay_tier = 4
-# elif (bullet_delay <= BULLET_DELAY_MINIMUM):
-# emit_signal("bullet_delay_fully_upgraded")
-# elif (bullet_delay <= BULLET_DELAY_TIER5 && money >= shooting_speed_upgrade):
-# bullet_delay = bullet_delay*0.95
-# money -= shooting_speed_upgrade
-# ship_value += shooting_speed_upgrade
-# shooting_speed_upgrade *= 1.1
-# bullet_delay_tier += 1
-
- timer.set_wait_time(bullet_delay)
- rpc("other_shooting_speed_upgrade", get_tree().get_network_unique_id(), bullet_delay)
+func unlockTurrets():
+ if money >= UNLOCK_TURRETS_COST:# && turrets_unlocked == false:
+ money -= UNLOCK_TURRETS_COST
+ turrets_unlocked = true
+ emit_signal("update_display")
+ openTurretMenu()
+ # pause if not multiplayer
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+func buyTurret(turret_position, cost):
+ #money -= cost
+ emit_signal("update_display")
+ if !get_tree().has_network_peer():
+ emit_signal("buy_turret", get_tree().get_network_unique_id(), turret_position)
+ has_turret = true
+ get_tree().paused = true
+ else:
+ rpc("net_buying_turret", get_tree().get_network_unique_id(), turret_position)
+
+sync func net_buying_turret(id, turret_position):
+ emit_signal("buy_turret", id, turret_position)
+
+func turretRangeUpgrade(cost, new_scale):
+ if makePurchaseFor(cost):
+ emit_signal("upgrade_turret_range", get_tree().get_network_unique_id(), new_scale)
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+#################################################
+# ALLOWS THE PLAYER TO SHOOT TWO LASERS AT ONCE #
func doubleLaserUpgrade():
+ # if the user has enough money, take that money, and enable doubles
if money >= DOUBLE_LASER_COST && double_laser == false:
money -= DOUBLE_LASER_COST
double_laser = true
+
+ # tell other players to enable doubles for you
rpc("double_laser_upgrade", get_tree().get_network_unique_id())
+
+ # tell main to update the points display
+ emit_signal("update_display")
+
+ # pause if not multiplayer
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
-######################
+# tell main about other ship's double_laser
+remote func double_laser_upgrade(id):
+ emit_signal("double_laser_upgrade", id)
+# ALLOWS THE PLAYER TO SHOOT TWO LASERS AT ONCE #
+#################################################
+
+
+######################################################
+# ALLOWS LASERS TO PENETRATE ENEMIES BEFORE EXPIRING #
+var next_penetration_upgrade_cost = LASER_PENETRATION_COST[laser_penetration_tier + 1]
+func laserPenetrationUpgrade():
+ if laser_penetration_tier < 5:
+ if money >= LASER_PENETRATION_COST[laser_penetration_tier + 1]:
+ laser_penetration_tier += 1
+ laser_penetration = LASER_PENETRATION_DICT[laser_penetration_tier]
+ money -= LASER_PENETRATION_COST[laser_penetration_tier]
+ ship_value += LASER_PENETRATION_COST[laser_penetration_tier]
+ next_penetration_upgrade_cost = LASER_PENETRATION_COST[laser_penetration_tier + 1]
+ print(laser_penetration)
+ emit_signal("update_display")
+
+ rpc("other_laser_penetration_upgrade", get_tree().get_network_unique_id(), laser_penetration)
+ # pause if not multiplayer
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+
+remote func other_laser_penetration_upgrade(id):
+ emit_signal("other_laser_penetration_upgrade", id)
+
+# tell main about other ship's
+# ALLOWS LASERS TO PENETRATE ENEMIES BEFORE EXPIRING #
+######################################################
+
+
+###############################################
+# INCREASES THE FIRE RATE FOR PLAYERS' LASERS #
+var next_bullet_delay_upgrade_cost = BULLET_DELAY_COST[bullet_delay_tier + 1]
+func upgradeBulletDelay():
+ if bullet_delay_tier < 5:
+ if money >= BULLET_DELAY_COST[bullet_delay_tier + 1]:
+ bullet_delay_tier += 1
+ bullet_delay = BULLET_DELAY_DICT[bullet_delay_tier]
+ money -= BULLET_DELAY_COST[bullet_delay_tier]
+ ship_value += BULLET_DELAY_COST[bullet_delay_tier]
+ next_bullet_delay_upgrade_cost = BULLET_DELAY_COST[bullet_delay_tier + 1]
+ print(bullet_delay)
+
+ timer.set_wait_time(bullet_delay)
+ rpc("other_shooting_speed_upgrade", get_tree().get_network_unique_id(), bullet_delay)
+ emit_signal("update_display")
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+# tell main about other ship's bullet_delay upgrade
+remote func other_shooting_speed_upgrade(id, bullet_delay):
+ emit_signal("other_shooting_upgrade", id, bullet_delay)
+# INCREASES THE FIRE RATE FOR PLAYERS' LASERS #
+###############################################
+
+
+############################################
+# INCREASES DAMAGE DONE BY EACH LASER SHOT #
+var next_laser_damage_upgrade_cost = LASER_DAMAGE_COST[laser_damage_tier + 1]
+func upgradeLaserDamage():
+ if laser_damage_tier < 5:
+ if money >= LASER_DAMAGE_COST[laser_damage_tier + 1]:
+ laser_damage_tier += 1
+ laser_damage = LASER_DAMAGE_DICT[laser_damage_tier]
+ money -= LASER_DAMAGE_COST[laser_damage_tier]
+ ship_value += LASER_DAMAGE_COST[laser_damage_tier]
+ next_laser_damage_upgrade_cost = LASER_DAMAGE_COST[laser_damage_tier + 1]
+ print(laser_damage)
+
+ rpc("other_laser_damage_upgrade", get_tree().get_network_unique_id(), laser_damage)
+ emit_signal("update_display")
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+# tell main about other ship's laser_damage upgrade
+remote func other_laser_damage_upgrade(id, laser_damage):
+ emit_signal("other_damage_upgrade", id, laser_damage)
+# INCREASES DAMAGE DONE BY EACH LASER SHOT #
+############################################
func _ready():
# for measuring time between lasers
@@ -239,25 +345,36 @@ func _ready():
# resets all upgrades to the default
# refunds them with adjustable percentage returned
+# not currently 100%, so disabled
func _refund_button():
- bullet_delay = BULLET_DELAY_TIER1
- bullet_delay_tier = 0
+ bullet_delay = BULLET_DELAY_DICT[1]
+ bullet_delay_tier = 1
timer.set_wait_time(bullet_delay)
laser_penetration = 0
double_laser = false
+ rainbow_is_on = false
+ changeColor(Color(1,1,1,1))
shooting_speed_upgrade = SHOOTING_SPEED_UPGRADE_DEFAULT
money += ship_value*refund_percentage
prints("Refunded ", ship_value*refund_percentage)
ship_value = 0
emit_signal("update_display")
- get_tree().paused = true
+ #get_tree().paused = true
-#Changes the ships color
+############################
+# Changes the ship's color #
func changeColor(color):
$AnimatedSprite.modulate = color
if get_tree().has_network_peer():
rpc("_change_color", get_tree().get_network_unique_id(), color)
+# tell main about other ship's color change
+remote func _change_color(id, color):
+ emit_signal("other_ship_color_change", id, color)
+
+# Changes the ship's color #
+############################
+
func on_timeout_complete():
can_shoot = true
@@ -274,22 +391,9 @@ func moveto(finger_position):
if (position.y > finger_position.y - 100 && finger_position.x < 800):
velocity.y -= 1
-
remote func move_player(id, position, is_shooting):
emit_signal("multiplayer_movement", id, position, is_shooting)
-remote func other_shooting_speed_upgrade(id, bullet_delay):
- emit_signal("other_shooting_upgrade", id, bullet_delay)
-
-remote func _change_color(id, color):
- emit_signal("other_ship_color_change", id, color)
-
-remote func _enable_rainbow(id):
- emit_signal("other_ship_enable_rainbow", id)
-
-remote func double_laser_upgrade(id):
- emit_signal("double_laser_upgrade", id)
-
# the player's movement vector
var velocity = Vector2()
@@ -329,8 +433,8 @@ func _process(delta):
is_shooting = true
# if in multiplayer mode, push position and shooting status as often as possible
- if get_tree().has_network_peer():
- rpc("move_player", get_tree().get_network_unique_id(), position, is_shooting)
+ #if get_tree().has_network_peer():
+ # rpc_unreliable("move_player", get_tree().get_network_unique_id(), position, is_shooting)
# if shoot button is pressed, try shooting
if Input.is_action_pressed("ui_accept"):
@@ -360,6 +464,7 @@ func shoot():
laser2.position.y = position.y + 28
laser2.position.x = position.x + 46
laser2.current_pen = laser_penetration
+ laser2.damage = laser_damage
# don't shoot again until the timer resets
can_shoot = false
@@ -370,8 +475,15 @@ func shoot():
func enable_the_rainbow():
if money >= 2000 && not rainbow_is_on:
money -= 2000
+ emit_signal("update_display")
rainbow_is_on = true
rpc("_enable_rainbow", get_tree().get_network_unique_id())
+
+ if !get_tree().has_network_peer():
+ get_tree().paused = true
+
+remote func _enable_rainbow(id):
+ emit_signal("other_ship_enable_rainbow", id)
func rainbow(delta):
if rainbow.r < 1 && r_up:
@@ -397,9 +509,10 @@ func rainbow(delta):
$AnimatedSprite.modulate = rainbow
+var gameover
# displays endgame screen and pauses
func gameOver():
- var gameover = preload("res://GameOver.tscn").instance()
+ gameover = preload("res://GameOver.tscn").instance()
add_child(gameover)
gameover.connect("restart", self, "restart_game")
# gameover.connect("bullet_delay_upgrade", self, "upgradeBulletDelay_button")
@@ -411,4 +524,9 @@ func restart_game():
_refund_button()
get_tree().paused = false
money = STARTING_MONEY
- emit_signal("restart_game")
\ No newline at end of file
+ emit_signal("restart_game")
+ gameover.queue_free()
+
+func _on_Timer_timeout():
+ if get_tree().has_network_peer():
+ rpc_unreliable("move_player", get_tree().get_network_unique_id(), position, is_shooting)
diff --git a/Player.tscn b/Player.tscn
index 805a37c..975c8ae 100644
--- a/Player.tscn
+++ b/Player.tscn
@@ -17,7 +17,7 @@ animations = [ {
[sub_resource type="CapsuleShape2D" id=2]
custom_solver_bias = 0.0
-radius = 12.8998
+radius = 25.7545
height = 40.4125
[node name="Player" type="Area2D"]
@@ -46,8 +46,18 @@ _sections_unfolded = [ "Transform" ]
[node name="CollisionShape2D" type="CollisionShape2D" parent="." index="1"]
-position = Vector2( 45.5518, -3.09424 )
+position = Vector2( 5.85673, 1.31631 )
+rotation = 1.5708
shape = SubResource( 2 )
_sections_unfolded = [ "Material", "Transform", "Visibility", "Z Index" ]
+[node name="Timer" type="Timer" parent="." index="2"]
+
+process_mode = 1
+wait_time = 0.02
+one_shot = false
+autostart = true
+
+[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
+
diff --git a/Prison.gd b/Prison.gd
index 393b574..9866c8b 100644
--- a/Prison.gd
+++ b/Prison.gd
@@ -1,7 +1,7 @@
extends "res://Bad.gd"
func _ready():
- health = 500
+ health = 500 #500
speed = 50
pass
@@ -20,20 +20,20 @@ func _process(delta):
if centered_x && centered_y:
$StarSprite.rotation += delta*10
position.x -= delta*500
- if position.x < 0:
+ if position.x < -50:
emit_signal("health_up", 200)
queue_free()
-
- if position.x < 500:
- position.x += delta*100
- elif position.x > 524:
- position.x -= delta*100
else:
- centered_x = true
-
- if position.y < 280:
- position.y += delta*100
- elif position.y > 320:
- position.y -= delta*100
- else:
- centered_y = true
\ No newline at end of file
+ if position.x < 500:
+ position.x += delta*(544-position.x)+1
+ elif position.x > 524:
+ position.x -= delta*(position.x-480)+1
+ else:
+ centered_x = true
+
+ if position.y < 280:
+ position.y += delta*(320-position.y)+1
+ elif position.y > 320:
+ position.y -= delta*(position.y-280)+1
+ else:
+ centered_y = true
\ No newline at end of file
diff --git a/Prison.tscn b/Prison.tscn
index 17d705d..dc3ddd8 100644
--- a/Prison.tscn
+++ b/Prison.tscn
@@ -30,9 +30,12 @@ animations = [ {
"speed": 5.0
} ]
-[node name="Prison" instance=ExtResource( 1 )]
+[node name="Prison" groups=[
+"enemies",
+] instance=ExtResource( 1 )]
scale = Vector2( 0.2, 0.2 )
+collision_layer = 4
script = ExtResource( 2 )
_sections_unfolded = [ "Collision", "Transform" ]
diff --git a/Range.gd b/Range.gd
index 5129ae8..8b8838d 100644
--- a/Range.gd
+++ b/Range.gd
@@ -1,8 +1,6 @@
extends Area2D
-# class member variables go here, for example:
-# var a = 2
-# var b = "textvar"
+var damage = 20
func _ready():
# Called every time the node is added to the scene.
diff --git a/RectangleBoss.gd b/RectangleBoss.gd
index c33d609..6f3609f 100644
--- a/RectangleBoss.gd
+++ b/RectangleBoss.gd
@@ -28,7 +28,7 @@ export (PackedScene) var Laser
#### MAYBE ADD A HEALTH BAR TO MAIN ITSELF ####
#var health = 3000
# DEFAULT:
-var starting_health = 20000
+var starting_health = 3000
var health = starting_health
var timer = null
@@ -88,7 +88,7 @@ func _process(delta):
if health > 1000:
position.y -= delta*speed_multiplier
- if health < -3000 && $Inside/InsideBadSprite.rotation_degrees < 180:
+ if health < -1*(starting_health/10) && $Inside/InsideBadSprite.rotation_degrees < 180:
$Inside/InsideBadSprite.rotation_degrees += delta*20
if $Inside/InsideBadSprite.rotation_degrees > 179 && $Inside/InsideBadSprite.rotation_degrees < 190:
@@ -150,33 +150,33 @@ func _on_Inside_area_entered(area):
emit_signal("boss_health", health, starting_health)
func updateOutsideSprite():
- if health > 18000:
+ if health > starting_health*.9:
$BigBadSprite.frame = 0
- elif health > 16000:
+ elif health > starting_health*.8:
$BigBadSprite.frame = 1
- elif health > 14000:
+ elif health > starting_health*.7:
$BigBadSprite.frame = 2
- elif health > 12000:
+ elif health > starting_health*.6:
$BigBadSprite.frame = 3
- elif health > 10000:
+ elif health > starting_health*.5:
$BigBadSprite.frame = 4
- elif health > 9000:
+ elif health > starting_health*.45:
$BigBadSprite.frame = 5
- elif health > 8000:
+ elif health > starting_health*.4:
$BigBadSprite.frame = 6
- elif health > 7000:
+ elif health > starting_health*.35:
$BigBadSprite.frame = 7
- elif health > 6000:
+ elif health > starting_health*.3:
$BigBadSprite.frame = 8
- elif health > 5000:
+ elif health > starting_health*.25:
$BigBadSprite.frame = 9
- elif health > 4000:
+ elif health > starting_health*.2:
$BigBadSprite.frame = 10
- elif health > 3000:
+ elif health > starting_health*.15:
$BigBadSprite.frame = 11
- elif health > 2000:
+ elif health > starting_health*.1:
$BigBadSprite.frame = 12
- elif health > 1500:
+ elif health > starting_health*.075:
timer.stop()
$BigBadSprite.frame = 13
$Inside/InsideBadSprite.frame = 2
diff --git a/RectangleBoss.tscn b/RectangleBoss.tscn
index 39e3f3f..fa1d01e 100644
--- a/RectangleBoss.tscn
+++ b/RectangleBoss.tscn
@@ -51,7 +51,9 @@ animations = [ {
custom_solver_bias = 0.0
extents = Vector2( 404.313, 217.774 )
-[node name="RectangleBoss" type="Area2D"]
+[node name="RectangleBoss" type="Area2D" index="0" groups=[
+"enemies",
+]]
position = Vector2( 336.401, -1.22772 )
scale = Vector2( 0.25, 0.25 )
diff --git a/RectangleReturn.gd b/RectangleReturn.gd
new file mode 100644
index 0000000..09dc49d
--- /dev/null
+++ b/RectangleReturn.gd
@@ -0,0 +1,13 @@
+extends "res://Bad.gd"
+
+func _ready():
+ speed = 0
+ #$RightArm/BadLaser.independent = false
+ #$RightArm/BadLaser.health_multi = 3
+ #$LeftArm/BadLaser.independent = false
+ #$LeftArm/BadLaser.health_multi = 3
+ pass
+
+func _process(delta):
+ $RightArm/UpperArm.rotate(delta)
+ pass
diff --git a/RectangleReturn.tscn b/RectangleReturn.tscn
new file mode 100644
index 0000000..8e9d509
--- /dev/null
+++ b/RectangleReturn.tscn
@@ -0,0 +1,107 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://Bad.tscn" type="PackedScene" id=1]
+[ext_resource path="res://RectangleReturn.gd" type="Script" id=2]
+[ext_resource path="res://art/bad/rectangle/return_arm.png" type="Texture" id=3]
+[ext_resource path="res://BadLaser.tscn" type="PackedScene" id=4]
+
+[sub_resource type="RectangleShape2D" id=2]
+
+custom_solver_bias = 0.0
+extents = Vector2( 43.4086, 153.113 )
+
+[sub_resource type="RectangleShape2D" id=3]
+
+custom_solver_bias = 0.0
+extents = Vector2( 42.0251, 121.071 )
+
+[node name="RectangleReturn" index="0" instance=ExtResource( 1 )]
+
+script = ExtResource( 2 )
+
+[node name="RightArm" type="Area2D" parent="." index="3"]
+
+input_pickable = true
+gravity_vec = Vector2( 0, 1 )
+gravity = 98.0
+linear_damp = 0.1
+angular_damp = 1.0
+audio_bus_override = false
+audio_bus_name = "Master"
+
+[node name="Forearm" type="RigidBody2D" parent="RightArm" index="0"]
+
+input_pickable = false
+collision_layer = 1
+collision_mask = 1
+mode = 0
+mass = 1.0
+friction = 1.0
+bounce = 0.0
+gravity_scale = 0.0
+custom_integrator = false
+continuous_cd = 0
+contacts_reported = 0
+contact_monitor = false
+sleeping = false
+can_sleep = true
+linear_velocity = Vector2( 0, 0 )
+linear_damp = -1.0
+angular_velocity = 0.0
+angular_damp = -1.0
+
+[node name="Sprite" type="Sprite" parent="RightArm/Forearm" index="0"]
+
+position = Vector2( 2.44351, 136.022 )
+scale = Vector2( 0.25, 0.25 )
+texture = ExtResource( 3 )
+_sections_unfolded = [ "Transform" ]
+
+[node name="BadLaser" parent="RightArm/Forearm" index="1" instance=ExtResource( 4 )]
+
+position = Vector2( 0.575623, 2.26275 )
+SPEED = 0
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RightArm/Forearm" index="2"]
+
+position = Vector2( 4, 95 )
+shape = SubResource( 2 )
+
+[node name="UpperArm" type="RigidBody2D" parent="RightArm" index="1"]
+
+editor/display_folded = true
+position = Vector2( 6.58612, 372.305 )
+input_pickable = false
+collision_layer = 1
+collision_mask = 1
+mode = 0
+mass = 1.0
+friction = 1.0
+bounce = 0.0
+gravity_scale = 0.0
+custom_integrator = false
+continuous_cd = 0
+contacts_reported = 0
+contact_monitor = false
+sleeping = false
+can_sleep = true
+linear_velocity = Vector2( 0, 0 )
+linear_damp = -1.0
+angular_velocity = 0.0
+angular_damp = -1.0
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Sprite" type="Sprite" parent="RightArm/UpperArm" index="0"]
+
+scale = Vector2( 0.26, 0.26 )
+texture = ExtResource( 3 )
+_sections_unfolded = [ "Transform" ]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RightArm/UpperArm" index="1"]
+
+position = Vector2( 0, -1 )
+shape = SubResource( 3 )
+
+
diff --git a/SettingsMenu.tscn b/SettingsMenu.tscn
new file mode 100644
index 0000000..725fdaa
--- /dev/null
+++ b/SettingsMenu.tscn
@@ -0,0 +1,21 @@
+[gd_scene format=2]
+
+[node name="Node" type="Node" index="0"]
+
+[node name="ColorRect" type="ColorRect" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1022.0
+margin_bottom = 600.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+color = Color( 0, 0, 0, 1 )
+
+
diff --git a/TODO b/TODO
index a6b824d..088627d 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,6 @@
* Get the game on F-Droid
+* A more explicit "wave" system
+* Different types of fire. Slow enemies down? Area of effect?
* More enemy variety
* A way of increasing difficulty without it suddenly becoming impossible
* Mothership art
diff --git a/Turret.gd b/Turret.gd
index a6756fc..ffb8387 100644
--- a/Turret.gd
+++ b/Turret.gd
@@ -1,32 +1,65 @@
extends Node2D
-var current_target
+signal upgrade_turret
+
var can_shoot = true
+var damage = 15
+var reload_time = 1.5
+
+var current_bad_id
+var current_bad = null
+var current_bad_shape
+
+var tier = 1
+
+const RANGE_TIER = {1:Vector2(30,30), 2:Vector2(40,40), 3:Vector2(50,50), 4:Vector2(60,60)}
+const DAMAGE_TIER = {1:15, 2:25, 3:50, 4:100}
+const RELOAD_TIER = {1:1.5, 2:1, 3:0.75, 4:0.5}
+const ANIMATION_TIER = {1:"plain", 2:"spike", 3:"spike", 4:"spike"}
+const ANIMATION_SCALE_TIER = {1:Vector2(.12,.12), 2:Vector2(.2,.2), 3:Vector2(.2,.2), 4:Vector2(.2,.2)}
+
+var enemy_count = 0
func _ready():
+ $ReloadTimer.wait_time = RELOAD_TIER[tier]
+ damage = DAMAGE_TIER[tier]
+ $Range.scale = RANGE_TIER[tier]
+ $TurretSprite.animation = ANIMATION_TIER[tier]
+ $TurretSprite.scale = ANIMATION_SCALE_TIER[tier]
+ $Damage.text = str(damage)
pass
var zeroPoint = Vector2(-60, -1015)
func _process(delta):
- pass
-
+ if current_bad:
+ var wr = weakref(current_bad)
+ if wr.get_ref():
+ if current_bad != null:
+ var local_pos = Vector2()
+ local_pos = to_local(current_bad.position)
+ $Beam.set_point_position(1, local_pos)
+ $TurretSprite.rotation = ($Beam.get_point_position(0).angle_to($Beam.get_point_position(1))) + PI/5.3
+
+ if ("Bad" in current_bad.get_name()) && can_shoot:
+ $Beam.default_color.a = 200
+ $TurretSprite.frame = 1
+ if current_bad.health > damage:
+ current_bad.hit(self)
+ else:
+ current_bad.hit(self)
+ current_bad = null
+ $FlashTimer.start()
+ can_shoot = false
func entityEnteredRange(bad_id, bad, bad_shape, self_shape):
- print(bad.get_name())
- if ("Bad" in bad.get_name()) && can_shoot:
- current_target = bad_id
- #var local_pos = zeroPoint + area.position
- var local_pos = Vector2()
- local_pos = to_local(bad.position)
- $Beam.set_point_position(1, local_pos)
- $TurretSprite.rotation = ($Beam.get_point_position(0).angle_to($Beam.get_point_position(1))) + PI/5.3
- print($Beam.get_point_position(0).angle_to($Beam.get_point_position(1)))
- $Beam.default_color.a = 200
- $TurretSprite.frame = 1
- bad.hit("turret")
- $FlashTimer.start()
- can_shoot = false
+ #print(bad.get_name())
+ if ("Bad" in bad.get_name() || "Black" in bad.get_name() || "Boss" in bad.get_name()):# && current_bad == null:
+ current_bad = bad
+ current_bad_id = bad_id
+ current_bad_shape = bad_shape
+ enemy_count += 1
+ print(enemy_count)
func _on_FlashTimer_timeout():
$Beam.default_color.a = 0
@@ -36,3 +69,30 @@ func _on_FlashTimer_timeout():
func _on_ReloadTimer_timeout():
can_shoot = true
pass # replace with function body
+
+func entityExitedRange(bad_id, bad, bad_shape, self_shape):
+ if weakref(bad):
+ if ("Bad" in bad.get_name()):
+ enemy_count -= 1
+
+ if bad_id == current_bad_id:
+ current_bad = null
+ current_bad_id = null
+ current_bad_shape = null
+
+func _on_OpenMenuButton_pressed():
+ var menu = preload("res://TurretMenu.tscn").instance()
+ add_child(menu)
+ menu.connect("turret_upgrade", self, "upgradeTurret")
+
+func upgradeTurret():
+ tier += 1
+ $ReloadTimer.wait_time = RELOAD_TIER[tier]
+ damage = DAMAGE_TIER[tier]
+ $Range.scale = RANGE_TIER[tier]
+ $TurretSprite.animation = ANIMATION_TIER[tier]
+ $TurretSprite.scale = ANIMATION_SCALE_TIER[tier]
+
+func relayUpgrade():
+ print("relayUpgrade()")
+ emit_signal("upgrade_turret", position)
\ No newline at end of file
diff --git a/Turret.tscn b/Turret.tscn
index 1ef190e..beb2cdc 100644
--- a/Turret.tscn
+++ b/Turret.tscn
@@ -1,8 +1,11 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=10 format=2]
[ext_resource path="res://Turret.gd" type="Script" id=1]
-[ext_resource path="res://art/turret/turret.png" type="Texture" id=2]
-[ext_resource path="res://art/turret/shootin.png" type="Texture" id=3]
+[ext_resource path="res://art/turret/turret2.png" type="Texture" id=2]
+[ext_resource path="res://art/turret/shootin2.png" type="Texture" id=3]
+[ext_resource path="res://art/turret/turret.png" type="Texture" id=4]
+[ext_resource path="res://art/turret/shootin.png" type="Texture" id=5]
+[ext_resource path="res://art/hand-numbs.ttf" type="DynamicFontData" id=6]
[sub_resource type="CircleShape2D" id=1]
@@ -14,10 +17,23 @@ radius = 32.0821
animations = [ {
"frames": [ ExtResource( 2 ), ExtResource( 3 ) ],
"loop": true,
-"name": "default",
+"name": "spike",
+"speed": 5.0
+}, {
+"frames": [ ExtResource( 4 ), ExtResource( 5 ) ],
+"loop": true,
+"name": "plain",
"speed": 5.0
} ]
+[sub_resource type="DynamicFont" id=3]
+
+size = 50
+use_mipmaps = false
+use_filter = false
+font_data = ExtResource( 6 )
+_sections_unfolded = [ "Font", "Settings" ]
+
[node name="Turret" type="Node2D"]
script = ExtResource( 1 )
@@ -30,13 +46,16 @@ points = PoolVector2Array( 26.4234, -6.61987, 2000, 0 )
width = 10.0
default_color = Color( 1, 0, 0, 0 )
texture_mode = 31
+begin_cap_mode = 2
+end_cap_mode = 2
sharp_limit = 2.0
round_precision = 8
+_sections_unfolded = [ "Border", "Capping" ]
[node name="Range" type="Area2D" parent="." index="1"]
position = Vector2( -51.824, -18.5961 )
-scale = Vector2( 30.8534, 30.8534 )
+scale = Vector2( 30, 30 )
input_pickable = true
gravity_vec = Vector2( 0, 1 )
gravity = 98.0
@@ -47,14 +66,16 @@ collision_layer = 31
collision_mask = 31
audio_bus_override = false
audio_bus_name = "Master"
-_sections_unfolded = [ "Collision" ]
+_sections_unfolded = [ "Collision", "Transform" ]
__meta__ = {
"_edit_group_": true
}
[node name="RangeCircle" type="CollisionShape2D" parent="Range" index="0"]
+scale = Vector2( 0.5, 0.5 )
shape = SubResource( 1 )
+_sections_unfolded = [ "Transform", "Visibility" ]
[node name="FlashTimer" type="Timer" parent="." index="2"]
@@ -75,13 +96,65 @@ autostart = true
rotation = 0.785398
scale = Vector2( 0.12, 0.12 )
frames = SubResource( 2 )
-animation = "default"
+animation = "plain"
_sections_unfolded = [ "Transform" ]
+[node name="OpenMenuButton" type="Button" parent="." index="5"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -81.0
+margin_top = -76.0
+margin_right = 82.0
+margin_bottom = 77.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Damage" type="Label" parent="." index="6"]
+
+visible = false
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -32.0
+margin_top = -20.0
+margin_right = 13.0
+margin_bottom = 20.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = SubResource( 3 )
+text = "15"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "custom_fonts" ]
+
[connection signal="area_shape_entered" from="Range" to="." method="entityEnteredRange"]
+[connection signal="area_shape_exited" from="Range" to="." method="entityExitedRange"]
+
[connection signal="timeout" from="FlashTimer" to="." method="_on_FlashTimer_timeout"]
[connection signal="timeout" from="ReloadTimer" to="." method="_on_ReloadTimer_timeout"]
+[connection signal="pressed" from="OpenMenuButton" to="." method="_on_OpenMenuButton_pressed"]
+
diff --git a/TurretMenu.gd b/TurretMenu.gd
new file mode 100644
index 0000000..d5fc516
--- /dev/null
+++ b/TurretMenu.gd
@@ -0,0 +1,115 @@
+#
+# Copyright (C) 2018 Sage Vaillancourt, sagev9000@gmail.com
+#
+# This file is part of Fronter.
+#
+# Fronter is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Fronter is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Fronter. If not, see .
+#
+
+extends Node
+
+signal menu_closed
+signal change_color
+signal buy_turret
+signal turret_range_upgrade
+signal turret_damage_upgrade
+signal turret_speed_upgrade
+
+var screensize
+
+const DEFAULT_TURRET_COST = 0#1000
+
+const TIER_COST = {2:1000, 3:4000, 4:10000, 5:0}
+
+func _ready():
+ $ColorRect.color = Color(0,0,0,.8)
+
+ if get_parent().has_method("upgradeTurret"):
+ $BuyTurret.visible = false
+
+ $Back.visible = false
+ $BuyTurret.visible = false
+ $Accept.visible = true
+ if get_parent().has_method("upgradeTurret") != true:
+ $Turret.visible = true
+ else:
+ $Upgrade/Button.text = str("Upgrade: $", TIER_COST[get_parent().tier+1])
+ if get_parent().tier >= 4:
+ $Upgrade/Button.visible = false
+
+func _input(event):
+ if $Turret.visible == true:
+ if (event is InputEventScreenTouch || event is InputEventScreenDrag):
+ if event.position.x < 800:
+ $Turret.position.x = event.position.x + 100*(event.position.x/800)
+ $Turret.position.y = event.position.y - 100
+
+var velocity = Vector2()
+func _process(delta):
+ if (Input.is_action_pressed("ui_quit")):
+ get_tree().quit()
+ #if Input.is_action_pressed("ui_accept"):
+ # _on_Button_pressed()
+ if $Turret.visible == true:
+ velocity = Vector2()
+ if Input.is_action_pressed("ui_right"):
+ velocity.x += 1
+ if Input.is_action_pressed("ui_left"):
+ velocity.x -= 1
+ if Input.is_action_pressed("ui_down"):
+ velocity.y += 1
+ if Input.is_action_pressed("ui_up"):
+ velocity.y -= 1
+ if (velocity.length() > 0):
+ velocity = velocity.normalized() * 500
+ $Turret.position += velocity * delta
+
+ if get_parent().has_method("upgradeTurret") == true:
+ $Upgrade.visible = true
+ $Turret.visible = false
+
+func _on_Button_pressed():
+ queue_free()
+
+func backButton():
+ queue_free()
+
+var newTurret
+func buyTurret():
+ if get_parent().money >= DEFAULT_TURRET_COST:
+ var turret = preload("res://Turret.tscn").instance()
+ turret.set_name(turret.get_name())
+ newTurret = turret.get_name()
+
+func acceptTurret():
+ if get_parent().has_method("upgradeTurret") == true:
+ queue_free()
+ else:
+ get_tree().paused = false
+ emit_signal("buy_turret", $Turret.position, DEFAULT_TURRET_COST)
+ #get_parent().has_turret = true
+ $Accept.visible = false
+ $Back.visible = true
+ $Turret.visible = false
+ queue_free()
+
+func upgradeTurret():
+ get_tree().paused = false
+ if get_parent().get_parent().get_node("Player").makePurchaseFor(TIER_COST[get_parent().tier+1]):
+ get_parent().upgradeTurret()
+ get_parent().relayUpgrade()
+ if get_parent().tier >= 4:
+ $Upgrade/Button.visible = false
+ else:
+ $Upgrade/Button.text = str("Upgrade: $", TIER_COST[get_parent().tier+1])
\ No newline at end of file
diff --git a/TurretMenu.tscn b/TurretMenu.tscn
new file mode 100644
index 0000000..ed2ea68
--- /dev/null
+++ b/TurretMenu.tscn
@@ -0,0 +1,231 @@
+[gd_scene load_steps=9 format=2]
+
+[ext_resource path="res://TurretMenu.gd" type="Script" id=1]
+[ext_resource path="res://art/multiplayer_menu/back.png" type="Texture" id=2]
+[ext_resource path="res://art/upgrade_menu/buyturrets.png" type="Texture" id=3]
+[ext_resource path="res://art/multiplayer_menu/checkmark.png" type="Texture" id=4]
+[ext_resource path="res://Turret.tscn" type="PackedScene" id=5]
+
+[sub_resource type="SpriteFrames" id=1]
+
+animations = [ {
+"frames": [ ExtResource( 2 ) ],
+"loop": true,
+"name": "default",
+"speed": 5.0
+} ]
+
+[sub_resource type="SpriteFrames" id=2]
+
+animations = [ {
+"frames": [ ExtResource( 3 ) ],
+"loop": true,
+"name": "default",
+"speed": 5.0
+} ]
+
+[sub_resource type="SpriteFrames" id=3]
+
+animations = [ {
+"frames": [ ExtResource( 4 ) ],
+"loop": true,
+"name": "default",
+"speed": 5.0
+} ]
+
+[node name="TurretMenu" type="Node"]
+
+pause_mode = 2
+script = ExtResource( 1 )
+_sections_unfolded = [ "Pause" ]
+
+[node name="ColorRect" type="ColorRect" parent="." index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1026.0
+margin_bottom = 605.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+color = Color( 0, 0, 0, 1 )
+_sections_unfolded = [ "Visibility" ]
+
+[node name="Back" type="Node2D" parent="." index="1"]
+
+editor/display_folded = true
+position = Vector2( 50, 240 )
+scale = Vector2( 0.5, 0.5 )
+z_index = 2
+z_as_relative = false
+_sections_unfolded = [ "Transform", "Z Index" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Icon" type="AnimatedSprite" parent="Back" index="0"]
+
+position = Vector2( 190, 530 )
+frames = SubResource( 1 )
+animation = "default"
+
+[node name="Button" type="Button" parent="Back" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 450.0
+margin_right = 300.0
+margin_bottom = 600.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="BuyTurret" type="Node2D" parent="." index="2"]
+
+editor/display_folded = true
+visible = false
+position = Vector2( 190, 140 )
+scale = Vector2( 0.25, 0.25 )
+z_index = 2
+_sections_unfolded = [ "Transform", "Z Index" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Icon" type="AnimatedSprite" parent="BuyTurret" index="0"]
+
+position = Vector2( 190, 530 )
+frames = SubResource( 2 )
+animation = "default"
+
+[node name="Button" type="Button" parent="BuyTurret" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -360.0
+margin_top = 80.0
+margin_right = 720.0
+margin_bottom = 960.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Accept" type="Node2D" parent="." index="3"]
+
+editor/display_folded = true
+visible = false
+position = Vector2( 820, 240 )
+scale = Vector2( 0.5, 0.5 )
+_sections_unfolded = [ "Transform" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Icon" type="AnimatedSprite" parent="Accept" index="0"]
+
+position = Vector2( 190, 530 )
+frames = SubResource( 3 )
+animation = "default"
+
+[node name="Button" type="Button" parent="Accept" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 96.0
+margin_top = 412.0
+margin_right = 296.0
+margin_bottom = 612.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Turret" parent="." index="4" instance=ExtResource( 5 )]
+
+visible = false
+position = Vector2( 550, 300 )
+scale = Vector2( 0.25, 0.25 )
+
+[node name="Upgrade" type="Node2D" parent="." index="5"]
+
+visible = false
+position = Vector2( 0, 181 )
+
+[node name="Button" type="Button" parent="Upgrade" index="0"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 430.0
+margin_top = 50.0
+margin_right = 640.0
+margin_bottom = 200.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+text = "Upgrade"
+flat = false
+align = 1
+
+[node name="Icon" type="AnimatedSprite" parent="Upgrade" index="1"]
+
+animation = "default"
+
+[connection signal="pressed" from="Back/Button" to="." method="backButton"]
+
+[connection signal="pressed" from="BuyTurret/Button" to="." method="buyTurret"]
+
+[connection signal="pressed" from="Accept/Button" to="." method="acceptTurret"]
+
+[connection signal="pressed" from="Upgrade/Button" to="." method="upgradeTurret"]
+
+
diff --git a/UpgradeMenu.gd b/UpgradeMenu.gd
index 379e6eb..0c7ae72 100644
--- a/UpgradeMenu.gd
+++ b/UpgradeMenu.gd
@@ -22,31 +22,60 @@ extends Node
signal refund
signal speed_upgrade
signal bullet_delay_upgrade
+signal laser_damage_upgrade
signal double_laser_upgrade
+signal laser_penetration_upgrade
signal add_laser
signal plasma_lasers
signal menu_closed
signal change_color
signal taste_the_rainbow
+signal unlock_turrets
+signal buy_turret
+signal turret_menu
+const DEFAULT_TURRET_COST = 1000
+var turret_cost = DEFAULT_TURRET_COST
+
+var laser_damage_tier
var bullet_delay_tier
var shooting_speed_tier
+var laser_penetration_tier
var double_lasers
+var turrets_unlocked = false
+var has_turret
func _ready():
+ get_tree().paused = true
bullet_delay_tier = get_parent().bullet_delay_tier
$ShootingSpeedUpgrade/Icon.frame = bullet_delay_tier
- if get_tree().has_network_peer():
- $ColorRect.color = Color(1,1,1,0.5)
+
+ if get_parent().next_laser_damage_upgrade_cost == 0:
+ $LaserDamageUpgrade/Cost.text = str("Sold Out!")
else:
- $ColorRect.color = Color(0,0,0,1)
+ $LaserDamageUpgrade/Cost.text = str("$", get_parent().next_laser_damage_upgrade_cost)
+
+ if get_parent().next_bullet_delay_upgrade_cost == 0:
+ $ShootingSpeedUpgrade/Cost.text = str("Sold Out!")
+ else:
+ $ShootingSpeedUpgrade/Cost.text = str("$", get_parent().next_bullet_delay_upgrade_cost)
+
+ if get_parent().next_penetration_upgrade_cost == 0:
+ $LaserPenetrationUpgrade/Cost.text = str("Sold Out!")
+ else:
+ $LaserPenetrationUpgrade/Cost.text = str("$", get_parent().next_penetration_upgrade_cost)
+
+ $ColorRect.color = Color(0,0,0,1)
func _process(delta):
- $ShootingSpeedUpgrade/Icon.frame = bullet_delay_tier
+ $ShootingSpeedUpgrade/Icon.frame = bullet_delay_tier-1
+ $LaserDamageUpgrade/Icon.frame = laser_damage_tier-1
+ $LaserPenetrationUpgrade/Icon.frame = laser_penetration_tier-1
+
if (Input.is_action_pressed("ui_quit")):
get_tree().quit()
- if Input.is_action_pressed("ui_accept"):
- _on_Button_pressed()
+ #if Input.is_action_pressed("ui_accept"):
+ # _on_Button_pressed()
func _on_Button_pressed():
get_tree().paused = false
@@ -63,6 +92,10 @@ func _on_ShootingSpeedUpgrade_pressed():
get_tree().paused = false
emit_signal("bullet_delay_upgrade")
bullet_delay_tier = get_parent().bullet_delay_tier
+ if get_parent().next_bullet_delay_upgrade_cost == 0:
+ $ShootingSpeedUpgrade/Cost.text = str("Sold Out!")
+ else:
+ $ShootingSpeedUpgrade/Cost.text = str("$", get_parent().next_bullet_delay_upgrade_cost)
func _on_DoubleLaserUpgrade_pressed():
get_tree().paused = false
@@ -89,7 +122,6 @@ func _on_MediumSpringGreen_pressed():
func _on_Tomato_pressed():
emit_signal("change_color", "ff3e2d")
- prints("put tomato in dere")
func _on_DarkenedLawnGreen_pressed():
emit_signal("change_color", "7bd126")
@@ -97,7 +129,39 @@ func _on_DarkenedLawnGreen_pressed():
func _on_DeepSkyBlue_pressed():
emit_signal("change_color", "00bfff")
-#### NOT PAUSING GAME? ####
func _on_Rainbow_pressed():
get_tree().paused = false
emit_signal("taste_the_rainbow")
+
+func _on_Laser_Damage_Upgrade():
+ get_tree().paused = false
+ emit_signal("laser_damage_upgrade")
+ laser_damage_tier = get_parent().laser_damage_tier
+ if get_parent().next_laser_damage_upgrade_cost == 0:
+ $LaserDamageUpgrade/Cost.text = str("Sold Out!")
+ else:
+ $LaserDamageUpgrade/Cost.text = str("$", get_parent().next_laser_damage_upgrade_cost)
+
+func _on_Laser_Penetration_Upgrade():
+ get_tree().paused = false
+ emit_signal("laser_penetration_upgrade")
+ laser_penetration_tier = get_parent().laser_penetration_tier
+ $LaserPenetrationUpgrade/Icon.frame = laser_penetration_tier
+ if get_parent().next_penetration_upgrade_cost == 0:
+ $LaserPenetrationUpgrade/Cost.text = str("Sold Out!")
+ else:
+ $LaserPenetrationUpgrade/Cost.text = str("$", get_parent().next_penetration_upgrade_cost)
+
+func openTurretMenu():
+ emit_signal("turret_menu")
+
+func _on_TurretsButton_pressed():
+ get_tree().paused = false
+ emit_signal("unlock_turrets")
+ turrets_unlocked = get_parent().turrets_unlocked
+ """
+ if get_parent().money >= turret_cost:
+ var turret = preload("res://Turret.tscn").instance()
+ turret.set_name(turret.get_name())
+ newTurret = turret.get_name()
+ """
diff --git a/UpgradeMenu.tscn b/UpgradeMenu.tscn
index 6bf8600..2bebea2 100644
--- a/UpgradeMenu.tscn
+++ b/UpgradeMenu.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=18 format=2]
+[gd_scene load_steps=35 format=2]
[ext_resource path="res://UpgradeMenu.gd" type="Script" id=1]
[ext_resource path="res://art/upgrade_menu/shootingspeed1.png" type="Texture" id=2]
@@ -6,13 +6,25 @@
[ext_resource path="res://art/upgrade_menu/shootingspeed3.png" type="Texture" id=4]
[ext_resource path="res://art/upgrade_menu/shootingspeed4.png" type="Texture" id=5]
[ext_resource path="res://art/upgrade_menu/shootingspeed5.png" type="Texture" id=6]
-[ext_resource path="res://art/upgrade_menu/shipspeed1.png" type="Texture" id=7]
-[ext_resource path="res://art/upgrade_menu/shipspeed2.png" type="Texture" id=8]
-[ext_resource path="res://art/upgrade_menu/shipspeed3.png" type="Texture" id=9]
-[ext_resource path="res://art/upgrade_menu/shipspeed4.png" type="Texture" id=10]
-[ext_resource path="res://art/upgrade_menu/shipspeed5.png" type="Texture" id=11]
-[ext_resource path="res://art/ColorSelect.png" type="Texture" id=12]
-[ext_resource path="res://art/upgrade_menu/doublelasers.png" type="Texture" id=13]
+[ext_resource path="res://art/hand-numbs.ttf" type="DynamicFontData" id=7]
+[ext_resource path="res://art/upgrade_menu/shipspeed1.png" type="Texture" id=8]
+[ext_resource path="res://art/upgrade_menu/shipspeed2.png" type="Texture" id=9]
+[ext_resource path="res://art/upgrade_menu/shipspeed3.png" type="Texture" id=10]
+[ext_resource path="res://art/upgrade_menu/shipspeed4.png" type="Texture" id=11]
+[ext_resource path="res://art/upgrade_menu/shipspeed5.png" type="Texture" id=12]
+[ext_resource path="res://art/ColorSelect.png" type="Texture" id=13]
+[ext_resource path="res://art/upgrade_menu/doublelasers.png" type="Texture" id=14]
+[ext_resource path="res://art/upgrade_menu/shootingdamage1.png" type="Texture" id=15]
+[ext_resource path="res://art/upgrade_menu/shootingdamage2.png" type="Texture" id=16]
+[ext_resource path="res://art/upgrade_menu/shootingdamage3.png" type="Texture" id=17]
+[ext_resource path="res://art/upgrade_menu/shootingdamage4.png" type="Texture" id=18]
+[ext_resource path="res://art/upgrade_menu/shootingdamage5.png" type="Texture" id=19]
+[ext_resource path="res://art/upgrade_menu/laserpenetration1.png" type="Texture" id=20]
+[ext_resource path="res://art/upgrade_menu/laserpenetration2.png" type="Texture" id=21]
+[ext_resource path="res://art/upgrade_menu/laserpenetration3.png" type="Texture" id=22]
+[ext_resource path="res://art/upgrade_menu/laserpenetration4.png" type="Texture" id=23]
+[ext_resource path="res://art/upgrade_menu/laserpenetration5.png" type="Texture" id=24]
+[ext_resource path="res://art/upgrade_menu/buyturrets.png" type="Texture" id=25]
[sub_resource type="Theme" id=1]
@@ -26,20 +38,63 @@ animations = [ {
"speed": 5.0
} ]
-[sub_resource type="SpriteFrames" id=3]
+[sub_resource type="DynamicFont" id=3]
+
+size = 40
+use_mipmaps = false
+use_filter = true
+font_data = ExtResource( 7 )
+_sections_unfolded = [ "Font", "Settings" ]
+
+[sub_resource type="SpriteFrames" id=4]
animations = [ {
-"frames": [ ExtResource( 7 ), ExtResource( 8 ), ExtResource( 9 ), ExtResource( 10 ), ExtResource( 11 ) ],
+"frames": [ ExtResource( 8 ), ExtResource( 9 ), ExtResource( 10 ), ExtResource( 11 ), ExtResource( 12 ) ],
"loop": true,
"name": "New Anim",
"speed": 5.0
} ]
_sections_unfolded = [ "Resource" ]
-[sub_resource type="SpriteFrames" id=4]
+[sub_resource type="SpriteFrames" id=5]
animations = [ {
-"frames": [ ExtResource( 13 ) ],
+"frames": [ ExtResource( 14 ) ],
+"loop": true,
+"name": "default",
+"speed": 5.0
+} ]
+
+[sub_resource type="SpriteFrames" id=6]
+
+animations = [ {
+"frames": [ ExtResource( 15 ), ExtResource( 16 ), ExtResource( 17 ), ExtResource( 18 ), ExtResource( 19 ) ],
+"loop": true,
+"name": "default",
+"speed": 5.0
+} ]
+
+[sub_resource type="DynamicFont" id=7]
+
+size = 80
+use_mipmaps = false
+use_filter = true
+font_data = ExtResource( 7 )
+_sections_unfolded = [ "Font", "Settings" ]
+
+[sub_resource type="SpriteFrames" id=8]
+
+animations = [ {
+"frames": [ ExtResource( 20 ), ExtResource( 21 ), ExtResource( 22 ), ExtResource( 23 ), ExtResource( 24 ) ],
+"loop": true,
+"name": "default",
+"speed": 5.0
+} ]
+
+[sub_resource type="SpriteFrames" id=9]
+
+animations = [ {
+"frames": [ ExtResource( 25 ) ],
"loop": true,
"name": "default",
"speed": 5.0
@@ -90,20 +145,21 @@ toggle_mode = false
enabled_focus_mode = 2
shortcut = null
group = null
-text = "Resume"
+text = "Continue"
flat = false
align = 1
[node name="Refund" type="Button" parent="." index="2"]
+visible = false
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
-margin_left = 860.0
-margin_top = 250.0
-margin_right = 984.0
-margin_bottom = 353.0
+margin_left = 840.0
+margin_top = 440.0
+margin_right = 964.0
+margin_bottom = 543.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
focus_mode = 2
@@ -121,15 +177,17 @@ align = 1
[node name="ShootingSpeedUpgrade" type="Node" parent="." index="3"]
+editor/display_folded = true
+
[node name="Button" type="Button" parent="ShootingSpeedUpgrade" index="0"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
-margin_left = 400.0
+margin_left = 249.0
margin_top = 40.0
-margin_right = 660.0
+margin_right = 505.0
margin_bottom = 198.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@@ -147,13 +205,41 @@ align = 1
[node name="Icon" type="AnimatedSprite" parent="ShootingSpeedUpgrade" index="1"]
-position = Vector2( 530, 120 )
+light_mask = 0
+position = Vector2( 375, 120 )
scale = Vector2( 0.392712, 0.392712 )
frames = SubResource( 2 )
animation = "default"
+_sections_unfolded = [ "Visibility" ]
+
+[node name="Cost" type="Label" parent="ShootingSpeedUpgrade" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 327.0
+margin_top = 22.0
+margin_right = 536.0
+margin_bottom = 85.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = SubResource( 3 )
+custom_colors/font_color = Color( 0.272552, 1, 0.230469, 1 )
+text = "$100"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "custom_colors", "custom_fonts" ]
[node name="ShipSpeedUpgrade" type="Node" parent="." index="4"]
+editor/display_folded = true
+
[node name="Button" type="Button" parent="ShipSpeedUpgrade" index="0"]
visible = false
@@ -182,18 +268,25 @@ align = 1
[node name="Icon" type="AnimatedSprite" parent="ShipSpeedUpgrade" index="1"]
visible = false
+light_mask = 0
position = Vector2( 530, 310 )
scale = Vector2( 0.392712, 0.392712 )
-frames = SubResource( 3 )
+frames = SubResource( 4 )
animation = "New Anim"
+_sections_unfolded = [ "Visibility" ]
[node name="ColorSelect" type="Node2D" parent="." index="5"]
+editor/display_folded = true
+light_mask = 0
+position = Vector2( 21, 0 )
+_sections_unfolded = [ "Material", "Visibility" ]
+
[node name="ColorSelectBG" type="Sprite" parent="ColorSelect" index="0"]
-position = Vector2( 150, 210 )
+position = Vector2( 120, 210 )
scale = Vector2( 0.179688, 0.179687 )
-texture = ExtResource( 12 )
+texture = ExtResource( 13 )
[node name="Goldenrod" type="Button" parent="ColorSelect/ColorSelectBG" index="0"]
@@ -438,7 +531,9 @@ align = 1
[node name="DoubleLaserUpgrade" type="Node2D" parent="." index="6"]
editor/display_folded = true
-position = Vector2( -150, -10 )
+light_mask = 0
+position = Vector2( -320, -30 )
+_sections_unfolded = [ "Transform", "Visibility" ]
__meta__ = {
"_edit_group_": true
}
@@ -447,9 +542,9 @@ __meta__ = {
position = Vector2( 959, 151.811 )
scale = Vector2( 0.154596, 0.154596 )
-frames = SubResource( 4 )
+frames = SubResource( 5 )
animation = "default"
-_sections_unfolded = [ "Visibility" ]
+_sections_unfolded = [ "Transform", "Visibility" ]
[node name="Button" type="Button" parent="DoubleLaserUpgrade" index="1"]
@@ -475,6 +570,172 @@ group = null
flat = true
align = 1
+[node name="LaserDamageUpgrade" type="Node2D" parent="." index="7"]
+
+light_mask = 0
+position = Vector2( 371, 300 )
+scale = Vector2( 0.4, 0.4 )
+_sections_unfolded = [ "Transform", "Visibility" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Icon" type="AnimatedSprite" parent="LaserDamageUpgrade" index="0"]
+
+frames = SubResource( 6 )
+animation = "default"
+
+[node name="Button" type="Button" parent="LaserDamageUpgrade" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -320.0
+margin_top = -200.0
+margin_right = 320.0
+margin_bottom = 200.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Cost" type="Label" parent="LaserDamageUpgrade" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -79.0
+margin_top = -228.0
+margin_right = 161.0
+margin_bottom = -165.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = SubResource( 7 )
+custom_colors/font_color = Color( 0.272552, 1, 0.230469, 1 )
+text = "$400"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "custom_colors", "custom_fonts" ]
+
+[node name="LaserPenetrationUpgrade" type="Node2D" parent="." index="8"]
+
+light_mask = 0
+position = Vector2( 660, 300 )
+scale = Vector2( 0.4, 0.4 )
+_sections_unfolded = [ "Transform", "Visibility" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Icon" type="AnimatedSprite" parent="LaserPenetrationUpgrade" index="0"]
+
+frames = SubResource( 8 )
+animation = "default"
+
+[node name="Button" type="Button" parent="LaserPenetrationUpgrade" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -325.0
+margin_top = -200.0
+margin_right = 325.0
+margin_bottom = 200.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
+[node name="Cost" type="Label" parent="LaserPenetrationUpgrade" index="2"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -98.0
+margin_top = -228.0
+margin_right = 142.0
+margin_bottom = -165.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+mouse_filter = 2
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 4
+custom_fonts/font = SubResource( 7 )
+custom_colors/font_color = Color( 0.272552, 1, 0.230469, 1 )
+text = "$400"
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+_sections_unfolded = [ "custom_colors", "custom_fonts" ]
+
+[node name="Turrets" type="Node2D" parent="." index="9"]
+
+editor/display_folded = true
+light_mask = 0
+position = Vector2( 900, 200 )
+scale = Vector2( 0.2, 0.2 )
+_sections_unfolded = [ "Transform", "Visibility" ]
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Icon" type="AnimatedSprite" parent="Turrets" index="0"]
+
+frames = SubResource( 9 )
+animation = "default"
+
+[node name="Button" type="Button" parent="Turrets" index="1"]
+
+anchor_left = 0.0
+anchor_top = 0.0
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = -500.0
+margin_top = -500.0
+margin_right = 550.0
+margin_bottom = 450.0
+rect_pivot_offset = Vector2( 0, 0 )
+rect_clip_content = false
+focus_mode = 2
+mouse_filter = 0
+mouse_default_cursor_shape = 0
+size_flags_horizontal = 1
+size_flags_vertical = 1
+toggle_mode = false
+enabled_focus_mode = 2
+shortcut = null
+group = null
+flat = true
+align = 1
+
[connection signal="pressed" from="Resume" to="." method="_on_Button_pressed"]
[connection signal="pressed" from="Refund" to="." method="_on_Refund_pressed"]
@@ -505,4 +766,10 @@ align = 1
[connection signal="pressed" from="DoubleLaserUpgrade/Button" to="." method="_on_DoubleLaserUpgrade_pressed"]
+[connection signal="pressed" from="LaserDamageUpgrade/Button" to="." method="_on_Laser_Damage_Upgrade"]
+
+[connection signal="pressed" from="LaserPenetrationUpgrade/Button" to="." method="_on_Laser_Penetration_Upgrade"]
+
+[connection signal="pressed" from="Turrets/Button" to="." method="_on_TurretsButton_pressed"]
+
diff --git a/art/backgrounds/SunBG.png b/art/backgrounds/SunBG.png
new file mode 100644
index 0000000..87234a0
Binary files /dev/null and b/art/backgrounds/SunBG.png differ
diff --git a/art/backgrounds/orange.png b/art/backgrounds/orange.png
new file mode 100644
index 0000000..a2b1395
Binary files /dev/null and b/art/backgrounds/orange.png differ
diff --git a/art/bad/BlackHole/base.png b/art/bad/BlackHole/base.png
index 0008e5b..4d461c6 100644
Binary files a/art/bad/BlackHole/base.png and b/art/bad/BlackHole/base.png differ
diff --git a/art/bad/BlackHole/base_1.png b/art/bad/BlackHole/base_1.png
index 81ef58f..6b41025 100644
Binary files a/art/bad/BlackHole/base_1.png and b/art/bad/BlackHole/base_1.png differ
diff --git a/art/bad/BlackHole/base_2.png b/art/bad/BlackHole/base_2.png
index 9556c56..9da4cac 100644
Binary files a/art/bad/BlackHole/base_2.png and b/art/bad/BlackHole/base_2.png differ
diff --git a/art/bad/BlackHole/base_3.png b/art/bad/BlackHole/base_3.png
index 3648092..48ce62d 100644
Binary files a/art/bad/BlackHole/base_3.png and b/art/bad/BlackHole/base_3.png differ
diff --git a/art/bad/BlackHole/base_4.png b/art/bad/BlackHole/base_4.png
index 04ae2b9..90bc686 100644
Binary files a/art/bad/BlackHole/base_4.png and b/art/bad/BlackHole/base_4.png differ
diff --git a/art/bad/BlackHole/base_5.png b/art/bad/BlackHole/base_5.png
index b0cc3da..ec41e34 100644
Binary files a/art/bad/BlackHole/base_5.png and b/art/bad/BlackHole/base_5.png differ
diff --git a/art/bad/BlackHole/base_6.png b/art/bad/BlackHole/base_6.png
index a1608a4..ec5b8ef 100644
Binary files a/art/bad/BlackHole/base_6.png and b/art/bad/BlackHole/base_6.png differ
diff --git a/art/bad/BlackHole/half1.png b/art/bad/BlackHole/half1.png
index 5ed7abe..554952d 100644
Binary files a/art/bad/BlackHole/half1.png and b/art/bad/BlackHole/half1.png differ
diff --git a/art/bad/BlackHole/half2.png b/art/bad/BlackHole/half2.png
index 17758b1..2c541a0 100644
Binary files a/art/bad/BlackHole/half2.png and b/art/bad/BlackHole/half2.png differ
diff --git a/art/bad/BlackHole/old/base.png b/art/bad/BlackHole/old/base.png
new file mode 100644
index 0000000..0f6a670
Binary files /dev/null and b/art/bad/BlackHole/old/base.png differ
diff --git a/art/bad/BlackHole/old/base_1.png b/art/bad/BlackHole/old/base_1.png
new file mode 100644
index 0000000..81ef58f
Binary files /dev/null and b/art/bad/BlackHole/old/base_1.png differ
diff --git a/art/bad/BlackHole/old/base_2.png b/art/bad/BlackHole/old/base_2.png
new file mode 100644
index 0000000..9556c56
Binary files /dev/null and b/art/bad/BlackHole/old/base_2.png differ
diff --git a/art/bad/BlackHole/old/base_3.png b/art/bad/BlackHole/old/base_3.png
new file mode 100644
index 0000000..3648092
Binary files /dev/null and b/art/bad/BlackHole/old/base_3.png differ
diff --git a/art/bad/BlackHole/old/base_4.png b/art/bad/BlackHole/old/base_4.png
new file mode 100644
index 0000000..04ae2b9
Binary files /dev/null and b/art/bad/BlackHole/old/base_4.png differ
diff --git a/art/bad/BlackHole/old/base_5.png b/art/bad/BlackHole/old/base_5.png
new file mode 100644
index 0000000..b0cc3da
Binary files /dev/null and b/art/bad/BlackHole/old/base_5.png differ
diff --git a/art/bad/BlackHole/old/base_6.png b/art/bad/BlackHole/old/base_6.png
new file mode 100644
index 0000000..a1608a4
Binary files /dev/null and b/art/bad/BlackHole/old/base_6.png differ
diff --git a/art/bad/BlackHole/old/half1.png b/art/bad/BlackHole/old/half1.png
new file mode 100644
index 0000000..5ed7abe
Binary files /dev/null and b/art/bad/BlackHole/old/half1.png differ
diff --git a/art/bad/BlackHole/old/half2.png b/art/bad/BlackHole/old/half2.png
new file mode 100644
index 0000000..17758b1
Binary files /dev/null and b/art/bad/BlackHole/old/half2.png differ
diff --git a/art/bad/bad1/bad1.png b/art/bad/bad1/bad1.png
index 2d4daa0..e057217 100644
Binary files a/art/bad/bad1/bad1.png and b/art/bad/bad1/bad1.png differ
diff --git a/art/bad/bad1/bad1_hit.png b/art/bad/bad1/bad1_hit.png
index dc44879..113ff9f 100644
Binary files a/art/bad/bad1/bad1_hit.png and b/art/bad/bad1/bad1_hit.png differ
diff --git a/art/bad/blob/bad_blob.png b/art/bad/blob/bad_blob.png
index 458281f..5acb101 100644
Binary files a/art/bad/blob/bad_blob.png and b/art/bad/blob/bad_blob.png differ
diff --git a/art/bad/laser/bad_laser_bg.png b/art/bad/laser/bad_laser_bg.png
new file mode 100644
index 0000000..11490ed
Binary files /dev/null and b/art/bad/laser/bad_laser_bg.png differ
diff --git a/art/bad/rectangle/return_arm.png b/art/bad/rectangle/return_arm.png
new file mode 100644
index 0000000..72a3287
Binary files /dev/null and b/art/bad/rectangle/return_arm.png differ
diff --git a/art/bg.png b/art/bg.png
index 6fa5363..2f64f7b 100644
Binary files a/art/bg.png and b/art/bg.png differ
diff --git a/art/hand-numbs.sfd b/art/hand-numbs.sfd
new file mode 100644
index 0000000..072ddd8
--- /dev/null
+++ b/art/hand-numbs.sfd
@@ -0,0 +1,627 @@
+SplineFontDB: 3.0
+FontName: Untitled1
+FullName: Untitled1
+FamilyName: Untitled1
+Weight: Regular
+Copyright: Copyright (c) 2018, Sage
+UComments: "2018-6-23: Created with FontForge (http://fontforge.org)"
+Version: 001.000
+ItalicAngle: 0
+UnderlinePosition: -100
+UnderlineWidth: 50
+Ascent: 800
+Descent: 200
+InvalidEm: 0
+LayerCount: 2
+Layer: 0 0 "Back" 1
+Layer: 1 0 "Fore" 0
+XUID: [1021 912 -219086254 5845647]
+StyleMap: 0x0000
+FSType: 0
+OS2Version: 0
+OS2_WeightWidthSlopeOnly: 0
+OS2_UseTypoMetrics: 1
+CreationTime: 1529764691
+ModificationTime: 1529767606
+OS2TypoAscent: 0
+OS2TypoAOffset: 1
+OS2TypoDescent: 0
+OS2TypoDOffset: 1
+OS2TypoLinegap: 90
+OS2WinAscent: 0
+OS2WinAOffset: 1
+OS2WinDescent: 0
+OS2WinDOffset: 1
+HheadAscent: 0
+HheadAOffset: 1
+HheadDescent: 0
+HheadDOffset: 1
+MarkAttachClasses: 1
+DEI: 91125
+Encoding: ISO8859-1
+UnicodeInterp: none
+NameList: AGL For New Fonts
+DisplaySize: -48
+AntiAlias: 1
+FitToEm: 0
+WidthSeparation: 150
+WinInfo: 0 38 14
+BeginPrivate: 0
+EndPrivate
+AnchorClass2: "hhh"""
+BeginChars: 256 13
+
+StartChar: A
+Encoding: 65 65 0
+Width: 150
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+Validated: 1
+EndChar
+
+StartChar: zero
+Encoding: 48 48 1
+Width: 649
+VWidth: 0
+Flags: HW
+HStem: 47 118<297.936 415.761> 651 117<224.578 442.698>
+VStem: 52 116<376.505 571.394> 475 118<302.688 611.105>
+LayerCount: 2
+Fore
+SplineSet
+263 766 m 0
+ 273 767 290 768 309 768 c 0
+ 345 768 389 766 411 762 c 0
+ 530 742 581 683 591 553 c 0
+ 592 541 593 527 593 511 c 0
+ 593 414 572 264 546 185 c 0
+ 534 148 526 133 501 103 c 0
+ 469 66 425 47 373 47 c 0
+ 347 47 319 51 290 61 c 0
+ 252 74 191 108 171 129 c 0
+ 146 154 121 208 92 295 c 0
+ 61 388 52 431 52 480 c 0
+ 52 485 52 490 52 495 c 0
+ 58 607 112 709 186 746 c 0
+ 197 751 234 761 263 766 c 0
+409 643 m 0
+ 391 648 341 651 307 651 c 0
+ 296 651 287 651 281 650 c 0
+ 223 641 205 624 182 551 c 0
+ 173 525 168 504 168 481 c 0
+ 168 445 180 404 205 329 c 0
+ 236 237 247 215 269 204 c 0
+ 278 200 290 192 296 188 c 0
+ 314 176 351 165 374 165 c 0
+ 395 165 398 166 411 180 c 0
+ 429 200 439 227 453 299 c 0
+ 468 380 471 410 474 483 c 0
+ 474 496 475 508 475 519 c 0
+ 475 568 470 593 459 612 c 0
+ 449 628 438 635 409 643 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: one
+Encoding: 49 49 2
+Width: 437
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+176 725 m 0
+ 185 730 193 732 202 732 c 0
+ 221 732 239 720 254 695 c 0
+ 262 682 266 674 266 641 c 0
+ 266 618 264 582 261 523 c 0
+ 258 477 254 383 252 315 c 0
+ 250 247 247 179 246 165 c 2
+ 243 138 l 1
+ 295 138 l 2
+ 334 138 349 137 360 132 c 0
+ 380 122 391 103 391 82 c 0
+ 391 65 383 48 367 36 c 0
+ 356 28 349 27 288 25 c 0
+ 251 23 211 20 199 17 c 0
+ 187 15 156 12 130 12 c 0
+ 90 12 82 13 71 20 c 0
+ 53 30 43 48 43 68 c 0
+ 43 101 66 122 104 125 c 0
+ 125 127 128 129 130 137 c 0
+ 131 142 134 203 136 273 c 0
+ 138 343 141 430 143 466 c 0
+ 145 503 146 533 146 533 c 0
+ 145 534 139 532 132 530 c 0
+ 127 528 122 527 117 527 c 0
+ 97 527 78 540 68 559 c 0
+ 64 567 62 576 62 584 c 0
+ 62 593 65 602 69 611 c 0
+ 79 630 160 717 176 725 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: two
+Encoding: 50 50 3
+Width: 711
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+198 739 m 0
+ 207 743 218 745 231 745 c 0
+ 258 745 292 737 325 721 c 0
+ 344 712 360 699 381 676 c 0
+ 472 579 527 437 527 302 c 2
+ 527 270 l 1
+ 548 257 l 2
+ 575 241 632 186 649 161 c 0
+ 657 148 661 136 661 124 c 0
+ 661 113 658 104 653 94 c 0
+ 641 75 621 64 601 64 c 0
+ 594 64 586 65 579 68 c 0
+ 573 71 550 90 528 111 c 2
+ 489 150 l 1
+ 480 137 l 2
+ 464 115 425 76 408 64 c 0
+ 378 43 336 32 298 32 c 0
+ 288 32 278 32 269 34 c 0
+ 216 44 114 98 86 132 c 0
+ 68 152 51 193 48 219 c 0
+ 47 224 47 228 47 232 c 0
+ 47 280 76 322 122 338 c 0
+ 137 344 153 347 174 347 c 0
+ 215 347 274 334 380 305 c 0
+ 393 301 404 299 405 300 c 0
+ 405 300 406 302 406 304 c 0
+ 406 322 396 388 390 412 c 0
+ 371 476 328 555 289 594 c 0
+ 272 612 242 625 218 625 c 0
+ 203 625 182 638 171 655 c 0
+ 166 663 164 672 164 682 c 0
+ 164 704 177 728 198 739 c 0
+270 206 m 0
+ 225 217 198 223 185 223 c 0
+ 179 223 176 222 176 219 c 0
+ 176 203 271 156 303 156 c 0
+ 320 156 352 170 354 179 c 0
+ 355 182 352 185 347 186 c 0
+ 341 187 306 196 270 206 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: three
+Encoding: 51 51 4
+Width: 538
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+194 736 m 0
+ 208 743 217 745 243 745 c 0
+ 282 745 311 738 351 718 c 0
+ 387 701 419 672 432 643 c 0
+ 439 629 442 608 442 586 c 0
+ 442 550 434 508 418 474 c 0
+ 411 459 405 445 405 444 c 0
+ 405 442 410 439 415 436 c 0
+ 460 416 486 364 486 299 c 0
+ 486 289 485 278 484 267 c 0
+ 476 200 466 171 436 126 c 0
+ 407 83 352 46 295 32 c 0
+ 268 25 212 21 172 21 c 0
+ 160 21 149 21 141 22 c 0
+ 79 31 44 56 44 89 c 0
+ 44 97 46 106 50 115 c 0
+ 59 134 77 145 97 145 c 0
+ 105 145 114 143 122 140 c 0
+ 135 135 163 132 194 132 c 0
+ 224 132 255 135 272 140 c 0
+ 314 153 344 178 359 214 c 0
+ 369 236 375 276 375 303 c 0
+ 375 315 374 325 371 330 c 0
+ 366 340 341 349 322 349 c 0
+ 310 349 300 346 283 335 c 0
+ 255 317 230 308 208 308 c 0
+ 186 308 169 317 155 336 c 0
+ 149 343 147 354 147 366 c 0
+ 147 379 150 393 158 403 c 0
+ 171 421 200 437 236 448 c 0
+ 260 456 267 460 287 479 c 0
+ 313 505 324 527 331 564 c 0
+ 332 571 333 577 333 582 c 0
+ 333 601 324 609 297 622 c 0
+ 274 632 268 633 232 633 c 0
+ 187 634 177 638 167 660 c 0
+ 163 669 161 678 161 686 c 0
+ 161 707 173 725 194 736 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: four
+Encoding: 52 52 5
+Width: 517
+VWidth: 0
+Flags: HW
+HStem: 421 118<217 318.453>
+VStem: 156 107<539.012 774.158> 354 106<37.104 191.677> 391 106<570.5 764.367> 403 109<243.476 456 570 748.169>
+CounterMasks: 1 58
+LayerCount: 2
+Fore
+SplineSet
+299 460 m 4xc8
+ 291 460 128 421 120 421 c 4
+ 114 421 100 425 90 430 c 4
+ 68 441 56 460 56 482 c 4
+ 56 483 56 484 56 485 c 4
+ 56 494 56 558 56 628 c 4
+ 56 767 57 765 82 780 c 4
+ 89 784 97 787 106 787 c 4
+ 126 787 147 775 156 756 c 4
+ 162 744 163 731 163 641 c 4
+ 163 555 164 539 169 539 c 4
+ 171 539 193 544 216 550 c 4
+ 240 556 268 563 281 565 c 6
+ 303 570 l 5
+ 303 602 l 5xc8
+ 303 633 296 688 291 722 c 5
+ 291 727 l 6
+ 291 755 313 776 342 776 c 4
+ 367 776 389 759 397 734 c 4xd0
+ 402 721 411 614 411 571 c 4
+ 411 568 416 564 426 561 c 4
+ 447 555 457 548 463 534 c 4
+ 467 526 469 518 469 510 c 4
+ 469 485 451 463 424 458 c 6
+ 412 456 l 5
+ 412 371 l 5xc8
+ 402 276 385 210 372 146 c 4
+ 367 122 360 94 360 82 c 4
+ 360 51 337 26 303 26 c 4
+ 273 26 254 46 254 81 c 4xe0
+ 254 100 258 127 266 164 c 4
+ 281 235 303 356 303 442 c 4
+ 303 457 304 460 299 460 c 4xc8
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: five
+Encoding: 53 53 6
+Width: 493
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+252 730 m 0
+ 262 732 276 735 283 735 c 0
+ 283 735 284 735 284 735 c 0
+ 313 735 331 711 331 688 c 0
+ 331 672 324 657 308 647 c 0
+ 290 636 253 629 210 629 c 0
+ 166 629 155 627 155 618 c 0
+ 155 618 155 617 155 617 c 0
+ 155 614 161 584 169 552 c 0
+ 176 519 183 489 184 485 c 0
+ 185 479 189 478 271 475 c 0
+ 369 471 378 469 405 444 c 0
+ 431 421 443 392 443 354 c 0
+ 443 345 442 335 441 325 c 0
+ 436 288 427 260 412 235 c 0
+ 380 183 362 156 342 131 c 0
+ 300 79 246 51 190 51 c 0
+ 176 51 162 52 148 56 c 0
+ 113 65 73 92 62 114 c 0
+ 59 120 57 129 57 137 c 0
+ 57 146 59 155 63 161 c 0
+ 73 176 87 184 102 184 c 0
+ 113 184 124 180 135 172 c 0
+ 158 155 174 147 190 147 c 0
+ 201 147 212 151 225 157 c 0
+ 250 170 267 189 304 246 c 0
+ 337 298 344 314 345 343 c 0
+ 345 347 345 350 345 353 c 0
+ 345 376 338 375 262 379 c 0
+ 234 380 217 381 206 381 c 0
+ 188 381 184 379 174 375 c 0
+ 164 370 154 368 145 368 c 0
+ 126 368 111 378 103 396 c 0
+ 100 403 94 426 91 446 c 0
+ 86 485 66 570 58 593 c 0
+ 53 607 51 620 51 632 c 0
+ 51 665 69 690 104 708 c 0
+ 131 721 151 725 197 725 c 0
+ 217 725 242 727 252 730 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: six
+Encoding: 54 54 7
+Width: 435
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+208 736 m 0
+ 214 739 220 741 226 741 c 0
+ 232 741 239 739 246 735 c 0
+ 263 726 272 711 272 693 c 0
+ 272 686 271 678 268 671 c 0
+ 266 665 254 652 243 642 c 0
+ 207 613 187 590 180 575 c 0
+ 175 565 173 547 170 508 c 0
+ 169 487 168 468 168 459 c 0
+ 168 456 168 454 168 454 c 0
+ 169 453 175 454 182 456 c 0
+ 191 459 206 460 221 460 c 0
+ 240 460 260 458 272 454 c 0
+ 329 435 359 406 375 356 c 0
+ 380 342 382 323 382 302 c 0
+ 382 279 379 254 373 232 c 0
+ 346 125 306 77 234 63 c 0
+ 227 62 219 61 211 61 c 0
+ 159 61 102 89 84 126 c 0
+ 68 156 60 217 60 290 c 0
+ 60 315 61 341 63 368 c 0
+ 66 404 71 466 73 504 c 0
+ 76 543 80 583 83 592 c 0
+ 89 614 105 642 125 665 c 0
+ 144 686 194 729 208 736 c 0
+256 356 m 0
+ 246 360 235 363 223 363 c 0
+ 211 363 199 360 188 356 c 0
+ 159 346 157 349 157 308 c 0
+ 157 303 157 297 157 291 c 0
+ 157 244 164 181 170 171 c 0
+ 174 164 191 160 208 160 c 0
+ 218 160 229 161 235 165 c 0
+ 260 180 285 251 285 299 c 0
+ 285 302 285 305 285 307 c 0
+ 283 336 276 348 256 356 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: seven
+Encoding: 55 55 8
+Width: 531
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+311 765 m 0
+ 331 767 349 768 364 768 c 0
+ 410 768 438 759 459 737 c 0
+ 474 721 481 704 481 686 c 0
+ 481 673 477 659 470 645 c 0
+ 466 636 442 598 416 559 c 0
+ 321 414 301 377 265 282 c 0
+ 254 253 239 213 230 194 c 0
+ 222 176 207 140 196 116 c 0
+ 164 40 157 32 125 29 c 0
+ 124 29 123 29 122 29 c 0
+ 92 29 67 53 67 83 c 0
+ 67 98 84 144 109 198 c 0
+ 128 240 141 270 168 343 c 0
+ 198 422 240 498 320 617 c 0
+ 331 635 341 651 341 653 c 0
+ 341 653 339 653 336 653 c 0
+ 328 653 309 652 288 650 c 0
+ 268 649 230 648 195 648 c 0
+ 182 648 170 648 158 648 c 0
+ 84 649 78 650 67 658 c 0
+ 51 669 44 685 44 702 c 0
+ 44 722 54 741 75 752 c 0
+ 90 760 95 761 189 761 c 0
+ 243 762 297 763 311 765 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: eight
+Encoding: 56 56 9
+Width: 559
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+307 752 m 0
+ 328 758 348 764 352 764 c 0
+ 357 765 369 761 381 757 c 0
+ 463 730 507 680 507 617 c 0
+ 507 608 506 599 504 589 c 0
+ 495 547 471 502 437 465 c 2
+ 418 445 l 1
+ 431 426 l 2
+ 458 391 472 355 476 312 c 0
+ 476 309 476 305 476 301 c 0
+ 476 258 457 193 430 154 c 0
+ 410 123 367 78 339 60 c 0
+ 293 30 249 15 208 15 c 0
+ 168 15 131 29 99 58 c 0
+ 78 77 68 93 57 124 c 0
+ 49 145 48 154 48 189 c 0
+ 48 222 49 233 55 251 c 0
+ 72 299 96 330 170 391 c 0
+ 194 410 212 427 212 430 c 0
+ 211 431 201 435 190 438 c 0
+ 162 447 133 475 125 501 c 0
+ 122 513 120 531 120 548 c 0
+ 120 568 122 588 127 601 c 0
+ 141 641 189 691 246 725 c 0
+ 259 733 287 745 307 752 c 0
+376 652 m 0
+ 367 657 360 659 353 659 c 0
+ 347 659 340 658 331 655 c 0
+ 309 648 291 638 264 616 c 0
+ 233 591 218 570 218 549 c 0
+ 218 531 220 530 264 523 c 0
+ 283 521 305 516 312 513 c 0
+ 320 510 330 508 334 509 c 0
+ 356 515 407 588 407 615 c 0
+ 407 628 396 642 376 652 c 0
+366 344 m 0
+ 361 353 351 368 344 375 c 2
+ 331 390 l 1
+ 312 377 l 2
+ 291 363 200 287 179 265 c 0
+ 156 242 147 221 147 190 c 0
+ 147 161 152 145 166 133 c 0
+ 180 119 190 115 208 115 c 0
+ 208 115 209 115 209 115 c 0
+ 264 115 337 175 364 242 c 0
+ 373 265 375 274 375 298 c 0
+ 375 323 374 330 366 344 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: nine
+Encoding: 57 57 10
+Width: 436
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+224 753 m 0
+ 235 756 248 758 260 758 c 0
+ 286 758 312 751 328 737 c 0
+ 333 734 344 725 353 718 c 0
+ 372 704 380 696 380 677 c 0
+ 380 665 377 647 371 619 c 0
+ 365 589 358 550 354 532 c 0
+ 351 514 346 492 343 483 c 0
+ 340 473 339 468 339 460 c 0
+ 339 454 339 447 340 437 c 0
+ 342 421 347 390 351 368 c 0
+ 357 333 358 321 358 269 c 0
+ 358 165 354 57 350 47 c 0
+ 344 35 331 27 316 25 c 0
+ 315 25 315 25 314 25 c 0
+ 292 25 277 41 273 68 c 0
+ 273 70 273 75 273 81 c 0
+ 273 98 274 127 275 157 c 0
+ 277 202 278 236 278 264 c 0
+ 278 300 276 326 272 349 c 0
+ 269 368 266 385 265 387 c 0
+ 264 391 258 392 234 392 c 0
+ 206 392 203 392 186 400 c 0
+ 162 412 148 421 124 444 c 0
+ 91 475 70 505 56 542 c 0
+ 51 556 48 570 48 585 c 0
+ 48 609 55 632 68 651 c 0
+ 96 694 160 735 224 753 c 0
+269 677 m 0
+ 266 678 263 678 261 678 c 0
+ 256 678 250 676 233 671 c 0
+ 192 658 149 628 135 606 c 0
+ 131 599 129 592 129 585 c 0
+ 129 576 132 568 137 557 c 0
+ 150 530 189 490 214 477 c 0
+ 222 473 228 470 233 470 c 0
+ 238 470 242 473 247 478 c 0
+ 254 485 255 487 256 518 c 0
+ 257 536 261 566 265 585 c 0
+ 269 604 273 632 274 647 c 0
+ 275 675 275 675 269 677 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: dollar
+Encoding: 36 36 11
+Width: 487
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+250 756 m 0
+ 261 762 268 762 280 757 c 0
+ 292 752 302 740 307 725 c 0
+ 309 719 310 714 310 708 c 0
+ 310 701 309 692 307 679 c 2
+ 305 669 l 1
+ 318 673 l 2
+ 333 677 343 679 353 679 c 0
+ 358 679 364 678 369 677 c 0
+ 395 672 411 653 411 629 c 0
+ 411 608 392 591 372 591 c 0
+ 367 591 361 592 356 595 c 0
+ 349 599 347 599 333 594 c 0
+ 325 592 314 588 310 586 c 2
+ 302 582 l 1
+ 304 523 l 2
+ 305 490 306 463 307 462 c 0
+ 307 462 323 459 342 457 c 0
+ 382 452 390 450 407 434 c 0
+ 429 414 438 392 440 354 c 0
+ 440 351 440 348 440 344 c 0
+ 440 309 430 280 404 244 c 0
+ 388 221 345 180 327 171 c 2
+ 311 163 l 1
+ 312 112 l 2
+ 312 104 312 98 312 92 c 0
+ 312 53 309 44 295 34 c 0
+ 288 30 281 27 274 27 c 0
+ 259 27 246 35 239 49 c 0
+ 233 59 233 66 233 112 c 2
+ 233 164 l 1
+ 226 166 l 2
+ 193 173 165 185 124 208 c 0
+ 112 215 94 224 84 228 c 0
+ 65 235 51 248 48 260 c 0
+ 47 263 47 267 47 270 c 0
+ 47 288 57 306 71 314 c 0
+ 76 317 82 318 87 318 c 0
+ 98 318 109 313 118 304 c 0
+ 129 294 216 248 226 248 c 0
+ 229 248 230 254 230 273 c 0
+ 230 288 229 310 228 343 c 2
+ 227 387 l 1
+ 195 391 l 2
+ 156 395 148 397 131 408 c 0
+ 116 418 106 435 106 451 c 0
+ 106 478 158 559 205 606 c 2
+ 224 625 l 1
+ 226 661 l 2
+ 227 681 228 706 229 716 c 0
+ 229 738 235 749 250 756 c 0
+353 374 m 0
+ 352 376 340 378 328 379 c 2
+ 307 381 l 1
+ 308 320 l 2
+ 308 287 310 259 310 259 c 0
+ 311 258 318 265 326 273 c 0
+ 344 292 360 323 362 340 c 0
+ 362 341 362 343 362 344 c 0
+ 362 356 358 370 353 374 c 0
+EndSplineSet
+Validated: 1
+EndChar
+
+StartChar: ydieresis
+Encoding: 255 255 12
+Width: 150
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+Validated: 1
+EndChar
+EndChars
+EndSplineFont
diff --git a/art/hand-numbs.ttf b/art/hand-numbs.ttf
new file mode 100644
index 0000000..6d2f42b
Binary files /dev/null and b/art/hand-numbs.ttf differ
diff --git a/art/interface/how_to.png b/art/interface/how_to.png
index 0fd6a2e..7ae2109 100644
Binary files a/art/interface/how_to.png and b/art/interface/how_to.png differ
diff --git a/art/interface/how_to_desktop.png b/art/interface/how_to_desktop.png
index 974a5b4..ffcd5ef 100644
Binary files a/art/interface/how_to_desktop.png and b/art/interface/how_to_desktop.png differ
diff --git a/art/menu/back.png b/art/menu/back.png
new file mode 100644
index 0000000..f21436b
Binary files /dev/null and b/art/menu/back.png differ
diff --git a/art/turret/shootin2.png b/art/turret/shootin2.png
new file mode 100644
index 0000000..75b26e8
Binary files /dev/null and b/art/turret/shootin2.png differ
diff --git a/art/turret/turret2.png b/art/turret/turret2.png
new file mode 100644
index 0000000..6555a35
Binary files /dev/null and b/art/turret/turret2.png differ
diff --git a/art/upgrade_menu/buyturrets.png b/art/upgrade_menu/buyturrets.png
new file mode 100644
index 0000000..9a9f306
Binary files /dev/null and b/art/upgrade_menu/buyturrets.png differ
diff --git a/art/upgrade_menu/laserpenetration1.png b/art/upgrade_menu/laserpenetration1.png
new file mode 100644
index 0000000..10da2f3
Binary files /dev/null and b/art/upgrade_menu/laserpenetration1.png differ
diff --git a/art/upgrade_menu/laserpenetration2.png b/art/upgrade_menu/laserpenetration2.png
new file mode 100644
index 0000000..3a0f264
Binary files /dev/null and b/art/upgrade_menu/laserpenetration2.png differ
diff --git a/art/upgrade_menu/laserpenetration3.png b/art/upgrade_menu/laserpenetration3.png
new file mode 100644
index 0000000..d01a421
Binary files /dev/null and b/art/upgrade_menu/laserpenetration3.png differ
diff --git a/art/upgrade_menu/laserpenetration4.png b/art/upgrade_menu/laserpenetration4.png
new file mode 100644
index 0000000..5f4884b
Binary files /dev/null and b/art/upgrade_menu/laserpenetration4.png differ
diff --git a/art/upgrade_menu/laserpenetration5.png b/art/upgrade_menu/laserpenetration5.png
new file mode 100644
index 0000000..54f1d66
Binary files /dev/null and b/art/upgrade_menu/laserpenetration5.png differ
diff --git a/art/upgrade_menu/openturrets.png b/art/upgrade_menu/openturrets.png
new file mode 100644
index 0000000..98373ad
Binary files /dev/null and b/art/upgrade_menu/openturrets.png differ
diff --git a/art/upgrade_menu/shootingdamage1.png b/art/upgrade_menu/shootingdamage1.png
new file mode 100644
index 0000000..9e96795
Binary files /dev/null and b/art/upgrade_menu/shootingdamage1.png differ
diff --git a/art/upgrade_menu/shootingdamage2.png b/art/upgrade_menu/shootingdamage2.png
new file mode 100644
index 0000000..726f001
Binary files /dev/null and b/art/upgrade_menu/shootingdamage2.png differ
diff --git a/art/upgrade_menu/shootingdamage3.png b/art/upgrade_menu/shootingdamage3.png
new file mode 100644
index 0000000..616e8b8
Binary files /dev/null and b/art/upgrade_menu/shootingdamage3.png differ
diff --git a/art/upgrade_menu/shootingdamage4.png b/art/upgrade_menu/shootingdamage4.png
new file mode 100644
index 0000000..8092702
Binary files /dev/null and b/art/upgrade_menu/shootingdamage4.png differ
diff --git a/art/upgrade_menu/shootingdamage5.png b/art/upgrade_menu/shootingdamage5.png
new file mode 100644
index 0000000..a0293d9
Binary files /dev/null and b/art/upgrade_menu/shootingdamage5.png differ
diff --git a/art/upgrade_menu/shootingspeed.xcf b/art/upgrade_menu/shootingspeed.xcf
index 796443c..8a23baf 100644
Binary files a/art/upgrade_menu/shootingspeed.xcf and b/art/upgrade_menu/shootingspeed.xcf differ
diff --git a/art/upgrade_menu/shootingspeed1.png b/art/upgrade_menu/shootingspeed1.png
index e2e5231..978cf7f 100644
Binary files a/art/upgrade_menu/shootingspeed1.png and b/art/upgrade_menu/shootingspeed1.png differ
diff --git a/art/upgrade_menu/shootingspeed2.png b/art/upgrade_menu/shootingspeed2.png
index db3cbb9..350b941 100644
Binary files a/art/upgrade_menu/shootingspeed2.png and b/art/upgrade_menu/shootingspeed2.png differ
diff --git a/art/upgrade_menu/shootingspeed3.png b/art/upgrade_menu/shootingspeed3.png
index ab542c3..3e5a467 100644
Binary files a/art/upgrade_menu/shootingspeed3.png and b/art/upgrade_menu/shootingspeed3.png differ
diff --git a/art/upgrade_menu/shootingspeed4.png b/art/upgrade_menu/shootingspeed4.png
index 49235e2..3ce6ba7 100644
Binary files a/art/upgrade_menu/shootingspeed4.png and b/art/upgrade_menu/shootingspeed4.png differ
diff --git a/art/upgrade_menu/shootingspeed5.png b/art/upgrade_menu/shootingspeed5.png
index 7b20690..eab0bac 100644
Binary files a/art/upgrade_menu/shootingspeed5.png and b/art/upgrade_menu/shootingspeed5.png differ
diff --git a/art/upgrade_menu/unlockturrets.png b/art/upgrade_menu/unlockturrets.png
new file mode 100644
index 0000000..eb836fc
Binary files /dev/null and b/art/upgrade_menu/unlockturrets.png differ
diff --git a/balancingwithmath b/balancingwithmath
new file mode 100644
index 0000000..c276850
--- /dev/null
+++ b/balancingwithmath
@@ -0,0 +1,5 @@
+Health per second over rounds
+y = ((((x-1)/3)*((3*x*50)+(x*150)+(400*x/4)+(300*x/8)))/(3*x+x+x/4+x/8))*((x/4)/5) from 4 to 25
+
+Health per second over rounds and money per round over rounds
+y = ((((x-1)/3)*((3*x*50)+(x*150)+(400*x/4)+(300*x/8)))/(3*x+x+x/4+x/8))*((x/4)/5) and y = ((3*x*15)+(x*50)+(100*x/4)+(0*x/8)) from 4 to 10
diff --git a/export_presets.cfg b/export_presets.cfg
index 44371d6..e046023 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -32,9 +32,9 @@ launcher_icons/xxhdpi_144x144=""
launcher_icons/xhdpi_96x96=""
launcher_icons/hdpi_72x72=""
launcher_icons/mdpi_48x48=""
-keystore/release=""
-keystore/release_user=""
-keystore/release_password=""
+keystore/release="/home/sage/Godot/debug.keystore"
+keystore/release_user="androiddebugkey"
+keystore/release_password="squigglyballbois"
apk_expansion/enable=false
apk_expansion/SALT=""
apk_expansion/public_key=""
@@ -249,9 +249,174 @@ custom_template/release=""
custom_template/debug=""
application/icon=""
application/file_version=""
-application/product_version=""
-application/company_name=""
-application/product_name=""
+application/product_version="0.1"
+application/company_name="SageTheSageSage"
+application/product_name="Fronter"
application/file_description=""
application/copyright=""
application/trademarks=""
+
+[preset.3]
+
+name="Windows Universal"
+platform="Windows Universal"
+runnable=true
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+patch_list=PoolStringArray( )
+
+[preset.3.options]
+
+architecture/target=1
+command_line/extra_args=""
+package/display_name=""
+package/short_name="Fronter"
+package/unique_name="Fronter.sagethesagesage"
+package/description="The Game Fronter"
+package/publisher="SageTheSageSage"
+package/publisher_display_name="SageTheSageSage"
+identity/product_guid="00000000-0000-0000-0000-000000000000"
+identity/publisher_guid="00000000-0000-0000-0000-000000000000"
+signing/certificate=""
+signing/password=""
+signing/algorithm=2
+version/major=1
+version/minor=0
+version/build=0
+version/revision=0
+orientation/landscape=true
+orientation/portrait=true
+orientation/landscape_flipped=true
+orientation/portrait_flipped=true
+images/background_color="transparent"
+tiles/show_name_on_square150x150=false
+tiles/show_name_on_wide310x150=false
+tiles/show_name_on_square310x310=false
+custom_template/debug=""
+custom_template/release=""
+capabilities/all_Joyn=false
+capabilities/code_Generation=false
+capabilities/internet_Client=false
+capabilities/internet_Client_Server=false
+capabilities/private_Network_Client_Server=false
+capabilities/appointments=false
+capabilities/blocked_Chat_Messages=false
+capabilities/chat=false
+capabilities/contacts=false
+capabilities/enterprise_Authentication=false
+capabilities/music_Library=false
+capabilities/objects_3D=false
+capabilities/pictures_Library=false
+capabilities/phone_Call=false
+capabilities/removable_Storage=false
+capabilities/shared_User_Certificates=false
+capabilities/user_Account_Information=false
+capabilities/videos_Library=false
+capabilities/voip_Call=false
+capabilities/bluetooth=false
+capabilities/location=false
+capabilities/microphone=false
+capabilities/proximity=false
+capabilities/webcam=false
+
+[preset.4]
+
+name="HTML5"
+platform="HTML5"
+runnable=true
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+patch_list=PoolStringArray( )
+
+[preset.4.options]
+
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=true
+html/custom_html_shell=""
+html/head_include=""
+custom_template/release=""
+custom_template/debug=""
+
+[preset.5]
+
+name="Mac OSX"
+platform="Mac OSX"
+runnable=true
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+patch_list=PoolStringArray( )
+
+[preset.5.options]
+
+custom_package/debug=""
+custom_package/release=""
+application/name=""
+application/info="Made with Godot Engine"
+application/icon=""
+application/identifier="org.sagethesagesage.fronter"
+application/signature="sagethesagesage"
+application/short_version="0.1"
+application/version="0.1"
+application/copyright=""
+application/bits_mode=0
+display/high_res=false
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
+
+[preset.6]
+
+name="iOS"
+platform="iOS"
+runnable=true
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+patch_list=PoolStringArray( )
+
+[preset.6.options]
+
+custom_package/debug=""
+custom_package/release=""
+application/app_store_team_id=""
+application/provisioning_profile_uuid_debug=""
+application/code_sign_identity_debug="iPhone Developer"
+application/export_method_debug=1
+application/provisioning_profile_uuid_release=""
+application/code_sign_identity_release="iPhone Distribution"
+application/export_method_release=0
+application/name=""
+application/info="Made with Godot Engine"
+application/identifier="org.godotengine.iosgame"
+application/signature="????"
+application/short_version="1.0"
+application/version="1.0"
+application/copyright=""
+required_icons/iphone_120x120=""
+required_icons/ipad_76x76=""
+optional_icons/iphone_180x180=""
+optional_icons/ipad_152x152=""
+optional_icons/ipad_167x167=""
+optional_icons/spotlight_40x40=""
+optional_icons/spotlight_80x80=""
+landscape_launch_screens/iphone_2208x1242=""
+landscape_launch_screens/ipad_2732x2048=""
+landscape_launch_screens/ipad_2048x1536=""
+portrait_launch_screens/iphone_640x1136=""
+portrait_launch_screens/iphone_750x1334=""
+portrait_launch_screens/iphone_1242x2208=""
+portrait_launch_screens/ipad_2048x2732=""
+portrait_launch_screens/ipad_1536x2048=""
+texture_format/s3tc=false
+texture_format/etc=false
+texture_format/etc2=true
+architectures/armv7=true
+architectures/arm64=true
diff --git a/light.png b/light.png
new file mode 100644
index 0000000..936860d
Binary files /dev/null and b/light.png differ
diff --git a/main_bg.ogg b/main_bg.ogg
new file mode 100644
index 0000000..ae5c608
Binary files /dev/null and b/main_bg.ogg differ
diff --git a/project.godot b/project.godot
index 850b27f..bbcba5e 100644
--- a/project.godot
+++ b/project.godot
@@ -17,6 +17,7 @@ config/icon="res://icon.png"
[display]
+window/handheld/emulate_touchscreen=true
window/stretch/mode="2d"
[input]