1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-06-10 13:47:12 +08:00

feat(障碍物系统): 添加草墙障碍物及相关功能

实现草墙障碍物系统,包括以下主要变更:
- 新增草墙障碍物资源、脚本和场景
- 添加障碍物状态显示UI
- 扩展组件管理器支持障碍物类型
- 修改子弹系统以支持对障碍物的碰撞检测
- 调整实体碰撞层设置
- 为公鸡角色添加草墙武器

新增功能允许玩家放置可阻挡敌人的草墙障碍物,并显示其生命值状态
This commit is contained in:
2026-01-27 20:52:26 +08:00
parent 2f2a3fd04b
commit 3698127345
22 changed files with 400 additions and 18 deletions
+21 -5
View File
@@ -44,7 +44,8 @@ func _ready():
launcherSummoned = launcher
launcher = launcher.myMaster
register()
area_entered.connect(hit)
area_entered.connect(hitEntity)
body_entered.connect(hitObstacle)
spawnInWhen = WorldManager.getTime()
spawnInWhere = position
spawn()
@@ -107,16 +108,31 @@ func setupCuttable(cutSpeed: float):
)
func getDamage():
return baseDamage * damageMultipliers[usingDamageMultiplier]
func hit(target: Node):
func calculateDamage(crit: bool):
var baseDmg = getDamage() * launcher.fields.get(FieldStore.Entity.DAMAGE_MULTIPILER) * randf_range(1 - GameRule.damageOffset, 1 + GameRule.damageOffset)
var damage = baseDmg + baseDmg * int(crit) * launcher.fields.get(FieldStore.Entity.CRIT_DAMAGE)
return damage
func determineCrit():
return MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE])
func hitEntity(target: Node):
var entity: EntityBase = EntityTool.fromHurtbox(target)
if !BulletTool.canDamage(self, entity): return
var resultDamage = entity.bulletHit(self, MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE]))
var resultDamage = entity.bulletHit(self, determineCrit())
succeedToHit(resultDamage, entity)
if MathTool.rate(fullPenerate()):
penerate -= entity.fields[FieldStore.Entity.PENARATION_RESISTANCE]
if MathTool.rate(fullPenerate() - entity.fields[FieldStore.Entity.PENARATION_RESISTANCE]):
baseDamage *= 1.0 - penerateDamageReduction
else:
tryDestroy()
func hitObstacle(target: Node):
if target is ObstacleBase:
var obstacle = target as ObstacleBase
if is_instance_valid(obstacle.launcher):
if not BulletTool.canDamage(self, obstacle.launcher): return
obstacle.takeDamage(calculateDamage(determineCrit()))
if MathTool.rate(fullPenerate() - obstacle.penerateResistance):
baseDamage *= 1.0 - penerateDamageReduction
else:
tryDestroy()
func forward(direction: Vector2):
position += direction.normalized() * speed * GameRule.bulletSpeedMultiplier
func fullPenerate():