mirror of
https://github.com/Steffo99/watermelonkeys-patched-ld51.git
synced 2024-11-21 15:44:19 +00:00
Added dumbass falena
This commit is contained in:
parent
8895df48d4
commit
67c5b9b9e2
7 changed files with 366 additions and 3 deletions
BIN
ASSETS/enemy_spritesheet.png
Normal file
BIN
ASSETS/enemy_spritesheet.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
35
ASSETS/enemy_spritesheet.png.import
Normal file
35
ASSETS/enemy_spritesheet.png.import
Normal file
|
@ -0,0 +1,35 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/enemy_spritesheet.png-19f607fcb568e42bb08c4d53fd65c460.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://ASSETS/enemy_spritesheet.png"
|
||||
dest_files=[ "res://.import/enemy_spritesheet.png-19f607fcb568e42bb08c4d53fd65c460.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
|
|
@ -1,11 +1,17 @@
|
|||
class_name Giovanna
|
||||
extends KinematicBody2D
|
||||
|
||||
export(float, 0.01, 2.0, 0.01) var stopping_force = 1.0
|
||||
|
||||
var ammo = 6
|
||||
var velocity = Vector2(0,0)
|
||||
const max_speed = 150
|
||||
const GRAVITY = 30
|
||||
const JUMPFORCE = -500
|
||||
|
||||
func _ready():
|
||||
owner.set_meta("player", self)
|
||||
|
||||
func _physics_process(delta):
|
||||
if Input.is_action_pressed("right"):
|
||||
velocity.x = max_speed
|
||||
|
@ -26,5 +32,5 @@ func _physics_process(delta):
|
|||
if Input.is_action_just_pressed("jump") and is_on_floor():
|
||||
velocity.y = JUMPFORCE
|
||||
velocity = move_and_slide(velocity,Vector2.UP)
|
||||
velocity.x = lerp(velocity.x,0,0.2)
|
||||
velocity.x = lerp(velocity.x,0,stopping_force)
|
||||
|
||||
|
|
48
Level1.tscn
48
Level1.tscn
File diff suppressed because one or more lines are too long
174
enemies/Enemy.gd
Normal file
174
enemies/Enemy.gd
Normal file
|
@ -0,0 +1,174 @@
|
|||
class_name Enemy
|
||||
extends KinematicBody2D
|
||||
|
||||
enum STATES {
|
||||
SPAWN,
|
||||
ROAM, # fly around until player is in reach
|
||||
AGGRO, # get mad because you saw the player
|
||||
CHARGE, #RUN to the player
|
||||
ATTACK #fuck up the player if the sucker didnt run away
|
||||
}
|
||||
|
||||
export(float, 2.0, 150.0, 0.1) var attack_dist = 150.0
|
||||
export(float, 1.0, 500.0, 0.1) var roam_max_speed = 100.0
|
||||
export(float, 1.0, 200.0, 0.1) var attack_speed_mul = 10.0
|
||||
export(float, 0.01, 1.0, 0.01) var roam_acceleration = 0.4
|
||||
export(float, 0.01, 5.0, 0.01) var aggro_timer_len = 2.0
|
||||
|
||||
onready var ray := $RayCast2D
|
||||
onready var anim_sprite := $AnimatedSprite
|
||||
|
||||
var aggro_timer := Timer.new()
|
||||
var noise_idx := 0.0
|
||||
var noise := OpenSimplexNoise.new()
|
||||
var state = STATES.SPAWN
|
||||
var player : Giovanna = null
|
||||
var velocity := Vector2.ZERO
|
||||
var dir := Vector2.RIGHT
|
||||
var charge_target := Vector2.ZERO
|
||||
var charge_collision : KinematicCollision2D = null
|
||||
var charge_done := false
|
||||
var spawn_done := false
|
||||
|
||||
func _ready():
|
||||
add_child(aggro_timer)
|
||||
aggro_timer.one_shot = true
|
||||
aggro_timer.wait_time = aggro_timer_len
|
||||
|
||||
anim_sprite.animation = "spawning"
|
||||
anim_sprite.playing = true
|
||||
|
||||
# Configure noise
|
||||
randomize()
|
||||
noise.seed = randi()
|
||||
noise.octaves = 2
|
||||
noise.period = 20.0
|
||||
noise.persistence = 0.8
|
||||
|
||||
# yield(get_tree(), "idle_frame")
|
||||
# Gets reference to the player from the root node
|
||||
player = owner.get_meta("player")
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
var new_s = check_state()
|
||||
|
||||
if state != new_s:
|
||||
state = new_s
|
||||
init_state()
|
||||
|
||||
run_state(delta)
|
||||
|
||||
func check_state():
|
||||
if not player:
|
||||
return STATES.ROAM
|
||||
|
||||
match state:
|
||||
STATES.SPAWN:
|
||||
if spawn_done:
|
||||
return STATES.ROAM
|
||||
STATES.ROAM:
|
||||
var p_pos = player.global_position
|
||||
# let's be efficient and use the squared distance
|
||||
var dist = global_position.distance_squared_to(p_pos)
|
||||
|
||||
if dist <= pow(attack_dist, 2):
|
||||
# it's in range
|
||||
ray.cast_to = ray.to_local(p_pos)
|
||||
ray.force_raycast_update()
|
||||
|
||||
var coll = ray.get_collider()
|
||||
if coll and coll == player:
|
||||
# LADIES N GENTLEMEN WE GOT HIM
|
||||
return STATES.AGGRO
|
||||
STATES.AGGRO:
|
||||
if aggro_timer.time_left <= 0.0:
|
||||
return STATES.CHARGE
|
||||
STATES.CHARGE:
|
||||
charge_done = charge_collision and charge_collision.collider == player
|
||||
if charge_done:
|
||||
return STATES.ATTACK
|
||||
STATES.ATTACK:
|
||||
return state
|
||||
if dist_to_player() > 20.0:
|
||||
return STATES.ROAM
|
||||
|
||||
return state
|
||||
|
||||
func init_state():
|
||||
# Things to do when the state changes
|
||||
match state:
|
||||
STATES.SPAWN:
|
||||
# nothing to do
|
||||
pass
|
||||
STATES.ROAM:
|
||||
anim_sprite.modulate = Color.white
|
||||
velocity *= 0.0
|
||||
dir = Vector2.RIGHT
|
||||
anim_sprite.animation = "roaming"
|
||||
anim_sprite.playing = true
|
||||
STATES.AGGRO:
|
||||
velocity *= 0.0
|
||||
dir = Vector2.RIGHT
|
||||
aggro_timer.start()
|
||||
charge_target = player.position
|
||||
STATES.CHARGE:
|
||||
charge_done = false
|
||||
anim_sprite.offset *= 0.0
|
||||
STATES.ATTACK:
|
||||
## TEMP
|
||||
velocity *= 0.0
|
||||
anim_sprite.modulate = Color.red
|
||||
|
||||
func run_state(delta):
|
||||
match state:
|
||||
STATES.SPAWN:
|
||||
# nothing to do
|
||||
pass
|
||||
STATES.ROAM:
|
||||
noise_idx += delta * 100
|
||||
var _n = noise.get_noise_1d(noise_idx)
|
||||
var n = range_lerp(_n, -1.0, 1.0, -TAU/4.0, TAU/4.0)
|
||||
|
||||
dir = dir.linear_interpolate(dir.rotated(n * 0.1), 0.5)
|
||||
|
||||
velocity = velocity.linear_interpolate(dir * roam_max_speed, roam_acceleration)
|
||||
|
||||
var coll = move_and_collide(velocity * delta)
|
||||
|
||||
var coll_horizontal := false
|
||||
if coll:
|
||||
var norm = coll.normal
|
||||
if norm.y == 0:
|
||||
# vertical wall
|
||||
dir.x *= -1
|
||||
velocity.x *= -1
|
||||
else:
|
||||
dir.y *= -1
|
||||
velocity.y *= -1
|
||||
|
||||
anim_sprite.flip_h = (velocity.x > 0)
|
||||
STATES.AGGRO:
|
||||
var r = 2.0
|
||||
anim_sprite.offset = Vector2(rand_range(-r, r), rand_range(-r, r))
|
||||
STATES.CHARGE:
|
||||
var target_dist = position.distance_squared_to(charge_target)
|
||||
var target_dir = position.direction_to(charge_target)
|
||||
var speed = roam_max_speed * attack_speed_mul
|
||||
var fac = target_dist/pow(attack_dist, 2)
|
||||
|
||||
velocity = velocity.linear_interpolate(target_dir * speed, fac)
|
||||
|
||||
move_and_slide(velocity)
|
||||
|
||||
if get_slide_count() > 0:
|
||||
charge_collision = get_slide_collision(0)
|
||||
STATES.ATTACK:
|
||||
pass
|
||||
|
||||
func dist_to_player():
|
||||
return position.distance_to(player.position)
|
||||
|
||||
func _on_AnimatedSprite_animation_finished():
|
||||
if anim_sprite.animation == "spawning":
|
||||
spawn_done = true
|
82
enemies/Enemy.tscn
Normal file
82
enemies/Enemy.tscn
Normal file
|
@ -0,0 +1,82 @@
|
|||
[gd_scene load_steps=13 format=2]
|
||||
|
||||
[ext_resource path="res://ASSETS/enemy_spritesheet.png" type="Texture" id=1]
|
||||
[ext_resource path="res://enemies/Enemy.gd" type="Script" id=2]
|
||||
|
||||
[sub_resource type="AtlasTexture" id=8]
|
||||
atlas = ExtResource( 1 )
|
||||
region = Rect2( 0, 0, 30, 30 )
|
||||
|
||||
[sub_resource type="AtlasTexture" id=9]
|
||||
atlas = ExtResource( 1 )
|
||||
region = Rect2( 30, 0, 30, 30 )
|
||||
|
||||
[sub_resource type="AtlasTexture" id=10]
|
||||
atlas = ExtResource( 1 )
|
||||
region = Rect2( 60, 0, 30, 30 )
|
||||
|
||||
[sub_resource type="AtlasTexture" id=11]
|
||||
atlas = ExtResource( 1 )
|
||||
region = Rect2( 90, 0, 30, 30 )
|
||||
|
||||
[sub_resource type="SpriteFrames" id=1]
|
||||
animations = [ {
|
||||
"frames": [ SubResource( 8 ), SubResource( 9 ), SubResource( 10 ), SubResource( 11 ), SubResource( 10 ), SubResource( 9 ), SubResource( 8 ) ],
|
||||
"loop": true,
|
||||
"name": "roaming",
|
||||
"speed": 30.0
|
||||
}, {
|
||||
"frames": [ SubResource( 8 ), SubResource( 9 ), SubResource( 10 ), SubResource( 11 ) ],
|
||||
"loop": false,
|
||||
"name": "spawning",
|
||||
"speed": 4.0
|
||||
} ]
|
||||
|
||||
[sub_resource type="CircleShape2D" id=2]
|
||||
radius = 42.0
|
||||
|
||||
[sub_resource type="Gradient" id=3]
|
||||
|
||||
[sub_resource type="GradientTexture" id=4]
|
||||
gradient = SubResource( 3 )
|
||||
width = 100
|
||||
|
||||
[sub_resource type="Gradient" id=5]
|
||||
offsets = PoolRealArray( 0 )
|
||||
colors = PoolColorArray( 1, 0, 0, 1 )
|
||||
|
||||
[sub_resource type="GradientTexture" id=6]
|
||||
gradient = SubResource( 5 )
|
||||
width = 100
|
||||
|
||||
[node name="Enemy" type="KinematicBody2D"]
|
||||
scale = Vector2( 0.5, 0.5 )
|
||||
collision_mask = 5
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
|
||||
scale = Vector2( 2, 2 )
|
||||
frames = SubResource( 1 )
|
||||
animation = "spawning"
|
||||
flip_h = true
|
||||
|
||||
[node name="RayCast2D" type="RayCast2D" parent="."]
|
||||
enabled = true
|
||||
cast_to = Vector2( 50, 0 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource( 2 )
|
||||
|
||||
[node name="DEBUG_Dir" type="Sprite" parent="."]
|
||||
visible = false
|
||||
scale = Vector2( 1, 4 )
|
||||
texture = SubResource( 4 )
|
||||
offset = Vector2( 50, 0 )
|
||||
|
||||
[node name="DEBUG_Vel" type="Sprite" parent="."]
|
||||
visible = false
|
||||
scale = Vector2( 0.48, 4 )
|
||||
texture = SubResource( 6 )
|
||||
offset = Vector2( 50, 0 )
|
||||
|
||||
[connection signal="animation_finished" from="AnimatedSprite" to="." method="_on_AnimatedSprite_animation_finished"]
|
|
@ -8,9 +8,26 @@
|
|||
|
||||
config_version=4
|
||||
|
||||
_global_script_classes=[ {
|
||||
"base": "KinematicBody2D",
|
||||
"class": "Enemy",
|
||||
"language": "GDScript",
|
||||
"path": "res://enemies/Enemy.gd"
|
||||
}, {
|
||||
"base": "KinematicBody2D",
|
||||
"class": "Giovanna",
|
||||
"language": "GDScript",
|
||||
"path": "res://Giovanna.gd"
|
||||
} ]
|
||||
_global_script_class_icons={
|
||||
"Enemy": "",
|
||||
"Giovanna": ""
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Platformer"
|
||||
run/main_scene="res://Level1.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[display]
|
||||
|
@ -70,6 +87,11 @@ jump={
|
|||
"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":0,"physical_scancode":32,"unicode":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
quit={
|
||||
"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":16777217,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[physics]
|
||||
|
||||
|
|
Loading…
Reference in a new issue