GGemCoTcgPhaseShuffleSettings는 **“최대 마나 도달 전까지 뽑힐 카드 구간(FrontLoadedCount)”**을 대상으로,해당 구간을 **초반(Early) / 중반(Mid) / 후반(Late)**으로 나눈 뒤 각 구간별 코스트 가중치를 적용하는 셔플 설정 ScriptableObject입니다.
FrontLoadedCount이후 구간은 가중치 적용 없이 1차 랜덤 셔플 결과를 그대로 유지하여 “순수 랜덤”을 보존합니다.
| 용어 | 의미 |
|---|---|
| FrontLoadedCount | “최대 마나 도달 전까지” 플레이어가 보게 될(드로우될) 카드 수로 계산되는 덱 앞 구간 카드 수 |
| Phase Split | FrontLoadedCount 구간을 Early/Mid/Late로 분할 |
| Weight 적용 | 각 Phase 구간에서 코스트별 가중치로 “선택 확률”을 조정 |
| FrontLoadedCount 이후 | 가중치 적용 없이 1차 셔플 결과 유지(랜덤성 유지) |
| 항목 | 타입 | 기본값 | 범위/제약 | 설명 |
|---|---|---|---|---|
| earlyPhaseRatio | float | 0.3 | [0..1] ([Range]) + OnValidate()에서 Clamp01 |
FrontLoadedCount 중 초반(Early) 구간에 할당할 비율 |
| midPhaseRatio | float | 0.4 | [0..1] ([Range]) + OnValidate()에서 Clamp01 |
FrontLoadedCount 중 중반(Mid) 구간에 할당할 비율 |
| latePhaseRatio | (직접 항목 없음) | - | - | **후반(Late)**은 1 - (Early + Mid)가 아니라, 내부 계산에서 “나머지”로 처리됨(아래 참고) |
ShuffleConfig.CalculatePhaseCounts()에서 다음 보정을 수행합니다.
| 규칙 | 내용 |
|---|---|
| 0 미만 FrontLoadedCount | 0으로 보정 |
| Early/Mid 각각 | 0~1로 Clamp |
| Early+Mid 합 | 최대 0.95로 Clamp (과도한 비율 합 방지) |
| 합이 거의 0 | Early=0, Mid=0, Late=FrontLoadedCount (전부 후반 처리) |
| 반올림 오버플로우 | Mid부터 우선 감소시켜 총합을 맞춤 |
early / mid / late는 각 Phase에서 사용할 코스트 가중치 테이블입니다.
| 항목 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| early | PhaseCostWeightTable | defaultWeight=1 | 초반(Early) 구간 코스트 가중치 테이블 |
| mid | PhaseCostWeightTable | defaultWeight=1 | 중반(Mid) 구간 코스트 가중치 테이블 |
| late | PhaseCostWeightTable | defaultWeight=1 | 후반(Late) 구간 코스트 가중치 테이블 |
GGemCoTcgPhaseShuffleSettings.cs내부에 정의된 직렬화 지원 타입입니다.
| 항목 | 타입 | 기본값 | 제약 | 설명 |
|---|---|---|---|---|
| defaultWeight | float | 1.0 | [Min(0f)] + BuildShuffleConfig()에서 Mathf.Max(0f, defaultWeight) |
해당 Phase에서 엔트리가 없는 코스트에 적용되는 기본 가중치 |
| entries | List<CostWeightEntry> | 빈 리스트 | Normalize()로 정리 |
코스트별 개별 가중치 목록(동일 cost 중복 가능) |
| Entries | IReadOnlyList<CostWeightEntry> | - | 읽기 전용 | 직렬화 리스트의 읽기 전용 뷰 |