diff --git a/global_palette.png b/global_palette.png index 9971f5f..f13825f 100644 Binary files a/global_palette.png and b/global_palette.png differ diff --git a/global_palette.png.import b/global_palette.png.import new file mode 100644 index 0000000..8333c3f --- /dev/null +++ b/global_palette.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/global_palette.png-4d8657b6a2eb8f3c7d2053c783dbb9f2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://global_palette.png" +dest_files=[ "res://.import/global_palette.png-4d8657b6a2eb8f3c7d2053c783dbb9f2.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 +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/graphics/enemy/turret.png b/graphics/enemy/turret.png new file mode 100644 index 0000000..e0bfd02 Binary files /dev/null and b/graphics/enemy/turret.png differ diff --git a/graphics/enemy/turret.png.import b/graphics/enemy/turret.png.import new file mode 100644 index 0000000..c85ab3c --- /dev/null +++ b/graphics/enemy/turret.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/turret.png-b97c44f424c4d5ba2402da57f8a698f0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/enemy/turret.png" +dest_files=[ "res://.import/turret.png-b97c44f424c4d5ba2402da57f8a698f0.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 +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/graphics/particles/pixel.png b/graphics/particles/pixel.png new file mode 100644 index 0000000..cbc2cee Binary files /dev/null and b/graphics/particles/pixel.png differ diff --git a/graphics/particles/pixel.png.import b/graphics/particles/pixel.png.import new file mode 100644 index 0000000..83f8c6c --- /dev/null +++ b/graphics/particles/pixel.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/pixel.png-ea8731a4a8becbfe71ee1a01d140f7c0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/particles/pixel.png" +dest_files=[ "res://.import/pixel.png-ea8731a4a8becbfe71ee1a01d140f7c0.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 +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/maps/factory.tscn b/maps/factory.tscn index 1447d4f..98143bc 100644 --- a/maps/factory.tscn +++ b/maps/factory.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=2] +[gd_scene load_steps=15 format=2] [ext_resource path="res://maps/map.gd" type="Script" id=1] [ext_resource path="res://objects/Camera2D.tscn" type="PackedScene" id=2] @@ -9,6 +9,7 @@ [ext_resource path="res://scripts/recolor_border.shader" type="Shader" id=7] [ext_resource path="res://graphics/player/sg_doublejump.png" type="Texture" id=8] [ext_resource path="res://objects/environment/ladder/ladder.tscn" type="PackedScene" id=9] +[ext_resource path="res://objects/environment/turret/turret.tscn" type="PackedScene" id=10] [sub_resource type="ShaderMaterial" id=1] shader = ExtResource( 7 ) @@ -112,7 +113,7 @@ tracks/1/keys = { "values": [ 0.0, 90.0, 180.0, 270.0 ] } -[node name="Map" type="Node2D"] +[node name="Map" type="Node2D" groups=["map"]] script = ExtResource( 1 ) [node name="Sectors" type="CanvasLayer" parent="."] @@ -195,4 +196,7 @@ tile_data = PoolIntArray( 1114119, 0, 131072, 1179655, 0, 131072, 1245191, 0, 13 position = Vector2( 56, 136 ) scale = Vector2( 1, 3 ) +[node name="Turret" parent="." instance=ExtResource( 10 )] +position = Vector2( 96, 72 ) + [connection signal="tree_entered" from="Sectors" to="Sectors" method="set_visible" binds= [ false ]] diff --git a/objects/environment/turret/turret.gd b/objects/environment/turret/turret.gd new file mode 100644 index 0000000..61998d8 --- /dev/null +++ b/objects/environment/turret/turret.gd @@ -0,0 +1,38 @@ +extends Node2D + +const TurretBullet = preload("res://objects/environment/turret/turret_bullet.tscn") + +export var delay = 0.0 +export var fire_rate = 10.0 +export var bullet_spread = 15.0 +export var bullet_speed = 200.0 + +# do not set manually, controlled by AnimationPlayer +export var shooting = false + +onready var barrel_start = $BarrelStart +onready var barrel_end = $BarrelStart/BarrelEnd + +var bullet_cooldown = 1.0 + +func _ready(): + bullet_spread = deg2rad(bullet_spread) + $AnimationTree.active = true + var timer = get_tree().create_timer(delay, false) + timer.connect("timeout", $AnimationTree, "set", [ + "parameters/conditions/shooting", + true + ]) + +func _physics_process(delta): + if shooting: + bullet_cooldown -= delta * fire_rate + if bullet_cooldown <= 0.0: + bullet_cooldown += 1.0 + var bullet = TurretBullet.instance() + bullet.global_position = barrel_end.global_position + bullet.direction = (barrel_end.global_position - barrel_start.global_position).normalized() + bullet.direction = bullet.direction.rotated(rand_range(-bullet_spread, bullet_spread)) + bullet.speed = bullet_speed + get_parent().call_deferred("add_child", bullet) + Game.play_sound(Game.a_arrow, Game.ac_climb) diff --git a/objects/environment/turret/turret.tscn b/objects/environment/turret/turret.tscn new file mode 100644 index 0000000..b8c1998 --- /dev/null +++ b/objects/environment/turret/turret.tscn @@ -0,0 +1,374 @@ +[gd_scene load_steps=21 format=2] + +[ext_resource path="res://objects/environment/turret/turret.gd" type="Script" id=1] +[ext_resource path="res://graphics/enemy/turret.png" type="Texture" id=2] +[ext_resource path="res://graphics/particles/dust.png" type="Texture" id=3] + +[sub_resource type="Animation" id=1] +length = 0.001 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:flip_h") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ false ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("BarrelStart:rotation_degrees") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("BarrelStart/BarrelEnd/MuzzleFlash:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:shooting") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ false ] +} + +[sub_resource type="Animation" id=2] +resource_name = "cool_down" +length = 4.0 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5, 1, 2, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 8, 7, 6, 3, 0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:flip_h") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("BarrelStart:rotation_degrees") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 45.0, 0.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("BarrelStart/BarrelEnd/MuzzleFlash:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:shooting") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=3] +resource_name = "prime" +length = 3.0 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:flip_h") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("BarrelStart:rotation_degrees") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 45.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("BarrelStart/BarrelEnd/MuzzleFlash:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:shooting") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=4] +resource_name = "shooting" +length = 6.0 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 0 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4, 3.6, 3.8, 3.9, 4, 4.2, 4.4, 4.6, 4.8, 5, 5.2, 5.4, 5.6, 5.8, 6 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 2, 1, 0, 1, 2, 2, 1, 0, 1, 2, 5, 5, 4, 3, 4, 5, 5, 4, 3, 4, 5, 8, 8, 7, 6, 7, 8, 8, 7, 6, 7, 8, 8 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:flip_h") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.6, 1.4, 2.6, 3.4, 4.6, 5.4 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ false, true, false, true, false, true, false ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("BarrelStart:rotation_degrees") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 0.6, 1, 1.6, 2, 2.2, 2.6, 3, 3.6, 4, 4.2, 4.6, 5, 5.6, 6 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ 45.0, 0.0, -45.0, 0.0, 45.0, 45.0, 0.0, -45.0, 0.0, 45.0, 45.0, 0.0, -45.0, 0.0, 45.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("BarrelStart/BarrelEnd/MuzzleFlash:emitting") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 6 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ true, false ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:shooting") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 6 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ true, false ] +} + +[sub_resource type="AnimationNodeAnimation" id=13] +animation = "RESET" + +[sub_resource type="AnimationNodeAnimation" id=5] +animation = "cool_down" + +[sub_resource type="AnimationNodeAnimation" id=6] +animation = "prime" + +[sub_resource type="AnimationNodeAnimation" id=10] +animation = "shooting" + +[sub_resource type="AnimationNodeStateMachineTransition" id=7] +switch_mode = 2 +advance_condition = "shooting" + +[sub_resource type="AnimationNodeStateMachineTransition" id=11] +switch_mode = 2 +auto_advance = true + +[sub_resource type="AnimationNodeStateMachineTransition" id=12] +switch_mode = 2 +auto_advance = true + +[sub_resource type="AnimationNodeStateMachineTransition" id=14] +switch_mode = 2 +advance_condition = "shooting" + +[sub_resource type="AnimationNodeStateMachine" id=8] +states/RESET/node = SubResource( 13 ) +states/RESET/position = Vector2( -29, -147.556 ) +states/cool_down/node = SubResource( 5 ) +states/cool_down/position = Vector2( -450.333, -154.667 ) +states/prime/node = SubResource( 6 ) +states/prime/position = Vector2( -111.667, -57.3333 ) +states/shooting/node = SubResource( 10 ) +states/shooting/position = Vector2( -583.667, -17.3333 ) +transitions = [ "cool_down", "prime", SubResource( 7 ), "shooting", "cool_down", SubResource( 11 ), "prime", "shooting", SubResource( 12 ), "RESET", "prime", SubResource( 14 ) ] +start_node = "RESET" +graph_offset = Vector2( -880, -243 ) + +[sub_resource type="AnimationNodeStateMachinePlayback" id=9] + +[sub_resource type="Curve" id=15] +_data = [ Vector2( 0, 1 ), 0.0, -2.23455, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ] + +[sub_resource type="CurveTexture" id=16] +width = 32 +curve = SubResource( 15 ) + +[sub_resource type="ParticlesMaterial" id=17] +emission_shape = 2 +emission_box_extents = Vector3( 2, 0, 0 ) +flag_disable_z = true +direction = Vector3( 0, 1, 0 ) +spread = 60.0 +gravity = Vector3( 0, 0, 0 ) +initial_velocity = 50.0 +orbit_velocity = 0.0 +orbit_velocity_random = 0.0 +angle = 720.0 +angle_random = 1.0 +scale = 0.25 +scale_random = 0.5 +scale_curve = SubResource( 16 ) +color = Color( 1, 0.968627, 0.431373, 1 ) + +[node name="Turret" type="Node2D"] +script = ExtResource( 1 ) +fire_rate = 20.0 +bullet_spread = 20.0 + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 2 ) +centered = false +offset = Vector2( -4, 0 ) +hframes = 3 +vframes = 3 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +playback_process_mode = 0 +anims/RESET = SubResource( 1 ) +anims/cool_down = SubResource( 2 ) +anims/prime = SubResource( 3 ) +anims/shooting = SubResource( 4 ) + +[node name="AnimationTree" type="AnimationTree" parent="."] +tree_root = SubResource( 8 ) +anim_player = NodePath("../AnimationPlayer") +process_mode = 0 +parameters/playback = SubResource( 9 ) +parameters/conditions/shooting = false + +[node name="BarrelStart" type="Position2D" parent="."] +position = Vector2( 4, 5 ) +__meta__ = { +"_gizmo_extents_": 2.0 +} + +[node name="BarrelEnd" type="Position2D" parent="BarrelStart"] +position = Vector2( 0, 9 ) +__meta__ = { +"_gizmo_extents_": 2.0 +} + +[node name="MuzzleFlash" type="Particles2D" parent="BarrelStart/BarrelEnd"] +z_index = -1 +emitting = false +lifetime = 0.15 +explosiveness = 0.5 +process_material = SubResource( 17 ) +texture = ExtResource( 3 ) diff --git a/objects/environment/turret/turret_bullet.gd b/objects/environment/turret/turret_bullet.gd new file mode 100644 index 0000000..daa3298 --- /dev/null +++ b/objects/environment/turret/turret_bullet.gd @@ -0,0 +1,18 @@ +extends Node2D + +export var speed = 100.0 + +var direction = Vector2.DOWN + +func _physics_process(delta): + position += direction * speed * delta + + +func _on_Hitbox_area_entered(area): + if area.is_in_group("player"): + area.get_parent().die() + + +func _on_Hitbox_body_entered(body): + if body is TileMap or body is StaticBody2D: + queue_free() diff --git a/objects/environment/turret/turret_bullet.tscn b/objects/environment/turret/turret_bullet.tscn new file mode 100644 index 0000000..ff41e45 --- /dev/null +++ b/objects/environment/turret/turret_bullet.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://graphics/particles/pixel.png" type="Texture" id=1] +[ext_resource path="res://objects/environment/turret/turret_bullet.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 0.5, 0.5 ) + +[node name="TurretBullet" type="Node2D"] +script = ExtResource( 2 ) +speed = 200.0 + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 1, 0.894118, 0.4, 1 ) +texture = ExtResource( 1 ) +centered = false + +[node name="Hitbox" type="Area2D" parent="."] +collision_mask = 3 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2( 0.5, 0.5 ) +shape = SubResource( 1 ) + +[connection signal="area_entered" from="Hitbox" to="." method="_on_Hitbox_area_entered"] +[connection signal="body_entered" from="Hitbox" to="." method="_on_Hitbox_body_entered"]