Projectile weapon base functionality, damage per second calculation command, rebalancing...
This commit is contained in:
parent
7c771b37b9
commit
d424c103f1
9 changed files with 96 additions and 20 deletions
|
|
@ -135,6 +135,7 @@ limbo_console_search_history={
|
||||||
|
|
||||||
3d_physics/layer_1="player"
|
3d_physics/layer_1="player"
|
||||||
3d_physics/layer_2="enemies"
|
3d_physics/layer_2="enemies"
|
||||||
|
3d_physics/layer_5="world geometry"
|
||||||
3d_physics/layer_9="camera"
|
3d_physics/layer_9="camera"
|
||||||
|
|
||||||
[navigation]
|
[navigation]
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
size = Vector3(0.65, 1, 0.65)
|
size = Vector3(0.65, 1, 0.65)
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_yqjtg"]
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_yqjtg"]
|
||||||
radius = 0.15
|
radius = 0.25
|
||||||
height = 1.0
|
height = 1.0
|
||||||
|
|
||||||
[node name="Dreamer" type="CharacterBody3D" unique_id=272925354]
|
[node name="Dreamer" type="CharacterBody3D" unique_id=272925354]
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,28 @@
|
||||||
[gd_scene format=3 uid="uid://ufm8kssdh8vx"]
|
[gd_scene format=3 uid="uid://ufm8kssdh8vx"]
|
||||||
|
|
||||||
[node name="Bullet" type="Node3D" unique_id=1536641450]
|
[ext_resource type="Script" uid="uid://bgnro2l31f3y1" path="res://scripts/projectiles/bullet.gd" id="1_yvfy2"]
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="CSGCylinder3D" parent="." unique_id=1706082204]
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yvfy2"]
|
||||||
|
transparency = 3
|
||||||
|
alpha_hash_scale = 1.0
|
||||||
|
alpha_antialiasing_mode = 0
|
||||||
|
emission_enabled = true
|
||||||
|
emission = Color(1, 0.9333334, 0, 1)
|
||||||
|
|
||||||
|
[node name="Bullet" type="Node3D" unique_id=1536641450]
|
||||||
|
script = ExtResource("1_yvfy2")
|
||||||
|
|
||||||
|
[node name="Line" type="CSGCylinder3D" parent="." unique_id=1706082204]
|
||||||
transform = Transform3D(4.371139e-08, -1, 8.742278e-08, -1, -4.371139e-08, 0, 3.821371e-15, -8.742278e-08, -1, 0, 0, 0)
|
transform = Transform3D(4.371139e-08, -1, 8.742278e-08, -1, -4.371139e-08, 0, 3.821371e-15, -8.742278e-08, -1, 0, 0, 0)
|
||||||
radius = 0.05
|
radius = 0.05
|
||||||
sides = 5
|
sides = 5
|
||||||
smooth_faces = false
|
smooth_faces = false
|
||||||
|
material = SubResource("StandardMaterial3D_yvfy2")
|
||||||
|
|
||||||
[node name="Hit" type="RayCast3D" parent="." unique_id=10285465]
|
[node name="Hit" type="RayCast3D" parent="." unique_id=10285465]
|
||||||
transform = Transform3D(-4.371139e-08, 1, -2.9802322e-08, 0, 2.9802322e-08, 1, 1, 4.371139e-08, -1.3027009e-15, 0, 0, 0)
|
transform = Transform3D(-4.371139e-08, 1, -2.9802322e-08, 0, 2.9802322e-08, 1, 1, 4.371139e-08, -1.3027009e-15, 0, 0, 0)
|
||||||
|
exclude_parent = false
|
||||||
target_position = Vector3(0, -500, 0)
|
target_position = Vector3(0, -500, 0)
|
||||||
collision_mask = 19
|
collision_mask = 19
|
||||||
|
hit_from_inside = true
|
||||||
debug_shape_custom_color = Color(0, 1, 0, 1)
|
debug_shape_custom_color = Color(0, 1, 0, 1)
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ func _physics_process(delta: float) -> void:
|
||||||
|
|
||||||
if (player.global_position - global_position).length() < 1:
|
if (player.global_position - global_position).length() < 1:
|
||||||
state = STATE_CHARGE_ATTACK
|
state = STATE_CHARGE_ATTACK
|
||||||
state_timer = 1
|
state_timer = 0.5
|
||||||
|
|
||||||
$DreamerBody/Animator.set("parameters/charge_weapon/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE)
|
$DreamerBody/Animator.set("parameters/charge_weapon/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE)
|
||||||
elif state == STATE_CHARGE_ATTACK:
|
elif state == STATE_CHARGE_ATTACK:
|
||||||
|
|
@ -164,6 +164,7 @@ func _physics_process(delta: float) -> void:
|
||||||
if health <= 0:
|
if health <= 0:
|
||||||
if (state_timer <= 0) or is_on_floor():
|
if (state_timer <= 0) or is_on_floor():
|
||||||
state = STATE_DEAD
|
state = STATE_DEAD
|
||||||
|
collision_layer = 0
|
||||||
elif state_timer <= 0:
|
elif state_timer <= 0:
|
||||||
$DreamerBody/Animator.set("parameters/hit/blend_amount", 0.0)
|
$DreamerBody/Animator.set("parameters/hit/blend_amount", 0.0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ const weapons = {
|
||||||
"basic_sword": {
|
"basic_sword": {
|
||||||
"combo_weapon": true,
|
"combo_weapon": true,
|
||||||
"hits_to_finish": 3,
|
"hits_to_finish": 3,
|
||||||
"swing_time": 0.16,
|
"swing_time": 0.2,
|
||||||
"combo_timeout": 0.35,
|
"combo_timeout": 0.35,
|
||||||
"swing_time_combo_finish": 0.42,
|
"swing_time_combo_finish": 0.42,
|
||||||
"damage": 15,
|
"damage": 15,
|
||||||
|
|
@ -20,20 +20,20 @@ const weapons = {
|
||||||
"attack_swooshy": "slash",
|
"attack_swooshy": "slash",
|
||||||
},
|
},
|
||||||
"basic_knife": {
|
"basic_knife": {
|
||||||
"combo_weapon": true,
|
"combo_weapon": false,
|
||||||
"hits_to_finish": 10,
|
"hits_to_finish": 15,
|
||||||
"swing_time": 0.06,
|
"swing_time": 0.13,
|
||||||
"combo_timeout": 0.25,
|
"combo_timeout": 0.25,
|
||||||
"swing_time_combo_finish": 0.66,
|
"swing_time_combo_finish": 0.66,
|
||||||
"damage": 20,
|
"damage": 5,
|
||||||
"damage_mid_combo": 5,
|
"damage_mid_combo": 5,
|
||||||
|
|
||||||
"knockback": 2.5,
|
"knockback": 2.5,
|
||||||
"knockback_mid_combo": 0.3,
|
"knockback_mid_combo": 0.3,
|
||||||
"stun_time": 0.4,
|
"stun_time": 0.4,
|
||||||
|
|
||||||
"range": 1,
|
"range": 0.6,
|
||||||
"width": 1,
|
"width": 0.6,
|
||||||
|
|
||||||
"attack_swooshy": "slash",
|
"attack_swooshy": "slash",
|
||||||
"attack_swooshy_scale": Vector3(0.8, 0.6, 1),
|
"attack_swooshy_scale": Vector3(0.8, 0.6, 1),
|
||||||
|
|
@ -41,9 +41,9 @@ const weapons = {
|
||||||
"basic_hammer": {
|
"basic_hammer": {
|
||||||
"combo_weapon": true,
|
"combo_weapon": true,
|
||||||
"hits_to_finish": 2,
|
"hits_to_finish": 2,
|
||||||
"swing_time": 0.6,
|
"swing_time": 0.45,
|
||||||
"combo_timeout": 1,
|
"combo_timeout": 1,
|
||||||
"swing_time_combo_finish": 1,
|
"swing_time_combo_finish": 0.9,
|
||||||
"damage": 35,
|
"damage": 35,
|
||||||
"damage_mid_combo": 25,
|
"damage_mid_combo": 25,
|
||||||
|
|
||||||
|
|
@ -59,12 +59,12 @@ const weapons = {
|
||||||
|
|
||||||
"basic_spear": {
|
"basic_spear": {
|
||||||
"combo_weapon": true,
|
"combo_weapon": true,
|
||||||
"hits_to_finish": 3,
|
"hits_to_finish": 4,
|
||||||
"swing_time": 0.16,
|
"swing_time": 0.2,
|
||||||
"combo_timeout": 0.35,
|
"combo_timeout": 0.35,
|
||||||
"swing_time_combo_finish": 0.55,
|
"swing_time_combo_finish": 0.55,
|
||||||
"damage": 10,
|
"damage": 15,
|
||||||
"damage_mid_combo": 7,
|
"damage_mid_combo": 9,
|
||||||
|
|
||||||
"knockback": 3.5,
|
"knockback": 3.5,
|
||||||
"knockback_mid_combo": 0.75,
|
"knockback_mid_combo": 0.75,
|
||||||
|
|
@ -82,7 +82,7 @@ const weapons = {
|
||||||
"max_pierces": 3,
|
"max_pierces": 3,
|
||||||
"knockback": 2.5,
|
"knockback": 2.5,
|
||||||
"recharge_time": 15,
|
"recharge_time": 15,
|
||||||
"bullet": preload("res://scenes/projectiles/bullet.tscn"),
|
"projectile": preload("res://scenes/projectiles/bullet.tscn"),
|
||||||
|
|
||||||
"attack_swooshy": "pierce",
|
"attack_swooshy": "pierce",
|
||||||
"attack_swooshy_scale": Vector3(1.5, 1, 1),
|
"attack_swooshy_scale": Vector3(1.5, 1, 1),
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,13 @@ var iframes = 0
|
||||||
var knockback_time = 0
|
var knockback_time = 0
|
||||||
var health = 100
|
var health = 100
|
||||||
|
|
||||||
|
var slots = [
|
||||||
|
{
|
||||||
|
"id": "basic_sword",
|
||||||
|
"cooldown_time": 0,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
var combo_hits = 0
|
var combo_hits = 0
|
||||||
var combo_timer = 0
|
var combo_timer = 0
|
||||||
var swing_timer = 0
|
var swing_timer = 0
|
||||||
|
|
@ -71,9 +78,21 @@ func set_weapon(weapon_name: String = "basic_sword") -> void:
|
||||||
|
|
||||||
$HitCollision/Shape.position.x = range * -0.5
|
$HitCollision/Shape.position.x = range * -0.5
|
||||||
|
|
||||||
|
func dps(weapon_name: String = "basic_sword") -> void:
|
||||||
|
var damage = get_weapon_info(weapon_name, "damage")
|
||||||
|
var time = get_weapon_info(weapon_name, "swing_time")
|
||||||
|
|
||||||
|
if get_weapon_info(weapon_name, "combo_weapon"):
|
||||||
|
var combo_damage = get_weapon_info(weapon_name, "damage_mid_combo") * get_weapon_info(weapon_name, "hits_to_finish")
|
||||||
|
time *= float(get_weapon_info(weapon_name, "hits_to_finish"))
|
||||||
|
time += float(get_weapon_info(weapon_name, "swing_time_combo_finish"))
|
||||||
|
|
||||||
|
LimboConsole.print_line(str(damage / time))
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
LimboConsole.register_command(hit_me)
|
LimboConsole.register_command(hit_me)
|
||||||
LimboConsole.register_command(set_weapon)
|
LimboConsole.register_command(set_weapon)
|
||||||
|
LimboConsole.register_command(dps)
|
||||||
set_weapon(current_weapon)
|
set_weapon(current_weapon)
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
|
|
@ -246,7 +265,13 @@ func _process(delta: float) -> void:
|
||||||
combo_hits = 0
|
combo_hits = 0
|
||||||
|
|
||||||
if get_my_weapon_info("ranged_weapon"):
|
if get_my_weapon_info("ranged_weapon"):
|
||||||
pass
|
var projectile = get_my_weapon_info("projectile").instantiate()
|
||||||
|
|
||||||
|
game.add_child(projectile)
|
||||||
|
projectile.global_position = global_position
|
||||||
|
projectile.rotation = $HitCollision.rotation
|
||||||
|
|
||||||
|
projectile.pow()
|
||||||
else:
|
else:
|
||||||
for body in hits:
|
for body in hits:
|
||||||
if body == self: continue
|
if body == self: continue
|
||||||
|
|
|
||||||
35
scripts/projectiles/bullet.gd
Normal file
35
scripts/projectiles/bullet.gd
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
extends Node3D
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func pow() -> void:
|
||||||
|
var going = true
|
||||||
|
|
||||||
|
while going:
|
||||||
|
$Hit.force_raycast_update()
|
||||||
|
var hit = $Hit.get_collider()
|
||||||
|
|
||||||
|
if not hit:
|
||||||
|
print("hit nothing")
|
||||||
|
break
|
||||||
|
|
||||||
|
if "health" in hit:
|
||||||
|
hit.health -= 100
|
||||||
|
if "on_knockback" in hit: hit.on_knockback()
|
||||||
|
print(hit.name, hit.health)
|
||||||
|
else:
|
||||||
|
print("no health in hit: ", hit.name)
|
||||||
|
break
|
||||||
|
|
||||||
|
$Hit.add_exception(hit)
|
||||||
|
|
||||||
|
$Hit.force_raycast_update()
|
||||||
|
var final_point = $Hit.get_collision_point()
|
||||||
|
|
||||||
|
$Line.position.x = -(final_point - global_position).length() / 2.0
|
||||||
|
$Line.height = (final_point - global_position).length()
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(delta: float) -> void:
|
||||||
|
$Line.radius -= delta * 0.2
|
||||||
|
|
||||||
|
if $Line.radius <= 0.001: queue_free()
|
||||||
1
scripts/projectiles/bullet.gd.uid
Normal file
1
scripts/projectiles/bullet.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bgnro2l31f3y1
|
||||||
Loading…
Reference in a new issue