MusicBeat

This commit is contained in:
SoulliesOfficial
2026-05-26 00:21:27 -04:00
parent 649b7a5ddc
commit b5cb6152ff
663 changed files with 534461 additions and 587 deletions

View File

@@ -0,0 +1,141 @@
using Cielonos.MainGame.Characters;
using SLSUtilities.FunctionalAnimation;
using SLSUtilities.WwiseAssistance;
using UnityEngine;
namespace Cielonos.MainGame.Inventory.Collections
{
public partial class DualHarmony : MainWeaponBase
{
private MusicBeatSystem MusicBeatSystem => CombatManager.GetCombatSystem<MusicBeatSystem>();
public CharacterBase currentTarget;
public override void OnEquipped()
{
base.OnEquipped();
RegisterFunctionsToAnimSc();
/*if(!player.inputSc.IsMoving) PlayTargetedAnimation("Equip");
viewObjects["Wand"].SetFadeAnim(0.5f);*/
}
public override void OnPrimaryPress()
{
if (functionSm["LightAttack"].IsAvailable() && fullBodyFuncAnimSm.CheckPlayability())
{
comboSm.main.NextCombo("L");
string funcAnimName = "Attack" + comboSm.main.GetCurrentNodeName();
FuncAnimData data = fullBodyFuncAnimSm.collection[funcAnimName];
float startUpTime = data.Interval(IntervalType.Active).StartTime;
float nextBeatTime = MusicBeatSystem.GetNextBeat().time - MusicBeatSystem.CurrentSongTime;
BeatMarker lastMarker = MusicBeatSystem.GetLastBeat();
float compensation = lastMarker.time - MusicBeatSystem.CurrentSongTime;
functionSm["LightAttack"].Execute();
float difference;
if (compensation > -startUpTime)
{
difference = startUpTime - nextBeatTime;
if (difference < 0f)
{
return;
}
}
else
{
difference = startUpTime;
}
currentTarget = CombatManager.EnemySm.GetNearestEnemy(25f);
if (currentTarget != null)
{
PlayTargetedAnimation(funcAnimName, currentTarget, 5f);
}
else
{
PlayTargetedAnimation(funcAnimName);
}
fullBodyFuncAnimSm.currentRuntimeFuncAnim.currentPlayTime = difference;
Debug.Log($"StartUpTime: {nextBeatTime}, FuncAnim Active StartTime: {startUpTime}, Difference: {difference}, Compensation: {compensation}");
}
}
public override void OnSecondaryPress()
{
/*if (functionSm["HeavyAttack"].IsAvailable() && fullBodyFuncAnimSm.CheckPlayability())
{
comboSm.main.NextCombo("R");
float startUpTime = MusicBeatSystem.GetNextBeat().time - MusicBeatSystem.CurrentSongTime;
string funcAnimName = "Attack" + comboSm.main.GetCurrentNodeName();
FuncAnimData data = fullBodyFuncAnimSm.collection[funcAnimName];
float difference = data.Interval(IntervalType.Active).StartTime - startUpTime;
if (difference < 0f)
{
return;
}
currentTarget = CombatManager.EnemySm.GetNearestEnemy(25f);
if (currentTarget != null)
{
PlayTargetedAnimation(funcAnimName, currentTarget, 5f);
}
else
{
PlayTargetedAnimation(funcAnimName);
}
fullBodyFuncAnimSm.currentRuntimeFuncAnim.currentPlayTime = difference;
Debug.Log($"StartUpTime: {startUpTime}, FuncAnim Active StartTime: {data.Interval(IntervalType.Active).StartTime}, Difference: {difference}");
}*/
}
public override void OnSpecialAPress()
{
CombatManager.GetCombatSystem<MusicBeatSystem>().Activate();
}
}
public partial class DualHarmony
{
private void FAPF_GenerateBullet(RuntimeFuncAnim rtFuncAnim)
{
CustomFunction.PC_StringStringFloat p = rtFuncAnim.GetParams<CustomFunction.PC_StringStringFloat>();
GenerateProjectile(p.str0, attackData[p.str1], currentTarget, p.float0);
}
}
public partial class DualHarmony
{
private void GenerateProjectile(string vfxName, AttackUnit attackUnit,
CharacterBase target, float speed, bool hasMuzzleEffect = true, Transform muzzle = null)
{
if (hasMuzzleEffect)
{
muzzle ??= player.bodyPartsSc.leftHand;
vfxData.SpawnMuzzleVFX(vfxName, player, muzzle);
}
Projectile projectile = vfxData.SpawnVFX(vfxName, player).GetComponentInChildren<Projectile>();
Vector3 direction = player.transform.forward;
if (target != null)
{
direction = (target.centerPoint.position - projectile.transform.position).normalized;
}
projectile.Initialize(player, this, false, 1, Fraction.Enemy)
.SetAttackSubmodule<Projectile>(attackUnit)
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetAdaptiveTraceMoveModule<Projectile>(target, speed, 5f, 180f, 30f, direction, detectRadius: 25f)
.SetRaycastSubmodule<Projectile>(default, 0.25f, 0.5f);
projectile.hitSm.AddHitSound(AK.EVENTS.FUTUREWAND_WEAKATTACKHIT);
projectile.SetImpulseSubmodule().WithDynamicForce(1f);
AudioManager.Post(AK.EVENTS.FUTUREWAND_NORMALBOLTRELEASE, projectile.gameObject);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a0fc3aa61a4c14f47a51b4e6d34bd731

View File

@@ -113,9 +113,9 @@ namespace Cielonos.MainGame.Inventory.Collections
private void FAPF_GenerateMultipleBolts(RuntimeFuncAnim rtFuncAnim)
{
CustomFunction.PC_StringStringFloat p = rtFuncAnim.GetParams<CustomFunction.PC_StringStringFloat>();
List<CharacterBase> targets = CombatManager.EnemySm.GetEnemiesInRadius(player.transform.position, 25f);
List<Enemy> targets = CombatManager.EnemySm.GetEnemiesInRadius(player.transform.position, 25f);
if (targets.Count > 0) vfxData.SpawnMuzzleVFX(p.str0, player, muzzle);
foreach (CharacterBase target in targets)
foreach (Enemy target in targets)
{
GenerateProjectile(p.str0, attackData[p.str1], target, p.float0, false);
}
@@ -149,7 +149,7 @@ namespace Cielonos.MainGame.Inventory.Collections
.SetAttackSubmodule<Projectile>(attackUnit)
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetAdaptiveTraceMoveModule<Projectile>(target, speed, 5f, 20f, 20f, direction, detectRadius: 25f)
.SetAdaptiveTraceMoveModule<Projectile>(target, speed, 5f, 180f, 30f, direction, detectRadius: 25f)
.SetRaycastSubmodule<Projectile>(default, 0.25f, 0.5f);
if (vfxName == "NormalBolt")
@@ -170,6 +170,26 @@ namespace Cielonos.MainGame.Inventory.Collections
{
new Fusion(fusionStack).Apply(enemy);
SubscribeFusionExplode(enemy);
if (!projectile.tags.Contains("Separation") && HasExtender<MissileSeparationMembrane>())
{
List<Enemy> nearbyEnemies = CombatManager.EnemySm.GetEnemiesInRadius(hitPosition, 25f).Exclude(enemy as Enemy);
if (nearbyEnemies.Count > 0)
{
Projectile separation = vfxData.SpawnVFX(vfxName, player, hitPosition, Quaternion.identity).GetComponentInChildren<Projectile>();
nearbyEnemies.TryGetRandom(out Enemy randomTarget);
Vector3 sepDirection = (randomTarget.centerPoint.position - hitPosition).normalized;
separation.Initialize(player, this, false, 1, Fraction.Enemy)
.SetAttackSubmodule<Projectile>(attackUnit)
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetLinearDirectionMoveModule<Projectile>(sepDirection, speed, 5f);
separation.tags.Add("Separation");
separation.hitSm.AddCheckedObject(enemy.gameObject);
separation.SetRaycastSubmodule<Projectile>(default, 0.25f, 0.5f);
}
}
});
}
@@ -177,20 +197,26 @@ namespace Cielonos.MainGame.Inventory.Collections
{
vfxData.SpawnMuzzleVFX(vfxName, player, muzzle);
NormalArea area = vfxData.SpawnVFX(vfxName, player).GetComponentInChildren<NormalArea>();
area.Initialize<NormalArea>(player, this, Fraction.Enemy)
.SetAttackSubmodule<NormalArea>(attackUnit)
.SetTimeSubmodule<NormalArea>(3f, 0.2f, 0.8f)
.SetHitSubmodule<NormalArea>(0.1f, 4);
area.SetImpulseSubmodule().WithSuction(4f);
area.hitSm.AddHitSound(AK.EVENTS.FUTUREWAND_WEAKATTACKHIT);
AudioManager.Post(AK.EVENTS.FUTUREWAND_GROUNDAREA, area.gameObject);
if (HasExtender<BlackHoleDisplacer>()) //扩展器测试
if (!HasExtender<BlackHoleDisplacer>())
{
area.SetLinearDirectionMoveModule<NormalArea>(player.transform.forward, 0f, 25f, false, true, false);
area.Initialize<NormalArea>(player, this, Fraction.Enemy)
.SetAttackSubmodule<NormalArea>(attackUnit)
.SetTimeSubmodule<NormalArea>(3f, 0.2f, 0.8f)
.SetHitSubmodule<NormalArea>(0.1f, 4);
}
else
{
area.Initialize<NormalArea>(player, this, Fraction.Enemy)
.SetAttackSubmodule<NormalArea>(attackUnit)
.SetTimeSubmodule<NormalArea>(3f, 0.1f, 0.9f)
.SetHitSubmodule<NormalArea>(0.1f, 8)
.SetLinearDirectionMoveModule<NormalArea>(player.transform.forward, 25f, -50f, false, false, false);
}
area.SetImpulseSubmodule().WithSuction(4f);
area.hitSm.AddHitSound(AK.EVENTS.FUTUREWAND_WEAKATTACKHIT);
int fusionStack = attackUnit.GetSubmodule<AttackUnit.ParameterSubmodule>().GetParameter<int>("Buff_Fusion_Stack");
area.hitSm.AddHitEvent((enemy, hitPosition) =>
{

View File

@@ -152,12 +152,12 @@ namespace Cielonos.MainGame.Inventory.Collections
return;
}
List<CharacterBase> availableEnemies = CombatManager.EnemySm.GetEnemiesInRadius(player.transform.position, 4);
List<Enemy> availableEnemies = CombatManager.EnemySm.GetEnemiesInRadius(player.transform.position, 4);
//完美格挡+反击
if (player.reactionSc.blockSm.afterPerfectBlockTimer > 0)
{
CharacterBase target = CombatManager.EnemySm.GetBestEnemy(availableEnemies);
Enemy target = CombatManager.EnemySm.GetBestEnemy(availableEnemies);
if (PlayTargetedAnimation("BlockParryAttack", target))
{
player.reactionSc.blockSm.afterPerfectBlockTimer = 0;
@@ -212,8 +212,8 @@ namespace Cielonos.MainGame.Inventory.Collections
_ => "A"
};
List<CharacterBase> disruptable = CombatManager.EnemySm.GetDisruptableEnemies(availableEnemies);
CharacterBase target = CombatManager.EnemySm.GetScoredEnemies(availableEnemies)
List<Enemy> disruptable = CombatManager.EnemySm.GetDisruptableEnemies(availableEnemies);
Enemy target = CombatManager.EnemySm.GetScoredEnemies(availableEnemies)
.ApplyScoreModifier(disruptable, 0f, 1f).BestEnemy();
if (PlayTargetedAnimation("DisruptionAttack" + suffix, target))
@@ -247,7 +247,7 @@ namespace Cielonos.MainGame.Inventory.Collections
if (functionSm["HeavyAttack"].IsAvailable())
{
CharacterBase target = CombatManager.EnemySm.GetBestEnemy(availableEnemies);
Enemy target = CombatManager.EnemySm.GetBestEnemy(availableEnemies);
string nextNodeName = comboSm.main.GetNextNodeName("R");
bool keepAdsorption = nextNodeName is "RC";
if (PlayTargetedAnimation("Attack" + nextNodeName, target, 1f, keepAdsorption))
@@ -296,11 +296,11 @@ namespace Cielonos.MainGame.Inventory.Collections
player.reactionSc.blockSm.GetCurrentBlockSource().PerfectBlock(null, player.centerPosition);
RemoveBlock();*/
/*player.operationSc.Dodge();
player.operationSc.Dodge();
DodgeSource defaultDodge = DodgeSource.Default(player);
player.reactionSc.dodgeSm.ApplyDodge(defaultDodge);
player.reactionSc.dodgeSm.GetCurrentDodgeSource().PerfectDodge();
player.reactionSc.dodgeSm.RemoveDodge("DefaultDodge");*/
player.reactionSc.dodgeSm.RemoveDodge("DefaultDodge");
}
}
@@ -319,8 +319,8 @@ namespace Cielonos.MainGame.Inventory.Collections
private void FAPF_GenerateAirNormalSlash(RuntimeFuncAnim rtFuncAnim)
{
CustomFunction.PC_StringString p = rtFuncAnim.GetParams<CustomFunction.PC_StringString>();
NormalArea slash = GenerateNormalSlash(p.str0, attackData[p.str1], "SingleNormalHit");
CustomFunction.PC_StringString p = rtFuncAnim.GetParams<CustomFunction.PC_StringString>();
GenerateNormalSlash(p.str0, attackData[p.str1], "SingleNormalHit");
}
private void FAPF_GenerateHeavySlash(RuntimeFuncAnim rtFuncAnim)
@@ -459,8 +459,7 @@ namespace Cielonos.MainGame.Inventory.Collections
AudioManager.Post(AK.EVENTS.DISRUPT, hitPosition);
};
slash.hitSm
.AddHitSound(AK.EVENTS.POLYCHROME_HEAVYATTACKLHIT)
slash.hitSm.AddHitSound(AK.EVENTS.POLYCHROME_HEAVYATTACKLHIT)
.AddHitEvent((enemy, hitPosition) =>
{
var positionShakeAction = feedbackSc.GetFeedbackData("HeavyHit").Action<CameraPositionShakeAction>("Camera");