Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
SituationBase.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "ActiveGameplayEffectHandle.h"
7#include "CKEnumExtensions.h"
11#include "UObject/Object.h"
12#include "SituationBase.generated.h"
13
14class APlayerController;
15class UAbilitySystemComponent;
18struct FGameplayEffectRemovalInfo;
19struct FGameplayEffectSpecHandle;
20struct FGameplayModifierInfo;
21
22
29UCLASS(Blueprintable)
30class CK_UE_API USituationBase : public UObject
31{
32 GENERATED_BODY()
33
34public:
35 void Initialize(const FDT_SituationTable& InSituationData, const FSituationBuffData& InBuffData);
36
37 // 주기 발동을 시작/중지한다. 스테이지 전환 시 멈춘다.
38 void StartTicking(UWorld* World);
39 void StopTicking(UWorld* World);
40
41public:
42 // 카드의 GE 를 플레이어에게 적용한다.
43 // 지속 시간(영구/일시)은 GE 의 Duration Policy 가 결정하며, 여기서 강제로 떼지 않는다.
44 void ApplyBuff(APlayerController* TargetPC);
45
46 // 무기가 바뀌었을 때 호출. 남은 시간을 유지한 채 GE 를 다시 적용해,
47 // 무기별 SetByCaller 수치가 새 무기 기준으로 다시 주입되게 한다.
48 void RefreshForWeapon(const APlayerController* TargetPC);
49
50 // 스테이지 전환이나 상황 해제처럼 GE 수명과 무관하게 즉시 걷어야 할 때만 호출한다.
51 void RemoveBuff(APlayerController* TargetPC);
52
53 // 남은 시간(초). 영구 GE 나 미적용 상태면 음수를 반환한다.
54 float GetBuffRemainingTime(const APlayerController* TargetPC) const;
55
56 // GE 가 들고 있는 총 지속 시간(초). 영구 GE 나 미적용 상태면 음수를 반환한다.
57 // 게이지 비율의 분모로 쓴다. 재적용으로 지속 시간이 바뀌어도 항상 현재 값을 돌려준다.
58 float GetBuffDuration(const APlayerController* TargetPC) const;
59
60 // 카드에 띄울 설명. Situation_Master 의 Description 에 들어있는 치환자를 채운다.
61 // {{name1}} / {{value1}} 은 현재 무기 기준 실제 수치로,
62 // {{Alias}} / {{True_Name}} / {{Postposition}} 은 이 카드에 묶인 성좌의 값으로 채운다.
63 // 읽어낼 수 없는 치환자는 원문 그대로 남는다.
64 FText BuildBuffDescription(const APlayerController* TargetPC) const;
65
66public:
67 FORCEINLINE const FDT_SituationTable& GetSituationData() const
68 {
69 return SituationData;
70 }
71
72 FORCEINLINE const FSituationBuffData& GetBuffData() const
73 {
74 return BuffData;
75 }
76
77 // 이 카드를 후원한 성좌. 선택지를 뽑을 때 정해지며, 카드를 고르면 시청자 목록에 합류한다.
78 // UConstellationBase 의 완전한 형식이 필요해 .cpp 에서 정의한다.
79 UConstellationBase* GetConstellation() const;
80 void SetConstellation(UConstellationBase* InConstellation);
81
82 FORCEINLINE FName GetSituationID() const
83 {
84 return SituationData.Situation_ID;
85 }
86
87 FORCEINLINE ESituationTag GetSituationTags() const
88 {
89 return SituationData.ParsedTags;
90 }
91
92 FORCEINLINE int32 GetSituationTagCount() const
93 {
94 int32 Result = 0, Value = static_cast<int32>(GetSituationTags());
95 while (Value) ++Result, Value &= (Value - 1); //While문임.
96 return Result;
97 }
98
99 FORCEINLINE bool IsBuffActive() const
100 {
101 return AppliedHandle.IsValid();
102 }
103
104 FORCEINLINE UTexture2D* GetSituationIcon() const
105 {
106 //태그가 하나만 달려있다면 그 태그에 대응되는 아이콘을 가져옴. 하지만 여러개라면 'Complex'라는 유형의 아이콘을 가져오게 구현.
107 const FName Path = FName(GetSituationTagCount() > 1 ? "Complex" : Utils::EnumToString(GetSituationTags()));
108 UTexture2D* IconTextureLocal = GetEnvironmentAssetByKey<UTexture2D>(Path);
109 return IconTextureLocal;
110 }
111
112protected:
113 // BP 에서 발동 연출(화면 효과 등)을 붙일 수 있게 열어둔다.
114 UFUNCTION(BlueprintImplementableEvent, Category = "Situation")
115 void OnTriggered();
116
117 void HandleIntervalElapsed();
118
119public:
120 // 상황이 발동했을 때. 관리 주체가 구독해 성좌 채팅으로 이어준다.
121 FSimpleMulticastDelegate OnSituationTriggered;
122
123 // GE 가 스스로 만료되거나 제거됐을 때. 서브시스템이 구독해 UI 로 흘린다.
124 FSimpleMulticastDelegate OnBuffExpired;
125
126protected:
127 static UAbilitySystemComponent* ResolveASC(const APlayerController* TargetPC);
128
129 // 현재 장착 무기 태그. 소유 태그에서 Weapon 계열을 찾아 해석한다.
130 static FGameplayTag ResolveCurrentWeaponTag(const UAbilitySystemComponent* ASC);
131
132 // 장착 무기 기준으로 이 모디파이어가 실제로 갖게 될 크기.
133 // 항등값으로 무력화되거나 정적으로 읽힐 수 없는 모디파이어면 false.
134 static bool ResolveModifierMagnitude(const FGameplayModifierInfo& Modifier, const FConstellationWeaponMagnitude* ActiveEntry, float& OutMagnitude, float SituationRank = 1.0f);
135
136protected:
137 // GE 제거 델리게이트 콜백. 만료/디스펠 어느 쪽이든 여기로 들어온다.
138 void HandleEffectRemoved(const FGameplayEffectRemovalInfo& RemovalInfo);
139
140 // 적용 중인 GE 를 만료 통지 없이 걷어낸다. 재적용 직전 정리에 쓴다.
141 void ClearAppliedEffect(UAbilitySystemComponent* ASC);
142
143 // GE 를 실제로 적용한다. OverrideDuration 이 0보다 크면 그 값으로 지속 시간을 덮어쓴다.
144 void ApplyBuffEffect(UAbilitySystemComponent* ASC, float OverrideDuration);
145
146 // 장착 무기에 해당하는 모디파이어만 실제 수치로 채우고 나머지는 항등값으로 무력화한다.
147 void InjectWeaponMagnitudes(const UAbilitySystemComponent* ASC, const UClass* EffectClass, const FGameplayEffectSpecHandle& SpecHandle) const;
148
149 // {{name1}} / {{value1}} 치환자를 현재 무기 기준 수치로 바꾼다. 읽어낼 수 없으면 손대지 않는다.
150 void FillMagnitudeTokens(const APlayerController* TargetPC, FString& InOutText) const;
151
152protected:
153 UPROPERTY(Transient, BlueprintReadOnly, Category = "Situation")
154 FDT_SituationTable SituationData;
155
156 UPROPERTY(Transient, BlueprintReadOnly, Category = "Situation")
158
159 UPROPERTY(Transient, BlueprintReadOnly, Category = "Situation")
160 TObjectPtr<UConstellationBase> Constellation;
161
162protected:
163 // 적용 중인 버프 GE 핸들. FActiveGameplayEffectHandle 은 UObject 참조가 아니라 GC 추적이 필요 없다.
164 FActiveGameplayEffectHandle AppliedHandle;
165
166private:
167 FTimerHandle IntervalTimerHandle;
168};
ESituationTag
Definition SituationTag.h:17
Definition ConstellationBase.h:35
Definition SituationBase.h:31
FORCEINLINE const FSituationBuffData & GetBuffData() const
Definition SituationBase.h:72
FORCEINLINE ESituationTag GetSituationTags() const
Definition SituationBase.h:87
FORCEINLINE bool IsBuffActive() const
Definition SituationBase.h:99
FORCEINLINE int32 GetSituationTagCount() const
Definition SituationBase.h:92
FORCEINLINE const FDT_SituationTable & GetSituationData() const
Definition SituationBase.h:67
FORCEINLINE UTexture2D * GetSituationIcon() const
Definition SituationBase.h:104
FORCEINLINE FName GetSituationID() const
Definition SituationBase.h:82
Definition GE_ConstellationBuffBase.h:16
Definition DT_SituationTable.h:20
Definition SituationBuffData.h:15