diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..e12937c --- /dev/null +++ b/.mcp.json @@ -0,0 +1,15 @@ +{ + "mcpServers": + { + "nwiro": + { + "type": "http", + "url": "http://localhost:5353/mcp" + }, + "hyperpro": + { + "type": "http", + "url": "http://localhost:5354/mcp" + } + } +} \ No newline at end of file diff --git a/ARQUITETURA.md b/ARQUITETURA.md new file mode 100644 index 0000000..9000898 --- /dev/null +++ b/ARQUITETURA.md @@ -0,0 +1,713 @@ +# Arquitectura do Cliente ZMMO + +> Regras de organização do projecto Unreal `ZMMO` (Content + Source) e tutorial +> de como adicionar gameplay novo seguindo o padrão. **Este documento é +> normativo.** Qualquer estrutura nova no projecto tem de respeitar estas +> regras, ou justificar a excepção por escrito. + +Última actualização: 2026-05-11. + +> **Sumário de mudanças (2026-05-11):** adicionada secção de **temas sazonais +> de UI** (`UI/Themes/`), com tutorial §4.7, regra de "no hard ref a textura +> em widget" em §5 e política de activação em §1.10. + +--- + +## 1. Princípios fundamentais + +Estas são as regras que **não negociamos**: + +1. **Namespace do projecto.** Todo o conteúdo do jogo vive sob + `Content/ZMMO/`. Nada de assets soltos na raiz `Content/`. +2. **Organizar por feature, não por tipo de asset.** Não criamos pastas + `Meshes/`, `Textures/`, `Materials/` no nível alto. O Content Browser já + filtra por prefixo (`SM_`, `T_`, `M_`...). Pastas existem para refletir + **domínio de gameplay**. +3. **Self-contained por entidade.** Cada Mob, NPC ou Item vive numa pasta + própria que contém **todos os seus assets** (malha, animações, materiais, + texturas, áudio, VFX). Apagar a pasta = remover a entidade do jogo, sem + referências órfãs espalhadas. +4. **Plano (máximo 3 níveis úteis).** Se está a aninhar mais que isso, + provavelmente está a organizar errado. Excepção: dentro de uma entidade + self-contained, sub-pasta `Animations/` é permitida quando o número de + anims ultrapassa 5–6. +5. **DataTable manda em catálogo, Blueprint manda em comportamento.** Dados + tabulares (stats, drops, preços, descrições) vão em + `Content/ZMMO/Data/**/DT_*.uasset`. Comportamento vai em Blueprints + herdados das bases em `Core/`. Nunca misturar. +6. **Structs e Enums vivem em C++.** Toda `USTRUCT` (row de DataTable + inclusive) e toda `UENUM` é declarada em `Source/ZMMO/Data/`. Blueprint + Structs estão **proibidos** — eles corrompem em refactor e não dão tipos + fortes. +7. **Hierarquia de Entity.** Tudo que vive no mundo herda da mesma raiz: + `BP_Entity_Base` → (`BP_Player_Base` | `BP_NPC_Base` | `BP_Mob_Base`) → + instâncias concretas. Espelha a classe C++ `AZMMOEntity` em + `Source/ZMMO/Game/Entity/`. +8. **Lazy loading via `TSoftObjectPtr`.** Linhas de DataTable e referências + entre features usam soft pointers. Nada de hard ref para BPs de mob/item a + partir da DT mestre — caso contrário carregamos o mundo inteiro ao abrir o + inventário. +9. **`Developers/` e `ExternalContent/` fora do namespace `ZMMO/`.** Não + entram no cook (`Developers/`) e não poluem o nosso namespace + (`ExternalContent/` para Fab/Megascans/Marketplace). +10. **Temas de UI são data-driven, não hard-coded.** Widgets não têm hard + ref para textura/som sazonal — pedem ao `UZMMOThemeSubsystem` via uma + chave declarada em `EZMMOThemeKey` (C++). Veja §1.10 abaixo para a + política de activação. + +### 1.10. Política de activação de temas + +A UI suporta **temas** (`Default`, `Christmas`, `Halloween`, etc.). A escolha +do tema activo segue esta **ordem de precedência** em runtime: + +1. **Override de desenvolvimento** (`DefaultGame.ini`, chave `ActiveTheme=`). + Só lido fora de builds Shipping. Para QA testar Natal em Maio. +2. **Resposta autoritativa do servidor.** Quando o servidor Zeus envia o + opcode `ServerHello` com `ThemeId`, ele vence. É o único caminho válido + em produção. +3. **Calendário local do cliente** (`DT_ThemeCalendar`). Fallback antes do + login (tela de login/character-select aparece antes do servidor falar) e + se o servidor não enviar `ThemeId`. +4. **`DA_Theme_Default`.** Último recurso. Sempre presente, sempre carregado. + +**Por que servidor vence:** MMO precisa ligar Halloween fora da data +canónica, fazer evento-surpresa, A/B test de tema sem patch do cliente. + +**Por que data local existe:** sem ela, jogador que abre o jogo em 24 de +Dezembro vê tema Default até autenticar — quebra a magia sazonal. + +**Por que .ini só fora de Shipping:** evita que um jogador edite o ficheiro +e force um tema que não devia ter acesso (cosméticos pagos, por exemplo). + +--- + +## 2. Estrutura de pastas + +### 2.1. `Clients/ZMMO/Content/` + +``` +Content/ +│ +├── ZMMO/ ← namespace do projecto +│ │ +│ ├── Core/ ← bases que outros assets herdam +│ │ ├── Entity/ +│ │ │ ├── BP_Entity_Base.uasset ← herda AZMMOEntity (C++) +│ │ │ └── BPI_Entity.uasset ← interface comum +│ │ ├── Player/ +│ │ │ └── BP_Player_Base.uasset +│ │ ├── NPC/ +│ │ │ └── BP_NPC_Base.uasset +│ │ ├── Mob/ +│ │ │ ├── BP_Mob_Base.uasset +│ │ │ ├── BT_Mob_Default.uasset ← Behavior Tree base +│ │ │ └── BTT_Mob_*.uasset ← Tasks compartilhadas +│ │ ├── Item/ +│ │ │ ├── BP_Item_Base.uasset +│ │ │ └── BPI_Item.uasset +│ │ └── Network/ ← debug do UZMMOWorldSubsystem +│ │ +│ ├── Entities/ ← TODAS as instâncias concretas +│ │ ├── Players/ +│ │ │ └── Classes/ +│ │ │ ├── Warrior/ +│ │ │ │ ├── BP_Player_Warrior.uasset +│ │ │ │ ├── SK_Warrior.uasset +│ │ │ │ ├── ABP_Warrior.uasset +│ │ │ │ ├── M_Warrior.uasset +│ │ │ │ ├── T_Warrior_*.uasset +│ │ │ │ └── Animations/ +│ │ │ ├── Mage/ +│ │ │ └── Archer/ +│ │ │ +│ │ ├── NPCs/ +│ │ │ ├── Vendor_Blacksmith/ +│ │ │ │ ├── BP_NPC_Blacksmith.uasset +│ │ │ │ ├── SK_Blacksmith.uasset +│ │ │ │ ├── ABP_Blacksmith.uasset +│ │ │ │ └── ... +│ │ │ └── Questgiver_Elder/ +│ │ │ +│ │ └── Mobs/ +│ │ ├── Beasts/ ← família (organiza, não herda) +│ │ │ ├── Wolf_Gray/ ← pacote completo do mob +│ │ │ │ ├── BP_Mob_Wolf_Gray.uasset +│ │ │ │ ├── SK_Wolf.uasset +│ │ │ │ ├── PHY_Wolf.uasset +│ │ │ │ ├── M_Wolf.uasset +│ │ │ │ ├── MI_Wolf_Gray.uasset +│ │ │ │ ├── T_Wolf_*.uasset +│ │ │ │ ├── Animations/ +│ │ │ │ │ ├── ABP_Wolf.uasset +│ │ │ │ │ ├── AS_Wolf_Skel.uasset +│ │ │ │ │ ├── AM_Wolf_AttackBite.uasset +│ │ │ │ │ └── A_Wolf_{Idle,Run,Hit,Death}.uasset +│ │ │ │ ├── Audio/ +│ │ │ │ └── VFX/ +│ │ │ ├── Bear_Brown/ +│ │ │ └── Boar_Wild/ +│ │ ├── Undead/ +│ │ ├── Humanoids/ +│ │ ├── Dragons/ +│ │ └── Bosses/ +│ │ +│ ├── Data/ ← apenas DataTables (.uasset) +│ │ ├── Items/ +│ │ │ ├── DT_Items_Master.uasset +│ │ │ ├── DT_Items_Weapons.uasset +│ │ │ ├── DT_Items_Armor.uasset +│ │ │ ├── DT_Items_Consumables.uasset +│ │ │ └── DT_ItemDrops.uasset +│ │ ├── Mobs/ +│ │ │ ├── DT_Mobs_Master.uasset +│ │ │ └── DT_MobSpawns.uasset +│ │ ├── Players/ +│ │ │ ├── DT_Classes.uasset +│ │ │ └── DT_ExpCurve.uasset +│ │ ├── NPCs/ +│ │ │ ├── DT_NPCs.uasset +│ │ │ └── DT_Dialogs.uasset +│ │ ├── Abilities/ +│ │ │ ├── DT_Abilities.uasset +│ │ │ └── DT_StatusEffects.uasset +│ │ ├── Quests/ +│ │ │ ├── DT_Quests.uasset +│ │ │ └── DT_QuestRewards.uasset +│ │ └── World/ +│ │ └── DT_Zones.uasset +│ │ +│ ├── Items/ ← assets visuais (modelo/icon dos itens) +│ │ ├── Equipment/ +│ │ │ ├── Weapons/ +│ │ │ │ ├── Sword_Iron/ +│ │ │ │ │ ├── SM_Sword_Iron.uasset +│ │ │ │ │ ├── M_Sword_Iron.uasset +│ │ │ │ │ ├── T_Sword_Iron_*.uasset +│ │ │ │ │ └── T_Icon_Sword_Iron.uasset +│ │ │ │ └── Bow_Hunter/ +│ │ │ ├── Armor/ +│ │ │ └── Accessories/ +│ │ ├── Consumables/ +│ │ │ ├── Potion_Health/ +│ │ │ └── Potion_Mana/ +│ │ ├── Materials/ +│ │ └── Quest/ +│ │ +│ ├── Abilities/ ← VFX/Cues/Montagens (data fica em Data/) +│ │ ├── Combat/ Buffs/ Heals/ Movement/ +│ │ └── Shared/ +│ │ +│ ├── World/ +│ │ ├── Maps/ ← L_World_Open, L_City_*, L_Dungeon_* +│ │ ├── Instances/ +│ │ ├── Environment/ ← Architecture/ Nature/ Props/ +│ │ └── Interactables/ ← baús, portas, warps, recursos +│ │ +│ ├── Maps/ ← mapas que NÃO são de mundo +│ │ └── FrontEnd/ ← L_FrontEnd (boot/menu; GameMode via +│ │ World Settings = AZMMOFrontEndGameMode) +│ │ +│ ├── UI/ ← HUD, Login, CharacterSelect, Inventory, +│ │ │ Chat, Party, Guild, Trade, Quest, Map, +│ │ │ Shared, Icons +│ │ ├── Shared/ ← WBPs reutilizáveis (UI_Button_Master…) +│ │ ├── FrontEnd/ ← WBP_PrimaryGameLayout, DA_FrontEndScreenSet, +│ │ │ telas refinadas (Boot/Login/… vindas do Forge) +│ │ ├── Fonts/ ← Font_*/FF_* (Cinzel, Rajdhani) +│ │ ├── CommonUI/Style/ ← estilos CommonUI (espelha o Hyper) +│ │ │ ├── Button/ ← BSB_* (UCommonButtonStyle) +│ │ │ └── Text/ ← BST_* (UCommonTextStyle) +│ │ └── Themes/ ← temas sazonais (data-driven, ver §1.10) +│ │ ├── DA_Theme_Default.uasset ← sempre carregado, fallback +│ │ ├── DA_Theme_Christmas.uasset +│ │ ├── DA_Theme_Halloween.uasset +│ │ ├── DT_ThemeCalendar.uasset ← datas → ThemeId (fallback local) +│ │ ├── _Shared/ ← assets reutilizados entre temas +│ │ ├── Default/ ← assets do tema base +│ │ │ ├── HUD/ Login/ Inventory/ +│ │ │ ├── Audio/ MS_MainMenu.uasset +│ │ │ └── VFX/ +│ │ ├── Christmas/ ← sazonal +│ │ │ ├── HUD/ Login/ Inventory/ +│ │ │ ├── Audio/ MS_MainMenu_Christmas.uasset +│ │ │ └── VFX/ NS_Snow.uasset +│ │ └── Halloween/ ... ← mesma estrutura +│ ├── Effects/ ← VFX globais (Niagara) +│ ├── Audio/ ← Music, Ambient, SFX, Voice +│ ├── Input/ ← Enhanced Input +│ ├── Cinematics/ ← Sequencer +│ ├── Movement/ ← Mounts, Transport +│ ├── Localization/ ← StringTables +│ └── Debug/ ← Maps de smoke test +│ +├── Developers/ ← rascunho por dev (não cooka) +│ └── / +├── AutoCreated/ ← saída CRUA do Zeus UMG Forge (HTML→WBP). +│ └── / Quarentena: refina-se e MOVE p/ ZMMO/UI/ +│ FrontEnd/ antes de produção (não cooka cru) +├── ExternalContent/ ← Fab / Megascans / Marketplace +│ ├── Fab/ Megascans/ Marketplace/ +├── Collections/ +└── __ExternalActors__/ __ExternalObjects__/ ← World Partition (não mexer) +``` + +### 2.2. `Clients/ZMMO/Source/ZMMO/` + +``` +Source/ZMMO/ +├── ZMMO.Build.cs +├── ZMMO.h +├── ZMMO.cpp +│ +├── Game/ ← gameplay runtime (já existe) +│ ├── Entity/ ← AZMMOEntity + derivados +│ ├── Controller/ ← AZMMOPlayerController, +│ │ AZMMOFrontEndPlayerController +│ ├── Modes/ ← GameMode + GameInstance, +│ │ AZMMOFrontEndGameMode +│ ├── Network/ ← UZMMOWorldSubsystem +│ └── UI/ ← runtime de UI (não é contrato de dados) +│ ├── ZMMOThemeSubsystem.* ← resolução de tema +│ ├── Widgets/ ← UUIButton_Base, UUIPanel_Base +│ └── FrontEnd/ ← infra de navegação CommonUI: +│ UUIActivatableScreen_Base, +│ UUIPrimaryGameLayout_Base, +│ UUIManagerSubsystem (LocalPlayer), +│ UUIFrontEndFlowSubsystem (GameInstance), +│ UUIFrontEndScreenSet (UDataAsset) +│ +└── Data/ ← contrato de dados (USTRUCT + UENUM) + ├── ZMMOData.h ← header agregador (opcional) + ├── Items/ + │ ├── ItemRow.h ← FItemRow : public FTableRowBase + │ └── ItemTypes.h ← E_ItemType, E_ItemRarity, E_EquipSlot + ├── Mobs/ + │ ├── MobRow.h ← FMobRow + │ └── MobTypes.h ← E_MobFaction, E_MobBehavior + ├── Players/ + │ ├── ClassRow.h ← FClassRow + │ └── StatBlock.h ← FStatBlock (HP/MP/Sta/Atk/Def…) + ├── NPCs/ + │ ├── NPCRow.h + │ └── DialogRow.h + ├── Abilities/ + │ ├── AbilityRow.h + │ └── StatusEffectRow.h + ├── Quests/ + │ └── QuestRow.h + ├── UI/ + │ ├── ThemeKeys.h ← EZMMOThemeKey (HUD_Frame, Login_BG…) + │ ├── ThemeRow.h ← FThemeEntry (Key → SoftAsset) + │ ├── ThemeCalendarRow.h ← FThemeCalendarRow (data → ThemeId) + │ ├── FrontEndTypes.h ← EZMMOFrontEndState, EZMMOLobbyPage + │ └── UILayerTags.h/.cpp ← GameplayTags nativos UI.Layer.* + └── World/ + └── ZoneRow.h +``` + +Regra: **toda DT em `Content/ZMMO/Data/X/`** tem a `Row Structure` definida no +`.h` correspondente em **`Source/ZMMO/Data/X/`**. Espelhamento 1-para-1 nos +nomes das sub-pastas. + +O subsystem do tema (`UZMMOThemeSubsystem`) vive em +`Source/ZMMO/Game/UI/` — é gameplay/runtime, não contrato de dados, por isso +não fica em `Data/`. + +--- + +## 3. Convenções de nomenclatura + +### 3.1. Pastas + +- `PascalCase`, sem espaços, sem acentos. +- Nome no singular para categoria conceitual (`Mob`, `Item`, `Quest`). +- Nome no plural para colecção de instâncias (`Mobs/`, `Items/`, `Quests/`). +- Família de mob/item usa nome temático: `Beasts/`, `Undead/`, `Weapons/`. +- Instância individual usa `Tipo_Variante`: `Wolf_Gray`, `Sword_Iron`, + `Vendor_Blacksmith`. + +### 3.2. Assets (prefixo obrigatório) + +| Prefixo | Tipo | Exemplo | +|---------|-----------------------------------|-------------------------------| +| `BP_` | Blueprint Class | `BP_Mob_Wolf_Gray` | +| `BPI_` | Blueprint Interface | `BPI_Entity` | +| `UI_` | Widget Blueprint (estilo Hyper) | `UI_Button_Base`, `UI_Inventory_Slot` | +| `ABP_` | Animation Blueprint | `ABP_Wolf` | +| `BT_` | Behavior Tree | `BT_Mob_Default` | +| `BTT_` | Behavior Tree Task | `BTT_Mob_ChasePlayer` | +| `BTS_` | Behavior Tree Service | `BTS_Mob_FindTarget` | +| `BTD_` | Behavior Tree Decorator | `BTD_Mob_CanSeeTarget` | +| `BB_` | Blackboard | `BB_Mob_Default` | +| `SK_` | Skeletal Mesh | `SK_Wolf` | +| `SKEL_` | Skeleton | `SKEL_Wolf` | +| `SM_` | Static Mesh | `SM_Sword_Iron` | +| `PHY_` | Physics Asset | `PHY_Wolf` | +| `M_` | Material | `M_Wolf` | +| `MI_` | Material Instance | `MI_Wolf_Gray` | +| `MF_` | Material Function | `MF_NormalBlend` | +| `T_` | Texture | `T_Wolf_Diffuse` | +| `RT_` | Render Target | `RT_MiniMap` | +| `Font_` | Font (UFont, Composite) | `Font_Cinzel` | +| `FF_` | Font Face (UFontFace, Inline) | `FF_Cinzel_Bold` | +| `BSB_` | Common Button Style (UCommonButtonStyle) | `BSB_Button_Transparent` | +| `BST_` | Common Text Style (UCommonTextStyle) | `BST_Button` | +| `NS_` | Niagara System | `NS_Wolf_Death` | +| `NE_` | Niagara Emitter | `NE_Sparks_Small` | +| `SC_` | Sound Cue | `SC_Wolf_Growl` | +| `SW_` | Sound Wave | `SW_Wolf_Growl_01` | +| `MS_` | MetaSound Source | `MS_AmbientForest` | +| `MSA_` | Mix MetaSound Asset | `MSA_CombatMix` | +| `A_` | Animation Sequence | `A_Wolf_Idle` | +| `AM_` | Animation Montage | `AM_Wolf_AttackBite` | +| `AS_` | Anim State / Skeleton ref | `AS_Wolf_Skel` | +| `IA_` | Input Action | `IA_Move` | +| `IMC_` | Input Mapping Context | `IMC_Default` | +| `DA_` | Data Asset (PrimaryDataAsset) | `DA_Quest_FirstSteps` | +| `DT_` | Data Table | `DT_Items_Master` | +| `CT_` | Curve Table | `CT_DamageFalloff` | +| `C_` | Curve | `C_AttackPower` | +| `L_` | Level / Map | `L_World_Open` | +| `LS_` | Level Sequence | `LS_OpeningCinematic` | +| `GE_` | Gameplay Effect *(se GAS)* | `GE_StatusBleed` | +| `GA_` | Gameplay Ability *(se GAS)* | `GA_Fireball` | +| `GC_` | Gameplay Cue *(se GAS)* | `GC_Hit_Blood` | + +### 3.3. C++ (`Source/ZMMO/Data/`) + +- Struct: `FRow` quando é linha de DataTable. Ex: `FItemRow`, `FMobRow`. +- Struct genérica (não-DT): `F`. Ex: `FStatBlock`. +- Enum: `E`. Sempre `UENUM(BlueprintType)` e tipado: `enum class EItemType : uint8`. +- Header path espelha a pasta: `Source/ZMMO/Data/Items/ItemRow.h` → + `#include "Data/Items/ItemRow.h"`. + +**Exceção — classes base de UI (widgets):** a família de UI **não** leva o +prefixo `ZMMO` (ao contrário de `AZMMOEntity`/`UZMMOGameInstance`). Classe C++ +base de widget = `UUI_Base`, sempre `UCLASS(Abstract)` (não +instanciável direto; só os filhos derivam — padrão `_Abstract` do Hyper). +Ex.: `UUIButton_Base`, `UUIPanel_Base`, `UUIProgressBar_Base`. + +**Sub-regra — infra de navegação de front-end:** as classes que orquestram a +navegação CommonUI seguem o mesmo prefixo `UUI` (sem `ZMMO`) por coerência com +a família de UI, **mesmo não sendo widgets**. Assim: o layout raiz é +`UUIPrimaryGameLayout_Base` (Abstract, widget), a base de tela é +`UUIActivatableScreen_Base` (Abstract, widget), e os subsistemas de UI são +`UUIManagerSubsystem` (`ULocalPlayerSubsystem`) e `UUIFrontEndFlowSubsystem` +(`UGameInstanceSubsystem`). Atores de gameplay do front-end (GameMode, +PlayerController) **mantêm** o prefixo `AZMMO` — não são UI, espelham +`AZMMOGameMode`: `AZMMOFrontEndGameMode`, `AZMMOFrontEndPlayerController`. + +**Regra do UMG (importante):** um Widget Blueprint **não pode** herdar de outro +Widget Blueprint que tenha árvore de widgets (UMG aborta a compilação: "apenas +um deles deve ter árvore"). Portanto a camada abstrata é **só a classe C++** +`UUI_Base`. O WBP concreto (prefixo `UI_`, ver §3.2) herda **direto da +classe C++**: `UUIButton_Base` (C++ Abstract) → `UI_Button_Master` (WBP, árvore +própria). Variantes por feature são **WBPs irmãos** sobre a mesma classe C++ +(`UI_Button_` : `UUIButton_Base`), cada um com a própria árvore +(montada via `set_widget_tree`) — nunca encadeando WBPs. + +--- + +## 4. Tutoriais + +### 4.1. Adicionar um Mob novo (ex: `Wolf_Gray`) + +**Pré-requisito:** já existe `FMobRow` em +`Source/ZMMO/Data/Mobs/MobRow.h` e `DT_Mobs_Master` em +`Content/ZMMO/Data/Mobs/`. + +1. Criar a pasta `Content/ZMMO/Entities/Mobs/Beasts/Wolf_Gray/`. +2. Importar **todos** os assets do lobo dentro dela: + - `SK_Wolf`, `SKEL_Wolf`, `PHY_Wolf`. + - `T_Wolf_Diffuse`, `T_Wolf_Normal`, `T_Wolf_ORM`. + - `M_Wolf` e a variante `MI_Wolf_Gray`. + - `Animations/`: `ABP_Wolf`, `AS_Wolf_Skel`, `A_Wolf_*`, `AM_Wolf_*`. + - `Audio/`: `SC_Wolf_Growl`, `SC_Wolf_Footstep`. + - `VFX/`: `NS_Wolf_Death`. +3. Criar `BP_Mob_Wolf_Gray` **herdando** de `Core/Mob/BP_Mob_Base`. +4. Atribuir no BP: `SK_Wolf` no Mesh, `ABP_Wolf` no AnimClass, + `BT_Mob_Default` (ou um BT próprio se necessário) no AIController. +5. Abrir `Content/ZMMO/Data/Mobs/DT_Mobs_Master.uasset`. Adicionar linha + `Wolf_Gray`: + - `BlueprintRef` = `BP_Mob_Wolf_Gray` (via `TSoftObjectPtr` — soft). + - `Stats` = `FStatBlock` com HP/Atk/Def adequados. + - `Faction` = `EMobFaction::Hostile`. + - `DropTableRow` = `WolfDrops` (linha em `DT_ItemDrops`). +6. Se for dropar loot novo, abrir `DT_ItemDrops` e adicionar a linha + `WolfDrops` com array de `FItemRow` ids + chances. + +**Regra:** nunca colocar um asset de `Wolf_Gray` fora de +`Entities/Mobs/Beasts/Wolf_Gray/`. Apagar a pasta tem de remover o mob por +inteiro. + +### 4.2. Adicionar um Item novo (ex: `Sword_Iron`) + +**Pré-requisito:** `FItemRow` em `Source/ZMMO/Data/Items/ItemRow.h`, +`DT_Items_Master` em `Content/ZMMO/Data/Items/`. + +1. Criar `Content/ZMMO/Items/Equipment/Weapons/Sword_Iron/`. +2. Importar `SM_Sword_Iron`, texturas `T_Sword_Iron_*`, material + `M_Sword_Iron`, e o ícone `T_Icon_Sword_Iron`. +3. Abrir `DT_Items_Master`. Adicionar linha `Sword_Iron`: + - `Type` = `EItemType::Weapon`. + - `Rarity` = `EItemRarity::Common`. + - `EquipSlot` = `EEquipSlot::MainHand`. + - `WorldMesh` = `SM_Sword_Iron` (soft). + - `Icon` = `T_Icon_Sword_Iron` (soft). + - `DisplayName`, `Description` via `StringTable` em `Localization/`. + +**Sem Blueprint por item.** O item é "data only" — quando precisar de +comportamento especial (ex: poção que cura), criar `BP_Item_Potion_Health` +herdando de `Core/Item/BP_Item_Base` e apontar a coluna `BehaviorClass` da +linha para esse BP. A maioria dos itens **não** tem BP próprio. + +### 4.3. Adicionar uma Classe de Player (ex: `Warrior`) + +1. Criar `Content/ZMMO/Entities/Players/Classes/Warrior/`. +2. Importar `SK_Warrior`, anims, materiais, etc. (mesmo padrão self-contained + do mob). +3. Criar `BP_Player_Warrior` herdando de `Core/Player/BP_Player_Base`. +4. Adicionar linha `Warrior` em `DT_Classes`: + - `BlueprintRef` = `BP_Player_Warrior` (soft). + - `BaseStats` = `FStatBlock`. + - `LevelUpStats` = `FStatBlock` (delta por nível). + - `StartingAbilities` = `TArray` de ids em `DT_Abilities`. + +### 4.4. Adicionar um NPC (ex: `Vendor_Blacksmith`) + +1. Criar `Content/ZMMO/Entities/NPCs/Vendor_Blacksmith/` (self-contained). +2. Criar `BP_NPC_Blacksmith` herdando de `Core/NPC/BP_NPC_Base`. +3. Adicionar linha `Vendor_Blacksmith` em `DT_NPCs`: + - `BlueprintRef` = `BP_NPC_Blacksmith` (soft). + - `Role` = `ENPCRole::Vendor`. + - `ShopInventory` = `TArray` de ids em `DT_Items_Master`. + - `DialogRoot` = id em `DT_Dialogs`. + +### 4.5. Adicionar uma Row Struct em C++ + +Exemplo: nova struct `FCraftRecipeRow` para receitas de crafting. + +1. Criar `Source/ZMMO/Data/Crafting/CraftRecipeRow.h`: + +```cpp +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "CraftRecipeRow.generated.h" + +USTRUCT(BlueprintType) +struct ZMMO_API FCraftRecipeRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly) + FName OutputItem; + + UPROPERTY(EditAnywhere, BlueprintReadOnly) + int32 OutputQuantity = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly) + TArray Ingredients; +}; +``` + +2. Recompilar o módulo `ZMMO`. +3. No editor: `Content/ZMMO/Data/Crafting/` → `Add → Miscellaneous → Data Table` + → escolher `CraftRecipeRow` como Row Structure → salvar como + `DT_Crafting_Recipes`. + +### 4.6. Conectar uma DataTable a um Blueprint em runtime + +```cpp +// Em BP_Mob_Base (ou na sua classe C++ AZMMOMobBase): +// +// UPROPERTY(EditDefaultsOnly, Category="Data") +// TSoftObjectPtr MobsTable; +// +// UPROPERTY(EditAnywhere, Category="Data") +// FName MobId; +// +// void AZMMOMobBase::BeginPlay() +// { +// Super::BeginPlay(); +// if (UDataTable* Table = MobsTable.LoadSynchronous()) +// { +// if (FMobRow* Row = Table->FindRow(MobId, TEXT("Mob init"))) +// { +// ApplyStats(Row->Stats); +// Faction = Row->Faction; +// DropTableRowId = Row->DropTableRow; +// } +// } +// } +``` + +Regra: o `MobId` é setado pelo `UZMMOWorldSubsystem` quando o servidor envia +o opcode de spawn. O cliente nunca instancia mob "por nome" — sempre via id. + +### 4.7. Adicionar um tema sazonal (ex: `Christmas`) + +**Pré-requisito:** já existem `EZMMOThemeKey` em +`Source/ZMMO/Data/UI/ThemeKeys.h`, `FThemeEntry` em `ThemeRow.h`, e o +`UZMMOThemeSubsystem` em `Source/ZMMO/Game/UI/`. + +1. Criar a pasta `Content/ZMMO/UI/Themes/Christmas/` com sub-pastas que + espelham as features de UI a substituir: `HUD/`, `Login/`, `Inventory/`, + `Audio/`, `VFX/`. Não precisa criar sub-pastas para features que o tema + **não** altera. +2. Importar os assets variantes lá dentro. Manter os **mesmos nomes** que os + equivalentes em `Themes/Default/` ajuda a comparar: + - `Themes/Default/HUD/T_HUD_Frame.uasset` ↔ + `Themes/Christmas/HUD/T_HUD_Frame.uasset`. +3. Criar `DA_Theme_Christmas.uasset` em `Content/ZMMO/UI/Themes/` como + `PrimaryDataAsset` herdando da classe `UZMMOThemeDataAsset` (a classe + vive em `Source/ZMMO/Game/UI/`). +4. Preencher o `TMap` do data asset **apenas com + as chaves que o tema sobrescreve**. As que ficam vazias caem + automaticamente para `DA_Theme_Default`. +5. Adicionar linha em `DT_ThemeCalendar`: + - `ThemeId` = `Christmas`. + - `StartDate` = `12-15`. + - `EndDate` = `01-05`. + - `Priority` = `10` (caso duas datas se sobreponham). +6. No servidor Zeus, quando quiser activar o tema (autoritativo), enviar o + opcode `ServerHello` com `ThemeId = "Christmas"`. Em ausência disso, o + cliente usa o calendário do passo 5. + +**Adicionar uma chave nova de tema** (ex: tela de loading sazonal): + +1. Abrir `Source/ZMMO/Data/UI/ThemeKeys.h` e adicionar o valor ao enum: + ```cpp + UENUM(BlueprintType) + enum class EZMMOThemeKey : uint8 + { + HUD_Frame, + Login_Background, + Login_Logo, + Inventory_SlotEmpty, + LoadingScreen, // <-- nova chave + MainMenu_Music, + }; + ``` +2. Recompilar o módulo `ZMMO`. +3. Abrir `DA_Theme_Default` no editor e preencher a nova chave **obrigatoriamente** + (Default tem de ter todas). +4. Preencher nos temas sazonais apenas se quiser substituir. + +**Regra de ouro do tema:** widget consome via subsystem, nunca por hard ref. + +```cpp +// Em vez de: +// UPROPERTY(EditAnywhere) TObjectPtr HudFrameTex; +// +// Faz: +// const UZMMOThemeSubsystem* Theme = GetGameInstance()->GetSubsystem(); +// SetBrushFromSoftTexture(Theme->GetTexture(EZMMOThemeKey::HUD_Frame)); +``` + +O subsystem aplica fallback internamente: pergunta ao tema activo; se a +chave não estiver preenchida, devolve a do `Default`. + +### 4.8. Adicionar uma tela de front-end (ex: `Login`) + +**Pré-requisito:** já existem `UUIActivatableScreen_Base` e +`UUIFrontEndFlowSubsystem` em `Source/ZMMO/Game/UI/FrontEnd/`, o +`WBP_PrimaryGameLayout` e o `DA_FrontEndScreenSet` em +`Content/ZMMO/UI/FrontEnd/`. + +Fluxo geral: **Boot → Connecting → Login → ServerSelect → Lobby → EnteringWorld +→ InWorld**. O **Lobby** é o hub principal logado; suas páginas internas +(CharacterSelect, CharacterCreate, Shop, Settings…) são `EZMMOLobbyPage`, +navegadas por um stack CommonUI **dentro** da tela do Lobby — não são estados +de topo do fluxo. + +1. Prototipar a tela em HTML/CSS em `Tools/Templates/MMO_Widget/` (ou usar os + templates já existentes). +2. Rodar o Zeus UMG Forge (HTML→UMG). Saída crua: `Content/AutoCreated//`. +3. Abrir o `WBP_*` gerado e **reparent** a classe pai para + `UUIActivatableScreen_Base` (a base é `UCommonActivatableWidget`; o WBP tem + árvore própria — respeita §3.3, nunca encadeia WBP→WBP). +4. **Reconectar tema:** o Forge gera hard ref de textura (proibido §5). + Substituir por consumo via `UZMMOThemeSubsystem` por `EZMMOThemeKey` no + override de `RefreshUIStyle`; remontar botões/painéis com os widgets + compartilhados (`UI_Button_Master`, `UI_Panel_Master`). +5. **Mover** o asset refinado de `Content/AutoCreated/…` para + `Content/ZMMO/UI/FrontEnd/` (o cru não cooka). +6. Registrar no `DA_FrontEndScreenSet`: `StateScreens[EZMMOFrontEndState::Login]` + = soft class do WBP refinado (páginas do Lobby vão no map de + `EZMMOLobbyPage` da tela de Lobby). Sem registro, o flow faz no-op + log. + +**Regra:** uma tela nunca segura hard ref a asset de tema (textura/som/VFX) — +sempre via `UZMMOThemeSubsystem` por `EZMMOThemeKey` (igual §4.7 e §5). + +--- + +## 5. O que **NÃO** fazer + +- **Não** criar pastas `Meshes/`, `Textures/`, `Materials/` no nível alto. +- **Não** criar `Blueprint Struct` no editor. Toda struct é C++. +- **Não** referenciar BPs de mob/item com `TObjectPtr<>` (hard ref) a partir + de DataTables ou Subsystems globais — usar `TSoftObjectPtr<>`. +- **Não** misturar assets de uma entidade com assets de outra. Cada + Wolf_Gray, Sword_Iron, etc. é uma pasta isolada. +- **Não** colocar nada na raiz `Content/`. Tudo é `Content/ZMMO/...` ou + `Content/{Developers,AutoCreated,ExternalContent}/...`. `AutoCreated/` é + quarentena do Zeus UMG Forge: refina-se e **move** para `ZMMO/UI/FrontEnd/` + antes de produção; o cru não cooka. +- **Não** importar conteúdo do Fab/Megascans directo para dentro de `ZMMO/`. + Vai sempre para `ExternalContent/` e, se quiser usar, **referencia** dali. +- **Não** colocar dados tabulares em Blueprint (lista hardcoded de itens, + array de stats no ABP). Move para DataTable. +- **Não** duplicar `FStatBlock` em C++ se já existe — importar de + `Source/ZMMO/Data/Players/StatBlock.h`. +- **Não** colocar hard ref de textura/som de tema dentro de um Widget + (`TObjectPtr ChristmasFrame` é proibido). Widgets pedem ao + `UZMMOThemeSubsystem` via `EZMMOThemeKey`. Hard ref a asset de tema + bloqueia a troca em runtime e quebra a política de fallback. Vale também + para **telas de front-end** (Boot/Login/ServerSelect/Lobby/…): a saída crua + do Forge traz hard ref — tem de ser reconectada ao subsystem antes do merge + (ver §4.8). +- **Não** criar chave de tema "ad-hoc" como `FName("HUD.Frame")`. Toda chave + é entrada do enum C++ `EZMMOThemeKey`. String literal é proibida — o + compilador tem de quebrar quando alguém esquecer de adicionar a chave. +- **Não** preencher um tema sazonal com **todas** as chaves só porque o + Default preenche. Tema sazonal só lista o que **substitui**; o resto cai + no Default automaticamente. + +--- + +## 6. Excepções permitidas + +- Dentro de uma entidade self-contained, sub-pasta `Animations/` é OK quando + passa de 5–6 anims. O mesmo vale para `Audio/` e `VFX/` próprios da + entidade. +- `Items/.../Equipment/Weapons/Sword_Iron/` mantém o ícone `T_Icon_*` junto + do mesh — é a única excepção em que textura e mesh ficam na mesma pasta + raiz da entidade (porque o ícone é parte do item, não um asset solto). +- Skeleton compartilhado entre variantes (ex: `Wolf_Gray`, `Wolf_Black`) + pode viver em `Entities/Mobs/Beasts/_Shared/Wolf/` se as variantes + reutilizarem o mesmo `SK_` e `Animations/`. Pasta começa com `_` para + ordenar primeiro no Content Browser. + +--- + +## 7. Referências externas + +- [Allar UE5 Style Guide](https://github.com/Allar/ue5-style-guide) — base + das nossas convenções de nomenclatura e estrutura. +- [Epic – Unreal Engine Directory Structure](https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-directory-structure). +- [Lyra Project Structure](https://github.com/iliags/LyraGameVault/blob/main/Lyra%20Project%20Structure.md) + — modelo Epic para projecto multiplayer escalável. +- [Hyperdense – UE5 folder structure best practices](https://medium.com/@sarah.hyperdense/ue5-project-folder-structure-and-organization-best-practices-b9e487c330a3). +- [Epic Forum – Using DataTables, Structs and DataAssets for Inventory](https://forums.unrealengine.com/t/using-data-tables-structs-and-data-assets-for-an-inventory/2381408). +- [Epic Forum – Item system: how to structure/store data](https://forums.unrealengine.com/t/item-system-how-to-structure-store-data/2170364). + +--- + +## 8. Como mudar este documento + +Este `.md` é a fonte de verdade da arquitectura do cliente. Mudanças +estruturais (nova pasta no nível alto, mudança de convenção de nome, novo +tipo de asset) **precisam de PR alterando este ficheiro primeiro**. Sem PR +neste documento, não se mexe na árvore real. diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini index 79b70b5..e4c9bb4 100644 --- a/Config/DefaultEditor.ini +++ b/Config/DefaultEditor.ini @@ -7,3 +7,8 @@ bReplaceBlueprintWithClass= true bDontLoadBlueprintOutsideEditor= true bBlueprintIsNotBlueprintType= true +[/Script/AdvancedPreviewScene.SharedProfiles] ++Profiles=(ProfileName="Epic Headquarters",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,bShowGrid=False,EnvironmentColor=(R=0.200000,G=0.200000,B=0.200000,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",bPostProcessingEnabled=True,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomGaussianIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionIntensity=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainTexelSize=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomGaussianIntensity=1.000000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionIntensity=1.000000,BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-10.000000,AutoExposureMaxBrightness=20.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainTexelSize=1.000000,FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=True,bShowMeshEdges=False) ++Profiles=(ProfileName="Grey Wireframe",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=False,bShowFloor=False,bShowGrid=True,EnvironmentColor=(R=0.039216,G=0.039216,B=0.039216,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",bPostProcessingEnabled=False,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomGaussianIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionIntensity=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainTexelSize=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomGaussianIntensity=1.000000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionIntensity=1.000000,BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-10.000000,AutoExposureMaxBrightness=20.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainTexelSize=1.000000,FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=False,bShowMeshEdges=True) ++Profiles=(ProfileName="Grey Ambient",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=4.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=2.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,bShowGrid=True,EnvironmentColor=(R=0.200000,G=0.200000,B=0.200000,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/T_GreyAmbient",bPostProcessingEnabled=False,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomGaussianIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionIntensity=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainTexelSize=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomGaussianIntensity=1.000000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionIntensity=1.000000,BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-10.000000,AutoExposureMaxBrightness=20.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainTexelSize=1.000000,FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=False,bShowMeshEdges=False) + diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index cbad2e0..265a76e 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -1,6 +1,6 @@ [/Script/EngineSettings.GameMapsSettings] -GameDefaultMap=/Game/ThirdPerson/Lvl_ThirdPerson.Lvl_ThirdPerson -EditorStartupMap=/Game/ThirdPerson/Lvl_ThirdPerson.Lvl_ThirdPerson +GameDefaultMap=/Game/ZMMO/Maps/FrontEnd/L_FrontEnd.L_FrontEnd +EditorStartupMap=/Game/ZMMO/Maps/FrontEnd/L_FrontEnd.L_FrontEnd ; GameMode/PlayerController/PlayerCharacter agora moram em C++ (Game/Modes/Entity/Controller). ; O motor pode spawnar AZMMOGameMode directamente; um BP filho continua opcional. GlobalDefaultGameMode=/Script/ZMMO.ZMMOGameMode @@ -75,6 +75,8 @@ DefaultGraphicsPerformance=Maximum AppliedDefaultGraphicsPerformance=Maximum [/Script/Engine.Engine] +; CommonUI: viewport client que roteia input (teclado/gamepad) e foco para a UI. +GameViewportClientClassName=/Script/CommonUI.CommonGameViewportClient +ActiveGameNameRedirects=(OldGameName="TP_ThirdPerson",NewGameName="/Script/ZMMO") +ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPerson",NewGameName="/Script/ZMMO") ; Redirects do template antigo para a nova arquitectura (Game/Modes/Entity/Controller). diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini index 97b1be6..2b56716 100644 --- a/Config/DefaultGame.ini +++ b/Config/DefaultGame.ini @@ -1,3 +1,31 @@ [/Script/EngineSettings.GeneralProjectSettings] ProjectID=FC3E256F43B2AFD43009F4949B0814BE ProjectName=Third Person Game Template + +; ----------------------------------------------------------------------------- +; ZMMO Theme subsystem (see Source/ZMMO/Game/UI/ZMMOThemeSubsystem.h and +; ARQUITETURA.md §1.10 / §4.7). +; +; - DefaultThemeAsset is the fallback theme (must define every EZMMOThemeKey). +; - ThemeRegistry maps ThemeId -> seasonal DA_Theme_* asset. +; - CalendarTable points to DT_ThemeCalendar (FThemeCalendarRow rows). +; - UIStyleTable points to DT_UI_Styles (FUIStyleRow rows): tokens de estilo +; (cores/fontes/dimensões) keyed por ThemeId; linha "Default" é o fallback. +; - DevThemeOverride forces a theme in non-Shipping builds only. Keep commented +; in production. +; +; Paths use the /Game prefix (cooked Content namespace). Uncomment after the +; assets are actually created in the editor. +; ----------------------------------------------------------------------------- +[/Script/ZMMO.ZMMOThemeSubsystem] +;DefaultThemeAsset=/Game/ZMMO/UI/Themes/DA_Theme_Default.DA_Theme_Default +;+ThemeRegistry=(("Christmas", "/Game/ZMMO/UI/Themes/DA_Theme_Christmas.DA_Theme_Christmas")) +;+ThemeRegistry=(("Halloween", "/Game/ZMMO/UI/Themes/DA_Theme_Halloween.DA_Theme_Halloween")) +;CalendarTable=/Game/ZMMO/UI/Themes/DT_ThemeCalendar.DT_ThemeCalendar +UIStyleTable=/Game/ZMMO/Data/UI/DT_UI_Styles.DT_UI_Styles +;DevThemeOverride=Christmas + +[/Script/ZMMO.UIFrontEndFlowSubsystem] +; Mapa estado->tela. O DA já existe (RootLayoutClass = WBP_PrimaryGameLayout); +; StateScreens fica vazio até os WBPs de página virem do Zeus UMG Forge (§4.8). +ScreenSetAsset=/Game/ZMMO/UI/FrontEnd/DA_FrontEndScreenSet.DA_FrontEndScreenSet diff --git a/Content/Variant_Combat/Anims/ABP_Manny_Combat.uasset b/Content/Variant_Combat/Anims/ABP_Manny_Combat.uasset deleted file mode 100644 index 3c308d1..0000000 Binary files a/Content/Variant_Combat/Anims/ABP_Manny_Combat.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Anims/AM_ChargedAttack.uasset b/Content/Variant_Combat/Anims/AM_ChargedAttack.uasset deleted file mode 100644 index 56daa84..0000000 Binary files a/Content/Variant_Combat/Anims/AM_ChargedAttack.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Anims/AM_ComboAttack.uasset b/Content/Variant_Combat/Anims/AM_ComboAttack.uasset deleted file mode 100644 index df8067e..0000000 Binary files a/Content/Variant_Combat/Anims/AM_ComboAttack.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/BP_CombatAIController.uasset b/Content/Variant_Combat/Blueprints/AI/BP_CombatAIController.uasset deleted file mode 100644 index 614d0da..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/BP_CombatAIController.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemy.uasset b/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemy.uasset deleted file mode 100644 index 7705d1a..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemy.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemySpawner.uasset b/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemySpawner.uasset deleted file mode 100644 index ba3573f..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemySpawner.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Evade.uasset b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Evade.uasset deleted file mode 100644 index 912ba02..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Evade.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Fallback.uasset b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Fallback.uasset deleted file mode 100644 index 681bf0d..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Fallback.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Flank.uasset b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Flank.uasset deleted file mode 100644 index 18724ef..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Flank.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/AI/ST_CombatEnemy.uasset b/Content/Variant_Combat/Blueprints/AI/ST_CombatEnemy.uasset deleted file mode 100644 index 2ba0933..0000000 Binary files a/Content/Variant_Combat/Blueprints/AI/ST_CombatEnemy.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Enemy.uasset b/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Enemy.uasset deleted file mode 100644 index 4d81109..0000000 Binary files a/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Enemy.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Player.uasset b/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Player.uasset deleted file mode 100644 index ae20d4b..0000000 Binary files a/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Player.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/BP_CombatCharacter.uasset b/Content/Variant_Combat/Blueprints/BP_CombatCharacter.uasset deleted file mode 100644 index 6ee8e69..0000000 Binary files a/Content/Variant_Combat/Blueprints/BP_CombatCharacter.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/BP_CombatGameMode.uasset b/Content/Variant_Combat/Blueprints/BP_CombatGameMode.uasset deleted file mode 100644 index a18bcbb..0000000 Binary files a/Content/Variant_Combat/Blueprints/BP_CombatGameMode.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/BP_CombatPlayerController.uasset b/Content/Variant_Combat/Blueprints/BP_CombatPlayerController.uasset deleted file mode 100644 index e24902e..0000000 Binary files a/Content/Variant_Combat/Blueprints/BP_CombatPlayerController.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatActivationVolume.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatActivationVolume.uasset deleted file mode 100644 index 90dd2c2..0000000 Binary files a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatActivationVolume.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatCheckpointVolume.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatCheckpointVolume.uasset deleted file mode 100644 index 9682ec7..0000000 Binary files a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatCheckpointVolume.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDamageableBox.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDamageableBox.uasset deleted file mode 100644 index e0d89a8..0000000 Binary files a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDamageableBox.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDummy.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDummy.uasset deleted file mode 100644 index e687bb9..0000000 Binary files a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDummy.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatLavaFloor.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatLavaFloor.uasset deleted file mode 100644 index fb931fd..0000000 Binary files a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatLavaFloor.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Input/Actions/IA_ChargedAttack.uasset b/Content/Variant_Combat/Input/Actions/IA_ChargedAttack.uasset deleted file mode 100644 index 665e2b1..0000000 Binary files a/Content/Variant_Combat/Input/Actions/IA_ChargedAttack.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Input/Actions/IA_ComboAttack.uasset b/Content/Variant_Combat/Input/Actions/IA_ComboAttack.uasset deleted file mode 100644 index 4a6fdfa..0000000 Binary files a/Content/Variant_Combat/Input/Actions/IA_ComboAttack.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Input/Actions/IA_ToggleCameraSide.uasset b/Content/Variant_Combat/Input/Actions/IA_ToggleCameraSide.uasset deleted file mode 100644 index 12595e9..0000000 Binary files a/Content/Variant_Combat/Input/Actions/IA_ToggleCameraSide.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Input/BPI_TouchInterface_Combat.uasset b/Content/Variant_Combat/Input/BPI_TouchInterface_Combat.uasset deleted file mode 100644 index 744ad76..0000000 Binary files a/Content/Variant_Combat/Input/BPI_TouchInterface_Combat.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Input/IMC_Combat.uasset b/Content/Variant_Combat/Input/IMC_Combat.uasset deleted file mode 100644 index d58afcf..0000000 Binary files a/Content/Variant_Combat/Input/IMC_Combat.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Input/UI_TouchInterface_Combat.uasset b/Content/Variant_Combat/Input/UI_TouchInterface_Combat.uasset deleted file mode 100644 index 8be9c1b..0000000 Binary files a/Content/Variant_Combat/Input/UI_TouchInterface_Combat.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Lvl_Combat.umap b/Content/Variant_Combat/Lvl_Combat.umap deleted file mode 100644 index caa3ad0..0000000 Binary files a/Content/Variant_Combat/Lvl_Combat.umap and /dev/null differ diff --git a/Content/Variant_Combat/Materials/MI_Box_Destroyed.uasset b/Content/Variant_Combat/Materials/MI_Box_Destroyed.uasset deleted file mode 100644 index a690dfa..0000000 Binary files a/Content/Variant_Combat/Materials/MI_Box_Destroyed.uasset and /dev/null differ diff --git a/Content/Variant_Combat/Materials/M_Lava.uasset b/Content/Variant_Combat/Materials/M_Lava.uasset deleted file mode 100644 index 2005b6c..0000000 Binary files a/Content/Variant_Combat/Materials/M_Lava.uasset and /dev/null differ diff --git a/Content/Variant_Combat/UI/UI_LifeBar.uasset b/Content/Variant_Combat/UI/UI_LifeBar.uasset deleted file mode 100644 index a192e4e..0000000 Binary files a/Content/Variant_Combat/UI/UI_LifeBar.uasset and /dev/null differ diff --git a/Content/Variant_Combat/VFX/NS_Damage.uasset b/Content/Variant_Combat/VFX/NS_Damage.uasset deleted file mode 100644 index a1d8ecb..0000000 Binary files a/Content/Variant_Combat/VFX/NS_Damage.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Anims/ABP_Manny_Platforming.uasset b/Content/Variant_Platforming/Anims/ABP_Manny_Platforming.uasset deleted file mode 100644 index 9efeee9..0000000 Binary files a/Content/Variant_Platforming/Anims/ABP_Manny_Platforming.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Anims/AM_Dash.uasset b/Content/Variant_Platforming/Anims/AM_Dash.uasset deleted file mode 100644 index 6477cbc..0000000 Binary files a/Content/Variant_Platforming/Anims/AM_Dash.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Blueprints/BP_PlatformingCharacter.uasset b/Content/Variant_Platforming/Blueprints/BP_PlatformingCharacter.uasset deleted file mode 100644 index 2f62d75..0000000 Binary files a/Content/Variant_Platforming/Blueprints/BP_PlatformingCharacter.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Blueprints/BP_PlatformingGameMode.uasset b/Content/Variant_Platforming/Blueprints/BP_PlatformingGameMode.uasset deleted file mode 100644 index 645451f..0000000 Binary files a/Content/Variant_Platforming/Blueprints/BP_PlatformingGameMode.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Blueprints/BP_PlatformingPlayerController.uasset b/Content/Variant_Platforming/Blueprints/BP_PlatformingPlayerController.uasset deleted file mode 100644 index 4294554..0000000 Binary files a/Content/Variant_Platforming/Blueprints/BP_PlatformingPlayerController.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Input/Actions/IA_Dash.uasset b/Content/Variant_Platforming/Input/Actions/IA_Dash.uasset deleted file mode 100644 index 690cbd5..0000000 Binary files a/Content/Variant_Platforming/Input/Actions/IA_Dash.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Input/BPI_TouchInterface_Platforming.uasset b/Content/Variant_Platforming/Input/BPI_TouchInterface_Platforming.uasset deleted file mode 100644 index 293820a..0000000 Binary files a/Content/Variant_Platforming/Input/BPI_TouchInterface_Platforming.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Input/IMC_Platforming.uasset b/Content/Variant_Platforming/Input/IMC_Platforming.uasset deleted file mode 100644 index 05ac570..0000000 Binary files a/Content/Variant_Platforming/Input/IMC_Platforming.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Input/UI_TouchInterface_Platforming.uasset b/Content/Variant_Platforming/Input/UI_TouchInterface_Platforming.uasset deleted file mode 100644 index ec067ea..0000000 Binary files a/Content/Variant_Platforming/Input/UI_TouchInterface_Platforming.uasset and /dev/null differ diff --git a/Content/Variant_Platforming/Lvl_Platforming.umap b/Content/Variant_Platforming/Lvl_Platforming.umap deleted file mode 100644 index 3814014..0000000 Binary files a/Content/Variant_Platforming/Lvl_Platforming.umap and /dev/null differ diff --git a/Content/Variant_Platforming/VFX/NS_Jump_Trail.uasset b/Content/Variant_Platforming/VFX/NS_Jump_Trail.uasset deleted file mode 100644 index 3cfe81a..0000000 Binary files a/Content/Variant_Platforming/VFX/NS_Jump_Trail.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Anims/ABP_Manny_SideScroller.uasset b/Content/Variant_SideScrolling/Anims/ABP_Manny_SideScroller.uasset deleted file mode 100644 index 2f401c0..0000000 Binary files a/Content/Variant_SideScrolling/Anims/ABP_Manny_SideScroller.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingAIController.uasset b/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingAIController.uasset deleted file mode 100644 index 313522c..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingAIController.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingNPC.uasset b/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingNPC.uasset deleted file mode 100644 index 466cfab..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingNPC.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/AI/ST_SideScrollingNPC.uasset b/Content/Variant_SideScrolling/Blueprints/AI/ST_SideScrollingNPC.uasset deleted file mode 100644 index e8d35a7..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/AI/ST_SideScrollingNPC.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCameraManager.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCameraManager.uasset deleted file mode 100644 index b1fcdb0..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCameraManager.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCharacter.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCharacter.uasset deleted file mode 100644 index 1285a38..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCharacter.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingGameMode.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingGameMode.uasset deleted file mode 100644 index ea7afa8..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingGameMode.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingPlayerController.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingPlayerController.uasset deleted file mode 100644 index 23deb13..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingPlayerController.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingMovingPlatform.uasset b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingMovingPlatform.uasset deleted file mode 100644 index 516bcc0..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingMovingPlatform.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingPickup.uasset b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingPickup.uasset deleted file mode 100644 index d67ff7d..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingPickup.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingSoftPlatform.uasset b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingSoftPlatform.uasset deleted file mode 100644 index fc1fa1c..0000000 Binary files a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingSoftPlatform.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Input/Actions/IA_Drop.uasset b/Content/Variant_SideScrolling/Input/Actions/IA_Drop.uasset deleted file mode 100644 index 6d918bb..0000000 Binary files a/Content/Variant_SideScrolling/Input/Actions/IA_Drop.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Input/Actions/IA_Interact.uasset b/Content/Variant_SideScrolling/Input/Actions/IA_Interact.uasset deleted file mode 100644 index 4d4760a..0000000 Binary files a/Content/Variant_SideScrolling/Input/Actions/IA_Interact.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Input/Actions/IA_Mover.uasset b/Content/Variant_SideScrolling/Input/Actions/IA_Mover.uasset deleted file mode 100644 index 383f490..0000000 Binary files a/Content/Variant_SideScrolling/Input/Actions/IA_Mover.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Input/BPI_TouchInterface_SideScrolling.uasset b/Content/Variant_SideScrolling/Input/BPI_TouchInterface_SideScrolling.uasset deleted file mode 100644 index 219a795..0000000 Binary files a/Content/Variant_SideScrolling/Input/BPI_TouchInterface_SideScrolling.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Input/IMC_SideScroller.uasset b/Content/Variant_SideScrolling/Input/IMC_SideScroller.uasset deleted file mode 100644 index 069d802..0000000 Binary files a/Content/Variant_SideScrolling/Input/IMC_SideScroller.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Input/UI_TouchInterface_SideScrolling.uasset b/Content/Variant_SideScrolling/Input/UI_TouchInterface_SideScrolling.uasset deleted file mode 100644 index 5a3e3d0..0000000 Binary files a/Content/Variant_SideScrolling/Input/UI_TouchInterface_SideScrolling.uasset and /dev/null differ diff --git a/Content/Variant_SideScrolling/Lvl_SideScrolling.umap b/Content/Variant_SideScrolling/Lvl_SideScrolling.umap deleted file mode 100644 index c411b58..0000000 Binary files a/Content/Variant_SideScrolling/Lvl_SideScrolling.umap and /dev/null differ diff --git a/Content/Variant_SideScrolling/UI/UI_SideScrolling.uasset b/Content/Variant_SideScrolling/UI/UI_SideScrolling.uasset deleted file mode 100644 index 93a290a..0000000 Binary files a/Content/Variant_SideScrolling/UI/UI_SideScrolling.uasset and /dev/null differ diff --git a/Content/ZMMO/Abilities/Buffs/.gitkeep b/Content/ZMMO/Abilities/Buffs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Abilities/Combat/.gitkeep b/Content/ZMMO/Abilities/Combat/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Abilities/Heals/.gitkeep b/Content/ZMMO/Abilities/Heals/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Abilities/Movement/.gitkeep b/Content/ZMMO/Abilities/Movement/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Abilities/Shared/.gitkeep b/Content/ZMMO/Abilities/Shared/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Audio/Ambient/.gitkeep b/Content/ZMMO/Audio/Ambient/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Audio/Music/.gitkeep b/Content/ZMMO/Audio/Music/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Audio/SFX/Combat/.gitkeep b/Content/ZMMO/Audio/SFX/Combat/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Audio/SFX/Footsteps/.gitkeep b/Content/ZMMO/Audio/SFX/Footsteps/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Audio/SFX/UI/.gitkeep b/Content/ZMMO/Audio/SFX/UI/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Audio/Voice/.gitkeep b/Content/ZMMO/Audio/Voice/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Cinematics/.gitkeep b/Content/ZMMO/Cinematics/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Core/Entity/.gitkeep b/Content/ZMMO/Core/Entity/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Core/Item/.gitkeep b/Content/ZMMO/Core/Item/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Core/Mob/.gitkeep b/Content/ZMMO/Core/Mob/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Core/NPC/.gitkeep b/Content/ZMMO/Core/NPC/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Core/Network/.gitkeep b/Content/ZMMO/Core/Network/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Core/Player/.gitkeep b/Content/ZMMO/Core/Player/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/Abilities/.gitkeep b/Content/ZMMO/Data/Abilities/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/Items/.gitkeep b/Content/ZMMO/Data/Items/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/Mobs/.gitkeep b/Content/ZMMO/Data/Mobs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/NPCs/.gitkeep b/Content/ZMMO/Data/NPCs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/Players/.gitkeep b/Content/ZMMO/Data/Players/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/Quests/.gitkeep b/Content/ZMMO/Data/Quests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Data/UI/DT_UI_Styles.uasset b/Content/ZMMO/Data/UI/DT_UI_Styles.uasset new file mode 100644 index 0000000..c239beb Binary files /dev/null and b/Content/ZMMO/Data/UI/DT_UI_Styles.uasset differ diff --git a/Content/ZMMO/Data/World/.gitkeep b/Content/ZMMO/Data/World/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Debug/BP/.gitkeep b/Content/ZMMO/Debug/BP/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Debug/Maps/.gitkeep b/Content/ZMMO/Debug/Maps/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Debug/Maps/L_Test_UI.umap b/Content/ZMMO/Debug/Maps/L_Test_UI.umap new file mode 100644 index 0000000..59d1e47 Binary files /dev/null and b/Content/ZMMO/Debug/Maps/L_Test_UI.umap differ diff --git a/Content/ZMMO/Debug/Materials/.gitkeep b/Content/ZMMO/Debug/Materials/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Effects/Abilities/.gitkeep b/Content/ZMMO/Effects/Abilities/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Effects/Environment/.gitkeep b/Content/ZMMO/Effects/Environment/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Effects/Shared/.gitkeep b/Content/ZMMO/Effects/Shared/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Effects/UI/.gitkeep b/Content/ZMMO/Effects/UI/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Mobs/Beasts/.gitkeep b/Content/ZMMO/Entities/Mobs/Beasts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Mobs/Bosses/.gitkeep b/Content/ZMMO/Entities/Mobs/Bosses/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Mobs/Dragons/.gitkeep b/Content/ZMMO/Entities/Mobs/Dragons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Mobs/Humanoids/.gitkeep b/Content/ZMMO/Entities/Mobs/Humanoids/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Mobs/Undead/.gitkeep b/Content/ZMMO/Entities/Mobs/Undead/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/NPCs/.gitkeep b/Content/ZMMO/Entities/NPCs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Players/Classes/Archer/Animations/.gitkeep b/Content/ZMMO/Entities/Players/Classes/Archer/Animations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Players/Classes/Mage/Animations/.gitkeep b/Content/ZMMO/Entities/Players/Classes/Mage/Animations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Entities/Players/Classes/Warrior/Animations/.gitkeep b/Content/ZMMO/Entities/Players/Classes/Warrior/Animations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Input/Actions/.gitkeep b/Content/ZMMO/Input/Actions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Input/Mappings/.gitkeep b/Content/ZMMO/Input/Mappings/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Input/Modifiers/.gitkeep b/Content/ZMMO/Input/Modifiers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Items/Consumables/.gitkeep b/Content/ZMMO/Items/Consumables/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Items/Equipment/Accessories/.gitkeep b/Content/ZMMO/Items/Equipment/Accessories/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Items/Equipment/Armor/.gitkeep b/Content/ZMMO/Items/Equipment/Armor/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Items/Equipment/Weapons/.gitkeep b/Content/ZMMO/Items/Equipment/Weapons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Items/Materials/.gitkeep b/Content/ZMMO/Items/Materials/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Items/Quest/.gitkeep b/Content/ZMMO/Items/Quest/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Localization/.gitkeep b/Content/ZMMO/Localization/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Maps/FrontEnd/L_FrontEnd.umap b/Content/ZMMO/Maps/FrontEnd/L_FrontEnd.umap new file mode 100644 index 0000000..47d31b8 Binary files /dev/null and b/Content/ZMMO/Maps/FrontEnd/L_FrontEnd.umap differ diff --git a/Content/ZMMO/Movement/Mounts/.gitkeep b/Content/ZMMO/Movement/Mounts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/Movement/Transport/.gitkeep b/Content/ZMMO/Movement/Transport/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/CharacterSelect/.gitkeep b/Content/ZMMO/UI/CharacterSelect/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Chat/.gitkeep b/Content/ZMMO/UI/Chat/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/CommonUI/Style/Button/BSB_Button_Transparent.uasset b/Content/ZMMO/UI/CommonUI/Style/Button/BSB_Button_Transparent.uasset new file mode 100644 index 0000000..380a8b7 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Style/Button/BSB_Button_Transparent.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Style/Text/BST_Button.uasset b/Content/ZMMO/UI/CommonUI/Style/Text/BST_Button.uasset new file mode 100644 index 0000000..0f4f207 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Style/Text/BST_Button.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Footer.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Footer.uasset new file mode 100644 index 0000000..949c4ba Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Footer.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_01.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_01.uasset new file mode 100644 index 0000000..9dd0ade Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_01.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_02.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_02.uasset new file mode 100644 index 0000000..ede124a Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_02.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_03.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_03.uasset new file mode 100644 index 0000000..97499f3 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_03.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_03_Outline.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_03_Outline.uasset new file mode 100644 index 0000000..500e610 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Horizontal_03_Outline.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_01.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_01.uasset new file mode 100644 index 0000000..0f38dcc Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_01.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_02.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_02.uasset new file mode 100644 index 0000000..480e8f3 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_02.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_03.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_03.uasset new file mode 100644 index 0000000..e311c5e Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_03.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_04.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_04.uasset new file mode 100644 index 0000000..94c6190 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Rectangle_Vertical_04.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Square_01.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Square_01.uasset new file mode 100644 index 0000000..7d914a6 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Background_Square_01.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Gradient_Large_LeftToRight.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Gradient_Large_LeftToRight.uasset new file mode 100644 index 0000000..267c5ec Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_Gradient_Large_LeftToRight.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_TransparrentGradient_Large_LeftToRight.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_TransparrentGradient_Large_LeftToRight.uasset new file mode 100644 index 0000000..4f44150 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_TransparrentGradient_Large_LeftToRight.uasset differ diff --git a/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_TransparrentGradient_Large_LeftToRight_02.uasset b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_TransparrentGradient_Large_LeftToRight_02.uasset new file mode 100644 index 0000000..b33f4e3 Binary files /dev/null and b/Content/ZMMO/UI/CommonUI/Textures/Panels/T_Panel_TransparrentGradient_Large_LeftToRight_02.uasset differ diff --git a/Content/ZMMO/UI/Debug/BP_TestPC.uasset b/Content/ZMMO/UI/Debug/BP_TestPC.uasset new file mode 100644 index 0000000..30faa94 Binary files /dev/null and b/Content/ZMMO/UI/Debug/BP_TestPC.uasset differ diff --git a/Content/ZMMO/UI/Debug/BP_TestUIHUD.uasset b/Content/ZMMO/UI/Debug/BP_TestUIHUD.uasset new file mode 100644 index 0000000..f5043e0 Binary files /dev/null and b/Content/ZMMO/UI/Debug/BP_TestUIHUD.uasset differ diff --git a/Content/ZMMO/UI/Debug/GM_BP_TestGM.uasset b/Content/ZMMO/UI/Debug/GM_BP_TestGM.uasset new file mode 100644 index 0000000..0030850 Binary files /dev/null and b/Content/ZMMO/UI/Debug/GM_BP_TestGM.uasset differ diff --git a/Content/ZMMO/UI/Debug/UI_Test_Buttons.uasset b/Content/ZMMO/UI/Debug/UI_Test_Buttons.uasset new file mode 100644 index 0000000..9129375 Binary files /dev/null and b/Content/ZMMO/UI/Debug/UI_Test_Buttons.uasset differ diff --git a/Content/ZMMO/UI/Debug/UI_Test_Panel.uasset b/Content/ZMMO/UI/Debug/UI_Test_Panel.uasset new file mode 100644 index 0000000..4735af8 Binary files /dev/null and b/Content/ZMMO/UI/Debug/UI_Test_Panel.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_Bold.uasset b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_Bold.uasset new file mode 100644 index 0000000..a2c35d6 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_Bold.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_ExtraBold.uasset b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_ExtraBold.uasset new file mode 100644 index 0000000..15858d3 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_ExtraBold.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_Regular.uasset b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_Regular.uasset new file mode 100644 index 0000000..5996164 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_Regular.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_SemiBold.uasset b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_SemiBold.uasset new file mode 100644 index 0000000..8ec0fc7 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Cinzel/FF_Cinzel_SemiBold.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Bold.uasset b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Bold.uasset new file mode 100644 index 0000000..880f980 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Bold.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Medium.uasset b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Medium.uasset new file mode 100644 index 0000000..3410d15 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Medium.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Regular.uasset b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Regular.uasset new file mode 100644 index 0000000..dd5b32e Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_Regular.uasset differ diff --git a/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_SemiBold.uasset b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_SemiBold.uasset new file mode 100644 index 0000000..5d4acd9 Binary files /dev/null and b/Content/ZMMO/UI/Fonts/Rajdhani/FF_Rajdhani_SemiBold.uasset differ diff --git a/Content/ZMMO/UI/FrontEnd/DA_FrontEndScreenSet.uasset b/Content/ZMMO/UI/FrontEnd/DA_FrontEndScreenSet.uasset new file mode 100644 index 0000000..bdf26a0 Binary files /dev/null and b/Content/ZMMO/UI/FrontEnd/DA_FrontEndScreenSet.uasset differ diff --git a/Content/ZMMO/UI/FrontEnd/WBP_PrimaryGameLayout.uasset b/Content/ZMMO/UI/FrontEnd/WBP_PrimaryGameLayout.uasset new file mode 100644 index 0000000..3903827 Binary files /dev/null and b/Content/ZMMO/UI/FrontEnd/WBP_PrimaryGameLayout.uasset differ diff --git a/Content/ZMMO/UI/Guild/.gitkeep b/Content/ZMMO/UI/Guild/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/HUD/.gitkeep b/Content/ZMMO/UI/HUD/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Icons/.gitkeep b/Content/ZMMO/UI/Icons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Inventory/.gitkeep b/Content/ZMMO/UI/Inventory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Login/.gitkeep b/Content/ZMMO/UI/Login/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Map/.gitkeep b/Content/ZMMO/UI/Map/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Party/.gitkeep b/Content/ZMMO/UI/Party/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Quest/.gitkeep b/Content/ZMMO/UI/Quest/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Shared/.gitkeep b/Content/ZMMO/UI/Shared/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Shared/UI_Button_Master.uasset b/Content/ZMMO/UI/Shared/UI_Button_Master.uasset new file mode 100644 index 0000000..8f4859b Binary files /dev/null and b/Content/ZMMO/UI/Shared/UI_Button_Master.uasset differ diff --git a/Content/ZMMO/UI/Shared/UI_Panel_Master.uasset b/Content/ZMMO/UI/Shared/UI_Panel_Master.uasset new file mode 100644 index 0000000..2670a64 Binary files /dev/null and b/Content/ZMMO/UI/Shared/UI_Panel_Master.uasset differ diff --git a/Content/ZMMO/UI/Themes/Christmas/Audio/.gitkeep b/Content/ZMMO/UI/Themes/Christmas/Audio/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Christmas/HUD/.gitkeep b/Content/ZMMO/UI/Themes/Christmas/HUD/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Christmas/Inventory/.gitkeep b/Content/ZMMO/UI/Themes/Christmas/Inventory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Christmas/Login/.gitkeep b/Content/ZMMO/UI/Themes/Christmas/Login/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Christmas/VFX/.gitkeep b/Content/ZMMO/UI/Themes/Christmas/VFX/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Default/Audio/.gitkeep b/Content/ZMMO/UI/Themes/Default/Audio/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Default/HUD/.gitkeep b/Content/ZMMO/UI/Themes/Default/HUD/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Default/Inventory/.gitkeep b/Content/ZMMO/UI/Themes/Default/Inventory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Default/Login/.gitkeep b/Content/ZMMO/UI/Themes/Default/Login/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Default/VFX/.gitkeep b/Content/ZMMO/UI/Themes/Default/VFX/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Halloween/Audio/.gitkeep b/Content/ZMMO/UI/Themes/Halloween/Audio/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Halloween/HUD/.gitkeep b/Content/ZMMO/UI/Themes/Halloween/HUD/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Halloween/Inventory/.gitkeep b/Content/ZMMO/UI/Themes/Halloween/Inventory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Halloween/Login/.gitkeep b/Content/ZMMO/UI/Themes/Halloween/Login/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/Halloween/VFX/.gitkeep b/Content/ZMMO/UI/Themes/Halloween/VFX/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Themes/_Shared/.gitkeep b/Content/ZMMO/UI/Themes/_Shared/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/UI/Trade/.gitkeep b/Content/ZMMO/UI/Trade/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/World/Environment/Architecture/.gitkeep b/Content/ZMMO/World/Environment/Architecture/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/World/Environment/Nature/.gitkeep b/Content/ZMMO/World/Environment/Nature/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/World/Environment/Props/.gitkeep b/Content/ZMMO/World/Environment/Props/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/World/Instances/.gitkeep b/Content/ZMMO/World/Instances/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/World/Interactables/.gitkeep b/Content/ZMMO/World/Interactables/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/ZMMO/World/Maps/.gitkeep b/Content/ZMMO/World/Maps/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/4B/I5O7HJ57YPKKYPY4SSFLZZ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/4B/I5O7HJ57YPKKYPY4SSFLZZ.uasset deleted file mode 100644 index b8799cc..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/4B/I5O7HJ57YPKKYPY4SSFLZZ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/J0/QVXJ1XUJQIZQ2ONEJOW0EI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/J0/QVXJ1XUJQIZQ2ONEJOW0EI.uasset deleted file mode 100644 index cb27245..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/J0/QVXJ1XUJQIZQ2ONEJOW0EI.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/JN/C6PH50SPLFLBWA0OBWMQ5F.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/JN/C6PH50SPLFLBWA0OBWMQ5F.uasset deleted file mode 100644 index 1f34354..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/JN/C6PH50SPLFLBWA0OBWMQ5F.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/KB/70R3R0AIAG8WCGCAGQ9CY3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/KB/70R3R0AIAG8WCGCAGQ9CY3.uasset deleted file mode 100644 index 646901c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/KB/70R3R0AIAG8WCGCAGQ9CY3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/L0/7JFGLNLOCKI0V1IMMACK8B.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/L0/7JFGLNLOCKI0V1IMMACK8B.uasset deleted file mode 100644 index 4217d12..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/L0/7JFGLNLOCKI0V1IMMACK8B.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/LN/6XUGMACJHTF9UVGA53PLQ9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/LN/6XUGMACJHTF9UVGA53PLQ9.uasset deleted file mode 100644 index bc734fb..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/LN/6XUGMACJHTF9UVGA53PLQ9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/OK/2FZGASC74XU6I8LRJ4B9LO.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/OK/2FZGASC74XU6I8LRJ4B9LO.uasset deleted file mode 100644 index f0f363e..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/OK/2FZGASC74XU6I8LRJ4B9LO.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/Q1/Q5QAZW7H2QSS3YP9WWH1SC.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/Q1/Q5QAZW7H2QSS3YP9WWH1SC.uasset deleted file mode 100644 index cc2e1d9..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/Q1/Q5QAZW7H2QSS3YP9WWH1SC.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/TH/TXPB77A5UO9PLNG838CR59.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/TH/TXPB77A5UO9PLNG838CR59.uasset deleted file mode 100644 index 59e591d..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/TH/TXPB77A5UO9PLNG838CR59.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/XS/21O3C30HDVFRXZ0RL7PRMF.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/XS/21O3C30HDVFRXZ0RL7PRMF.uasset deleted file mode 100644 index f0a27c1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/XS/21O3C30HDVFRXZ0RL7PRMF.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/1O/DVDF8QZG4S920O3BQWHRO1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/1O/DVDF8QZG4S920O3BQWHRO1.uasset deleted file mode 100644 index 3331179..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/1O/DVDF8QZG4S920O3BQWHRO1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/32/9OI6KLDGH7UIFHL3YRPU1R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/32/9OI6KLDGH7UIFHL3YRPU1R.uasset deleted file mode 100644 index 84ea305..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/32/9OI6KLDGH7UIFHL3YRPU1R.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/3E/MP74I7I6B8KHZ3XNPOIUQK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/3E/MP74I7I6B8KHZ3XNPOIUQK.uasset deleted file mode 100644 index 6631f3a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/3E/MP74I7I6B8KHZ3XNPOIUQK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/4V/AM9A6SENLG8J1ID4WGVI4L.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/4V/AM9A6SENLG8J1ID4WGVI4L.uasset deleted file mode 100644 index ec7f367..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/4V/AM9A6SENLG8J1ID4WGVI4L.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/51/5Y69443HPJ0BUZGAUHEJK3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/51/5Y69443HPJ0BUZGAUHEJK3.uasset deleted file mode 100644 index 9f41a50..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/51/5Y69443HPJ0BUZGAUHEJK3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/97/XM7WH6EAJNTGEZ63GE7FJ6.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/97/XM7WH6EAJNTGEZ63GE7FJ6.uasset deleted file mode 100644 index 267061f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/97/XM7WH6EAJNTGEZ63GE7FJ6.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/GA/OEGB3A3ENQT70XN5J4YKQJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/GA/OEGB3A3ENQT70XN5J4YKQJ.uasset deleted file mode 100644 index 336a02b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/GA/OEGB3A3ENQT70XN5J4YKQJ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/L5/QG3Z4YZSPOZSHGICCUH31A.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/L5/QG3Z4YZSPOZSHGICCUH31A.uasset deleted file mode 100644 index b3e699c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/L5/QG3Z4YZSPOZSHGICCUH31A.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/N4/PELUAFNLTUJDHSXON93S6I.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/N4/PELUAFNLTUJDHSXON93S6I.uasset deleted file mode 100644 index 1b58cc0..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/N4/PELUAFNLTUJDHSXON93S6I.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/PU/K4YJRC8WAA2CIGF549BYZR.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/PU/K4YJRC8WAA2CIGF549BYZR.uasset deleted file mode 100644 index 1386ae4..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/PU/K4YJRC8WAA2CIGF549BYZR.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/R0/HT23SLNIEQ0O2HXL7LBX4R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/R0/HT23SLNIEQ0O2HXL7LBX4R.uasset deleted file mode 100644 index 59c8d8f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/R0/HT23SLNIEQ0O2HXL7LBX4R.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/T1/H5NOVVQYGVDZH2QBIXZRI5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/T1/H5NOVVQYGVDZH2QBIXZRI5.uasset deleted file mode 100644 index 3d3365f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/T1/H5NOVVQYGVDZH2QBIXZRI5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/U0/YGL0WFXJS6FO10WOKK1V2L.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/U0/YGL0WFXJS6FO10WOKK1V2L.uasset deleted file mode 100644 index 7b6dd4d..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/U0/YGL0WFXJS6FO10WOKK1V2L.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/YF/EKAD5DGG3DXWMMY6JCZYDE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/YF/EKAD5DGG3DXWMMY6JCZYDE.uasset deleted file mode 100644 index 4790292..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/YF/EKAD5DGG3DXWMMY6JCZYDE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/ZP/9I0OZ8R10E9S06ETOOJA63.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/ZP/9I0OZ8R10E9S06ETOOJA63.uasset deleted file mode 100644 index 4e73004..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/ZP/9I0OZ8R10E9S06ETOOJA63.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1C/ZUE27ERNTBGXJY0JQR479S.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1C/ZUE27ERNTBGXJY0JQR479S.uasset deleted file mode 100644 index 138e75a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1C/ZUE27ERNTBGXJY0JQR479S.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1R/618POQ41Q2FSSGC1VTL0AJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1R/618POQ41Q2FSSGC1VTL0AJ.uasset deleted file mode 100644 index 8386797..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1R/618POQ41Q2FSSGC1VTL0AJ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/67/LRD5AFZSX7RLAT58UVOF6S.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/67/LRD5AFZSX7RLAT58UVOF6S.uasset deleted file mode 100644 index ba6998f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/67/LRD5AFZSX7RLAT58UVOF6S.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/K8/5Z205Q47ZTF15T5Q87JU7E.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/K8/5Z205Q47ZTF15T5Q87JU7E.uasset deleted file mode 100644 index 2ca91a4..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/K8/5Z205Q47ZTF15T5Q87JU7E.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/L6/9KHQMN7IUK8SMKHH3VX6M3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/L6/9KHQMN7IUK8SMKHH3VX6M3.uasset deleted file mode 100644 index 5523f9e..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/L6/9KHQMN7IUK8SMKHH3VX6M3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/OI/MF8ZZS7KVI44SVR0BHY301.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/OI/MF8ZZS7KVI44SVR0BHY301.uasset deleted file mode 100644 index 6162cdc..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/OI/MF8ZZS7KVI44SVR0BHY301.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/V9/XCZ24R2H8269E10XXKVHNG.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/V9/XCZ24R2H8269E10XXKVHNG.uasset deleted file mode 100644 index c115efb..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/V9/XCZ24R2H8269E10XXKVHNG.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/Z9/6SNYH6YCML05ATNZJMJNLV.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/Z9/6SNYH6YCML05ATNZJMJNLV.uasset deleted file mode 100644 index 39c042c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/Z9/6SNYH6YCML05ATNZJMJNLV.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/11/QC3UE5SH63R7HLDSIARHYP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/11/QC3UE5SH63R7HLDSIARHYP.uasset deleted file mode 100644 index 68174d8..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/11/QC3UE5SH63R7HLDSIARHYP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/1L/ITUZ7HAI87POYJ5CKEJ6JQ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/1L/ITUZ7HAI87POYJ5CKEJ6JQ.uasset deleted file mode 100644 index d8611c6..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/1L/ITUZ7HAI87POYJ5CKEJ6JQ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/5C/472HXGW93Z5Y0DTU24MT05.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/5C/472HXGW93Z5Y0DTU24MT05.uasset deleted file mode 100644 index 7fa6a8c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/5C/472HXGW93Z5Y0DTU24MT05.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/69/49UL41JIT9J3Z82DSEOGNR.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/69/49UL41JIT9J3Z82DSEOGNR.uasset deleted file mode 100644 index c41126f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/69/49UL41JIT9J3Z82DSEOGNR.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6F/7UY85E4YUBO3IIQ5WZY2TR.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6F/7UY85E4YUBO3IIQ5WZY2TR.uasset deleted file mode 100644 index fcb7bd5..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6F/7UY85E4YUBO3IIQ5WZY2TR.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6H/7ALASFYN40X69PEEB5RXZ2.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6H/7ALASFYN40X69PEEB5RXZ2.uasset deleted file mode 100644 index 6ea3a06..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6H/7ALASFYN40X69PEEB5RXZ2.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/AD/OOT0TOS7NDYPON55O43E4B.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/AD/OOT0TOS7NDYPON55O43E4B.uasset deleted file mode 100644 index 622eaa9..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/AD/OOT0TOS7NDYPON55O43E4B.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/GD/LA9QY6EIOP5MXBBFTM03KI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/GD/LA9QY6EIOP5MXBBFTM03KI.uasset deleted file mode 100644 index ac1d2ee..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/GD/LA9QY6EIOP5MXBBFTM03KI.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/J1/ZMFUDHBD9FHM68ZT96IA1C.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/J1/ZMFUDHBD9FHM68ZT96IA1C.uasset deleted file mode 100644 index 87e3cb1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/J1/ZMFUDHBD9FHM68ZT96IA1C.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/JO/XBLLR77AXMIP149OV5ULY9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/JO/XBLLR77AXMIP149OV5ULY9.uasset deleted file mode 100644 index 8ba4374..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/JO/XBLLR77AXMIP149OV5ULY9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/LR/AXA3SZ8RWC8FDWTY56RLDA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/LR/AXA3SZ8RWC8FDWTY56RLDA.uasset deleted file mode 100644 index 25ebb40..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/LR/AXA3SZ8RWC8FDWTY56RLDA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/SN/0X78Q6B7RDHXMQZYGFLGXK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/SN/0X78Q6B7RDHXMQZYGFLGXK.uasset deleted file mode 100644 index 8bf92a1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/SN/0X78Q6B7RDHXMQZYGFLGXK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/VJ/XUG7C1X903GP7S2ZAQ6UPS.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/VJ/XUG7C1X903GP7S2ZAQ6UPS.uasset deleted file mode 100644 index 578fb0f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/VJ/XUG7C1X903GP7S2ZAQ6UPS.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZC/GUWXM26Q7AB4QLO5N6TPIP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZC/GUWXM26Q7AB4QLO5N6TPIP.uasset deleted file mode 100644 index 9a2d770..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZC/GUWXM26Q7AB4QLO5N6TPIP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZO/2FVRIT79WCE6J17NINDFS5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZO/2FVRIT79WCE6J17NINDFS5.uasset deleted file mode 100644 index f058895..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZO/2FVRIT79WCE6J17NINDFS5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/2U/FNC5A4JGOWJW5YKO9E4ZYH.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/2U/FNC5A4JGOWJW5YKO9E4ZYH.uasset deleted file mode 100644 index 7c4ce1c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/2U/FNC5A4JGOWJW5YKO9E4ZYH.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/F1/ROZ0POEXKJ0PKXMW4DSCG1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/F1/ROZ0POEXKJ0PKXMW4DSCG1.uasset deleted file mode 100644 index 3dbc8e5..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/F1/ROZ0POEXKJ0PKXMW4DSCG1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/LU/26JCC0IS872O4TFGUT9O98.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/LU/26JCC0IS872O4TFGUT9O98.uasset deleted file mode 100644 index 56a428a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/LU/26JCC0IS872O4TFGUT9O98.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/OS/M2J2I7C3QIZMSSVZ2GMVVF.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/OS/M2J2I7C3QIZMSSVZ2GMVVF.uasset deleted file mode 100644 index 66a0b45..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/OS/M2J2I7C3QIZMSSVZ2GMVVF.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/UV/ZAF0544EAKPRNRKQIP0O01.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/UV/ZAF0544EAKPRNRKQIP0O01.uasset deleted file mode 100644 index dbec7de..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/UV/ZAF0544EAKPRNRKQIP0O01.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/WL/YEFLQ06YUDR45W9UEV3JM5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/WL/YEFLQ06YUDR45W9UEV3JM5.uasset deleted file mode 100644 index 07a768d..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/WL/YEFLQ06YUDR45W9UEV3JM5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/XS/U8PM1GZLKWHL4FF18EN1ND.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/XS/U8PM1GZLKWHL4FF18EN1ND.uasset deleted file mode 100644 index 91dffb2..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/XS/U8PM1GZLKWHL4FF18EN1ND.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/ZF/WCHFY0EDKV80XWG7UZXXIX.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/ZF/WCHFY0EDKV80XWG7UZXXIX.uasset deleted file mode 100644 index d89fd5d..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/ZF/WCHFY0EDKV80XWG7UZXXIX.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/10/G2ESKRA6OA5RY0JRT35GRW.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/10/G2ESKRA6OA5RY0JRT35GRW.uasset deleted file mode 100644 index 0a966be..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/10/G2ESKRA6OA5RY0JRT35GRW.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/1I/93DDS3U8RVSY7QM30EHTKV.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/1I/93DDS3U8RVSY7QM30EHTKV.uasset deleted file mode 100644 index f39f986..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/1I/93DDS3U8RVSY7QM30EHTKV.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/91/0Q4R1IE3K2BYJSXIZOQ0QP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/91/0Q4R1IE3K2BYJSXIZOQ0QP.uasset deleted file mode 100644 index 3c1e507..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/91/0Q4R1IE3K2BYJSXIZOQ0QP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/BA/DGFPSX4DTSKSZQ36SD1Y3K.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/BA/DGFPSX4DTSKSZQ36SD1Y3K.uasset deleted file mode 100644 index 3632ab3..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/BA/DGFPSX4DTSKSZQ36SD1Y3K.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/CT/GLPCUDYPOA417QPFT25J2M.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/CT/GLPCUDYPOA417QPFT25J2M.uasset deleted file mode 100644 index 935c530..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/CT/GLPCUDYPOA417QPFT25J2M.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/D1/PJ7PHXS1Q9YT4RRK8ASA17.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/D1/PJ7PHXS1Q9YT4RRK8ASA17.uasset deleted file mode 100644 index 90709da..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/D1/PJ7PHXS1Q9YT4RRK8ASA17.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/DP/15D95A5TUVKKEPBC5Z3V0K.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/DP/15D95A5TUVKKEPBC5Z3V0K.uasset deleted file mode 100644 index 0e553fc..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/DP/15D95A5TUVKKEPBC5Z3V0K.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/IL/XNME8P2GEX8RVJYJ5AS9L9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/IL/XNME8P2GEX8RVJYJ5AS9L9.uasset deleted file mode 100644 index 7cf2c2d..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/IL/XNME8P2GEX8RVJYJ5AS9L9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/PQ/PI85JOOOY2R6IWIS0B5ZV5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/PQ/PI85JOOOY2R6IWIS0B5ZV5.uasset deleted file mode 100644 index 8a961f6..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/PQ/PI85JOOOY2R6IWIS0B5ZV5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/VB/DD4B02GSXHYDFMAB03BUYE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/VB/DD4B02GSXHYDFMAB03BUYE.uasset deleted file mode 100644 index b916782..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/VB/DD4B02GSXHYDFMAB03BUYE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/3U/Y7SCQAHPSUVVCZQCNEIKCJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/3U/Y7SCQAHPSUVVCZQCNEIKCJ.uasset deleted file mode 100644 index e9b78cc..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/3U/Y7SCQAHPSUVVCZQCNEIKCJ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/7U/KFRJ8G1ZYZHNS4N6S74ZMY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/7U/KFRJ8G1ZYZHNS4N6S74ZMY.uasset deleted file mode 100644 index daad457..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/7U/KFRJ8G1ZYZHNS4N6S74ZMY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/8P/A5XH9J5QDNE58G2EZQY8EN.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/8P/A5XH9J5QDNE58G2EZQY8EN.uasset deleted file mode 100644 index e716716..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/8P/A5XH9J5QDNE58G2EZQY8EN.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/9G/2YEWP1NRKUKTW7IS6S8YM5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/9G/2YEWP1NRKUKTW7IS6S8YM5.uasset deleted file mode 100644 index 5316eff..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/9G/2YEWP1NRKUKTW7IS6S8YM5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/FD/BLYOF7Y0BIG7Q9IEJJVLIJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/FD/BLYOF7Y0BIG7Q9IEJJVLIJ.uasset deleted file mode 100644 index 99fe4f3..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/FD/BLYOF7Y0BIG7Q9IEJJVLIJ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/IR/DGTM6Z6X9MUIW1R1RM6HEM.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/IR/DGTM6Z6X9MUIW1R1RM6HEM.uasset deleted file mode 100644 index 69ad728..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/IR/DGTM6Z6X9MUIW1R1RM6HEM.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/KW/DIOBPSCU4ASCOKUXZZGYBP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/KW/DIOBPSCU4ASCOKUXZZGYBP.uasset deleted file mode 100644 index 4ae5cd5..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/KW/DIOBPSCU4ASCOKUXZZGYBP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/MR/CIPUCZLV4PC998H04BXE50.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/MR/CIPUCZLV4PC998H04BXE50.uasset deleted file mode 100644 index 71f3382..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/MR/CIPUCZLV4PC998H04BXE50.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/UN/V2FXYCRO8TWCQFEW9S7ONL.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/UN/V2FXYCRO8TWCQFEW9S7ONL.uasset deleted file mode 100644 index f21e6bf..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/UN/V2FXYCRO8TWCQFEW9S7ONL.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/V3/KTE510QWYNYYC5GPCZILN2.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/V3/KTE510QWYNYYC5GPCZILN2.uasset deleted file mode 100644 index 8cff4e4..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/V3/KTE510QWYNYYC5GPCZILN2.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/2L/43POZNB1OZZ0WC9OQQWP32.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/2L/43POZNB1OZZ0WC9OQQWP32.uasset deleted file mode 100644 index 0983755..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/2L/43POZNB1OZZ0WC9OQQWP32.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/7N/IHKH3QKKSO2BH68HLQE5HW.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/7N/IHKH3QKKSO2BH68HLQE5HW.uasset deleted file mode 100644 index cfabb3b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/7N/IHKH3QKKSO2BH68HLQE5HW.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/FF/SREIGLJND5CE6ZHB6ORFDA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/FF/SREIGLJND5CE6ZHB6ORFDA.uasset deleted file mode 100644 index e241152..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/FF/SREIGLJND5CE6ZHB6ORFDA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/HC/DMJ0WZMFEPSSU5KV3I06DY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/HC/DMJ0WZMFEPSSU5KV3I06DY.uasset deleted file mode 100644 index 83495f8..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/HC/DMJ0WZMFEPSSU5KV3I06DY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/I3/2DFXQK7NBEGYK26EMWYIAI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/I3/2DFXQK7NBEGYK26EMWYIAI.uasset deleted file mode 100644 index f83aaf1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/I3/2DFXQK7NBEGYK26EMWYIAI.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/KT/1DMK92SYFO52BCWH7YW6X1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/KT/1DMK92SYFO52BCWH7YW6X1.uasset deleted file mode 100644 index 7e7535e..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/KT/1DMK92SYFO52BCWH7YW6X1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/MJ/5XX5M6PJ0MHJDUL7W6DYUJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/MJ/5XX5M6PJ0MHJDUL7W6DYUJ.uasset deleted file mode 100644 index 698a17f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/MJ/5XX5M6PJ0MHJDUL7W6DYUJ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/WH/A20YQ6G8GBT085UFJFYOFD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/WH/A20YQ6G8GBT085UFJFYOFD.uasset deleted file mode 100644 index f527399..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/WH/A20YQ6G8GBT085UFJFYOFD.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/XH/NCZ6KTAN4JPVHK2TB6KIWE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/XH/NCZ6KTAN4JPVHK2TB6KIWE.uasset deleted file mode 100644 index c2ba393..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/XH/NCZ6KTAN4JPVHK2TB6KIWE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/0Y/JZOJQOJ8LAMK8MRFA4Y2CN.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/0Y/JZOJQOJ8LAMK8MRFA4Y2CN.uasset deleted file mode 100644 index 5ce387a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/0Y/JZOJQOJ8LAMK8MRFA4Y2CN.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/16/M2H1K5CDOD4X9UOOKN3G2R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/16/M2H1K5CDOD4X9UOOKN3G2R.uasset deleted file mode 100644 index bd6ae9b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/16/M2H1K5CDOD4X9UOOKN3G2R.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/2U/XD95IMXOS47D6E9UJR2SNJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/2U/XD95IMXOS47D6E9UJR2SNJ.uasset deleted file mode 100644 index fa29ff3..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/2U/XD95IMXOS47D6E9UJR2SNJ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/5K/WT2N6PIFH19MI313NH2V8D.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/5K/WT2N6PIFH19MI313NH2V8D.uasset deleted file mode 100644 index f35db8b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/5K/WT2N6PIFH19MI313NH2V8D.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6P/E9NE3R4WWBFLO7DM3YVJ25.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6P/E9NE3R4WWBFLO7DM3YVJ25.uasset deleted file mode 100644 index a7bb879..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6P/E9NE3R4WWBFLO7DM3YVJ25.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6U/9N30SLQBL4GCYWZAABJERE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6U/9N30SLQBL4GCYWZAABJERE.uasset deleted file mode 100644 index 84db8a9..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6U/9N30SLQBL4GCYWZAABJERE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/7K/H1IDQB3F7XR0G6D56GBMU6.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/7K/H1IDQB3F7XR0G6D56GBMU6.uasset deleted file mode 100644 index e30d2ea..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/7K/H1IDQB3F7XR0G6D56GBMU6.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/AJ/XJF07VB8ISEFI4M87N4CXF.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/AJ/XJF07VB8ISEFI4M87N4CXF.uasset deleted file mode 100644 index 4c5a1f1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/AJ/XJF07VB8ISEFI4M87N4CXF.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/DH/OC6G68ED5VJZVW8EJQA76B.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/DH/OC6G68ED5VJZVW8EJQA76B.uasset deleted file mode 100644 index 30d0a76..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/DH/OC6G68ED5VJZVW8EJQA76B.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/GN/DIDACECEDK7DQHGSZF35H6.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/GN/DIDACECEDK7DQHGSZF35H6.uasset deleted file mode 100644 index ec3b2a2..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/GN/DIDACECEDK7DQHGSZF35H6.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/HS/R85DVK392RC4R0J9AJJSDX.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/HS/R85DVK392RC4R0J9AJJSDX.uasset deleted file mode 100644 index 8275e20..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/HS/R85DVK392RC4R0J9AJJSDX.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/L1/PNG8TF54EI2EAW897D3V0R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/L1/PNG8TF54EI2EAW897D3V0R.uasset deleted file mode 100644 index bf06089..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/L1/PNG8TF54EI2EAW897D3V0R.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/LP/95YG2KJ4S2ZT9TNGF4O1UA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/LP/95YG2KJ4S2ZT9TNGF4O1UA.uasset deleted file mode 100644 index b5bf80e..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/LP/95YG2KJ4S2ZT9TNGF4O1UA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/NQ/B9RELJCTYQ8L9Y6YSJCZIA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/NQ/B9RELJCTYQ8L9Y6YSJCZIA.uasset deleted file mode 100644 index 3784403..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/NQ/B9RELJCTYQ8L9Y6YSJCZIA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/XL/7MKLADN1ZTTQ9FPVTBJGUD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/XL/7MKLADN1ZTTQ9FPVTBJGUD.uasset deleted file mode 100644 index 077447a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/XL/7MKLADN1ZTTQ9FPVTBJGUD.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/1I/FU34616O1QKKFXMD67EPG7.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/1I/FU34616O1QKKFXMD67EPG7.uasset deleted file mode 100644 index 27c39af..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/1I/FU34616O1QKKFXMD67EPG7.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/2Z/K9Y7T981NPFQB0F0ODWMT7.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/2Z/K9Y7T981NPFQB0F0ODWMT7.uasset deleted file mode 100644 index 4da9bac..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/2Z/K9Y7T981NPFQB0F0ODWMT7.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/40/03OMEJKEKXOLMSAJLN6AF0.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/40/03OMEJKEKXOLMSAJLN6AF0.uasset deleted file mode 100644 index 5e2609c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/40/03OMEJKEKXOLMSAJLN6AF0.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/91/EMMTW3081FS3SV7WH9BV88.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/91/EMMTW3081FS3SV7WH9BV88.uasset deleted file mode 100644 index 278ef56..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/91/EMMTW3081FS3SV7WH9BV88.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/DQ/SBFD5M675LVD68N22SGIWH.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/DQ/SBFD5M675LVD68N22SGIWH.uasset deleted file mode 100644 index 67bd5f7..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/DQ/SBFD5M675LVD68N22SGIWH.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HL/KDU8U69V1XMLLWEBDOOFTK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HL/KDU8U69V1XMLLWEBDOOFTK.uasset deleted file mode 100644 index 2584990..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HL/KDU8U69V1XMLLWEBDOOFTK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HU/PMPASKH2GKH319Q1CFMPRM.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HU/PMPASKH2GKH319Q1CFMPRM.uasset deleted file mode 100644 index 863619c..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HU/PMPASKH2GKH319Q1CFMPRM.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/IO/VM3C7C9TQPPAFFJU31MCU7.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/IO/VM3C7C9TQPPAFFJU31MCU7.uasset deleted file mode 100644 index ffe92e9..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/IO/VM3C7C9TQPPAFFJU31MCU7.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/JR/THXBS4Q7NOST3UFAAZK5R4.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/JR/THXBS4Q7NOST3UFAAZK5R4.uasset deleted file mode 100644 index 57b0f09..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/JR/THXBS4Q7NOST3UFAAZK5R4.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UW/FS31A2FNT9GW4YINH4S00F.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UW/FS31A2FNT9GW4YINH4S00F.uasset deleted file mode 100644 index 7dd21f1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UW/FS31A2FNT9GW4YINH4S00F.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UZ/8KR57T843NS9S301MPFH8D.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UZ/8KR57T843NS9S301MPFH8D.uasset deleted file mode 100644 index 2695f4b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UZ/8KR57T843NS9S301MPFH8D.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/37/3MDT8UZULS2IQMUIAZMQYT.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/37/3MDT8UZULS2IQMUIAZMQYT.uasset deleted file mode 100644 index bf01c56..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/37/3MDT8UZULS2IQMUIAZMQYT.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/3T/LQOJ9BAH0TFG9BN6VMPR0L.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/3T/LQOJ9BAH0TFG9BN6VMPR0L.uasset deleted file mode 100644 index e9295fd..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/3T/LQOJ9BAH0TFG9BN6VMPR0L.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/AT/95NOG595COK8YO39FPAVPE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/AT/95NOG595COK8YO39FPAVPE.uasset deleted file mode 100644 index 9b4f0a1..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/AT/95NOG595COK8YO39FPAVPE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/HZ/SQLM1IFIPOBMEKJGJHIBDL.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/HZ/SQLM1IFIPOBMEKJGJHIBDL.uasset deleted file mode 100644 index 9885e34..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/HZ/SQLM1IFIPOBMEKJGJHIBDL.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/NT/1U3K1FIZFLZJD9JECG4J91.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/NT/1U3K1FIZFLZJD9JECG4J91.uasset deleted file mode 100644 index 1a96ecb..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/NT/1U3K1FIZFLZJD9JECG4J91.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/P0/2315TBK297NP062364FRJK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/P0/2315TBK297NP062364FRJK.uasset deleted file mode 100644 index 692d368..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/P0/2315TBK297NP062364FRJK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/YE/8F6N6CWL3Z9YFWFCPBOABN.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/YE/8F6N6CWL3Z9YFWFCPBOABN.uasset deleted file mode 100644 index 1922997..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/YE/8F6N6CWL3Z9YFWFCPBOABN.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/17/SDPBJ9K67UIPUP22ZH7864.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/17/SDPBJ9K67UIPUP22ZH7864.uasset deleted file mode 100644 index 616ef84..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/17/SDPBJ9K67UIPUP22ZH7864.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/4O/8WLC0J43A48EBWDDJ38YJD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/4O/8WLC0J43A48EBWDDJ38YJD.uasset deleted file mode 100644 index 074aa90..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/4O/8WLC0J43A48EBWDDJ38YJD.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/76/E3AHN2FPNWBFJ2AQ6HVNOY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/76/E3AHN2FPNWBFJ2AQ6HVNOY.uasset deleted file mode 100644 index 1d088fb..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/76/E3AHN2FPNWBFJ2AQ6HVNOY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/BQ/Q372FLA8BD7JIG29PCYFWG.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/BQ/Q372FLA8BD7JIG29PCYFWG.uasset deleted file mode 100644 index 95c44d8..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/BQ/Q372FLA8BD7JIG29PCYFWG.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/CT/CFSGXL14SGU01FPIMKSNE1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/CT/CFSGXL14SGU01FPIMKSNE1.uasset deleted file mode 100644 index 3124cac..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/CT/CFSGXL14SGU01FPIMKSNE1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/DA/6DJ7HJ17WP8CD3I6ZY8HWI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/DA/6DJ7HJ17WP8CD3I6ZY8HWI.uasset deleted file mode 100644 index 2f9a260..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/DA/6DJ7HJ17WP8CD3I6ZY8HWI.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/EX/VH3KW6RCB7L4HSAXAZF3W3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/EX/VH3KW6RCB7L4HSAXAZF3W3.uasset deleted file mode 100644 index 32dc72a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/EX/VH3KW6RCB7L4HSAXAZF3W3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/F7/KMRREMHTMPCZQOSLDYDJBS.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/F7/KMRREMHTMPCZQOSLDYDJBS.uasset deleted file mode 100644 index 0b3fc2b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/F7/KMRREMHTMPCZQOSLDYDJBS.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/NE/1IZ3B0QY64Q0RDP9NU2K6H.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/NE/1IZ3B0QY64Q0RDP9NU2K6H.uasset deleted file mode 100644 index 64ed730..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/NE/1IZ3B0QY64Q0RDP9NU2K6H.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/SG/ABBQVE4WS4Q8X6QBWDF841.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/SG/ABBQVE4WS4Q8X6QBWDF841.uasset deleted file mode 100644 index 1467ccc..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/SG/ABBQVE4WS4Q8X6QBWDF841.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/T3/BMIR1KVDQU7TPX80KNVG2T.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/T3/BMIR1KVDQU7TPX80KNVG2T.uasset deleted file mode 100644 index d409874..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/T3/BMIR1KVDQU7TPX80KNVG2T.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/2M/BKLMJXKFDR71PC1PWGUPPP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/2M/BKLMJXKFDR71PC1PWGUPPP.uasset deleted file mode 100644 index 106002f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/2M/BKLMJXKFDR71PC1PWGUPPP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/4T/2KL36DS4X1S0RM7I09CL33.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/4T/2KL36DS4X1S0RM7I09CL33.uasset deleted file mode 100644 index 720361e..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/4T/2KL36DS4X1S0RM7I09CL33.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/7M/BO9IX3WLRNCEHVRDDLEOWT.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/7M/BO9IX3WLRNCEHVRDDLEOWT.uasset deleted file mode 100644 index 81a7890..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/7M/BO9IX3WLRNCEHVRDDLEOWT.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/8A/TJ8MW1WQ2KJOMU1L02L2YA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/8A/TJ8MW1WQ2KJOMU1L02L2YA.uasset deleted file mode 100644 index 14a7fcf..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/8A/TJ8MW1WQ2KJOMU1L02L2YA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/W1/4XPUEFSRF6IJ5DJVQ5HY2N.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/W1/4XPUEFSRF6IJ5DJVQ5HY2N.uasset deleted file mode 100644 index 1aca37d..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/W1/4XPUEFSRF6IJ5DJVQ5HY2N.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/YZ/BZJ174LKPK9P48T2FPZ2YD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/YZ/BZJ174LKPK9P48T2FPZ2YD.uasset deleted file mode 100644 index 2c23b65..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/YZ/BZJ174LKPK9P48T2FPZ2YD.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/24/8PNBMJZ6VELIPUADNB9KZY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/24/8PNBMJZ6VELIPUADNB9KZY.uasset deleted file mode 100644 index b1b4b50..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/24/8PNBMJZ6VELIPUADNB9KZY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/40/HCM80K2UTKQ44YIMIPPXS8.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/40/HCM80K2UTKQ44YIMIPPXS8.uasset deleted file mode 100644 index 35233cd..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/40/HCM80K2UTKQ44YIMIPPXS8.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/EY/PINX4K2U7SAPH6WRJ4H1EL.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/EY/PINX4K2U7SAPH6WRJ4H1EL.uasset deleted file mode 100644 index 9ffb99f..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/EY/PINX4K2U7SAPH6WRJ4H1EL.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/LA/T916UMOAT5N27HQFVX6WGS.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/LA/T916UMOAT5N27HQFVX6WGS.uasset deleted file mode 100644 index 9ab536b..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/LA/T916UMOAT5N27HQFVX6WGS.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/5L/5SHDOVHTHP7TGMLI05GVV9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/5L/5SHDOVHTHP7TGMLI05GVV9.uasset deleted file mode 100644 index f9a2cec..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/5L/5SHDOVHTHP7TGMLI05GVV9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/A5/G6EJWJRQ94MEJ6VYZQCH0P.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/A5/G6EJWJRQ94MEJ6VYZQCH0P.uasset deleted file mode 100644 index be9dd9a..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/A5/G6EJWJRQ94MEJ6VYZQCH0P.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/KF/BM04659BFJO7X0DH4EGU2N.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/KF/BM04659BFJO7X0DH4EGU2N.uasset deleted file mode 100644 index 2ac3c6e..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/KF/BM04659BFJO7X0DH4EGU2N.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/L8/O2XSZ7TA8EZ3U0EH412XVT.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/L8/O2XSZ7TA8EZ3U0EH412XVT.uasset deleted file mode 100644 index f8aa256..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/L8/O2XSZ7TA8EZ3U0EH412XVT.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/F/4R/B8IQ24EUB55DKMWKFIM65C.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/F/4R/B8IQ24EUB55DKMWKFIM65C.uasset deleted file mode 100644 index 0c87ba7..0000000 Binary files a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/F/4R/B8IQ24EUB55DKMWKFIM65C.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/2I/G1MKF8NNQ54SREG7DDID6O.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/2I/G1MKF8NNQ54SREG7DDID6O.uasset deleted file mode 100644 index 20b499a..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/2I/G1MKF8NNQ54SREG7DDID6O.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/51/C41HDKEQ2QWJHE8D8QL4TM.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/51/C41HDKEQ2QWJHE8D8QL4TM.uasset deleted file mode 100644 index 6e6d05d..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/51/C41HDKEQ2QWJHE8D8QL4TM.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/55/TSQ6SNX6TODA8EE8PEHVED.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/55/TSQ6SNX6TODA8EE8PEHVED.uasset deleted file mode 100644 index 0e1f970..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/55/TSQ6SNX6TODA8EE8PEHVED.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/7N/X1VL3XUO4ZCPBN9ZEYXAU5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/7N/X1VL3XUO4ZCPBN9ZEYXAU5.uasset deleted file mode 100644 index 7b294a8..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/7N/X1VL3XUO4ZCPBN9ZEYXAU5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/9X/ON50D9MMRRWCOF8MZCJLBN.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/9X/ON50D9MMRRWCOF8MZCJLBN.uasset deleted file mode 100644 index 2c03e0b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/9X/ON50D9MMRRWCOF8MZCJLBN.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/A0/QUB33CZ9GJSQCJ55A8O7SH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/A0/QUB33CZ9GJSQCJ55A8O7SH.uasset deleted file mode 100644 index ec8fcfe..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/A0/QUB33CZ9GJSQCJ55A8O7SH.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/CE/WO89H04O4WVY06P3ZDQZDY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/CE/WO89H04O4WVY06P3ZDQZDY.uasset deleted file mode 100644 index 2f8a487..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/CE/WO89H04O4WVY06P3ZDQZDY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/W4/K4XW5H58ZTIXYZPFEU59QY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/W4/K4XW5H58ZTIXYZPFEU59QY.uasset deleted file mode 100644 index 6d2fded..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/W4/K4XW5H58ZTIXYZPFEU59QY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/XR/DKEGC1B4JI84Q6M99OFPAB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/XR/DKEGC1B4JI84Q6M99OFPAB.uasset deleted file mode 100644 index 2b90c04..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/XR/DKEGC1B4JI84Q6M99OFPAB.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/YZ/8GP970C3DULJJRBDLJCCAT.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/YZ/8GP970C3DULJJRBDLJCCAT.uasset deleted file mode 100644 index 8175be3..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/YZ/8GP970C3DULJJRBDLJCCAT.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/4L/QHE9SS8IL8NAH4LP40QVMA.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/4L/QHE9SS8IL8NAH4LP40QVMA.uasset deleted file mode 100644 index 7a1a523..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/4L/QHE9SS8IL8NAH4LP40QVMA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/AS/7JLJ2FV98VA2GZXKO2SZQ3.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/AS/7JLJ2FV98VA2GZXKO2SZQ3.uasset deleted file mode 100644 index d7f3723..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/AS/7JLJ2FV98VA2GZXKO2SZQ3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/DZ/I5IBC74KFACATJBFXLDCE0.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/DZ/I5IBC74KFACATJBFXLDCE0.uasset deleted file mode 100644 index a25f1aa..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/DZ/I5IBC74KFACATJBFXLDCE0.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/MM/CNZCO2Y9UH51FLSXM49L4K.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/MM/CNZCO2Y9UH51FLSXM49L4K.uasset deleted file mode 100644 index 723eadf..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/MM/CNZCO2Y9UH51FLSXM49L4K.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/88/W3TC4XVD4B726DXP8IRN6K.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/88/W3TC4XVD4B726DXP8IRN6K.uasset deleted file mode 100644 index 2879aad..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/88/W3TC4XVD4B726DXP8IRN6K.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8N/FCX53BERRMEQY7OWO3KYO6.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8N/FCX53BERRMEQY7OWO3KYO6.uasset deleted file mode 100644 index 285e92a..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8N/FCX53BERRMEQY7OWO3KYO6.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8W/JCYX6FJ8GQ2IFZ7BNCK5RE.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8W/JCYX6FJ8GQ2IFZ7BNCK5RE.uasset deleted file mode 100644 index 2b4cef2..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8W/JCYX6FJ8GQ2IFZ7BNCK5RE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/BX/L4E2EQEA7T84XTQO1ANHJH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/BX/L4E2EQEA7T84XTQO1ANHJH.uasset deleted file mode 100644 index 7bbdd26..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/BX/L4E2EQEA7T84XTQO1ANHJH.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/5OYUDWJJIFAH2U8EP29EZW.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/5OYUDWJJIFAH2U8EP29EZW.uasset deleted file mode 100644 index 41d273e..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/5OYUDWJJIFAH2U8EP29EZW.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/HKCCLAZQSUEJZG9QCZ6C0O.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/HKCCLAZQSUEJZG9QCZ6C0O.uasset deleted file mode 100644 index dd29124..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/HKCCLAZQSUEJZG9QCZ6C0O.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/TS/G8WTY9XQQX37L3VIWLTMJU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/TS/G8WTY9XQQX37L3VIWLTMJU.uasset deleted file mode 100644 index cee7e01..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/TS/G8WTY9XQQX37L3VIWLTMJU.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/UF/U3AV1VA4PKPVMO06KMZSD1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/UF/U3AV1VA4PKPVMO06KMZSD1.uasset deleted file mode 100644 index c5d5b1f..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/UF/U3AV1VA4PKPVMO06KMZSD1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WS/OVOQ7FE1IFTPQISWGSWKVC.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WS/OVOQ7FE1IFTPQISWGSWKVC.uasset deleted file mode 100644 index 424245f..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WS/OVOQ7FE1IFTPQISWGSWKVC.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WV/IGCDSH3F4Y0RC8SENYM91Z.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WV/IGCDSH3F4Y0RC8SENYM91Z.uasset deleted file mode 100644 index 96ffe46..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WV/IGCDSH3F4Y0RC8SENYM91Z.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/5S/82ZBWG53S08ZU6XJ2ZSBBE.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/5S/82ZBWG53S08ZU6XJ2ZSBBE.uasset deleted file mode 100644 index 18fb644..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/5S/82ZBWG53S08ZU6XJ2ZSBBE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/LI/I3R0J0JY12SLX2CUDGPK14.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/LI/I3R0J0JY12SLX2CUDGPK14.uasset deleted file mode 100644 index ba6dcd8..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/LI/I3R0J0JY12SLX2CUDGPK14.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/V1/D800HGD5TR8TIRIXI0DPZO.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/V1/D800HGD5TR8TIRIXI0DPZO.uasset deleted file mode 100644 index 92c1c72..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/V1/D800HGD5TR8TIRIXI0DPZO.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/2O/7LLF6A9TYTLPVE3CJBMHZW.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/2O/7LLF6A9TYTLPVE3CJBMHZW.uasset deleted file mode 100644 index e874a23..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/2O/7LLF6A9TYTLPVE3CJBMHZW.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/5P/6P8DZN6JS5T15S43S4A4Q9.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/5P/6P8DZN6JS5T15S43S4A4Q9.uasset deleted file mode 100644 index b75686f..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/5P/6P8DZN6JS5T15S43S4A4Q9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/AO/V40S5T2E6I4T2O6BBNUR38.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/AO/V40S5T2E6I4T2O6BBNUR38.uasset deleted file mode 100644 index a5630b5..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/AO/V40S5T2E6I4T2O6BBNUR38.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/DJ/F3N5KA328H6KPE36KJLFHV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/DJ/F3N5KA328H6KPE36KJLFHV.uasset deleted file mode 100644 index 12fb2c0..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/DJ/F3N5KA328H6KPE36KJLFHV.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FE/C6BJR38GS6H4J2SPT0XRZG.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FE/C6BJR38GS6H4J2SPT0XRZG.uasset deleted file mode 100644 index c4956e4..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FE/C6BJR38GS6H4J2SPT0XRZG.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FI/PYW5E1IVFV8U5TT2WHQGHB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FI/PYW5E1IVFV8U5TT2WHQGHB.uasset deleted file mode 100644 index 832b6ec..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FI/PYW5E1IVFV8U5TT2WHQGHB.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/S1/V1WOSCNF9Z5E74HYU3V5O1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/S1/V1WOSCNF9Z5E74HYU3V5O1.uasset deleted file mode 100644 index 4f3cbfa..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/S1/V1WOSCNF9Z5E74HYU3V5O1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/SR/O49WBYGCZC2E5STYR76FC4.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/SR/O49WBYGCZC2E5STYR76FC4.uasset deleted file mode 100644 index b54c727..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/SR/O49WBYGCZC2E5STYR76FC4.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/X1/0K1YU00713QQLQPVSUR3IP.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/X1/0K1YU00713QQLQPVSUR3IP.uasset deleted file mode 100644 index bc3cc3b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/X1/0K1YU00713QQLQPVSUR3IP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/AN/JLMHPKUN9Z5WTQYDGYP142.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/AN/JLMHPKUN9Z5WTQYDGYP142.uasset deleted file mode 100644 index 61cf599..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/AN/JLMHPKUN9Z5WTQYDGYP142.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/BN/36TXURCS5J98HU9ZZ79V1Z.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/BN/36TXURCS5J98HU9ZZ79V1Z.uasset deleted file mode 100644 index 67d09ca..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/BN/36TXURCS5J98HU9ZZ79V1Z.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/R7/QBO2ZHXPF79ZYF4GINGLIF.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/R7/QBO2ZHXPF79ZYF4GINGLIF.uasset deleted file mode 100644 index ff0a791..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/R7/QBO2ZHXPF79ZYF4GINGLIF.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/RK/SCE75WXEPFZ9ERSYYKKE4A.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/RK/SCE75WXEPFZ9ERSYYKKE4A.uasset deleted file mode 100644 index 6f23c20..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/RK/SCE75WXEPFZ9ERSYYKKE4A.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/7N/V8LHYHOZ8T4E0JW1UI8HNH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/7N/V8LHYHOZ8T4E0JW1UI8HNH.uasset deleted file mode 100644 index c9c9631..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/7N/V8LHYHOZ8T4E0JW1UI8HNH.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/G4/6HOLR0R7EDXS2QUKSQ79J7.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/G4/6HOLR0R7EDXS2QUKSQ79J7.uasset deleted file mode 100644 index fc9d2fa..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/G4/6HOLR0R7EDXS2QUKSQ79J7.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Y7/WUY3BJM0HMIJDZ6ORO6KDY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Y7/WUY3BJM0HMIJDZ6ORO6KDY.uasset deleted file mode 100644 index 3cad6bf..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Y7/WUY3BJM0HMIJDZ6ORO6KDY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Z6/A3HQCHNAI3O4WPJZEB47V3.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Z6/A3HQCHNAI3O4WPJZEB47V3.uasset deleted file mode 100644 index 3e4c980..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Z6/A3HQCHNAI3O4WPJZEB47V3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/ZZ/JNWPBGUXXO50Z8FMT2C8FK.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/ZZ/JNWPBGUXXO50Z8FMT2C8FK.uasset deleted file mode 100644 index 318ec9b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/ZZ/JNWPBGUXXO50Z8FMT2C8FK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/AC/GJKJDMBGHUD0VUN52G0BWX.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/AC/GJKJDMBGHUD0VUN52G0BWX.uasset deleted file mode 100644 index a641fda..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/AC/GJKJDMBGHUD0VUN52G0BWX.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FI/VOZOS1IVPW2M97OAXQCQV1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FI/VOZOS1IVPW2M97OAXQCQV1.uasset deleted file mode 100644 index eb1a186..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FI/VOZOS1IVPW2M97OAXQCQV1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FU/ESKEUK3PO4RFJ7DNJHE95H.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FU/ESKEUK3PO4RFJ7DNJHE95H.uasset deleted file mode 100644 index ea6bd2c..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FU/ESKEUK3PO4RFJ7DNJHE95H.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FZ/TAY0RTVT1I4LEADPG4DMCL.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FZ/TAY0RTVT1I4LEADPG4DMCL.uasset deleted file mode 100644 index 5e5dc98..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FZ/TAY0RTVT1I4LEADPG4DMCL.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/HG/KNVV0PKQUQGFMXEO4LEB5E.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/HG/KNVV0PKQUQGFMXEO4LEB5E.uasset deleted file mode 100644 index 7390381..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/HG/KNVV0PKQUQGFMXEO4LEB5E.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/OJ/3Z4PRDM96FA9PAAA5QN8T6.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/OJ/3Z4PRDM96FA9PAAA5QN8T6.uasset deleted file mode 100644 index 75896ba..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/OJ/3Z4PRDM96FA9PAAA5QN8T6.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/Q9/VV1XAARCTH3S9KYJ70JU5U.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/Q9/VV1XAARCTH3S9KYJ70JU5U.uasset deleted file mode 100644 index 989c366..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/Q9/VV1XAARCTH3S9KYJ70JU5U.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/RK/BFV42H3EZS6RTU76GYOY42.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/RK/BFV42H3EZS6RTU76GYOY42.uasset deleted file mode 100644 index 8a6740c..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/RK/BFV42H3EZS6RTU76GYOY42.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/0Y/JGIN2GJ35V3PEEV84HFVRV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/0Y/JGIN2GJ35V3PEEV84HFVRV.uasset deleted file mode 100644 index 8bc73dd..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/0Y/JGIN2GJ35V3PEEV84HFVRV.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/BX/0TL7ZIIQQ5DC1IAX1XYJUZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/BX/0TL7ZIIQQ5DC1IAX1XYJUZ.uasset deleted file mode 100644 index a0ae9ee..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/BX/0TL7ZIIQQ5DC1IAX1XYJUZ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/IY/E2HCOQGZZ81FQJZH0Q7EXB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/IY/E2HCOQGZZ81FQJZH0Q7EXB.uasset deleted file mode 100644 index 7940ca4..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/IY/E2HCOQGZZ81FQJZH0Q7EXB.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/QR/0XN8O0QF52ZUXKOZG7BONA.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/QR/0XN8O0QF52ZUXKOZG7BONA.uasset deleted file mode 100644 index 0005a27..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/QR/0XN8O0QF52ZUXKOZG7BONA.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/V3/20IIIADDF8349J2BKCJKT0.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/V3/20IIIADDF8349J2BKCJKT0.uasset deleted file mode 100644 index 959698d..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/V3/20IIIADDF8349J2BKCJKT0.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XQ/YVK1F3AJGN2OYUWBYE1175.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XQ/YVK1F3AJGN2OYUWBYE1175.uasset deleted file mode 100644 index 604c384..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XQ/YVK1F3AJGN2OYUWBYE1175.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XT/8U4LWVODG9CWTCW2RDG45N.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XT/8U4LWVODG9CWTCW2RDG45N.uasset deleted file mode 100644 index cb2ff15..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XT/8U4LWVODG9CWTCW2RDG45N.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/ZO/DNU8CWFVEZ083S87RKPEZ9.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/ZO/DNU8CWFVEZ083S87RKPEZ9.uasset deleted file mode 100644 index e32fa4c..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/ZO/DNU8CWFVEZ083S87RKPEZ9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/0H/L2OPHB6SDBCIRYW1FF8EBT.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/0H/L2OPHB6SDBCIRYW1FF8EBT.uasset deleted file mode 100644 index 57e9418..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/0H/L2OPHB6SDBCIRYW1FF8EBT.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/EY/NKSPJALRCCOUADXCNJK3CL.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/EY/NKSPJALRCCOUADXCNJK3CL.uasset deleted file mode 100644 index 8a8b664..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/EY/NKSPJALRCCOUADXCNJK3CL.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/FU/3SI6A5UVXA8UU40SO8PXBK.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/FU/3SI6A5UVXA8UU40SO8PXBK.uasset deleted file mode 100644 index 0216530..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/FU/3SI6A5UVXA8UU40SO8PXBK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/ZQ/9WNDS1QQWL546BM4CI6BNZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/ZQ/9WNDS1QQWL546BM4CI6BNZ.uasset deleted file mode 100644 index 90ee09f..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/ZQ/9WNDS1QQWL546BM4CI6BNZ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2J/LZETGQ3X85G5TSJ9FFXCA3.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2J/LZETGQ3X85G5TSJ9FFXCA3.uasset deleted file mode 100644 index 52dc4f4..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2J/LZETGQ3X85G5TSJ9FFXCA3.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2S/5B1U9FCQ8M5X53RHEQ6D5J.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2S/5B1U9FCQ8M5X53RHEQ6D5J.uasset deleted file mode 100644 index d678f90..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2S/5B1U9FCQ8M5X53RHEQ6D5J.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/89/YLDOGE8ZIHHE1N8EWSSA5X.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/89/YLDOGE8ZIHHE1N8EWSSA5X.uasset deleted file mode 100644 index c253a9b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/89/YLDOGE8ZIHHE1N8EWSSA5X.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/I2/P09WK19412DF9S1OSOGA9N.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/I2/P09WK19412DF9S1OSOGA9N.uasset deleted file mode 100644 index 1f16e86..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/I2/P09WK19412DF9S1OSOGA9N.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/MU/N60BGDPNX9NAECL7P3D62A.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/MU/N60BGDPNX9NAECL7P3D62A.uasset deleted file mode 100644 index 9fa85b6..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/MU/N60BGDPNX9NAECL7P3D62A.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/R0/PW2O8FXK76Q7QQP5HO12GT.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/R0/PW2O8FXK76Q7QQP5HO12GT.uasset deleted file mode 100644 index 43da282..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/R0/PW2O8FXK76Q7QQP5HO12GT.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RH/6EAZC8A5PICQNUO92BCA8I.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RH/6EAZC8A5PICQNUO92BCA8I.uasset deleted file mode 100644 index f8ae146..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RH/6EAZC8A5PICQNUO92BCA8I.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RR/VFVX5TLBBD4APPS0WIVULU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RR/VFVX5TLBBD4APPS0WIVULU.uasset deleted file mode 100644 index 1689f64..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RR/VFVX5TLBBD4APPS0WIVULU.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/SR/9P30BPQ8QVJ0DC2NIS2OC5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/SR/9P30BPQ8QVJ0DC2NIS2OC5.uasset deleted file mode 100644 index eb62682..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/SR/9P30BPQ8QVJ0DC2NIS2OC5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/TM/9JUSV7NLY7Q93ZKVXAUORV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/TM/9JUSV7NLY7Q93ZKVXAUORV.uasset deleted file mode 100644 index 65a95a9..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/TM/9JUSV7NLY7Q93ZKVXAUORV.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/0Q/K1MY2Z3PO44FGAHJOJSWRF.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/0Q/K1MY2Z3PO44FGAHJOJSWRF.uasset deleted file mode 100644 index 1ed059b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/0Q/K1MY2Z3PO44FGAHJOJSWRF.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/4U/0JQULTZPZO65LXMOXJI8ZH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/4U/0JQULTZPZO65LXMOXJI8ZH.uasset deleted file mode 100644 index 0e244e8..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/4U/0JQULTZPZO65LXMOXJI8ZH.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/C4/G8J8FNL5D83NA6SN3RKUNP.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/C4/G8J8FNL5D83NA6SN3RKUNP.uasset deleted file mode 100644 index 14cc1a5..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/C4/G8J8FNL5D83NA6SN3RKUNP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/NS/E0F0PNC3IO8QSVU5LCI5I2.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/NS/E0F0PNC3IO8QSVU5LCI5I2.uasset deleted file mode 100644 index 88f945e..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/NS/E0F0PNC3IO8QSVU5LCI5I2.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/TT/YM92F6PM12D7710U2ZVWWY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/TT/YM92F6PM12D7710U2ZVWWY.uasset deleted file mode 100644 index 6b0de61..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/TT/YM92F6PM12D7710U2ZVWWY.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/0L/CL3R603WDPFWJLMYLWZVZN.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/0L/CL3R603WDPFWJLMYLWZVZN.uasset deleted file mode 100644 index dfc8af6..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/0L/CL3R603WDPFWJLMYLWZVZN.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/5R/95TDOJQ9Z8E18ROGC7MIX7.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/5R/95TDOJQ9Z8E18ROGC7MIX7.uasset deleted file mode 100644 index b302aec..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/5R/95TDOJQ9Z8E18ROGC7MIX7.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/6U/6T7ODNLR62JH0BULT1J4AE.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/6U/6T7ODNLR62JH0BULT1J4AE.uasset deleted file mode 100644 index bd0c564..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/6U/6T7ODNLR62JH0BULT1J4AE.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/9S/LQQ0H0SH70184OCJX1HNZ4.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/9S/LQQ0H0SH70184OCJX1HNZ4.uasset deleted file mode 100644 index de1e621..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/9S/LQQ0H0SH70184OCJX1HNZ4.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/C4/C5A84ZQFO9N5LUDADATW0V.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/C4/C5A84ZQFO9N5LUDADATW0V.uasset deleted file mode 100644 index 3109eb2..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/C4/C5A84ZQFO9N5LUDADATW0V.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/J4/0LD3OOMMA7A1BOXNC9KUEB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/J4/0LD3OOMMA7A1BOXNC9KUEB.uasset deleted file mode 100644 index a0152dc..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/J4/0LD3OOMMA7A1BOXNC9KUEB.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/LR/BCXS1F48STUAAKWQ5V9AA5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/LR/BCXS1F48STUAAKWQ5V9AA5.uasset deleted file mode 100644 index 23682b3..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/LR/BCXS1F48STUAAKWQ5V9AA5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/ML/40T5MMM0YXF4J1LHKAELOM.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/ML/40T5MMM0YXF4J1LHKAELOM.uasset deleted file mode 100644 index 3eb97f7..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/ML/40T5MMM0YXF4J1LHKAELOM.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/N4/8DRPJ2DF8214RH35JA4GMC.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/N4/8DRPJ2DF8214RH35JA4GMC.uasset deleted file mode 100644 index 30a19fa..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/N4/8DRPJ2DF8214RH35JA4GMC.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/O2/81W0XWDLGITVXVMUB25TDV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/O2/81W0XWDLGITVXVMUB25TDV.uasset deleted file mode 100644 index d9e57ad..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/O2/81W0XWDLGITVXVMUB25TDV.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/P8/NS40YVZO11JHTQKF9JMSXF.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/P8/NS40YVZO11JHTQKF9JMSXF.uasset deleted file mode 100644 index a7de9f6..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/P8/NS40YVZO11JHTQKF9JMSXF.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/73/Q8RBKW1UCEJ0BQANAITWX5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/73/Q8RBKW1UCEJ0BQANAITWX5.uasset deleted file mode 100644 index 960bac1..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/73/Q8RBKW1UCEJ0BQANAITWX5.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/7P/SBT259X67MUNBQI7R3T53P.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/7P/SBT259X67MUNBQI7R3T53P.uasset deleted file mode 100644 index 1e5e865..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/7P/SBT259X67MUNBQI7R3T53P.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/82/UMH0N4CZQFRU0ME4IZXWI8.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/82/UMH0N4CZQFRU0ME4IZXWI8.uasset deleted file mode 100644 index b0b9089..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/82/UMH0N4CZQFRU0ME4IZXWI8.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/88/TDH4MAYEZP207X3DMEB2OI.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/88/TDH4MAYEZP207X3DMEB2OI.uasset deleted file mode 100644 index 7f824bb..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/88/TDH4MAYEZP207X3DMEB2OI.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/8J/EQEW33IHHR667Y7DPDUFKK.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/8J/EQEW33IHHR667Y7DPDUFKK.uasset deleted file mode 100644 index e16403b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/8J/EQEW33IHHR667Y7DPDUFKK.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/EG/T8AKUCFASX0QNVT22HD30H.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/EG/T8AKUCFASX0QNVT22HD30H.uasset deleted file mode 100644 index ffe5dbe..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/EG/T8AKUCFASX0QNVT22HD30H.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/MO/C4L1DOMPEFG1B1T21Z4RNL.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/MO/C4L1DOMPEFG1B1T21Z4RNL.uasset deleted file mode 100644 index d7d45cf..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/MO/C4L1DOMPEFG1B1T21Z4RNL.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T2/1CGXTAH2ZI6S335DJWHRJ9.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T2/1CGXTAH2ZI6S335DJWHRJ9.uasset deleted file mode 100644 index 0e19baf..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T2/1CGXTAH2ZI6S335DJWHRJ9.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T6/99IJ6BRDKY68PMANM4E0U1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T6/99IJ6BRDKY68PMANM4E0U1.uasset deleted file mode 100644 index 4de8965..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T6/99IJ6BRDKY68PMANM4E0U1.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/W0/7ZPJ8M3MEVY6KHBGJC37EZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/W0/7ZPJ8M3MEVY6KHBGJC37EZ.uasset deleted file mode 100644 index 07a695b..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/W0/7ZPJ8M3MEVY6KHBGJC37EZ.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/DA/K28CUXOWD7LWSW25P6Z35P.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/DA/K28CUXOWD7LWSW25P6Z35P.uasset deleted file mode 100644 index 40f7b57..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/DA/K28CUXOWD7LWSW25P6Z35P.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/E2/LUCPJMX9ZH469ORNA5LMBP.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/E2/LUCPJMX9ZH469ORNA5LMBP.uasset deleted file mode 100644 index 78f3652..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/E2/LUCPJMX9ZH469ORNA5LMBP.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/F3/8FPOFB99K2OT9AF8LGCI1G.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/F3/8FPOFB99K2OT9AF8LGCI1G.uasset deleted file mode 100644 index 6fc42ff..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/F3/8FPOFB99K2OT9AF8LGCI1G.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/VE/IBZI1HGCXN01TW4JJ5RBOU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/VE/IBZI1HGCXN01TW4JJ5RBOU.uasset deleted file mode 100644 index 752892e..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/VE/IBZI1HGCXN01TW4JJ5RBOU.uasset and /dev/null differ diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/49/VR137PSSEONSZYOJDXKSNI.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/49/VR137PSSEONSZYOJDXKSNI.uasset deleted file mode 100644 index 373dc1c..0000000 Binary files a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/49/VR137PSSEONSZYOJDXKSNI.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/9D/ODYKWBVQ5YPDXSDWJDSI5Z.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/9D/ODYKWBVQ5YPDXSDWJDSI5Z.uasset deleted file mode 100644 index 79df193..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/9D/ODYKWBVQ5YPDXSDWJDSI5Z.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/HU/BN9XQV23Z2PJ1NNACEOHTX.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/HU/BN9XQV23Z2PJ1NNACEOHTX.uasset deleted file mode 100644 index 259ce04..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/HU/BN9XQV23Z2PJ1NNACEOHTX.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/IT/LAONTWEKWR03FY1W3WGQNC.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/IT/LAONTWEKWR03FY1W3WGQNC.uasset deleted file mode 100644 index e93c511..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/IT/LAONTWEKWR03FY1W3WGQNC.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/VW/D1QERUEF4BT0SJ7JON4ABJ.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/VW/D1QERUEF4BT0SJ7JON4ABJ.uasset deleted file mode 100644 index 9ee5f84..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/VW/D1QERUEF4BT0SJ7JON4ABJ.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/1/N4/K32KI0AG7N0DL49GXDSEHL.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/1/N4/K32KI0AG7N0DL49GXDSEHL.uasset deleted file mode 100644 index 1265e1c..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/1/N4/K32KI0AG7N0DL49GXDSEHL.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/2/OE/06E4EHW0RK6BBO6IKZ8MM7.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/2/OE/06E4EHW0RK6BBO6IKZ8MM7.uasset deleted file mode 100644 index 4ae3805..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/2/OE/06E4EHW0RK6BBO6IKZ8MM7.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/7Z/29V5FZQ00G4SPGYVRIIHN5.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/7Z/29V5FZQ00G4SPGYVRIIHN5.uasset deleted file mode 100644 index 4191898..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/7Z/29V5FZQ00G4SPGYVRIIHN5.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/B1/01JFRDWADRKIKP06478EQG.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/B1/01JFRDWADRKIKP06478EQG.uasset deleted file mode 100644 index e3c2d97..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/B1/01JFRDWADRKIKP06478EQG.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/36/KBB8RFBN2RRMBD1EAOZ825.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/36/KBB8RFBN2RRMBD1EAOZ825.uasset deleted file mode 100644 index 3e443cf..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/36/KBB8RFBN2RRMBD1EAOZ825.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/GS/2WS5T7NPSL6P167YENZ0RX.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/GS/2WS5T7NPSL6P167YENZ0RX.uasset deleted file mode 100644 index 1600f50..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/GS/2WS5T7NPSL6P167YENZ0RX.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/Q3/KY42ITXWBEPD99BD50GCCJ.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/Q3/KY42ITXWBEPD99BD50GCCJ.uasset deleted file mode 100644 index e87565c..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/Q3/KY42ITXWBEPD99BD50GCCJ.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/9/UZ/KTVOLZ6X4TIVACY98L8NUE.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/9/UZ/KTVOLZ6X4TIVACY98L8NUE.uasset deleted file mode 100644 index 1862173..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/9/UZ/KTVOLZ6X4TIVACY98L8NUE.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/QJ/Q8MUZMCPNSAFNQNT1EMPEO.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/QJ/Q8MUZMCPNSAFNQNT1EMPEO.uasset deleted file mode 100644 index 4b49471..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/QJ/Q8MUZMCPNSAFNQNT1EMPEO.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/Y4/TGT919L5P5S1G33ISKEPWO.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/Y4/TGT919L5P5S1G33ISKEPWO.uasset deleted file mode 100644 index 163062c..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/Y4/TGT919L5P5S1G33ISKEPWO.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/AU/ABFDDJXNWORLPCM5L00YZ8.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/AU/ABFDDJXNWORLPCM5L00YZ8.uasset deleted file mode 100644 index df32954..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/AU/ABFDDJXNWORLPCM5L00YZ8.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/VP/CTS3EAYXWWHWS91H39XWNY.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/VP/CTS3EAYXWWHWS91H39XWNY.uasset deleted file mode 100644 index 65b49ee..0000000 Binary files a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/VP/CTS3EAYXWWHWS91H39XWNY.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/UG/ZX8RGGTMXVLSKTMZHEWEKR.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/UG/ZX8RGGTMXVLSKTMZHEWEKR.uasset deleted file mode 100644 index 4a7204f..0000000 Binary files a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/UG/ZX8RGGTMXVLSKTMZHEWEKR.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/Z1/UMJIL66X80HOZOJFKETNE8.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/Z1/UMJIL66X80HOZOJFKETNE8.uasset deleted file mode 100644 index ac7b993..0000000 Binary files a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/Z1/UMJIL66X80HOZOJFKETNE8.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/8/31/NU4AYO6JNDEAFXR2NA7X2O.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/8/31/NU4AYO6JNDEAFXR2NA7X2O.uasset deleted file mode 100644 index 090604e..0000000 Binary files a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/8/31/NU4AYO6JNDEAFXR2NA7X2O.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/9/XZ/RWPO76SKN90CVFMFKTDPKE.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/9/XZ/RWPO76SKN90CVFMFKTDPKE.uasset deleted file mode 100644 index 9c3e0fd..0000000 Binary files a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/9/XZ/RWPO76SKN90CVFMFKTDPKE.uasset and /dev/null differ diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/A/KQ/NGY0EZTAH2RRKD753U65B5.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/A/KQ/NGY0EZTAH2RRKD753U65B5.uasset deleted file mode 100644 index 1e1f485..0000000 Binary files a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/A/KQ/NGY0EZTAH2RRKD753U65B5.uasset and /dev/null differ diff --git a/Scripts/import_fonts.py b/Scripts/import_fonts.py new file mode 100644 index 0000000..fccdadb --- /dev/null +++ b/Scripts/import_fonts.py @@ -0,0 +1,90 @@ +""" +import_fonts.py — Importa as fontes Aurora Arcana para o cliente ZMMO. + +Cria (UFontFace, loading policy = Inline; .ttf embutido no .uasset): + Content/ZMMO/UI/Fonts/Cinzel/ FF_Cinzel_Regular | _SemiBold | _Bold | _ExtraBold + Content/ZMMO/UI/Fonts/Rajdhani/ FF_Rajdhani_Regular | _Medium | _SemiBold | _Bold + +Source dos .ttf: Tools/Templates/Zeus_Widget/shared/assets/fonts/ (source-of-truth, +não duplicar — UFontFace importa como Inline e embute o .ttf no .uasset). + +Nota: Typeface/TypefaceEntry/FontData NÃO são expostos ao Python (UE 5.7), então +a Composite Font (Font_Cinzel/Font_Rajdhani) não é criada por script. Como o +FUIStyleText usa um peso fixo por papel, o FSlateFontInfo referencia o FF_* direto. + +Idempotente. Como rodar: + - Editor: console Python -> exec(open(r"f:/.../Scripts/import_fonts.py").read()) + - Ou via MCP nwiro execute_python. +""" + +import os +import unreal + +SRC_DIR = r"f:/ZeusProject/Tools/Templates/Zeus_Widget/shared/assets/fonts" +DEST_ROOT = "/Game/ZMMO/UI/Fonts" + +FAMILIES = { + "Cinzel": [ + ("Regular", "Cinzel-Regular.ttf"), + ("SemiBold", "Cinzel-SemiBold.ttf"), + ("Bold", "Cinzel-Bold.ttf"), + ("ExtraBold", "Cinzel-ExtraBold.ttf"), + ], + "Rajdhani": [ + ("Regular", "Rajdhani-Regular.ttf"), + ("Medium", "Rajdhani-Medium.ttf"), + ("SemiBold", "Rajdhani-SemiBold.ttf"), + ("Bold", "Rajdhani-Bold.ttf"), + ], +} + +asset_tools = unreal.AssetToolsHelpers.get_asset_tools() + + +def import_font_face(ttf_path, dest_pkg_path, asset_name): + task = unreal.AssetImportTask() + task.filename = ttf_path + task.destination_path = dest_pkg_path + task.destination_name = asset_name + task.replace_existing = True + task.automated = True + task.save = True + task.factory = unreal.FontFileImportFactory() + + asset_tools.import_asset_tasks([task]) + + full = "{}/{}".format(dest_pkg_path, asset_name) + face = unreal.load_asset(full) + if face is None: + unreal.log_error("[import_fonts] FALHOU import: {}".format(full)) + return False + + try: + face.set_editor_property("loading_policy", unreal.FontLoadingPolicy.INLINE) + unreal.EditorAssetLibrary.save_asset(full) + except Exception as e: + unreal.log_warning("[import_fonts] loading_policy INLINE falhou em {}: {}".format(full, e)) + + unreal.log_warning("[import_fonts] OK {} (class={})".format(full, type(face).__name__)) + return True + + +def main(): + unreal.log_warning("[import_fonts] === inicio ===") + ok = 0 + total = 0 + for family, weights in FAMILIES.items(): + dest_pkg = "{}/{}".format(DEST_ROOT, family) + for weight_name, ttf in weights: + total += 1 + ttf_path = os.path.join(SRC_DIR, ttf).replace("\\", "/") + if not os.path.isfile(ttf_path): + unreal.log_error("[import_fonts] .ttf nao encontrado: {}".format(ttf_path)) + continue + asset_name = "FF_{}_{}".format(family, weight_name) + if import_font_face(ttf_path, dest_pkg, asset_name): + ok += 1 + unreal.log_warning("[import_fonts] === fim: {}/{} faces ===".format(ok, total)) + + +main() diff --git a/Source/ZMMO/Data/Abilities/AbilityRow.h b/Source/ZMMO/Data/Abilities/AbilityRow.h new file mode 100644 index 0000000..1d69f7c --- /dev/null +++ b/Source/ZMMO/Data/Abilities/AbilityRow.h @@ -0,0 +1,84 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "AbilityRow.generated.h" + +class UTexture2D; +class UAnimMontage; +class UNiagaraSystem; +class USoundBase; + +UENUM(BlueprintType) +enum class EAbilityCategory : uint8 +{ + Combat UMETA(DisplayName = "Combat"), + Buff UMETA(DisplayName = "Buff"), + Heal UMETA(DisplayName = "Heal"), + Movement UMETA(DisplayName = "Movement"), + Passive UMETA(DisplayName = "Passive") +}; + +UENUM(BlueprintType) +enum class EAbilityTarget : uint8 +{ + Self UMETA(DisplayName = "Self"), + Single UMETA(DisplayName = "Single Target"), + Area UMETA(DisplayName = "Area"), + Cone UMETA(DisplayName = "Cone"), + Line UMETA(DisplayName = "Line") +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FAbilityRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ability") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ability", meta = (MultiLine = true)) + FText Description; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ability") + EAbilityCategory Category = EAbilityCategory::Combat; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Targeting") + EAbilityTarget TargetMode = EAbilityTarget::Single; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Targeting") + float Range = 500.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Targeting", meta = (EditCondition = "TargetMode == EAbilityTarget::Area || TargetMode == EAbilityTarget::Cone")) + float Radius = 200.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cost") + int32 ManaCost = 0; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cost") + int32 StaminaCost = 0; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Timing") + float CastTime = 0.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Timing") + float Cooldown = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Effect") + int32 BaseDamage = 0; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Effect") + FName StatusEffectRow; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr Icon; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr CastMontage; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr CastVFX; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Audio") + TSoftObjectPtr CastSound; +}; diff --git a/Source/ZMMO/Data/Abilities/StatusEffectRow.h b/Source/ZMMO/Data/Abilities/StatusEffectRow.h new file mode 100644 index 0000000..42da702 --- /dev/null +++ b/Source/ZMMO/Data/Abilities/StatusEffectRow.h @@ -0,0 +1,51 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "StatusEffectRow.generated.h" + +class UTexture2D; +class UNiagaraSystem; + +UENUM(BlueprintType) +enum class EStatusEffectKind : uint8 +{ + Buff UMETA(DisplayName = "Buff"), + Debuff UMETA(DisplayName = "Debuff"), + DoT UMETA(DisplayName = "Damage Over Time"), + HoT UMETA(DisplayName = "Heal Over Time"), + Crowd UMETA(DisplayName = "Crowd Control") +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FStatusEffectRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status", meta = (MultiLine = true)) + FText Description; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status") + EStatusEffectKind Kind = EStatusEffectKind::Buff; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status") + float Duration = 5.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status") + float TickInterval = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status") + int32 TickValue = 0; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Status") + int32 MaxStacks = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr Icon; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr AttachedVFX; +}; diff --git a/Source/ZMMO/Data/Items/ItemRow.h b/Source/ZMMO/Data/Items/ItemRow.h new file mode 100644 index 0000000..f80fbcc --- /dev/null +++ b/Source/ZMMO/Data/Items/ItemRow.h @@ -0,0 +1,46 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "Items/ItemTypes.h" +#include "ItemRow.generated.h" + +class AActor; +class UStaticMesh; +class UTexture2D; + +USTRUCT(BlueprintType) +struct ZMMO_API FItemRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (MultiLine = true)) + FText Description; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") + EItemType Type = EItemType::None; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") + EItemRarity Rarity = EItemRarity::Common; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Equipment", meta = (EditCondition = "Type == EItemType::Weapon || Type == EItemType::Armor || Type == EItemType::Accessory")) + EEquipSlot EquipSlot = EEquipSlot::None; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") + int32 MaxStack = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") + int32 BasePrice = 0; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr Icon; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Visuals") + TSoftObjectPtr WorldMesh; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Behavior") + TSoftClassPtr BehaviorClass; +}; diff --git a/Source/ZMMO/Data/Items/ItemTypes.h b/Source/ZMMO/Data/Items/ItemTypes.h new file mode 100644 index 0000000..aeb24a7 --- /dev/null +++ b/Source/ZMMO/Data/Items/ItemTypes.h @@ -0,0 +1,45 @@ +#pragma once + +#include "CoreMinimal.h" +#include "ItemTypes.generated.h" + +UENUM(BlueprintType) +enum class EItemType : uint8 +{ + None UMETA(DisplayName = "None"), + Weapon UMETA(DisplayName = "Weapon"), + Armor UMETA(DisplayName = "Armor"), + Accessory UMETA(DisplayName = "Accessory"), + Consumable UMETA(DisplayName = "Consumable"), + Material UMETA(DisplayName = "Material"), + Quest UMETA(DisplayName = "Quest"), + Currency UMETA(DisplayName = "Currency") +}; + +UENUM(BlueprintType) +enum class EItemRarity : uint8 +{ + Common UMETA(DisplayName = "Common"), + Uncommon UMETA(DisplayName = "Uncommon"), + Rare UMETA(DisplayName = "Rare"), + Epic UMETA(DisplayName = "Epic"), + Legendary UMETA(DisplayName = "Legendary"), + Mythic UMETA(DisplayName = "Mythic") +}; + +UENUM(BlueprintType) +enum class EEquipSlot : uint8 +{ + None UMETA(DisplayName = "None"), + Head UMETA(DisplayName = "Head"), + Chest UMETA(DisplayName = "Chest"), + Legs UMETA(DisplayName = "Legs"), + Hands UMETA(DisplayName = "Hands"), + Feet UMETA(DisplayName = "Feet"), + MainHand UMETA(DisplayName = "Main Hand"), + OffHand UMETA(DisplayName = "Off Hand"), + TwoHand UMETA(DisplayName = "Two Hand"), + Ring UMETA(DisplayName = "Ring"), + Necklace UMETA(DisplayName = "Necklace"), + Cape UMETA(DisplayName = "Cape") +}; diff --git a/Source/ZMMO/Data/Mobs/MobRow.h b/Source/ZMMO/Data/Mobs/MobRow.h new file mode 100644 index 0000000..33e4665 --- /dev/null +++ b/Source/ZMMO/Data/Mobs/MobRow.h @@ -0,0 +1,48 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "Mobs/MobTypes.h" +#include "Players/StatBlock.h" +#include "MobRow.generated.h" + +class APawn; + +USTRUCT(BlueprintType) +struct ZMMO_API FMobRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Mob") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Mob") + TSoftClassPtr BlueprintRef; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Mob") + EMobFamily Family = EMobFamily::Beast; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Mob") + EMobFaction Faction = EMobFaction::Hostile; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Mob") + EMobBehavior Behavior = EMobBehavior::Aggressive; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Mob") + int32 Level = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stats") + FStatBlock Stats; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Combat") + float AggroRadius = 800.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Combat") + float LeashRadius = 2000.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Rewards") + int32 ExperienceReward = 0; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Rewards") + FName DropTableRow; +}; diff --git a/Source/ZMMO/Data/Mobs/MobTypes.h b/Source/ZMMO/Data/Mobs/MobTypes.h new file mode 100644 index 0000000..c1c9041 --- /dev/null +++ b/Source/ZMMO/Data/Mobs/MobTypes.h @@ -0,0 +1,35 @@ +#pragma once + +#include "CoreMinimal.h" +#include "MobTypes.generated.h" + +UENUM(BlueprintType) +enum class EMobFaction : uint8 +{ + Neutral UMETA(DisplayName = "Neutral"), + Hostile UMETA(DisplayName = "Hostile"), + Friendly UMETA(DisplayName = "Friendly"), + Boss UMETA(DisplayName = "Boss") +}; + +UENUM(BlueprintType) +enum class EMobBehavior : uint8 +{ + Passive UMETA(DisplayName = "Passive"), + Defensive UMETA(DisplayName = "Defensive"), + Aggressive UMETA(DisplayName = "Aggressive"), + Patrol UMETA(DisplayName = "Patrol"), + Stationary UMETA(DisplayName = "Stationary") +}; + +UENUM(BlueprintType) +enum class EMobFamily : uint8 +{ + Beast UMETA(DisplayName = "Beast"), + Undead UMETA(DisplayName = "Undead"), + Humanoid UMETA(DisplayName = "Humanoid"), + Dragon UMETA(DisplayName = "Dragon"), + Elemental UMETA(DisplayName = "Elemental"), + Demon UMETA(DisplayName = "Demon"), + Construct UMETA(DisplayName = "Construct") +}; diff --git a/Source/ZMMO/Data/NPCs/DialogRow.h b/Source/ZMMO/Data/NPCs/DialogRow.h new file mode 100644 index 0000000..40828cd --- /dev/null +++ b/Source/ZMMO/Data/NPCs/DialogRow.h @@ -0,0 +1,32 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "DialogRow.generated.h" + +USTRUCT(BlueprintType) +struct ZMMO_API FDialogChoice +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialog") + FText Text; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialog") + FName NextNode; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialog") + FName RequiredQuestState; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FDialogRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialog", meta = (MultiLine = true)) + FText SpeakerLine; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialog") + TArray Choices; +}; diff --git a/Source/ZMMO/Data/NPCs/NPCRow.h b/Source/ZMMO/Data/NPCs/NPCRow.h new file mode 100644 index 0000000..57c2f4f --- /dev/null +++ b/Source/ZMMO/Data/NPCs/NPCRow.h @@ -0,0 +1,40 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "NPCRow.generated.h" + +class APawn; + +UENUM(BlueprintType) +enum class ENPCRole : uint8 +{ + Generic UMETA(DisplayName = "Generic"), + Vendor UMETA(DisplayName = "Vendor"), + Questgiver UMETA(DisplayName = "Questgiver"), + Trainer UMETA(DisplayName = "Trainer"), + Banker UMETA(DisplayName = "Banker"), + Innkeeper UMETA(DisplayName = "Innkeeper"), + Guard UMETA(DisplayName = "Guard") +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FNPCRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "NPC") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "NPC") + TSoftClassPtr BlueprintRef; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "NPC") + ENPCRole Role = ENPCRole::Generic; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Shop", meta = (EditCondition = "Role == ENPCRole::Vendor")) + TArray ShopInventory; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialog") + FName DialogRoot; +}; diff --git a/Source/ZMMO/Data/Players/ClassRow.h b/Source/ZMMO/Data/Players/ClassRow.h new file mode 100644 index 0000000..95679a8 --- /dev/null +++ b/Source/ZMMO/Data/Players/ClassRow.h @@ -0,0 +1,29 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "Players/StatBlock.h" +#include "ClassRow.generated.h" + +class APawn; + +USTRUCT(BlueprintType) +struct ZMMO_API FClassRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Class") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Class") + TSoftClassPtr BlueprintRef; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stats") + FStatBlock BaseStats; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stats") + FStatBlock LevelUpStats; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Class") + TArray StartingAbilities; +}; diff --git a/Source/ZMMO/Data/Players/StatBlock.h b/Source/ZMMO/Data/Players/StatBlock.h new file mode 100644 index 0000000..ec863ea --- /dev/null +++ b/Source/ZMMO/Data/Players/StatBlock.h @@ -0,0 +1,31 @@ +#pragma once + +#include "CoreMinimal.h" +#include "StatBlock.generated.h" + +USTRUCT(BlueprintType) +struct ZMMO_API FStatBlock +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + int32 Health = 100; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + int32 Mana = 50; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + int32 Stamina = 100; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + int32 Attack = 10; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + int32 Defense = 5; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + float MoveSpeed = 600.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats") + float AttackSpeed = 1.0f; +}; diff --git a/Source/ZMMO/Data/Quests/QuestRow.h b/Source/ZMMO/Data/Quests/QuestRow.h new file mode 100644 index 0000000..c34c465 --- /dev/null +++ b/Source/ZMMO/Data/Quests/QuestRow.h @@ -0,0 +1,77 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "QuestRow.generated.h" + +UENUM(BlueprintType) +enum class EQuestKind : uint8 +{ + Main UMETA(DisplayName = "Main"), + Side UMETA(DisplayName = "Side"), + Daily UMETA(DisplayName = "Daily"), + Repeatable UMETA(DisplayName = "Repeatable"), + Event UMETA(DisplayName = "Event") +}; + +UENUM(BlueprintType) +enum class EQuestObjectiveType : uint8 +{ + Kill UMETA(DisplayName = "Kill"), + Collect UMETA(DisplayName = "Collect"), + Talk UMETA(DisplayName = "Talk"), + Reach UMETA(DisplayName = "Reach Location"), + Use UMETA(DisplayName = "Use Item"), + Escort UMETA(DisplayName = "Escort") +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FQuestObjective +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Objective") + EQuestObjectiveType Type = EQuestObjectiveType::Kill; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Objective") + FName TargetId; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Objective") + int32 Required = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Objective") + FText Description; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FQuestRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest", meta = (MultiLine = true)) + FText Description; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + EQuestKind Kind = EQuestKind::Side; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + int32 LevelRequirement = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + FName GiverNPC; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + FName TurnInNPC; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + TArray Objectives; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + FName RewardRow; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Quest") + TArray Prerequisites; +}; diff --git a/Source/ZMMO/Data/UI/FrontEndTypes.h b/Source/ZMMO/Data/UI/FrontEndTypes.h new file mode 100644 index 0000000..3eb7066 --- /dev/null +++ b/Source/ZMMO/Data/UI/FrontEndTypes.h @@ -0,0 +1,40 @@ +#pragma once + +#include "CoreMinimal.h" +#include "FrontEndTypes.generated.h" + +/** + * Estados de topo do fluxo de front-end (MainMenu). Dirigidos pelo + * UUIFrontEndFlowSubsystem; cada estado resolve uma tela + * (UUIActivatableScreen_Base) via DA_FrontEndScreenSet. + * + * Fluxo: Boot → Connecting → Login → ServerSelect → Lobby → EnteringWorld + * → InWorld. O Lobby é o hub principal logado; suas páginas internas são + * EZMMOLobbyPage (não são estados de topo — ver ARQUITETURA.md §4.8). + */ +UENUM(BlueprintType) +enum class EZMMOFrontEndState : uint8 +{ + None, + Boot, // splash inicial enquanto subsistemas sobem + Connecting, // conectando ao servidor Zeus (UDP) + Login, // autenticação + ServerSelect, // escolha de servidor/realm + Lobby, // hub principal logado (host das EZMMOLobbyPage) + EnteringWorld, // loading/handoff: OpenLevel do mapa de mundo + InWorld // no mundo (HUD de gameplay assume) +}; + +/** + * Páginas internas do Lobby — navegadas por um stack CommonUI DENTRO da tela + * de Lobby ("Switch principal"), não pelo fluxo de topo. + */ +UENUM(BlueprintType) +enum class EZMMOLobbyPage : uint8 +{ + None, + CharacterSelect, + CharacterCreate, + Shop, + Settings +}; diff --git a/Source/ZMMO/Data/UI/ThemeCalendarRow.h b/Source/ZMMO/Data/UI/ThemeCalendarRow.h new file mode 100644 index 0000000..d2aa83a --- /dev/null +++ b/Source/ZMMO/Data/UI/ThemeCalendarRow.h @@ -0,0 +1,29 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "ThemeCalendarRow.generated.h" + +USTRUCT(BlueprintType) +struct ZMMO_API FThemeCalendarRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Calendar") + FName ThemeId; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Calendar", meta = (ClampMin = "1", ClampMax = "12")) + int32 StartMonth = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Calendar", meta = (ClampMin = "1", ClampMax = "31")) + int32 StartDay = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Calendar", meta = (ClampMin = "1", ClampMax = "12")) + int32 EndMonth = 12; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Calendar", meta = (ClampMin = "1", ClampMax = "31")) + int32 EndDay = 31; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Calendar", meta = (ToolTip = "Higher priority wins when ranges overlap.")) + int32 Priority = 0; +}; diff --git a/Source/ZMMO/Data/UI/ThemeKeys.h b/Source/ZMMO/Data/UI/ThemeKeys.h new file mode 100644 index 0000000..d51d30e --- /dev/null +++ b/Source/ZMMO/Data/UI/ThemeKeys.h @@ -0,0 +1,29 @@ +#pragma once + +#include "CoreMinimal.h" +#include "ThemeKeys.generated.h" + +UENUM(BlueprintType) +enum class EZMMOThemeKey : uint8 +{ + // HUD + HUD_Frame UMETA(DisplayName = "HUD - Frame"), + HUD_HotbarBackground UMETA(DisplayName = "HUD - Hotbar Background"), + HUD_HealthBar UMETA(DisplayName = "HUD - Health Bar"), + HUD_ManaBar UMETA(DisplayName = "HUD - Mana Bar"), + + // Login / Character Select + Login_Background UMETA(DisplayName = "Login - Background"), + Login_Logo UMETA(DisplayName = "Login - Logo"), + Login_Music UMETA(DisplayName = "Login - Music"), + Login_AmbientVFX UMETA(DisplayName = "Login - Ambient VFX"), + CharSelect_Background UMETA(DisplayName = "Character Select - Background"), + + // Inventory + Inventory_SlotEmpty UMETA(DisplayName = "Inventory - Empty Slot"), + Inventory_Background UMETA(DisplayName = "Inventory - Background"), + + // Generic + MainMenu_Music UMETA(DisplayName = "Main Menu Music"), + LoadingScreen UMETA(DisplayName = "Loading Screen") +}; diff --git a/Source/ZMMO/Data/UI/ThemeRow.h b/Source/ZMMO/Data/UI/ThemeRow.h new file mode 100644 index 0000000..1161134 --- /dev/null +++ b/Source/ZMMO/Data/UI/ThemeRow.h @@ -0,0 +1,41 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "UObject/SoftObjectPtr.h" +#include "ThemeRow.generated.h" + +class UObject; +class UTexture2D; +class USoundBase; +class UNiagaraSystem; + +USTRUCT(BlueprintType) +struct ZMMO_API FThemeEntry +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + TSoftObjectPtr Texture; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + TSoftObjectPtr Sound; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + TSoftObjectPtr VFX; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + TSoftObjectPtr Generic; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FThemeRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + FName ThemeId; +}; diff --git a/Source/ZMMO/Data/UI/UILayerTags.cpp b/Source/ZMMO/Data/UI/UILayerTags.cpp new file mode 100644 index 0000000..9b6f8e0 --- /dev/null +++ b/Source/ZMMO/Data/UI/UILayerTags.cpp @@ -0,0 +1,9 @@ +#include "UI/UILayerTags.h" + +namespace ZMMOUITags +{ + UE_DEFINE_GAMEPLAY_TAG(UI_Layer_Game, "UI.Layer.Game"); + UE_DEFINE_GAMEPLAY_TAG(UI_Layer_GameMenu, "UI.Layer.GameMenu"); + UE_DEFINE_GAMEPLAY_TAG(UI_Layer_Menu, "UI.Layer.Menu"); + UE_DEFINE_GAMEPLAY_TAG(UI_Layer_Modal, "UI.Layer.Modal"); +} diff --git a/Source/ZMMO/Data/UI/UILayerTags.h b/Source/ZMMO/Data/UI/UILayerTags.h new file mode 100644 index 0000000..ef7263f --- /dev/null +++ b/Source/ZMMO/Data/UI/UILayerTags.h @@ -0,0 +1,21 @@ +#pragma once + +#include "NativeGameplayTags.h" + +/** + * GameplayTags nativos das camadas do switch principal de UI. Declaração + * nativa (não depende de DefaultGameplayTags.ini) — registradas no startup + * do módulo. Mapeadas para os stacks do UUIPrimaryGameLayout_Base. + * + * UI.Layer.Game — HUD de gameplay (camada de fundo) + * UI.Layer.GameMenu — menus sobre o jogo (inventário, mapa…) + * UI.Layer.Menu — front-end (Boot/Login/ServerSelect/Lobby) + * UI.Layer.Modal — diálogos/loading por cima de tudo + */ +namespace ZMMOUITags +{ + ZMMO_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(UI_Layer_Game); + ZMMO_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(UI_Layer_GameMenu); + ZMMO_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(UI_Layer_Menu); + ZMMO_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(UI_Layer_Modal); +} diff --git a/Source/ZMMO/Data/UI/UIStyleRow.h b/Source/ZMMO/Data/UI/UIStyleRow.h new file mode 100644 index 0000000..c52f8f9 --- /dev/null +++ b/Source/ZMMO/Data/UI/UIStyleRow.h @@ -0,0 +1,70 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "UIStyleTypes.h" +#include "UIStyleTokens.h" +#include "UIStyleRow.generated.h" + +/** + * Struct raiz que agrega todos os tokens de estilo de um tema. + * + * Adicionar membros aqui (fase 2/3) é mudança aditiva e segura para a + * DataTable existente — mas, ao alterar este struct em produção, fazer + * backup de DT_UI_Styles (UHT invalida rows serializadas se a coluna não + * preservar valores). Ver ARQUITETURA.md / docs Epic sobre DataTable. + */ +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyle +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStylePalette Palette; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyleSemantic Semantic; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyleText Text; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyleButton Button; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStylePanel Panel; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyleBorders Borders; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyleProgressBar ProgressBar; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyleTooltip Tooltip; +}; + +/** + * Linha de DT_UI_Styles. O Row Name é o ThemeId (ex.: "Default", "RPG"), + * espelhando DT_ThemeCalendar e ThemeRegistry — assim a camada de estilo + * é consumidora do ThemeId já resolvido pelo UZMMOThemeSubsystem. + */ +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FText DisplayName; + + /** Validação tipada de design-time; runtime resolve por ThemeId/Row Name. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + EUITheme Theme = EUITheme::None; + + /** Ponte para o ThemeId resolvido pelo UZMMOThemeSubsystem. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FName ThemeId; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style") + FUIStyle Style; +}; diff --git a/Source/ZMMO/Data/UI/UIStyleTokens.h b/Source/ZMMO/Data/UI/UIStyleTokens.h new file mode 100644 index 0000000..17f505c --- /dev/null +++ b/Source/ZMMO/Data/UI/UIStyleTokens.h @@ -0,0 +1,446 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Fonts/SlateFontInfo.h" +#include "Styling/SlateBrush.h" +#include "Layout/Margin.h" +#include "Templates/SubclassOf.h" +#include "UIStyleTypes.h" +#include "UIStyleTokens.generated.h" + +class UCommonTextStyle; + +/** + * Tokens de estilo da UI organizados em 3 camadas (design tokens): + * + * 1. Primitive (FUIStylePalette) — paleta crua "Aurora Arcana". + * Espelha Tools/Templates/Zeus_Widget/shared/styles.css (:root). + * 2. Semantic (FUIStyleSemantic) — papéis (Accent, Surface, OnSurface...) + * que referenciam a primitive. Trocar de tema mexe sobretudo aqui. + * 3. Component (FUIStyle*) — por componente, consome a camada semantic. + * + * Defaults faithful ao tema padrão; tudo é sobrescrito por linha em + * DT_UI_Styles (FUIStyleRow). Cores em FColor(R,G,B[,A]) sRGB convertidas + * implicitamente para FLinearColor. + */ + +// ===================================================================== +// 1. Primitive — paleta Aurora Arcana +// ===================================================================== +USTRUCT(BlueprintType) +struct ZMMO_API FUIStylePalette +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Bg0 = FLinearColor(FColor(7, 10, 18)); // --bg-0 #070A12 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Bg1 = FLinearColor(FColor(11, 16, 32)); // --bg-1 #0B1020 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Panel = FLinearColor(FColor(12, 18, 34, 235)); // --panel rgba(..,.92) + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Panel2 = FLinearColor(FColor(17, 24, 42)); // --panel-2 #11182A + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Panel3 = FLinearColor(FColor(14, 20, 36)); // --panel-3 #0E1424 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Border = FLinearColor(FColor(58, 75, 120)); // --border #3A4B78 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor BorderSoft = FLinearColor(FColor(58, 75, 120, 140)); // --border-soft + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Gold = FLinearColor(FColor(201, 167, 90)); // --gold #C9A75A + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor GoldHi = FLinearColor(FColor(231, 200, 115)); // --gold-hi #E7C873 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Blue = FLinearColor(FColor(78, 163, 255)); // --blue #4EA3FF + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Violet = FLinearColor(FColor(123, 92, 255)); // --violet #7B5CFF + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Text = FLinearColor(FColor(244, 240, 230)); // --text #F4F0E6 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Text2 = FLinearColor(FColor(174, 182, 200)); // --text-2 #AEB6C8 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor TextDim = FLinearColor(FColor(105, 115, 138)); // --text-dim #69738A + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Danger = FLinearColor(FColor(217, 92, 92)); // --danger #D95C5C + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Online = FLinearColor(FColor(80, 216, 144)); // --online #50D890 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Palette") + FLinearColor Warn = FLinearColor(FColor(230, 180, 80)); // --warn #E6B450 +}; + +// ===================================================================== +// 2. Semantic — papéis (referenciam a primitive) +// ===================================================================== +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleSemantic +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Accent = FLinearColor(FColor(201, 167, 90)); // Gold + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor AccentHover = FLinearColor(FColor(231, 200, 115)); // GoldHi + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Focus = FLinearColor(FColor(78, 163, 255)); // Blue + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Glow = FLinearColor(FColor(123, 92, 255)); // Violet + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor SurfaceBase = FLinearColor(FColor(7, 10, 18)); // Bg0 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Surface = FLinearColor(FColor(12, 18, 34, 235)); // Panel + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor SurfaceRaised = FLinearColor(FColor(17, 24, 42)); // Panel2 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor SurfaceSunken = FLinearColor(FColor(14, 20, 36)); // Panel3 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor OutlineStrong = FLinearColor(FColor(58, 75, 120)); // Border + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor OutlineSoft = FLinearColor(FColor(58, 75, 120, 140)); // BorderSoft + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor OnSurface = FLinearColor(FColor(244, 240, 230)); // Text + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor OnSurfaceMuted = FLinearColor(FColor(174, 182, 200)); // Text2 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor OnSurfaceDim = FLinearColor(FColor(105, 115, 138)); // TextDim + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Danger = FLinearColor(FColor(217, 92, 92)); // Danger + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Success = FLinearColor(FColor(80, 216, 144)); // Online + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Semantic") + FLinearColor Warning = FLinearColor(FColor(230, 180, 80)); // Warn +}; + +// ===================================================================== +// 3. Component +// ===================================================================== +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleText +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + FSlateFontInfo TitleFont; // Cinzel ExtraBold (display) + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + FSlateFontInfo SectionFont; // Cinzel Bold (section title) + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + FSlateFontInfo BodyFont; // Rajdhani Regular + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + FSlateFontInfo ButtonFont; // Rajdhani Bold + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + FSlateFontInfo LabelFont; // Rajdhani Bold (label/caps) + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + bool bLabelUppercase = true; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Text") + float TitleLetterSpacing = 0.f; // informativo (RichText/futuro) +}; + +/** Cores de uma variante de botão (primary/secondary/danger/ghost). */ +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleButtonVariant +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor BgNormal = FLinearColor::Transparent; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor BgHover = FLinearColor::Transparent; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor BgPressed = FLinearColor::Transparent; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor BgDisabled = FLinearColor(0.f, 0.f, 0.f, 0.42f); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor BorderNormal = FLinearColor::Transparent; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor BorderHover = FLinearColor::Transparent; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FLinearColor TextColor = FLinearColor::White; + + /** + * Estilo de texto desta variante (padrão Hyper/CommonUI: CommonTextStyle). + * Define fonte/tamanho/peso. A COR é sobreposta pelo TextColor acima + * (FUIStyle manda na cor por tema). Permite Primary/Secondary/Danger/Ghost + * com tipografias diferentes. Preenchido em DT_UI_Styles por tema. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + TSubclassOf TextStyle; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleButton +{ + GENERATED_BODY() + + /** + * Defaults = paleta Aurora Arcana (styles.css .btn-*). Garante que mesmo + * sem DataTable (preview de designer) o botão já saia estilizado. + */ + FUIStyleButton() + { + // .btn-primary — dourado, texto quase preto + Primary.BgNormal = FLinearColor(FColor(201, 167, 90)); // gold + Primary.BgHover = FLinearColor(FColor(231, 200, 115)); // gold-hi + Primary.BgPressed = FLinearColor(FColor(201, 167, 90)); + Primary.BgDisabled = FLinearColor(FColor(201, 167, 90, 107)); + Primary.BorderNormal = FLinearColor(FColor(201, 167, 90)); + Primary.BorderHover = FLinearColor(FColor(231, 200, 115)); + Primary.TextColor = FLinearColor(FColor(10, 10, 18)); // ~#0A0A12 + + // .btn-secondary — painel sólido + borda + Secondary.BgNormal = FLinearColor(FColor(17, 24, 42)); // panel-2 + Secondary.BgHover = FLinearColor(FColor(22, 32, 58)); // #16203A + Secondary.BgPressed = FLinearColor(FColor(17, 24, 42)); + Secondary.BorderNormal = FLinearColor(FColor(58, 75, 120)); // border + Secondary.BorderHover = FLinearColor(FColor(78, 163, 255)); // blue + Secondary.TextColor = FLinearColor(FColor(244, 240, 230));// text + + // .btn-danger + Danger.BgNormal = FLinearColor(FColor(217, 92, 92, 36)); // rgba(.14) + Danger.BgHover = FLinearColor(FColor(217, 92, 92, 66)); // rgba(.26) + Danger.BgPressed = FLinearColor(FColor(217, 92, 92, 36)); + Danger.BorderNormal = FLinearColor(FColor(217, 92, 92)); // danger + Danger.BorderHover = FLinearColor(FColor(217, 92, 92)); + Danger.TextColor = FLinearColor(FColor(240, 182, 182)); // #F0B6B6 + + // .btn-ghost — transparente + borda suave + Ghost.BgNormal = FLinearColor::Transparent; + Ghost.BgHover = FLinearColor(FColor(22, 32, 58, 128)); + Ghost.BgPressed = FLinearColor::Transparent; + Ghost.BorderNormal = FLinearColor(FColor(58, 75, 120, 140)); // border-soft + Ghost.BorderHover = FLinearColor(FColor(78, 163, 255)); + Ghost.TextColor = FLinearColor(FColor(174, 182, 200)); // text-2 + } + + // .btn-primary — dourado, texto quase preto + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FUIStyleButtonVariant Primary; + + // .btn-secondary — painel sólido + borda + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FUIStyleButtonVariant Secondary; + + // .btn-danger + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FUIStyleButtonVariant Danger; + + // .btn-ghost — transparente + borda suave + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FUIStyleButtonVariant Ghost; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + FMargin Padding = FMargin(22.f, 12.f); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + float MinHeight = 48.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + float CornerRadius = 8.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + float BorderWidth = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + float HoverScale = 1.02f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + float PressedScale = 0.98f; + + /** Tamanho por silhueta (Square/Rectangle/Topbar/Header). */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Button") + TMap ShapeSizes; +}; + +/** + * Espelha 1:1 o Struct_UI_Style_Panels do Hyper: só os dois mapas de brush + * (fundo + contorno) indexados por EUIPanelTexture. É o que o UI_Panel_Master + * do Hyper expõe editável na instância (Details). EditAnywhere/ReadWrite para + * o designer ajustar brush por widget; o tema (DT) só faz seed/fallback. + */ +USTRUCT(BlueprintType) +struct ZMMO_API FUIPanelBrushSet +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel|Texture") + TMap PanelBackground; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel|Texture") + TMap PanelOutline; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FUIStylePanel +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor Bg = FLinearColor(FColor(12, 18, 34, 235)); // Panel + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor BgRaised = FLinearColor(FColor(17, 24, 42)); // Panel2 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor BgSunken = FLinearColor(FColor(14, 20, 36)); // Panel3 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor BorderColor = FLinearColor(FColor(58, 75, 120)); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor BorderSoftColor = FLinearColor(FColor(58, 75, 120, 140)); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + float CornerRadius = 12.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + float CornerRadiusSmall = 10.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + float BorderWidth = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FMargin Padding = FMargin(30.f); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FMargin PaddingSmall = FMargin(20.f); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor CardSelectedBorder = FLinearColor(FColor(201, 167, 90)); // Accent + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel") + FLinearColor CardSelectedBg = FLinearColor(FColor(24, 32, 58)); + + /** + * Modo texturizado (espelha Struct_UI_Style_Panels do Hyper): brush por + * EUIPanelTexture. PanelBackground = fundo; PanelOutline = contorno. + * Se vazio p/ a chave, o painel usa o modo cor (RoundedBox) acima. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel|Texture") + TMap PanelBackground; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Panel|Texture") + TMap PanelOutline; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleBorders +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + FLinearColor Color = FLinearColor(FColor(58, 75, 120)); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + FLinearColor SoftColor = FLinearColor(FColor(58, 75, 120, 140)); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + float Width = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + float Radius = 12.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + float RadiusSmall = 8.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + FLinearColor RuleColor = FLinearColor(FColor(201, 167, 90, 166)); // Gold ~.65 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + float RuleThickness = 2.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Borders") + float RuleSoftThickness = 1.f; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleProgressBar +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") + FLinearColor TrackColor = FLinearColor(FColor(14, 20, 36)); // Panel3 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") + FLinearColor BorderColor = FLinearColor(FColor(58, 75, 120, 140)); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") + float Height = 10.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") + float CornerRadius = 6.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") + float BorderWidth = 1.f; + + /** Cor de preenchimento por tipo (Health/Mana/XP...). */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") + TMap FillByType; +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FUIStyleTooltip +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + FLinearColor Bg = FLinearColor(FColor(17, 24, 42)); // Panel2 + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + FLinearColor BorderColor = FLinearColor(FColor(58, 75, 120)); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + float CornerRadius = 10.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + float BorderWidth = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + FMargin Padding = FMargin(18.f, 14.f); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + FSlateFontInfo Font; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|Tooltip") + FLinearColor TextColor = FLinearColor(FColor(244, 240, 230)); // Text +}; diff --git a/Source/ZMMO/Data/UI/UIStyleTypes.h b/Source/ZMMO/Data/UI/UIStyleTypes.h new file mode 100644 index 0000000..ff641cb --- /dev/null +++ b/Source/ZMMO/Data/UI/UIStyleTypes.h @@ -0,0 +1,103 @@ +#pragma once + +#include "CoreMinimal.h" +#include "UIStyleTypes.generated.h" + +/** + * Enums do sistema de UI Style (tokens de tema visual). + * + * Espelha ThemeKeys.h: enums fortes, BlueprintType, primeiro valor None. + * O conceito de "tema ativo" continua sendo do UZMMOThemeSubsystem + * (resolvido por FName ThemeId). EUITheme é apenas validação tipada de + * design-time ao preencher DT_UI_Styles — não é a chave de runtime. + */ + +UENUM(BlueprintType) +enum class EUITheme : uint8 +{ + None UMETA(DisplayName = "None"), + MMORPG UMETA(DisplayName = "MMORPG"), + Survival UMETA(DisplayName = "Survival"), + RPG UMETA(DisplayName = "RPG") +}; + +/** Variante visual do botão (mapeia 1:1 com os campos de FUIStyleButton). */ +UENUM(BlueprintType) +enum class EUIButtonVariant : uint8 +{ + Primary UMETA(DisplayName = "Primary"), + Secondary UMETA(DisplayName = "Secondary"), + Danger UMETA(DisplayName = "Danger"), + Ghost UMETA(DisplayName = "Ghost") +}; + +/** Forma/silhueta de um botão — usada pelo widget para escolher dimensões. */ +UENUM(BlueprintType) +enum class EUIButtonShape : uint8 +{ + None UMETA(DisplayName = "None"), + Square UMETA(DisplayName = "Square"), + Rectangle UMETA(DisplayName = "Rectangle"), + Topbar UMETA(DisplayName = "Topbar"), + HeaderButton UMETA(DisplayName = "Header Button") +}; + +UENUM(BlueprintType) +enum class EUIPanelType : uint8 +{ + None UMETA(DisplayName = "None"), + Primary UMETA(DisplayName = "Primary"), + Secondary UMETA(DisplayName = "Secondary"), + Tertiary UMETA(DisplayName = "Tertiary"), + Card UMETA(DisplayName = "Card") +}; + +/** + * Conjunto de textura/silhueta do painel (espelha o enum "Panel" do Hyper). + * Indexa os mapas de FSlateBrush em FUIStylePanel (bg + outline). + */ +UENUM(BlueprintType) +enum class EUIPanelTexture : uint8 +{ + None UMETA(DisplayName = "None"), + Rectangle_Horizontal_01 UMETA(DisplayName = "Rectangle Horizontal 01"), + Rectangle_Horizontal_02 UMETA(DisplayName = "Rectangle Horizontal 02"), + Rectangle_Horizontal_03 UMETA(DisplayName = "Rectangle Horizontal 03"), + Rectangle_Vertical_01 UMETA(DisplayName = "Rectangle Vertical 01"), + Rectangle_Vertical_02 UMETA(DisplayName = "Rectangle Vertical 02"), + Rectangle_Vertical_03 UMETA(DisplayName = "Rectangle Vertical 03"), + Rectangle_Vertical_04 UMETA(DisplayName = "Rectangle Vertical 04"), + Rectangle_Square_01 UMETA(DisplayName = "Rectangle Square 01"), + Vertical_Footer_01 UMETA(DisplayName = "Vertical Footer 01") +}; + +UENUM(BlueprintType) +enum class EUIProgressBarType : uint8 +{ + None UMETA(DisplayName = "None"), + Health UMETA(DisplayName = "Health"), + Mana UMETA(DisplayName = "Mana"), + Experience UMETA(DisplayName = "Experience"), + Cast UMETA(DisplayName = "Cast"), + Generic UMETA(DisplayName = "Generic") +}; + +UENUM(BlueprintType) +enum class EUIHeaderType : uint8 +{ + None UMETA(DisplayName = "None"), + Section UMETA(DisplayName = "Section"), + Panel UMETA(DisplayName = "Panel"), + SubPanel UMETA(DisplayName = "Sub Panel") +}; + +UENUM(BlueprintType) +enum class EUIIconType : uint8 +{ + None UMETA(DisplayName = "None"), + Inventory UMETA(DisplayName = "Inventory"), + Equipment UMETA(DisplayName = "Equipment"), + Skill UMETA(DisplayName = "Skill"), + Status UMETA(DisplayName = "Status"), + Currency UMETA(DisplayName = "Currency") +}; diff --git a/Source/ZMMO/Data/World/ZoneRow.h b/Source/ZMMO/Data/World/ZoneRow.h new file mode 100644 index 0000000..9ee81b9 --- /dev/null +++ b/Source/ZMMO/Data/World/ZoneRow.h @@ -0,0 +1,45 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataTable.h" +#include "Engine/World.h" +#include "ZoneRow.generated.h" + +class USoundBase; + +UENUM(BlueprintType) +enum class EZoneRules : uint8 +{ + Safe UMETA(DisplayName = "Safe"), + PvE UMETA(DisplayName = "PvE"), + PvP UMETA(DisplayName = "PvP"), + Dungeon UMETA(DisplayName = "Dungeon"), + Instance UMETA(DisplayName = "Instance") +}; + +USTRUCT(BlueprintType) +struct ZMMO_API FZoneRow : public FTableRowBase +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + TSoftObjectPtr Map; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + EZoneRules Rules = EZoneRules::PvE; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + int32 RecommendedLevelMin = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + int32 RecommendedLevelMax = 10; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + TSoftObjectPtr AmbientMusic; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Zone") + TSoftObjectPtr AmbientSound; +}; diff --git a/Source/ZMMO/Game/Controller/ZMMOFrontEndPlayerController.cpp b/Source/ZMMO/Game/Controller/ZMMOFrontEndPlayerController.cpp new file mode 100644 index 0000000..11aa832 --- /dev/null +++ b/Source/ZMMO/Game/Controller/ZMMOFrontEndPlayerController.cpp @@ -0,0 +1,24 @@ +#include "ZMMOFrontEndPlayerController.h" + +#include "UIFrontEndFlowSubsystem.h" +#include "Engine/GameInstance.h" + +AZMMOFrontEndPlayerController::AZMMOFrontEndPlayerController() +{ + bShowMouseCursor = true; +} + +void AZMMOFrontEndPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + SetInputMode(FInputModeUIOnly()); + + if (const UGameInstance* GI = GetGameInstance()) + { + if (UUIFrontEndFlowSubsystem* Flow = GI->GetSubsystem()) + { + Flow->StartFrontEnd(); + } + } +} diff --git a/Source/ZMMO/Game/Controller/ZMMOFrontEndPlayerController.h b/Source/ZMMO/Game/Controller/ZMMOFrontEndPlayerController.h new file mode 100644 index 0000000..e12bc43 --- /dev/null +++ b/Source/ZMMO/Game/Controller/ZMMOFrontEndPlayerController.h @@ -0,0 +1,26 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "ZMMOFrontEndPlayerController.generated.h" + +/** + * AZMMOFrontEndPlayerController + * + * Controller do mapa de front-end. Não herda de AZMMOPlayerController (sem + * Enhanced Input de gameplay/touch). Em BeginPlay arranca o fluxo de + * front-end (UUIFrontEndFlowSubsystem) — feito aqui, e não no + * GameInstance::Init, porque os subsistemas já existem neste ponto (ver + * aviso no header do ZeusNetworkSubsystem). + */ +UCLASS(Blueprintable, BlueprintType) +class ZMMO_API AZMMOFrontEndPlayerController : public APlayerController +{ + GENERATED_BODY() + +public: + AZMMOFrontEndPlayerController(); + +protected: + virtual void BeginPlay() override; +}; diff --git a/Source/ZMMO/Game/Modes/ZMMOFrontEndGameMode.cpp b/Source/ZMMO/Game/Modes/ZMMOFrontEndGameMode.cpp new file mode 100644 index 0000000..26a9666 --- /dev/null +++ b/Source/ZMMO/Game/Modes/ZMMOFrontEndGameMode.cpp @@ -0,0 +1,10 @@ +#include "ZMMOFrontEndGameMode.h" + +#include "ZMMOFrontEndPlayerController.h" + +AZMMOFrontEndGameMode::AZMMOFrontEndGameMode() +{ + // UI pura: sem pawn. O controller cria o root layout e arranca o fluxo. + DefaultPawnClass = nullptr; + PlayerControllerClass = AZMMOFrontEndPlayerController::StaticClass(); +} diff --git a/Source/ZMMO/Game/Modes/ZMMOFrontEndGameMode.h b/Source/ZMMO/Game/Modes/ZMMOFrontEndGameMode.h new file mode 100644 index 0000000..0cef995 --- /dev/null +++ b/Source/ZMMO/Game/Modes/ZMMOFrontEndGameMode.h @@ -0,0 +1,22 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "ZMMOFrontEndGameMode.generated.h" + +/** + * AZMMOFrontEndGameMode + * + * GameMode do mapa de front-end (L_FrontEnd): só UI, sem pawn nem network + * play. NÃO é o GameMode global (esse continua AZMMOGameMode para mapas de + * mundo) — aplicado via override no World Settings de L_FrontEnd + * (ARQUITETURA.md §3.3 / decisão de mapa dedicado). + */ +UCLASS(Blueprintable, BlueprintType) +class ZMMO_API AZMMOFrontEndGameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + AZMMOFrontEndGameMode(); +}; diff --git a/Source/ZMMO/Game/Modes/ZMMOGameInstance.h b/Source/ZMMO/Game/Modes/ZMMOGameInstance.h index 3a5d59f..89d195c 100644 --- a/Source/ZMMO/Game/Modes/ZMMOGameInstance.h +++ b/Source/ZMMO/Game/Modes/ZMMOGameInstance.h @@ -32,11 +32,12 @@ public: /** * Se `true`, tenta ligar ao servidor Zeus em `Init()` usando - * `ZeusServerHost`/`ZeusServerPort`. Default `true` em V0 (smoke test); - * passar a `false` quando existir UI de login que controle a conexao. + * `ZeusServerHost`/`ZeusServerPort`. Default `false`: a conexao agora e + * dirigida pelo `UUIFrontEndFlowSubsystem` (fluxo Boot→Connecting→Login). + * Pôr `true` apenas para smoke test legado sem front-end. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Config, Category = "ZMMO|Network") - bool bAutoConnectOnStart = true; + bool bAutoConnectOnStart = false; /** Host (IPv4 ou hostname) do servidor Zeus. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Config, Category = "ZMMO|Network") diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIActivatableScreen_Base.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIActivatableScreen_Base.cpp new file mode 100644 index 0000000..562c62e --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIActivatableScreen_Base.cpp @@ -0,0 +1,99 @@ +#include "UIActivatableScreen_Base.h" + +#include "ZMMOThemeSubsystem.h" +#include "UIFrontEndFlowSubsystem.h" +#include "Engine/GameInstance.h" +#include "Input/UIActionBindingHandle.h" +#include "CommonInputModeTypes.h" + +TOptional UUIActivatableScreen_Base::GetDesiredInputConfig() const +{ + switch (InputConfig) + { + case EZMMOScreenInputMode::GameAndMenu: + return FUIInputConfig(ECommonInputMode::All, GameMouseCaptureMode); + case EZMMOScreenInputMode::Game: + return FUIInputConfig(ECommonInputMode::Game, GameMouseCaptureMode); + case EZMMOScreenInputMode::Menu: + return FUIInputConfig(ECommonInputMode::Menu, EMouseCaptureMode::NoCapture); + case EZMMOScreenInputMode::Default: + default: + return TOptional(); + } +} + +void UUIActivatableScreen_Base::RefreshUIStyle_Implementation() +{ + // Base no-op: cada WBP/filho sobrescreve para reaplicar tokens do tema + // ativo (via UZMMOThemeSubsystem). Mantém o contrato igual a + // UUIButton_Base::RefreshUIStyle / UUIPanel_Base::RefreshUIStyle. +} + +void UUIActivatableScreen_Base::NativeConstruct() +{ + Super::NativeConstruct(); + + if (!bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.AddDynamic(this, &UUIActivatableScreen_Base::HandleThemeChanged); + bThemeBound = true; + } + } + } + + RefreshUIStyle(); +} + +void UUIActivatableScreen_Base::NativeDestruct() +{ + if (bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.RemoveDynamic(this, &UUIActivatableScreen_Base::HandleThemeChanged); + } + } + bThemeBound = false; + } + + Super::NativeDestruct(); +} + +void UUIActivatableScreen_Base::NativeOnActivated() +{ + Super::NativeOnActivated(); + RefreshUIStyle(); + BP_OnScreenActivated(); +} + +void UUIActivatableScreen_Base::NativeOnDeactivated() +{ + Super::NativeOnDeactivated(); + BP_OnScreenDeactivated(); +} + +bool UUIActivatableScreen_Base::NativeOnHandleBackAction() +{ + if (const UGameInstance* GI = GetGameInstance()) + { + if (UUIFrontEndFlowSubsystem* Flow = GI->GetSubsystem()) + { + if (Flow->RequestBack()) + { + return true; // consumido pelo fluxo + } + } + } + return Super::NativeOnHandleBackAction(); +} + +void UUIActivatableScreen_Base::HandleThemeChanged(FName /*NewThemeId*/) +{ + RefreshUIStyle(); +} diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIActivatableScreen_Base.h b/Source/ZMMO/Game/UI/FrontEnd/UIActivatableScreen_Base.h new file mode 100644 index 0000000..f07eb8b --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIActivatableScreen_Base.h @@ -0,0 +1,77 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CommonActivatableWidget.h" +#include "Engine/EngineBaseTypes.h" +#include "UIActivatableScreen_Base.generated.h" + +/** + * Modo de input desejado pela tela (espelha o padrão do Lyra). O + * UUIActivatableScreen_Base converte isto num FUIInputConfig em + * GetDesiredInputConfig. + */ +UENUM(BlueprintType) +enum class EZMMOScreenInputMode : uint8 +{ + Default, // não força nada (herda do CommonUI) + GameAndMenu, // jogo + UI (ex.: HUD com cursor) + Game, // só jogo + Menu // só UI (telas de front-end — default) +}; + +/** + * Base de TODAS as telas de front-end (Boot/Login/ServerSelect/Lobby/…). + * + * Fundação CommonUI (UCommonActivatableWidget) cuida de + * ativação/foco/voltar/stack. Camada Abstract; o WBP concreto herda DIRETO + * desta classe C++ (UMG não encadeia árvores — ARQUITETURA.md §3.3). Os WBPs + * gerados pelo Zeus UMG Forge são reparented para cá (§4.8). + * + * Reage à troca de tema via UZMMOThemeSubsystem (mesmo padrão de + * UUIButton_Base) e encaminha o "voltar" ao UUIFrontEndFlowSubsystem. + */ +UCLASS(Abstract, Blueprintable) +class ZMMO_API UUIActivatableScreen_Base : public UCommonActivatableWidget +{ + GENERATED_BODY() + +public: + /** Re-resolve os tokens do tema ativo e reaplica. WBP/filho sobrescreve. */ + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "UI Style") + void RefreshUIStyle(); + virtual void RefreshUIStyle_Implementation(); + +protected: + // ---- Input config (desktop/gamepad) ---- + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") + EZMMOScreenInputMode InputConfig = EZMMOScreenInputMode::Menu; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") + EMouseCaptureMode GameMouseCaptureMode = EMouseCaptureMode::CapturePermanently; + + virtual TOptional GetDesiredInputConfig() const override; + + // ---- Lifecycle (espelha o hook de tema de UUIButton_Base) ---- + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + virtual void NativeOnActivated() override; + virtual void NativeOnDeactivated() override; + + /** "Voltar" (Esc/B): encaminha ao UUIFrontEndFlowSubsystem::RequestBack. */ + virtual bool NativeOnHandleBackAction() override; + + /** Hooks Blueprint para o WBP refinado. */ + UFUNCTION(BlueprintImplementableEvent, Category = "UI", + meta = (DisplayName = "On Screen Activated")) + void BP_OnScreenActivated(); + + UFUNCTION(BlueprintImplementableEvent, Category = "UI", + meta = (DisplayName = "On Screen Deactivated")) + void BP_OnScreenDeactivated(); + +private: + UFUNCTION() + void HandleThemeChanged(FName NewThemeId); + + bool bThemeBound = false; +}; diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp new file mode 100644 index 0000000..0fb443a --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.cpp @@ -0,0 +1,339 @@ +#include "UIFrontEndFlowSubsystem.h" + +#include "ZMMO.h" +#include "UIFrontEndScreenSet.h" +#include "UIManagerSubsystem.h" +#include "UIPrimaryGameLayout_Base.h" +#include "UI/UILayerTags.h" +#include "ZMMOGameInstance.h" +#include "ZMMOThemeSubsystem.h" +#include "ZeusNetworkSubsystem.h" +#include "CommonActivatableWidget.h" +#include "Engine/GameInstance.h" +#include "Engine/LocalPlayer.h" +#include "UObject/UObjectGlobals.h" +#include "Engine/AssetManager.h" +#include "Engine/StreamableManager.h" +#include "Kismet/GameplayStatics.h" + +void UUIFrontEndFlowSubsystem::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + // Detecta chegada ao mundo após o OpenLevel disparado por travel. + PostLoadMapHandle = FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject( + this, &UUIFrontEndFlowSubsystem::HandlePostLoadMap); +} + +void UUIFrontEndFlowSubsystem::Deinitialize() +{ + if (PostLoadMapHandle.IsValid()) + { + FCoreUObjectDelegates::PostLoadMapWithWorld.Remove(PostLoadMapHandle); + PostLoadMapHandle.Reset(); + } + UnbindNetwork(); + Super::Deinitialize(); +} + +void UUIFrontEndFlowSubsystem::StartFrontEnd() +{ + UUIFrontEndScreenSet* SS = GetScreenSet(); + + if (UUIManagerSubsystem* Mgr = GetUIManager()) + { + TSubclassOf LayoutClass; + if (SS && !SS->RootLayoutClass.IsNull()) + { + LayoutClass = SS->RootLayoutClass.LoadSynchronous(); + } + Mgr->CreateAndAddRootLayout(LayoutClass); + } + + BindNetwork(); + + SetState(EZMMOFrontEndState::Boot); + + // Substitui o auto-connect do GameInstance: o fluxo dirige a conexão. + if (UZeusNetworkSubsystem* Zeus = GetZeusNetwork()) + { + FString Host = TEXT("127.0.0.1"); + int32 Port = 27777; + if (const UZMMOGameInstance* GI = Cast(GetGameInstance())) + { + Host = GI->ZeusServerHost; + Port = GI->ZeusServerPort; + } + SetState(EZMMOFrontEndState::Connecting); + Zeus->ConnectToZeusServer(Host, Port); + } + else + { + UE_LOG(LogZMMO, Warning, TEXT("FrontEndFlow: ZeusNetworkSubsystem indisponível; sem conexão.")); + } +} + +void UUIFrontEndFlowSubsystem::SetState(EZMMOFrontEndState NewState) +{ + if (NewState == CurrentState) + { + return; + } + + CurrentState = NewState; + UE_LOG(LogZMMO, Log, TEXT("FrontEndFlow: estado → %s"), + *UEnum::GetValueAsString(NewState)); + OnStateChanged.Broadcast(NewState); + + const FGameplayTag MenuLayer = ZMMOUITags::UI_Layer_Menu.GetTag(); + const FGameplayTag ModalLayer = ZMMOUITags::UI_Layer_Modal.GetTag(); + + switch (NewState) + { + case EZMMOFrontEndState::Boot: + case EZMMOFrontEndState::Connecting: + case EZMMOFrontEndState::Login: + case EZMMOFrontEndState::ServerSelect: + case EZMMOFrontEndState::Lobby: + // Telas do front-end vivem na camada Menu (uma por vez). + if (UUIManagerSubsystem* Mgr = GetUIManager()) + { + Mgr->ClearLayer(MenuLayer); + } + ResolveAndPushScreen(NewState); + break; + + case EZMMOFrontEndState::EnteringWorld: + // Loading/handoff por cima de tudo (camada Modal). + ResolveAndPushScreen(NewState); + break; + + case EZMMOFrontEndState::InWorld: + // HUD de gameplay assume — limpa front-end e loading. + if (UUIManagerSubsystem* Mgr = GetUIManager()) + { + Mgr->ClearLayer(ModalLayer); + Mgr->ClearLayer(MenuLayer); + } + break; + + case EZMMOFrontEndState::None: + default: + break; + } +} + +void UUIFrontEndFlowSubsystem::ShowLobbyPage(EZMMOLobbyPage Page) +{ + UUIFrontEndScreenSet* SS = GetScreenSet(); + UUIManagerSubsystem* Mgr = GetUIManager(); + if (!SS || !Mgr) + { + return; + } + + const TSoftClassPtr Soft = SS->GetLobbyPage(Page); + if (Soft.IsNull()) + { + UE_LOG(LogZMMO, Warning, TEXT("FrontEndFlow: página de Lobby %s não configurada (DA vazio)."), + *UEnum::GetValueAsString(Page)); + return; + } + + const FGameplayTag MenuLayer = ZMMOUITags::UI_Layer_Menu.GetTag(); + const FSoftObjectPath Path = Soft.ToSoftObjectPath(); + UAssetManager::GetStreamableManager().RequestAsyncLoad( + Path, + FStreamableDelegate::CreateWeakLambda(this, [this, Soft, MenuLayer]() + { + if (UUIManagerSubsystem* M = GetUIManager()) + { + if (UClass* Cls = Soft.Get()) + { + M->PushScreenToLayer(MenuLayer, Cls); + } + } + })); +} + +bool UUIFrontEndFlowSubsystem::RequestBack() +{ + switch (CurrentState) + { + case EZMMOFrontEndState::ServerSelect: + SetState(EZMMOFrontEndState::Login); + return true; + case EZMMOFrontEndState::Lobby: + SetState(EZMMOFrontEndState::ServerSelect); + return true; + default: + return false; + } +} + +void UUIFrontEndFlowSubsystem::ResolveAndPushScreen(EZMMOFrontEndState State) +{ + UUIFrontEndScreenSet* SS = GetScreenSet(); + if (!SS) + { + UE_LOG(LogZMMO, Warning, + TEXT("FrontEndFlow: ScreenSet não configurado; tela de %s ignorada."), + *UEnum::GetValueAsString(State)); + return; + } + + const TSoftClassPtr Soft = SS->GetScreenForState(State); + if (Soft.IsNull()) + { + UE_LOG(LogZMMO, Warning, TEXT("FrontEndFlow: Screen for state %s not configured."), + *UEnum::GetValueAsString(State)); + return; + } + + UUIManagerSubsystem* Mgr = GetUIManager(); + if (!Mgr) + { + return; + } + + const FGameplayTag Layer = (State == EZMMOFrontEndState::EnteringWorld) + ? ZMMOUITags::UI_Layer_Modal.GetTag() + : ZMMOUITags::UI_Layer_Menu.GetTag(); + + const FSoftObjectPath Path = Soft.ToSoftObjectPath(); + UAssetManager::GetStreamableManager().RequestAsyncLoad( + Path, + FStreamableDelegate::CreateWeakLambda(this, [this, Soft, Layer]() + { + if (UUIManagerSubsystem* M = GetUIManager()) + { + if (UClass* Cls = Soft.Get()) + { + M->PushScreenToLayer(Layer, Cls); + } + } + })); +} + +UZeusNetworkSubsystem* UUIFrontEndFlowSubsystem::GetZeusNetwork() const +{ + const UGameInstance* GI = GetGameInstance(); + return GI ? GI->GetSubsystem() : nullptr; +} + +UUIManagerSubsystem* UUIFrontEndFlowSubsystem::GetUIManager() const +{ + if (const UGameInstance* GI = GetGameInstance()) + { + if (ULocalPlayer* LP = GI->GetFirstGamePlayer()) + { + return LP->GetSubsystem(); + } + } + return nullptr; +} + +UUIFrontEndScreenSet* UUIFrontEndFlowSubsystem::GetScreenSet() +{ + if (ScreenSet) + { + return ScreenSet; + } + if (!ScreenSetAsset.IsNull()) + { + ScreenSet = ScreenSetAsset.LoadSynchronous(); + } + else + { + UE_LOG(LogZMMO, Warning, + TEXT("FrontEndFlow: ScreenSetAsset não setado em DefaultGame.ini; telas farão no-op.")); + } + return ScreenSet; +} + +void UUIFrontEndFlowSubsystem::BindNetwork() +{ + if (bNetBound) + { + return; + } + if (UZeusNetworkSubsystem* Zeus = GetZeusNetwork()) + { + Zeus->OnConnected.AddDynamic(this, &UUIFrontEndFlowSubsystem::HandleConnected); + Zeus->OnConnectionFailed.AddDynamic(this, &UUIFrontEndFlowSubsystem::HandleConnectionFailed); + Zeus->OnDisconnected.AddDynamic(this, &UUIFrontEndFlowSubsystem::HandleDisconnected); + Zeus->OnServerTravelRequested.AddDynamic(this, &UUIFrontEndFlowSubsystem::HandleServerTravelRequested); + bNetBound = true; + } +} + +void UUIFrontEndFlowSubsystem::UnbindNetwork() +{ + if (!bNetBound) + { + return; + } + if (UZeusNetworkSubsystem* Zeus = GetZeusNetwork()) + { + Zeus->OnConnected.RemoveDynamic(this, &UUIFrontEndFlowSubsystem::HandleConnected); + Zeus->OnConnectionFailed.RemoveDynamic(this, &UUIFrontEndFlowSubsystem::HandleConnectionFailed); + Zeus->OnDisconnected.RemoveDynamic(this, &UUIFrontEndFlowSubsystem::HandleDisconnected); + Zeus->OnServerTravelRequested.RemoveDynamic(this, &UUIFrontEndFlowSubsystem::HandleServerTravelRequested); + } + bNetBound = false; +} + +void UUIFrontEndFlowSubsystem::HandleConnected() +{ + UE_LOG(LogZMMO, Log, TEXT("FrontEndFlow: conectado → Login.")); + SetState(EZMMOFrontEndState::Login); +} + +void UUIFrontEndFlowSubsystem::HandleConnectionFailed(FString Reason) +{ + UE_LOG(LogZMMO, Warning, TEXT("FrontEndFlow: conexão falhou (%s) → volta a Login."), *Reason); + SetState(EZMMOFrontEndState::Login); +} + +void UUIFrontEndFlowSubsystem::HandleDisconnected() +{ + UE_LOG(LogZMMO, Log, TEXT("FrontEndFlow: desconectado.")); + if (CurrentState != EZMMOFrontEndState::InWorld) + { + SetState(EZMMOFrontEndState::Login); + } +} + +void UUIFrontEndFlowSubsystem::HandleServerTravelRequested(const FString& MapName, const FString& MapPath) +{ + UE_LOG(LogZMMO, Log, TEXT("FrontEndFlow: travel pedido pelo servidor → %s (%s)."), *MapName, *MapPath); + bTravelingToWorld = true; + SetState(EZMMOFrontEndState::EnteringWorld); + + if (!MapPath.IsEmpty()) + { + UGameplayStatics::OpenLevel(GetGameInstance(), FName(*MapPath)); + } +} + +void UUIFrontEndFlowSubsystem::HandlePostLoadMap(UWorld* /*LoadedWorld*/) +{ + if (bTravelingToWorld) + { + bTravelingToWorld = false; + SetState(EZMMOFrontEndState::InWorld); + } +} + +void UUIFrontEndFlowSubsystem::HandleServerHelloTheme(FName ThemeId) +{ + // Dívida técnica (D5): ainda não há gancho no ZeusNetworkSubsystem para o + // ThemeId do ServerHello. Mantido pronto para quando o plugin expuser. + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->ApplyServerTheme(ThemeId); + } + } +} diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.h b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.h new file mode 100644 index 0000000..33d00ff --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndFlowSubsystem.h @@ -0,0 +1,109 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Subsystems/GameInstanceSubsystem.h" +#include "UI/FrontEndTypes.h" +#include "UIFrontEndFlowSubsystem.generated.h" + +class UUIFrontEndScreenSet; +class UUIManagerSubsystem; +class UZeusNetworkSubsystem; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnZMMOFrontEndStateChanged, EZMMOFrontEndState, NewState); + +/** + * Orquestrador do fluxo de front-end. UGameInstanceSubsystem porque o + * GameInstance persiste o travel boot→mundo (a máquina de estados não pode + * morrer no OpenLevel). + * + * Responsável por: (a) dirigir a conexão via UZeusNetworkSubsystem; + * (b) manter EZMMOFrontEndState; (c) resolver estado→tela pelo + * DA_FrontEndScreenSet e pedir ao UUIManagerSubsystem para empurrar na + * camada certa; (d) detectar a chegada ao mundo. + * + * As telas (WBP) ainda não existem — virão do Zeus UMG Forge (§4.8). + * Enquanto não registradas no DA, cada transição faz no-op + log. + */ +UCLASS(Config = Game) +class ZMMO_API UUIFrontEndFlowSubsystem : public UGameInstanceSubsystem +{ + GENERATED_BODY() + +public: + // USubsystem + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + + /** + * Ponto de entrada chamado pelo AZMMOFrontEndPlayerController::BeginPlay + * (garante que os subsistemas já existem — ver aviso no header do + * ZeusNetworkSubsystem sobre GameInstance::Init). Cria o root layout, + * liga os delegates de rede e dispara Boot→Connecting. + */ + UFUNCTION(BlueprintCallable, Category = "FrontEnd") + void StartFrontEnd(); + + UFUNCTION(BlueprintCallable, Category = "FrontEnd") + void SetState(EZMMOFrontEndState NewState); + + UFUNCTION(BlueprintPure, Category = "FrontEnd") + EZMMOFrontEndState GetCurrentState() const { return CurrentState; } + + /** Mostra uma página interna do Lobby ("switch principal"). */ + UFUNCTION(BlueprintCallable, Category = "FrontEnd") + void ShowLobbyPage(EZMMOLobbyPage Page); + + /** "Voltar". Retorna true se o fluxo consumiu (tela base encaminha aqui). */ + UFUNCTION(BlueprintCallable, Category = "FrontEnd") + bool RequestBack(); + + UPROPERTY(BlueprintAssignable, Category = "FrontEnd") + FOnZMMOFrontEndStateChanged OnStateChanged; + +protected: + /** DA com o mapa estado→tela. Config em DefaultGame.ini. */ + UPROPERTY(Config, EditDefaultsOnly, Category = "FrontEnd") + TSoftObjectPtr ScreenSetAsset; + +private: + void BindNetwork(); + void UnbindNetwork(); + UZeusNetworkSubsystem* GetZeusNetwork() const; + UUIManagerSubsystem* GetUIManager() const; + UUIFrontEndScreenSet* GetScreenSet(); + + /** Resolve a soft class do estado e empurra na camada Menu (no-op+log se vazio). */ + void ResolveAndPushScreen(EZMMOFrontEndState State); + + UFUNCTION() + void HandleConnected(); + + UFUNCTION() + void HandleConnectionFailed(FString Reason); + + UFUNCTION() + void HandleDisconnected(); + + UFUNCTION() + void HandleServerTravelRequested(const FString& MapName, const FString& MapPath); + + void HandlePostLoadMap(UWorld* LoadedWorld); + + /** + * Dívida técnica (D5): ServerHello traz ThemeId, mas o UZeusNetworkSubsystem + * ainda não expõe um delegate/getter dedicado. Quando expuser, ligar aqui + * → UZMMOThemeSubsystem::ApplyServerTheme. Sem isto, o tema resolve por + * calendário/Default (ARQUITETURA.md §1.10). + */ + void HandleServerHelloTheme(FName ThemeId); + + UPROPERTY(Transient) + EZMMOFrontEndState CurrentState = EZMMOFrontEndState::None; + + UPROPERTY(Transient) + TObjectPtr ScreenSet; + + bool bNetBound = false; + bool bTravelingToWorld = false; + FDelegateHandle PostLoadMapHandle; +}; diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndScreenSet.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndScreenSet.cpp new file mode 100644 index 0000000..b00badc --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndScreenSet.cpp @@ -0,0 +1,19 @@ +#include "UIFrontEndScreenSet.h" + +TSoftClassPtr UUIFrontEndScreenSet::GetScreenForState(EZMMOFrontEndState State) const +{ + if (const TSoftClassPtr* Found = StateScreens.Find(State)) + { + return *Found; + } + return TSoftClassPtr(); +} + +TSoftClassPtr UUIFrontEndScreenSet::GetLobbyPage(EZMMOLobbyPage Page) const +{ + if (const TSoftClassPtr* Found = LobbyPages.Find(Page)) + { + return *Found; + } + return TSoftClassPtr(); +} diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndScreenSet.h b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndScreenSet.h new file mode 100644 index 0000000..5f5e5fb --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIFrontEndScreenSet.h @@ -0,0 +1,45 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "Templates/SubclassOf.h" +#include "UI/FrontEndTypes.h" +#include "UIFrontEndScreenSet.generated.h" + +class UCommonActivatableWidget; +class UUIPrimaryGameLayout_Base; + +/** + * Mapa data-driven estado → tela. Desacopla o UUIFrontEndFlowSubsystem das + * classes concretas: as telas (WBP) ainda não existem — serão geradas pelo + * Zeus UMG Forge, refinadas e registradas aqui depois (ARQUITETURA.md §4.8). + * Enquanto o registro estiver vazio, o flow faz no-op + log. + * + * Asset concreto: DA_FrontEndScreenSet em Content/ZMMO/UI/FrontEnd/. + */ +UCLASS(BlueprintType) +class ZMMO_API UUIFrontEndScreenSet : public UDataAsset +{ + GENERATED_BODY() + +public: + /** WBP de layout raiz (herda UUIPrimaryGameLayout_Base). */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "FrontEnd") + TSoftClassPtr RootLayoutClass; + + /** Tela por estado de topo do fluxo. */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "FrontEnd") + TMap> StateScreens; + + /** Páginas internas do Lobby (host = a tela de Lobby; "switch principal"). */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "FrontEnd") + TMap> LobbyPages; + + /** Soft class da tela do estado (vazio se não configurado). */ + UFUNCTION(BlueprintCallable, Category = "FrontEnd") + TSoftClassPtr GetScreenForState(EZMMOFrontEndState State) const; + + /** Soft class da página de Lobby (vazio se não configurado). */ + UFUNCTION(BlueprintCallable, Category = "FrontEnd") + TSoftClassPtr GetLobbyPage(EZMMOLobbyPage Page) const; +}; diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIManagerSubsystem.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIManagerSubsystem.cpp new file mode 100644 index 0000000..5eb1fea --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIManagerSubsystem.cpp @@ -0,0 +1,95 @@ +#include "UIManagerSubsystem.h" + +#include "ZMMO.h" +#include "UIPrimaryGameLayout_Base.h" +#include "CommonActivatableWidget.h" +#include "Engine/LocalPlayer.h" +#include "GameFramework/PlayerController.h" +#include "Blueprint/UserWidget.h" + +namespace +{ + constexpr int32 GRootLayoutZOrder = 1000; +} + +void UUIManagerSubsystem::CreateAndAddRootLayout(TSubclassOf LayoutClass) +{ + // Idempotente: sobrevive ao travel boot→mundo sem recriar. + if (RootLayout && RootLayout->IsInViewport()) + { + return; + } + + if (!LayoutClass) + { + UE_LOG(LogZMMO, Warning, + TEXT("UIManagerSubsystem: RootLayoutClass não configurado (DA_FrontEndScreenSet vazio?). Sem root layout.")); + return; + } + + ULocalPlayer* LP = GetLocalPlayer(); + if (!LP) + { + return; + } + + APlayerController* PC = LP->GetPlayerController(LP->GetWorld()); + if (!PC) + { + UE_LOG(LogZMMO, Warning, TEXT("UIManagerSubsystem: PlayerController ausente; root layout adiado.")); + return; + } + + RootLayout = CreateWidget(PC, LayoutClass); + if (!RootLayout) + { + UE_LOG(LogZMMO, Warning, TEXT("UIManagerSubsystem: falha ao criar o root layout.")); + return; + } + + RootLayout->AddToViewport(GRootLayoutZOrder); + UE_LOG(LogZMMO, Log, TEXT("UIManagerSubsystem: root layout criado e adicionado ao viewport.")); +} + +bool UUIManagerSubsystem::IsRootLayoutReady() const +{ + return RootLayout != nullptr && RootLayout->IsInViewport(); +} + +UCommonActivatableWidget* UUIManagerSubsystem::PushScreenToLayer( + FGameplayTag LayerTag, + TSubclassOf WidgetClass) +{ + if (!RootLayout) + { + UE_LOG(LogZMMO, Warning, TEXT("UIManagerSubsystem: PushScreenToLayer sem root layout.")); + return nullptr; + } + return RootLayout->PushWidgetToLayer(LayerTag, WidgetClass); +} + +void UUIManagerSubsystem::PopScreenFromLayer(FGameplayTag LayerTag, UCommonActivatableWidget* Widget) +{ + if (RootLayout) + { + RootLayout->PopWidgetFromLayer(LayerTag, Widget); + } +} + +void UUIManagerSubsystem::ClearLayer(FGameplayTag LayerTag) +{ + if (RootLayout) + { + RootLayout->ClearLayer(LayerTag); + } +} + +void UUIManagerSubsystem::Deinitialize() +{ + if (RootLayout) + { + RootLayout->RemoveFromParent(); + RootLayout = nullptr; + } + Super::Deinitialize(); +} diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIManagerSubsystem.h b/Source/ZMMO/Game/UI/FrontEnd/UIManagerSubsystem.h new file mode 100644 index 0000000..9f1b66b --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIManagerSubsystem.h @@ -0,0 +1,55 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Subsystems/LocalPlayerSubsystem.h" +#include "GameplayTagContainer.h" +#include "Templates/SubclassOf.h" +#include "UIManagerSubsystem.generated.h" + +class UCommonActivatableWidget; +class UUIPrimaryGameLayout_Base; + +/** + * Dono do layout raiz para o LocalPlayer. ULocalPlayerSubsystem porque o + * LocalPlayer persiste entre mapas (non-seamless do mesmo GameInstance) e + * troca de PlayerController — o root layout sobrevive ao travel + * boot→mundo sem ser recriado (idempotente). + * + * É "burro": recebe classes já resolvidas. Quem resolve estado→tela e dirige + * a navegação é o UUIFrontEndFlowSubsystem. + */ +UCLASS() +class ZMMO_API UUIManagerSubsystem : public ULocalPlayerSubsystem +{ + GENERATED_BODY() + +public: + /** Cria o root layout e adiciona ao viewport. Idempotente. */ + UFUNCTION(BlueprintCallable, Category = "UI|Manager") + void CreateAndAddRootLayout(TSubclassOf LayoutClass); + + UFUNCTION(BlueprintPure, Category = "UI|Manager") + bool IsRootLayoutReady() const; + + UFUNCTION(BlueprintPure, Category = "UI|Manager") + UUIPrimaryGameLayout_Base* GetRootLayout() const { return RootLayout; } + + /** Empurra a widget no topo do stack da camada. */ + UFUNCTION(BlueprintCallable, Category = "UI|Manager") + UCommonActivatableWidget* PushScreenToLayer( + FGameplayTag LayerTag, + TSubclassOf WidgetClass); + + UFUNCTION(BlueprintCallable, Category = "UI|Manager") + void PopScreenFromLayer(FGameplayTag LayerTag, UCommonActivatableWidget* Widget); + + UFUNCTION(BlueprintCallable, Category = "UI|Manager") + void ClearLayer(FGameplayTag LayerTag); + + // USubsystem + virtual void Deinitialize() override; + +private: + UPROPERTY(Transient) + TObjectPtr RootLayout; +}; diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIPrimaryGameLayout_Base.cpp b/Source/ZMMO/Game/UI/FrontEnd/UIPrimaryGameLayout_Base.cpp new file mode 100644 index 0000000..87165f0 --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIPrimaryGameLayout_Base.cpp @@ -0,0 +1,64 @@ +#include "UIPrimaryGameLayout_Base.h" + +#include "CommonActivatableWidget.h" +#include "Widgets/CommonActivatableWidgetContainer.h" +#include "UI/UILayerTags.h" + +void UUIPrimaryGameLayout_Base::NativeOnInitialized() +{ + Super::NativeOnInitialized(); + + RegisterLayer(ZMMOUITags::UI_Layer_Game, Stack_Game); + RegisterLayer(ZMMOUITags::UI_Layer_GameMenu, Stack_GameMenu); + RegisterLayer(ZMMOUITags::UI_Layer_Menu, Stack_Menu); + RegisterLayer(ZMMOUITags::UI_Layer_Modal, Stack_Modal); +} + +void UUIPrimaryGameLayout_Base::RegisterLayer(FGameplayTag LayerTag, UCommonActivatableWidgetStack* Stack) +{ + if (Stack) + { + Layers.Add(LayerTag, Stack); + } +} + +UCommonActivatableWidgetStack* UUIPrimaryGameLayout_Base::GetLayerStack(FGameplayTag LayerTag) const +{ + const TObjectPtr* Found = Layers.Find(LayerTag); + return Found ? *Found : nullptr; +} + +UCommonActivatableWidget* UUIPrimaryGameLayout_Base::PushWidgetToLayer( + FGameplayTag LayerTag, + TSubclassOf WidgetClass) +{ + if (!WidgetClass) + { + return nullptr; + } + if (UCommonActivatableWidgetStack* Stack = GetLayerStack(LayerTag)) + { + return Stack->AddWidget(WidgetClass); + } + return nullptr; +} + +void UUIPrimaryGameLayout_Base::PopWidgetFromLayer(FGameplayTag LayerTag, UCommonActivatableWidget* Widget) +{ + if (!Widget) + { + return; + } + if (UCommonActivatableWidgetStack* Stack = GetLayerStack(LayerTag)) + { + Stack->RemoveWidget(*Widget); + } +} + +void UUIPrimaryGameLayout_Base::ClearLayer(FGameplayTag LayerTag) +{ + if (UCommonActivatableWidgetStack* Stack = GetLayerStack(LayerTag)) + { + Stack->ClearWidgets(); + } +} diff --git a/Source/ZMMO/Game/UI/FrontEnd/UIPrimaryGameLayout_Base.h b/Source/ZMMO/Game/UI/FrontEnd/UIPrimaryGameLayout_Base.h new file mode 100644 index 0000000..a01a074 --- /dev/null +++ b/Source/ZMMO/Game/UI/FrontEnd/UIPrimaryGameLayout_Base.h @@ -0,0 +1,72 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CommonUserWidget.h" +#include "GameplayTagContainer.h" +#include "Templates/SubclassOf.h" +#include "UIPrimaryGameLayout_Base.generated.h" + +class UCommonActivatableWidget; +class UCommonActivatableWidgetStack; + +/** + * Layout raiz ("switch principal") do cliente. Mantém 4 stacks CommonUI, + * um por camada (GameplayTag UI.Layer.* — ver UI/UILayerTags.h): + * + * Stack_Game ← UI.Layer.Game (HUD de gameplay) + * Stack_GameMenu ← UI.Layer.GameMenu (menus sobre o jogo) + * Stack_Menu ← UI.Layer.Menu (front-end: Boot/Login/Lobby/…) + * Stack_Modal ← UI.Layer.Modal (diálogos/loading por cima) + * + * Camada Abstract; o WBP concreto (WBP_PrimaryGameLayout) herda DIRETO desta + * classe C++ e nomeia os 4 stacks exatamente como os BindWidget abaixo + * (ARQUITETURA.md §3.3). O UUIManagerSubsystem instancia o WBP e o adiciona + * ao viewport; o UUIFrontEndFlowSubsystem empurra telas por camada. + */ +UCLASS(Abstract, Blueprintable) +class ZMMO_API UUIPrimaryGameLayout_Base : public UCommonUserWidget +{ + GENERATED_BODY() + +public: + /** Stack da camada (nullptr se a tag não for uma UI.Layer.* conhecida). */ + UFUNCTION(BlueprintCallable, Category = "UI|Layout") + UCommonActivatableWidgetStack* GetLayerStack(FGameplayTag LayerTag) const; + + /** Instancia e empurra a widget no topo do stack da camada. */ + UFUNCTION(BlueprintCallable, Category = "UI|Layout") + UCommonActivatableWidget* PushWidgetToLayer( + FGameplayTag LayerTag, + TSubclassOf WidgetClass); + + /** Remove uma widget específica do stack da camada. */ + UFUNCTION(BlueprintCallable, Category = "UI|Layout") + void PopWidgetFromLayer(FGameplayTag LayerTag, UCommonActivatableWidget* Widget); + + /** Esvazia o stack da camada. */ + UFUNCTION(BlueprintCallable, Category = "UI|Layout") + void ClearLayer(FGameplayTag LayerTag); + +protected: + virtual void NativeOnInitialized() override; + + /** Registra um stack numa camada (chamado em NativeOnInitialized). */ + void RegisterLayer(FGameplayTag LayerTag, UCommonActivatableWidgetStack* Stack); + + // ---- Stacks por camada (o WBP concreto deve nomear assim) ---- + UPROPERTY(BlueprintReadOnly, Category = "UI|Layout", meta = (BindWidget)) + TObjectPtr Stack_Game; + + UPROPERTY(BlueprintReadOnly, Category = "UI|Layout", meta = (BindWidget)) + TObjectPtr Stack_GameMenu; + + UPROPERTY(BlueprintReadOnly, Category = "UI|Layout", meta = (BindWidget)) + TObjectPtr Stack_Menu; + + UPROPERTY(BlueprintReadOnly, Category = "UI|Layout", meta = (BindWidget)) + TObjectPtr Stack_Modal; + +private: + UPROPERTY(Transient) + TMap> Layers; +}; diff --git a/Source/ZMMO/Game/UI/Widgets/UIButton_Base.cpp b/Source/ZMMO/Game/UI/Widgets/UIButton_Base.cpp new file mode 100644 index 0000000..862852f --- /dev/null +++ b/Source/ZMMO/Game/UI/Widgets/UIButton_Base.cpp @@ -0,0 +1,381 @@ +#include "UIButton_Base.h" + +#include "ZMMOThemeSubsystem.h" +#include "Engine/GameInstance.h" +#include "Engine/World.h" +#include "TimerManager.h" +#include "Components/Border.h" +#include "Styling/SlateBrush.h" +#include "Components/TextBlock.h" +#include "Components/Image.h" +#include "Components/SizeBox.h" +#include "Components/ScaleBox.h" +#include "Components/OverlaySlot.h" +#include "CommonTextBlock.h" +#include "CommonActionWidget.h" + +namespace +{ + /** Resolve o FUIStyle ativo; fallback p/ defaults (preview de designer). */ + const FUIStyle& ResolveActiveStyle(const UUserWidget* Widget, const FUIStyle& Fallback) + { + if (Widget) + { + if (const UGameInstance* GI = Widget->GetGameInstance()) + { + if (const UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + return Theme->GetActiveUIStyle(); + } + } + } + return Fallback; // sem GameInstance (design-time): Aurora Arcana default + } +} + +const FUIStyleButtonVariant& UUIButton_Base::ResolveVariant(const FUIStyleButton& Button) const +{ + switch (Variant) + { + case EUIButtonVariant::Secondary: return Button.Secondary; + case EUIButtonVariant::Danger: return Button.Danger; + case EUIButtonVariant::Ghost: return Button.Ghost; + case EUIButtonVariant::Primary: + default: return Button.Primary; + } +} + +// ---- Hyper "Set Button Text" ---- +void UUIButton_Base::SetButtonText(FText InText) +{ + if (!ButtonText) + { + return; + } + const FText Final = bUppercaseText + ? FText::FromString(InText.ToString().ToUpper()) + : InText; + ButtonText->SetText(Final); +} + +// ---- Hyper "Set Number Text" ---- +void UUIButton_Base::SetNumberText() +{ + if (!Number_Text) + { + return; + } + if (bShowNumberText) + { + Number_Text->SetText(FText::AsNumber(NumberTextAmount)); + Number_Text->SetVisibility(ESlateVisibility::Visible); + } + else + { + Number_Text->SetVisibility(ESlateVisibility::Hidden); + } +} + +// ---- Hyper "Set Icon" ---- +void UUIButton_Base::SetIcon() +{ + if (bUseIconInsteadOfText) + { + if (Image_Icon) + { + if (IconImage) + { + Image_Icon->SetBrushResourceObject(IconImage); + } + Image_Icon->SetVisibility(ESlateVisibility::Visible); + } + if (ButtonText) + { + ButtonText->SetVisibility(ESlateVisibility::Collapsed); + } + } + else + { + if (Image_Icon) + { + Image_Icon->SetVisibility(ESlateVisibility::Collapsed); + } + if (ButtonText) + { + ButtonText->SetVisibility(ESlateVisibility::Visible); + } + } +} + +// ---- Hyper "Set Sizebox Master Dimmensions" ---- +void UUIButton_Base::ApplySizeBox() +{ + if (bDoNotOverrideWithSizebox || !SizeBox_Master) + { + return; + } + SizeBox_Master->SetHeightOverride(InHeightOverride); + SizeBox_Master->SetWidthOverride(InWidthOverride); +} + +// ---- Hyper "Set InputAction Style" ---- +void UUIButton_Base::ApplyInputActionStyle() +{ + // InputActionWidget é privado em UCommonButtonBase (bind interno). Pega por + // nome — o widget do WBP chama-se "InputActionWidget" (bind do CommonUI). + UCommonActionWidget* IAW = Cast( + GetWidgetFromName(TEXT("InputActionWidget"))); + if (!IAW) + { + return; + } + + if (bShowInputActionWidget) + { + IAW->SetVisibility(ESlateVisibility::Visible); + IAW->SetIsEnabled(true); + } + else + { + IAW->SetVisibility(ESlateVisibility::Collapsed); + IAW->SetIsEnabled(false); + } + + if (UOverlaySlot* OS = Cast(IAW->Slot)) + { + OS->SetPadding(InputPadding); + OS->SetHorizontalAlignment(InputHorzAlignment); + OS->SetVerticalAlignment(InputVertAlignment); + } +} + +// ---- Hyper "Initialize Button" (orquestrador) ---- +void UUIButton_Base::InitializeButton() +{ + SetButtonText(ButtonTextValue); + SetNumberText(); + SetIcon(); + ApplySizeBox(); + RefreshUIStyle(); +} + +// ---- Hyper "Update Button Style" / "Set Brush" → nossa camada FUIStyle ---- +void UUIButton_Base::RefreshUIStyle() +{ + const FUIStyle Fallback; // defaults do struct = paleta Aurora Arcana + const FUIStyle& ActiveStyle = ResolveActiveStyle(this, Fallback); + const FUIStyleButtonVariant& VariantStyle = ResolveVariant(ActiveStyle.Button); + + // Fundo + borda no estado Normal (hover/pressed/disabled via NativeOn*). + ApplyVisualState(EUIButtonVisual::Normal); + + if (ButtonText) + { + // Tipografia: CommonTextStyle da variante (padrão Hyper/CommonUI). + if (VariantStyle.TextStyle) + { + ButtonText->SetStyle(VariantStyle.TextStyle); + } + // Cor: FUIStyle manda na cor por tema (sobrepõe o CommonTextStyle). + ButtonText->SetColorAndOpacity(FSlateColor(VariantStyle.TextColor)); + + // Alinhamento L/C/R dentro da largura do botão. + ButtonText->SetJustification(TextAlign); + } + + // Texto adapta ao tamanho do botão (ScaleToFit) ou usa tamanho fixo. + if (TextScaleBox) + { + TextScaleBox->SetStretch(bAutoSizeText ? EStretch::ScaleToFit : EStretch::None); + + // Posiciona o bloco de texto L/C/R dentro do botão (slot do Overlay). + if (UOverlaySlot* OS = Cast(TextScaleBox->Slot)) + { + EHorizontalAlignment H = HAlign_Center; + switch (TextAlign) + { + case ETextJustify::Left: H = HAlign_Left; break; + case ETextJustify::Right: H = HAlign_Right; break; + default: H = HAlign_Center; break; + } + OS->SetHorizontalAlignment(H); + OS->SetVerticalAlignment(VAlign_Center); + } + } + + BP_ApplyUIStyle(ActiveStyle.Button, VariantStyle); +} + +void UUIButton_Base::ApplyVisualState(EUIButtonVisual State) +{ + if (!Background) + { + return; + } + const FUIStyle Fallback; + const FUIStyle& AS = ResolveActiveStyle(this, Fallback); + const FUIStyleButtonVariant& V = ResolveVariant(AS.Button); + + FLinearColor Fill, Outline; + switch (State) + { + case EUIButtonVisual::Hovered: Fill = V.BgHover; Outline = V.BorderHover; break; + case EUIButtonVisual::Pressed: Fill = V.BgPressed; Outline = V.BorderHover; break; + case EUIButtonVisual::Disabled: Fill = V.BgDisabled; Outline = V.BorderNormal; break; + default: Fill = V.BgNormal; Outline = V.BorderNormal; break; + } + + FSlateBrush Brush = Background->Background; + Brush.TintColor = FSlateColor(Fill); + if (bRoundedBackground) + { + const float R = AS.Button.CornerRadius; + Brush.DrawAs = ESlateBrushDrawType::RoundedBox; + Brush.OutlineSettings = FSlateBrushOutlineSettings( + FVector4(R, R, R, R), FSlateColor(Outline), AS.Button.BorderWidth); + Brush.OutlineSettings.RoundingType = ESlateBrushRoundingType::FixedRadius; + } + else + { + Brush.DrawAs = ESlateBrushDrawType::Box; + Brush.OutlineSettings = FSlateBrushOutlineSettings( + FVector4(0, 0, 0, 0), FSlateColor(Outline), AS.Button.BorderWidth); + } + Background->SetBrush(Brush); +} + +void UUIButton_Base::NativeOnHovered() +{ + Super::NativeOnHovered(); + ApplyVisualState(EUIButtonVisual::Hovered); +} + +void UUIButton_Base::NativeOnUnhovered() +{ + Super::NativeOnUnhovered(); + ApplyVisualState(EUIButtonVisual::Normal); +} + +void UUIButton_Base::NativeOnPressed() +{ + Super::NativeOnPressed(); + ApplyVisualState(EUIButtonVisual::Pressed); +} + +void UUIButton_Base::NativeOnReleased() +{ + Super::NativeOnReleased(); + ApplyVisualState(IsHovered() ? EUIButtonVisual::Hovered : EUIButtonVisual::Normal); +} + +void UUIButton_Base::NativeOnEnabled() +{ + Super::NativeOnEnabled(); + ApplyVisualState(EUIButtonVisual::Normal); +} + +void UUIButton_Base::NativeOnDisabled() +{ + Super::NativeOnDisabled(); + ApplyVisualState(EUIButtonVisual::Disabled); +} + +void UUIButton_Base::NativePreConstruct() +{ + Super::NativePreConstruct(); + InitializeButton(); + ApplyInputActionStyle(); +} + +void UUIButton_Base::NativeConstruct() +{ + Super::NativeConstruct(); + + if (!bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.AddDynamic(this, &UUIButton_Base::HandleThemeChanged); + bThemeBound = true; + } + } + } + + InitializeButton(); + ApplyInputActionStyle(); + + if (bDeactivatedOnConstructWithTimeout && Timeout > 0.f) + { + StartDeactivateTimeout(); + } +} + +void UUIButton_Base::NativeDestruct() +{ + if (UWorld* World = GetWorld()) + { + World->GetTimerManager().ClearTimer(InactivityTimer); + World->GetTimerManager().ClearTimer(TimerTickHandle); + } + + if (bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.RemoveDynamic(this, &UUIButton_Base::HandleThemeChanged); + } + } + bThemeBound = false; + } + + Super::NativeDestruct(); +} + +// ---- Hyper "Deactivate Button On Timeout" ---- +void UUIButton_Base::StartDeactivateTimeout() +{ + UWorld* World = GetWorld(); + if (!World) + { + return; + } + + SetIsEnabled(false); + TimeRemaining = Timeout; + + World->GetTimerManager().SetTimer( + InactivityTimer, this, &UUIButton_Base::HandleTimeoutFinished, Timeout, false); + + if (TimeUpdateFrequency > 0.f) + { + World->GetTimerManager().SetTimer( + TimerTickHandle, this, &UUIButton_Base::HandleTimerTick, + TimeUpdateFrequency, true); + } +} + +void UUIButton_Base::HandleTimeoutFinished() +{ + if (UWorld* World = GetWorld()) + { + World->GetTimerManager().ClearTimer(TimerTickHandle); + } + TimeRemaining = 0.f; + SetIsEnabled(true); + OnButtonActivatedByTimeout.Broadcast(); +} + +void UUIButton_Base::HandleTimerTick() +{ + TimeRemaining = FMath::Max(0.f, TimeRemaining - TimeUpdateFrequency); + OnButtonTimerUpdated.Broadcast(TimeRemaining); +} + +void UUIButton_Base::HandleThemeChanged(FName /*NewThemeId*/) +{ + RefreshUIStyle(); +} diff --git a/Source/ZMMO/Game/UI/Widgets/UIButton_Base.h b/Source/ZMMO/Game/UI/Widgets/UIButton_Base.h new file mode 100644 index 0000000..e7367d7 --- /dev/null +++ b/Source/ZMMO/Game/UI/Widgets/UIButton_Base.h @@ -0,0 +1,211 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CommonButtonBase.h" +#include "Layout/Margin.h" +#include "Types/SlateEnums.h" +#include "UI/UIStyleTypes.h" +#include "UI/UIStyleTokens.h" +#include "UIButton_Base.generated.h" + +class UBorder; +class UTextBlock; +class UImage; +class USizeBox; +class UScaleBox; +class UCommonTextBlock; +class UCommonActionWidget; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnUIButtonActivatedByTimeout); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnUIButtonTimerUpdated, float, TimeRemaining); + +/** + * Botão base do ZMMO — porte 1:1 do UI_Button_Master do projeto Hyper para C++ + * auto-configurável, trocando o Struct_Style_Button do Hyper pela camada de + * tema C++ (FUIStyle via UZMMOThemeSubsystem::GetActiveUIStyle()). + * + * Fundação: CommonUI (UCommonButtonBase) cuida de input/foco/click. + * Camada Abstract (padrão "_Abstract" do Hyper). WBP UI_Button_Base herda + * disto; UI_Button_Master herda do WBP. Os widgets visuais são opcionais + * (BindWidgetOptional) e nomeados como no Hyper. + * + * Auto-config: NativePreConstruct chama InitializeButton (text/number/icon/ + * sizebox/estilo) + ApplyInputActionStyle. Reage à troca de tema. + */ +UCLASS(Abstract, Blueprintable) +class ZMMO_API UUIButton_Base : public UCommonButtonBase +{ + GENERATED_BODY() + +public: + // ---- Botão ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Button") + EUIButtonShape ButtonTypeSelection = EUIButtonShape::Rectangle; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Button") + EUIButtonVariant Variant = EUIButtonVariant::Primary; + + /** Hyper "Transform Policy = To Upper": força o texto em maiúsculas. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Button") + bool bUppercaseText = true; + + // ---- Text Style ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Text Style") + FText ButtonTextValue = FText::FromString(TEXT("Button Text")); + + /** Alinhamento do texto dentro do botão (esquerda/centro/direita). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Text Style") + TEnumAsByte TextAlign = ETextJustify::Center; + + /** true = texto escala p/ caber no tamanho do botão (ScaleBox ScaleToFit); + * false = usa o tamanho fixo da fonte da variante. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Text Style") + bool bAutoSizeText = true; + + /** Arredonda o Background (RoundedBox) e desenha a borda na cor da + * variante. Desligado = caixa reta. Raio/largura vêm de FUIStyleButton. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Button") + bool bRoundedBackground = true; + + // ---- Number Text ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Number Text") + bool bShowNumberText = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Number Text") + int32 NumberTextAmount = 0; + + // ---- Icon ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Icon") + bool bUseIconInsteadOfText = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Icon") + TObjectPtr IconImage = nullptr; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Icon") + EUIIconType IconTypeSelection = EUIIconType::None; + + // ---- Size ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Size") + float InHeightOverride = 50.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Size") + float InWidthOverride = 150.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Size") + bool bDoNotOverrideWithSizebox = false; + + // ---- Input Action Style ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input Action Style") + bool bShowInputActionWidget = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input Action Style") + FMargin InputPadding = FMargin(0.f, 0.f, 0.f, -22.f); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input Action Style") + TEnumAsByte InputHorzAlignment = HAlign_Center; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input Action Style") + TEnumAsByte InputVertAlignment = VAlign_Bottom; + + // ---- Deactivate by Timer ---- + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Deactivate By Timer") + bool bDeactivatedOnConstructWithTimeout = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Deactivate By Timer") + float Timeout = 0.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timer") + float TimeUpdateFrequency = 0.05f; + + UPROPERTY(BlueprintReadOnly, Category = "Timer") + float TimeRemaining = 0.f; + + UPROPERTY(BlueprintAssignable, Category = "Timer") + FOnUIButtonActivatedByTimeout OnButtonActivatedByTimeout; + + UPROPERTY(BlueprintAssignable, Category = "Timer") + FOnUIButtonTimerUpdated OnButtonTimerUpdated; + + // ---- API (porte 1:1 das funções do Hyper) ---- + UFUNCTION(BlueprintCallable, Category = "UI Button") + void SetButtonText(FText InText); + + UFUNCTION(BlueprintCallable, Category = "UI Button") + void SetNumberText(); + + UFUNCTION(BlueprintCallable, Category = "UI Button") + void SetIcon(); + + UFUNCTION(BlueprintCallable, Category = "UI Button") + void ApplySizeBox(); + + UFUNCTION(BlueprintCallable, Category = "UI Button") + void ApplyInputActionStyle(); + + /** Orquestrador (Hyper "Initialize Button"): aplica tudo + estilo do tema. */ + UFUNCTION(BlueprintCallable, Category = "UI Button") + void InitializeButton(); + + /** Re-resolve os tokens do tema ativo e reaplica (Hyper "Update Button Style"). */ + UFUNCTION(BlueprintCallable, Category = "UI Style") + void RefreshUIStyle(); + + /** Estado visual do botão (mapeia nos tokens BgNormal/Hover/Pressed/Disabled). */ + enum class EUIButtonVisual : uint8 { Normal, Hovered, Pressed, Disabled }; + + /** Pinta o Background (fill + borda) conforme o estado, re-resolvendo o tema. */ + void ApplyVisualState(EUIButtonVisual State); + +protected: + virtual void NativePreConstruct() override; + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + + // Estados do UCommonButtonBase → repinta o Background pela variante. + virtual void NativeOnHovered() override; + virtual void NativeOnUnhovered() override; + virtual void NativeOnPressed() override; + virtual void NativeOnReleased() override; + virtual void NativeOnEnabled() override; + virtual void NativeOnDisabled() override; + + /** Hook opcional: o WBP pode estender/sobrescrever a aplicação visual. */ + UFUNCTION(BlueprintImplementableEvent, Category = "UI Style", + meta = (DisplayName = "Apply UI Style")) + void BP_ApplyUIStyle(const FUIStyleButton& Button, const FUIStyleButtonVariant& VariantStyle); + + const FUIStyleButtonVariant& ResolveVariant(const FUIStyleButton& Button) const; + + // ---- Widgets visuais opcionais (nomes espelham o Hyper) ---- + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr SizeBox_Master; + + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr ButtonText; + + /** Envolve o ButtonText: escala o texto p/ caber no botão (bAutoSizeText). */ + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr TextScaleBox; + + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr Number_Text; + + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr Image_Icon; + + /** Fundo temável (nossa adição sobre o Hyper, p/ FUIStyle). */ + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr Background; + +private: + void StartDeactivateTimeout(); + void HandleTimeoutFinished(); + void HandleTimerTick(); + + UFUNCTION() + void HandleThemeChanged(FName NewThemeId); + + bool bThemeBound = false; + FTimerHandle InactivityTimer; + FTimerHandle TimerTickHandle; +}; diff --git a/Source/ZMMO/Game/UI/Widgets/UIPanel_Base.cpp b/Source/ZMMO/Game/UI/Widgets/UIPanel_Base.cpp new file mode 100644 index 0000000..055514e --- /dev/null +++ b/Source/ZMMO/Game/UI/Widgets/UIPanel_Base.cpp @@ -0,0 +1,179 @@ +#include "UIPanel_Base.h" + +#include "ZMMOThemeSubsystem.h" +#include "Engine/GameInstance.h" +#include "Components/Border.h" +#include "Styling/SlateBrush.h" +#include "Engine/DataTable.h" +#include "UI/UIStyleRow.h" + +namespace +{ + const FUIStyle& ResolvePanelStyle(const UUserWidget* Widget, const FUIStyle& Fallback) + { + if (Widget) + { + if (const UGameInstance* GI = Widget->GetGameInstance()) + { + if (const UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + return Theme->GetActiveUIStyle(); + } + } + } + // Design-time (sem GameInstance/subsystem): carrega o DT_UI_Styles + // direto e usa a row "Default", para o Designer pintar/mostrar os + // brushes igual ao runtime (caso contrário FUIStyle vem vazio). + static FUIStyle DesignStyle; + static bool bDesignLoaded = false; + if (!bDesignLoaded) + { + if (const UDataTable* DT = LoadObject(nullptr, + TEXT("/Game/ZMMO/Data/UI/DT_UI_Styles.DT_UI_Styles"))) + { + if (const FUIStyleRow* Row = DT->FindRow( + FName(TEXT("Default")), TEXT("UIPanelDesign"), false)) + { + DesignStyle = Row->Style; + bDesignLoaded = true; + } + } + } + return bDesignLoaded ? DesignStyle : Fallback; + } +} + +void UUIPanel_Base::RefreshUIStyle() +{ + if (!Background) + { + return; + } + const FUIStyle Fallback; + const FUIStyle& AS = ResolvePanelStyle(this, Fallback); + const FUIStylePanel& P = AS.Panel; + + // ---- Modo TEXTURA (padrão Hyper): brush por EUIPanelTexture ---- + // Fiel ao UI_Panel_Master do Hyper: só faz SetBrush nos dois Borders + // (Find no mapa por chave). Sem padding/visibility — a arte da textura + // já traz a moldura; o conteúdo é injetado pelo WBP filho. + // Seed dos mapas da instância a partir do tema quando vazios — assim o + // Details mostra Panel Background/Outline preenchidos e editáveis (igual + // ao Hyper, cujo `Panels` é alimentado pelo estilo). Edições do designer + // têm prioridade; o tema (P) é fallback por chave. + if (Panels.PanelBackground.Num() == 0) { Panels.PanelBackground = P.PanelBackground; } + if (Panels.PanelOutline.Num() == 0) { Panels.PanelOutline = P.PanelOutline; } + + const FSlateBrush* BgTex = nullptr; + if (PanelTexture != EUIPanelTexture::None) + { + BgTex = Panels.PanelBackground.Find(PanelTexture); + if (!BgTex) { BgTex = P.PanelBackground.Find(PanelTexture); } + } + if (BgTex) + { + Background->SetBrush(*BgTex); + if (Outline) + { + // Hyper: Find sempre seguido de SetBrush. No Hyper a entrada de + // outline ausente é um brush TRANSPARENTE (alpha 0) — não some + // widget, só não desenha. Um FSlateBrush default desenha um + // retângulo BRANCO; o equivalente correto é DrawAs=NoDrawType. + const FSlateBrush* OlTex = Panels.PanelOutline.Find(PanelTexture); + if (!OlTex) { OlTex = P.PanelOutline.Find(PanelTexture); } + static const FSlateBrush NoDrawBrush = [] + { + FSlateBrush B; + B.DrawAs = ESlateBrushDrawType::NoDrawType; + return B; + }(); + Outline->SetBrush(OlTex ? *OlTex : NoDrawBrush); + } + BP_ApplyPanelStyle(P); + return; + } + + // ---- Modo COR (RoundedBox) ---- + if (Outline) + { + Outline->SetVisibility(ESlateVisibility::Collapsed); + } + + FLinearColor Fill; + FLinearColor OutlineColor = P.BorderColor; + switch (PanelType) + { + case EUIPanelType::Secondary: Fill = P.BgRaised; break; + case EUIPanelType::Tertiary: Fill = P.BgSunken; break; + case EUIPanelType::Card: Fill = P.CardSelectedBg; OutlineColor = P.CardSelectedBorder; break; + case EUIPanelType::Primary: + case EUIPanelType::None: + default: Fill = P.Bg; break; + } + + FSlateBrush Brush = Background->Background; + Brush.TintColor = FSlateColor(Fill); + if (bRoundedBackground) + { + const float R = bUseSmallPadding ? P.CornerRadiusSmall : P.CornerRadius; + Brush.DrawAs = ESlateBrushDrawType::RoundedBox; + Brush.OutlineSettings = FSlateBrushOutlineSettings( + FVector4(R, R, R, R), FSlateColor(OutlineColor), P.BorderWidth); + Brush.OutlineSettings.RoundingType = ESlateBrushRoundingType::FixedRadius; + } + else + { + Brush.DrawAs = ESlateBrushDrawType::Box; + Brush.OutlineSettings = FSlateBrushOutlineSettings( + FVector4(0, 0, 0, 0), FSlateColor(OutlineColor), P.BorderWidth); + } + Background->SetBrush(Brush); + Background->SetPadding(bUseSmallPadding ? P.PaddingSmall : P.Padding); + + BP_ApplyPanelStyle(P); +} + +void UUIPanel_Base::NativePreConstruct() +{ + Super::NativePreConstruct(); + RefreshUIStyle(); +} + +void UUIPanel_Base::NativeConstruct() +{ + Super::NativeConstruct(); + + if (!bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.AddDynamic(this, &UUIPanel_Base::HandleThemeChanged); + bThemeBound = true; + } + } + } + RefreshUIStyle(); +} + +void UUIPanel_Base::NativeDestruct() +{ + if (bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.RemoveDynamic(this, &UUIPanel_Base::HandleThemeChanged); + } + } + bThemeBound = false; + } + Super::NativeDestruct(); +} + +void UUIPanel_Base::HandleThemeChanged(FName /*NewThemeId*/) +{ + RefreshUIStyle(); +} diff --git a/Source/ZMMO/Game/UI/Widgets/UIPanel_Base.h b/Source/ZMMO/Game/UI/Widgets/UIPanel_Base.h new file mode 100644 index 0000000..843cdca --- /dev/null +++ b/Source/ZMMO/Game/UI/Widgets/UIPanel_Base.h @@ -0,0 +1,83 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CommonUserWidget.h" +#include "UI/UIStyleTypes.h" +#include "UI/UIStyleTokens.h" +#include "UIPanel_Base.generated.h" + +class UBorder; + +/** + * Painel base do ZMMO — mesmo padrão do UUIButton_Base, mas container. + * Fundação CommonUI (UCommonUserWidget). Camada Abstract; o WBP concreto + * (UI_Panel_Master) herda DIRETO desta classe C++ (UMG não encadeia árvores + * de WBP — ver ARQUITETURA.md §3.3). + * + * Visual data-driven por FUIStyle.Panel (UZMMOThemeSubsystem). Designers + * injetam o conteúdo no NamedSlot "Content". + */ +UCLASS(Abstract, Blueprintable) +class ZMMO_API UUIPanel_Base : public UCommonUserWidget +{ + GENERATED_BODY() + +public: + /** Tipo do painel — escolhe Bg/BgRaised/BgSunken/Card de FUIStylePanel. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel") + EUIPanelType PanelType = EUIPanelType::Primary; + + /** Arredonda o Background (RoundedBox) com a borda do tema. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel") + bool bRoundedBackground = true; + + /** Usa o padding "pequeno" do tema (PaddingSmall) em vez de Padding. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel") + bool bUseSmallPadding = false; + + /** + * Conjunto de textura (modo Hyper). Se != None E houver brush no mapa + * FUIStylePanel.PanelBackground p/ esta chave, usa o painel TEXTURIZADO + * (brush bg + outline). Senão, cai no modo COR (RoundedBox acima). + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel") + EUIPanelTexture PanelTexture = EUIPanelTexture::None; + + /** + * Mapas de brush por instância — espelha o `Panels` do UI_Panel_Master + * do Hyper (Details mostra Panel Background / Panel Outline editáveis). + * Tem prioridade. Se não houver brush p/ a chave aqui, cai no tema + * (DT_UI_Styles). Em NativePreConstruct é semeado a partir do tema + * quando vazio, então por padrão o tema manda — como no Hyper. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel") + FUIPanelBrushSet Panels; + + /** Re-resolve os tokens do tema ativo e reaplica no Background. */ + UFUNCTION(BlueprintCallable, Category = "UI Style") + void RefreshUIStyle(); + +protected: + virtual void NativePreConstruct() override; + virtual void NativeConstruct() override; + virtual void NativeDestruct() override; + + /** Hook opcional: o WBP pode estender/sobrescrever a aplicação visual. */ + UFUNCTION(BlueprintImplementableEvent, Category = "UI Style", + meta = (DisplayName = "Apply Panel Style")) + void BP_ApplyPanelStyle(const FUIStylePanel& Panel); + + /** Widgets visuais opcionais. */ + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr Background; + + /** Contorno texturizado por cima do fundo (modo textura, padrão Hyper). */ + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr Outline; + +private: + UFUNCTION() + void HandleThemeChanged(FName NewThemeId); + + bool bThemeBound = false; +}; diff --git a/Source/ZMMO/Game/UI/ZMMOThemeDataAsset.cpp b/Source/ZMMO/Game/UI/ZMMOThemeDataAsset.cpp new file mode 100644 index 0000000..581a1e8 --- /dev/null +++ b/Source/ZMMO/Game/UI/ZMMOThemeDataAsset.cpp @@ -0,0 +1,11 @@ +#include "ZMMOThemeDataAsset.h" + +bool UZMMOThemeDataAsset::HasKey(EZMMOThemeKey Key) const +{ + return Entries.Contains(Key); +} + +const FThemeEntry* UZMMOThemeDataAsset::FindEntry(EZMMOThemeKey Key) const +{ + return Entries.Find(Key); +} diff --git a/Source/ZMMO/Game/UI/ZMMOThemeDataAsset.h b/Source/ZMMO/Game/UI/ZMMOThemeDataAsset.h new file mode 100644 index 0000000..7e678aa --- /dev/null +++ b/Source/ZMMO/Game/UI/ZMMOThemeDataAsset.h @@ -0,0 +1,26 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "UI/ThemeKeys.h" +#include "UI/ThemeRow.h" +#include "ZMMOThemeDataAsset.generated.h" + +UCLASS(BlueprintType) +class ZMMO_API UZMMOThemeDataAsset : public UPrimaryDataAsset +{ + GENERATED_BODY() + +public: + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + FName ThemeId; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Theme", meta = (ToolTip = "Only fill the keys this theme overrides. Missing keys fall back to the Default theme.")) + TMap Entries; + + bool HasKey(EZMMOThemeKey Key) const; + const FThemeEntry* FindEntry(EZMMOThemeKey Key) const; +}; diff --git a/Source/ZMMO/Game/UI/ZMMOThemeSubsystem.cpp b/Source/ZMMO/Game/UI/ZMMOThemeSubsystem.cpp new file mode 100644 index 0000000..6803d72 --- /dev/null +++ b/Source/ZMMO/Game/UI/ZMMOThemeSubsystem.cpp @@ -0,0 +1,216 @@ +#include "ZMMOThemeSubsystem.h" + +#include "ZMMOThemeDataAsset.h" +#include "Engine/DataTable.h" +#include "Engine/Texture2D.h" +#include "Sound/SoundBase.h" +#include "NiagaraSystem.h" +#include "Misc/DateTime.h" +#include "UI/ThemeCalendarRow.h" +#include "UI/UIStyleRow.h" + +namespace +{ + /** Row Name da linha de estilo de fallback em DT_UI_Styles. */ + const FName GUIStyleDefaultRow(TEXT("Default")); +} + +void UZMMOThemeSubsystem::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + DefaultTheme = DefaultThemeAsset.LoadSynchronous(); + if (!DefaultTheme) + { + UE_LOG(LogTemp, Warning, + TEXT("[ZMMOThemeSubsystem] DefaultThemeAsset is not set. UI will have no theme.")); + } + + ResolveActiveTheme(); +} + +void UZMMOThemeSubsystem::Deinitialize() +{ + ActiveTheme = nullptr; + DefaultTheme = nullptr; + Super::Deinitialize(); +} + +void UZMMOThemeSubsystem::ApplyServerTheme(FName ThemeId) +{ + ServerThemeId = ThemeId; + ResolveActiveTheme(); +} + +void UZMMOThemeSubsystem::ForceTheme(FName ThemeId) +{ + ForcedThemeId = ThemeId; + ResolveActiveTheme(); +} + +void UZMMOThemeSubsystem::ClearForcedTheme() +{ + ForcedThemeId = NAME_None; + ResolveActiveTheme(); +} + +void UZMMOThemeSubsystem::ResolveActiveTheme() +{ + FName Resolved = NAME_None; + + if (!ForcedThemeId.IsNone()) + { + Resolved = ForcedThemeId; + } +#if !UE_BUILD_SHIPPING + else if (!DevThemeOverride.IsNone()) + { + Resolved = DevThemeOverride; + } +#endif + else if (!ServerThemeId.IsNone()) + { + Resolved = ServerThemeId; + } + else + { + Resolved = ResolveByCalendar(); + } + + UZMMOThemeDataAsset* NewActive = !Resolved.IsNone() ? LoadThemeById(Resolved) : nullptr; + if (!NewActive) + { + NewActive = DefaultTheme; + Resolved = DefaultTheme ? DefaultTheme->ThemeId : NAME_None; + } + + if (NewActive != ActiveTheme || Resolved != ActiveThemeId) + { + ActiveTheme = NewActive; + ActiveThemeId = Resolved; + ResolveActiveUIStyle(ActiveThemeId); + OnThemeChanged.Broadcast(ActiveThemeId); + } +} + +void UZMMOThemeSubsystem::ResolveActiveUIStyle(FName ThemeId) +{ + // Reset para os defaults do struct antes de aplicar a linha resolvida — + // assim um tema sem linha cai num estado coerente (paleta Aurora Arcana). + ActiveUIStyle = FUIStyle(); + + UDataTable* Table = UIStyleTable.LoadSynchronous(); + if (!Table) + { + return; + } + + const FUIStyleRow* Row = nullptr; + if (!ThemeId.IsNone()) + { + Row = Table->FindRow(ThemeId, TEXT("UIStyle")); + } + if (!Row) + { + // Fallback: linha "Default" (mesma política dos assets, §5). + Row = Table->FindRow(GUIStyleDefaultRow, TEXT("UIStyle")); + } + if (Row) + { + ActiveUIStyle = Row->Style; + } +} + +FName UZMMOThemeSubsystem::ResolveByCalendar() const +{ + UDataTable* Table = CalendarTable.LoadSynchronous(); + if (!Table) + { + return NAME_None; + } + + const FDateTime Now = FDateTime::Now(); + const int32 NowMonth = Now.GetMonth(); + const int32 NowDay = Now.GetDay(); + const int32 NowMD = NowMonth * 100 + NowDay; + + FName Best = NAME_None; + int32 BestPriority = MIN_int32; + + TArray RowNames = Table->GetRowNames(); + for (const FName& RowName : RowNames) + { + const FThemeCalendarRow* Row = Table->FindRow(RowName, TEXT("ThemeCalendar")); + if (!Row || Row->ThemeId.IsNone()) + { + continue; + } + + const int32 StartMD = Row->StartMonth * 100 + Row->StartDay; + const int32 EndMD = Row->EndMonth * 100 + Row->EndDay; + + const bool bInRange = (StartMD <= EndMD) + ? (NowMD >= StartMD && NowMD <= EndMD) + : (NowMD >= StartMD || NowMD <= EndMD); // wraps across year (e.g. 12-15 -> 01-05) + + if (bInRange && Row->Priority > BestPriority) + { + Best = Row->ThemeId; + BestPriority = Row->Priority; + } + } + + return Best; +} + +UZMMOThemeDataAsset* UZMMOThemeSubsystem::LoadThemeById(FName ThemeId) const +{ + if (const TSoftObjectPtr* Soft = ThemeRegistry.Find(ThemeId)) + { + return Soft->LoadSynchronous(); + } + return nullptr; +} + +const FThemeEntry* UZMMOThemeSubsystem::FindEntryWithFallback(EZMMOThemeKey Key) const +{ + if (ActiveTheme) + { + if (const FThemeEntry* Entry = ActiveTheme->FindEntry(Key)) + { + return Entry; + } + } + if (DefaultTheme && DefaultTheme != ActiveTheme) + { + if (const FThemeEntry* Entry = DefaultTheme->FindEntry(Key)) + { + return Entry; + } + } + return nullptr; +} + +UTexture2D* UZMMOThemeSubsystem::GetTexture(EZMMOThemeKey Key) const +{ + const FThemeEntry* Entry = FindEntryWithFallback(Key); + return Entry ? Entry->Texture.LoadSynchronous() : nullptr; +} + +USoundBase* UZMMOThemeSubsystem::GetSound(EZMMOThemeKey Key) const +{ + const FThemeEntry* Entry = FindEntryWithFallback(Key); + return Entry ? Entry->Sound.LoadSynchronous() : nullptr; +} + +UNiagaraSystem* UZMMOThemeSubsystem::GetVFX(EZMMOThemeKey Key) const +{ + const FThemeEntry* Entry = FindEntryWithFallback(Key); + return Entry ? Entry->VFX.LoadSynchronous() : nullptr; +} + +UObject* UZMMOThemeSubsystem::GetGeneric(EZMMOThemeKey Key) const +{ + const FThemeEntry* Entry = FindEntryWithFallback(Key); + return Entry ? Entry->Generic.LoadSynchronous() : nullptr; +} diff --git a/Source/ZMMO/Game/UI/ZMMOThemeSubsystem.h b/Source/ZMMO/Game/UI/ZMMOThemeSubsystem.h new file mode 100644 index 0000000..27344ee --- /dev/null +++ b/Source/ZMMO/Game/UI/ZMMOThemeSubsystem.h @@ -0,0 +1,124 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Subsystems/GameInstanceSubsystem.h" +#include "UI/ThemeKeys.h" +#include "UI/ThemeRow.h" +#include "UI/UIStyleRow.h" +#include "ZMMOThemeSubsystem.generated.h" + +class UZMMOThemeDataAsset; +class UDataTable; +class UTexture2D; +class USoundBase; +class UNiagaraSystem; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnZMMOThemeChanged, FName, NewThemeId); + +/** + * Resolves which UI theme is active and answers asset lookups by EZMMOThemeKey. + * + * Resolution precedence (see ARQUITETURA.md §1.10): + * 1. Dev override (.ini DevThemeOverride) — ignored in Shipping builds. + * 2. Authoritative server theme (set via ApplyServerTheme). + * 3. Local calendar (DT_ThemeCalendar). + * 4. DA_Theme_Default. + * + * Widgets must never hold hard refs to theme textures/sounds. They consume the + * active theme through Get* methods on this subsystem. + */ +UCLASS(Config = Game) +class ZMMO_API UZMMOThemeSubsystem : public UGameInstanceSubsystem +{ + GENERATED_BODY() + +public: + // USubsystem + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + + /** Server-authoritative theme. Call from the ZeusNetwork ServerHello handler. */ + UFUNCTION(BlueprintCallable, Category = "Theme") + void ApplyServerTheme(FName ThemeId); + + /** Forces a specific theme regardless of precedence. Use only for debug UI. */ + UFUNCTION(BlueprintCallable, Category = "Theme|Debug") + void ForceTheme(FName ThemeId); + + /** Resets to the precedence-resolved theme. */ + UFUNCTION(BlueprintCallable, Category = "Theme|Debug") + void ClearForcedTheme(); + + UFUNCTION(BlueprintPure, Category = "Theme") + FName GetActiveThemeId() const { return ActiveThemeId; } + + UFUNCTION(BlueprintCallable, Category = "Theme") + UTexture2D* GetTexture(EZMMOThemeKey Key) const; + + UFUNCTION(BlueprintCallable, Category = "Theme") + USoundBase* GetSound(EZMMOThemeKey Key) const; + + UFUNCTION(BlueprintCallable, Category = "Theme") + UNiagaraSystem* GetVFX(EZMMOThemeKey Key) const; + + UFUNCTION(BlueprintCallable, Category = "Theme") + UObject* GetGeneric(EZMMOThemeKey Key) const; + + /** + * Tokens de estilo (cores/fontes/dimensões) do tema ativo, resolvidos de + * DT_UI_Styles pelo ThemeId. Faz fallback para a linha "Default" quando o + * tema ativo não tem linha própria — mesma política dos assets (§5). + */ + UFUNCTION(BlueprintPure, Category = "Theme|Style") + const FUIStyle& GetActiveUIStyle() const { return ActiveUIStyle; } + + /** Fired whenever the active theme actually changes. */ + UPROPERTY(BlueprintAssignable, Category = "Theme") + FOnZMMOThemeChanged OnThemeChanged; + +protected: + /** Default theme. Must be filled with every key — it is the final fallback. */ + UPROPERTY(Config, EditDefaultsOnly, Category = "Theme") + TSoftObjectPtr DefaultThemeAsset; + + /** Registry of seasonal/event themes keyed by ThemeId. */ + UPROPERTY(Config, EditDefaultsOnly, Category = "Theme") + TMap> ThemeRegistry; + + /** Local calendar table (FThemeCalendarRow). Optional. */ + UPROPERTY(Config, EditDefaultsOnly, Category = "Theme") + TSoftObjectPtr CalendarTable; + + /** Tabela de tokens de estilo (FUIStyleRow), keyed por ThemeId. */ + UPROPERTY(Config, EditDefaultsOnly, Category = "Theme") + TSoftObjectPtr UIStyleTable; + + /** Dev-only override read from DefaultGame.ini. Empty in Shipping. */ + UPROPERTY(Config, EditDefaultsOnly, Category = "Theme|Debug") + FName DevThemeOverride; + +private: + void ResolveActiveTheme(); + FName ResolveByCalendar() const; + UZMMOThemeDataAsset* LoadThemeById(FName ThemeId) const; + const FThemeEntry* FindEntryWithFallback(EZMMOThemeKey Key) const; + void ResolveActiveUIStyle(FName ThemeId); + + UPROPERTY(Transient) + TObjectPtr ActiveTheme; + + UPROPERTY(Transient) + TObjectPtr DefaultTheme; + + UPROPERTY(Transient) + FName ActiveThemeId; + + UPROPERTY(Transient) + FName ServerThemeId; + + UPROPERTY(Transient) + FName ForcedThemeId; + + UPROPERTY(Transient) + FUIStyle ActiveUIStyle; +}; diff --git a/Source/ZMMO/ZMMO.Build.cs b/Source/ZMMO/ZMMO.Build.cs index a547dc8..1550ba0 100644 --- a/Source/ZMMO/ZMMO.Build.cs +++ b/Source/ZMMO/ZMMO.Build.cs @@ -14,6 +14,10 @@ public class ZMMO : ModuleRules "EnhancedInput", "UMG", "Slate", + "Niagara", + "CommonUI", + "CommonInput", + "GameplayTags", "ZeusNetwork" }); @@ -27,7 +31,19 @@ public class ZMMO : ModuleRules "ZMMO/Game/Entity", "ZMMO/Game/Controller", "ZMMO/Game/Modes", - "ZMMO/Game/Network" + "ZMMO/Game/Network", + "ZMMO/Game/UI", + "ZMMO/Game/UI/Widgets", + "ZMMO/Game/UI/FrontEnd", + "ZMMO/Data", + "ZMMO/Data/Items", + "ZMMO/Data/Mobs", + "ZMMO/Data/Players", + "ZMMO/Data/NPCs", + "ZMMO/Data/Abilities", + "ZMMO/Data/Quests", + "ZMMO/Data/UI", + "ZMMO/Data/World" }); } } diff --git a/ZMMO.uproject b/ZMMO.uproject index d21784d..c53cef7 100644 --- a/ZMMO.uproject +++ b/ZMMO.uproject @@ -41,6 +41,13 @@ "Editor" ] }, + { + "Name": "ZeusUMGForge", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, { "Name": "meshy", "Enabled": false, @@ -48,6 +55,10 @@ "Win64", "Mac" ] + }, + { + "Name": "CommonUI", + "Enabled": true } ], "AdditionalPluginDirectories": [