Implement passive relics and six-family defense towers

This commit is contained in:
2026-09-23 18:11:38 +09:00
parent 5d11288a6f
commit c94cbda1e6
21 changed files with 2882 additions and 152 deletions
@@ -439,6 +439,19 @@ namespace BumpCombat.Player
ResolveMovementGainPerSecond() * actualMovementTime));
}
public bool TryRestorePassiveRelicGauge(float maxGaugeFraction)
{
if (CurrentArtifact == null
|| maxGaugeFraction <= 0f
|| CurrentGauge >= MaxGauge)
{
return false;
}
AddGauge(MaxGauge * maxGaugeFraction);
return true;
}
public void AddNormalHitCharge()
{
if (IsExecutingArtifact
@@ -2213,14 +2226,32 @@ namespace BumpCombat.Player
return false;
}
public Vector2 GetPassiveRelicUseOrigin() => lastArtifactUsePosition;
public Vector2 GetPassiveRelicUseDirection() => GetUseDirection();
public bool TryEmitPassiveRelicEcho(
Vector2 origin,
Vector2 direction,
float damageMultiplier) =>
EmitPassiveRelicAttack(CurrentArtifact, false, origin, direction, damageMultiplier);
public bool TryEmitPassiveRelicRepeat(
ActiveArtifactDefinition definition,
bool charged,
Vector2 origin,
Vector2 direction,
float damageMultiplier) =>
EmitPassiveRelicAttack(definition, charged, origin, direction, damageMultiplier);
private bool EmitPassiveRelicAttack(
ActiveArtifactDefinition definition,
bool charged,
Vector2 origin,
Vector2 direction,
float damageMultiplier)
{
ActiveArtifactDefinition definition = CurrentArtifact;
if (definition == null
|| definition.NormalDamage <= 0f
|| (charged ? definition.ChargedDamage : definition.NormalDamage) <= 0f
|| damageMultiplier <= 0f
|| definition.Effect == ActiveArtifactEffect.Pulse)
{
@@ -2236,18 +2267,18 @@ namespace BumpCombat.Player
direction.Normalize();
int castIdentity = ++nextArtifactCastIdentity;
float echoIgniteTickDamage = playerStats.CalculateDamage(
definition.NormalIgniteTickDamage * damageMultiplier,
(charged ? definition.ChargedIgniteTickDamage : definition.NormalIgniteTickDamage) * damageMultiplier,
definition.DamageTag);
if (definition.Effect == ActiveArtifactEffect.ChainLightning)
{
EnemyController first = FindInitialChainTarget(origin, definition.NormalRange);
EnemyController first = FindInitialChainTarget(origin, (charged ? definition.ChargedRange : definition.NormalRange));
if (first == null)
{
return false;
}
bool applied = false;
foreach (ChainStrike strike in PlanArcChain(definition, first, origin))
foreach (ChainStrike strike in (charged ? PlanBranchingChain(definition, first, origin) : PlanArcChain(definition, first, origin)))
{
applied |= ApplyArtifactHit(
strike.Enemy,
@@ -2256,7 +2287,7 @@ namespace BumpCombat.Player
(strike.End - strike.Start).normalized,
strike.Knockback,
true,
false,
charged,
echoIgniteTickDamage,
castIdentity,
true);
@@ -2266,18 +2297,18 @@ namespace BumpCombat.Player
}
Vector2 center = origin;
Vector2 radii = new Vector2(definition.NormalRange, definition.NormalRange);
float rayRange = definition.NormalRange;
float rayHalfWidth = Mathf.Max(0.05f, definition.NormalWidth * 0.5f);
Vector2 radii = new Vector2((charged ? definition.ChargedRange : definition.NormalRange), (charged ? definition.ChargedRange : definition.NormalRange));
float rayRange = (charged ? definition.ChargedRange : definition.NormalRange);
float rayHalfWidth = Mathf.Max(0.05f, (charged ? definition.ChargedWidth : definition.NormalWidth) * 0.5f);
switch (definition.Effect)
{
case ActiveArtifactEffect.Cyclone:
center += GetCycloneHitCenterOffset(definition.NormalRange, false);
radii = GetCycloneHitRadii(definition.NormalRange, false);
center += GetCycloneHitCenterOffset((charged ? definition.ChargedRange : definition.NormalRange), charged);
radii = GetCycloneHitRadii((charged ? definition.ChargedRange : definition.NormalRange), charged);
break;
case ActiveArtifactEffect.ThunderCrash:
center = origin + direction * 0.45f;
radii = GetThunderCrashHitRadii(definition.NormalRange, direction);
radii = GetThunderCrashHitRadii((charged ? definition.ChargedRange : definition.NormalRange), direction);
break;
}
@@ -2292,7 +2323,7 @@ namespace BumpCombat.Player
bool anyDamage = false;
foreach (EnemyController enemy in enemies)
{
if (hitCount >= definition.NormalMaxTargets)
if (hitCount >= (charged ? definition.ChargedMaxTargets : definition.NormalMaxTargets))
{
break;
}
@@ -2324,11 +2355,11 @@ namespace BumpCombat.Player
bool damaged = ApplyArtifactHit(
enemy,
definition,
definition.NormalDamage * damageMultiplier,
(charged ? definition.ChargedDamage : definition.NormalDamage) * damageMultiplier,
hitDirection,
definition.NormalKnockback,
(charged ? definition.ChargedKnockback : definition.NormalKnockback),
true,
false,
charged,
echoIgniteTickDamage,
castIdentity,
true);
@@ -2444,7 +2475,10 @@ namespace BumpCombat.Player
false,
true,
definition.Effect,
charged));
charged,
playerStats.CalculateDamage(
GameplayConstants.Current.Combat.BaseDamage,
DamageTag.Collision)));
return damageWasApplied;
}