Make slugs attack you and add a losing condition

This commit is contained in:
Olivier 'reivilibre' 2023-01-09 04:48:32 +00:00
parent 4f85a9bfcc
commit b30613974e
13 changed files with 207 additions and 13 deletions

View File

@ -29,6 +29,7 @@ func _find_target() -> void:
var tree_distsq := self.global_position.distance_squared_to(tree.global_position) var tree_distsq := self.global_position.distance_squared_to(tree.global_position)
var tree_dist := sqrt(tree_distsq) var tree_dist := sqrt(tree_distsq)
var tree_food = tree.calculate_food(tree_dist / SPEED) var tree_food = tree.calculate_food(tree_dist / SPEED)
#print("est food ", tree_food)
if tree_food < 0.1: if tree_food < 0.1:
continue continue
var tree_juiciness = tree_food / tree_dist var tree_juiciness = tree_food / tree_dist
@ -45,25 +46,48 @@ func _find_target() -> void:
func _at_target() -> void: func _at_target() -> void:
if target.is_in_group("olive_trees"): if target.is_in_group("olive_trees"):
_eating() _eating()
pass
if target.name == "Player":
_explode()
var busy_eating = false
func _eating() -> void: func _eating() -> void:
if busy_eating:
return
busy_eating = true
var tree = target var tree = target
while true: while true:
var just_eaten = tree.eat_food() var just_eaten = tree.eat_food()
print("ate ", just_eaten) #print("ate ", just_eaten)
eaten_olives += just_eaten eaten_olives += just_eaten
hp += just_eaten hp += just_eaten
_on_eaten_olives_updated() _on_eaten_olives_updated()
# TODO sfx # TODO sfx
# TODO vfx # TODO vfx
$EatingTimer.start(2.0); yield($EatingTimer, "timeout")
yield(get_tree().create_timer(2.0, false), "timeout")
if just_eaten <= 0.1: if just_eaten <= 0.1:
_find_target() _find_target()
busy_eating = false
return return
busy_eating = false
func _explode() -> void:
var tree = get_tree()
target = null
$RenavigateTimer.stop()
var tween = tree.create_tween()
$ExplodeSfx.pitch_scale = rand_range(0.7, 1.2)
$ExplodeSfx.play()
tween.tween_property($AnimatedSprite, "scale", Vector2(2.5, 2.5), 0.5).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK)
tween.tween_property(self, "modulate:a", 0.5, 0.5).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BOUNCE)
tween.tween_callback(self, "queue_free")
var hud = find_parent("Level*").get_node("Hud")
# TODO sfx
tween.tween_callback(hud, "remove_hp")
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
if target == null: if target == null:
@ -94,12 +118,15 @@ func _physics_process(delta: float) -> void:
func _process(delta: float) -> void: func _process(delta: float) -> void:
hp = min(eaten_olives, hp + eaten_olives * HEAL_RATE_PER_OLIVE * delta) hp = min(eaten_olives, hp + eaten_olives * HEAL_RATE_PER_OLIVE * delta)
_on_hp_updated() _on_hp_updated()
if target != null and target.name == "Player":
if target.global_position.distance_squared_to(self.global_position) < 1024:
self._explode()
func _on_hp_updated() -> void: func _on_hp_updated() -> void:
if hp == eaten_olives: if hp == eaten_olives:
self.modulate.a = 1.0 self.modulate.a = 1.0
else: else:
self.modulate.a = clamp(sqrt(hp / eaten_olives), 0.0, 1.0) self.modulate.a = clamp(sqrt(hp / max(eaten_olives, 0.1)), 0.0, 1.0)
func _on_eaten_olives_updated() -> void: func _on_eaten_olives_updated() -> void:
self.scale = Vector2(1, 1) * (1.0 + eaten_olives * 0.1) self.scale = Vector2(1, 1) * (1.0 + eaten_olives * 0.1)
@ -114,6 +141,7 @@ func interact(_player: Node2D) -> bool:
$SlimyWalkSfx.stop() $SlimyWalkSfx.stop()
target = null target = null
# TODO sfx # TODO sfx
$RenavigateTimer.stop()
self.queue_free() self.queue_free()
else: else:
self._on_hp_updated() self._on_hp_updated()
@ -131,3 +159,5 @@ func _on_NavigationAgent2D_target_reached() -> void:
func _on_RenavigateTimer_timeout() -> void: func _on_RenavigateTimer_timeout() -> void:
if target != null: if target != null:
_agent.set_target_location(target.global_position) _agent.set_target_location(target.global_position)
else:
_find_target()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=11 format=2] [gd_scene load_steps=12 format=2]
[ext_resource path="res://characters/pests/slug_frame0005.png" type="Texture" id=1] [ext_resource path="res://characters/pests/slug_frame0005.png" type="Texture" id=1]
[ext_resource path="res://characters/pests/slug_frame0004.png" type="Texture" id=2] [ext_resource path="res://characters/pests/slug_frame0004.png" type="Texture" id=2]
@ -8,6 +8,7 @@
[ext_resource path="res://characters/pests/slug_frame0001.png" type="Texture" id=6] [ext_resource path="res://characters/pests/slug_frame0001.png" type="Texture" id=6]
[ext_resource path="res://characters/pests/Slug.gd" type="Script" id=7] [ext_resource path="res://characters/pests/Slug.gd" type="Script" id=7]
[ext_resource path="res://sfx/slimy_walk.wav" type="AudioStream" id=8] [ext_resource path="res://sfx/slimy_walk.wav" type="AudioStream" id=8]
[ext_resource path="res://sfx/slugsplode.wav" type="AudioStream" id=9]
[sub_resource type="SpriteFrames" id=1] [sub_resource type="SpriteFrames" id=1]
animations = [ { animations = [ {
@ -53,5 +54,11 @@ stream = ExtResource( 8 )
[node name="RenavigateTimer" type="Timer" parent="."] [node name="RenavigateTimer" type="Timer" parent="."]
autostart = true autostart = true
[node name="ExplodeSfx" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource( 9 )
[node name="EatingTimer" type="Timer" parent="."]
one_shot = true
[connection signal="target_reached" from="NavigationAgent2D" to="." method="_on_NavigationAgent2D_target_reached"] [connection signal="target_reached" from="NavigationAgent2D" to="." method="_on_NavigationAgent2D_target_reached"]
[connection signal="timeout" from="RenavigateTimer" to="." method="_on_RenavigateTimer_timeout"] [connection signal="timeout" from="RenavigateTimer" to="." method="_on_RenavigateTimer_timeout"]

View File

@ -33,4 +33,4 @@ func _physics_process(_delta):
return return
var velocity = (-anchor_relative_to_us.normalized()) * min(MAX_SPEED, SPEED_PER_DISTANCE * distance) var velocity = (-anchor_relative_to_us.normalized()) * min(MAX_SPEED, SPEED_PER_DISTANCE * distance)
attached.move_and_slide(velocity) var _lv = attached.move_and_slide(velocity)

View File

@ -83,6 +83,9 @@ position = Vector2( 486, 154 )
[node name="Node2D" parent="World/YSort" instance=ExtResource( 3 )] [node name="Node2D" parent="World/YSort" instance=ExtResource( 3 )]
position = Vector2( 1134, 649 ) position = Vector2( 1134, 649 )
[node name="Node2D4" parent="World/YSort" instance=ExtResource( 3 )]
position = Vector2( 1114, 493 )
[node name="Node2D2" parent="World/YSort" instance=ExtResource( 3 )] [node name="Node2D2" parent="World/YSort" instance=ExtResource( 3 )]
position = Vector2( 574, 653 ) position = Vector2( 574, 653 )
@ -92,6 +95,15 @@ position = Vector2( 542, 475 )
[node name="Slug" parent="World/YSort" instance=ExtResource( 7 )] [node name="Slug" parent="World/YSort" instance=ExtResource( 7 )]
position = Vector2( 184, 679 ) position = Vector2( 184, 679 )
[node name="Slug4" parent="World/YSort" instance=ExtResource( 7 )]
position = Vector2( 61, 628 )
[node name="Slug2" parent="World/YSort" instance=ExtResource( 7 )]
position = Vector2( 184, 660 )
[node name="Slug3" parent="World/YSort" instance=ExtResource( 7 )]
position = Vector2( 172, 689 )
[node name="MarkerRoadPoint" type="Node2D" parent="World"] [node name="MarkerRoadPoint" type="Node2D" parent="World"]
position = Vector2( 328, 770 ) position = Vector2( 328, 770 )

BIN
sfx/slugsplode.wav (Stored with Git LFS) Normal file

Binary file not shown.

23
sfx/slugsplode.wav.import Normal file
View File

@ -0,0 +1,23 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/slugsplode.wav-419a9dd79535d0778834c99c725fc959.sample"
[deps]
source_file="res://sfx/slugsplode.wav"
dest_files=[ "res://.import/slugsplode.wav-419a9dd79535d0778834c99c725fc959.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

View File

@ -6,12 +6,40 @@ export var postie_times = [0.5]
# Anything above 10 can't be rendered (for now?) # Anything above 10 can't be rendered (for now?)
export var num_days = 5 export var num_days = 5
export var next_level = ""
func add_coin(amount: int): func add_coin(amount: int):
coin += amount coin += amount
$HudInner/Panel/LabelCoin.text = str(coin) $HudInner/Panel/LabelCoin.text = str(coin)
var hp: int = 3
func _lose():
get_tree().paused = true
$HudInner/GameOverDialogue.visible = true
return
func _win():
var _r = get_tree().change_scene("res://levels/" + next_level + ".tscn")
func remove_hp():
if hp == 0:
# Lose game
self._lose()
return
hp -= 1
var hp_indicator = $HudInner/Panel/HpBar.get_child(hp)
hp_indicator.modulate.r = 0
func _ready(): func _ready():
# get a fresh seed for the PRNG
randomize()
$HudInner/GameOverDialogue.visible = false
if next_level == "":
printerr("No next level configured!")
var sch = $HudInner/Panel/Scheduler var sch = $HudInner/Panel/Scheduler
sch.postie_times = postie_times sch.postie_times = postie_times
sch.days_on_this_level = num_days sch.days_on_this_level = num_days
@ -19,3 +47,9 @@ func _ready():
var w2d: World2D = get_world_2d() var w2d: World2D = get_world_2d()
# random place to put it, but needed to get our navigation working: # random place to put it, but needed to get our navigation working:
Navigation2DServer.map_set_edge_connection_margin(w2d.navigation_map, 10.0) Navigation2DServer.map_set_edge_connection_margin(w2d.navigation_map, 10.0)
func _on_TryAgainButton_pressed() -> void:
# restart the level
print("reload ", get_tree().reload_current_scene())
get_tree().paused = false

View File

@ -1,9 +1,10 @@
[gd_scene load_steps=5 format=2] [gd_scene load_steps=6 format=2]
[ext_resource path="res://ui/normal_font.tres" type="DynamicFont" id=1] [ext_resource path="res://ui/normal_font.tres" type="DynamicFont" id=1]
[ext_resource path="res://ui/coin.png" type="Texture" id=2] [ext_resource path="res://ui/coin.png" type="Texture" id=2]
[ext_resource path="res://ui/Hud.gd" type="Script" id=3] [ext_resource path="res://ui/Hud.gd" type="Script" id=3]
[ext_resource path="res://ui/Scheduler.tscn" type="PackedScene" id=4] [ext_resource path="res://ui/Scheduler.tscn" type="PackedScene" id=4]
[ext_resource path="res://ui/hp.png" type="Texture" id=5]
[node name="Hud" type="Node2D"] [node name="Hud" type="Node2D"]
z_index = 50 z_index = 50
@ -39,3 +40,42 @@ margin_left = 120.0
margin_top = 8.0 margin_top = 8.0
margin_right = -8.0 margin_right = -8.0
margin_bottom = -88.0 margin_bottom = -88.0
[node name="HpBar" type="Node2D" parent="HudInner/Panel"]
position = Vector2( 31, 69 )
[node name="Sprite" type="Sprite" parent="HudInner/Panel/HpBar"]
texture = ExtResource( 5 )
[node name="Sprite2" type="Sprite" parent="HudInner/Panel/HpBar"]
position = Vector2( 22, 0 )
texture = ExtResource( 5 )
[node name="Sprite3" type="Sprite" parent="HudInner/Panel/HpBar"]
position = Vector2( 44, 0 )
texture = ExtResource( 5 )
[node name="GameOverDialogue" type="Panel" parent="HudInner"]
pause_mode = 2
margin_left = 544.0
margin_top = 360.0
margin_right = 901.0
margin_bottom = 480.0
[node name="SlugSorrowLabel" type="Label" parent="HudInner/GameOverDialogue"]
margin_left = 8.0
margin_top = 8.0
margin_right = 349.0
margin_bottom = 84.0
text = "Those pesky slugs may have gotten the better of you.
Try again?"
[node name="TryAgainButton" type="Button" parent="HudInner/GameOverDialogue"]
margin_left = 136.0
margin_top = 96.0
margin_right = 204.0
margin_bottom = 116.0
text = "Try again"
[connection signal="pressed" from="HudInner/GameOverDialogue/TryAgainButton" to="." method="_on_TryAgainButton_pressed"]

View File

@ -35,17 +35,22 @@ var time_of_day = 0.0
func _start_schedule(): func _start_schedule():
# schedule all events for the day... # schedule all events for the day...
for day in range(days_on_this_level): for _day in range(days_on_this_level):
var parent = find_parent("Level*").get_node("World/YSort") var parent = find_parent("Level*").get_node("World/YSort")
for postie_time in postie_times: for postie_time in postie_times:
# 5s early so the postie has time to drive there. # 5s early so the postie has time to drive there.
_postie_in(parent, (postie_time / DAY_PER_SEC) - 5.0, postie_length / DAY_PER_SEC) _postie_in(parent, (postie_time / DAY_PER_SEC) - 5.0, postie_length / DAY_PER_SEC)
yield(get_tree().create_timer(1 / DAY_PER_SEC, false), "timeout") $Timer.start(1 / DAY_PER_SEC)
yield($Timer, "timeout")
func _postie_in(parent: Node2D, time: float, idling_time: float): func _postie_in(parent: Node2D, time: float, idling_time: float):
yield(get_tree().create_timer(time, false), "timeout") var timer = Timer.new()
timer.one_shot = true
$Timer.add_child(timer)
timer.start(time); yield(timer, "timeout")
$Timer.remove_child(timer)
var new_postie = preload("res://vehicles/Postie.tscn").instance() var new_postie = preload("res://vehicles/Postie.tscn").instance()
new_postie.position = Vector2(-500, 0) new_postie.position = Vector2(-500, 0)
new_postie.idling_time = idling_time new_postie.idling_time = idling_time
@ -53,7 +58,5 @@ func _postie_in(parent: Node2D, time: float, idling_time: float):
func _process(delta): func _process(delta):
var old_time = time_of_day
time_of_day += delta * DAY_PER_SEC time_of_day += delta * DAY_PER_SEC
$Clock/ClockHand.rotation = 2 * PI * fmod(time_of_day, 1.0) $Clock/ClockHand.rotation = 2 * PI * fmod(time_of_day, 1.0)

View File

@ -118,3 +118,4 @@ text = "Clock"
align = 1 align = 1
[node name="Timer" type="Timer" parent="."] [node name="Timer" type="Timer" parent="."]
one_shot = true

BIN
ui/hp.kra (Stored with Git LFS) Normal file

Binary file not shown.

BIN
ui/hp.png (Stored with Git LFS) Normal file

Binary file not shown.

35
ui/hp.png.import Normal file
View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/hp.png-d487826fe303417660d08af683ed719a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/hp.png"
dest_files=[ "res://.import/hp.png-d487826fe303417660d08af683ed719a.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
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0