1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-28 06:51:54 +08:00

feat(武器系统): 添加神手玉武器并完善格挡机制

添加新武器"神手玉",实现不同类型的攻击格挡效果:
- 近战挥舞:化解伤害
- 近战戳刺:反弹伤害并击退
- 远程射弹:概率弹反
- 猛冲攻击:反弹速度
- 吐息攻击:产生击退
- 魔法/召唤攻击:少量储能

调整Parry.gd的相机震动参数,增加BulletBase的MotionType枚举值STAB,完善Parrier.gd对不同攻击类型的处理逻辑。同时添加Debug测试boss选项,修复AcidS.gd的缩进问题。
This commit is contained in:
2026-05-08 15:43:55 +08:00
parent c079c20f28
commit e8413dd01b
14 changed files with 147 additions and 43 deletions
+7 -8
View File
@@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://clr5pbkifgear"]
[gd_scene format=3 uid="uid://clr5pbkifgear"]
[ext_resource type="PackedScene" uid="uid://crtdkysmnkith" path="res://components/Abstracts/BulletBase.tscn" id="1_qpsi6"]
[ext_resource type="Script" uid="uid://dl7d0v7f2uute" path="res://scripts/Contents/Bullets/AcidStorm.gd" id="2_daxsl"]
@@ -104,22 +104,21 @@ _data = {
[sub_resource type="CircleShape2D" id="CircleShape2D_daxsl"]
radius = 59.008472
[node name="AcidStorm" instance=ExtResource("1_qpsi6")]
[node name="AcidStorm" unique_id=61904763 instance=ExtResource("1_qpsi6")]
script = ExtResource("2_daxsl")
speed = 2.5
motionType = 3
penerate = 1.0
autoSpawnAnimation = true
freeAfterSpawn = true
[node name="texture" parent="." index="0"]
[node name="texture" parent="." index="0" unique_id=162977358]
scale = Vector2(0.2, 0.2)
sprite_frames = SubResource("SpriteFrames_daxsl")
[node name="animator" parent="texture" index="0"]
libraries = {
&"": SubResource("AnimationLibrary_5atmc")
}
[node name="animator" parent="texture" index="0" unique_id=1114087117]
libraries/ = SubResource("AnimationLibrary_5atmc")
[node name="hitbox" parent="." index="1"]
[node name="hitbox" parent="." index="1" unique_id=175349408]
shape = SubResource("CircleShape2D_daxsl")
disabled = true
+24
View File
@@ -68,6 +68,18 @@ tracks/4/keys = {
"update": 1,
"values": [true]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("%texture/..:motionType")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_nqryj"]
resource_name = "destroy"
@@ -203,6 +215,18 @@ tracks/7/keys = {
"update": 1,
"values": [false, true]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("%texture/..:motionType")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0, 1.7),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 6]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_ccsa1"]
_data = {
+26 -2
View File
@@ -55,6 +55,18 @@ tracks/3/keys = {
"update": 1,
"values": [0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("%texture/..:motionType")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_oinqg"]
resource_name = "destroy"
@@ -151,6 +163,18 @@ tracks/5/keys = {
"method": &"generateShadow"
}]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("%texture/..:motionType")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.3, 1.45),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [6, 0, 6]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_w1utg"]
_data = {
@@ -186,8 +210,8 @@ texture = ExtResource("2_wwxm2")
[node name="audio" type="AudioStreamPlayer2D" parent="texture/anchor/textureSword" index="0" unique_id=167399724]
[node name="hitbox" parent="." index="1" unique_id=175349408 node_paths=PackedStringArray("target")]
position = Vector2(150, 0)
rotation = 1.5707964
position = Vector2(299.99997, 0.1221919)
rotation = 0.00040731629
shape = SubResource("CircleShape2D_1sgli")
script = ExtResource("7_1sgli")
target = NodePath("../texture/anchor/textureSword")
+4
View File
@@ -3,9 +3,13 @@
[ext_resource type="PackedScene" uid="uid://bs863g2s8r770" path="res://components/Abstracts/PlayerBase.tscn" id="1_ns0m5"]
[ext_resource type="Script" uid="uid://b8g0hkqvyeptg" path="res://scripts/Contents/Characters/Lynx.gd" id="2_d6nve"]
[ext_resource type="PackedScene" uid="uid://frwt0fgrpskb" path="res://components/Weapons/Meowmere.tscn" id="3_nitbu"]
[ext_resource type="PackedScene" uid="uid://cx7nogfnv7s8t" path="res://components/Weapons/Tree.tscn" id="4_7h885"]
[node name="Lynx" unique_id=1711205167 instance=ExtResource("1_ns0m5")]
script = ExtResource("2_d6nve")
displayName = "猞猁"
[node name="Meowmere" parent="weaponStore" index="0" unique_id=1965287972 instance=ExtResource("3_nitbu")]
[node name="Tree" parent="weaponStore" index="1" unique_id=185228402 instance=ExtResource("4_7h885")]
debugRebuild = false
@@ -298,13 +298,15 @@ size_flags_horizontal = 3
theme = ExtResource("4_lfxcn")
selected = 0
allow_reselect = true
item_count = 3
item_count = 4
popup/item_0/text = "无尽波次·标准游戏体验"
popup/item_0/id = 0
popup/item_1/text = "Boss Rush"
popup/item_1/id = 1
popup/item_2/text = "割草·高难度⚠️"
popup/item_2/id = 2
popup/item_3/text = "[Debug] Testboss"
popup/item_3/id = 3
[node name="useTutorial" type="HBoxContainer" parent="content/wrapper/layout/startGameWrapper/start/starter/singleplayer/playConfig" index="2" unique_id=2079979053]
layout_mode = 2
+22 -20
View File
@@ -2,12 +2,12 @@
[ext_resource type="PackedScene" uid="uid://ckq2cq6m23hq3" path="res://components/Abstracts/WeaponCardBase.tscn" id="1_0lbwr"]
[ext_resource type="Script" uid="uid://bqdyhwcd4jwmj" path="res://scripts/Contents/Weapons/Tree.gd" id="2_jsuc8"]
[ext_resource type="Texture2D" uid="uid://74n7umby4d4w" path="res://resources/weapons/ParryCounter.png" id="3_nwamk"]
[ext_resource type="Texture2D" uid="uid://w5yqnejlmfou" path="res://resources/weapons/Jade_神手玉.png" id="3_nwamk"]
[node name="Tree" unique_id=185228402 instance=ExtResource("1_0lbwr")]
script = ExtResource("2_jsuc8")
avatarTexture = ExtResource("3_nwamk")
displayName = "扶桑元神"
displayName = "神手玉"
quality = 4
typeTopic = 3
costBeachball = 900
@@ -24,26 +24,27 @@ storeType = {
"max": 1,
"rate": 2
}
descriptionTemplate = "进行[b]格挡[/b],化解飞来的子弹
descriptionTemplate = "进行[b]格挡[/b],化解敌人的攻击
每成功格挡一次,获得一点[b]气力[/b]。
每拥有一点气力,增加[color=yellow]1[/color]点冲刺速度,闪避穿过敌人时对其贴上一层[b]符咒[/b],符咒会自动引爆,召唤[b]乾坤剑[/b]穿透敌人。
每拥有一点气力,增加[color=yellow]1[/color]点冲刺速度,闪避穿过敌人时对其贴上一层[b]符咒[/b],符咒会自动引爆,召唤[b]乾坤剑[/b]穿透敌人。
近战攻击造成乾坤剑的$rate点伤害。
每次格挡有$rate的概率弹反,子弹弹反后造成乾坤剑的$rate伤害。
每次格挡最多化解$count个子弹,
体内最多储存$max点气力。
每化解[color=yellow]1[/color]点伤害,
乾坤剑造成的伤害+$atk点。
格挡时机越精确,成功率越高。
格挡成功后继续按住攻击可进行[b]蓄力[/b],
其后松开格挡键进行[b]无量反击[/b],
可弹反一切子弹,
但需消耗[color=yellow]1[/color]层气力,
可将弹反的伤害转换为能量。"
对于[b]近战挥舞[/b]攻击,化解本次伤害;
对于[b]近战戳刺[/b]攻击,将本次伤害反弹,造成乾坤剑的$rate伤害并产生大量击退;
对于[b]远程射弹[/b]攻击,化解本次伤害,有$rate的概率发生[b]弹反[/b],子弹弹反后造成乾坤剑的$rate伤害;
对于[b]猛冲[/b]攻击,化解本次伤害,并反弹敌人的速度;
对于[b]吐息[/b]攻击,[color=red]无法化解伤害[/color]但可以对敌人产生少量击退;
对于[b]魔法或召唤[/b]攻击,[color=red]无法化解伤害[/color]但可以少量储能;"
sources = Array[String](["Nine Sols", "Terraria"])
tease = "卸劲反伤"
cooldown = 250.0
debugRebuild = true
[node name="avatar" parent="container/info" parent_id_path=PackedInt32Array(1625294072) index="0" unique_id=1021985889]
texture = ExtResource("3_nwamk")
@@ -52,7 +53,7 @@ texture = ExtResource("3_nwamk")
count = 900
[node name="name" parent="container/info/displays" parent_id_path=PackedInt32Array(784441328) index="0" unique_id=1576068972]
displayName = "扶桑元神"
displayName = "神手玉"
quality = 4
typeTopic = 3
@@ -60,23 +61,24 @@ typeTopic = 3
text = "Nine Sols × Terraria"
[node name="description" parent="container" parent_id_path=PackedInt32Array(575698869) index="2" unique_id=566230682]
text = "[center]进行[b]格挡[/b],化解飞来的子弹
text = "[center]进行[b]格挡[/b],化解敌人的攻击
每成功格挡一次,获得一点[b]气力[/b]。
每拥有一点气力,增加[color=yellow]1[/color]点冲刺速度,闪避穿过敌人时对其贴上一层[b]符咒[/b],符咒会自动引爆,召唤[b]乾坤剑[/b]穿透敌人。
近战攻击造成乾坤剑的[color=cyan]100.0%[/color]点伤害。
每拥有一点气力,增加[color=yellow]1[/color]点冲刺速度,闪避穿过敌人时对其贴上一层[b]符咒[/b],符咒会自动引爆,召唤[b]乾坤剑[/b]穿透敌人。
近战攻击造成乾坤剑的[color=cyan]25.0%[/color]点伤害。
每次格挡有[color=cyan]100.0%[/color]的概率弹反,子弹弹反后造成乾坤剑的[color=cyan]100.0%[/color]伤害。
每次格挡最多化解[color=cyan]1[/color]个子弹,
体内最多储存[color=cyan]3[/color]点气力。
每化解[color=yellow]1[/color]点伤害,
乾坤剑造成的伤害+[color=cyan]10[/color]点。
格挡时机越精确,成功率越高。
格挡成功后继续按住攻击可进行[b]蓄力[/b],
其后松开格挡键进行[b]无量反击[/b],
可弹反一切子弹,
但需消耗[color=yellow]1[/color]层气力,
可将弹反的伤害转换为能量。[/center]"
对于[b]近战挥舞[/b]攻击,化解本次伤害;
对于[b]近战戳刺[/b]攻击,将本次伤害反弹,造成乾坤剑的[color=cyan]25.0%[/color]伤害并产生大量击退;
对于[b]远程射弹[/b]攻击,化解本次伤害,有[color=cyan]25.0%[/color]的概率发生[b]弹反[/b],子弹弹反后造成乾坤剑的[color=cyan]25.0%[/color]伤害;
对于[b]猛冲[/b]攻击,化解本次伤害,并反弹敌人的速度;
对于[b]吐息[/b]攻击,[color=red]无法化解伤害[/color]但可以对敌人产生少量击退;
对于[b]魔法或召唤[/b]攻击,[color=red]无法化解伤害[/color]但可以少量储能;[/center]"
[node name="tease" parent="container" parent_id_path=PackedInt32Array(575698869) index="3" unique_id=689277044]
visible = true
text = "“卸劲反伤”"
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://w5yqnejlmfou"
path="res://.godot/imported/Jade_神手玉.png-1967ba97c31e1d92072a4a98707c87b2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://resources/weapons/Jade_神手玉.png"
dest_files=["res://.godot/imported/Jade_神手玉.png-1967ba97c31e1d92072a4a98707c87b2.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+6
View File
@@ -73,6 +73,12 @@ func hitBullet(bullet: BulletBase): # 当前子弹与其他子弹相撞
parryEffect(bullet)
bullet.hitbox.set_deferred("disabled", true)
generateParryBall(bullet.baseDamage)
elif bullet.motionType == BulletBase.MotionType.STAB:
parryEffect(bullet)
bullet.hitbox.set_deferred("disabled", true)
bullet.launcher.takeDamage(atk * reflectRate)
bullet.launcher.impluse(Vector2.from_angle(bullet.rotation) * -2000)
generateParryBall(bullet.baseDamage)
elif bullet.motionType == BulletBase.MotionType.SPRINT:
parryEffect(bullet)
bullet.tryDestroy()
+5 -5
View File
@@ -17,11 +17,11 @@ func register():
sprintMultiplier = 30
func ai():
PresetEntityAI.distanceAttack(self , currentFocusedBoss, 0, 300, 0)
PresetEntityAI.distanceAttack(self , currentFocusedBoss, 500, 1000, 1)
for i in 5:
tryAttack(i + 2, [3, 4])
if 1 not in attackingStates:
PresetEntityAI.follow(self , currentFocusedBoss, 200)
# PresetEntityAI.distanceAttack(self , currentFocusedBoss, 500, 1000, 1)
# for i in 5:
# tryAttack(i + 2, [3, 4])
# if 1 not in attackingStates:
# PresetEntityAI.follow(self , currentFocusedBoss, 200)
func attack(type: int):
if type == 0:
for bullet in BulletBase.generate(ComponentManager.getBullet("SwingSword"), self , getTrackingAnchor(), getTrackingAnchor().angle_to_point(currentFocusedPosition)):
+1 -1
View File
@@ -2,4 +2,4 @@ extends EffectController
class_name ParryEffect
func beforeShot():
CameraManager.shake(200, 300)
CameraManager.shake(300, 500)
+3 -1
View File
@@ -29,7 +29,7 @@ class_name StarterPanel
var historyStack
static var GAMEMODE_MAP_WAVE = [Wave.WAVE_NORMAL, Wave.WAVE_BOSSRUSH, Wave.WAVE_MOWING]
static var GAMEMODE_MAP_WAVE = [Wave.WAVE_NORMAL, Wave.WAVE_BOSSRUSH, Wave.WAVE_MOWING, Wave.WAVE_TESTBOSS]
static var START_CHARACTERS = ["MuyangDog", "Lynx", "HCN"]
static var buildingShader: bool = true
static var selectingFeed: bool = true
@@ -146,6 +146,8 @@ func _ready():
setPlayerName(getLast.call(1), newText)
mutexPlayer.rpc(newText)
)
if WorldManager.isRelease():
gamemodeOption.remove_item(3)
func _physics_process(_delta):
levelShow.text = "%d ∈ [%d, %d]" % [diffEdit.value, diffEdit.min_value, diffEdit.max_value]
GameRule.difficulty = diffEdit.value
+2 -1
View File
@@ -2,12 +2,13 @@ extends Area2D
class_name BulletBase
enum MotionType {
SWING, # 挥舞(近战攻击)
SWING, # 近战挥舞
PROJECTILE, # 射弹
MAGIC, # 魔法
SUMMON, # 召唤
SPRINT, # 冲撞
BREATH, # 吐息
STAB, # 近战戳刺
}
signal destroied(becauseMap: bool)