diff --git a/graphics/enemy/eel_body.png b/graphics/enemy/eel_body.png new file mode 100644 index 0000000..087b229 Binary files /dev/null and b/graphics/enemy/eel_body.png differ diff --git a/graphics/enemy/eel_body.png.import b/graphics/enemy/eel_body.png.import new file mode 100644 index 0000000..5be4646 --- /dev/null +++ b/graphics/enemy/eel_body.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/eel_body.png-4e2a707966d6656d9260d34aba0d2f9d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/enemy/eel_body.png" +dest_files=[ "res://.import/eel_body.png-4e2a707966d6656d9260d34aba0d2f9d.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/eel_head.png b/graphics/enemy/eel_head.png new file mode 100644 index 0000000..7bfef97 Binary files /dev/null and b/graphics/enemy/eel_head.png differ diff --git a/graphics/enemy/eel_head.png.import b/graphics/enemy/eel_head.png.import new file mode 100644 index 0000000..f48ab5d --- /dev/null +++ b/graphics/enemy/eel_head.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/eel_head.png-29e1a9b9dd541b3771a77751dd32cb42.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/enemy/eel_head.png" +dest_files=[ "res://.import/eel_head.png-29e1a9b9dd541b3771a77751dd32cb42.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/eel_inner_border.png b/graphics/enemy/eel_inner_border.png new file mode 100644 index 0000000..3e33ee3 Binary files /dev/null and b/graphics/enemy/eel_inner_border.png differ diff --git a/graphics/enemy/eel_inner_border.png.import b/graphics/enemy/eel_inner_border.png.import new file mode 100644 index 0000000..c5aab61 --- /dev/null +++ b/graphics/enemy/eel_inner_border.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/eel_inner_border.png-ba82f5e4214fedd66b04b75d8ca636b6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/enemy/eel_inner_border.png" +dest_files=[ "res://.import/eel_inner_border.png-ba82f5e4214fedd66b04b75d8ca636b6.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/eel_tail.png b/graphics/enemy/eel_tail.png new file mode 100644 index 0000000..949f03f Binary files /dev/null and b/graphics/enemy/eel_tail.png differ diff --git a/graphics/enemy/eel_tail.png.import b/graphics/enemy/eel_tail.png.import new file mode 100644 index 0000000..401b397 --- /dev/null +++ b/graphics/enemy/eel_tail.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/eel_tail.png-359163ddc00e2ac41549552381ce8558.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/enemy/eel_tail.png" +dest_files=[ "res://.import/eel_tail.png-359163ddc00e2ac41549552381ce8558.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/abyss.tscn b/maps/abyss.tscn index 016ce09..d5a153a 100644 --- a/maps/abyss.tscn +++ b/maps/abyss.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=2] +[gd_scene load_steps=21 format=2] [ext_resource path="res://maps/map.gd" type="Script" id=1] [ext_resource path="res://objects/hud/hud.tscn" type="PackedScene" id=2] @@ -15,6 +15,7 @@ [ext_resource path="res://objects/environment/bubble/bubble.tscn" type="PackedScene" id=13] [ext_resource path="res://objects/enemy/squig.tscn" type="PackedScene" id=14] [ext_resource path="res://objects/enemy/antlion.tscn" type="PackedScene" id=15] +[ext_resource path="res://objects/enemy/eel.tscn" type="PackedScene" id=16] [sub_resource type="CanvasItemMaterial" id=12] blend_mode = 3 @@ -148,6 +149,9 @@ scale = Vector2( 1, 7 ) [node name="Antlion" parent="Enemies" instance=ExtResource( 15 )] position = Vector2( 80, 256 ) +[node name="Eel" parent="Enemies" instance=ExtResource( 16 )] +position = Vector2( 200, 80 ) + [node name="Mines" type="Node2D" parent="Enemies"] [node name="Mine" parent="Enemies/Mines" instance=ExtResource( 11 )] diff --git a/objects/enemy/eel.gd b/objects/enemy/eel.gd new file mode 100644 index 0000000..296c505 --- /dev/null +++ b/objects/enemy/eel.gd @@ -0,0 +1,55 @@ +extends "res://objects/enemy/enemy.gd" + + +const SEGMENT_LENGTH: float = 4.0 +const BASE_LENGTH: float = 20.0 # combined length of head and tail + + +export var segments: int = 8 +export var speed: float = 32.0 +export var wave_length: float = 8.0 +export var wave_amplitude: float = 4.0 + + +onready var sector: Vector2 = Game.get_sector(global_position) + + +onready var hitbox: Area2D = $Hitbox +onready var first_segment: CollisionShape2D = $"%Segment" +onready var segment_start: Position2D = $"%SegmentStart" + + +func _ready() -> void: + hitbox.remove_child(first_segment) + for i in segments: + var new_segment = first_segment.duplicate() + new_segment.position.x = segment_start.position.x + SEGMENT_LENGTH * float(i) + hitbox.add_child(new_segment) + $Hitbox/TailShape.position.x = segment_start.position.x + SEGMENT_LENGTH * segments + _wave_segments() + +func _physics_process(delta: float) -> void: + # move + global_position.x -= speed * delta * sign(scale.x) + # make segments wibble + _wave_segments() + # check for wrapping + var sector_rect = Rect2(sector * Game.resolution, Game.resolution) + var total_length = BASE_LENGTH + (SEGMENT_LENGTH * float(segments)) + var eel_rect = Rect2(global_position + Vector2(-2.0, 4.0), Vector2(total_length, 0.0)) + if not sector_rect.intersects(eel_rect): + global_position.x += (Game.resolution.x + total_length) * sign(scale.x) + +func _wave_segments() -> void: + for segment in hitbox.get_children(): + if segment is Node2D: + segment.position.y = sin(segment.global_position.x / wave_length) * wave_amplitude + +func die() -> void: + for segment in hitbox.get_children(): + if segment is Node2D: + var death_particles = DeathParticles.instance() + death_particles.global_position = segment.global_position + death_particles.emitting = true + get_parent().add_child(death_particles) + .die() diff --git a/objects/enemy/eel.tscn b/objects/enemy/eel.tscn new file mode 100644 index 0000000..79cf82a --- /dev/null +++ b/objects/enemy/eel.tscn @@ -0,0 +1,77 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://objects/enemy/eel.gd" type="Script" id=1] +[ext_resource path="res://graphics/enemy/eel_head.png" type="Texture" id=2] +[ext_resource path="res://graphics/enemy/eel_body.png" type="Texture" id=3] +[ext_resource path="res://graphics/enemy/eel_tail.png" type="Texture" id=4] +[ext_resource path="res://graphics/enemy/eel_inner_border.png" type="Texture" id=5] + +[sub_resource type="RectangleShape2D" id=3] +extents = Vector2( 2, 2 ) + +[sub_resource type="RectangleShape2D" id=2] +extents = Vector2( 2, 2 ) + +[node name="Eel" type="Node2D" groups=["enemy"]] +script = ExtResource( 1 ) +blood = false +wave_amplitude = 6.0 + +[node name="Hitbox" type="Area2D" parent="." groups=["enemy_hitbox"]] +position = Vector2( 0, 4 ) + +[node name="SegmentStart" type="Position2D" parent="Hitbox"] +unique_name_in_owner = true +position = Vector2( 12, 0 ) +__meta__ = { +"_gizmo_extents_": 5.0 +} + +[node name="HeadShape" type="CollisionPolygon2D" parent="Hitbox"] +position = Vector2( 8, 0 ) +polygon = PoolVector2Array( -7, -2, 2, -2, 2, 2, -7, 2 ) + +[node name="HeadSprite" type="Sprite" parent="Hitbox/HeadShape"] +show_behind_parent = true +position = Vector2( -4, 0 ) +texture = ExtResource( 2 ) + +[node name="InnerBorder" type="Sprite" parent="Hitbox/HeadShape"] +position = Vector2( 3, 0 ) +z_index = -1 +texture = ExtResource( 5 ) + +[node name="TailShape" type="CollisionShape2D" parent="Hitbox"] +position = Vector2( 16, 0 ) +shape = SubResource( 3 ) + +[node name="TailSprite" type="Sprite" parent="Hitbox/TailShape"] +show_behind_parent = true +position = Vector2( 2, 0 ) +texture = ExtResource( 4 ) + +[node name="InnerBorder" type="Sprite" parent="Hitbox/TailShape"] +position = Vector2( -2, 0 ) +z_index = -1 +texture = ExtResource( 5 ) + +[node name="Segment" type="CollisionShape2D" parent="Hitbox"] +unique_name_in_owner = true +position = Vector2( 12, 0 ) +shape = SubResource( 2 ) + +[node name="SegmentSprite" type="Sprite" parent="Hitbox/Segment"] +show_behind_parent = true +texture = ExtResource( 3 ) + +[node name="InnerBorder" type="Sprite" parent="Hitbox/Segment"] +position = Vector2( -2, 0 ) +z_index = -1 +texture = ExtResource( 5 ) + +[node name="InnerBorder2" type="Sprite" parent="Hitbox/Segment"] +position = Vector2( 3, 0 ) +z_index = -1 +texture = ExtResource( 5 ) + +[connection signal="area_entered" from="Hitbox" to="." method="_on_Hitbox_area_entered"]