diff --git a/components/Bullets/AcidStorm.tscn b/components/Bullets/AcidStorm.tscn index c3eab9f..4e78121 100644 --- a/components/Bullets/AcidStorm.tscn +++ b/components/Bullets/AcidStorm.tscn @@ -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 diff --git a/components/Bullets/SwingSword.tscn b/components/Bullets/SwingSword.tscn index 7c18d3c..c199ff7 100644 --- a/components/Bullets/SwingSword.tscn +++ b/components/Bullets/SwingSword.tscn @@ -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 = { diff --git a/components/Bullets/Volcano.tscn b/components/Bullets/Volcano.tscn index 46b5abe..4df3685 100644 --- a/components/Bullets/Volcano.tscn +++ b/components/Bullets/Volcano.tscn @@ -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") diff --git a/components/Characters/Lynx.tscn b/components/Characters/Lynx.tscn index c4952a2..a7b8220 100644 --- a/components/Characters/Lynx.tscn +++ b/components/Characters/Lynx.tscn @@ -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 diff --git a/components/Scenes/FullscreenPanels/Starter.tscn b/components/Scenes/FullscreenPanels/Starter.tscn index 3b5bcbf..7593e11 100644 --- a/components/Scenes/FullscreenPanels/Starter.tscn +++ b/components/Scenes/FullscreenPanels/Starter.tscn @@ -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 diff --git a/components/Weapons/Tree.tscn b/components/Weapons/Tree.tscn index 50e7328..7a88963 100644 --- a/components/Weapons/Tree.tscn +++ b/components/Weapons/Tree.tscn @@ -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 = "“卸劲反伤”" diff --git a/resources/weapons/Jade_神手玉.png b/resources/weapons/Jade_神手玉.png new file mode 100644 index 0000000..26a3efa Binary files /dev/null and b/resources/weapons/Jade_神手玉.png differ diff --git a/resources/weapons/Jade_神手玉.png.import b/resources/weapons/Jade_神手玉.png.import new file mode 100644 index 0000000..cc9bd7f --- /dev/null +++ b/resources/weapons/Jade_神手玉.png.import @@ -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 diff --git a/scripts/Contents/Bullets/AcidS.gd b/scripts/Contents/Bullets/AcidS.gd index 5c274b2..2bd5e50 100644 --- a/scripts/Contents/Bullets/AcidS.gd +++ b/scripts/Contents/Bullets/AcidS.gd @@ -2,7 +2,7 @@ extends AcidBulletBase class_name AcidS func succeedToHit(_dmg: float, _entity: EntityBase): - for i in randi_range(0, int(arg1)): - for bullet in BulletBase.generate(ComponentManager.getBullet("AcidS"), launcher, position, rotation + deg_to_rad(180 + 90 * randf_range(-1, 1)), true, true): - if bullet is AcidS: - bullet.baseDamage = baseDamage + for i in randi_range(0, int(arg1)): + for bullet in BulletBase.generate(ComponentManager.getBullet("AcidS"), launcher, position, rotation + deg_to_rad(180 + 90 * randf_range(-1, 1)), true, true): + if bullet is AcidS: + bullet.baseDamage = baseDamage diff --git a/scripts/Contents/Bullets/Parrier.gd b/scripts/Contents/Bullets/Parrier.gd index 882e752..9810ce0 100644 --- a/scripts/Contents/Bullets/Parrier.gd +++ b/scripts/Contents/Bullets/Parrier.gd @@ -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() diff --git a/scripts/Contents/Characters/EnergyBlock.gd b/scripts/Contents/Characters/EnergyBlock.gd index efab7eb..cb07ed9 100644 --- a/scripts/Contents/Characters/EnergyBlock.gd +++ b/scripts/Contents/Characters/EnergyBlock.gd @@ -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)): diff --git a/scripts/Contents/Effects/Parry.gd b/scripts/Contents/Effects/Parry.gd index 98fabe4..adec65a 100644 --- a/scripts/Contents/Effects/Parry.gd +++ b/scripts/Contents/Effects/Parry.gd @@ -2,4 +2,4 @@ extends EffectController class_name ParryEffect func beforeShot(): - CameraManager.shake(200, 300) + CameraManager.shake(300, 500) diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index 62676b6..39c6169 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -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 diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index dae6568..bc9f662 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -2,12 +2,13 @@ extends Area2D class_name BulletBase enum MotionType { - SWING, # 挥舞(近战攻击) + SWING, # 近战挥舞 PROJECTILE, # 射弹 MAGIC, # 魔法 SUMMON, # 召唤 SPRINT, # 冲撞 BREATH, # 吐息 + STAB, # 近战戳刺 } signal destroied(becauseMap: bool)