Initial commit

This commit is contained in:
2024-02-08 22:16:58 +01:00
commit 89e97a200c
524 changed files with 15626 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
extends CPUParticles2D
func _ready():
emitting = true
await get_tree().create_timer(0.8).timeout
queue_free()
pass # Replace with function body.

135
scenes/characters/Enemy.gd Normal file
View File

@@ -0,0 +1,135 @@
extends CharacterBody2D
class_name Enemy
"""
This implements a very rudimentary state machine. There are better implementations
in the AssetLib if you want to make something more complex. Also it shares code with Enemy.gd
and probably both should extend some parent script
"""
@export var WALK_SPEED: int = 350
@export var ROLL_SPEED: int = 1000
@export var hitpoints: int = 3
var despawn_fx = preload("res://scenes/misc/DespawnFX.tscn")
var linear_vel = Vector2()
@export var facing = "down" # (String, "up", "down", "left", "right")
var anim = ""
var new_anim = ""
enum { STATE_IDLE, STATE_WALKING, STATE_ATTACK, STATE_ROLL, STATE_DIE, STATE_HURT }
var state = STATE_IDLE
func _ready():
randomize()
func _physics_process(_delta):
match state:
STATE_IDLE:
new_anim = "idle_" + facing
STATE_WALKING:
set_velocity(linear_vel)
move_and_slide()
linear_vel = velocity
var target_speed = Vector2()
if facing == "down":
target_speed += Vector2.DOWN
if facing == "left":
target_speed += Vector2.LEFT
if facing == "right":
target_speed += Vector2.RIGHT
if facing == "up":
target_speed += Vector2.UP
target_speed *= WALK_SPEED
linear_vel = linear_vel.lerp(target_speed, 0.9)
new_anim = ""
if abs(linear_vel.x) > abs(linear_vel.y):
if linear_vel.x < 0:
facing = "left"
if linear_vel.x > 0:
facing = "right"
if abs(linear_vel.y) > abs(linear_vel.x):
if linear_vel.y < 0:
facing = "up"
if linear_vel.y > 0:
facing = "down"
if linear_vel != Vector2.ZERO:
new_anim = "walk_" + facing
else:
state = STATE_IDLE
pass
STATE_ATTACK:
new_anim = "slash_" + facing
pass
STATE_ROLL:
set_velocity(linear_vel)
move_and_slide()
linear_vel = velocity
var target_speed = Vector2()
if facing == "up":
target_speed.y = -1
if facing == "down":
target_speed.y = 1
if facing == "left":
target_speed.x = -1
if facing == "right":
target_speed.x = 1
target_speed *= ROLL_SPEED
linear_vel = linear_vel.lerp(target_speed, 0.9)
new_anim = "roll"
pass
STATE_DIE:
new_anim = "die"
STATE_HURT:
new_anim = "hurt"
if new_anim != anim:
anim = new_anim
$anims.play(anim)
pass
func goto_idle():
state = STATE_IDLE
func _on_state_changer_timeout():
$state_changer.wait_time = randf_range(1.0, 5.0)
#state = randi() %3
state = STATE_ATTACK
facing = ["left", "right", "up", "down"][randi()%3]
pass # Replace with function body.
func _on_hurtbox_area_entered(area):
if state != STATE_DIE and area.name == "player_sword":
hitpoints -= 1
var pushback_direction = (global_position - area.global_position).normalized()
set_velocity(pushback_direction * 5000)
move_and_slide()
state = STATE_HURT
$state_changer.start()
if hitpoints <= 0:
$state_changer.stop()
state = STATE_DIE
pass # Replace with function body.
func despawn():
var despawn_particles = despawn_fx.instantiate()
get_parent().add_child(despawn_particles)
despawn_particles.global_position = global_position
if has_node("item_spawner"):
get_node("item_spawner").spawn()
queue_free()
pass

1226
scenes/characters/Enemy.tscn Normal file

File diff suppressed because it is too large Load Diff

54
scenes/characters/Npc.gd Normal file
View File

@@ -0,0 +1,54 @@
extends Area2D
"""
It just wraps around a sequence of dialogs. If it contains a child node named 'Quest'
which should be an instance of Quest.gd it'll become a quest giver and show whatever
text Quest.process() returns
"""
var active = false
@export var character_name: String = "Nameless NPC"
@export var dialogs = ["..."] # (Array, String, MULTILINE)
var current_dialog = 0
# Called when the node enters the scene tree for the first time.
func _ready():
randomize()
# warning-ignore:return_value_discarded
body_entered.connect(_on_body_entered)
# warning-ignore:return_value_discarded
body_exited.connect(_on_body_exited)
pass # Replace with function body.
func _input(event):
# Bail if npc not active (player not inside the collider)
if not active:
return
# Bail if Dialogs singleton is showing another dialog
if Dialogs.active:
return
# Bail if the event is not a pressed "interact" action
if not event.is_action_pressed("interact"):
return
# If the character is a questgiver delegate getting the text
# to the Quest node, show it and end the function
if has_node("Quest"):
var quest_dialog = get_node("Quest").process()
if quest_dialog != "":
Dialogs.show_dialog(quest_dialog, character_name)
return
# If we reached here and there are generic dialogs to show, rotate among them
if not dialogs.is_empty():
Dialogs.show_dialog(dialogs[current_dialog], character_name)
current_dialog = wrapi(current_dialog + 1, 0, dialogs.size())
func _on_body_entered(body):
if body is Player:
active = true
func _on_body_exited(body):
if body is Player:
active = false

View File

@@ -0,0 +1,57 @@
[gd_scene load_steps=5 format=3 uid="uid://b7p1kli4j11fo"]
[ext_resource type="Script" path="res://scenes/characters/Npc.gd" id="1"]
[sub_resource type="Animation" id="1"]
resource_name = "idle"
length = 2.0
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0.564087, 2.50995), Vector2(0.564087, 4.44937)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:scale")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 0.944064)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_k00qb"]
_data = {
"idle": SubResource("1")
}
[sub_resource type="RectangleShape2D" id="2"]
size = Vector2(163.651, 144.825)
[node name="NPC" type="Area2D"]
script = ExtResource("1")
[node name="sprite" type="Sprite2D" parent="."]
position = Vector2(0.564087, 2.50995)
offset = Vector2(3.3446, -93.3282)
[node name="anims" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_k00qb")
}
autoplay = "idle"
[node name="trigger" type="CollisionShape2D" parent="."]
position = Vector2(0, 88.8296)
shape = SubResource("2")

203
scenes/characters/Player.gd Normal file
View File

@@ -0,0 +1,203 @@
extends CharacterBody2D
class_name Player
"""
This implements a very rudimentary state machine. There are better implementations
in the AssetLib if you want to make something more complex. Also it shares code with Enemy.gd
and probably both should extend some parent script
"""
@export var WALK_SPEED: int = 70 # pixels per second
@export var ROLL_SPEED: int = 1000 # pixels per second
@export var hitpoints: int = 3
var linear_vel = Vector2()
var roll_direction = Vector2.DOWN
signal health_changed(current_hp)
var despawn_fx = preload("res://scenes/misc/DespawnFX.tscn")
var anim = ""
var new_anim = ""
const N = Vector2.UP
const NE = Vector2(cos(1*PI/4),sin(1*PI/4))
const E = Vector2.RIGHT
const SE = Vector2(cos(7*PI/4),sin(7*PI/4))
const S = Vector2.DOWN
const SW = Vector2(cos(5*PI/4),sin(5*PI/4))
const W = Vector2.LEFT
const NW = Vector2(cos(3*PI/4),sin(3*PI/4))
enum { STATE_BLOCKED, STATE_IDLE, STATE_WALKING, STATE_ATTACK, STATE_ROLL, STATE_DIE, STATE_HURT }
@export var facing = "S" # (String, "up", "down", "left", "right")
var state = STATE_IDLE
var direction = S
# Move the player to the corresponding spawnpoint, if any and connect to the dialog system
func _ready():
var spawnpoints = get_tree().get_nodes_in_group("spawnpoints")
for spawnpoint in spawnpoints:
if spawnpoint.name == Globals.spawnpoint:
global_position = spawnpoint.global_position
break
if not (
Dialogs.dialog_started.connect(_on_dialog_started) == OK and
Dialogs.dialog_ended.connect(_on_dialog_ended) == OK ):
printerr("Error connecting to dialog system")
pass
func _physics_process(_delta):
## PROCESS STATES
match state:
STATE_BLOCKED:
# new_anim = "idle_" + facing
$anims.stop()
pass
STATE_IDLE:
if (
Input.is_action_pressed("move_down") or
Input.is_action_pressed("move_left") or
Input.is_action_pressed("move_right") or
Input.is_action_pressed("move_up")
):
state = STATE_WALKING
if Input.is_action_just_pressed("attack"):
state = STATE_ATTACK
# if Input.is_action_just_pressed("roll"):
# state = STATE_ROLL
# roll_direction = Vector2(
# - int( Input.is_action_pressed("move_left") ) + int( Input.is_action_pressed("move_right") ),
# -int( Input.is_action_pressed("move_up") ) + int( Input.is_action_pressed("move_down") )
# ).normalized()
# _update_facing()
# new_anim = "idle_" + facing
$anims.stop()
pass
STATE_WALKING:
if Input.is_action_just_pressed("attack"):
state = STATE_ATTACK
if Input.is_action_just_pressed("roll"):
state = STATE_ROLL
linear_vel = velocity
var target_speed = Vector2(0,0)
if Input.is_action_pressed("move_down"):
target_speed += Vector2.DOWN
if Input.is_action_pressed("move_left"):
target_speed += Vector2.LEFT
if Input.is_action_pressed("move_right"):
target_speed += Vector2.RIGHT
if Input.is_action_pressed("move_up"):
target_speed += Vector2.UP
target_speed = target_speed.normalized() * WALK_SPEED
target_speed.y *= 0.50 # compensa visione isometrica
#linear_vel = linear_vel.linear_interpolate(target_speed, 0.9)
linear_vel = target_speed
set_velocity(linear_vel)
roll_direction = linear_vel.normalized()
move_and_slide()
_update_facing()
if linear_vel.length() > 5:
new_anim = "walk_" + facing
$anims.play()
else:
goto_idle()
pass
STATE_ATTACK:
new_anim = "walk_" + facing # was splash_
pass
STATE_ROLL:
if roll_direction == Vector2.ZERO:
state = STATE_IDLE
else:
set_velocity(linear_vel)
move_and_slide()
linear_vel = velocity
var target_speed = Vector2()
target_speed = roll_direction
target_speed *= ROLL_SPEED
#linear_vel = linear_vel.linear_interpolate(target_speed, 0.9)
linear_vel = target_speed
new_anim = "roll"
STATE_DIE:
new_anim = "die"
STATE_HURT:
new_anim = "hurt"
## UPDATE ANIMATION
if new_anim != anim:
anim = new_anim
$anims.play(anim)
pass
func _on_dialog_started():
state = STATE_BLOCKED
func _on_dialog_ended():
state = STATE_IDLE
## HELPER FUNCS
func goto_idle():
linear_vel = Vector2.ZERO
# new_anim = "idle_" + facing
state = STATE_IDLE
func _update_facing():
if Input.is_action_pressed("move_left"):
facing = "W"
if Input.is_action_pressed("move_right"):
facing = "E"
if Input.is_action_pressed("move_up"):
facing = "N"
if Input.is_action_pressed("move_left"):
facing = "NW"
if Input.is_action_pressed("move_right"):
facing = "NE"
if Input.is_action_pressed("move_down"):
facing = "S"
if Input.is_action_pressed("move_left"):
facing = "SW"
if Input.is_action_pressed("move_right"):
facing = "SE"
func despawn():
var despawn_particles = despawn_fx.instantiate()
get_parent().add_child(despawn_particles)
despawn_particles.global_position = global_position
hide()
await get_tree().create_timer(5.0).timeout
get_tree().reload_current_scene()
pass
func _on_hurtbox_area_entered(area):
if state != STATE_DIE and area.is_in_group("enemy_weapons"):
hitpoints -= 1
emit_signal("health_changed", hitpoints)
var pushback_direction = (global_position - area.global_position).normalized()
set_velocity(pushback_direction * 5000)
move_and_slide()
state = STATE_HURT
if hitpoints <= 0:
state = STATE_DIE
pass

View File

@@ -0,0 +1,806 @@
[gd_scene load_steps=27 format=3 uid="uid://ctd3mgp0s172q"]
[ext_resource type="Script" path="res://scenes/characters/Player.gd" id="2"]
[ext_resource type="Texture2D" uid="uid://3au1pfa7jj5l" path="res://textures/kid/kid.png" id="2_rhd3n"]
[ext_resource type="PackedScene" path="res://scenes/characters/debug_character.tscn" id="3"]
[sub_resource type="CapsuleShape2D" id="1"]
radius = 9.00003
height = 42.119
[sub_resource type="Animation" id="2"]
resource_name = "die"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [9, 11, 13, 12, 9, 11, 13, 12, 9]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4, 0.7),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 1,
"values": [true, false, true, false]
}
tracks/2/type = "method"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"despawn"
}]
}
[sub_resource type="Animation" id="3"]
resource_name = "hurt"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(2, 1),
"update": 0,
"values": [Color(0, 0, 0, 1), Color(1, 1, 1, 1)]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"goto_idle"
}]
}
[sub_resource type="Animation" id="6"]
resource_name = "idle_E"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [154, 163]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("hurtbox:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0, 0), Vector2(0, -3.49902)]
}
[sub_resource type="Animation" id="7"]
resource_name = "idle_N"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [22, 43]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("hurtbox:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0, 0), Vector2(0, -3.49902)]
}
[sub_resource type="Animation" id="4"]
resource_name = "idle_S"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [88, 97]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("hurtbox:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0, 0), Vector2(0, -3.49902)]
}
[sub_resource type="Animation" id="5"]
resource_name = "idle_W"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [11, 21]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("hurtbox:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0, 0), Vector2(0, -3.49902)]
}
[sub_resource type="Animation" id="8"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [2]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("player_sword:monitorable")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("sprite:modulate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("hurtbox:position")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(0, 0)]
}
[sub_resource type="Animation" id="9"]
length = 0.5
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [15, 16, 17, 18, 19]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "method"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.5),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"goto_idle"
}]
}
[sub_resource type="Animation" id="10"]
length = 0.3
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "method"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.3),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"goto_idle"
}]
}
[sub_resource type="Animation" id="11"]
length = 0.3
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [3, 4, 5]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/2/type = "method"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.3),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"goto_idle"
}]
}
[sub_resource type="Animation" id="12"]
length = 0.3
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [3, 4, 5]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "method"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.3),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"goto_idle"
}]
}
[sub_resource type="Animation" id="13"]
length = 0.3
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [6, 7, 8]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "method"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.3),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"goto_idle"
}]
}
[sub_resource type="Animation" id="Animation_qdqhh"]
resource_name = "walk_E"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [154, 175]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_ef7ow"]
resource_name = "walk_N"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [22, 43]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_m2uo2"]
resource_name = "walk_NE"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [66, 87]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_bcwxc"]
resource_name = "walk_NW"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [44, 65]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_ixjcm"]
resource_name = "walk_S"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [88, 109]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_fq7dv"]
resource_name = "walk_SE"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [132, 153]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_ek8m1"]
resource_name = "walk_SW"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [110, 131]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="14"]
resource_name = "walk_W"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("sprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 21]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("sprite:flip_h")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_qdvjb"]
_data = {
"die": SubResource("2"),
"hurt": SubResource("3"),
"idle_E": SubResource("6"),
"idle_N": SubResource("7"),
"idle_S": SubResource("4"),
"idle_W": SubResource("5"),
"reset": SubResource("8"),
"roll": SubResource("9"),
"slash_down": SubResource("10"),
"slash_left": SubResource("11"),
"slash_right": SubResource("12"),
"slash_up": SubResource("13"),
"walk_E": SubResource("Animation_qdqhh"),
"walk_N": SubResource("Animation_ef7ow"),
"walk_NE": SubResource("Animation_m2uo2"),
"walk_NW": SubResource("Animation_bcwxc"),
"walk_S": SubResource("Animation_ixjcm"),
"walk_SE": SubResource("Animation_fq7dv"),
"walk_SW": SubResource("Animation_ek8m1"),
"walk_W": SubResource("14")
}
[sub_resource type="CapsuleShape2D" id="18"]
radius = 25.0
height = 80.0
[node name="Player" type="CharacterBody2D" groups=["player"]]
position = Vector2(585.638, 309.087)
script = ExtResource("2")
[node name="sprite" type="Sprite2D" parent="."]
position = Vector2(6.362, -53.087)
scale = Vector2(2, 2)
texture = ExtResource("2_rhd3n")
hframes = 22
vframes = 8
frame = 88
[node name="hitbox" type="CollisionShape2D" parent="."]
visible = false
position = Vector2(0.421509, -10.1996)
rotation = 1.5708
shape = SubResource("1")
[node name="player_sword" type="Area2D" parent="."]
visible = false
position = Vector2(6.362, -53.087)
[node name="anims" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_qdvjb")
}
[node name="camera" type="Camera2D" parent="."]
position = Vector2(6.362, -53.087)
zoom = Vector2(0.5, 0.5)
[node name="debug" parent="." instance=ExtResource("3")]
path_to_node = NodePath("..")
properties = ["linear_vel", "roll_direction", "facing"]
enabled = false
[node name="hurtbox" type="Area2D" parent="."]
visible = false
[node name="col" type="CollisionShape2D" parent="hurtbox"]
visible = false
position = Vector2(0.362, -48.087)
shape = SubResource("18")
[connection signal="area_entered" from="hurtbox" to="." method="_on_hurtbox_area_entered"]

View File

@@ -0,0 +1,42 @@
extends CanvasLayer
"""
This can be added to any scene and be use to show some properties for debug purposes
"""
@export var path_to_node: NodePath
@export var properties = [] # (Array, String)
@export var enabled: bool = true: get = _get_enabled, set = _set_enabled
var node = null
@onready var stats = $Control/stats
# Called when the node enters the scene tree for the first time.
func _ready():
node = get_node(path_to_node)
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
var output = ""
for property in properties:
if not property in node:
printerr("Property %s not found in %s" % [property, node])
properties.erase(property)
continue
output += property + ": " + str(node[property]) + "\n"
stats.text = output
pass
func _set_enabled(value):
enabled = value
if value == true:
$Control.show()
set_process(true)
else:
$Control.hide()
set_process(false)
func _get_enabled():
return enabled

View File

@@ -0,0 +1,29 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://fonts/Candy Demo.ttf" type="FontFile" id=1]
[ext_resource path="res://scenes/characters/debug_character.gd" type="Script" id=2]
[sub_resource type="FontFile" id=1]
size = 32
font_data = ExtResource( 1 )
[node name="debug" type="CanvasLayer"]
script = ExtResource( 2 )
[node name="Control" type="Control" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="stats" type="Label" parent="Control"]
offset_left = 17.0
offset_top = 16.0
offset_right = 285.0
offset_bottom = 211.0
theme_override_fonts/font = SubResource( 1 )
theme_override_colors/font_color = Color( 0.803922, 0.0784314, 0.0784314, 1 )
__meta__ = {
"_edit_use_anchors_": false
}