Initial commit

master
Wynd 2020-09-06 23:02:19 +03:00
parent c97bd84e58
commit cbdf446e73
108 changed files with 2873 additions and 1 deletions

View File

@ -1,2 +1,32 @@
# evospace
Short and noob friendly bullet hell for GBJAM 8
Short and noob friendly bullet hell for [GBJAM 8](https://itch.io/jam/gbjam-8)
## Controls:
* Arrow Keys - Movement
* Z - Shooting
* X - Bomb
## Colors used:
* #000000
* #4D4D4D
* #999999
* #FFFFFF
## Extra Info:
* You have 3 lives and 120 seconds to survive an ongoing assault.
* You get 3 bombs and no extras, bombs destroy all enemies on screen so use them carefully
* At 10.000 points you get an extra life
* At the end of the round every life you still have will grant 2000 points and every bomb 1000 points
* Enemies will drop 2 types of power ups:
* Double - shoots 2 lasers with the same power and slightly faster cooldown
* Fast - shoots 1 laser without cooldown but significantly less damage than the standard laser
## Credits :
Ships and asteroids are recolorings and at times slightly changed versions of Kenney's Space Shooter Redux pack:
[https://www.kenney.nl/assets/space-shooter-redux](https://www.kenney.nl/assets/space-shooter-redux)
Name taken from Fantasy Name Generators website:
[https://www.fantasynamegenerators.com/video-game-names.php](https://www.fantasynamegenerators.com/video-game-names.php)

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/avenger.png-e1dc08e70c6a7b4dbe97994572bffa1a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/avenger/avenger.png"
dest_files=[ "res://.import/avenger.png-e1dc08e70c6a7b4dbe97994572bffa1a.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,15 @@
extends KinematicBody2D
var damage = 1.0
var velocity = Vector2()
func _physics_process(delta):
var collision_info = move_and_collide(velocity)
if collision_info:
var collision_point = collision_info.position
if(collision_info.collider is Enemy):
(collision_info.collider as Enemy).damage(damage)
queue_free()
func _on_visiblity_notifier_screen_exited():
queue_free()

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/bullet.png-d3dacc23214f2cfa8a4bbd8885492f1f.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/bullet/bullet.png"
dest_files=[ "res://.import/bullet.png-d3dacc23214f2cfa8a4bbd8885492f1f.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,26 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://entities/bullet/bullet.gd" type="Script" id=1]
[ext_resource path="res://entities/bullet/bullet.png" type="Texture" id=2]
[sub_resource type="CapsuleShape2D" id=1]
radius = 0.98407
height = 6.88478
[node name="bullet" type="KinematicBody2D"]
collision_layer = 2
collision_mask = 6
script = ExtResource( 1 )
__meta__ = {
"_edit_group_": true
}
[node name="bullet_texture" type="Sprite" parent="."]
texture = ExtResource( 2 )
[node name="bullet_collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
scale = Vector2( 0.313677, 0.677623 )
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

55
entities/enemy.gd 100644
View File

@ -0,0 +1,55 @@
extends KinematicBody2D
class_name Enemy
export (float) var health = 1.0
export (int) var points = 1
export (float) var powerup_drop_chance = 0.1
export (Resource) var explosion = load("objects/explosion/explosion.tscn")
var velocity = Vector2()
var rng = RandomNumberGenerator.new()
var player
var powerups = [
preload("res://entities/powerups/double/double.tscn"),
preload("res://entities/powerups/laser/laser.tscn")
]
var collision_info
var level
func _ready():
player = get_tree().get_root().get_node("level/player")
rng.randomize()
explosion = explosion.instance()
level = get_parent()
func _physics_process(delta):
if collision_info:
var collision_point = collision_info.position
if(collision_info.collider is Player):
(collision_info.collider as Player).kill()
explosion.position = position
level.add_child(explosion)
queue_free()
func damage(damage: float):
health -= damage
if health <= 0:
kill(true)
func kill(get_points: bool = false):
if get_points:
player.increase_score(points)
explosion.position = position
level.add_child(explosion)
# Worth noting: meteorites are not spawned as part of the wave but instead as part of the root element, which means their "level" won't have the
# kill_enemy method, which in turn avoids waves being finished early by destroying meteorites instead of the wave spawns
if level.has_method("kill_enemy"):
level.kill_enemy()
if rng.randf() < powerup_drop_chance:
var powerup = powerups[rng.randi_range(0, powerups.size() - 1)].instance()
powerup.position = position
level.add_child(powerup)
queue_free()
func _on_visiblity_notifier_screen_exited():
queue_free()

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/meteor_big_1.png-79015b610b84a7d1f856ad62f5a3a440.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/meteorite/meteor_big_1.png"
dest_files=[ "res://.import/meteor_big_1.png-79015b610b84a7d1f856ad62f5a3a440.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/meteor_big_2.png-7b908137aa9e737d444eb33ccf4e97b4.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/meteorite/meteor_big_2.png"
dest_files=[ "res://.import/meteor_big_2.png-7b908137aa9e737d444eb33ccf4e97b4.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/meteor_big_3.png-88972c75241a59c653113008a9f5c126.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/meteorite/meteor_big_3.png"
dest_files=[ "res://.import/meteor_big_3.png-88972c75241a59c653113008a9f5c126.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/meteor_small_1.png-488b0e9052fe2cc0932e865e2f2ab209.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/meteorite/meteor_small_1.png"
dest_files=[ "res://.import/meteor_small_1.png-488b0e9052fe2cc0932e865e2f2ab209.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/meteor_small_2.png-dcb5926c9e74393651b4436306efc89d.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/meteorite/meteor_small_2.png"
dest_files=[ "res://.import/meteor_small_2.png-dcb5926c9e74393651b4436306efc89d.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/meteor_small_3.png-163e6a0d72c1e9574b601933db5ace9a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/meteorite/meteor_small_3.png"
dest_files=[ "res://.import/meteor_small_3.png-163e6a0d72c1e9574b601933db5ace9a.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,19 @@
extends "../enemy.gd"
var rotation_speed
var meteorite_size
# Number of textures available, for the sake of simplicity both small and large meteorites have the same number of textures
const TEXTURES = 3
func _ready():
meteorite_size = rng.randi_range(0, 1)
velocity.y = rng.randf_range(0.2, 0.5)
velocity.x = rng.randf_range(-0.02, 0.02)
var rand_texture = rng.randi_range(1, TEXTURES)
var meteorite_texture = load(str("res://entities/meteorite/meteor_", ("big" if meteorite_size == 1 else "small") ,"_", rand_texture, ".png"))
get_node("texture").texture = meteorite_texture
rotation_speed = rng.randf_range(-2, 2)
func _physics_process(delta):
rotation += rotation_speed * delta
collision_info = move_and_collide(velocity)

View File

@ -0,0 +1,28 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://entities/meteorite/meteor_big_1.png" type="Texture" id=1]
[ext_resource path="res://entities/meteorite/meteorite.gd" type="Script" id=2]
[sub_resource type="CircleShape2D" id=1]
radius = 6.0
[node name="meteorite" type="KinematicBody2D" groups=[
"Enemies",
]]
collision_layer = 4
collision_mask = 3
script = ExtResource( 2 )
__meta__ = {
"_edit_group_": true
}
points = 10
powerup_drop_chance = 0.01
[node name="texture" type="Sprite" parent="."]
texture = ExtResource( 1 )
[node name="collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

View File

@ -0,0 +1,15 @@
extends KinematicBody2D
var damage = 1.0
var velocity = Vector2()
func _physics_process(delta):
var collision_info = move_and_collide(velocity)
if collision_info:
var collision_point = collision_info.position
if(collision_info.collider is Player):
(collision_info.collider as Player).kill()
queue_free()
func _on_visiblity_notifier_screen_exited():
queue_free()

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/pellett.png-7761fcbb1c76550f372176a149794ae3.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/pellett/pellett.png"
dest_files=[ "res://.import/pellett.png-7761fcbb1c76550f372176a149794ae3.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,22 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://entities/pellett/pellett.png" type="Texture" id=1]
[ext_resource path="res://entities/pellett/pellett.gd" type="Script" id=2]
[sub_resource type="CircleShape2D" id=1]
radius = 2.33548
[node name="pellett" type="KinematicBody2D" groups=[
"Enemies",
]]
collision_layer = 16
script = ExtResource( 2 )
[node name="texture" type="Sprite" parent="."]
texture = ExtResource( 1 )
[node name="collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

View File

@ -0,0 +1,119 @@
extends KinematicBody2D
class_name Player
export (float) var speed = 1.3
export (Resource) var weapon = load("weapons/default/default.tscn")
export (int) var lives = 2
export (int) var bombs = 3
var velocity = Vector2()
var score = 0
var hiscore = 0
var hud
var iframe = false
onready var iframe_timer = $iframe_timer
onready var sprite = $sprite
var explosion_resource = preload("res://objects/explosion/explosion.tscn")
var collision_info
var game_over_screen = preload("res://ui/game_over/game_over.tscn")
var level
var extra_lives = 0
func _ready():
level = get_tree().get_root().get_node("level")
hud = get_parent().get_node("hud")
update_weapon()
func _physics_process(delta):
get_input()
collision_info = move_and_collide(velocity)
if collision_info:
if collision_info.collider.has_method("kill"):
collision_info.collider.kill()
kill()
if collision_info.collider.has_method("reward"):
collision_info.collider.reward(self)
func get_input():
velocity = Vector2()
if Input.is_action_pressed("ui_right") && position.x < ProjectSettings.get("display/window/size/width") - 9:
velocity.x += 1
if Input.is_action_pressed("ui_left") && position.x > 10:
velocity.x -= 1
if Input.is_action_pressed("ui_up") && position.y > 7:
velocity.y -= 1
if Input.is_action_pressed("ui_down") && position.y < ProjectSettings.get("display/window/size/height") - 16:
velocity.y += 1
velocity = velocity.normalized() * speed
if Input.is_action_pressed("player_shoot"):
shoot()
elif Input.is_action_just_pressed("player_special"):
special()
if Input.is_key_pressed(KEY_1):
weapon = load("weapons/default/default.tscn")
update_weapon()
if Input.is_key_pressed(KEY_2):
weapon = load("weapons/double/double.tscn")
update_weapon()
if Input.is_key_pressed(KEY_3):
weapon = load("weapons/laser/laser.tscn")
update_weapon()
func shoot():
if weapon.has_method("shoot"):
weapon.shoot()
func special():
if bombs <= 0:
return
bombs -= 1
for node in get_tree().get_nodes_in_group("Enemies"):
if node.has_method("kill"):
node.kill(true)
else:
node.queue_free()
func update_weapon():
if weapon.get_class() != "PackedScene":
weapon.queue_free()
weapon = weapon.instance()
weapon.player = self
add_child(weapon)
func increase_score(points):
score += points
if score / 10000 >= 1 + extra_lives:
lives += 1
extra_lives += 1
hud.update_labels()
func kill(end_game: bool = false):
if !iframe:
lives -= 1
hud.update_labels()
iframe = true
var explosion = explosion_resource.instance()
explosion.position = position
level.add_child(explosion)
position = Vector2(80, 123)
sprite.play("iframe")
iframe_timer.start()
if lives < 0 || end_game:
score += bombs * 1000
score += lives * 2000
if hiscore == 0:
hiscore = score
elif score > hiscore:
hiscore = score
var game_over = game_over_screen.instance()
game_over.score = score
game_over.hiscore = hiscore
level.queue_free()
get_tree().get_root().add_child(game_over)
func _on_iframe_timer_timeout():
iframe = false
sprite.frame = 0
sprite.stop()

View File

@ -0,0 +1,36 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://entities/player/player_ship.png" type="Texture" id=1]
[ext_resource path="res://entities/player/player.gd" type="Script" id=2]
[ext_resource path="res://entities/player/player_ship_iframe.png" type="Texture" id=3]
[sub_resource type="SpriteFrames" id=1]
animations = [ {
"frames": [ ExtResource( 1 ), ExtResource( 3 ) ],
"loop": true,
"name": "iframe",
"speed": 5.0
} ]
[sub_resource type="CapsuleShape2D" id=2]
radius = 2.42166
height = 0.939134
[node name="player_ship" type="KinematicBody2D"]
collision_mask = 2147483660
script = ExtResource( 2 )
__meta__ = {
"_edit_group_": true
}
[node name="sprite" type="AnimatedSprite" parent="."]
frames = SubResource( 1 )
animation = "iframe"
[node name="collision" type="CollisionShape2D" parent="."]
position = Vector2( -0.0910168, 3.14083 )
shape = SubResource( 2 )
[node name="iframe_timer" type="Timer" parent="."]
wait_time = 3.0
[connection signal="timeout" from="iframe_timer" to="." method="_on_iframe_timer_timeout"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/player_ship.png-76cc9570d03ee0d2b47c69cb84bafbe9.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/player/player_ship.png"
dest_files=[ "res://.import/player_ship.png-76cc9570d03ee0d2b47c69cb84bafbe9.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/player_ship_iframe.png-b0fb3f525a5c61eb569d97389ead1e0e.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/player/player_ship_iframe.png"
dest_files=[ "res://.import/player_ship_iframe.png-b0fb3f525a5c61eb569d97389ead1e0e.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/double.png-77adf9538a38c9c819e0c5e87fbc5f82.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/powerups/double/double.png"
dest_files=[ "res://.import/double.png-77adf9538a38c9c819e0c5e87fbc5f82.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,24 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://entities/powerups/double/double.png" type="Texture" id=1]
[ext_resource path="res://entities/powerups/powerup.gd" type="Script" id=2]
[ext_resource path="res://weapons/double/double.tscn" type="PackedScene" id=3]
[sub_resource type="CircleShape2D" id=1]
radius = 4.91787
[node name="powerup" type="KinematicBody2D"]
collision_layer = 8
collision_mask = 8
script = ExtResource( 2 )
weapon = ExtResource( 3 )
[node name="collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="texture" type="Sprite" parent="."]
position = Vector2( -0.0625, 0.75 )
texture = ExtResource( 1 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/laser.png-3d3e2fdc2b041edf05a8817a5670b160.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/powerups/laser/laser.png"
dest_files=[ "res://.import/laser.png-3d3e2fdc2b041edf05a8817a5670b160.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,24 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://weapons/laser/laser.tscn" type="PackedScene" id=1]
[ext_resource path="res://entities/powerups/powerup.gd" type="Script" id=2]
[ext_resource path="res://entities/powerups/laser/laser.png" type="Texture" id=3]
[sub_resource type="CircleShape2D" id=1]
radius = 4.91787
[node name="powerup" type="KinematicBody2D"]
collision_layer = 8
collision_mask = 8
script = ExtResource( 2 )
weapon = ExtResource( 1 )
[node name="collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="texture" type="Sprite" parent="."]
position = Vector2( -0.0625, 0.75 )
texture = ExtResource( 3 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

View File

@ -0,0 +1,36 @@
extends KinematicBody2D
export (Resource) var weapon
var rng = RandomNumberGenerator.new()
var speed
var velocity = Vector2(0, 0.2)
var dir = 0
func _ready():
rng.randomize()
speed = rng.randf_range(0.2, 0.8)
velocity.x = speed
func _physics_process(delta):
if dir == 0 && position.x > ProjectSettings.get("display/window/size/width") - 8:
dir = 1
velocity.x = -speed
elif dir == 1 && position.x < 8:
dir = 0
velocity.x = speed
var collision_info = move_and_collide(velocity)
if collision_info && collision_info.collider is Player:
var player = (collision_info.collider as Player)
reward(player)
func _on_visiblity_notifier_screen_exited():
queue_free()
func reward(player):
player.weapon = weapon
player.update_weapon()
player.increase_score(50)
queue_free()

View File

@ -0,0 +1,48 @@
extends "../enemy.gd"
export (int) var pellett_count = 10
export (int) var pellett_radius = 10
export (float) var pellett_speed = 0.6
export (int) var pellett_rows_per_wave = 3
export (int) var pellet_waves = 3
var shoot_timer = Timer.new()
var phase = -1
var max_phase
var pellett = preload("res://entities/pellett/pellett.tscn")
func _ready():
shoot_timer.one_shot = true
shoot_timer.wait_time = 0.5
add_child(shoot_timer)
max_phase = pellet_waves * pellett_rows_per_wave
func _process(delta):
if shoot_timer.is_stopped() && phase >= 0 && phase <= max_phase:
if phase % pellett_rows_per_wave == 0:
shoot_timer.wait_time = 3.5
else:
shoot_timer.wait_time = 0.5
phase += 1
var angle_step = 2.0 * PI / pellett_count
var angle = 0
for i in range(0, pellett_count):
var direction = Vector2(cos(angle), sin(angle))
var pos = position + direction * pellett_radius
var pellett_shot = pellett.instance()
pellett_shot.position = pos
angle += angle_step
pellett_shot.velocity = direction * pellett_speed
level.add_child(pellett_shot)
shoot_timer.start()
func _physics_process(delta):
if phase == -1 && position.y < 40:
velocity.y = 0.8
elif phase == - 1:
phase = 1
velocity = Vector2(0, 0)
if shoot_timer.is_stopped() && phase >= max_phase - 1:
velocity.y = 0.8
collision_info = move_and_collide(velocity)

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/ufo.png-d3ce4f8a286f2884389b78b67c03ea69.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/ufo/ufo.png"
dest_files=[ "res://.import/ufo.png-d3ce4f8a286f2884389b78b67c03ea69.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,28 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://entities/ufo/ufo.png" type="Texture" id=1]
[ext_resource path="res://entities/ufo/ufo.gd" type="Script" id=2]
[sub_resource type="CircleShape2D" id=1]
radius = 9.50289
[node name="ufo" type="KinematicBody2D" groups=[
"Enemies",
]]
collision_layer = 4
collision_mask = 3
script = ExtResource( 2 )
__meta__ = {
"_edit_group_": true
}
health = 5.0
points = 100
[node name="texture" type="Sprite" parent="."]
texture = ExtResource( 1 )
[node name="collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

View File

@ -0,0 +1,18 @@
extends "../enemy.gd"
export (int) var speed = 0.1
var target: Vector2
func _ready():
target = player.position
rotation = position.angle_to_point(target) + 1.5707
func _physics_process(delta):
position = position.move_toward(target, delta * speed)
if position == target:
if get_parent().has_method("kill_enemy"):
get_parent().kill_enemy()
explosion.position = position
level.add_child(explosion)
queue_free()

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/viper.png-7020651a6664ca874e9a97046da0e68c.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/viper/viper.png"
dest_files=[ "res://.import/viper.png-7020651a6664ca874e9a97046da0e68c.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,26 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://entities/viper/viper.gd" type="Script" id=1]
[ext_resource path="res://entities/viper/viper.png" type="Texture" id=2]
[sub_resource type="CircleShape2D" id=1]
radius = 7.74215
[node name="viper" type="KinematicBody2D" groups=[
"Enemies",
]]
collision_layer = 4
collision_mask = 3
script = ExtResource( 1 )
points = 150
powerup_drop_chance = 0.05
speed = 100
[node name="texture" type="Sprite" parent="."]
texture = ExtResource( 2 )
[node name="collision" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="visiblity_notifier" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="visiblity_notifier" to="." method="_on_visiblity_notifier_screen_exited"]

View File

@ -0,0 +1,7 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
[resource]
background_mode = 2
background_sky = SubResource( 1 )

48
globals/global.gd 100644
View File

@ -0,0 +1,48 @@
extends Node2D
var game_state = {}
func _ready():
load_game()
func save_game():
var save_file = File.new()
save_file.open("user://savegame.dat", File.WRITE)
save_file.store_line(to_json(game_state))
save_file.close()
func load_game():
var save_file = File.new()
if not save_file.file_exists("user://savegame.dat"):
return # Error! We don't have a save to load.
# Load the file line by line and process that dictionary to restore
# the object it represents.
save_file.open("user://savegame.dat", File.READ)
while save_file.get_position() < save_file.get_len():
# Get the saved dictionary from the next line in the save file
var node_data = parse_json(save_file.get_line())
for key in node_data.keys():
game_state[key] = node_data[key]
save_file.close()
func get_hiscores():
if !game_state.has("hiscores"):
return []
game_state["hiscores"].sort_custom(self, "score_sort")
game_state["hiscores"].invert()
return global.game_state["hiscores"]
func get_highest_score():
if !game_state.has("hiscores"):
return ["", 0]
game_state["hiscores"].sort_custom(self, "score_sort")
game_state["hiscores"].invert()
return game_state["hiscores"][0]
func score_sort(a, b):
if a[1] < b[1]:
return true
return false

54
levels/demo.tscn 100644
View File

@ -0,0 +1,54 @@
[gd_scene load_steps=19 format=2]
[ext_resource path="res://entities/player/player.tscn" type="PackedScene" id=1]
[ext_resource path="res://entities/meteorite/meteorite.tscn" type="PackedScene" id=2]
[ext_resource path="res://levels/level.gd" type="Script" id=3]
[ext_resource path="res://ui/background.png" type="Texture" id=4]
[ext_resource path="res://weapons/default/default.tscn" type="PackedScene" id=5]
[ext_resource path="res://ui/hud/hud.tscn" type="PackedScene" id=6]
[ext_resource path="res://objects/spawner/spawner.tscn" type="PackedScene" id=7]
[ext_resource path="res://levels/waves/two_ufo_easy.tscn" type="PackedScene" id=8]
[ext_resource path="res://levels/waves/one_ufo.tscn" type="PackedScene" id=9]
[ext_resource path="res://levels/waves/one_viper_02.tscn" type="PackedScene" id=10]
[ext_resource path="res://levels/waves/three_viper_01.tscn" type="PackedScene" id=11]
[ext_resource path="res://levels/waves/one_viper_03.tscn" type="PackedScene" id=12]
[ext_resource path="res://levels/waves/two_viper_01.tscn" type="PackedScene" id=13]
[ext_resource path="res://levels/waves/one_viper_01.tscn" type="PackedScene" id=14]
[ext_resource path="res://levels/waves/two_ufo_hard.tscn" type="PackedScene" id=15]
[ext_resource path="res://levels/waves/two_viper_02.tscn" type="PackedScene" id=16]
[ext_resource path="res://levels/waves/two_viper_03.tscn" type="PackedScene" id=17]
[ext_resource path="res://levels/waves/one_viper_one_ufo_01.tscn" type="PackedScene" id=18]
[node name="level" type="Node2D"]
script = ExtResource( 3 )
waves = [ ExtResource( 9 ), ExtResource( 8 ), ExtResource( 14 ), ExtResource( 10 ), ExtResource( 12 ), ExtResource( 11 ), ExtResource( 13 ), ExtResource( 16 ), ExtResource( 17 ), ExtResource( 15 ), ExtResource( 18 ) ]
[node name="player" parent="." instance=ExtResource( 1 )]
position = Vector2( 80, 123 )
weapon = ExtResource( 5 )
[node name="background" type="Sprite" parent="."]
position = Vector2( 80, 72 )
scale = Vector2( 22, 20 )
z_index = -100
texture = ExtResource( 4 )
__meta__ = {
"_edit_lock_": true
}
[node name="ui_background" type="Sprite" parent="."]
position = Vector2( 80, 144 )
scale = Vector2( 22, 2 )
z_index = 100
texture = ExtResource( 4 )
__meta__ = {
"_edit_lock_": true
}
[node name="hud" parent="." instance=ExtResource( 6 )]
[node name="spawner" parent="." instance=ExtResource( 7 )]
position = Vector2( 79.9553, -17.2909 )
spawn_type = ExtResource( 2 )
maximum_spawns = -1
spawn_interval = 5.0

19
levels/level.gd 100644
View File

@ -0,0 +1,19 @@
extends Node
export (Array, PackedScene) var waves
var rng = RandomNumberGenerator.new()
var passed_waves = 0
var wave
var level
func _ready():
level = get_tree().get_root().get_node("level")
rng.randomize()
next_wave()
func next_wave():
wave = waves[rng.randi_range(0, waves.size() - 1)].instance()
wave.level = self
level.call_deferred("add_child", wave)
passed_waves += 1

21
levels/wave.gd 100644
View File

@ -0,0 +1,21 @@
extends Node
export (int) var number_of_enemies = 0
var level
var timer = Timer.new()
func _ready():
timer.one_shot = true
timer.wait_time = 5
add_child(timer)
func _process(delta):
if number_of_enemies <= 0 && timer.is_stopped():
queue_free()
func kill_enemy():
number_of_enemies -= 1
if number_of_enemies == 0:
level.next_wave()
timer.start()

View File

@ -0,0 +1,13 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/ufo/ufo.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 1
[node name="ufo" parent="." instance=ExtResource( 1 )]
position = Vector2( 80, -8 )
powerup_drop_chance = 0.3
pellett_count = 20

View File

@ -0,0 +1,11 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 1
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 77.161, -14.4438 )

View File

@ -0,0 +1,11 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 1
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 28.389, -33.364 )

View File

@ -0,0 +1,11 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 1
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 119.206, -37.9889 )

View File

@ -0,0 +1,19 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[ext_resource path="res://entities/ufo/ufo.tscn" type="PackedScene" id=3]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 2
[node name="ufo" parent="." instance=ExtResource( 3 )]
position = Vector2( 30.551, -22.7119 )
pellett_count = 20
pellett_rows_per_wave = 5
pellet_waves = 2
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 149.427, -12.5563 )
speed = 120

View File

@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 3
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 172.182, -11.9211 )
[node name="viper2" parent="." instance=ExtResource( 1 )]
position = Vector2( -13.2354, -11.0803 )
[node name="viper3" parent="." instance=ExtResource( 1 )]
position = Vector2( 79.2632, -11.0803 )

View File

@ -0,0 +1,16 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/ufo/ufo.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 2
[node name="ufo2" parent="." instance=ExtResource( 1 )]
position = Vector2( 120, -8 )
pellett_count = 15
[node name="ufo" parent="." instance=ExtResource( 1 )]
position = Vector2( 40, -8 )
pellett_count = 15

View File

@ -0,0 +1,24 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/ufo/ufo.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 2
[node name="ufo2" parent="." instance=ExtResource( 1 )]
position = Vector2( 120, -8 )
points = 200
powerup_drop_chance = 0.3
pellett_count = 30
pellett_rows_per_wave = 5
pellet_waves = 4
[node name="ufo" parent="." instance=ExtResource( 1 )]
position = Vector2( 40, -8 )
points = 200
powerup_drop_chance = 0.3
pellett_count = 30
pellett_rows_per_wave = 5
pellet_waves = 4

View File

@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 2
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 172.182, -11.9211 )
[node name="viper2" parent="." instance=ExtResource( 1 )]
position = Vector2( -13.2354, -11.0803 )

View File

@ -0,0 +1,16 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 2
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 174.705, 133.134 )
speed = 80
[node name="viper2" parent="." instance=ExtResource( 1 )]
position = Vector2( -15.7581, 134.395 )
speed = 80

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://entities/viper/viper.tscn" type="PackedScene" id=1]
[ext_resource path="res://levels/wave.gd" type="Script" id=2]
[node name="wave" type="Node2D"]
script = ExtResource( 2 )
number_of_enemies = 2
[node name="viper" parent="." instance=ExtResource( 1 )]
position = Vector2( 80.5244, -14.444 )
[node name="viper2" parent="." instance=ExtResource( 1 )]
position = Vector2( -15.7581, 134.395 )
speed = 80

View File

@ -0,0 +1,7 @@
extends AnimatedSprite
func _ready():
playing = true
func _on_explosion_animation_finished():
queue_free()

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/explosion.png-8ff303fba58225a9b04a257c019728bb.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://objects/explosion/explosion.png"
dest_files=[ "res://.import/explosion.png-8ff303fba58225a9b04a257c019728bb.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,49 @@
[gd_scene load_steps=12 format=2]
[ext_resource path="res://objects/explosion/explosion.png" type="Texture" id=1]
[ext_resource path="res://objects/explosion/explosion.gd" type="Script" id=2]
[sub_resource type="AtlasTexture" id=1]
atlas = ExtResource( 1 )
region = Rect2( 0, 0, 16, 16 )
[sub_resource type="AtlasTexture" id=2]
atlas = ExtResource( 1 )
region = Rect2( 16, 0, 16, 16 )
[sub_resource type="AtlasTexture" id=3]
atlas = ExtResource( 1 )
region = Rect2( 32, 0, 16, 16 )
[sub_resource type="AtlasTexture" id=4]
atlas = ExtResource( 1 )
region = Rect2( 0, 16, 16, 16 )
[sub_resource type="AtlasTexture" id=5]
atlas = ExtResource( 1 )
region = Rect2( 16, 16, 16, 16 )
[sub_resource type="AtlasTexture" id=6]
atlas = ExtResource( 1 )
region = Rect2( 32, 16, 16, 16 )
[sub_resource type="AtlasTexture" id=7]
atlas = ExtResource( 1 )
region = Rect2( 0, 32, 16, 16 )
[sub_resource type="AtlasTexture" id=8]
atlas = ExtResource( 1 )
region = Rect2( 16, 32, 16, 16 )
[sub_resource type="SpriteFrames" id=9]
animations = [ {
"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 6 ), SubResource( 7 ), SubResource( 8 ) ],
"loop": false,
"name": "default",
"speed": 15.0
} ]
[node name="explosion" type="AnimatedSprite"]
frames = SubResource( 9 )
script = ExtResource( 2 )
[connection signal="animation_finished" from="." to="." method="_on_explosion_animation_finished"]

View File

@ -0,0 +1,24 @@
extends Node2D
export (Resource) var spawn_type
export (int) var maximum_spawns
export (float) var spawn_interval = 2
var spawn_timer = Timer.new()
var spawns = 0
var rng = RandomNumberGenerator.new()
func _ready():
rng.randomize()
spawn_timer.wait_time = spawn_interval
spawn_timer.one_shot = true
add_child(spawn_timer)
func _process(delta):
if spawn_timer.is_stopped() && (maximum_spawns < 0 || spawns < maximum_spawns):
var spawn = spawn_type.instance();
spawn.position = position
spawn.position.x = rng.randf_range(16, ProjectSettings.get("display/window/size/width") - 16)
get_parent().add_child(spawn)
spawns += 1
spawn_timer.start()

View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://objects/spawner/spawner.gd" type="Script" id=1]
[node name="spawner" type="Node2D"]
script = ExtResource( 1 )

144
project.godot 100644
View File

@ -0,0 +1,144 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=4
_global_script_classes=[ {
"base": "KinematicBody2D",
"class": "Enemy",
"language": "GDScript",
"path": "res://entities/enemy.gd"
}, {
"base": "KinematicBody2D",
"class": "Player",
"language": "GDScript",
"path": "res://entities/player/player.gd"
}, {
"base": "Node2D",
"class": "Weapon",
"language": "GDScript",
"path": "res://weapons/weapon.gd"
} ]
_global_script_class_icons={
"Enemy": "",
"Player": "",
"Weapon": ""
}
[application]
config/name="ProjectGB8"
run/main_scene="res://ui/main_menu/main_menu.tscn"
[autoload]
global="*res://globals/global.gd"
[debug]
settings/stdout/print_fps=true
[display]
window/size/width=160
window/size/height=144
window/size/test_width=960
window/size/test_height=864
window/stretch/mode="2d"
window/stretch/aspect="keep"
[input]
ui_accept={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
]
}
ui_select={
"deadzone": 0.5,
"events": [ ]
}
ui_cancel={
"deadzone": 0.5,
"events": [ ]
}
ui_focus_next={
"deadzone": 0.5,
"events": [ ]
}
ui_focus_prev={
"deadzone": 0.5,
"events": [ ]
}
ui_left={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
]
}
ui_right={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
]
}
ui_up={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
]
}
ui_down={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
]
}
ui_page_up={
"deadzone": 0.5,
"events": [ ]
}
ui_page_down={
"deadzone": 0.5,
"events": [ ]
}
ui_home={
"deadzone": 0.5,
"events": [ ]
}
ui_end={
"deadzone": 0.5,
"events": [ ]
}
player_shoot={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
]
}
player_special={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":88,"unicode":0,"echo":false,"script":null)
]
}
[layer_names]
2d_physics/layer_1="player"
2d_physics/layer_2="bullets"
2d_physics/layer_3="enemies"
2d_physics/layer_4="powerups"
[logging]
file_logging/enable_file_logging=true
[rendering]
quality/driver/driver_name="GLES2"
quality/2d/use_pixel_snap=true
vram_compression/import_etc=true
vram_compression/import_etc2=false
environment/default_environment="res://globals/default_env.tres"

BIN
ui/Kenney Mini.ttf 100644

Binary file not shown.

BIN
ui/background.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/background.png-2693c3f581a46c19cdd8c76a9b20c564.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/background.png"
dest_files=[ "res://.import/background.png-2693c3f581a46c19cdd8c76a9b20c564.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

BIN
ui/empty.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/empty.png-56c872a0912f10abd246ce9aff82c0ed.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/empty.png"
dest_files=[ "res://.import/empty.png-56c872a0912f10abd246ce9aff82c0ed.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View File

@ -0,0 +1,39 @@
extends Control
onready var score_label = $score
onready var hiscore_label = $hiscore
onready var name_selector = $name_selector
var main_menu_screen = load("ui/main_menu/main_menu.tscn")
var score = 0
var hiscore = 0
var hiscores = []
var global
func _ready():
global = get_node("/root/global")
var hiscore_display = hiscore
var highest_score = global.get_highest_score()[1]
if highest_score > hiscore:
hiscore_display = highest_score
score_label.text = str("Score: ", score)
hiscore_label.text = str("High Score: ", hiscore_display)
hiscores = global.get_hiscores()
func _process(delta):
if Input.is_action_just_pressed("player_shoot"):
hiscores.push_back([name_selector.get_name(), hiscore])
global.game_state["hiscores"] = hiscores
global.save_game()
go_to_main_menu()
elif Input.is_action_just_pressed("player_special"):
go_to_main_menu()
func go_to_main_menu():
var screen = main_menu_screen.instance()
queue_free()
get_tree().get_root().add_child(screen)

View File

@ -0,0 +1,115 @@
[gd_scene load_steps=8 format=2]
[ext_resource path="res://ui/pixelated_style.tres" type="StyleBox" id=1]
[ext_resource path="res://ui/background.png" type="Texture" id=2]
[ext_resource path="res://ui/Kenney Mini.ttf" type="DynamicFontData" id=3]
[ext_resource path="res://ui/kenny_mini_8px.tres" type="DynamicFont" id=4]
[ext_resource path="res://ui/name_selector/name_selector.tscn" type="PackedScene" id=5]
[ext_resource path="res://ui/game_over/game_over.gd" type="Script" id=6]
[sub_resource type="DynamicFont" id=1]
font_data = ExtResource( 3 )
[node name="game_over" type="Control" groups=[
"Persistent",
]]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 6 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="title" type="Label" parent="."]
margin_left = 32.0
margin_top = 32.0
margin_right = 128.0
margin_bottom = 52.0
custom_fonts/font = SubResource( 1 )
text = "GAME OVER"
align = 1
valign = 1
uppercase = true
__meta__ = {
"_edit_lock_": true,
"_edit_use_anchors_": false
}
[node name="score" type="Label" parent="."]
margin_left = 32.0
margin_top = 56.0
margin_right = 128.0
margin_bottom = 66.0
custom_fonts/font = ExtResource( 4 )
text = "Score: 99999999"
align = 2
uppercase = true
__meta__ = {
"_edit_lock_": true,
"_edit_use_anchors_": false
}
[node name="next" type="Label" parent="."]
margin_left = 4.91322
margin_top = 117.755
margin_right = 100.913
margin_bottom = 140.755
custom_fonts/font = ExtResource( 4 )
text = "Z - Submit score
X - Back to menu"
uppercase = true
__meta__ = {
"_edit_lock_": true,
"_edit_use_anchors_": false
}
[node name="hiscore" type="Label" parent="."]
margin_left = 32.0
margin_top = 72.0
margin_right = 128.0
margin_bottom = 82.0
custom_fonts/font = ExtResource( 4 )
text = "High Score: 99999999"
align = 2
uppercase = true
__meta__ = {
"_edit_lock_": true,
"_edit_use_anchors_": false
}
[node name="name" type="LineEdit" parent="."]
visible = false
margin_left = 48.0
margin_top = 88.0
margin_right = 112.0
margin_bottom = 102.0
custom_styles/read_only = ExtResource( 1 )
custom_styles/focus = ExtResource( 1 )
custom_styles/normal = ExtResource( 1 )
custom_fonts/font = ExtResource( 4 )
custom_colors/font_color_selected = Color( 1, 1, 1, 1 )
custom_colors/font_color = Color( 1, 1, 1, 1 )
align = 1
max_length = 10
placeholder_text = "Name"
placeholder_alpha = 1.0
caret_blink = true
__meta__ = {
"_edit_lock_": true,
"_edit_use_anchors_": false
}
[node name="background" type="Sprite" parent="."]
position = Vector2( 80, 72 )
scale = Vector2( 22, 20 )
z_index = -100
texture = ExtResource( 2 )
__meta__ = {
"_edit_lock_": true
}
[node name="name_selector" parent="." instance=ExtResource( 5 )]
margin_left = 56.0
margin_top = 88.0
margin_right = 56.08
margin_bottom = 88.0

View File

@ -0,0 +1,22 @@
extends Control
var main_menu_screen = load("ui/main_menu/main_menu.tscn")
func _ready():
main_menu_screen = main_menu_screen.instance()
var highscores = global.get_hiscores()
for node in get_children():
node.hide()
var index = 0
var scores = []
for i in range(0, highscores.size()):
get_child(i).show()
var key = highscores[i][0]
var score = highscores[i][1]
scores.append(str(key, " - ", score))
get_child(i).get_node("name").text = str(key, " - ", score)
func _process(delta):
if Input.is_action_just_pressed("player_special"):
get_node("../../").queue_free()
get_tree().get_root().add_child(main_menu_screen)

View File

@ -0,0 +1,238 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://ui/Kenney Mini.ttf" type="DynamicFontData" id=1]
[ext_resource path="res://ui/background.png" type="Texture" id=2]
[ext_resource path="res://ui/kenny_mini_8px.tres" type="DynamicFont" id=3]
[ext_resource path="res://ui/hiscores/highscores_list.gd" type="Script" id=4]
[sub_resource type="DynamicFont" id=1]
font_data = ExtResource( 1 )
[node name="hiscores" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="background" type="Sprite" parent="."]
position = Vector2( 80, 72 )
scale = Vector2( 22, 20 )
z_index = -100
texture = ExtResource( 2 )
__meta__ = {
"_edit_lock_": true
}
[node name="layer" type="CanvasLayer" parent="."]
layer = 100
[node name="title" type="Label" parent="layer"]
margin_left = 32.0
margin_right = 128.0
margin_bottom = 20.0
custom_fonts/font = SubResource( 1 )
text = "HIGHSCORES"
align = 1
valign = 1
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="back" type="Label" parent="layer"]
margin_top = 128.0
margin_right = 80.0
margin_bottom = 138.0
custom_fonts/font = ExtResource( 3 )
text = "X - back to menu"
align = 1
valign = 1
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="list" type="Control" parent="layer"]
margin_left = 32.0
margin_top = 16.0
margin_right = 128.0
margin_bottom = 128.0
script = ExtResource( 4 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position_1" type="Control" parent="layer/list"]
margin_left = 8.0
margin_top = 8.0
margin_right = 40.0
margin_bottom = 16.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position" type="Label" parent="layer/list/position_1"]
margin_right = 8.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "1."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="name" type="Label" parent="layer/list/position_1"]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "AAA - 99999999"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position_2" type="Control" parent="layer/list"]
margin_left = 8.0
margin_top = 24.0
margin_right = 40.0
margin_bottom = 32.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position" type="Label" parent="layer/list/position_2"]
margin_right = 8.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "2."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="name" type="Label" parent="layer/list/position_2"]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "BBB - 99999999"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position_3" type="Control" parent="layer/list"]
margin_left = 8.0
margin_top = 40.0
margin_right = 40.0
margin_bottom = 48.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position" type="Label" parent="layer/list/position_3"]
margin_right = 8.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "3."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="name" type="Label" parent="layer/list/position_3"]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "CCC - 99999999"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position_4" type="Control" parent="layer/list"]
margin_left = 8.0
margin_top = 56.0
margin_right = 40.0
margin_bottom = 64.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position" type="Label" parent="layer/list/position_4"]
margin_right = 8.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "4."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="name" type="Label" parent="layer/list/position_4"]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "DDD - 99999999"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position_5" type="Control" parent="layer/list"]
margin_left = 8.0
margin_top = 72.0
margin_right = 40.0
margin_bottom = 80.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position" type="Label" parent="layer/list/position_5"]
margin_right = 8.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "5."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="name" type="Label" parent="layer/list/position_5"]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "EEE - 99999999"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position_6" type="Control" parent="layer/list"]
margin_left = 8.0
margin_top = 88.0
margin_right = 40.0
margin_bottom = 96.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="position" type="Label" parent="layer/list/position_6"]
margin_right = 8.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "6."
__meta__ = {
"_edit_use_anchors_": false
}
[node name="name" type="Label" parent="layer/list/position_6"]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 10.0
custom_fonts/font = ExtResource( 3 )
text = "FFF - 99999999"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}

24
ui/hud/hud.gd 100644
View File

@ -0,0 +1,24 @@
extends Control
onready var score_label: Label = $layer/score_label
onready var bombs_label: Label = $layer/bombs_label
onready var lives_label: Label = $layer/lives_label
onready var timer_label: Label = $layer/timer_label
onready var timer: Timer = $layer/timer_label/round_timer
var player
func _ready():
player = get_parent().get_node("player")
update_labels()
func _process(delta):
timer_label.text = str("T: ", timer.time_left).pad_decimals(0)
func update_labels():
score_label.text = str("Score: ", player.score).pad_zeros(8)
lives_label.text = str(player.lives)
bombs_label.text = str(player.bombs)
func _on_round_timer_timeout():
player.kill(true)

86
ui/hud/hud.tscn 100644
View File

@ -0,0 +1,86 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://ui/kenny_mini_8px.tres" type="DynamicFont" id=1]
[ext_resource path="res://ui/life.png" type="Texture" id=2]
[ext_resource path="res://ui/special.png" type="Texture" id=3]
[ext_resource path="res://ui/hud/hud.gd" type="Script" id=4]
[node name="hud" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 4 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="layer" type="CanvasLayer" parent="."]
[node name="score_label" type="Label" parent="layer"]
margin_top = 134.0
margin_right = 80.0
margin_bottom = 144.0
custom_fonts/font = ExtResource( 1 )
text = "Score: 00000000"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="lives_label" type="Label" parent="layer"]
margin_left = 152.118
margin_top = 134.135
margin_right = 160.118
margin_bottom = 144.135
custom_fonts/font = ExtResource( 1 )
text = "9"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="lives_texture" type="TextureRect" parent="layer"]
margin_left = 143.375
margin_top = 136.062
margin_right = 151.375
margin_bottom = 144.062
texture = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="bombs_label" type="Label" parent="layer"]
margin_left = 134.904
margin_top = 134.33
margin_right = 142.904
margin_bottom = 144.33
custom_fonts/font = ExtResource( 1 )
text = "9"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="bombs_texture" type="TextureRect" parent="layer"]
margin_left = 125.891
margin_top = 135.84
margin_right = 133.891
margin_bottom = 143.84
texture = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="timer_label" type="Label" parent="layer"]
margin_left = 100.192
margin_top = 133.603
margin_right = 127.192
margin_bottom = 143.603
custom_fonts/font = ExtResource( 1 )
text = "T: 120"
align = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="round_timer" type="Timer" parent="layer/timer_label"]
wait_time = 120.0
autostart = true
[connection signal="timeout" from="layer/timer_label/round_timer" to="." method="_on_round_timer_timeout"]

View File

@ -0,0 +1,6 @@
[gd_resource type="DynamicFont" load_steps=2 format=2]
[ext_resource path="res://ui/Kenney Mini.ttf" type="DynamicFontData" id=1]
[resource]
font_data = ExtResource( 1 )

View File

@ -0,0 +1,7 @@
[gd_resource type="DynamicFont" load_steps=2 format=2]
[ext_resource path="res://ui/Kenney Mini.ttf" type="DynamicFontData" id=1]
[resource]
size = 8
font_data = ExtResource( 1 )

BIN
ui/life.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

34
ui/life.png.import 100644
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/life.png-26a1e835748485449585dc4afd1e5b75.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/life.png"
dest_files=[ "res://.import/life.png-26a1e835748485449585dc4afd1e5b75.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/caret_1.png-520d249e7d3ea2fc39711cc061f5f3ea.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/main_menu/caret_1.png"
dest_files=[ "res://.import/caret_1.png-520d249e7d3ea2fc39711cc061f5f3ea.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/caret_2.png-ca7d4afef12d3df2f27462c44d533ac8.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/main_menu/caret_2.png"
dest_files=[ "res://.import/caret_2.png-ca7d4afef12d3df2f27462c44d533ac8.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,102 @@
[gd_scene load_steps=11 format=2]
[ext_resource path="res://ui/Kenney Mini.ttf" type="DynamicFontData" id=1]
[ext_resource path="res://ui/background.png" type="Texture" id=2]
[ext_resource path="res://ui/kenny_mini_8px.tres" type="DynamicFont" id=3]
[ext_resource path="res://objects/spawner/spawner.tscn" type="PackedScene" id=4]
[ext_resource path="res://entities/meteorite/meteorite.tscn" type="PackedScene" id=5]
[ext_resource path="res://ui/main_menu/menu.gd" type="Script" id=6]
[ext_resource path="res://ui/main_menu/caret_1.png" type="Texture" id=7]
[ext_resource path="res://ui/main_menu/caret_2.png" type="Texture" id=8]
[sub_resource type="DynamicFont" id=1]
font_data = ExtResource( 1 )
[sub_resource type="AnimatedTexture" id=2]
frames = 2
frame_0/texture = ExtResource( 7 )
frame_1/texture = ExtResource( 8 )
frame_1/delay_sec = 0.0
[node name="main_menu" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="spawner" parent="." instance=ExtResource( 4 )]
position = Vector2( 72, -8 )
spawn_type = ExtResource( 5 )
maximum_spawns = -1
spawn_interval = 0.5
[node name="layer" type="CanvasLayer" parent="."]
layer = 100
[node name="title" type="Label" parent="layer"]
margin_left = 32.0
margin_top = 32.0
margin_right = 128.0
margin_bottom = 52.0
custom_fonts/font = SubResource( 1 )
text = "Evospace"
align = 1
valign = 1
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="menu" type="Control" parent="layer"]
margin_left = 48.0
margin_top = 56.0
margin_right = 112.0
margin_bottom = 112.0
script = ExtResource( 6 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="start" type="Label" parent="layer/menu"]
margin_left = 8.0
margin_top = 8.0
margin_right = 40.0
margin_bottom = 18.0
custom_fonts/font = ExtResource( 3 )
text = "Start"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="highscores" type="Label" parent="layer/menu"]
margin_left = 8.0
margin_top = 24.0
margin_right = 62.0
margin_bottom = 34.0
custom_fonts/font = ExtResource( 3 )
text = "Hiscore"
uppercase = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="caret" type="TextureRect" parent="layer/menu"]
margin_top = 8.0
margin_right = 8.0
margin_bottom = 16.0
texture = SubResource( 2 )
expand = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="background" type="Sprite" parent="."]
position = Vector2( 80, 72 )
scale = Vector2( 22, 20 )
z_index = -100
texture = ExtResource( 2 )
__meta__ = {
"_edit_lock_": true
}

View File

@ -0,0 +1,52 @@
extends Control
onready var caret = $caret
var index = 0
var spacing = 16
var start_position = 8
var menu_items = 0
var positions = [ 8, 24 ]
var highscores_screen = load("ui/hiscores/hiscores.tscn")
var game_screen = load("levels/demo.tscn")
func _ready():
menu_items = get_children().size() - 1
highscores_screen = highscores_screen.instance()
game_screen = game_screen.instance()
func _process(delta):
if Input.is_action_just_pressed("ui_down"):
if index == menu_items - 1:
index = 0
else:
index += 1
update_caret()
elif Input.is_action_just_pressed("ui_up"):
if index == 0:
index = menu_items - 1
else:
index -= 1
update_caret()
if Input.is_action_just_pressed("player_shoot"):
var action = str(get_child(index).name)
if has_method(action):
call(action)
Input.action_release("player_shoot")
else:
print_debug(action, " is not a valid menu action!")
func update_caret():
caret.rect_position.y = start_position + (spacing * index)
func start():
get_node("../../").queue_free()
get_tree().get_root().add_child(game_screen)
func highscores():
get_node("../../").queue_free()
get_tree().get_root().add_child(highscores_screen)
func quit():
get_tree().quit()

View File

@ -0,0 +1,53 @@
extends Control
onready var selector = $selector
onready var chars = [
$first_char,
$second_char,
$third_char
]
var index = 0
var positions = [ -2, 14, 30 ]
func _ready():
pass
func _process(delta):
if Input.is_action_just_pressed("ui_right"):
if index == chars.size() - 1:
index = 0
else:
index += 1
elif Input.is_action_just_pressed("ui_left"):
if index == 0:
index = chars.size() - 1
else:
index -= 1
selector.rect_position.x = positions[index]
if Input.is_action_just_pressed("ui_up"):
up_ascii()
if Input.is_action_just_pressed("ui_down"):
down_ascii()
func up_ascii():
var ascii = chars[index].text.to_ascii()
var current_ascii = ascii[0]
ascii[0] = current_ascii + 1
if(ascii[0] > 90):
ascii[0] = 65
chars[index].text = ascii.get_string_from_ascii()
func down_ascii():
var ascii = chars[index].text.to_ascii()
var current_ascii = ascii[0]
ascii[0] = current_ascii - 1
if(ascii[0] < 65):
ascii[0] = 90
chars[index].text = ascii.get_string_from_ascii()
func get_name():
var input = PoolStringArray([])
for ch in chars:
input.append(str(ch.text))
return input.join("")

View File

@ -0,0 +1,63 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://ui/kenny_mini_16px.tres" type="DynamicFont" id=1]
[ext_resource path="res://ui/name_selector/selected.png" type="Texture" id=3]
[ext_resource path="res://ui/name_selector/selected_2.png" type="Texture" id=4]
[ext_resource path="res://ui/name_selector/name_selector.gd" type="Script" id=5]
[sub_resource type="AnimatedTexture" id=1]
frames = 2
fps = 2.0
frame_0/texture = ExtResource( 3 )
frame_1/texture = ExtResource( 4 )
frame_1/delay_sec = 0.0
[node name="name_selector" type="Control"]
anchor_right = 0.312
anchor_bottom = 0.16
margin_right = 0.079998
margin_bottom = -0.0400009
script = ExtResource( 5 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="first_char" type="Label" parent="."]
margin_right = 16.0
margin_bottom = 20.0
custom_fonts/font = ExtResource( 1 )
text = "A"
align = 1
valign = 1
uppercase = true
[node name="second_char" type="Label" parent="."]
margin_left = 16.0
margin_right = 32.0
margin_bottom = 20.0
custom_fonts/font = ExtResource( 1 )
text = "A"
align = 1
valign = 1
uppercase = true
[node name="third_char" type="Label" parent="."]
margin_left = 32.0
margin_right = 48.0
margin_bottom = 20.0
custom_fonts/font = ExtResource( 1 )
text = "A"
align = 1
valign = 1
uppercase = true
[node name="selector" type="TextureRect" parent="."]
margin_left = -2.0
margin_top = -0.125
margin_right = 16.0
margin_bottom = 21.875
texture = SubResource( 1 )
expand = true
__meta__ = {
"_edit_use_anchors_": false
}

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/selected.png-7e8b81ec794c7a086bdda714fe342740.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/name_selector/selected.png"
dest_files=[ "res://.import/selected.png-7e8b81ec794c7a086bdda714fe342740.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/selected_1.png-e880126c69ab2381ca7ab9e50753e276.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/name_selector/selected_1.png"
dest_files=[ "res://.import/selected_1.png-e880126c69ab2381ca7ab9e50753e276.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/selected_2.png-1ac340c4d268919bb2bc9ef076176a2b.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/name_selector/selected_2.png"
dest_files=[ "res://.import/selected_2.png-1ac340c4d268919bb2bc9ef076176a2b.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View File

@ -0,0 +1,14 @@
[gd_resource type="StyleBoxFlat" format=2]
[resource]
bg_color = Color( 0.301961, 0.301961, 0.301961, 1 )
border_width_left = 1
border_width_top = 1
border_width_right = 1
border_width_bottom = 1
border_color = Color( 1, 1, 1, 1 )
corner_radius_top_left = 2
corner_radius_top_right = 2
corner_radius_bottom_right = 2
corner_radius_bottom_left = 2
anti_aliasing = false

BIN
ui/special.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Some files were not shown because too many files have changed in this diff Show More