diff --git a/scripts/Contents/Bullets/ChickSprint.gd b/scripts/Contents/Bullets/ChickSprint.gd index 874b5b4..c9ce65f 100644 --- a/scripts/Contents/Bullets/ChickSprint.gd +++ b/scripts/Contents/Bullets/ChickSprint.gd @@ -5,7 +5,7 @@ func register(): speed = 0 penerate = 1 func ai(): - damage = launcher.velocity.length() / 300 + damage = launcher.velocity.length() / 250 PresetBulletAI.lockLauncher(self, launcher, true) if !launcher.sprinting: tryDestroy() diff --git a/scripts/Contents/Characters/Bear.gd b/scripts/Contents/Characters/Bear.gd index 6eb55a5..61be469 100644 --- a/scripts/Contents/Characters/Bear.gd +++ b/scripts/Contents/Characters/Bear.gd @@ -5,41 +5,49 @@ class_name Bear # 攻击方式模仿泰拉瑞亚光之女皇 func register(): fields[FieldStore.Entity.MAX_HEALTH] = 2000 - fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.25 + fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.5 attackCooldownMap[0] = 3000 attackCooldownMap[1] = 10000 attackCooldownMap[2] = 8000 attackCooldownMap[3] = 13000 - sprintMultiplier = 120 + sprintMultiplier = 100 func spawn(): texture.play("walk") func ai(): - PresetEntityAI.follow(self, currentFocusedBoss, 0) + PresetEntityAI.follow(self, currentFocusedBoss, 200) for i in range(4): tryAttack(i) func attack(type): var weaponPos = findWeaponAnchor("normal") if type == 0: - for i in range(20): - for bullet in BulletBase.generate(preload("res://components/Bullets/BossAttack/Bear/ArrowSeven.tscn"), self, weaponPos, deg_to_rad(randf_range(0, 360))): + playSound("attack0") + for i in randi_range(20, 30): + for bullet in BulletBase.generate(preload("res://components/Bullets/BossAttack/Bear/ArrowSeven.tscn"), self, findWeaponAnchor("normal"), deg_to_rad(randf_range(0, 360))): bullet.tracer = currentFocusedBoss + bullet.position += MathTool.randv2_range(50) + await TickTool.millseconds(50) + return false elif type == 1: - await sprintTo(currentFocusedBoss.position - Vector2(200, 200), 0.25) - for i in range(6): - BulletBase.generate(preload("res://components/Bullets/BossAttack/Bear/SunDance.tscn"), self, weaponPos, deg_to_rad(randf_range(0, 360))) + await sprintTo(currentFocusedBoss.position - Vector2(MathTool.randc_from([-300, 300]), 300), 0.25) + var count = randi_range(6, 8) + for i in range(count): + BulletBase.generate(preload("res://components/Bullets/BossAttack/Bear/SunDance.tscn"), self, weaponPos, deg_to_rad(360.0 / count * i)) elif type == 2: for i in range(13): for bullet in BulletBase.generate(preload("res://components/Bullets/BossAttack/Bear/ForeverRainbow.tscn"), self, weaponPos, 0): bullet.rotation = 360 / 13.0 * i elif type == 3: - await sprintTo(currentFocusedBoss.position - Vector2(500, 0), 0.25) + await sprintTo(currentFocusedBoss.position - Vector2(MathTool.randc_from([500, -500]), 0), 0.25) + playSound("attack3") sprintParticle.emitting = true canRunAi = false - await TickTool.millseconds(1500) + await TickTool.millseconds(900) BulletBase.generate(preload("res://components/Bullets/BearSprint.tscn"), self, weaponPos, 0) await trySprint() sprintParticle.emitting = false canRunAi = true + await sprintTo(currentFocusedBoss.position + MathTool.randv2_range(400), 0.25) + return false return true func sprint(): move((currentFocusedBoss.position - position).normalized() * sprintMultiplier * Vector2(1, 0), true) diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 4f4b11b..932458e 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -86,6 +86,7 @@ var statebar: EntityStateBar var health: float = 0 var energy: float = 0 var sprinting: bool = false +var targetableSprinting: bool = false var trailing: bool = false var lastDirection: int = 1 @@ -246,23 +247,28 @@ func tryAttack(type: int, needChargeUp: bool = false): if await weapon.tryAttack(self): weapon.playSound("attack") else: - attack(type) - playSound("attack" + str(type)) + if await attack(type): + playSound("attack" + str(type)) return state func trySprint(): trailing = true playSound("sprint") - sprint() sprinting = true + sprint() await TickTool.until(func(): return !sprinting) trailing = false func sprintTo(target: Vector2, speed: float): + await TickTool.until(func(): return !targetableSprinting) + targetableSprinting = true + trailing = true await TickTool.until( func(): position += (target - position) * speed return position.distance_to(target) < 10 ) position = target + trailing = false + targetableSprinting = false func tryDie(by: BulletBase): if is_queued_for_deletion(): return for drop in range(min(len(drops), len(dropCounts))):