Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
StreamingSubsystem.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "Subsystems/WorldSubsystem.h"
8#include "StreamingSubsystem.generated.h"
9
12class USituationBase;
13class UStageManifest;
14
15// 성좌가 채팅창에 반응을 띄울 때. 채팅 UI 가 구독한다.
16// 출력 대기열을 거쳐 실제로 화면에 올릴 한 줄이 확정됐을 때만 쏜다.
17// bTagged 는 방송 태그에 반응한 태그 채팅인지(true), 평소의 일반 채팅인지(false)를 구분한다.
18DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnConstellationReaction, UConstellationBase* /*Constellation*/, const FText& /*ChatText*/, bool /*bTagged*/);
19
20// 새 성좌가 시청자 목록에 합류할 때. 성좌 목록 패널이 구독한다.
21DECLARE_MULTICAST_DELEGATE_OneParam(FOnConstellationRegistered, UConstellationBase* /*Constellation*/);
22
23// 같은 태그가 기준 수만큼 모여 방송 제목이 확정될 때. 방송 진행 HUD 가 구독한다.
24// 제목은 한 게임에 최대 하나뿐이라 이 델리게이트도 한 번만 쏜다.
25DECLARE_MULTICAST_DELEGATE_OneParam(FOnBroadcastTitleConfirmed, ESituationTag /*ConfirmedTag*/);
26
27
28USTRUCT()
30{
31 GENERATED_BODY()
32
33public:
34 UPROPERTY(Transient)
35 TObjectPtr<UConstellationBase> Constellation = nullptr;
36};
37
38
43USTRUCT()
45{
46 GENERATED_BODY()
47
48public:
49 UPROPERTY(Transient)
50 TObjectPtr<UConstellationBase> Constellation = nullptr;
51
52 UPROPERTY(Transient)
53 FText ChatText;
54
55 // 대기열에 들어온 시각(초). 일반 채팅의 지연 판정에만 쓴다.
56 float EnqueuedTime = 0.0f;
57};
58
59
71UCLASS(Blueprintable)
72class CK_UE_API UStreamingSubsystem : public UWorldSubsystem
73{
74 GENERATED_BODY()
75
76public:
77 virtual void OnWorldBeginPlay(UWorld& InWorld) override;
78 virtual void Deinitialize() override;
79
80public:
81 // 적 처치 시 호출. 성좌를 시청자 목록에 등록한다.
82 void RegisterConstellation(UConstellationBase* Constellation);
83
84 // 상황이 발동했을 때 호출. 그 카드에 묶인 후원 성좌가 대표로 태그 채팅을 낸다.
85 void TriggerSituation(USituationBase* Situation);
86
87 // 현재 시청 중인 성좌 전체. 성좌 목록 패널의 초기 채우기에 쓴다.
88 TArray<UConstellationBase*> GetConstellations() const;
89
90 // 해당 방송 태그에 반응하는 성좌만 추린다.
91 TArray<UConstellationBase*> GetRespondingConstellations(ESituationTag BroadcastTags) const;
92
93 // 해당 방송 태그에 반응하는 성좌를 Constellation_Master 에서 하나 뽑아 만든다.
94 // 만들기만 하고 시청자 목록에는 넣지 않는다. 합류는 RegisterConstellation 이 맡는다.
95 // 이미 시청 중인 성좌와 ExcludedIDs 에 든 성좌는 후보에서 뺀다.
96 UConstellationBase* DrawConstellationForTags(ESituationTag BroadcastTags, const TArray<FName>& ExcludedIDs);
97
98 // 이미 시청 중인 성좌 인스턴스. 없으면 nullptr.
99 UConstellationBase* FindRegisteredConstellation(const FName& ConstellationID) const;
100
101public:
102 // 전투가 시작돼 채팅 생성 레인을 돌린다. 이미 돌고 있으면 아무것도 하지 않는다.
103 void StartChatFlow();
104
105 // 사망·전투 종료 등으로 채팅 생성을 멈추고 아직 출력되지 않은 대기열을 비운다.
106 // 현재 반응 태그와 제목 확정 상태는 남겨, 리스폰 후 같은 상태로 재개할 수 있게 한다.
107 void StopChatFlow();
108
109 // 카드 선택이 확정됐을 때 호출. 반응 태그를 갱신하고 첫 태그 채팅을 즉시 한 줄 출력한다.
110 // 같은 태그가 기준 수만큼 모이면 방송 제목이 확정되고 이후 태그는 더 이상 바뀌지 않는다.
111 void HandleSituationSelected(USituationBase* Situation);
112
114 {
115 return CurrentReactionTag;
116 }
117
118 FORCEINLINE bool IsBroadcastTitleConfirmed() const
119 {
120 return bTitleConfirmed;
121 }
122
123public:
124 FOnConstellationReaction OnConstellationReaction;
125 FOnConstellationRegistered OnConstellationRegistered;
126 FOnBroadcastTitleConfirmed OnBroadcastTitleConfirmed;
127
128protected:
129 // 성좌 하나가 상황에 반응한다. 반응 문구가 비어 있으면 아무것도 하지 않는다.
130 void ReactToSituation(UConstellationBase* Constellation);
131
132 // 성좌 추첨이 실패했을 때 무엇이 걸렸는지 한 번에 찍는다. 진단용.
133 void DumpConstellationCandidates(const UStageManifest* Manifest, ESituationTag BroadcastTags, const TArray<FName>& ExcludedIDs) const;
134
135protected:
136 // 반응 태그를 갈아끼운다. 태그 레인의 대기열과 타이머만 초기화하고 일반 레인은 건드리지 않는다.
137 void SetReactionTag(ESituationTag NewTag);
138
139 // 1~3초 뒤 다음 채팅을 생성하도록 각 레인의 타이머를 다시 건다.
140 void ScheduleNormalSpawn();
141 void ScheduleTaggedSpawn();
142
143 void SpawnNormalChat();
144 void SpawnTaggedChat();
145
146 // 출력 시점마다 호출. 지연 폐기 → 태그 우선 → 일반 순으로 한 줄만 내보낸다.
147 void ProcessChatOutput();
148
149 // 가장 오래된 일반 채팅이 기준 시간을 넘겼으면 일반 대기열을 통째로 비운다.
150 void DiscardStaleNormalChats();
151
152 // 다음 출력 시점을 지금부터 다시 센다. 즉시 출력 직후에도 호출한다.
153 void RestartOutputTimer();
154
155 void OutputChat(const FConstellationChatEntry& Entry, bool bTagged);
156
157 // 성좌 하나로 대기열 항목을 만든다. 문구가 비어 있으면 false.
158 bool BuildChatEntry(UConstellationBase* Constellation, bool bTagged, FConstellationChatEntry& OutEntry) const;
159
160 // 시청 중인 성좌 가운데 해당 종류의 문구를 가진 성좌를 같은 확률로 하나 뽑는다.
161 UConstellationBase* DrawChatSpeaker(bool bTagged) const;
162
163 // 그 성좌가 이미 태그 대기열에 올라 있는지. 두 레인이 같은 성좌를 뽑았는지 판정에 쓴다.
164 bool IsWaitingInTaggedQueue(const UConstellationBase* Constellation) const;
165
166 // 시간 배율을 그대로 타는 월드 시각(초). 시간이 멈추면 대기 시간도 함께 멈춘다.
167 float GetChatTime() const;
168
169 static const UConstellationSettings* GetChatSettings();
170
171protected:
172 UPROPERTY(Transient)
173 TArray<FConstellationEntry> Entries;
174
175 // 아직 출력되지 않은 채팅. 태그 쪽이 항상 먼저 나간다.
176 UPROPERTY(Transient)
177 TArray<FConstellationChatEntry> TaggedQueue;
178
179 UPROPERTY(Transient)
180 TArray<FConstellationChatEntry> NormalQueue;
181
182 // 고른 카드의 방송 태그 이력. 같은 태그가 몇 개 모였는지 세는 데만 쓴다.
183 UPROPERTY(Transient)
184 TArray<ESituationTag> SelectedTagHistory;
185
186 // 지금 태그 채팅을 생성할 기준 태그. None 이면 태그 레인은 멈춘다.
187 ESituationTag CurrentReactionTag = ESituationTag::None;
188
189 // 방송 제목이 확정된 뒤에는 다른 카드를 골라도 반응 태그가 바뀌지 않는다.
190 uint8 bTitleConfirmed : 1 = false;
191
192 // 생성 레인이 도는 중인지. 사망·전투 종료로 내려간다.
193 uint8 bChatFlowRunning : 1 = false;
194
195private:
196 FTimerHandle NormalSpawnTimerHandle;
197 FTimerHandle TaggedSpawnTimerHandle;
198 FTimerHandle OutputTimerHandle;
199};
static constexpr FGlobalUserSettingsRuntime None
Definition GlobalUserSettingsRuntime.cpp:6
ESituationTag
Definition SituationTag.h:17
DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnConstellationReaction, UConstellationBase *, const FText &, bool)
DECLARE_MULTICAST_DELEGATE_OneParam(FOnConstellationRegistered, UConstellationBase *)
Definition ConstellationBase.h:35
Definition ConstellationSettings.h:12
Definition SituationBase.h:31
Definition StageManifest.h:161
Definition StreamingSubsystem.h:73
FOnConstellationReaction OnConstellationReaction
Definition StreamingSubsystem.h:124
FORCEINLINE bool IsBroadcastTitleConfirmed() const
Definition StreamingSubsystem.h:118
FOnConstellationRegistered OnConstellationRegistered
Definition StreamingSubsystem.h:125
FORCEINLINE ESituationTag GetCurrentReactionTag() const
Definition StreamingSubsystem.h:113
FOnBroadcastTitleConfirmed OnBroadcastTitleConfirmed
Definition StreamingSubsystem.h:126
Definition StreamingSubsystem.h:45
Definition StreamingSubsystem.h:30