展前冒死重构
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(fileName = "NewLevelRuleConfig", menuName = "Bansonic/Gameplay/Level Rule Config")]
|
||||
public class LevelRuleConfig_SO : ScriptableObject
|
||||
{
|
||||
[Header("Match")]
|
||||
public int songID = 0;
|
||||
public string songName = string.Empty;
|
||||
[Tooltip("-1 means any difficulty.")]
|
||||
public int difficulty = -1;
|
||||
|
||||
[Header("Support Track")]
|
||||
public bool useLeastNoteTrackAsSupportTrack = false;
|
||||
[Tooltip("Used when useLeastNoteTrackAsSupportTrack is false. 0-4. -1 disables support-track logic.")]
|
||||
public int supportTrackIndex = -1;
|
||||
public int maxSupportCharges = 3;
|
||||
public int adjacentSkillCastsPerSupportCharge = 3;
|
||||
public float adjacentSkillCastWindow = 5f;
|
||||
|
||||
[Header("Echo")]
|
||||
public bool enableAdjacentSkillEcho = false;
|
||||
public float echoWindow = 1.5f;
|
||||
public int echoThreshold = 3;
|
||||
public int maxEchoStacks = 4;
|
||||
public float echoResistancePerStack = 0.06f;
|
||||
public float echoResistanceDuration = 4f;
|
||||
public int echoManaPenalty = 0;
|
||||
|
||||
[Header("Conditional Rewards")]
|
||||
public int allAlliesAliveScoreOnEnemyDeath = 0;
|
||||
public bool awardAllAlliesAliveScorePerEnemy = false;
|
||||
[Tooltip("At settlement: average living HP percent * this value is added as team score.")]
|
||||
public int finalAverageHpPercentScore = 0;
|
||||
|
||||
[Header("Stages")]
|
||||
public LevelRuleStage[] stages = Array.Empty<LevelRuleStage>();
|
||||
|
||||
public bool Matches(SongData song, int currentDifficulty)
|
||||
{
|
||||
if (song == null)
|
||||
return false;
|
||||
|
||||
bool idMatches = songID != 0 && song.songID == songID;
|
||||
bool nameMatches = !string.IsNullOrWhiteSpace(songName) && string.Equals(song.songName, songName, StringComparison.OrdinalIgnoreCase);
|
||||
if (!idMatches && !nameMatches)
|
||||
return false;
|
||||
|
||||
return difficulty < 0 || difficulty == currentDifficulty;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class LevelRuleStage
|
||||
{
|
||||
[Tooltip("-1 means match by current stage index. If enemyID > 0, enemy ID also has to match.")]
|
||||
public int stageIndex = -1;
|
||||
public int enemyID = 0;
|
||||
[Tooltip("If > 0, this enemy is held at 1 HP before this song time.")]
|
||||
public float minimumDeathSongTime = -1f;
|
||||
public bool clearEchoOnSpawn = true;
|
||||
public bool clearSupportChargesOnSpawn = false;
|
||||
|
||||
public LevelRuleAction[] onSpawn = Array.Empty<LevelRuleAction>();
|
||||
public LevelRuleAction[] onManaFull = Array.Empty<LevelRuleAction>();
|
||||
public LevelRuleAction[] onDeath = Array.Empty<LevelRuleAction>();
|
||||
public LevelRuleAction[] onDamaged = Array.Empty<LevelRuleAction>();
|
||||
|
||||
public LevelRuleHoldAction[] onHoldStart = Array.Empty<LevelRuleHoldAction>();
|
||||
public LevelRuleHoldAction[] onHoldComplete = Array.Empty<LevelRuleHoldAction>();
|
||||
public LevelRuleHoldAction[] onHoldBreak = Array.Empty<LevelRuleHoldAction>();
|
||||
|
||||
public LevelRuleHpPhase[] hpPhases = Array.Empty<LevelRuleHpPhase>();
|
||||
|
||||
public bool Matches(int currentStageIndex, EnemyData_SO data)
|
||||
{
|
||||
if (stageIndex >= 0 && stageIndex != currentStageIndex)
|
||||
return false;
|
||||
|
||||
if (enemyID > 0 && (data == null || data.enemyID != enemyID))
|
||||
return false;
|
||||
|
||||
return stageIndex >= 0 || enemyID > 0;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class LevelRuleHpPhase
|
||||
{
|
||||
[Range(0f, 1f)]
|
||||
public float hpPercentThreshold = 0.5f;
|
||||
public bool triggerOnce = true;
|
||||
public LevelRuleAction[] actions = Array.Empty<LevelRuleAction>();
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class LevelRuleHoldAction
|
||||
{
|
||||
public LevelRuleAction[] actions = Array.Empty<LevelRuleAction>();
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class LevelRuleAction
|
||||
{
|
||||
public string actionId = string.Empty;
|
||||
public LevelRuleActionType actionType = LevelRuleActionType.None;
|
||||
public LevelRuleTarget target = LevelRuleTarget.CurrentEnemy;
|
||||
public float amount = 0f;
|
||||
public bool amountScalesByDifficultyLevel = false;
|
||||
public bool amountIsPercentOfMaxHp = false;
|
||||
public float duration = 0f;
|
||||
public int maxTriggersPerEnemy = 0;
|
||||
public bool onlyIfAllAlliesAlive = false;
|
||||
public bool requireSupportCharge = false;
|
||||
public int scoreReward = 0;
|
||||
}
|
||||
|
||||
public enum LevelRuleActionType
|
||||
{
|
||||
None,
|
||||
Damage,
|
||||
Heal,
|
||||
ManaDelta,
|
||||
AttackDelta,
|
||||
ResistanceDeltaTimed,
|
||||
HealReceivedMultiplierTimed,
|
||||
AddTeamScore,
|
||||
DamageCurrentEnemyByOwnAttack,
|
||||
SpendSupportChargeForEnemyVulnerability,
|
||||
ClearEnemyMana
|
||||
}
|
||||
|
||||
public enum LevelRuleTarget
|
||||
{
|
||||
CurrentEnemy,
|
||||
AllLivingAllies,
|
||||
TriggerTrackAlly,
|
||||
HighestCurrentManaAlly,
|
||||
HighestAttackAlly,
|
||||
HighestRecentHitTrackAlly,
|
||||
HighestRecentSkillCastAlly
|
||||
}
|
||||
Reference in New Issue
Block a user