diff --git a/README.md b/README.md index 225befc..e2762a3 100644 --- a/README.md +++ b/README.md @@ -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) +​ \ No newline at end of file diff --git a/entities/avenger/avenger.png b/entities/avenger/avenger.png new file mode 100644 index 0000000..0511574 Binary files /dev/null and b/entities/avenger/avenger.png differ diff --git a/entities/avenger/avenger.png.import b/entities/avenger/avenger.png.import new file mode 100644 index 0000000..f02a0cb --- /dev/null +++ b/entities/avenger/avenger.png.import @@ -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 diff --git a/entities/bullet/bullet.gd b/entities/bullet/bullet.gd new file mode 100644 index 0000000..92597e7 --- /dev/null +++ b/entities/bullet/bullet.gd @@ -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() diff --git a/entities/bullet/bullet.png b/entities/bullet/bullet.png new file mode 100644 index 0000000..ced3c61 Binary files /dev/null and b/entities/bullet/bullet.png differ diff --git a/entities/bullet/bullet.png.import b/entities/bullet/bullet.png.import new file mode 100644 index 0000000..0d5462e --- /dev/null +++ b/entities/bullet/bullet.png.import @@ -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 diff --git a/entities/bullet/bullet.tscn b/entities/bullet/bullet.tscn new file mode 100644 index 0000000..bb95b14 --- /dev/null +++ b/entities/bullet/bullet.tscn @@ -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"] diff --git a/entities/enemy.gd b/entities/enemy.gd new file mode 100644 index 0000000..0ae2a0b --- /dev/null +++ b/entities/enemy.gd @@ -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() diff --git a/entities/meteorite/meteor_big_1.png b/entities/meteorite/meteor_big_1.png new file mode 100644 index 0000000..b4d536e Binary files /dev/null and b/entities/meteorite/meteor_big_1.png differ diff --git a/entities/meteorite/meteor_big_1.png.import b/entities/meteorite/meteor_big_1.png.import new file mode 100644 index 0000000..c6fc7cb --- /dev/null +++ b/entities/meteorite/meteor_big_1.png.import @@ -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 diff --git a/entities/meteorite/meteor_big_2.png b/entities/meteorite/meteor_big_2.png new file mode 100644 index 0000000..595c551 Binary files /dev/null and b/entities/meteorite/meteor_big_2.png differ diff --git a/entities/meteorite/meteor_big_2.png.import b/entities/meteorite/meteor_big_2.png.import new file mode 100644 index 0000000..9b7040f --- /dev/null +++ b/entities/meteorite/meteor_big_2.png.import @@ -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 diff --git a/entities/meteorite/meteor_big_3.png b/entities/meteorite/meteor_big_3.png new file mode 100644 index 0000000..4ebe77f Binary files /dev/null and b/entities/meteorite/meteor_big_3.png differ diff --git a/entities/meteorite/meteor_big_3.png.import b/entities/meteorite/meteor_big_3.png.import new file mode 100644 index 0000000..807c028 --- /dev/null +++ b/entities/meteorite/meteor_big_3.png.import @@ -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 diff --git a/entities/meteorite/meteor_small_1.png b/entities/meteorite/meteor_small_1.png new file mode 100644 index 0000000..a868892 Binary files /dev/null and b/entities/meteorite/meteor_small_1.png differ diff --git a/entities/meteorite/meteor_small_1.png.import b/entities/meteorite/meteor_small_1.png.import new file mode 100644 index 0000000..3045cd6 --- /dev/null +++ b/entities/meteorite/meteor_small_1.png.import @@ -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 diff --git a/entities/meteorite/meteor_small_2.png b/entities/meteorite/meteor_small_2.png new file mode 100644 index 0000000..b9e96a0 Binary files /dev/null and b/entities/meteorite/meteor_small_2.png differ diff --git a/entities/meteorite/meteor_small_2.png.import b/entities/meteorite/meteor_small_2.png.import new file mode 100644 index 0000000..953c8e8 --- /dev/null +++ b/entities/meteorite/meteor_small_2.png.import @@ -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 diff --git a/entities/meteorite/meteor_small_3.png b/entities/meteorite/meteor_small_3.png new file mode 100644 index 0000000..cd6882f Binary files /dev/null and b/entities/meteorite/meteor_small_3.png differ diff --git a/entities/meteorite/meteor_small_3.png.import b/entities/meteorite/meteor_small_3.png.import new file mode 100644 index 0000000..fe79efd --- /dev/null +++ b/entities/meteorite/meteor_small_3.png.import @@ -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 diff --git a/entities/meteorite/meteorite.gd b/entities/meteorite/meteorite.gd new file mode 100644 index 0000000..fe81074 --- /dev/null +++ b/entities/meteorite/meteorite.gd @@ -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) diff --git a/entities/meteorite/meteorite.tscn b/entities/meteorite/meteorite.tscn new file mode 100644 index 0000000..e27495c --- /dev/null +++ b/entities/meteorite/meteorite.tscn @@ -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"] diff --git a/entities/pellett/pellett.gd b/entities/pellett/pellett.gd new file mode 100644 index 0000000..569bdd4 --- /dev/null +++ b/entities/pellett/pellett.gd @@ -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() diff --git a/entities/pellett/pellett.png b/entities/pellett/pellett.png new file mode 100644 index 0000000..b86902d Binary files /dev/null and b/entities/pellett/pellett.png differ diff --git a/entities/pellett/pellett.png.import b/entities/pellett/pellett.png.import new file mode 100644 index 0000000..7a8857a --- /dev/null +++ b/entities/pellett/pellett.png.import @@ -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 diff --git a/entities/pellett/pellett.tscn b/entities/pellett/pellett.tscn new file mode 100644 index 0000000..dd15e57 --- /dev/null +++ b/entities/pellett/pellett.tscn @@ -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"] diff --git a/entities/player/player.gd b/entities/player/player.gd new file mode 100644 index 0000000..1b27eff --- /dev/null +++ b/entities/player/player.gd @@ -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() diff --git a/entities/player/player.tscn b/entities/player/player.tscn new file mode 100644 index 0000000..002a096 --- /dev/null +++ b/entities/player/player.tscn @@ -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"] diff --git a/entities/player/player_ship.png b/entities/player/player_ship.png new file mode 100644 index 0000000..ba68d60 Binary files /dev/null and b/entities/player/player_ship.png differ diff --git a/entities/player/player_ship.png.import b/entities/player/player_ship.png.import new file mode 100644 index 0000000..862b130 --- /dev/null +++ b/entities/player/player_ship.png.import @@ -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 diff --git a/entities/player/player_ship_iframe.png b/entities/player/player_ship_iframe.png new file mode 100644 index 0000000..15f8aa2 Binary files /dev/null and b/entities/player/player_ship_iframe.png differ diff --git a/entities/player/player_ship_iframe.png.import b/entities/player/player_ship_iframe.png.import new file mode 100644 index 0000000..9e7ec01 --- /dev/null +++ b/entities/player/player_ship_iframe.png.import @@ -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 diff --git a/entities/powerups/double/double.png b/entities/powerups/double/double.png new file mode 100644 index 0000000..4a94ef3 Binary files /dev/null and b/entities/powerups/double/double.png differ diff --git a/entities/powerups/double/double.png.import b/entities/powerups/double/double.png.import new file mode 100644 index 0000000..84d95b2 --- /dev/null +++ b/entities/powerups/double/double.png.import @@ -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 diff --git a/entities/powerups/double/double.tscn b/entities/powerups/double/double.tscn new file mode 100644 index 0000000..bedef2e --- /dev/null +++ b/entities/powerups/double/double.tscn @@ -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"] diff --git a/entities/powerups/laser/laser.png b/entities/powerups/laser/laser.png new file mode 100644 index 0000000..d6ef087 Binary files /dev/null and b/entities/powerups/laser/laser.png differ diff --git a/entities/powerups/laser/laser.png.import b/entities/powerups/laser/laser.png.import new file mode 100644 index 0000000..5bd8a35 --- /dev/null +++ b/entities/powerups/laser/laser.png.import @@ -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 diff --git a/entities/powerups/laser/laser.tscn b/entities/powerups/laser/laser.tscn new file mode 100644 index 0000000..7ddeed1 --- /dev/null +++ b/entities/powerups/laser/laser.tscn @@ -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"] diff --git a/entities/powerups/powerup.gd b/entities/powerups/powerup.gd new file mode 100644 index 0000000..cf02ad3 --- /dev/null +++ b/entities/powerups/powerup.gd @@ -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() diff --git a/entities/ufo/ufo.gd b/entities/ufo/ufo.gd new file mode 100644 index 0000000..0f658f3 --- /dev/null +++ b/entities/ufo/ufo.gd @@ -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) diff --git a/entities/ufo/ufo.png b/entities/ufo/ufo.png new file mode 100644 index 0000000..8a31434 Binary files /dev/null and b/entities/ufo/ufo.png differ diff --git a/entities/ufo/ufo.png.import b/entities/ufo/ufo.png.import new file mode 100644 index 0000000..89aa623 --- /dev/null +++ b/entities/ufo/ufo.png.import @@ -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 diff --git a/entities/ufo/ufo.tscn b/entities/ufo/ufo.tscn new file mode 100644 index 0000000..8aee50d --- /dev/null +++ b/entities/ufo/ufo.tscn @@ -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"] diff --git a/entities/viper/viper.gd b/entities/viper/viper.gd new file mode 100644 index 0000000..334aac2 --- /dev/null +++ b/entities/viper/viper.gd @@ -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() diff --git a/entities/viper/viper.png b/entities/viper/viper.png new file mode 100644 index 0000000..0ac9f1f Binary files /dev/null and b/entities/viper/viper.png differ diff --git a/entities/viper/viper.png.import b/entities/viper/viper.png.import new file mode 100644 index 0000000..b57b9b2 --- /dev/null +++ b/entities/viper/viper.png.import @@ -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 diff --git a/entities/viper/viper.tscn b/entities/viper/viper.tscn new file mode 100644 index 0000000..e025853 --- /dev/null +++ b/entities/viper/viper.tscn @@ -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"] diff --git a/globals/default_env.tres b/globals/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/globals/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/globals/global.gd b/globals/global.gd new file mode 100644 index 0000000..00cb0a2 --- /dev/null +++ b/globals/global.gd @@ -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 diff --git a/levels/demo.tscn b/levels/demo.tscn new file mode 100644 index 0000000..42b6a18 --- /dev/null +++ b/levels/demo.tscn @@ -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 diff --git a/levels/level.gd b/levels/level.gd new file mode 100644 index 0000000..27de81f --- /dev/null +++ b/levels/level.gd @@ -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 diff --git a/levels/wave.gd b/levels/wave.gd new file mode 100644 index 0000000..1d3eb8c --- /dev/null +++ b/levels/wave.gd @@ -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() diff --git a/levels/waves/one_ufo.tscn b/levels/waves/one_ufo.tscn new file mode 100644 index 0000000..59b1ee4 --- /dev/null +++ b/levels/waves/one_ufo.tscn @@ -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 diff --git a/levels/waves/one_viper_01.tscn b/levels/waves/one_viper_01.tscn new file mode 100644 index 0000000..465afd2 --- /dev/null +++ b/levels/waves/one_viper_01.tscn @@ -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 ) diff --git a/levels/waves/one_viper_02.tscn b/levels/waves/one_viper_02.tscn new file mode 100644 index 0000000..f0ced74 --- /dev/null +++ b/levels/waves/one_viper_02.tscn @@ -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 ) diff --git a/levels/waves/one_viper_03.tscn b/levels/waves/one_viper_03.tscn new file mode 100644 index 0000000..ffe4756 --- /dev/null +++ b/levels/waves/one_viper_03.tscn @@ -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 ) diff --git a/levels/waves/one_viper_one_ufo_01.tscn b/levels/waves/one_viper_one_ufo_01.tscn new file mode 100644 index 0000000..6567d17 --- /dev/null +++ b/levels/waves/one_viper_one_ufo_01.tscn @@ -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 diff --git a/levels/waves/three_viper_01.tscn b/levels/waves/three_viper_01.tscn new file mode 100644 index 0000000..3a9abf1 --- /dev/null +++ b/levels/waves/three_viper_01.tscn @@ -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 ) diff --git a/levels/waves/two_ufo_easy.tscn b/levels/waves/two_ufo_easy.tscn new file mode 100644 index 0000000..ef2abf9 --- /dev/null +++ b/levels/waves/two_ufo_easy.tscn @@ -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 diff --git a/levels/waves/two_ufo_hard.tscn b/levels/waves/two_ufo_hard.tscn new file mode 100644 index 0000000..43e7e27 --- /dev/null +++ b/levels/waves/two_ufo_hard.tscn @@ -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 diff --git a/levels/waves/two_viper_01.tscn b/levels/waves/two_viper_01.tscn new file mode 100644 index 0000000..61a7283 --- /dev/null +++ b/levels/waves/two_viper_01.tscn @@ -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 ) diff --git a/levels/waves/two_viper_02.tscn b/levels/waves/two_viper_02.tscn new file mode 100644 index 0000000..abb42b1 --- /dev/null +++ b/levels/waves/two_viper_02.tscn @@ -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 diff --git a/levels/waves/two_viper_03.tscn b/levels/waves/two_viper_03.tscn new file mode 100644 index 0000000..e2864d0 --- /dev/null +++ b/levels/waves/two_viper_03.tscn @@ -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 diff --git a/objects/explosion/explosion.gd b/objects/explosion/explosion.gd new file mode 100644 index 0000000..b1ea6cb --- /dev/null +++ b/objects/explosion/explosion.gd @@ -0,0 +1,7 @@ +extends AnimatedSprite + +func _ready(): + playing = true + +func _on_explosion_animation_finished(): + queue_free() diff --git a/objects/explosion/explosion.png b/objects/explosion/explosion.png new file mode 100644 index 0000000..9945563 Binary files /dev/null and b/objects/explosion/explosion.png differ diff --git a/objects/explosion/explosion.png.import b/objects/explosion/explosion.png.import new file mode 100644 index 0000000..bdd6733 --- /dev/null +++ b/objects/explosion/explosion.png.import @@ -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 diff --git a/objects/explosion/explosion.tscn b/objects/explosion/explosion.tscn new file mode 100644 index 0000000..dde80bc --- /dev/null +++ b/objects/explosion/explosion.tscn @@ -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"] diff --git a/objects/spawner/spawner.gd b/objects/spawner/spawner.gd new file mode 100644 index 0000000..2bf5660 --- /dev/null +++ b/objects/spawner/spawner.gd @@ -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() diff --git a/objects/spawner/spawner.tscn b/objects/spawner/spawner.tscn new file mode 100644 index 0000000..a7b844b --- /dev/null +++ b/objects/spawner/spawner.tscn @@ -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 ) diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..7222e1f --- /dev/null +++ b/project.godot @@ -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" diff --git a/ui/Kenney Mini.ttf b/ui/Kenney Mini.ttf new file mode 100644 index 0000000..5cbfd37 Binary files /dev/null and b/ui/Kenney Mini.ttf differ diff --git a/ui/background.png b/ui/background.png new file mode 100644 index 0000000..c0551f7 Binary files /dev/null and b/ui/background.png differ diff --git a/ui/background.png.import b/ui/background.png.import new file mode 100644 index 0000000..15f7b37 --- /dev/null +++ b/ui/background.png.import @@ -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 diff --git a/ui/empty.png b/ui/empty.png new file mode 100644 index 0000000..306544c Binary files /dev/null and b/ui/empty.png differ diff --git a/ui/empty.png.import b/ui/empty.png.import new file mode 100644 index 0000000..86fca45 --- /dev/null +++ b/ui/empty.png.import @@ -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 diff --git a/ui/game_over/game_over.gd b/ui/game_over/game_over.gd new file mode 100644 index 0000000..2b0ffa8 --- /dev/null +++ b/ui/game_over/game_over.gd @@ -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) diff --git a/ui/game_over/game_over.tscn b/ui/game_over/game_over.tscn new file mode 100644 index 0000000..450d4aa --- /dev/null +++ b/ui/game_over/game_over.tscn @@ -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 diff --git a/ui/hiscores/highscores_list.gd b/ui/hiscores/highscores_list.gd new file mode 100644 index 0000000..48dc7c2 --- /dev/null +++ b/ui/hiscores/highscores_list.gd @@ -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) diff --git a/ui/hiscores/hiscores.tscn b/ui/hiscores/hiscores.tscn new file mode 100644 index 0000000..1ffd2cb --- /dev/null +++ b/ui/hiscores/hiscores.tscn @@ -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 +} diff --git a/ui/hud/hud.gd b/ui/hud/hud.gd new file mode 100644 index 0000000..a5db499 --- /dev/null +++ b/ui/hud/hud.gd @@ -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) diff --git a/ui/hud/hud.tscn b/ui/hud/hud.tscn new file mode 100644 index 0000000..ef3e15d --- /dev/null +++ b/ui/hud/hud.tscn @@ -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"] diff --git a/ui/kenny_mini_16px.tres b/ui/kenny_mini_16px.tres new file mode 100644 index 0000000..5f6cfc9 --- /dev/null +++ b/ui/kenny_mini_16px.tres @@ -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 ) diff --git a/ui/kenny_mini_8px.tres b/ui/kenny_mini_8px.tres new file mode 100644 index 0000000..ace65ac --- /dev/null +++ b/ui/kenny_mini_8px.tres @@ -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 ) diff --git a/ui/life.png b/ui/life.png new file mode 100644 index 0000000..072da54 Binary files /dev/null and b/ui/life.png differ diff --git a/ui/life.png.import b/ui/life.png.import new file mode 100644 index 0000000..18804ee --- /dev/null +++ b/ui/life.png.import @@ -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 diff --git a/ui/main_menu/caret_1.png b/ui/main_menu/caret_1.png new file mode 100644 index 0000000..8feec11 Binary files /dev/null and b/ui/main_menu/caret_1.png differ diff --git a/ui/main_menu/caret_1.png.import b/ui/main_menu/caret_1.png.import new file mode 100644 index 0000000..9b6ea6b --- /dev/null +++ b/ui/main_menu/caret_1.png.import @@ -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 diff --git a/ui/main_menu/caret_2.png b/ui/main_menu/caret_2.png new file mode 100644 index 0000000..7ead8b1 Binary files /dev/null and b/ui/main_menu/caret_2.png differ diff --git a/ui/main_menu/caret_2.png.import b/ui/main_menu/caret_2.png.import new file mode 100644 index 0000000..4a754b0 --- /dev/null +++ b/ui/main_menu/caret_2.png.import @@ -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 diff --git a/ui/main_menu/main_menu.tscn b/ui/main_menu/main_menu.tscn new file mode 100644 index 0000000..5ec37ad --- /dev/null +++ b/ui/main_menu/main_menu.tscn @@ -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 +} diff --git a/ui/main_menu/menu.gd b/ui/main_menu/menu.gd new file mode 100644 index 0000000..e1aea30 --- /dev/null +++ b/ui/main_menu/menu.gd @@ -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() diff --git a/ui/name_selector/name_selector.gd b/ui/name_selector/name_selector.gd new file mode 100644 index 0000000..89df720 --- /dev/null +++ b/ui/name_selector/name_selector.gd @@ -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("") diff --git a/ui/name_selector/name_selector.tscn b/ui/name_selector/name_selector.tscn new file mode 100644 index 0000000..f1e6fd7 --- /dev/null +++ b/ui/name_selector/name_selector.tscn @@ -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 +} diff --git a/ui/name_selector/selected.png.import b/ui/name_selector/selected.png.import new file mode 100644 index 0000000..46963ea --- /dev/null +++ b/ui/name_selector/selected.png.import @@ -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 diff --git a/ui/name_selector/selected_1.png b/ui/name_selector/selected_1.png new file mode 100644 index 0000000..4475b3a Binary files /dev/null and b/ui/name_selector/selected_1.png differ diff --git a/ui/name_selector/selected_1.png.import b/ui/name_selector/selected_1.png.import new file mode 100644 index 0000000..0b0a428 --- /dev/null +++ b/ui/name_selector/selected_1.png.import @@ -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 diff --git a/ui/name_selector/selected_2.png b/ui/name_selector/selected_2.png new file mode 100644 index 0000000..0515a86 Binary files /dev/null and b/ui/name_selector/selected_2.png differ diff --git a/ui/name_selector/selected_2.png.import b/ui/name_selector/selected_2.png.import new file mode 100644 index 0000000..30a7cdf --- /dev/null +++ b/ui/name_selector/selected_2.png.import @@ -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 diff --git a/ui/pixelated_style.tres b/ui/pixelated_style.tres new file mode 100644 index 0000000..c4dded1 --- /dev/null +++ b/ui/pixelated_style.tres @@ -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 diff --git a/ui/special.png b/ui/special.png new file mode 100644 index 0000000..66da776 Binary files /dev/null and b/ui/special.png differ diff --git a/ui/special.png.import b/ui/special.png.import new file mode 100644 index 0000000..2983617 --- /dev/null +++ b/ui/special.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/special.png-ed76150abde163f1fe3a6443890e092f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/special.png" +dest_files=[ "res://.import/special.png-ed76150abde163f1fe3a6443890e092f.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 diff --git a/weapons/default/default.gd b/weapons/default/default.gd new file mode 100644 index 0000000..e152118 --- /dev/null +++ b/weapons/default/default.gd @@ -0,0 +1,4 @@ +extends "../weapon.gd" + +func shoot(): + .shoot() diff --git a/weapons/default/default.tscn b/weapons/default/default.tscn new file mode 100644 index 0000000..04645e2 --- /dev/null +++ b/weapons/default/default.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://weapons/default/default.gd" type="Script" id=1] +[ext_resource path="res://entities/bullet/bullet.tscn" type="PackedScene" id=2] + +[node name="node" type="Node2D"] +script = ExtResource( 1 ) +bullet_speed = 3 +shoot_cooldown = 0.3 +bullet_type = ExtResource( 2 ) diff --git a/weapons/double/double.gd b/weapons/double/double.gd new file mode 100644 index 0000000..6fc736e --- /dev/null +++ b/weapons/double/double.gd @@ -0,0 +1,20 @@ +extends "../weapon.gd" + +func shoot(): + if !shoot_timer.is_stopped(): + return + var bullet1 = bullet_type.instance() + bullet1.position = player.position + bullet1.position.y -= 3 + bullet1.position.x -= 7.5 + bullet1.velocity.y -= bullet_speed + get_tree().get_root().add_child(bullet1) + + var bullet2 = bullet_type.instance() + bullet2.position = player.position + bullet2.position.y -= 3 + bullet2.position.x += 7.5 + bullet2.velocity.y -= bullet_speed + get_tree().get_root().add_child(bullet2) + + shoot_timer.start() diff --git a/weapons/double/double.tscn b/weapons/double/double.tscn new file mode 100644 index 0000000..d6887d2 --- /dev/null +++ b/weapons/double/double.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://weapons/double/double.gd" type="Script" id=1] + +[node name="node" type="Node2D"] +script = ExtResource( 1 ) +bullet_speed = 4 +shoot_cooldown = 0.2 diff --git a/weapons/laser/laser.gd b/weapons/laser/laser.gd new file mode 100644 index 0000000..8d744fb --- /dev/null +++ b/weapons/laser/laser.gd @@ -0,0 +1,12 @@ +extends "../weapon.gd" + +func shoot(): + if !shoot_timer.is_stopped(): + return + var bullet = bullet_type.instance() + bullet.position = player.position + bullet.position.y -= 8 + bullet.velocity.y -= bullet_speed + bullet.damage = 0.2 + get_parent().get_parent().add_child(bullet) + shoot_timer.start() diff --git a/weapons/laser/laser.tscn b/weapons/laser/laser.tscn new file mode 100644 index 0000000..3e023f0 --- /dev/null +++ b/weapons/laser/laser.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://weapons/laser/laser.gd" type="Script" id=1] + +[node name="node" type="Node2D"] +script = ExtResource( 1 ) +bullet_speed = 5 +shoot_cooldown = 0.05 diff --git a/weapons/weapon.gd b/weapons/weapon.gd new file mode 100644 index 0000000..6cb38cb --- /dev/null +++ b/weapons/weapon.gd @@ -0,0 +1,24 @@ +extends Node2D +class_name Weapon + +export (int) var bullet_speed = 2 +export (float) var shoot_cooldown = 0.1 +export (Resource) var bullet_type = load("entities/bullet/bullet.tscn") + +var shoot_timer = Timer.new() +var player + +func _ready(): + shoot_timer.wait_time = shoot_cooldown + shoot_timer.one_shot = true + add_child(shoot_timer) + +func shoot(): + if !shoot_timer.is_stopped(): + return + var bullet = bullet_type.instance() + bullet.position = player.position + bullet.position.y -= 8 + bullet.velocity.y -= bullet_speed + shoot_timer.start() + player.level.add_child(bullet)