diff --git a/src/components/offscreen_indicator/OffscreenIndicator.gd b/src/components/offscreen_indicator/OffscreenIndicator.gd index d343fd2a..fd459db4 100644 --- a/src/components/offscreen_indicator/OffscreenIndicator.gd +++ b/src/components/offscreen_indicator/OffscreenIndicator.gd @@ -21,7 +21,7 @@ static func add(node, opts={}): return var indicator = indicator_scene.instantiate() - indicator.ready.connect(indicator.set_label_text.bind(opts.get("label"))) + indicator.ready.connect(indicator.set_label_text.bind(opts.get("label", node.name))) var vis = VisibleOnScreenNotifier2D.new() vis.screen_exited.connect(OffscreenIndicator.maybe_activate.bind(indicator, node, opts)) diff --git a/src/components/offscreen_indicator/OffscreenIndicator.tscn b/src/components/offscreen_indicator/OffscreenIndicator.tscn index 1d81454c..69e3b5c2 100644 --- a/src/components/offscreen_indicator/OffscreenIndicator.tscn +++ b/src/components/offscreen_indicator/OffscreenIndicator.tscn @@ -23,8 +23,10 @@ offset_bottom = 14.0 rotation = -0.785398 pivot_offset = Vector2(40, 8) theme_override_fonts/normal_font = ExtResource("3_f56n0") +theme_override_font_sizes/normal_font_size = 16 bbcode_enabled = true text = "[center]sheep" fit_content = true scroll_active = false +autowrap_mode = 0 custom_effects = [ExtResource("4_5k2rg"), ExtResource("5_vk1dt"), ExtResource("6_na7en")] diff --git a/src/dino/bosses/SSBoss.gd b/src/dino/bosses/SSBoss.gd index c668ba66..cd5f84d1 100644 --- a/src/dino/bosses/SSBoss.gd +++ b/src/dino/bosses/SSBoss.gd @@ -87,6 +87,10 @@ func _ready(): state_label.set_visible(false) + OffscreenIndicator.add(self, { + # could instead depend on a fn like this directly on the passed node + is_active=func(): return not is_dead}) + func calculate_warp_spots(): var dist_away = 200 var maybe_targets = [ diff --git a/src/dino/enemies/robots/Robot.gd b/src/dino/enemies/robots/Robot.gd deleted file mode 100644 index 8df8d722..00000000 --- a/src/dino/enemies/robots/Robot.gd +++ /dev/null @@ -1,180 +0,0 @@ -extends CharacterBody2D - -@onready var anim = $AnimatedSprite2D -@onready var machine = $Machine -@onready var collision_shape = $CollisionShape2D - -var is_dead = false - -######################################################## -# ready - - -func _ready(): - OffscreenIndicator.add(self, { - # could instead depend on a fn like this directly on the passed node - is_active=should_show_offscreen_indicator}) - -func should_show_offscreen_indicator(): - return not machine.state.name == "Dead" - - -######################################################## -# process - -@export var max_y: float = 5000.0 - - -func _process(_delta): - if get_global_position().y >= max_y and not machine.state.name == "Dead": - die(true) - - if player and machine.state.name in ["Idle", "Walk"]: - vision_ray.set_target_position(to_local(player.get_global_position())) - if vision_ray.is_colliding(): - var coll = vision_ray.get_collider() - if is_instance_valid(coll) and coll.is_in_group("player"): - machine.transit("Attack") - - -######################################################## -# movement - -var speed = 50 -var gravity = 900 - -var facing_dir = Vector2.LEFT -var move_dir - -@onready var arrow_position = $ArrowPosition -@onready var front_ray = $FrontRay -@onready var vision_box = $VisionBox -@onready var vision_ray = $VisionRay - - -func face_dir(dir): - if dir == Vector2.RIGHT: - face_left() - elif dir == Vector2.LEFT: - face_right() - - -func turn(): - if facing_dir == Vector2.RIGHT: - face_left() - elif facing_dir == Vector2.LEFT: - face_right() - - -func face_right(): - facing_dir = Vector2.RIGHT - anim.flip_h = true - - if arrow_position.position.x < 0: - arrow_position.position.x *= -1 - - if front_ray.position.x < 0: - front_ray.position.x *= -1 - - if vision_ray.position.x < 0: - vision_ray.position.x *= -1 - - if vision_box.position.x < 0: - vision_box.position.x *= -1 - - -func face_left(): - facing_dir = Vector2.LEFT - anim.flip_h = false - - if arrow_position.position.x > 0: - arrow_position.position.x *= -1 - - if front_ray.position.x > 0: - front_ray.position.x *= -1 - - if vision_ray.position.x > 0: - vision_ray.position.x *= -1 - - if vision_box.position.x > 0: - vision_box.position.x *= -1 - - -############################################################ -# health - -var initial_health = 2 -@onready var health = initial_health - -signal health_change(health) -signal died - -func take_hit(opts={}): - take_damage(opts) - -func take_damage(opts={}): - var body = opts.get("body") - var d = opts.get("damage", 1) - Juice.freezeframe({name="enemy_damage_hitstop", time_scale=0.2, duration=0.3, trauma=0.3}) - health -= d - health_change.emit(health) - - Sounds.play(Sounds.S.enemy_hit) - - var dir = Vector2.DOWN - if body and body.global_position.x > global_position.x: - dir = Vector2.LEFT - elif body: - dir = Vector2.RIGHT - - machine.transit("Knockback", {"dir": dir, "dead": health <= 0}) - - -func die(remove_at = false): - is_dead = true - died.emit() - - Sounds.play(Sounds.S.enemy_dead) - if remove_at: - queue_free() - - -######################################################## -# vision box - -var player - - -func _on_VisionBox_body_entered(body: Node): - if body.is_in_group("player") and not body.is_dead: - Sounds.play(Sounds.S.enemy_sees_you) - player = body - - -func _on_VisionBox_body_exited(body: Node): - if body.is_in_group("player") and not body.is_dead: - player = null - - -######################################################## -# fire - -@onready var arrow_scene = preload("res://src/dino/weapons/arrow/Arrow.tscn") -var arrow_impulse = 800 -var fire_rate = 0.2 -var arrow_knockback = 2 - - -func fire_at_player(): - if player and not player.is_dead and is_instance_valid(player): - var arrow = arrow_scene.instantiate() - arrow.position = arrow_position.get_global_position() - arrow.add_collision_exception_with(self) - U.add_child_to_level(self, arrow) - - var angle_to_player = arrow.position.direction_to(player.global_position + Vector2(0, -15)) - - arrow.rotation = angle_to_player.angle() - arrow.apply_impulse(angle_to_player * arrow_impulse, Vector2.ZERO) - - Sounds.play(Sounds.S.fire) diff --git a/src/dino/entities/targets/Target.gd b/src/dino/entities/targets/Target.gd index e3d7806f..cf27434d 100644 --- a/src/dino/entities/targets/Target.gd +++ b/src/dino/entities/targets/Target.gd @@ -12,10 +12,7 @@ var is_dead = false func _ready(): anim.animation_finished.connect(_animation_finished) - OffscreenIndicator.add(self) - # TODO how to work with animations and positions after regen bug - # U.animate(self) - # U.animate_rotate(self) + OffscreenIndicator.add(self, {label="Target"}) area_entered.connect(_on_body_entered) body_entered.connect(_on_body_entered) diff --git a/src/dino/entities/targets/Target.tscn b/src/dino/entities/targets/Target.tscn index 36aee807..9d925b01 100644 --- a/src/dino/entities/targets/Target.tscn +++ b/src/dino/entities/targets/Target.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=5 format=3 uid="uid://c4inidtgbuwlg"] +[gd_scene load_steps=4 format=3 uid="uid://c4inidtgbuwlg"] [ext_resource type="Script" path="res://src/dino/entities/targets/Target.gd" id="1_7124b"] [ext_resource type="SpriteFrames" uid="uid://d1uqrh57tjmm6" path="res://src/dino/entities/targets/target_sprite_frames.tres" id="2_c7m12"] diff --git a/src/dino/pickups/leaves/LeafEntity.gd b/src/dino/pickups/leaves/LeafEntity.gd index 50324f58..3cb9c2ca 100644 --- a/src/dino/pickups/leaves/LeafEntity.gd +++ b/src/dino/pickups/leaves/LeafEntity.gd @@ -13,7 +13,7 @@ extends WoodsEntity func all_anims() -> Array: return [anim_green, anim_greenred, anim_purple, anim_redorange, anim_yellow] -signal caught +signal caught(leaf) var is_caught = false var anim @@ -23,6 +23,7 @@ func _ready(): anim = U.rand_of(all_anims()) super._ready() render() + OffscreenIndicator.add(self, {label="Leaf"}) func hide_anims(): all_anims().map(func(a): @@ -40,7 +41,7 @@ func render(): func kill(): is_caught = true - caught.emit() + caught.emit(self) animate_collected() func animate_collected(): diff --git a/src/dino/vania/VaniaGame.tscn b/src/dino/vania/VaniaGame.tscn index 164fea6d..ea0090aa 100644 --- a/src/dino/vania/VaniaGame.tscn +++ b/src/dino/vania/VaniaGame.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://src/dino/vania/VaniaGame.gd" id="1_rrc8s"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="2_ae8tp"] -[ext_resource type="Resource" uid="uid://x22mhotva8q3" path="res://src/dino/modes/runner/mapdefs/Tower.tres" id="2_u5nad"] +[ext_resource type="Resource" uid="uid://4ee51xr80oda" path="res://src/dino/modes/runner/mapdefs/Woods.tres" id="2_p5qke"] [ext_resource type="PackedScene" uid="uid://sisqkgg1lwpf" path="res://src/dino/hud/DinoHUD.tscn" id="5_r75pq"] [ext_resource type="PackedScene" uid="uid://dch8dyylb7526" path="res://addons/MetroidvaniaSystem/Template/Nodes/Minimap.tscn" id="6_jluxu"] [ext_resource type="PackedScene" uid="uid://dq1rff2gu3q68" path="res://src/dino/menus/controls/ActionInputIcon.tscn" id="8_g3klb"] @@ -34,7 +34,7 @@ shader_parameter/grayscale = 0.0 [node name="VaniaGame" type="Node2D" groups=["vania_game"]] script = ExtResource("1_rrc8s") -map_def = ExtResource("2_u5nad") +map_def = ExtResource("2_p5qke") [node name="Camera2D" type="Camera2D" parent="."] ignore_rotation = false