mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-31 00:11:54 +08:00
feat(武器系统): 重构LGBT武器和彩虹旗召唤物
调整LGBT武器属性计算公式,增加角度和数量参数 为彩虹旗召唤物添加多子弹发射和延迟发射功能 修改子弹追踪逻辑和穿透属性 更新武器描述和能量消耗
This commit is contained in:
@@ -11,7 +11,7 @@ func ai():
|
||||
speed *= 1.05
|
||||
speed = clamp(speed, 0, 20)
|
||||
if is_instance_valid(tracer) and timeLived() < maxTraceTime:
|
||||
PresetBulletAI.trace(self, tracer.getTrackingAnchor(), clamp(speed / 50 * tracePower, 0, 1))
|
||||
PresetBulletAI.trace(self, tracer.getTrackingAnchor(), tracePower)
|
||||
PresetBulletAI.forward(self, rotation)
|
||||
func destroy(_b):
|
||||
EffectController.create(ComponentManager.getEffect("LGBTBoom"), position).shot()
|
||||
|
||||
@@ -3,22 +3,29 @@ extends SummonBase
|
||||
var atk: float = 0
|
||||
var maxTraceTime: float = 0
|
||||
var tracePower: float = 0
|
||||
var count: int = 0
|
||||
var angle: float = 0
|
||||
|
||||
func register():
|
||||
fields[FieldStore.Entity.MAX_HEALTH] = 500
|
||||
attackCooldownMap[0] = 250
|
||||
fields[FieldStore.Entity.MAX_HEALTH] = 150
|
||||
attackCooldownMap[0] = 1000
|
||||
func ai():
|
||||
tryAttack(0)
|
||||
func attack(type):
|
||||
if type == 0:
|
||||
var tracer = EntityTool.findClosetEntity(position, get_tree(), false, true)
|
||||
for bullet in BulletBase.generate(
|
||||
ComponentManager.getBullet("LGBTBullet"),
|
||||
self,
|
||||
findWeaponAnchor("normal"),
|
||||
position.angle_to_point(tracer.position)
|
||||
):
|
||||
bullet.tracer = tracer
|
||||
bullet.damage = atk
|
||||
bullet.maxTraceTime = maxTraceTime
|
||||
bullet.tracePower = tracePower
|
||||
var startAngle = position.angle_to_point(tracer.getTrackingAnchor()) + deg_to_rad(randf_range(-90, 90))
|
||||
for i in count:
|
||||
if !is_instance_valid(tracer):
|
||||
break
|
||||
for bullet in BulletBase.generate(
|
||||
ComponentManager.getBullet("LGBTBullet"),
|
||||
myMaster,
|
||||
findWeaponAnchor("normal"),
|
||||
startAngle + deg_to_rad(i * angle)
|
||||
):
|
||||
bullet.tracer = tracer
|
||||
bullet.damage = atk
|
||||
bullet.maxTraceTime = maxTraceTime
|
||||
bullet.tracePower = tracePower
|
||||
await TickTool.millseconds(50)
|
||||
|
||||
@@ -8,7 +8,7 @@ var from: float = 0
|
||||
var to: float = 0
|
||||
var per: int = 0
|
||||
|
||||
static var current: int = 9
|
||||
static var current: int = 0
|
||||
static var WAVE_NORMAL = [
|
||||
Wave.create("Hen", 1, 5, false, 0, INF, 1),
|
||||
Wave.create("Chick", 0, 0, true, 9, INF, 15),
|
||||
|
||||
@@ -3,13 +3,17 @@ extends Weapon
|
||||
class_name LGBTWeapon
|
||||
|
||||
func update(to: int, origin: Dictionary, _entity: EntityBase):
|
||||
origin["atk"] += 5 * to * soulLevel
|
||||
origin["power"] += 0.05 * to * soulLevel
|
||||
origin["trace"] += 0.25 * to * soulLevel
|
||||
origin["angle"] /= 1 + 0.05 * to * soulLevel
|
||||
origin["count"] += 1 * soulLevel
|
||||
origin["atk"] += 3 * to * soulLevel
|
||||
origin["power"] += 0.02 * to * soulLevel
|
||||
origin["trace"] += 0.1 * to * soulLevel
|
||||
return origin
|
||||
func attack(entity: EntityBase):
|
||||
var summon = entity.summon(ComponentManager.getSummon("LGBTFlag"), true)
|
||||
summon.atk = readStore("atk")
|
||||
summon.maxTraceTime = readStore("trace") * 1000
|
||||
summon.tracePower = readStore("power")
|
||||
summon.count = readStore("count")
|
||||
summon.angle = readStore("angle")
|
||||
return true
|
||||
|
||||
@@ -395,9 +395,9 @@ func getTrackingAnchor() -> Vector2:
|
||||
return hurtbox.get_node("hitbox").global_position
|
||||
|
||||
# 关于分组
|
||||
func isPlayer():
|
||||
func isPlayer() -> bool:
|
||||
return is_in_group("players")
|
||||
func isSummon():
|
||||
func isSummon() -> bool:
|
||||
return self is SummonBase
|
||||
|
||||
# 抽象方法,实际上是一些钩子,不需要全部实现
|
||||
|
||||
@@ -8,7 +8,7 @@ static func fromHurtbox(node: Node) -> EntityBase:
|
||||
if entity is EntityBase:
|
||||
return entity as EntityBase
|
||||
return null
|
||||
static func findClosetEntity(to: Vector2, fromTree: SceneTree, player: bool = false, mob: bool = false, excludes: Array[EntityBase] = []) -> EntityBase:
|
||||
static func findClosetEntity(to: Vector2, fromTree: SceneTree, player: bool = false, mob: bool = false, excludes: Array[EntityBase] = [], allowSummon: bool = false) -> EntityBase:
|
||||
var result = null
|
||||
var lastDistance = INF
|
||||
var nodes = []
|
||||
@@ -18,12 +18,15 @@ static func findClosetEntity(to: Vector2, fromTree: SceneTree, player: bool = fa
|
||||
nodes += fromTree.get_nodes_in_group("mobs")
|
||||
for entity in nodes:
|
||||
if entity is EntityBase and entity not in excludes:
|
||||
if !allowSummon:
|
||||
if entity.isSummon():
|
||||
continue
|
||||
if to.distance_to(entity.position) < lastDistance:
|
||||
lastDistance = to.distance_to(entity.position)
|
||||
result = entity
|
||||
return result
|
||||
static func findClosetPlayer(to: Vector2, fromTree: SceneTree, excludes: Array[EntityBase] = []) -> EntityBase:
|
||||
return findClosetEntity(to, fromTree, true, false, excludes)
|
||||
static func findClosetPlayer(to: Vector2, fromTree: SceneTree, excludes: Array[EntityBase] = [], allowSummon: bool = false) -> EntityBase:
|
||||
return findClosetEntity(to, fromTree, true, false, excludes, allowSummon)
|
||||
static func findEntityByClass(cls: String, fromTree: SceneTree) -> Array[EntityBase]:
|
||||
var results: Array[EntityBase] = []
|
||||
var nodes = fromTree.get_nodes_in_group("mobs") + fromTree.get_nodes_in_group("players")
|
||||
|
||||
Reference in New Issue
Block a user